{"version":3,"sources":["webpack:///./node_modules/base64-js/index.js","webpack:///./node_modules/vuedraggable/dist/vuedraggable.common.js","webpack:///../../../src/components/VResponsive/VResponsive.ts","webpack:///./src/views/Design/DesignEditor.vue?a20f","webpack:///./src/plugins/fabric-custom.js","webpack:///src/views/Design/DesignEditor.vue","webpack:///./src/views/Design/DesignEditor.vue?58d5","webpack:///../../../src/components/VAutocomplete/VAutocomplete.ts","webpack:///../../../src/mixins/rippleable/index.ts","webpack:///../../../src/mixins/selectable/index.ts","webpack:///../../../src/components/VCheckbox/VCheckbox.ts","webpack:///../../../src/components/VDataTable/VSimpleTable.ts","webpack:///../../../src/components/VSkeletonLoader/VSkeletonLoader.ts","webpack:///../../../src/components/VSlider/VSlider.ts","webpack:///../../../src/components/VGrid/VSpacer.ts","webpack:///../../../src/directives/touch/index.ts","webpack:///../../../src/components/VSwitch/VSwitch.ts","webpack:///../../../src/components/VToolbar/VToolbar.ts","webpack:///../../../src/components/VToolbar/index.ts","webpack:///./src/views/Design/DesignEditor.vue?8b31","webpack:///../../../src/components/VResponsive/index.ts","webpack:///./node_modules/fabric/dist/fabric.js","webpack:///./node_modules/ieee754/index.js","webpack:///./src/views/Design/DesignEditor.vue?c761","webpack:///./node_modules/sortablejs/modular/sortable.esm.js","webpack:///../../../src/components/VImg/VImg.ts","webpack:///./node_modules/buffer/index.js","webpack:///./node_modules/core-js/modules/web.url.to-json.js","webpack:///./node_modules/isarray/index.js"],"names":["exports","byteLength","toByteArray","fromByteArray","lookup","revLookup","Arr","Uint8Array","Array","code","i","len","length","charCodeAt","getLens","b64","Error","validLen","indexOf","placeHoldersLen","lens","_byteLength","tmp","arr","curByte","tripletToBase64","num","encodeChunk","uint8","start","end","output","push","join","extraBytes","parts","maxChunkLength","len2","module","modules","installedModules","__webpack_require__","moduleId","l","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","LIBRARY","$export","redefine","hide","Iterators","$iterCreate","setToStringTag","getPrototypeOf","ITERATOR","BUGGY","keys","FF_ITERATOR","KEYS","VALUES","returnThis","this","Base","NAME","Constructor","next","DEFAULT","IS_SET","FORCED","methods","IteratorPrototype","getMethod","kind","proto","TAG","DEF_VALUES","VALUES_BUG","$native","$default","$entries","undefined","$anyNative","entries","values","P","F","toInteger","defined","TO_STRING","that","pos","a","b","String","charAt","slice","at","S","index","unicode","anObject","result","global","ignoreCase","multiline","sticky","$keys","enumBugKeys","O","dP","getKeys","defineProperties","Properties","f","fails","wks","regexpExec","SPECIES","REPLACE_SUPPORTS_NAMED_GROUPS","re","exec","groups","replace","SPLIT_WORKS_WITH_OVERWRITTEN_EXEC","originalExec","apply","arguments","split","KEY","SYMBOL","DELEGATES_TO_SYMBOL","DELEGATES_TO_EXEC","execCalled","constructor","nativeRegExpMethod","fns","nativeMethod","regexp","str","arg2","forceStringMethod","done","strfn","rxfn","RegExp","string","arg","isObject","document","is","createElement","it","cof","ARG","tryGet","e","T","B","callee","getOwnPropertySymbols","has","SRC","$toString","TPL","inspectSource","val","safe","isFunction","Function","dPs","IE_PROTO","Empty","PROTOTYPE","createDict","iframeDocument","iframe","lt","gt","style","display","appendChild","src","contentWindow","open","write","close","store","uid","USE_SYMBOL","$exports","toString","context","INCLUDES","includes","searchString","createDesc","toObject","ObjectProto","descriptor","ceil","Math","floor","isNaN","bitmap","configurable","writable","MATCH","regexpFlags","nativeExec","nativeReplace","patchedExec","LAST_INDEX","UPDATES_LAST_INDEX_WRONG","re1","re2","NPCG_INCLUDED","PATCH","lastIndex","reCopy","match","source","propertyIsEnumerable","core","SHARED","version","copyright","ctx","type","own","out","exp","IS_FORCED","IS_GLOBAL","G","IS_STATIC","IS_PROTO","IS_BIND","target","expProto","U","W","R","fn","classof","builtinExec","TypeError","shared","$includes","el","IObject","valueOf","DESCRIPTORS","gOPS","pIE","$assign","assign","A","K","forEach","k","aLen","getSymbols","isEnum","concat","j","window","self","__g","max","min","def","tag","stat","__e","IE8_DOM_DEFINE","toPrimitive","Attributes","aFunction","UNSCOPABLES","ArrayProto","toLength","advanceStringIndex","regExpExec","SUBSTITUTION_SYMBOLS","SUBSTITUTION_SYMBOLS_NO_NAMED","maybeToString","REPLACE","$replace","maybeCallNative","searchValue","replaceValue","res","rx","functionalReplace","fullUnicode","results","matchStr","accumulatedResult","nextSourcePosition","matched","position","captures","namedCaptures","replacerArgs","replacement","getSubstitution","tailPos","symbols","ch","capture","isRegExp","$iterators","TO_STRING_TAG","ArrayValues","DOMIterables","CSSRuleList","CSSStyleDeclaration","CSSValueList","ClientRectList","DOMRectList","DOMStringList","DOMTokenList","DataTransferItemList","FileList","HTMLAllCollection","HTMLCollection","HTMLFormElement","HTMLSelectElement","MediaList","MimeTypeArray","NamedNodeMap","NodeList","PaintRequestList","Plugin","PluginArray","SVGLengthList","SVGNumberList","SVGPathSegList","SVGPointList","SVGStringList","SVGTransformList","SourceBufferList","StyleSheetList","TextTrackCueList","TextTrackList","TouchList","collections","explicit","Collection","forced","toIObject","toAbsoluteIndex","IS_INCLUDES","$this","fromIndex","__webpack_exports__","insertNodeAt","camelize","console","removeNode","getConsole","cached","cache","hit","regex","_","toUpperCase","node","parentElement","removeChild","fatherNode","refNode","children","nextSibling","insertBefore","g","id","px","random","addToUnscopables","step","iterated","_t","_i","_k","Arguments","arrayIndexOf","names","STARTS_WITH","$startsWith","startsWith","search","currentScript","scripts","getElementsByTagName","err","stack","readyState","documentElement","setPublicPath_i","_arrayWithHoles","isArray","_iterableToArrayLimit","iterator","_arr","_n","_d","_e","_s","_arrayLikeToArray","arr2","_unsupportedIterableToArray","minLen","from","test","_nonIterableRest","_slicedToArray","_arrayWithoutHoles","_iterableToArray","iter","_nonIterableSpread","_toConsumableArray","external_commonjs_sortablejs_commonjs2_sortablejs_amd_sortablejs_root_Sortable_","external_commonjs_sortablejs_commonjs2_sortablejs_amd_sortablejs_root_Sortable_default","helper","buildAttribute","propName","computeVmIndex","vnodes","element","map","elt","elm","_computeIndexes","slots","isTransition","footerOffset","elmFromNodes","footerIndex","rawIndexes","idx","filter","ind","emit","evtName","evtData","_this","$nextTick","$emit","toLowerCase","delegateAndEmit","_this2","realList","isTransitionName","vuedraggable_isTransition","_slots","componentOptions","getSlot","slot","scopedSlot","computeChildrenAndOffsets","headerOffset","header","footer","getComponentAttributes","$attrs","componentData","attributes","update","attrs","reduce","on","props","componentDataAttrs","eventsListened","eventsToEmit","readonlyProperties","evt","draggingElement","options","list","required","default","noTransitionOnDrag","Boolean","clone","original","move","draggableComponent","inheritAttrs","data","transitionMode","noneFunctionalComponentMode","render","h","$slots","_computeChildrenAndOf","$scopedSlots","getTag","created","error","warn","mounted","_this3","$el","nodeName","getIsFunctional","optionsAdded","onMove","originalEvent","onDragMove","draggable","_sortable","rootContainer","computeIndexes","beforeDestroy","destroy","computed","watch","handler","newOptionValue","updateOptions","deep","fnOptions","_vnode","functional","option","getChildrenNodes","$children","rawNodes","child","_this4","visibleIndexes","getUnderlyingVm","htmlElt","getUnderlyingPotencialDraggableComponent","_ref","vue","__vue__","$options","_componentTag","$parent","emitChanges","_this5","alterList","onList","newList","spliceList","_arguments","splice","updatePosition","oldIndex","newIndex","getRelatedContextFromMoveEvent","_ref2","to","related","component","destination","getVmIndex","domIndex","indexes","numberIndexes","getComponent","componentInstance","resetTransitionData","nodes","transitionContainer","kept","onDragStart","item","_underlying_vm_","onDragAdd","added","onDragRemove","pullMode","removed","onDragUpdate","moved","updateProperty","propertyName","computeFutureIndex","relatedContext","domChildren","currentDOMIndex","currentIndex","draggedInList","willInsertAfter","draggedContext","futureIndex","sendEvt","onDragEnd","Vue","vuedraggable","aspectRatio","Number","computedAspectRatio","aspectStyle","paddingBottom","__cachedSizer","$createElement","staticClass","genContent","$listeners","_vm","_h","_c","_self","$event","link","_v","$t","_l","menu","class","active","selectedMenu","selectMenu","icon","displayName","staticStyle","labelSize","scopedSlots","_u","proxy","tagId","selectTag","openPdf","pdfPath","domProps","drawing","addCircle","addRect","addLine","colors","color","graphicColor","setGraphicColor","addIText","previewData","headers","model","callback","$$v","textSource","expression","fontFamilies","fontFamily","directives","rawName","composing","fontSize","canvas","trigger","textAlign","italic","fontWeight","underline","fontColor","ref","uploadImage","barcodeSource","settingDisabled","addBarcode","orderItem","excel","barcodeTypeId","disabled","displayBarcodeContent","topOfBarcode","_m","qrcodeSource","qrcodeTypeId","getObjectById","addRfid","selected","rfidData","epc","$set","user","defaultAttr","access","kill","keyCode","ctrlKey","shiftKey","altKey","metaKey","delObject","button","moveObject","copy","paste","undo","redo","setZoom","getZoom","save","getObjValue","setObjValue","setObjFlip","uploadData","selectObj","asideMenu","moveTo","canvasObjects","text","filename","barcodeText","pageIndex","preview","previewDialog","pages","totalPages","previewPage","previewExcelDialog","previewExcel","confirmExcel","loading","staticRenderFns","_uuid","Date","now","performance","fabric","Canvas","initialize","originalFn","args","_historyInit","dispose","_historyDispose","_historyNext","JSON","stringify","toDatalessJSON","extraProps","_historyEvents","_historySaveAction","historyUndo","historyRedo","ignoreType","extraPropsCopy","stopRecordHistory","historyNextState","off","historyProcessing","json","fire","history","pop","_loadHistory","event","loadFromJSON","renderAll","clearHistory","offHistory","onHistory","getObjects","obj","getObjectByType","customType","getObjectsByType","objs","exportObjects","some","getBarcodes","getQRcodes","add","set","STATE_IDLE","STATE_PANNING","toggleDragMode","dragMode","lastClientX","lastClientY","state","discardActiveObject","defaultCursor","selection","clientX","clientY","deltaX","deltaY","delta","Point","relativePan","forEachObject","evented","prevEvented","selectable","prevSelectable","sameType","every","sameAttr","pxToPt","pt","pxToRoundMM","round","components","BASE_URL","gridX","gridY","defaultGraphicColor","defaultFontSize","defaultFontColor","defaultFontFamily","defaultTextAlign","defaultItalic","defaultFontWeight","defaultUnderline","clipboard","labelSizes","barcodes","qrcodes","defaultBarcodeTypeId","defaultDisplayBarcodeContent","defaultTopOfBarcode","loadingLabelSize","defaultQrcodeTypeId","defaultTextSource","defaultBarcodeSource","defaultQrcodeSource","rfidSource","lock","items","newExcel","orderItemId","originalContent","labelContent","hash","previewImage","environmentIds","drawingObject","originX","originY","selectedLabelSize","previewImages","getFontAttr","newVal","setFontAttr","parseInt","reverse","setSrc","URL","displayContent","barcodeType","openSnackbar","msg","stopPropagation","getStaticFileURL","isSaved","envIds","isFill","setActiveObject","rotate","x0","y0","defaultTarget","_objects","setCoords","left","top","fill","lockScalingX","lockScalingY","fontStyle","editable","itext","checkDrawing","ry","scaleX","scaleY","fillColor","stroke","strokeWidth","objectCaching","width","height","setControlsVisibility","bl","br","mb","ml","mr","mt","tl","tr","setBarcodeControls","typeId","addImage","imgInstance","files","reader","onload","readAsDataURL","file","$refs","pathClear","image","cancelExcel","checkSourceExist","clonedObj","genPreviewCanvas","clipPath","radius","cloneCanvas","centerObject","genPreviewImg","genLabelContent","label","wet","blackMark","virtualKnifeMark","diameter","rfid","sourceFile","x","y","bold","flipX","flipY","angle","zIndex","z","pushObj","x2","y2","isTop","hoverCursor","previousRect","diff","remove","previousTag","newTag","sendToBack","tagName","tp","zoom","zoomToPoint","drawGrid","initCanvas","fireRightClick","stopContextMenu","selectionColor","setWidth","setHeight","preserveObjectStacking","x1","pointer","y1","requestRenderAll","newScaleX","newScaleY","clear","setBackgroundColor","rectMargin","isTen","Y","X","gridLineX","gridLineY","count","groupX","groupY","initTag","tags","canvasDiv","clientWidth","clientHeight","rect","ell","defaultMenuProps","offsetY","offsetOverflow","transition","VSelect","allowOverflow","autoSelectFirst","itemText","queryText","hideNoData","menuProps","noFilter","searchInput","lazySearch","classes","selectedIndex","computedItems","selectedValues","selectedItems","hasDisplayedItems","hideSelected","filteredItems","currentRange","selectedItem","getText","internalSearch","allItems","isAnyValueAllowed","isDirty","searchIsDirty","isSearching","multiple","menuCanShow","$_menuProps","find","listData","internalValue","isFocused","input","isMenuActive","oldVal","activateMenu","destroyed","onFilteredItemsChanged","onInternalSearchChanged","updateMenuDimensions","changeSelectedIndex","deleteCurrentItem","curIndex","curItem","getDisabled","nextIndex","nextItem","clearableCallback","genInput","VTextField","mergeData","autocomplete","genInputSlot","genSelections","hasSlot","onClick","isAppendInner","onInput","onKeyDown","onSpaceDown","onTabDown","onUpDown","selectItem","setSelectedItems","setSearch","updateSelf","valueComparator","getValue","hasItem","onCopy","currentItem","currentItemText","ripple","genRipple","center","mixins","prop","inputValue","falseValue","trueValue","hasColor","lazyValue","computedColor","isDark","isMultiple","isActive","rippleState","genLabel","VInput","click","prevent","role","checked","blur","change","focus","keydown","onBlur","onChange","onFocus","onKeydown","indeterminate","indeterminateIcon","offIcon","onIcon","inputIndeterminate","computedIcon","validationState","isDisabled","hasError","genCheckbox","VIcon","setTextColor","dense","dark","light","genDefaultSlot","fixedHeader","themeClasses","genWrapper","wrapper","boilerplate","tile","types","elevationClasses","isLoading","rootTypes","actions","article","avatar","card","chip","heading","paragraph","sentences","table","genBone","genBones","bone","generator","genStructure","mapBones","genSkeleton","afterEnter","beforeEnter","beforeLeave","leaveCancelled","resetStyles","bones","onBeforeEnter","onBeforeLeave","ClickOutside","inverseLabel","thumbColor","thumbLabel","validator","v","thumbSize","tickLabels","ticks","tickSize","trackColor","trackFillColor","vertical","app","oldValue","keyPressed","noClick","roundValue","trackTransition","minValue","parseFloat","maxValue","stepNumeric","inputWidth","trackFillStyles","startDir","endDir","valueDir","$vuetify","rtl","trackStyles","showTicks","numTicks","showThumbLabel","computedTrackColor","computedTrackFillColor","computedThumbColor","parsed","beforeMount","slider","genSlider","onSliderClick","genChildren","genThumbContainer","readonly","tabindex","genTrackContainer","genSteps","range","direction","offsetDirection","filled","thumbLabelContent","genThumbLabelContent","genThumbLabel","getThumbContainerStyles","keyup","touchstart","mousedown","onDrag","size","transform","origin","genThumb","onThumbMouseDown","mouseUpOptions","passive","mouseMoveOptions","onSliderMouseUp","onMouseMove","parseMouseMove","parseKeyDown","onKeyUp","thumb","track","trackLength","clickOffset","clickPos","isInsideTrack","trackStart","up","pageup","pagedown","home","right","down","steps","increase","multiplier","trimmedStep","decimals","offset","newValue","handleGesture","touchendY","dirRatio","minDistance","touchendX","touchstartX","touchstartY","touch","createHandlers","touchmoveX","touchmoveY","offsetX","touchend","touchmove","inserted","binding","handlers","vnode","eventName","unbind","Touch","inset","flat","switchData","genSwitch","attrs$","onSwipeRight","genProgress","progress","VProgressCircular","onSwipeLeft","VSheet","absolute","bottom","collapse","extended","extensionHeight","floating","prominent","short","isExtended","computedHeight","isCollapsed","computedContentHeight","isProminent","breakpoint","styles","breakingProps","genBackground","img","VImg","genExtension","VToolbarTitle","VAutocomplete","VBtn","VCard","VCardActions","VCardText","VCheckbox","VCol","VContainer","VDialog","VDivider","VList","VListGroup","VListItem","VListItemAvatar","VListItemContent","VListItemTitle","VProgressLinear","VRow","VSimpleTable","VSkeletonLoader","VSlider","VSpacer","VSwitch","VToolbar","Ripple","HTMLDocument","Document","implementation","createHTMLDocument","jsdom","virtualWindow","JSDOM","decodeURIComponent","features","FetchExternalResources","resources","jsdomImplForWrapper","implForWrapper","nodeCanvas","DOMParser","resizeCanvasIfNeeded","pipelineState","targetCanvas","dWidth","destinationWidth","dHeight","destinationHeight","copyGLTo2DDrawImage","gl","glCanvas","getContext","translate","scale","sourceY","drawImage","copyGLTo2DPutImageData","numBytes","u8","imageBuffer","u8Clamped","Uint8ClampedArray","readPixels","RGBA","UNSIGNED_BYTE","imgData","ImageData","putImageData","isTouchSupported","navigator","maxTouchPoints","isLikelyNode","Buffer","SHARED_ATTRIBUTES","DPI","reNum","rePathCommand","reNonWord","fontPaths","iMatrix","svgNS","perfLimitSizeTotal","maxCacheSideLimit","minCacheSideLimit","charWidthsCache","textureSize","disableStyleCopyPaste","enableGLFiltering","devicePixelRatio","webkitDevicePixelRatio","mozDevicePixelRatio","browserShadowBlurConstant","arcToSegmentsCache","boundsOfCurveCache","cachesBoundsOfCurve","forceGLPutImageData","initFilterBackend","isWebglSupported","log","maxTextureSize","WebglFilterBackend","tileSize","Canvas2dFilterBackend","_removeEventListener","__eventListeners","eventListener","util","array","observe","stopObserving","listenersForEvent","Observable","_onObjectAdded","renderOnAddRemove","insertAt","nonSplicing","objects","somethingRemoved","_onObjectRemoved","isEmpty","contains","complexity","memo","current","CommonMethods","_setOptions","_initGradient","filler","colorStops","Gradient","_initPattern","Pattern","_initClipping","clipTo","functionBody","getFunctionBody","_setObject","_set","toggle","sqrt","atan2","pow","PiBy180","PI","PiBy2","cos","angleSlice","sin","sign","removeFromArray","getRandomInt","degreesToRadians","degrees","radiansToDegrees","radians","rotatePoint","point","subtractEquals","rotateVector","addEquals","vector","transformPoint","ignoreOffset","makeBoundingBoxFromPoints","points","xPoints","minX","maxX","yPoints","minY","maxY","invertTransform","toFixed","number","fractionDigits","parseUnit","unit","Text","DEFAULT_SVG_FONT_SIZE","falseFunction","getKlass","namespace","resolveNamespace","getSvgAttributes","loadImage","url","crossOrigin","createImage","onLoadCallback","onerror","substring","loadImageInDom","div","querySelector","parentNode","enlivenObjects","reviver","enlivenedObjects","numLoadedObjects","numTotalObjects","onLoaded","klass","fromObject","enlivenPatterns","patterns","numLoadedPatterns","numPatterns","enlivenedPatterns","pattern","groupSVGElements","elements","path","centerPoint","Group","sourcePath","populateWithProperties","properties","drawDashedLine","da","dx","dy","rot","dc","di","draw","restore","createCanvasElement","copyCanvasElement","newCanvas","toDataURL","canvasEl","format","quality","clipContext","receiver","beginPath","clip","multiplyTransformMatrices","is2x2","qrDecompose","denom","skewX","skewY","translateX","translateY","calcRotateMatrix","theta","calcDimensionsMatrix","scaleMatrix","multiply","tan","composeMatrix","matrix","customTransformMatrix","resetObjectTransform","saveObjectTransform","isTransparent","tolerance","temp","_isTransparent","imageData","getImageData","parsePreserveAspectRatioAttribute","attribute","align","meetOrSlice","alignX","alignY","aspectRatioAttrs","clearFabricFontCache","limitDimsByArea","ar","maximumArea","roughWidth","perfLimitSizeY","capValue","findScaleToFit","findScaleToCover","matrixToSVG","NUM_FRACTION_DIGITS","_join","arcToSegments","toX","toY","large","sweep","rotateX","argsString","th","sinTh","cosTh","fromX","fromY","abs","py","rx2","ry2","py2","px2","pl","root","cx","cy","cx1","cy1","mTheta","calcVectorAngle","dtheta","segments","mDelta","mT","th3","segmentToBezier","th2","costh2","sinth2","costh3","sinth3","cp1X","cp1Y","cp2X","cp2Y","ux","uy","vx","vy","ta","tb","getBoundsOfCurve","x3","y3","t1","t2","b2ac","sqrtb2ac","tvalues","bounds","jlen","drawArc","fx","fy","coords","tx","ty","segs","segsNorm","bezierCurveTo","getBoundsOfArc","bound","invoke","method","byProperty","value1","value2","condition","extend","Element","character","capitalize","firstLetterOnly","escapeXml","graphemeSplit","textstring","chr","graphemes","getWholeChar","prev","emptyFunction","IS_DONTENUM_BUGGY","addMethods","parent","superclass","returnValue","Subclass","callSuper","methodName","parentMethod","superClassMethod","createClass","shift","subclasses","couldUseAttachEvent","attachEvent","getTouchInfo","touchProp","changedTouches","addListener","addEventListener","removeListener","removeEventListener","getPointer","scroll","getScrollLeftTop","_evt","setStyle","elementStyle","cssText","setOpacity","normalizedProperty","styleFloat","parseEl","supportsOpacity","opacity","supportsFilters","reOpacity","es","currentStyle","hasLayout","_slice","getById","getElementById","sliceCanConvertNodelists","getElementStyle","toArray","arrayLike","childNodes","makeElement","className","htmlFor","setAttribute","addClass","wrapElement","replaceChild","docElement","body","scrollLeft","scrollTop","host","nodeType","getElementOffset","docElem","scrollLeftTop","doc","ownerDocument","box","offsetAttributes","borderLeftWidth","borderTopWidth","paddingLeft","paddingTop","attr","getBoundingClientRect","clientLeft","clientTop","getNodeCanvas","impl","_canvas","_image","cleanUpJsdomNode","_currentSrc","_attributes","_classList","defaultView","getComputedStyle","selectProp","makeElementUnselectable","onselectstart","unselectable","makeElementSelectable","getScript","headEl","scriptEl","onreadystatechange","addParamToUrl","param","emptyFn","request","onComplete","xhr","XMLHttpRequest","parameters","setRequestHeader","send","noop","defaultEasing","animate","requestAnimFrame","timestamp","time","duration","finish","abort","easing","startValue","endValue","byValue","onStart","tick","ticktime","currentTime","timePerc","valuePerc","_requestAnimFrame","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","setTimeout","_cancelAnimFrame","cancelAnimationFrame","clearTimeout","cancelAnimFrame","calculateColor","begin","animateColor","fromColor","toColor","startColor","Color","getSource","endColor","posValue","colorEasing","normalize","asin","elastic","opts","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","ease","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","svgValidTagNames","svgViewBoxElements","svgInvalidAncestors","svgValidParents","attributesMap","visibility","colorAttributes","fSize","cPath","normalizeAttr","normalizeValue","parentAttributes","transformMatrix","parseTransformAttribute","visible","fillIndex","strokeIndex","getSvgRegex","_setStrokeFillOpacity","setAlpha","getAlpha","toRgba","_getMultipleNodes","nodeNames","nodeList","nodeArray","parseStyleString","oStyle","chunk","pair","trim","parseStyleObject","getGlobalStylesForElement","svgUid","rule","cssRules","elementMatchesRule","selectors","firstMatching","parentMatching","selectorMatches","doesSomeParentMatch","selector","matcher","classNames","getAttribute","elementById","nodelist","parseUseDirectives","xlink","substr","el2","cloneNode","currentTrans","oldLength","applyViewboxTransform","el3","createElementNS","setAttributeNS","nodeValue","firstChild","removeAttribute","svgValidTagNamesRegEx","svgViewBoxElementsRegEx","svgInvalidAncestorsRegEx","svgValidParentsRegEx","gradientDefs","clipPaths","rotateMatrix","multiplierX","multiplierY","skewMatrix","translateMatrix","commaWsp","transforms","transformList","reTransformList","reTransform","attributeValue","matrices","operation","combinedMatrix","reViewBoxAttrValue","viewBoxWidth","viewBoxHeight","viewBoxAttr","widthAttr","heightAttr","preserveAspectRatio","missingViewBox","missingDimAttr","toBeParsed","parsedDim","widthDiff","heightDiff","viewboxTransform","hasAncestorWithNodeName","recursivelyParseGradientsXlink","gradient","gradientsAttrs","xlinkAttr","xLink","referencedGradient","hasAttribute","referenceClone","parseSVGDocument","parsingOptions","__uid","descendants","selectNodes","getGradientDefs","getCSSRules","parseElements","instances","reFontDeclaration","parseFontDeclaration","lineHeight","tagArray","elList","parseAttributes","parentFontSize","ownAttributes","cssAttrs","parseStyleAttribute","normalizedAttr","normalizedValue","normalizedStyle","font","mergedAttrs","ElementsParser","parse","parsePointsAttribute","parsedPoints","rules","allRules","styleContents","textContent","ruleObj","declaration","propertyValuePairs","_rule","loadSVGFromURL","xml","responseXML","ActiveXObject","responseText","async","loadXML","_options","allElements","loadSVGFromString","parser","parseFromString","regexUrl","numElements","createObjects","createObject","findTag","fromElement","createCallback","checkIfDone","resolveGradient","Image","_originalElement","_removeTransformMatrix","resolveClipPath","extractPropertyDefinition","storage","gradientDef","opacityAttr","createClipPathCallback","container","_newObj","fillRule","clipRule","usingElement","objTransformInv","gTransform","calcTransformMatrix","clipPathTag","clipPathOwner","setPositionByOrigin","scalarAdd","scalar","scalarAddEquals","subtract","scalarSubtract","scalarSubtractEquals","multiplyEquals","divide","divideEquals","eq","lte","gte","lerp","distanceFrom","midPointFrom","setXY","setX","setY","setFromPoint","swap","Intersection","status","appendPoint","appendPoints","intersectLineLine","a1","a2","b1","b2","uaT","ubT","uB","ua","ub","intersectLinePolygon","inter","intersectPolygonPolygon","points1","points2","intersectPolygonRectangle","r1","r2","topRight","bottomLeft","inter1","inter2","inter3","inter4","_tryParsingColor","setSource","hue2rgb","q","colorNameMap","sourceFromHex","sourceFromRgb","sourceFromHsl","_rgbToHsl","_source","toRgb","toHsl","hsl","toHsla","toHex","toHexa","alpha","toGrayscale","average","currentAlpha","toBlackWhite","threshold","overlayWith","otherColor","otherAlpha","otherSource","reRGBa","reHSLa","reHex","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","fromRgb","fromSource","fromRgba","fromHsl","fromHsla","fromHex","isShortNotation","isRGBa","oColor","getColorStop","colorAlpha","keyValuePairs","getLinearCoords","getRadialCoords","__convertPercentUnitsToValues","instance","svgOptions","gradientUnits","propValue","finalValue","gradientTransform","addColorStop","propertiesToInclude","toSVG","markup","commonAttributes","needsSwap","withViewport","additionalTransform","sort","pathOffset","minRadius","maxRadius","percentageShift","colorStop","toLive","stops","createLinearGradient","createRadialGradient","colorStopEls","forObject","repeat","patternTransform","setOptions","patternSource","patternWidth","patternHeight","patternOffsetX","patternOffsetY","patternImgSrc","complete","naturalWidth","naturalHeight","createPattern","Shadow","affectStroke","includeDefaultValues","nonScaling","_parseShadow","shadow","shadowStr","offsetsAndBlur","reOffsetsAndBlur","fBoxX","fBoxY","BLUR_BOX","StaticCanvas","CANVAS_INIT_ERROR","renderAndResetBound","renderAndReset","requestRenderAllBound","_initStatic","backgroundColor","backgroundImage","overlayColor","overlayImage","stateful","controlsAboveOverlay","allowTouchScrolling","imageSmoothingEnabled","viewportTransform","backgroundVpt","overlayVpt","onBeforeScaleRotate","enableRetinaScaling","vptCoords","skipOffscreen","cb","_createLowerCanvas","_initOptions","_setImageSmoothing","interactive","_initRetinaScaling","setOverlayImage","setBackgroundImage","setOverlayColor","calcOffset","_isRetinaScaling","getRetinaScaling","scaleRatio","__initRetinaScaling","lowerCanvasEl","contextContainer","upperCanvasEl","contextTop","_offset","__setBgOverlayImage","__setBgOverlayColor","webkitImageSmoothingEnabled","mozImageSmoothingEnabled","msImageSmoothingEnabled","oImageSmoothingEnabled","_createCanvasElement","_applyCanvasStyle","getWidth","getHeight","setDimensions","dimensions","cssValue","cssOnly","_setBackstoreDimension","hasLostContext","backstoreOnly","_setCssDimension","_isCurrentlyDrawing","freeDrawingBrush","_setBrushStyles","cacheCanvasEl","wrapperEl","setViewportTransform","vpt","activeObject","_activeObject","ignoreVpt","skipAbsolute","group","calcViewportBoundaries","before","after","absolutePan","getElement","setupState","clearContext","clearRect","_hasITextHandlers","_mouseUpITextHandler","_iTextInstances","canvasToDrawOn","renderCanvas","isRendering","iVpt","cancelRequestedRender","_renderBackground","_renderObjects","drawControls","shouldCache","_transformDone","renderCache","forClipping","drawClipPathOnCanvas","_renderOverlay","globalCompositeOperation","zoomX","zoomY","_cacheCanvas","cacheTranslationX","cacheTranslationY","_renderBackgroundOrOverlay","needsVpt","lineTo","closePath","fillStyle","getCenter","centerObjectH","_centerObject","getCenterPoint","centerObjectV","viewportCenterObject","vpCenter","getVpCenter","viewportCenterObjectH","viewportCenterObjectV","toDatalessObject","_toObjectMethod","_toObjects","_toObject","__serializeBgOverlay","excludeFromExport","originalValue","bgImage","overlay","background","svgViewportTransformation","_setSVGPreamble","_setSVGHeader","clipPathId","_setSVGBgOverlayColor","_setSVGBgOverlayImage","_setSVGObjects","suppressPreamble","encoding","viewBox","createSVGFontFacesMarkup","createSVGRefElementsMarkup","createSVGClipPathMarkup","toClipPathSVG","shouldTransform","row","rowIndex","_char","charIndex","fontList","_setSVGObject","finalWidth","finalHeight","shouldInvert","activeSelection","unshift","bringToFront","sendBackwards","intersecting","newIdx","objsMoved","_findNewLowerIndex","isIntersecting","intersectsWithObject","isContainedWithinObject","bringForward","_findNewUpperIndex","DataURLExporter","EMPTY_JSON","supports","setLineDash","toJSON","createPNGStream","createJPEGStream","BaseBrush","strokeLineCap","strokeLineJoin","strokeMiterLimit","strokeDashArray","setShadow","strokeStyle","lineWidth","lineCap","miterLimit","lineJoin","_saveAndTransform","_setShadow","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","needsFullRender","_resetShadow","PencilBrush","decimate","_points","_drawSegment","p1","p2","midPoint","quadraticCurveTo","onMouseDown","_isMainEvent","_prepareForDrawing","_captureDrawingPath","_render","oldEnd","onMouseUp","_finalizeAndAddPath","_reset","_addPoint","pointerPoint","convertPointsToSVGPath","multSignX","multSignY","manyPoints","createPath","pathData","Path","decimatePoints","distance","cDistance","adjustedDistance","lastPoint","newPoints","CircleBrush","drawDot","addPoint","dot","arc","originalRenderOnAddRemove","circles","circle","Circle","circleRadius","circleColor","SprayBrush","density","dotWidth","dotWidthVariance","randomOpacity","optimizeOverlapping","sprayChunks","addSprayChunk","sprayChunkPoints","rects","ilen","sprayChunk","Rect","_getOptimizedRects","uniqueRects","uniqueRectsArray","globalAlpha","fillRect","PatternBrush","getPatternSrc","dotDistance","patternCanvas","patternCtx","getPatternSrcFunction","getPattern","topLeft","_getLeftTopCoords","supportLineDash","STROKE_OFFSET","_initInteractive","_createCacheCanvas","uniScaleTransform","uniScaleKey","centeredScaling","centeredRotation","centeredKey","altActionKey","selectionKey","altSelectionKey","selectionDashArray","selectionBorderColor","selectionLineWidth","selectionFullyContained","moveCursor","freeDrawingCursor","rotationCursor","notAllowedCursor","containerClass","perPixelTargetFind","targetFindTolerance","skipTargetFind","isDrawingMode","snapAngle","snapThreshold","fireMiddleClick","targets","_hoveredTarget","_hoveredTargets","_currentTransform","_groupSelector","_initWrapperElement","_createUpperCanvas","_initEventListeners","_chooseObjectsToRender","objsToRender","activeGroupObjects","activeObjects","getActiveObjects","contextTopDirty","renderTopLayer","_drawSelection","renderTop","_resetCurrentTransform","_shouldCenterTransform","mouseXSign","mouseYSign","containsPoint","xy","ignoreZoom","_normalizePointer","_findTargetCorner","invertedM","vptPointer","restorePointerVpt","isTargetTransparent","normalizedPointer","targetRelativeX","targetRelativeY","_cacheContext","contextCache","originalColor","selectionBackgroundColor","_renderControls","hasBorders","transparentCorners","_isSelectionKeyPressed","selectionKeyPressed","_shouldClearSelection","centerTransform","action","_getOriginFromCorner","corner","_getActionFromCorner","alreadySelected","_setupCurrentTransform","ex","ey","lastX","lastY","_beforeTransform","_translateObject","newLeft","newTop","moveX","moveY","_changeSkewTransformOrigin","mouseMove","by","origins","0","skew","originA","originB","flipSign","skewSign","_skewObject","skewed","lockSkewingX","lockSkewingY","actualMouseByOrigin","constraintPosition","actualMouseByCenter","toLocalPoint","lastMouseByCenter","dim","_getTransformedDimensions","translateToOriginPoint","_setObjectSkew","localMouse","_dim","newDim","dimNoSkew","otherBy","_otherBy","_by","newDimMouse","atan","_scaleObject","lockScalingFlip","scaled","_setLocalMouse","_setObjectScale","forbidScalingX","forbidScalingY","changeX","changeY","Textbox","w","getMinWidth","_scaleObjectEqually","_flipObject","dist","lastDist","signX","signY","padding","_rotateObject","lockRotation","lastAngle","curAngle","hasRotated","rightAngleLocked","leftAngleLocked","setCursor","cursor","groupSelector","aleft","atop","_setLineDash","strokeRect","findTarget","skipGroup","activeTarget","activeTargetSubs","aObjects","_searchPossibleTargets","_checkTarget","globalPointer","isEditing","subTarget","objToCheck","pointerToUse","subTargetCheck","_absolutePointer","_pointer","cssScale","boundsWidth","boundsHeight","retinaScaling","lowerCanvasClass","_copyCanvasStyle","fromEl","toEl","getSelectionContext","getSelectionElement","getActiveObject","_discardActiveObject","_fireSelectionEvents","oldObjects","somethingChanged","opt","oldObject","deselected","updated","currentActives","_setActiveObject","onSelect","onDeselect","removeListeners","originalProperties","_realizeGroupTransformOnObject","_unwindGroupTransformOnObject","layoutProps","originalValues","realizeTransform","clearContextTop","cursorOffset","RIGHT_CLICK","MIDDLE_CLICK","LEFT_CLICK","addEventOptions","checkClick","cursorMap","mainTouchId","_bindEvents","addOrRemove","_getEventPrefix","enablePointerEvents","functor","eventjsFunctor","canvasElement","eventTypePrefix","_onResize","_onMouseDown","_onMouseMove","_onMouseOut","_onMouseEnter","_onMouseWheel","_onContextMenu","_onDoubleClick","_onDragOver","_onDragEnter","_onDragLeave","_onDrop","_onTouchStart","eventjs","_onGesture","_onDrag","_onOrientationChange","_onShake","_onLongPress","_onMouseUp","_onTouchEnd","eventsBound","_simpleEventHandler","__onTransformGesture","__onDrag","__onMouseWheel","_target","hiddenTextarea","currentTransform","__onOrientationChange","__onShake","__onLongPress","preventDefault","_fireEnterLeaveEvents","_cacheTransformEventData","_handleEvent","_resetTransformEventData","getPointerId","identifier","pointerId","isPrimary","touches","__onMouseDown","__onMouseUp","_willAddMouseDown","__onMouseMove","_shouldRender","shouldRender","isClick","_onMouseUpInDrawingMode","_finalizeCurrentTransform","actionPerformed","_maybeGroupObjects","isMoving","_setCursorFromEvent","__corner","eventType","subTargets","absolutePointer","_scaling","hasStateChanged","_addEventOptions","_fire","_onMouseDownInDrawingMode","_onMouseMoveInDrawingMode","_previousPointer","shouldGroup","_shouldGroup","_handleGrouping","saveState","_transformObject","_fireOverOutEvents","fireSyntheticInOutEvents","oldTarget","evtOut","canvasEvtOut","evtIn","canvasEvtIn","_draggedoverTarget","config","inOpt","outOpt","outFires","inFires","targetChanged","previousTarget","nextTarget","reset","_beforeScaleTransform","_performTransformAction","_onScale","_isUniscalePossible","currentAction","getCornerCursor","actionIsDisabled","_getRotatedCornerCursor","hasRotatingPoint","_updateActiveSelection","_createActiveSelection","currentActiveObjects","removeWithUpdate","addWithUpdate","_createGroup","isActiveLower","groupObjects","exitEditing","ActiveSelection","_groupSelectedObjects","aGroup","_collectObjects","currentObject","selectionX1Y1","selectionX2Y2","allowIntersect","intersectsWithRect","isContainedWithinRect","toCanvasElement","cropping","scaledWidth","scaledHeight","originalWidth","originalHeight","newZoom","vp","originalInteractive","newVp","originalRetina","originalContextTop","loadFromDatalessJSON","serialized","_enlivenObjects","_setBgOverlay","enlivenedCanvasClip","__setupCanvas","loaded","cbIfLoaded","__setBgOverlay","enlivedObject","_toDataURL","_toDataURLWithMultiplier","toDataURLWithMultiplier","cloneWithoutData","backgroundImageOpacity","backgroundImageStretch","supportsLineDash","ALIASING_LIMIT","cornerSize","borderColor","borderDashArray","cornerColor","cornerStrokeColor","cornerStyle","cornerDashArray","strokeDashOffset","borderOpacityWhenMoving","borderScaleFactor","minScaleLimit","hasControls","rotatingPointOffset","lockMovementX","lockMovementY","lockUniScaling","statefullCache","noScaleCache","strokeUniform","dirty","paintFirst","stateProperties","cacheProperties","inverted","absolutePositioned","_cacheProperties","_updateCacheCanvas","_limitCacheSize","dims","limitedDims","capped","_getCacheCanvasDimensions","objectScale","getTotalObjectScaling","neededX","neededY","drawingWidth","drawingHeight","minCacheSize","dimensionsChanged","cacheWidth","cacheHeight","zoomChanged","shouldRedraw","additionalWidth","additionalHeight","shouldResizeCanvas","canvasWidth","canvasHeight","sizeGrowing","sizeShrinking","setTransform","calcOwnMatrix","_removeDefaultValues","getObjectScaling","retina","getObjectOpacity","shouldConstrainValue","isChanged","groupNeedsUpdate","_constrainScale","isOnACache","setOnGroup","getViewportTransform","isNotVisible","isOnScreen","_setupCompositeOperation","drawSelectionBackground","_setOpacity","drawCacheOnCanvas","_removeCacheCanvas","drawObject","propertySet","isCacheDirty","hasStroke","hasFill","needsItsOwnCache","ownCaching","willDrawShadow","drawClipPathOnCache","originalFill","originalStroke","_setClippingProperties","_setStrokeStyles","_setFillStyles","_drawClipPath","skipCanvas","_getNonTransformedDimensions","_removeShadow","decl","lineDashOffset","dashArray","alternative","styleOverride","drawBorders","forActiveSelection","drawBordersInGroup","scaling","multX","multY","_applyPatternGradientTransform","_renderPaintInOrder","_renderStroke","_renderFill","_renderDashedStroke","_applyPatternForTransformedGradient","pCtx","pCanvas","_findCenterFromElement","_assignTransformMatrixProps","preserveAspectRatioOptions","cropX","cropY","offsetLeft","offsetTop","objectForm","_fromObject","cloneAsImage","utils","origParams","originalGroup","originalShadow","withoutTransform","withoutShadow","boundingRect","getBoundingRect","shadowOffset","originalCanvas","isType","setGradient","setPatternFill","setColor","shouldCenterOrigin","_setOriginToCenter","_resetOrigin","centerH","viewportCenterH","centerV","viewportCenterV","viewportCenter","getLocalPointer","pClicked","objectLeftTop","createAccessors","extraParam","enlivedProps","originXOffset","originYOffset","translateToGivenOrigin","fromOriginX","fromOriginY","toOriginX","toOriginY","translateToCenterPoint","leftTop","getPointByOrigin","adjustPosition","offsetFrom","offsetTo","hypotFull","getScaledWidth","xFull","yFull","_originalOriginX","_originalOriginY","originPoint","getCoords","multiplyMatrices","oCoords","aCoords","ownMatrixCache","matrixCache","calculate","calcCoords","pointTL","pointBR","intersection","other","lines","_getImageLines","_findCrossPoints","_containsCenterOfCanvas","isPartiallyOnScreen","topline","rightline","bottomline","leftline","xi","iLine","xcount","lineKey","getScaledHeight","scaleToWidth","boundingRectFactor","scaleToHeight","_calcRotateMatrix","_calcTranslateMatrix","startMatrix","finalMatrix","cosP","sinP","cosPSinP","cosPMinusSinP","mtr","_setCornerCoords","transformMatrixKey","sep","prefix","tMatrix","_calcDimensionsTransformMatrix","flipping","dimX","dimY","noSkew","_finalizeDimensions","bbox","_calculateCurrentDimensions","getSvgColorString","getSvgStyles","skipShadow","getSvgFilter","getSvgSpanStyles","useWhiteSpace","term","textDecoration","getSvgTextDecoration","decoration","getSvgCommons","getSvgTransform","full","svgTransform","getSvgTransformMatrix","_setSVGBg","textBgRects","_getFillAttributes","_createBaseSVGMarkup","_toSVG","_createBaseClipPathSVGMarkup","objectMarkup","commonPieces","clipPathMarkup","noStyle","styleInfo","shadowInfo","withShadow","vectorEffect","absoluteClipPath","addPaintOrder","originalSet","saveProps","tmpObj","_isEqual","origValue","currentValue","firstPass","dashedPropertySet","_controlsVisibility","isControlVisible","newTheta","cornerHypotenuse","cosHalfOffset","sinHalfOffset","wh","drawRotatingPoint","rotateHeight","scaleOffset","_drawControl","control","controlName","_getControlsVisibility","setControlVisible","FX_DURATION","fxCenterObjectH","callbacks","empty","fxCenterObjectV","fxRemove","skipCallbacks","propsToAnimate","_animate","propPair","valueProgress","timeProgress","coordProps","makeEdgeToOriginGetter","propertyNames","originValues","axis1","axis2","dimension","nearest","farthest","Line","_setWidthHeight","_getLeftToOriginX","_getTopToOriginY","calcLinePoints","origStrokeStyle","xMult","yMult","ATTRIBUTE_NAMES","parsedAttributes","_callback","pi","isValidRadius","startAngle","endAngle","setRadius","svgString","startX","startY","endX","endY","largeFlag","getRadiusX","getRadiusY","Triangle","widthBy2","heightBy2","piBy2","Ellipse","getRx","getRy","_initRxRy","isRounded","Polyline","_setPositionDimensions","correctLeftTop","calcDim","_calcDimensions","fromSVG","diffX","diffY","commonRender","fromElementGenerator","_class","Polygon","_toString","commandLengths","repeatedCommands","M","fromArray","_parsePath","_renderPathCommands","tempX","tempY","previous","subpathStartX","subpathStartY","controlX","controlY","_getOffsetTransform","digits","currentPath","coordsStr","coordsParsed","command","commandLength","repeatedCommand","klen","aX","aY","pathUrl","useSetOnGroup","isAlreadyGrouped","_updateObjectsACoords","_calcBounds","_updateObjectsCoords","_updateObjectCoords","objectLeft","objectTop","_restoreObjectsState","_includeDefaultValues","objsToObject","originalDefaults","_obj","ownCache","_restoreObjectState","toActiveSelection","ungroupOnCanvas","setObjectsCoords","onlyWidthHeight","iLen","jLen","_getBounds","minXY","maxXY","enlivedClipPath","toGroup","newGroup","childrenOverride","srcFromAttribute","_lastScaleX","_lastScaleY","_filterScalingX","_filterScalingY","minimumScaleTrigger","cacheKey","filters","_initElement","_element","setElement","removeTexture","_initConfig","applyFilters","resizeFilter","applyResizeFilters","backend","filterBackend","evictCachesForKey","setCrossOrigin","getOriginalSize","_stroke","filterObj","getSrc","hasCrop","strokeSvg","imageMarkup","getSvgSrc","origFill","filtered","minimumScale","elementToFilter","_filteredEl","sourceWidth","sourceHeight","isNeutralState","imgElement","_needsResize","elementToDraw","sW","sH","sX","sY","_resetWidthHeight","CSS_CANVAS","_initFilters","pAR","rWidth","rHeight","pWidth","pHeight","_object","resizeFilters","fromURL","imgOptions","_getAngleValueForStraighten","straighten","fxStraighten","straightenObject","fxStraightenObject","testPrecision","precision","fragmentSource","fragmentShader","createShader","FRAGMENT_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","setupGLContext","captureGPUInfo","isSupported","getParameter","MAX_TEXTURE_SIZE","precisions","webGlPrecision","createWebGLCanvas","aPosition","Float32Array","chooseFastestCopyGLTo2DMethod","canUseImageData","canMeasurePerf","canUseArrayBuffer","ArrayBuffer","canUseUint8Clamped","copyGLTo2D","startTime","drawImageTime","putImageDataTime","testContext","glOptions","premultipliedAlpha","depth","stencil","antialias","clearColor","cachedTexture","getCachedTexture","sourceTexture","createTexture","targetTexture","originalTexture","passes","webgl","programCache","pass","tempFbo","createFramebuffer","bindFramebuffer","FRAMEBUFFER","applyTo","bindTexture","TEXTURE_2D","deleteTexture","deleteFramebuffer","clearWebGLCaches","textureCache","textureImageSource","texture","texParameteri","TEXTURE_MAG_FILTER","NEAREST","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","texImage2D","uniqueId","gpuInfo","renderer","vendor","ext","getExtension","UNMASKED_RENDERER_WEBGL","UNMASKED_VENDOR_WEBGL","sourceElement","originalImageData","originalEl","BaseFilter","vertexSource","createProgram","vertexShader","VERTEX_SHADER","getShaderInfoLog","program","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","attributeLocations","getAttributeLocations","uniformLocations","getUniformLocations","uStepW","getUniformLocation","uStepH","getAttribLocation","sendAttributeData","aPositionData","attributeLocation","buffer","createBuffer","bindBuffer","ARRAY_BUFFER","enableVertexAttribArray","vertexAttribPointer","FLOAT","bufferData","STATIC_DRAW","_setupFrameBuffer","framebufferTexture2D","COLOR_ATTACHMENT0","_swapTextures","main","mainParameter","applyToWebGL","applyTo2d","retrieveShader","shader","useProgram","uniform1f","sendUniformData","viewport","drawArrays","TRIANGLE_STRIP","bindAdditionalTexture","textureUnit","activeTexture","TEXTURE0","unbindAdditionalTexture","getMainParameter","setMainParameter","createHelpLayer","helpLayer","mainP","ColorMatrix","colorsOnly","uColorMatrix","uConstants","constants","uniformMatrix4fv","uniform4fv","Brightness","brightness","uBrightness","Convolute","opaque","Convolute_3_1","Convolute_3_0","Convolute_5_1","Convolute_5_0","Convolute_7_1","Convolute_7_0","Convolute_9_1","Convolute_9_0","dstOff","scx","scy","srcOff","wt","weights","side","halfSide","sw","sh","createImageData","dst","alphaFac","uMatrix","uOpaque","uHalfSize","uSize","uniform1fv","Grayscale","lightness","luminosity","uMode","uniform1i","Invert","invert","uInvert","Noise","noise","rand","uNoise","uSeed","Pixelate","blocksize","_j","_iLen","_jLen","uBlocksize","RemoveColor","useAlpha","lowC","highC","uLow","uHigh","Brownie","Vintage","Kodachrome","Technicolor","Polaroid","Sepia","BlackWhite","BlendColor","screen","lighten","darken","exclusion","tint","buildSource","tg","alpha1","uColor","BlendImage","mask","TEXTURE1","calculateMatrix","canvas1","blendData","blendImage","uTransformMatrix","uImage","uniformMatrix3fv","Resize","resizeType","lanczosLobes","uDelta","uTaps","uniform2fv","horizontal","taps","filterWindow","getFilterWindow","generateShader","tempScale","getTaps","lobeFunction","lanczosCreate","offsets","fragmentSourceTOP","dW","dH","lobes","xx","rcpScaleX","rcpScaleY","newData","oW","oH","sliceByTwo","hermiteFastResize","bilinearFiltering","lanczosResize","tmpCanvas","mult","doneW","doneH","stepW","stepH","dX","dY","process","u","weight","fX","fY","ratioX","icenter","ratioY","range2X","cacheLanc","range2Y","lanczos","rcpRatioX","rcpRatioY","srcData","destData","destImg","xDiff","yDiff","chnl","origPix","w4","pixels","destImage","destPixels","ratioW","ratioH","ratioWHalf","ratioHHalf","img2","data2","weightsAlpha","gxR","gxG","gxB","gxA","centerY","yy","centerX","w0","Contrast","contrast","contrastF","uContrast","Saturation","saturation","adjust","uSaturation","Blur","simpleBlur","canvas2","blurLayer1","blurLayer2","percent","ctx1","ctx2","nSamples","newImageData","chooseRightDelta","blurScale","Gamma","gamma","rInv","gInv","bInv","rVals","gVals","bVals","uGamma","uniform3fv","Composed","subFilters","HueRotation","rotation","rad","aThird","aThirdSqtSin","OneMinusCos","_dimensionAffectingProps","_reNewline","_reSpacesAndTabs","_reSpaceAndTab","_reWords","overline","linethrough","superscript","baseline","subscript","textBackgroundColor","_fontSizeFraction","_fontSizeMult","charSpacing","_measuringContext","_styleProperties","__charBounds","CACHE_FONT_SIZE","MIN_TEXT_WIDTH","__skipDimension","initDimensions","getMeasuringContext","_splitText","newLines","_splitTextIntoLines","textLines","_textLines","graphemeLines","_unwrappedTextLines","_unwrappedLines","_text","graphemeText","_clearCache","calcTextWidth","cursorWidth","enlargeSpaces","calcTextHeight","diffSpace","currentLineWidth","numberOfSpaces","accumulatedSpace","line","charBound","spaces","isEndOfWrapping","getLineWidth","kernedWidth","lineIndex","missingNewlineOffset","_setTextStyles","_renderTextLinesBackground","_renderTextDecoration","_renderText","_renderTextStroke","_renderTextFill","charStyle","forMeasuring","textBaseline","_getFontDeclaration","maxWidth","_renderTextLine","_renderChars","styleHas","heightOfLine","lineLeftOffset","lastColor","charBox","currentColor","lineTopOffset","leftOffset","_getLeftOffset","topOffset","_getTopOffset","boxStart","boxWidth","getHeightOfLine","_getLineLeftOffset","getValueOfPropertyAt","getFontCache","cacheProp","_applyCharStyles","styleDeclaration","_measureChar","previousChar","prevCharStyle","coupleWidth","previousWidth","fontCache","fontDeclaration","previousFontDeclaration","couple","stylesAreEqual","fontMultiplier","measureText","getHeightOfChar","measureLine","lineInfo","_measureLine","_getWidthOfCharSpacing","grapheme","prevGrapheme","graphemeInfo","numOfSpaces","lineBounds","_getGraphemeBox","skipLeft","getCompleteStyleDeclaration","prevStyle","info","previousBox","__lineHeights","maxHeight","_renderTextCommon","lineHeights","isEmptyStyles","actualStyle","nextStyle","timeToRender","isJustify","charsToRender","shortCut","_renderChar","_hasStyleChanged","_getStyleDeclaration","fullDecl","shouldFill","shouldStroke","fillText","strokeText","setSuperscript","_setScript","setSubscript","schema","loc","get2DCursorLocation","setSelectionStyles","thisStyle","_hasStyleChangedForSvg","__lineWidths","_shouldClearDimensionCache","shouldClear","_forceClearCache","_size","_dy","lastDecoration","currentDecoration","currentFill","lastFill","styleObject","family","fontIsGeneric","genericFonts","newLine","newText","additionalProperties","needsDims","_key","parsedAnchor","textAnchor","originalStrokeWidth","textHeightScaleFactor","lineHeightDiff","scaledDiff","textHeight","offX","p3","cleanStyle","letterCount","stylePropertyValue","stylesCount","allStyleObjectPropertiesMatch","graphemeCount","stylePropertyHasBeenSet","removeStyle","lineNum","charNum","_extendStyles","_getLineStyle","_setLineStyle","_setStyleDeclaration","selectionStart","skipWrapping","getSelectionStyles","startIndex","endIndex","selectionEnd","getStyleAtPosition","lineStyle","_deleteStyleDeclaration","_deleteLineStyle","parseDecoration","IText","editingBorderColor","cursorColor","cursorDelay","cursorDuration","caching","_reSpace","_currentCursorOpacity","_selectionDirection","_abortCursorAnimation","__widthOfSpace","inCompositionMode","initBehavior","setSelectionStart","_updateAndFire","setSelectionEnd","_fireSelectionChanged","_updateTextarea","initDelayedCursor","cursorOffsetCache","renderCursorOrSelection","skipRestore","_clearTextArea","boundaries","_getCursorBoundaries","renderCursor","renderSelection","_getCursorBoundariesOffsets","cursorPosition","cursorLocation","charHeight","__isMousedown","startLine","endLine","startChar","endChar","lineOffset","realLineHeight","boxEnd","compositionColor","getCurrentCharFontSize","cp","_getCurrentCharIndex","getCurrentCharColor","initAddedHandler","initRemovedHandler","initCursorSelectionHandlers","initDoubleClickSimulation","mouseMoveHandler","_initCanvasHandlers","_removeCanvasHandlers","_tick","_currentTickState","_animateCursor","targetOpacity","completeMethod","tickState","isAborted","_onTickComplete","_cursorTimeout1","_currentTickCompleteState","restart","delay","abortCursorAnimation","_cursorTimeout2","selectAll","getSelectedText","findWordBoundaryLeft","startFrom","findWordBoundaryRight","findLineBoundaryLeft","findLineBoundaryRight","searchWordBoundary","selectWord","newSelectionStart","newSelectionEnd","selectLine","enterEditing","exitEditingOnOthers","initHiddenTextarea","_saveEditingProps","_setEditingProps","_textBeforeEdit","initMouseMoveHandler","getSelectionStartFromPointer","currentStart","currentEnd","__selectionStartOnMouseDown","restartCursorIfNeeded","fromStringToGraphemeSelection","smallerTextStart","graphemeStart","smallerTextEnd","graphemeEnd","fromGraphemeToStringSelection","newSelection","updateTextareaPosition","updateFromTextArea","_calcTextareaPosition","desiredPosition","compositionStart","upperCanvas","upperCanvasWidth","upperCanvasHeight","_savedProps","_restoreEditingProps","isTextChanged","_removeExtraneousStyles","removeStyleFromTo","styleObj","cursorStart","cursorEnd","lineStart","charStart","lineEnd","charEnd","shiftLineStyles","numericChar","clonedStyles","numericLine","insertNewlineStyleObject","qty","copiedStyle","currentCharStyle","newLineStyles","somethingAdded","numIndex","insertCharStyleObject","quantity","currentLineStyles","currentLineStylesCloned","numericIndex","newStyle","insertNewStyleBlock","insertedText","cursorLoc","addedLines","linesLength","setSelectionStartEndWithShift","setSelectionInBoundaries","__lastClickTime","__lastLastClickTime","__lastPointer","__newClickTime","newPointer","isTripleClick","_stopEvent","__lastIsEditing","__lastSelected","initMousedownHandler","initMouseupHandler","initClicks","doubleClickHandler","tripleClickHandler","_mouseDownHandler","setCursorByClick","_mouseDownHandlerBefore","mouseUpHandler","currentActive","mouseOffset","prevWidth","_getNewSelectionStartFromOffset","distanceBtwLastCharAndCursor","distanceBtwNextCharAndCursor","onCompositionStart","onCompositionUpdate","onCompositionEnd","_clickHandlerInitialized","keysMap","9","27","33","34","35","36","37","38","39","40","ctrlKeysMapUp","67","88","ctrlKeysMapDown","65","stopImmediatePropagation","_copyDone","fromPaste","removedText","nextText","charCount","nextCharCount","charDiff","textareaSelection","backDelete","copiedText","copiedTextStyle","compositionEnd","_getClipboardData","clipboardData","_getWidthBeforeCursor","widthBeforeCursor","getDownCursorOffset","isRight","selectionProp","_getSelectionForOffset","indexOnOtherLine","_getIndexOnLine","textAfterCursor","getUpCursorOffset","textBeforeCursor","charWidth","foundMatch","widthOfCharsOnLine","indexOnLine","leftEdge","rightEdge","offsetFromLeftEdge","offsetFromRightEdge","moveCursorDown","_moveCursorUpOrDown","moveCursorUp","moveCursorWithShift","moveCursorWithoutShift","moveCursorLeft","_moveCursorLeftOrRight","_move","_moveLeft","_moveRight","moveCursorLeftWithoutShift","moveCursorLeftWithShift","moveCursorRight","actionName","moveCursorRightWithShift","moveCursorRightWithoutShift","changed","removeChars","insertChars","multipleSpacesRegex","_getSVGLeftTopOffsets","textAndBg","_getSVGTextAndBg","textTop","textLeft","_wrapSVGTextAndBg","lineTop","noShadow","textSpans","textTopOffset","textLeftOffset","_setSVGTextLineBg","_setSVGTextLineText","_createTextCharSpan","styleDecl","shouldUseWhitespace","styleProps","fillStyles","dySpan","_pushTextBgRect","_getSVGLineTopOffset","lastHeight","svgStyle","minWidth","dynamicMinWidth","__cachedLines","_wordJoiners","splitByGrapheme","_styleMap","_generateStyleMap","textInfo","realLineCount","realLineCharCount","isWrapping","nextOffset","nextLineIndex","shouldLimit","mapNextLine","_wrapText","desiredWidth","wrapped","_wrapLine","_measureWord","word","charOffset","_line","reservedSpace","words","infix","wordWidth","infixWidth","largestWordWidth","lineJustStarted","additionalSpace","linesToKeep","read","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","NaN","Infinity","rt","LN2","_typeof","_defineProperty","_extends","_objectSpread","ownKeys","sym","getOwnPropertyDescriptor","_objectWithoutPropertiesLoose","excluded","sourceKeys","_objectWithoutProperties","sourceSymbolKeys","userAgent","IE11OrLess","Edge","FireFox","Safari","IOS","ChromeForAndroid","captureMode","matches","msMatchesSelector","webkitMatchesSelector","getParentOrHost","closest","includeCTX","_throttleTimeout","R_SPACE","toggleClass","classList","css","selfOnly","appliedTransforms","matrixFn","DOMMatrix","WebKitCSSMatrix","CSSMatrix","MSCSSMatrix","getWindowScrollingElement","scrollingElement","getRect","relativeToContainingBlock","relativeToNonStaticParent","undoScale","elRect","innerHeight","innerWidth","containerRect","elMatrix","isScrolledPast","elSide","parentSide","getParentAutoScrollElement","elSideVal","parentSideVal","getChild","childNum","currentChild","Sortable","ghost","dragged","lastChild","last","lastElementChild","previousElementSibling","getRelativeScrollOffset","winScroller","indexOfObject","includeSelf","elem","gotSelf","scrollWidth","scrollHeight","elemCSS","overflowX","overflowY","isRectEqual","rect1","rect2","throttle","ms","cancelThrottle","scrollBy","Polymer","$","jQuery","Zepto","dom","setRect","unsetRect","expando","getTime","AnimationStateManager","animationCallbackId","animationStates","captureAnimationState","animation","fromRect","thisAnimationDuration","childMatrix","addAnimationState","removeAnimationState","animateAll","animating","animationTime","toRect","prevFromRect","prevToRect","animatingRect","targetMatrix","calculateRealTime","animationResetTimer","currentRect","animatingX","animatingY","repaint","animated","offsetWidth","plugins","defaults","initializeByDefault","PluginManager","mount","plugin","pluginEvent","sortable","eventCanceled","cancel","eventNameGlobal","pluginName","initializePlugins","initialized","modified","modifyOption","getEventProperties","eventProperties","modifiedValue","optionListeners","dispatchEvent","rootEl","targetEl","cloneEl","oldDraggableIndex","newDraggableIndex","putSortable","extraEventProperties","onName","CustomEvent","createEvent","initEvent","bubbles","cancelable","lastPutMode","allEventProperties","dragEl","parentEl","ghostEl","nextEl","lastDownEl","cloneHidden","dragStarted","activeSortable","hideGhostForTarget","_hideGhostForTarget","unhideGhostForTarget","_unhideGhostForTarget","cloneNowHidden","cloneNowShown","dispatchSortableEvent","_dispatchEvent","activeGroup","tapEvt","touchEvt","lastDx","lastDy","tapDistanceLeft","tapDistanceTop","lastTarget","lastDirection","targetMoveDistance","ghostRelativeParent","awaitingDragStarted","ignoreNextClick","sortables","pastFirstInvertThresh","isCircumstantialInvert","ghostRelativeParentInitialScroll","_silent","savedInputChecked","documentExists","PositionGhostAbsolutely","CSSFloatProperty","supportDraggable","supportCssPointerEvents","pointerEvents","_detectDirection","elCSS","elWidth","paddingRight","borderRightWidth","child1","child2","firstChildCSS","secondChildCSS","firstChildWidth","marginLeft","marginRight","secondChildWidth","flexDirection","gridTemplateColumns","touchingSideChild2","_dragElInRowColumn","dragRect","targetRect","dragElS1Opp","dragElS2Opp","dragElOppLength","targetS1Opp","targetS2Opp","targetOppLength","_detectNearestEmptySortable","ret","emptyInsertThreshold","insideHorizontally","insideVertically","_prepareGroup","toFn","pull","sameGroup","otherGroup","checkPull","checkPut","put","revertClone","nearestEmptyInsertDetectEvent","_checkOutsideTargetEl","_isOutsideThisEl","handle","swapThreshold","invertSwap","invertedSwapThreshold","removeCloneOnHide","ghostClass","chosenClass","dragClass","ignore","preventOnFilter","setData","dataTransfer","dropBubble","dragoverBubble","dataIdAttr","delayOnTouchOnly","touchStartThreshold","forceFallback","fallbackClass","fallbackOnBody","fallbackTolerance","fallbackOffset","supportPointer","nativeDraggable","_onTapStart","_globalDragOver","dropEffect","_onMove","retVal","onMoveFn","draggedRect","relatedRect","_disableDraggable","_unsilent","_ghostIsLast","spacer","_getSwapDirection","isLastTarget","mouseOnAxis","targetLength","targetS1","targetS2","_getInsertDirection","_generateId","href","sum","_saveInputCheckedState","inputs","_nextTick","_cancelNextTick","_getDirection","pointerType","originalTarget","shadowRoot","composedPath","isContentEditable","criteria","_prepareDragStart","dragStartFn","_lastX","_lastY","_disableDelayedDragEvents","_triggerDragStart","_disableDelayedDrag","_delayedDragTouchMoveHandler","_dragStartTimer","_onTouchMove","_onDragStart","getSelection","removeAllRanges","_dragStarted","fallback","_appendGhost","_nulling","_emulateDragOver","elementFromPoint","ghostMatrix","relativeScrollOffset","cssMatrix","_hideClone","cloneId","_loopId","setInterval","effectAllowed","_dragStartId","revert","isOwner","canSort","fromSortable","completedFired","dragOverEvent","_ignoreWhileAnimating","completed","elLastChild","targetBeforeFirstSwap","sibling","differentLevel","differentRowCol","side1","scrolledPastTop","scrollBefore","dragIndex","nextElementSibling","moveVector","extra","axis","insertion","_showClone","_offMoveEvents","_offUpEvents","clearInterval","handleEvent","order","querySelectorAll","nextTick","cancelNextTick","detectDirection","_len","scrollEl","scrollRootEl","lastAutoScrollX","lastAutoScrollY","touchEvt$1","pointerElemChangedInterval","autoScrolls","scrolling","AutoScrollPlugin","AutoScroll","scrollSensitivity","scrollSpeed","bubbleScroll","_handleAutoScroll","_handleFallbackAutoScroll","dragOverCompleted","dragOverBubble","drop","clearPointerElemChangedInterval","clearAutoScrolls","nulling","autoScroll","ogElemScroller","newElem","pid","lastSwapEl","isFallback","scrollCustomFn","sens","speed","scrollThisInstance","scrollFn","layersOut","currentParent","canScrollX","canScrollY","scrollPosX","scrollPosY","layer","scrollOffsetY","scrollOffsetX","toSortable","onSpill","Revert","Remove","SwapPlugin","Swap","swapClass","dragStart","dragOverValid","prevSwapEl","_ref3","swapNodes","swapItem","n1","n2","i1","i2","isEqualNode","_ref4","parentSortable","lastMultiDragSelect","multiDragSortable","dragEl$1","clonesFromRect","clonesHidden","multiDragElements","multiDragClones","initialFolding","folding","MultiDragPlugin","MultiDrag","_deselectMultiDrag","_checkKeyDown","_checkKeyUp","selectedClass","multiDragKey","multiDragElement","multiDragKeyDown","isMultiDrag","delayStartGlobal","delayEnded","setupClone","sortableIndex","insertMultiDragClones","showClone","hideClone","_ref5","dragStartGlobal","_ref6","multiDrag","_ref7","removeMultiDragElements","dragOver","_ref8","_ref9","insertMultiDragElements","_ref10","dragRectAbsolute","clonesHiddenBefore","dragOverAnimationCapture","_ref11","dragMatrix","dragOverAnimationComplete","_ref12","originalEvt","multiDragIndex","nullingGlobal","destroyGlobal","select","deselect","oldIndicies","newIndicies","clones","clonesInserted","elementsInserted","hasIntersect","intersect","alt","contain","eager","lazySrc","rootMargin","sizes","srcset","currentSrc","calculatedAspectRatio","normalisedSrc","aspect","__cachedImage","backgroundPosition","init","lazyImg","onLoad","onError","pollForSize","timeout","poll","content","__genPlaceholder","placeholder","appear","modifiers","once","base64","ieee754","typedArraySupport","__proto__","foo","subarray","kMaxLength","TYPED_ARRAY_SUPPORT","RangeError","encodingOrOffset","allocUnsafe","fromArrayBuffer","fromString","assertSize","alloc","isEncoding","actual","fromArrayLike","byteOffset","isBuffer","isnan","SlowBuffer","isView","loweredCase","utf8ToBytes","base64ToBytes","slowToString","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","bidirectionalIndexOf","dir","lastIndexOf","indexSize","arrLength","valLength","buf","readUInt16BE","foundIndex","found","hexWrite","remaining","strLen","utf8Write","blitBuffer","asciiWrite","asciiToBytes","latin1Write","base64Write","ucs2Write","utf16leToBytes","secondByte","thirdByte","fourthByte","tempCodePoint","firstByte","codePoint","bytesPerSequence","decodeCodePointsArray","INSPECT_MAX_BYTES","poolSize","_augment","species","allocUnsafeSlow","_isBuffer","compare","swap16","swap32","swap64","equals","inspect","thisStart","thisEnd","thisCopy","targetCopy","isFinite","MAX_ARGUMENTS_LENGTH","codePoints","fromCharCode","bytes","checkOffset","checkInt","objectWriteUInt16","littleEndian","objectWriteUInt32","checkIEEE754","writeFloat","noAssert","writeDouble","newBuf","sliceLen","readUIntLE","mul","readUIntBE","readUInt8","readUInt16LE","readUInt32LE","readUInt32BE","readIntLE","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUIntLE","maxBytes","writeUIntBE","writeUInt8","writeUInt16LE","writeUInt16BE","writeUInt32LE","writeUInt32BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","INVALID_BASE64_RE","base64clean","stringtrim","units","leadSurrogate","byteArray","hi","lo"],"mappings":"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","file":"js/chunk-2dc6bd11.e232a8fe.js","sourcesContent":["'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(\n uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)\n ))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = \"fb15\");\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ \"01f9\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar LIBRARY = __webpack_require__(\"2d00\");\nvar $export = __webpack_require__(\"5ca1\");\nvar redefine = __webpack_require__(\"2aba\");\nvar hide = __webpack_require__(\"32e9\");\nvar Iterators = __webpack_require__(\"84f2\");\nvar $iterCreate = __webpack_require__(\"41a0\");\nvar setToStringTag = __webpack_require__(\"7f20\");\nvar getPrototypeOf = __webpack_require__(\"38fd\");\nvar ITERATOR = __webpack_require__(\"2b4c\")('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n\n\n/***/ }),\n\n/***/ \"02f4\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(\"4588\");\nvar defined = __webpack_require__(\"be13\");\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n\n\n/***/ }),\n\n/***/ \"0390\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar at = __webpack_require__(\"02f4\")(true);\n\n // `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? at(S, index).length : 1);\n};\n\n\n/***/ }),\n\n/***/ \"0bfb\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = __webpack_require__(\"cb7c\");\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n\n\n/***/ }),\n\n/***/ \"0d58\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = __webpack_require__(\"ce10\");\nvar enumBugKeys = __webpack_require__(\"e11e\");\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n\n\n/***/ }),\n\n/***/ \"1495\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(\"86cc\");\nvar anObject = __webpack_require__(\"cb7c\");\nvar getKeys = __webpack_require__(\"0d58\");\n\nmodule.exports = __webpack_require__(\"9e1e\") ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n\n\n/***/ }),\n\n/***/ \"214f\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n__webpack_require__(\"b0c5\");\nvar redefine = __webpack_require__(\"2aba\");\nvar hide = __webpack_require__(\"32e9\");\nvar fails = __webpack_require__(\"79e5\");\nvar defined = __webpack_require__(\"be13\");\nvar wks = __webpack_require__(\"2b4c\");\nvar regexpExec = __webpack_require__(\"520a\");\n\nvar SPECIES = wks('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$') !== '7';\n});\n\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () {\n // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length === 2 && result[0] === 'a' && result[1] === 'b';\n})();\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n re.exec = function () { execCalled = true; return null; };\n if (KEY === 'split') {\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n }\n re[SYMBOL]('');\n return !execCalled;\n }) : undefined;\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var fns = exec(\n defined,\n SYMBOL,\n ''[KEY],\n function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }\n );\n var strfn = fns[0];\n var rxfn = fns[1];\n\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n\n\n/***/ }),\n\n/***/ \"230e\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(\"d3f4\");\nvar document = __webpack_require__(\"7726\").document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n\n\n/***/ }),\n\n/***/ \"23c6\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = __webpack_require__(\"2d95\");\nvar TAG = __webpack_require__(\"2b4c\")('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n\n\n/***/ }),\n\n/***/ \"2621\":\n/***/ (function(module, exports) {\n\nexports.f = Object.getOwnPropertySymbols;\n\n\n/***/ }),\n\n/***/ \"2aba\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(\"7726\");\nvar hide = __webpack_require__(\"32e9\");\nvar has = __webpack_require__(\"69a8\");\nvar SRC = __webpack_require__(\"ca5a\")('src');\nvar $toString = __webpack_require__(\"fa5b\");\nvar TO_STRING = 'toString';\nvar TPL = ('' + $toString).split(TO_STRING);\n\n__webpack_require__(\"8378\").inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n\n\n/***/ }),\n\n/***/ \"2aeb\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = __webpack_require__(\"cb7c\");\nvar dPs = __webpack_require__(\"1495\");\nvar enumBugKeys = __webpack_require__(\"e11e\");\nvar IE_PROTO = __webpack_require__(\"613b\")('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = __webpack_require__(\"230e\")('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n __webpack_require__(\"fab2\").appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n\n\n/***/ }),\n\n/***/ \"2b4c\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar store = __webpack_require__(\"5537\")('wks');\nvar uid = __webpack_require__(\"ca5a\");\nvar Symbol = __webpack_require__(\"7726\").Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n\n\n/***/ }),\n\n/***/ \"2d00\":\n/***/ (function(module, exports) {\n\nmodule.exports = false;\n\n\n/***/ }),\n\n/***/ \"2d95\":\n/***/ (function(module, exports) {\n\nvar toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n\n\n/***/ }),\n\n/***/ \"2fdb\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n\nvar $export = __webpack_require__(\"5ca1\");\nvar context = __webpack_require__(\"d2c8\");\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * __webpack_require__(\"5147\")(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n\n/***/ }),\n\n/***/ \"32e9\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(\"86cc\");\nvar createDesc = __webpack_require__(\"4630\");\nmodule.exports = __webpack_require__(\"9e1e\") ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n\n\n/***/ }),\n\n/***/ \"38fd\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = __webpack_require__(\"69a8\");\nvar toObject = __webpack_require__(\"4bf8\");\nvar IE_PROTO = __webpack_require__(\"613b\")('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n\n\n/***/ }),\n\n/***/ \"41a0\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar create = __webpack_require__(\"2aeb\");\nvar descriptor = __webpack_require__(\"4630\");\nvar setToStringTag = __webpack_require__(\"7f20\");\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n__webpack_require__(\"32e9\")(IteratorPrototype, __webpack_require__(\"2b4c\")('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n\n\n/***/ }),\n\n/***/ \"456d\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.14 Object.keys(O)\nvar toObject = __webpack_require__(\"4bf8\");\nvar $keys = __webpack_require__(\"0d58\");\n\n__webpack_require__(\"5eda\")('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n\n\n/***/ }),\n\n/***/ \"4588\":\n/***/ (function(module, exports) {\n\n// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n\n\n/***/ }),\n\n/***/ \"4630\":\n/***/ (function(module, exports) {\n\nmodule.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n\n\n/***/ }),\n\n/***/ \"4bf8\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.13 ToObject(argument)\nvar defined = __webpack_require__(\"be13\");\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n\n\n/***/ }),\n\n/***/ \"5147\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar MATCH = __webpack_require__(\"2b4c\")('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n\n\n/***/ }),\n\n/***/ \"520a\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar regexpFlags = __webpack_require__(\"0bfb\");\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar LAST_INDEX = 'lastIndex';\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/,\n re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;\n})();\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];\n\n match = nativeExec.call(re, str);\n\n if (UPDATES_LAST_INDEX_WRONG && match) {\n re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n // eslint-disable-next-line no-loop-func\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n\n\n/***/ }),\n\n/***/ \"52a7\":\n/***/ (function(module, exports) {\n\nexports.f = {}.propertyIsEnumerable;\n\n\n/***/ }),\n\n/***/ \"5537\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar core = __webpack_require__(\"8378\");\nvar global = __webpack_require__(\"7726\");\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: __webpack_require__(\"2d00\") ? 'pure' : 'global',\n copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\n});\n\n\n/***/ }),\n\n/***/ \"5ca1\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(\"7726\");\nvar core = __webpack_require__(\"8378\");\nvar hide = __webpack_require__(\"32e9\");\nvar redefine = __webpack_require__(\"2aba\");\nvar ctx = __webpack_require__(\"9b43\");\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n\n\n/***/ }),\n\n/***/ \"5eda\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// most Object methods by ES6 should accept primitives\nvar $export = __webpack_require__(\"5ca1\");\nvar core = __webpack_require__(\"8378\");\nvar fails = __webpack_require__(\"79e5\");\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n\n\n/***/ }),\n\n/***/ \"5f1b\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar classof = __webpack_require__(\"23c6\");\nvar builtinExec = RegExp.prototype.exec;\n\n // `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw new TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n if (classof(R) !== 'RegExp') {\n throw new TypeError('RegExp#exec called on incompatible receiver');\n }\n return builtinExec.call(R, S);\n};\n\n\n/***/ }),\n\n/***/ \"613b\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar shared = __webpack_require__(\"5537\")('keys');\nvar uid = __webpack_require__(\"ca5a\");\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n\n\n/***/ }),\n\n/***/ \"626a\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = __webpack_require__(\"2d95\");\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n\n\n/***/ }),\n\n/***/ \"6762\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/tc39/Array.prototype.includes\nvar $export = __webpack_require__(\"5ca1\");\nvar $includes = __webpack_require__(\"c366\")(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n__webpack_require__(\"9c6c\")('includes');\n\n\n/***/ }),\n\n/***/ \"6821\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = __webpack_require__(\"626a\");\nvar defined = __webpack_require__(\"be13\");\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n\n\n/***/ }),\n\n/***/ \"69a8\":\n/***/ (function(module, exports) {\n\nvar hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n\n\n/***/ }),\n\n/***/ \"6a99\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_require__(\"d3f4\");\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n\n\n/***/ }),\n\n/***/ \"7333\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 19.1.2.1 Object.assign(target, source, ...)\nvar DESCRIPTORS = __webpack_require__(\"9e1e\");\nvar getKeys = __webpack_require__(\"0d58\");\nvar gOPS = __webpack_require__(\"2621\");\nvar pIE = __webpack_require__(\"52a7\");\nvar toObject = __webpack_require__(\"4bf8\");\nvar IObject = __webpack_require__(\"626a\");\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || __webpack_require__(\"79e5\")(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : $assign;\n\n\n/***/ }),\n\n/***/ \"7726\":\n/***/ (function(module, exports) {\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n\n\n/***/ }),\n\n/***/ \"77f1\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(\"4588\");\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n\n\n/***/ }),\n\n/***/ \"79e5\":\n/***/ (function(module, exports) {\n\nmodule.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n\n\n/***/ }),\n\n/***/ \"7f20\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar def = __webpack_require__(\"86cc\").f;\nvar has = __webpack_require__(\"69a8\");\nvar TAG = __webpack_require__(\"2b4c\")('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n\n\n/***/ }),\n\n/***/ \"8378\":\n/***/ (function(module, exports) {\n\nvar core = module.exports = { version: '2.6.11' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n\n\n/***/ }),\n\n/***/ \"84f2\":\n/***/ (function(module, exports) {\n\nmodule.exports = {};\n\n\n/***/ }),\n\n/***/ \"86cc\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar anObject = __webpack_require__(\"cb7c\");\nvar IE8_DOM_DEFINE = __webpack_require__(\"c69a\");\nvar toPrimitive = __webpack_require__(\"6a99\");\nvar dP = Object.defineProperty;\n\nexports.f = __webpack_require__(\"9e1e\") ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n\n\n/***/ }),\n\n/***/ \"9b43\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// optional / simple context binding\nvar aFunction = __webpack_require__(\"d8e8\");\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n\n\n/***/ }),\n\n/***/ \"9c6c\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = __webpack_require__(\"2b4c\")('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(\"32e9\")(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n\n\n/***/ }),\n\n/***/ \"9def\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.15 ToLength\nvar toInteger = __webpack_require__(\"4588\");\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n\n\n/***/ }),\n\n/***/ \"9e1e\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_require__(\"79e5\")(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n/***/ }),\n\n/***/ \"a352\":\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"sortablejs\");\n\n/***/ }),\n\n/***/ \"a481\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar anObject = __webpack_require__(\"cb7c\");\nvar toObject = __webpack_require__(\"4bf8\");\nvar toLength = __webpack_require__(\"9def\");\nvar toInteger = __webpack_require__(\"4588\");\nvar advanceStringIndex = __webpack_require__(\"0390\");\nvar regExpExec = __webpack_require__(\"5f1b\");\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&`']|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&`']|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\n__webpack_require__(\"214f\")('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n var res = maybeCallNative($replace, regexp, this, replaceValue);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n results.push(result);\n if (!global) break;\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return $replace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n\n\n/***/ }),\n\n/***/ \"aae3\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.2.8 IsRegExp(argument)\nvar isObject = __webpack_require__(\"d3f4\");\nvar cof = __webpack_require__(\"2d95\");\nvar MATCH = __webpack_require__(\"2b4c\")('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n\n\n/***/ }),\n\n/***/ \"ac6a\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $iterators = __webpack_require__(\"cadf\");\nvar getKeys = __webpack_require__(\"0d58\");\nvar redefine = __webpack_require__(\"2aba\");\nvar global = __webpack_require__(\"7726\");\nvar hide = __webpack_require__(\"32e9\");\nvar Iterators = __webpack_require__(\"84f2\");\nvar wks = __webpack_require__(\"2b4c\");\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n\n\n/***/ }),\n\n/***/ \"b0c5\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar regexpExec = __webpack_require__(\"520a\");\n__webpack_require__(\"5ca1\")({\n target: 'RegExp',\n proto: true,\n forced: regexpExec !== /./.exec\n}, {\n exec: regexpExec\n});\n\n\n/***/ }),\n\n/***/ \"be13\":\n/***/ (function(module, exports) {\n\n// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n\n\n/***/ }),\n\n/***/ \"c366\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = __webpack_require__(\"6821\");\nvar toLength = __webpack_require__(\"9def\");\nvar toAbsoluteIndex = __webpack_require__(\"77f1\");\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\n\n/***/ }),\n\n/***/ \"c649\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return insertNodeAt; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return camelize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return console; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return removeNode; });\n/* harmony import */ var core_js_modules_es6_regexp_replace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"a481\");\n/* harmony import */ var core_js_modules_es6_regexp_replace__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_regexp_replace__WEBPACK_IMPORTED_MODULE_0__);\n\n\nfunction getConsole() {\n if (typeof window !== \"undefined\") {\n return window.console;\n }\n\n return global.console;\n}\n\nvar console = getConsole();\n\nfunction cached(fn) {\n var cache = Object.create(null);\n return function cachedFn(str) {\n var hit = cache[str];\n return hit || (cache[str] = fn(str));\n };\n}\n\nvar regex = /-(\\w)/g;\nvar camelize = cached(function (str) {\n return str.replace(regex, function (_, c) {\n return c ? c.toUpperCase() : \"\";\n });\n});\n\nfunction removeNode(node) {\n if (node.parentElement !== null) {\n node.parentElement.removeChild(node);\n }\n}\n\nfunction insertNodeAt(fatherNode, node, position) {\n var refNode = position === 0 ? fatherNode.children[0] : fatherNode.children[position - 1].nextSibling;\n fatherNode.insertBefore(node, refNode);\n}\n\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(\"c8ba\")))\n\n/***/ }),\n\n/***/ \"c69a\":\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = !__webpack_require__(\"9e1e\") && !__webpack_require__(\"79e5\")(function () {\n return Object.defineProperty(__webpack_require__(\"230e\")('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n/***/ }),\n\n/***/ \"c8ba\":\n/***/ (function(module, exports) {\n\nvar g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n/***/ }),\n\n/***/ \"ca5a\":\n/***/ (function(module, exports) {\n\nvar id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n\n\n/***/ }),\n\n/***/ \"cadf\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar addToUnscopables = __webpack_require__(\"9c6c\");\nvar step = __webpack_require__(\"d53b\");\nvar Iterators = __webpack_require__(\"84f2\");\nvar toIObject = __webpack_require__(\"6821\");\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = __webpack_require__(\"01f9\")(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n\n/***/ }),\n\n/***/ \"cb7c\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(\"d3f4\");\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n\n\n/***/ }),\n\n/***/ \"ce10\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar has = __webpack_require__(\"69a8\");\nvar toIObject = __webpack_require__(\"6821\");\nvar arrayIndexOf = __webpack_require__(\"c366\")(false);\nvar IE_PROTO = __webpack_require__(\"613b\")('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n\n\n/***/ }),\n\n/***/ \"d2c8\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = __webpack_require__(\"aae3\");\nvar defined = __webpack_require__(\"be13\");\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n\n\n/***/ }),\n\n/***/ \"d3f4\":\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n\n/***/ }),\n\n/***/ \"d53b\":\n/***/ (function(module, exports) {\n\nmodule.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n\n\n/***/ }),\n\n/***/ \"d8e8\":\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n\n\n/***/ }),\n\n/***/ \"e11e\":\n/***/ (function(module, exports) {\n\n// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n\n\n/***/ }),\n\n/***/ \"f559\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n\nvar $export = __webpack_require__(\"5ca1\");\nvar toLength = __webpack_require__(\"9def\");\nvar context = __webpack_require__(\"d2c8\");\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * __webpack_require__(\"5147\")(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = context(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n\n\n/***/ }),\n\n/***/ \"f6fd\":\n/***/ (function(module, exports) {\n\n// document.currentScript polyfill by Adam Miller\n\n// MIT license\n\n(function(document){\n var currentScript = \"currentScript\",\n scripts = document.getElementsByTagName('script'); // Live NodeList collection\n\n // If browser needs currentScript polyfill, add get currentScript() to the document object\n if (!(currentScript in document)) {\n Object.defineProperty(document, currentScript, {\n get: function(){\n\n // IE 6-10 supports script readyState\n // IE 10+ support stack trace\n try { throw new Error(); }\n catch (err) {\n\n // Find the second match for the \"at\" string to get file src url from stack.\n // Specifically works with the format of stack traces in IE.\n var i, res = ((/.*at [^\\(]*\\((.*):.+:.+\\)$/ig).exec(err.stack) || [false])[1];\n\n // For all scripts on the page, if src matches or if ready state is interactive, return the script tag\n for(i in scripts){\n if(scripts[i].src == res || scripts[i].readyState == \"interactive\"){\n return scripts[i];\n }\n }\n\n // If no match, return null\n return null;\n }\n }\n });\n }\n})(document);\n\n\n/***/ }),\n\n/***/ \"f751\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.3.1 Object.assign(target, source)\nvar $export = __webpack_require__(\"5ca1\");\n\n$export($export.S + $export.F, 'Object', { assign: __webpack_require__(\"7333\") });\n\n\n/***/ }),\n\n/***/ \"fa5b\":\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(\"5537\")('native-function-to-string', Function.toString);\n\n\n/***/ }),\n\n/***/ \"fab2\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar document = __webpack_require__(\"7726\").document;\nmodule.exports = document && document.documentElement;\n\n\n/***/ }),\n\n/***/ \"fb15\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js\n// This file is imported into lib/wc client bundles.\n\nif (typeof window !== 'undefined') {\n if (true) {\n __webpack_require__(\"f6fd\")\n }\n\n var setPublicPath_i\n if ((setPublicPath_i = window.document.currentScript) && (setPublicPath_i = setPublicPath_i.src.match(/(.+\\/)[^/]+\\.js(\\?.*)?$/))) {\n __webpack_require__.p = setPublicPath_i[1] // eslint-disable-line\n }\n}\n\n// Indicate to webpack that this file can be concatenated\n/* harmony default export */ var setPublicPath = (null);\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.object.assign.js\nvar es6_object_assign = __webpack_require__(\"f751\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.string.starts-with.js\nvar es6_string_starts_with = __webpack_require__(\"f559\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom.iterable.js\nvar web_dom_iterable = __webpack_require__(\"ac6a\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.array.iterator.js\nvar es6_array_iterator = __webpack_require__(\"cadf\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.object.keys.js\nvar es6_object_keys = __webpack_require__(\"456d\");\n\n// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js\nfunction _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}\n// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js\n\nfunction _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// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js\n\n\n\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es7.array.includes.js\nvar es7_array_includes = __webpack_require__(\"6762\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.string.includes.js\nvar es6_string_includes = __webpack_require__(\"2fdb\");\n\n// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArray.js\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\n// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js\nfunction _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// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js\n\n\n\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n// EXTERNAL MODULE: external {\"commonjs\":\"sortablejs\",\"commonjs2\":\"sortablejs\",\"amd\":\"sortablejs\",\"root\":\"Sortable\"}\nvar external_commonjs_sortablejs_commonjs2_sortablejs_amd_sortablejs_root_Sortable_ = __webpack_require__(\"a352\");\nvar external_commonjs_sortablejs_commonjs2_sortablejs_amd_sortablejs_root_Sortable_default = /*#__PURE__*/__webpack_require__.n(external_commonjs_sortablejs_commonjs2_sortablejs_amd_sortablejs_root_Sortable_);\n\n// EXTERNAL MODULE: ./src/util/helper.js\nvar helper = __webpack_require__(\"c649\");\n\n// CONCATENATED MODULE: ./src/vuedraggable.js\n\n\n\n\n\n\n\n\n\n\n\n\nfunction buildAttribute(object, propName, value) {\n if (value === undefined) {\n return object;\n }\n\n object = object || {};\n object[propName] = value;\n return object;\n}\n\nfunction computeVmIndex(vnodes, element) {\n return vnodes.map(function (elt) {\n return elt.elm;\n }).indexOf(element);\n}\n\nfunction _computeIndexes(slots, children, isTransition, footerOffset) {\n if (!slots) {\n return [];\n }\n\n var elmFromNodes = slots.map(function (elt) {\n return elt.elm;\n });\n var footerIndex = children.length - footerOffset;\n\n var rawIndexes = _toConsumableArray(children).map(function (elt, idx) {\n return idx >= footerIndex ? elmFromNodes.length : elmFromNodes.indexOf(elt);\n });\n\n return isTransition ? rawIndexes.filter(function (ind) {\n return ind !== -1;\n }) : rawIndexes;\n}\n\nfunction emit(evtName, evtData) {\n var _this = this;\n\n this.$nextTick(function () {\n return _this.$emit(evtName.toLowerCase(), evtData);\n });\n}\n\nfunction delegateAndEmit(evtName) {\n var _this2 = this;\n\n return function (evtData) {\n if (_this2.realList !== null) {\n _this2[\"onDrag\" + evtName](evtData);\n }\n\n emit.call(_this2, evtName, evtData);\n };\n}\n\nfunction isTransitionName(name) {\n return [\"transition-group\", \"TransitionGroup\"].includes(name);\n}\n\nfunction vuedraggable_isTransition(slots) {\n if (!slots || slots.length !== 1) {\n return false;\n }\n\n var _slots = _slicedToArray(slots, 1),\n componentOptions = _slots[0].componentOptions;\n\n if (!componentOptions) {\n return false;\n }\n\n return isTransitionName(componentOptions.tag);\n}\n\nfunction getSlot(slot, scopedSlot, key) {\n return slot[key] || (scopedSlot[key] ? scopedSlot[key]() : undefined);\n}\n\nfunction computeChildrenAndOffsets(children, slot, scopedSlot) {\n var headerOffset = 0;\n var footerOffset = 0;\n var header = getSlot(slot, scopedSlot, \"header\");\n\n if (header) {\n headerOffset = header.length;\n children = children ? [].concat(_toConsumableArray(header), _toConsumableArray(children)) : _toConsumableArray(header);\n }\n\n var footer = getSlot(slot, scopedSlot, \"footer\");\n\n if (footer) {\n footerOffset = footer.length;\n children = children ? [].concat(_toConsumableArray(children), _toConsumableArray(footer)) : _toConsumableArray(footer);\n }\n\n return {\n children: children,\n headerOffset: headerOffset,\n footerOffset: footerOffset\n };\n}\n\nfunction getComponentAttributes($attrs, componentData) {\n var attributes = null;\n\n var update = function update(name, value) {\n attributes = buildAttribute(attributes, name, value);\n };\n\n var attrs = Object.keys($attrs).filter(function (key) {\n return key === \"id\" || key.startsWith(\"data-\");\n }).reduce(function (res, key) {\n res[key] = $attrs[key];\n return res;\n }, {});\n update(\"attrs\", attrs);\n\n if (!componentData) {\n return attributes;\n }\n\n var on = componentData.on,\n props = componentData.props,\n componentDataAttrs = componentData.attrs;\n update(\"on\", on);\n update(\"props\", props);\n Object.assign(attributes.attrs, componentDataAttrs);\n return attributes;\n}\n\nvar eventsListened = [\"Start\", \"Add\", \"Remove\", \"Update\", \"End\"];\nvar eventsToEmit = [\"Choose\", \"Unchoose\", \"Sort\", \"Filter\", \"Clone\"];\nvar readonlyProperties = [\"Move\"].concat(eventsListened, eventsToEmit).map(function (evt) {\n return \"on\" + evt;\n});\nvar draggingElement = null;\nvar props = {\n options: Object,\n list: {\n type: Array,\n required: false,\n default: null\n },\n value: {\n type: Array,\n required: false,\n default: null\n },\n noTransitionOnDrag: {\n type: Boolean,\n default: false\n },\n clone: {\n type: Function,\n default: function _default(original) {\n return original;\n }\n },\n element: {\n type: String,\n default: \"div\"\n },\n tag: {\n type: String,\n default: null\n },\n move: {\n type: Function,\n default: null\n },\n componentData: {\n type: Object,\n required: false,\n default: null\n }\n};\nvar draggableComponent = {\n name: \"draggable\",\n inheritAttrs: false,\n props: props,\n data: function data() {\n return {\n transitionMode: false,\n noneFunctionalComponentMode: false\n };\n },\n render: function render(h) {\n var slots = this.$slots.default;\n this.transitionMode = vuedraggable_isTransition(slots);\n\n var _computeChildrenAndOf = computeChildrenAndOffsets(slots, this.$slots, this.$scopedSlots),\n children = _computeChildrenAndOf.children,\n headerOffset = _computeChildrenAndOf.headerOffset,\n footerOffset = _computeChildrenAndOf.footerOffset;\n\n this.headerOffset = headerOffset;\n this.footerOffset = footerOffset;\n var attributes = getComponentAttributes(this.$attrs, this.componentData);\n return h(this.getTag(), attributes, children);\n },\n created: function created() {\n if (this.list !== null && this.value !== null) {\n helper[\"b\" /* console */].error(\"Value and list props are mutually exclusive! Please set one or another.\");\n }\n\n if (this.element !== \"div\") {\n helper[\"b\" /* console */].warn(\"Element props is deprecated please use tag props instead. See https://github.com/SortableJS/Vue.Draggable/blob/master/documentation/migrate.md#element-props\");\n }\n\n if (this.options !== undefined) {\n helper[\"b\" /* console */].warn(\"Options props is deprecated, add sortable options directly as vue.draggable item, or use v-bind. See https://github.com/SortableJS/Vue.Draggable/blob/master/documentation/migrate.md#options-props\");\n }\n },\n mounted: function mounted() {\n var _this3 = this;\n\n this.noneFunctionalComponentMode = this.getTag().toLowerCase() !== this.$el.nodeName.toLowerCase() && !this.getIsFunctional();\n\n if (this.noneFunctionalComponentMode && this.transitionMode) {\n throw new Error(\"Transition-group inside component is not supported. Please alter tag value or remove transition-group. Current tag value: \".concat(this.getTag()));\n }\n\n var optionsAdded = {};\n eventsListened.forEach(function (elt) {\n optionsAdded[\"on\" + elt] = delegateAndEmit.call(_this3, elt);\n });\n eventsToEmit.forEach(function (elt) {\n optionsAdded[\"on\" + elt] = emit.bind(_this3, elt);\n });\n var attributes = Object.keys(this.$attrs).reduce(function (res, key) {\n res[Object(helper[\"a\" /* camelize */])(key)] = _this3.$attrs[key];\n return res;\n }, {});\n var options = Object.assign({}, this.options, attributes, optionsAdded, {\n onMove: function onMove(evt, originalEvent) {\n return _this3.onDragMove(evt, originalEvent);\n }\n });\n !(\"draggable\" in options) && (options.draggable = \">*\");\n this._sortable = new external_commonjs_sortablejs_commonjs2_sortablejs_amd_sortablejs_root_Sortable_default.a(this.rootContainer, options);\n this.computeIndexes();\n },\n beforeDestroy: function beforeDestroy() {\n if (this._sortable !== undefined) this._sortable.destroy();\n },\n computed: {\n rootContainer: function rootContainer() {\n return this.transitionMode ? this.$el.children[0] : this.$el;\n },\n realList: function realList() {\n return this.list ? this.list : this.value;\n }\n },\n watch: {\n options: {\n handler: function handler(newOptionValue) {\n this.updateOptions(newOptionValue);\n },\n deep: true\n },\n $attrs: {\n handler: function handler(newOptionValue) {\n this.updateOptions(newOptionValue);\n },\n deep: true\n },\n realList: function realList() {\n this.computeIndexes();\n }\n },\n methods: {\n getIsFunctional: function getIsFunctional() {\n var fnOptions = this._vnode.fnOptions;\n return fnOptions && fnOptions.functional;\n },\n getTag: function getTag() {\n return this.tag || this.element;\n },\n updateOptions: function updateOptions(newOptionValue) {\n for (var property in newOptionValue) {\n var value = Object(helper[\"a\" /* camelize */])(property);\n\n if (readonlyProperties.indexOf(value) === -1) {\n this._sortable.option(value, newOptionValue[property]);\n }\n }\n },\n getChildrenNodes: function getChildrenNodes() {\n if (this.noneFunctionalComponentMode) {\n return this.$children[0].$slots.default;\n }\n\n var rawNodes = this.$slots.default;\n return this.transitionMode ? rawNodes[0].child.$slots.default : rawNodes;\n },\n computeIndexes: function computeIndexes() {\n var _this4 = this;\n\n this.$nextTick(function () {\n _this4.visibleIndexes = _computeIndexes(_this4.getChildrenNodes(), _this4.rootContainer.children, _this4.transitionMode, _this4.footerOffset);\n });\n },\n getUnderlyingVm: function getUnderlyingVm(htmlElt) {\n var index = computeVmIndex(this.getChildrenNodes() || [], htmlElt);\n\n if (index === -1) {\n //Edge case during move callback: related element might be\n //an element different from collection\n return null;\n }\n\n var element = this.realList[index];\n return {\n index: index,\n element: element\n };\n },\n getUnderlyingPotencialDraggableComponent: function getUnderlyingPotencialDraggableComponent(_ref) {\n var vue = _ref.__vue__;\n\n if (!vue || !vue.$options || !isTransitionName(vue.$options._componentTag)) {\n if (!(\"realList\" in vue) && vue.$children.length === 1 && \"realList\" in vue.$children[0]) return vue.$children[0];\n return vue;\n }\n\n return vue.$parent;\n },\n emitChanges: function emitChanges(evt) {\n var _this5 = this;\n\n this.$nextTick(function () {\n _this5.$emit(\"change\", evt);\n });\n },\n alterList: function alterList(onList) {\n if (this.list) {\n onList(this.list);\n return;\n }\n\n var newList = _toConsumableArray(this.value);\n\n onList(newList);\n this.$emit(\"input\", newList);\n },\n spliceList: function spliceList() {\n var _arguments = arguments;\n\n var spliceList = function spliceList(list) {\n return list.splice.apply(list, _toConsumableArray(_arguments));\n };\n\n this.alterList(spliceList);\n },\n updatePosition: function updatePosition(oldIndex, newIndex) {\n var updatePosition = function updatePosition(list) {\n return list.splice(newIndex, 0, list.splice(oldIndex, 1)[0]);\n };\n\n this.alterList(updatePosition);\n },\n getRelatedContextFromMoveEvent: function getRelatedContextFromMoveEvent(_ref2) {\n var to = _ref2.to,\n related = _ref2.related;\n var component = this.getUnderlyingPotencialDraggableComponent(to);\n\n if (!component) {\n return {\n component: component\n };\n }\n\n var list = component.realList;\n var context = {\n list: list,\n component: component\n };\n\n if (to !== related && list && component.getUnderlyingVm) {\n var destination = component.getUnderlyingVm(related);\n\n if (destination) {\n return Object.assign(destination, context);\n }\n }\n\n return context;\n },\n getVmIndex: function getVmIndex(domIndex) {\n var indexes = this.visibleIndexes;\n var numberIndexes = indexes.length;\n return domIndex > numberIndexes - 1 ? numberIndexes : indexes[domIndex];\n },\n getComponent: function getComponent() {\n return this.$slots.default[0].componentInstance;\n },\n resetTransitionData: function resetTransitionData(index) {\n if (!this.noTransitionOnDrag || !this.transitionMode) {\n return;\n }\n\n var nodes = this.getChildrenNodes();\n nodes[index].data = null;\n var transitionContainer = this.getComponent();\n transitionContainer.children = [];\n transitionContainer.kept = undefined;\n },\n onDragStart: function onDragStart(evt) {\n this.context = this.getUnderlyingVm(evt.item);\n evt.item._underlying_vm_ = this.clone(this.context.element);\n draggingElement = evt.item;\n },\n onDragAdd: function onDragAdd(evt) {\n var element = evt.item._underlying_vm_;\n\n if (element === undefined) {\n return;\n }\n\n Object(helper[\"d\" /* removeNode */])(evt.item);\n var newIndex = this.getVmIndex(evt.newIndex);\n this.spliceList(newIndex, 0, element);\n this.computeIndexes();\n var added = {\n element: element,\n newIndex: newIndex\n };\n this.emitChanges({\n added: added\n });\n },\n onDragRemove: function onDragRemove(evt) {\n Object(helper[\"c\" /* insertNodeAt */])(this.rootContainer, evt.item, evt.oldIndex);\n\n if (evt.pullMode === \"clone\") {\n Object(helper[\"d\" /* removeNode */])(evt.clone);\n return;\n }\n\n var oldIndex = this.context.index;\n this.spliceList(oldIndex, 1);\n var removed = {\n element: this.context.element,\n oldIndex: oldIndex\n };\n this.resetTransitionData(oldIndex);\n this.emitChanges({\n removed: removed\n });\n },\n onDragUpdate: function onDragUpdate(evt) {\n Object(helper[\"d\" /* removeNode */])(evt.item);\n Object(helper[\"c\" /* insertNodeAt */])(evt.from, evt.item, evt.oldIndex);\n var oldIndex = this.context.index;\n var newIndex = this.getVmIndex(evt.newIndex);\n this.updatePosition(oldIndex, newIndex);\n var moved = {\n element: this.context.element,\n oldIndex: oldIndex,\n newIndex: newIndex\n };\n this.emitChanges({\n moved: moved\n });\n },\n updateProperty: function updateProperty(evt, propertyName) {\n evt.hasOwnProperty(propertyName) && (evt[propertyName] += this.headerOffset);\n },\n computeFutureIndex: function computeFutureIndex(relatedContext, evt) {\n if (!relatedContext.element) {\n return 0;\n }\n\n var domChildren = _toConsumableArray(evt.to.children).filter(function (el) {\n return el.style[\"display\"] !== \"none\";\n });\n\n var currentDOMIndex = domChildren.indexOf(evt.related);\n var currentIndex = relatedContext.component.getVmIndex(currentDOMIndex);\n var draggedInList = domChildren.indexOf(draggingElement) !== -1;\n return draggedInList || !evt.willInsertAfter ? currentIndex : currentIndex + 1;\n },\n onDragMove: function onDragMove(evt, originalEvent) {\n var onMove = this.move;\n\n if (!onMove || !this.realList) {\n return true;\n }\n\n var relatedContext = this.getRelatedContextFromMoveEvent(evt);\n var draggedContext = this.context;\n var futureIndex = this.computeFutureIndex(relatedContext, evt);\n Object.assign(draggedContext, {\n futureIndex: futureIndex\n });\n var sendEvt = Object.assign({}, evt, {\n relatedContext: relatedContext,\n draggedContext: draggedContext\n });\n return onMove(sendEvt, originalEvent);\n },\n onDragEnd: function onDragEnd() {\n this.computeIndexes();\n draggingElement = null;\n }\n }\n};\n\nif (typeof window !== \"undefined\" && \"Vue\" in window) {\n window.Vue.component(\"draggable\", draggableComponent);\n}\n\n/* harmony default export */ var vuedraggable = (draggableComponent);\n// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/entry-lib.js\n\n\n/* harmony default export */ var entry_lib = __webpack_exports__[\"default\"] = (vuedraggable);\n\n\n\n/***/ })\n\n/******/ })[\"default\"];\n//# sourceMappingURL=vuedraggable.common.js.map","import './VResponsive.sass'\n\n// Mixins\nimport Measurable, { NumberOrNumberString } from '../../mixins/measurable'\n\n// Types\nimport { VNode } from 'vue'\n\n// Utils\nimport mixins from '../../util/mixins'\n\n/* @vue/component */\nexport default mixins(Measurable).extend({\n name: 'v-responsive',\n\n props: {\n aspectRatio: [String, Number] as NumberOrNumberString,\n },\n\n computed: {\n computedAspectRatio (): number {\n return Number(this.aspectRatio)\n },\n aspectStyle (): object | undefined {\n return this.computedAspectRatio\n ? { paddingBottom: (1 / this.computedAspectRatio) * 100 + '%' }\n : undefined\n },\n __cachedSizer (): VNode | [] {\n if (!this.aspectStyle) return []\n\n return this.$createElement('div', {\n style: this.aspectStyle,\n staticClass: 'v-responsive__sizer',\n })\n },\n },\n\n methods: {\n genContent (): VNode {\n return this.$createElement('div', {\n staticClass: 'v-responsive__content',\n }, this.$slots.default)\n },\n },\n\n render (h): VNode {\n return h('div', {\n staticClass: 'v-responsive',\n style: this.measurableStyles,\n on: this.$listeners,\n }, [\n this.__cachedSizer,\n this.genContent(),\n ])\n },\n})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"d-flex al-stretch h-100vh bg-body\"},[_c('div',{staticClass:\"d-flex flex-column aside\"},[_c('div',{staticClass:\"d-flex flex-column ai-center top\"},[_c('div',{staticClass:\"d-flex flex-column ai-center menu-icon\",on:{\"click\":function($event){return _vm.link('design/envs')}}},[_c('img',{attrs:{\"src\":\"/assets/ic/backstage/info/ic_backstage_info_back.png\",\"alt\":\"back\"}}),_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.back\"))+\" \")])]),_c('div',{staticClass:\"d-flex flex-column ai-center menu-icon\",on:{\"click\":function($event){return _vm.link('')}}},[_c('img',{attrs:{\"src\":\"/assets/ic/backstage/info/ic_backstage_info_home.png\",\"alt\":\"back\"}}),_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.index\"))+\" \")])])]),_c('div',{staticClass:\"d-flex flex-column flex-1 ai-center bottom jc-around\"},_vm._l((_vm.asideMenu),function(menu,idx){return _c('div',{key:menu.name + idx,staticClass:\"d-flex flex-column ai-center menu-icon\",class:{ active: _vm.selectedMenu.name === menu.name },on:{\"click\":function($event){return _vm.selectMenu(menu)}}},[_c('img',{attrs:{\"src\":menu.icon,\"alt\":\"back\"}}),_c('span',[_vm._v(\" \"+_vm._s(menu.displayName)+\" \")])])}),0)]),_c('div',{staticClass:\"d-flex flex-column left-drawer\"},[_c('div',{staticClass:\"d-flex jc-center ai-center header\"},[_c('img',{attrs:{\"src\":_vm.selectedMenu.icon,\"alt\":\"menu\"}}),_c('span',[_vm._v(\" \"+_vm._s(_vm.selectedMenu.displayName)+\" \")])]),_c('div',{staticClass:\"d-flex\"},[(_vm.selectedMenu.name === 'tag')?_c('div',{staticClass:\"d-flex flex-column flex-1 align-center px-2\"},[(_vm.loadingLabelSize)?_c('v-skeleton-loader',{staticClass:\"al-stretch\",staticStyle:{\"margin-top\":\"1rem\"},attrs:{\"type\":\"list-item\"}}):_c('v-list',{staticClass:\"al-stretch\",staticStyle:{\"margin-top\":\"1rem\"}},_vm._l((_vm.labelSizes),function(labelSize,idx){return _c('v-list-group',{key:'labelSizeList' + idx,scopedSlots:_vm._u([{key:\"activator\",fn:function(){return [_c('v-list-item-title',[_vm._v(\" \"+_vm._s(labelSize.displayName)+\" \")])]},proxy:true}],null,true)},_vm._l((labelSize.tags),function(tag){return _c('v-list-item',{key:'tag' + tag.tagId,on:{\"click\":function($event){return _vm.selectTag(labelSize, tag)}}},[_c('v-list-item-avatar',[(tag.pdfPath)?_c('v-btn',{attrs:{\"icon\":\"\"},on:{\"click\":function($event){return _vm.openPdf($event, tag.pdfPath)}}},[_c('v-img',{attrs:{\"max-width\":\"18\",\"contain\":\"\",\"src\":\"/assets/PDF-file.png\"}})],1):_vm._e()],1),_c('v-list-item-content',[_c('v-list-item-title',{domProps:{\"textContent\":_vm._s(tag.name)}})],1)],1)}),1)}),1)],1):_vm._e(),(_vm.selectedMenu.name === 'graphic')?_c('div',{staticClass:\"d-flex flex-column flex-1 ai-center\"},[_c('div',{staticClass:\"function-block d-flex flex-column\"},[_c('span',{staticClass:\"title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.graphic\"))+\" \")]),_c('div',{staticClass:\"d-flex flex-wrap ai-center\"},[_c('div',{staticClass:\"graphic\",class:{ active: _vm.drawing === 'circlefill' },on:{\"click\":function($event){return _vm.addCircle(true)}}},[_c('div',{staticClass:\"circle fill\"})]),_c('div',{staticClass:\"graphic\",class:{ active: _vm.drawing === 'rectfill' },on:{\"click\":function($event){return _vm.addRect(true)}}},[_c('div',{staticClass:\"rect fill\"})]),_c('div',{staticClass:\"graphic\",class:{ active: _vm.drawing === 'line' },on:{\"click\":_vm.addLine}},[_c('div',{staticClass:\"line\"})]),_c('div',{staticClass:\"graphic\",class:{ active: _vm.drawing === 'circle' },on:{\"click\":function($event){return _vm.addCircle(false)}}},[_c('div',{staticClass:\"circle\"})]),_c('div',{staticClass:\"graphic\",class:{ active: _vm.drawing === 'rect' },on:{\"click\":function($event){return _vm.addRect(false)}}},[_c('div',{staticClass:\"rect\"})])])]),_c('div',{staticClass:\"function-block d-flex flex-column\"},[_c('span',{staticClass:\"title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.color\"))+\" \")]),_c('div',{staticClass:\"d-flex jc-around\"},_vm._l((_vm.colors.slice(0, 2)),function(color){return _c('div',{key:color,staticClass:\"color-block\",class:{ active: color === _vm.graphicColor },style:('background-color: ' + color),on:{\"click\":function($event){return _vm.setGraphicColor(color)}}})}),0)])]):_vm._e(),(_vm.selectedMenu.name === 'text')?_c('div',{staticClass:\"d-flex flex-column flex-1 ai-center\"},[_c('div',{staticClass:\"function-block d-flex flex-column\"},[_c('span',{staticClass:\"title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.importText\"))+\" \")]),_c('span',{staticClass:\"mb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.importTextText\"))+\" \")]),_c('div',[_c('v-btn',{attrs:{\"depressed\":\"\",\"outlined\":\"\",\"color\":\"#ffa20a\",\"max-height\":\"1.5rem\"},on:{\"click\":_vm.addIText}},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.addText\"))+\" \")])],1)]),_c('div',{staticClass:\"function-block d-flex flex-column\"},[_c('span',{staticClass:\"title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.source\"))+\" \")]),_c('v-autocomplete',{staticClass:\"custom-select my-2\",attrs:{\"items\":_vm.previewData.headers,\"no-data-text\":_vm.$t('design.noDataText'),\"dense\":\"\",\"clearable\":\"\",\"filled\":\"\"},model:{value:(_vm.textSource),callback:function ($$v) {_vm.textSource=$$v},expression:\"textSource\"}})],1),_c('div',{staticClass:\"function-block d-flex flex-column\"},[_c('span',{staticClass:\"title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.fontFamilyAndSize\"))+\" \")]),_c('span',{staticClass:\"mb-2\"},[_vm._v(_vm._s(_vm.$t(\"design.fontFamily\")))]),_c('v-autocomplete',{staticClass:\"custom-select mb-4\",attrs:{\"items\":_vm.fontFamilies,\"no-data-text\":_vm.$t('design.noDataText'),\"dense\":\"\",\"filled\":\"\"},model:{value:(_vm.fontFamily),callback:function ($$v) {_vm.fontFamily=$$v},expression:\"fontFamily\"}}),_c('div',{staticClass:\"d-flex jc-between ai-center size-input\"},[_c('span',[_vm._v(_vm._s(_vm.$t(\"design.fontSize\")))]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.fontSize),expression:\"fontSize\"}],attrs:{\"type\":\"number\"},domProps:{\"value\":(_vm.fontSize)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.fontSize=$event.target.value}}})]),_c('v-slider',{attrs:{\"min\":\"1\",\"thumb-color\":\"#d8d8d8\",\"track-color\":\"#d8d8d8a0\",\"track-fill-color\":\"#d8d8d8\",\"max\":\"100\"},on:{\"end\":function($event){return _vm.canvas.trigger('object:modified')}},model:{value:(_vm.fontSize),callback:function ($$v) {_vm.fontSize=$$v},expression:\"fontSize\"}})],1),_c('div',{staticClass:\"function-block d-flex flex-column\"},[_c('span',{staticClass:\"title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.alignAndFontStyle\"))+\" \")]),_c('div',{staticClass:\"d-flex justify-space-around my-1 px-2\"},[_c('span',{staticClass:\"icon-btn\",on:{\"click\":function($event){_vm.textAlign = 'left'}}},[(_vm.textAlign === 'left')?_c('img',{attrs:{\"src\":\"/assets/ic/backstage/tool/ic_backstage_tool_align_left_selected.png\",\"alt\":\"text align left\"}}):_c('img',{attrs:{\"src\":\"/assets/ic/backstage/tool/ic_backstage_tool_align_left.png\",\"alt\":\"text align left\"}})]),_c('span',{staticClass:\"icon-btn\",on:{\"click\":function($event){_vm.textAlign = 'center'}}},[(_vm.textAlign === 'center')?_c('img',{attrs:{\"src\":\"/assets/ic/backstage/tool/ic_backstage_tool_align_center_selected.png\",\"alt\":\"text align center\"}}):_c('img',{attrs:{\"src\":\"/assets/ic/backstage/tool/ic_backstage_tool_align_center.png\",\"alt\":\"text align center\"}})]),_c('span',{staticClass:\"icon-btn\",on:{\"click\":function($event){_vm.textAlign = 'right'}}},[(_vm.textAlign === 'right')?_c('img',{attrs:{\"src\":\"/assets/ic/backstage/tool/ic_backstage_tool_align_right_selected.png\",\"alt\":\"text align right selected\"}}):_c('img',{attrs:{\"src\":\"/assets/ic/backstage/tool/ic_backstage_tool_align_right.png\",\"alt\":\"text align right\"}})])]),_c('div',{staticClass:\"d-flex justify-space-around my-1 px-2 mt-3\"},[_c('span',{staticClass:\"icon-btn\",on:{\"click\":function($event){_vm.italic = _vm.italic === 'italic' ? 'normal' : 'italic'}}},[(_vm.italic === 'italic')?_c('img',{attrs:{\"src\":\"/assets/ic/backstage/tool/ic_backstage_tool_slash_selected.png\",\"alt\":\"text slash\"}}):_c('img',{attrs:{\"src\":\"/assets/ic/backstage/tool/ic_backstage_tool_slash.png\",\"alt\":\"text slash\"}})]),_c('span',{staticClass:\"icon-btn\",on:{\"click\":function($event){_vm.fontWeight = _vm.fontWeight === 'bold' ? 'normal' : 'bold'}}},[(_vm.fontWeight === 'bold')?_c('img',{attrs:{\"src\":\"/assets/ic/backstage/tool/ic_backstage_tool_bold_selected.png\",\"alt\":\"text bold\"}}):_c('img',{attrs:{\"src\":\"/assets/ic/backstage/tool/ic_backstage_tool_bold.png\",\"alt\":\"text bold\"}})]),_c('span',{staticClass:\"icon-btn\",on:{\"click\":function($event){_vm.underline = !_vm.underline}}},[(_vm.underline)?_c('img',{attrs:{\"src\":\"/assets/ic/backstage/tool/ic_backstage_tool_underline_selected.png\",\"alt\":\"text underline\"}}):_c('img',{attrs:{\"src\":\"/assets/ic/backstage/tool/ic_backstage_tool_underline.png\",\"alt\":\"text underline\"}})])])]),_c('div',{staticClass:\"function-block d-flex flex-column\"},[_c('span',{staticClass:\"title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.color\"))+\" \")]),_c('div',{staticClass:\"d-flex jc-between\"},_vm._l((_vm.colors),function(color){return _c('div',{key:color,staticClass:\"color-block\",class:{ active: color === _vm.fontColor },style:('background-color: ' + color),on:{\"click\":function($event){_vm.fontColor = color}}})}),0)])]):_vm._e(),(_vm.selectedMenu.name === 'img')?_c('div',{staticClass:\"d-flex flex-column flex-1 ai-center\"},[_c('div',{staticClass:\"function-block d-flex flex-column\"},[_c('span',{staticClass:\"title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.importImage\"))+\" \")]),_c('span',{staticClass:\"mb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.importImageText\"))+\" \")]),_c('div',{staticClass:\"file-upload d-flex\"},[_c('label',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"btn btn-orange\",attrs:{\"for\":\"file-input\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.import\"))+\" \")]),_c('input',{ref:\"pathClear\",attrs:{\"id\":\"file-input\",\"type\":\"file\"},on:{\"change\":_vm.uploadImage}})])])]):_vm._e(),(_vm.selectedMenu.name === 'barcode')?_c('div',{staticClass:\"d-flex flex-column flex-1 ai-center\"},[_c('div',{staticClass:\"function-block d-flex flex-column\"},[_c('span',{staticClass:\"title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.importBarcode\"))+\" \")]),_c('span',{staticClass:\"mb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.importBarcodeText\"))+\" \")]),_c('div',[_c('v-btn',{attrs:{\"depressed\":\"\",\"outlined\":\"\",\"color\":\"#ffa20a\",\"max-height\":\"1.5rem\",\"disabled\":!_vm.barcodeSource || _vm.settingDisabled('barcode')},on:{\"click\":function($event){return _vm.addBarcode('barcode')}}},[(!_vm.orderItem.excel)?_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.plsImportExcel\"))+\" \")]):(!_vm.barcodeSource)?_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.plsSelectSource\"))+\" \")]):_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.addBarcode\"))+\" \")])])],1)]),_c('div',{staticClass:\"function-block d-flex flex-column\"},[_c('span',{staticClass:\"title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.source\"))+\" \")]),_c('v-autocomplete',{staticClass:\"custom-select my-2 mb-3\",attrs:{\"items\":_vm.previewData.headers,\"no-data-text\":_vm.$t('design.noDataText'),\"disabled\":_vm.settingDisabled('barcode'),\"dense\":\"\",\"filled\":\"\"},model:{value:(_vm.barcodeSource),callback:function ($$v) {_vm.barcodeSource=$$v},expression:\"barcodeSource\"}})],1),_c('div',{staticClass:\"function-block d-flex flex-column\"},[_c('span',{staticClass:\"title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.attribute\"))+\" \")]),_c('div',{staticClass:\"d-flex flex-column attr-block\"},_vm._l((_vm.barcodes),function(type,idx){return _c('div',{key:'1d' + idx,staticClass:\"d-flex ai-center attr\",on:{\"click\":function($event){_vm.barcodeTypeId = type.barcodeTypeId}}},[_c('span',{staticClass:\"index\"},[_vm._v(_vm._s(idx + 1))]),_c('span',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"custom-radio flex-1\",class:{\n active:\n _vm.barcodeTypeId === type.barcodeTypeId &&\n !_vm.settingDisabled('barcode'),\n disabled: _vm.settingDisabled('barcode')\n }},[_vm._v(\" \"+_vm._s(type.name)+\" \")])])}),0)]),_c('div',{staticClass:\"function-block d-flex flex-column\"},[_c('span',{staticClass:\"title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.others\"))+\" \")]),_c('div',{staticClass:\"d-flex jc-between\"},[_c('div',{staticClass:\"d-flex flex-column\"},[_c('span',{staticClass:\"mb-2\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.isBarcodeContentDisplay\"))+\" \")]),_c('div',{staticClass:\"d-flex jc-between ai-center mb-4\"},[_c('span',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"flex-1 mr-2 custom-radio ta-center\",class:{\n active:\n _vm.displayBarcodeContent && !_vm.settingDisabled('barcode'),\n disabled: _vm.settingDisabled('barcode')\n },on:{\"click\":function($event){_vm.displayBarcodeContent = true}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.yes\"))+\" \")]),_c('span',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"flex-1 custom-radio ta-center\",class:{\n active:\n !_vm.displayBarcodeContent && !_vm.settingDisabled('barcode'),\n disabled: _vm.settingDisabled('barcode')\n },on:{\"click\":function($event){_vm.displayBarcodeContent = false}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.no\"))+\" \")])]),_c('span',{staticClass:\"mb-2\"},[_vm._v(_vm._s(_vm.$t(\"design.isTopOfBarcode\")))]),_c('div',{staticClass:\"d-flex jc-between ai-center mb-4\"},[_c('span',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"flex-1 mr-2 custom-radio ta-center\",class:{\n active:\n _vm.topOfBarcode &&\n _vm.displayBarcodeContent &&\n !_vm.settingDisabled('barcode'),\n disabled: _vm.settingDisabled('barcode')\n },on:{\"click\":function($event){_vm.topOfBarcode = true}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.top\"))+\" \")]),_c('span',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"flex-1 custom-radio ta-center\",class:{\n active:\n !_vm.topOfBarcode &&\n _vm.displayBarcodeContent &&\n !_vm.settingDisabled('barcode'),\n disabled: _vm.settingDisabled('barcode')\n },on:{\"click\":function($event){_vm.topOfBarcode = false}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.bottom\"))+\" \")])])]),_vm._m(0)])])]):_vm._e(),(_vm.selectedMenu.name === 'qrcode')?_c('div',{staticClass:\"d-flex flex-column flex-1 ai-center\"},[_c('div',{staticClass:\"function-block d-flex flex-column\"},[_c('span',{staticClass:\"title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.importBarcode\"))+\" \")]),_c('span',{staticClass:\"mb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.importQRcodeText\"))+\" \")]),_c('div',[_c('v-btn',{attrs:{\"depressed\":\"\",\"outlined\":\"\",\"color\":\"#ffa20a\",\"max-height\":\"1.5rem\",\"disabled\":!_vm.qrcodeSource || _vm.settingDisabled('qrcode')},on:{\"click\":function($event){return _vm.addBarcode('qrcode')}}},[(!_vm.orderItem.excel)?_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.plsImportExcel\"))+\" \")]):(!_vm.qrcodeSource)?_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.plsSelectSource\"))+\" \")]):_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.addQRcode\"))+\" \")])])],1)]),_c('div',{staticClass:\"function-block d-flex flex-column\"},[_c('span',{staticClass:\"title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.source\"))+\" \")]),_c('v-autocomplete',{staticClass:\"custom-select my-2 mb-3\",attrs:{\"items\":_vm.previewData.headers,\"no-data-text\":_vm.$t('design.noDataText'),\"disabled\":_vm.settingDisabled('qrcode'),\"dense\":\"\",\"filled\":\"\"},model:{value:(_vm.qrcodeSource),callback:function ($$v) {_vm.qrcodeSource=$$v},expression:\"qrcodeSource\"}})],1),_c('div',{staticClass:\"function-block d-flex flex-column\"},[_c('span',{staticClass:\"title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.attribute\"))+\" \")]),_c('div',{staticClass:\"d-flex flex-column attr-block\"},_vm._l((_vm.qrcodes),function(type,idx){return _c('div',{key:'2d' + idx,staticClass:\"d-flex ai-center attr\",on:{\"click\":function($event){_vm.qrcodeTypeId = type.barcodeTypeId}}},[_c('span',{staticClass:\"index\"},[_vm._v(_vm._s(idx + 1))]),_c('span',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"custom-radio flex-1\",class:{\n active:\n _vm.qrcodeTypeId === type.barcodeTypeId &&\n !_vm.settingDisabled('qrcode'),\n disabled: _vm.settingDisabled('qrcode')\n }},[_vm._v(\" \"+_vm._s(type.name)+\" \")])])}),0)])]):_vm._e(),(_vm.selectedMenu.name === 'rfid')?_c('div',{staticClass:\"d-flex flex-column flex-1 ai-center\"},[_c('div',{staticClass:\"function-block d-flex flex-column\"},[_c('span',{staticClass:\"title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.importRFID\"))+\" \")]),_c('span',{staticClass:\"mb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.importRFIDText\"))+\" \")]),_c('div',[_c('v-btn',{attrs:{\"depressed\":\"\",\"outlined\":\"\",\"color\":\"#ffa20a\",\"max-height\":\"1.5rem\",\"disabled\":_vm.canvas.getObjectById('rfid') !== null},on:{\"click\":_vm.addRfid}},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.addRFID\"))+\" \")])],1)]),_c('div',{staticClass:\"function-block d-flex flex-column\"},[_c('span',{staticClass:\"title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.encodeAddress\"))+\" \")]),_c('span',{staticClass:\"d-flex jc-between subtitle\"},[_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.functionBlockName\"))+\" \")]),_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.lock\"))+\" \")])]),_c('span',{staticClass:\"d-flex jc-between mt-2\"},[_c('span',[_vm._v(\"EPC:\")]),_c('v-checkbox',{staticClass:\"custom-checkbox ma-0 pa-0\",attrs:{\"disabled\":!_vm.selected || _vm.selected.id !== 'rfid',\"dense\":\"\"},model:{value:(_vm.rfidData.epc.lock),callback:function ($$v) {_vm.$set(_vm.rfidData.epc, \"lock\", $$v)},expression:\"rfidData.epc.lock\"}})],1),_c('v-autocomplete',{staticClass:\"custom-select mt-1 mb-3\",attrs:{\"items\":_vm.previewData.headers,\"no-data-text\":_vm.$t('design.noDataText'),\"disabled\":!_vm.selected || _vm.selected.id !== 'rfid',\"dense\":\"\",\"filled\":\"\"},model:{value:(_vm.rfidData.epc.source),callback:function ($$v) {_vm.$set(_vm.rfidData.epc, \"source\", $$v)},expression:\"rfidData.epc.source\"}}),_c('span',{staticClass:\"d-flex jc-between mt-1\"},[_c('span',[_vm._v(\"USER:\")]),_c('v-checkbox',{staticClass:\"custom-checkbox ma-0 pa-0\",attrs:{\"disabled\":!_vm.selected || _vm.selected.id !== 'rfid',\"dense\":\"\"},model:{value:(_vm.rfidData.user.lock),callback:function ($$v) {_vm.$set(_vm.rfidData.user, \"lock\", $$v)},expression:\"rfidData.user.lock\"}})],1),_c('v-autocomplete',{staticClass:\"custom-select mt-1 mb-3\",attrs:{\"items\":_vm.previewData.headers,\"no-data-text\":_vm.$t('design.noDataText'),\"disabled\":!_vm.selected || _vm.selected.id !== 'rfid',\"clearable\":\"\",\"dense\":\"\",\"filled\":\"\"},model:{value:(_vm.rfidData.user.source),callback:function ($$v) {_vm.$set(_vm.rfidData.user, \"source\", $$v)},expression:\"rfidData.user.source\"}})],1),_c('div',{staticClass:\"function-block d-flex flex-column\"},[_c('span',{staticClass:\"title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.attribute\"))+\" \")]),_c('span',{staticClass:\"d-flex jc-between subtitle\"},[_c('span',{staticClass:\"d-flex\"},[_c('span',{staticClass:\"mr-1\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.attributeEnable\"))+\" \")]),_c('v-switch',{staticClass:\"custom-checkbox ma-0 pa-0\",attrs:{\"disabled\":!_vm.selected || _vm.selected.id !== 'rfid',\"dense\":\"\"},model:{value:(_vm.rfidData.defaultAttr),callback:function ($$v) {_vm.$set(_vm.rfidData, \"defaultAttr\", $$v)},expression:\"rfidData.defaultAttr\"}})],1),_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.rfidAttrText\"))+\" \")])]),_c('span',{staticClass:\"d-flex jc-between mt-4 subtitle\"},[_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.functionBlockName\"))+\" \")]),_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.lock\"))+\" \")])]),_c('span',{staticClass:\"d-flex jc-between mt-1\"},[_c('span',[_vm._v(\"Access:\")]),_c('v-checkbox',{staticClass:\"custom-checkbox ma-0 pa-0\",attrs:{\"dense\":\"\",\"disabled\":!_vm.selected || !_vm.rfidData.defaultAttr || _vm.selected.id !== 'rfid'},model:{value:(_vm.rfidData.access.lock),callback:function ($$v) {_vm.$set(_vm.rfidData.access, \"lock\", $$v)},expression:\"rfidData.access.lock\"}})],1),_c('v-autocomplete',{staticClass:\"custom-select mt-1 mb-3\",attrs:{\"items\":_vm.previewData.headers,\"no-data-text\":_vm.$t('design.noDataText'),\"clearable\":\"\",\"dense\":\"\",\"filled\":\"\",\"disabled\":!_vm.selected || !_vm.rfidData.defaultAttr || _vm.selected.id !== 'rfid'},model:{value:(_vm.rfidData.access.source),callback:function ($$v) {_vm.$set(_vm.rfidData.access, \"source\", $$v)},expression:\"rfidData.access.source\"}}),_c('span',{staticClass:\"d-flex jc-between mt-1\"},[_c('span',[_vm._v(\"Kill:\")]),_c('v-checkbox',{staticClass:\"custom-checkbox ma-0 pa-0\",attrs:{\"dense\":\"\",\"disabled\":!_vm.selected || !_vm.rfidData.defaultAttr || _vm.selected.id !== 'rfid'},model:{value:(_vm.rfidData.kill.lock),callback:function ($$v) {_vm.$set(_vm.rfidData.kill, \"lock\", $$v)},expression:\"rfidData.kill.lock\"}})],1),_c('v-autocomplete',{staticClass:\"custom-select mt-1 mb-3\",attrs:{\"items\":_vm.previewData.headers,\"no-data-text\":_vm.$t('design.noDataText'),\"clearable\":\"\",\"dense\":\"\",\"filled\":\"\",\"disabled\":!_vm.selected || !_vm.rfidData.defaultAttr || _vm.selected.id !== 'rfid'},model:{value:(_vm.rfidData.kill.source),callback:function ($$v) {_vm.$set(_vm.rfidData.kill, \"source\", $$v)},expression:\"rfidData.kill.source\"}})],1)]):_vm._e()])]),_c('div',{ref:\"canvasDiv\",staticClass:\"flex-1 p-relative\",staticStyle:{\"overflow\":\"hidden\"},attrs:{\"tabindex\":\"0\"},on:{\"keydown\":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"delete\",[8,46],$event.key,[\"Backspace\",\"Delete\",\"Del\"])){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }return _vm.delObject($event)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"left\",37,$event.key,[\"Left\",\"ArrowLeft\"])){ return null; }if('button' in $event && $event.button !== 0){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }return _vm.moveObject('left', -1)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"up\",38,$event.key,[\"Up\",\"ArrowUp\"])){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }return _vm.moveObject('top', -1)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"right\",39,$event.key,[\"Right\",\"ArrowRight\"])){ return null; }if('button' in $event && $event.button !== 2){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }return _vm.moveObject('left', 1)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"down\",40,$event.key,[\"Down\",\"ArrowDown\"])){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }return _vm.moveObject('top', 1)},function($event){if(!$event.type.indexOf('key')&&$event.keyCode!==67){ return null; }if(!$event.ctrlKey){ return null; }if($event.shiftKey||$event.altKey||$event.metaKey){ return null; }return _vm.copy($event)},function($event){if(!$event.type.indexOf('key')&&$event.keyCode!==86){ return null; }if(!$event.ctrlKey){ return null; }if($event.shiftKey||$event.altKey||$event.metaKey){ return null; }return _vm.paste($event)},function($event){if(!$event.type.indexOf('key')&&$event.keyCode!==90){ return null; }if(!$event.ctrlKey){ return null; }if($event.shiftKey||$event.altKey||$event.metaKey){ return null; }return _vm.undo($event)},function($event){if(!$event.type.indexOf('key')&&$event.keyCode!==89){ return null; }if(!$event.ctrlKey){ return null; }if($event.shiftKey||$event.altKey||$event.metaKey){ return null; }return _vm.redo($event)},function($event){if(!$event.type.indexOf('key')&&$event.keyCode!==90){ return null; }if(!$event.ctrlKey){ return null; }if(!$event.shiftKey){ return null; }if($event.altKey||$event.metaKey){ return null; }return _vm.redo($event)}]}},[_c('canvas',{ref:\"can\"}),_c('div',{staticClass:\"d-flex flex-column p-absolute t-0 l-0\"},[_c('canvas',{ref:\"gridY\"}),_c('canvas',{ref:\"gridX\"})]),_c('div',{staticClass:\"zoom d-flex ai-center\"},[_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"btn\",on:{\"click\":function($event){return _vm.setZoom(-0.1)}}},[_c('v-icon',[_vm._v(\"mdi-minus\")])],1),_c('div',{staticClass:\"percent d-flex ai-center\"},[_c('span',[_vm._v(_vm._s(_vm.getZoom))]),_c('img',{attrs:{\"src\":\"/assets/ic/backstage/status/ic_backstage_status_zoomout_magnifier.png\",\"alt\":\"zoom\"}})]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"btn\",on:{\"click\":function($event){return _vm.setZoom(0.1)}}},[_c('v-icon',[_vm._v(\"mdi-plus\")])],1)]),_c('div',{staticClass:\"toolbar\"},[_c('div',{staticClass:\"d-flex flex-row-reverse flex-1 ai-center toolbar-inner\"},[_c('div',{staticClass:\"d-flex\",staticStyle:{\"font-size\":\"0.85rem\"}},[_c('v-btn',{attrs:{\"color\":\"#2f2f2f\",\"depressed\":\"\",\"min-width\":\"4.7rem\",\"max-height\":\"1.5rem\"},on:{\"click\":_vm.close}},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.close\"))+\" \")]),_c('v-btn',{attrs:{\"color\":\"primary\",\"depressed\":\"\",\"min-width\":\"4.7rem\",\"max-height\":\"1.5rem\"},on:{\"click\":_vm.save}},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.save\"))+\" \")])],1),_c('div',{staticClass:\"d-flex mr-8\"},[_c('v-btn',{staticClass:\"toolbar-function\",attrs:{\"text\":\"\"},on:{\"click\":_vm.copy}},[_c('img',{attrs:{\"src\":\"/assets/ic/backstage/status/ic_backstage_status_copy.png\",\"alt\":\"copy\"}}),_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.copy\"))+\" \")])]),_c('v-btn',{staticClass:\"toolbar-function\",attrs:{\"text\":\"\"},on:{\"click\":_vm.paste}},[_c('img',{attrs:{\"src\":\"/assets/ic/backstage/status/ic_backstage_status_paste.png\",\"alt\":\"paste\"}}),_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.paste\"))+\" \")])]),_c('v-btn',{staticClass:\"toolbar-function\",attrs:{\"text\":\"\"},on:{\"click\":_vm.undo}},[_c('img',{attrs:{\"src\":\"/assets/ic/backstage/status/ic_backstage_status_undo.png\",\"alt\":\"undo\"}}),_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.undo\"))+\" \")])]),_c('v-btn',{staticClass:\"toolbar-function\",attrs:{\"text\":\"\"},on:{\"click\":_vm.redo}},[_c('img',{attrs:{\"src\":\"/assets/ic/backstage/status/ic_backstage_status_redo.png\",\"alt\":\"redo\"}}),_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.redo\"))+\" \")])])],1)])])]),_c('div',{staticClass:\"d-flex flex-column right-drawer\"},[_c('div',{staticClass:\"d-flex jc-center ai-center header\"},[_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.imageLayer\"))+\" \")])]),_c('div',{staticClass:\"d-flex flex-column size-block\"},[_c('div',{staticClass:\"d-flex jc-between\"},[_c('div',{staticClass:\"d-flex flex-1 mr size-input\"},[_c('input',{staticClass:\"flex-1\",attrs:{\"type\":\"number\",\"disabled\":\"\"},domProps:{\"value\":_vm.getObjValue('left')},on:{\"input\":function($event){return _vm.setObjValue($event, 'left')}}}),_c('span',{staticClass:\"append\"},[_vm._v(\"X\")])]),_c('div',{staticClass:\"d-flex flex-1 size-input\"},[_c('input',{staticClass:\"flex-1\",attrs:{\"type\":\"number\",\"disabled\":\"\"},domProps:{\"value\":_vm.getObjValue('top')},on:{\"input\":function($event){return _vm.setObjValue($event, 'top')}}}),_c('span',{staticClass:\"append\"},[_vm._v(\"Y\")])])]),_c('div',{staticClass:\"d-flex jc-between\"},[_c('div',{staticClass:\"d-flex flex-1 mr size-input\"},[_c('input',{staticClass:\"flex-1\",attrs:{\"type\":\"number\",\"disabled\":\"\"},domProps:{\"value\":_vm.getObjValue('width')},on:{\"input\":function($event){return _vm.setObjValue($event, 'width')}}}),_c('span',{staticClass:\"append W\"},[_vm._v(\"W\")])]),_c('div',{staticClass:\"d-flex flex-1 size-input\"},[_c('input',{staticClass:\"flex-1\",attrs:{\"type\":\"number\",\"disabled\":\"\"},domProps:{\"value\":_vm.getObjValue('height')},on:{\"input\":function($event){return _vm.setObjValue($event, 'height')}}}),_c('span',{staticClass:\"append\"},[_vm._v(\"H\")])])]),_c('div',{staticClass:\"d-flex jc-between\"},[_c('div',{staticClass:\"d-flex flex-1 mr size-input\"},[_c('input',{staticClass:\"flex-1\",attrs:{\"type\":\"number\",\"disabled\":\"\"},domProps:{\"value\":_vm.getObjValue('angle')},on:{\"input\":function($event){return _vm.setObjValue($event, 'rotate')}}}),_c('span',{staticClass:\"append o\"})]),_c('div',{staticClass:\"d-flex jc-between flex-1 flip\"},[_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"btn d-flex ai-center jc-center\",on:{\"click\":function($event){return _vm.setObjFlip('flipX')}}},[_c('img',{attrs:{\"src\":\"/assets/ic/backstage/status/ic_backstage_status_flip_vertically.png\",\"alt\":\"flipX\"}})]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"btn d-flex ai-center jc-center\",on:{\"click\":function($event){return _vm.setObjFlip('flipY')}}},[_c('img',{attrs:{\"src\":\"/assets/ic/backstage/status/ic_backstage_status_flip horizontal.png\",\"alt\":\"flipY\"}})])])])]),_c('div',{staticClass:\"d-flex flex-column\"},[_c('div',{staticClass:\"d-flex flex-column function-block\"},[_c('span',{staticClass:\"title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.dataImport\"))+\" \")]),_c('div',{staticClass:\"d-flex\"},[_c('div',{staticClass:\"d-flex flex-column\"},[_c('span',{staticClass:\"mb-4\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.dataImportText\"))+\" \")]),_c('div',{staticClass:\"file-upload d-flex mb-1\"},[_c('label',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"btn btn-orange\",attrs:{\"for\":\"file-input2\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.import\"))+\" \")]),_c('input',{ref:\"pathClear2\",attrs:{\"id\":\"file-input2\",\"accept\":\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\",\"type\":\"file\"},on:{\"change\":_vm.uploadData}})])]),(_vm.orderItem.excel)?_c('div',{staticClass:\"d-flex ai-center flex-column ml-5 pt-2\"},[_c('img',{attrs:{\"width\":\"50px\",\"height\":\"50px\",\"src\":\"/assets/excel-file.svg\",\"alt\":\"\"}}),_c('span',{staticStyle:{\"font-size\":\"0.5rem\",\"margin-top\":\"5px\"}},[_vm._v(\" \"+_vm._s(_vm.orderItem.excel)+\" \")])]):_vm._e()])])]),_c('div',{staticClass:\"d-flex flex-column flex-1 overflow-y-overlay\",attrs:{\"tabindex\":\"1\"},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"delete\",[8,46],$event.key,[\"Backspace\",\"Delete\",\"Del\"])){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }return _vm.delObject($event)}}},[(_vm.canvas.getObjectById('rfid') !== null)?_c('div',{staticClass:\"d-flex flex-column sort-block\"},[_c('div',{staticClass:\"d-flex ai-center jc-between\",class:{\n active:\n _vm.selected && _vm.canvas.getObjectById('rfid').id === _vm.selected.id\n },on:{\"click\":function($event){_vm.selectObj(_vm.canvas.getObjectById('rfid').id);\n _vm.selectMenu(_vm.asideMenu[6]);}}},[_c('span',[_vm._v(\" RFID \")]),_c('img',{attrs:{\"src\":\"/assets/ic/backstage/info/ic_backstage_info_rfid.svg\"}})])]):_vm._e(),_c('draggable',{staticClass:\"d-flex flex-column sort-block\",on:{\"change\":_vm.moveTo},model:{value:(_vm.canvasObjects),callback:function ($$v) {_vm.canvasObjects=$$v},expression:\"canvasObjects\"}},_vm._l((_vm.canvasObjects),function(object){return _c('div',{key:'zindex' + object.id,staticClass:\"d-flex ai-center jc-between\",class:{ active: _vm.selected && object.id === _vm.selected.id },on:{\"click\":function($event){return _vm.selectObj(object.id)}}},[(object['customType'] === 'text')?_c('span',[_vm._v(\" \"+_vm._s(object.text)+\" \")]):(object['customType'] === 'image')?_c('span',[_vm._v(\" \"+_vm._s(object.filename)+\" \")]):(\n object['customType'] === 'barcode' ||\n object['customType'] === 'qrcode'\n )?_c('span',[_vm._v(\" \"+_vm._s(object.barcodeText)+\" \")]):(object['customType'] === 'graphic')?_c('span',[(object.type === 'line')?_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.line\"))+\" \")]):(object.type === 'rect')?_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.rect\"))+\" \")]):(object.type === 'ellipse')?_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.ellipse\"))+\" \")]):_vm._e()]):_vm._e(),(object['customType'] === 'text')?_c('img',{attrs:{\"src\":_vm.asideMenu[2].icon}}):(object['customType'] === 'graphic')?_c('img',{attrs:{\"src\":_vm.asideMenu[1].icon}}):(object['customType'] === 'image')?_c('img',{attrs:{\"src\":_vm.asideMenu[3].icon}}):(object['customType'] === 'barcode')?_c('img',{attrs:{\"src\":\"/assets/ic/backstage/info/ic_backstage_info_barcode.png\"}}):(object['customType'] === 'qrcode')?_c('img',{attrs:{\"src\":\"/assets/ic/backstage/info/ic_backstage_info_qrcode.png\"}}):_vm._e()])}),0)],1),_c('div',[_c('v-btn',{attrs:{\"color\":\"#2f2f2f\",\"disabled\":_vm.previewData.pageIndex === 0,\"depressed\":\"\",\"min-width\":\"4.7rem\",\"max-height\":\"1.5rem\"},on:{\"click\":_vm.preview}},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.preview\"))+\" \")])],1)]),_c('v-dialog',{attrs:{\"scrollable\":\"\",\"content-class\":\"preview-dialog\",\"width\":\"60%\"},model:{value:(_vm.previewDialog),callback:function ($$v) {_vm.previewDialog=$$v},expression:\"previewDialog\"}},[_c('v-btn',{staticClass:\"btn-close\",attrs:{\"color\":\"#a6a6a6\",\"x-large\":\"\",\"dark\":\"\",\"fab\":\"\",\"depressed\":\"\"},on:{\"click\":function($event){_vm.previewDialog = false}}},[_c('v-icon',[_vm._v(\"mdi-close\")])],1),_c('v-card',{attrs:{\"light\":\"\"}},[(_vm.tag && _vm.previewData)?_c('v-toolbar',{staticClass:\"elevation-0 pr-16 fw-weight text-gray-3\"},[_c('v-toolbar-title',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.tagName\"))+_vm._s(_vm.tag.name)+\" \")]),_c('v-spacer'),_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"design.previewTotalPages\", { pages: _vm.previewData.totalPages }))+\" \"+_vm._s(_vm.$t(\"design.previewCurrentPage\"))+\" \"),_c('span',{staticClass:\"current-page mx-1\"},[_vm._v(\" \"+_vm._s(_vm.previewData.pageIndex)+\" \")]),_vm._v(\" \"+_vm._s(_vm.$t(\"design.page\"))+\" \"+_vm._s(_vm.$t(\"design.previewJumpTo\"))+\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.previewPage),expression:\"previewPage\"}],staticClass:\"input-page\",attrs:{\"type\":\"text\"},domProps:{\"value\":(_vm.previewPage)},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.preview($event)},\"input\":function($event){if($event.target.composing){ return; }_vm.previewPage=$event.target.value}}}),_vm._v(\" \"+_vm._s(_vm.$t(\"design.page\"))+\" \")])],1):_vm._e(),_c('v-card-text',[_c('v-container',[_c('v-row',_vm._l((_vm.previewImages),function(preview,idx){return _c('v-col',{key:'previewImage' + idx,attrs:{\"cols\":\"6\"}},[_c('div',{staticClass:\"pa-3\",staticStyle:{\"background\":\"#efefef\"}},[_c('v-img',{attrs:{\"contain\":\"\",\"max-height\":\"8rem\",\"src\":preview}})],1)])}),1)],1)],1)],1)],1),_c('v-dialog',{attrs:{\"scrollable\":\"\",\"content-class\":\"preview-dialog excel\",\"width\":\"60%\"},model:{value:(_vm.previewExcelDialog),callback:function ($$v) {_vm.previewExcelDialog=$$v},expression:\"previewExcelDialog\"}},[_c('v-card',{attrs:{\"light\":\"\"}},[_c('v-toolbar',{staticClass:\"elevation-0 fw-weight text-gray-3 pt-6 preview-header\",attrs:{\"height\":\"auto\"}},[_c('v-spacer'),_c('v-toolbar-title',{staticClass:\"preview-title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.previewExcel\"))+\" \")]),_c('v-spacer')],1),_c('v-simple-table',{staticClass:\"excel-table\",attrs:{\"fixed-header\":\"\",\"dense\":\"\"},scopedSlots:_vm._u([{key:\"default\",fn:function(){return [_c('thead',{staticClass:\"excel-header\"},[_c('tr',_vm._l((_vm.previewExcel.headers),function(header,idx){return _c('th',{key:'excelHeader' + idx},[_vm._v(\" \"+_vm._s(header)+\" \")])}),0)]),_c('tbody',_vm._l((_vm.previewExcel.items),function(item,idx){return _c('tr',{key:'excelItem' + idx},_vm._l((_vm.previewExcel.headers),function(header,idx){return _c('td',{key:'excelColHeader' + idx},[_vm._v(\" \"+_vm._s(item[header])+\" \")])}),0)}),0)]},proxy:true}])}),_c('v-divider',{staticClass:\"custom-divider\"}),_c('v-card-actions',{staticClass:\"px-16 py-10\"},[_c('img',{attrs:{\"src\":\"/assets/excel-file-green.svg\"}}),_c('span',{staticClass:\"ml-5 filename\"},[_vm._v(\" \"+_vm._s(_vm.previewExcel.filename)+\" \")]),_c('v-spacer'),_c('v-btn',{staticClass:\"btn-action\",attrs:{\"color\":\"primary\",\"text\":\"\"},on:{\"click\":function($event){_vm.previewExcelDialog = false}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.back\"))+\" \")]),_c('v-btn',{staticClass:\"btn-action\",attrs:{\"color\":\"primary\",\"depressed\":\"\"},on:{\"click\":_vm.confirmExcel}},[_vm._v(\" \"+_vm._s(_vm.$t(\"design.confirm\"))+\" \")])],1)],1)],1),_c('v-dialog',{attrs:{\"persistent\":\"\",\"width\":\"300\"},model:{value:(_vm.loading),callback:function ($$v) {_vm.loading=$$v},expression:\"loading\"}},[_c('v-card',{attrs:{\"color\":\"#287fce\",\"dark\":\"\"}},[_c('v-card-text',[_vm._v(\" Proccessing \"),_c('v-progress-linear',{staticClass:\"mb-0\",attrs:{\"indeterminate\":\"\",\"color\":\"white\"}})],1)],1)],1)],1)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"d-flex\"},[_c('span',[_c('img',{attrs:{\"src\":\"/assets/ic/backstage/info/ic_backstage_info_barcode_icon.png\",\"alt\":\"barcode\"}})])])}]\n\nexport { render, staticRenderFns }","import { fabric } from \"fabric\";\r\n/**\r\n * Override the initialize function for the _historyInit();\r\n */\r\nfabric.Canvas.prototype.initialize = (function(originalFn) {\r\n return function(...args) {\r\n originalFn.call(this, ...args);\r\n this._historyInit();\r\n return this;\r\n };\r\n})(fabric.Canvas.prototype.initialize);\r\n\r\n/**\r\n * Override the dispose function for the _historyDispose();\r\n */\r\nfabric.Canvas.prototype.dispose = (function(originalFn) {\r\n return function(...args) {\r\n originalFn.call(this, ...args);\r\n this._historyDispose();\r\n return this;\r\n };\r\n})(fabric.Canvas.prototype.dispose);\r\n\r\n/**\r\n * Returns current state of the string of the canvas\r\n */\r\nfabric.Canvas.prototype._historyNext = function() {\r\n return JSON.stringify(this.toDatalessJSON(this.extraProps));\r\n};\r\n\r\n/**\r\n * Returns an object with fabricjs event mappings\r\n */\r\nfabric.Canvas.prototype._historyEvents = function() {\r\n return {\r\n \"object:added\": this._historySaveAction,\r\n \"object:removed\": this._historySaveAction,\r\n \"object:modified\": this._historySaveAction,\r\n \"object:skewing\": this._historySaveAction\r\n };\r\n};\r\n\r\n/**\r\n * Initialization of the plugin\r\n */\r\nfabric.Canvas.prototype._historyInit = function() {\r\n this.historyUndo = [];\r\n this.historyRedo = [];\r\n this.ignoreType = [\"tag\", \"tagName\", \"rfid\"];\r\n this.extraProps = [\r\n \"id\",\r\n \"selectable\",\r\n \"hoverCursor\",\r\n \"customType\",\r\n \"filename\",\r\n \"source\",\r\n \"barcodeText\",\r\n \"barcodeTypeId\",\r\n \"displayContent\",\r\n \"isTop\",\r\n \"tagId\",\r\n \"rfid\",\r\n \"lockMovementX\",\r\n \"lockMovementY\",\r\n \"lockRotation\",\r\n \"lockUniScaling\",\r\n \"lockScalingFlip\",\r\n \"lockScalingX\",\r\n \"lockScalingY\",\r\n \"isFill\",\r\n \"minScaleLimit\",\r\n \"x1\",\r\n \"x2\",\r\n \"y1\",\r\n \"y2\"\r\n ];\r\n this.extraPropsCopy = [\r\n \"selectable\",\r\n \"hoverCursor\",\r\n \"customType\",\r\n \"filename\",\r\n \"source\",\r\n \"barcodeText\",\r\n \"barcodeTypeId\",\r\n \"displayContent\",\r\n \"isTop\",\r\n \"isFill\",\r\n \"minScaleLimit\",\r\n \"x1\",\r\n \"x2\",\r\n \"y1\",\r\n \"y2\"\r\n ];\r\n this.stopRecordHistory = false;\r\n this.historyNextState = this._historyNext();\r\n\r\n this.on(this._historyEvents());\r\n};\r\n\r\n/**\r\n * Remove the custom event listeners\r\n */\r\nfabric.Canvas.prototype._historyDispose = function() {\r\n this.off(this._historyEvents());\r\n};\r\n\r\n/**\r\n * It pushes the state of the canvas into history stack\r\n */\r\nfabric.Canvas.prototype._historySaveAction = function() {\r\n if (this.historyProcessing || this.stopRecordHistory) return;\r\n\r\n const json = this.historyNextState;\r\n this.historyUndo.push(json);\r\n this.historyRedo.length = 0;\r\n this.historyNextState = this._historyNext();\r\n this.fire(\"history:append\", { json: json });\r\n};\r\n\r\n/**\r\n * Undo to latest history.\r\n * Pop the latest state of the history. Re-render.\r\n * Also, pushes into redo history.\r\n */\r\nfabric.Canvas.prototype.undo = function(callback) {\r\n // The undo process will render the new states of the objects\r\n // Therefore, object:added and object:modified events will triggered again\r\n // To ignore those events, we are setting a flag.\r\n this.historyProcessing = true;\r\n\r\n const history = this.historyUndo.pop();\r\n if (history) {\r\n // Push the current state to the redo history\r\n this.historyRedo.push(this._historyNext());\r\n this.historyNextState = history;\r\n this._loadHistory(history, \"history:undo\", callback);\r\n } else {\r\n this.historyProcessing = false;\r\n }\r\n};\r\n\r\n/**\r\n * Redo to latest undo history.\r\n */\r\nfabric.Canvas.prototype.redo = function(callback) {\r\n // The undo process will render the new states of the objects\r\n // Therefore, object:added and object:modified events will triggered again\r\n // To ignore those events, we are setting a flag.\r\n this.historyProcessing = true;\r\n const history = this.historyRedo.pop();\r\n if (history) {\r\n // Every redo action is actually a new action to the undo history\r\n this.historyUndo.push(this._historyNext());\r\n this.historyNextState = history;\r\n this._loadHistory(history, \"history:redo\", callback);\r\n } else {\r\n this.historyProcessing = false;\r\n }\r\n};\r\n\r\nfabric.Canvas.prototype._loadHistory = function(history, event, callback) {\r\n this.loadFromJSON(history, () => {\r\n this.renderAll();\r\n this.fire(event);\r\n this.historyProcessing = false;\r\n\r\n if (callback && typeof callback === \"function\") callback();\r\n });\r\n};\r\n\r\n/**\r\n * Clear undo and redo history stacks\r\n */\r\nfabric.Canvas.prototype.clearHistory = function() {\r\n this.historyUndo = [];\r\n this.historyRedo = [];\r\n this.fire(\"history:clear\");\r\n};\r\n\r\n/**\r\n * Off the history\r\n */\r\nfabric.Canvas.prototype.offHistory = function() {\r\n this.historyProcessing = true;\r\n};\r\n\r\n/**\r\n * On the history\r\n */\r\nfabric.Canvas.prototype.onHistory = function() {\r\n this.historyProcessing = false;\r\n\r\n this._historySaveAction();\r\n};\r\n\r\nfabric.Canvas.prototype.getObjectById = function(id) {\r\n for (const obj of this.getObjects()) {\r\n if (\"id\" in obj && obj.id === id) {\r\n return obj;\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nfabric.Canvas.prototype.getObjectByType = function(type) {\r\n for (const obj of this.getObjects()) {\r\n if (\"customType\" in obj && obj.customType === type) {\r\n return obj;\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nfabric.Canvas.prototype.getObjectsByType = function(type) {\r\n const objs = [];\r\n this.getObjects().forEach(obj => {\r\n if (\"customType\" in obj && obj.customType === type) objs.push(obj);\r\n });\r\n return objs;\r\n};\r\n\r\nfabric.Canvas.prototype.getTag = function() {\r\n return this.getObjectById(\"tag\");\r\n};\r\n\r\nfabric.Canvas.prototype.exportObjects = function() {\r\n const objs = [];\r\n this.getObjects().forEach(obj => {\r\n if (!this.ignoreType.some(t => obj.customType === t)) objs.push(obj);\r\n });\r\n return objs;\r\n};\r\n\r\nfabric.Canvas.prototype.getBarcodes = function() {\r\n return this.getObjectsByType(\"barcode\");\r\n};\r\n\r\nfabric.Canvas.prototype.getQRcodes = function() {\r\n return this.getObjectsByType(\"qrcode\");\r\n};\r\n\r\nfunction _uuid() {\r\n let d = Date.now();\r\n if (\r\n typeof performance !== \"undefined\" &&\r\n typeof performance.now === \"function\"\r\n ) {\r\n d += performance.now(); //use high-precision timer if available\r\n }\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function(c) {\r\n const r = (d + Math.random() * 16) % 16 | 0;\r\n d = Math.floor(d / 16);\r\n return (c === \"x\" ? r : (r & 0x3) | 0x8).toString(16);\r\n });\r\n}\r\n\r\nfabric.Canvas.prototype.add = (function(originalFn) {\r\n return function(...args) {\r\n originalFn.call(this, ...args);\r\n if (!args[0].get(\"id\")) args[0].set({ id: _uuid() });\r\n return this;\r\n };\r\n})(fabric.Canvas.prototype.add);\r\n\r\n// panning https://stackoverflow.com/questions/34423822/how-to-implement-canvas-panning-with-fabric-js\r\n\r\nconst STATE_IDLE = \"idle\";\r\nconst STATE_PANNING = \"panning\";\r\nfabric.Canvas.prototype.toggleDragMode = function(dragMode) {\r\n // Remember the previous X and Y coordinates for delta calculations\r\n let lastClientX;\r\n let lastClientY;\r\n // Keep track of the state\r\n let state = STATE_IDLE;\r\n // We're entering dragmode\r\n if (dragMode) {\r\n // Discard any active object\r\n this.discardActiveObject();\r\n // Loop over all objects and disable events / selectable. We remember its value in a temp variable stored on each object\r\n /*\r\n this.forEachObject(function(object) {\r\n object.prevEvented = object.evented;\r\n object.prevSelectable = object.selectable;\r\n object.evented = false;\r\n object.selectable = false;\r\n });\r\n */\r\n // When MouseUp fires, we set the state to idle\r\n this.on(\"mouse:up\", function(e) {\r\n if (e.button === 3) {\r\n this.defaultCursor = \"default\";\r\n this.selection = true;\r\n state = STATE_IDLE;\r\n }\r\n });\r\n // When MouseDown fires, we set the state to panning\r\n this.on(\"mouse:down\", e => {\r\n if (e.button === 3) {\r\n // Remove selection ability on the canvas\r\n this.selection = false;\r\n // Set the cursor to 'move'\r\n this.defaultCursor = \"move\";\r\n state = STATE_PANNING;\r\n lastClientX = e.e.clientX;\r\n lastClientY = e.e.clientY;\r\n }\r\n });\r\n // When the mouse moves, and we're panning (mouse down), we continue\r\n this.on(\"mouse:move\", e => {\r\n if (state === STATE_PANNING && e && e.e) {\r\n // let delta = new fabric.Point(e.e.movementX, e.e.movementY); // No Safari support for movementX and movementY\r\n // For cross-browser compatibility, I had to manually keep track of the delta\r\n\r\n // Calculate deltas\r\n let deltaX = 0;\r\n let deltaY = 0;\r\n if (lastClientX) {\r\n deltaX = e.e.clientX - lastClientX;\r\n }\r\n if (lastClientY) {\r\n deltaY = e.e.clientY - lastClientY;\r\n }\r\n // Update the last X and Y values\r\n lastClientX = e.e.clientX;\r\n lastClientY = e.e.clientY;\r\n\r\n const delta = new fabric.Point(deltaX, deltaY);\r\n this.relativePan(delta);\r\n this.trigger(\"moved\");\r\n }\r\n });\r\n } else {\r\n // When we exit dragmode, we restore the previous values on all objects\r\n this.forEachObject(function(object) {\r\n object.evented =\r\n object.prevEvented !== undefined ? object.prevEvented : object.evented;\r\n object.selectable =\r\n object.prevSelectable !== undefined\r\n ? object.prevSelectable\r\n : object.selectable;\r\n });\r\n // Reset the cursor\r\n this.defaultCursor = \"default\";\r\n // Remove the event listeners\r\n this.off(\"mouse:up\");\r\n this.off(\"mouse:down\");\r\n this.off(\"mouse:move\");\r\n // Restore selection ability on the canvas\r\n this.selection = true;\r\n }\r\n};\r\n","\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DesignEditor.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DesignEditor.vue?vue&type=script&lang=js&\"","// Styles\nimport './VAutocomplete.sass'\n\n// Extensions\nimport VSelect, { defaultMenuProps as VSelectMenuProps } from '../VSelect/VSelect'\nimport VTextField from '../VTextField/VTextField'\n\n// Utilities\nimport mergeData from '../../util/mergeData'\nimport {\n getObjectValueByPath,\n getPropertyFromItem,\n keyCodes,\n} from '../../util/helpers'\n\n// Types\nimport { PropType, VNode } from 'vue'\nimport { PropValidator } from 'vue/types/options'\n\nconst defaultMenuProps = {\n ...VSelectMenuProps,\n offsetY: true,\n offsetOverflow: true,\n transition: false,\n}\n\n/* @vue/component */\nexport default VSelect.extend({\n name: 'v-autocomplete',\n\n props: {\n allowOverflow: {\n type: Boolean,\n default: true,\n },\n autoSelectFirst: {\n type: Boolean,\n default: false,\n },\n filter: {\n type: Function,\n default: (item: any, queryText: string, itemText: string) => {\n return itemText.toLocaleLowerCase().indexOf(queryText.toLocaleLowerCase()) > -1\n },\n } as PropValidator<(item: any, queryText: string, itemText: string) => boolean>,\n hideNoData: Boolean,\n menuProps: {\n type: VSelect.options.props.menuProps.type,\n default: () => defaultMenuProps,\n },\n noFilter: Boolean,\n searchInput: {\n type: String as PropType,\n default: undefined,\n },\n },\n\n data () {\n return {\n lazySearch: this.searchInput,\n }\n },\n\n computed: {\n classes (): object {\n return {\n ...VSelect.options.computed.classes.call(this),\n 'v-autocomplete': true,\n 'v-autocomplete--is-selecting-index': this.selectedIndex > -1,\n }\n },\n computedItems (): object[] {\n return this.filteredItems\n },\n selectedValues (): object[] {\n return this.selectedItems.map(item => this.getValue(item))\n },\n hasDisplayedItems (): boolean {\n return this.hideSelected\n ? this.filteredItems.some(item => !this.hasItem(item))\n : this.filteredItems.length > 0\n },\n currentRange (): number {\n if (this.selectedItem == null) return 0\n\n return String(this.getText(this.selectedItem)).length\n },\n filteredItems (): object[] {\n if (!this.isSearching || this.noFilter || this.internalSearch == null) return this.allItems\n\n return this.allItems.filter(item => {\n const value = getPropertyFromItem(item, this.itemText)\n const text = value != null ? String(value) : ''\n\n return this.filter(item, String(this.internalSearch), text)\n })\n },\n internalSearch: {\n get (): string | undefined {\n return this.lazySearch\n },\n set (val: any) {\n this.lazySearch = val\n\n this.$emit('update:search-input', val)\n },\n },\n isAnyValueAllowed (): boolean {\n return false\n },\n isDirty (): boolean {\n return this.searchIsDirty || this.selectedItems.length > 0\n },\n isSearching (): boolean {\n return (\n this.multiple &&\n this.searchIsDirty\n ) || (\n this.searchIsDirty &&\n this.internalSearch !== this.getText(this.selectedItem)\n )\n },\n menuCanShow (): boolean {\n if (!this.isFocused) return false\n\n return this.hasDisplayedItems || !this.hideNoData\n },\n $_menuProps (): object {\n const props = VSelect.options.computed.$_menuProps.call(this);\n (props as any).contentClass = `v-autocomplete__content ${(props as any).contentClass || ''}`.trim()\n return {\n ...defaultMenuProps,\n ...props,\n }\n },\n searchIsDirty (): boolean {\n return this.internalSearch != null &&\n this.internalSearch !== ''\n },\n selectedItem (): any {\n if (this.multiple) return null\n\n return this.selectedItems.find(i => {\n return this.valueComparator(this.getValue(i), this.getValue(this.internalValue))\n })\n },\n listData () {\n const data = VSelect.options.computed.listData.call(this) as any\n\n data.props = {\n ...data.props,\n items: this.virtualizedItems,\n noFilter: (\n this.noFilter ||\n !this.isSearching ||\n !this.filteredItems.length\n ),\n searchInput: this.internalSearch,\n }\n\n return data\n },\n },\n\n watch: {\n filteredItems: 'onFilteredItemsChanged',\n internalValue: 'setSearch',\n isFocused (val) {\n if (val) {\n document.addEventListener('copy', this.onCopy)\n this.$refs.input && this.$refs.input.select()\n } else {\n document.removeEventListener('copy', this.onCopy)\n this.updateSelf()\n }\n },\n isMenuActive (val) {\n if (val || !this.hasSlot) return\n\n this.lazySearch = undefined\n },\n items (val, oldVal) {\n // If we are focused, the menu\n // is not active, hide no data is enabled,\n // and items change\n // User is probably async loading\n // items, try to activate the menu\n if (\n !(oldVal && oldVal.length) &&\n this.hideNoData &&\n this.isFocused &&\n !this.isMenuActive &&\n val.length\n ) this.activateMenu()\n },\n searchInput (val: string) {\n this.lazySearch = val\n },\n internalSearch: 'onInternalSearchChanged',\n itemText: 'updateSelf',\n },\n\n created () {\n this.setSearch()\n },\n\n destroyed () {\n document.removeEventListener('copy', this.onCopy)\n },\n\n methods: {\n onFilteredItemsChanged (val: never[], oldVal: never[]) {\n // TODO: How is the watcher triggered\n // for duplicate items? no idea\n if (val === oldVal) return\n\n this.setMenuIndex(-1)\n\n this.$nextTick(() => {\n if (\n !this.internalSearch ||\n (val.length !== 1 &&\n !this.autoSelectFirst)\n ) return\n\n this.$refs.menu.getTiles()\n this.setMenuIndex(0)\n })\n },\n onInternalSearchChanged () {\n this.updateMenuDimensions()\n },\n updateMenuDimensions () {\n // Type from menuable is not making it through\n this.isMenuActive && this.$refs.menu && this.$refs.menu.updateDimensions()\n },\n changeSelectedIndex (keyCode: number) {\n // Do not allow changing of selectedIndex\n // when search is dirty\n if (this.searchIsDirty) return\n\n if (this.multiple && keyCode === keyCodes.left) {\n if (this.selectedIndex === -1) {\n this.selectedIndex = this.selectedItems.length - 1\n } else {\n this.selectedIndex--\n }\n } else if (this.multiple && keyCode === keyCodes.right) {\n if (this.selectedIndex >= this.selectedItems.length - 1) {\n this.selectedIndex = -1\n } else {\n this.selectedIndex++\n }\n } else if (keyCode === keyCodes.backspace || keyCode === keyCodes.delete) {\n this.deleteCurrentItem()\n }\n },\n deleteCurrentItem () {\n const curIndex = this.selectedIndex\n const curItem = this.selectedItems[curIndex]\n\n // Do nothing if input or item is disabled\n if (\n !this.isInteractive ||\n this.getDisabled(curItem)\n ) return\n\n const lastIndex = this.selectedItems.length - 1\n\n // Select the last item if\n // there is no selection\n if (\n this.selectedIndex === -1 &&\n lastIndex !== 0\n ) {\n this.selectedIndex = lastIndex\n\n return\n }\n\n const length = this.selectedItems.length\n const nextIndex = curIndex !== length - 1\n ? curIndex\n : curIndex - 1\n const nextItem = this.selectedItems[nextIndex]\n\n if (!nextItem) {\n this.setValue(this.multiple ? [] : undefined)\n } else {\n this.selectItem(curItem)\n }\n\n this.selectedIndex = nextIndex\n },\n clearableCallback () {\n this.internalSearch = undefined\n\n VSelect.options.methods.clearableCallback.call(this)\n },\n genInput () {\n const input = VTextField.options.methods.genInput.call(this)\n\n input.data = mergeData(input.data!, {\n attrs: {\n 'aria-activedescendant': getObjectValueByPath(this.$refs.menu, 'activeTile.id'),\n autocomplete: getObjectValueByPath(input.data!, 'attrs.autocomplete', 'off'),\n },\n domProps: { value: this.internalSearch },\n })\n\n return input\n },\n genInputSlot () {\n const slot = VSelect.options.methods.genInputSlot.call(this)\n\n slot.data!.attrs!.role = 'combobox'\n\n return slot\n },\n genSelections (): VNode | never[] {\n return this.hasSlot || this.multiple\n ? VSelect.options.methods.genSelections.call(this)\n : []\n },\n onClick (e: MouseEvent) {\n if (!this.isInteractive) return\n\n this.selectedIndex > -1\n ? (this.selectedIndex = -1)\n : this.onFocus()\n\n if (!this.isAppendInner(e.target)) this.activateMenu()\n },\n onInput (e: Event) {\n if (\n this.selectedIndex > -1 ||\n !e.target\n ) return\n\n const target = e.target as HTMLInputElement\n const value = target.value\n\n // If typing and menu is not currently active\n if (target.value) this.activateMenu()\n\n this.internalSearch = value\n this.badInput = target.validity && target.validity.badInput\n },\n onKeyDown (e: KeyboardEvent) {\n const keyCode = e.keyCode\n\n VSelect.options.methods.onKeyDown.call(this, e)\n\n // The ordering is important here\n // allows new value to be updated\n // and then moves the index to the\n // proper location\n this.changeSelectedIndex(keyCode)\n },\n onSpaceDown (e: KeyboardEvent) { /* noop */ },\n onTabDown (e: KeyboardEvent) {\n VSelect.options.methods.onTabDown.call(this, e)\n this.updateSelf()\n },\n onUpDown (e: Event) {\n // Prevent screen from scrolling\n e.preventDefault()\n\n // For autocomplete / combobox, cycling\n // interfers with native up/down behavior\n // instead activate the menu\n this.activateMenu()\n },\n selectItem (item: object) {\n VSelect.options.methods.selectItem.call(this, item)\n this.setSearch()\n },\n setSelectedItems () {\n VSelect.options.methods.setSelectedItems.call(this)\n\n // #4273 Don't replace if searching\n // #4403 Don't replace if focused\n if (!this.isFocused) this.setSearch()\n },\n setSearch () {\n // Wait for nextTick so selectedItem\n // has had time to update\n this.$nextTick(() => {\n if (\n !this.multiple ||\n !this.internalSearch ||\n !this.isMenuActive\n ) {\n this.internalSearch = (\n !this.selectedItems.length ||\n this.multiple ||\n this.hasSlot\n )\n ? null\n : this.getText(this.selectedItem)\n }\n })\n },\n updateSelf () {\n if (!this.searchIsDirty &&\n !this.internalValue\n ) return\n\n if (!this.valueComparator(\n this.internalSearch,\n this.getValue(this.internalValue)\n )) {\n this.setSearch()\n }\n },\n hasItem (item: any): boolean {\n return this.selectedValues.indexOf(this.getValue(item)) > -1\n },\n onCopy (event: ClipboardEvent) {\n if (this.selectedIndex === -1) return\n\n const currentItem = this.selectedItems[this.selectedIndex]\n const currentItemText = this.getText(currentItem)\n event.clipboardData!.setData('text/plain', currentItemText)\n event.clipboardData!.setData('text/vnd.vuetify.autocomplete.item+plain', currentItemText)\n event.preventDefault()\n },\n },\n})\n","// Directives\nimport ripple from '../../directives/ripple'\n\n// Types\nimport Vue, { VNode, VNodeData, VNodeDirective } from 'vue'\n\nexport default Vue.extend({\n name: 'rippleable',\n\n directives: { ripple },\n\n props: {\n ripple: {\n type: [Boolean, Object],\n default: true,\n },\n },\n\n methods: {\n genRipple (data: VNodeData = {}): VNode | null {\n if (!this.ripple) return null\n\n data.staticClass = 'v-input--selection-controls__ripple'\n\n data.directives = data.directives || []\n data.directives.push({\n name: 'ripple',\n value: { center: true },\n } as VNodeDirective)\n\n return this.$createElement('div', data)\n },\n },\n})\n","// Components\nimport VInput from '../../components/VInput'\n\n// Mixins\nimport Rippleable from '../rippleable'\nimport Comparable from '../comparable'\n\n// Utilities\nimport mixins from '../../util/mixins'\n\nexport function prevent (e: Event) {\n e.preventDefault()\n}\n\n/* @vue/component */\nexport default mixins(\n VInput,\n Rippleable,\n Comparable\n).extend({\n name: 'selectable',\n\n model: {\n prop: 'inputValue',\n event: 'change',\n },\n\n props: {\n id: String,\n inputValue: null as any,\n falseValue: null as any,\n trueValue: null as any,\n multiple: {\n type: Boolean,\n default: null,\n },\n label: String,\n },\n\n data () {\n return {\n hasColor: this.inputValue,\n lazyValue: this.inputValue,\n }\n },\n\n computed: {\n computedColor (): string | undefined {\n if (!this.isActive) return undefined\n if (this.color) return this.color\n if (this.isDark && !this.appIsDark) return 'white'\n return 'primary'\n },\n isMultiple (): boolean {\n return this.multiple === true || (this.multiple === null && Array.isArray(this.internalValue))\n },\n isActive (): boolean {\n const value = this.value\n const input = this.internalValue\n\n if (this.isMultiple) {\n if (!Array.isArray(input)) return false\n\n return input.some(item => this.valueComparator(item, value))\n }\n\n if (this.trueValue === undefined || this.falseValue === undefined) {\n return value\n ? this.valueComparator(value, input)\n : Boolean(input)\n }\n\n return this.valueComparator(input, this.trueValue)\n },\n isDirty (): boolean {\n return this.isActive\n },\n rippleState (): string | undefined {\n return !this.isDisabled && !this.validationState\n ? undefined\n : this.validationState\n },\n },\n\n watch: {\n inputValue (val) {\n this.lazyValue = val\n this.hasColor = val\n },\n },\n\n methods: {\n genLabel () {\n const label = VInput.options.methods.genLabel.call(this)\n\n if (!label) return label\n\n label!.data!.on = {\n // Label shouldn't cause the input to focus\n click: prevent,\n }\n\n return label\n },\n genInput (type: string, attrs: object) {\n return this.$createElement('input', {\n attrs: Object.assign({\n 'aria-checked': this.isActive.toString(),\n disabled: this.isDisabled,\n id: this.computedId,\n role: type,\n type,\n }, attrs),\n domProps: {\n value: this.value,\n checked: this.isActive,\n },\n on: {\n blur: this.onBlur,\n change: this.onChange,\n focus: this.onFocus,\n keydown: this.onKeydown,\n click: prevent,\n },\n ref: 'input',\n })\n },\n onBlur () {\n this.isFocused = false\n },\n onClick (e: Event) {\n this.onChange()\n this.$emit('click', e)\n },\n onChange () {\n if (!this.isInteractive) return\n\n const value = this.value\n let input = this.internalValue\n\n if (this.isMultiple) {\n if (!Array.isArray(input)) {\n input = []\n }\n\n const length = input.length\n\n input = input.filter((item: any) => !this.valueComparator(item, value))\n\n if (input.length === length) {\n input.push(value)\n }\n } else if (this.trueValue !== undefined && this.falseValue !== undefined) {\n input = this.valueComparator(input, this.trueValue) ? this.falseValue : this.trueValue\n } else if (value) {\n input = this.valueComparator(input, value) ? null : value\n } else {\n input = !input\n }\n\n this.validate(true, input)\n this.internalValue = input\n this.hasColor = input\n },\n onFocus () {\n this.isFocused = true\n },\n /** @abstract */\n onKeydown (e: Event) {},\n },\n})\n","// Styles\nimport './VCheckbox.sass'\nimport '../../styles/components/_selection-controls.sass'\n\n// Components\nimport VIcon from '../VIcon'\nimport VInput from '../VInput'\n\n// Mixins\nimport Selectable from '../../mixins/selectable'\n\n/* @vue/component */\nexport default Selectable.extend({\n name: 'v-checkbox',\n\n props: {\n indeterminate: Boolean,\n indeterminateIcon: {\n type: String,\n default: '$checkboxIndeterminate',\n },\n offIcon: {\n type: String,\n default: '$checkboxOff',\n },\n onIcon: {\n type: String,\n default: '$checkboxOn',\n },\n },\n\n data () {\n return {\n inputIndeterminate: this.indeterminate,\n }\n },\n\n computed: {\n classes (): object {\n return {\n ...VInput.options.computed.classes.call(this),\n 'v-input--selection-controls': true,\n 'v-input--checkbox': true,\n 'v-input--indeterminate': this.inputIndeterminate,\n }\n },\n computedIcon (): string {\n if (this.inputIndeterminate) {\n return this.indeterminateIcon\n } else if (this.isActive) {\n return this.onIcon\n } else {\n return this.offIcon\n }\n },\n // Do not return undefined if disabled,\n // according to spec, should still show\n // a color when disabled and active\n validationState (): string | undefined {\n if (this.isDisabled && !this.inputIndeterminate) return undefined\n if (this.hasError && this.shouldValidate) return 'error'\n if (this.hasSuccess) return 'success'\n if (this.hasColor !== null) return this.computedColor\n return undefined\n },\n },\n\n watch: {\n indeterminate (val) {\n // https://github.com/vuetifyjs/vuetify/issues/8270\n this.$nextTick(() => (this.inputIndeterminate = val))\n },\n inputIndeterminate (val) {\n this.$emit('update:indeterminate', val)\n },\n isActive () {\n if (!this.indeterminate) return\n this.inputIndeterminate = false\n },\n },\n\n methods: {\n genCheckbox () {\n return this.$createElement('div', {\n staticClass: 'v-input--selection-controls__input',\n }, [\n this.$createElement(VIcon, this.setTextColor(this.validationState, {\n props: {\n dense: this.dense,\n dark: this.dark,\n light: this.light,\n },\n }), this.computedIcon),\n this.genInput('checkbox', {\n ...this.attrs$,\n 'aria-checked': this.inputIndeterminate\n ? 'mixed'\n : this.isActive.toString(),\n }),\n this.genRipple(this.setTextColor(this.rippleState)),\n ])\n },\n genDefaultSlot () {\n return [\n this.genCheckbox(),\n this.genLabel(),\n ]\n },\n },\n})\n","import './VSimpleTable.sass'\n\nimport { convertToUnit } from '../../util/helpers'\nimport Themeable from '../../mixins/themeable'\nimport mixins from '../../util/mixins'\nimport { VNode } from 'vue'\n\nexport default mixins(Themeable).extend({\n name: 'v-simple-table',\n\n props: {\n dense: Boolean,\n fixedHeader: Boolean,\n height: [Number, String],\n },\n\n computed: {\n classes (): Record {\n return {\n 'v-data-table--dense': this.dense,\n 'v-data-table--fixed-height': !!this.height && !this.fixedHeader,\n 'v-data-table--fixed-header': this.fixedHeader,\n ...this.themeClasses,\n }\n },\n },\n\n methods: {\n genWrapper () {\n return this.$slots.wrapper || this.$createElement('div', {\n staticClass: 'v-data-table__wrapper',\n style: {\n height: convertToUnit(this.height),\n },\n }, [\n this.$createElement('table', this.$slots.default),\n ])\n },\n },\n\n render (h): VNode {\n return h('div', {\n staticClass: 'v-data-table',\n class: this.classes,\n }, [\n this.$slots.top,\n this.genWrapper(),\n this.$slots.bottom,\n ])\n },\n})\n","// Styles\nimport './VSkeletonLoader.sass'\n\n// Mixins\nimport Elevatable from '../../mixins/elevatable'\nimport Measurable from '../../mixins/measurable'\nimport Themeable from '../../mixins/themeable'\n\n// Utilities\nimport mixins from '../../util/mixins'\n\n// Types\nimport { VNode } from 'vue'\nimport { getSlot } from '../../util/helpers'\nimport { PropValidator } from 'vue/types/options'\n\nexport interface HTMLSkeletonLoaderElement extends HTMLElement {\n _initialStyle?: {\n display: string | null\n transition: string\n }\n}\n\n/* @vue/component */\nexport default mixins(\n Elevatable,\n Measurable,\n Themeable,\n).extend({\n name: 'VSkeletonLoader',\n\n props: {\n boilerplate: Boolean,\n loading: Boolean,\n tile: Boolean,\n transition: String,\n type: String,\n types: {\n type: Object,\n default: () => ({}),\n } as PropValidator>,\n },\n\n computed: {\n attrs (): object {\n if (!this.isLoading) return this.$attrs\n\n return !this.boilerplate ? {\n 'aria-busy': true,\n 'aria-live': 'polite',\n role: 'alert',\n ...this.$attrs,\n } : {}\n },\n classes (): object {\n return {\n 'v-skeleton-loader--boilerplate': this.boilerplate,\n 'v-skeleton-loader--is-loading': this.isLoading,\n 'v-skeleton-loader--tile': this.tile,\n ...this.themeClasses,\n ...this.elevationClasses,\n }\n },\n isLoading (): boolean {\n return !('default' in this.$scopedSlots) || this.loading\n },\n rootTypes (): Record {\n return {\n actions: 'button@2',\n article: 'heading, paragraph',\n avatar: 'avatar',\n button: 'button',\n card: 'image, card-heading',\n 'card-avatar': 'image, list-item-avatar',\n 'card-heading': 'heading',\n chip: 'chip',\n 'date-picker': 'list-item, card-heading, divider, date-picker-options, date-picker-days, actions',\n 'date-picker-options': 'text, avatar@2',\n 'date-picker-days': 'avatar@28',\n heading: 'heading',\n image: 'image',\n 'list-item': 'text',\n 'list-item-avatar': 'avatar, text',\n 'list-item-two-line': 'sentences',\n 'list-item-avatar-two-line': 'avatar, sentences',\n 'list-item-three-line': 'paragraph',\n 'list-item-avatar-three-line': 'avatar, paragraph',\n paragraph: 'text@3',\n sentences: 'text@2',\n table: 'table-heading, table-thead, table-tbody, table-tfoot',\n 'table-heading': 'heading, text',\n 'table-thead': 'heading@6',\n 'table-tbody': 'table-row-divider@6',\n 'table-row-divider': 'table-row, divider',\n 'table-row': 'table-cell@6',\n 'table-cell': 'text',\n 'table-tfoot': 'text@2, avatar@2',\n text: 'text',\n ...this.types,\n }\n },\n },\n\n methods: {\n genBone (text: string, children: VNode[]) {\n return this.$createElement('div', {\n staticClass: `v-skeleton-loader__${text} v-skeleton-loader__bone`,\n }, children)\n },\n genBones (bone: string): VNode[] {\n // e.g. 'text@3'\n const [type, length] = bone.split('@') as [string, number]\n const generator = () => this.genStructure(type)\n\n // Generate a length array based upon\n // value after @ in the bone string\n return Array.from({ length }).map(generator)\n },\n // Fix type when this is merged\n // https://github.com/microsoft/TypeScript/pull/33050\n genStructure (type?: string): any {\n let children = []\n type = type || this.type || ''\n const bone = this.rootTypes[type] || ''\n\n // End of recursion, do nothing\n /* eslint-disable-next-line no-empty, brace-style */\n if (type === bone) {}\n // Array of values - e.g. 'heading, paragraph, text@2'\n else if (type.indexOf(',') > -1) return this.mapBones(type)\n // Array of values - e.g. 'paragraph@4'\n else if (type.indexOf('@') > -1) return this.genBones(type)\n // Array of values - e.g. 'card@2'\n else if (bone.indexOf(',') > -1) children = this.mapBones(bone)\n // Array of values - e.g. 'list-item@2'\n else if (bone.indexOf('@') > -1) children = this.genBones(bone)\n // Single value - e.g. 'card-heading'\n else if (bone) children.push(this.genStructure(bone))\n\n return [this.genBone(type, children)]\n },\n genSkeleton () {\n const children = []\n\n if (!this.isLoading) children.push(getSlot(this))\n else children.push(this.genStructure())\n\n /* istanbul ignore else */\n if (!this.transition) return children\n\n /* istanbul ignore next */\n return this.$createElement('transition', {\n props: {\n name: this.transition,\n },\n // Only show transition when\n // content has been loaded\n on: {\n afterEnter: this.resetStyles,\n beforeEnter: this.onBeforeEnter,\n beforeLeave: this.onBeforeLeave,\n leaveCancelled: this.resetStyles,\n },\n }, children)\n },\n mapBones (bones: string) {\n // Remove spaces and return array of structures\n return bones.replace(/\\s/g, '').split(',').map(this.genStructure)\n },\n onBeforeEnter (el: HTMLSkeletonLoaderElement) {\n this.resetStyles(el)\n\n if (!this.isLoading) return\n\n el._initialStyle = {\n display: el.style.display,\n transition: el.style.transition,\n }\n\n el.style.setProperty('transition', 'none', 'important')\n },\n onBeforeLeave (el: HTMLSkeletonLoaderElement) {\n el.style.setProperty('display', 'none', 'important')\n },\n resetStyles (el: HTMLSkeletonLoaderElement) {\n if (!el._initialStyle) return\n\n el.style.display = el._initialStyle.display || ''\n el.style.transition = el._initialStyle.transition\n\n delete el._initialStyle\n },\n },\n\n render (h): VNode {\n return h('div', {\n staticClass: 'v-skeleton-loader',\n attrs: this.attrs,\n on: this.$listeners,\n class: this.classes,\n style: this.isLoading ? this.measurableStyles : undefined,\n }, [this.genSkeleton()])\n },\n})\n","import './VSlider.sass'\n\n// Components\nimport VInput from '../VInput'\nimport { VScaleTransition } from '../transitions'\n\n// Mixins\nimport mixins, { ExtractVue } from '../../util/mixins'\nimport Loadable from '../../mixins/loadable'\n\n// Directives\nimport ClickOutside from '../../directives/click-outside'\n\n// Helpers\nimport { addOnceEventListener, deepEqual, keyCodes, createRange, convertToUnit, passiveSupported } from '../../util/helpers'\nimport { consoleWarn } from '../../util/console'\n\n// Types\nimport Vue, { VNode, VNodeChildrenArrayContents, PropType } from 'vue'\nimport { ScopedSlotChildren } from 'vue/types/vnode'\nimport { PropValidator } from 'vue/types/options'\n\ninterface options extends Vue {\n $refs: {\n track: HTMLElement\n }\n}\n\nexport default mixins\n/* eslint-enable indent */\n>(\n VInput,\n Loadable\n/* @vue/component */\n).extend({\n name: 'v-slider',\n\n directives: {\n ClickOutside,\n },\n\n mixins: [Loadable],\n\n props: {\n disabled: Boolean,\n inverseLabel: Boolean,\n max: {\n type: [Number, String],\n default: 100,\n },\n min: {\n type: [Number, String],\n default: 0,\n },\n step: {\n type: [Number, String],\n default: 1,\n },\n thumbColor: String,\n thumbLabel: {\n type: [Boolean, String] as PropType,\n default: undefined,\n validator: v => typeof v === 'boolean' || v === 'always',\n },\n thumbSize: {\n type: [Number, String],\n default: 32,\n },\n tickLabels: {\n type: Array,\n default: () => ([]),\n } as PropValidator,\n ticks: {\n type: [Boolean, String] as PropType,\n default: false,\n validator: v => typeof v === 'boolean' || v === 'always',\n },\n tickSize: {\n type: [Number, String],\n default: 2,\n },\n trackColor: String,\n trackFillColor: String,\n value: [Number, String],\n vertical: Boolean,\n },\n\n data: () => ({\n app: null as any,\n oldValue: null as any,\n keyPressed: 0,\n isFocused: false,\n isActive: false,\n noClick: false, // Prevent click event if dragging took place, hack for #7915\n }),\n\n computed: {\n classes (): object {\n return {\n ...VInput.options.computed.classes.call(this),\n 'v-input__slider': true,\n 'v-input__slider--vertical': this.vertical,\n 'v-input__slider--inverse-label': this.inverseLabel,\n }\n },\n internalValue: {\n get (): number {\n return this.lazyValue\n },\n set (val: number) {\n val = isNaN(val) ? this.minValue : val\n // Round value to ensure the\n // entire slider range can\n // be selected with step\n const value = this.roundValue(Math.min(Math.max(val, this.minValue), this.maxValue))\n\n if (value === this.lazyValue) return\n\n this.lazyValue = value\n\n this.$emit('input', value)\n },\n },\n trackTransition (): string {\n return this.keyPressed >= 2 ? 'none' : ''\n },\n minValue (): number {\n return parseFloat(this.min)\n },\n maxValue (): number {\n return parseFloat(this.max)\n },\n stepNumeric (): number {\n return this.step > 0 ? parseFloat(this.step) : 0\n },\n inputWidth (): number {\n const value = (this.roundValue(this.internalValue) - this.minValue) / (this.maxValue - this.minValue) * 100\n\n return value\n },\n trackFillStyles (): Partial {\n const startDir = this.vertical ? 'bottom' : 'left'\n const endDir = this.vertical ? 'top' : 'right'\n const valueDir = this.vertical ? 'height' : 'width'\n\n const start = this.$vuetify.rtl ? 'auto' : '0'\n const end = this.$vuetify.rtl ? '0' : 'auto'\n const value = this.isDisabled ? `calc(${this.inputWidth}% - 10px)` : `${this.inputWidth}%`\n\n return {\n transition: this.trackTransition,\n [startDir]: start,\n [endDir]: end,\n [valueDir]: value,\n }\n },\n trackStyles (): Partial {\n const startDir = this.vertical ? this.$vuetify.rtl ? 'bottom' : 'top' : this.$vuetify.rtl ? 'left' : 'right'\n const endDir = this.vertical ? 'height' : 'width'\n\n const start = '0px'\n const end = this.isDisabled ? `calc(${100 - this.inputWidth}% - 10px)` : `calc(${100 - this.inputWidth}%)`\n\n return {\n transition: this.trackTransition,\n [startDir]: start,\n [endDir]: end,\n }\n },\n showTicks (): boolean {\n return this.tickLabels.length > 0 ||\n !!(!this.isDisabled && this.stepNumeric && this.ticks)\n },\n numTicks (): number {\n return Math.ceil((this.maxValue - this.minValue) / this.stepNumeric)\n },\n showThumbLabel (): boolean {\n return !this.isDisabled && !!(\n this.thumbLabel ||\n this.$scopedSlots['thumb-label']\n )\n },\n computedTrackColor (): string | undefined {\n if (this.isDisabled) return undefined\n if (this.trackColor) return this.trackColor\n if (this.isDark) return this.validationState\n return this.validationState || 'primary lighten-3'\n },\n computedTrackFillColor (): string | undefined {\n if (this.isDisabled) return undefined\n if (this.trackFillColor) return this.trackFillColor\n return this.validationState || this.computedColor\n },\n computedThumbColor (): string | undefined {\n if (this.thumbColor) return this.thumbColor\n return this.validationState || this.computedColor\n },\n },\n\n watch: {\n min (val) {\n const parsed = parseFloat(val)\n parsed > this.internalValue && this.$emit('input', parsed)\n },\n max (val) {\n const parsed = parseFloat(val)\n parsed < this.internalValue && this.$emit('input', parsed)\n },\n value: {\n handler (v: number) {\n this.internalValue = v\n },\n },\n },\n\n // If done in as immediate in\n // value watcher, causes issues\n // with vue-test-utils\n beforeMount () {\n this.internalValue = this.value\n },\n\n mounted () {\n // Without a v-app, iOS does not work with body selectors\n this.app = document.querySelector('[data-app]') ||\n consoleWarn('Missing v-app or a non-body wrapping element with the [data-app] attribute', this)\n },\n\n methods: {\n genDefaultSlot (): VNodeChildrenArrayContents {\n const children: VNodeChildrenArrayContents = [this.genLabel()]\n const slider = this.genSlider()\n this.inverseLabel\n ? children.unshift(slider)\n : children.push(slider)\n\n children.push(this.genProgress())\n\n return children\n },\n genSlider (): VNode {\n return this.$createElement('div', {\n class: {\n 'v-slider': true,\n 'v-slider--horizontal': !this.vertical,\n 'v-slider--vertical': this.vertical,\n 'v-slider--focused': this.isFocused,\n 'v-slider--active': this.isActive,\n 'v-slider--disabled': this.isDisabled,\n 'v-slider--readonly': this.isReadonly,\n ...this.themeClasses,\n },\n directives: [{\n name: 'click-outside',\n value: this.onBlur,\n }],\n on: {\n click: this.onSliderClick,\n },\n }, this.genChildren())\n },\n genChildren (): VNodeChildrenArrayContents {\n return [\n this.genInput(),\n this.genTrackContainer(),\n this.genSteps(),\n this.genThumbContainer(\n this.internalValue,\n this.inputWidth,\n this.isActive,\n this.isFocused,\n this.onThumbMouseDown,\n this.onFocus,\n this.onBlur,\n ),\n ]\n },\n genInput (): VNode {\n return this.$createElement('input', {\n attrs: {\n value: this.internalValue,\n id: this.computedId,\n disabled: this.isDisabled,\n readonly: true,\n tabindex: -1,\n ...this.$attrs,\n },\n // on: this.genListeners(), // TODO: do we need to attach the listeners to input?\n })\n },\n genTrackContainer (): VNode {\n const children = [\n this.$createElement('div', this.setBackgroundColor(this.computedTrackColor, {\n staticClass: 'v-slider__track-background',\n style: this.trackStyles,\n })),\n this.$createElement('div', this.setBackgroundColor(this.computedTrackFillColor, {\n staticClass: 'v-slider__track-fill',\n style: this.trackFillStyles,\n })),\n ]\n\n return this.$createElement('div', {\n staticClass: 'v-slider__track-container',\n ref: 'track',\n }, children)\n },\n genSteps (): VNode | null {\n if (!this.step || !this.showTicks) return null\n\n const tickSize = parseFloat(this.tickSize)\n const range = createRange(this.numTicks + 1)\n const direction = this.vertical ? 'bottom' : (this.$vuetify.rtl ? 'right' : 'left')\n const offsetDirection = this.vertical ? (this.$vuetify.rtl ? 'left' : 'right') : 'top'\n\n if (this.vertical) range.reverse()\n\n const ticks = range.map(index => {\n const children = []\n\n if (this.tickLabels[index]) {\n children.push(this.$createElement('div', {\n staticClass: 'v-slider__tick-label',\n }, this.tickLabels[index]))\n }\n\n const width = index * (100 / this.numTicks)\n const filled = this.$vuetify.rtl ? (100 - this.inputWidth) < width : width < this.inputWidth\n\n return this.$createElement('span', {\n key: index,\n staticClass: 'v-slider__tick',\n class: {\n 'v-slider__tick--filled': filled,\n },\n style: {\n width: `${tickSize}px`,\n height: `${tickSize}px`,\n [direction]: `calc(${width}% - ${tickSize / 2}px)`,\n [offsetDirection]: `calc(50% - ${tickSize / 2}px)`,\n },\n }, children)\n })\n\n return this.$createElement('div', {\n staticClass: 'v-slider__ticks-container',\n class: {\n 'v-slider__ticks-container--always-show': this.ticks === 'always' || this.tickLabels.length > 0,\n },\n }, ticks)\n },\n genThumbContainer (\n value: number,\n valueWidth: number,\n isActive: boolean,\n isFocused: boolean,\n onDrag: Function,\n onFocus: Function,\n onBlur: Function,\n ref = 'thumb'\n ): VNode {\n const children = [this.genThumb()]\n\n const thumbLabelContent = this.genThumbLabelContent(value)\n this.showThumbLabel && children.push(this.genThumbLabel(thumbLabelContent))\n\n return this.$createElement('div', this.setTextColor(this.computedThumbColor, {\n ref,\n key: ref,\n staticClass: 'v-slider__thumb-container',\n class: {\n 'v-slider__thumb-container--active': isActive,\n 'v-slider__thumb-container--focused': isFocused,\n 'v-slider__thumb-container--show-label': this.showThumbLabel,\n },\n style: this.getThumbContainerStyles(valueWidth),\n attrs: {\n role: 'slider',\n tabindex: this.isDisabled ? -1 : this.$attrs.tabindex ? this.$attrs.tabindex : 0,\n 'aria-label': this.label,\n 'aria-valuemin': this.min,\n 'aria-valuemax': this.max,\n 'aria-valuenow': this.internalValue,\n 'aria-readonly': String(this.isReadonly),\n 'aria-orientation': this.vertical ? 'vertical' : 'horizontal',\n ...this.$attrs,\n },\n on: {\n focus: onFocus,\n blur: onBlur,\n keydown: this.onKeyDown,\n keyup: this.onKeyUp,\n touchstart: onDrag,\n mousedown: onDrag,\n },\n }), children)\n },\n genThumbLabelContent (value: number | string): ScopedSlotChildren {\n return this.$scopedSlots['thumb-label']\n ? this.$scopedSlots['thumb-label']!({ value })\n : [this.$createElement('span', [String(value)])]\n },\n genThumbLabel (content: ScopedSlotChildren): VNode {\n const size = convertToUnit(this.thumbSize)\n\n const transform = this.vertical\n ? `translateY(20%) translateY(${(Number(this.thumbSize) / 3) - 1}px) translateX(55%) rotate(135deg)`\n : `translateY(-20%) translateY(-12px) translateX(-50%) rotate(45deg)`\n\n return this.$createElement(VScaleTransition, {\n props: { origin: 'bottom center' },\n }, [\n this.$createElement('div', {\n staticClass: 'v-slider__thumb-label-container',\n directives: [{\n name: 'show',\n value: this.isFocused || this.isActive || this.thumbLabel === 'always',\n }],\n }, [\n this.$createElement('div', this.setBackgroundColor(this.computedThumbColor, {\n staticClass: 'v-slider__thumb-label',\n style: {\n height: size,\n width: size,\n transform,\n },\n }), [this.$createElement('div', content)]),\n ]),\n ])\n },\n genThumb (): VNode {\n return this.$createElement('div', this.setBackgroundColor(this.computedThumbColor, {\n staticClass: 'v-slider__thumb',\n }))\n },\n getThumbContainerStyles (width: number): object {\n const direction = this.vertical ? 'top' : 'left'\n let value = this.$vuetify.rtl ? 100 - width : width\n value = this.vertical ? 100 - value : value\n\n return {\n transition: this.trackTransition,\n [direction]: `${value}%`,\n }\n },\n onThumbMouseDown (e: MouseEvent) {\n e.preventDefault()\n\n this.oldValue = this.internalValue\n this.keyPressed = 2\n this.isActive = true\n\n const mouseUpOptions = passiveSupported ? { passive: true, capture: true } : true\n const mouseMoveOptions = passiveSupported ? { passive: true } : false\n if ('touches' in e) {\n this.app.addEventListener('touchmove', this.onMouseMove, mouseMoveOptions)\n addOnceEventListener(this.app, 'touchend', this.onSliderMouseUp, mouseUpOptions)\n } else {\n this.app.addEventListener('mousemove', this.onMouseMove, mouseMoveOptions)\n addOnceEventListener(this.app, 'mouseup', this.onSliderMouseUp, mouseUpOptions)\n }\n\n this.$emit('start', this.internalValue)\n },\n onSliderMouseUp (e: Event) {\n e.stopPropagation()\n this.keyPressed = 0\n const mouseMoveOptions = passiveSupported ? { passive: true } : false\n this.app.removeEventListener('touchmove', this.onMouseMove, mouseMoveOptions)\n this.app.removeEventListener('mousemove', this.onMouseMove, mouseMoveOptions)\n\n this.$emit('mouseup', e)\n this.$emit('end', this.internalValue)\n if (!deepEqual(this.oldValue, this.internalValue)) {\n this.$emit('change', this.internalValue)\n this.noClick = true\n }\n\n this.isActive = false\n },\n onMouseMove (e: MouseEvent) {\n const { value } = this.parseMouseMove(e)\n this.internalValue = value\n },\n onKeyDown (e: KeyboardEvent) {\n if (!this.isInteractive) return\n\n const value = this.parseKeyDown(e, this.internalValue)\n\n if (\n value == null ||\n value < this.minValue ||\n value > this.maxValue\n ) return\n\n this.internalValue = value\n this.$emit('change', value)\n },\n onKeyUp () {\n this.keyPressed = 0\n },\n onSliderClick (e: MouseEvent) {\n if (this.noClick) {\n this.noClick = false\n return\n }\n const thumb = this.$refs.thumb as HTMLElement\n thumb.focus()\n\n this.onMouseMove(e)\n this.$emit('change', this.internalValue)\n },\n onBlur (e: Event) {\n this.isFocused = false\n\n this.$emit('blur', e)\n },\n onFocus (e: Event) {\n this.isFocused = true\n\n this.$emit('focus', e)\n },\n parseMouseMove (e: MouseEvent) {\n const start = this.vertical ? 'top' : 'left'\n const length = this.vertical ? 'height' : 'width'\n const click = this.vertical ? 'clientY' : 'clientX'\n\n const {\n [start]: trackStart,\n [length]: trackLength,\n } = this.$refs.track.getBoundingClientRect() as any\n const clickOffset = 'touches' in e ? (e as any).touches[0][click] : e[click] // Can we get rid of any here?\n\n // It is possible for left to be NaN, force to number\n let clickPos = Math.min(Math.max((clickOffset - trackStart) / trackLength, 0), 1) || 0\n\n if (this.vertical) clickPos = 1 - clickPos\n if (this.$vuetify.rtl) clickPos = 1 - clickPos\n\n const isInsideTrack = clickOffset >= trackStart && clickOffset <= trackStart + trackLength\n const value = parseFloat(this.min) + clickPos * (this.maxValue - this.minValue)\n\n return { value, isInsideTrack }\n },\n parseKeyDown (e: KeyboardEvent, value: number) {\n if (!this.isInteractive) return\n\n const { pageup, pagedown, end, home, left, right, down, up } = keyCodes\n\n if (![pageup, pagedown, end, home, left, right, down, up].includes(e.keyCode)) return\n\n e.preventDefault()\n const step = this.stepNumeric || 1\n const steps = (this.maxValue - this.minValue) / step\n if ([left, right, down, up].includes(e.keyCode)) {\n this.keyPressed += 1\n\n const increase = this.$vuetify.rtl ? [left, up] : [right, up]\n const direction = increase.includes(e.keyCode) ? 1 : -1\n const multiplier = e.shiftKey ? 3 : (e.ctrlKey ? 2 : 1)\n\n value = value + (direction * step * multiplier)\n } else if (e.keyCode === home) {\n value = this.minValue\n } else if (e.keyCode === end) {\n value = this.maxValue\n } else {\n const direction = e.keyCode === pagedown ? 1 : -1\n value = value - (direction * step * (steps > 100 ? steps / 10 : 10))\n }\n\n return value\n },\n roundValue (value: number): number {\n if (!this.stepNumeric) return value\n // Format input value using the same number\n // of decimals places as in the step prop\n const trimmedStep = this.step.toString().trim()\n const decimals = trimmedStep.indexOf('.') > -1\n ? (trimmedStep.length - trimmedStep.indexOf('.') - 1)\n : 0\n const offset = this.minValue % this.stepNumeric\n\n const newValue = Math.round((value - offset) / this.stepNumeric) * this.stepNumeric + offset\n\n return parseFloat(Math.min(newValue, this.maxValue).toFixed(decimals))\n },\n },\n})\n","import './_grid.sass'\nimport { createSimpleFunctional } from '../../util/helpers'\n\nexport default createSimpleFunctional('spacer', 'div', 'v-spacer')\n","import { VNodeDirective, VNode } from 'vue/types/vnode'\nimport { keys } from '../../util/helpers'\nimport { TouchHandlers, TouchValue, TouchWrapper } from 'vuetify/types'\n\nexport interface TouchStoredHandlers {\n touchstart: (e: TouchEvent) => void\n touchend: (e: TouchEvent) => void\n touchmove: (e: TouchEvent) => void\n}\n\ninterface TouchVNodeDirective extends VNodeDirective {\n value?: TouchValue\n}\n\nconst handleGesture = (wrapper: TouchWrapper) => {\n const { touchstartX, touchendX, touchstartY, touchendY } = wrapper\n const dirRatio = 0.5\n const minDistance = 16\n wrapper.offsetX = touchendX - touchstartX\n wrapper.offsetY = touchendY - touchstartY\n\n if (Math.abs(wrapper.offsetY) < dirRatio * Math.abs(wrapper.offsetX)) {\n wrapper.left && (touchendX < touchstartX - minDistance) && wrapper.left(wrapper)\n wrapper.right && (touchendX > touchstartX + minDistance) && wrapper.right(wrapper)\n }\n\n if (Math.abs(wrapper.offsetX) < dirRatio * Math.abs(wrapper.offsetY)) {\n wrapper.up && (touchendY < touchstartY - minDistance) && wrapper.up(wrapper)\n wrapper.down && (touchendY > touchstartY + minDistance) && wrapper.down(wrapper)\n }\n}\n\nfunction touchstart (event: TouchEvent, wrapper: TouchWrapper) {\n const touch = event.changedTouches[0]\n wrapper.touchstartX = touch.clientX\n wrapper.touchstartY = touch.clientY\n\n wrapper.start &&\n wrapper.start(Object.assign(event, wrapper))\n}\n\nfunction touchend (event: TouchEvent, wrapper: TouchWrapper) {\n const touch = event.changedTouches[0]\n wrapper.touchendX = touch.clientX\n wrapper.touchendY = touch.clientY\n\n wrapper.end &&\n wrapper.end(Object.assign(event, wrapper))\n\n handleGesture(wrapper)\n}\n\nfunction touchmove (event: TouchEvent, wrapper: TouchWrapper) {\n const touch = event.changedTouches[0]\n wrapper.touchmoveX = touch.clientX\n wrapper.touchmoveY = touch.clientY\n\n wrapper.move && wrapper.move(Object.assign(event, wrapper))\n}\n\nfunction createHandlers (value: TouchHandlers): TouchStoredHandlers {\n const wrapper = {\n touchstartX: 0,\n touchstartY: 0,\n touchendX: 0,\n touchendY: 0,\n touchmoveX: 0,\n touchmoveY: 0,\n offsetX: 0,\n offsetY: 0,\n left: value.left,\n right: value.right,\n up: value.up,\n down: value.down,\n start: value.start,\n move: value.move,\n end: value.end,\n }\n\n return {\n touchstart: (e: TouchEvent) => touchstart(e, wrapper),\n touchend: (e: TouchEvent) => touchend(e, wrapper),\n touchmove: (e: TouchEvent) => touchmove(e, wrapper),\n }\n}\n\nfunction inserted (el: HTMLElement, binding: TouchVNodeDirective, vnode: VNode) {\n const value = binding.value!\n const target = value.parent ? el.parentElement : el\n const options = value.options || { passive: true }\n\n // Needed to pass unit tests\n if (!target) return\n\n const handlers = createHandlers(binding.value!)\n target._touchHandlers = Object(target._touchHandlers)\n target._touchHandlers![vnode.context!._uid] = handlers\n\n keys(handlers).forEach(eventName => {\n target.addEventListener(eventName, handlers[eventName] as EventListener, options)\n })\n}\n\nfunction unbind (el: HTMLElement, binding: TouchVNodeDirective, vnode: VNode) {\n const target = binding.value!.parent ? el.parentElement : el\n if (!target || !target._touchHandlers) return\n\n const handlers = target._touchHandlers[vnode.context!._uid]\n keys(handlers).forEach(eventName => {\n target.removeEventListener(eventName, handlers[eventName])\n })\n delete target._touchHandlers[vnode.context!._uid]\n}\n\nexport const Touch = {\n inserted,\n unbind,\n}\n\nexport default Touch\n","// Styles\nimport '../../styles/components/_selection-controls.sass'\nimport './VSwitch.sass'\n\n// Mixins\nimport Selectable from '../../mixins/selectable'\nimport VInput from '../VInput'\n\n// Directives\nimport Touch from '../../directives/touch'\n\n// Components\nimport { VFabTransition } from '../transitions'\nimport VProgressCircular from '../VProgressCircular/VProgressCircular'\n\n// Helpers\nimport { keyCodes } from '../../util/helpers'\n\n// Types\nimport { VNode, VNodeData } from 'vue'\n\n/* @vue/component */\nexport default Selectable.extend({\n name: 'v-switch',\n\n directives: { Touch },\n\n props: {\n inset: Boolean,\n loading: {\n type: [Boolean, String],\n default: false,\n },\n flat: {\n type: Boolean,\n default: false,\n },\n },\n\n computed: {\n classes (): object {\n return {\n ...VInput.options.computed.classes.call(this),\n 'v-input--selection-controls v-input--switch': true,\n 'v-input--switch--flat': this.flat,\n 'v-input--switch--inset': this.inset,\n }\n },\n attrs (): object {\n return {\n 'aria-checked': String(this.isActive),\n 'aria-disabled': String(this.isDisabled),\n role: 'switch',\n }\n },\n // Do not return undefined if disabled,\n // according to spec, should still show\n // a color when disabled and active\n validationState (): string | undefined {\n if (this.hasError && this.shouldValidate) return 'error'\n if (this.hasSuccess) return 'success'\n if (this.hasColor !== null) return this.computedColor\n return undefined\n },\n switchData (): VNodeData {\n return this.setTextColor(this.loading ? undefined : this.validationState, {\n class: this.themeClasses,\n })\n },\n },\n\n methods: {\n genDefaultSlot (): (VNode | null)[] {\n return [\n this.genSwitch(),\n this.genLabel(),\n ]\n },\n genSwitch (): VNode {\n return this.$createElement('div', {\n staticClass: 'v-input--selection-controls__input',\n }, [\n this.genInput('checkbox', {\n ...this.attrs,\n ...this.attrs$,\n }),\n this.genRipple(this.setTextColor(this.validationState, {\n directives: [{\n name: 'touch',\n value: {\n left: this.onSwipeLeft,\n right: this.onSwipeRight,\n },\n }],\n })),\n this.$createElement('div', {\n staticClass: 'v-input--switch__track',\n ...this.switchData,\n }),\n this.$createElement('div', {\n staticClass: 'v-input--switch__thumb',\n ...this.switchData,\n }, [this.genProgress()]),\n ])\n },\n genProgress (): VNode {\n return this.$createElement(VFabTransition, {}, [\n this.loading === false\n ? null\n : this.$slots.progress || this.$createElement(VProgressCircular, {\n props: {\n color: (this.loading === true || this.loading === '')\n ? (this.color || 'primary')\n : this.loading,\n size: 16,\n width: 2,\n indeterminate: true,\n },\n }),\n ])\n },\n onSwipeLeft () {\n if (this.isActive) this.onChange()\n },\n onSwipeRight () {\n if (!this.isActive) this.onChange()\n },\n onKeydown (e: KeyboardEvent) {\n if (\n (e.keyCode === keyCodes.left && this.isActive) ||\n (e.keyCode === keyCodes.right && !this.isActive)\n ) this.onChange()\n },\n },\n})\n","// Styles\nimport './VToolbar.sass'\n\n// Extensions\nimport VSheet from '../VSheet/VSheet'\n\n// Components\nimport VImg, { srcObject } from '../VImg/VImg'\n\n// Utilities\nimport { convertToUnit, getSlot } from '../../util/helpers'\nimport { breaking } from '../../util/console'\n\n// Types\nimport { VNode, PropType } from 'vue'\n\n/* @vue/component */\nexport default VSheet.extend({\n name: 'v-toolbar',\n\n props: {\n absolute: Boolean,\n bottom: Boolean,\n collapse: Boolean,\n dense: Boolean,\n extended: Boolean,\n extensionHeight: {\n default: 48,\n type: [Number, String],\n },\n flat: Boolean,\n floating: Boolean,\n prominent: Boolean,\n short: Boolean,\n src: {\n type: [String, Object] as PropType,\n default: '',\n },\n tag: {\n type: String,\n default: 'header',\n },\n },\n\n data: () => ({\n isExtended: false,\n }),\n\n computed: {\n computedHeight (): number {\n const height = this.computedContentHeight\n\n if (!this.isExtended) return height\n\n const extensionHeight = parseInt(this.extensionHeight)\n\n return this.isCollapsed\n ? height\n : height + (!isNaN(extensionHeight) ? extensionHeight : 0)\n },\n computedContentHeight (): number {\n if (this.height) return parseInt(this.height)\n if (this.isProminent && this.dense) return 96\n if (this.isProminent && this.short) return 112\n if (this.isProminent) return 128\n if (this.dense) return 48\n if (this.short || this.$vuetify.breakpoint.smAndDown) return 56\n return 64\n },\n classes (): object {\n return {\n ...VSheet.options.computed.classes.call(this),\n 'v-toolbar': true,\n 'v-toolbar--absolute': this.absolute,\n 'v-toolbar--bottom': this.bottom,\n 'v-toolbar--collapse': this.collapse,\n 'v-toolbar--collapsed': this.isCollapsed,\n 'v-toolbar--dense': this.dense,\n 'v-toolbar--extended': this.isExtended,\n 'v-toolbar--flat': this.flat,\n 'v-toolbar--floating': this.floating,\n 'v-toolbar--prominent': this.isProminent,\n }\n },\n isCollapsed (): boolean {\n return this.collapse\n },\n isProminent (): boolean {\n return this.prominent\n },\n styles (): object {\n return {\n ...this.measurableStyles,\n height: convertToUnit(this.computedHeight),\n }\n },\n },\n\n created () {\n const breakingProps = [\n ['app', ''],\n ['manual-scroll', ''],\n ['clipped-left', ''],\n ['clipped-right', ''],\n ['inverted-scroll', ''],\n ['scroll-off-screen', ''],\n ['scroll-target', ''],\n ['scroll-threshold', ''],\n ['card', ''],\n ]\n\n /* istanbul ignore next */\n breakingProps.forEach(([original, replacement]) => {\n if (this.$attrs.hasOwnProperty(original)) breaking(original, replacement, this)\n })\n },\n\n methods: {\n genBackground () {\n const props = {\n height: convertToUnit(this.computedHeight),\n src: this.src,\n }\n\n const image = this.$scopedSlots.img\n ? this.$scopedSlots.img({ props })\n : this.$createElement(VImg, { props })\n\n return this.$createElement('div', {\n staticClass: 'v-toolbar__image',\n }, [image])\n },\n genContent () {\n return this.$createElement('div', {\n staticClass: 'v-toolbar__content',\n style: {\n height: convertToUnit(this.computedContentHeight),\n },\n }, getSlot(this))\n },\n genExtension () {\n return this.$createElement('div', {\n staticClass: 'v-toolbar__extension',\n style: {\n height: convertToUnit(this.extensionHeight),\n },\n }, getSlot(this, 'extension'))\n },\n },\n\n render (h): VNode {\n this.isExtended = this.extended || !!this.$scopedSlots.extension\n\n const children = [this.genContent()]\n const data = this.setBackgroundColor(this.color, {\n class: this.classes,\n style: this.styles,\n on: this.$listeners,\n })\n\n if (this.isExtended) children.push(this.genExtension())\n if (this.src || this.$scopedSlots.img) children.unshift(this.genBackground())\n\n return h(this.tag, data, children)\n },\n})\n","// Components\nimport VToolbar from './VToolbar'\n\n// Utilities\nimport { createSimpleFunctional } from '../../util/helpers'\n\nconst VToolbarTitle = createSimpleFunctional('v-toolbar__title')\nconst VToolbarItems = createSimpleFunctional('v-toolbar__items')\n\nexport {\n VToolbar,\n VToolbarItems,\n VToolbarTitle,\n}\n\nexport default {\n $_vuetify_subcomponents: {\n VToolbar,\n VToolbarItems,\n VToolbarTitle,\n },\n}\n","import { render, staticRenderFns } from \"./DesignEditor.vue?vue&type=template&id=543d8d62&scoped=true&\"\nimport script from \"./DesignEditor.vue?vue&type=script&lang=js&\"\nexport * from \"./DesignEditor.vue?vue&type=script&lang=js&\"\nimport style0 from \"./DesignEditor.vue?vue&type=style&index=0&id=543d8d62&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"543d8d62\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VAutocomplete } from 'vuetify/lib/components/VAutocomplete';\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardActions } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCheckbox } from 'vuetify/lib/components/VCheckbox';\nimport { VCol } from 'vuetify/lib/components/VGrid';\nimport { VContainer } from 'vuetify/lib/components/VGrid';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VImg } from 'vuetify/lib/components/VImg';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListGroup } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemAvatar } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VProgressLinear } from 'vuetify/lib/components/VProgressLinear';\nimport { VRow } from 'vuetify/lib/components/VGrid';\nimport { VSimpleTable } from 'vuetify/lib/components/VDataTable';\nimport { VSkeletonLoader } from 'vuetify/lib/components/VSkeletonLoader';\nimport { VSlider } from 'vuetify/lib/components/VSlider';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\nimport { VSwitch } from 'vuetify/lib/components/VSwitch';\nimport { VToolbar } from 'vuetify/lib/components/VToolbar';\nimport { VToolbarTitle } from 'vuetify/lib/components/VToolbar';\ninstallComponents(component, {VAutocomplete,VBtn,VCard,VCardActions,VCardText,VCheckbox,VCol,VContainer,VDialog,VDivider,VIcon,VImg,VList,VListGroup,VListItem,VListItemAvatar,VListItemContent,VListItemTitle,VProgressLinear,VRow,VSimpleTable,VSkeletonLoader,VSlider,VSpacer,VSwitch,VToolbar,VToolbarTitle})\n\n\n/* vuetify-loader */\nimport installDirectives from \"!../../../node_modules/vuetify-loader/lib/runtime/installDirectives.js\"\nimport Ripple from 'vuetify/lib/directives/ripple'\ninstallDirectives(component, {Ripple})\n","import VResponsive from './VResponsive'\n\nexport { VResponsive }\nexport default VResponsive\n","/* build: `node build.js modules=ALL exclude=gestures,accessors requirejs minifier=uglifyjs` */\n/*! Fabric.js Copyright 2008-2015, Printio (Juriy Zaytsev, Maxim Chernyak) */\n\nvar fabric = fabric || { version: '3.6.3' };\nif (typeof exports !== 'undefined') {\n exports.fabric = fabric;\n}\n/* _AMD_START_ */\nelse if (typeof define === 'function' && define.amd) {\n define([], function() { return fabric; });\n}\n/* _AMD_END_ */\nif (typeof document !== 'undefined' && typeof window !== 'undefined') {\n if (document instanceof (typeof HTMLDocument !== 'undefined' ? HTMLDocument : Document)) {\n fabric.document = document;\n }\n else {\n fabric.document = document.implementation.createHTMLDocument('');\n }\n fabric.window = window;\n}\nelse {\n // assume we're running under node.js when document/window are not present\n var jsdom = require('jsdom');\n var virtualWindow = new jsdom.JSDOM(\n decodeURIComponent('%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E'),\n {\n features: {\n FetchExternalResources: ['img']\n },\n resources: 'usable'\n }).window;\n fabric.document = virtualWindow.document;\n fabric.jsdomImplForWrapper = require('jsdom/lib/jsdom/living/generated/utils').implForWrapper;\n fabric.nodeCanvas = require('jsdom/lib/jsdom/utils').Canvas;\n fabric.window = virtualWindow;\n DOMParser = fabric.window.DOMParser;\n}\n\n/**\n * True when in environment that supports touch events\n * @type boolean\n */\nfabric.isTouchSupported = 'ontouchstart' in fabric.window || 'ontouchstart' in fabric.document ||\n (fabric.window && fabric.window.navigator && fabric.window.navigator.maxTouchPoints > 0);\n\n/**\n * True when in environment that's probably Node.js\n * @type boolean\n */\nfabric.isLikelyNode = typeof Buffer !== 'undefined' &&\n typeof window === 'undefined';\n\n/* _FROM_SVG_START_ */\n/**\n * Attributes parsed from all SVG elements\n * @type array\n */\nfabric.SHARED_ATTRIBUTES = [\n 'display',\n 'transform',\n 'fill', 'fill-opacity', 'fill-rule',\n 'opacity',\n 'stroke', 'stroke-dasharray', 'stroke-linecap', 'stroke-dashoffset',\n 'stroke-linejoin', 'stroke-miterlimit',\n 'stroke-opacity', 'stroke-width',\n 'id', 'paint-order', 'vector-effect',\n 'instantiated_by_use', 'clip-path'\n];\n/* _FROM_SVG_END_ */\n\n/**\n * Pixel per Inch as a default value set to 96. Can be changed for more realistic conversion.\n */\nfabric.DPI = 96;\nfabric.reNum = '(?:[-+]?(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[eE][-+]?\\\\d+)?)';\nfabric.rePathCommand = /([-+]?((\\d+\\.\\d+)|((\\d+)|(\\.\\d+)))(?:[eE][-+]?\\d+)?)/ig;\nfabric.reNonWord = /[ \\n\\.,;!\\?\\-]/;\nfabric.fontPaths = { };\nfabric.iMatrix = [1, 0, 0, 1, 0, 0];\nfabric.svgNS = 'http://www.w3.org/2000/svg';\n\n/**\n * Pixel limit for cache canvases. 1Mpx , 4Mpx should be fine.\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.perfLimitSizeTotal = 2097152;\n\n/**\n * Pixel limit for cache canvases width or height. IE fixes the maximum at 5000\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.maxCacheSideLimit = 4096;\n\n/**\n * Lowest pixel limit for cache canvases, set at 256PX\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.minCacheSideLimit = 256;\n\n/**\n * Cache Object for widths of chars in text rendering.\n */\nfabric.charWidthsCache = { };\n\n/**\n * if webgl is enabled and available, textureSize will determine the size\n * of the canvas backend\n * @since 2.0.0\n * @type Number\n * @default\n */\nfabric.textureSize = 2048;\n\n/**\n * When 'true', style information is not retained when copy/pasting text, making\n * pasted text use destination style.\n * Defaults to 'false'.\n * @type Boolean\n * @default\n */\nfabric.disableStyleCopyPaste = false;\n\n/**\n * Enable webgl for filtering picture is available\n * A filtering backend will be initialized, this will both take memory and\n * time since a default 2048x2048 canvas will be created for the gl context\n * @since 2.0.0\n * @type Boolean\n * @default\n */\nfabric.enableGLFiltering = true;\n\n/**\n * Device Pixel Ratio\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n */\nfabric.devicePixelRatio = fabric.window.devicePixelRatio ||\n fabric.window.webkitDevicePixelRatio ||\n fabric.window.mozDevicePixelRatio ||\n 1;\n/**\n * Browser-specific constant to adjust CanvasRenderingContext2D.shadowBlur value,\n * which is unitless and not rendered equally across browsers.\n *\n * Values that work quite well (as of October 2017) are:\n * - Chrome: 1.5\n * - Edge: 1.75\n * - Firefox: 0.9\n * - Safari: 0.95\n *\n * @since 2.0.0\n * @type Number\n * @default 1\n */\nfabric.browserShadowBlurConstant = 1;\n\n/**\n * This object contains the result of arc to beizer conversion for faster retrieving if the same arc needs to be converted again.\n * It was an internal variable, is accessible since version 2.3.4\n */\nfabric.arcToSegmentsCache = { };\n\n/**\n * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it.\n * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing\n * you do not get any speed benefit and you get a big object in memory.\n * The object was a private variable before, while now is appended to the lib so that you have access to it and you\n * can eventually clear it.\n * It was an internal variable, is accessible since version 2.3.4\n */\nfabric.boundsOfCurveCache = { };\n\n/**\n * If disabled boundsOfCurveCache is not used. For apps that make heavy usage of pencil drawing probably disabling it is better\n * @default true\n */\nfabric.cachesBoundsOfCurve = true;\n\n/**\n * Skip performance testing of setupGLContext and force the use of putImageData that seems to be the one that works best on\n * Chrome + old hardware. if your users are experiencing empty images after filtering you may try to force this to true\n * this has to be set before instantiating the filtering backend ( before filtering the first image )\n * @type Boolean\n * @default false\n */\nfabric.forceGLPutImageData = false;\n\nfabric.initFilterBackend = function() {\n if (fabric.enableGLFiltering && fabric.isWebglSupported && fabric.isWebglSupported(fabric.textureSize)) {\n console.log('max texture size: ' + fabric.maxTextureSize);\n return (new fabric.WebglFilterBackend({ tileSize: fabric.textureSize }));\n }\n else if (fabric.Canvas2dFilterBackend) {\n return (new fabric.Canvas2dFilterBackend());\n }\n};\n\n\nif (typeof document !== 'undefined' && typeof window !== 'undefined') {\n // ensure globality even if entire library were function wrapped (as in Meteor.js packaging system)\n window.fabric = fabric;\n}\n\n\n(function() {\n\n /**\n * @private\n * @param {String} eventName\n * @param {Function} handler\n */\n function _removeEventListener(eventName, handler) {\n if (!this.__eventListeners[eventName]) {\n return;\n }\n var eventListener = this.__eventListeners[eventName];\n if (handler) {\n eventListener[eventListener.indexOf(handler)] = false;\n }\n else {\n fabric.util.array.fill(eventListener, false);\n }\n }\n\n /**\n * Observes specified event\n * @deprecated `observe` deprecated since 0.8.34 (use `on` instead)\n * @memberOf fabric.Observable\n * @alias on\n * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Self} thisArg\n * @chainable\n */\n function observe(eventName, handler) {\n if (!this.__eventListeners) {\n this.__eventListeners = { };\n }\n // one object with key/value pairs was passed\n if (arguments.length === 1) {\n for (var prop in eventName) {\n this.on(prop, eventName[prop]);\n }\n }\n else {\n if (!this.__eventListeners[eventName]) {\n this.__eventListeners[eventName] = [];\n }\n this.__eventListeners[eventName].push(handler);\n }\n return this;\n }\n\n /**\n * Stops event observing for a particular event handler. Calling this method\n * without arguments removes all handlers for all events\n * @deprecated `stopObserving` deprecated since 0.8.34 (use `off` instead)\n * @memberOf fabric.Observable\n * @alias off\n * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function to be deleted from EventListeners\n * @return {Self} thisArg\n * @chainable\n */\n function stopObserving(eventName, handler) {\n if (!this.__eventListeners) {\n return this;\n }\n\n // remove all key/value pairs (event name -> event handler)\n if (arguments.length === 0) {\n for (eventName in this.__eventListeners) {\n _removeEventListener.call(this, eventName);\n }\n }\n // one object with key/value pairs was passed\n else if (arguments.length === 1 && typeof arguments[0] === 'object') {\n for (var prop in eventName) {\n _removeEventListener.call(this, prop, eventName[prop]);\n }\n }\n else {\n _removeEventListener.call(this, eventName, handler);\n }\n return this;\n }\n\n /**\n * Fires event with an optional options object\n * @deprecated `fire` deprecated since 1.0.7 (use `trigger` instead)\n * @memberOf fabric.Observable\n * @alias trigger\n * @param {String} eventName Event name to fire\n * @param {Object} [options] Options object\n * @return {Self} thisArg\n * @chainable\n */\n function fire(eventName, options) {\n if (!this.__eventListeners) {\n return this;\n }\n\n var listenersForEvent = this.__eventListeners[eventName];\n if (!listenersForEvent) {\n return this;\n }\n\n for (var i = 0, len = listenersForEvent.length; i < len; i++) {\n listenersForEvent[i] && listenersForEvent[i].call(this, options || { });\n }\n this.__eventListeners[eventName] = listenersForEvent.filter(function(value) {\n return value !== false;\n });\n return this;\n }\n\n /**\n * @namespace fabric.Observable\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#events}\n * @see {@link http://fabricjs.com/events|Events demo}\n */\n fabric.Observable = {\n observe: observe,\n stopObserving: stopObserving,\n fire: fire,\n\n on: observe,\n off: stopObserving,\n trigger: fire\n };\n})();\n\n\n/**\n * @namespace fabric.Collection\n */\nfabric.Collection = {\n\n _objects: [],\n\n /**\n * Adds objects to collection, Canvas or Group, then renders canvas\n * (if `renderOnAddRemove` is not `false`).\n * in case of Group no changes to bounding box are made.\n * Objects should be instances of (or inherit from) fabric.Object\n * Use of this function is highly discouraged for groups.\n * you can add a bunch of objects with the add method but then you NEED\n * to run a addWithUpdate call for the Group class or position/bbox will be wrong.\n * @param {...fabric.Object} object Zero or more fabric instances\n * @return {Self} thisArg\n * @chainable\n */\n add: function () {\n this._objects.push.apply(this._objects, arguments);\n if (this._onObjectAdded) {\n for (var i = 0, length = arguments.length; i < length; i++) {\n this._onObjectAdded(arguments[i]);\n }\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Inserts an object into collection at specified index, then renders canvas (if `renderOnAddRemove` is not `false`)\n * An object should be an instance of (or inherit from) fabric.Object\n * Use of this function is highly discouraged for groups.\n * you can add a bunch of objects with the insertAt method but then you NEED\n * to run a addWithUpdate call for the Group class or position/bbox will be wrong.\n * @param {Object} object Object to insert\n * @param {Number} index Index to insert object at\n * @param {Boolean} nonSplicing When `true`, no splicing (shifting) of objects occurs\n * @return {Self} thisArg\n * @chainable\n */\n insertAt: function (object, index, nonSplicing) {\n var objects = this._objects;\n if (nonSplicing) {\n objects[index] = object;\n }\n else {\n objects.splice(index, 0, object);\n }\n this._onObjectAdded && this._onObjectAdded(object);\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Removes objects from a collection, then renders canvas (if `renderOnAddRemove` is not `false`)\n * @param {...fabric.Object} object Zero or more fabric instances\n * @return {Self} thisArg\n * @chainable\n */\n remove: function() {\n var objects = this._objects,\n index, somethingRemoved = false;\n\n for (var i = 0, length = arguments.length; i < length; i++) {\n index = objects.indexOf(arguments[i]);\n\n // only call onObjectRemoved if an object was actually removed\n if (index !== -1) {\n somethingRemoved = true;\n objects.splice(index, 1);\n this._onObjectRemoved && this._onObjectRemoved(arguments[i]);\n }\n }\n\n this.renderOnAddRemove && somethingRemoved && this.requestRenderAll();\n return this;\n },\n\n /**\n * Executes given function for each object in this group\n * @param {Function} callback\n * Callback invoked with current object as first argument,\n * index - as second and an array of all objects - as third.\n * Callback is invoked in a context of Global Object (e.g. `window`)\n * when no `context` argument is given\n *\n * @param {Object} context Context (aka thisObject)\n * @return {Self} thisArg\n * @chainable\n */\n forEachObject: function(callback, context) {\n var objects = this.getObjects();\n for (var i = 0, len = objects.length; i < len; i++) {\n callback.call(context, objects[i], i, objects);\n }\n return this;\n },\n\n /**\n * Returns an array of children objects of this instance\n * Type parameter introduced in 1.3.10\n * since 2.3.5 this method return always a COPY of the array;\n * @param {String} [type] When specified, only objects of this type are returned\n * @return {Array}\n */\n getObjects: function(type) {\n if (typeof type === 'undefined') {\n return this._objects.concat();\n }\n return this._objects.filter(function(o) {\n return o.type === type;\n });\n },\n\n /**\n * Returns object at specified index\n * @param {Number} index\n * @return {Self} thisArg\n */\n item: function (index) {\n return this._objects[index];\n },\n\n /**\n * Returns true if collection contains no objects\n * @return {Boolean} true if collection is empty\n */\n isEmpty: function () {\n return this._objects.length === 0;\n },\n\n /**\n * Returns a size of a collection (i.e: length of an array containing its objects)\n * @return {Number} Collection size\n */\n size: function() {\n return this._objects.length;\n },\n\n /**\n * Returns true if collection contains an object\n * @param {Object} object Object to check against\n * @return {Boolean} `true` if collection contains an object\n */\n contains: function(object) {\n return this._objects.indexOf(object) > -1;\n },\n\n /**\n * Returns number representation of a collection complexity\n * @return {Number} complexity\n */\n complexity: function () {\n return this._objects.reduce(function (memo, current) {\n memo += current.complexity ? current.complexity() : 0;\n return memo;\n }, 0);\n }\n};\n\n\n/**\n * @namespace fabric.CommonMethods\n */\nfabric.CommonMethods = {\n\n /**\n * Sets object's properties from options\n * @param {Object} [options] Options object\n */\n _setOptions: function(options) {\n for (var prop in options) {\n this.set(prop, options[prop]);\n }\n },\n\n /**\n * @private\n * @param {Object} [filler] Options object\n * @param {String} [property] property to set the Gradient to\n */\n _initGradient: function(filler, property) {\n if (filler && filler.colorStops && !(filler instanceof fabric.Gradient)) {\n this.set(property, new fabric.Gradient(filler));\n }\n },\n\n /**\n * @private\n * @param {Object} [filler] Options object\n * @param {String} [property] property to set the Pattern to\n * @param {Function} [callback] callback to invoke after pattern load\n */\n _initPattern: function(filler, property, callback) {\n if (filler && filler.source && !(filler instanceof fabric.Pattern)) {\n this.set(property, new fabric.Pattern(filler, callback));\n }\n else {\n callback && callback();\n }\n },\n\n /**\n * @private\n * @param {Object} [options] Options object\n */\n _initClipping: function(options) {\n if (!options.clipTo || typeof options.clipTo !== 'string') {\n return;\n }\n\n var functionBody = fabric.util.getFunctionBody(options.clipTo);\n if (typeof functionBody !== 'undefined') {\n this.clipTo = new Function('ctx', functionBody);\n }\n },\n\n /**\n * @private\n */\n _setObject: function(obj) {\n for (var prop in obj) {\n this._set(prop, obj[prop]);\n }\n },\n\n /**\n * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n set: function(key, value) {\n if (typeof key === 'object') {\n this._setObject(key);\n }\n else {\n if (typeof value === 'function' && key !== 'clipTo') {\n this._set(key, value(this.get(key)));\n }\n else {\n this._set(key, value);\n }\n }\n return this;\n },\n\n _set: function(key, value) {\n this[key] = value;\n },\n\n /**\n * Toggles specified property from `true` to `false` or from `false` to `true`\n * @param {String} property Property to toggle\n * @return {fabric.Object} thisArg\n * @chainable\n */\n toggle: function(property) {\n var value = this.get(property);\n if (typeof value === 'boolean') {\n this.set(property, !value);\n }\n return this;\n },\n\n /**\n * Basic getter\n * @param {String} property Property name\n * @return {*} value of a property\n */\n get: function(property) {\n return this[property];\n }\n};\n\n\n(function(global) {\n\n var sqrt = Math.sqrt,\n atan2 = Math.atan2,\n pow = Math.pow,\n PiBy180 = Math.PI / 180,\n PiBy2 = Math.PI / 2;\n\n /**\n * @namespace fabric.util\n */\n fabric.util = {\n\n /**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * @static\n * @memberOf fabric.util\n * @param {Number} angle the angle in radians or in degree\n * @return {Number}\n */\n cos: function(angle) {\n if (angle === 0) { return 1; }\n if (angle < 0) {\n // cos(a) = cos(-a)\n angle = -angle;\n }\n var angleSlice = angle / PiBy2;\n switch (angleSlice) {\n case 1: case 3: return 0;\n case 2: return -1;\n }\n return Math.cos(angle);\n },\n\n /**\n * Calculate the sin of an angle, avoiding returning floats for known results\n * @static\n * @memberOf fabric.util\n * @param {Number} angle the angle in radians or in degree\n * @return {Number}\n */\n sin: function(angle) {\n if (angle === 0) { return 0; }\n var angleSlice = angle / PiBy2, sign = 1;\n if (angle < 0) {\n // sin(-a) = -sin(a)\n sign = -1;\n }\n switch (angleSlice) {\n case 1: return sign;\n case 2: return 0;\n case 3: return -sign;\n }\n return Math.sin(angle);\n },\n\n /**\n * Removes value from an array.\n * Presence of value (and its position in an array) is determined via `Array.prototype.indexOf`\n * @static\n * @memberOf fabric.util\n * @param {Array} array\n * @param {*} value\n * @return {Array} original array\n */\n removeFromArray: function(array, value) {\n var idx = array.indexOf(value);\n if (idx !== -1) {\n array.splice(idx, 1);\n }\n return array;\n },\n\n /**\n * Returns random number between 2 specified ones.\n * @static\n * @memberOf fabric.util\n * @param {Number} min lower limit\n * @param {Number} max upper limit\n * @return {Number} random value (between min and max)\n */\n getRandomInt: function(min, max) {\n return Math.floor(Math.random() * (max - min + 1)) + min;\n },\n\n /**\n * Transforms degrees to radians.\n * @static\n * @memberOf fabric.util\n * @param {Number} degrees value in degrees\n * @return {Number} value in radians\n */\n degreesToRadians: function(degrees) {\n return degrees * PiBy180;\n },\n\n /**\n * Transforms radians to degrees.\n * @static\n * @memberOf fabric.util\n * @param {Number} radians value in radians\n * @return {Number} value in degrees\n */\n radiansToDegrees: function(radians) {\n return radians / PiBy180;\n },\n\n /**\n * Rotates `point` around `origin` with `radians`\n * @static\n * @memberOf fabric.util\n * @param {fabric.Point} point The point to rotate\n * @param {fabric.Point} origin The origin of the rotation\n * @param {Number} radians The radians of the angle for the rotation\n * @return {fabric.Point} The new rotated point\n */\n rotatePoint: function(point, origin, radians) {\n point.subtractEquals(origin);\n var v = fabric.util.rotateVector(point, radians);\n return new fabric.Point(v.x, v.y).addEquals(origin);\n },\n\n /**\n * Rotates `vector` with `radians`\n * @static\n * @memberOf fabric.util\n * @param {Object} vector The vector to rotate (x and y)\n * @param {Number} radians The radians of the angle for the rotation\n * @return {Object} The new rotated point\n */\n rotateVector: function(vector, radians) {\n var sin = fabric.util.sin(radians),\n cos = fabric.util.cos(radians),\n rx = vector.x * cos - vector.y * sin,\n ry = vector.x * sin + vector.y * cos;\n return {\n x: rx,\n y: ry\n };\n },\n\n /**\n * Apply transform t to point p\n * @static\n * @memberOf fabric.util\n * @param {fabric.Point} p The point to transform\n * @param {Array} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {fabric.Point} The transformed point\n */\n transformPoint: function(p, t, ignoreOffset) {\n if (ignoreOffset) {\n return new fabric.Point(\n t[0] * p.x + t[2] * p.y,\n t[1] * p.x + t[3] * p.y\n );\n }\n return new fabric.Point(\n t[0] * p.x + t[2] * p.y + t[4],\n t[1] * p.x + t[3] * p.y + t[5]\n );\n },\n\n /**\n * Returns coordinates of points's bounding rectangle (left, top, width, height)\n * @param {Array} points 4 points array\n * @param {Array} [transform] an array of 6 numbers representing a 2x3 transform matrix\n * @return {Object} Object with left, top, width, height properties\n */\n makeBoundingBoxFromPoints: function(points, transform) {\n if (transform) {\n for (var i = 0; i < points.length; i++) {\n points[i] = fabric.util.transformPoint(points[i], transform);\n }\n }\n var xPoints = [points[0].x, points[1].x, points[2].x, points[3].x],\n minX = fabric.util.array.min(xPoints),\n maxX = fabric.util.array.max(xPoints),\n width = maxX - minX,\n yPoints = [points[0].y, points[1].y, points[2].y, points[3].y],\n minY = fabric.util.array.min(yPoints),\n maxY = fabric.util.array.max(yPoints),\n height = maxY - minY;\n\n return {\n left: minX,\n top: minY,\n width: width,\n height: height\n };\n },\n\n /**\n * Invert transformation t\n * @static\n * @memberOf fabric.util\n * @param {Array} t The transform\n * @return {Array} The inverted transform\n */\n invertTransform: function(t) {\n var a = 1 / (t[0] * t[3] - t[1] * t[2]),\n r = [a * t[3], -a * t[1], -a * t[2], a * t[0]],\n o = fabric.util.transformPoint({ x: t[4], y: t[5] }, r, true);\n r[4] = -o.x;\n r[5] = -o.y;\n return r;\n },\n\n /**\n * A wrapper around Number#toFixed, which contrary to native method returns number, not string.\n * @static\n * @memberOf fabric.util\n * @param {Number|String} number number to operate on\n * @param {Number} fractionDigits number of fraction digits to \"leave\"\n * @return {Number}\n */\n toFixed: function(number, fractionDigits) {\n return parseFloat(Number(number).toFixed(fractionDigits));\n },\n\n /**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {Number|String} value number to operate on\n * @param {Number} fontSize\n * @return {Number|String}\n */\n parseUnit: function(value, fontSize) {\n var unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n if (!fontSize) {\n fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE;\n }\n switch (unit[0]) {\n case 'mm':\n return number * fabric.DPI / 25.4;\n\n case 'cm':\n return number * fabric.DPI / 2.54;\n\n case 'in':\n return number * fabric.DPI;\n\n case 'pt':\n return number * fabric.DPI / 72; // or * 4 / 3\n\n case 'pc':\n return number * fabric.DPI / 72 * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n },\n\n /**\n * Function which always returns `false`.\n * @static\n * @memberOf fabric.util\n * @return {Boolean}\n */\n falseFunction: function() {\n return false;\n },\n\n /**\n * Returns klass \"Class\" object of given namespace\n * @memberOf fabric.util\n * @param {String} type Type of object (eg. 'circle')\n * @param {String} namespace Namespace to get klass \"Class\" object from\n * @return {Object} klass \"Class\"\n */\n getKlass: function(type, namespace) {\n // capitalize first letter only\n type = fabric.util.string.camelize(type.charAt(0).toUpperCase() + type.slice(1));\n return fabric.util.resolveNamespace(namespace)[type];\n },\n\n /**\n * Returns array of attributes for given svg that fabric parses\n * @memberOf fabric.util\n * @param {String} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\n getSvgAttributes: function(type) {\n var attributes = [\n 'instantiated_by_use',\n 'style',\n 'id',\n 'class'\n ];\n switch (type) {\n case 'linearGradient':\n attributes = attributes.concat(['x1', 'y1', 'x2', 'y2', 'gradientUnits', 'gradientTransform']);\n break;\n case 'radialGradient':\n attributes = attributes.concat(['gradientUnits', 'gradientTransform', 'cx', 'cy', 'r', 'fx', 'fy', 'fr']);\n break;\n case 'stop':\n attributes = attributes.concat(['offset', 'stop-color', 'stop-opacity']);\n break;\n }\n return attributes;\n },\n\n /**\n * Returns object of given namespace\n * @memberOf fabric.util\n * @param {String} namespace Namespace string e.g. 'fabric.Image.filter' or 'fabric'\n * @return {Object} Object for given namespace (default fabric)\n */\n resolveNamespace: function(namespace) {\n if (!namespace) {\n return fabric;\n }\n\n var parts = namespace.split('.'),\n len = parts.length, i,\n obj = global || fabric.window;\n\n for (i = 0; i < len; ++i) {\n obj = obj[parts[i]];\n }\n\n return obj;\n },\n\n /**\n * Loads image element from given url and passes it to a callback\n * @memberOf fabric.util\n * @param {String} url URL representing an image\n * @param {Function} callback Callback; invoked with loaded image\n * @param {*} [context] Context to invoke callback in\n * @param {Object} [crossOrigin] crossOrigin value to set image element to\n */\n loadImage: function(url, callback, context, crossOrigin) {\n if (!url) {\n callback && callback.call(context, url);\n return;\n }\n\n var img = fabric.util.createImage();\n\n /** @ignore */\n var onLoadCallback = function () {\n callback && callback.call(context, img);\n img = img.onload = img.onerror = null;\n };\n\n img.onload = onLoadCallback;\n /** @ignore */\n img.onerror = function() {\n fabric.log('Error loading ' + img.src);\n callback && callback.call(context, null, true);\n img = img.onload = img.onerror = null;\n };\n\n // data-urls appear to be buggy with crossOrigin\n // https://github.com/kangax/fabric.js/commit/d0abb90f1cd5c5ef9d2a94d3fb21a22330da3e0a#commitcomment-4513767\n // see https://code.google.com/p/chromium/issues/detail?id=315152\n // https://bugzilla.mozilla.org/show_bug.cgi?id=935069\n if (url.indexOf('data') !== 0 && crossOrigin) {\n img.crossOrigin = crossOrigin;\n }\n\n // IE10 / IE11-Fix: SVG contents from data: URI\n // will only be available if the IMG is present\n // in the DOM (and visible)\n if (url.substring(0,14) === 'data:image/svg') {\n img.onload = null;\n fabric.util.loadImageInDom(img, onLoadCallback);\n }\n\n img.src = url;\n },\n\n /**\n * Attaches SVG image with data: URL to the dom\n * @memberOf fabric.util\n * @param {Object} img Image object with data:image/svg src\n * @param {Function} callback Callback; invoked with loaded image\n * @return {Object} DOM element (div containing the SVG image)\n */\n loadImageInDom: function(img, onLoadCallback) {\n var div = fabric.document.createElement('div');\n div.style.width = div.style.height = '1px';\n div.style.left = div.style.top = '-100%';\n div.style.position = 'absolute';\n div.appendChild(img);\n fabric.document.querySelector('body').appendChild(div);\n /**\n * Wrap in function to:\n * 1. Call existing callback\n * 2. Cleanup DOM\n */\n img.onload = function () {\n onLoadCallback();\n div.parentNode.removeChild(div);\n div = null;\n };\n },\n\n /**\n * Creates corresponding fabric instances from their object representations\n * @static\n * @memberOf fabric.util\n * @param {Array} objects Objects to enliven\n * @param {Function} callback Callback to invoke when all objects are created\n * @param {String} namespace Namespace to get klass \"Class\" object from\n * @param {Function} reviver Method for further parsing of object elements,\n * called after each fabric object created.\n */\n enlivenObjects: function(objects, callback, namespace, reviver) {\n objects = objects || [];\n\n var enlivenedObjects = [],\n numLoadedObjects = 0,\n numTotalObjects = objects.length;\n\n function onLoaded() {\n if (++numLoadedObjects === numTotalObjects) {\n callback && callback(enlivenedObjects.filter(function(obj) {\n // filter out undefined objects (objects that gave error)\n return obj;\n }));\n }\n }\n\n if (!numTotalObjects) {\n callback && callback(enlivenedObjects);\n return;\n }\n\n objects.forEach(function (o, index) {\n // if sparse array\n if (!o || !o.type) {\n onLoaded();\n return;\n }\n var klass = fabric.util.getKlass(o.type, namespace);\n klass.fromObject(o, function (obj, error) {\n error || (enlivenedObjects[index] = obj);\n reviver && reviver(o, obj, error);\n onLoaded();\n });\n });\n },\n\n /**\n * Create and wait for loading of patterns\n * @static\n * @memberOf fabric.util\n * @param {Array} patterns Objects to enliven\n * @param {Function} callback Callback to invoke when all objects are created\n * called after each fabric object created.\n */\n enlivenPatterns: function(patterns, callback) {\n patterns = patterns || [];\n\n function onLoaded() {\n if (++numLoadedPatterns === numPatterns) {\n callback && callback(enlivenedPatterns);\n }\n }\n\n var enlivenedPatterns = [],\n numLoadedPatterns = 0,\n numPatterns = patterns.length;\n\n if (!numPatterns) {\n callback && callback(enlivenedPatterns);\n return;\n }\n\n patterns.forEach(function (p, index) {\n if (p && p.source) {\n new fabric.Pattern(p, function(pattern) {\n enlivenedPatterns[index] = pattern;\n onLoaded();\n });\n }\n else {\n enlivenedPatterns[index] = p;\n onLoaded();\n }\n });\n },\n\n /**\n * Groups SVG elements (usually those retrieved from SVG document)\n * @static\n * @memberOf fabric.util\n * @param {Array} elements SVG elements to group\n * @param {Object} [options] Options object\n * @param {String} path Value to set sourcePath to\n * @return {fabric.Object|fabric.Group}\n */\n groupSVGElements: function(elements, options, path) {\n var object;\n if (elements && elements.length === 1) {\n return elements[0];\n }\n if (options) {\n if (options.width && options.height) {\n options.centerPoint = {\n x: options.width / 2,\n y: options.height / 2\n };\n }\n else {\n delete options.width;\n delete options.height;\n }\n }\n object = new fabric.Group(elements, options);\n if (typeof path !== 'undefined') {\n object.sourcePath = path;\n }\n return object;\n },\n\n /**\n * Populates an object with properties of another object\n * @static\n * @memberOf fabric.util\n * @param {Object} source Source object\n * @param {Object} destination Destination object\n * @return {Array} properties Properties names to include\n */\n populateWithProperties: function(source, destination, properties) {\n if (properties && Object.prototype.toString.call(properties) === '[object Array]') {\n for (var i = 0, len = properties.length; i < len; i++) {\n if (properties[i] in source) {\n destination[properties[i]] = source[properties[i]];\n }\n }\n }\n },\n\n /**\n * Draws a dashed line between two points\n *\n * This method is used to draw dashed line around selection area.\n * See dotted stroke in canvas\n *\n * @param {CanvasRenderingContext2D} ctx context\n * @param {Number} x start x coordinate\n * @param {Number} y start y coordinate\n * @param {Number} x2 end x coordinate\n * @param {Number} y2 end y coordinate\n * @param {Array} da dash array pattern\n */\n drawDashedLine: function(ctx, x, y, x2, y2, da) {\n var dx = x2 - x,\n dy = y2 - y,\n len = sqrt(dx * dx + dy * dy),\n rot = atan2(dy, dx),\n dc = da.length,\n di = 0,\n draw = true;\n\n ctx.save();\n ctx.translate(x, y);\n ctx.moveTo(0, 0);\n ctx.rotate(rot);\n\n x = 0;\n while (len > x) {\n x += da[di++ % dc];\n if (x > len) {\n x = len;\n }\n ctx[draw ? 'lineTo' : 'moveTo'](x, 0);\n draw = !draw;\n }\n\n ctx.restore();\n },\n\n /**\n * Creates canvas element\n * @static\n * @memberOf fabric.util\n * @return {CanvasElement} initialized canvas element\n */\n createCanvasElement: function() {\n return fabric.document.createElement('canvas');\n },\n\n /**\n * Creates a canvas element that is a copy of another and is also painted\n * @param {CanvasElement} canvas to copy size and content of\n * @static\n * @memberOf fabric.util\n * @return {CanvasElement} initialized canvas element\n */\n copyCanvasElement: function(canvas) {\n var newCanvas = fabric.util.createCanvasElement();\n newCanvas.width = canvas.width;\n newCanvas.height = canvas.height;\n newCanvas.getContext('2d').drawImage(canvas, 0, 0);\n return newCanvas;\n },\n\n /**\n * since 2.6.0 moved from canvas instance to utility.\n * @param {CanvasElement} canvasEl to copy size and content of\n * @param {String} format 'jpeg' or 'png', in some browsers 'webp' is ok too\n * @param {Number} quality <= 1 and > 0\n * @static\n * @memberOf fabric.util\n * @return {String} data url\n */\n toDataURL: function(canvasEl, format, quality) {\n return canvasEl.toDataURL('image/' + format, quality);\n },\n\n /**\n * Creates image element (works on client and node)\n * @static\n * @memberOf fabric.util\n * @return {HTMLImageElement} HTML image element\n */\n createImage: function() {\n return fabric.document.createElement('img');\n },\n\n /**\n * @static\n * @memberOf fabric.util\n * @deprecated since 2.0.0\n * @param {fabric.Object} receiver Object implementing `clipTo` method\n * @param {CanvasRenderingContext2D} ctx Context to clip\n */\n clipContext: function(receiver, ctx) {\n ctx.save();\n ctx.beginPath();\n receiver.clipTo(ctx);\n ctx.clip();\n },\n\n /**\n * Multiply matrix A by matrix B to nest transformations\n * @static\n * @memberOf fabric.util\n * @param {Array} a First transformMatrix\n * @param {Array} b Second transformMatrix\n * @param {Boolean} is2x2 flag to multiply matrices as 2x2 matrices\n * @return {Array} The product of the two transform matrices\n */\n multiplyTransformMatrices: function(a, b, is2x2) {\n // Matrix multiply a * b\n return [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4],\n is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5]\n ];\n },\n\n /**\n * Decomposes standard 2x3 matrix into transform components\n * @static\n * @memberOf fabric.util\n * @param {Array} a transformMatrix\n * @return {Object} Components of transform\n */\n qrDecompose: function(a) {\n var angle = atan2(a[1], a[0]),\n denom = pow(a[0], 2) + pow(a[1], 2),\n scaleX = sqrt(denom),\n scaleY = (a[0] * a[3] - a[2] * a [1]) / scaleX,\n skewX = atan2(a[0] * a[2] + a[1] * a [3], denom);\n return {\n angle: angle / PiBy180,\n scaleX: scaleX,\n scaleY: scaleY,\n skewX: skewX / PiBy180,\n skewY: 0,\n translateX: a[4],\n translateY: a[5]\n };\n },\n\n /**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet\n * @static\n * @memberOf fabric.util\n * @param {Object} options\n * @param {Number} [options.angle] angle in degrees\n * @return {Number[]} transform matrix\n */\n calcRotateMatrix: function(options) {\n if (!options.angle) {\n return fabric.iMatrix.concat();\n }\n var theta = fabric.util.degreesToRadians(options.angle),\n cos = fabric.util.cos(theta),\n sin = fabric.util.sin(theta);\n return [cos, sin, -sin, cos, 0, 0];\n },\n\n /**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet.\n * is called DimensionsTransformMatrix because those properties are the one that influence\n * the size of the resulting box of the object.\n * @static\n * @memberOf fabric.util\n * @param {Object} options\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewX]\n * @return {Number[]} transform matrix\n */\n calcDimensionsMatrix: function(options) {\n var scaleX = typeof options.scaleX === 'undefined' ? 1 : options.scaleX,\n scaleY = typeof options.scaleY === 'undefined' ? 1 : options.scaleY,\n scaleMatrix = [\n options.flipX ? -scaleX : scaleX,\n 0,\n 0,\n options.flipY ? -scaleY : scaleY,\n 0,\n 0],\n multiply = fabric.util.multiplyTransformMatrices,\n degreesToRadians = fabric.util.degreesToRadians;\n if (options.skewX) {\n scaleMatrix = multiply(\n scaleMatrix,\n [1, 0, Math.tan(degreesToRadians(options.skewX)), 1],\n true);\n }\n if (options.skewY) {\n scaleMatrix = multiply(\n scaleMatrix,\n [1, Math.tan(degreesToRadians(options.skewY)), 0, 1],\n true);\n }\n return scaleMatrix;\n },\n\n /**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet\n * @static\n * @memberOf fabric.util\n * @param {Object} options\n * @param {Number} [options.angle]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewX]\n * @param {Number} [options.translateX]\n * @param {Number} [options.translateY]\n * @return {Number[]} transform matrix\n */\n composeMatrix: function(options) {\n var matrix = [1, 0, 0, 1, options.translateX || 0, options.translateY || 0],\n multiply = fabric.util.multiplyTransformMatrices;\n if (options.angle) {\n matrix = multiply(matrix, fabric.util.calcRotateMatrix(options));\n }\n if (options.scaleX || options.scaleY || options.skewX || options.skewY || options.flipX || options.flipY) {\n matrix = multiply(matrix, fabric.util.calcDimensionsMatrix(options));\n }\n return matrix;\n },\n\n /**\n * Returns a transform matrix that has the same effect of scaleX, scaleY and skewX.\n * Is deprecated for composeMatrix. Please do not use it.\n * @static\n * @deprecated since 3.4.0\n * @memberOf fabric.util\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @param {Number} skewX\n * @return {Number[]} transform matrix\n */\n customTransformMatrix: function(scaleX, scaleY, skewX) {\n return fabric.util.composeMatrix({ scaleX: scaleX, scaleY: scaleY, skewX: skewX });\n },\n\n /**\n * reset an object transform state to neutral. Top and left are not accounted for\n * @static\n * @memberOf fabric.util\n * @param {fabric.Object} target object to transform\n */\n resetObjectTransform: function (target) {\n target.scaleX = 1;\n target.scaleY = 1;\n target.skewX = 0;\n target.skewY = 0;\n target.flipX = false;\n target.flipY = false;\n target.rotate(0);\n },\n\n /**\n * Extract Object transform values\n * @static\n * @memberOf fabric.util\n * @param {fabric.Object} target object to read from\n * @return {Object} Components of transform\n */\n saveObjectTransform: function (target) {\n return {\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n angle: target.angle,\n left: target.left,\n flipX: target.flipX,\n flipY: target.flipY,\n top: target.top\n };\n },\n\n /**\n * Returns string representation of function body\n * @param {Function} fn Function to get body of\n * @return {String} Function body\n */\n getFunctionBody: function(fn) {\n return (String(fn).match(/function[^{]*\\{([\\s\\S]*)\\}/) || {})[1];\n },\n\n /**\n * Returns true if context has transparent pixel\n * at specified location (taking tolerance into account)\n * @param {CanvasRenderingContext2D} ctx context\n * @param {Number} x x coordinate\n * @param {Number} y y coordinate\n * @param {Number} tolerance Tolerance\n */\n isTransparent: function(ctx, x, y, tolerance) {\n\n // If tolerance is > 0 adjust start coords to take into account.\n // If moves off Canvas fix to 0\n if (tolerance > 0) {\n if (x > tolerance) {\n x -= tolerance;\n }\n else {\n x = 0;\n }\n if (y > tolerance) {\n y -= tolerance;\n }\n else {\n y = 0;\n }\n }\n\n var _isTransparent = true, i, temp,\n imageData = ctx.getImageData(x, y, (tolerance * 2) || 1, (tolerance * 2) || 1),\n l = imageData.data.length;\n\n // Split image data - for tolerance > 1, pixelDataSize = 4;\n for (i = 3; i < l; i += 4) {\n temp = imageData.data[i];\n _isTransparent = temp <= 0;\n if (_isTransparent === false) {\n break; // Stop if colour found\n }\n }\n\n imageData = null;\n\n return _isTransparent;\n },\n\n /**\n * Parse preserveAspectRatio attribute from element\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\n parsePreserveAspectRatioAttribute: function(attribute) {\n var meetOrSlice = 'meet', alignX = 'Mid', alignY = 'Mid',\n aspectRatioAttrs = attribute.split(' '), align;\n\n if (aspectRatioAttrs && aspectRatioAttrs.length) {\n meetOrSlice = aspectRatioAttrs.pop();\n if (meetOrSlice !== 'meet' && meetOrSlice !== 'slice') {\n align = meetOrSlice;\n meetOrSlice = 'meet';\n }\n else if (aspectRatioAttrs.length) {\n align = aspectRatioAttrs.pop();\n }\n }\n //divide align in alignX and alignY\n alignX = align !== 'none' ? align.slice(1, 4) : 'none';\n alignY = align !== 'none' ? align.slice(5, 8) : 'none';\n return {\n meetOrSlice: meetOrSlice,\n alignX: alignX,\n alignY: alignY\n };\n },\n\n /**\n * Clear char widths cache for the given font family or all the cache if no\n * fontFamily is specified.\n * Use it if you know you are loading fonts in a lazy way and you are not waiting\n * for custom fonts to load properly when adding text objects to the canvas.\n * If a text object is added when its own font is not loaded yet, you will get wrong\n * measurement and so wrong bounding boxes.\n * After the font cache is cleared, either change the textObject text content or call\n * initDimensions() to trigger a recalculation\n * @memberOf fabric.util\n * @param {String} [fontFamily] font family to clear\n */\n clearFabricFontCache: function(fontFamily) {\n fontFamily = (fontFamily || '').toLowerCase();\n if (!fontFamily) {\n fabric.charWidthsCache = { };\n }\n else if (fabric.charWidthsCache[fontFamily]) {\n delete fabric.charWidthsCache[fontFamily];\n }\n },\n\n /**\n * Given current aspect ratio, determines the max width and height that can\n * respect the total allowed area for the cache.\n * @memberOf fabric.util\n * @param {Number} ar aspect ratio\n * @param {Number} maximumArea Maximum area you want to achieve\n * @return {Object.x} Limited dimensions by X\n * @return {Object.y} Limited dimensions by Y\n */\n limitDimsByArea: function(ar, maximumArea) {\n var roughWidth = Math.sqrt(maximumArea * ar),\n perfLimitSizeY = Math.floor(maximumArea / roughWidth);\n return { x: Math.floor(roughWidth), y: perfLimitSizeY };\n },\n\n capValue: function(min, value, max) {\n return Math.max(min, Math.min(value, max));\n },\n\n /**\n * Finds the scale for the object source to fit inside the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @memberOf fabric.util\n * @param {Object | fabric.Object} source\n * @param {Number} source.height natural unscaled height of the object\n * @param {Number} source.width natural unscaled width of the object\n * @param {Object | fabric.Object} destination\n * @param {Number} destination.height natural unscaled height of the object\n * @param {Number} destination.width natural unscaled width of the object\n * @return {Number} scale factor to apply to source to fit into destination\n */\n findScaleToFit: function(source, destination) {\n return Math.min(destination.width / source.width, destination.height / source.height);\n },\n\n /**\n * Finds the scale for the object source to cover entirely the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @memberOf fabric.util\n * @param {Object | fabric.Object} source\n * @param {Number} source.height natural unscaled height of the object\n * @param {Number} source.width natural unscaled width of the object\n * @param {Object | fabric.Object} destination\n * @param {Number} destination.height natural unscaled height of the object\n * @param {Number} destination.width natural unscaled width of the object\n * @return {Number} scale factor to apply to source to cover destination\n */\n findScaleToCover: function(source, destination) {\n return Math.max(destination.width / source.width, destination.height / source.height);\n },\n\n /**\n * given an array of 6 number returns something like `\"matrix(...numbers)\"`\n * @memberOf fabric.util\n * @param {Array} trasnform an array with 6 numbers\n * @return {String} transform matrix for svg\n * @return {Object.y} Limited dimensions by Y\n */\n matrixToSVG: function(transform) {\n return 'matrix(' + transform.map(function(value) {\n return fabric.util.toFixed(value, fabric.Object.NUM_FRACTION_DIGITS);\n }).join(' ') + ')';\n }\n };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n var _join = Array.prototype.join;\n\n /* Adapted from http://dxr.mozilla.org/mozilla-central/source/content/svg/content/src/nsSVGPathDataParser.cpp\n * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here\n * http://mozilla.org/MPL/2.0/\n */\n function arcToSegments(toX, toY, rx, ry, large, sweep, rotateX) {\n var argsString = _join.call(arguments);\n if (fabric.arcToSegmentsCache[argsString]) {\n return fabric.arcToSegmentsCache[argsString];\n }\n\n var PI = Math.PI, th = rotateX * PI / 180,\n sinTh = fabric.util.sin(th),\n cosTh = fabric.util.cos(th),\n fromX = 0, fromY = 0;\n\n rx = Math.abs(rx);\n ry = Math.abs(ry);\n\n var px = -cosTh * toX * 0.5 - sinTh * toY * 0.5,\n py = -cosTh * toY * 0.5 + sinTh * toX * 0.5,\n rx2 = rx * rx, ry2 = ry * ry, py2 = py * py, px2 = px * px,\n pl = rx2 * ry2 - rx2 * py2 - ry2 * px2,\n root = 0;\n\n if (pl < 0) {\n var s = Math.sqrt(1 - pl / (rx2 * ry2));\n rx *= s;\n ry *= s;\n }\n else {\n root = (large === sweep ? -1.0 : 1.0) *\n Math.sqrt( pl / (rx2 * py2 + ry2 * px2));\n }\n\n var cx = root * rx * py / ry,\n cy = -root * ry * px / rx,\n cx1 = cosTh * cx - sinTh * cy + toX * 0.5,\n cy1 = sinTh * cx + cosTh * cy + toY * 0.5,\n mTheta = calcVectorAngle(1, 0, (px - cx) / rx, (py - cy) / ry),\n dtheta = calcVectorAngle((px - cx) / rx, (py - cy) / ry, (-px - cx) / rx, (-py - cy) / ry);\n\n if (sweep === 0 && dtheta > 0) {\n dtheta -= 2 * PI;\n }\n else if (sweep === 1 && dtheta < 0) {\n dtheta += 2 * PI;\n }\n\n // Convert into cubic bezier segments <= 90deg\n var segments = Math.ceil(Math.abs(dtheta / PI * 2)),\n result = [], mDelta = dtheta / segments,\n mT = 8 / 3 * Math.sin(mDelta / 4) * Math.sin(mDelta / 4) / Math.sin(mDelta / 2),\n th3 = mTheta + mDelta;\n\n for (var i = 0; i < segments; i++) {\n result[i] = segmentToBezier(mTheta, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY);\n fromX = result[i][4];\n fromY = result[i][5];\n mTheta = th3;\n th3 += mDelta;\n }\n fabric.arcToSegmentsCache[argsString] = result;\n return result;\n }\n\n function segmentToBezier(th2, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY) {\n var costh2 = fabric.util.cos(th2),\n sinth2 = fabric.util.sin(th2),\n costh3 = fabric.util.cos(th3),\n sinth3 = fabric.util.sin(th3),\n toX = cosTh * rx * costh3 - sinTh * ry * sinth3 + cx1,\n toY = sinTh * rx * costh3 + cosTh * ry * sinth3 + cy1,\n cp1X = fromX + mT * ( -cosTh * rx * sinth2 - sinTh * ry * costh2),\n cp1Y = fromY + mT * ( -sinTh * rx * sinth2 + cosTh * ry * costh2),\n cp2X = toX + mT * ( cosTh * rx * sinth3 + sinTh * ry * costh3),\n cp2Y = toY + mT * ( sinTh * rx * sinth3 - cosTh * ry * costh3);\n\n return [\n cp1X, cp1Y,\n cp2X, cp2Y,\n toX, toY\n ];\n }\n\n /*\n * Private\n */\n function calcVectorAngle(ux, uy, vx, vy) {\n var ta = Math.atan2(uy, ux),\n tb = Math.atan2(vy, vx);\n if (tb >= ta) {\n return tb - ta;\n }\n else {\n return 2 * Math.PI - (ta - tb);\n }\n }\n\n /**\n * Draws arc\n * @param {CanvasRenderingContext2D} ctx\n * @param {Number} fx\n * @param {Number} fy\n * @param {Array} coords\n */\n fabric.util.drawArc = function(ctx, fx, fy, coords) {\n var rx = coords[0],\n ry = coords[1],\n rot = coords[2],\n large = coords[3],\n sweep = coords[4],\n tx = coords[5],\n ty = coords[6],\n segs = [[], [], [], []],\n segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n for (var i = 0, len = segsNorm.length; i < len; i++) {\n segs[i][0] = segsNorm[i][0] + fx;\n segs[i][1] = segsNorm[i][1] + fy;\n segs[i][2] = segsNorm[i][2] + fx;\n segs[i][3] = segsNorm[i][3] + fy;\n segs[i][4] = segsNorm[i][4] + fx;\n segs[i][5] = segsNorm[i][5] + fy;\n ctx.bezierCurveTo.apply(ctx, segs[i]);\n }\n };\n\n /**\n * Calculate bounding box of a elliptic-arc\n * @param {Number} fx start point of arc\n * @param {Number} fy\n * @param {Number} rx horizontal radius\n * @param {Number} ry vertical radius\n * @param {Number} rot angle of horizontal axe\n * @param {Number} large 1 or 0, whatever the arc is the big or the small on the 2 points\n * @param {Number} sweep 1 or 0, 1 clockwise or counterclockwise direction\n * @param {Number} tx end point of arc\n * @param {Number} ty\n */\n fabric.util.getBoundsOfArc = function(fx, fy, rx, ry, rot, large, sweep, tx, ty) {\n\n var fromX = 0, fromY = 0, bound, bounds = [],\n segs = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n for (var i = 0, len = segs.length; i < len; i++) {\n bound = getBoundsOfCurve(fromX, fromY, segs[i][0], segs[i][1], segs[i][2], segs[i][3], segs[i][4], segs[i][5]);\n bounds.push({ x: bound[0].x + fx, y: bound[0].y + fy });\n bounds.push({ x: bound[1].x + fx, y: bound[1].y + fy });\n fromX = segs[i][4];\n fromY = segs[i][5];\n }\n return bounds;\n };\n\n /**\n * Calculate bounding box of a beziercurve\n * @param {Number} x0 starting point\n * @param {Number} y0\n * @param {Number} x1 first control point\n * @param {Number} y1\n * @param {Number} x2 secondo control point\n * @param {Number} y2\n * @param {Number} x3 end of beizer\n * @param {Number} y3\n */\n // taken from http://jsbin.com/ivomiq/56/edit no credits available for that.\n function getBoundsOfCurve(x0, y0, x1, y1, x2, y2, x3, y3) {\n var argsString;\n if (fabric.cachesBoundsOfCurve) {\n argsString = _join.call(arguments);\n if (fabric.boundsOfCurveCache[argsString]) {\n return fabric.boundsOfCurveCache[argsString];\n }\n }\n\n var sqrt = Math.sqrt,\n min = Math.min, max = Math.max,\n abs = Math.abs, tvalues = [],\n bounds = [[], []],\n a, b, c, t, t1, t2, b2ac, sqrtb2ac;\n\n b = 6 * x0 - 12 * x1 + 6 * x2;\n a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3;\n c = 3 * x1 - 3 * x0;\n\n for (var i = 0; i < 2; ++i) {\n if (i > 0) {\n b = 6 * y0 - 12 * y1 + 6 * y2;\n a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3;\n c = 3 * y1 - 3 * y0;\n }\n\n if (abs(a) < 1e-12) {\n if (abs(b) < 1e-12) {\n continue;\n }\n t = -c / b;\n if (0 < t && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n b2ac = b * b - 4 * c * a;\n if (b2ac < 0) {\n continue;\n }\n sqrtb2ac = sqrt(b2ac);\n t1 = (-b + sqrtb2ac) / (2 * a);\n if (0 < t1 && t1 < 1) {\n tvalues.push(t1);\n }\n t2 = (-b - sqrtb2ac) / (2 * a);\n if (0 < t2 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n\n var x, y, j = tvalues.length, jlen = j, mt;\n while (j--) {\n t = tvalues[j];\n mt = 1 - t;\n x = (mt * mt * mt * x0) + (3 * mt * mt * t * x1) + (3 * mt * t * t * x2) + (t * t * t * x3);\n bounds[0][j] = x;\n\n y = (mt * mt * mt * y0) + (3 * mt * mt * t * y1) + (3 * mt * t * t * y2) + (t * t * t * y3);\n bounds[1][j] = y;\n }\n\n bounds[0][jlen] = x0;\n bounds[1][jlen] = y0;\n bounds[0][jlen + 1] = x3;\n bounds[1][jlen + 1] = y3;\n var result = [\n {\n x: min.apply(null, bounds[0]),\n y: min.apply(null, bounds[1])\n },\n {\n x: max.apply(null, bounds[0]),\n y: max.apply(null, bounds[1])\n }\n ];\n if (fabric.cachesBoundsOfCurve) {\n fabric.boundsOfCurveCache[argsString] = result;\n }\n return result;\n }\n\n fabric.util.getBoundsOfCurve = getBoundsOfCurve;\n\n})();\n\n\n(function() {\n\n var slice = Array.prototype.slice;\n\n /**\n * Invokes method on all items in a given array\n * @memberOf fabric.util.array\n * @param {Array} array Array to iterate over\n * @param {String} method Name of a method to invoke\n * @return {Array}\n */\n function invoke(array, method) {\n var args = slice.call(arguments, 2), result = [];\n for (var i = 0, len = array.length; i < len; i++) {\n result[i] = args.length ? array[i][method].apply(array[i], args) : array[i][method].call(array[i]);\n }\n return result;\n }\n\n /**\n * Finds maximum value in array (not necessarily \"first\" one)\n * @memberOf fabric.util.array\n * @param {Array} array Array to iterate over\n * @param {String} byProperty\n * @return {*}\n */\n function max(array, byProperty) {\n return find(array, byProperty, function(value1, value2) {\n return value1 >= value2;\n });\n }\n\n /**\n * Finds minimum value in array (not necessarily \"first\" one)\n * @memberOf fabric.util.array\n * @param {Array} array Array to iterate over\n * @param {String} byProperty\n * @return {*}\n */\n function min(array, byProperty) {\n return find(array, byProperty, function(value1, value2) {\n return value1 < value2;\n });\n }\n\n /**\n * @private\n */\n function fill(array, value) {\n var k = array.length;\n while (k--) {\n array[k] = value;\n }\n return array;\n }\n\n /**\n * @private\n */\n function find(array, byProperty, condition) {\n if (!array || array.length === 0) {\n return;\n }\n\n var i = array.length - 1,\n result = byProperty ? array[i][byProperty] : array[i];\n if (byProperty) {\n while (i--) {\n if (condition(array[i][byProperty], result)) {\n result = array[i][byProperty];\n }\n }\n }\n else {\n while (i--) {\n if (condition(array[i], result)) {\n result = array[i];\n }\n }\n }\n return result;\n }\n\n /**\n * @namespace fabric.util.array\n */\n fabric.util.array = {\n fill: fill,\n invoke: invoke,\n min: min,\n max: max\n };\n\n})();\n\n\n(function() {\n /**\n * Copies all enumerable properties of one js object to another\n * this does not and cannot compete with generic utils.\n * Does not clone or extend fabric.Object subclasses.\n * This is mostly for internal use and has extra handling for fabricJS objects\n * it skips the canvas property in deep cloning.\n * @memberOf fabric.util.object\n * @param {Object} destination Where to copy to\n * @param {Object} source Where to copy from\n * @return {Object}\n */\n\n function extend(destination, source, deep) {\n // JScript DontEnum bug is not taken care of\n // the deep clone is for internal use, is not meant to avoid\n // javascript traps or cloning html element or self referenced objects.\n if (deep) {\n if (!fabric.isLikelyNode && source instanceof Element) {\n // avoid cloning deep images, canvases,\n destination = source;\n }\n else if (source instanceof Array) {\n destination = [];\n for (var i = 0, len = source.length; i < len; i++) {\n destination[i] = extend({ }, source[i], deep);\n }\n }\n else if (source && typeof source === 'object') {\n for (var property in source) {\n if (property === 'canvas') {\n destination[property] = extend({ }, source[property]);\n }\n else if (source.hasOwnProperty(property)) {\n destination[property] = extend({ }, source[property], deep);\n }\n }\n }\n else {\n // this sounds odd for an extend but is ok for recursive use\n destination = source;\n }\n }\n else {\n for (var property in source) {\n destination[property] = source[property];\n }\n }\n return destination;\n }\n\n /**\n * Creates an empty object and copies all enumerable properties of another object to it\n * @memberOf fabric.util.object\n * TODO: this function return an empty object if you try to clone null\n * @param {Object} object Object to clone\n * @return {Object}\n */\n function clone(object, deep) {\n return extend({ }, object, deep);\n }\n\n /** @namespace fabric.util.object */\n fabric.util.object = {\n extend: extend,\n clone: clone\n };\n fabric.util.object.extend(fabric.util, fabric.Observable);\n})();\n\n\n(function() {\n\n /**\n * Camelizes a string\n * @memberOf fabric.util.string\n * @param {String} string String to camelize\n * @return {String} Camelized version of a string\n */\n function camelize(string) {\n return string.replace(/-+(.)?/g, function(match, character) {\n return character ? character.toUpperCase() : '';\n });\n }\n\n /**\n * Capitalizes a string\n * @memberOf fabric.util.string\n * @param {String} string String to capitalize\n * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized\n * and other letters stay untouched, if false first letter is capitalized\n * and other letters are converted to lowercase.\n * @return {String} Capitalized version of a string\n */\n function capitalize(string, firstLetterOnly) {\n return string.charAt(0).toUpperCase() +\n (firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase());\n }\n\n /**\n * Escapes XML in a string\n * @memberOf fabric.util.string\n * @param {String} string String to escape\n * @return {String} Escaped version of a string\n */\n function escapeXml(string) {\n return string.replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>');\n }\n\n /**\n * Divide a string in the user perceived single units\n * @memberOf fabric.util.string\n * @param {String} textstring String to escape\n * @return {Array} array containing the graphemes\n */\n function graphemeSplit(textstring) {\n var i = 0, chr, graphemes = [];\n for (i = 0, chr; i < textstring.length; i++) {\n if ((chr = getWholeChar(textstring, i)) === false) {\n continue;\n }\n graphemes.push(chr);\n }\n return graphemes;\n }\n\n // taken from mdn in the charAt doc page.\n function getWholeChar(str, i) {\n var code = str.charCodeAt(i);\n\n if (isNaN(code)) {\n return ''; // Position not found\n }\n if (code < 0xD800 || code > 0xDFFF) {\n return str.charAt(i);\n }\n\n // High surrogate (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xD800 <= code && code <= 0xDBFF) {\n if (str.length <= (i + 1)) {\n throw 'High surrogate without following low surrogate';\n }\n var next = str.charCodeAt(i + 1);\n if (0xDC00 > next || next > 0xDFFF) {\n throw 'High surrogate without following low surrogate';\n }\n return str.charAt(i) + str.charAt(i + 1);\n }\n // Low surrogate (0xDC00 <= code && code <= 0xDFFF)\n if (i === 0) {\n throw 'Low surrogate without preceding high surrogate';\n }\n var prev = str.charCodeAt(i - 1);\n\n // (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xD800 > prev || prev > 0xDBFF) {\n throw 'Low surrogate without preceding high surrogate';\n }\n // We can pass over low surrogates now as the second component\n // in a pair which we have already processed\n return false;\n }\n\n\n /**\n * String utilities\n * @namespace fabric.util.string\n */\n fabric.util.string = {\n camelize: camelize,\n capitalize: capitalize,\n escapeXml: escapeXml,\n graphemeSplit: graphemeSplit\n };\n})();\n\n\n(function() {\n\n var slice = Array.prototype.slice, emptyFunction = function() { },\n\n IS_DONTENUM_BUGGY = (function() {\n for (var p in { toString: 1 }) {\n if (p === 'toString') {\n return false;\n }\n }\n return true;\n })(),\n\n /** @ignore */\n addMethods = function(klass, source, parent) {\n for (var property in source) {\n\n if (property in klass.prototype &&\n typeof klass.prototype[property] === 'function' &&\n (source[property] + '').indexOf('callSuper') > -1) {\n\n klass.prototype[property] = (function(property) {\n return function() {\n\n var superclass = this.constructor.superclass;\n this.constructor.superclass = parent;\n var returnValue = source[property].apply(this, arguments);\n this.constructor.superclass = superclass;\n\n if (property !== 'initialize') {\n return returnValue;\n }\n };\n })(property);\n }\n else {\n klass.prototype[property] = source[property];\n }\n\n if (IS_DONTENUM_BUGGY) {\n if (source.toString !== Object.prototype.toString) {\n klass.prototype.toString = source.toString;\n }\n if (source.valueOf !== Object.prototype.valueOf) {\n klass.prototype.valueOf = source.valueOf;\n }\n }\n }\n };\n\n function Subclass() { }\n\n function callSuper(methodName) {\n var parentMethod = null,\n _this = this;\n\n // climb prototype chain to find method not equal to callee's method\n while (_this.constructor.superclass) {\n var superClassMethod = _this.constructor.superclass.prototype[methodName];\n if (_this[methodName] !== superClassMethod) {\n parentMethod = superClassMethod;\n break;\n }\n // eslint-disable-next-line\n _this = _this.constructor.superclass.prototype;\n }\n\n if (!parentMethod) {\n return console.log('tried to callSuper ' + methodName + ', method not found in prototype chain', this);\n }\n\n return (arguments.length > 1)\n ? parentMethod.apply(this, slice.call(arguments, 1))\n : parentMethod.call(this);\n }\n\n /**\n * Helper for creation of \"classes\".\n * @memberOf fabric.util\n * @param {Function} [parent] optional \"Class\" to inherit from\n * @param {Object} [properties] Properties shared by all instances of this class\n * (be careful modifying objects defined here as this would affect all instances)\n */\n function createClass() {\n var parent = null,\n properties = slice.call(arguments, 0);\n\n if (typeof properties[0] === 'function') {\n parent = properties.shift();\n }\n function klass() {\n this.initialize.apply(this, arguments);\n }\n\n klass.superclass = parent;\n klass.subclasses = [];\n\n if (parent) {\n Subclass.prototype = parent.prototype;\n klass.prototype = new Subclass();\n parent.subclasses.push(klass);\n }\n for (var i = 0, length = properties.length; i < length; i++) {\n addMethods(klass, properties[i], parent);\n }\n if (!klass.prototype.initialize) {\n klass.prototype.initialize = emptyFunction;\n }\n klass.prototype.constructor = klass;\n klass.prototype.callSuper = callSuper;\n return klass;\n }\n\n fabric.util.createClass = createClass;\n})();\n\n\n(function () {\n // since ie10 or ie9 can use addEventListener but they do not support options, i need to check\n var couldUseAttachEvent = !!fabric.document.createElement('div').attachEvent;\n /**\n * Adds an event listener to an element\n * @function\n * @memberOf fabric.util\n * @param {HTMLElement} element\n * @param {String} eventName\n * @param {Function} handler\n */\n fabric.util.addListener = function(element, eventName, handler, options) {\n element && element.addEventListener(eventName, handler, couldUseAttachEvent ? false : options);\n };\n\n /**\n * Removes an event listener from an element\n * @function\n * @memberOf fabric.util\n * @param {HTMLElement} element\n * @param {String} eventName\n * @param {Function} handler\n */\n fabric.util.removeListener = function(element, eventName, handler, options) {\n element && element.removeEventListener(eventName, handler, couldUseAttachEvent ? false : options);\n };\n\n function getTouchInfo(event) {\n var touchProp = event.changedTouches;\n if (touchProp && touchProp[0]) {\n return touchProp[0];\n }\n return event;\n }\n\n fabric.util.getPointer = function(event) {\n var element = event.target,\n scroll = fabric.util.getScrollLeftTop(element),\n _evt = getTouchInfo(event);\n return {\n x: _evt.clientX + scroll.left,\n y: _evt.clientY + scroll.top\n };\n };\n})();\n\n\n(function () {\n\n /**\n * Cross-browser wrapper for setting element's style\n * @memberOf fabric.util\n * @param {HTMLElement} element\n * @param {Object} styles\n * @return {HTMLElement} Element that was passed as a first argument\n */\n function setStyle(element, styles) {\n var elementStyle = element.style;\n if (!elementStyle) {\n return element;\n }\n if (typeof styles === 'string') {\n element.style.cssText += ';' + styles;\n return styles.indexOf('opacity') > -1\n ? setOpacity(element, styles.match(/opacity:\\s*(\\d?\\.?\\d*)/)[1])\n : element;\n }\n for (var property in styles) {\n if (property === 'opacity') {\n setOpacity(element, styles[property]);\n }\n else {\n var normalizedProperty = (property === 'float' || property === 'cssFloat')\n ? (typeof elementStyle.styleFloat === 'undefined' ? 'cssFloat' : 'styleFloat')\n : property;\n elementStyle[normalizedProperty] = styles[property];\n }\n }\n return element;\n }\n\n var parseEl = fabric.document.createElement('div'),\n supportsOpacity = typeof parseEl.style.opacity === 'string',\n supportsFilters = typeof parseEl.style.filter === 'string',\n reOpacity = /alpha\\s*\\(\\s*opacity\\s*=\\s*([^\\)]+)\\)/,\n\n /** @ignore */\n setOpacity = function (element) { return element; };\n\n if (supportsOpacity) {\n /** @ignore */\n setOpacity = function(element, value) {\n element.style.opacity = value;\n return element;\n };\n }\n else if (supportsFilters) {\n /** @ignore */\n setOpacity = function(element, value) {\n var es = element.style;\n if (element.currentStyle && !element.currentStyle.hasLayout) {\n es.zoom = 1;\n }\n if (reOpacity.test(es.filter)) {\n value = value >= 0.9999 ? '' : ('alpha(opacity=' + (value * 100) + ')');\n es.filter = es.filter.replace(reOpacity, value);\n }\n else {\n es.filter += ' alpha(opacity=' + (value * 100) + ')';\n }\n return element;\n };\n }\n\n fabric.util.setStyle = setStyle;\n\n})();\n\n\n(function() {\n\n var _slice = Array.prototype.slice;\n\n /**\n * Takes id and returns an element with that id (if one exists in a document)\n * @memberOf fabric.util\n * @param {String|HTMLElement} id\n * @return {HTMLElement|null}\n */\n function getById(id) {\n return typeof id === 'string' ? fabric.document.getElementById(id) : id;\n }\n\n var sliceCanConvertNodelists,\n /**\n * Converts an array-like object (e.g. arguments or NodeList) to an array\n * @memberOf fabric.util\n * @param {Object} arrayLike\n * @return {Array}\n */\n toArray = function(arrayLike) {\n return _slice.call(arrayLike, 0);\n };\n\n try {\n sliceCanConvertNodelists = toArray(fabric.document.childNodes) instanceof Array;\n }\n catch (err) { }\n\n if (!sliceCanConvertNodelists) {\n toArray = function(arrayLike) {\n var arr = new Array(arrayLike.length), i = arrayLike.length;\n while (i--) {\n arr[i] = arrayLike[i];\n }\n return arr;\n };\n }\n\n /**\n * Creates specified element with specified attributes\n * @memberOf fabric.util\n * @param {String} tagName Type of an element to create\n * @param {Object} [attributes] Attributes to set on an element\n * @return {HTMLElement} Newly created element\n */\n function makeElement(tagName, attributes) {\n var el = fabric.document.createElement(tagName);\n for (var prop in attributes) {\n if (prop === 'class') {\n el.className = attributes[prop];\n }\n else if (prop === 'for') {\n el.htmlFor = attributes[prop];\n }\n else {\n el.setAttribute(prop, attributes[prop]);\n }\n }\n return el;\n }\n\n /**\n * Adds class to an element\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to add class to\n * @param {String} className Class to add to an element\n */\n function addClass(element, className) {\n if (element && (' ' + element.className + ' ').indexOf(' ' + className + ' ') === -1) {\n element.className += (element.className ? ' ' : '') + className;\n }\n }\n\n /**\n * Wraps element with another element\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to wrap\n * @param {HTMLElement|String} wrapper Element to wrap with\n * @param {Object} [attributes] Attributes to set on a wrapper\n * @return {HTMLElement} wrapper\n */\n function wrapElement(element, wrapper, attributes) {\n if (typeof wrapper === 'string') {\n wrapper = makeElement(wrapper, attributes);\n }\n if (element.parentNode) {\n element.parentNode.replaceChild(wrapper, element);\n }\n wrapper.appendChild(element);\n return wrapper;\n }\n\n /**\n * Returns element scroll offsets\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to operate on\n * @return {Object} Object with left/top values\n */\n function getScrollLeftTop(element) {\n\n var left = 0,\n top = 0,\n docElement = fabric.document.documentElement,\n body = fabric.document.body || {\n scrollLeft: 0, scrollTop: 0\n };\n\n // While loop checks (and then sets element to) .parentNode OR .host\n // to account for ShadowDOM. We still want to traverse up out of ShadowDOM,\n // but the .parentNode of a root ShadowDOM node will always be null, instead\n // it should be accessed through .host. See http://stackoverflow.com/a/24765528/4383938\n while (element && (element.parentNode || element.host)) {\n\n // Set element to element parent, or 'host' in case of ShadowDOM\n element = element.parentNode || element.host;\n\n if (element === fabric.document) {\n left = body.scrollLeft || docElement.scrollLeft || 0;\n top = body.scrollTop || docElement.scrollTop || 0;\n }\n else {\n left += element.scrollLeft || 0;\n top += element.scrollTop || 0;\n }\n\n if (element.nodeType === 1 && element.style.position === 'fixed') {\n break;\n }\n }\n\n return { left: left, top: top };\n }\n\n /**\n * Returns offset for a given element\n * @function\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to get offset for\n * @return {Object} Object with \"left\" and \"top\" properties\n */\n function getElementOffset(element) {\n var docElem,\n doc = element && element.ownerDocument,\n box = { left: 0, top: 0 },\n offset = { left: 0, top: 0 },\n scrollLeftTop,\n offsetAttributes = {\n borderLeftWidth: 'left',\n borderTopWidth: 'top',\n paddingLeft: 'left',\n paddingTop: 'top'\n };\n\n if (!doc) {\n return offset;\n }\n\n for (var attr in offsetAttributes) {\n offset[offsetAttributes[attr]] += parseInt(getElementStyle(element, attr), 10) || 0;\n }\n\n docElem = doc.documentElement;\n if ( typeof element.getBoundingClientRect !== 'undefined' ) {\n box = element.getBoundingClientRect();\n }\n\n scrollLeftTop = getScrollLeftTop(element);\n\n return {\n left: box.left + scrollLeftTop.left - (docElem.clientLeft || 0) + offset.left,\n top: box.top + scrollLeftTop.top - (docElem.clientTop || 0) + offset.top\n };\n }\n\n /**\n * Returns style attribute value of a given element\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to get style attribute for\n * @param {String} attr Style attribute to get for element\n * @return {String} Style attribute value of the given element.\n */\n var getElementStyle;\n if (fabric.document.defaultView && fabric.document.defaultView.getComputedStyle) {\n getElementStyle = function(element, attr) {\n var style = fabric.document.defaultView.getComputedStyle(element, null);\n return style ? style[attr] : undefined;\n };\n }\n else {\n getElementStyle = function(element, attr) {\n var value = element.style[attr];\n if (!value && element.currentStyle) {\n value = element.currentStyle[attr];\n }\n return value;\n };\n }\n\n (function () {\n var style = fabric.document.documentElement.style,\n selectProp = 'userSelect' in style\n ? 'userSelect'\n : 'MozUserSelect' in style\n ? 'MozUserSelect'\n : 'WebkitUserSelect' in style\n ? 'WebkitUserSelect'\n : 'KhtmlUserSelect' in style\n ? 'KhtmlUserSelect'\n : '';\n\n /**\n * Makes element unselectable\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to make unselectable\n * @return {HTMLElement} Element that was passed in\n */\n function makeElementUnselectable(element) {\n if (typeof element.onselectstart !== 'undefined') {\n element.onselectstart = fabric.util.falseFunction;\n }\n if (selectProp) {\n element.style[selectProp] = 'none';\n }\n else if (typeof element.unselectable === 'string') {\n element.unselectable = 'on';\n }\n return element;\n }\n\n /**\n * Makes element selectable\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to make selectable\n * @return {HTMLElement} Element that was passed in\n */\n function makeElementSelectable(element) {\n if (typeof element.onselectstart !== 'undefined') {\n element.onselectstart = null;\n }\n if (selectProp) {\n element.style[selectProp] = '';\n }\n else if (typeof element.unselectable === 'string') {\n element.unselectable = '';\n }\n return element;\n }\n\n fabric.util.makeElementUnselectable = makeElementUnselectable;\n fabric.util.makeElementSelectable = makeElementSelectable;\n })();\n\n (function() {\n\n /**\n * Inserts a script element with a given url into a document; invokes callback, when that script is finished loading\n * @memberOf fabric.util\n * @param {String} url URL of a script to load\n * @param {Function} callback Callback to execute when script is finished loading\n */\n function getScript(url, callback) {\n var headEl = fabric.document.getElementsByTagName('head')[0],\n scriptEl = fabric.document.createElement('script'),\n loading = true;\n\n /** @ignore */\n scriptEl.onload = /** @ignore */ scriptEl.onreadystatechange = function(e) {\n if (loading) {\n if (typeof this.readyState === 'string' &&\n this.readyState !== 'loaded' &&\n this.readyState !== 'complete') {\n return;\n }\n loading = false;\n callback(e || fabric.window.event);\n scriptEl = scriptEl.onload = scriptEl.onreadystatechange = null;\n }\n };\n scriptEl.src = url;\n headEl.appendChild(scriptEl);\n // causes issue in Opera\n // headEl.removeChild(scriptEl);\n }\n\n fabric.util.getScript = getScript;\n })();\n\n function getNodeCanvas(element) {\n var impl = fabric.jsdomImplForWrapper(element);\n return impl._canvas || impl._image;\n };\n\n function cleanUpJsdomNode(element) {\n if (!fabric.isLikelyNode) {\n return;\n }\n var impl = fabric.jsdomImplForWrapper(element);\n if (impl) {\n impl._image = null;\n impl._canvas = null;\n // unsure if necessary\n impl._currentSrc = null;\n impl._attributes = null;\n impl._classList = null;\n }\n }\n\n fabric.util.getById = getById;\n fabric.util.toArray = toArray;\n fabric.util.makeElement = makeElement;\n fabric.util.addClass = addClass;\n fabric.util.wrapElement = wrapElement;\n fabric.util.getScrollLeftTop = getScrollLeftTop;\n fabric.util.getElementOffset = getElementOffset;\n fabric.util.getElementStyle = getElementStyle;\n fabric.util.getNodeCanvas = getNodeCanvas;\n fabric.util.cleanUpJsdomNode = cleanUpJsdomNode;\n\n})();\n\n\n(function() {\n\n function addParamToUrl(url, param) {\n return url + (/\\?/.test(url) ? '&' : '?') + param;\n }\n\n function emptyFn() { }\n\n /**\n * Cross-browser abstraction for sending XMLHttpRequest\n * @memberOf fabric.util\n * @param {String} url URL to send XMLHttpRequest to\n * @param {Object} [options] Options object\n * @param {String} [options.method=\"GET\"]\n * @param {String} [options.parameters] parameters to append to url in GET or in body\n * @param {String} [options.body] body to send with POST or PUT request\n * @param {Function} options.onComplete Callback to invoke when request is completed\n * @return {XMLHttpRequest} request\n */\n function request(url, options) {\n options || (options = { });\n\n var method = options.method ? options.method.toUpperCase() : 'GET',\n onComplete = options.onComplete || function() { },\n xhr = new fabric.window.XMLHttpRequest(),\n body = options.body || options.parameters;\n\n /** @ignore */\n xhr.onreadystatechange = function() {\n if (xhr.readyState === 4) {\n onComplete(xhr);\n xhr.onreadystatechange = emptyFn;\n }\n };\n\n if (method === 'GET') {\n body = null;\n if (typeof options.parameters === 'string') {\n url = addParamToUrl(url, options.parameters);\n }\n }\n\n xhr.open(method, url, true);\n\n if (method === 'POST' || method === 'PUT') {\n xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n }\n\n xhr.send(body);\n return xhr;\n }\n\n fabric.util.request = request;\n})();\n\n\n/**\n * Wrapper around `console.log` (when available)\n * @param {*} [values] Values to log\n */\nfabric.log = console.log;\n\n/**\n * Wrapper around `console.warn` (when available)\n * @param {*} [values] Values to log as a warning\n */\nfabric.warn = console.warn;\n\n\n(function() {\n\n function noop() {\n return false;\n }\n\n function defaultEasing(t, b, c, d) {\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n }\n\n /**\n * Changes value from one to another within certain period of time, invoking callbacks as value is being changed.\n * @memberOf fabric.util\n * @param {Object} [options] Animation options\n * @param {Function} [options.onChange] Callback; invoked on every value change\n * @param {Function} [options.onComplete] Callback; invoked when value change is completed\n * @param {Number} [options.startValue=0] Starting value\n * @param {Number} [options.endValue=100] Ending value\n * @param {Number} [options.byValue=100] Value to modify the property by\n * @param {Function} [options.easing] Easing function\n * @param {Number} [options.duration=500] Duration of change (in ms)\n * @param {Function} [options.abort] Additional function with logic. If returns true, onComplete is called.\n */\n function animate(options) {\n\n requestAnimFrame(function(timestamp) {\n options || (options = { });\n\n var start = timestamp || +new Date(),\n duration = options.duration || 500,\n finish = start + duration, time,\n onChange = options.onChange || noop,\n abort = options.abort || noop,\n onComplete = options.onComplete || noop,\n easing = options.easing || defaultEasing,\n startValue = 'startValue' in options ? options.startValue : 0,\n endValue = 'endValue' in options ? options.endValue : 100,\n byValue = options.byValue || endValue - startValue;\n\n options.onStart && options.onStart();\n\n (function tick(ticktime) {\n // TODO: move abort call after calculation\n // and pass (current,valuePerc, timePerc) as arguments\n time = ticktime || +new Date();\n var currentTime = time > finish ? duration : (time - start),\n timePerc = currentTime / duration,\n current = easing(currentTime, startValue, byValue, duration),\n valuePerc = Math.abs((current - startValue) / byValue);\n if (abort()) {\n onComplete(endValue, 1, 1);\n return;\n }\n if (time > finish) {\n onChange(endValue, 1, 1);\n onComplete(endValue, 1, 1);\n return;\n }\n else {\n onChange(current, valuePerc, timePerc);\n requestAnimFrame(tick);\n }\n })(start);\n });\n }\n\n var _requestAnimFrame = fabric.window.requestAnimationFrame ||\n fabric.window.webkitRequestAnimationFrame ||\n fabric.window.mozRequestAnimationFrame ||\n fabric.window.oRequestAnimationFrame ||\n fabric.window.msRequestAnimationFrame ||\n function(callback) {\n return fabric.window.setTimeout(callback, 1000 / 60);\n };\n\n var _cancelAnimFrame = fabric.window.cancelAnimationFrame || fabric.window.clearTimeout;\n\n /**\n * requestAnimationFrame polyfill based on http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n * In order to get a precise start time, `requestAnimFrame` should be called as an entry into the method\n * @memberOf fabric.util\n * @param {Function} callback Callback to invoke\n * @param {DOMElement} element optional Element to associate with animation\n */\n function requestAnimFrame() {\n return _requestAnimFrame.apply(fabric.window, arguments);\n }\n\n function cancelAnimFrame() {\n return _cancelAnimFrame.apply(fabric.window, arguments);\n }\n\n fabric.util.animate = animate;\n fabric.util.requestAnimFrame = requestAnimFrame;\n fabric.util.cancelAnimFrame = cancelAnimFrame;\n})();\n\n\n(function() {\n // Calculate an in-between color. Returns a \"rgba()\" string.\n // Credit: Edwin Martin \n // http://www.bitstorm.org/jquery/color-animation/jquery.animate-colors.js\n function calculateColor(begin, end, pos) {\n var color = 'rgba('\n + parseInt((begin[0] + pos * (end[0] - begin[0])), 10) + ','\n + parseInt((begin[1] + pos * (end[1] - begin[1])), 10) + ','\n + parseInt((begin[2] + pos * (end[2] - begin[2])), 10);\n\n color += ',' + (begin && end ? parseFloat(begin[3] + pos * (end[3] - begin[3])) : 1);\n color += ')';\n return color;\n }\n\n /**\n * Changes the color from one to another within certain period of time, invoking callbacks as value is being changed.\n * @memberOf fabric.util\n * @param {String} fromColor The starting color in hex or rgb(a) format.\n * @param {String} toColor The starting color in hex or rgb(a) format.\n * @param {Number} [duration] Duration of change (in ms).\n * @param {Object} [options] Animation options\n * @param {Function} [options.onChange] Callback; invoked on every value change\n * @param {Function} [options.onComplete] Callback; invoked when value change is completed\n * @param {Function} [options.colorEasing] Easing function. Note that this function only take two arguments (currentTime, duration). Thus the regular animation easing functions cannot be used.\n * @param {Function} [options.abort] Additional function with logic. If returns true, onComplete is called.\n */\n function animateColor(fromColor, toColor, duration, options) {\n var startColor = new fabric.Color(fromColor).getSource(),\n endColor = new fabric.Color(toColor).getSource();\n\n options = options || {};\n\n fabric.util.animate(fabric.util.object.extend(options, {\n duration: duration || 500,\n startValue: startColor,\n endValue: endColor,\n byValue: endColor,\n easing: function (currentTime, startValue, byValue, duration) {\n var posValue = options.colorEasing\n ? options.colorEasing(currentTime, duration)\n : 1 - Math.cos(currentTime / duration * (Math.PI / 2));\n return calculateColor(startValue, byValue, posValue);\n }\n }));\n }\n\n fabric.util.animateColor = animateColor;\n\n})();\n\n\n(function() {\n\n function normalize(a, c, p, s) {\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n }\n else {\n //handle the 0/0 case:\n if (c === 0 && a === 0) {\n s = p / (2 * Math.PI) * Math.asin(1);\n }\n else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n }\n return { a: a, c: c, p: p, s: s };\n }\n\n function elastic(opts, t, d) {\n return opts.a *\n Math.pow(2, 10 * (t -= 1)) *\n Math.sin( (t * d - opts.s) * (2 * Math.PI) / opts.p );\n }\n\n /**\n * Cubic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutCubic(t, b, c, d) {\n return c * ((t = t / d - 1) * t * t + 1) + b;\n }\n\n /**\n * Cubic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutCubic(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return c / 2 * t * t * t + b;\n }\n return c / 2 * ((t -= 2) * t * t + 2) + b;\n }\n\n /**\n * Quartic easing in\n * @memberOf fabric.util.ease\n */\n function easeInQuart(t, b, c, d) {\n return c * (t /= d) * t * t * t + b;\n }\n\n /**\n * Quartic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutQuart(t, b, c, d) {\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n }\n\n /**\n * Quartic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutQuart(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return c / 2 * t * t * t * t + b;\n }\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n }\n\n /**\n * Quintic easing in\n * @memberOf fabric.util.ease\n */\n function easeInQuint(t, b, c, d) {\n return c * (t /= d) * t * t * t * t + b;\n }\n\n /**\n * Quintic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutQuint(t, b, c, d) {\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n }\n\n /**\n * Quintic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutQuint(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return c / 2 * t * t * t * t * t + b;\n }\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n }\n\n /**\n * Sinusoidal easing in\n * @memberOf fabric.util.ease\n */\n function easeInSine(t, b, c, d) {\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n }\n\n /**\n * Sinusoidal easing out\n * @memberOf fabric.util.ease\n */\n function easeOutSine(t, b, c, d) {\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\n }\n\n /**\n * Sinusoidal easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutSine(t, b, c, d) {\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n }\n\n /**\n * Exponential easing in\n * @memberOf fabric.util.ease\n */\n function easeInExpo(t, b, c, d) {\n return (t === 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b;\n }\n\n /**\n * Exponential easing out\n * @memberOf fabric.util.ease\n */\n function easeOutExpo(t, b, c, d) {\n return (t === d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;\n }\n\n /**\n * Exponential easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutExpo(t, b, c, d) {\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n t /= d / 2;\n if (t < 1) {\n return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n }\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n }\n\n /**\n * Circular easing in\n * @memberOf fabric.util.ease\n */\n function easeInCirc(t, b, c, d) {\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n }\n\n /**\n * Circular easing out\n * @memberOf fabric.util.ease\n */\n function easeOutCirc(t, b, c, d) {\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n }\n\n /**\n * Circular easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutCirc(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n }\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n }\n\n /**\n * Elastic easing in\n * @memberOf fabric.util.ease\n */\n function easeInElastic(t, b, c, d) {\n var s = 1.70158, p = 0, a = c;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n var opts = normalize(a, c, p, s);\n return -elastic(opts, t, d) + b;\n }\n\n /**\n * Elastic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutElastic(t, b, c, d) {\n var s = 1.70158, p = 0, a = c;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n var opts = normalize(a, c, p, s);\n return opts.a * Math.pow(2, -10 * t) * Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) + opts.c + b;\n }\n\n /**\n * Elastic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutElastic(t, b, c, d) {\n var s = 1.70158, p = 0, a = c;\n if (t === 0) {\n return b;\n }\n t /= d / 2;\n if (t === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n var opts = normalize(a, c, p, s);\n if (t < 1) {\n return -0.5 * elastic(opts, t, d) + b;\n }\n return opts.a * Math.pow(2, -10 * (t -= 1)) *\n Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) * 0.5 + opts.c + b;\n }\n\n /**\n * Backwards easing in\n * @memberOf fabric.util.ease\n */\n function easeInBack(t, b, c, d, s) {\n if (s === undefined) {\n s = 1.70158;\n }\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n }\n\n /**\n * Backwards easing out\n * @memberOf fabric.util.ease\n */\n function easeOutBack(t, b, c, d, s) {\n if (s === undefined) {\n s = 1.70158;\n }\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n }\n\n /**\n * Backwards easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutBack(t, b, c, d, s) {\n if (s === undefined) {\n s = 1.70158;\n }\n t /= d / 2;\n if (t < 1) {\n return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;\n }\n return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;\n }\n\n /**\n * Bouncing easing in\n * @memberOf fabric.util.ease\n */\n function easeInBounce(t, b, c, d) {\n return c - easeOutBounce (d - t, 0, c, d) + b;\n }\n\n /**\n * Bouncing easing out\n * @memberOf fabric.util.ease\n */\n function easeOutBounce(t, b, c, d) {\n if ((t /= d) < (1 / 2.75)) {\n return c * (7.5625 * t * t) + b;\n }\n else if (t < (2 / 2.75)) {\n return c * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75) + b;\n }\n else if (t < (2.5 / 2.75)) {\n return c * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375) + b;\n }\n else {\n return c * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375) + b;\n }\n }\n\n /**\n * Bouncing easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutBounce(t, b, c, d) {\n if (t < d / 2) {\n return easeInBounce (t * 2, 0, c, d) * 0.5 + b;\n }\n return easeOutBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b;\n }\n\n /**\n * Easing functions\n * See Easing Equations by Robert Penner\n * @namespace fabric.util.ease\n */\n fabric.util.ease = {\n\n /**\n * Quadratic easing in\n * @memberOf fabric.util.ease\n */\n easeInQuad: function(t, b, c, d) {\n return c * (t /= d) * t + b;\n },\n\n /**\n * Quadratic easing out\n * @memberOf fabric.util.ease\n */\n easeOutQuad: function(t, b, c, d) {\n return -c * (t /= d) * (t - 2) + b;\n },\n\n /**\n * Quadratic easing in and out\n * @memberOf fabric.util.ease\n */\n easeInOutQuad: function(t, b, c, d) {\n t /= (d / 2);\n if (t < 1) {\n return c / 2 * t * t + b;\n }\n return -c / 2 * ((--t) * (t - 2) - 1) + b;\n },\n\n /**\n * Cubic easing in\n * @memberOf fabric.util.ease\n */\n easeInCubic: function(t, b, c, d) {\n return c * (t /= d) * t * t + b;\n },\n\n easeOutCubic: easeOutCubic,\n easeInOutCubic: easeInOutCubic,\n easeInQuart: easeInQuart,\n easeOutQuart: easeOutQuart,\n easeInOutQuart: easeInOutQuart,\n easeInQuint: easeInQuint,\n easeOutQuint: easeOutQuint,\n easeInOutQuint: easeInOutQuint,\n easeInSine: easeInSine,\n easeOutSine: easeOutSine,\n easeInOutSine: easeInOutSine,\n easeInExpo: easeInExpo,\n easeOutExpo: easeOutExpo,\n easeInOutExpo: easeInOutExpo,\n easeInCirc: easeInCirc,\n easeOutCirc: easeOutCirc,\n easeInOutCirc: easeInOutCirc,\n easeInElastic: easeInElastic,\n easeOutElastic: easeOutElastic,\n easeInOutElastic: easeInOutElastic,\n easeInBack: easeInBack,\n easeOutBack: easeOutBack,\n easeInOutBack: easeInOutBack,\n easeInBounce: easeInBounce,\n easeOutBounce: easeOutBounce,\n easeInOutBounce: easeInOutBounce\n };\n\n})();\n\n\n(function(global) {\n\n 'use strict';\n\n /**\n * @name fabric\n * @namespace\n */\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n clone = fabric.util.object.clone,\n toFixed = fabric.util.toFixed,\n parseUnit = fabric.util.parseUnit,\n multiplyTransformMatrices = fabric.util.multiplyTransformMatrices,\n\n svgValidTagNames = ['path', 'circle', 'polygon', 'polyline', 'ellipse', 'rect', 'line',\n 'image', 'text'],\n svgViewBoxElements = ['symbol', 'image', 'marker', 'pattern', 'view', 'svg'],\n svgInvalidAncestors = ['pattern', 'defs', 'symbol', 'metadata', 'clipPath', 'mask', 'desc'],\n svgValidParents = ['symbol', 'g', 'a', 'svg', 'clipPath', 'defs'],\n\n attributesMap = {\n cx: 'left',\n x: 'left',\n r: 'radius',\n cy: 'top',\n y: 'top',\n display: 'visible',\n visibility: 'visible',\n transform: 'transformMatrix',\n 'fill-opacity': 'fillOpacity',\n 'fill-rule': 'fillRule',\n 'font-family': 'fontFamily',\n 'font-size': 'fontSize',\n 'font-style': 'fontStyle',\n 'font-weight': 'fontWeight',\n 'letter-spacing': 'charSpacing',\n 'paint-order': 'paintFirst',\n 'stroke-dasharray': 'strokeDashArray',\n 'stroke-dashoffset': 'strokeDashOffset',\n 'stroke-linecap': 'strokeLineCap',\n 'stroke-linejoin': 'strokeLineJoin',\n 'stroke-miterlimit': 'strokeMiterLimit',\n 'stroke-opacity': 'strokeOpacity',\n 'stroke-width': 'strokeWidth',\n 'text-decoration': 'textDecoration',\n 'text-anchor': 'textAnchor',\n opacity: 'opacity',\n 'clip-path': 'clipPath',\n 'clip-rule': 'clipRule',\n 'vector-effect': 'strokeUniform'\n },\n\n colorAttributes = {\n stroke: 'strokeOpacity',\n fill: 'fillOpacity'\n },\n\n fSize = 'font-size', cPath = 'clip-path';\n\n fabric.svgValidTagNamesRegEx = getSvgRegex(svgValidTagNames);\n fabric.svgViewBoxElementsRegEx = getSvgRegex(svgViewBoxElements);\n fabric.svgInvalidAncestorsRegEx = getSvgRegex(svgInvalidAncestors);\n fabric.svgValidParentsRegEx = getSvgRegex(svgValidParents);\n\n fabric.cssRules = { };\n fabric.gradientDefs = { };\n fabric.clipPaths = { };\n\n function normalizeAttr(attr) {\n // transform attribute names\n if (attr in attributesMap) {\n return attributesMap[attr];\n }\n return attr;\n }\n\n function normalizeValue(attr, value, parentAttributes, fontSize) {\n var isArray = Object.prototype.toString.call(value) === '[object Array]',\n parsed;\n\n if ((attr === 'fill' || attr === 'stroke') && value === 'none') {\n value = '';\n }\n else if (attr === 'vector-effect') {\n value = value === 'non-scaling-stroke';\n }\n else if (attr === 'strokeDashArray') {\n if (value === 'none') {\n value = null;\n }\n else {\n value = value.replace(/,/g, ' ').split(/\\s+/).map(parseFloat);\n }\n }\n else if (attr === 'transformMatrix') {\n if (parentAttributes && parentAttributes.transformMatrix) {\n value = multiplyTransformMatrices(\n parentAttributes.transformMatrix, fabric.parseTransformAttribute(value));\n }\n else {\n value = fabric.parseTransformAttribute(value);\n }\n }\n else if (attr === 'visible') {\n value = value !== 'none' && value !== 'hidden';\n // display=none on parent element always takes precedence over child element\n if (parentAttributes && parentAttributes.visible === false) {\n value = false;\n }\n }\n else if (attr === 'opacity') {\n value = parseFloat(value);\n if (parentAttributes && typeof parentAttributes.opacity !== 'undefined') {\n value *= parentAttributes.opacity;\n }\n }\n else if (attr === 'textAnchor' /* text-anchor */) {\n value = value === 'start' ? 'left' : value === 'end' ? 'right' : 'center';\n }\n else if (attr === 'charSpacing') {\n // parseUnit returns px and we convert it to em\n parsed = parseUnit(value, fontSize) / fontSize * 1000;\n }\n else if (attr === 'paintFirst') {\n var fillIndex = value.indexOf('fill');\n var strokeIndex = value.indexOf('stroke');\n var value = 'fill';\n if (fillIndex > -1 && strokeIndex > -1 && strokeIndex < fillIndex) {\n value = 'stroke';\n }\n else if (fillIndex === -1 && strokeIndex > -1) {\n value = 'stroke';\n }\n }\n else if (attr === 'href' || attr === 'xlink:href') {\n return value;\n }\n else {\n parsed = isArray ? value.map(parseUnit) : parseUnit(value, fontSize);\n }\n\n return (!isArray && isNaN(parsed) ? value : parsed);\n }\n\n /**\n * @private\n */\n function getSvgRegex(arr) {\n return new RegExp('^(' + arr.join('|') + ')\\\\b', 'i');\n }\n\n /**\n * @private\n * @param {Object} attributes Array of attributes to parse\n */\n function _setStrokeFillOpacity(attributes) {\n for (var attr in colorAttributes) {\n\n if (typeof attributes[colorAttributes[attr]] === 'undefined' || attributes[attr] === '') {\n continue;\n }\n\n if (typeof attributes[attr] === 'undefined') {\n if (!fabric.Object.prototype[attr]) {\n continue;\n }\n attributes[attr] = fabric.Object.prototype[attr];\n }\n\n if (attributes[attr].indexOf('url(') === 0) {\n continue;\n }\n\n var color = new fabric.Color(attributes[attr]);\n attributes[attr] = color.setAlpha(toFixed(color.getAlpha() * attributes[colorAttributes[attr]], 2)).toRgba();\n }\n return attributes;\n }\n\n /**\n * @private\n */\n function _getMultipleNodes(doc, nodeNames) {\n var nodeName, nodeArray = [], nodeList, i, len;\n for (i = 0, len = nodeNames.length; i < len; i++) {\n nodeName = nodeNames[i];\n nodeList = doc.getElementsByTagName(nodeName);\n nodeArray = nodeArray.concat(Array.prototype.slice.call(nodeList));\n }\n return nodeArray;\n }\n\n /**\n * Parses \"transform\" attribute, returning an array of values\n * @static\n * @function\n * @memberOf fabric\n * @param {String} attributeValue String containing attribute value\n * @return {Array} Array of 6 elements representing transformation matrix\n */\n fabric.parseTransformAttribute = (function() {\n function rotateMatrix(matrix, args) {\n var cos = fabric.util.cos(args[0]), sin = fabric.util.sin(args[0]),\n x = 0, y = 0;\n if (args.length === 3) {\n x = args[1];\n y = args[2];\n }\n\n matrix[0] = cos;\n matrix[1] = sin;\n matrix[2] = -sin;\n matrix[3] = cos;\n matrix[4] = x - (cos * x - sin * y);\n matrix[5] = y - (sin * x + cos * y);\n }\n\n function scaleMatrix(matrix, args) {\n var multiplierX = args[0],\n multiplierY = (args.length === 2) ? args[1] : args[0];\n\n matrix[0] = multiplierX;\n matrix[3] = multiplierY;\n }\n\n function skewMatrix(matrix, args, pos) {\n matrix[pos] = Math.tan(fabric.util.degreesToRadians(args[0]));\n }\n\n function translateMatrix(matrix, args) {\n matrix[4] = args[0];\n if (args.length === 2) {\n matrix[5] = args[1];\n }\n }\n\n // identity matrix\n var iMatrix = fabric.iMatrix,\n\n // == begin transform regexp\n number = fabric.reNum,\n\n commaWsp = '(?:\\\\s+,?\\\\s*|,\\\\s*)',\n\n skewX = '(?:(skewX)\\\\s*\\\\(\\\\s*(' + number + ')\\\\s*\\\\))',\n\n skewY = '(?:(skewY)\\\\s*\\\\(\\\\s*(' + number + ')\\\\s*\\\\))',\n\n rotate = '(?:(rotate)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n commaWsp + '(' + number + ')' +\n commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n scale = '(?:(scale)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n translate = '(?:(translate)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n matrix = '(?:(matrix)\\\\s*\\\\(\\\\s*' +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' +\n '\\\\s*\\\\))',\n\n transform = '(?:' +\n matrix + '|' +\n translate + '|' +\n scale + '|' +\n rotate + '|' +\n skewX + '|' +\n skewY +\n ')',\n\n transforms = '(?:' + transform + '(?:' + commaWsp + '*' + transform + ')*' + ')',\n\n transformList = '^\\\\s*(?:' + transforms + '?)\\\\s*$',\n\n // http://www.w3.org/TR/SVG/coords.html#TransformAttribute\n reTransformList = new RegExp(transformList),\n // == end transform regexp\n\n reTransform = new RegExp(transform, 'g');\n\n return function(attributeValue) {\n\n // start with identity matrix\n var matrix = iMatrix.concat(),\n matrices = [];\n\n // return if no argument was given or\n // an argument does not match transform attribute regexp\n if (!attributeValue || (attributeValue && !reTransformList.test(attributeValue))) {\n return matrix;\n }\n\n attributeValue.replace(reTransform, function(match) {\n\n var m = new RegExp(transform).exec(match).filter(function (match) {\n // match !== '' && match != null\n return (!!match);\n }),\n operation = m[1],\n args = m.slice(2).map(parseFloat);\n\n switch (operation) {\n case 'translate':\n translateMatrix(matrix, args);\n break;\n case 'rotate':\n args[0] = fabric.util.degreesToRadians(args[0]);\n rotateMatrix(matrix, args);\n break;\n case 'scale':\n scaleMatrix(matrix, args);\n break;\n case 'skewX':\n skewMatrix(matrix, args, 2);\n break;\n case 'skewY':\n skewMatrix(matrix, args, 1);\n break;\n case 'matrix':\n matrix = args;\n break;\n }\n\n // snapshot current matrix into matrices array\n matrices.push(matrix.concat());\n // reset\n matrix = iMatrix.concat();\n });\n\n var combinedMatrix = matrices[0];\n while (matrices.length > 1) {\n matrices.shift();\n combinedMatrix = fabric.util.multiplyTransformMatrices(combinedMatrix, matrices[0]);\n }\n return combinedMatrix;\n };\n })();\n\n /**\n * @private\n */\n function parseStyleString(style, oStyle) {\n var attr, value;\n style.replace(/;\\s*$/, '').split(';').forEach(function (chunk) {\n var pair = chunk.split(':');\n\n attr = pair[0].trim().toLowerCase();\n value = pair[1].trim();\n\n oStyle[attr] = value;\n });\n }\n\n /**\n * @private\n */\n function parseStyleObject(style, oStyle) {\n var attr, value;\n for (var prop in style) {\n if (typeof style[prop] === 'undefined') {\n continue;\n }\n\n attr = prop.toLowerCase();\n value = style[prop];\n\n oStyle[attr] = value;\n }\n }\n\n /**\n * @private\n */\n function getGlobalStylesForElement(element, svgUid) {\n var styles = { };\n for (var rule in fabric.cssRules[svgUid]) {\n if (elementMatchesRule(element, rule.split(' '))) {\n for (var property in fabric.cssRules[svgUid][rule]) {\n styles[property] = fabric.cssRules[svgUid][rule][property];\n }\n }\n }\n return styles;\n }\n\n /**\n * @private\n */\n function elementMatchesRule(element, selectors) {\n var firstMatching, parentMatching = true;\n //start from rightmost selector.\n firstMatching = selectorMatches(element, selectors.pop());\n if (firstMatching && selectors.length) {\n parentMatching = doesSomeParentMatch(element, selectors);\n }\n return firstMatching && parentMatching && (selectors.length === 0);\n }\n\n function doesSomeParentMatch(element, selectors) {\n var selector, parentMatching = true;\n while (element.parentNode && element.parentNode.nodeType === 1 && selectors.length) {\n if (parentMatching) {\n selector = selectors.pop();\n }\n element = element.parentNode;\n parentMatching = selectorMatches(element, selector);\n }\n return selectors.length === 0;\n }\n\n /**\n * @private\n */\n function selectorMatches(element, selector) {\n var nodeName = element.nodeName,\n classNames = element.getAttribute('class'),\n id = element.getAttribute('id'), matcher, i;\n // i check if a selector matches slicing away part from it.\n // if i get empty string i should match\n matcher = new RegExp('^' + nodeName, 'i');\n selector = selector.replace(matcher, '');\n if (id && selector.length) {\n matcher = new RegExp('#' + id + '(?![a-zA-Z\\\\-]+)', 'i');\n selector = selector.replace(matcher, '');\n }\n if (classNames && selector.length) {\n classNames = classNames.split(' ');\n for (i = classNames.length; i--;) {\n matcher = new RegExp('\\\\.' + classNames[i] + '(?![a-zA-Z\\\\-]+)', 'i');\n selector = selector.replace(matcher, '');\n }\n }\n return selector.length === 0;\n }\n\n /**\n * @private\n * to support IE8 missing getElementById on SVGdocument and on node xmlDOM\n */\n function elementById(doc, id) {\n var el;\n doc.getElementById && (el = doc.getElementById(id));\n if (el) {\n return el;\n }\n var node, i, len, nodelist = doc.getElementsByTagName('*');\n for (i = 0, len = nodelist.length; i < len; i++) {\n node = nodelist[i];\n if (id === node.getAttribute('id')) {\n return node;\n }\n }\n }\n\n /**\n * @private\n */\n function parseUseDirectives(doc) {\n var nodelist = _getMultipleNodes(doc, ['use', 'svg:use']), i = 0;\n while (nodelist.length && i < nodelist.length) {\n var el = nodelist[i],\n xlink = (el.getAttribute('xlink:href') || el.getAttribute('href')).substr(1),\n x = el.getAttribute('x') || 0,\n y = el.getAttribute('y') || 0,\n el2 = elementById(doc, xlink).cloneNode(true),\n currentTrans = (el2.getAttribute('transform') || '') + ' translate(' + x + ', ' + y + ')',\n parentNode, oldLength = nodelist.length, attr, j, attrs, len, namespace = fabric.svgNS;\n\n applyViewboxTransform(el2);\n if (/^svg$/i.test(el2.nodeName)) {\n var el3 = el2.ownerDocument.createElementNS(namespace, 'g');\n for (j = 0, attrs = el2.attributes, len = attrs.length; j < len; j++) {\n attr = attrs.item(j);\n el3.setAttributeNS(namespace, attr.nodeName, attr.nodeValue);\n }\n // el2.firstChild != null\n while (el2.firstChild) {\n el3.appendChild(el2.firstChild);\n }\n el2 = el3;\n }\n\n for (j = 0, attrs = el.attributes, len = attrs.length; j < len; j++) {\n attr = attrs.item(j);\n if (attr.nodeName === 'x' || attr.nodeName === 'y' ||\n attr.nodeName === 'xlink:href' || attr.nodeName === 'href') {\n continue;\n }\n\n if (attr.nodeName === 'transform') {\n currentTrans = attr.nodeValue + ' ' + currentTrans;\n }\n else {\n el2.setAttribute(attr.nodeName, attr.nodeValue);\n }\n }\n\n el2.setAttribute('transform', currentTrans);\n el2.setAttribute('instantiated_by_use', '1');\n el2.removeAttribute('id');\n parentNode = el.parentNode;\n parentNode.replaceChild(el2, el);\n // some browsers do not shorten nodelist after replaceChild (IE8)\n if (nodelist.length === oldLength) {\n i++;\n }\n }\n }\n\n // http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute\n // matches, e.g.: +14.56e-12, etc.\n var reViewBoxAttrValue = new RegExp(\n '^' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*' +\n '$'\n );\n\n /**\n * Add a element that envelop all child elements and makes the viewbox transformMatrix descend on all elements\n */\n function applyViewboxTransform(element) {\n\n var viewBoxAttr = element.getAttribute('viewBox'),\n scaleX = 1,\n scaleY = 1,\n minX = 0,\n minY = 0,\n viewBoxWidth, viewBoxHeight, matrix, el,\n widthAttr = element.getAttribute('width'),\n heightAttr = element.getAttribute('height'),\n x = element.getAttribute('x') || 0,\n y = element.getAttribute('y') || 0,\n preserveAspectRatio = element.getAttribute('preserveAspectRatio') || '',\n missingViewBox = (!viewBoxAttr || !fabric.svgViewBoxElementsRegEx.test(element.nodeName)\n || !(viewBoxAttr = viewBoxAttr.match(reViewBoxAttrValue))),\n missingDimAttr = (!widthAttr || !heightAttr || widthAttr === '100%' || heightAttr === '100%'),\n toBeParsed = missingViewBox && missingDimAttr,\n parsedDim = { }, translateMatrix = '', widthDiff = 0, heightDiff = 0;\n\n parsedDim.width = 0;\n parsedDim.height = 0;\n parsedDim.toBeParsed = toBeParsed;\n\n if (toBeParsed) {\n return parsedDim;\n }\n\n if (missingViewBox) {\n parsedDim.width = parseUnit(widthAttr);\n parsedDim.height = parseUnit(heightAttr);\n return parsedDim;\n }\n minX = -parseFloat(viewBoxAttr[1]);\n minY = -parseFloat(viewBoxAttr[2]);\n viewBoxWidth = parseFloat(viewBoxAttr[3]);\n viewBoxHeight = parseFloat(viewBoxAttr[4]);\n parsedDim.minX = minX;\n parsedDim.minY = minY;\n parsedDim.viewBoxWidth = viewBoxWidth;\n parsedDim.viewBoxHeight = viewBoxHeight;\n if (!missingDimAttr) {\n parsedDim.width = parseUnit(widthAttr);\n parsedDim.height = parseUnit(heightAttr);\n scaleX = parsedDim.width / viewBoxWidth;\n scaleY = parsedDim.height / viewBoxHeight;\n }\n else {\n parsedDim.width = viewBoxWidth;\n parsedDim.height = viewBoxHeight;\n }\n\n // default is to preserve aspect ratio\n preserveAspectRatio = fabric.util.parsePreserveAspectRatioAttribute(preserveAspectRatio);\n if (preserveAspectRatio.alignX !== 'none') {\n //translate all container for the effect of Mid, Min, Max\n if (preserveAspectRatio.meetOrSlice === 'meet') {\n scaleY = scaleX = (scaleX > scaleY ? scaleY : scaleX);\n // calculate additional translation to move the viewbox\n }\n if (preserveAspectRatio.meetOrSlice === 'slice') {\n scaleY = scaleX = (scaleX > scaleY ? scaleX : scaleY);\n // calculate additional translation to move the viewbox\n }\n widthDiff = parsedDim.width - viewBoxWidth * scaleX;\n heightDiff = parsedDim.height - viewBoxHeight * scaleX;\n if (preserveAspectRatio.alignX === 'Mid') {\n widthDiff /= 2;\n }\n if (preserveAspectRatio.alignY === 'Mid') {\n heightDiff /= 2;\n }\n if (preserveAspectRatio.alignX === 'Min') {\n widthDiff = 0;\n }\n if (preserveAspectRatio.alignY === 'Min') {\n heightDiff = 0;\n }\n }\n\n if (scaleX === 1 && scaleY === 1 && minX === 0 && minY === 0 && x === 0 && y === 0) {\n return parsedDim;\n }\n\n if (x || y) {\n translateMatrix = ' translate(' + parseUnit(x) + ' ' + parseUnit(y) + ') ';\n }\n\n matrix = translateMatrix + ' matrix(' + scaleX +\n ' 0' +\n ' 0 ' +\n scaleY + ' ' +\n (minX * scaleX + widthDiff) + ' ' +\n (minY * scaleY + heightDiff) + ') ';\n parsedDim.viewboxTransform = fabric.parseTransformAttribute(matrix);\n if (element.nodeName === 'svg') {\n el = element.ownerDocument.createElementNS(fabric.svgNS, 'g');\n // element.firstChild != null\n while (element.firstChild) {\n el.appendChild(element.firstChild);\n }\n element.appendChild(el);\n }\n else {\n el = element;\n matrix = el.getAttribute('transform') + matrix;\n }\n el.setAttribute('transform', matrix);\n return parsedDim;\n }\n\n function hasAncestorWithNodeName(element, nodeName) {\n while (element && (element = element.parentNode)) {\n if (element.nodeName && nodeName.test(element.nodeName.replace('svg:', ''))\n && !element.getAttribute('instantiated_by_use')) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback\n * @static\n * @function\n * @memberOf fabric\n * @param {SVGDocument} doc SVG document to parse\n * @param {Function} callback Callback to call when parsing is finished;\n * It's being passed an array of elements (parsed from a document).\n * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n * @param {Object} [parsingOptions] options for parsing document\n * @param {String} [parsingOptions.crossOrigin] crossOrigin settings\n */\n fabric.parseSVGDocument = function(doc, callback, reviver, parsingOptions) {\n if (!doc) {\n return;\n }\n\n parseUseDirectives(doc);\n\n var svgUid = fabric.Object.__uid++, i, len,\n options = applyViewboxTransform(doc),\n descendants = fabric.util.toArray(doc.getElementsByTagName('*'));\n options.crossOrigin = parsingOptions && parsingOptions.crossOrigin;\n options.svgUid = svgUid;\n\n if (descendants.length === 0 && fabric.isLikelyNode) {\n // we're likely in node, where \"o3-xml\" library fails to gEBTN(\"*\")\n // https://github.com/ajaxorg/node-o3-xml/issues/21\n descendants = doc.selectNodes('//*[name(.)!=\"svg\"]');\n var arr = [];\n for (i = 0, len = descendants.length; i < len; i++) {\n arr[i] = descendants[i];\n }\n descendants = arr;\n }\n\n var elements = descendants.filter(function(el) {\n applyViewboxTransform(el);\n return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', '')) &&\n !hasAncestorWithNodeName(el, fabric.svgInvalidAncestorsRegEx); // http://www.w3.org/TR/SVG/struct.html#DefsElement\n });\n\n if (!elements || (elements && !elements.length)) {\n callback && callback([], {});\n return;\n }\n var clipPaths = { };\n descendants.filter(function(el) {\n return el.nodeName.replace('svg:', '') === 'clipPath';\n }).forEach(function(el) {\n var id = el.getAttribute('id');\n clipPaths[id] = fabric.util.toArray(el.getElementsByTagName('*')).filter(function(el) {\n return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', ''));\n });\n });\n fabric.gradientDefs[svgUid] = fabric.getGradientDefs(doc);\n fabric.cssRules[svgUid] = fabric.getCSSRules(doc);\n fabric.clipPaths[svgUid] = clipPaths;\n // Precedence of rules: style > class > attribute\n fabric.parseElements(elements, function(instances, elements) {\n if (callback) {\n callback(instances, options, elements, descendants);\n delete fabric.gradientDefs[svgUid];\n delete fabric.cssRules[svgUid];\n delete fabric.clipPaths[svgUid];\n }\n }, clone(options), reviver, parsingOptions);\n };\n\n function recursivelyParseGradientsXlink(doc, gradient) {\n var gradientsAttrs = ['gradientTransform', 'x1', 'x2', 'y1', 'y2', 'gradientUnits', 'cx', 'cy', 'r', 'fx', 'fy'],\n xlinkAttr = 'xlink:href',\n xLink = gradient.getAttribute(xlinkAttr).substr(1),\n referencedGradient = elementById(doc, xLink);\n if (referencedGradient && referencedGradient.getAttribute(xlinkAttr)) {\n recursivelyParseGradientsXlink(doc, referencedGradient);\n }\n gradientsAttrs.forEach(function(attr) {\n if (referencedGradient && !gradient.hasAttribute(attr) && referencedGradient.hasAttribute(attr)) {\n gradient.setAttribute(attr, referencedGradient.getAttribute(attr));\n }\n });\n if (!gradient.children.length) {\n var referenceClone = referencedGradient.cloneNode(true);\n while (referenceClone.firstChild) {\n gradient.appendChild(referenceClone.firstChild);\n }\n }\n gradient.removeAttribute(xlinkAttr);\n }\n\n var reFontDeclaration = new RegExp(\n '(normal|italic)?\\\\s*(normal|small-caps)?\\\\s*' +\n '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\\\s*(' +\n fabric.reNum +\n '(?:px|cm|mm|em|pt|pc|in)*)(?:\\\\/(normal|' + fabric.reNum + '))?\\\\s+(.*)');\n\n extend(fabric, {\n /**\n * Parses a short font declaration, building adding its properties to a style object\n * @static\n * @function\n * @memberOf fabric\n * @param {String} value font declaration\n * @param {Object} oStyle definition\n */\n parseFontDeclaration: function(value, oStyle) {\n var match = value.match(reFontDeclaration);\n\n if (!match) {\n return;\n }\n var fontStyle = match[1],\n // font variant is not used\n // fontVariant = match[2],\n fontWeight = match[3],\n fontSize = match[4],\n lineHeight = match[5],\n fontFamily = match[6];\n\n if (fontStyle) {\n oStyle.fontStyle = fontStyle;\n }\n if (fontWeight) {\n oStyle.fontWeight = isNaN(parseFloat(fontWeight)) ? fontWeight : parseFloat(fontWeight);\n }\n if (fontSize) {\n oStyle.fontSize = parseUnit(fontSize);\n }\n if (fontFamily) {\n oStyle.fontFamily = fontFamily;\n }\n if (lineHeight) {\n oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight;\n }\n },\n\n /**\n * Parses an SVG document, returning all of the gradient declarations found in it\n * @static\n * @function\n * @memberOf fabric\n * @param {SVGDocument} doc SVG document to parse\n * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element\n */\n getGradientDefs: function(doc) {\n var tagArray = [\n 'linearGradient',\n 'radialGradient',\n 'svg:linearGradient',\n 'svg:radialGradient'],\n elList = _getMultipleNodes(doc, tagArray),\n el, j = 0, gradientDefs = { };\n j = elList.length;\n while (j--) {\n el = elList[j];\n if (el.getAttribute('xlink:href')) {\n recursivelyParseGradientsXlink(doc, el);\n }\n gradientDefs[el.getAttribute('id')] = el;\n }\n return gradientDefs;\n },\n\n /**\n * Returns an object of attributes' name/value, given element and an array of attribute names;\n * Parses parent \"g\" nodes recursively upwards.\n * @static\n * @memberOf fabric\n * @param {DOMElement} element Element to parse\n * @param {Array} attributes Array of attributes to parse\n * @return {Object} object containing parsed attributes' names/values\n */\n parseAttributes: function(element, attributes, svgUid) {\n\n if (!element) {\n return;\n }\n\n var value,\n parentAttributes = { },\n fontSize, parentFontSize;\n\n if (typeof svgUid === 'undefined') {\n svgUid = element.getAttribute('svgUid');\n }\n // if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards\n if (element.parentNode && fabric.svgValidParentsRegEx.test(element.parentNode.nodeName)) {\n parentAttributes = fabric.parseAttributes(element.parentNode, attributes, svgUid);\n }\n\n var ownAttributes = attributes.reduce(function(memo, attr) {\n value = element.getAttribute(attr);\n if (value) { // eslint-disable-line\n memo[attr] = value;\n }\n return memo;\n }, { });\n // add values parsed from style, which take precedence over attributes\n // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes)\n var cssAttrs = extend(\n getGlobalStylesForElement(element, svgUid),\n fabric.parseStyleAttribute(element)\n );\n ownAttributes = extend(\n ownAttributes,\n cssAttrs\n );\n if (cssAttrs[cPath]) {\n element.setAttribute(cPath, cssAttrs[cPath]);\n }\n fontSize = parentFontSize = parentAttributes.fontSize || fabric.Text.DEFAULT_SVG_FONT_SIZE;\n if (ownAttributes[fSize]) {\n // looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers.\n ownAttributes[fSize] = fontSize = parseUnit(ownAttributes[fSize], parentFontSize);\n }\n\n var normalizedAttr, normalizedValue, normalizedStyle = {};\n for (var attr in ownAttributes) {\n normalizedAttr = normalizeAttr(attr);\n normalizedValue = normalizeValue(normalizedAttr, ownAttributes[attr], parentAttributes, fontSize);\n normalizedStyle[normalizedAttr] = normalizedValue;\n }\n if (normalizedStyle && normalizedStyle.font) {\n fabric.parseFontDeclaration(normalizedStyle.font, normalizedStyle);\n }\n var mergedAttrs = extend(parentAttributes, normalizedStyle);\n return fabric.svgValidParentsRegEx.test(element.nodeName) ? mergedAttrs : _setStrokeFillOpacity(mergedAttrs);\n },\n\n /**\n * Transforms an array of svg elements to corresponding fabric.* instances\n * @static\n * @memberOf fabric\n * @param {Array} elements Array of elements to parse\n * @param {Function} callback Being passed an array of fabric instances (transformed from SVG elements)\n * @param {Object} [options] Options object\n * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n */\n parseElements: function(elements, callback, options, reviver, parsingOptions) {\n new fabric.ElementsParser(elements, callback, options, reviver, parsingOptions).parse();\n },\n\n /**\n * Parses \"style\" attribute, retuning an object with values\n * @static\n * @memberOf fabric\n * @param {SVGElement} element Element to parse\n * @return {Object} Objects with values parsed from style attribute of an element\n */\n parseStyleAttribute: function(element) {\n var oStyle = { },\n style = element.getAttribute('style');\n\n if (!style) {\n return oStyle;\n }\n\n if (typeof style === 'string') {\n parseStyleString(style, oStyle);\n }\n else {\n parseStyleObject(style, oStyle);\n }\n\n return oStyle;\n },\n\n /**\n * Parses \"points\" attribute, returning an array of values\n * @static\n * @memberOf fabric\n * @param {String} points points attribute string\n * @return {Array} array of points\n */\n parsePointsAttribute: function(points) {\n\n // points attribute is required and must not be empty\n if (!points) {\n return null;\n }\n\n // replace commas with whitespace and remove bookending whitespace\n points = points.replace(/,/g, ' ').trim();\n\n points = points.split(/\\s+/);\n var parsedPoints = [], i, len;\n\n for (i = 0, len = points.length; i < len; i += 2) {\n parsedPoints.push({\n x: parseFloat(points[i]),\n y: parseFloat(points[i + 1])\n });\n }\n\n // odd number of points is an error\n // if (parsedPoints.length % 2 !== 0) {\n // return null;\n // }\n\n return parsedPoints;\n },\n\n /**\n * Returns CSS rules for a given SVG document\n * @static\n * @function\n * @memberOf fabric\n * @param {SVGDocument} doc SVG document to parse\n * @return {Object} CSS rules of this document\n */\n getCSSRules: function(doc) {\n var styles = doc.getElementsByTagName('style'), i, len,\n allRules = { }, rules;\n\n // very crude parsing of style contents\n for (i = 0, len = styles.length; i < len; i++) {\n // \\n'\n ].join('');\n }\n\n return markup;\n },\n\n /**\n * @private\n */\n _setSVGObjects: function(markup, reviver) {\n var instance, i, len, objects = this._objects;\n for (i = 0, len = objects.length; i < len; i++) {\n instance = objects[i];\n if (instance.excludeFromExport) {\n continue;\n }\n this._setSVGObject(markup, instance, reviver);\n }\n },\n\n /**\n * @private\n */\n _setSVGObject: function(markup, instance, reviver) {\n markup.push(instance.toSVG(reviver));\n },\n\n /**\n * @private\n */\n _setSVGBgOverlayImage: function(markup, property, reviver) {\n if (this[property] && !this[property].excludeFromExport && this[property].toSVG) {\n markup.push(this[property].toSVG(reviver));\n }\n },\n\n /**\n * @private\n */\n _setSVGBgOverlayColor: function(markup, property) {\n var filler = this[property + 'Color'], vpt = this.viewportTransform, finalWidth = this.width,\n finalHeight = this.height;\n if (!filler) {\n return;\n }\n if (filler.toLive) {\n var repeat = filler.repeat, iVpt = fabric.util.invertTransform(vpt), shouldInvert = this[property + 'Vpt'],\n additionalTransform = shouldInvert ? fabric.util.matrixToSVG(iVpt) : '';\n markup.push(\n '\\n'\n );\n }\n else {\n markup.push(\n '\\n'\n );\n }\n },\n /* _TO_SVG_END_ */\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the bottom of the stack of drawn objects\n * @param {fabric.Object} object Object to send to back\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n sendToBack: function (object) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, objs;\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = objs.length; i--;) {\n obj = objs[i];\n removeFromArray(this._objects, obj);\n this._objects.unshift(obj);\n }\n }\n else {\n removeFromArray(this._objects, object);\n this._objects.unshift(object);\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the top of the stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n bringToFront: function (object) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, objs;\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = 0; i < objs.length; i++) {\n obj = objs[i];\n removeFromArray(this._objects, obj);\n this._objects.push(obj);\n }\n }\n else {\n removeFromArray(this._objects, object);\n this._objects.push(object);\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Moves an object or a selection down in stack of drawn objects\n * An optional paramter, intersecting allowes to move the object in behind\n * the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n sendBackwards: function (object, intersecting) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, idx, newIdx, objs, objsMoved = 0;\n\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = 0; i < objs.length; i++) {\n obj = objs[i];\n idx = this._objects.indexOf(obj);\n if (idx > 0 + objsMoved) {\n newIdx = idx - 1;\n removeFromArray(this._objects, obj);\n this._objects.splice(newIdx, 0, obj);\n }\n objsMoved++;\n }\n }\n else {\n idx = this._objects.indexOf(object);\n if (idx !== 0) {\n // if object is not on the bottom of stack\n newIdx = this._findNewLowerIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n }\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * @private\n */\n _findNewLowerIndex: function(object, idx, intersecting) {\n var newIdx, i;\n\n if (intersecting) {\n newIdx = idx;\n\n // traverse down the stack looking for the nearest intersecting object\n for (i = idx - 1; i >= 0; --i) {\n\n var isIntersecting = object.intersectsWithObject(this._objects[i]) ||\n object.isContainedWithinObject(this._objects[i]) ||\n this._objects[i].isContainedWithinObject(object);\n\n if (isIntersecting) {\n newIdx = i;\n break;\n }\n }\n }\n else {\n newIdx = idx - 1;\n }\n\n return newIdx;\n },\n\n /**\n * Moves an object or a selection up in stack of drawn objects\n * An optional paramter, intersecting allowes to move the object in front\n * of the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n bringForward: function (object, intersecting) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, idx, newIdx, objs, objsMoved = 0;\n\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = objs.length; i--;) {\n obj = objs[i];\n idx = this._objects.indexOf(obj);\n if (idx < this._objects.length - 1 - objsMoved) {\n newIdx = idx + 1;\n removeFromArray(this._objects, obj);\n this._objects.splice(newIdx, 0, obj);\n }\n objsMoved++;\n }\n }\n else {\n idx = this._objects.indexOf(object);\n if (idx !== this._objects.length - 1) {\n // if object is not on top of stack (last item in an array)\n newIdx = this._findNewUpperIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n }\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * @private\n */\n _findNewUpperIndex: function(object, idx, intersecting) {\n var newIdx, i, len;\n\n if (intersecting) {\n newIdx = idx;\n\n // traverse up the stack looking for the nearest intersecting object\n for (i = idx + 1, len = this._objects.length; i < len; ++i) {\n\n var isIntersecting = object.intersectsWithObject(this._objects[i]) ||\n object.isContainedWithinObject(this._objects[i]) ||\n this._objects[i].isContainedWithinObject(object);\n\n if (isIntersecting) {\n newIdx = i;\n break;\n }\n }\n }\n else {\n newIdx = idx + 1;\n }\n\n return newIdx;\n },\n\n /**\n * Moves an object to specified level in stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @param {Number} index Position to move to\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n moveTo: function (object, index) {\n removeFromArray(this._objects, object);\n this._objects.splice(index, 0, object);\n return this.renderOnAddRemove && this.requestRenderAll();\n },\n\n /**\n * Clears a canvas element and dispose objects\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n dispose: function () {\n // cancel eventually ongoing renders\n if (this.isRendering) {\n fabric.util.cancelAnimFrame(this.isRendering);\n this.isRendering = 0;\n }\n this.forEachObject(function(object) {\n object.dispose && object.dispose();\n });\n this._objects = [];\n if (this.backgroundImage && this.backgroundImage.dispose) {\n this.backgroundImage.dispose();\n }\n this.backgroundImage = null;\n if (this.overlayImage && this.overlayImage.dispose) {\n this.overlayImage.dispose();\n }\n this.overlayImage = null;\n this._iTextInstances = null;\n this.contextContainer = null;\n fabric.util.cleanUpJsdomNode(this.lowerCanvasEl);\n this.lowerCanvasEl = undefined;\n return this;\n },\n\n /**\n * Returns a string representation of an instance\n * @return {String} string representation of an instance\n */\n toString: function () {\n return '#';\n }\n });\n\n extend(fabric.StaticCanvas.prototype, fabric.Observable);\n extend(fabric.StaticCanvas.prototype, fabric.Collection);\n extend(fabric.StaticCanvas.prototype, fabric.DataURLExporter);\n\n extend(fabric.StaticCanvas, /** @lends fabric.StaticCanvas */ {\n\n /**\n * @static\n * @type String\n * @default\n */\n EMPTY_JSON: '{\"objects\": [], \"background\": \"white\"}',\n\n /**\n * Provides a way to check support of some of the canvas methods\n * (either those of HTMLCanvasElement itself, or rendering context)\n *\n * @param {String} methodName Method to check support for;\n * Could be one of \"setLineDash\"\n * @return {Boolean | null} `true` if method is supported (or at least exists),\n * `null` if canvas element or context can not be initialized\n */\n supports: function (methodName) {\n var el = createCanvasElement();\n\n if (!el || !el.getContext) {\n return null;\n }\n\n var ctx = el.getContext('2d');\n if (!ctx) {\n return null;\n }\n\n switch (methodName) {\n\n case 'setLineDash':\n return typeof ctx.setLineDash !== 'undefined';\n\n default:\n return null;\n }\n }\n });\n\n /**\n * Returns JSON representation of canvas\n * @function\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {String} JSON string\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo}\n * @example JSON without additional properties\n * var json = canvas.toJSON();\n * @example JSON with additional properties included\n * var json = canvas.toJSON(['lockMovementX', 'lockMovementY', 'lockRotation', 'lockScalingX', 'lockScalingY', 'lockUniScaling']);\n * @example JSON without default values\n * canvas.includeDefaultValues = false;\n * var json = canvas.toJSON();\n */\n fabric.StaticCanvas.prototype.toJSON = fabric.StaticCanvas.prototype.toObject;\n\n if (fabric.isLikelyNode) {\n fabric.StaticCanvas.prototype.createPNGStream = function() {\n var impl = getNodeCanvas(this.lowerCanvasEl);\n return impl && impl.createPNGStream();\n };\n fabric.StaticCanvas.prototype.createJPEGStream = function(opts) {\n var impl = getNodeCanvas(this.lowerCanvasEl);\n return impl && impl.createJPEGStream(opts);\n };\n }\n})();\n\n\n/**\n * BaseBrush class\n * @class fabric.BaseBrush\n * @see {@link http://fabricjs.com/freedrawing|Freedrawing demo}\n */\nfabric.BaseBrush = fabric.util.createClass(/** @lends fabric.BaseBrush.prototype */ {\n\n /**\n * Color of a brush\n * @type String\n * @default\n */\n color: 'rgb(0, 0, 0)',\n\n /**\n * Width of a brush, has to be a Number, no string literals\n * @type Number\n * @default\n */\n width: 1,\n\n /**\n * Shadow object representing shadow of this shape.\n * Backwards incompatibility note: This property replaces \"shadowColor\" (String), \"shadowOffsetX\" (Number),\n * \"shadowOffsetY\" (Number) and \"shadowBlur\" (Number) since v1.2.12\n * @type fabric.Shadow\n * @default\n */\n shadow: null,\n\n /**\n * Line endings style of a brush (one of \"butt\", \"round\", \"square\")\n * @type String\n * @default\n */\n strokeLineCap: 'round',\n\n /**\n * Corner style of a brush (one of \"bevel\", \"round\", \"miter\")\n * @type String\n * @default\n */\n strokeLineJoin: 'round',\n\n /**\n * Maximum miter length (used for strokeLineJoin = \"miter\") of a brush's\n * @type Number\n * @default\n */\n strokeMiterLimit: 10,\n\n /**\n * Stroke Dash Array.\n * @type Array\n * @default\n */\n strokeDashArray: null,\n\n /**\n * Sets shadow of an object\n * @param {Object|String} [options] Options object or string (e.g. \"2px 2px 10px rgba(0,0,0,0.2)\")\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setShadow: function(options) {\n this.shadow = new fabric.Shadow(options);\n return this;\n },\n\n /**\n * Sets brush styles\n * @private\n */\n _setBrushStyles: function() {\n var ctx = this.canvas.contextTop;\n ctx.strokeStyle = this.color;\n ctx.lineWidth = this.width;\n ctx.lineCap = this.strokeLineCap;\n ctx.miterLimit = this.strokeMiterLimit;\n ctx.lineJoin = this.strokeLineJoin;\n if (fabric.StaticCanvas.supports('setLineDash')) {\n ctx.setLineDash(this.strokeDashArray || []);\n }\n },\n\n /**\n * Sets the transformation on given context\n * @param {RenderingContext2d} ctx context to render on\n * @private\n */\n _saveAndTransform: function(ctx) {\n var v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n },\n\n /**\n * Sets brush shadow styles\n * @private\n */\n _setShadow: function() {\n if (!this.shadow) {\n return;\n }\n\n var canvas = this.canvas,\n shadow = this.shadow,\n ctx = canvas.contextTop,\n zoom = canvas.getZoom();\n if (canvas && canvas._isRetinaScaling()) {\n zoom *= fabric.devicePixelRatio;\n }\n\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur = shadow.blur * zoom;\n ctx.shadowOffsetX = shadow.offsetX * zoom;\n ctx.shadowOffsetY = shadow.offsetY * zoom;\n },\n\n needsFullRender: function() {\n var color = new fabric.Color(this.color);\n return color.getAlpha() < 1 || !!this.shadow;\n },\n\n /**\n * Removes brush shadow styles\n * @private\n */\n _resetShadow: function() {\n var ctx = this.canvas.contextTop;\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n }\n});\n\n\n(function() {\n /**\n * PencilBrush class\n * @class fabric.PencilBrush\n * @extends fabric.BaseBrush\n */\n fabric.PencilBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.PencilBrush.prototype */ {\n\n /**\n * Discard points that are less than `decimate` pixel distant from each other\n * @type Number\n * @default 0.4\n */\n decimate: 0.4,\n\n /**\n * Constructor\n * @param {fabric.Canvas} canvas\n * @return {fabric.PencilBrush} Instance of a pencil brush\n */\n initialize: function(canvas) {\n this.canvas = canvas;\n this._points = [];\n },\n\n /**\n * Invoked inside on mouse down and mouse move\n * @param {Object} pointer\n */\n _drawSegment: function (ctx, p1, p2) {\n var midPoint = p1.midPointFrom(p2);\n ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);\n return midPoint;\n },\n\n /**\n * Inovoked on mouse down\n * @param {Object} pointer\n */\n onMouseDown: function(pointer, options) {\n if (!this.canvas._isMainEvent(options.e)) {\n return;\n }\n this._prepareForDrawing(pointer);\n // capture coordinates immediately\n // this allows to draw dots (when movement never occurs)\n this._captureDrawingPath(pointer);\n this._render();\n },\n\n /**\n * Inovoked on mouse move\n * @param {Object} pointer\n */\n onMouseMove: function(pointer, options) {\n if (!this.canvas._isMainEvent(options.e)) {\n return;\n }\n if (this._captureDrawingPath(pointer) && this._points.length > 1) {\n if (this.needsFullRender()) {\n // redraw curve\n // clear top canvas\n this.canvas.clearContext(this.canvas.contextTop);\n this._render();\n }\n else {\n var points = this._points, length = points.length, ctx = this.canvas.contextTop;\n // draw the curve update\n this._saveAndTransform(ctx);\n if (this.oldEnd) {\n ctx.beginPath();\n ctx.moveTo(this.oldEnd.x, this.oldEnd.y);\n }\n this.oldEnd = this._drawSegment(ctx, points[length - 2], points[length - 1], true);\n ctx.stroke();\n ctx.restore();\n }\n }\n },\n\n /**\n * Invoked on mouse up\n */\n onMouseUp: function(options) {\n if (!this.canvas._isMainEvent(options.e)) {\n return true;\n }\n this.oldEnd = undefined;\n this._finalizeAndAddPath();\n return false;\n },\n\n /**\n * @private\n * @param {Object} pointer Actual mouse position related to the canvas.\n */\n _prepareForDrawing: function(pointer) {\n\n var p = new fabric.Point(pointer.x, pointer.y);\n\n this._reset();\n this._addPoint(p);\n this.canvas.contextTop.moveTo(p.x, p.y);\n },\n\n /**\n * @private\n * @param {fabric.Point} point Point to be added to points array\n */\n _addPoint: function(point) {\n if (this._points.length > 1 && point.eq(this._points[this._points.length - 1])) {\n return false;\n }\n this._points.push(point);\n return true;\n },\n\n /**\n * Clear points array and set contextTop canvas style.\n * @private\n */\n _reset: function() {\n this._points = [];\n this._setBrushStyles();\n this._setShadow();\n },\n\n /**\n * @private\n * @param {Object} pointer Actual mouse position related to the canvas.\n */\n _captureDrawingPath: function(pointer) {\n var pointerPoint = new fabric.Point(pointer.x, pointer.y);\n return this._addPoint(pointerPoint);\n },\n\n /**\n * Draw a smooth path on the topCanvas using quadraticCurveTo\n * @private\n */\n _render: function() {\n var ctx = this.canvas.contextTop, i, len,\n p1 = this._points[0],\n p2 = this._points[1];\n\n this._saveAndTransform(ctx);\n ctx.beginPath();\n //if we only have 2 points in the path and they are the same\n //it means that the user only clicked the canvas without moving the mouse\n //then we should be drawing a dot. A path isn't drawn between two identical dots\n //that's why we set them apart a bit\n if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) {\n var width = this.width / 1000;\n p1 = new fabric.Point(p1.x, p1.y);\n p2 = new fabric.Point(p2.x, p2.y);\n p1.x -= width;\n p2.x += width;\n }\n ctx.moveTo(p1.x, p1.y);\n\n for (i = 1, len = this._points.length; i < len; i++) {\n // we pick the point between pi + 1 & pi + 2 as the\n // end point and p1 as our control point.\n this._drawSegment(ctx, p1, p2);\n p1 = this._points[i];\n p2 = this._points[i + 1];\n }\n // Draw last line as a straight line while\n // we wait for the next point to be able to calculate\n // the bezier control point\n ctx.lineTo(p1.x, p1.y);\n ctx.stroke();\n ctx.restore();\n },\n\n /**\n * Converts points to SVG path\n * @param {Array} points Array of points\n * @return {String} SVG path\n */\n convertPointsToSVGPath: function(points) {\n var path = [], i, width = this.width / 1000,\n p1 = new fabric.Point(points[0].x, points[0].y),\n p2 = new fabric.Point(points[1].x, points[1].y),\n len = points.length, multSignX = 1, multSignY = 0, manyPoints = len > 2;\n\n if (manyPoints) {\n multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1;\n multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1;\n }\n path.push('M ', p1.x - multSignX * width, ' ', p1.y - multSignY * width, ' ');\n for (i = 1; i < len; i++) {\n if (!p1.eq(p2)) {\n var midPoint = p1.midPointFrom(p2);\n // p1 is our bezier control point\n // midpoint is our endpoint\n // start point is p(i-1) value.\n path.push('Q ', p1.x, ' ', p1.y, ' ', midPoint.x, ' ', midPoint.y, ' ');\n }\n p1 = points[i];\n if ((i + 1) < points.length) {\n p2 = points[i + 1];\n }\n }\n if (manyPoints) {\n multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1;\n multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1;\n }\n path.push('L ', p1.x + multSignX * width, ' ', p1.y + multSignY * width);\n return path;\n },\n\n /**\n * Creates fabric.Path object to add on canvas\n * @param {String} pathData Path data\n * @return {fabric.Path} Path to add on canvas\n */\n createPath: function(pathData) {\n var path = new fabric.Path(pathData, {\n fill: null,\n stroke: this.color,\n strokeWidth: this.width,\n strokeLineCap: this.strokeLineCap,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeLineJoin: this.strokeLineJoin,\n strokeDashArray: this.strokeDashArray,\n });\n if (this.shadow) {\n this.shadow.affectStroke = true;\n path.setShadow(this.shadow);\n }\n\n return path;\n },\n\n /**\n * Decimate poins array with the decimate value\n */\n decimatePoints: function(points, distance) {\n if (points.length <= 2) {\n return points;\n }\n var zoom = this.canvas.getZoom(), adjustedDistance = Math.pow(distance / zoom, 2),\n i, l = points.length - 1, lastPoint = points[0], newPoints = [lastPoint],\n cDistance;\n for (i = 1; i < l; i++) {\n cDistance = Math.pow(lastPoint.x - points[i].x, 2) + Math.pow(lastPoint.y - points[i].y, 2);\n if (cDistance >= adjustedDistance) {\n lastPoint = points[i];\n newPoints.push(lastPoint);\n }\n }\n if (newPoints.length === 1) {\n newPoints.push(new fabric.Point(newPoints[0].x, newPoints[0].y));\n }\n return newPoints;\n },\n\n /**\n * On mouseup after drawing the path on contextTop canvas\n * we use the points captured to create an new fabric path object\n * and add it to the fabric canvas.\n */\n _finalizeAndAddPath: function() {\n var ctx = this.canvas.contextTop;\n ctx.closePath();\n if (this.decimate) {\n this._points = this.decimatePoints(this._points, this.decimate);\n }\n var pathData = this.convertPointsToSVGPath(this._points).join('');\n if (pathData === 'M 0 0 Q 0 0 0 0 L 0 0') {\n // do not create 0 width/height paths, as they are\n // rendered inconsistently across browsers\n // Firefox 4, for example, renders a dot,\n // whereas Chrome 10 renders nothing\n this.canvas.requestRenderAll();\n return;\n }\n\n var path = this.createPath(pathData);\n this.canvas.clearContext(this.canvas.contextTop);\n this.canvas.add(path);\n this.canvas.requestRenderAll();\n path.setCoords();\n this._resetShadow();\n\n\n // fire event 'path' created\n this.canvas.fire('path:created', { path: path });\n }\n });\n})();\n\n\n/**\n * CircleBrush class\n * @class fabric.CircleBrush\n */\nfabric.CircleBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.CircleBrush.prototype */ {\n\n /**\n * Width of a brush\n * @type Number\n * @default\n */\n width: 10,\n\n /**\n * Constructor\n * @param {fabric.Canvas} canvas\n * @return {fabric.CircleBrush} Instance of a circle brush\n */\n initialize: function(canvas) {\n this.canvas = canvas;\n this.points = [];\n },\n\n /**\n * Invoked inside on mouse down and mouse move\n * @param {Object} pointer\n */\n drawDot: function(pointer) {\n var point = this.addPoint(pointer),\n ctx = this.canvas.contextTop;\n this._saveAndTransform(ctx);\n this.dot(ctx, point);\n ctx.restore();\n },\n\n dot: function(ctx, point) {\n ctx.fillStyle = point.fill;\n ctx.beginPath();\n ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2, false);\n ctx.closePath();\n ctx.fill();\n },\n\n /**\n * Invoked on mouse down\n */\n onMouseDown: function(pointer) {\n this.points.length = 0;\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n this.drawDot(pointer);\n },\n\n /**\n * Render the full state of the brush\n * @private\n */\n _render: function() {\n var ctx = this.canvas.contextTop, i, len,\n points = this.points;\n this._saveAndTransform(ctx);\n for (i = 0, len = points.length; i < len; i++) {\n this.dot(ctx, points[i]);\n }\n ctx.restore();\n },\n\n /**\n * Invoked on mouse move\n * @param {Object} pointer\n */\n onMouseMove: function(pointer) {\n if (this.needsFullRender()) {\n this.canvas.clearContext(this.canvas.contextTop);\n this.addPoint(pointer);\n this._render();\n }\n else {\n this.drawDot(pointer);\n }\n },\n\n /**\n * Invoked on mouse up\n */\n onMouseUp: function() {\n var originalRenderOnAddRemove = this.canvas.renderOnAddRemove, i, len;\n this.canvas.renderOnAddRemove = false;\n\n var circles = [];\n\n for (i = 0, len = this.points.length; i < len; i++) {\n var point = this.points[i],\n circle = new fabric.Circle({\n radius: point.radius,\n left: point.x,\n top: point.y,\n originX: 'center',\n originY: 'center',\n fill: point.fill\n });\n\n this.shadow && circle.setShadow(this.shadow);\n\n circles.push(circle);\n }\n var group = new fabric.Group(circles);\n group.canvas = this.canvas;\n\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n },\n\n /**\n * @param {Object} pointer\n * @return {fabric.Point} Just added pointer point\n */\n addPoint: function(pointer) {\n var pointerPoint = new fabric.Point(pointer.x, pointer.y),\n\n circleRadius = fabric.util.getRandomInt(\n Math.max(0, this.width - 20), this.width + 20) / 2,\n\n circleColor = new fabric.Color(this.color)\n .setAlpha(fabric.util.getRandomInt(0, 100) / 100)\n .toRgba();\n\n pointerPoint.radius = circleRadius;\n pointerPoint.fill = circleColor;\n\n this.points.push(pointerPoint);\n\n return pointerPoint;\n }\n});\n\n\n/**\n * SprayBrush class\n * @class fabric.SprayBrush\n */\nfabric.SprayBrush = fabric.util.createClass( fabric.BaseBrush, /** @lends fabric.SprayBrush.prototype */ {\n\n /**\n * Width of a spray\n * @type Number\n * @default\n */\n width: 10,\n\n /**\n * Density of a spray (number of dots per chunk)\n * @type Number\n * @default\n */\n density: 20,\n\n /**\n * Width of spray dots\n * @type Number\n * @default\n */\n dotWidth: 1,\n\n /**\n * Width variance of spray dots\n * @type Number\n * @default\n */\n dotWidthVariance: 1,\n\n /**\n * Whether opacity of a dot should be random\n * @type Boolean\n * @default\n */\n randomOpacity: false,\n\n /**\n * Whether overlapping dots (rectangles) should be removed (for performance reasons)\n * @type Boolean\n * @default\n */\n optimizeOverlapping: true,\n\n /**\n * Constructor\n * @param {fabric.Canvas} canvas\n * @return {fabric.SprayBrush} Instance of a spray brush\n */\n initialize: function(canvas) {\n this.canvas = canvas;\n this.sprayChunks = [];\n },\n\n /**\n * Invoked on mouse down\n * @param {Object} pointer\n */\n onMouseDown: function(pointer) {\n this.sprayChunks.length = 0;\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n\n this.addSprayChunk(pointer);\n this.render(this.sprayChunkPoints);\n },\n\n /**\n * Invoked on mouse move\n * @param {Object} pointer\n */\n onMouseMove: function(pointer) {\n this.addSprayChunk(pointer);\n this.render(this.sprayChunkPoints);\n },\n\n /**\n * Invoked on mouse up\n */\n onMouseUp: function() {\n var originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n var rects = [];\n\n for (var i = 0, ilen = this.sprayChunks.length; i < ilen; i++) {\n var sprayChunk = this.sprayChunks[i];\n\n for (var j = 0, jlen = sprayChunk.length; j < jlen; j++) {\n\n var rect = new fabric.Rect({\n width: sprayChunk[j].width,\n height: sprayChunk[j].width,\n left: sprayChunk[j].x + 1,\n top: sprayChunk[j].y + 1,\n originX: 'center',\n originY: 'center',\n fill: this.color\n });\n rects.push(rect);\n }\n }\n\n if (this.optimizeOverlapping) {\n rects = this._getOptimizedRects(rects);\n }\n\n var group = new fabric.Group(rects);\n this.shadow && group.setShadow(this.shadow);\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n },\n\n /**\n * @private\n * @param {Array} rects\n */\n _getOptimizedRects: function(rects) {\n\n // avoid creating duplicate rects at the same coordinates\n var uniqueRects = { }, key, i, len;\n\n for (i = 0, len = rects.length; i < len; i++) {\n key = rects[i].left + '' + rects[i].top;\n if (!uniqueRects[key]) {\n uniqueRects[key] = rects[i];\n }\n }\n var uniqueRectsArray = [];\n for (key in uniqueRects) {\n uniqueRectsArray.push(uniqueRects[key]);\n }\n\n return uniqueRectsArray;\n },\n\n /**\n * Render new chunk of spray brush\n */\n render: function(sprayChunk) {\n var ctx = this.canvas.contextTop, i, len;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (i = 0, len = sprayChunk.length; i < len; i++) {\n var point = sprayChunk[i];\n if (typeof point.opacity !== 'undefined') {\n ctx.globalAlpha = point.opacity;\n }\n ctx.fillRect(point.x, point.y, point.width, point.width);\n }\n ctx.restore();\n },\n\n /**\n * Render all spray chunks\n */\n _render: function() {\n var ctx = this.canvas.contextTop, i, ilen;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (i = 0, ilen = this.sprayChunks.length; i < ilen; i++) {\n this.render(this.sprayChunks[i]);\n }\n ctx.restore();\n },\n\n /**\n * @param {Object} pointer\n */\n addSprayChunk: function(pointer) {\n this.sprayChunkPoints = [];\n\n var x, y, width, radius = this.width / 2, i;\n\n for (i = 0; i < this.density; i++) {\n\n x = fabric.util.getRandomInt(pointer.x - radius, pointer.x + radius);\n y = fabric.util.getRandomInt(pointer.y - radius, pointer.y + radius);\n\n if (this.dotWidthVariance) {\n width = fabric.util.getRandomInt(\n // bottom clamp width to 1\n Math.max(1, this.dotWidth - this.dotWidthVariance),\n this.dotWidth + this.dotWidthVariance);\n }\n else {\n width = this.dotWidth;\n }\n\n var point = new fabric.Point(x, y);\n point.width = width;\n\n if (this.randomOpacity) {\n point.opacity = fabric.util.getRandomInt(0, 100) / 100;\n }\n\n this.sprayChunkPoints.push(point);\n }\n\n this.sprayChunks.push(this.sprayChunkPoints);\n }\n});\n\n\n/**\n * PatternBrush class\n * @class fabric.PatternBrush\n * @extends fabric.BaseBrush\n */\nfabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fabric.PatternBrush.prototype */ {\n\n getPatternSrc: function() {\n\n var dotWidth = 20,\n dotDistance = 5,\n patternCanvas = fabric.util.createCanvasElement(),\n patternCtx = patternCanvas.getContext('2d');\n\n patternCanvas.width = patternCanvas.height = dotWidth + dotDistance;\n\n patternCtx.fillStyle = this.color;\n patternCtx.beginPath();\n patternCtx.arc(dotWidth / 2, dotWidth / 2, dotWidth / 2, 0, Math.PI * 2, false);\n patternCtx.closePath();\n patternCtx.fill();\n\n return patternCanvas;\n },\n\n getPatternSrcFunction: function() {\n return String(this.getPatternSrc).replace('this.color', '\"' + this.color + '\"');\n },\n\n /**\n * Creates \"pattern\" instance property\n */\n getPattern: function() {\n return this.canvas.contextTop.createPattern(this.source || this.getPatternSrc(), 'repeat');\n },\n\n /**\n * Sets brush styles\n */\n _setBrushStyles: function() {\n this.callSuper('_setBrushStyles');\n this.canvas.contextTop.strokeStyle = this.getPattern();\n },\n\n /**\n * Creates path\n */\n createPath: function(pathData) {\n var path = this.callSuper('createPath', pathData),\n topLeft = path._getLeftTopCoords().scalarAdd(path.strokeWidth / 2);\n\n path.stroke = new fabric.Pattern({\n source: this.source || this.getPatternSrcFunction(),\n offsetX: -topLeft.x,\n offsetY: -topLeft.y\n });\n return path;\n }\n});\n\n\n(function() {\n\n var getPointer = fabric.util.getPointer,\n degreesToRadians = fabric.util.degreesToRadians,\n radiansToDegrees = fabric.util.radiansToDegrees,\n atan2 = Math.atan2,\n abs = Math.abs,\n supportLineDash = fabric.StaticCanvas.supports('setLineDash'),\n\n STROKE_OFFSET = 0.5;\n\n /**\n * Canvas class\n * @class fabric.Canvas\n * @extends fabric.StaticCanvas\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#canvas}\n * @see {@link fabric.Canvas#initialize} for constructor definition\n *\n * @fires object:modified at the end of a transform or any change when statefull is true\n * @fires object:rotated at the end of a rotation transform\n * @fires object:scaled at the end of a scale transform\n * @fires object:moved at the end of translation transform\n * @fires object:skewed at the end of a skew transform\n * @fires object:rotating while an object is being rotated from the control\n * @fires object:scaling while an object is being scaled by controls\n * @fires object:moving while an object is being dragged\n * @fires object:skewing while an object is being skewed from the controls\n * @fires object:selected this event is deprecated. use selection:created\n *\n * @fires before:transform before a transform is is started\n * @fires before:selection:cleared\n * @fires selection:cleared\n * @fires selection:updated\n * @fires selection:created\n *\n * @fires path:created after a drawing operation ends and the path is added\n * @fires mouse:down\n * @fires mouse:move\n * @fires mouse:up\n * @fires mouse:down:before on mouse down, before the inner fabric logic runs\n * @fires mouse:move:before on mouse move, before the inner fabric logic runs\n * @fires mouse:up:before on mouse up, before the inner fabric logic runs\n * @fires mouse:over\n * @fires mouse:out\n * @fires mouse:dblclick whenever a native dbl click event fires on the canvas.\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drop\n * @fires after:render at the end of the render process, receives the context in the callback\n * @fires before:render at start the render process, receives the context in the callback\n *\n */\n fabric.Canvas = fabric.util.createClass(fabric.StaticCanvas, /** @lends fabric.Canvas.prototype */ {\n\n /**\n * Constructor\n * @param {HTMLElement | String} el <canvas> element to initialize instance on\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(el, options) {\n options || (options = { });\n this.renderAndResetBound = this.renderAndReset.bind(this);\n this.requestRenderAllBound = this.requestRenderAll.bind(this);\n this._initStatic(el, options);\n this._initInteractive();\n this._createCacheCanvas();\n },\n\n /**\n * When true, objects can be transformed by one side (unproportionally)\n * @type Boolean\n * @default\n */\n uniScaleTransform: false,\n\n /**\n * Indicates which key enable unproportional scaling\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type String\n * @default\n */\n uniScaleKey: 'shiftKey',\n\n /**\n * When true, objects use center point as the origin of scale transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredScaling: false,\n\n /**\n * When true, objects use center point as the origin of rotate transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredRotation: false,\n\n /**\n * Indicates which key enable centered Transform\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type String\n * @default\n */\n centeredKey: 'altKey',\n\n /**\n * Indicates which key enable alternate action on corner\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type String\n * @default\n */\n altActionKey: 'shiftKey',\n\n /**\n * Indicates that canvas is interactive. This property should not be changed.\n * @type Boolean\n * @default\n */\n interactive: true,\n\n /**\n * Indicates whether group selection should be enabled\n * @type Boolean\n * @default\n */\n selection: true,\n\n /**\n * Indicates which key or keys enable multiple click selection\n * Pass value as a string or array of strings\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or empty or containing any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.2\n * @type String|Array\n * @default\n */\n selectionKey: 'shiftKey',\n\n /**\n * Indicates which key enable alternative selection\n * in case of target overlapping with active object\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * For a series of reason that come from the general expectations on how\n * things should work, this feature works only for preserveObjectStacking true.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.5\n * @type null|String\n * @default\n */\n altSelectionKey: null,\n\n /**\n * Color of selection\n * @type String\n * @default\n */\n selectionColor: 'rgba(100, 100, 255, 0.3)', // blue\n\n /**\n * Default dash array pattern\n * If not empty the selection border is dashed\n * @type Array\n */\n selectionDashArray: [],\n\n /**\n * Color of the border of selection (usually slightly darker than color of selection itself)\n * @type String\n * @default\n */\n selectionBorderColor: 'rgba(255, 255, 255, 0.3)',\n\n /**\n * Width of a line used in object/group selection\n * @type Number\n * @default\n */\n selectionLineWidth: 1,\n\n /**\n * Select only shapes that are fully contained in the dragged selection rectangle.\n * @type Boolean\n * @default\n */\n selectionFullyContained: false,\n\n /**\n * Default cursor value used when hovering over an object on canvas\n * @type String\n * @default\n */\n hoverCursor: 'move',\n\n /**\n * Default cursor value used when moving an object on canvas\n * @type String\n * @default\n */\n moveCursor: 'move',\n\n /**\n * Default cursor value used for the entire canvas\n * @type String\n * @default\n */\n defaultCursor: 'default',\n\n /**\n * Cursor value used during free drawing\n * @type String\n * @default\n */\n freeDrawingCursor: 'crosshair',\n\n /**\n * Cursor value used for rotation point\n * @type String\n * @default\n */\n rotationCursor: 'crosshair',\n\n /**\n * Cursor value used for disabled elements ( corners with disabled action )\n * @type String\n * @since 2.0.0\n * @default\n */\n notAllowedCursor: 'not-allowed',\n\n /**\n * Default element class that's given to wrapper (div) element of canvas\n * @type String\n * @default\n */\n containerClass: 'canvas-container',\n\n /**\n * When true, object detection happens on per-pixel basis rather than on per-bounding-box\n * @type Boolean\n * @default\n */\n perPixelTargetFind: false,\n\n /**\n * Number of pixels around target pixel to tolerate (consider active) during object detection\n * @type Number\n * @default\n */\n targetFindTolerance: 0,\n\n /**\n * When true, target detection is skipped when hovering over canvas. This can be used to improve performance.\n * @type Boolean\n * @default\n */\n skipTargetFind: false,\n\n /**\n * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing.\n * After mousedown, mousemove creates a shape,\n * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas.\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-4#free_drawing}\n * @type Boolean\n * @default\n */\n isDrawingMode: false,\n\n /**\n * Indicates whether objects should remain in current stack position when selected.\n * When false objects are brought to top and rendered as part of the selection group\n * @type Boolean\n * @default\n */\n preserveObjectStacking: false,\n\n /**\n * Indicates the angle that an object will lock to while rotating.\n * @type Number\n * @since 1.6.7\n * @default\n */\n snapAngle: 0,\n\n /**\n * Indicates the distance from the snapAngle the rotation will lock to the snapAngle.\n * When `null`, the snapThreshold will default to the snapAngle.\n * @type null|Number\n * @since 1.6.7\n * @default\n */\n snapThreshold: null,\n\n /**\n * Indicates if the right click on canvas can output the context menu or not\n * @type Boolean\n * @since 1.6.5\n * @default\n */\n stopContextMenu: false,\n\n /**\n * Indicates if the canvas can fire right click events\n * @type Boolean\n * @since 1.6.5\n * @default\n */\n fireRightClick: false,\n\n /**\n * Indicates if the canvas can fire middle click events\n * @type Boolean\n * @since 1.7.8\n * @default\n */\n fireMiddleClick: false,\n\n /**\n * Keep track of the subTargets for Mouse Events\n * @type fabric.Object[]\n */\n targets: [],\n\n /**\n * Keep track of the hovered target\n * @type fabric.Object\n * @private\n */\n _hoveredTarget: null,\n\n /**\n * hold the list of nested targets hovered\n * @type fabric.Object[]\n * @private\n */\n _hoveredTargets: [],\n\n /**\n * @private\n */\n _initInteractive: function() {\n this._currentTransform = null;\n this._groupSelector = null;\n this._initWrapperElement();\n this._createUpperCanvas();\n this._initEventListeners();\n\n this._initRetinaScaling();\n\n this.freeDrawingBrush = fabric.PencilBrush && new fabric.PencilBrush(this);\n\n this.calcOffset();\n },\n\n /**\n * Divides objects in two groups, one to render immediately\n * and one to render as activeGroup.\n * @return {Array} objects to render immediately and pushes the other in the activeGroup.\n */\n _chooseObjectsToRender: function() {\n var activeObjects = this.getActiveObjects(),\n object, objsToRender, activeGroupObjects;\n\n if (activeObjects.length > 0 && !this.preserveObjectStacking) {\n objsToRender = [];\n activeGroupObjects = [];\n for (var i = 0, length = this._objects.length; i < length; i++) {\n object = this._objects[i];\n if (activeObjects.indexOf(object) === -1 ) {\n objsToRender.push(object);\n }\n else {\n activeGroupObjects.push(object);\n }\n }\n if (activeObjects.length > 1) {\n this._activeObject._objects = activeGroupObjects;\n }\n objsToRender.push.apply(objsToRender, activeGroupObjects);\n }\n else {\n objsToRender = this._objects;\n }\n return objsToRender;\n },\n\n /**\n * Renders both the top canvas and the secondary container canvas.\n * @return {fabric.Canvas} instance\n * @chainable\n */\n renderAll: function () {\n if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) {\n this.clearContext(this.contextTop);\n this.contextTopDirty = false;\n }\n if (this.hasLostContext) {\n this.renderTopLayer(this.contextTop);\n }\n var canvasToDrawOn = this.contextContainer;\n this.renderCanvas(canvasToDrawOn, this._chooseObjectsToRender());\n return this;\n },\n\n renderTopLayer: function(ctx) {\n ctx.save();\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this.freeDrawingBrush && this.freeDrawingBrush._render();\n this.contextTopDirty = true;\n }\n // we render the top context - last object\n if (this.selection && this._groupSelector) {\n this._drawSelection(ctx);\n this.contextTopDirty = true;\n }\n ctx.restore();\n },\n\n /**\n * Method to render only the top canvas.\n * Also used to render the group selection box.\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n renderTop: function () {\n var ctx = this.contextTop;\n this.clearContext(ctx);\n this.renderTopLayer(ctx);\n this.fire('after:render');\n return this;\n },\n\n /**\n * Resets the current transform to its original values and chooses the type of resizing based on the event\n * @private\n */\n _resetCurrentTransform: function() {\n var t = this._currentTransform;\n\n t.target.set({\n scaleX: t.original.scaleX,\n scaleY: t.original.scaleY,\n skewX: t.original.skewX,\n skewY: t.original.skewY,\n left: t.original.left,\n top: t.original.top\n });\n\n if (this._shouldCenterTransform(t.target)) {\n if (t.originX !== 'center') {\n if (t.originX === 'right') {\n t.mouseXSign = -1;\n }\n else {\n t.mouseXSign = 1;\n }\n }\n if (t.originY !== 'center') {\n if (t.originY === 'bottom') {\n t.mouseYSign = -1;\n }\n else {\n t.mouseYSign = 1;\n }\n }\n\n t.originX = 'center';\n t.originY = 'center';\n }\n else {\n t.originX = t.original.originX;\n t.originY = t.original.originY;\n }\n },\n\n /**\n * Checks if point is contained within an area of given object\n * @param {Event} e Event object\n * @param {fabric.Object} target Object to test against\n * @param {Object} [point] x,y object of point coordinates we want to check.\n * @return {Boolean} true if point is contained within an area of given object\n */\n containsPoint: function (e, target, point) {\n var ignoreZoom = true,\n pointer = point || this.getPointer(e, ignoreZoom),\n xy;\n\n if (target.group && target.group === this._activeObject && target.group.type === 'activeSelection') {\n xy = this._normalizePointer(target.group, pointer);\n }\n else {\n xy = { x: pointer.x, y: pointer.y };\n }\n // http://www.geog.ubc.ca/courses/klink/gis.notes/ncgia/u32.html\n // http://idav.ucdavis.edu/~okreylos/TAship/Spring2000/PointInPolygon.html\n return (target.containsPoint(xy) || target._findTargetCorner(pointer));\n },\n\n /**\n * @private\n */\n _normalizePointer: function (object, pointer) {\n var m = object.calcTransformMatrix(),\n invertedM = fabric.util.invertTransform(m),\n vptPointer = this.restorePointerVpt(pointer);\n return fabric.util.transformPoint(vptPointer, invertedM);\n },\n\n /**\n * Returns true if object is transparent at a certain location\n * @param {fabric.Object} target Object to check\n * @param {Number} x Left coordinate\n * @param {Number} y Top coordinate\n * @return {Boolean}\n */\n isTargetTransparent: function (target, x, y) {\n // in case the target is the activeObject, we cannot execute this optimization\n // because we need to draw controls too.\n if (target.shouldCache() && target._cacheCanvas && target !== this._activeObject) {\n var normalizedPointer = this._normalizePointer(target, {x: x, y: y}),\n targetRelativeX = Math.max(target.cacheTranslationX + (normalizedPointer.x * target.zoomX), 0),\n targetRelativeY = Math.max(target.cacheTranslationY + (normalizedPointer.y * target.zoomY), 0);\n\n var isTransparent = fabric.util.isTransparent(\n target._cacheContext, Math.round(targetRelativeX), Math.round(targetRelativeY), this.targetFindTolerance);\n\n return isTransparent;\n }\n\n var ctx = this.contextCache,\n originalColor = target.selectionBackgroundColor, v = this.viewportTransform;\n\n target.selectionBackgroundColor = '';\n\n this.clearContext(ctx);\n\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n target.render(ctx);\n ctx.restore();\n\n target === this._activeObject && target._renderControls(ctx, {\n hasBorders: false,\n transparentCorners: false\n }, {\n hasBorders: false,\n });\n\n target.selectionBackgroundColor = originalColor;\n\n var isTransparent = fabric.util.isTransparent(\n ctx, x, y, this.targetFindTolerance);\n\n return isTransparent;\n },\n\n /**\n * takes an event and determins if selection key has been pressed\n * @private\n * @param {Event} e Event object\n */\n _isSelectionKeyPressed: function(e) {\n var selectionKeyPressed = false;\n\n if (Object.prototype.toString.call(this.selectionKey) === '[object Array]') {\n selectionKeyPressed = !!this.selectionKey.find(function(key) { return e[key] === true; });\n }\n else {\n selectionKeyPressed = e[this.selectionKey];\n }\n\n return selectionKeyPressed;\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n */\n _shouldClearSelection: function (e, target) {\n var activeObjects = this.getActiveObjects(),\n activeObject = this._activeObject;\n\n return (\n !target\n ||\n (target &&\n activeObject &&\n activeObjects.length > 1 &&\n activeObjects.indexOf(target) === -1 &&\n activeObject !== target &&\n !this._isSelectionKeyPressed(e))\n ||\n (target && !target.evented)\n ||\n (target &&\n !target.selectable &&\n activeObject &&\n activeObject !== target)\n );\n },\n\n /**\n * centeredScaling from object can't override centeredScaling from canvas.\n * this should be fixed, since object setting should take precedence over canvas.\n * @private\n * @param {fabric.Object} target\n */\n _shouldCenterTransform: function (target) {\n if (!target) {\n return;\n }\n\n var t = this._currentTransform,\n centerTransform;\n\n if (t.action === 'scale' || t.action === 'scaleX' || t.action === 'scaleY') {\n centerTransform = this.centeredScaling || target.centeredScaling;\n }\n else if (t.action === 'rotate') {\n centerTransform = this.centeredRotation || target.centeredRotation;\n }\n\n return centerTransform ? !t.altKey : t.altKey;\n },\n\n /**\n * @private\n */\n _getOriginFromCorner: function(target, corner) {\n var origin = {\n x: target.originX,\n y: target.originY\n };\n\n if (corner === 'ml' || corner === 'tl' || corner === 'bl') {\n origin.x = 'right';\n }\n else if (corner === 'mr' || corner === 'tr' || corner === 'br') {\n origin.x = 'left';\n }\n\n if (corner === 'tl' || corner === 'mt' || corner === 'tr') {\n origin.y = 'bottom';\n }\n else if (corner === 'bl' || corner === 'mb' || corner === 'br') {\n origin.y = 'top';\n }\n\n return origin;\n },\n\n /**\n * @private\n * @param {Boolean} alreadySelected true if target is already selected\n * @param {String} corner a string representing the corner ml, mr, tl ...\n * @param {Event} e Event object\n * @param {fabric.Object} [target] inserted back to help overriding. Unused\n */\n _getActionFromCorner: function(alreadySelected, corner, e /* target */) {\n if (!corner || !alreadySelected) {\n return 'drag';\n }\n\n switch (corner) {\n case 'mtr':\n return 'rotate';\n case 'ml':\n case 'mr':\n return e[this.altActionKey] ? 'skewY' : 'scaleX';\n case 'mt':\n case 'mb':\n return e[this.altActionKey] ? 'skewX' : 'scaleY';\n default:\n return 'scale';\n }\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n */\n _setupCurrentTransform: function (e, target, alreadySelected) {\n if (!target) {\n return;\n }\n\n var pointer = this.getPointer(e),\n corner = target._findTargetCorner(this.getPointer(e, true)),\n action = this._getActionFromCorner(alreadySelected, corner, e, target),\n origin = this._getOriginFromCorner(target, corner);\n\n this._currentTransform = {\n target: target,\n action: action,\n corner: corner,\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n // used by transation\n offsetX: pointer.x - target.left,\n offsetY: pointer.y - target.top,\n originX: origin.x,\n originY: origin.y,\n ex: pointer.x,\n ey: pointer.y,\n lastX: pointer.x,\n lastY: pointer.y,\n // unsure they are usefull anymore.\n // left: target.left,\n // top: target.top,\n theta: degreesToRadians(target.angle),\n // end of unsure\n width: target.width * target.scaleX,\n mouseXSign: 1,\n mouseYSign: 1,\n shiftKey: e.shiftKey,\n altKey: e[this.centeredKey],\n original: fabric.util.saveObjectTransform(target),\n };\n\n this._currentTransform.original.originX = origin.x;\n this._currentTransform.original.originY = origin.y;\n\n this._resetCurrentTransform();\n this._beforeTransform(e);\n },\n\n /**\n * Translates object by \"setting\" its left/top\n * @private\n * @param {Number} x pointer's x coordinate\n * @param {Number} y pointer's y coordinate\n * @return {Boolean} true if the translation occurred\n */\n _translateObject: function (x, y) {\n var transform = this._currentTransform,\n target = transform.target,\n newLeft = x - transform.offsetX,\n newTop = y - transform.offsetY,\n moveX = !target.get('lockMovementX') && target.left !== newLeft,\n moveY = !target.get('lockMovementY') && target.top !== newTop;\n\n moveX && target.set('left', newLeft);\n moveY && target.set('top', newTop);\n return moveX || moveY;\n },\n\n /**\n * Check if we are increasing a positive skew or lower it,\n * checking mouse direction and pressed corner.\n * @private\n */\n _changeSkewTransformOrigin: function(mouseMove, t, by) {\n var property = 'originX', origins = { 0: 'center' },\n skew = t.target.skewX, originA = 'left', originB = 'right',\n corner = t.corner === 'mt' || t.corner === 'ml' ? 1 : -1,\n flipSign = 1;\n\n mouseMove = mouseMove > 0 ? 1 : -1;\n if (by === 'y') {\n skew = t.target.skewY;\n originA = 'top';\n originB = 'bottom';\n property = 'originY';\n }\n origins[-1] = originA;\n origins[1] = originB;\n\n t.target.flipX && (flipSign *= -1);\n t.target.flipY && (flipSign *= -1);\n\n if (skew === 0) {\n t.skewSign = -corner * mouseMove * flipSign;\n t[property] = origins[-mouseMove];\n }\n else {\n skew = skew > 0 ? 1 : -1;\n t.skewSign = skew;\n t[property] = origins[skew * corner * flipSign];\n }\n },\n\n /**\n * Skew object by mouse events\n * @private\n * @param {Number} x pointer's x coordinate\n * @param {Number} y pointer's y coordinate\n * @param {String} by Either 'x' or 'y'\n * @return {Boolean} true if the skewing occurred\n */\n _skewObject: function (x, y, by) {\n var t = this._currentTransform,\n target = t.target, skewed = false,\n lockSkewingX = target.get('lockSkewingX'),\n lockSkewingY = target.get('lockSkewingY');\n\n if ((lockSkewingX && by === 'x') || (lockSkewingY && by === 'y')) {\n return false;\n }\n\n // Get the constraint point\n var center = target.getCenterPoint(),\n actualMouseByCenter = target.toLocalPoint(new fabric.Point(x, y), 'center', 'center')[by],\n lastMouseByCenter = target.toLocalPoint(new fabric.Point(t.lastX, t.lastY), 'center', 'center')[by],\n actualMouseByOrigin, constraintPosition, dim = target._getTransformedDimensions();\n\n this._changeSkewTransformOrigin(actualMouseByCenter - lastMouseByCenter, t, by);\n actualMouseByOrigin = target.toLocalPoint(new fabric.Point(x, y), t.originX, t.originY)[by];\n constraintPosition = target.translateToOriginPoint(center, t.originX, t.originY);\n // Actually skew the object\n skewed = this._setObjectSkew(actualMouseByOrigin, t, by, dim);\n t.lastX = x;\n t.lastY = y;\n // Make sure the constraints apply\n target.setPositionByOrigin(constraintPosition, t.originX, t.originY);\n return skewed;\n },\n\n /**\n * Set object skew\n * @private\n * @return {Boolean} true if the skewing occurred\n */\n _setObjectSkew: function(localMouse, transform, by, _dim) {\n var target = transform.target, newValue, skewed = false,\n skewSign = transform.skewSign, newDim, dimNoSkew,\n otherBy, _otherBy, _by, newDimMouse, skewX, skewY;\n\n if (by === 'x') {\n otherBy = 'y';\n _otherBy = 'Y';\n _by = 'X';\n skewX = 0;\n skewY = target.skewY;\n }\n else {\n otherBy = 'x';\n _otherBy = 'X';\n _by = 'Y';\n skewX = target.skewX;\n skewY = 0;\n }\n\n dimNoSkew = target._getTransformedDimensions(skewX, skewY);\n newDimMouse = 2 * Math.abs(localMouse) - dimNoSkew[by];\n if (newDimMouse <= 2) {\n newValue = 0;\n }\n else {\n newValue = skewSign * Math.atan((newDimMouse / target['scale' + _by]) /\n (dimNoSkew[otherBy] / target['scale' + _otherBy]));\n newValue = fabric.util.radiansToDegrees(newValue);\n }\n skewed = target['skew' + _by] !== newValue;\n target.set('skew' + _by, newValue);\n if (target['skew' + _otherBy] !== 0) {\n newDim = target._getTransformedDimensions();\n newValue = (_dim[otherBy] / newDim[otherBy]) * target['scale' + _otherBy];\n target.set('scale' + _otherBy, newValue);\n }\n return skewed;\n },\n\n /**\n * Scales object by invoking its scaleX/scaleY methods\n * @private\n * @param {Number} x pointer's x coordinate\n * @param {Number} y pointer's y coordinate\n * @param {String} by Either 'x' or 'y' - specifies dimension constraint by which to scale an object.\n * When not provided, an object is scaled by both dimensions equally\n * @return {Boolean} true if the scaling occurred\n */\n _scaleObject: function (x, y, by) {\n var t = this._currentTransform,\n target = t.target,\n lockScalingX = target.lockScalingX,\n lockScalingY = target.lockScalingY,\n lockScalingFlip = target.lockScalingFlip;\n\n if (lockScalingX && lockScalingY) {\n return false;\n }\n\n // Get the constraint point\n var constraintPosition = target.translateToOriginPoint(target.getCenterPoint(), t.originX, t.originY),\n localMouse = target.toLocalPoint(new fabric.Point(x, y), t.originX, t.originY),\n dim = target._getTransformedDimensions(), scaled = false;\n\n this._setLocalMouse(localMouse, t);\n\n // Actually scale the object\n scaled = this._setObjectScale(localMouse, t, lockScalingX, lockScalingY, by, lockScalingFlip, dim);\n\n // Make sure the constraints apply\n target.setPositionByOrigin(constraintPosition, t.originX, t.originY);\n return scaled;\n },\n\n /**\n * @private\n * @return {Boolean} true if the scaling occurred\n */\n _setObjectScale: function(localMouse, transform, lockScalingX, lockScalingY, by, lockScalingFlip, _dim) {\n var target = transform.target, forbidScalingX = false, forbidScalingY = false, scaled = false,\n scaleX = localMouse.x * target.scaleX / _dim.x,\n scaleY = localMouse.y * target.scaleY / _dim.y,\n changeX = target.scaleX !== scaleX,\n changeY = target.scaleY !== scaleY;\n\n transform.newScaleX = scaleX;\n transform.newScaleY = scaleY;\n if (fabric.Textbox && by === 'x' && target instanceof fabric.Textbox) {\n var w = target.width * (localMouse.x / _dim.x);\n if (w >= target.getMinWidth()) {\n scaled = w !== target.width;\n target.set('width', w);\n return scaled;\n }\n return false;\n }\n\n if (lockScalingFlip && scaleX <= 0 && scaleX < target.scaleX) {\n forbidScalingX = true;\n localMouse.x = 0;\n }\n\n if (lockScalingFlip && scaleY <= 0 && scaleY < target.scaleY) {\n forbidScalingY = true;\n localMouse.y = 0;\n }\n\n if (by === 'equally' && !lockScalingX && !lockScalingY) {\n scaled = this._scaleObjectEqually(localMouse, target, transform, _dim);\n }\n else if (!by) {\n forbidScalingX || lockScalingX || (target.set('scaleX', scaleX) && (scaled = scaled || changeX));\n forbidScalingY || lockScalingY || (target.set('scaleY', scaleY) && (scaled = scaled || changeY));\n }\n else if (by === 'x' && !target.get('lockUniScaling')) {\n forbidScalingX || lockScalingX || (target.set('scaleX', scaleX) && (scaled = changeX));\n }\n else if (by === 'y' && !target.get('lockUniScaling')) {\n forbidScalingY || lockScalingY || (target.set('scaleY', scaleY) && (scaled = changeY));\n }\n forbidScalingX || forbidScalingY || this._flipObject(transform, by);\n return scaled;\n },\n\n /**\n * @private\n * @return {Boolean} true if the scaling occurred\n */\n _scaleObjectEqually: function(localMouse, target, transform, _dim) {\n\n var dist = localMouse.y + localMouse.x,\n lastDist = _dim.y * transform.original.scaleY / target.scaleY +\n _dim.x * transform.original.scaleX / target.scaleX,\n scaled, signX = localMouse.x < 0 ? -1 : 1,\n signY = localMouse.y < 0 ? -1 : 1, newScaleX, newScaleY;\n\n // We use transform.scaleX/Y instead of target.scaleX/Y\n // because the object may have a min scale and we'll loose the proportions\n newScaleX = signX * Math.abs(transform.original.scaleX * dist / lastDist);\n newScaleY = signY * Math.abs(transform.original.scaleY * dist / lastDist);\n scaled = newScaleX !== target.scaleX || newScaleY !== target.scaleY;\n target.set('scaleX', newScaleX);\n target.set('scaleY', newScaleY);\n return scaled;\n },\n\n /**\n * @private\n */\n _flipObject: function(transform, by) {\n if (transform.newScaleX < 0 && by !== 'y') {\n if (transform.originX === 'left') {\n transform.originX = 'right';\n }\n else if (transform.originX === 'right') {\n transform.originX = 'left';\n }\n }\n\n if (transform.newScaleY < 0 && by !== 'x') {\n if (transform.originY === 'top') {\n transform.originY = 'bottom';\n }\n else if (transform.originY === 'bottom') {\n transform.originY = 'top';\n }\n }\n },\n\n /**\n * @private\n */\n _setLocalMouse: function(localMouse, t) {\n var target = t.target, zoom = this.getZoom(),\n padding = target.padding / zoom;\n\n if (t.originX === 'right') {\n localMouse.x *= -1;\n }\n else if (t.originX === 'center') {\n localMouse.x *= t.mouseXSign * 2;\n if (localMouse.x < 0) {\n t.mouseXSign = -t.mouseXSign;\n }\n }\n\n if (t.originY === 'bottom') {\n localMouse.y *= -1;\n }\n else if (t.originY === 'center') {\n localMouse.y *= t.mouseYSign * 2;\n if (localMouse.y < 0) {\n t.mouseYSign = -t.mouseYSign;\n }\n }\n\n // adjust the mouse coordinates when dealing with padding\n if (abs(localMouse.x) > padding) {\n if (localMouse.x < 0) {\n localMouse.x += padding;\n }\n else {\n localMouse.x -= padding;\n }\n }\n else { // mouse is within the padding, set to 0\n localMouse.x = 0;\n }\n\n if (abs(localMouse.y) > padding) {\n if (localMouse.y < 0) {\n localMouse.y += padding;\n }\n else {\n localMouse.y -= padding;\n }\n }\n else {\n localMouse.y = 0;\n }\n },\n\n /**\n * Rotates object by invoking its rotate method\n * @private\n * @param {Number} x pointer's x coordinate\n * @param {Number} y pointer's y coordinate\n * @return {Boolean} true if the rotation occurred\n */\n _rotateObject: function (x, y) {\n\n var t = this._currentTransform,\n target = t.target, constraintPosition,\n constraintPosition = target.translateToOriginPoint(target.getCenterPoint(), t.originX, t.originY);\n\n if (target.lockRotation) {\n return false;\n }\n\n var lastAngle = atan2(t.ey - constraintPosition.y, t.ex - constraintPosition.x),\n curAngle = atan2(y - constraintPosition.y, x - constraintPosition.x),\n angle = radiansToDegrees(curAngle - lastAngle + t.theta),\n hasRotated = true;\n\n if (target.snapAngle > 0) {\n var snapAngle = target.snapAngle,\n snapThreshold = target.snapThreshold || snapAngle,\n rightAngleLocked = Math.ceil(angle / snapAngle) * snapAngle,\n leftAngleLocked = Math.floor(angle / snapAngle) * snapAngle;\n\n if (Math.abs(angle - leftAngleLocked) < snapThreshold) {\n angle = leftAngleLocked;\n }\n else if (Math.abs(angle - rightAngleLocked) < snapThreshold) {\n angle = rightAngleLocked;\n }\n }\n\n // normalize angle to positive value\n if (angle < 0) {\n angle = 360 + angle;\n }\n angle %= 360;\n\n if (target.angle === angle) {\n hasRotated = false;\n }\n else {\n // rotation only happen here\n target.angle = angle;\n // Make sure the constraints apply\n target.setPositionByOrigin(constraintPosition, t.originX, t.originY);\n }\n\n return hasRotated;\n },\n\n /**\n * Set the cursor type of the canvas element\n * @param {String} value Cursor type of the canvas element.\n * @see http://www.w3.org/TR/css3-ui/#cursor\n */\n setCursor: function (value) {\n this.upperCanvasEl.style.cursor = value;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx to draw the selection on\n */\n _drawSelection: function (ctx) {\n var groupSelector = this._groupSelector,\n left = groupSelector.left,\n top = groupSelector.top,\n aleft = abs(left),\n atop = abs(top);\n\n if (this.selectionColor) {\n ctx.fillStyle = this.selectionColor;\n\n ctx.fillRect(\n groupSelector.ex - ((left > 0) ? 0 : -left),\n groupSelector.ey - ((top > 0) ? 0 : -top),\n aleft,\n atop\n );\n }\n\n if (!this.selectionLineWidth || !this.selectionBorderColor) {\n return;\n }\n ctx.lineWidth = this.selectionLineWidth;\n ctx.strokeStyle = this.selectionBorderColor;\n\n // selection border\n if (this.selectionDashArray.length > 1 && !supportLineDash) {\n\n var px = groupSelector.ex + STROKE_OFFSET - ((left > 0) ? 0 : aleft),\n py = groupSelector.ey + STROKE_OFFSET - ((top > 0) ? 0 : atop);\n\n ctx.beginPath();\n\n fabric.util.drawDashedLine(ctx, px, py, px + aleft, py, this.selectionDashArray);\n fabric.util.drawDashedLine(ctx, px, py + atop - 1, px + aleft, py + atop - 1, this.selectionDashArray);\n fabric.util.drawDashedLine(ctx, px, py, px, py + atop, this.selectionDashArray);\n fabric.util.drawDashedLine(ctx, px + aleft - 1, py, px + aleft - 1, py + atop, this.selectionDashArray);\n\n ctx.closePath();\n ctx.stroke();\n }\n else {\n fabric.Object.prototype._setLineDash.call(this, ctx, this.selectionDashArray);\n ctx.strokeRect(\n groupSelector.ex + STROKE_OFFSET - ((left > 0) ? 0 : aleft),\n groupSelector.ey + STROKE_OFFSET - ((top > 0) ? 0 : atop),\n aleft,\n atop\n );\n }\n },\n\n /**\n * Method that determines what object we are clicking on\n * the skipGroup parameter is for internal use, is needed for shift+click action\n * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target\n * or the outside part of the corner.\n * @param {Event} e mouse event\n * @param {Boolean} skipGroup when true, activeGroup is skipped and only objects are traversed through\n * @return {fabric.Object} the target found\n */\n findTarget: function (e, skipGroup) {\n if (this.skipTargetFind) {\n return;\n }\n\n var ignoreZoom = true,\n pointer = this.getPointer(e, ignoreZoom),\n activeObject = this._activeObject,\n aObjects = this.getActiveObjects(),\n activeTarget, activeTargetSubs;\n\n // first check current group (if one exists)\n // active group does not check sub targets like normal groups.\n // if active group just exits.\n this.targets = [];\n\n if (aObjects.length > 1 && !skipGroup && activeObject === this._searchPossibleTargets([activeObject], pointer)) {\n return activeObject;\n }\n // if we hit the corner of an activeObject, let's return that.\n if (aObjects.length === 1 && activeObject._findTargetCorner(pointer)) {\n return activeObject;\n }\n if (aObjects.length === 1 &&\n activeObject === this._searchPossibleTargets([activeObject], pointer)) {\n if (!this.preserveObjectStacking) {\n return activeObject;\n }\n else {\n activeTarget = activeObject;\n activeTargetSubs = this.targets;\n this.targets = [];\n }\n }\n var target = this._searchPossibleTargets(this._objects, pointer);\n if (e[this.altSelectionKey] && target && activeTarget && target !== activeTarget) {\n target = activeTarget;\n this.targets = activeTargetSubs;\n }\n return target;\n },\n\n /**\n * Checks point is inside the object.\n * @param {Object} [pointer] x,y object of point coordinates we want to check.\n * @param {fabric.Object} obj Object to test against\n * @param {Object} [globalPointer] x,y object of point coordinates relative to canvas used to search per pixel target.\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n _checkTarget: function(pointer, obj, globalPointer) {\n if (obj &&\n obj.visible &&\n obj.evented &&\n this.containsPoint(null, obj, pointer)){\n if ((this.perPixelTargetFind || obj.perPixelTargetFind) && !obj.isEditing) {\n var isTransparent = this.isTargetTransparent(obj, globalPointer.x, globalPointer.y);\n if (!isTransparent) {\n return true;\n }\n }\n else {\n return true;\n }\n }\n },\n\n /**\n * Function used to search inside objects an object that contains pointer in bounding box or that contains pointerOnCanvas when painted\n * @param {Array} [objects] objects array to look into\n * @param {Object} [pointer] x,y object of point coordinates we want to check.\n * @return {fabric.Object} object that contains pointer\n * @private\n */\n _searchPossibleTargets: function(objects, pointer) {\n // Cache all targets where their bounding box contains point.\n var target, i = objects.length, subTarget;\n // Do not check for currently grouped objects, since we check the parent group itself.\n // until we call this function specifically to search inside the activeGroup\n while (i--) {\n var objToCheck = objects[i];\n var pointerToUse = objToCheck.group && objToCheck.group.type !== 'activeSelection' ?\n this._normalizePointer(objToCheck.group, pointer) : pointer;\n if (this._checkTarget(pointerToUse, objToCheck, pointer)) {\n target = objects[i];\n if (target.subTargetCheck && target instanceof fabric.Group) {\n subTarget = this._searchPossibleTargets(target._objects, pointer);\n subTarget && this.targets.push(subTarget);\n }\n break;\n }\n }\n return target;\n },\n\n /**\n * Returns pointer coordinates without the effect of the viewport\n * @param {Object} pointer with \"x\" and \"y\" number values\n * @return {Object} object with \"x\" and \"y\" number values\n */\n restorePointerVpt: function(pointer) {\n return fabric.util.transformPoint(\n pointer,\n fabric.util.invertTransform(this.viewportTransform)\n );\n },\n\n /**\n * Returns pointer coordinates relative to canvas.\n * Can return coordinates with or without viewportTransform.\n * ignoreZoom false gives back coordinates that represent\n * the point clicked on canvas element.\n * ignoreZoom true gives back coordinates after being processed\n * by the viewportTransform ( sort of coordinates of what is displayed\n * on the canvas where you are clicking.\n * ignoreZoom true = HTMLElement coordinates relative to top,left\n * ignoreZoom false, default = fabric space coordinates, the same used for shape position\n * To interact with your shapes top and left you want to use ignoreZoom true\n * most of the time, while ignoreZoom false will give you coordinates\n * compatible with the object.oCoords system.\n * of the time.\n * @param {Event} e\n * @param {Boolean} ignoreZoom\n * @return {Object} object with \"x\" and \"y\" number values\n */\n getPointer: function (e, ignoreZoom) {\n // return cached values if we are in the event processing chain\n if (this._absolutePointer && !ignoreZoom) {\n return this._absolutePointer;\n }\n if (this._pointer && ignoreZoom) {\n return this._pointer;\n }\n\n var pointer = getPointer(e),\n upperCanvasEl = this.upperCanvasEl,\n bounds = upperCanvasEl.getBoundingClientRect(),\n boundsWidth = bounds.width || 0,\n boundsHeight = bounds.height || 0,\n cssScale;\n\n if (!boundsWidth || !boundsHeight ) {\n if ('top' in bounds && 'bottom' in bounds) {\n boundsHeight = Math.abs( bounds.top - bounds.bottom );\n }\n if ('right' in bounds && 'left' in bounds) {\n boundsWidth = Math.abs( bounds.right - bounds.left );\n }\n }\n\n this.calcOffset();\n pointer.x = pointer.x - this._offset.left;\n pointer.y = pointer.y - this._offset.top;\n if (!ignoreZoom) {\n pointer = this.restorePointerVpt(pointer);\n }\n\n var retinaScaling = this.getRetinaScaling();\n if (retinaScaling !== 1) {\n pointer.x /= retinaScaling;\n pointer.y /= retinaScaling;\n }\n\n if (boundsWidth === 0 || boundsHeight === 0) {\n // If bounds are not available (i.e. not visible), do not apply scale.\n cssScale = { width: 1, height: 1 };\n }\n else {\n cssScale = {\n width: upperCanvasEl.width / boundsWidth,\n height: upperCanvasEl.height / boundsHeight\n };\n }\n\n return {\n x: pointer.x * cssScale.width,\n y: pointer.y * cssScale.height\n };\n },\n\n /**\n * @private\n * @throws {CANVAS_INIT_ERROR} If canvas can not be initialized\n */\n _createUpperCanvas: function () {\n var lowerCanvasClass = this.lowerCanvasEl.className.replace(/\\s*lower-canvas\\s*/, ''),\n lowerCanvasEl = this.lowerCanvasEl, upperCanvasEl = this.upperCanvasEl;\n\n // there is no need to create a new upperCanvas element if we have already one.\n if (upperCanvasEl) {\n upperCanvasEl.className = '';\n }\n else {\n upperCanvasEl = this._createCanvasElement();\n this.upperCanvasEl = upperCanvasEl;\n }\n fabric.util.addClass(upperCanvasEl, 'upper-canvas ' + lowerCanvasClass);\n\n this.wrapperEl.appendChild(upperCanvasEl);\n\n this._copyCanvasStyle(lowerCanvasEl, upperCanvasEl);\n this._applyCanvasStyle(upperCanvasEl);\n this.contextTop = upperCanvasEl.getContext('2d');\n },\n\n /**\n * @private\n */\n _createCacheCanvas: function () {\n this.cacheCanvasEl = this._createCanvasElement();\n this.cacheCanvasEl.setAttribute('width', this.width);\n this.cacheCanvasEl.setAttribute('height', this.height);\n this.contextCache = this.cacheCanvasEl.getContext('2d');\n },\n\n /**\n * @private\n */\n _initWrapperElement: function () {\n this.wrapperEl = fabric.util.wrapElement(this.lowerCanvasEl, 'div', {\n 'class': this.containerClass\n });\n fabric.util.setStyle(this.wrapperEl, {\n width: this.width + 'px',\n height: this.height + 'px',\n position: 'relative'\n });\n fabric.util.makeElementUnselectable(this.wrapperEl);\n },\n\n /**\n * @private\n * @param {HTMLElement} element canvas element to apply styles on\n */\n _applyCanvasStyle: function (element) {\n var width = this.width || element.width,\n height = this.height || element.height;\n\n fabric.util.setStyle(element, {\n position: 'absolute',\n width: width + 'px',\n height: height + 'px',\n left: 0,\n top: 0,\n 'touch-action': this.allowTouchScrolling ? 'manipulation' : 'none',\n '-ms-touch-action': this.allowTouchScrolling ? 'manipulation' : 'none'\n });\n element.width = width;\n element.height = height;\n fabric.util.makeElementUnselectable(element);\n },\n\n /**\n * Copy the entire inline style from one element (fromEl) to another (toEl)\n * @private\n * @param {Element} fromEl Element style is copied from\n * @param {Element} toEl Element copied style is applied to\n */\n _copyCanvasStyle: function (fromEl, toEl) {\n toEl.style.cssText = fromEl.style.cssText;\n },\n\n /**\n * Returns context of canvas where object selection is drawn\n * @return {CanvasRenderingContext2D}\n */\n getSelectionContext: function() {\n return this.contextTop;\n },\n\n /**\n * Returns <canvas> element on which object selection is drawn\n * @return {HTMLCanvasElement}\n */\n getSelectionElement: function () {\n return this.upperCanvasEl;\n },\n\n /**\n * Returns currently active object\n * @return {fabric.Object} active object\n */\n getActiveObject: function () {\n return this._activeObject;\n },\n\n /**\n * Returns an array with the current selected objects\n * @return {fabric.Object} active object\n */\n getActiveObjects: function () {\n var active = this._activeObject;\n if (active) {\n if (active.type === 'activeSelection' && active._objects) {\n return active._objects.slice(0);\n }\n else {\n return [active];\n }\n }\n return [];\n },\n\n /**\n * @private\n * @param {fabric.Object} obj Object that was removed\n */\n _onObjectRemoved: function(obj) {\n // removing active object should fire \"selection:cleared\" events\n if (obj === this._activeObject) {\n this.fire('before:selection:cleared', { target: obj });\n this._discardActiveObject();\n this.fire('selection:cleared', { target: obj });\n obj.fire('deselected');\n }\n if (obj === this._hoveredTarget){\n this._hoveredTarget = null;\n this._hoveredTargets = [];\n }\n this.callSuper('_onObjectRemoved', obj);\n },\n\n /**\n * @private\n * Compares the old activeObject with the current one and fires correct events\n * @param {fabric.Object} obj old activeObject\n */\n _fireSelectionEvents: function(oldObjects, e) {\n var somethingChanged = false, objects = this.getActiveObjects(),\n added = [], removed = [], opt = { e: e };\n oldObjects.forEach(function(oldObject) {\n if (objects.indexOf(oldObject) === -1) {\n somethingChanged = true;\n oldObject.fire('deselected', opt);\n removed.push(oldObject);\n }\n });\n objects.forEach(function(object) {\n if (oldObjects.indexOf(object) === -1) {\n somethingChanged = true;\n object.fire('selected', opt);\n added.push(object);\n }\n });\n if (oldObjects.length > 0 && objects.length > 0) {\n opt.selected = added;\n opt.deselected = removed;\n // added for backward compatibility\n opt.updated = added[0] || removed[0];\n opt.target = this._activeObject;\n somethingChanged && this.fire('selection:updated', opt);\n }\n else if (objects.length > 0) {\n // deprecated event\n if (objects.length === 1) {\n opt.target = added[0];\n this.fire('object:selected', opt);\n }\n opt.selected = added;\n // added for backward compatibility\n opt.target = this._activeObject;\n this.fire('selection:created', opt);\n }\n else if (oldObjects.length > 0) {\n opt.deselected = removed;\n this.fire('selection:cleared', opt);\n }\n },\n\n /**\n * Sets given object as the only active object on canvas\n * @param {fabric.Object} object Object to set as an active one\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n setActiveObject: function (object, e) {\n var currentActives = this.getActiveObjects();\n this._setActiveObject(object, e);\n this._fireSelectionEvents(currentActives, e);\n return this;\n },\n\n /**\n * @private\n * @param {Object} object to set as active\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the selection happened\n */\n _setActiveObject: function(object, e) {\n if (this._activeObject === object) {\n return false;\n }\n if (!this._discardActiveObject(e, object)) {\n return false;\n }\n if (object.onSelect({ e: e })) {\n return false;\n }\n this._activeObject = object;\n return true;\n },\n\n /**\n * @private\n */\n _discardActiveObject: function(e, object) {\n var obj = this._activeObject;\n if (obj) {\n // onDeselect return TRUE to cancel selection;\n if (obj.onDeselect({ e: e, object: object })) {\n return false;\n }\n this._activeObject = null;\n }\n return true;\n },\n\n /**\n * Discards currently active object and fire events. If the function is called by fabric\n * as a consequence of a mouse event, the event is passed as a parameter and\n * sent to the fire function for the custom events. When used as a method the\n * e param does not have any application.\n * @param {event} e\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n discardActiveObject: function (e) {\n var currentActives = this.getActiveObjects(), activeObject = this.getActiveObject();\n if (currentActives.length) {\n this.fire('before:selection:cleared', { target: activeObject, e: e });\n }\n this._discardActiveObject(e);\n this._fireSelectionEvents(currentActives, e);\n return this;\n },\n\n /**\n * Clears a canvas element and removes all event listeners\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n dispose: function () {\n var wrapper = this.wrapperEl;\n this.removeListeners();\n wrapper.removeChild(this.upperCanvasEl);\n wrapper.removeChild(this.lowerCanvasEl);\n this.contextCache = null;\n this.contextTop = null;\n ['upperCanvasEl', 'cacheCanvasEl'].forEach((function(element) {\n fabric.util.cleanUpJsdomNode(this[element]);\n this[element] = undefined;\n }).bind(this));\n if (wrapper.parentNode) {\n wrapper.parentNode.replaceChild(this.lowerCanvasEl, this.wrapperEl);\n }\n delete this.wrapperEl;\n fabric.StaticCanvas.prototype.dispose.call(this);\n return this;\n },\n\n /**\n * Clears all contexts (background, main, top) of an instance\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n clear: function () {\n // this.discardActiveGroup();\n this.discardActiveObject();\n this.clearContext(this.contextTop);\n return this.callSuper('clear');\n },\n\n /**\n * Draws objects' controls (borders/controls)\n * @param {CanvasRenderingContext2D} ctx Context to render controls on\n */\n drawControls: function(ctx) {\n var activeObject = this._activeObject;\n\n if (activeObject) {\n activeObject._renderControls(ctx);\n }\n },\n\n /**\n * @private\n */\n _toObject: function(instance, methodName, propertiesToInclude) {\n //If the object is part of the current selection group, it should\n //be transformed appropriately\n //i.e. it should be serialised as it would appear if the selection group\n //were to be destroyed.\n var originalProperties = this._realizeGroupTransformOnObject(instance),\n object = this.callSuper('_toObject', instance, methodName, propertiesToInclude);\n //Undo the damage we did by changing all of its properties\n this._unwindGroupTransformOnObject(instance, originalProperties);\n return object;\n },\n\n /**\n * Realises an object's group transformation on it\n * @private\n * @param {fabric.Object} [instance] the object to transform (gets mutated)\n * @returns the original values of instance which were changed\n */\n _realizeGroupTransformOnObject: function(instance) {\n if (instance.group && instance.group.type === 'activeSelection' && this._activeObject === instance.group) {\n var layoutProps = ['angle', 'flipX', 'flipY', 'left', 'scaleX', 'scaleY', 'skewX', 'skewY', 'top'];\n //Copy all the positionally relevant properties across now\n var originalValues = {};\n layoutProps.forEach(function(prop) {\n originalValues[prop] = instance[prop];\n });\n this._activeObject.realizeTransform(instance);\n return originalValues;\n }\n else {\n return null;\n }\n },\n\n /**\n * Restores the changed properties of instance\n * @private\n * @param {fabric.Object} [instance] the object to un-transform (gets mutated)\n * @param {Object} [originalValues] the original values of instance, as returned by _realizeGroupTransformOnObject\n */\n _unwindGroupTransformOnObject: function(instance, originalValues) {\n if (originalValues) {\n instance.set(originalValues);\n }\n },\n\n /**\n * @private\n */\n _setSVGObject: function(markup, instance, reviver) {\n //If the object is in a selection group, simulate what would happen to that\n //object when the group is deselected\n var originalProperties = this._realizeGroupTransformOnObject(instance);\n this.callSuper('_setSVGObject', markup, instance, reviver);\n this._unwindGroupTransformOnObject(instance, originalProperties);\n },\n\n setViewportTransform: function (vpt) {\n if (this.renderOnAddRemove && this._activeObject && this._activeObject.isEditing) {\n this._activeObject.clearContextTop();\n }\n fabric.StaticCanvas.prototype.setViewportTransform.call(this, vpt);\n }\n });\n\n // copying static properties manually to work around Opera's bug,\n // where \"prototype\" property is enumerable and overrides existing prototype\n for (var prop in fabric.StaticCanvas) {\n if (prop !== 'prototype') {\n fabric.Canvas[prop] = fabric.StaticCanvas[prop];\n }\n }\n})();\n\n\n(function() {\n\n var cursorOffset = {\n mt: 0, // n\n tr: 1, // ne\n mr: 2, // e\n br: 3, // se\n mb: 4, // s\n bl: 5, // sw\n ml: 6, // w\n tl: 7 // nw\n },\n addListener = fabric.util.addListener,\n removeListener = fabric.util.removeListener,\n RIGHT_CLICK = 3, MIDDLE_CLICK = 2, LEFT_CLICK = 1,\n addEventOptions = { passive: false };\n\n function checkClick(e, value) {\n return e.button && (e.button === value - 1);\n }\n\n fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ {\n\n /**\n * Map of cursor style values for each of the object controls\n * @private\n */\n cursorMap: [\n 'n-resize',\n 'ne-resize',\n 'e-resize',\n 'se-resize',\n 's-resize',\n 'sw-resize',\n 'w-resize',\n 'nw-resize'\n ],\n\n /**\n * Contains the id of the touch event that owns the fabric transform\n * @type Number\n * @private\n */\n mainTouchId: null,\n\n /**\n * Adds mouse listeners to canvas\n * @private\n */\n _initEventListeners: function () {\n // in case we initialized the class twice. This should not happen normally\n // but in some kind of applications where the canvas element may be changed\n // this is a workaround to having double listeners.\n this.removeListeners();\n this._bindEvents();\n this.addOrRemove(addListener, 'add');\n },\n\n /**\n * return an event prefix pointer or mouse.\n * @private\n */\n _getEventPrefix: function () {\n return this.enablePointerEvents ? 'pointer' : 'mouse';\n },\n\n addOrRemove: function(functor, eventjsFunctor) {\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n functor(fabric.window, 'resize', this._onResize);\n functor(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n functor(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n functor(canvasElement, eventTypePrefix + 'out', this._onMouseOut);\n functor(canvasElement, eventTypePrefix + 'enter', this._onMouseEnter);\n functor(canvasElement, 'wheel', this._onMouseWheel);\n functor(canvasElement, 'contextmenu', this._onContextMenu);\n functor(canvasElement, 'dblclick', this._onDoubleClick);\n functor(canvasElement, 'dragover', this._onDragOver);\n functor(canvasElement, 'dragenter', this._onDragEnter);\n functor(canvasElement, 'dragleave', this._onDragLeave);\n functor(canvasElement, 'drop', this._onDrop);\n if (!this.enablePointerEvents) {\n functor(canvasElement, 'touchstart', this._onTouchStart, addEventOptions);\n }\n if (typeof eventjs !== 'undefined' && eventjsFunctor in eventjs) {\n eventjs[eventjsFunctor](canvasElement, 'gesture', this._onGesture);\n eventjs[eventjsFunctor](canvasElement, 'drag', this._onDrag);\n eventjs[eventjsFunctor](canvasElement, 'orientation', this._onOrientationChange);\n eventjs[eventjsFunctor](canvasElement, 'shake', this._onShake);\n eventjs[eventjsFunctor](canvasElement, 'longpress', this._onLongPress);\n }\n },\n\n /**\n * Removes all event listeners\n */\n removeListeners: function() {\n this.addOrRemove(removeListener, 'remove');\n // if you dispose on a mouseDown, before mouse up, you need to clean document to...\n var eventTypePrefix = this._getEventPrefix();\n removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n },\n\n /**\n * @private\n */\n _bindEvents: function() {\n if (this.eventsBound) {\n // for any reason we pass here twice we do not want to bind events twice.\n return;\n }\n this._onMouseDown = this._onMouseDown.bind(this);\n this._onTouchStart = this._onTouchStart.bind(this);\n this._onMouseMove = this._onMouseMove.bind(this);\n this._onMouseUp = this._onMouseUp.bind(this);\n this._onTouchEnd = this._onTouchEnd.bind(this);\n this._onResize = this._onResize.bind(this);\n this._onGesture = this._onGesture.bind(this);\n this._onDrag = this._onDrag.bind(this);\n this._onShake = this._onShake.bind(this);\n this._onLongPress = this._onLongPress.bind(this);\n this._onOrientationChange = this._onOrientationChange.bind(this);\n this._onMouseWheel = this._onMouseWheel.bind(this);\n this._onMouseOut = this._onMouseOut.bind(this);\n this._onMouseEnter = this._onMouseEnter.bind(this);\n this._onContextMenu = this._onContextMenu.bind(this);\n this._onDoubleClick = this._onDoubleClick.bind(this);\n this._onDragOver = this._onDragOver.bind(this);\n this._onDragEnter = this._simpleEventHandler.bind(this, 'dragenter');\n this._onDragLeave = this._simpleEventHandler.bind(this, 'dragleave');\n this._onDrop = this._simpleEventHandler.bind(this, 'drop');\n this.eventsBound = true;\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js gesture\n * @param {Event} [self] Inner Event object\n */\n _onGesture: function(e, self) {\n this.__onTransformGesture && this.__onTransformGesture(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js drag\n * @param {Event} [self] Inner Event object\n */\n _onDrag: function(e, self) {\n this.__onDrag && this.__onDrag(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on wheel event\n */\n _onMouseWheel: function(e) {\n this.__onMouseWheel(e);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseOut: function(e) {\n var target = this._hoveredTarget;\n this.fire('mouse:out', { target: target, e: e });\n this._hoveredTarget = null;\n target && target.fire('mouseout', { e: e });\n\n var _this = this;\n this._hoveredTargets.forEach(function(_target){\n _this.fire('mouse:out', { target: target, e: e });\n _target && target.fire('mouseout', { e: e });\n });\n this._hoveredTargets = [];\n\n if (this._iTextInstances) {\n this._iTextInstances.forEach(function(obj) {\n if (obj.isEditing) {\n obj.hiddenTextarea.focus();\n }\n });\n }\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseenter\n */\n _onMouseEnter: function(e) {\n // This find target and consequent 'mouse:over' is used to\n // clear old instances on hovered target.\n // calling findTarget has the side effect of killing target.__corner.\n // as a short term fix we are not firing this if we are currently transforming.\n // as a long term fix we need to separate the action of finding a target with the\n // side effects we added to it.\n if (!this.currentTransform && !this.findTarget(e)) {\n this.fire('mouse:over', { target: null, e: e });\n this._hoveredTarget = null;\n this._hoveredTargets = [];\n }\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js orientation change\n * @param {Event} [self] Inner Event object\n */\n _onOrientationChange: function(e, self) {\n this.__onOrientationChange && this.__onOrientationChange(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n * @param {Event} [self] Inner Event object\n */\n _onShake: function(e, self) {\n this.__onShake && this.__onShake(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n * @param {Event} [self] Inner Event object\n */\n _onLongPress: function(e, self) {\n this.__onLongPress && this.__onLongPress(e, self);\n },\n\n /**\n * prevent default to allow drop event to be fired\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n _onDragOver: function(e) {\n e.preventDefault();\n var target = this._simpleEventHandler('dragover', e);\n this._fireEnterLeaveEvents(target, e);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onContextMenu: function (e) {\n if (this.stopContextMenu) {\n e.stopPropagation();\n e.preventDefault();\n }\n return false;\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onDoubleClick: function (e) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'dblclick');\n this._resetTransformEventData(e);\n },\n\n /**\n * Return a the id of an event.\n * returns either the pointerId or the identifier or 0 for the mouse event\n * @private\n * @param {Event} evt Event object\n */\n getPointerId: function(evt) {\n var changedTouches = evt.changedTouches;\n\n if (changedTouches) {\n return changedTouches[0] && changedTouches[0].identifier;\n }\n\n if (this.enablePointerEvents) {\n return evt.pointerId;\n }\n\n return -1;\n },\n\n /**\n * Determines if an event has the id of the event that is considered main\n * @private\n * @param {evt} event Event object\n */\n _isMainEvent: function(evt) {\n if (evt.isPrimary === true) {\n return true;\n }\n if (evt.isPrimary === false) {\n return false;\n }\n if (evt.type === 'touchend' && evt.touches.length === 0) {\n return true;\n }\n if (evt.changedTouches) {\n return evt.changedTouches[0].identifier === this.mainTouchId;\n }\n return true;\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchStart: function(e) {\n e.preventDefault();\n if (this.mainTouchId === null) {\n this.mainTouchId = this.getPointerId(e);\n }\n this.__onMouseDown(e);\n this._resetTransformEventData();\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n addListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n addListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n // Unbind mousedown to prevent double triggers from touch devices\n removeListener(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDown: function (e) {\n this.__onMouseDown(e);\n this._resetTransformEventData();\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n removeListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n addListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n addListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchEnd: function(e) {\n if (e.touches.length > 0) {\n // if there are still touches stop here\n return;\n }\n this.__onMouseUp(e);\n this._resetTransformEventData();\n this.mainTouchId = null;\n var eventTypePrefix = this._getEventPrefix();\n removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n var _this = this;\n if (this._willAddMouseDown) {\n clearTimeout(this._willAddMouseDown);\n }\n this._willAddMouseDown = setTimeout(function() {\n // Wait 400ms before rebinding mousedown to prevent double triggers\n // from touch devices\n addListener(_this.upperCanvasEl, eventTypePrefix + 'down', _this._onMouseDown);\n _this._willAddMouseDown = 0;\n }, 400);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUp: function (e) {\n this.__onMouseUp(e);\n this._resetTransformEventData();\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n if (this._isMainEvent(e)) {\n removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n addListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n }\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMove: function (e) {\n !this.allowTouchScrolling && e.preventDefault && e.preventDefault();\n this.__onMouseMove(e);\n },\n\n /**\n * @private\n */\n _onResize: function () {\n this.calcOffset();\n },\n\n /**\n * Decides whether the canvas should be redrawn in mouseup and mousedown events.\n * @private\n * @param {Object} target\n */\n _shouldRender: function(target) {\n var activeObject = this._activeObject;\n\n if (\n !!activeObject !== !!target ||\n (activeObject && target && (activeObject !== target))\n ) {\n // this covers: switch of target, from target to no target, selection of target\n // multiSelection with key and mouse\n return true;\n }\n else if (activeObject && activeObject.isEditing) {\n // if we mouse up/down over a editing textbox a cursor change,\n // there is no need to re render\n return false;\n }\n return false;\n },\n\n /**\n * Method that defines the actions when mouse is released on canvas.\n * The method resets the currentTransform parameters, store the image corner\n * position in the image object and render the canvas on top.\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n __onMouseUp: function (e) {\n var target, transform = this._currentTransform,\n groupSelector = this._groupSelector, shouldRender = false,\n isClick = (!groupSelector || (groupSelector.left === 0 && groupSelector.top === 0));\n this._cacheTransformEventData(e);\n target = this._target;\n this._handleEvent(e, 'up:before');\n // if right/middle click just fire events and return\n // target undefined will make the _handleEvent search the target\n if (checkClick(e, RIGHT_CLICK)) {\n if (this.fireRightClick) {\n this._handleEvent(e, 'up', RIGHT_CLICK, isClick);\n }\n return;\n }\n\n if (checkClick(e, MIDDLE_CLICK)) {\n if (this.fireMiddleClick) {\n this._handleEvent(e, 'up', MIDDLE_CLICK, isClick);\n }\n this._resetTransformEventData();\n return;\n }\n\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this._onMouseUpInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n if (transform) {\n this._finalizeCurrentTransform(e);\n shouldRender = transform.actionPerformed;\n }\n\n if (!isClick) {\n this._maybeGroupObjects(e);\n shouldRender || (shouldRender = this._shouldRender(target));\n }\n if (target) {\n target.isMoving = false;\n }\n this._setCursorFromEvent(e, target);\n this._handleEvent(e, 'up', LEFT_CLICK, isClick);\n this._groupSelector = null;\n this._currentTransform = null;\n // reset the target information about which corner is selected\n target && (target.__corner = 0);\n if (shouldRender) {\n this.requestRenderAll();\n }\n else if (!isClick) {\n this.renderTop();\n }\n },\n\n /**\n * @private\n * Handle event firing for target and subtargets\n * @param {Event} e event from mouse\n * @param {String} eventType event to fire (up, down or move)\n * @return {Fabric.Object} target return the the target found, for internal reasons.\n */\n _simpleEventHandler: function(eventType, e) {\n var target = this.findTarget(e),\n targets = this.targets,\n options = {\n e: e,\n target: target,\n subTargets: targets,\n };\n this.fire(eventType, options);\n target && target.fire(eventType, options);\n if (!targets) {\n return target;\n }\n for (var i = 0; i < targets.length; i++) {\n targets[i].fire(eventType, options);\n }\n return target;\n },\n\n /**\n * @private\n * Handle event firing for target and subtargets\n * @param {Event} e event from mouse\n * @param {String} eventType event to fire (up, down or move)\n * @param {fabric.Object} targetObj receiving event\n * @param {Number} [button] button used in the event 1 = left, 2 = middle, 3 = right\n * @param {Boolean} isClick for left button only, indicates that the mouse up happened without move.\n */\n _handleEvent: function(e, eventType, button, isClick) {\n var target = this._target,\n targets = this.targets || [],\n options = {\n e: e,\n target: target,\n subTargets: targets,\n button: button || LEFT_CLICK,\n isClick: isClick || false,\n pointer: this._pointer,\n absolutePointer: this._absolutePointer,\n transform: this._currentTransform\n };\n this.fire('mouse:' + eventType, options);\n target && target.fire('mouse' + eventType, options);\n for (var i = 0; i < targets.length; i++) {\n targets[i].fire('mouse' + eventType, options);\n }\n },\n\n /**\n * @private\n * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event\n */\n _finalizeCurrentTransform: function(e) {\n\n var transform = this._currentTransform,\n target = transform.target,\n eventName,\n options = {\n e: e,\n target: target,\n transform: transform,\n };\n\n if (target._scaling) {\n target._scaling = false;\n }\n\n target.setCoords();\n\n if (transform.actionPerformed || (this.stateful && target.hasStateChanged())) {\n if (transform.actionPerformed) {\n eventName = this._addEventOptions(options, transform);\n this._fire(eventName, options);\n }\n this._fire('modified', options);\n }\n },\n\n /**\n * Mutate option object in order to add by property and give back the event name.\n * @private\n * @param {Object} options to mutate\n * @param {Object} transform to inspect action from\n */\n _addEventOptions: function(options, transform) {\n // we can probably add more details at low cost\n // scale change, rotation changes, translation changes\n var eventName, by;\n switch (transform.action) {\n case 'scaleX':\n eventName = 'scaled';\n by = 'x';\n break;\n case 'scaleY':\n eventName = 'scaled';\n by = 'y';\n break;\n case 'skewX':\n eventName = 'skewed';\n by = 'x';\n break;\n case 'skewY':\n eventName = 'skewed';\n by = 'y';\n break;\n case 'scale':\n eventName = 'scaled';\n by = 'equally';\n break;\n case 'rotate':\n eventName = 'rotated';\n break;\n case 'drag':\n eventName = 'moved';\n break;\n }\n options.by = by;\n return eventName;\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDownInDrawingMode: function(e) {\n this._isCurrentlyDrawing = true;\n if (this.getActiveObject()) {\n this.discardActiveObject(e).requestRenderAll();\n }\n if (this.clipTo) {\n fabric.util.clipContext(this, this.contextTop);\n }\n var pointer = this.getPointer(e);\n this.freeDrawingBrush.onMouseDown(pointer, { e: e, pointer: pointer });\n this._handleEvent(e, 'down');\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMoveInDrawingMode: function(e) {\n if (this._isCurrentlyDrawing) {\n var pointer = this.getPointer(e);\n this.freeDrawingBrush.onMouseMove(pointer, { e: e, pointer: pointer });\n }\n this.setCursor(this.freeDrawingCursor);\n this._handleEvent(e, 'move');\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUpInDrawingMode: function(e) {\n if (this.clipTo) {\n this.contextTop.restore();\n }\n var pointer = this.getPointer(e);\n this._isCurrentlyDrawing = this.freeDrawingBrush.onMouseUp({ e: e, pointer: pointer });\n this._handleEvent(e, 'up');\n },\n\n /**\n * Method that defines the actions when mouse is clicked on canvas.\n * The method inits the currentTransform parameters and renders all the\n * canvas so the current image can be placed on the top canvas and the rest\n * in on the container one.\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n __onMouseDown: function (e) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'down:before');\n var target = this._target;\n // if right click just fire events\n if (checkClick(e, RIGHT_CLICK)) {\n if (this.fireRightClick) {\n this._handleEvent(e, 'down', RIGHT_CLICK);\n }\n return;\n }\n\n if (checkClick(e, MIDDLE_CLICK)) {\n if (this.fireMiddleClick) {\n this._handleEvent(e, 'down', MIDDLE_CLICK);\n }\n return;\n }\n\n if (this.isDrawingMode) {\n this._onMouseDownInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n // ignore if some object is being transformed at this moment\n if (this._currentTransform) {\n return;\n }\n\n var pointer = this._pointer;\n // save pointer for check in __onMouseUp event\n this._previousPointer = pointer;\n var shouldRender = this._shouldRender(target),\n shouldGroup = this._shouldGroup(e, target);\n if (this._shouldClearSelection(e, target)) {\n this.discardActiveObject(e);\n }\n else if (shouldGroup) {\n this._handleGrouping(e, target);\n target = this._activeObject;\n }\n\n if (this.selection && (!target ||\n (!target.selectable && !target.isEditing && target !== this._activeObject))) {\n this._groupSelector = {\n ex: pointer.x,\n ey: pointer.y,\n top: 0,\n left: 0\n };\n }\n\n if (target) {\n var alreadySelected = target === this._activeObject;\n if (target.selectable) {\n this.setActiveObject(target, e);\n }\n if (target === this._activeObject && (target.__corner || !shouldGroup)) {\n this._setupCurrentTransform(e, target, alreadySelected);\n }\n }\n this._handleEvent(e, 'down');\n // we must renderAll so that we update the visuals\n (shouldRender || shouldGroup) && this.requestRenderAll();\n },\n\n /**\n * reset cache form common information needed during event processing\n * @private\n */\n _resetTransformEventData: function() {\n this._target = null;\n this._pointer = null;\n this._absolutePointer = null;\n },\n\n /**\n * Cache common information needed during event processing\n * @private\n * @param {Event} e Event object fired on event\n */\n _cacheTransformEventData: function(e) {\n // reset in order to avoid stale caching\n this._resetTransformEventData();\n this._pointer = this.getPointer(e, true);\n this._absolutePointer = this.restorePointerVpt(this._pointer);\n this._target = this._currentTransform ? this._currentTransform.target : this.findTarget(e) || null;\n },\n\n /**\n * @private\n */\n _beforeTransform: function(e) {\n var t = this._currentTransform;\n this.stateful && t.target.saveState();\n this.fire('before:transform', {\n e: e,\n transform: t,\n });\n // determine if it's a drag or rotate case\n if (t.corner) {\n this.onBeforeScaleRotate(t.target);\n }\n },\n\n /**\n * Method that defines the actions when mouse is hovering the canvas.\n * The currentTransform parameter will define whether the user is rotating/scaling/translating\n * an image or neither of them (only hovering). A group selection is also possible and would cancel\n * all any other type of action.\n * In case of an image transformation only the top canvas will be rendered.\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n __onMouseMove: function (e) {\n this._handleEvent(e, 'move:before');\n this._cacheTransformEventData(e);\n var target, pointer;\n\n if (this.isDrawingMode) {\n this._onMouseMoveInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n var groupSelector = this._groupSelector;\n\n // We initially clicked in an empty area, so we draw a box for multiple selection\n if (groupSelector) {\n pointer = this._pointer;\n\n groupSelector.left = pointer.x - groupSelector.ex;\n groupSelector.top = pointer.y - groupSelector.ey;\n\n this.renderTop();\n }\n else if (!this._currentTransform) {\n target = this.findTarget(e) || null;\n this._setCursorFromEvent(e, target);\n this._fireOverOutEvents(target, e);\n }\n else {\n this._transformObject(e);\n }\n this._handleEvent(e, 'move');\n this._resetTransformEventData();\n },\n\n /**\n * Manage the mouseout, mouseover events for the fabric object on the canvas\n * @param {Fabric.Object} target the target where the target from the mousemove event\n * @param {Event} e Event object fired on mousemove\n * @private\n */\n _fireOverOutEvents: function(target, e) {\n var _hoveredTarget = this._hoveredTarget,\n _hoveredTargets = this._hoveredTargets, targets = this.targets,\n length = Math.max(_hoveredTargets.length, targets.length);\n\n this.fireSyntheticInOutEvents(target, e, {\n oldTarget: _hoveredTarget,\n evtOut: 'mouseout',\n canvasEvtOut: 'mouse:out',\n evtIn: 'mouseover',\n canvasEvtIn: 'mouse:over',\n });\n for (var i = 0; i < length; i++){\n this.fireSyntheticInOutEvents(targets[i], e, {\n oldTarget: _hoveredTargets[i],\n evtOut: 'mouseout',\n evtIn: 'mouseover',\n });\n }\n this._hoveredTarget = target;\n this._hoveredTargets = this.targets.concat();\n },\n\n /**\n * Manage the dragEnter, dragLeave events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the onDrag event\n * @param {Event} e Event object fired on ondrag\n * @private\n */\n _fireEnterLeaveEvents: function(target, e) {\n var _draggedoverTarget = this._draggedoverTarget,\n _hoveredTargets = this._hoveredTargets, targets = this.targets,\n length = Math.max(_hoveredTargets.length, targets.length);\n\n this.fireSyntheticInOutEvents(target, e, {\n oldTarget: _draggedoverTarget,\n evtOut: 'dragleave',\n evtIn: 'dragenter',\n });\n for (var i = 0; i < length; i++) {\n this.fireSyntheticInOutEvents(targets[i], e, {\n oldTarget: _hoveredTargets[i],\n evtOut: 'dragleave',\n evtIn: 'dragenter',\n });\n }\n this._draggedoverTarget = target;\n },\n\n /**\n * Manage the synthetic in/out events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the supported events\n * @param {Event} e Event object fired\n * @param {Object} config configuration for the function to work\n * @param {String} config.targetName property on the canvas where the old target is stored\n * @param {String} [config.canvasEvtOut] name of the event to fire at canvas level for out\n * @param {String} config.evtOut name of the event to fire for out\n * @param {String} [config.canvasEvtIn] name of the event to fire at canvas level for in\n * @param {String} config.evtIn name of the event to fire for in\n * @private\n */\n fireSyntheticInOutEvents: function(target, e, config) {\n var inOpt, outOpt, oldTarget = config.oldTarget, outFires, inFires,\n targetChanged = oldTarget !== target, canvasEvtIn = config.canvasEvtIn, canvasEvtOut = config.canvasEvtOut;\n if (targetChanged) {\n inOpt = { e: e, target: target, previousTarget: oldTarget };\n outOpt = { e: e, target: oldTarget, nextTarget: target };\n }\n inFires = target && targetChanged;\n outFires = oldTarget && targetChanged;\n if (outFires) {\n canvasEvtOut && this.fire(canvasEvtOut, outOpt);\n oldTarget.fire(config.evtOut, outOpt);\n }\n if (inFires) {\n canvasEvtIn && this.fire(canvasEvtIn, inOpt);\n target.fire(config.evtIn, inOpt);\n }\n },\n\n /**\n * Method that defines actions when an Event Mouse Wheel\n * @param {Event} e Event object fired on mouseup\n */\n __onMouseWheel: function(e) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'wheel');\n this._resetTransformEventData();\n },\n\n /**\n * @private\n * @param {Event} e Event fired on mousemove\n */\n _transformObject: function(e) {\n var pointer = this.getPointer(e),\n transform = this._currentTransform;\n\n transform.reset = false;\n transform.target.isMoving = true;\n transform.shiftKey = e.shiftKey;\n transform.altKey = e[this.centeredKey];\n\n this._beforeScaleTransform(e, transform);\n this._performTransformAction(e, transform, pointer);\n\n transform.actionPerformed && this.requestRenderAll();\n },\n\n /**\n * @private\n */\n _performTransformAction: function(e, transform, pointer) {\n var x = pointer.x,\n y = pointer.y,\n action = transform.action,\n actionPerformed = false,\n options = {\n target: transform.target,\n e: e,\n transform: transform,\n pointer: pointer\n };\n\n if (action === 'rotate') {\n (actionPerformed = this._rotateObject(x, y)) && this._fire('rotating', options);\n }\n else if (action === 'scale') {\n (actionPerformed = this._onScale(e, transform, x, y)) && this._fire('scaling', options);\n }\n else if (action === 'scaleX') {\n (actionPerformed = this._scaleObject(x, y, 'x')) && this._fire('scaling', options);\n }\n else if (action === 'scaleY') {\n (actionPerformed = this._scaleObject(x, y, 'y')) && this._fire('scaling', options);\n }\n else if (action === 'skewX') {\n (actionPerformed = this._skewObject(x, y, 'x')) && this._fire('skewing', options);\n }\n else if (action === 'skewY') {\n (actionPerformed = this._skewObject(x, y, 'y')) && this._fire('skewing', options);\n }\n else {\n actionPerformed = this._translateObject(x, y);\n if (actionPerformed) {\n this._fire('moving', options);\n this.setCursor(options.target.moveCursor || this.moveCursor);\n }\n }\n transform.actionPerformed = transform.actionPerformed || actionPerformed;\n },\n\n /**\n * @private\n */\n _fire: function(eventName, options) {\n this.fire('object:' + eventName, options);\n options.target.fire(eventName, options);\n },\n\n /**\n * @private\n */\n _beforeScaleTransform: function(e, transform) {\n if (transform.action === 'scale' || transform.action === 'scaleX' || transform.action === 'scaleY') {\n var centerTransform = this._shouldCenterTransform(transform.target);\n\n // Switch from a normal resize to center-based\n if ((centerTransform && (transform.originX !== 'center' || transform.originY !== 'center')) ||\n // Switch from center-based resize to normal one\n (!centerTransform && transform.originX === 'center' && transform.originY === 'center')\n ) {\n this._resetCurrentTransform();\n transform.reset = true;\n }\n }\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {Object} transform current transform\n * @param {Number} x mouse position x from origin\n * @param {Number} y mouse position y from origin\n * @return {Boolean} true if the scaling occurred\n */\n _onScale: function(e, transform, x, y) {\n if (this._isUniscalePossible(e, transform.target)) {\n transform.currentAction = 'scale';\n return this._scaleObject(x, y);\n }\n else {\n // Switch from a normal resize to proportional\n if (!transform.reset && transform.currentAction === 'scale') {\n this._resetCurrentTransform();\n }\n\n transform.currentAction = 'scaleEqually';\n return this._scaleObject(x, y, 'equally');\n }\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target current target\n * @return {Boolean} true if unproportional scaling is possible\n */\n _isUniscalePossible: function(e, target) {\n return (e[this.uniScaleKey] || this.uniScaleTransform) && !target.get('lockUniScaling');\n },\n\n /**\n * Sets the cursor depending on where the canvas is being hovered.\n * Note: very buggy in Opera\n * @param {Event} e Event object\n * @param {Object} target Object that the mouse is hovering, if so.\n */\n _setCursorFromEvent: function (e, target) {\n if (!target) {\n this.setCursor(this.defaultCursor);\n return false;\n }\n var hoverCursor = target.hoverCursor || this.hoverCursor,\n activeSelection = this._activeObject && this._activeObject.type === 'activeSelection' ?\n this._activeObject : null,\n // only show proper corner when group selection is not active\n corner = (!activeSelection || !activeSelection.contains(target))\n && target._findTargetCorner(this.getPointer(e, true));\n\n if (!corner) {\n if (target.subTargetCheck){\n // hoverCursor should come from top-most subTarget,\n // so we walk the array backwards\n this.targets.concat().reverse().map(function(_target){\n hoverCursor = _target.hoverCursor || hoverCursor;\n });\n }\n this.setCursor(hoverCursor);\n }\n else {\n this.setCursor(this.getCornerCursor(corner, target, e));\n }\n },\n\n /**\n * @private\n */\n getCornerCursor: function(corner, target, e) {\n if (this.actionIsDisabled(corner, target, e)) {\n return this.notAllowedCursor;\n }\n else if (corner in cursorOffset) {\n return this._getRotatedCornerCursor(corner, target, e);\n }\n else if (corner === 'mtr' && target.hasRotatingPoint) {\n return this.rotationCursor;\n }\n else {\n return this.defaultCursor;\n }\n },\n\n actionIsDisabled: function(corner, target, e) {\n if (corner === 'mt' || corner === 'mb') {\n return e[this.altActionKey] ? target.lockSkewingX : target.lockScalingY;\n }\n else if (corner === 'ml' || corner === 'mr') {\n return e[this.altActionKey] ? target.lockSkewingY : target.lockScalingX;\n }\n else if (corner === 'mtr') {\n return target.lockRotation;\n }\n else {\n return this._isUniscalePossible(e, target) ?\n target.lockScalingX && target.lockScalingY : target.lockScalingX || target.lockScalingY;\n }\n },\n\n /**\n * @private\n */\n _getRotatedCornerCursor: function(corner, target, e) {\n var n = Math.round((target.angle % 360) / 45);\n\n if (n < 0) {\n n += 8; // full circle ahead\n }\n n += cursorOffset[corner];\n if (e[this.altActionKey] && cursorOffset[corner] % 2 === 0) {\n //if we are holding shift and we are on a mx corner...\n n += 2;\n }\n // normalize n to be from 0 to 7\n n %= 8;\n\n return this.cursorMap[n];\n }\n });\n})();\n\n\n(function() {\n\n var min = Math.min,\n max = Math.max;\n\n fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ {\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n * @return {Boolean}\n */\n _shouldGroup: function(e, target) {\n var activeObject = this._activeObject;\n return activeObject && this._isSelectionKeyPressed(e) && target && target.selectable && this.selection &&\n (activeObject !== target || activeObject.type === 'activeSelection') && !target.onSelect({ e: e });\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n */\n _handleGrouping: function (e, target) {\n var activeObject = this._activeObject;\n // avoid multi select when shift click on a corner\n if (activeObject.__corner) {\n return;\n }\n if (target === activeObject) {\n // if it's a group, find target again, using activeGroup objects\n target = this.findTarget(e, true);\n // if even object is not found or we are on activeObjectCorner, bail out\n if (!target || !target.selectable) {\n return;\n }\n }\n if (activeObject && activeObject.type === 'activeSelection') {\n this._updateActiveSelection(target, e);\n }\n else {\n this._createActiveSelection(target, e);\n }\n },\n\n /**\n * @private\n */\n _updateActiveSelection: function(target, e) {\n var activeSelection = this._activeObject,\n currentActiveObjects = activeSelection._objects.slice(0);\n if (activeSelection.contains(target)) {\n activeSelection.removeWithUpdate(target);\n this._hoveredTarget = target;\n this._hoveredTargets = this.targets.concat();\n if (activeSelection.size() === 1) {\n // activate last remaining object\n this._setActiveObject(activeSelection.item(0), e);\n }\n }\n else {\n activeSelection.addWithUpdate(target);\n this._hoveredTarget = activeSelection;\n this._hoveredTargets = this.targets.concat();\n }\n this._fireSelectionEvents(currentActiveObjects, e);\n },\n\n /**\n * @private\n */\n _createActiveSelection: function(target, e) {\n var currentActives = this.getActiveObjects(), group = this._createGroup(target);\n this._hoveredTarget = group;\n // ISSUE 4115: should we consider subTargets here?\n // this._hoveredTargets = [];\n // this._hoveredTargets = this.targets.concat();\n this._setActiveObject(group, e);\n this._fireSelectionEvents(currentActives, e);\n },\n\n /**\n * @private\n * @param {Object} target\n */\n _createGroup: function(target) {\n var objects = this._objects,\n isActiveLower = objects.indexOf(this._activeObject) < objects.indexOf(target),\n groupObjects = isActiveLower\n ? [this._activeObject, target]\n : [target, this._activeObject];\n this._activeObject.isEditing && this._activeObject.exitEditing();\n return new fabric.ActiveSelection(groupObjects, {\n canvas: this\n });\n },\n\n /**\n * @private\n * @param {Event} e mouse event\n */\n _groupSelectedObjects: function (e) {\n\n var group = this._collectObjects(e),\n aGroup;\n\n // do not create group for 1 element only\n if (group.length === 1) {\n this.setActiveObject(group[0], e);\n }\n else if (group.length > 1) {\n aGroup = new fabric.ActiveSelection(group.reverse(), {\n canvas: this\n });\n this.setActiveObject(aGroup, e);\n }\n },\n\n /**\n * @private\n */\n _collectObjects: function(e) {\n var group = [],\n currentObject,\n x1 = this._groupSelector.ex,\n y1 = this._groupSelector.ey,\n x2 = x1 + this._groupSelector.left,\n y2 = y1 + this._groupSelector.top,\n selectionX1Y1 = new fabric.Point(min(x1, x2), min(y1, y2)),\n selectionX2Y2 = new fabric.Point(max(x1, x2), max(y1, y2)),\n allowIntersect = !this.selectionFullyContained,\n isClick = x1 === x2 && y1 === y2;\n // we iterate reverse order to collect top first in case of click.\n for (var i = this._objects.length; i--; ) {\n currentObject = this._objects[i];\n\n if (!currentObject || !currentObject.selectable || !currentObject.visible) {\n continue;\n }\n\n if ((allowIntersect && currentObject.intersectsWithRect(selectionX1Y1, selectionX2Y2)) ||\n currentObject.isContainedWithinRect(selectionX1Y1, selectionX2Y2) ||\n (allowIntersect && currentObject.containsPoint(selectionX1Y1)) ||\n (allowIntersect && currentObject.containsPoint(selectionX2Y2))\n ) {\n group.push(currentObject);\n // only add one object if it's a click\n if (isClick) {\n break;\n }\n }\n }\n\n if (group.length > 1) {\n group = group.filter(function(object) {\n return !object.onSelect({ e: e });\n });\n }\n\n return group;\n },\n\n /**\n * @private\n */\n _maybeGroupObjects: function(e) {\n if (this.selection && this._groupSelector) {\n this._groupSelectedObjects(e);\n }\n this.setCursor(this.defaultCursor);\n // clear selection and current transformation\n this._groupSelector = null;\n }\n });\n\n})();\n\n\n(function () {\n fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Exports canvas element to a dataurl image. Note that when multiplier is used, cropping is scaled appropriately\n * @param {Object} [options] Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by, to have consistent\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 2.0.0\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n * @see {@link http://jsfiddle.net/fabricjs/NfZVb/|jsFiddle demo}\n * @example Generate jpeg dataURL with lower quality\n * var dataURL = canvas.toDataURL({\n * format: 'jpeg',\n * quality: 0.8\n * });\n * @example Generate cropped png dataURL (clipping of canvas)\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * left: 100,\n * top: 100,\n * width: 200,\n * height: 200\n * });\n * @example Generate double scaled png dataURL\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * multiplier: 2\n * });\n */\n toDataURL: function (options) {\n options || (options = { });\n\n var format = options.format || 'png',\n quality = options.quality || 1,\n multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? this.getRetinaScaling() : 1),\n canvasEl = this.toCanvasElement(multiplier, options);\n return fabric.util.toDataURL(canvasEl, format, quality);\n },\n\n /**\n * Create a new HTMLCanvas element painted with the current canvas content.\n * No need to resize the actual one or repaint it.\n * Will transfer object ownership to a new canvas, paint it, and set everything back.\n * This is an intermediary step used to get to a dataUrl but also it is useful to\n * create quick image copies of a canvas without passing for the dataUrl string\n * @param {Number} [multiplier] a zoom factor.\n * @param {Object} [cropping] Cropping informations\n * @param {Number} [cropping.left] Cropping left offset.\n * @param {Number} [cropping.top] Cropping top offset.\n * @param {Number} [cropping.width] Cropping width.\n * @param {Number} [cropping.height] Cropping height.\n */\n toCanvasElement: function(multiplier, cropping) {\n multiplier = multiplier || 1;\n cropping = cropping || { };\n var scaledWidth = (cropping.width || this.width) * multiplier,\n scaledHeight = (cropping.height || this.height) * multiplier,\n zoom = this.getZoom(),\n originalWidth = this.width,\n originalHeight = this.height,\n newZoom = zoom * multiplier,\n vp = this.viewportTransform,\n translateX = (vp[4] - (cropping.left || 0)) * multiplier,\n translateY = (vp[5] - (cropping.top || 0)) * multiplier,\n originalInteractive = this.interactive,\n newVp = [newZoom, 0, 0, newZoom, translateX, translateY],\n originalRetina = this.enableRetinaScaling,\n canvasEl = fabric.util.createCanvasElement(),\n originalContextTop = this.contextTop;\n canvasEl.width = scaledWidth;\n canvasEl.height = scaledHeight;\n this.contextTop = null;\n this.enableRetinaScaling = false;\n this.interactive = false;\n this.viewportTransform = newVp;\n this.width = scaledWidth;\n this.height = scaledHeight;\n this.calcViewportBoundaries();\n this.renderCanvas(canvasEl.getContext('2d'), this._objects);\n this.viewportTransform = vp;\n this.width = originalWidth;\n this.height = originalHeight;\n this.calcViewportBoundaries();\n this.interactive = originalInteractive;\n this.enableRetinaScaling = originalRetina;\n this.contextTop = originalContextTop;\n return canvasEl;\n },\n });\n\n})();\n\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Populates canvas with data from the specified dataless JSON.\n * JSON format must conform to the one of {@link fabric.Canvas#toDatalessJSON}\n * @deprecated since 1.2.2\n * @param {String|Object} json JSON string or object\n * @param {Function} callback Callback, invoked when json is parsed\n * and corresponding objects (e.g: {@link fabric.Image})\n * are initialized\n * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created.\n * @return {fabric.Canvas} instance\n * @chainable\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#deserialization}\n */\n loadFromDatalessJSON: function (json, callback, reviver) {\n return this.loadFromJSON(json, callback, reviver);\n },\n\n /**\n * Populates canvas with data from the specified JSON.\n * JSON format must conform to the one of {@link fabric.Canvas#toJSON}\n * @param {String|Object} json JSON string or object\n * @param {Function} callback Callback, invoked when json is parsed\n * and corresponding objects (e.g: {@link fabric.Image})\n * are initialized\n * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created.\n * @return {fabric.Canvas} instance\n * @chainable\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#deserialization}\n * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo}\n * @example loadFromJSON\n * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas));\n * @example loadFromJSON with reviver\n * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas), function(o, object) {\n * // `o` = json object\n * // `object` = fabric.Object instance\n * // ... do some stuff ...\n * });\n */\n loadFromJSON: function (json, callback, reviver) {\n if (!json) {\n return;\n }\n\n // serialize if it wasn't already\n var serialized = (typeof json === 'string')\n ? JSON.parse(json)\n : fabric.util.object.clone(json);\n\n var _this = this,\n clipPath = serialized.clipPath,\n renderOnAddRemove = this.renderOnAddRemove;\n\n this.renderOnAddRemove = false;\n\n delete serialized.clipPath;\n\n this._enlivenObjects(serialized.objects, function (enlivenedObjects) {\n _this.clear();\n _this._setBgOverlay(serialized, function () {\n if (clipPath) {\n _this._enlivenObjects([clipPath], function (enlivenedCanvasClip) {\n _this.clipPath = enlivenedCanvasClip[0];\n _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback);\n });\n }\n else {\n _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback);\n }\n });\n }, reviver);\n return this;\n },\n\n /**\n * @private\n * @param {Object} serialized Object with background and overlay information\n * @param {Array} restored canvas objects\n * @param {Function} cached renderOnAddRemove callback\n * @param {Function} callback Invoked after all background and overlay images/patterns loaded\n */\n __setupCanvas: function(serialized, enlivenedObjects, renderOnAddRemove, callback) {\n var _this = this;\n enlivenedObjects.forEach(function(obj, index) {\n // we splice the array just in case some custom classes restored from JSON\n // will add more object to canvas at canvas init.\n _this.insertAt(obj, index);\n });\n this.renderOnAddRemove = renderOnAddRemove;\n // remove parts i cannot set as options\n delete serialized.objects;\n delete serialized.backgroundImage;\n delete serialized.overlayImage;\n delete serialized.background;\n delete serialized.overlay;\n // this._initOptions does too many things to just\n // call it. Normally loading an Object from JSON\n // create the Object instance. Here the Canvas is\n // already an instance and we are just loading things over it\n this._setOptions(serialized);\n this.renderAll();\n callback && callback();\n },\n\n /**\n * @private\n * @param {Object} serialized Object with background and overlay information\n * @param {Function} callback Invoked after all background and overlay images/patterns loaded\n */\n _setBgOverlay: function(serialized, callback) {\n var loaded = {\n backgroundColor: false,\n overlayColor: false,\n backgroundImage: false,\n overlayImage: false\n };\n\n if (!serialized.backgroundImage && !serialized.overlayImage && !serialized.background && !serialized.overlay) {\n callback && callback();\n return;\n }\n\n var cbIfLoaded = function () {\n if (loaded.backgroundImage && loaded.overlayImage && loaded.backgroundColor && loaded.overlayColor) {\n callback && callback();\n }\n };\n\n this.__setBgOverlay('backgroundImage', serialized.backgroundImage, loaded, cbIfLoaded);\n this.__setBgOverlay('overlayImage', serialized.overlayImage, loaded, cbIfLoaded);\n this.__setBgOverlay('backgroundColor', serialized.background, loaded, cbIfLoaded);\n this.__setBgOverlay('overlayColor', serialized.overlay, loaded, cbIfLoaded);\n },\n\n /**\n * @private\n * @param {String} property Property to set (backgroundImage, overlayImage, backgroundColor, overlayColor)\n * @param {(Object|String)} value Value to set\n * @param {Object} loaded Set loaded property to true if property is set\n * @param {Object} callback Callback function to invoke after property is set\n */\n __setBgOverlay: function(property, value, loaded, callback) {\n var _this = this;\n\n if (!value) {\n loaded[property] = true;\n callback && callback();\n return;\n }\n\n if (property === 'backgroundImage' || property === 'overlayImage') {\n fabric.util.enlivenObjects([value], function(enlivedObject){\n _this[property] = enlivedObject[0];\n loaded[property] = true;\n callback && callback();\n });\n }\n else {\n this['set' + fabric.util.string.capitalize(property, true)](value, function() {\n loaded[property] = true;\n callback && callback();\n });\n }\n },\n\n /**\n * @private\n * @param {Array} objects\n * @param {Function} callback\n * @param {Function} [reviver]\n */\n _enlivenObjects: function (objects, callback, reviver) {\n if (!objects || objects.length === 0) {\n callback && callback([]);\n return;\n }\n\n fabric.util.enlivenObjects(objects, function(enlivenedObjects) {\n callback && callback(enlivenedObjects);\n }, null, reviver);\n },\n\n /**\n * @private\n * @param {String} format\n * @param {Function} callback\n */\n _toDataURL: function (format, callback) {\n this.clone(function (clone) {\n callback(clone.toDataURL(format));\n });\n },\n\n /**\n * @private\n * @param {String} format\n * @param {Number} multiplier\n * @param {Function} callback\n */\n _toDataURLWithMultiplier: function (format, multiplier, callback) {\n this.clone(function (clone) {\n callback(clone.toDataURLWithMultiplier(format, multiplier));\n });\n },\n\n /**\n * Clones canvas instance\n * @param {Object} [callback] Receives cloned instance as a first argument\n * @param {Array} [properties] Array of properties to include in the cloned canvas and children\n */\n clone: function (callback, properties) {\n var data = JSON.stringify(this.toJSON(properties));\n this.cloneWithoutData(function(clone) {\n clone.loadFromJSON(data, function() {\n callback && callback(clone);\n });\n });\n },\n\n /**\n * Clones canvas instance without cloning existing data.\n * This essentially copies canvas dimensions, clipping properties, etc.\n * but leaves data empty (so that you can populate it with your own)\n * @param {Object} [callback] Receives cloned instance as a first argument\n */\n cloneWithoutData: function(callback) {\n var el = fabric.util.createCanvasElement();\n\n el.width = this.width;\n el.height = this.height;\n\n var clone = new fabric.Canvas(el);\n clone.clipTo = this.clipTo;\n if (this.backgroundImage) {\n clone.setBackgroundImage(this.backgroundImage.src, function() {\n clone.renderAll();\n callback && callback(clone);\n });\n clone.backgroundImageOpacity = this.backgroundImageOpacity;\n clone.backgroundImageStretch = this.backgroundImageStretch;\n }\n else {\n callback && callback(clone);\n }\n }\n});\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n clone = fabric.util.object.clone,\n toFixed = fabric.util.toFixed,\n capitalize = fabric.util.string.capitalize,\n degreesToRadians = fabric.util.degreesToRadians,\n supportsLineDash = fabric.StaticCanvas.supports('setLineDash'),\n objectCaching = !fabric.isLikelyNode,\n ALIASING_LIMIT = 2;\n\n if (fabric.Object) {\n return;\n }\n\n /**\n * Root object class from which all 2d shape classes inherit from\n * @class fabric.Object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#objects}\n * @see {@link fabric.Object#initialize} for constructor definition\n *\n * @fires added\n * @fires removed\n *\n * @fires selected\n * @fires deselected\n * @fires modified\n * @fires modified\n * @fires moved\n * @fires scaled\n * @fires rotated\n * @fires skewed\n *\n * @fires rotating\n * @fires scaling\n * @fires moving\n * @fires skewing\n *\n * @fires mousedown\n * @fires mouseup\n * @fires mouseover\n * @fires mouseout\n * @fires mousewheel\n * @fires mousedblclick\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drop\n */\n fabric.Object = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.Object.prototype */ {\n\n /**\n * Type of an object (rect, circle, path, etc.).\n * Note that this property is meant to be read-only and not meant to be modified.\n * If you modify, certain parts of Fabric (such as JSON loading) won't work correctly.\n * @type String\n * @default\n */\n type: 'object',\n\n /**\n * Horizontal origin of transformation of an object (one of \"left\", \"right\", \"center\")\n * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups\n * @type String\n * @default\n */\n originX: 'left',\n\n /**\n * Vertical origin of transformation of an object (one of \"top\", \"bottom\", \"center\")\n * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups\n * @type String\n * @default\n */\n originY: 'top',\n\n /**\n * Top position of an object. Note that by default it's relative to object top. You can change this by setting originY={top/center/bottom}\n * @type Number\n * @default\n */\n top: 0,\n\n /**\n * Left position of an object. Note that by default it's relative to object left. You can change this by setting originX={left/center/right}\n * @type Number\n * @default\n */\n left: 0,\n\n /**\n * Object width\n * @type Number\n * @default\n */\n width: 0,\n\n /**\n * Object height\n * @type Number\n * @default\n */\n height: 0,\n\n /**\n * Object scale factor (horizontal)\n * @type Number\n * @default\n */\n scaleX: 1,\n\n /**\n * Object scale factor (vertical)\n * @type Number\n * @default\n */\n scaleY: 1,\n\n /**\n * When true, an object is rendered as flipped horizontally\n * @type Boolean\n * @default\n */\n flipX: false,\n\n /**\n * When true, an object is rendered as flipped vertically\n * @type Boolean\n * @default\n */\n flipY: false,\n\n /**\n * Opacity of an object\n * @type Number\n * @default\n */\n opacity: 1,\n\n /**\n * Angle of rotation of an object (in degrees)\n * @type Number\n * @default\n */\n angle: 0,\n\n /**\n * Angle of skew on x axes of an object (in degrees)\n * @type Number\n * @default\n */\n skewX: 0,\n\n /**\n * Angle of skew on y axes of an object (in degrees)\n * @type Number\n * @default\n */\n skewY: 0,\n\n /**\n * Size of object's controlling corners (in pixels)\n * @type Number\n * @default\n */\n cornerSize: 13,\n\n /**\n * When true, object's controlling corners are rendered as transparent inside (i.e. stroke instead of fill)\n * @type Boolean\n * @default\n */\n transparentCorners: true,\n\n /**\n * Default cursor value used when hovering over this object on canvas\n * @type String\n * @default\n */\n hoverCursor: null,\n\n /**\n * Default cursor value used when moving this object on canvas\n * @type String\n * @default\n */\n moveCursor: null,\n\n /**\n * Padding between object and its controlling borders (in pixels)\n * @type Number\n * @default\n */\n padding: 0,\n\n /**\n * Color of controlling borders of an object (when it's active)\n * @type String\n * @default\n */\n borderColor: 'rgba(102,153,255,0.75)',\n\n /**\n * Array specifying dash pattern of an object's borders (hasBorder must be true)\n * @since 1.6.2\n * @type Array\n */\n borderDashArray: null,\n\n /**\n * Color of controlling corners of an object (when it's active)\n * @type String\n * @default\n */\n cornerColor: 'rgba(102,153,255,0.5)',\n\n /**\n * Color of controlling corners of an object (when it's active and transparentCorners false)\n * @since 1.6.2\n * @type String\n * @default\n */\n cornerStrokeColor: null,\n\n /**\n * Specify style of control, 'rect' or 'circle'\n * @since 1.6.2\n * @type String\n */\n cornerStyle: 'rect',\n\n /**\n * Array specifying dash pattern of an object's control (hasBorder must be true)\n * @since 1.6.2\n * @type Array\n */\n cornerDashArray: null,\n\n /**\n * When true, this object will use center point as the origin of transformation\n * when being scaled via the controls.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredScaling: false,\n\n /**\n * When true, this object will use center point as the origin of transformation\n * when being rotated via the controls.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredRotation: true,\n\n /**\n * Color of object's fill\n * takes css colors https://www.w3.org/TR/css-color-3/\n * @type String\n * @default\n */\n fill: 'rgb(0,0,0)',\n\n /**\n * Fill rule used to fill an object\n * accepted values are nonzero, evenodd\n * Backwards incompatibility note: This property was used for setting globalCompositeOperation until v1.4.12 (use `fabric.Object#globalCompositeOperation` instead)\n * @type String\n * @default\n */\n fillRule: 'nonzero',\n\n /**\n * Composite rule used for canvas globalCompositeOperation\n * @type String\n * @default\n */\n globalCompositeOperation: 'source-over',\n\n /**\n * Background color of an object.\n * takes css colors https://www.w3.org/TR/css-color-3/\n * @type String\n * @default\n */\n backgroundColor: '',\n\n /**\n * Selection Background color of an object. colored layer behind the object when it is active.\n * does not mix good with globalCompositeOperation methods.\n * @type String\n * @default\n */\n selectionBackgroundColor: '',\n\n /**\n * When defined, an object is rendered via stroke and this property specifies its color\n * takes css colors https://www.w3.org/TR/css-color-3/\n * @type String\n * @default\n */\n stroke: null,\n\n /**\n * Width of a stroke used to render this object\n * @type Number\n * @default\n */\n strokeWidth: 1,\n\n /**\n * Array specifying dash pattern of an object's stroke (stroke must be defined)\n * @type Array\n */\n strokeDashArray: null,\n\n /**\n * Line offset of an object's stroke\n * @type Number\n * @default\n */\n strokeDashOffset: 0,\n\n /**\n * Line endings style of an object's stroke (one of \"butt\", \"round\", \"square\")\n * @type String\n * @default\n */\n strokeLineCap: 'butt',\n\n /**\n * Corner style of an object's stroke (one of \"bevil\", \"round\", \"miter\")\n * @type String\n * @default\n */\n strokeLineJoin: 'miter',\n\n /**\n * Maximum miter length (used for strokeLineJoin = \"miter\") of an object's stroke\n * @type Number\n * @default\n */\n strokeMiterLimit: 4,\n\n /**\n * Shadow object representing shadow of this shape\n * @type fabric.Shadow\n * @default\n */\n shadow: null,\n\n /**\n * Opacity of object's controlling borders when object is active and moving\n * @type Number\n * @default\n */\n borderOpacityWhenMoving: 0.4,\n\n /**\n * Scale factor of object's controlling borders\n * bigger number will make a thicker border\n * border is 1, so this is basically a border tickness\n * since there is no way to change the border itself.\n * @type Number\n * @default\n */\n borderScaleFactor: 1,\n\n /**\n * Transform matrix (similar to SVG's transform matrix)\n * This property has been depreacted. Since caching and and qrDecompose this\n * property can be handled with the standard top,left,scaleX,scaleY,angle and skewX.\n * A documentation example on how to parse and merge a transformMatrix will be provided before\n * completely removing it in fabric 4.0\n * If you are starting a project now, DO NOT use it.\n * @deprecated since 3.2.0\n * @type Array\n */\n transformMatrix: null,\n\n /**\n * Minimum allowed scale value of an object\n * @type Number\n * @default\n */\n minScaleLimit: 0,\n\n /**\n * When set to `false`, an object can not be selected for modification (using either point-click-based or group-based selection).\n * But events still fire on it.\n * @type Boolean\n * @default\n */\n selectable: true,\n\n /**\n * When set to `false`, an object can not be a target of events. All events propagate through it. Introduced in v1.3.4\n * @type Boolean\n * @default\n */\n evented: true,\n\n /**\n * When set to `false`, an object is not rendered on canvas\n * @type Boolean\n * @default\n */\n visible: true,\n\n /**\n * When set to `false`, object's controls are not displayed and can not be used to manipulate object\n * @type Boolean\n * @default\n */\n hasControls: true,\n\n /**\n * When set to `false`, object's controlling borders are not rendered\n * @type Boolean\n * @default\n */\n hasBorders: true,\n\n /**\n * When set to `false`, object's controlling rotating point will not be visible or selectable\n * @type Boolean\n * @default\n */\n hasRotatingPoint: true,\n\n /**\n * Offset for object's controlling rotating point (when enabled via `hasRotatingPoint`)\n * @type Number\n * @default\n */\n rotatingPointOffset: 40,\n\n /**\n * When set to `true`, objects are \"found\" on canvas on per-pixel basis rather than according to bounding box\n * @type Boolean\n * @default\n */\n perPixelTargetFind: false,\n\n /**\n * When `false`, default object's values are not included in its serialization\n * @type Boolean\n * @default\n */\n includeDefaultValues: true,\n\n /**\n * Function that determines clipping of an object (context is passed as a first argument).\n * If you are using code minification, ctx argument can be minified/manglied you should use\n * as a workaround `var ctx = arguments[0];` in the function;\n * Note that context origin is at the object's center point (not left/top corner)\n * @deprecated since 2.0.0\n * @type Function\n */\n clipTo: null,\n\n /**\n * When `true`, object horizontal movement is locked\n * @type Boolean\n * @default\n */\n lockMovementX: false,\n\n /**\n * When `true`, object vertical movement is locked\n * @type Boolean\n * @default\n */\n lockMovementY: false,\n\n /**\n * When `true`, object rotation is locked\n * @type Boolean\n * @default\n */\n lockRotation: false,\n\n /**\n * When `true`, object horizontal scaling is locked\n * @type Boolean\n * @default\n */\n lockScalingX: false,\n\n /**\n * When `true`, object vertical scaling is locked\n * @type Boolean\n * @default\n */\n lockScalingY: false,\n\n /**\n * When `true`, object non-uniform scaling is locked\n * @type Boolean\n * @default\n */\n lockUniScaling: false,\n\n /**\n * When `true`, object horizontal skewing is locked\n * @type Boolean\n * @default\n */\n lockSkewingX: false,\n\n /**\n * When `true`, object vertical skewing is locked\n * @type Boolean\n * @default\n */\n lockSkewingY: false,\n\n /**\n * When `true`, object cannot be flipped by scaling into negative values\n * @type Boolean\n * @default\n */\n lockScalingFlip: false,\n\n /**\n * When `true`, object is not exported in OBJECT/JSON\n * @since 1.6.3\n * @type Boolean\n * @default\n */\n excludeFromExport: false,\n\n /**\n * When `true`, object is cached on an additional canvas.\n * When `false`, object is not cached unless necessary ( clipPath )\n * default to true\n * @since 1.7.0\n * @type Boolean\n * @default true\n */\n objectCaching: objectCaching,\n\n /**\n * When `true`, object properties are checked for cache invalidation. In some particular\n * situation you may want this to be disabled ( spray brush, very big, groups)\n * or if your application does not allow you to modify properties for groups child you want\n * to disable it for groups.\n * default to false\n * since 1.7.0\n * @type Boolean\n * @default false\n */\n statefullCache: false,\n\n /**\n * When `true`, cache does not get updated during scaling. The picture will get blocky if scaled\n * too much and will be redrawn with correct details at the end of scaling.\n * this setting is performance and application dependant.\n * default to true\n * since 1.7.0\n * @type Boolean\n * @default true\n */\n noScaleCache: true,\n\n /**\n * When `false`, the stoke width will scale with the object.\n * When `true`, the stroke will always match the exact pixel size entered for stroke width.\n * default to false\n * @since 2.6.0\n * @type Boolean\n * @default false\n * @type Boolean\n * @default false\n */\n strokeUniform: false,\n\n /**\n * When set to `true`, object's cache will be rerendered next render call.\n * since 1.7.0\n * @type Boolean\n * @default true\n */\n dirty: true,\n\n /**\n * keeps the value of the last hovered corner during mouse move.\n * 0 is no corner, or 'mt', 'ml', 'mtr' etc..\n * It should be private, but there is no harm in using it as\n * a read-only property.\n * @type number|string|any\n * @default 0\n */\n __corner: 0,\n\n /**\n * Determines if the fill or the stroke is drawn first (one of \"fill\" or \"stroke\")\n * @type String\n * @default\n */\n paintFirst: 'fill',\n\n /**\n * List of properties to consider when checking if state\n * of an object is changed (fabric.Object#hasStateChanged)\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: (\n 'top left width height scaleX scaleY flipX flipY originX originY transformMatrix ' +\n 'stroke strokeWidth strokeDashArray strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit ' +\n 'angle opacity fill globalCompositeOperation shadow clipTo visible backgroundColor ' +\n 'skewX skewY fillRule paintFirst clipPath strokeUniform'\n ).split(' '),\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * Those properties are checked by statefullCache ON ( or lazy mode if we want ) or from single\n * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty\n * and refreshed at the next render\n * @type Array\n */\n cacheProperties: (\n 'fill stroke strokeWidth strokeDashArray width height paintFirst strokeUniform' +\n ' strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit backgroundColor clipPath'\n ).split(' '),\n\n /**\n * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n * the clipPath object gets used when the object has rendered, and the context is placed in the center\n * of the object cacheCanvas.\n * If you want 0,0 of a clipPath to align with an object center, use clipPath.originX/Y to 'center'\n * @type fabric.Object\n */\n clipPath: undefined,\n\n /**\n * Meaningful ONLY when the object is used as clipPath.\n * if true, the clipPath will make the object clip to the outside of the clipPath\n * since 2.4.0\n * @type boolean\n * @default false\n */\n inverted: false,\n\n /**\n * Meaningful ONLY when the object is used as clipPath.\n * if true, the clipPath will have its top and left relative to canvas, and will\n * not be influenced by the object transform. This will make the clipPath relative\n * to the canvas, but clipping just a particular object.\n * WARNING this is beta, this feature may change or be renamed.\n * since 2.4.0\n * @type boolean\n * @default false\n */\n absolutePositioned: false,\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n if (options) {\n this.setOptions(options);\n }\n },\n\n /**\n * Create a the canvas used to keep the cached copy of the object\n * @private\n */\n _createCacheCanvas: function() {\n this._cacheProperties = {};\n this._cacheCanvas = fabric.util.createCanvasElement();\n this._cacheContext = this._cacheCanvas.getContext('2d');\n this._updateCacheCanvas();\n // if canvas gets created, is empty, so dirty.\n this.dirty = true;\n },\n\n /**\n * Limit the cache dimensions so that X * Y do not cross fabric.perfLimitSizeTotal\n * and each side do not cross fabric.cacheSideLimit\n * those numbers are configurable so that you can get as much detail as you want\n * making bargain with performances.\n * @param {Object} dims\n * @param {Object} dims.width width of canvas\n * @param {Object} dims.height height of canvas\n * @param {Object} dims.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @param {Object} dims.zoomY zoomY zoom value to unscale the canvas before drawing cache\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _limitCacheSize: function(dims) {\n var perfLimitSizeTotal = fabric.perfLimitSizeTotal,\n width = dims.width, height = dims.height,\n max = fabric.maxCacheSideLimit, min = fabric.minCacheSideLimit;\n if (width <= max && height <= max && width * height <= perfLimitSizeTotal) {\n if (width < min) {\n dims.width = min;\n }\n if (height < min) {\n dims.height = min;\n }\n return dims;\n }\n var ar = width / height, limitedDims = fabric.util.limitDimsByArea(ar, perfLimitSizeTotal),\n capValue = fabric.util.capValue,\n x = capValue(min, limitedDims.x, max),\n y = capValue(min, limitedDims.y, max);\n if (width > x) {\n dims.zoomX /= width / x;\n dims.width = x;\n dims.capped = true;\n }\n if (height > y) {\n dims.zoomY /= height / y;\n dims.height = y;\n dims.capped = true;\n }\n return dims;\n },\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @return {Object}.x width of object to be cached\n * @return {Object}.y height of object to be cached\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _getCacheCanvasDimensions: function() {\n var objectScale = this.getTotalObjectScaling(),\n // caculate dimensions without skewing\n dim = this._getTransformedDimensions(0, 0),\n neededX = dim.x * objectScale.scaleX / this.scaleX,\n neededY = dim.y * objectScale.scaleY / this.scaleY;\n return {\n // for sure this ALIASING_LIMIT is slightly creating problem\n // in situation in which the cache canvas gets an upper limit\n // also objectScale contains already scaleX and scaleY\n width: neededX + ALIASING_LIMIT,\n height: neededY + ALIASING_LIMIT,\n zoomX: objectScale.scaleX,\n zoomY: objectScale.scaleY,\n x: neededX,\n y: neededY\n };\n },\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas: function() {\n var targetCanvas = this.canvas;\n if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) {\n var target = targetCanvas._currentTransform.target,\n action = targetCanvas._currentTransform.action;\n if (this === target && action.slice && action.slice(0, 5) === 'scale') {\n return false;\n }\n }\n var canvas = this._cacheCanvas,\n dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n minCacheSize = fabric.minCacheSideLimit,\n width = dims.width, height = dims.height, drawingWidth, drawingHeight,\n zoomX = dims.zoomX, zoomY = dims.zoomY,\n dimensionsChanged = width !== this.cacheWidth || height !== this.cacheHeight,\n zoomChanged = this.zoomX !== zoomX || this.zoomY !== zoomY,\n shouldRedraw = dimensionsChanged || zoomChanged,\n additionalWidth = 0, additionalHeight = 0, shouldResizeCanvas = false;\n if (dimensionsChanged) {\n var canvasWidth = this._cacheCanvas.width,\n canvasHeight = this._cacheCanvas.height,\n sizeGrowing = width > canvasWidth || height > canvasHeight,\n sizeShrinking = (width < canvasWidth * 0.9 || height < canvasHeight * 0.9) &&\n canvasWidth > minCacheSize && canvasHeight > minCacheSize;\n shouldResizeCanvas = sizeGrowing || sizeShrinking;\n if (sizeGrowing && !dims.capped && (width > minCacheSize || height > minCacheSize)) {\n additionalWidth = width * 0.1;\n additionalHeight = height * 0.1;\n }\n }\n if (shouldRedraw) {\n if (shouldResizeCanvas) {\n canvas.width = Math.ceil(width + additionalWidth);\n canvas.height = Math.ceil(height + additionalHeight);\n }\n else {\n this._cacheContext.setTransform(1, 0, 0, 1, 0, 0);\n this._cacheContext.clearRect(0, 0, canvas.width, canvas.height);\n }\n drawingWidth = dims.x / 2;\n drawingHeight = dims.y / 2;\n this.cacheTranslationX = Math.round(canvas.width / 2 - drawingWidth) + drawingWidth;\n this.cacheTranslationY = Math.round(canvas.height / 2 - drawingHeight) + drawingHeight;\n this.cacheWidth = width;\n this.cacheHeight = height;\n this._cacheContext.translate(this.cacheTranslationX, this.cacheTranslationY);\n this._cacheContext.scale(zoomX, zoomY);\n this.zoomX = zoomX;\n this.zoomY = zoomY;\n return true;\n }\n return false;\n },\n\n /**\n * Sets object's properties from options\n * @param {Object} [options] Options object\n */\n setOptions: function(options) {\n this._setOptions(options);\n this._initGradient(options.fill, 'fill');\n this._initGradient(options.stroke, 'stroke');\n this._initClipping(options);\n this._initPattern(options.fill, 'fill');\n this._initPattern(options.stroke, 'stroke');\n },\n\n /**\n * Transforms context when rendering an object\n * @param {CanvasRenderingContext2D} ctx Context\n */\n transform: function(ctx) {\n var m;\n if (this.group && !this.group._transformDone) {\n m = this.calcTransformMatrix();\n }\n else {\n m = this.calcOwnMatrix();\n }\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n },\n\n /**\n * Returns an object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS,\n\n object = {\n type: this.type,\n version: fabric.version,\n originX: this.originX,\n originY: this.originY,\n left: toFixed(this.left, NUM_FRACTION_DIGITS),\n top: toFixed(this.top, NUM_FRACTION_DIGITS),\n width: toFixed(this.width, NUM_FRACTION_DIGITS),\n height: toFixed(this.height, NUM_FRACTION_DIGITS),\n fill: (this.fill && this.fill.toObject) ? this.fill.toObject() : this.fill,\n stroke: (this.stroke && this.stroke.toObject) ? this.stroke.toObject() : this.stroke,\n strokeWidth: toFixed(this.strokeWidth, NUM_FRACTION_DIGITS),\n strokeDashArray: this.strokeDashArray ? this.strokeDashArray.concat() : this.strokeDashArray,\n strokeLineCap: this.strokeLineCap,\n strokeDashOffset: this.strokeDashOffset,\n strokeLineJoin: this.strokeLineJoin,\n // TODO: add this before release\n // strokeUniform: this.strokeUniform,\n strokeMiterLimit: toFixed(this.strokeMiterLimit, NUM_FRACTION_DIGITS),\n scaleX: toFixed(this.scaleX, NUM_FRACTION_DIGITS),\n scaleY: toFixed(this.scaleY, NUM_FRACTION_DIGITS),\n angle: toFixed(this.angle, NUM_FRACTION_DIGITS),\n flipX: this.flipX,\n flipY: this.flipY,\n opacity: toFixed(this.opacity, NUM_FRACTION_DIGITS),\n shadow: (this.shadow && this.shadow.toObject) ? this.shadow.toObject() : this.shadow,\n visible: this.visible,\n clipTo: this.clipTo && String(this.clipTo),\n backgroundColor: this.backgroundColor,\n fillRule: this.fillRule,\n paintFirst: this.paintFirst,\n globalCompositeOperation: this.globalCompositeOperation,\n transformMatrix: this.transformMatrix ? this.transformMatrix.concat() : null,\n skewX: toFixed(this.skewX, NUM_FRACTION_DIGITS),\n skewY: toFixed(this.skewY, NUM_FRACTION_DIGITS),\n };\n\n if (this.clipPath) {\n object.clipPath = this.clipPath.toObject(propertiesToInclude);\n object.clipPath.inverted = this.clipPath.inverted;\n object.clipPath.absolutePositioned = this.clipPath.absolutePositioned;\n }\n\n fabric.util.populateWithProperties(this, object, propertiesToInclude);\n if (!this.includeDefaultValues) {\n object = this._removeDefaultValues(object);\n }\n\n return object;\n },\n\n /**\n * Returns (dataless) object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toDatalessObject: function(propertiesToInclude) {\n // will be overwritten by subclasses\n return this.toObject(propertiesToInclude);\n },\n\n /**\n * @private\n * @param {Object} object\n */\n _removeDefaultValues: function(object) {\n var prototype = fabric.util.getKlass(object.type).prototype,\n stateProperties = prototype.stateProperties;\n stateProperties.forEach(function(prop) {\n if (prop === 'left' || prop === 'top') {\n return;\n }\n if (object[prop] === prototype[prop]) {\n delete object[prop];\n }\n var isArray = Object.prototype.toString.call(object[prop]) === '[object Array]' &&\n Object.prototype.toString.call(prototype[prop]) === '[object Array]';\n\n // basically a check for [] === []\n if (isArray && object[prop].length === 0 && prototype[prop].length === 0) {\n delete object[prop];\n }\n });\n\n return object;\n },\n\n /**\n * Returns a string representation of an instance\n * @return {String}\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Return the object scale factor counting also the group scaling\n * @return {Object} object with scaleX and scaleY properties\n */\n getObjectScaling: function() {\n var options = fabric.util.qrDecompose(this.calcTransformMatrix());\n return { scaleX: Math.abs(options.scaleX), scaleY: Math.abs(options.scaleY) };\n },\n\n /**\n * Return the object scale factor counting also the group scaling, zoom and retina\n * @return {Object} object with scaleX and scaleY properties\n */\n getTotalObjectScaling: function() {\n var scale = this.getObjectScaling(), scaleX = scale.scaleX, scaleY = scale.scaleY;\n if (this.canvas) {\n var zoom = this.canvas.getZoom();\n var retina = this.canvas.getRetinaScaling();\n scaleX *= zoom * retina;\n scaleY *= zoom * retina;\n }\n return { scaleX: scaleX, scaleY: scaleY };\n },\n\n /**\n * Return the object opacity counting also the group property\n * @return {Number}\n */\n getObjectOpacity: function() {\n var opacity = this.opacity;\n if (this.group) {\n opacity *= this.group.getObjectOpacity();\n }\n return opacity;\n },\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {fabric.Object} thisArg\n */\n _set: function(key, value) {\n var shouldConstrainValue = (key === 'scaleX' || key === 'scaleY'),\n isChanged = this[key] !== value, groupNeedsUpdate = false;\n\n if (shouldConstrainValue) {\n value = this._constrainScale(value);\n }\n if (key === 'scaleX' && value < 0) {\n this.flipX = !this.flipX;\n value *= -1;\n }\n else if (key === 'scaleY' && value < 0) {\n this.flipY = !this.flipY;\n value *= -1;\n }\n else if (key === 'shadow' && value && !(value instanceof fabric.Shadow)) {\n value = new fabric.Shadow(value);\n }\n else if (key === 'dirty' && this.group) {\n this.group.set('dirty', value);\n }\n\n this[key] = value;\n\n if (isChanged) {\n groupNeedsUpdate = this.group && this.group.isOnACache();\n if (this.cacheProperties.indexOf(key) > -1) {\n this.dirty = true;\n groupNeedsUpdate && this.group.set('dirty', true);\n }\n else if (groupNeedsUpdate && this.stateProperties.indexOf(key) > -1) {\n this.group.set('dirty', true);\n }\n }\n\n return this;\n },\n\n /**\n * This callback function is called by the parent group of an object every\n * time a non-delegated property changes on the group. It is passed the key\n * and value as parameters. Not adding in this function's signature to avoid\n * Travis build error about unused variables.\n */\n setOnGroup: function() {\n // implemented by sub-classes, as needed.\n },\n\n /**\n * Retrieves viewportTransform from Object's canvas if possible\n * @method getViewportTransform\n * @memberOf fabric.Object.prototype\n * @return {Array}\n */\n getViewportTransform: function() {\n if (this.canvas && this.canvas.viewportTransform) {\n return this.canvas.viewportTransform;\n }\n return fabric.iMatrix.concat();\n },\n\n /*\n * @private\n * return if the object would be visible in rendering\n * @memberOf fabric.Object.prototype\n * @return {Boolean}\n */\n isNotVisible: function() {\n return this.opacity === 0 ||\n (this.width === 0 && this.height === 0 && this.strokeWidth === 0) ||\n !this.visible;\n },\n\n /**\n * Renders an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render: function(ctx) {\n // do not render if width/height are zeros or object is not visible\n if (this.isNotVisible()) {\n return;\n }\n if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) {\n return;\n }\n ctx.save();\n this._setupCompositeOperation(ctx);\n this.drawSelectionBackground(ctx);\n this.transform(ctx);\n this._setOpacity(ctx);\n this._setShadow(ctx, this);\n if (this.transformMatrix) {\n ctx.transform.apply(ctx, this.transformMatrix);\n }\n this.clipTo && fabric.util.clipContext(this, ctx);\n if (this.shouldCache()) {\n this.renderCache();\n this.drawCacheOnCanvas(ctx);\n }\n else {\n this._removeCacheCanvas();\n this.dirty = false;\n this.drawObject(ctx);\n if (this.objectCaching && this.statefullCache) {\n this.saveState({ propertySet: 'cacheProperties' });\n }\n }\n this.clipTo && ctx.restore();\n ctx.restore();\n },\n\n renderCache: function(options) {\n options = options || {};\n if (!this._cacheCanvas) {\n this._createCacheCanvas();\n }\n if (this.isCacheDirty()) {\n this.statefullCache && this.saveState({ propertySet: 'cacheProperties' });\n this.drawObject(this._cacheContext, options.forClipping);\n this.dirty = false;\n }\n },\n\n /**\n * Remove cacheCanvas and its dimensions from the objects\n */\n _removeCacheCanvas: function() {\n this._cacheCanvas = null;\n this.cacheWidth = 0;\n this.cacheHeight = 0;\n },\n\n /**\n * return true if the object will draw a stroke\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an aproximation and be fast.\n * wrote to avoid extra caching, it has to return true when stroke happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the stroke is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasStroke: function() {\n return this.stroke && this.stroke !== 'transparent' && this.strokeWidth !== 0;\n },\n\n /**\n * return true if the object will draw a fill\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an aproximation and be fast.\n * wrote to avoid extra caching, it has to return true when fill happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the fill is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasFill: function() {\n return this.fill && this.fill !== 'transparent';\n },\n\n /**\n * When set to `true`, force the object to have its own cache, even if it is inside a group\n * it may be needed when your object behave in a particular way on the cache and always needs\n * its own isolated canvas to render correctly.\n * Created to be overridden\n * since 1.7.12\n * @returns Boolean\n */\n needsItsOwnCache: function() {\n if (this.paintFirst === 'stroke' &&\n this.hasFill() && this.hasStroke() && typeof this.shadow === 'object') {\n return true;\n }\n if (this.clipPath) {\n return true;\n }\n return false;\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group outside is cached.\n * Read as: cache if is needed, or if the feature is enabled but we are not already caching.\n * @return {Boolean}\n */\n shouldCache: function() {\n this.ownCaching = this.needsItsOwnCache() || (\n this.objectCaching &&\n (!this.group || !this.group.isOnACache())\n );\n return this.ownCaching;\n },\n\n /**\n * Check if this object or a child object will cast a shadow\n * used by Group.shouldCache to know if child has a shadow recursively\n * @return {Boolean}\n */\n willDrawShadow: function() {\n return !!this.shadow && (this.shadow.offsetX !== 0 || this.shadow.offsetY !== 0);\n },\n\n /**\n * Execute the drawing operation for an object clipPath\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawClipPathOnCache: function(ctx) {\n var path = this.clipPath;\n ctx.save();\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4\n if (path.inverted) {\n ctx.globalCompositeOperation = 'destination-out';\n }\n else {\n ctx.globalCompositeOperation = 'destination-in';\n }\n //ctx.scale(1 / 2, 1 / 2);\n if (path.absolutePositioned) {\n var m = fabric.util.invertTransform(this.calcTransformMatrix());\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n path.transform(ctx);\n ctx.scale(1 / path.zoomX, 1 / path.zoomY);\n ctx.drawImage(path._cacheCanvas, -path.cacheTranslationX, -path.cacheTranslationY);\n ctx.restore();\n },\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject: function(ctx, forClipping) {\n var originalFill = this.fill, originalStroke = this.stroke;\n if (forClipping) {\n this.fill = 'black';\n this.stroke = '';\n this._setClippingProperties(ctx);\n }\n else {\n this._renderBackground(ctx);\n this._setStrokeStyles(ctx, this);\n this._setFillStyles(ctx, this);\n }\n this._render(ctx);\n this._drawClipPath(ctx);\n this.fill = originalFill;\n this.stroke = originalStroke;\n },\n\n _drawClipPath: function(ctx) {\n var path = this.clipPath;\n if (!path) { return; }\n // needed to setup a couple of variables\n // path canvas gets overridden with this one.\n // TODO find a better solution?\n path.canvas = this.canvas;\n path.shouldCache();\n path._transformDone = true;\n path.renderCache({ forClipping: true });\n this.drawClipPathOnCache(ctx);\n },\n\n /**\n * Paint the cached copy of the object on the target context.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas: function(ctx) {\n ctx.scale(1 / this.zoomX, 1 / this.zoomY);\n ctx.drawImage(this._cacheCanvas, -this.cacheTranslationX, -this.cacheTranslationY);\n },\n\n /**\n * Check if cache is dirty\n * @param {Boolean} skipCanvas skip canvas checks because this object is painted\n * on parent canvas.\n */\n isCacheDirty: function(skipCanvas) {\n if (this.isNotVisible()) {\n return false;\n }\n if (this._cacheCanvas && !skipCanvas && this._updateCacheCanvas()) {\n // in this case the context is already cleared.\n return true;\n }\n else {\n if (this.dirty ||\n (this.clipPath && this.clipPath.absolutePositioned) ||\n (this.statefullCache && this.hasStateChanged('cacheProperties'))\n ) {\n if (this._cacheCanvas && !skipCanvas) {\n var width = this.cacheWidth / this.zoomX;\n var height = this.cacheHeight / this.zoomY;\n this._cacheContext.clearRect(-width / 2, -height / 2, width, height);\n }\n return true;\n }\n }\n return false;\n },\n\n /**\n * Draws a background for the object big as its untransformed dimensions\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground: function(ctx) {\n if (!this.backgroundColor) {\n return;\n }\n var dim = this._getNonTransformedDimensions();\n ctx.fillStyle = this.backgroundColor;\n\n ctx.fillRect(\n -dim.x / 2,\n -dim.y / 2,\n dim.x,\n dim.y\n );\n // if there is background color no other shadows\n // should be casted\n this._removeShadow(ctx);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setOpacity: function(ctx) {\n if (this.group && !this.group._transformDone) {\n ctx.globalAlpha = this.getObjectOpacity();\n }\n else {\n ctx.globalAlpha *= this.opacity;\n }\n },\n\n _setStrokeStyles: function(ctx, decl) {\n if (decl.stroke) {\n ctx.lineWidth = decl.strokeWidth;\n ctx.lineCap = decl.strokeLineCap;\n ctx.lineDashOffset = decl.strokeDashOffset;\n ctx.lineJoin = decl.strokeLineJoin;\n ctx.miterLimit = decl.strokeMiterLimit;\n ctx.strokeStyle = decl.stroke.toLive\n ? decl.stroke.toLive(ctx, this)\n : decl.stroke;\n }\n },\n\n _setFillStyles: function(ctx, decl) {\n if (decl.fill) {\n ctx.fillStyle = decl.fill.toLive\n ? decl.fill.toLive(ctx, this)\n : decl.fill;\n }\n },\n\n _setClippingProperties: function(ctx) {\n ctx.globalAlpha = 1;\n ctx.strokeStyle = 'transparent';\n ctx.fillStyle = '#000000';\n },\n\n /**\n * @private\n * Sets line dash\n * @param {CanvasRenderingContext2D} ctx Context to set the dash line on\n * @param {Array} dashArray array representing dashes\n * @param {Function} alternative function to call if browser does not support lineDash\n */\n _setLineDash: function(ctx, dashArray, alternative) {\n if (!dashArray || dashArray.length === 0) {\n return;\n }\n // Spec requires the concatenation of two copies the dash list when the number of elements is odd\n if (1 & dashArray.length) {\n dashArray.push.apply(dashArray, dashArray);\n }\n if (supportsLineDash) {\n ctx.setLineDash(dashArray);\n }\n else {\n alternative && alternative(ctx);\n }\n },\n\n /**\n * Renders controls and borders for the object\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n */\n _renderControls: function(ctx, styleOverride) {\n var vpt = this.getViewportTransform(),\n matrix = this.calcTransformMatrix(),\n options, drawBorders, drawControls;\n styleOverride = styleOverride || { };\n drawBorders = typeof styleOverride.hasBorders !== 'undefined' ? styleOverride.hasBorders : this.hasBorders;\n drawControls = typeof styleOverride.hasControls !== 'undefined' ? styleOverride.hasControls : this.hasControls;\n matrix = fabric.util.multiplyTransformMatrices(vpt, matrix);\n options = fabric.util.qrDecompose(matrix);\n ctx.save();\n ctx.translate(options.translateX, options.translateY);\n ctx.lineWidth = 1 * this.borderScaleFactor;\n if (!this.group) {\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n }\n if (styleOverride.forActiveSelection) {\n ctx.rotate(degreesToRadians(options.angle));\n drawBorders && this.drawBordersInGroup(ctx, options, styleOverride);\n }\n else {\n ctx.rotate(degreesToRadians(this.angle));\n drawBorders && this.drawBorders(ctx, styleOverride);\n }\n drawControls && this.drawControls(ctx, styleOverride);\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setShadow: function(ctx) {\n if (!this.shadow) {\n return;\n }\n\n var shadow = this.shadow, canvas = this.canvas, scaling,\n multX = (canvas && canvas.viewportTransform[0]) || 1,\n multY = (canvas && canvas.viewportTransform[3]) || 1;\n if (shadow.nonScaling) {\n scaling = { scaleX: 1, scaleY: 1 };\n }\n else {\n scaling = this.getObjectScaling();\n }\n if (canvas && canvas._isRetinaScaling()) {\n multX *= fabric.devicePixelRatio;\n multY *= fabric.devicePixelRatio;\n }\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur = shadow.blur * fabric.browserShadowBlurConstant *\n (multX + multY) * (scaling.scaleX + scaling.scaleY) / 4;\n ctx.shadowOffsetX = shadow.offsetX * multX * scaling.scaleX;\n ctx.shadowOffsetY = shadow.offsetY * multY * scaling.scaleY;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _removeShadow: function(ctx) {\n if (!this.shadow) {\n return;\n }\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} filler fabric.Pattern or fabric.Gradient\n * @return {Object} offset.offsetX offset for text rendering\n * @return {Object} offset.offsetY offset for text rendering\n */\n _applyPatternGradientTransform: function(ctx, filler) {\n if (!filler || !filler.toLive) {\n return { offsetX: 0, offsetY: 0 };\n }\n var t = filler.gradientTransform || filler.patternTransform;\n var offsetX = -this.width / 2 + filler.offsetX || 0,\n offsetY = -this.height / 2 + filler.offsetY || 0;\n\n if (filler.gradientUnits === 'percentage') {\n ctx.transform(this.width, 0, 0, this.height, offsetX, offsetY);\n }\n else {\n ctx.transform(1, 0, 0, 1, offsetX, offsetY);\n }\n if (t) {\n ctx.transform(t[0], t[1], t[2], t[3], t[4], t[5]);\n }\n return { offsetX: offsetX, offsetY: offsetY };\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderPaintInOrder: function(ctx) {\n if (this.paintFirst === 'stroke') {\n this._renderStroke(ctx);\n this._renderFill(ctx);\n }\n else {\n this._renderFill(ctx);\n this._renderStroke(ctx);\n }\n },\n\n /**\n * @private\n * function that actually render something on the context.\n * empty here to allow Obects to work on tests to benchmark fabric functionalites\n * not related to rendering\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(/* ctx */) {\n\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderFill: function(ctx) {\n if (!this.fill) {\n return;\n }\n\n ctx.save();\n this._applyPatternGradientTransform(ctx, this.fill);\n if (this.fillRule === 'evenodd') {\n ctx.fill('evenodd');\n }\n else {\n ctx.fill();\n }\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderStroke: function(ctx) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n if (this.strokeUniform && this.group) {\n var scaling = this.getObjectScaling();\n ctx.scale(1 / scaling.scaleX, 1 / scaling.scaleY);\n }\n else if (this.strokeUniform) {\n ctx.scale(1 / this.scaleX, 1 / this.scaleY);\n }\n this._setLineDash(ctx, this.strokeDashArray, this._renderDashedStroke);\n if (this.stroke.toLive && this.stroke.gradientUnits === 'percentage') {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n this._applyPatternForTransformedGradient(ctx, this.stroke);\n }\n else {\n this._applyPatternGradientTransform(ctx, this.stroke);\n }\n ctx.stroke();\n ctx.restore();\n },\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drwabacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {fabric.Gradient} filler a fabric gradient instance\n */\n _applyPatternForTransformedGradient: function(ctx, filler) {\n var dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n pCanvas = fabric.util.createCanvasElement(), pCtx, retinaScaling = this.canvas.getRetinaScaling(),\n width = dims.x / this.scaleX / retinaScaling, height = dims.y / this.scaleY / retinaScaling;\n pCanvas.width = width;\n pCanvas.height = height;\n pCtx = pCanvas.getContext('2d');\n pCtx.beginPath(); pCtx.moveTo(0, 0); pCtx.lineTo(width, 0); pCtx.lineTo(width, height);\n pCtx.lineTo(0, height); pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.scale(\n dims.zoomX / this.scaleX / retinaScaling,\n dims.zoomY / this.scaleY / retinaScaling\n );\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fillStyle = filler.toLive(ctx);\n pCtx.fill();\n ctx.translate(-this.width / 2 - this.strokeWidth / 2, -this.height / 2 - this.strokeWidth / 2);\n ctx.scale(\n retinaScaling * this.scaleX / dims.zoomX,\n retinaScaling * this.scaleY / dims.zoomY\n );\n ctx.strokeStyle = pCtx.createPattern(pCanvas, 'no-repeat');\n },\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Object} center point from element coordinates\n */\n _findCenterFromElement: function() {\n return { x: this.left + this.width / 2, y: this.top + this.height / 2 };\n },\n\n /**\n * This function is an helper for svg import. it decompose the transformMatrix\n * and assign properties to object.\n * untransformed coordinates\n * @private\n * @chainable\n */\n _assignTransformMatrixProps: function() {\n if (this.transformMatrix) {\n var options = fabric.util.qrDecompose(this.transformMatrix);\n this.flipX = false;\n this.flipY = false;\n this.set('scaleX', options.scaleX);\n this.set('scaleY', options.scaleY);\n this.angle = options.angle;\n this.skewX = options.skewX;\n this.skewY = 0;\n }\n },\n\n /**\n * This function is an helper for svg import. it removes the transform matrix\n * and set to object properties that fabricjs can handle\n * @private\n * @param {Object} preserveAspectRatioOptions\n * @return {thisArg}\n */\n _removeTransformMatrix: function(preserveAspectRatioOptions) {\n var center = this._findCenterFromElement();\n if (this.transformMatrix) {\n this._assignTransformMatrixProps();\n center = fabric.util.transformPoint(center, this.transformMatrix);\n }\n this.transformMatrix = null;\n if (preserveAspectRatioOptions) {\n this.scaleX *= preserveAspectRatioOptions.scaleX;\n this.scaleY *= preserveAspectRatioOptions.scaleY;\n this.cropX = preserveAspectRatioOptions.cropX;\n this.cropY = preserveAspectRatioOptions.cropY;\n center.x += preserveAspectRatioOptions.offsetLeft;\n center.y += preserveAspectRatioOptions.offsetTop;\n this.width = preserveAspectRatioOptions.width;\n this.height = preserveAspectRatioOptions.height;\n }\n this.setPositionByOrigin(center, 'center', 'center');\n },\n\n /**\n * Clones an instance, using a callback method will work for every object.\n * @param {Function} callback Callback is invoked with a clone as a first argument\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n */\n clone: function(callback, propertiesToInclude) {\n var objectForm = this.toObject(propertiesToInclude);\n if (this.constructor.fromObject) {\n this.constructor.fromObject(objectForm, callback);\n }\n else {\n fabric.Object._fromObject('Object', objectForm, callback);\n }\n },\n\n /**\n * Creates an instance of fabric.Image out of an object\n * could make use of both toDataUrl or toCanvasElement.\n * @param {Function} callback callback, invoked with an instance as a first argument\n * @param {Object} [options] for clone as image, passed to toDataURL\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {fabric.Object} thisArg\n */\n cloneAsImage: function(callback, options) {\n var canvasEl = this.toCanvasElement(options);\n if (callback) {\n callback(new fabric.Image(canvasEl));\n }\n return this;\n },\n\n /**\n * Converts an object into a HTMLCanvas element\n * @param {Object} options Options object\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {HTMLCanvasElement} Returns DOM element with the fabric.Object\n */\n toCanvasElement: function(options) {\n options || (options = { });\n\n var utils = fabric.util, origParams = utils.saveObjectTransform(this),\n originalGroup = this.group,\n originalShadow = this.shadow, abs = Math.abs,\n multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? fabric.devicePixelRatio : 1);\n delete this.group;\n if (options.withoutTransform) {\n utils.resetObjectTransform(this);\n }\n if (options.withoutShadow) {\n this.shadow = null;\n }\n\n var el = fabric.util.createCanvasElement(),\n // skip canvas zoom and calculate with setCoords now.\n boundingRect = this.getBoundingRect(true, true),\n shadow = this.shadow, scaling,\n shadowOffset = { x: 0, y: 0 }, shadowBlur,\n width, height;\n\n if (shadow) {\n shadowBlur = shadow.blur;\n if (shadow.nonScaling) {\n scaling = { scaleX: 1, scaleY: 1 };\n }\n else {\n scaling = this.getObjectScaling();\n }\n // consider non scaling shadow.\n shadowOffset.x = 2 * Math.round(abs(shadow.offsetX) + shadowBlur) * (abs(scaling.scaleX));\n shadowOffset.y = 2 * Math.round(abs(shadow.offsetY) + shadowBlur) * (abs(scaling.scaleY));\n }\n width = boundingRect.width + shadowOffset.x;\n height = boundingRect.height + shadowOffset.y;\n // if the current width/height is not an integer\n // we need to make it so.\n el.width = Math.ceil(width);\n el.height = Math.ceil(height);\n var canvas = new fabric.StaticCanvas(el, {\n enableRetinaScaling: false,\n renderOnAddRemove: false,\n skipOffscreen: false,\n });\n if (options.format === 'jpeg') {\n canvas.backgroundColor = '#fff';\n }\n this.setPositionByOrigin(new fabric.Point(canvas.width / 2, canvas.height / 2), 'center', 'center');\n\n var originalCanvas = this.canvas;\n canvas.add(this);\n var canvasEl = canvas.toCanvasElement(multiplier || 1, options);\n this.shadow = originalShadow;\n this.set('canvas', originalCanvas);\n if (originalGroup) {\n this.group = originalGroup;\n }\n this.set(origParams).setCoords();\n // canvas.dispose will call image.dispose that will nullify the elements\n // since this canvas is a simple element for the process, we remove references\n // to objects in this way in order to avoid object trashing.\n canvas._objects = [];\n canvas.dispose();\n canvas = null;\n\n return canvasEl;\n },\n\n /**\n * Converts an object into a data-url-like string\n * @param {Object} options Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n */\n toDataURL: function(options) {\n options || (options = { });\n return fabric.util.toDataURL(this.toCanvasElement(options), options.format || 'png', options.quality || 1);\n },\n\n /**\n * Returns true if specified type is identical to the type of an instance\n * @param {String} type Type to check against\n * @return {Boolean}\n */\n isType: function(type) {\n return this.type === type;\n },\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance (is 1 unless subclassed)\n */\n complexity: function() {\n return 1;\n },\n\n /**\n * Returns a JSON representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} JSON\n */\n toJSON: function(propertiesToInclude) {\n // delegate, not alias\n return this.toObject(propertiesToInclude);\n },\n\n /**\n * Sets gradient (fill or stroke) of an object\n * percentages for x1,x2,y1,y2,r1,r2 together with gradientUnits 'pixels', are not supported.\n * Backwards incompatibility note: This method was named \"setGradientFill\" until v1.1.0\n * @param {String} property Property name 'stroke' or 'fill'\n * @param {Object} [options] Options object\n * @param {String} [options.type] Type of gradient 'radial' or 'linear'\n * @param {Number} [options.x1=0] x-coordinate of start point\n * @param {Number} [options.y1=0] y-coordinate of start point\n * @param {Number} [options.x2=0] x-coordinate of end point\n * @param {Number} [options.y2=0] y-coordinate of end point\n * @param {Number} [options.r1=0] Radius of start point (only for radial gradients)\n * @param {Number} [options.r2=0] Radius of end point (only for radial gradients)\n * @param {Object} [options.colorStops] Color stops object eg. {0: 'ff0000', 1: '000000'}\n * @param {Object} [options.gradientTransform] transformMatrix for gradient\n * @return {fabric.Object} thisArg\n * @chainable\n * @deprecated since 3.4.0\n * @see {@link http://jsfiddle.net/fabricjs/58y8b/|jsFiddle demo}\n * @example Set linear gradient\n * object.setGradient('fill', {\n * type: 'linear',\n * x1: -object.width / 2,\n * y1: 0,\n * x2: object.width / 2,\n * y2: 0,\n * colorStops: {\n * 0: 'red',\n * 0.5: '#005555',\n * 1: 'rgba(0,0,255,0.5)'\n * }\n * });\n * canvas.renderAll();\n * @example Set radial gradient\n * object.setGradient('fill', {\n * type: 'radial',\n * x1: 0,\n * y1: 0,\n * x2: 0,\n * y2: 0,\n * r1: object.width / 2,\n * r2: 10,\n * colorStops: {\n * 0: 'red',\n * 0.5: '#005555',\n * 1: 'rgba(0,0,255,0.5)'\n * }\n * });\n * canvas.renderAll();\n */\n setGradient: function(property, options) {\n options || (options = { });\n\n var gradient = { colorStops: [] };\n\n gradient.type = options.type || (options.r1 || options.r2 ? 'radial' : 'linear');\n gradient.coords = {\n x1: options.x1,\n y1: options.y1,\n x2: options.x2,\n y2: options.y2\n };\n gradient.gradientUnits = options.gradientUnits || 'pixels';\n if (options.r1 || options.r2) {\n gradient.coords.r1 = options.r1;\n gradient.coords.r2 = options.r2;\n }\n\n gradient.gradientTransform = options.gradientTransform;\n fabric.Gradient.prototype.addColorStop.call(gradient, options.colorStops);\n\n return this.set(property, fabric.Gradient.forObject(this, gradient));\n },\n\n /**\n * Sets pattern fill of an object\n * @param {Object} options Options object\n * @param {(String|HTMLImageElement)} options.source Pattern source\n * @param {String} [options.repeat=repeat] Repeat property of a pattern (one of repeat, repeat-x, repeat-y or no-repeat)\n * @param {Number} [options.offsetX=0] Pattern horizontal offset from object's left/top corner\n * @param {Number} [options.offsetY=0] Pattern vertical offset from object's left/top corner\n * @param {Function} [callback] Callback to invoke when image set as a pattern\n * @return {fabric.Object} thisArg\n * @chainable\n * @deprecated since 3.5.0\n * @see {@link http://jsfiddle.net/fabricjs/QT3pa/|jsFiddle demo}\n * @example Set pattern\n * object.setPatternFill({\n * source: 'http://fabricjs.com/assets/escheresque_ste.png',\n * repeat: 'repeat'\n * },canvas.renderAll.bind(canvas));\n */\n setPatternFill: function(options, callback) {\n return this.set('fill', new fabric.Pattern(options, callback));\n },\n\n /**\n * Sets {@link fabric.Object#shadow|shadow} of an object\n * @param {Object|String} [options] Options object or string (e.g. \"2px 2px 10px rgba(0,0,0,0.2)\")\n * @param {String} [options.color=rgb(0,0,0)] Shadow color\n * @param {Number} [options.blur=0] Shadow blur\n * @param {Number} [options.offsetX=0] Shadow horizontal offset\n * @param {Number} [options.offsetY=0] Shadow vertical offset\n * @return {fabric.Object} thisArg\n * @chainable\n * @deprecated since 3.5.0\n * @see {@link http://jsfiddle.net/fabricjs/7gvJG/|jsFiddle demo}\n * @example Set shadow with string notation\n * object.setShadow('2px 2px 10px rgba(0,0,0,0.2)');\n * canvas.renderAll();\n * @example Set shadow with object notation\n * object.setShadow({\n * color: 'red',\n * blur: 10,\n * offsetX: 20,\n * offsetY: 20\n * });\n * canvas.renderAll();\n */\n setShadow: function(options) {\n return this.set('shadow', options ? new fabric.Shadow(options) : null);\n },\n\n /**\n * Sets \"color\" of an instance (alias of `set('fill', …)`)\n * @param {String} color Color value\n * @return {fabric.Object} thisArg\n * @deprecated since 3.5.0\n * @chainable\n */\n setColor: function(color) {\n this.set('fill', color);\n return this;\n },\n\n /**\n * Sets \"angle\" of an instance with centered rotation\n * @param {Number} angle Angle value (in degrees)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n rotate: function(angle) {\n var shouldCenterOrigin = (this.originX !== 'center' || this.originY !== 'center') && this.centeredRotation;\n\n if (shouldCenterOrigin) {\n this._setOriginToCenter();\n }\n\n this.set('angle', angle);\n\n if (shouldCenterOrigin) {\n this._resetOrigin();\n }\n\n return this;\n },\n\n /**\n * Centers object horizontally on canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n centerH: function () {\n this.canvas && this.canvas.centerObjectH(this);\n return this;\n },\n\n /**\n * Centers object horizontally on current viewport of canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n viewportCenterH: function () {\n this.canvas && this.canvas.viewportCenterObjectH(this);\n return this;\n },\n\n /**\n * Centers object vertically on canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n centerV: function () {\n this.canvas && this.canvas.centerObjectV(this);\n return this;\n },\n\n /**\n * Centers object vertically on current viewport of canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n viewportCenterV: function () {\n this.canvas && this.canvas.viewportCenterObjectV(this);\n return this;\n },\n\n /**\n * Centers object vertically and horizontally on canvas to which is was added last\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n center: function () {\n this.canvas && this.canvas.centerObject(this);\n return this;\n },\n\n /**\n * Centers object on current viewport of canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n viewportCenter: function () {\n this.canvas && this.canvas.viewportCenterObject(this);\n return this;\n },\n\n /**\n * Returns coordinates of a pointer relative to an object\n * @param {Event} e Event to operate upon\n * @param {Object} [pointer] Pointer to operate upon (instead of event)\n * @return {Object} Coordinates of a pointer (x, y)\n */\n getLocalPointer: function(e, pointer) {\n pointer = pointer || this.canvas.getPointer(e);\n var pClicked = new fabric.Point(pointer.x, pointer.y),\n objectLeftTop = this._getLeftTopCoords();\n if (this.angle) {\n pClicked = fabric.util.rotatePoint(\n pClicked, objectLeftTop, degreesToRadians(-this.angle));\n }\n return {\n x: pClicked.x - objectLeftTop.x,\n y: pClicked.y - objectLeftTop.y\n };\n },\n\n /**\n * Sets canvas globalCompositeOperation for specific object\n * custom composition operation for the particular object can be specified using globalCompositeOperation property\n * @param {CanvasRenderingContext2D} ctx Rendering canvas context\n */\n _setupCompositeOperation: function (ctx) {\n if (this.globalCompositeOperation) {\n ctx.globalCompositeOperation = this.globalCompositeOperation;\n }\n }\n });\n\n fabric.util.createAccessors && fabric.util.createAccessors(fabric.Object);\n\n extend(fabric.Object.prototype, fabric.Observable);\n\n /**\n * Defines the number of fraction digits to use when serializing object values.\n * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc.\n * @static\n * @memberOf fabric.Object\n * @constant\n * @type Number\n */\n fabric.Object.NUM_FRACTION_DIGITS = 2;\n\n fabric.Object._fromObject = function(className, object, callback, extraParam) {\n var klass = fabric[className];\n object = clone(object, true);\n fabric.util.enlivenPatterns([object.fill, object.stroke], function(patterns) {\n if (typeof patterns[0] !== 'undefined') {\n object.fill = patterns[0];\n }\n if (typeof patterns[1] !== 'undefined') {\n object.stroke = patterns[1];\n }\n fabric.util.enlivenObjects([object.clipPath], function(enlivedProps) {\n object.clipPath = enlivedProps[0];\n var instance = extraParam ? new klass(object[extraParam], object) : new klass(object);\n callback && callback(instance);\n });\n });\n };\n\n /**\n * Unique id used internally when creating SVG elements\n * @static\n * @memberOf fabric.Object\n * @type Number\n */\n fabric.Object.__uid = 0;\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n var degreesToRadians = fabric.util.degreesToRadians,\n originXOffset = {\n left: -0.5,\n center: 0,\n right: 0.5\n },\n originYOffset = {\n top: -0.5,\n center: 0,\n bottom: 0.5\n };\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Translates the coordinates from a set of origin to another (based on the object's dimensions)\n * @param {fabric.Point} point The point which corresponds to the originX and originY params\n * @param {String} fromOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} fromOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @param {String} toOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} toOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n translateToGivenOrigin: function(point, fromOriginX, fromOriginY, toOriginX, toOriginY) {\n var x = point.x,\n y = point.y,\n offsetX, offsetY, dim;\n\n if (typeof fromOriginX === 'string') {\n fromOriginX = originXOffset[fromOriginX];\n }\n else {\n fromOriginX -= 0.5;\n }\n\n if (typeof toOriginX === 'string') {\n toOriginX = originXOffset[toOriginX];\n }\n else {\n toOriginX -= 0.5;\n }\n\n offsetX = toOriginX - fromOriginX;\n\n if (typeof fromOriginY === 'string') {\n fromOriginY = originYOffset[fromOriginY];\n }\n else {\n fromOriginY -= 0.5;\n }\n\n if (typeof toOriginY === 'string') {\n toOriginY = originYOffset[toOriginY];\n }\n else {\n toOriginY -= 0.5;\n }\n\n offsetY = toOriginY - fromOriginY;\n\n if (offsetX || offsetY) {\n dim = this._getTransformedDimensions();\n x = point.x + offsetX * dim.x;\n y = point.y + offsetY * dim.y;\n }\n\n return new fabric.Point(x, y);\n },\n\n /**\n * Translates the coordinates from origin to center coordinates (based on the object's dimensions)\n * @param {fabric.Point} point The point which corresponds to the originX and originY params\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n translateToCenterPoint: function(point, originX, originY) {\n var p = this.translateToGivenOrigin(point, originX, originY, 'center', 'center');\n if (this.angle) {\n return fabric.util.rotatePoint(p, point, degreesToRadians(this.angle));\n }\n return p;\n },\n\n /**\n * Translates the coordinates from center to origin coordinates (based on the object's dimensions)\n * @param {fabric.Point} center The point which corresponds to center of the object\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n translateToOriginPoint: function(center, originX, originY) {\n var p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY);\n if (this.angle) {\n return fabric.util.rotatePoint(p, center, degreesToRadians(this.angle));\n }\n return p;\n },\n\n /**\n * Returns the real center coordinates of the object\n * @return {fabric.Point}\n */\n getCenterPoint: function() {\n var leftTop = new fabric.Point(this.left, this.top);\n return this.translateToCenterPoint(leftTop, this.originX, this.originY);\n },\n\n /**\n * Returns the coordinates of the object based on center coordinates\n * @param {fabric.Point} point The point which corresponds to the originX and originY params\n * @return {fabric.Point}\n */\n // getOriginPoint: function(center) {\n // return this.translateToOriginPoint(center, this.originX, this.originY);\n // },\n\n /**\n * Returns the coordinates of the object as if it has a different origin\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n getPointByOrigin: function(originX, originY) {\n var center = this.getCenterPoint();\n return this.translateToOriginPoint(center, originX, originY);\n },\n\n /**\n * Returns the point in local coordinates\n * @param {fabric.Point} point The point relative to the global coordinate system\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n toLocalPoint: function(point, originX, originY) {\n var center = this.getCenterPoint(),\n p, p2;\n\n if (typeof originX !== 'undefined' && typeof originY !== 'undefined' ) {\n p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY);\n }\n else {\n p = new fabric.Point(this.left, this.top);\n }\n\n p2 = new fabric.Point(point.x, point.y);\n if (this.angle) {\n p2 = fabric.util.rotatePoint(p2, center, -degreesToRadians(this.angle));\n }\n return p2.subtractEquals(p);\n },\n\n /**\n * Returns the point in global coordinates\n * @param {fabric.Point} The point relative to the local coordinate system\n * @return {fabric.Point}\n */\n // toGlobalPoint: function(point) {\n // return fabric.util.rotatePoint(point, this.getCenterPoint(), degreesToRadians(this.angle)).addEquals(new fabric.Point(this.left, this.top));\n // },\n\n /**\n * Sets the position of the object taking into consideration the object's origin\n * @param {fabric.Point} pos The new position of the object\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {void}\n */\n setPositionByOrigin: function(pos, originX, originY) {\n var center = this.translateToCenterPoint(pos, originX, originY),\n position = this.translateToOriginPoint(center, this.originX, this.originY);\n this.set('left', position.x);\n this.set('top', position.y);\n },\n\n /**\n * @param {String} to One of 'left', 'center', 'right'\n */\n adjustPosition: function(to) {\n var angle = degreesToRadians(this.angle),\n hypotFull = this.getScaledWidth(),\n xFull = fabric.util.cos(angle) * hypotFull,\n yFull = fabric.util.sin(angle) * hypotFull,\n offsetFrom, offsetTo;\n\n //TODO: this function does not consider mixed situation like top, center.\n if (typeof this.originX === 'string') {\n offsetFrom = originXOffset[this.originX];\n }\n else {\n offsetFrom = this.originX - 0.5;\n }\n if (typeof to === 'string') {\n offsetTo = originXOffset[to];\n }\n else {\n offsetTo = to - 0.5;\n }\n this.left += xFull * (offsetTo - offsetFrom);\n this.top += yFull * (offsetTo - offsetFrom);\n this.setCoords();\n this.originX = to;\n },\n\n /**\n * Sets the origin/position of the object to it's center point\n * @private\n * @return {void}\n */\n _setOriginToCenter: function() {\n this._originalOriginX = this.originX;\n this._originalOriginY = this.originY;\n\n var center = this.getCenterPoint();\n\n this.originX = 'center';\n this.originY = 'center';\n\n this.left = center.x;\n this.top = center.y;\n },\n\n /**\n * Resets the origin/position of the object to it's original origin\n * @private\n * @return {void}\n */\n _resetOrigin: function() {\n var originPoint = this.translateToOriginPoint(\n this.getCenterPoint(),\n this._originalOriginX,\n this._originalOriginY);\n\n this.originX = this._originalOriginX;\n this.originY = this._originalOriginY;\n\n this.left = originPoint.x;\n this.top = originPoint.y;\n\n this._originalOriginX = null;\n this._originalOriginY = null;\n },\n\n /**\n * @private\n */\n _getLeftTopCoords: function() {\n return this.translateToOriginPoint(this.getCenterPoint(), 'left', 'top');\n },\n });\n\n})();\n\n\n(function() {\n\n function getCoords(coords) {\n return [\n new fabric.Point(coords.tl.x, coords.tl.y),\n new fabric.Point(coords.tr.x, coords.tr.y),\n new fabric.Point(coords.br.x, coords.br.y),\n new fabric.Point(coords.bl.x, coords.bl.y)\n ];\n }\n\n var degreesToRadians = fabric.util.degreesToRadians,\n multiplyMatrices = fabric.util.multiplyTransformMatrices,\n transformPoint = fabric.util.transformPoint;\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Describe object's corner position in canvas element coordinates.\n * properties are tl,mt,tr,ml,mr,bl,mb,br,mtr for the main controls.\n * each property is an object with x, y and corner.\n * The `corner` property contains in a similar manner the 4 points of the\n * interactive area of the corner.\n * The coordinates depends from this properties: width, height, scaleX, scaleY\n * skewX, skewY, angle, strokeWidth, viewportTransform, top, left, padding.\n * The coordinates get updated with @method setCoords.\n * You can calculate them without updating with @method calcCoords;\n * @memberOf fabric.Object.prototype\n */\n oCoords: null,\n\n /**\n * Describe object's corner position in canvas object absolute coordinates\n * properties are tl,tr,bl,br and describe the four main corner.\n * each property is an object with x, y, instance of Fabric.Point.\n * The coordinates depends from this properties: width, height, scaleX, scaleY\n * skewX, skewY, angle, strokeWidth, top, left.\n * Those coordinates are useful to understand where an object is. They get updated\n * with oCoords but they do not need to be updated when zoom or panning change.\n * The coordinates get updated with @method setCoords.\n * You can calculate them without updating with @method calcCoords(true);\n * @memberOf fabric.Object.prototype\n */\n aCoords: null,\n\n /**\n * storage for object transform matrix\n */\n ownMatrixCache: null,\n\n /**\n * storage for object full transform matrix\n */\n matrixCache: null,\n\n /**\n * return correct set of coordinates for intersection\n */\n getCoords: function(absolute, calculate) {\n if (!this.oCoords) {\n this.setCoords();\n }\n var coords = absolute ? this.aCoords : this.oCoords;\n return getCoords(calculate ? this.calcCoords(absolute) : coords);\n },\n\n /**\n * Checks if object intersects with an area formed by 2 points\n * @param {Object} pointTL top-left point of area\n * @param {Object} pointBR bottom-right point of area\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object intersects with an area formed by 2 points\n */\n intersectsWithRect: function(pointTL, pointBR, absolute, calculate) {\n var coords = this.getCoords(absolute, calculate),\n intersection = fabric.Intersection.intersectPolygonRectangle(\n coords,\n pointTL,\n pointBR\n );\n return intersection.status === 'Intersection';\n },\n\n /**\n * Checks if object intersects with another object\n * @param {Object} other Object to test\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object intersects with another object\n */\n intersectsWithObject: function(other, absolute, calculate) {\n var intersection = fabric.Intersection.intersectPolygonPolygon(\n this.getCoords(absolute, calculate),\n other.getCoords(absolute, calculate)\n );\n\n return intersection.status === 'Intersection'\n || other.isContainedWithinObject(this, absolute, calculate)\n || this.isContainedWithinObject(other, absolute, calculate);\n },\n\n /**\n * Checks if object is fully contained within area of another object\n * @param {Object} other Object to test\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object is fully contained within area of another object\n */\n isContainedWithinObject: function(other, absolute, calculate) {\n var points = this.getCoords(absolute, calculate),\n i = 0, lines = other._getImageLines(\n calculate ? other.calcCoords(absolute) : absolute ? other.aCoords : other.oCoords\n );\n for (; i < 4; i++) {\n if (!other.containsPoint(points[i], lines)) {\n return false;\n }\n }\n return true;\n },\n\n /**\n * Checks if object is fully contained within area formed by 2 points\n * @param {Object} pointTL top-left point of area\n * @param {Object} pointBR bottom-right point of area\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object is fully contained within area formed by 2 points\n */\n isContainedWithinRect: function(pointTL, pointBR, absolute, calculate) {\n var boundingRect = this.getBoundingRect(absolute, calculate);\n\n return (\n boundingRect.left >= pointTL.x &&\n boundingRect.left + boundingRect.width <= pointBR.x &&\n boundingRect.top >= pointTL.y &&\n boundingRect.top + boundingRect.height <= pointBR.y\n );\n },\n\n /**\n * Checks if point is inside the object\n * @param {fabric.Point} point Point to check against\n * @param {Object} [lines] object returned from @method _getImageLines\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if point is inside the object\n */\n containsPoint: function(point, lines, absolute, calculate) {\n var lines = lines || this._getImageLines(\n calculate ? this.calcCoords(absolute) : absolute ? this.aCoords : this.oCoords\n ),\n xPoints = this._findCrossPoints(point, lines);\n\n // if xPoints is odd then point is inside the object\n return (xPoints !== 0 && xPoints % 2 === 1);\n },\n\n /**\n * Checks if object is contained within the canvas with current viewportTransform\n * the check is done stopping at first point that appears on screen\n * @param {Boolean} [calculate] use coordinates of current position instead of .aCoords\n * @return {Boolean} true if object is fully or partially contained within canvas\n */\n isOnScreen: function(calculate) {\n if (!this.canvas) {\n return false;\n }\n var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br;\n var points = this.getCoords(true, calculate), point;\n for (var i = 0; i < 4; i++) {\n point = points[i];\n if (point.x <= pointBR.x && point.x >= pointTL.x && point.y <= pointBR.y && point.y >= pointTL.y) {\n return true;\n }\n }\n // no points on screen, check intersection with absolute coordinates\n if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) {\n return true;\n }\n return this._containsCenterOfCanvas(pointTL, pointBR, calculate);\n },\n\n /**\n * Checks if the object contains the midpoint between canvas extremities\n * Does not make sense outside the context of isOnScreen and isPartiallyOnScreen\n * @private\n * @param {Fabric.Point} pointTL Top Left point\n * @param {Fabric.Point} pointBR Top Right point\n * @param {Boolean} calculate use coordinates of current position instead of .oCoords\n * @return {Boolean} true if the object contains the point\n */\n _containsCenterOfCanvas: function(pointTL, pointBR, calculate) {\n // worst case scenario the object is so big that contains the screen\n var centerPoint = { x: (pointTL.x + pointBR.x) / 2, y: (pointTL.y + pointBR.y) / 2 };\n if (this.containsPoint(centerPoint, null, true, calculate)) {\n return true;\n }\n return false;\n },\n\n /**\n * Checks if object is partially contained within the canvas with current viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object is partially contained within canvas\n */\n isPartiallyOnScreen: function(calculate) {\n if (!this.canvas) {\n return false;\n }\n var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br;\n if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) {\n return true;\n }\n return this._containsCenterOfCanvas(pointTL, pointBR, calculate);\n },\n\n /**\n * Method that returns an object with the object edges in it, given the coordinates of the corners\n * @private\n * @param {Object} oCoords Coordinates of the object corners\n */\n _getImageLines: function(oCoords) {\n return {\n topline: {\n o: oCoords.tl,\n d: oCoords.tr\n },\n rightline: {\n o: oCoords.tr,\n d: oCoords.br\n },\n bottomline: {\n o: oCoords.br,\n d: oCoords.bl\n },\n leftline: {\n o: oCoords.bl,\n d: oCoords.tl\n }\n };\n },\n\n /**\n * Helper method to determine how many cross points are between the 4 object edges\n * and the horizontal line determined by a point on canvas\n * @private\n * @param {fabric.Point} point Point to check\n * @param {Object} lines Coordinates of the object being evaluated\n */\n // remove yi, not used but left code here just in case.\n _findCrossPoints: function(point, lines) {\n var b1, b2, a1, a2, xi, // yi,\n xcount = 0,\n iLine;\n\n for (var lineKey in lines) {\n iLine = lines[lineKey];\n // optimisation 1: line below point. no cross\n if ((iLine.o.y < point.y) && (iLine.d.y < point.y)) {\n continue;\n }\n // optimisation 2: line above point. no cross\n if ((iLine.o.y >= point.y) && (iLine.d.y >= point.y)) {\n continue;\n }\n // optimisation 3: vertical line case\n if ((iLine.o.x === iLine.d.x) && (iLine.o.x >= point.x)) {\n xi = iLine.o.x;\n // yi = point.y;\n }\n // calculate the intersection point\n else {\n b1 = 0;\n b2 = (iLine.d.y - iLine.o.y) / (iLine.d.x - iLine.o.x);\n a1 = point.y - b1 * point.x;\n a2 = iLine.o.y - b2 * iLine.o.x;\n\n xi = -(a1 - a2) / (b1 - b2);\n // yi = a1 + b1 * xi;\n }\n // dont count xi < point.x cases\n if (xi >= point.x) {\n xcount += 1;\n }\n // optimisation 4: specific for square images\n if (xcount === 2) {\n break;\n }\n }\n return xcount;\n },\n\n /**\n * Returns coordinates of object's bounding rectangle (left, top, width, height)\n * the box is intended as aligned to axis of canvas.\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords / .aCoords\n * @return {Object} Object with left, top, width, height properties\n */\n getBoundingRect: function(absolute, calculate) {\n var coords = this.getCoords(absolute, calculate);\n return fabric.util.makeBoundingBoxFromPoints(coords);\n },\n\n /**\n * Returns width of an object's bounding box counting transformations\n * before 2.0 it was named getWidth();\n * @return {Number} width value\n */\n getScaledWidth: function() {\n return this._getTransformedDimensions().x;\n },\n\n /**\n * Returns height of an object bounding box counting transformations\n * before 2.0 it was named getHeight();\n * @return {Number} height value\n */\n getScaledHeight: function() {\n return this._getTransformedDimensions().y;\n },\n\n /**\n * Makes sure the scale is valid and modifies it if necessary\n * @private\n * @param {Number} value\n * @return {Number}\n */\n _constrainScale: function(value) {\n if (Math.abs(value) < this.minScaleLimit) {\n if (value < 0) {\n return -this.minScaleLimit;\n }\n else {\n return this.minScaleLimit;\n }\n }\n else if (value === 0) {\n return 0.0001;\n }\n return value;\n },\n\n /**\n * Scales an object (equally by x and y)\n * @param {Number} value Scale factor\n * @return {fabric.Object} thisArg\n * @chainable\n */\n scale: function(value) {\n this._set('scaleX', value);\n this._set('scaleY', value);\n return this.setCoords();\n },\n\n /**\n * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New width value\n * @param {Boolean} absolute ignore viewport\n * @return {fabric.Object} thisArg\n * @chainable\n */\n scaleToWidth: function(value, absolute) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n var boundingRectFactor = this.getBoundingRect(absolute).width / this.getScaledWidth();\n return this.scale(value / this.width / boundingRectFactor);\n },\n\n /**\n * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New height value\n * @param {Boolean} absolute ignore viewport\n * @return {fabric.Object} thisArg\n * @chainable\n */\n scaleToHeight: function(value, absolute) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n var boundingRectFactor = this.getBoundingRect(absolute).height / this.getScaledHeight();\n return this.scale(value / this.height / boundingRectFactor);\n },\n\n /**\n * Calculates and returns the .coords of an object.\n * @return {Object} Object with tl, tr, br, bl ....\n * @chainable\n */\n calcCoords: function(absolute) {\n var rotateMatrix = this._calcRotateMatrix(),\n translateMatrix = this._calcTranslateMatrix(),\n startMatrix = multiplyMatrices(translateMatrix, rotateMatrix),\n vpt = this.getViewportTransform(),\n finalMatrix = absolute ? startMatrix : multiplyMatrices(vpt, startMatrix),\n dim = this._getTransformedDimensions(),\n w = dim.x / 2, h = dim.y / 2,\n tl = transformPoint({ x: -w, y: -h }, finalMatrix),\n tr = transformPoint({ x: w, y: -h }, finalMatrix),\n bl = transformPoint({ x: -w, y: h }, finalMatrix),\n br = transformPoint({ x: w, y: h }, finalMatrix);\n if (!absolute) {\n var padding = this.padding, angle = degreesToRadians(this.angle),\n cos = fabric.util.cos(angle), sin = fabric.util.sin(angle),\n cosP = cos * padding, sinP = sin * padding, cosPSinP = cosP + sinP,\n cosPMinusSinP = cosP - sinP;\n if (padding) {\n tl.x -= cosPMinusSinP;\n tl.y -= cosPSinP;\n tr.x += cosPSinP;\n tr.y -= cosPMinusSinP;\n bl.x -= cosPSinP;\n bl.y += cosPMinusSinP;\n br.x += cosPMinusSinP;\n br.y += cosPSinP;\n }\n var ml = new fabric.Point((tl.x + bl.x) / 2, (tl.y + bl.y) / 2),\n mt = new fabric.Point((tr.x + tl.x) / 2, (tr.y + tl.y) / 2),\n mr = new fabric.Point((br.x + tr.x) / 2, (br.y + tr.y) / 2),\n mb = new fabric.Point((br.x + bl.x) / 2, (br.y + bl.y) / 2),\n mtr = new fabric.Point(mt.x + sin * this.rotatingPointOffset, mt.y - cos * this.rotatingPointOffset);\n }\n\n // if (!absolute) {\n // var canvas = this.canvas;\n // setTimeout(function() {\n // canvas.contextTop.clearRect(0, 0, 700, 700);\n // canvas.contextTop.fillStyle = 'green';\n // canvas.contextTop.fillRect(mb.x, mb.y, 3, 3);\n // canvas.contextTop.fillRect(bl.x, bl.y, 3, 3);\n // canvas.contextTop.fillRect(br.x, br.y, 3, 3);\n // canvas.contextTop.fillRect(tl.x, tl.y, 3, 3);\n // canvas.contextTop.fillRect(tr.x, tr.y, 3, 3);\n // canvas.contextTop.fillRect(ml.x, ml.y, 3, 3);\n // canvas.contextTop.fillRect(mr.x, mr.y, 3, 3);\n // canvas.contextTop.fillRect(mt.x, mt.y, 3, 3);\n // canvas.contextTop.fillRect(mtr.x, mtr.y, 3, 3);\n // }, 50);\n // }\n\n var coords = {\n // corners\n tl: tl, tr: tr, br: br, bl: bl,\n };\n if (!absolute) {\n // middle\n coords.ml = ml;\n coords.mt = mt;\n coords.mr = mr;\n coords.mb = mb;\n // rotating point\n coords.mtr = mtr;\n }\n return coords;\n },\n\n /**\n * Sets corner position coordinates based on current angle, width and height.\n * See {@link https://github.com/kangax/fabric.js/wiki/When-to-call-setCoords|When-to-call-setCoords}\n * @param {Boolean} [ignoreZoom] set oCoords with or without the viewport transform.\n * @param {Boolean} [skipAbsolute] skip calculation of aCoords, useful in setViewportTransform\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setCoords: function(ignoreZoom, skipAbsolute) {\n this.oCoords = this.calcCoords(ignoreZoom);\n if (!skipAbsolute) {\n this.aCoords = this.calcCoords(true);\n }\n\n // set coordinates of the draggable boxes in the corners used to scale/rotate the image\n ignoreZoom || (this._setCornerCoords && this._setCornerCoords());\n\n return this;\n },\n\n /**\n * calculate rotation matrix of an object\n * @return {Array} rotation matrix for the object\n */\n _calcRotateMatrix: function() {\n return fabric.util.calcRotateMatrix(this);\n },\n\n /**\n * calculate the translation matrix for an object transform\n * @return {Array} rotation matrix for the object\n */\n _calcTranslateMatrix: function() {\n var center = this.getCenterPoint();\n return [1, 0, 0, 1, center.x, center.y];\n },\n\n transformMatrixKey: function(skipGroup) {\n var sep = '_', prefix = '';\n if (!skipGroup && this.group) {\n prefix = this.group.transformMatrixKey(skipGroup) + sep;\n };\n return prefix + this.top + sep + this.left + sep + this.scaleX + sep + this.scaleY +\n sep + this.skewX + sep + this.skewY + sep + this.angle + sep + this.originX + sep + this.originY +\n sep + this.width + sep + this.height + sep + this.strokeWidth + this.flipX + this.flipY;\n },\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties.\n * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations\n * @return {Array} transform matrix for the object\n */\n calcTransformMatrix: function(skipGroup) {\n if (skipGroup) {\n return this.calcOwnMatrix();\n }\n var key = this.transformMatrixKey(), cache = this.matrixCache || (this.matrixCache = {});\n if (cache.key === key) {\n return cache.value;\n }\n var matrix = this.calcOwnMatrix();\n if (this.group) {\n matrix = multiplyMatrices(this.group.calcTransformMatrix(), matrix);\n }\n cache.key = key;\n cache.value = matrix;\n return matrix;\n },\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties, this matrix does not include the group transformation\n * @return {Array} transform matrix for the object\n */\n calcOwnMatrix: function() {\n var key = this.transformMatrixKey(true), cache = this.ownMatrixCache || (this.ownMatrixCache = {});\n if (cache.key === key) {\n return cache.value;\n }\n var tMatrix = this._calcTranslateMatrix();\n this.translateX = tMatrix[4];\n this.translateY = tMatrix[5];\n cache.key = key;\n cache.value = fabric.util.composeMatrix(this);\n return cache.value;\n },\n\n /*\n * Calculate object dimensions from its properties\n * @private\n * @deprecated since 3.4.0, please use fabric.util._calcDimensionsTransformMatrix\n * not including or including flipX, flipY to emulate the flipping boolean\n * @return {Object} .x width dimension\n * @return {Object} .y height dimension\n */\n _calcDimensionsTransformMatrix: function(skewX, skewY, flipping) {\n return fabric.util.calcDimensionsMatrix({\n skewX: skewX,\n skewY: skewY,\n scaleX: this.scaleX * (flipping && this.flipX ? -1 : 1),\n scaleY: this.scaleY * (flipping && this.flipY ? -1 : 1)\n });\n },\n\n /*\n * Calculate object dimensions from its properties\n * @private\n * @return {Object} .x width dimension\n * @return {Object} .y height dimension\n */\n _getNonTransformedDimensions: function() {\n var strokeWidth = this.strokeWidth,\n w = this.width + strokeWidth,\n h = this.height + strokeWidth;\n return { x: w, y: h };\n },\n\n /*\n * Calculate object bounding box dimensions from its properties scale, skew.\n * The skewX and skewY parameters are used in the skewing logic path and\n * do not provide something useful to common use cases.\n * @param {Number} [skewX], a value to override current skewX\n * @param {Number} [skewY], a value to override current skewY\n * @private\n * @return {Object} .x width dimension\n * @return {Object} .y height dimension\n */\n _getTransformedDimensions: function(skewX, skewY) {\n if (typeof skewX === 'undefined') {\n skewX = this.skewX;\n }\n if (typeof skewY === 'undefined') {\n skewY = this.skewY;\n }\n var dimensions = this._getNonTransformedDimensions(), dimX, dimY,\n noSkew = skewX === 0 && skewY === 0;\n\n if (this.strokeUniform) {\n dimX = this.width;\n dimY = this.height;\n }\n else {\n dimX = dimensions.x;\n dimY = dimensions.y;\n }\n if (noSkew) {\n return this._finalizeDimensions(dimX * this.scaleX, dimY * this.scaleY);\n }\n else {\n dimX /= 2;\n dimY /= 2;\n }\n var points = [\n {\n x: -dimX,\n y: -dimY\n },\n {\n x: dimX,\n y: -dimY\n },\n {\n x: -dimX,\n y: dimY\n },\n {\n x: dimX,\n y: dimY\n }],\n transformMatrix = fabric.util.calcDimensionsMatrix({\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: skewX,\n skewY: skewY,\n }),\n bbox = fabric.util.makeBoundingBoxFromPoints(points, transformMatrix);\n return this._finalizeDimensions(bbox.width, bbox.height);\n },\n\n /*\n * Calculate object bounding box dimensions from its properties scale, skew.\n * @param Number width width of the bbox\n * @param Number height height of the bbox\n * @private\n * @return {Object} .x finalized width dimension\n * @return {Object} .y finalized height dimension\n */\n _finalizeDimensions: function(width, height) {\n return this.strokeUniform ?\n { x: width + this.strokeWidth, y: height + this.strokeWidth }\n :\n { x: width, y: height };\n },\n /*\n * Calculate object dimensions for controls, including padding and canvas zoom.\n * private\n */\n _calculateCurrentDimensions: function() {\n var vpt = this.getViewportTransform(),\n dim = this._getTransformedDimensions(),\n p = fabric.util.transformPoint(dim, vpt, true);\n\n return p.scalarAdd(2 * this.padding);\n },\n });\n})();\n\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Moves an object to the bottom of the stack of drawn objects\n * @return {fabric.Object} thisArg\n * @chainable\n */\n sendToBack: function() {\n if (this.group) {\n fabric.StaticCanvas.prototype.sendToBack.call(this.group, this);\n }\n else if (this.canvas) {\n this.canvas.sendToBack(this);\n }\n return this;\n },\n\n /**\n * Moves an object to the top of the stack of drawn objects\n * @return {fabric.Object} thisArg\n * @chainable\n */\n bringToFront: function() {\n if (this.group) {\n fabric.StaticCanvas.prototype.bringToFront.call(this.group, this);\n }\n else if (this.canvas) {\n this.canvas.bringToFront(this);\n }\n return this;\n },\n\n /**\n * Moves an object down in stack of drawn objects\n * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object\n * @return {fabric.Object} thisArg\n * @chainable\n */\n sendBackwards: function(intersecting) {\n if (this.group) {\n fabric.StaticCanvas.prototype.sendBackwards.call(this.group, this, intersecting);\n }\n else if (this.canvas) {\n this.canvas.sendBackwards(this, intersecting);\n }\n return this;\n },\n\n /**\n * Moves an object up in stack of drawn objects\n * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n * @return {fabric.Object} thisArg\n * @chainable\n */\n bringForward: function(intersecting) {\n if (this.group) {\n fabric.StaticCanvas.prototype.bringForward.call(this.group, this, intersecting);\n }\n else if (this.canvas) {\n this.canvas.bringForward(this, intersecting);\n }\n return this;\n },\n\n /**\n * Moves an object to specified level in stack of drawn objects\n * @param {Number} index New position of object\n * @return {fabric.Object} thisArg\n * @chainable\n */\n moveTo: function(index) {\n if (this.group && this.group.type !== 'activeSelection') {\n fabric.StaticCanvas.prototype.moveTo.call(this.group, this, index);\n }\n else if (this.canvas) {\n this.canvas.moveTo(this, index);\n }\n return this;\n }\n});\n\n\n/* _TO_SVG_START_ */\n(function() {\n function getSvgColorString(prop, value) {\n if (!value) {\n return prop + ': none; ';\n }\n else if (value.toLive) {\n return prop + ': url(#SVGID_' + value.id + '); ';\n }\n else {\n var color = new fabric.Color(value),\n str = prop + ': ' + color.toRgb() + '; ',\n opacity = color.getAlpha();\n if (opacity !== 1) {\n //change the color in rgb + opacity\n str += prop + '-opacity: ' + opacity.toString() + '; ';\n }\n return str;\n }\n }\n\n var toFixed = fabric.util.toFixed;\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles: function(skipShadow) {\n\n var fillRule = this.fillRule ? this.fillRule : 'nonzero',\n strokeWidth = this.strokeWidth ? this.strokeWidth : '0',\n strokeDashArray = this.strokeDashArray ? this.strokeDashArray.join(' ') : 'none',\n strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0',\n strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt',\n strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter',\n strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4',\n opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1',\n visibility = this.visible ? '' : ' visibility: hidden;',\n filter = skipShadow ? '' : this.getSvgFilter(),\n fill = getSvgColorString('fill', this.fill),\n stroke = getSvgColorString('stroke', this.stroke);\n\n return [\n stroke,\n 'stroke-width: ', strokeWidth, '; ',\n 'stroke-dasharray: ', strokeDashArray, '; ',\n 'stroke-linecap: ', strokeLineCap, '; ',\n 'stroke-dashoffset: ', strokeDashOffset, '; ',\n 'stroke-linejoin: ', strokeLineJoin, '; ',\n 'stroke-miterlimit: ', strokeMiterLimit, '; ',\n fill,\n 'fill-rule: ', fillRule, '; ',\n 'opacity: ', opacity, ';',\n filter,\n visibility\n ].join('');\n },\n\n /**\n * Returns styles-string for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style.\n * @return {String}\n */\n getSvgSpanStyles: function(style, useWhiteSpace) {\n var term = '; ';\n var fontFamily = style.fontFamily ?\n 'font-family: ' + (((style.fontFamily.indexOf('\\'') === -1 && style.fontFamily.indexOf('\"') === -1) ?\n '\\'' + style.fontFamily + '\\'' : style.fontFamily)) + term : '';\n var strokeWidth = style.strokeWidth ? 'stroke-width: ' + style.strokeWidth + term : '',\n fontFamily = fontFamily,\n fontSize = style.fontSize ? 'font-size: ' + style.fontSize + 'px' + term : '',\n fontStyle = style.fontStyle ? 'font-style: ' + style.fontStyle + term : '',\n fontWeight = style.fontWeight ? 'font-weight: ' + style.fontWeight + term : '',\n fill = style.fill ? getSvgColorString('fill', style.fill) : '',\n stroke = style.stroke ? getSvgColorString('stroke', style.stroke) : '',\n textDecoration = this.getSvgTextDecoration(style),\n deltaY = style.deltaY ? 'baseline-shift: ' + (-style.deltaY) + '; ' : '';\n if (textDecoration) {\n textDecoration = 'text-decoration: ' + textDecoration + term;\n }\n\n return [\n stroke,\n strokeWidth,\n fontFamily,\n fontSize,\n fontStyle,\n fontWeight,\n textDecoration,\n fill,\n deltaY,\n useWhiteSpace ? 'white-space: pre; ' : ''\n ].join('');\n },\n\n /**\n * Returns text-decoration property for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @return {String}\n */\n getSvgTextDecoration: function(style) {\n return ['overline', 'underline', 'line-through'].filter(function(decoration) {\n return style[decoration.replace('-', '')];\n }).join(' ');\n },\n\n /**\n * Returns filter for svg shadow\n * @return {String}\n */\n getSvgFilter: function() {\n return this.shadow ? 'filter: url(#SVGID_' + this.shadow.id + ');' : '';\n },\n\n /**\n * Returns id attribute for svg output\n * @return {String}\n */\n getSvgCommons: function() {\n return [\n this.id ? 'id=\"' + this.id + '\" ' : '',\n this.clipPath ? 'clip-path=\"url(#' + this.clipPath.clipPathId + ')\" ' : '',\n ].join('');\n },\n\n /**\n * Returns transform-string for svg-export\n * @param {Boolean} use the full transform or the single object one.\n * @return {String}\n */\n getSvgTransform: function(full, additionalTransform) {\n var transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(),\n svgTransform = 'transform=\"' + fabric.util.matrixToSVG(transform);\n return svgTransform +\n (additionalTransform || '') + this.getSvgTransformMatrix() + '\" ';\n },\n\n /**\n * Returns transform-string for svg-export from the transform matrix of single elements\n * @return {String}\n */\n getSvgTransformMatrix: function() {\n return this.transformMatrix ? ' ' + fabric.util.matrixToSVG(this.transformMatrix) : '';\n },\n\n _setSVGBg: function(textBgRects) {\n if (this.backgroundColor) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n textBgRects.push(\n '\\t\\t\\n');\n }\n },\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG: function(reviver) {\n return this._createBaseSVGMarkup(this._toSVG(reviver), { reviver: reviver });\n },\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG: function(reviver) {\n return '\\t' + this._createBaseClipPathSVGMarkup(this._toSVG(reviver), { reviver: reviver });\n },\n\n /**\n * @private\n */\n _createBaseClipPathSVGMarkup: function(objectMarkup, options) {\n options = options || {};\n var reviver = options.reviver,\n additionalTransform = options.additionalTransform || '',\n commonPieces = [\n this.getSvgTransform(true, additionalTransform),\n this.getSvgCommons(),\n ].join(''),\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n objectMarkup[index] = commonPieces;\n return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join('');\n },\n\n /**\n * @private\n */\n _createBaseSVGMarkup: function(objectMarkup, options) {\n options = options || {};\n var noStyle = options.noStyle,\n reviver = options.reviver,\n styleInfo = noStyle ? '' : 'style=\"' + this.getSvgStyles() + '\" ',\n shadowInfo = options.withShadow ? 'style=\"' + this.getSvgFilter() + '\" ' : '',\n clipPath = this.clipPath,\n vectorEffect = this.strokeUniform ? 'vector-effect=\"non-scaling-stroke\" ' : '',\n absoluteClipPath = clipPath && clipPath.absolutePositioned,\n stroke = this.stroke, fill = this.fill, shadow = this.shadow,\n commonPieces, markup = [], clipPathMarkup,\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS'),\n additionalTransform = options.additionalTransform;\n if (clipPath) {\n clipPath.clipPathId = 'CLIPPATH_' + fabric.Object.__uid++;\n clipPathMarkup = '\\n' +\n clipPath.toClipPathSVG(reviver) +\n '\\n';\n }\n if (absoluteClipPath) {\n markup.push(\n '\\n'\n );\n }\n markup.push(\n '\\n'\n );\n commonPieces = [\n styleInfo,\n vectorEffect,\n noStyle ? '' : this.addPaintOrder(), ' ',\n additionalTransform ? 'transform=\"' + additionalTransform + '\" ' : '',\n ].join('');\n objectMarkup[index] = commonPieces;\n if (fill && fill.toLive) {\n markup.push(fill.toSVG(this));\n }\n if (stroke && stroke.toLive) {\n markup.push(stroke.toSVG(this));\n }\n if (shadow) {\n markup.push(shadow.toSVG(this));\n }\n if (clipPath) {\n markup.push(clipPathMarkup);\n }\n markup.push(objectMarkup.join(''));\n markup.push('\\n');\n absoluteClipPath && markup.push('\\n');\n return reviver ? reviver(markup.join('')) : markup.join('');\n },\n\n addPaintOrder: function() {\n return this.paintFirst !== 'fill' ? ' paint-order=\"' + this.paintFirst + '\" ' : '';\n }\n });\n})();\n/* _TO_SVG_END_ */\n\n\n(function() {\n\n var extend = fabric.util.object.extend,\n originalSet = 'stateProperties';\n\n /*\n Depends on `stateProperties`\n */\n function saveProps(origin, destination, props) {\n var tmpObj = { }, deep = true;\n props.forEach(function(prop) {\n tmpObj[prop] = origin[prop];\n });\n extend(origin[destination], tmpObj, deep);\n }\n\n function _isEqual(origValue, currentValue, firstPass) {\n if (origValue === currentValue) {\n // if the objects are identical, return\n return true;\n }\n else if (Array.isArray(origValue)) {\n if (!Array.isArray(currentValue) || origValue.length !== currentValue.length) {\n return false;\n }\n for (var i = 0, len = origValue.length; i < len; i++) {\n if (!_isEqual(origValue[i], currentValue[i])) {\n return false;\n }\n }\n return true;\n }\n else if (origValue && typeof origValue === 'object') {\n var keys = Object.keys(origValue), key;\n if (!currentValue ||\n typeof currentValue !== 'object' ||\n (!firstPass && keys.length !== Object.keys(currentValue).length)\n ) {\n return false;\n }\n for (var i = 0, len = keys.length; i < len; i++) {\n key = keys[i];\n // since clipPath is in the statefull cache list and the clipPath objects\n // would be iterated as an object, this would lead to possible infinite recursion\n if (key === 'canvas') {\n continue;\n }\n if (!_isEqual(origValue[key], currentValue[key])) {\n return false;\n }\n }\n return true;\n }\n }\n\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Returns true if object state (one of its state properties) was changed\n * @param {String} [propertySet] optional name for the set of property we want to save\n * @return {Boolean} true if instance' state has changed since `{@link fabric.Object#saveState}` was called\n */\n hasStateChanged: function(propertySet) {\n propertySet = propertySet || originalSet;\n var dashedPropertySet = '_' + propertySet;\n if (Object.keys(this[dashedPropertySet]).length < this[propertySet].length) {\n return true;\n }\n return !_isEqual(this[dashedPropertySet], this, true);\n },\n\n /**\n * Saves state of an object\n * @param {Object} [options] Object with additional `stateProperties` array to include when saving state\n * @return {fabric.Object} thisArg\n */\n saveState: function(options) {\n var propertySet = options && options.propertySet || originalSet,\n destination = '_' + propertySet;\n if (!this[destination]) {\n return this.setupState(options);\n }\n saveProps(this, destination, this[propertySet]);\n if (options && options.stateProperties) {\n saveProps(this, destination, options.stateProperties);\n }\n return this;\n },\n\n /**\n * Setups state of an object\n * @param {Object} [options] Object with additional `stateProperties` array to include when saving state\n * @return {fabric.Object} thisArg\n */\n setupState: function(options) {\n options = options || { };\n var propertySet = options.propertySet || originalSet;\n options.propertySet = propertySet;\n this['_' + propertySet] = { };\n this.saveState(options);\n return this;\n }\n });\n})();\n\n\n(function() {\n\n var degreesToRadians = fabric.util.degreesToRadians;\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * The object interactivity controls.\n * @private\n */\n _controlsVisibility: null,\n\n /**\n * Determines which corner has been clicked\n * @private\n * @param {Object} pointer The pointer indicating the mouse position\n * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or false if nothing is found\n */\n _findTargetCorner: function(pointer) {\n // objects in group, anykind, are not self modificable,\n // must not return an hovered corner.\n if (!this.hasControls || this.group || (!this.canvas || this.canvas._activeObject !== this)) {\n return false;\n }\n\n var ex = pointer.x,\n ey = pointer.y,\n xPoints,\n lines;\n this.__corner = 0;\n for (var i in this.oCoords) {\n\n if (!this.isControlVisible(i)) {\n continue;\n }\n\n if (i === 'mtr' && !this.hasRotatingPoint) {\n continue;\n }\n\n if (this.get('lockUniScaling') &&\n (i === 'mt' || i === 'mr' || i === 'mb' || i === 'ml')) {\n continue;\n }\n\n lines = this._getImageLines(this.oCoords[i].corner);\n\n // debugging\n\n // canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2);\n // canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2);\n\n // canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2);\n // canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2);\n\n // canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2);\n // canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2);\n\n // canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2);\n // canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2);\n\n xPoints = this._findCrossPoints({ x: ex, y: ey }, lines);\n if (xPoints !== 0 && xPoints % 2 === 1) {\n this.__corner = i;\n return i;\n }\n }\n return false;\n },\n\n /**\n * Sets the coordinates of the draggable boxes in the corners of\n * the image used to scale/rotate it.\n * @private\n */\n _setCornerCoords: function() {\n var coords = this.oCoords,\n newTheta = degreesToRadians(45 - this.angle),\n /* Math.sqrt(2 * Math.pow(this.cornerSize, 2)) / 2, */\n /* 0.707106 stands for sqrt(2)/2 */\n cornerHypotenuse = this.cornerSize * 0.707106,\n cosHalfOffset = cornerHypotenuse * fabric.util.cos(newTheta),\n sinHalfOffset = cornerHypotenuse * fabric.util.sin(newTheta),\n x, y;\n\n for (var point in coords) {\n x = coords[point].x;\n y = coords[point].y;\n coords[point].corner = {\n tl: {\n x: x - sinHalfOffset,\n y: y - cosHalfOffset\n },\n tr: {\n x: x + cosHalfOffset,\n y: y - sinHalfOffset\n },\n bl: {\n x: x - cosHalfOffset,\n y: y + sinHalfOffset\n },\n br: {\n x: x + sinHalfOffset,\n y: y + cosHalfOffset\n }\n };\n }\n },\n\n /**\n * Draws a colored layer behind the object, inside its selection borders.\n * Requires public options: padding, selectionBackgroundColor\n * this function is called when the context is transformed\n * has checks to be skipped when the object is on a staticCanvas\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawSelectionBackground: function(ctx) {\n if (!this.selectionBackgroundColor ||\n (this.canvas && !this.canvas.interactive) ||\n (this.canvas && this.canvas._activeObject !== this)\n ) {\n return this;\n }\n ctx.save();\n var center = this.getCenterPoint(), wh = this._calculateCurrentDimensions(),\n vpt = this.canvas.viewportTransform;\n ctx.translate(center.x, center.y);\n ctx.scale(1 / vpt[0], 1 / vpt[3]);\n ctx.rotate(degreesToRadians(this.angle));\n ctx.fillStyle = this.selectionBackgroundColor;\n ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y);\n ctx.restore();\n return this;\n },\n\n /**\n * Draws borders of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Object} styleOverride object to override the object style\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawBorders: function(ctx, styleOverride) {\n styleOverride = styleOverride || {};\n var wh = this._calculateCurrentDimensions(),\n strokeWidth = this.borderScaleFactor,\n width = wh.x + strokeWidth,\n height = wh.y + strokeWidth,\n drawRotatingPoint = typeof styleOverride.hasRotatingPoint !== 'undefined' ?\n styleOverride.hasRotatingPoint : this.hasRotatingPoint,\n hasControls = typeof styleOverride.hasControls !== 'undefined' ?\n styleOverride.hasControls : this.hasControls,\n rotatingPointOffset = typeof styleOverride.rotatingPointOffset !== 'undefined' ?\n styleOverride.rotatingPointOffset : this.rotatingPointOffset;\n\n ctx.save();\n ctx.strokeStyle = styleOverride.borderColor || this.borderColor;\n this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray, null);\n\n ctx.strokeRect(\n -width / 2,\n -height / 2,\n width,\n height\n );\n\n if (drawRotatingPoint && this.isControlVisible('mtr') && hasControls) {\n\n var rotateHeight = -height / 2;\n\n ctx.beginPath();\n ctx.moveTo(0, rotateHeight);\n ctx.lineTo(0, rotateHeight - rotatingPointOffset);\n ctx.stroke();\n }\n\n ctx.restore();\n return this;\n },\n\n /**\n * Draws borders of an object's bounding box when it is inside a group.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {object} options object representing current object parameters\n * @param {Object} styleOverride object to override the object style\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawBordersInGroup: function(ctx, options, styleOverride) {\n styleOverride = styleOverride || {};\n var p = { x: this.width, y: this.height },\n matrix = fabric.util.composeMatrix({\n scaleX: options.scaleX,\n scaleY: options.scaleY,\n skewX: options.skewX\n }),\n wh = fabric.util.transformPoint(p, matrix),\n strokeWidth = this.strokeWidth,\n borderScaleFactor = this.borderScaleFactor,\n width =\n wh.x + strokeWidth * (this.strokeUniform ? this.canvas.getZoom() : options.scaleX) + borderScaleFactor,\n height =\n wh.y + strokeWidth * (this.strokeUniform ? this.canvas.getZoom() : options.scaleY) + borderScaleFactor;\n ctx.save();\n this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray, null);\n ctx.strokeStyle = styleOverride.borderColor || this.borderColor;\n\n ctx.strokeRect(\n -width / 2,\n -height / 2,\n width,\n height\n );\n\n ctx.restore();\n return this;\n },\n\n /**\n * Draws corners of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: cornerSize, padding\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Object} styleOverride object to override the object style\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawControls: function(ctx, styleOverride) {\n styleOverride = styleOverride || {};\n var wh = this._calculateCurrentDimensions(),\n width = wh.x,\n height = wh.y,\n scaleOffset = styleOverride.cornerSize || this.cornerSize,\n left = -(width + scaleOffset) / 2,\n top = -(height + scaleOffset) / 2,\n transparentCorners = typeof styleOverride.transparentCorners !== 'undefined' ?\n styleOverride.transparentCorners : this.transparentCorners,\n hasRotatingPoint = typeof styleOverride.hasRotatingPoint !== 'undefined' ?\n styleOverride.hasRotatingPoint : this.hasRotatingPoint,\n methodName = transparentCorners ? 'stroke' : 'fill';\n\n ctx.save();\n ctx.strokeStyle = ctx.fillStyle = styleOverride.cornerColor || this.cornerColor;\n if (!this.transparentCorners) {\n ctx.strokeStyle = styleOverride.cornerStrokeColor || this.cornerStrokeColor;\n }\n this._setLineDash(ctx, styleOverride.cornerDashArray || this.cornerDashArray, null);\n\n // top-left\n this._drawControl('tl', ctx, methodName,\n left,\n top, styleOverride);\n\n // top-right\n this._drawControl('tr', ctx, methodName,\n left + width,\n top, styleOverride);\n\n // bottom-left\n this._drawControl('bl', ctx, methodName,\n left,\n top + height, styleOverride);\n\n // bottom-right\n this._drawControl('br', ctx, methodName,\n left + width,\n top + height, styleOverride);\n\n if (!this.get('lockUniScaling')) {\n\n // middle-top\n this._drawControl('mt', ctx, methodName,\n left + width / 2,\n top, styleOverride);\n\n // middle-bottom\n this._drawControl('mb', ctx, methodName,\n left + width / 2,\n top + height, styleOverride);\n\n // middle-right\n this._drawControl('mr', ctx, methodName,\n left + width,\n top + height / 2, styleOverride);\n\n // middle-left\n this._drawControl('ml', ctx, methodName,\n left,\n top + height / 2, styleOverride);\n }\n\n // middle-top-rotate\n if (hasRotatingPoint) {\n this._drawControl('mtr', ctx, methodName,\n left + width / 2,\n top - this.rotatingPointOffset, styleOverride);\n }\n\n ctx.restore();\n\n return this;\n },\n\n /**\n * @private\n */\n _drawControl: function(control, ctx, methodName, left, top, styleOverride) {\n styleOverride = styleOverride || {};\n if (!this.isControlVisible(control)) {\n return;\n }\n var size = this.cornerSize, stroke = !this.transparentCorners && this.cornerStrokeColor;\n switch (styleOverride.cornerStyle || this.cornerStyle) {\n case 'circle':\n ctx.beginPath();\n ctx.arc(left + size / 2, top + size / 2, size / 2, 0, 2 * Math.PI, false);\n ctx[methodName]();\n if (stroke) {\n ctx.stroke();\n }\n break;\n default:\n this.transparentCorners || ctx.clearRect(left, top, size, size);\n ctx[methodName + 'Rect'](left, top, size, size);\n if (stroke) {\n ctx.strokeRect(left, top, size, size);\n }\n }\n },\n\n /**\n * Returns true if the specified control is visible, false otherwise.\n * @param {String} controlName The name of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * @returns {Boolean} true if the specified control is visible, false otherwise\n */\n isControlVisible: function(controlName) {\n return this._getControlsVisibility()[controlName];\n },\n\n /**\n * Sets the visibility of the specified control.\n * @param {String} controlName The name of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * @param {Boolean} visible true to set the specified control visible, false otherwise\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setControlVisible: function(controlName, visible) {\n this._getControlsVisibility()[controlName] = visible;\n return this;\n },\n\n /**\n * Sets the visibility state of object controls.\n * @param {Object} [options] Options object\n * @param {Boolean} [options.bl] true to enable the bottom-left control, false to disable it\n * @param {Boolean} [options.br] true to enable the bottom-right control, false to disable it\n * @param {Boolean} [options.mb] true to enable the middle-bottom control, false to disable it\n * @param {Boolean} [options.ml] true to enable the middle-left control, false to disable it\n * @param {Boolean} [options.mr] true to enable the middle-right control, false to disable it\n * @param {Boolean} [options.mt] true to enable the middle-top control, false to disable it\n * @param {Boolean} [options.tl] true to enable the top-left control, false to disable it\n * @param {Boolean} [options.tr] true to enable the top-right control, false to disable it\n * @param {Boolean} [options.mtr] true to enable the middle-top-rotate control, false to disable it\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setControlsVisibility: function(options) {\n options || (options = { });\n\n for (var p in options) {\n this.setControlVisible(p, options[p]);\n }\n return this;\n },\n\n /**\n * Returns the instance of the control visibility set for this object.\n * @private\n * @returns {Object}\n */\n _getControlsVisibility: function() {\n if (!this._controlsVisibility) {\n this._controlsVisibility = {\n tl: true,\n tr: true,\n br: true,\n bl: true,\n ml: true,\n mt: true,\n mr: true,\n mb: true,\n mtr: true\n };\n }\n return this._controlsVisibility;\n },\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to deselect this object. If the function returns true, the process is cancelled\n * @param {Object} [options] options sent from the upper functions\n * @param {Event} [options.e] event if the process is generated by an event\n */\n onDeselect: function() {\n // implemented by sub-classes, as needed.\n },\n\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to select this object. If the function returns true, the process is cancelled\n * @param {Object} [options] options sent from the upper functions\n * @param {Event} [options.e] event if the process is generated by an event\n */\n onSelect: function() {\n // implemented by sub-classes, as needed.\n }\n });\n})();\n\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Animation duration (in ms) for fx* methods\n * @type Number\n * @default\n */\n FX_DURATION: 500,\n\n /**\n * Centers object horizontally with animation.\n * @param {fabric.Object} object Object to center\n * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n fxCenterObjectH: function (object, callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n fabric.util.animate({\n startValue: object.left,\n endValue: this.getCenter().left,\n duration: this.FX_DURATION,\n onChange: function(value) {\n object.set('left', value);\n _this.requestRenderAll();\n onChange();\n },\n onComplete: function() {\n object.setCoords();\n onComplete();\n }\n });\n\n return this;\n },\n\n /**\n * Centers object vertically with animation.\n * @param {fabric.Object} object Object to center\n * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n fxCenterObjectV: function (object, callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n fabric.util.animate({\n startValue: object.top,\n endValue: this.getCenter().top,\n duration: this.FX_DURATION,\n onChange: function(value) {\n object.set('top', value);\n _this.requestRenderAll();\n onChange();\n },\n onComplete: function() {\n object.setCoords();\n onComplete();\n }\n });\n\n return this;\n },\n\n /**\n * Same as `fabric.Canvas#remove` but animated\n * @param {fabric.Object} object Object to remove\n * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n fxRemove: function (object, callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n fabric.util.animate({\n startValue: object.opacity,\n endValue: 0,\n duration: this.FX_DURATION,\n onChange: function(value) {\n object.set('opacity', value);\n _this.requestRenderAll();\n onChange();\n },\n onComplete: function () {\n _this.remove(object);\n onComplete();\n }\n });\n\n return this;\n }\n});\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n /**\n * Animates object's properties\n * @param {String|Object} property Property to animate (if string) or properties to animate (if object)\n * @param {Number|Object} value Value to animate property to (if string was given first) or options object\n * @return {fabric.Object} thisArg\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#animation}\n * @chainable\n *\n * As object — multiple properties\n *\n * object.animate({ left: ..., top: ... });\n * object.animate({ left: ..., top: ... }, { duration: ... });\n *\n * As string — one property\n *\n * object.animate('left', ...);\n * object.animate('left', { duration: ... });\n *\n */\n animate: function() {\n if (arguments[0] && typeof arguments[0] === 'object') {\n var propsToAnimate = [], prop, skipCallbacks;\n for (prop in arguments[0]) {\n propsToAnimate.push(prop);\n }\n for (var i = 0, len = propsToAnimate.length; i < len; i++) {\n prop = propsToAnimate[i];\n skipCallbacks = i !== len - 1;\n this._animate(prop, arguments[0][prop], arguments[1], skipCallbacks);\n }\n }\n else {\n this._animate.apply(this, arguments);\n }\n return this;\n },\n\n /**\n * @private\n * @param {String} property Property to animate\n * @param {String} to Value to animate to\n * @param {Object} [options] Options object\n * @param {Boolean} [skipCallbacks] When true, callbacks like onchange and oncomplete are not invoked\n */\n _animate: function(property, to, options, skipCallbacks) {\n var _this = this, propPair;\n\n to = to.toString();\n\n if (!options) {\n options = { };\n }\n else {\n options = fabric.util.object.clone(options);\n }\n\n if (~property.indexOf('.')) {\n propPair = property.split('.');\n }\n\n var currentValue = propPair\n ? this.get(propPair[0])[propPair[1]]\n : this.get(property);\n\n if (!('from' in options)) {\n options.from = currentValue;\n }\n\n if (~to.indexOf('=')) {\n to = currentValue + parseFloat(to.replace('=', ''));\n }\n else {\n to = parseFloat(to);\n }\n\n fabric.util.animate({\n startValue: options.from,\n endValue: to,\n byValue: options.by,\n easing: options.easing,\n duration: options.duration,\n abort: options.abort && function() {\n return options.abort.call(_this);\n },\n onChange: function(value, valueProgress, timeProgress) {\n if (propPair) {\n _this[propPair[0]][propPair[1]] = value;\n }\n else {\n _this.set(property, value);\n }\n if (skipCallbacks) {\n return;\n }\n options.onChange && options.onChange(value, valueProgress, timeProgress);\n },\n onComplete: function(value, valueProgress, timeProgress) {\n if (skipCallbacks) {\n return;\n }\n\n _this.setCoords();\n options.onComplete && options.onComplete(value, valueProgress, timeProgress);\n }\n });\n }\n});\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n clone = fabric.util.object.clone,\n coordProps = { x1: 1, x2: 1, y1: 1, y2: 1 },\n supportsLineDash = fabric.StaticCanvas.supports('setLineDash');\n\n if (fabric.Line) {\n fabric.warn('fabric.Line is already defined');\n return;\n }\n\n /**\n * Line class\n * @class fabric.Line\n * @extends fabric.Object\n * @see {@link fabric.Line#initialize} for constructor definition\n */\n fabric.Line = fabric.util.createClass(fabric.Object, /** @lends fabric.Line.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'line',\n\n /**\n * x value or first line edge\n * @type Number\n * @default\n */\n x1: 0,\n\n /**\n * y value or first line edge\n * @type Number\n * @default\n */\n y1: 0,\n\n /**\n * x value or second line edge\n * @type Number\n * @default\n */\n x2: 0,\n\n /**\n * y value or second line edge\n * @type Number\n * @default\n */\n y2: 0,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('x1', 'x2', 'y1', 'y2'),\n\n /**\n * Constructor\n * @param {Array} [points] Array of points\n * @param {Object} [options] Options object\n * @return {fabric.Line} thisArg\n */\n initialize: function(points, options) {\n if (!points) {\n points = [0, 0, 0, 0];\n }\n\n this.callSuper('initialize', options);\n\n this.set('x1', points[0]);\n this.set('y1', points[1]);\n this.set('x2', points[2]);\n this.set('y2', points[3]);\n\n this._setWidthHeight(options);\n },\n\n /**\n * @private\n * @param {Object} [options] Options\n */\n _setWidthHeight: function(options) {\n options || (options = { });\n\n this.width = Math.abs(this.x2 - this.x1);\n this.height = Math.abs(this.y2 - this.y1);\n\n this.left = 'left' in options\n ? options.left\n : this._getLeftToOriginX();\n\n this.top = 'top' in options\n ? options.top\n : this._getTopToOriginY();\n },\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set: function(key, value) {\n this.callSuper('_set', key, value);\n if (typeof coordProps[key] !== 'undefined') {\n this._setWidthHeight();\n }\n return this;\n },\n\n /**\n * @private\n * @return {Number} leftToOriginX Distance from left edge of canvas to originX of Line.\n */\n _getLeftToOriginX: makeEdgeToOriginGetter(\n { // property names\n origin: 'originX',\n axis1: 'x1',\n axis2: 'x2',\n dimension: 'width'\n },\n { // possible values of origin\n nearest: 'left',\n center: 'center',\n farthest: 'right'\n }\n ),\n\n /**\n * @private\n * @return {Number} topToOriginY Distance from top edge of canvas to originY of Line.\n */\n _getTopToOriginY: makeEdgeToOriginGetter(\n { // property names\n origin: 'originY',\n axis1: 'y1',\n axis2: 'y2',\n dimension: 'height'\n },\n { // possible values of origin\n nearest: 'top',\n center: 'center',\n farthest: 'bottom'\n }\n ),\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n ctx.beginPath();\n\n if (!this.strokeDashArray || this.strokeDashArray && supportsLineDash) {\n // move from center (of virtual box) to its left/top corner\n // we can't assume x1, y1 is top left and x2, y2 is bottom right\n var p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n }\n\n ctx.lineWidth = this.strokeWidth;\n\n // TODO: test this\n // make sure setting \"fill\" changes color of a line\n // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n var origStrokeStyle = ctx.strokeStyle;\n ctx.strokeStyle = this.stroke || ctx.fillStyle;\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderDashedStroke: function(ctx) {\n var p = this.calcLinePoints();\n\n ctx.beginPath();\n fabric.util.drawDashedLine(ctx, p.x1, p.y1, p.x2, p.y2, this.strokeDashArray);\n ctx.closePath();\n },\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Object} center point from element coordinates\n */\n _findCenterFromElement: function() {\n return {\n x: (this.x1 + this.x2) / 2,\n y: (this.y1 + this.y2) / 2,\n };\n },\n\n /**\n * Returns object representation of an instance\n * @methd toObject\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return extend(this.callSuper('toObject', propertiesToInclude), this.calcLinePoints());\n },\n\n /*\n * Calculate object dimensions from its properties\n * @private\n */\n _getNonTransformedDimensions: function() {\n var dim = this.callSuper('_getNonTransformedDimensions');\n if (this.strokeLineCap === 'butt') {\n if (this.width === 0) {\n dim.y -= this.strokeWidth;\n }\n if (this.height === 0) {\n dim.x -= this.strokeWidth;\n }\n }\n return dim;\n },\n\n /**\n * Recalculates line points given width and height\n * @private\n */\n calcLinePoints: function() {\n var xMult = this.x1 <= this.x2 ? -1 : 1,\n yMult = this.y1 <= this.y2 ? -1 : 1,\n x1 = (xMult * this.width * 0.5),\n y1 = (yMult * this.height * 0.5),\n x2 = (xMult * this.width * -0.5),\n y2 = (yMult * this.height * -0.5);\n\n return {\n x1: x1,\n x2: x2,\n y1: y1,\n y2: y2\n };\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var p = this.calcLinePoints();\n return [\n '\\n'\n ];\n },\n /* _TO_SVG_END_ */\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Line.fromElement})\n * @static\n * @memberOf fabric.Line\n * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n */\n fabric.Line.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x1 y1 x2 y2'.split(' '));\n\n /**\n * Returns fabric.Line instance from an SVG element\n * @static\n * @memberOf fabric.Line\n * @param {SVGElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} [callback] callback function invoked after parsing\n */\n fabric.Line.fromElement = function(element, callback, options) {\n options = options || { };\n var parsedAttributes = fabric.parseAttributes(element, fabric.Line.ATTRIBUTE_NAMES),\n points = [\n parsedAttributes.x1 || 0,\n parsedAttributes.y1 || 0,\n parsedAttributes.x2 || 0,\n parsedAttributes.y2 || 0\n ];\n callback(new fabric.Line(points, extend(parsedAttributes, options)));\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Line instance from an object representation\n * @static\n * @memberOf fabric.Line\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n */\n fabric.Line.fromObject = function(object, callback) {\n function _callback(instance) {\n delete instance.points;\n callback && callback(instance);\n };\n var options = clone(object, true);\n options.points = [object.x1, object.y1, object.x2, object.y2];\n fabric.Object._fromObject('Line', options, _callback, 'points');\n };\n\n /**\n * Produces a function that calculates distance from canvas edge to Line origin.\n */\n function makeEdgeToOriginGetter(propertyNames, originValues) {\n var origin = propertyNames.origin,\n axis1 = propertyNames.axis1,\n axis2 = propertyNames.axis2,\n dimension = propertyNames.dimension,\n nearest = originValues.nearest,\n center = originValues.center,\n farthest = originValues.farthest;\n\n return function() {\n switch (this.get(origin)) {\n case nearest:\n return Math.min(this.get(axis1), this.get(axis2));\n case center:\n return Math.min(this.get(axis1), this.get(axis2)) + (0.5 * this.get(dimension));\n case farthest:\n return Math.max(this.get(axis1), this.get(axis2));\n }\n };\n\n }\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n pi = Math.PI;\n\n if (fabric.Circle) {\n fabric.warn('fabric.Circle is already defined.');\n return;\n }\n\n /**\n * Circle class\n * @class fabric.Circle\n * @extends fabric.Object\n * @see {@link fabric.Circle#initialize} for constructor definition\n */\n fabric.Circle = fabric.util.createClass(fabric.Object, /** @lends fabric.Circle.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'circle',\n\n /**\n * Radius of this circle\n * @type Number\n * @default\n */\n radius: 0,\n\n /**\n * Start angle of the circle, moving clockwise\n * deprectated type, this should be in degree, this was an oversight.\n * probably will change to degrees in next major version\n * @type Number\n * @default 0\n */\n startAngle: 0,\n\n /**\n * End angle of the circle\n * deprectated type, this should be in degree, this was an oversight.\n * probably will change to degrees in next major version\n * @type Number\n * @default 2Pi\n */\n endAngle: pi * 2,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('radius', 'startAngle', 'endAngle'),\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {fabric.Circle} thisArg\n */\n _set: function(key, value) {\n this.callSuper('_set', key, value);\n\n if (key === 'radius') {\n this.setRadius(value);\n }\n\n return this;\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['radius', 'startAngle', 'endAngle'].concat(propertiesToInclude));\n },\n\n /* _TO_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var svgString, x = 0, y = 0,\n angle = (this.endAngle - this.startAngle) % ( 2 * pi);\n\n if (angle === 0) {\n svgString = [\n '\\n'\n ];\n }\n else {\n var startX = fabric.util.cos(this.startAngle) * this.radius,\n startY = fabric.util.sin(this.startAngle) * this.radius,\n endX = fabric.util.cos(this.endAngle) * this.radius,\n endY = fabric.util.sin(this.endAngle) * this.radius,\n largeFlag = angle > pi ? '1' : '0';\n svgString = [\n '\\n'\n ];\n }\n return svgString;\n },\n /* _TO_SVG_END_ */\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render: function(ctx) {\n ctx.beginPath();\n ctx.arc(\n 0,\n 0,\n this.radius,\n this.startAngle,\n this.endAngle, false);\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusX: function() {\n return this.get('radius') * this.get('scaleX');\n },\n\n /**\n * Returns vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusY: function() {\n return this.get('radius') * this.get('scaleY');\n },\n\n /**\n * Sets radius of an object (and updates width accordingly)\n * @return {fabric.Circle} thisArg\n */\n setRadius: function(value) {\n this.radius = value;\n return this.set('width', value * 2).set('height', value * 2);\n },\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Circle.fromElement})\n * @static\n * @memberOf fabric.Circle\n * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement\n */\n fabric.Circle.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy r'.split(' '));\n\n /**\n * Returns {@link fabric.Circle} instance from an SVG element\n * @static\n * @memberOf fabric.Circle\n * @param {SVGElement} element Element to parse\n * @param {Function} [callback] Options callback invoked after parsing is finished\n * @param {Object} [options] Options object\n * @throws {Error} If value of `r` attribute is missing or invalid\n */\n fabric.Circle.fromElement = function(element, callback) {\n var parsedAttributes = fabric.parseAttributes(element, fabric.Circle.ATTRIBUTE_NAMES);\n\n if (!isValidRadius(parsedAttributes)) {\n throw new Error('value of `r` attribute is required and can not be negative');\n }\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.radius;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.radius;\n callback(new fabric.Circle(parsedAttributes));\n };\n\n /**\n * @private\n */\n function isValidRadius(attributes) {\n return (('radius' in attributes) && (attributes.radius >= 0));\n }\n /* _FROM_SVG_END_ */\n\n /**\n * Returns {@link fabric.Circle} instance from an object representation\n * @static\n * @memberOf fabric.Circle\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n * @return {Object} Instance of fabric.Circle\n */\n fabric.Circle.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Circle', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.Triangle) {\n fabric.warn('fabric.Triangle is already defined');\n return;\n }\n\n /**\n * Triangle class\n * @class fabric.Triangle\n * @extends fabric.Object\n * @return {fabric.Triangle} thisArg\n * @see {@link fabric.Triangle#initialize} for constructor definition\n */\n fabric.Triangle = fabric.util.createClass(fabric.Object, /** @lends fabric.Triangle.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'triangle',\n\n /**\n * Width is set to 100 to compensate the old initialize code that was setting it to 100\n * @type Number\n * @default\n */\n width: 100,\n\n /**\n * Height is set to 100 to compensate the old initialize code that was setting it to 100\n * @type Number\n * @default\n */\n height: 100,\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n var widthBy2 = this.width / 2,\n heightBy2 = this.height / 2;\n\n ctx.beginPath();\n ctx.moveTo(-widthBy2, heightBy2);\n ctx.lineTo(0, -heightBy2);\n ctx.lineTo(widthBy2, heightBy2);\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderDashedStroke: function(ctx) {\n var widthBy2 = this.width / 2,\n heightBy2 = this.height / 2;\n\n ctx.beginPath();\n fabric.util.drawDashedLine(ctx, -widthBy2, heightBy2, 0, -heightBy2, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, 0, -heightBy2, widthBy2, heightBy2, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, widthBy2, heightBy2, -widthBy2, heightBy2, this.strokeDashArray);\n ctx.closePath();\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var widthBy2 = this.width / 2,\n heightBy2 = this.height / 2,\n points = [\n -widthBy2 + ' ' + heightBy2,\n '0 ' + -heightBy2,\n widthBy2 + ' ' + heightBy2\n ].join(',');\n return [\n ''\n ];\n },\n /* _TO_SVG_END_ */\n });\n\n /**\n * Returns {@link fabric.Triangle} instance from an object representation\n * @static\n * @memberOf fabric.Triangle\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n */\n fabric.Triangle.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Triangle', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n piBy2 = Math.PI * 2;\n\n if (fabric.Ellipse) {\n fabric.warn('fabric.Ellipse is already defined.');\n return;\n }\n\n /**\n * Ellipse class\n * @class fabric.Ellipse\n * @extends fabric.Object\n * @return {fabric.Ellipse} thisArg\n * @see {@link fabric.Ellipse#initialize} for constructor definition\n */\n fabric.Ellipse = fabric.util.createClass(fabric.Object, /** @lends fabric.Ellipse.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'ellipse',\n\n /**\n * Horizontal radius\n * @type Number\n * @default\n */\n rx: 0,\n\n /**\n * Vertical radius\n * @type Number\n * @default\n */\n ry: 0,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'),\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @return {fabric.Ellipse} thisArg\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n this.set('rx', options && options.rx || 0);\n this.set('ry', options && options.ry || 0);\n },\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {fabric.Ellipse} thisArg\n */\n _set: function(key, value) {\n this.callSuper('_set', key, value);\n switch (key) {\n\n case 'rx':\n this.rx = value;\n this.set('width', value * 2);\n break;\n\n case 'ry':\n this.ry = value;\n this.set('height', value * 2);\n break;\n\n }\n return this;\n },\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRx: function() {\n return this.get('rx') * this.get('scaleX');\n },\n\n /**\n * Returns Vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRy: function() {\n return this.get('ry') * this.get('scaleY');\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude));\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n return [\n '\\n'\n ];\n },\n /* _TO_SVG_END_ */\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render: function(ctx) {\n ctx.beginPath();\n ctx.save();\n ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0);\n ctx.arc(\n 0,\n 0,\n this.rx,\n 0,\n piBy2,\n false);\n ctx.restore();\n this._renderPaintInOrder(ctx);\n },\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Ellipse.fromElement})\n * @static\n * @memberOf fabric.Ellipse\n * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement\n */\n fabric.Ellipse.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy rx ry'.split(' '));\n\n /**\n * Returns {@link fabric.Ellipse} instance from an SVG element\n * @static\n * @memberOf fabric.Ellipse\n * @param {SVGElement} element Element to parse\n * @param {Function} [callback] Options callback invoked after parsing is finished\n * @return {fabric.Ellipse}\n */\n fabric.Ellipse.fromElement = function(element, callback) {\n\n var parsedAttributes = fabric.parseAttributes(element, fabric.Ellipse.ATTRIBUTE_NAMES);\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry;\n callback(new fabric.Ellipse(parsedAttributes));\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns {@link fabric.Ellipse} instance from an object representation\n * @static\n * @memberOf fabric.Ellipse\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n * @return {fabric.Ellipse}\n */\n fabric.Ellipse.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Ellipse', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend;\n\n if (fabric.Rect) {\n fabric.warn('fabric.Rect is already defined');\n return;\n }\n\n /**\n * Rectangle class\n * @class fabric.Rect\n * @extends fabric.Object\n * @return {fabric.Rect} thisArg\n * @see {@link fabric.Rect#initialize} for constructor definition\n */\n fabric.Rect = fabric.util.createClass(fabric.Object, /** @lends fabric.Rect.prototype */ {\n\n /**\n * List of properties to consider when checking if state of an object is changed ({@link fabric.Object#hasStateChanged})\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: fabric.Object.prototype.stateProperties.concat('rx', 'ry'),\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'rect',\n\n /**\n * Horizontal border radius\n * @type Number\n * @default\n */\n rx: 0,\n\n /**\n * Vertical border radius\n * @type Number\n * @default\n */\n ry: 0,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'),\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n this._initRxRy();\n },\n\n /**\n * Initializes rx/ry attributes\n * @private\n */\n _initRxRy: function() {\n if (this.rx && !this.ry) {\n this.ry = this.rx;\n }\n else if (this.ry && !this.rx) {\n this.rx = this.ry;\n }\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n\n // 1x1 case (used in spray brush) optimization was removed because\n // with caching and higher zoom level this makes more damage than help\n\n var rx = this.rx ? Math.min(this.rx, this.width / 2) : 0,\n ry = this.ry ? Math.min(this.ry, this.height / 2) : 0,\n w = this.width,\n h = this.height,\n x = -this.width / 2,\n y = -this.height / 2,\n isRounded = rx !== 0 || ry !== 0,\n /* \"magic number\" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */\n k = 1 - 0.5522847498;\n ctx.beginPath();\n\n ctx.moveTo(x + rx, y);\n\n ctx.lineTo(x + w - rx, y);\n isRounded && ctx.bezierCurveTo(x + w - k * rx, y, x + w, y + k * ry, x + w, y + ry);\n\n ctx.lineTo(x + w, y + h - ry);\n isRounded && ctx.bezierCurveTo(x + w, y + h - k * ry, x + w - k * rx, y + h, x + w - rx, y + h);\n\n ctx.lineTo(x + rx, y + h);\n isRounded && ctx.bezierCurveTo(x + k * rx, y + h, x, y + h - k * ry, x, y + h - ry);\n\n ctx.lineTo(x, y + ry);\n isRounded && ctx.bezierCurveTo(x, y + k * ry, x + k * rx, y, x + rx, y);\n\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderDashedStroke: function(ctx) {\n var x = -this.width / 2,\n y = -this.height / 2,\n w = this.width,\n h = this.height;\n\n ctx.beginPath();\n fabric.util.drawDashedLine(ctx, x, y, x + w, y, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, x + w, y, x + w, y + h, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, x + w, y + h, x, y + h, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, x, y + h, x, y, this.strokeDashArray);\n ctx.closePath();\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude));\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var x = -this.width / 2, y = -this.height / 2;\n return [\n '\\n'\n ];\n },\n /* _TO_SVG_END_ */\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by `fabric.Rect.fromElement`)\n * @static\n * @memberOf fabric.Rect\n * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement\n */\n fabric.Rect.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x y rx ry width height'.split(' '));\n\n /**\n * Returns {@link fabric.Rect} instance from an SVG element\n * @static\n * @memberOf fabric.Rect\n * @param {SVGElement} element Element to parse\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Rect.fromElement = function(element, callback, options) {\n if (!element) {\n return callback(null);\n }\n options = options || { };\n\n var parsedAttributes = fabric.parseAttributes(element, fabric.Rect.ATTRIBUTE_NAMES);\n\n parsedAttributes.left = parsedAttributes.left || 0;\n parsedAttributes.top = parsedAttributes.top || 0;\n parsedAttributes.height = parsedAttributes.height || 0;\n parsedAttributes.width = parsedAttributes.width || 0;\n var rect = new fabric.Rect(extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes));\n rect.visible = rect.visible && rect.width > 0 && rect.height > 0;\n callback(rect);\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns {@link fabric.Rect} instance from an object representation\n * @static\n * @memberOf fabric.Rect\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Rect instance is created\n */\n fabric.Rect.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Rect', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n min = fabric.util.array.min,\n max = fabric.util.array.max,\n toFixed = fabric.util.toFixed;\n\n if (fabric.Polyline) {\n fabric.warn('fabric.Polyline is already defined');\n return;\n }\n\n /**\n * Polyline class\n * @class fabric.Polyline\n * @extends fabric.Object\n * @see {@link fabric.Polyline#initialize} for constructor definition\n */\n fabric.Polyline = fabric.util.createClass(fabric.Object, /** @lends fabric.Polyline.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'polyline',\n\n /**\n * Points array\n * @type Array\n * @default\n */\n points: null,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('points'),\n\n /**\n * Constructor\n * @param {Array} points Array of points (where each point is an object with x and y)\n * @param {Object} [options] Options object\n * @return {fabric.Polyline} thisArg\n * @example\n * var poly = new fabric.Polyline([\n * { x: 10, y: 10 },\n * { x: 50, y: 30 },\n * { x: 40, y: 70 },\n * { x: 60, y: 50 },\n * { x: 100, y: 150 },\n * { x: 40, y: 100 }\n * ], {\n * stroke: 'red',\n * left: 100,\n * top: 100\n * });\n */\n initialize: function(points, options) {\n options = options || {};\n this.points = points || [];\n this.callSuper('initialize', options);\n this._setPositionDimensions(options);\n },\n\n _setPositionDimensions: function(options) {\n var calcDim = this._calcDimensions(options), correctLeftTop;\n this.width = calcDim.width;\n this.height = calcDim.height;\n if (!options.fromSVG) {\n correctLeftTop = this.translateToGivenOrigin(\n { x: calcDim.left - this.strokeWidth / 2, y: calcDim.top - this.strokeWidth / 2 },\n 'left',\n 'top',\n this.originX,\n this.originY\n );\n }\n if (typeof options.left === 'undefined') {\n this.left = options.fromSVG ? calcDim.left : correctLeftTop.x;\n }\n if (typeof options.top === 'undefined') {\n this.top = options.fromSVG ? calcDim.top : correctLeftTop.y;\n }\n this.pathOffset = {\n x: calcDim.left + this.width / 2,\n y: calcDim.top + this.height / 2\n };\n },\n\n /**\n * Calculate the polygon min and max point from points array,\n * returning an object with left, top, widht, height to measure the\n * polygon size\n * @return {Object} object.left X coordinate of the polygon leftmost point\n * @return {Object} object.top Y coordinate of the polygon topmost point\n * @return {Object} object.width distance between X coordinates of the polygon leftmost and rightmost point\n * @return {Object} object.height distance between Y coordinates of the polygon topmost and bottommost point\n * @private\n */\n _calcDimensions: function() {\n\n var points = this.points,\n minX = min(points, 'x') || 0,\n minY = min(points, 'y') || 0,\n maxX = max(points, 'x') || 0,\n maxY = max(points, 'y') || 0,\n width = (maxX - minX),\n height = (maxY - minY);\n\n return {\n left: minX,\n top: minY,\n width: width,\n height: height\n };\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return extend(this.callSuper('toObject', propertiesToInclude), {\n points: this.points.concat()\n });\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var points = [], diffX = this.pathOffset.x, diffY = this.pathOffset.y,\n NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n\n for (var i = 0, len = this.points.length; i < len; i++) {\n points.push(\n toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS), ',',\n toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS), ' '\n );\n }\n return [\n '<' + this.type + ' ', 'COMMON_PARTS',\n 'points=\"', points.join(''),\n '\" />\\n'\n ];\n },\n /* _TO_SVG_END_ */\n\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n commonRender: function(ctx) {\n var point, len = this.points.length,\n x = this.pathOffset.x,\n y = this.pathOffset.y;\n\n if (!len || isNaN(this.points[len - 1].y)) {\n // do not draw if no points or odd points\n // NaN comes from parseFloat of a empty string in parser\n return false;\n }\n ctx.beginPath();\n ctx.moveTo(this.points[0].x - x, this.points[0].y - y);\n for (var i = 0; i < len; i++) {\n point = this.points[i];\n ctx.lineTo(point.x - x, point.y - y);\n }\n return true;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n if (!this.commonRender(ctx)) {\n return;\n }\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderDashedStroke: function(ctx) {\n var p1, p2;\n\n ctx.beginPath();\n for (var i = 0, len = this.points.length; i < len; i++) {\n p1 = this.points[i];\n p2 = this.points[i + 1] || p1;\n fabric.util.drawDashedLine(ctx, p1.x, p1.y, p2.x, p2.y, this.strokeDashArray);\n }\n },\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance\n */\n complexity: function() {\n return this.get('points').length;\n }\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Polyline.fromElement})\n * @static\n * @memberOf fabric.Polyline\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement\n */\n fabric.Polyline.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat();\n\n /**\n * Returns fabric.Polyline instance from an SVG element\n * @static\n * @memberOf fabric.Polyline\n * @param {SVGElement} element Element to parser\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Polyline.fromElementGenerator = function(_class) {\n return function(element, callback, options) {\n if (!element) {\n return callback(null);\n }\n options || (options = { });\n\n var points = fabric.parsePointsAttribute(element.getAttribute('points')),\n parsedAttributes = fabric.parseAttributes(element, fabric[_class].ATTRIBUTE_NAMES);\n parsedAttributes.fromSVG = true;\n callback(new fabric[_class](points, extend(parsedAttributes, options)));\n };\n };\n\n fabric.Polyline.fromElement = fabric.Polyline.fromElementGenerator('Polyline');\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Polyline instance from an object representation\n * @static\n * @memberOf fabric.Polyline\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n */\n fabric.Polyline.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Polyline', object, callback, 'points');\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.Polygon) {\n fabric.warn('fabric.Polygon is already defined');\n return;\n }\n\n /**\n * Polygon class\n * @class fabric.Polygon\n * @extends fabric.Polyline\n * @see {@link fabric.Polygon#initialize} for constructor definition\n */\n fabric.Polygon = fabric.util.createClass(fabric.Polyline, /** @lends fabric.Polygon.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'polygon',\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n if (!this.commonRender(ctx)) {\n return;\n }\n ctx.closePath();\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderDashedStroke: function(ctx) {\n this.callSuper('_renderDashedStroke', ctx);\n ctx.closePath();\n },\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by `fabric.Polygon.fromElement`)\n * @static\n * @memberOf fabric.Polygon\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolygonElement\n */\n fabric.Polygon.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat();\n\n /**\n * Returns {@link fabric.Polygon} instance from an SVG element\n * @static\n * @memberOf fabric.Polygon\n * @param {SVGElement} element Element to parse\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Polygon.fromElement = fabric.Polyline.fromElementGenerator('Polygon');\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Polygon instance from an object representation\n * @static\n * @memberOf fabric.Polygon\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n */\n fabric.Polygon.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Polygon', object, callback, 'points');\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n min = fabric.util.array.min,\n max = fabric.util.array.max,\n extend = fabric.util.object.extend,\n _toString = Object.prototype.toString,\n drawArc = fabric.util.drawArc,\n toFixed = fabric.util.toFixed,\n commandLengths = {\n m: 2,\n l: 2,\n h: 1,\n v: 1,\n c: 6,\n s: 4,\n q: 4,\n t: 2,\n a: 7\n },\n repeatedCommands = {\n m: 'l',\n M: 'L'\n };\n\n if (fabric.Path) {\n fabric.warn('fabric.Path is already defined');\n return;\n }\n\n /**\n * Path class\n * @class fabric.Path\n * @extends fabric.Object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#path_and_pathgroup}\n * @see {@link fabric.Path#initialize} for constructor definition\n */\n fabric.Path = fabric.util.createClass(fabric.Object, /** @lends fabric.Path.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'path',\n\n /**\n * Array of path points\n * @type Array\n * @default\n */\n path: null,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('path', 'fillRule'),\n\n stateProperties: fabric.Object.prototype.stateProperties.concat('path'),\n\n /**\n * Constructor\n * @param {Array|String} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Object} [options] Options object\n * @return {fabric.Path} thisArg\n */\n initialize: function(path, options) {\n options = options || { };\n this.callSuper('initialize', options);\n\n if (!path) {\n path = [];\n }\n\n var fromArray = _toString.call(path) === '[object Array]';\n\n this.path = fromArray\n ? path\n // one of commands (m,M,l,L,q,Q,c,C,etc.) followed by non-command characters (i.e. command values)\n : path.match && path.match(/[mzlhvcsqta][^mzlhvcsqta]*/gi);\n\n if (!this.path) {\n return;\n }\n\n if (!fromArray) {\n this.path = this._parsePath();\n }\n\n fabric.Polyline.prototype._setPositionDimensions.call(this, options);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _renderPathCommands: function(ctx) {\n var current, // current instruction\n previous = null,\n subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0, // current y\n controlX = 0, // current control point x\n controlY = 0, // current control point y\n tempX,\n tempY,\n l = -this.pathOffset.x,\n t = -this.pathOffset.y;\n\n ctx.beginPath();\n\n for (var i = 0, len = this.path.length; i < len; ++i) {\n\n current = this.path[i];\n\n switch (current[0]) { // first letter\n\n case 'l': // lineto, relative\n x += current[1];\n y += current[2];\n ctx.lineTo(x + l, y + t);\n break;\n\n case 'L': // lineto, absolute\n x = current[1];\n y = current[2];\n ctx.lineTo(x + l, y + t);\n break;\n\n case 'h': // horizontal lineto, relative\n x += current[1];\n ctx.lineTo(x + l, y + t);\n break;\n\n case 'H': // horizontal lineto, absolute\n x = current[1];\n ctx.lineTo(x + l, y + t);\n break;\n\n case 'v': // vertical lineto, relative\n y += current[1];\n ctx.lineTo(x + l, y + t);\n break;\n\n case 'V': // verical lineto, absolute\n y = current[1];\n ctx.lineTo(x + l, y + t);\n break;\n\n case 'm': // moveTo, relative\n x += current[1];\n y += current[2];\n subpathStartX = x;\n subpathStartY = y;\n ctx.moveTo(x + l, y + t);\n break;\n\n case 'M': // moveTo, absolute\n x = current[1];\n y = current[2];\n subpathStartX = x;\n subpathStartY = y;\n ctx.moveTo(x + l, y + t);\n break;\n\n case 'c': // bezierCurveTo, relative\n tempX = x + current[5];\n tempY = y + current[6];\n controlX = x + current[3];\n controlY = y + current[4];\n ctx.bezierCurveTo(\n x + current[1] + l, // x1\n y + current[2] + t, // y1\n controlX + l, // x2\n controlY + t, // y2\n tempX + l,\n tempY + t\n );\n x = tempX;\n y = tempY;\n break;\n\n case 'C': // bezierCurveTo, absolute\n x = current[5];\n y = current[6];\n controlX = current[3];\n controlY = current[4];\n ctx.bezierCurveTo(\n current[1] + l,\n current[2] + t,\n controlX + l,\n controlY + t,\n x + l,\n y + t\n );\n break;\n\n case 's': // shorthand cubic bezierCurveTo, relative\n\n // transform to absolute x,y\n tempX = x + current[3];\n tempY = y + current[4];\n\n if (previous[0].match(/[CcSs]/) === null) {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n\n ctx.bezierCurveTo(\n controlX + l,\n controlY + t,\n x + current[1] + l,\n y + current[2] + t,\n tempX + l,\n tempY + t\n );\n // set control point to 2nd one of this command\n // \"... the first control point is assumed to be\n // the reflection of the second control point on\n // the previous command relative to the current point.\"\n controlX = x + current[1];\n controlY = y + current[2];\n\n x = tempX;\n y = tempY;\n break;\n\n case 'S': // shorthand cubic bezierCurveTo, absolute\n tempX = current[3];\n tempY = current[4];\n if (previous[0].match(/[CcSs]/) === null) {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n ctx.bezierCurveTo(\n controlX + l,\n controlY + t,\n current[1] + l,\n current[2] + t,\n tempX + l,\n tempY + t\n );\n x = tempX;\n y = tempY;\n\n // set control point to 2nd one of this command\n // \"... the first control point is assumed to be\n // the reflection of the second control point on\n // the previous command relative to the current point.\"\n controlX = current[1];\n controlY = current[2];\n\n break;\n\n case 'q': // quadraticCurveTo, relative\n // transform to absolute x,y\n tempX = x + current[3];\n tempY = y + current[4];\n\n controlX = x + current[1];\n controlY = y + current[2];\n\n ctx.quadraticCurveTo(\n controlX + l,\n controlY + t,\n tempX + l,\n tempY + t\n );\n x = tempX;\n y = tempY;\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n tempX = current[3];\n tempY = current[4];\n\n ctx.quadraticCurveTo(\n current[1] + l,\n current[2] + t,\n tempX + l,\n tempY + t\n );\n x = tempX;\n y = tempY;\n controlX = current[1];\n controlY = current[2];\n break;\n\n case 't': // shorthand quadraticCurveTo, relative\n\n // transform to absolute x,y\n tempX = x + current[1];\n tempY = y + current[2];\n\n if (previous[0].match(/[QqTt]/) === null) {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n\n ctx.quadraticCurveTo(\n controlX + l,\n controlY + t,\n tempX + l,\n tempY + t\n );\n x = tempX;\n y = tempY;\n\n break;\n\n case 'T':\n tempX = current[1];\n tempY = current[2];\n\n if (previous[0].match(/[QqTt]/) === null) {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n ctx.quadraticCurveTo(\n controlX + l,\n controlY + t,\n tempX + l,\n tempY + t\n );\n x = tempX;\n y = tempY;\n break;\n\n case 'a':\n // TODO: optimize this\n drawArc(ctx, x + l, y + t, [\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6] + x + l,\n current[7] + y + t\n ]);\n x += current[6];\n y += current[7];\n break;\n\n case 'A':\n // TODO: optimize this\n drawArc(ctx, x + l, y + t, [\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6] + l,\n current[7] + t\n ]);\n x = current[6];\n y = current[7];\n break;\n\n case 'z':\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n ctx.closePath();\n break;\n }\n previous = current;\n }\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _render: function(ctx) {\n this._renderPathCommands(ctx);\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Returns string representation of an instance\n * @return {String} string representation of an instance\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return extend(this.callSuper('toObject', propertiesToInclude), {\n path: this.path.map(function(item) { return item.slice(); }),\n });\n },\n\n /**\n * Returns dataless object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject: function(propertiesToInclude) {\n var o = this.toObject(['sourcePath'].concat(propertiesToInclude));\n if (o.sourcePath) {\n delete o.path;\n }\n return o;\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var path = this.path.map(function(path) {\n return path.join(' ');\n }).join(' ');\n return [\n '\\n'\n ];\n },\n\n _getOffsetTransform: function() {\n var digits = fabric.Object.NUM_FRACTION_DIGITS;\n return ' translate(' + toFixed(-this.pathOffset.x, digits) + ', ' +\n toFixed(-this.pathOffset.y, digits) + ')';\n },\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG: function(reviver) {\n var additionalTransform = this._getOffsetTransform();\n return '\\t' + this._createBaseClipPathSVGMarkup(\n this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform }\n );\n },\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG: function(reviver) {\n var additionalTransform = this._getOffsetTransform();\n return this._createBaseSVGMarkup(this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform });\n },\n /* _TO_SVG_END_ */\n\n /**\n * Returns number representation of an instance complexity\n * @return {Number} complexity of this instance\n */\n complexity: function() {\n return this.path.length;\n },\n\n /**\n * @private\n */\n _parsePath: function() {\n var result = [],\n coords = [],\n currentPath,\n parsed,\n re = fabric.rePathCommand,\n match,\n coordsStr;\n\n for (var i = 0, coordsParsed, len = this.path.length; i < len; i++) {\n currentPath = this.path[i];\n\n coordsStr = currentPath.slice(1).trim();\n coords.length = 0;\n\n while ((match = re.exec(coordsStr))) {\n coords.push(match[0]);\n }\n\n coordsParsed = [currentPath.charAt(0)];\n\n for (var j = 0, jlen = coords.length; j < jlen; j++) {\n parsed = parseFloat(coords[j]);\n if (!isNaN(parsed)) {\n coordsParsed.push(parsed);\n }\n }\n\n var command = coordsParsed[0],\n commandLength = commandLengths[command.toLowerCase()],\n repeatedCommand = repeatedCommands[command] || command;\n\n if (coordsParsed.length - 1 > commandLength) {\n for (var k = 1, klen = coordsParsed.length; k < klen; k += commandLength) {\n result.push([command].concat(coordsParsed.slice(k, k + commandLength)));\n command = repeatedCommand;\n }\n }\n else {\n result.push(coordsParsed);\n }\n }\n\n return result;\n },\n\n /**\n * @private\n */\n _calcDimensions: function() {\n\n var aX = [],\n aY = [],\n current, // current instruction\n previous = null,\n subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0, // current y\n controlX = 0, // current control point x\n controlY = 0, // current control point y\n tempX,\n tempY,\n bounds;\n\n for (var i = 0, len = this.path.length; i < len; ++i) {\n\n current = this.path[i];\n\n switch (current[0]) { // first letter\n\n case 'l': // lineto, relative\n x += current[1];\n y += current[2];\n bounds = [];\n break;\n\n case 'L': // lineto, absolute\n x = current[1];\n y = current[2];\n bounds = [];\n break;\n\n case 'h': // horizontal lineto, relative\n x += current[1];\n bounds = [];\n break;\n\n case 'H': // horizontal lineto, absolute\n x = current[1];\n bounds = [];\n break;\n\n case 'v': // vertical lineto, relative\n y += current[1];\n bounds = [];\n break;\n\n case 'V': // verical lineto, absolute\n y = current[1];\n bounds = [];\n break;\n\n case 'm': // moveTo, relative\n x += current[1];\n y += current[2];\n subpathStartX = x;\n subpathStartY = y;\n bounds = [];\n break;\n\n case 'M': // moveTo, absolute\n x = current[1];\n y = current[2];\n subpathStartX = x;\n subpathStartY = y;\n bounds = [];\n break;\n\n case 'c': // bezierCurveTo, relative\n tempX = x + current[5];\n tempY = y + current[6];\n controlX = x + current[3];\n controlY = y + current[4];\n bounds = fabric.util.getBoundsOfCurve(x, y,\n x + current[1], // x1\n y + current[2], // y1\n controlX, // x2\n controlY, // y2\n tempX,\n tempY\n );\n x = tempX;\n y = tempY;\n break;\n\n case 'C': // bezierCurveTo, absolute\n controlX = current[3];\n controlY = current[4];\n bounds = fabric.util.getBoundsOfCurve(x, y,\n current[1],\n current[2],\n controlX,\n controlY,\n current[5],\n current[6]\n );\n x = current[5];\n y = current[6];\n break;\n\n case 's': // shorthand cubic bezierCurveTo, relative\n\n // transform to absolute x,y\n tempX = x + current[3];\n tempY = y + current[4];\n\n if (previous[0].match(/[CcSs]/) === null) {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n\n bounds = fabric.util.getBoundsOfCurve(x, y,\n controlX,\n controlY,\n x + current[1],\n y + current[2],\n tempX,\n tempY\n );\n // set control point to 2nd one of this command\n // \"... the first control point is assumed to be\n // the reflection of the second control point on\n // the previous command relative to the current point.\"\n controlX = x + current[1];\n controlY = y + current[2];\n x = tempX;\n y = tempY;\n break;\n\n case 'S': // shorthand cubic bezierCurveTo, absolute\n tempX = current[3];\n tempY = current[4];\n if (previous[0].match(/[CcSs]/) === null) {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n bounds = fabric.util.getBoundsOfCurve(x, y,\n controlX,\n controlY,\n current[1],\n current[2],\n tempX,\n tempY\n );\n x = tempX;\n y = tempY;\n // set control point to 2nd one of this command\n // \"... the first control point is assumed to be\n // the reflection of the second control point on\n // the previous command relative to the current point.\"\n controlX = current[1];\n controlY = current[2];\n break;\n\n case 'q': // quadraticCurveTo, relative\n // transform to absolute x,y\n tempX = x + current[3];\n tempY = y + current[4];\n controlX = x + current[1];\n controlY = y + current[2];\n bounds = fabric.util.getBoundsOfCurve(x, y,\n controlX,\n controlY,\n controlX,\n controlY,\n tempX,\n tempY\n );\n x = tempX;\n y = tempY;\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n controlX = current[1];\n controlY = current[2];\n bounds = fabric.util.getBoundsOfCurve(x, y,\n controlX,\n controlY,\n controlX,\n controlY,\n current[3],\n current[4]\n );\n x = current[3];\n y = current[4];\n break;\n\n case 't': // shorthand quadraticCurveTo, relative\n // transform to absolute x,y\n tempX = x + current[1];\n tempY = y + current[2];\n if (previous[0].match(/[QqTt]/) === null) {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n\n bounds = fabric.util.getBoundsOfCurve(x, y,\n controlX,\n controlY,\n controlX,\n controlY,\n tempX,\n tempY\n );\n x = tempX;\n y = tempY;\n\n break;\n\n case 'T':\n tempX = current[1];\n tempY = current[2];\n\n if (previous[0].match(/[QqTt]/) === null) {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n bounds = fabric.util.getBoundsOfCurve(x, y,\n controlX,\n controlY,\n controlX,\n controlY,\n tempX,\n tempY\n );\n x = tempX;\n y = tempY;\n break;\n\n case 'a':\n // TODO: optimize this\n bounds = fabric.util.getBoundsOfArc(x, y,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6] + x,\n current[7] + y\n );\n x += current[6];\n y += current[7];\n break;\n\n case 'A':\n // TODO: optimize this\n bounds = fabric.util.getBoundsOfArc(x, y,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n current[7]\n );\n x = current[6];\n y = current[7];\n break;\n\n case 'z':\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n break;\n }\n previous = current;\n bounds.forEach(function (point) {\n aX.push(point.x);\n aY.push(point.y);\n });\n aX.push(x);\n aY.push(y);\n }\n\n var minX = min(aX) || 0,\n minY = min(aY) || 0,\n maxX = max(aX) || 0,\n maxY = max(aY) || 0,\n deltaX = maxX - minX,\n deltaY = maxY - minY;\n\n return {\n left: minX,\n top: minY,\n width: deltaX,\n height: deltaY\n };\n }\n });\n\n /**\n * Creates an instance of fabric.Path from an object\n * @static\n * @memberOf fabric.Path\n * @param {Object} object\n * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n */\n fabric.Path.fromObject = function(object, callback) {\n if (typeof object.sourcePath === 'string') {\n var pathUrl = object.sourcePath;\n fabric.loadSVGFromURL(pathUrl, function (elements) {\n var path = elements[0];\n path.setOptions(object);\n callback && callback(path);\n });\n }\n else {\n fabric.Object._fromObject('Path', object, callback, 'path');\n }\n };\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by `fabric.Path.fromElement`)\n * @static\n * @memberOf fabric.Path\n * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n */\n fabric.Path.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(['d']);\n\n /**\n * Creates an instance of fabric.Path from an SVG element\n * @static\n * @memberOf fabric.Path\n * @param {SVGElement} element to parse\n * @param {Function} callback Callback to invoke when an fabric.Path instance is created\n * @param {Object} [options] Options object\n * @param {Function} [callback] Options callback invoked after parsing is finished\n */\n fabric.Path.fromElement = function(element, callback, options) {\n var parsedAttributes = fabric.parseAttributes(element, fabric.Path.ATTRIBUTE_NAMES);\n parsedAttributes.fromSVG = true;\n callback(new fabric.Path(parsedAttributes.d, extend(parsedAttributes, options)));\n };\n /* _FROM_SVG_END_ */\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n min = fabric.util.array.min,\n max = fabric.util.array.max;\n\n if (fabric.Group) {\n return;\n }\n\n /**\n * Group class\n * @class fabric.Group\n * @extends fabric.Object\n * @mixes fabric.Collection\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups}\n * @see {@link fabric.Group#initialize} for constructor definition\n */\n fabric.Group = fabric.util.createClass(fabric.Object, fabric.Collection, /** @lends fabric.Group.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'group',\n\n /**\n * Width of stroke\n * @type Number\n * @default\n */\n strokeWidth: 0,\n\n /**\n * Indicates if click, mouseover, mouseout events & hoverCursor should also check for subtargets\n * @type Boolean\n * @default\n */\n subTargetCheck: false,\n\n /**\n * Groups are container, do not render anything on theyr own, ence no cache properties\n * @type Array\n * @default\n */\n cacheProperties: [],\n\n /**\n * setOnGroup is a method used for TextBox that is no more used since 2.0.0 The behavior is still\n * available setting this boolean to true.\n * @type Boolean\n * @since 2.0.0\n * @default\n */\n useSetOnGroup: false,\n\n /**\n * Constructor\n * @param {Object} objects Group objects\n * @param {Object} [options] Options object\n * @param {Boolean} [isAlreadyGrouped] if true, objects have been grouped already.\n * @return {Object} thisArg\n */\n initialize: function(objects, options, isAlreadyGrouped) {\n options = options || {};\n this._objects = [];\n // if objects enclosed in a group have been grouped already,\n // we cannot change properties of objects.\n // Thus we need to set options to group without objects,\n isAlreadyGrouped && this.callSuper('initialize', options);\n this._objects = objects || [];\n for (var i = this._objects.length; i--; ) {\n this._objects[i].group = this;\n }\n\n if (!isAlreadyGrouped) {\n var center = options && options.centerPoint;\n // we want to set origins before calculating the bounding box.\n // so that the topleft can be set with that in mind.\n // if specific top and left are passed, are overwritten later\n // with the callSuper('initialize', options)\n if (options.originX !== undefined) {\n this.originX = options.originX;\n }\n if (options.originY !== undefined) {\n this.originY = options.originY;\n }\n // if coming from svg i do not want to calc bounds.\n // i assume width and height are passed along options\n center || this._calcBounds();\n this._updateObjectsCoords(center);\n delete options.centerPoint;\n this.callSuper('initialize', options);\n }\n else {\n this._updateObjectsACoords();\n }\n\n this.setCoords();\n },\n\n /**\n * @private\n * @param {Boolean} [skipCoordsChange] if true, coordinates of objects enclosed in a group do not change\n */\n _updateObjectsACoords: function() {\n var ignoreZoom = true, skipAbsolute = true;\n for (var i = this._objects.length; i--; ){\n this._objects[i].setCoords(ignoreZoom, skipAbsolute);\n }\n },\n\n /**\n * @private\n * @param {Boolean} [skipCoordsChange] if true, coordinates of objects enclosed in a group do not change\n */\n _updateObjectsCoords: function(center) {\n var center = center || this.getCenterPoint();\n for (var i = this._objects.length; i--; ){\n this._updateObjectCoords(this._objects[i], center);\n }\n },\n\n /**\n * @private\n * @param {Object} object\n * @param {fabric.Point} center, current center of group.\n */\n _updateObjectCoords: function(object, center) {\n var objectLeft = object.left,\n objectTop = object.top,\n ignoreZoom = true, skipAbsolute = true;\n\n object.set({\n left: objectLeft - center.x,\n top: objectTop - center.y\n });\n object.group = this;\n object.setCoords(ignoreZoom, skipAbsolute);\n },\n\n /**\n * Returns string represenation of a group\n * @return {String}\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Adds an object to a group; Then recalculates group's dimension, position.\n * @param {Object} object\n * @return {fabric.Group} thisArg\n * @chainable\n */\n addWithUpdate: function(object) {\n this._restoreObjectsState();\n fabric.util.resetObjectTransform(this);\n if (object) {\n this._objects.push(object);\n object.group = this;\n object._set('canvas', this.canvas);\n }\n this._calcBounds();\n this._updateObjectsCoords();\n this.setCoords();\n this.dirty = true;\n return this;\n },\n\n /**\n * Removes an object from a group; Then recalculates group's dimension, position.\n * @param {Object} object\n * @return {fabric.Group} thisArg\n * @chainable\n */\n removeWithUpdate: function(object) {\n this._restoreObjectsState();\n fabric.util.resetObjectTransform(this);\n\n this.remove(object);\n this._calcBounds();\n this._updateObjectsCoords();\n this.setCoords();\n this.dirty = true;\n return this;\n },\n\n /**\n * @private\n */\n _onObjectAdded: function(object) {\n this.dirty = true;\n object.group = this;\n object._set('canvas', this.canvas);\n },\n\n /**\n * @private\n */\n _onObjectRemoved: function(object) {\n this.dirty = true;\n delete object.group;\n },\n\n /**\n * @private\n */\n _set: function(key, value) {\n var i = this._objects.length;\n if (this.useSetOnGroup) {\n while (i--) {\n this._objects[i].setOnGroup(key, value);\n }\n }\n if (key === 'canvas') {\n while (i--) {\n this._objects[i]._set(key, value);\n }\n }\n fabric.Object.prototype._set.call(this, key, value);\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var _includeDefaultValues = this.includeDefaultValues;\n var objsToObject = this._objects.map(function(obj) {\n var originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n var _obj = obj.toObject(propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n return _obj;\n });\n var obj = fabric.Object.prototype.toObject.call(this, propertiesToInclude);\n obj.objects = objsToObject;\n return obj;\n },\n\n /**\n * Returns object representation of an instance, in dataless mode.\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject: function(propertiesToInclude) {\n var objsToObject, sourcePath = this.sourcePath;\n if (sourcePath) {\n objsToObject = sourcePath;\n }\n else {\n var _includeDefaultValues = this.includeDefaultValues;\n objsToObject = this._objects.map(function(obj) {\n var originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n var _obj = obj.toDatalessObject(propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n return _obj;\n });\n }\n var obj = fabric.Object.prototype.toDatalessObject.call(this, propertiesToInclude);\n obj.objects = objsToObject;\n return obj;\n },\n\n /**\n * Renders instance on a given context\n * @param {CanvasRenderingContext2D} ctx context to render instance on\n */\n render: function(ctx) {\n this._transformDone = true;\n this.callSuper('render', ctx);\n this._transformDone = false;\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group is already cached.\n * @return {Boolean}\n */\n shouldCache: function() {\n var ownCache = fabric.Object.prototype.shouldCache.call(this);\n if (ownCache) {\n for (var i = 0, len = this._objects.length; i < len; i++) {\n if (this._objects[i].willDrawShadow()) {\n this.ownCaching = false;\n return false;\n }\n }\n }\n return ownCache;\n },\n\n /**\n * Check if this object or a child object will cast a shadow\n * @return {Boolean}\n */\n willDrawShadow: function() {\n if (fabric.Object.prototype.willDrawShadow.call(this)) {\n return true;\n }\n for (var i = 0, len = this._objects.length; i < len; i++) {\n if (this._objects[i].willDrawShadow()) {\n return true;\n }\n }\n return false;\n },\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache: function() {\n return this.ownCaching || (this.group && this.group.isOnACache());\n },\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject: function(ctx) {\n for (var i = 0, len = this._objects.length; i < len; i++) {\n this._objects[i].render(ctx);\n }\n this._drawClipPath(ctx);\n },\n\n /**\n * Check if cache is dirty\n */\n isCacheDirty: function(skipCanvas) {\n if (this.callSuper('isCacheDirty', skipCanvas)) {\n return true;\n }\n if (!this.statefullCache) {\n return false;\n }\n for (var i = 0, len = this._objects.length; i < len; i++) {\n if (this._objects[i].isCacheDirty(true)) {\n if (this._cacheCanvas) {\n // if this group has not a cache canvas there is nothing to clean\n var x = this.cacheWidth / this.zoomX, y = this.cacheHeight / this.zoomY;\n this._cacheContext.clearRect(-x / 2, -y / 2, x, y);\n }\n return true;\n }\n }\n return false;\n },\n\n /**\n * Retores original state of each of group objects (original state is that which was before group was created).\n * @private\n * @return {fabric.Group} thisArg\n * @chainable\n */\n _restoreObjectsState: function() {\n this._objects.forEach(this._restoreObjectState, this);\n return this;\n },\n\n /**\n * Realises the transform from this group onto the supplied object\n * i.e. it tells you what would happen if the supplied object was in\n * the group, and then the group was destroyed. It mutates the supplied\n * object.\n * @param {fabric.Object} object\n * @return {fabric.Object} transformedObject\n */\n realizeTransform: function(object) {\n var matrix = object.calcTransformMatrix(),\n options = fabric.util.qrDecompose(matrix),\n center = new fabric.Point(options.translateX, options.translateY);\n object.flipX = false;\n object.flipY = false;\n object.set('scaleX', options.scaleX);\n object.set('scaleY', options.scaleY);\n object.skewX = options.skewX;\n object.skewY = options.skewY;\n object.angle = options.angle;\n object.setPositionByOrigin(center, 'center', 'center');\n return object;\n },\n\n /**\n * Restores original state of a specified object in group\n * @private\n * @param {fabric.Object} object\n * @return {fabric.Group} thisArg\n */\n _restoreObjectState: function(object) {\n this.realizeTransform(object);\n object.setCoords();\n delete object.group;\n return this;\n },\n\n /**\n * Destroys a group (restoring state of its objects)\n * @return {fabric.Group} thisArg\n * @chainable\n */\n destroy: function() {\n // when group is destroyed objects needs to get a repaint to be eventually\n // displayed on canvas.\n this._objects.forEach(function(object) {\n object.set('dirty', true);\n });\n return this._restoreObjectsState();\n },\n\n /**\n * make a group an active selection, remove the group from canvas\n * the group has to be on canvas for this to work.\n * @return {fabric.ActiveSelection} thisArg\n * @chainable\n */\n toActiveSelection: function() {\n if (!this.canvas) {\n return;\n }\n var objects = this._objects, canvas = this.canvas;\n this._objects = [];\n var options = this.toObject();\n delete options.objects;\n var activeSelection = new fabric.ActiveSelection([]);\n activeSelection.set(options);\n activeSelection.type = 'activeSelection';\n canvas.remove(this);\n objects.forEach(function(object) {\n object.group = activeSelection;\n object.dirty = true;\n canvas.add(object);\n });\n activeSelection.canvas = canvas;\n activeSelection._objects = objects;\n canvas._activeObject = activeSelection;\n activeSelection.setCoords();\n return activeSelection;\n },\n\n /**\n * Destroys a group (restoring state of its objects)\n * @return {fabric.Group} thisArg\n * @chainable\n */\n ungroupOnCanvas: function() {\n return this._restoreObjectsState();\n },\n\n /**\n * Sets coordinates of all objects inside group\n * @return {fabric.Group} thisArg\n * @chainable\n */\n setObjectsCoords: function() {\n var ignoreZoom = true, skipAbsolute = true;\n this.forEachObject(function(object) {\n object.setCoords(ignoreZoom, skipAbsolute);\n });\n return this;\n },\n\n /**\n * @private\n */\n _calcBounds: function(onlyWidthHeight) {\n var aX = [],\n aY = [],\n o, prop,\n props = ['tr', 'br', 'bl', 'tl'],\n i = 0, iLen = this._objects.length,\n j, jLen = props.length,\n ignoreZoom = true;\n\n for ( ; i < iLen; ++i) {\n o = this._objects[i];\n o.setCoords(ignoreZoom);\n for (j = 0; j < jLen; j++) {\n prop = props[j];\n aX.push(o.oCoords[prop].x);\n aY.push(o.oCoords[prop].y);\n }\n }\n\n this._getBounds(aX, aY, onlyWidthHeight);\n },\n\n /**\n * @private\n */\n _getBounds: function(aX, aY, onlyWidthHeight) {\n var minXY = new fabric.Point(min(aX), min(aY)),\n maxXY = new fabric.Point(max(aX), max(aY)),\n top = minXY.y || 0, left = minXY.x || 0,\n width = (maxXY.x - minXY.x) || 0,\n height = (maxXY.y - minXY.y) || 0;\n this.width = width;\n this.height = height;\n if (!onlyWidthHeight) {\n // the bounding box always finds the topleft most corner.\n // whatever is the group origin, we set up here the left/top position.\n this.setPositionByOrigin({ x: left, y: top }, 'left', 'top');\n }\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG: function(reviver) {\n var svgString = ['\\n'];\n\n for (var i = 0, len = this._objects.length; i < len; i++) {\n svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n }\n svgString.push('\\n');\n return svgString;\n },\n\n /**\n * Returns styles-string for svg-export, specific version for group\n * @return {String}\n */\n getSvgStyles: function() {\n var opacity = typeof this.opacity !== 'undefined' && this.opacity !== 1 ?\n 'opacity: ' + this.opacity + ';' : '',\n visibility = this.visible ? '' : ' visibility: hidden;';\n return [\n opacity,\n this.getSvgFilter(),\n visibility\n ].join('');\n },\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG: function(reviver) {\n var svgString = [];\n\n for (var i = 0, len = this._objects.length; i < len; i++) {\n svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n }\n\n return this._createBaseClipPathSVGMarkup(svgString, { reviver: reviver });\n },\n /* _TO_SVG_END_ */\n });\n\n /**\n * Returns {@link fabric.Group} instance from an object representation\n * @static\n * @memberOf fabric.Group\n * @param {Object} object Object to create a group from\n * @param {Function} [callback] Callback to invoke when an group instance is created\n */\n fabric.Group.fromObject = function(object, callback) {\n var objects = object.objects,\n options = fabric.util.object.clone(object, true);\n delete options.objects;\n if (typeof objects === 'string') {\n // it has to be an url or something went wrong.\n fabric.loadSVGFromURL(objects, function (elements) {\n var group = fabric.util.groupSVGElements(elements, object, objects);\n group.set(options);\n callback && callback(group);\n });\n return;\n }\n fabric.util.enlivenObjects(objects, function(enlivenedObjects) {\n fabric.util.enlivenObjects([object.clipPath], function(enlivedClipPath) {\n var options = fabric.util.object.clone(object, true);\n options.clipPath = enlivedClipPath[0];\n delete options.objects;\n callback && callback(new fabric.Group(enlivenedObjects, options, true));\n });\n });\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.ActiveSelection) {\n return;\n }\n\n /**\n * Group class\n * @class fabric.ActiveSelection\n * @extends fabric.Group\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups}\n * @see {@link fabric.ActiveSelection#initialize} for constructor definition\n */\n fabric.ActiveSelection = fabric.util.createClass(fabric.Group, /** @lends fabric.ActiveSelection.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'activeSelection',\n\n /**\n * Constructor\n * @param {Object} objects ActiveSelection objects\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(objects, options) {\n options = options || {};\n this._objects = objects || [];\n for (var i = this._objects.length; i--; ) {\n this._objects[i].group = this;\n }\n\n if (options.originX) {\n this.originX = options.originX;\n }\n if (options.originY) {\n this.originY = options.originY;\n }\n this._calcBounds();\n this._updateObjectsCoords();\n fabric.Object.prototype.initialize.call(this, options);\n this.setCoords();\n },\n\n /**\n * Change te activeSelection to a normal group,\n * High level function that automatically adds it to canvas as\n * active object. no events fired.\n * @since 2.0.0\n * @return {fabric.Group}\n */\n toGroup: function() {\n var objects = this._objects.concat();\n this._objects = [];\n var options = fabric.Object.prototype.toObject.call(this);\n var newGroup = new fabric.Group([]);\n delete options.type;\n newGroup.set(options);\n objects.forEach(function(object) {\n object.canvas.remove(object);\n object.group = newGroup;\n });\n newGroup._objects = objects;\n if (!this.canvas) {\n return newGroup;\n }\n var canvas = this.canvas;\n canvas.add(newGroup);\n canvas._activeObject = newGroup;\n newGroup.setCoords();\n return newGroup;\n },\n\n /**\n * If returns true, deselection is cancelled.\n * @since 2.0.0\n * @return {Boolean} [cancel]\n */\n onDeselect: function() {\n this.destroy();\n return false;\n },\n\n /**\n * Returns string representation of a group\n * @return {String}\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group outside is cached.\n * @return {Boolean}\n */\n shouldCache: function() {\n return false;\n },\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache: function() {\n return false;\n },\n\n /**\n * Renders controls and borders for the object\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n * @param {Object} [childrenOverride] properties to override the children overrides\n */\n _renderControls: function(ctx, styleOverride, childrenOverride) {\n ctx.save();\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n this.callSuper('_renderControls', ctx, styleOverride);\n childrenOverride = childrenOverride || { };\n if (typeof childrenOverride.hasControls === 'undefined') {\n childrenOverride.hasControls = false;\n }\n if (typeof childrenOverride.hasRotatingPoint === 'undefined') {\n childrenOverride.hasRotatingPoint = false;\n }\n childrenOverride.forActiveSelection = true;\n for (var i = 0, len = this._objects.length; i < len; i++) {\n this._objects[i]._renderControls(ctx, childrenOverride);\n }\n ctx.restore();\n },\n });\n\n /**\n * Returns {@link fabric.ActiveSelection} instance from an object representation\n * @static\n * @memberOf fabric.ActiveSelection\n * @param {Object} object Object to create a group from\n * @param {Function} [callback] Callback to invoke when an ActiveSelection instance is created\n */\n fabric.ActiveSelection.fromObject = function(object, callback) {\n fabric.util.enlivenObjects(object.objects, function(enlivenedObjects) {\n delete object.objects;\n callback && callback(new fabric.ActiveSelection(enlivenedObjects, object, true));\n });\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var extend = fabric.util.object.extend;\n\n if (!global.fabric) {\n global.fabric = { };\n }\n\n if (global.fabric.Image) {\n fabric.warn('fabric.Image is already defined.');\n return;\n }\n\n /**\n * Image class\n * @class fabric.Image\n * @extends fabric.Object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#images}\n * @see {@link fabric.Image#initialize} for constructor definition\n */\n fabric.Image = fabric.util.createClass(fabric.Object, /** @lends fabric.Image.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'image',\n\n /**\n * crossOrigin value (one of \"\", \"anonymous\", \"use-credentials\")\n * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes\n * @type String\n * @default\n */\n crossOrigin: '',\n\n /**\n * Width of a stroke.\n * For image quality a stroke multiple of 2 gives better results.\n * @type Number\n * @default\n */\n strokeWidth: 0,\n\n /**\n * When calling {@link fabric.Image.getSrc}, return value from element src with `element.getAttribute('src')`.\n * This allows for relative urls as image src.\n * @since 2.7.0\n * @type Boolean\n * @default\n */\n srcFromAttribute: false,\n\n /**\n * private\n * contains last value of scaleX to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n _lastScaleX: 1,\n\n /**\n * private\n * contains last value of scaleY to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n _lastScaleY: 1,\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n _filterScalingX: 1,\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n _filterScalingY: 1,\n\n /**\n * minimum scale factor under which any resizeFilter is triggered to resize the image\n * 0 will disable the automatic resize. 1 will trigger automatically always.\n * number bigger than 1 are not implemented yet.\n * @type Number\n */\n minimumScaleTrigger: 0.5,\n\n /**\n * List of properties to consider when checking if\n * state of an object is changed ({@link fabric.Object#hasStateChanged})\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: fabric.Object.prototype.stateProperties.concat('cropX', 'cropY'),\n\n /**\n * key used to retrieve the texture representing this image\n * @since 2.0.0\n * @type String\n * @default\n */\n cacheKey: '',\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n * @default\n */\n cropX: 0,\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n * @default\n */\n cropY: 0,\n\n /**\n * Constructor\n * @param {HTMLImageElement | String} element Image element\n * @param {Object} [options] Options object\n * @param {function} [callback] callback function to call after eventual filters applied.\n * @return {fabric.Image} thisArg\n */\n initialize: function(element, options) {\n options || (options = { });\n this.filters = [];\n this.cacheKey = 'texture' + fabric.Object.__uid++;\n this.callSuper('initialize', options);\n this._initElement(element, options);\n },\n\n /**\n * Returns image element which this instance if based on\n * @return {HTMLImageElement} Image element\n */\n getElement: function() {\n return this._element || {};\n },\n\n /**\n * Sets image element for this instance to a specified one.\n * If filters defined they are applied to new image.\n * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n * @param {HTMLImageElement} element\n * @param {Object} [options] Options object\n * @return {fabric.Image} thisArg\n * @chainable\n */\n setElement: function(element, options) {\n this.removeTexture(this.cacheKey);\n this.removeTexture(this.cacheKey + '_filtered');\n this._element = element;\n this._originalElement = element;\n this._initConfig(options);\n if (this.filters.length !== 0) {\n this.applyFilters();\n }\n // resizeFilters work on the already filtered copy.\n // we need to apply resizeFilters AFTER normal filters.\n // applyResizeFilters is run more often than normal fiters\n // and is triggered by user interactions rather than dev code\n if (this.resizeFilter) {\n this.applyResizeFilters();\n }\n return this;\n },\n\n /**\n * Delete a single texture if in webgl mode\n */\n removeTexture: function(key) {\n var backend = fabric.filterBackend;\n if (backend && backend.evictCachesForKey) {\n backend.evictCachesForKey(key);\n }\n },\n\n /**\n * Delete textures, reference to elements and eventually JSDOM cleanup\n */\n dispose: function() {\n this.removeTexture(this.cacheKey);\n this.removeTexture(this.cacheKey + '_filtered');\n this._cacheContext = undefined;\n ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'].forEach((function(element) {\n fabric.util.cleanUpJsdomNode(this[element]);\n this[element] = undefined;\n }).bind(this));\n },\n\n /**\n * Sets crossOrigin value (on an instance and corresponding image element)\n * @return {fabric.Image} thisArg\n * @chainable\n */\n setCrossOrigin: function(value) {\n this.crossOrigin = value;\n this._element.crossOrigin = value;\n\n return this;\n },\n\n /**\n * Returns original size of an image\n * @return {Object} Object with \"width\" and \"height\" properties\n */\n getOriginalSize: function() {\n var element = this.getElement();\n return {\n width: element.naturalWidth || element.width,\n height: element.naturalHeight || element.height\n };\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _stroke: function(ctx) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n var w = this.width / 2, h = this.height / 2;\n ctx.beginPath();\n ctx.moveTo(-w, -h);\n ctx.lineTo(w, -h);\n ctx.lineTo(w, h);\n ctx.lineTo(-w, h);\n ctx.lineTo(-w, -h);\n ctx.closePath();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderDashedStroke: function(ctx) {\n var x = -this.width / 2,\n y = -this.height / 2,\n w = this.width,\n h = this.height;\n\n ctx.save();\n this._setStrokeStyles(ctx, this);\n\n ctx.beginPath();\n fabric.util.drawDashedLine(ctx, x, y, x + w, y, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, x + w, y, x + w, y + h, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, x + w, y + h, x, y + h, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, x, y + h, x, y, this.strokeDashArray);\n ctx.closePath();\n ctx.restore();\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var filters = [];\n\n this.filters.forEach(function(filterObj) {\n if (filterObj) {\n filters.push(filterObj.toObject());\n }\n });\n var object = extend(\n this.callSuper(\n 'toObject',\n ['crossOrigin', 'cropX', 'cropY'].concat(propertiesToInclude)\n ), {\n src: this.getSrc(),\n filters: filters,\n });\n if (this.resizeFilter) {\n object.resizeFilter = this.resizeFilter.toObject();\n }\n return object;\n },\n\n /**\n * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,hight.\n * @return {Boolean}\n */\n hasCrop: function() {\n return this.cropX || this.cropY || this.width < this._element.width || this.height < this._element.height;\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var svgString = [], imageMarkup = [], strokeSvg,\n x = -this.width / 2, y = -this.height / 2, clipPath = '';\n if (this.hasCrop()) {\n var clipPathId = fabric.Object.__uid++;\n svgString.push(\n '\\n',\n '\\t\\n',\n '\\n'\n );\n clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n }\n imageMarkup.push('\\t element with actual transformation, then offsetting object to the top/left\n // so that object's center aligns with container's left/top\n '\" width=\"', this._element.width || this._element.naturalWidth,\n '\" height=\"', this._element.height || this._element.height,\n '\"', clipPath,\n '>\\n');\n\n if (this.stroke || this.strokeDashArray) {\n var origFill = this.fill;\n this.fill = null;\n strokeSvg = [\n '\\t\\n'\n ];\n this.fill = origFill;\n }\n if (this.paintFirst !== 'fill') {\n svgString = svgString.concat(strokeSvg, imageMarkup);\n }\n else {\n svgString = svgString.concat(imageMarkup, strokeSvg);\n }\n return svgString;\n },\n /* _TO_SVG_END_ */\n\n /**\n * Returns source of an image\n * @param {Boolean} filtered indicates if the src is needed for svg\n * @return {String} Source of an image\n */\n getSrc: function(filtered) {\n var element = filtered ? this._element : this._originalElement;\n if (element) {\n if (element.toDataURL) {\n return element.toDataURL();\n }\n\n if (this.srcFromAttribute) {\n return element.getAttribute('src');\n }\n else {\n return element.src;\n }\n }\n else {\n return this.src || '';\n }\n },\n\n /**\n * Sets source of an image\n * @param {String} src Source string (URL)\n * @param {Function} [callback] Callback is invoked when image has been loaded (and all filters have been applied)\n * @param {Object} [options] Options object\n * @return {fabric.Image} thisArg\n * @chainable\n */\n setSrc: function(src, callback, options) {\n fabric.util.loadImage(src, function(img) {\n this.setElement(img, options);\n this._setWidthHeight();\n callback && callback(this);\n }, this, options && options.crossOrigin);\n return this;\n },\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of an instance\n */\n toString: function() {\n return '#';\n },\n\n applyResizeFilters: function() {\n var filter = this.resizeFilter,\n minimumScale = this.minimumScaleTrigger,\n objectScale = this.getTotalObjectScaling(),\n scaleX = objectScale.scaleX,\n scaleY = objectScale.scaleY,\n elementToFilter = this._filteredEl || this._originalElement;\n if (this.group) {\n this.set('dirty', true);\n }\n if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n this._element = elementToFilter;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n this._lastScaleX = scaleX;\n this._lastScaleY = scaleY;\n return;\n }\n if (!fabric.filterBackend) {\n fabric.filterBackend = fabric.initFilterBackend();\n }\n var canvasEl = fabric.util.createCanvasElement(),\n cacheKey = this._filteredEl ? (this.cacheKey + '_filtered') : this.cacheKey,\n sourceWidth = elementToFilter.width, sourceHeight = elementToFilter.height;\n canvasEl.width = sourceWidth;\n canvasEl.height = sourceHeight;\n this._element = canvasEl;\n this._lastScaleX = filter.scaleX = scaleX;\n this._lastScaleY = filter.scaleY = scaleY;\n fabric.filterBackend.applyFilters(\n [filter], elementToFilter, sourceWidth, sourceHeight, this._element, cacheKey);\n this._filterScalingX = canvasEl.width / this._originalElement.width;\n this._filterScalingY = canvasEl.height / this._originalElement.height;\n },\n\n /**\n * Applies filters assigned to this image (from \"filters\" array) or from filter param\n * @method applyFilters\n * @param {Array} filters to be applied\n * @param {Boolean} forResizing specify if the filter operation is a resize operation\n * @return {thisArg} return the fabric.Image object\n * @chainable\n */\n applyFilters: function(filters) {\n\n filters = filters || this.filters || [];\n filters = filters.filter(function(filter) { return filter && !filter.isNeutralState(); });\n this.set('dirty', true);\n\n // needs to clear out or WEBGL will not resize correctly\n this.removeTexture(this.cacheKey + '_filtered');\n\n if (filters.length === 0) {\n this._element = this._originalElement;\n this._filteredEl = null;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n return this;\n }\n\n var imgElement = this._originalElement,\n sourceWidth = imgElement.naturalWidth || imgElement.width,\n sourceHeight = imgElement.naturalHeight || imgElement.height;\n\n if (this._element === this._originalElement) {\n // if the element is the same we need to create a new element\n var canvasEl = fabric.util.createCanvasElement();\n canvasEl.width = sourceWidth;\n canvasEl.height = sourceHeight;\n this._element = canvasEl;\n this._filteredEl = canvasEl;\n }\n else {\n // clear the existing element to get new filter data\n // also dereference the eventual resized _element\n this._element = this._filteredEl;\n this._filteredEl.getContext('2d').clearRect(0, 0, sourceWidth, sourceHeight);\n // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y\n this._lastScaleX = 1;\n this._lastScaleY = 1;\n }\n if (!fabric.filterBackend) {\n fabric.filterBackend = fabric.initFilterBackend();\n }\n fabric.filterBackend.applyFilters(\n filters, this._originalElement, sourceWidth, sourceHeight, this._element, this.cacheKey);\n if (this._originalElement.width !== this._element.width ||\n this._originalElement.height !== this._element.height) {\n this._filterScalingX = this._element.width / this._originalElement.width;\n this._filterScalingY = this._element.height / this._originalElement.height;\n }\n return this;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {\n this.applyResizeFilters();\n }\n this._stroke(ctx);\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group outside is cached.\n * This is the special image version where we would like to avoid caching where possible.\n * Essentially images do not benefit from caching. They may require caching, and in that\n * case we do it. Also caching an image usually ends in a loss of details.\n * A full performance audit should be done.\n * @return {Boolean}\n */\n shouldCache: function() {\n return this.needsItsOwnCache();\n },\n\n _renderFill: function(ctx) {\n var elementToDraw = this._element,\n w = this.width, h = this.height,\n sW = Math.min(elementToDraw.naturalWidth || elementToDraw.width, w * this._filterScalingX),\n sH = Math.min(elementToDraw.naturalHeight || elementToDraw.height, h * this._filterScalingY),\n x = -w / 2, y = -h / 2,\n sX = Math.max(0, this.cropX * this._filterScalingX),\n sY = Math.max(0, this.cropY * this._filterScalingY);\n\n elementToDraw && ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, w, h);\n },\n\n /**\n * needed to check if image needs resize\n * @private\n */\n _needsResize: function() {\n var scale = this.getTotalObjectScaling();\n return (scale.scaleX !== this._lastScaleX || scale.scaleY !== this._lastScaleY);\n },\n\n /**\n * @private\n */\n _resetWidthHeight: function() {\n this.set(this.getOriginalSize());\n },\n\n /**\n * The Image class's initialization method. This method is automatically\n * called by the constructor.\n * @private\n * @param {HTMLImageElement|String} element The element representing the image\n * @param {Object} [options] Options object\n */\n _initElement: function(element, options) {\n this.setElement(fabric.util.getById(element), options);\n fabric.util.addClass(this.getElement(), fabric.Image.CSS_CANVAS);\n },\n\n /**\n * @private\n * @param {Object} [options] Options object\n */\n _initConfig: function(options) {\n options || (options = { });\n this.setOptions(options);\n this._setWidthHeight(options);\n if (this._element && this.crossOrigin) {\n this._element.crossOrigin = this.crossOrigin;\n }\n },\n\n /**\n * @private\n * @param {Array} filters to be initialized\n * @param {Function} callback Callback to invoke when all fabric.Image.filters instances are created\n */\n _initFilters: function(filters, callback) {\n if (filters && filters.length) {\n fabric.util.enlivenObjects(filters, function(enlivenedObjects) {\n callback && callback(enlivenedObjects);\n }, 'fabric.Image.filters');\n }\n else {\n callback && callback();\n }\n },\n\n /**\n * @private\n * Set the width and the height of the image object, using the element or the\n * options.\n * @param {Object} [options] Object with width/height properties\n */\n _setWidthHeight: function(options) {\n options || (options = { });\n var el = this.getElement();\n this.width = options.width || el.naturalWidth || el.width || 0;\n this.height = options.height || el.naturalHeight || el.height || 0;\n },\n\n /**\n * Calculate offset for center and scale factor for the image in order to respect\n * the preserveAspectRatio attribute\n * @private\n * @return {Object}\n */\n parsePreserveAspectRatioAttribute: function() {\n var pAR = fabric.util.parsePreserveAspectRatioAttribute(this.preserveAspectRatio || ''),\n rWidth = this._element.width, rHeight = this._element.height,\n scaleX = 1, scaleY = 1, offsetLeft = 0, offsetTop = 0, cropX = 0, cropY = 0,\n offset, pWidth = this.width, pHeight = this.height, parsedAttributes = { width: pWidth, height: pHeight };\n if (pAR && (pAR.alignX !== 'none' || pAR.alignY !== 'none')) {\n if (pAR.meetOrSlice === 'meet') {\n scaleX = scaleY = fabric.util.findScaleToFit(this._element, parsedAttributes);\n offset = (pWidth - rWidth * scaleX) / 2;\n if (pAR.alignX === 'Min') {\n offsetLeft = -offset;\n }\n if (pAR.alignX === 'Max') {\n offsetLeft = offset;\n }\n offset = (pHeight - rHeight * scaleY) / 2;\n if (pAR.alignY === 'Min') {\n offsetTop = -offset;\n }\n if (pAR.alignY === 'Max') {\n offsetTop = offset;\n }\n }\n if (pAR.meetOrSlice === 'slice') {\n scaleX = scaleY = fabric.util.findScaleToCover(this._element, parsedAttributes);\n offset = rWidth - pWidth / scaleX;\n if (pAR.alignX === 'Mid') {\n cropX = offset / 2;\n }\n if (pAR.alignX === 'Max') {\n cropX = offset;\n }\n offset = rHeight - pHeight / scaleY;\n if (pAR.alignY === 'Mid') {\n cropY = offset / 2;\n }\n if (pAR.alignY === 'Max') {\n cropY = offset;\n }\n rWidth = pWidth / scaleX;\n rHeight = pHeight / scaleY;\n }\n }\n else {\n scaleX = pWidth / rWidth;\n scaleY = pHeight / rHeight;\n }\n return {\n width: rWidth,\n height: rHeight,\n scaleX: scaleX,\n scaleY: scaleY,\n offsetLeft: offsetLeft,\n offsetTop: offsetTop,\n cropX: cropX,\n cropY: cropY\n };\n }\n });\n\n /**\n * Default CSS class name for canvas\n * @static\n * @type String\n * @default\n */\n fabric.Image.CSS_CANVAS = 'canvas-img';\n\n /**\n * Alias for getSrc\n * @static\n */\n fabric.Image.prototype.getSvgSrc = fabric.Image.prototype.getSrc;\n\n /**\n * Creates an instance of fabric.Image from its object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} callback Callback to invoke when an image instance is created\n */\n fabric.Image.fromObject = function(_object, callback) {\n var object = fabric.util.object.clone(_object);\n fabric.util.loadImage(object.src, function(img, error) {\n if (error) {\n callback && callback(null, error);\n return;\n }\n fabric.Image.prototype._initFilters.call(object, object.filters, function(filters) {\n object.filters = filters || [];\n fabric.Image.prototype._initFilters.call(object, [object.resizeFilter], function(resizeFilters) {\n object.resizeFilter = resizeFilters[0];\n fabric.util.enlivenObjects([object.clipPath], function(enlivedProps) {\n object.clipPath = enlivedProps[0];\n var image = new fabric.Image(img, object);\n callback(image);\n });\n });\n });\n }, null, object.crossOrigin);\n };\n\n /**\n * Creates an instance of fabric.Image from an URL string\n * @static\n * @param {String} url URL to create an image from\n * @param {Function} [callback] Callback to invoke when image is created (newly created image is passed as a first argument)\n * @param {Object} [imgOptions] Options object\n */\n fabric.Image.fromURL = function(url, callback, imgOptions) {\n fabric.util.loadImage(url, function(img) {\n callback && callback(new fabric.Image(img, imgOptions));\n }, null, imgOptions && imgOptions.crossOrigin);\n };\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Image.fromElement})\n * @static\n * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}\n */\n fabric.Image.ATTRIBUTE_NAMES =\n fabric.SHARED_ATTRIBUTES.concat('x y width height preserveAspectRatio xlink:href crossOrigin'.split(' '));\n\n /**\n * Returns {@link fabric.Image} instance from an SVG element\n * @static\n * @param {SVGElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} callback Callback to execute when fabric.Image object is created\n * @return {fabric.Image} Instance of fabric.Image\n */\n fabric.Image.fromElement = function(element, callback, options) {\n var parsedAttributes = fabric.parseAttributes(element, fabric.Image.ATTRIBUTE_NAMES);\n fabric.Image.fromURL(parsedAttributes['xlink:href'], callback,\n extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes));\n };\n /* _FROM_SVG_END_ */\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * @private\n * @return {Number} angle value\n */\n _getAngleValueForStraighten: function() {\n var angle = this.angle % 360;\n if (angle > 0) {\n return Math.round((angle - 1) / 90) * 90;\n }\n return Math.round(angle / 90) * 90;\n },\n\n /**\n * Straightens an object (rotating it from current angle to one of 0, 90, 180, 270, etc. depending on which is closer)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n straighten: function() {\n this.rotate(this._getAngleValueForStraighten());\n return this;\n },\n\n /**\n * Same as {@link fabric.Object.prototype.straighten} but with animation\n * @param {Object} callbacks Object with callback functions\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.Object} thisArg\n * @chainable\n */\n fxStraighten: function(callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n fabric.util.animate({\n startValue: this.get('angle'),\n endValue: this._getAngleValueForStraighten(),\n duration: this.FX_DURATION,\n onChange: function(value) {\n _this.rotate(value);\n onChange();\n },\n onComplete: function() {\n _this.setCoords();\n onComplete();\n },\n });\n\n return this;\n }\n});\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Straightens object, then rerenders canvas\n * @param {fabric.Object} object Object to straighten\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n straightenObject: function (object) {\n object.straighten();\n this.requestRenderAll();\n return this;\n },\n\n /**\n * Same as {@link fabric.Canvas.prototype.straightenObject}, but animated\n * @param {fabric.Object} object Object to straighten\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n fxStraightenObject: function (object) {\n object.fxStraighten({\n onChange: this.requestRenderAllBound\n });\n return this;\n }\n});\n\n\n(function() {\n\n 'use strict';\n\n /**\n * Tests if webgl supports certain precision\n * @param {WebGL} Canvas WebGL context to test on\n * @param {String} Precision to test can be any of following: 'lowp', 'mediump', 'highp'\n * @returns {Boolean} Whether the user's browser WebGL supports given precision.\n */\n function testPrecision(gl, precision){\n var fragmentSource = 'precision ' + precision + ' float;\\nvoid main(){}';\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n return false;\n }\n return true;\n }\n\n /**\n * Indicate whether this filtering backend is supported by the user's browser.\n * @param {Number} tileSize check if the tileSize is supported\n * @returns {Boolean} Whether the user's browser supports WebGL.\n */\n fabric.isWebglSupported = function(tileSize) {\n if (fabric.isLikelyNode) {\n return false;\n }\n tileSize = tileSize || fabric.WebglFilterBackend.prototype.tileSize;\n var canvas = document.createElement('canvas');\n var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n var isSupported = false;\n // eslint-disable-next-line\n if (gl) {\n fabric.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n isSupported = fabric.maxTextureSize >= tileSize;\n var precisions = ['highp', 'mediump', 'lowp'];\n for (var i = 0; i < 3; i++){\n if (testPrecision(gl, precisions[i])){\n fabric.webGlPrecision = precisions[i];\n break;\n };\n }\n }\n this.isSupported = isSupported;\n return isSupported;\n };\n\n fabric.WebglFilterBackend = WebglFilterBackend;\n\n /**\n * WebGL filter backend.\n */\n function WebglFilterBackend(options) {\n if (options && options.tileSize) {\n this.tileSize = options.tileSize;\n }\n this.setupGLContext(this.tileSize, this.tileSize);\n this.captureGPUInfo();\n };\n\n WebglFilterBackend.prototype = /** @lends fabric.WebglFilterBackend.prototype */ {\n\n tileSize: 2048,\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you problably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: {\n\n },\n\n /**\n * Setup a WebGL context suitable for filtering, and bind any needed event handlers.\n */\n setupGLContext: function(width, height) {\n this.dispose();\n this.createWebGLCanvas(width, height);\n // eslint-disable-next-line\n this.aPosition = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);\n this.chooseFastestCopyGLTo2DMethod(width, height);\n },\n\n /**\n * Pick a method to copy data from GL context to 2d canvas. In some browsers using\n * putImageData is faster than drawImage for that specific operation.\n */\n chooseFastestCopyGLTo2DMethod: function(width, height) {\n var canMeasurePerf = typeof window.performance !== 'undefined', canUseImageData;\n try {\n new ImageData(1, 1);\n canUseImageData = true;\n }\n catch (e) {\n canUseImageData = false;\n }\n // eslint-disable-next-line no-undef\n var canUseArrayBuffer = typeof ArrayBuffer !== 'undefined';\n // eslint-disable-next-line no-undef\n var canUseUint8Clamped = typeof Uint8ClampedArray !== 'undefined';\n\n if (!(canMeasurePerf && canUseImageData && canUseArrayBuffer && canUseUint8Clamped)) {\n return;\n }\n\n var targetCanvas = fabric.util.createCanvasElement();\n // eslint-disable-next-line no-undef\n var imageBuffer = new ArrayBuffer(width * height * 4);\n if (fabric.forceGLPutImageData) {\n this.imageBuffer = imageBuffer;\n this.copyGLTo2D = copyGLTo2DPutImageData;\n return;\n }\n var testContext = {\n imageBuffer: imageBuffer,\n destinationWidth: width,\n destinationHeight: height,\n targetCanvas: targetCanvas\n };\n var startTime, drawImageTime, putImageDataTime;\n targetCanvas.width = width;\n targetCanvas.height = height;\n\n startTime = window.performance.now();\n copyGLTo2DDrawImage.call(testContext, this.gl, testContext);\n drawImageTime = window.performance.now() - startTime;\n\n startTime = window.performance.now();\n copyGLTo2DPutImageData.call(testContext, this.gl, testContext);\n putImageDataTime = window.performance.now() - startTime;\n\n if (drawImageTime > putImageDataTime) {\n this.imageBuffer = imageBuffer;\n this.copyGLTo2D = copyGLTo2DPutImageData;\n }\n else {\n this.copyGLTo2D = copyGLTo2DDrawImage;\n }\n },\n\n /**\n * Create a canvas element and associated WebGL context and attaches them as\n * class properties to the GLFilterBackend class.\n */\n createWebGLCanvas: function(width, height) {\n var canvas = fabric.util.createCanvasElement();\n canvas.width = width;\n canvas.height = height;\n var glOptions = {\n alpha: true,\n premultipliedAlpha: false,\n depth: false,\n stencil: false,\n antialias: false\n },\n gl = canvas.getContext('webgl', glOptions);\n if (!gl) {\n gl = canvas.getContext('experimental-webgl', glOptions);\n }\n if (!gl) {\n return;\n }\n gl.clearColor(0, 0, 0, 0);\n // this canvas can fire webglcontextlost and webglcontextrestored\n this.canvas = canvas;\n this.gl = gl;\n },\n\n /**\n * Attempts to apply the requested filters to the source provided, drawing the filtered output\n * to the provided target canvas.\n *\n * @param {Array} filters The filters to apply.\n * @param {HTMLImageElement|HTMLCanvasElement} source The source to be filtered.\n * @param {Number} width The width of the source input.\n * @param {Number} height The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n * @param {String|undefined} cacheKey A key used to cache resources related to the source. If\n * omitted, caching will be skipped.\n */\n applyFilters: function(filters, source, width, height, targetCanvas, cacheKey) {\n var gl = this.gl;\n var cachedTexture;\n if (cacheKey) {\n cachedTexture = this.getCachedTexture(cacheKey, source);\n }\n var pipelineState = {\n originalWidth: source.width || source.originalWidth,\n originalHeight: source.height || source.originalHeight,\n sourceWidth: width,\n sourceHeight: height,\n destinationWidth: width,\n destinationHeight: height,\n context: gl,\n sourceTexture: this.createTexture(gl, width, height, !cachedTexture && source),\n targetTexture: this.createTexture(gl, width, height),\n originalTexture: cachedTexture ||\n this.createTexture(gl, width, height, !cachedTexture && source),\n passes: filters.length,\n webgl: true,\n aPosition: this.aPosition,\n programCache: this.programCache,\n pass: 0,\n filterBackend: this,\n targetCanvas: targetCanvas\n };\n var tempFbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);\n filters.forEach(function(filter) { filter && filter.applyTo(pipelineState); });\n resizeCanvasIfNeeded(pipelineState);\n this.copyGLTo2D(gl, pipelineState);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.deleteTexture(pipelineState.sourceTexture);\n gl.deleteTexture(pipelineState.targetTexture);\n gl.deleteFramebuffer(tempFbo);\n targetCanvas.getContext('2d').setTransform(1, 0, 0, 1, 0, 0);\n return pipelineState;\n },\n\n /**\n * Detach event listeners, remove references, and clean up caches.\n */\n dispose: function() {\n if (this.canvas) {\n this.canvas = null;\n this.gl = null;\n }\n this.clearWebGLCaches();\n },\n\n /**\n * Wipe out WebGL-related caches.\n */\n clearWebGLCaches: function() {\n this.programCache = {};\n this.textureCache = {};\n },\n\n /**\n * Create a WebGL texture object.\n *\n * Accepts specific dimensions to initialize the textuer to or a source image.\n *\n * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.\n * @param {Number} width The width to initialize the texture at.\n * @param {Number} height The height to initialize the texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source for the texture data.\n * @returns {WebGLTexture}\n */\n createTexture: function(gl, width, height, textureImageSource) {\n var texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n if (textureImageSource) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, textureImageSource);\n }\n else {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n }\n return texture;\n },\n\n /**\n * Can be optionally used to get a texture from the cache array\n *\n * If an existing texture is not found, a new texture is created and cached.\n *\n * @param {String} uniqueId A cache key to use to find an existing texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the\n * texture cache entry if one does not already exist.\n */\n getCachedTexture: function(uniqueId, textureImageSource) {\n if (this.textureCache[uniqueId]) {\n return this.textureCache[uniqueId];\n }\n else {\n var texture = this.createTexture(\n this.gl, textureImageSource.width, textureImageSource.height, textureImageSource);\n this.textureCache[uniqueId] = texture;\n return texture;\n }\n },\n\n /**\n * Clear out cached resources related to a source image that has been\n * filtered previously.\n *\n * @param {String} cacheKey The cache key provided when the source image was filtered.\n */\n evictCachesForKey: function(cacheKey) {\n if (this.textureCache[cacheKey]) {\n this.gl.deleteTexture(this.textureCache[cacheKey]);\n delete this.textureCache[cacheKey];\n }\n },\n\n copyGLTo2D: copyGLTo2DDrawImage,\n\n /**\n * Attempt to extract GPU information strings from a WebGL context.\n *\n * Useful information when debugging or blacklisting specific GPUs.\n *\n * @returns {Object} A GPU info object with renderer and vendor strings.\n */\n captureGPUInfo: function() {\n if (this.gpuInfo) {\n return this.gpuInfo;\n }\n var gl = this.gl, gpuInfo = { renderer: '', vendor: '' };\n if (!gl) {\n return gpuInfo;\n }\n var ext = gl.getExtension('WEBGL_debug_renderer_info');\n if (ext) {\n var renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);\n var vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);\n if (renderer) {\n gpuInfo.renderer = renderer.toLowerCase();\n }\n if (vendor) {\n gpuInfo.vendor = vendor.toLowerCase();\n }\n }\n this.gpuInfo = gpuInfo;\n return gpuInfo;\n },\n };\n})();\n\nfunction resizeCanvasIfNeeded(pipelineState) {\n var targetCanvas = pipelineState.targetCanvas,\n width = targetCanvas.width, height = targetCanvas.height,\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight;\n\n if (width !== dWidth || height !== dHeight) {\n targetCanvas.width = dWidth;\n targetCanvas.height = dHeight;\n }\n}\n\n/**\n * Copy an input WebGL canvas on to an output 2D canvas.\n *\n * The WebGL canvas is assumed to be upside down, with the top-left pixel of the\n * desired output image appearing in the bottom-left corner of the WebGL canvas.\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\nfunction copyGLTo2DDrawImage(gl, pipelineState) {\n var glCanvas = gl.canvas, targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d');\n ctx.translate(0, targetCanvas.height); // move it down again\n ctx.scale(1, -1); // vertical flip\n // where is my image on the big glcanvas?\n var sourceY = glCanvas.height - targetCanvas.height;\n ctx.drawImage(glCanvas, 0, sourceY, targetCanvas.width, targetCanvas.height, 0, 0,\n targetCanvas.width, targetCanvas.height);\n}\n\n/**\n * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData\n * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\nfunction copyGLTo2DPutImageData(gl, pipelineState) {\n var targetCanvas = pipelineState.targetCanvas, ctx = targetCanvas.getContext('2d'),\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight,\n numBytes = dWidth * dHeight * 4;\n\n // eslint-disable-next-line no-undef\n var u8 = new Uint8Array(this.imageBuffer, 0, numBytes);\n // eslint-disable-next-line no-undef\n var u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);\n\n gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);\n var imgData = new ImageData(u8Clamped, dWidth, dHeight);\n ctx.putImageData(imgData, 0, 0);\n}\n\n\n(function() {\n\n 'use strict';\n\n var noop = function() {};\n\n fabric.Canvas2dFilterBackend = Canvas2dFilterBackend;\n\n /**\n * Canvas 2D filter backend.\n */\n function Canvas2dFilterBackend() {};\n\n Canvas2dFilterBackend.prototype = /** @lends fabric.Canvas2dFilterBackend.prototype */ {\n evictCachesForKey: noop,\n dispose: noop,\n clearWebGLCaches: noop,\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: {\n\n },\n\n /**\n * Apply a set of filters against a source image and draw the filtered output\n * to the provided destination canvas.\n *\n * @param {EnhancedFilter} filters The filter to apply.\n * @param {HTMLImageElement|HTMLCanvasElement} sourceElement The source to be filtered.\n * @param {Number} sourceWidth The width of the source input.\n * @param {Number} sourceHeight The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n */\n applyFilters: function(filters, sourceElement, sourceWidth, sourceHeight, targetCanvas) {\n var ctx = targetCanvas.getContext('2d');\n ctx.drawImage(sourceElement, 0, 0, sourceWidth, sourceHeight);\n var imageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n var originalImageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n var pipelineState = {\n sourceWidth: sourceWidth,\n sourceHeight: sourceHeight,\n imageData: imageData,\n originalEl: sourceElement,\n originalImageData: originalImageData,\n canvasEl: targetCanvas,\n ctx: ctx,\n filterBackend: this,\n };\n filters.forEach(function(filter) { filter.applyTo(pipelineState); });\n if (pipelineState.imageData.width !== sourceWidth || pipelineState.imageData.height !== sourceHeight) {\n targetCanvas.width = pipelineState.imageData.width;\n targetCanvas.height = pipelineState.imageData.height;\n }\n ctx.putImageData(pipelineState.imageData, 0, 0);\n return pipelineState;\n },\n\n };\n})();\n\n\n/**\n * @namespace fabric.Image.filters\n * @memberOf fabric.Image\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#image_filters}\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n */\nfabric.Image = fabric.Image || { };\nfabric.Image.filters = fabric.Image.filters || { };\n\n/**\n * Root filter class from which all filter classes inherit from\n * @class fabric.Image.filters.BaseFilter\n * @memberOf fabric.Image.filters\n */\nfabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Image.filters.BaseFilter.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'BaseFilter',\n\n /**\n * Array of attributes to send with buffers. do not modify\n * @private\n */\n\n vertexSource: 'attribute vec2 aPosition;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vTexCoord = aPosition;\\n' +\n 'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\\n' +\n '}',\n\n fragmentSource: 'precision highp float;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'void main() {\\n' +\n 'gl_FragColor = texture2D(uTexture, vTexCoord);\\n' +\n '}',\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n if (options) {\n this.setOptions(options);\n }\n },\n\n /**\n * Sets filter's properties from options\n * @param {Object} [options] Options object\n */\n setOptions: function(options) {\n for (var prop in options) {\n this[prop] = options[prop];\n }\n },\n\n /**\n * Compile this filter's shader program.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n * @param {String} fragmentSource fragmentShader source for compilation\n * @param {String} vertexSource vertexShader source for compilation\n */\n createProgram: function(gl, fragmentSource, vertexSource) {\n fragmentSource = fragmentSource || this.fragmentSource;\n vertexSource = vertexSource || this.vertexSource;\n if (fabric.webGlPrecision !== 'highp'){\n fragmentSource = fragmentSource.replace(\n /precision highp float/g,\n 'precision ' + fabric.webGlPrecision + ' float'\n );\n }\n var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n throw new Error(\n // eslint-disable-next-line prefer-template\n 'Vertex shader compile error for ' + this.type + ': ' +\n gl.getShaderInfoLog(vertexShader)\n );\n }\n\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n throw new Error(\n // eslint-disable-next-line prefer-template\n 'Fragment shader compile error for ' + this.type + ': ' +\n gl.getShaderInfoLog(fragmentShader)\n );\n }\n\n var program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new Error(\n // eslint-disable-next-line prefer-template\n 'Shader link error for \"${this.type}\" ' +\n gl.getProgramInfoLog(program)\n );\n }\n\n var attributeLocations = this.getAttributeLocations(gl, program);\n var uniformLocations = this.getUniformLocations(gl, program) || { };\n uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n return {\n program: program,\n attributeLocations: attributeLocations,\n uniformLocations: uniformLocations\n };\n },\n\n /**\n * Return a map of attribute names to WebGLAttributeLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n * @returns {Object} A map of attribute names to attribute locations.\n */\n getAttributeLocations: function(gl, program) {\n return {\n aPosition: gl.getAttribLocation(program, 'aPosition'),\n };\n },\n\n /**\n * Return a map of uniform names to WebGLUniformLocation objects.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n * @returns {Object} A map of uniform names to uniform locations.\n */\n getUniformLocations: function (/* gl, program */) {\n // in case i do not need any special uniform i need to return an empty object\n return { };\n },\n\n /**\n * Send attribute data from this filter to its shader program on the GPU.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} attributeLocations A map of shader attribute names to their locations.\n */\n sendAttributeData: function(gl, attributeLocations, aPositionData) {\n var attributeLocation = attributeLocations.aPosition;\n var buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(attributeLocation);\n gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n },\n\n _setupFrameBuffer: function(options) {\n var gl = options.context, width, height;\n if (options.passes > 1) {\n width = options.destinationWidth;\n height = options.destinationHeight;\n if (options.sourceWidth !== width || options.sourceHeight !== height) {\n gl.deleteTexture(options.targetTexture);\n options.targetTexture = options.filterBackend.createTexture(gl, width, height);\n }\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D,\n options.targetTexture, 0);\n }\n else {\n // draw last filter on canvas and not to framebuffer.\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.finish();\n }\n },\n\n _swapTextures: function(options) {\n options.passes--;\n options.pass++;\n var temp = options.targetTexture;\n options.targetTexture = options.sourceTexture;\n options.sourceTexture = temp;\n },\n\n /**\n * Generic isNeutral implementation for one parameter based filters.\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * Other filters may need their own verison ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n * @param {Object} options\n **/\n isNeutralState: function(/* options */) {\n var main = this.mainParameter,\n _class = fabric.Image.filters[this.type].prototype;\n if (main) {\n if (Array.isArray(_class[main])) {\n for (var i = _class[main].length; i--;) {\n if (this[main][i] !== _class[main][i]) {\n return false;\n }\n }\n return true;\n }\n else {\n return _class[main] === this[main];\n }\n }\n else {\n return false;\n }\n },\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo: function(options) {\n if (options.webgl) {\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n }\n else {\n this.applyTo2d(options);\n }\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n if (!options.programCache.hasOwnProperty(this.type)) {\n options.programCache[this.type] = this.createProgram(options.context);\n }\n return options.programCache[this.type];\n },\n\n /**\n * Apply this filter using webgl.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyToWebGL: function(options) {\n var gl = options.context;\n var shader = this.retrieveShader(options);\n if (options.pass === 0 && options.originalTexture) {\n gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n }\n else {\n gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n }\n gl.useProgram(shader.program);\n this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n this.sendUniformData(gl, shader.uniformLocations);\n gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n },\n\n bindAdditionalTexture: function(gl, texture, textureUnit) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n // reset active texture to 0 as usual\n gl.activeTexture(gl.TEXTURE0);\n },\n\n unbindAdditionalTexture: function(gl, textureUnit) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.activeTexture(gl.TEXTURE0);\n },\n\n getMainParameter: function() {\n return this[this.mainParameter];\n },\n\n setMainParameter: function(value) {\n this[this.mainParameter] = value;\n },\n\n /**\n * Send uniform data from this filter to its shader program on the GPU.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} uniformLocations A map of shader uniform names to their locations.\n */\n sendUniformData: function(/* gl, uniformLocations */) {\n // Intentionally left blank. Override me in subclasses.\n },\n\n /**\n * If needed by a 2d filter, this functions can create an helper canvas to be used\n * remember that options.targetCanvas is available for use till end of chain.\n */\n createHelpLayer: function(options) {\n if (!options.helpLayer) {\n var helpLayer = document.createElement('canvas');\n helpLayer.width = options.sourceWidth;\n helpLayer.height = options.sourceHeight;\n options.helpLayer = helpLayer;\n }\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n var object = { type: this.type }, mainP = this.mainParameter;\n if (mainP) {\n object[mainP] = this[mainP];\n }\n return object;\n },\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON: function() {\n // delegate, not alias\n return this.toObject();\n }\n});\n\nfabric.Image.filters.BaseFilter.fromObject = function(object, callback) {\n var filter = new fabric.Image.filters[object.type](object);\n callback && callback(filter);\n return filter;\n};\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Color Matrix filter class\n * @class fabric.Image.filters.ColorMatrix\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.ColorMatrix#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @see {@Link http://www.webwasp.co.uk/tutorials/219/Color_Matrix_Filter.php}\n * @see {@Link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl}\n * @example Kodachrome filter\n * var filter = new fabric.Image.filters.ColorMatrix({\n * matrix: [\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0\n ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.ColorMatrix = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.ColorMatrix.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'ColorMatrix',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'uniform mat4 uColorMatrix;\\n' +\n 'uniform vec4 uConstants;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'color *= uColorMatrix;\\n' +\n 'color += uConstants;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Colormatrix for pixels.\n * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n * outside the -1, 1 range.\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Array} matrix array of 20 numbers.\n * @default\n */\n matrix: [\n 1, 0, 0, 0, 0,\n 0, 1, 0, 0, 0,\n 0, 0, 1, 0, 0,\n 0, 0, 0, 1, 0\n ],\n\n mainParameter: 'matrix',\n\n /**\n * Lock the colormatrix on the color part, skipping alpha, manly for non webgl scenario\n * to save some calculation\n */\n colorsOnly: true,\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n // create a new array instead mutating the prototype with push\n this.matrix = this.matrix.slice(0);\n },\n\n /**\n * Apply the ColorMatrix operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data,\n iLen = data.length,\n m = this.matrix,\n r, g, b, a, i, colorsOnly = this.colorsOnly;\n\n for (i = 0; i < iLen; i += 4) {\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n if (colorsOnly) {\n data[i] = r * m[0] + g * m[1] + b * m[2] + m[4] * 255;\n data[i + 1] = r * m[5] + g * m[6] + b * m[7] + m[9] * 255;\n data[i + 2] = r * m[10] + g * m[11] + b * m[12] + m[14] * 255;\n }\n else {\n a = data[i + 3];\n data[i] = r * m[0] + g * m[1] + b * m[2] + a * m[3] + m[4] * 255;\n data[i + 1] = r * m[5] + g * m[6] + b * m[7] + a * m[8] + m[9] * 255;\n data[i + 2] = r * m[10] + g * m[11] + b * m[12] + a * m[13] + m[14] * 255;\n data[i + 3] = r * m[15] + g * m[16] + b * m[17] + a * m[18] + m[19] * 255;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uColorMatrix: gl.getUniformLocation(program, 'uColorMatrix'),\n uConstants: gl.getUniformLocation(program, 'uConstants'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var m = this.matrix,\n matrix = [\n m[0], m[1], m[2], m[3],\n m[5], m[6], m[7], m[8],\n m[10], m[11], m[12], m[13],\n m[15], m[16], m[17], m[18]\n ],\n constants = [m[4], m[9], m[14], m[19]];\n gl.uniformMatrix4fv(uniformLocations.uColorMatrix, false, matrix);\n gl.uniform4fv(uniformLocations.uConstants, constants);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] function to invoke after filter creation\n * @return {fabric.Image.filters.ColorMatrix} Instance of fabric.Image.filters.ColorMatrix\n */\n fabric.Image.filters.ColorMatrix.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Brightness filter class\n * @class fabric.Image.filters.Brightness\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Brightness#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Brightness({\n * brightness: 0.05\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Brightness = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Brightness.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Brightness',\n\n /**\n * Fragment source for the brightness program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uBrightness;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'color.rgb += uBrightness;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Brightness value, from -1 to 1.\n * translated to -255 to 255 for 2d\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Number} brightness\n * @default\n */\n brightness: 0,\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'brightness',\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n if (this.brightness === 0) {\n return;\n }\n var imageData = options.imageData,\n data = imageData.data, i, len = data.length,\n brightness = Math.round(this.brightness * 255);\n for (i = 0; i < len; i += 4) {\n data[i] = data[i] + brightness;\n data[i + 1] = data[i + 1] + brightness;\n data[i + 2] = data[i + 2] + brightness;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uBrightness: gl.getUniformLocation(program, 'uBrightness'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uBrightness, this.brightness);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Brightness} Instance of fabric.Image.filters.Brightness\n */\n fabric.Image.filters.Brightness.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Adapted from html5rocks article\n * @class fabric.Image.filters.Convolute\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Convolute#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example Sharpen filter\n * var filter = new fabric.Image.filters.Convolute({\n * matrix: [ 0, -1, 0,\n * -1, 5, -1,\n * 0, -1, 0 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Blur filter\n * var filter = new fabric.Image.filters.Convolute({\n * matrix: [ 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter\n * var filter = new fabric.Image.filters.Convolute({\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter with opaqueness\n * var filter = new fabric.Image.filters.Convolute({\n * opaque: true,\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.Convolute = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Convolute.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Convolute',\n\n /*\n * Opaque value (true/false)\n */\n opaque: false,\n\n /*\n * matrix for the filter, max 9x9\n */\n matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0],\n\n /**\n * Fragment source for the brightness program\n */\n fragmentSource: {\n Convolute_3_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[9];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 3.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 3.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_3_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[9];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 3.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 3.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n Convolute_5_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[25];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 5.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 5.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_5_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[25];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 5.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 5.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n Convolute_7_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[49];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 7.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 7.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_7_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[49];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 7.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 7.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n Convolute_9_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[81];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 9.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 9.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_9_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[81];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 9.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 9.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n },\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.Convolute.prototype\n * @param {Object} [options] Options object\n * @param {Boolean} [options.opaque=false] Opaque value (true/false)\n * @param {Array} [options.matrix] Filter matrix\n */\n\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var size = Math.sqrt(this.matrix.length);\n var cacheKey = this.type + '_' + size + '_' + (this.opaque ? 1 : 0);\n var shaderSource = this.fragmentSource[cacheKey];\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data,\n weights = this.matrix,\n side = Math.round(Math.sqrt(weights.length)),\n halfSide = Math.floor(side / 2),\n sw = imageData.width,\n sh = imageData.height,\n output = options.ctx.createImageData(sw, sh),\n dst = output.data,\n // go through the destination image pixels\n alphaFac = this.opaque ? 1 : 0,\n r, g, b, a, dstOff,\n scx, scy, srcOff, wt,\n x, y, cx, cy;\n\n for (y = 0; y < sh; y++) {\n for (x = 0; x < sw; x++) {\n dstOff = (y * sw + x) * 4;\n // calculate the weighed sum of the source image pixels that\n // fall under the convolution matrix\n r = 0; g = 0; b = 0; a = 0;\n\n for (cy = 0; cy < side; cy++) {\n for (cx = 0; cx < side; cx++) {\n scy = y + cy - halfSide;\n scx = x + cx - halfSide;\n\n // eslint-disable-next-line max-depth\n if (scy < 0 || scy >= sh || scx < 0 || scx >= sw) {\n continue;\n }\n\n srcOff = (scy * sw + scx) * 4;\n wt = weights[cy * side + cx];\n\n r += data[srcOff] * wt;\n g += data[srcOff + 1] * wt;\n b += data[srcOff + 2] * wt;\n // eslint-disable-next-line max-depth\n if (!alphaFac) {\n a += data[srcOff + 3] * wt;\n }\n }\n }\n dst[dstOff] = r;\n dst[dstOff + 1] = g;\n dst[dstOff + 2] = b;\n if (!alphaFac) {\n dst[dstOff + 3] = a;\n }\n else {\n dst[dstOff + 3] = data[dstOff + 3];\n }\n }\n }\n options.imageData = output;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uMatrix: gl.getUniformLocation(program, 'uMatrix'),\n uOpaque: gl.getUniformLocation(program, 'uOpaque'),\n uHalfSize: gl.getUniformLocation(program, 'uHalfSize'),\n uSize: gl.getUniformLocation(program, 'uSize'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1fv(uniformLocations.uMatrix, this.matrix);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return extend(this.callSuper('toObject'), {\n opaque: this.opaque,\n matrix: this.matrix\n });\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Convolute} Instance of fabric.Image.filters.Convolute\n */\n fabric.Image.filters.Convolute.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Grayscale image filter class\n * @class fabric.Image.filters.Grayscale\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Grayscale();\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Grayscale = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Grayscale.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Grayscale',\n\n fragmentSource: {\n average: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'float average = (color.r + color.b + color.g) / 3.0;\\n' +\n 'gl_FragColor = vec4(average, average, average, color.a);\\n' +\n '}',\n lightness: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform int uMode;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 col = texture2D(uTexture, vTexCoord);\\n' +\n 'float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\\n' +\n 'gl_FragColor = vec4(average, average, average, col.a);\\n' +\n '}',\n luminosity: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform int uMode;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 col = texture2D(uTexture, vTexCoord);\\n' +\n 'float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\\n' +\n 'gl_FragColor = vec4(average, average, average, col.a);\\n' +\n '}',\n },\n\n\n /**\n * Grayscale mode, between 'average', 'lightness', 'luminosity'\n * @param {String} type\n * @default\n */\n mode: 'average',\n\n mainParameter: 'mode',\n\n /**\n * Apply the Grayscale operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, i,\n len = data.length, value,\n mode = this.mode;\n for (i = 0; i < len; i += 4) {\n if (mode === 'average') {\n value = (data[i] + data[i + 1] + data[i + 2]) / 3;\n }\n else if (mode === 'lightness') {\n value = (Math.min(data[i], data[i + 1], data[i + 2]) +\n Math.max(data[i], data[i + 1], data[i + 2])) / 2;\n }\n else if (mode === 'luminosity') {\n value = 0.21 * data[i] + 0.72 * data[i + 1] + 0.07 * data[i + 2];\n }\n data[i] = value;\n data[i + 1] = value;\n data[i + 2] = value;\n }\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var cacheKey = this.type + '_' + this.mode;\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n var shaderSource = this.fragmentSource[this.mode];\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uMode: gl.getUniformLocation(program, 'uMode'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n // default average mode.\n var mode = 1;\n gl.uniform1i(uniformLocations.uMode, mode);\n },\n\n /**\n * Grayscale filter isNeutralState implementation\n * The filter is never neutral\n * on the image\n **/\n isNeutralState: function() {\n return false;\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Grayscale} Instance of fabric.Image.filters.Grayscale\n */\n fabric.Image.filters.Grayscale.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Invert filter class\n * @class fabric.Image.filters.Invert\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Invert();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\n filters.Invert = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Invert.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Invert',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform int uInvert;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'if (uInvert == 1) {\\n' +\n 'gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\\n' +\n '} else {\\n' +\n 'gl_FragColor = color;\\n' +\n '}\\n' +\n '}',\n\n /**\n * Filter invert. if false, does nothing\n * @param {Boolean} invert\n * @default\n */\n invert: true,\n\n mainParameter: 'invert',\n\n /**\n * Apply the Invert operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, i,\n len = data.length;\n for (i = 0; i < len; i += 4) {\n data[i] = 255 - data[i];\n data[i + 1] = 255 - data[i + 1];\n data[i + 2] = 255 - data[i + 2];\n }\n },\n\n /**\n * Invert filter isNeutralState implementation\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * @param {Object} options\n **/\n isNeutralState: function() {\n return !this.invert;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uInvert: gl.getUniformLocation(program, 'uInvert'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1i(uniformLocations.uInvert, this.invert);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Invert} Instance of fabric.Image.filters.Invert\n */\n fabric.Image.filters.Invert.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Noise filter class\n * @class fabric.Image.filters.Noise\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Noise#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Noise({\n * noise: 700\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.Noise = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Noise.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Noise',\n\n /**\n * Fragment source for the noise program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uStepH;\\n' +\n 'uniform float uNoise;\\n' +\n 'uniform float uSeed;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'float rand(vec2 co, float seed, float vScale) {\\n' +\n 'return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\\n' +\n '}\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'noise',\n\n /**\n * Noise value, from\n * @param {Number} noise\n * @default\n */\n noise: 0,\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n if (this.noise === 0) {\n return;\n }\n var imageData = options.imageData,\n data = imageData.data, i, len = data.length,\n noise = this.noise, rand;\n\n for (i = 0, len = data.length; i < len; i += 4) {\n\n rand = (0.5 - Math.random()) * noise;\n\n data[i] += rand;\n data[i + 1] += rand;\n data[i + 2] += rand;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uNoise: gl.getUniformLocation(program, 'uNoise'),\n uSeed: gl.getUniformLocation(program, 'uSeed'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uNoise, this.noise / 255);\n gl.uniform1f(uniformLocations.uSeed, Math.random());\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return extend(this.callSuper('toObject'), {\n noise: this.noise\n });\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Noise} Instance of fabric.Image.filters.Noise\n */\n fabric.Image.filters.Noise.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Pixelate filter class\n * @class fabric.Image.filters.Pixelate\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Pixelate#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Pixelate({\n * blocksize: 8\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Pixelate = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Pixelate.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Pixelate',\n\n blocksize: 4,\n\n mainParameter: 'blocksize',\n\n /**\n * Fragment source for the Pixelate program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uBlocksize;\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'float blockW = uBlocksize * uStepW;\\n' +\n 'float blockH = uBlocksize * uStepW;\\n' +\n 'int posX = int(vTexCoord.x / blockW);\\n' +\n 'int posY = int(vTexCoord.y / blockH);\\n' +\n 'float fposX = float(posX);\\n' +\n 'float fposY = float(posY);\\n' +\n 'vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\\n' +\n 'vec4 color = texture2D(uTexture, squareCoords);\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data,\n iLen = imageData.height,\n jLen = imageData.width,\n index, i, j, r, g, b, a,\n _i, _j, _iLen, _jLen;\n\n for (i = 0; i < iLen; i += this.blocksize) {\n for (j = 0; j < jLen; j += this.blocksize) {\n\n index = (i * 4) * jLen + (j * 4);\n\n r = data[index];\n g = data[index + 1];\n b = data[index + 2];\n a = data[index + 3];\n\n _iLen = Math.min(i + this.blocksize, iLen);\n _jLen = Math.min(j + this.blocksize, jLen);\n for (_i = i; _i < _iLen; _i++) {\n for (_j = j; _j < _jLen; _j++) {\n index = (_i * 4) * jLen + (_j * 4);\n data[index] = r;\n data[index + 1] = g;\n data[index + 2] = b;\n data[index + 3] = a;\n }\n }\n }\n }\n },\n\n /**\n * Indicate when the filter is not gonna apply changes to the image\n **/\n isNeutralState: function() {\n return this.blocksize === 1;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uBlocksize: gl.getUniformLocation(program, 'uBlocksize'),\n uStepW: gl.getUniformLocation(program, 'uStepW'),\n uStepH: gl.getUniformLocation(program, 'uStepH'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uBlocksize, this.blocksize);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Pixelate} Instance of fabric.Image.filters.Pixelate\n */\n fabric.Image.filters.Pixelate.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Remove white filter class\n * @class fabric.Image.filters.RemoveColor\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.RemoveColor#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.RemoveColor({\n * threshold: 0.2,\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.RemoveColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.RemoveColor.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'RemoveColor',\n\n /**\n * Color to remove, in any format understood by fabric.Color.\n * @param {String} type\n * @default\n */\n color: '#FFFFFF',\n\n /**\n * Fragment source for the brightness program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec4 uLow;\\n' +\n 'uniform vec4 uHigh;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'gl_FragColor = texture2D(uTexture, vTexCoord);\\n' +\n 'if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\\n' +\n 'gl_FragColor.a = 0.0;\\n' +\n '}\\n' +\n '}',\n\n /**\n * distance to actual color, as value up or down from each r,g,b\n * between 0 and 1\n **/\n distance: 0.02,\n\n /**\n * For color to remove inside distance, use alpha channel for a smoother deletion\n * NOT IMPLEMENTED YET\n **/\n useAlpha: false,\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.RemoveWhite.prototype\n * @param {Object} [options] Options object\n * @param {Number} [options.color=#RRGGBB] Threshold value\n * @param {Number} [options.distance=10] Distance value\n */\n\n /**\n * Applies filter to canvas element\n * @param {Object} canvasEl Canvas element to apply filter to\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, i,\n distance = this.distance * 255,\n r, g, b,\n source = new fabric.Color(this.color).getSource(),\n lowC = [\n source[0] - distance,\n source[1] - distance,\n source[2] - distance,\n ],\n highC = [\n source[0] + distance,\n source[1] + distance,\n source[2] + distance,\n ];\n\n\n for (i = 0; i < data.length; i += 4) {\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n\n if (r > lowC[0] &&\n g > lowC[1] &&\n b > lowC[2] &&\n r < highC[0] &&\n g < highC[1] &&\n b < highC[2]) {\n data[i + 3] = 0;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uLow: gl.getUniformLocation(program, 'uLow'),\n uHigh: gl.getUniformLocation(program, 'uHigh'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var source = new fabric.Color(this.color).getSource(),\n distance = parseFloat(this.distance),\n lowC = [\n 0 + source[0] / 255 - distance,\n 0 + source[1] / 255 - distance,\n 0 + source[2] / 255 - distance,\n 1\n ],\n highC = [\n source[0] / 255 + distance,\n source[1] / 255 + distance,\n source[2] / 255 + distance,\n 1\n ];\n gl.uniform4fv(uniformLocations.uLow, lowC);\n gl.uniform4fv(uniformLocations.uHigh, highC);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return extend(this.callSuper('toObject'), {\n color: this.color,\n distance: this.distance\n });\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.RemoveColor} Instance of fabric.Image.filters.RemoveWhite\n */\n fabric.Image.filters.RemoveColor.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n var matrices = {\n Brownie: [\n 0.59970,0.34553,-0.27082,0,0.186,\n -0.03770,0.86095,0.15059,0,-0.1449,\n 0.24113,-0.07441,0.44972,0,-0.02965,\n 0,0,0,1,0\n ],\n Vintage: [\n 0.62793,0.32021,-0.03965,0,0.03784,\n 0.02578,0.64411,0.03259,0,0.02926,\n 0.04660,-0.08512,0.52416,0,0.02023,\n 0,0,0,1,0\n ],\n Kodachrome: [\n 1.12855,-0.39673,-0.03992,0,0.24991,\n -0.16404,1.08352,-0.05498,0,0.09698,\n -0.16786,-0.56034,1.60148,0,0.13972,\n 0,0,0,1,0\n ],\n Technicolor: [\n 1.91252,-0.85453,-0.09155,0,0.04624,\n -0.30878,1.76589,-0.10601,0,-0.27589,\n -0.23110,-0.75018,1.84759,0,0.12137,\n 0,0,0,1,0\n ],\n Polaroid: [\n 1.438,-0.062,-0.062,0,0,\n -0.122,1.378,-0.122,0,0,\n -0.016,-0.016,1.483,0,0,\n 0,0,0,1,0\n ],\n Sepia: [\n 0.393, 0.769, 0.189, 0, 0,\n 0.349, 0.686, 0.168, 0, 0,\n 0.272, 0.534, 0.131, 0, 0,\n 0, 0, 0, 1, 0\n ],\n BlackWhite: [\n 1.5, 1.5, 1.5, 0, -1,\n 1.5, 1.5, 1.5, 0, -1,\n 1.5, 1.5, 1.5, 0, -1,\n 0, 0, 0, 1, 0,\n ]\n };\n\n for (var key in matrices) {\n filters[key] = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.Sepia.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: key,\n\n /**\n * Colormatrix for the effect\n * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n * outside the -1, 1 range.\n * @param {Array} matrix array of 20 numbers.\n * @default\n */\n matrix: matrices[key],\n\n /**\n * Lock the matrix export for this kind of static, parameter less filters.\n */\n mainParameter: false,\n /**\n * Lock the colormatrix on the color part, skipping alpha\n */\n colorsOnly: true,\n\n });\n fabric.Image.filters[key].fromObject = fabric.Image.filters.BaseFilter.fromObject;\n }\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n 'use strict';\n\n var fabric = global.fabric,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Color Blend filter class\n * @class fabric.Image.filter.BlendColor\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @example\n * var filter = new fabric.Image.filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * var filter = new fabric.Image.filters.BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply',\n * alpha: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n\n filters.BlendColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blend.prototype */ {\n type: 'BlendColor',\n\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n **/\n color: '#F95C63',\n\n /**\n * Blend mode for the filter: one of multiply, add, diff, screen, subtract,\n * darken, lighten, overlay, exclusion, tint.\n **/\n mode: 'multiply',\n\n /**\n * alpha value. represent the strength of the blend color operation.\n **/\n alpha: 1,\n\n /**\n * Fragment source for the Multiply program\n */\n fragmentSource: {\n multiply: 'gl_FragColor.rgb *= uColor.rgb;\\n',\n screen: 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\\n',\n add: 'gl_FragColor.rgb += uColor.rgb;\\n',\n diff: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\\n',\n subtract: 'gl_FragColor.rgb -= uColor.rgb;\\n',\n lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\\n',\n darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\\n',\n exclusion: 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\\n',\n overlay: 'if (uColor.r < 0.5) {\\n' +\n 'gl_FragColor.r *= 2.0 * uColor.r;\\n' +\n '} else {\\n' +\n 'gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\\n' +\n '}\\n' +\n 'if (uColor.g < 0.5) {\\n' +\n 'gl_FragColor.g *= 2.0 * uColor.g;\\n' +\n '} else {\\n' +\n 'gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\\n' +\n '}\\n' +\n 'if (uColor.b < 0.5) {\\n' +\n 'gl_FragColor.b *= 2.0 * uColor.b;\\n' +\n '} else {\\n' +\n 'gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\\n' +\n '}\\n',\n tint: 'gl_FragColor.rgb *= (1.0 - uColor.a);\\n' +\n 'gl_FragColor.rgb += uColor.rgb;\\n',\n },\n\n /**\n * build the fragment source for the filters, joining the common part with\n * the specific one.\n * @param {String} mode the mode of the filter, a key of this.fragmentSource\n * @return {String} the source to be compiled\n * @private\n */\n buildSource: function(mode) {\n return 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec4 uColor;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'gl_FragColor = color;\\n' +\n 'if (color.a > 0.0) {\\n' +\n this.fragmentSource[mode] +\n '}\\n' +\n '}';\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var cacheKey = this.type + '_' + this.mode, shaderSource;\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n shaderSource = this.buildSource(this.mode);\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, iLen = data.length,\n tr, tg, tb,\n r, g, b,\n source, alpha1 = 1 - this.alpha;\n\n source = new fabric.Color(this.color).getSource();\n tr = source[0] * this.alpha;\n tg = source[1] * this.alpha;\n tb = source[2] * this.alpha;\n\n for (var i = 0; i < iLen; i += 4) {\n\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = r * tr / 255;\n data[i + 1] = g * tg / 255;\n data[i + 2] = b * tb / 255;\n break;\n case 'screen':\n data[i] = 255 - (255 - r) * (255 - tr) / 255;\n data[i + 1] = 255 - (255 - g) * (255 - tg) / 255;\n data[i + 2] = 255 - (255 - b) * (255 - tb) / 255;\n break;\n case 'add':\n data[i] = r + tr;\n data[i + 1] = g + tg;\n data[i + 2] = b + tb;\n break;\n case 'diff':\n case 'difference':\n data[i] = Math.abs(r - tr);\n data[i + 1] = Math.abs(g - tg);\n data[i + 2] = Math.abs(b - tb);\n break;\n case 'subtract':\n data[i] = r - tr;\n data[i + 1] = g - tg;\n data[i + 2] = b - tb;\n break;\n case 'darken':\n data[i] = Math.min(r, tr);\n data[i + 1] = Math.min(g, tg);\n data[i + 2] = Math.min(b, tb);\n break;\n case 'lighten':\n data[i] = Math.max(r, tr);\n data[i + 1] = Math.max(g, tg);\n data[i + 2] = Math.max(b, tb);\n break;\n case 'overlay':\n data[i] = tr < 128 ? (2 * r * tr / 255) : (255 - 2 * (255 - r) * (255 - tr) / 255);\n data[i + 1] = tg < 128 ? (2 * g * tg / 255) : (255 - 2 * (255 - g) * (255 - tg) / 255);\n data[i + 2] = tb < 128 ? (2 * b * tb / 255) : (255 - 2 * (255 - b) * (255 - tb) / 255);\n break;\n case 'exclusion':\n data[i] = tr + r - ((2 * tr * r) / 255);\n data[i + 1] = tg + g - ((2 * tg * g) / 255);\n data[i + 2] = tb + b - ((2 * tb * b) / 255);\n break;\n case 'tint':\n data[i] = tr + r * alpha1;\n data[i + 1] = tg + g * alpha1;\n data[i + 2] = tb + b * alpha1;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uColor: gl.getUniformLocation(program, 'uColor'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var source = new fabric.Color(this.color).getSource();\n source[0] = this.alpha * source[0] / 255;\n source[1] = this.alpha * source[1] / 255;\n source[2] = this.alpha * source[2] / 255;\n source[3] = this.alpha;\n gl.uniform4fv(uniformLocations.uColor, source);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return {\n type: this.type,\n color: this.color,\n mode: this.mode,\n alpha: this.alpha\n };\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.BlendColor} Instance of fabric.Image.filters.BlendColor\n */\n fabric.Image.filters.BlendColor.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n 'use strict';\n\n var fabric = global.fabric,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Image Blend filter class\n * @class fabric.Image.filter.BlendImage\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @example\n * var filter = new fabric.Image.filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * var filter = new fabric.Image.filters.BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply',\n * alpha: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n\n filters.BlendImage = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.BlendImage.prototype */ {\n type: 'BlendImage',\n\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n **/\n image: null,\n\n /**\n * Blend mode for the filter: one of multiply, add, diff, screen, subtract,\n * darken, lighten, overlay, exclusion, tint.\n **/\n mode: 'multiply',\n\n /**\n * alpha value. represent the strength of the blend image operation.\n * not implemented.\n **/\n alpha: 1,\n\n vertexSource: 'attribute vec2 aPosition;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'varying vec2 vTexCoord2;\\n' +\n 'uniform mat3 uTransformMatrix;\\n' +\n 'void main() {\\n' +\n 'vTexCoord = aPosition;\\n' +\n 'vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\\n' +\n 'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\\n' +\n '}',\n\n /**\n * Fragment source for the Multiply program\n */\n fragmentSource: {\n multiply: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform sampler2D uImage;\\n' +\n 'uniform vec4 uColor;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'varying vec2 vTexCoord2;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'vec4 color2 = texture2D(uImage, vTexCoord2);\\n' +\n 'color.rgba *= color2.rgba;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n mask: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform sampler2D uImage;\\n' +\n 'uniform vec4 uColor;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'varying vec2 vTexCoord2;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'vec4 color2 = texture2D(uImage, vTexCoord2);\\n' +\n 'color.a = color2.a;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var cacheKey = this.type + '_' + this.mode;\n var shaderSource = this.fragmentSource[this.mode];\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n applyToWebGL: function(options) {\n // load texture to blend.\n var gl = options.context,\n texture = this.createTexture(options.filterBackend, this.image);\n this.bindAdditionalTexture(gl, texture, gl.TEXTURE1);\n this.callSuper('applyToWebGL', options);\n this.unbindAdditionalTexture(gl, gl.TEXTURE1);\n },\n\n createTexture: function(backend, image) {\n return backend.getCachedTexture(image.cacheKey, image._element);\n },\n\n /**\n * Calculate a transformMatrix to adapt the image to blend over\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n calculateMatrix: function() {\n var image = this.image,\n width = image._element.width,\n height = image._element.height;\n return [\n 1 / image.scaleX, 0, 0,\n 0, 1 / image.scaleY, 0,\n -image.left / width, -image.top / height, 1\n ];\n },\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n resources = options.filterBackend.resources,\n data = imageData.data, iLen = data.length,\n width = imageData.width,\n height = imageData.height,\n tr, tg, tb, ta,\n r, g, b, a,\n canvas1, context, image = this.image, blendData;\n\n if (!resources.blendImage) {\n resources.blendImage = fabric.util.createCanvasElement();\n }\n canvas1 = resources.blendImage;\n context = canvas1.getContext('2d');\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas1.width = width;\n canvas1.height = height;\n }\n else {\n context.clearRect(0, 0, width, height);\n }\n context.setTransform(image.scaleX, 0, 0, image.scaleY, image.left, image.top);\n context.drawImage(image._element, 0, 0, width, height);\n blendData = context.getImageData(0, 0, width, height).data;\n for (var i = 0; i < iLen; i += 4) {\n\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n a = data[i + 3];\n\n tr = blendData[i];\n tg = blendData[i + 1];\n tb = blendData[i + 2];\n ta = blendData[i + 3];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = r * tr / 255;\n data[i + 1] = g * tg / 255;\n data[i + 2] = b * tb / 255;\n data[i + 3] = a * ta / 255;\n break;\n case 'mask':\n data[i + 3] = ta;\n break;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uTransformMatrix: gl.getUniformLocation(program, 'uTransformMatrix'),\n uImage: gl.getUniformLocation(program, 'uImage'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var matrix = this.calculateMatrix();\n gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1.\n gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return {\n type: this.type,\n image: this.image && this.image.toObject(),\n mode: this.mode,\n alpha: this.alpha\n };\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} callback to be invoked after filter creation\n * @return {fabric.Image.filters.BlendImage} Instance of fabric.Image.filters.BlendImage\n */\n fabric.Image.filters.BlendImage.fromObject = function(object, callback) {\n fabric.Image.fromObject(object.image, function(image) {\n var options = fabric.util.object.clone(object);\n options.image = image;\n callback(new fabric.Image.filters.BlendImage(options));\n });\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }), pow = Math.pow, floor = Math.floor,\n sqrt = Math.sqrt, abs = Math.abs, round = Math.round, sin = Math.sin,\n ceil = Math.ceil,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Resize image filter class\n * @class fabric.Image.filters.Resize\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Resize();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\n filters.Resize = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Resize.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Resize',\n\n /**\n * Resize type\n * for webgl resizeType is just lanczos, for canvas2d can be:\n * bilinear, hermite, sliceHack, lanczos.\n * @param {String} resizeType\n * @default\n */\n resizeType: 'hermite',\n\n /**\n * Scale factor for resizing, x axis\n * @param {Number} scaleX\n * @default\n */\n scaleX: 1,\n\n /**\n * Scale factor for resizing, y axis\n * @param {Number} scaleY\n * @default\n */\n scaleY: 1,\n\n /**\n * LanczosLobes parameter for lanczos filter, valid for resizeType lanczos\n * @param {Number} lanczosLobes\n * @default\n */\n lanczosLobes: 3,\n\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uDelta: gl.getUniformLocation(program, 'uDelta'),\n uTaps: gl.getUniformLocation(program, 'uTaps'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform2fv(uniformLocations.uDelta, this.horizontal ? [1 / this.width, 0] : [0, 1 / this.height]);\n gl.uniform1fv(uniformLocations.uTaps, this.taps);\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var filterWindow = this.getFilterWindow(), cacheKey = this.type + '_' + filterWindow;\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n var fragmentShader = this.generateShader(filterWindow);\n options.programCache[cacheKey] = this.createProgram(options.context, fragmentShader);\n }\n return options.programCache[cacheKey];\n },\n\n getFilterWindow: function() {\n var scale = this.tempScale;\n return Math.ceil(this.lanczosLobes / scale);\n },\n\n getTaps: function() {\n var lobeFunction = this.lanczosCreate(this.lanczosLobes), scale = this.tempScale,\n filterWindow = this.getFilterWindow(), taps = new Array(filterWindow);\n for (var i = 1; i <= filterWindow; i++) {\n taps[i - 1] = lobeFunction(i * scale);\n }\n return taps;\n },\n\n /**\n * Generate vertex and shader sources from the necessary steps numbers\n * @param {Number} filterWindow\n */\n generateShader: function(filterWindow) {\n var offsets = new Array(filterWindow),\n fragmentShader = this.fragmentSourceTOP, filterWindow;\n\n for (var i = 1; i <= filterWindow; i++) {\n offsets[i - 1] = i + '.0 * uDelta';\n }\n\n fragmentShader += 'uniform float uTaps[' + filterWindow + '];\\n';\n fragmentShader += 'void main() {\\n';\n fragmentShader += ' vec4 color = texture2D(uTexture, vTexCoord);\\n';\n fragmentShader += ' float sum = 1.0;\\n';\n\n offsets.forEach(function(offset, i) {\n fragmentShader += ' color += texture2D(uTexture, vTexCoord + ' + offset + ') * uTaps[' + i + '];\\n';\n fragmentShader += ' color += texture2D(uTexture, vTexCoord - ' + offset + ') * uTaps[' + i + '];\\n';\n fragmentShader += ' sum += 2.0 * uTaps[' + i + '];\\n';\n });\n fragmentShader += ' gl_FragColor = color / sum;\\n';\n fragmentShader += '}';\n return fragmentShader;\n },\n\n fragmentSourceTOP: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec2 uDelta;\\n' +\n 'varying vec2 vTexCoord;\\n',\n\n /**\n * Apply the resize filter to the image\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo: function(options) {\n if (options.webgl) {\n options.passes++;\n this.width = options.sourceWidth;\n this.horizontal = true;\n this.dW = Math.round(this.width * this.scaleX);\n this.dH = options.sourceHeight;\n this.tempScale = this.dW / this.width;\n this.taps = this.getTaps();\n options.destinationWidth = this.dW;\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n options.sourceWidth = options.destinationWidth;\n\n this.height = options.sourceHeight;\n this.horizontal = false;\n this.dH = Math.round(this.height * this.scaleY);\n this.tempScale = this.dH / this.height;\n this.taps = this.getTaps();\n options.destinationHeight = this.dH;\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n options.sourceHeight = options.destinationHeight;\n }\n else {\n this.applyTo2d(options);\n }\n },\n\n isNeutralState: function() {\n return this.scaleX === 1 && this.scaleY === 1;\n },\n\n lanczosCreate: function(lobes) {\n return function(x) {\n if (x >= lobes || x <= -lobes) {\n return 0.0;\n }\n if (x < 1.19209290E-07 && x > -1.19209290E-07) {\n return 1.0;\n }\n x *= Math.PI;\n var xx = x / lobes;\n return (sin(x) / x) * sin(xx) / xx;\n };\n },\n\n /**\n * Applies filter to canvas element\n * @memberOf fabric.Image.filters.Resize.prototype\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} scaleX\n * @param {Number} scaleY\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n scaleX = this.scaleX,\n scaleY = this.scaleY;\n\n this.rcpScaleX = 1 / scaleX;\n this.rcpScaleY = 1 / scaleY;\n\n var oW = imageData.width, oH = imageData.height,\n dW = round(oW * scaleX), dH = round(oH * scaleY),\n newData;\n\n if (this.resizeType === 'sliceHack') {\n newData = this.sliceByTwo(options, oW, oH, dW, dH);\n }\n else if (this.resizeType === 'hermite') {\n newData = this.hermiteFastResize(options, oW, oH, dW, dH);\n }\n else if (this.resizeType === 'bilinear') {\n newData = this.bilinearFiltering(options, oW, oH, dW, dH);\n }\n else if (this.resizeType === 'lanczos') {\n newData = this.lanczosResize(options, oW, oH, dW, dH);\n }\n options.imageData = newData;\n },\n\n /**\n * Filter sliceByTwo\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n sliceByTwo: function(options, oW, oH, dW, dH) {\n var imageData = options.imageData,\n mult = 0.5, doneW = false, doneH = false, stepW = oW * mult,\n stepH = oH * mult, resources = fabric.filterBackend.resources,\n tmpCanvas, ctx, sX = 0, sY = 0, dX = oW, dY = 0;\n if (!resources.sliceByTwo) {\n resources.sliceByTwo = document.createElement('canvas');\n }\n tmpCanvas = resources.sliceByTwo;\n if (tmpCanvas.width < oW * 1.5 || tmpCanvas.height < oH) {\n tmpCanvas.width = oW * 1.5;\n tmpCanvas.height = oH;\n }\n ctx = tmpCanvas.getContext('2d');\n ctx.clearRect(0, 0, oW * 1.5, oH);\n ctx.putImageData(imageData, 0, 0);\n\n dW = floor(dW);\n dH = floor(dH);\n\n while (!doneW || !doneH) {\n oW = stepW;\n oH = stepH;\n if (dW < floor(stepW * mult)) {\n stepW = floor(stepW * mult);\n }\n else {\n stepW = dW;\n doneW = true;\n }\n if (dH < floor(stepH * mult)) {\n stepH = floor(stepH * mult);\n }\n else {\n stepH = dH;\n doneH = true;\n }\n ctx.drawImage(tmpCanvas, sX, sY, oW, oH, dX, dY, stepW, stepH);\n sX = dX;\n sY = dY;\n dY += stepH;\n }\n return ctx.getImageData(sX, sY, dW, dH);\n },\n\n /**\n * Filter lanczosResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n lanczosResize: function(options, oW, oH, dW, dH) {\n\n function process(u) {\n var v, i, weight, idx, a, red, green,\n blue, alpha, fX, fY;\n center.x = (u + 0.5) * ratioX;\n icenter.x = floor(center.x);\n for (v = 0; v < dH; v++) {\n center.y = (v + 0.5) * ratioY;\n icenter.y = floor(center.y);\n a = 0; red = 0; green = 0; blue = 0; alpha = 0;\n for (i = icenter.x - range2X; i <= icenter.x + range2X; i++) {\n if (i < 0 || i >= oW) {\n continue;\n }\n fX = floor(1000 * abs(i - center.x));\n if (!cacheLanc[fX]) {\n cacheLanc[fX] = { };\n }\n for (var j = icenter.y - range2Y; j <= icenter.y + range2Y; j++) {\n if (j < 0 || j >= oH) {\n continue;\n }\n fY = floor(1000 * abs(j - center.y));\n if (!cacheLanc[fX][fY]) {\n cacheLanc[fX][fY] = lanczos(sqrt(pow(fX * rcpRatioX, 2) + pow(fY * rcpRatioY, 2)) / 1000);\n }\n weight = cacheLanc[fX][fY];\n if (weight > 0) {\n idx = (j * oW + i) * 4;\n a += weight;\n red += weight * srcData[idx];\n green += weight * srcData[idx + 1];\n blue += weight * srcData[idx + 2];\n alpha += weight * srcData[idx + 3];\n }\n }\n }\n idx = (v * dW + u) * 4;\n destData[idx] = red / a;\n destData[idx + 1] = green / a;\n destData[idx + 2] = blue / a;\n destData[idx + 3] = alpha / a;\n }\n\n if (++u < dW) {\n return process(u);\n }\n else {\n return destImg;\n }\n }\n\n var srcData = options.imageData.data,\n destImg = options.ctx.createImageData(dW, dH),\n destData = destImg.data,\n lanczos = this.lanczosCreate(this.lanczosLobes),\n ratioX = this.rcpScaleX, ratioY = this.rcpScaleY,\n rcpRatioX = 2 / this.rcpScaleX, rcpRatioY = 2 / this.rcpScaleY,\n range2X = ceil(ratioX * this.lanczosLobes / 2),\n range2Y = ceil(ratioY * this.lanczosLobes / 2),\n cacheLanc = { }, center = { }, icenter = { };\n\n return process(0);\n },\n\n /**\n * bilinearFiltering\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n bilinearFiltering: function(options, oW, oH, dW, dH) {\n var a, b, c, d, x, y, i, j, xDiff, yDiff, chnl,\n color, offset = 0, origPix, ratioX = this.rcpScaleX,\n ratioY = this.rcpScaleY,\n w4 = 4 * (oW - 1), img = options.imageData,\n pixels = img.data, destImage = options.ctx.createImageData(dW, dH),\n destPixels = destImage.data;\n for (i = 0; i < dH; i++) {\n for (j = 0; j < dW; j++) {\n x = floor(ratioX * j);\n y = floor(ratioY * i);\n xDiff = ratioX * j - x;\n yDiff = ratioY * i - y;\n origPix = 4 * (y * oW + x);\n\n for (chnl = 0; chnl < 4; chnl++) {\n a = pixels[origPix + chnl];\n b = pixels[origPix + 4 + chnl];\n c = pixels[origPix + w4 + chnl];\n d = pixels[origPix + w4 + 4 + chnl];\n color = a * (1 - xDiff) * (1 - yDiff) + b * xDiff * (1 - yDiff) +\n c * yDiff * (1 - xDiff) + d * xDiff * yDiff;\n destPixels[offset++] = color;\n }\n }\n }\n return destImage;\n },\n\n /**\n * hermiteFastResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n hermiteFastResize: function(options, oW, oH, dW, dH) {\n var ratioW = this.rcpScaleX, ratioH = this.rcpScaleY,\n ratioWHalf = ceil(ratioW / 2),\n ratioHHalf = ceil(ratioH / 2),\n img = options.imageData, data = img.data,\n img2 = options.ctx.createImageData(dW, dH), data2 = img2.data;\n for (var j = 0; j < dH; j++) {\n for (var i = 0; i < dW; i++) {\n var x2 = (i + j * dW) * 4, weight = 0, weights = 0, weightsAlpha = 0,\n gxR = 0, gxG = 0, gxB = 0, gxA = 0, centerY = (j + 0.5) * ratioH;\n for (var yy = floor(j * ratioH); yy < (j + 1) * ratioH; yy++) {\n var dy = abs(centerY - (yy + 0.5)) / ratioHHalf,\n centerX = (i + 0.5) * ratioW, w0 = dy * dy;\n for (var xx = floor(i * ratioW); xx < (i + 1) * ratioW; xx++) {\n var dx = abs(centerX - (xx + 0.5)) / ratioWHalf,\n w = sqrt(w0 + dx * dx);\n /* eslint-disable max-depth */\n if (w > 1 && w < -1) {\n continue;\n }\n //hermite filter\n weight = 2 * w * w * w - 3 * w * w + 1;\n if (weight > 0) {\n dx = 4 * (xx + yy * oW);\n //alpha\n gxA += weight * data[dx + 3];\n weightsAlpha += weight;\n //colors\n if (data[dx + 3] < 255) {\n weight = weight * data[dx + 3] / 250;\n }\n gxR += weight * data[dx];\n gxG += weight * data[dx + 1];\n gxB += weight * data[dx + 2];\n weights += weight;\n }\n /* eslint-enable max-depth */\n }\n }\n data2[x2] = gxR / weights;\n data2[x2 + 1] = gxG / weights;\n data2[x2 + 2] = gxB / weights;\n data2[x2 + 3] = gxA / weightsAlpha;\n }\n }\n return img2;\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return {\n type: this.type,\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n resizeType: this.resizeType,\n lanczosLobes: this.lanczosLobes\n };\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Resize} Instance of fabric.Image.filters.Resize\n */\n fabric.Image.filters.Resize.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Contrast filter class\n * @class fabric.Image.filters.Contrast\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Contrast#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Contrast({\n * contrast: 40\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Contrast = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Contrast.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Contrast',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uContrast;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\\n' +\n 'color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n contrast: 0,\n\n mainParameter: 'contrast',\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.Contrast.prototype\n * @param {Object} [options] Options object\n * @param {Number} [options.contrast=0] Value to contrast the image up (-1...1)\n */\n\n /**\n * Apply the Contrast operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n if (this.contrast === 0) {\n return;\n }\n var imageData = options.imageData, i, len,\n data = imageData.data, len = data.length,\n contrast = Math.floor(this.contrast * 255),\n contrastF = 259 * (contrast + 255) / (255 * (259 - contrast));\n\n for (i = 0; i < len; i += 4) {\n data[i] = contrastF * (data[i] - 128) + 128;\n data[i + 1] = contrastF * (data[i + 1] - 128) + 128;\n data[i + 2] = contrastF * (data[i + 2] - 128) + 128;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uContrast: gl.getUniformLocation(program, 'uContrast'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uContrast, this.contrast);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Contrast} Instance of fabric.Image.filters.Contrast\n */\n fabric.Image.filters.Contrast.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Saturate filter class\n * @class fabric.Image.filters.Saturation\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Saturation#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Saturation({\n * saturation: 100\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Saturation = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Saturation.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Saturation',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uSaturation;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'float rgMax = max(color.r, color.g);\\n' +\n 'float rgbMax = max(rgMax, color.b);\\n' +\n 'color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\\n' +\n 'color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\\n' +\n 'color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n saturation: 0,\n\n mainParameter: 'saturation',\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.Saturate.prototype\n * @param {Object} [options] Options object\n * @param {Number} [options.saturate=0] Value to saturate the image (-1...1)\n */\n\n /**\n * Apply the Saturation operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n if (this.saturation === 0) {\n return;\n }\n var imageData = options.imageData,\n data = imageData.data, len = data.length,\n adjust = -this.saturation, i, max;\n\n for (i = 0; i < len; i += 4) {\n max = Math.max(data[i], data[i + 1], data[i + 2]);\n data[i] += max !== data[i] ? (max - data[i]) * adjust : 0;\n data[i + 1] += max !== data[i + 1] ? (max - data[i + 1]) * adjust : 0;\n data[i + 2] += max !== data[i + 2] ? (max - data[i + 2]) * adjust : 0;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uSaturation: gl.getUniformLocation(program, 'uSaturation'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uSaturation, -this.saturation);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Saturation} Instance of fabric.Image.filters.Saturate\n */\n fabric.Image.filters.Saturation.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Blur filter class\n * @class fabric.Image.filters.Blur\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Blur#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Blur({\n * blur: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.Blur = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blur.prototype */ {\n\n type: 'Blur',\n\n /*\n'gl_FragColor = vec4(0.0);',\n'gl_FragColor += texture2D(texture, vTexCoord + -7 * uDelta)*0.0044299121055113265;',\n'gl_FragColor += texture2D(texture, vTexCoord + -6 * uDelta)*0.00895781211794;',\n'gl_FragColor += texture2D(texture, vTexCoord + -5 * uDelta)*0.0215963866053;',\n'gl_FragColor += texture2D(texture, vTexCoord + -4 * uDelta)*0.0443683338718;',\n'gl_FragColor += texture2D(texture, vTexCoord + -3 * uDelta)*0.0776744219933;',\n'gl_FragColor += texture2D(texture, vTexCoord + -2 * uDelta)*0.115876621105;',\n'gl_FragColor += texture2D(texture, vTexCoord + -1 * uDelta)*0.147308056121;',\n'gl_FragColor += texture2D(texture, vTexCoord )*0.159576912161;',\n'gl_FragColor += texture2D(texture, vTexCoord + 1 * uDelta)*0.147308056121;',\n'gl_FragColor += texture2D(texture, vTexCoord + 2 * uDelta)*0.115876621105;',\n'gl_FragColor += texture2D(texture, vTexCoord + 3 * uDelta)*0.0776744219933;',\n'gl_FragColor += texture2D(texture, vTexCoord + 4 * uDelta)*0.0443683338718;',\n'gl_FragColor += texture2D(texture, vTexCoord + 5 * uDelta)*0.0215963866053;',\n'gl_FragColor += texture2D(texture, vTexCoord + 6 * uDelta)*0.00895781211794;',\n'gl_FragColor += texture2D(texture, vTexCoord + 7 * uDelta)*0.0044299121055113265;',\n*/\n\n /* eslint-disable max-len */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec2 uDelta;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'const float nSamples = 15.0;\\n' +\n 'vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\\n' +\n 'float random(vec3 scale) {\\n' +\n /* use the fragment position for a different seed per-pixel */\n 'return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\\n' +\n '}\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0.0);\\n' +\n 'float total = 0.0;\\n' +\n 'float offset = random(v3offset);\\n' +\n 'for (float t = -nSamples; t <= nSamples; t++) {\\n' +\n 'float percent = (t + offset - 0.5) / nSamples;\\n' +\n 'float weight = 1.0 - abs(percent);\\n' +\n 'color += texture2D(uTexture, vTexCoord + uDelta * percent) * weight;\\n' +\n 'total += weight;\\n' +\n '}\\n' +\n 'gl_FragColor = color / total;\\n' +\n '}',\n /* eslint-enable max-len */\n\n /**\n * blur value, in percentage of image dimensions.\n * specific to keep the image blur constant at different resolutions\n * range bewteen 0 and 1.\n */\n blur: 0,\n\n mainParameter: 'blur',\n\n applyTo: function(options) {\n if (options.webgl) {\n // this aspectRatio is used to give the same blur to vertical and horizontal\n this.aspectRatio = options.sourceWidth / options.sourceHeight;\n options.passes++;\n this._setupFrameBuffer(options);\n this.horizontal = true;\n this.applyToWebGL(options);\n this._swapTextures(options);\n this._setupFrameBuffer(options);\n this.horizontal = false;\n this.applyToWebGL(options);\n this._swapTextures(options);\n }\n else {\n this.applyTo2d(options);\n }\n },\n\n applyTo2d: function(options) {\n // paint canvasEl with current image data.\n //options.ctx.putImageData(options.imageData, 0, 0);\n options.imageData = this.simpleBlur(options);\n },\n\n simpleBlur: function(options) {\n var resources = options.filterBackend.resources, canvas1, canvas2,\n width = options.imageData.width,\n height = options.imageData.height;\n\n if (!resources.blurLayer1) {\n resources.blurLayer1 = fabric.util.createCanvasElement();\n resources.blurLayer2 = fabric.util.createCanvasElement();\n }\n canvas1 = resources.blurLayer1;\n canvas2 = resources.blurLayer2;\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas2.width = canvas1.width = width;\n canvas2.height = canvas1.height = height;\n }\n var ctx1 = canvas1.getContext('2d'),\n ctx2 = canvas2.getContext('2d'),\n nSamples = 15,\n random, percent, j, i,\n blur = this.blur * 0.06 * 0.5;\n\n // load first canvas\n ctx1.putImageData(options.imageData, 0, 0);\n ctx2.clearRect(0, 0, width, height);\n\n for (i = -nSamples; i <= nSamples; i++) {\n random = (Math.random() - 0.5) / 4;\n percent = i / nSamples;\n j = blur * percent * width + random;\n ctx2.globalAlpha = 1 - Math.abs(percent);\n ctx2.drawImage(canvas1, j, random);\n ctx1.drawImage(canvas2, 0, 0);\n ctx2.globalAlpha = 1;\n ctx2.clearRect(0, 0, canvas2.width, canvas2.height);\n }\n for (i = -nSamples; i <= nSamples; i++) {\n random = (Math.random() - 0.5) / 4;\n percent = i / nSamples;\n j = blur * percent * height + random;\n ctx2.globalAlpha = 1 - Math.abs(percent);\n ctx2.drawImage(canvas1, random, j);\n ctx1.drawImage(canvas2, 0, 0);\n ctx2.globalAlpha = 1;\n ctx2.clearRect(0, 0, canvas2.width, canvas2.height);\n }\n options.ctx.drawImage(canvas1, 0, 0);\n var newImageData = options.ctx.getImageData(0, 0, canvas1.width, canvas1.height);\n ctx1.globalAlpha = 1;\n ctx1.clearRect(0, 0, canvas1.width, canvas1.height);\n return newImageData;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n delta: gl.getUniformLocation(program, 'uDelta'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var delta = this.chooseRightDelta();\n gl.uniform2fv(uniformLocations.delta, delta);\n },\n\n /**\n * choose right value of image percentage to blur with\n * @returns {Array} a numeric array with delta values\n */\n chooseRightDelta: function() {\n var blurScale = 1, delta = [0, 0], blur;\n if (this.horizontal) {\n if (this.aspectRatio > 1) {\n // image is wide, i want to shrink radius horizontal\n blurScale = 1 / this.aspectRatio;\n }\n }\n else {\n if (this.aspectRatio < 1) {\n // image is tall, i want to shrink radius vertical\n blurScale = this.aspectRatio;\n }\n }\n blur = blurScale * this.blur * 0.12;\n if (this.horizontal) {\n delta[0] = blur;\n }\n else {\n delta[1] = blur;\n }\n return delta;\n },\n });\n\n /**\n * Deserialize a JSON definition of a BlurFilter into a concrete instance.\n */\n filters.Blur.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Gamma filter class\n * @class fabric.Image.filters.Gamma\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Gamma#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Gamma({\n * brightness: 200\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Gamma = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Gamma.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Gamma',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec3 uGamma;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'vec3 correction = (1.0 / uGamma);\\n' +\n 'color.r = pow(color.r, correction.r);\\n' +\n 'color.g = pow(color.g, correction.g);\\n' +\n 'color.b = pow(color.b, correction.b);\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.rgb *= color.a;\\n' +\n '}',\n\n /**\n * Gamma array value, from 0.01 to 2.2.\n * @param {Array} gamma\n * @default\n */\n gamma: [1, 1, 1],\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'gamma',\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n this.gamma = [1, 1, 1];\n filters.BaseFilter.prototype.initialize.call(this, options);\n },\n\n /**\n * Apply the Gamma operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData, data = imageData.data,\n gamma = this.gamma, len = data.length,\n rInv = 1 / gamma[0], gInv = 1 / gamma[1],\n bInv = 1 / gamma[2], i;\n\n if (!this.rVals) {\n // eslint-disable-next-line\n this.rVals = new Uint8Array(256);\n // eslint-disable-next-line\n this.gVals = new Uint8Array(256);\n // eslint-disable-next-line\n this.bVals = new Uint8Array(256);\n }\n\n // This is an optimization - pre-compute a look-up table for each color channel\n // instead of performing these pow calls for each pixel in the image.\n for (i = 0, len = 256; i < len; i++) {\n this.rVals[i] = Math.pow(i / 255, rInv) * 255;\n this.gVals[i] = Math.pow(i / 255, gInv) * 255;\n this.bVals[i] = Math.pow(i / 255, bInv) * 255;\n }\n for (i = 0, len = data.length; i < len; i += 4) {\n data[i] = this.rVals[data[i]];\n data[i + 1] = this.gVals[data[i + 1]];\n data[i + 2] = this.bVals[data[i + 2]];\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uGamma: gl.getUniformLocation(program, 'uGamma'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform3fv(uniformLocations.uGamma, this.gamma);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Gamma} Instance of fabric.Image.filters.Gamma\n */\n fabric.Image.filters.Gamma.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * A container class that knows how to apply a sequence of filters to an input image.\n */\n filters.Composed = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Composed.prototype */ {\n\n type: 'Composed',\n\n /**\n * A non sparse array of filters to apply\n */\n subFilters: [],\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n // create a new array instead mutating the prototype with push\n this.subFilters = this.subFilters.slice(0);\n },\n\n /**\n * Apply this container's filters to the input image provided.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be applied.\n */\n applyTo: function(options) {\n options.passes += this.subFilters.length - 1;\n this.subFilters.forEach(function(filter) {\n filter.applyTo(options);\n });\n },\n\n /**\n * Serialize this filter into JSON.\n *\n * @returns {Object} A JSON representation of this filter.\n */\n toObject: function() {\n return fabric.util.object.extend(this.callSuper('toObject'), {\n subFilters: this.subFilters.map(function(filter) { return filter.toObject(); }),\n });\n },\n\n isNeutralState: function() {\n return !this.subFilters.some(function(filter) { return !filter.isNeutralState(); });\n }\n });\n\n /**\n * Deserialize a JSON definition of a ComposedFilter into a concrete instance.\n */\n fabric.Image.filters.Composed.fromObject = function(object, callback) {\n var filters = object.subFilters || [],\n subFilters = filters.map(function(filter) {\n return new fabric.Image.filters[filter.type](filter);\n }),\n instance = new fabric.Image.filters.Composed({ subFilters: subFilters });\n callback && callback(instance);\n return instance;\n };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * HueRotation filter class\n * @class fabric.Image.filters.HueRotation\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.HueRotation#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.HueRotation({\n * rotation: -0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.HueRotation = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.HueRotation.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'HueRotation',\n\n /**\n * HueRotation value, from -1 to 1.\n * the unit is radians\n * @param {Number} myParameter\n * @default\n */\n rotation: 0,\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'rotation',\n\n calculateMatrix: function() {\n var rad = this.rotation * Math.PI, cos = fabric.util.cos(rad), sin = fabric.util.sin(rad),\n aThird = 1 / 3, aThirdSqtSin = Math.sqrt(aThird) * sin, OneMinusCos = 1 - cos;\n this.matrix = [\n 1, 0, 0, 0, 0,\n 0, 1, 0, 0, 0,\n 0, 0, 1, 0, 0,\n 0, 0, 0, 1, 0\n ];\n this.matrix[0] = cos + OneMinusCos / 3;\n this.matrix[1] = aThird * OneMinusCos - aThirdSqtSin;\n this.matrix[2] = aThird * OneMinusCos + aThirdSqtSin;\n this.matrix[5] = aThird * OneMinusCos + aThirdSqtSin;\n this.matrix[6] = cos + aThird * OneMinusCos;\n this.matrix[7] = aThird * OneMinusCos - aThirdSqtSin;\n this.matrix[10] = aThird * OneMinusCos - aThirdSqtSin;\n this.matrix[11] = aThird * OneMinusCos + aThirdSqtSin;\n this.matrix[12] = cos + aThird * OneMinusCos;\n },\n\n /**\n * HueRotation isNeutralState implementation\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * @param {Object} options\n **/\n isNeutralState: function(options) {\n this.calculateMatrix();\n return filters.BaseFilter.prototype.isNeutralState.call(this, options);\n },\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo: function(options) {\n this.calculateMatrix();\n filters.BaseFilter.prototype.applyTo.call(this, options);\n },\n\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.HueRotation} Instance of fabric.Image.filters.HueRotation\n */\n fabric.Image.filters.HueRotation.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n clone = fabric.util.object.clone;\n\n if (fabric.Text) {\n fabric.warn('fabric.Text is already defined');\n return;\n }\n\n /**\n * Text class\n * @class fabric.Text\n * @extends fabric.Object\n * @return {fabric.Text} thisArg\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#text}\n * @see {@link fabric.Text#initialize} for constructor definition\n */\n fabric.Text = fabric.util.createClass(fabric.Object, /** @lends fabric.Text.prototype */ {\n\n /**\n * Properties which when set cause object to change dimensions\n * @type Array\n * @private\n */\n _dimensionAffectingProps: [\n 'fontSize',\n 'fontWeight',\n 'fontFamily',\n 'fontStyle',\n 'lineHeight',\n 'text',\n 'charSpacing',\n 'textAlign',\n 'styles',\n ],\n\n /**\n * @private\n */\n _reNewline: /\\r?\\n/,\n\n /**\n * Use this regular expression to filter for whitespaces that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n _reSpacesAndTabs: /[ \\t\\r]/g,\n\n /**\n * Use this regular expression to filter for whitespace that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n _reSpaceAndTab: /[ \\t\\r]/,\n\n /**\n * Use this regular expression to filter consecutive groups of non spaces.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n _reWords: /\\S+/g,\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'text',\n\n /**\n * Font size (in pixels)\n * @type Number\n * @default\n */\n fontSize: 40,\n\n /**\n * Font weight (e.g. bold, normal, 400, 600, 800)\n * @type {(Number|String)}\n * @default\n */\n fontWeight: 'normal',\n\n /**\n * Font family\n * @type String\n * @default\n */\n fontFamily: 'Times New Roman',\n\n /**\n * Text decoration underline.\n * @type Boolean\n * @default\n */\n underline: false,\n\n /**\n * Text decoration overline.\n * @type Boolean\n * @default\n */\n overline: false,\n\n /**\n * Text decoration linethrough.\n * @type Boolean\n * @default\n */\n linethrough: false,\n\n /**\n * Text alignment. Possible values: \"left\", \"center\", \"right\", \"justify\",\n * \"justify-left\", \"justify-center\" or \"justify-right\".\n * @type String\n * @default\n */\n textAlign: 'left',\n\n /**\n * Font style . Possible values: \"\", \"normal\", \"italic\" or \"oblique\".\n * @type String\n * @default\n */\n fontStyle: 'normal',\n\n /**\n * Line height\n * @type Number\n * @default\n */\n lineHeight: 1.16,\n\n /**\n * Superscript schema object (minimum overlap)\n * @type {Object}\n * @default\n */\n superscript: {\n size: 0.60, // fontSize factor\n baseline: -0.35 // baseline-shift factor (upwards)\n },\n\n /**\n * Subscript schema object (minimum overlap)\n * @type {Object}\n * @default\n */\n subscript: {\n size: 0.60, // fontSize factor\n baseline: 0.11 // baseline-shift factor (downwards)\n },\n\n /**\n * Background color of text lines\n * @type String\n * @default\n */\n textBackgroundColor: '',\n\n /**\n * List of properties to consider when checking if\n * state of an object is changed ({@link fabric.Object#hasStateChanged})\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: fabric.Object.prototype.stateProperties.concat('fontFamily',\n 'fontWeight',\n 'fontSize',\n 'text',\n 'underline',\n 'overline',\n 'linethrough',\n 'textAlign',\n 'fontStyle',\n 'lineHeight',\n 'textBackgroundColor',\n 'charSpacing',\n 'styles'),\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * @type Array\n */\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('fontFamily',\n 'fontWeight',\n 'fontSize',\n 'text',\n 'underline',\n 'overline',\n 'linethrough',\n 'textAlign',\n 'fontStyle',\n 'lineHeight',\n 'textBackgroundColor',\n 'charSpacing',\n 'styles'),\n\n /**\n * When defined, an object is rendered via stroke and this property specifies its color.\n * Backwards incompatibility note: This property was named \"strokeStyle\" until v1.1.6\n * @type String\n * @default\n */\n stroke: null,\n\n /**\n * Shadow object representing shadow of this shape.\n * Backwards incompatibility note: This property was named \"textShadow\" (String) until v1.2.11\n * @type fabric.Shadow\n * @default\n */\n shadow: null,\n\n /**\n * @private\n */\n _fontSizeFraction: 0.222,\n\n /**\n * @private\n */\n offsets: {\n underline: 0.10,\n linethrough: -0.315,\n overline: -0.88\n },\n\n /**\n * Text Line proportion to font Size (in pixels)\n * @type Number\n * @default\n */\n _fontSizeMult: 1.13,\n\n /**\n * additional space between characters\n * expressed in thousands of em unit\n * @type Number\n * @default\n */\n charSpacing: 0,\n\n /**\n * Object containing character styles - top-level properties -> line numbers,\n * 2nd-level properties - charater numbers\n * @type Object\n * @default\n */\n styles: null,\n\n /**\n * Reference to a context to measure text char or couple of chars\n * the cacheContext of the canvas will be used or a freshly created one if the object is not on canvas\n * once created it will be referenced on fabric._measuringContext to avoide creating a canvas for every\n * text object created.\n * @type {CanvasRenderingContext2D}\n * @default\n */\n _measuringContext: null,\n\n /**\n * Baseline shift, stlyes only, keep at 0 for the main text object\n * @type {Number}\n * @default\n */\n deltaY: 0,\n\n /**\n * Array of properties that define a style unit (of 'styles').\n * @type {Array}\n * @default\n */\n _styleProperties: [\n 'stroke',\n 'strokeWidth',\n 'fill',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'fontStyle',\n 'underline',\n 'overline',\n 'linethrough',\n 'deltaY',\n 'textBackgroundColor',\n ],\n\n /**\n * contains characters bounding boxes\n */\n __charBounds: [],\n\n /**\n * use this size when measuring text. To avoid IE11 rounding errors\n * @type {Number}\n * @default\n * @readonly\n * @private\n */\n CACHE_FONT_SIZE: 400,\n\n /**\n * contains the min text width to avoid getting 0\n * @type {Number}\n * @default\n */\n MIN_TEXT_WIDTH: 2,\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n * @return {fabric.Text} thisArg\n */\n initialize: function(text, options) {\n this.styles = options ? (options.styles || { }) : { };\n this.text = text;\n this.__skipDimension = true;\n this.callSuper('initialize', options);\n this.__skipDimension = false;\n this.initDimensions();\n this.setCoords();\n this.setupState({ propertySet: '_dimensionAffectingProps' });\n },\n\n /**\n * Return a contex for measurement of text string.\n * if created it gets stored for reuse\n * @param {String} text Text string\n * @param {Object} [options] Options object\n * @return {fabric.Text} thisArg\n */\n getMeasuringContext: function() {\n // if we did not return we have to measure something.\n if (!fabric._measuringContext) {\n fabric._measuringContext = this.canvas && this.canvas.contextCache ||\n fabric.util.createCanvasElement().getContext('2d');\n }\n return fabric._measuringContext;\n },\n\n /**\n * @private\n * Divides text into lines of text and lines of graphemes.\n */\n _splitText: function() {\n var newLines = this._splitTextIntoLines(this.text);\n this.textLines = newLines.lines;\n this._textLines = newLines.graphemeLines;\n this._unwrappedTextLines = newLines._unwrappedLines;\n this._text = newLines.graphemeText;\n return newLines;\n },\n\n /**\n * Initialize or update text dimensions.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n */\n initDimensions: function() {\n if (this.__skipDimension) {\n return;\n }\n this._splitText();\n this._clearCache();\n this.width = this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH;\n if (this.textAlign.indexOf('justify') !== -1) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n this.height = this.calcTextHeight();\n this.saveState({ propertySet: '_dimensionAffectingProps' });\n },\n\n /**\n * Enlarge space boxes and shift the others\n */\n enlargeSpaces: function() {\n var diffSpace, currentLineWidth, numberOfSpaces, accumulatedSpace, line, charBound, spaces;\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n if (this.textAlign !== 'justify' && (i === len - 1 || this.isEndOfWrapping(i))) {\n continue;\n }\n accumulatedSpace = 0;\n line = this._textLines[i];\n currentLineWidth = this.getLineWidth(i);\n if (currentLineWidth < this.width && (spaces = this.textLines[i].match(this._reSpacesAndTabs))) {\n numberOfSpaces = spaces.length;\n diffSpace = (this.width - currentLineWidth) / numberOfSpaces;\n for (var j = 0, jlen = line.length; j <= jlen; j++) {\n charBound = this.__charBounds[i][j];\n if (this._reSpaceAndTab.test(line[j])) {\n charBound.width += diffSpace;\n charBound.kernedWidth += diffSpace;\n charBound.left += accumulatedSpace;\n accumulatedSpace += diffSpace;\n }\n else {\n charBound.left += accumulatedSpace;\n }\n }\n }\n }\n },\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @return {Boolean}\n */\n isEndOfWrapping: function(lineIndex) {\n return lineIndex === this._textLines.length - 1;\n },\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * It return always for text and Itext.\n * @return Number\n */\n missingNewlineOffset: function() {\n return 1;\n },\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of text object\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @param {Object} dim.x width of object to be cached\n * @param {Object} dim.y height of object to be cached\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _getCacheCanvasDimensions: function() {\n var dims = this.callSuper('_getCacheCanvasDimensions');\n var fontSize = this.fontSize;\n dims.width += fontSize * dims.zoomX;\n dims.height += fontSize * dims.zoomY;\n return dims;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n this._setTextStyles(ctx);\n this._renderTextLinesBackground(ctx);\n this._renderTextDecoration(ctx, 'underline');\n this._renderText(ctx);\n this._renderTextDecoration(ctx, 'overline');\n this._renderTextDecoration(ctx, 'linethrough');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderText: function(ctx) {\n if (this.paintFirst === 'stroke') {\n this._renderTextStroke(ctx);\n this._renderTextFill(ctx);\n }\n else {\n this._renderTextFill(ctx);\n this._renderTextStroke(ctx);\n }\n },\n\n /**\n * Set the font parameter of the context with the object properties or with charStyle\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [charStyle] object with font style properties\n * @param {String} [charStyle.fontFamily] Font Family\n * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix )\n * @param {String} [charStyle.fontWeight] Font weight\n * @param {String} [charStyle.fontStyle] Font style (italic|normal)\n */\n _setTextStyles: function(ctx, charStyle, forMeasuring) {\n ctx.textBaseline = 'alphabetic';\n ctx.font = this._getFontDeclaration(charStyle, forMeasuring);\n },\n\n /**\n * calculate and return the text Width measuring each line.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {Number} Maximum width of fabric.Text object\n */\n calcTextWidth: function() {\n var maxWidth = this.getLineWidth(0);\n\n for (var i = 1, len = this._textLines.length; i < len; i++) {\n var currentLineWidth = this.getLineWidth(i);\n if (currentLineWidth > maxWidth) {\n maxWidth = currentLineWidth;\n }\n }\n return maxWidth;\n },\n\n /**\n * @private\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} line Text to render\n * @param {Number} left Left position of text\n * @param {Number} top Top position of text\n * @param {Number} lineIndex Index of a line in a text\n */\n _renderTextLine: function(method, ctx, line, left, top, lineIndex) {\n this._renderChars(method, ctx, line, left, top, lineIndex);\n },\n\n /**\n * Renders the text background for lines, taking care of style\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextLinesBackground: function(ctx) {\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) {\n return;\n }\n var lineTopOffset = 0, heightOfLine,\n lineLeftOffset, originalFill = ctx.fillStyle,\n line, lastColor,\n leftOffset = this._getLeftOffset(),\n topOffset = this._getTopOffset(),\n boxStart = 0, boxWidth = 0, charBox, currentColor;\n\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n heightOfLine = this.getHeightOfLine(i);\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor', i)) {\n lineTopOffset += heightOfLine;\n continue;\n }\n line = this._textLines[i];\n lineLeftOffset = this._getLineLeftOffset(i);\n boxWidth = 0;\n boxStart = 0;\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charBox = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (currentColor !== lastColor) {\n ctx.fillStyle = lastColor;\n lastColor && ctx.fillRect(\n leftOffset + lineLeftOffset + boxStart,\n topOffset + lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight\n );\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastColor = currentColor;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n }\n if (currentColor) {\n ctx.fillStyle = currentColor;\n ctx.fillRect(\n leftOffset + lineLeftOffset + boxStart,\n topOffset + lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight\n );\n }\n lineTopOffset += heightOfLine;\n }\n ctx.fillStyle = originalFill;\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n },\n\n /**\n * @private\n * @param {Object} decl style declaration for cache\n * @param {String} decl.fontFamily fontFamily\n * @param {String} decl.fontStyle fontStyle\n * @param {String} decl.fontWeight fontWeight\n * @return {Object} reference to cache\n */\n getFontCache: function(decl) {\n var fontFamily = decl.fontFamily.toLowerCase();\n if (!fabric.charWidthsCache[fontFamily]) {\n fabric.charWidthsCache[fontFamily] = { };\n }\n var cache = fabric.charWidthsCache[fontFamily],\n cacheProp = decl.fontStyle.toLowerCase() + '_' + (decl.fontWeight + '').toLowerCase();\n if (!cache[cacheProp]) {\n cache[cacheProp] = { };\n }\n return cache[cacheProp];\n },\n\n /**\n * apply all the character style to canvas for rendering\n * @private\n * @param {String} _char\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} [decl]\n */\n _applyCharStyles: function(method, ctx, lineIndex, charIndex, styleDeclaration) {\n\n this._setFillStyles(ctx, styleDeclaration);\n this._setStrokeStyles(ctx, styleDeclaration);\n\n ctx.font = this._getFontDeclaration(styleDeclaration);\n },\n\n /**\n * measure and return the width of a single character.\n * possibly overridden to accommodate different measure logic or\n * to hook some external lib for character measurement\n * @private\n * @param {String} _char, char to be measured\n * @param {Object} charStyle style of char to be measured\n * @param {String} [previousChar] previous char\n * @param {Object} [prevCharStyle] style of previous char\n */\n _measureChar: function(_char, charStyle, previousChar, prevCharStyle) {\n // first i try to return from cache\n var fontCache = this.getFontCache(charStyle), fontDeclaration = this._getFontDeclaration(charStyle),\n previousFontDeclaration = this._getFontDeclaration(prevCharStyle), couple = previousChar + _char,\n stylesAreEqual = fontDeclaration === previousFontDeclaration, width, coupleWidth, previousWidth,\n fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE, kernedWidth;\n\n if (previousChar && fontCache[previousChar] !== undefined) {\n previousWidth = fontCache[previousChar];\n }\n if (fontCache[_char] !== undefined) {\n kernedWidth = width = fontCache[_char];\n }\n if (stylesAreEqual && fontCache[couple] !== undefined) {\n coupleWidth = fontCache[couple];\n kernedWidth = coupleWidth - previousWidth;\n }\n if (width === undefined || previousWidth === undefined || coupleWidth === undefined) {\n var ctx = this.getMeasuringContext();\n // send a TRUE to specify measuring font size CACHE_FONT_SIZE\n this._setTextStyles(ctx, charStyle, true);\n }\n if (width === undefined) {\n kernedWidth = width = ctx.measureText(_char).width;\n fontCache[_char] = width;\n }\n if (previousWidth === undefined && stylesAreEqual && previousChar) {\n previousWidth = ctx.measureText(previousChar).width;\n fontCache[previousChar] = previousWidth;\n }\n if (stylesAreEqual && coupleWidth === undefined) {\n // we can measure the kerning couple and subtract the width of the previous character\n coupleWidth = ctx.measureText(couple).width;\n fontCache[couple] = coupleWidth;\n kernedWidth = coupleWidth - previousWidth;\n }\n return { width: width * fontMultiplier, kernedWidth: kernedWidth * fontMultiplier };\n },\n\n /**\n * Computes height of character at given position\n * @param {Number} line the line index number\n * @param {Number} _char the character index number\n * @return {Number} fontSize of the character\n */\n getHeightOfChar: function(line, _char) {\n return this.getValueOfPropertyAt(line, _char, 'fontSize');\n },\n\n /**\n * measure a text line measuring all characters.\n * @param {Number} lineIndex line number\n * @return {Number} Line width\n */\n measureLine: function(lineIndex) {\n var lineInfo = this._measureLine(lineIndex);\n if (this.charSpacing !== 0) {\n lineInfo.width -= this._getWidthOfCharSpacing();\n }\n if (lineInfo.width < 0) {\n lineInfo.width = 0;\n }\n return lineInfo;\n },\n\n /**\n * measure every grapheme of a line, populating __charBounds\n * @param {Number} lineIndex\n * @return {Object} object.width total width of characters\n * @return {Object} object.widthOfSpaces length of chars that match this._reSpacesAndTabs\n */\n _measureLine: function(lineIndex) {\n var width = 0, i, grapheme, line = this._textLines[lineIndex], prevGrapheme,\n graphemeInfo, numOfSpaces = 0, lineBounds = new Array(line.length);\n\n this.__charBounds[lineIndex] = lineBounds;\n for (i = 0; i < line.length; i++) {\n grapheme = line[i];\n graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme);\n lineBounds[i] = graphemeInfo;\n width += graphemeInfo.kernedWidth;\n prevGrapheme = grapheme;\n }\n // this latest bound box represent the last character of the line\n // to simplify cursor handling in interactive mode.\n lineBounds[i] = {\n left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0,\n width: 0,\n kernedWidth: 0,\n height: this.fontSize\n };\n return { width: width, numOfSpaces: numOfSpaces };\n },\n\n /**\n * Measure and return the info of a single grapheme.\n * needs the the info of previous graphemes already filled\n * @private\n * @param {String} grapheme to be measured\n * @param {Number} lineIndex index of the line where the char is\n * @param {Number} charIndex position in the line\n * @param {String} [prevGrapheme] character preceding the one to be measured\n */\n _getGraphemeBox: function(grapheme, lineIndex, charIndex, prevGrapheme, skipLeft) {\n var style = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n prevStyle = prevGrapheme ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1) : { },\n info = this._measureChar(grapheme, style, prevGrapheme, prevStyle),\n kernedWidth = info.kernedWidth,\n width = info.width, charSpacing;\n\n if (this.charSpacing !== 0) {\n charSpacing = this._getWidthOfCharSpacing();\n width += charSpacing;\n kernedWidth += charSpacing;\n }\n\n var box = {\n width: width,\n left: 0,\n height: style.fontSize,\n kernedWidth: kernedWidth,\n deltaY: style.deltaY,\n };\n if (charIndex > 0 && !skipLeft) {\n var previousBox = this.__charBounds[lineIndex][charIndex - 1];\n box.left = previousBox.left + previousBox.width + info.kernedWidth - info.width;\n }\n return box;\n },\n\n /**\n * Calculate height of line at 'lineIndex'\n * @param {Number} lineIndex index of line to calculate\n * @return {Number}\n */\n getHeightOfLine: function(lineIndex) {\n if (this.__lineHeights[lineIndex]) {\n return this.__lineHeights[lineIndex];\n }\n\n var line = this._textLines[lineIndex],\n // char 0 is measured before the line cycle because it nneds to char\n // emptylines\n maxHeight = this.getHeightOfChar(lineIndex, 0);\n for (var i = 1, len = line.length; i < len; i++) {\n maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight);\n }\n\n return this.__lineHeights[lineIndex] = maxHeight * this.lineHeight * this._fontSizeMult;\n },\n\n /**\n * Calculate text box height\n */\n calcTextHeight: function() {\n var lineHeight, height = 0;\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n lineHeight = this.getHeightOfLine(i);\n height += (i === len - 1 ? lineHeight / this.lineHeight : lineHeight);\n }\n return height;\n },\n\n /**\n * @private\n * @return {Number} Left offset\n */\n _getLeftOffset: function() {\n return -this.width / 2;\n },\n\n /**\n * @private\n * @return {Number} Top offset\n */\n _getTopOffset: function() {\n return -this.height / 2;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} filler fabric.Pattern or fabric.Gradient\n * @return {Object} offset.offsetX offset for text rendering\n * @return {Object} offset.offsetY offset for text rendering\n */\n _applyPatternGradientTransform: function(ctx, filler) {\n if (!filler || !filler.toLive) {\n return { offsetX: 0, offsetY: 0 };\n }\n var offsetX = -this.width / 2 + filler.offsetX || 0,\n offsetY = -this.height / 2 + filler.offsetY || 0;\n\n ctx.transform(1, 0, 0, 1, offsetX, offsetY);\n return { offsetX: offsetX, offsetY: offsetY };\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n */\n _renderTextCommon: function(ctx, method) {\n ctx.save();\n var lineHeights = 0, left = this._getLeftOffset(), top = this._getTopOffset(),\n offsets = this._applyPatternGradientTransform(ctx, method === 'fillText' ? this.fill : this.stroke);\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n var heightOfLine = this.getHeightOfLine(i),\n maxHeight = heightOfLine / this.lineHeight,\n leftOffset = this._getLineLeftOffset(i);\n this._renderTextLine(\n method,\n ctx,\n this._textLines[i],\n left + leftOffset - offsets.offsetX,\n top + lineHeights + maxHeight - offsets.offsetY,\n i\n );\n lineHeights += heightOfLine;\n }\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextFill: function(ctx) {\n if (!this.fill && !this.styleHas('fill')) {\n return;\n }\n\n this._renderTextCommon(ctx, 'fillText');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextStroke: function(ctx) {\n if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n this._setLineDash(ctx, this.strokeDashArray);\n ctx.beginPath();\n this._renderTextCommon(ctx, 'strokeText');\n ctx.closePath();\n ctx.restore();\n },\n\n /**\n * @private\n * @param {String} method\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} line Content of the line\n * @param {Number} left\n * @param {Number} top\n * @param {Number} lineIndex\n * @param {Number} charOffset\n */\n _renderChars: function(method, ctx, line, left, top, lineIndex) {\n // set proper line offset\n var lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.indexOf('justify') !== -1,\n actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n boxWidth = 0,\n timeToRender,\n shortCut = !isJustify && this.charSpacing === 0 && this.isEmptyStyles(lineIndex);\n\n ctx.save();\n top -= lineHeight * this._fontSizeFraction / this.lineHeight;\n if (shortCut) {\n // render all the line in one pass without checking\n this._renderChar(method, ctx, lineIndex, 0, this.textLines[lineIndex], left, top, lineHeight);\n ctx.restore();\n return;\n }\n for (var i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n left += charBox.kernedWidth - charBox.width;\n boxWidth += charBox.width;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = this._hasStyleChanged(actualStyle, nextStyle);\n }\n if (timeToRender) {\n this._renderChar(method, ctx, lineIndex, i, charsToRender, left, top, lineHeight);\n charsToRender = '';\n actualStyle = nextStyle;\n left += boxWidth;\n boxWidth = 0;\n }\n }\n ctx.restore();\n },\n\n /**\n * @private\n * @param {String} method\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {String} _char\n * @param {Number} left Left coordinate\n * @param {Number} top Top coordinate\n * @param {Number} lineHeight Height of the line\n */\n _renderChar: function(method, ctx, lineIndex, charIndex, _char, left, top) {\n var decl = this._getStyleDeclaration(lineIndex, charIndex),\n fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n shouldFill = method === 'fillText' && fullDecl.fill,\n shouldStroke = method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth;\n\n if (!shouldStroke && !shouldFill) {\n return;\n }\n decl && ctx.save();\n\n this._applyCharStyles(method, ctx, lineIndex, charIndex, fullDecl);\n\n if (decl && decl.textBackgroundColor) {\n this._removeShadow(ctx);\n }\n if (decl && decl.deltaY) {\n top += decl.deltaY;\n }\n\n shouldFill && ctx.fillText(_char, left, top);\n shouldStroke && ctx.strokeText(_char, left, top);\n decl && ctx.restore();\n },\n\n /**\n * Turns the character into a 'superior figure' (i.e. 'superscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @returns {fabric.Text} thisArg\n * @chainable\n */\n setSuperscript: function(start, end) {\n return this._setScript(start, end, this.superscript);\n },\n\n /**\n * Turns the character into an 'inferior figure' (i.e. 'subscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @returns {fabric.Text} thisArg\n * @chainable\n */\n setSubscript: function(start, end) {\n return this._setScript(start, end, this.subscript);\n },\n\n /**\n * Applies 'schema' at given position\n * @private\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @param {Number} schema\n * @returns {fabric.Text} thisArg\n * @chainable\n */\n _setScript: function(start, end, schema) {\n var loc = this.get2DCursorLocation(start, true),\n fontSize = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'fontSize'),\n dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'),\n style = { fontSize: fontSize * schema.size, deltaY: dy + fontSize * schema.baseline };\n this.setSelectionStyles(style, start, end);\n return this;\n },\n\n /**\n * @private\n * @param {Object} prevStyle\n * @param {Object} thisStyle\n */\n _hasStyleChanged: function(prevStyle, thisStyle) {\n return prevStyle.fill !== thisStyle.fill ||\n prevStyle.stroke !== thisStyle.stroke ||\n prevStyle.strokeWidth !== thisStyle.strokeWidth ||\n prevStyle.fontSize !== thisStyle.fontSize ||\n prevStyle.fontFamily !== thisStyle.fontFamily ||\n prevStyle.fontWeight !== thisStyle.fontWeight ||\n prevStyle.fontStyle !== thisStyle.fontStyle ||\n prevStyle.deltaY !== thisStyle.deltaY;\n },\n\n /**\n * @private\n * @param {Object} prevStyle\n * @param {Object} thisStyle\n */\n _hasStyleChangedForSvg: function(prevStyle, thisStyle) {\n return this._hasStyleChanged(prevStyle, thisStyle) ||\n prevStyle.overline !== thisStyle.overline ||\n prevStyle.underline !== thisStyle.underline ||\n prevStyle.linethrough !== thisStyle.linethrough;\n },\n\n /**\n * @private\n * @param {Number} lineIndex index text line\n * @return {Number} Line left offset\n */\n _getLineLeftOffset: function(lineIndex) {\n var lineWidth = this.getLineWidth(lineIndex);\n if (this.textAlign === 'center') {\n return (this.width - lineWidth) / 2;\n }\n if (this.textAlign === 'right') {\n return this.width - lineWidth;\n }\n if (this.textAlign === 'justify-center' && this.isEndOfWrapping(lineIndex)) {\n return (this.width - lineWidth) / 2;\n }\n if (this.textAlign === 'justify-right' && this.isEndOfWrapping(lineIndex)) {\n return this.width - lineWidth;\n }\n return 0;\n },\n\n /**\n * @private\n */\n _clearCache: function() {\n this.__lineWidths = [];\n this.__lineHeights = [];\n this.__charBounds = [];\n },\n\n /**\n * @private\n */\n _shouldClearDimensionCache: function() {\n var shouldClear = this._forceClearCache;\n shouldClear || (shouldClear = this.hasStateChanged('_dimensionAffectingProps'));\n if (shouldClear) {\n this.dirty = true;\n this._forceClearCache = false;\n }\n return shouldClear;\n },\n\n /**\n * Measure a single line given its index. Used to calculate the initial\n * text bounding box. The values are calculated and stored in __lineWidths cache.\n * @private\n * @param {Number} lineIndex line number\n * @return {Number} Line width\n */\n getLineWidth: function(lineIndex) {\n if (this.__lineWidths[lineIndex]) {\n return this.__lineWidths[lineIndex];\n }\n\n var width, line = this._textLines[lineIndex], lineInfo;\n\n if (line === '') {\n width = 0;\n }\n else {\n lineInfo = this.measureLine(lineIndex);\n width = lineInfo.width;\n }\n this.__lineWidths[lineIndex] = width;\n return width;\n },\n\n _getWidthOfCharSpacing: function() {\n if (this.charSpacing !== 0) {\n return this.fontSize * this.charSpacing / 1000;\n }\n return 0;\n },\n\n /**\n * Retrieves the value of property at given character position\n * @param {Number} lineIndex the line number\n * @param {Number} charIndex the charater number\n * @param {String} property the property name\n * @returns the value of 'property'\n */\n getValueOfPropertyAt: function(lineIndex, charIndex, property) {\n var charStyle = this._getStyleDeclaration(lineIndex, charIndex);\n if (charStyle && typeof charStyle[property] !== 'undefined') {\n return charStyle[property];\n }\n return this[property];\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextDecoration: function(ctx, type) {\n if (!this[type] && !this.styleHas(type)) {\n return;\n }\n var heightOfLine, size, _size,\n lineLeftOffset, dy, _dy,\n line, lastDecoration,\n leftOffset = this._getLeftOffset(),\n topOffset = this._getTopOffset(), top,\n boxStart, boxWidth, charBox, currentDecoration,\n maxHeight, currentFill, lastFill,\n charSpacing = this._getWidthOfCharSpacing();\n\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n heightOfLine = this.getHeightOfLine(i);\n if (!this[type] && !this.styleHas(type, i)) {\n topOffset += heightOfLine;\n continue;\n }\n line = this._textLines[i];\n maxHeight = heightOfLine / this.lineHeight;\n lineLeftOffset = this._getLineLeftOffset(i);\n boxStart = 0;\n boxWidth = 0;\n lastDecoration = this.getValueOfPropertyAt(i, 0, type);\n lastFill = this.getValueOfPropertyAt(i, 0, 'fill');\n top = topOffset + maxHeight * (1 - this._fontSizeFraction);\n size = this.getHeightOfChar(i, 0);\n dy = this.getValueOfPropertyAt(i, 0, 'deltaY');\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charBox = this.__charBounds[i][j];\n currentDecoration = this.getValueOfPropertyAt(i, j, type);\n currentFill = this.getValueOfPropertyAt(i, j, 'fill');\n _size = this.getHeightOfChar(i, j);\n _dy = this.getValueOfPropertyAt(i, j, 'deltaY');\n if ((currentDecoration !== lastDecoration || currentFill !== lastFill || _size !== size || _dy !== dy) &&\n boxWidth > 0) {\n ctx.fillStyle = lastFill;\n lastDecoration && lastFill && ctx.fillRect(\n leftOffset + lineLeftOffset + boxStart,\n top + this.offsets[type] * size + dy,\n boxWidth,\n this.fontSize / 15\n );\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastDecoration = currentDecoration;\n lastFill = currentFill;\n size = _size;\n dy = _dy;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n }\n ctx.fillStyle = currentFill;\n currentDecoration && currentFill && ctx.fillRect(\n leftOffset + lineLeftOffset + boxStart,\n top + this.offsets[type] * size + dy,\n boxWidth - charSpacing,\n this.fontSize / 15\n );\n topOffset += heightOfLine;\n }\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n },\n\n /**\n * return font declaration string for canvas context\n * @param {Object} [styleObject] object\n * @returns {String} font declaration formatted for canvas context.\n */\n _getFontDeclaration: function(styleObject, forMeasuring) {\n var style = styleObject || this, family = this.fontFamily,\n fontIsGeneric = fabric.Text.genericFonts.indexOf(family.toLowerCase()) > -1;\n var fontFamily = family === undefined ||\n family.indexOf('\\'') > -1 || family.indexOf(',') > -1 ||\n family.indexOf('\"') > -1 || fontIsGeneric\n ? style.fontFamily : '\"' + style.fontFamily + '\"';\n return [\n // node-canvas needs \"weight style\", while browsers need \"style weight\"\n // verify if this can be fixed in JSDOM\n (fabric.isLikelyNode ? style.fontWeight : style.fontStyle),\n (fabric.isLikelyNode ? style.fontStyle : style.fontWeight),\n forMeasuring ? this.CACHE_FONT_SIZE + 'px' : style.fontSize + 'px',\n fontFamily\n ].join(' ');\n },\n\n /**\n * Renders text instance on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render: function(ctx) {\n // do not render if object is not visible\n if (!this.visible) {\n return;\n }\n if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) {\n return;\n }\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n }\n this.callSuper('render', ctx);\n },\n\n /**\n * Returns the text as an array of lines.\n * @param {String} text text to split\n * @returns {Array} Lines in the text\n */\n _splitTextIntoLines: function(text) {\n var lines = text.split(this._reNewline),\n newLines = new Array(lines.length),\n newLine = ['\\n'],\n newText = [];\n for (var i = 0; i < lines.length; i++) {\n newLines[i] = fabric.util.string.graphemeSplit(lines[i]);\n newText = newText.concat(newLines[i], newLine);\n }\n newText.pop();\n return { _unwrappedLines: newLines, lines: lines, graphemeText: newText, graphemeLines: newLines };\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var additionalProperties = [\n 'text',\n 'fontSize',\n 'fontWeight',\n 'fontFamily',\n 'fontStyle',\n 'lineHeight',\n 'underline',\n 'overline',\n 'linethrough',\n 'textAlign',\n 'textBackgroundColor',\n 'charSpacing',\n ].concat(propertiesToInclude);\n var obj = this.callSuper('toObject', additionalProperties);\n obj.styles = clone(this.styles, true);\n return obj;\n },\n\n /**\n * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n set: function(key, value) {\n this.callSuper('set', key, value);\n var needsDims = false;\n if (typeof key === 'object') {\n for (var _key in key) {\n needsDims = needsDims || this._dimensionAffectingProps.indexOf(_key) !== -1;\n }\n }\n else {\n needsDims = this._dimensionAffectingProps.indexOf(key) !== -1;\n }\n if (needsDims) {\n this.initDimensions();\n this.setCoords();\n }\n return this;\n },\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity\n */\n complexity: function() {\n return 1;\n }\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Text.fromElement})\n * @static\n * @memberOf fabric.Text\n * @see: http://www.w3.org/TR/SVG/text.html#TextElement\n */\n fabric.Text.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(\n 'x y dx dy font-family font-style font-weight font-size letter-spacing text-decoration text-anchor'.split(' '));\n\n /**\n * Default SVG font size\n * @static\n * @memberOf fabric.Text\n */\n fabric.Text.DEFAULT_SVG_FONT_SIZE = 16;\n\n /**\n * Returns fabric.Text instance from an SVG element (not yet implemented)\n * @static\n * @memberOf fabric.Text\n * @param {SVGElement} element Element to parse\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Text.fromElement = function(element, callback, options) {\n if (!element) {\n return callback(null);\n }\n\n var parsedAttributes = fabric.parseAttributes(element, fabric.Text.ATTRIBUTE_NAMES),\n parsedAnchor = parsedAttributes.textAnchor || 'left';\n options = fabric.util.object.extend((options ? clone(options) : { }), parsedAttributes);\n\n options.top = options.top || 0;\n options.left = options.left || 0;\n if (parsedAttributes.textDecoration) {\n var textDecoration = parsedAttributes.textDecoration;\n if (textDecoration.indexOf('underline') !== -1) {\n options.underline = true;\n }\n if (textDecoration.indexOf('overline') !== -1) {\n options.overline = true;\n }\n if (textDecoration.indexOf('line-through') !== -1) {\n options.linethrough = true;\n }\n delete options.textDecoration;\n }\n if ('dx' in parsedAttributes) {\n options.left += parsedAttributes.dx;\n }\n if ('dy' in parsedAttributes) {\n options.top += parsedAttributes.dy;\n }\n if (!('fontSize' in options)) {\n options.fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE;\n }\n\n var textContent = '';\n\n // The XML is not properly parsed in IE9 so a workaround to get\n // textContent is through firstChild.data. Another workaround would be\n // to convert XML loaded from a file to be converted using DOMParser (same way loadSVGFromString() does)\n if (!('textContent' in element)) {\n if ('firstChild' in element && element.firstChild !== null) {\n if ('data' in element.firstChild && element.firstChild.data !== null) {\n textContent = element.firstChild.data;\n }\n }\n }\n else {\n textContent = element.textContent;\n }\n\n textContent = textContent.replace(/^\\s+|\\s+$|\\n+/g, '').replace(/\\s+/g, ' ');\n var originalStrokeWidth = options.strokeWidth;\n options.strokeWidth = 0;\n\n var text = new fabric.Text(textContent, options),\n textHeightScaleFactor = text.getScaledHeight() / text.height,\n lineHeightDiff = (text.height + text.strokeWidth) * text.lineHeight - text.height,\n scaledDiff = lineHeightDiff * textHeightScaleFactor,\n textHeight = text.getScaledHeight() + scaledDiff,\n offX = 0;\n /*\n Adjust positioning:\n x/y attributes in SVG correspond to the bottom-left corner of text bounding box\n fabric output by default at top, left.\n */\n if (parsedAnchor === 'center') {\n offX = text.getScaledWidth() / 2;\n }\n if (parsedAnchor === 'right') {\n offX = text.getScaledWidth();\n }\n text.set({\n left: text.left - offX,\n top: text.top - (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) / text.lineHeight,\n strokeWidth: typeof originalStrokeWidth !== 'undefined' ? originalStrokeWidth : 1,\n });\n callback(text);\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Text instance from an object representation\n * @static\n * @memberOf fabric.Text\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Text instance is created\n */\n fabric.Text.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Text', object, callback, 'text');\n };\n\n fabric.Text.genericFonts = ['sans-serif', 'serif', 'cursive', 'fantasy', 'monospace'];\n\n fabric.util.createAccessors && fabric.util.createAccessors(fabric.Text);\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ {\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles: function(lineIndex) {\n if (!this.styles) {\n return true;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return true;\n }\n var obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] };\n for (var p1 in obj) {\n for (var p2 in obj[p1]) {\n // eslint-disable-next-line no-unused-vars\n for (var p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n return true;\n },\n\n /**\n * Returns true if object has a style property or has it ina specified line\n * This function is used to detect if a text will use a particular property or not.\n * @param {String} property to check for\n * @param {Number} lineIndex to check the style on\n * @return {Boolean}\n */\n styleHas: function(property, lineIndex) {\n if (!this.styles || !property || property === '') {\n return false;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return false;\n }\n var obj = typeof lineIndex === 'undefined' ? this.styles : { 0: this.styles[lineIndex] };\n // eslint-disable-next-line\n for (var p1 in obj) {\n // eslint-disable-next-line\n for (var p2 in obj[p1]) {\n if (typeof obj[p1][p2][property] !== 'undefined') {\n return true;\n }\n }\n }\n return false;\n },\n\n /**\n * Check if characters in a text have a value for a property\n * whose value matches the textbox's value for that property. If so,\n * the character-level property is deleted. If the character\n * has no other properties, then it is also deleted. Finally,\n * if the line containing that character has no other characters\n * then it also is deleted.\n *\n * @param {string} property The property to compare between characters and text.\n */\n cleanStyle: function(property) {\n if (!this.styles || !property || property === '') {\n return false;\n }\n var obj = this.styles, stylesCount = 0, letterCount, stylePropertyValue,\n allStyleObjectPropertiesMatch = true, graphemeCount = 0, styleObject;\n // eslint-disable-next-line\n for (var p1 in obj) {\n letterCount = 0;\n // eslint-disable-next-line\n for (var p2 in obj[p1]) {\n var styleObject = obj[p1][p2],\n stylePropertyHasBeenSet = styleObject.hasOwnProperty(property);\n\n stylesCount++;\n\n if (stylePropertyHasBeenSet) {\n if (!stylePropertyValue) {\n stylePropertyValue = styleObject[property];\n }\n else if (styleObject[property] !== stylePropertyValue) {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (styleObject[property] === this[property]) {\n delete styleObject[property];\n }\n }\n else {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (Object.keys(styleObject).length !== 0) {\n letterCount++;\n }\n else {\n delete obj[p1][p2];\n }\n }\n\n if (letterCount === 0) {\n delete obj[p1];\n }\n }\n // if every grapheme has the same style set then\n // delete those styles and set it on the parent\n for (var i = 0; i < this._textLines.length; i++) {\n graphemeCount += this._textLines[i].length;\n }\n if (allStyleObjectPropertiesMatch && stylesCount === graphemeCount) {\n this[property] = stylePropertyValue;\n this.removeStyle(property);\n }\n },\n\n /**\n * Remove a style property or properties from all individual character styles\n * in a text object. Deletes the character style object if it contains no other style\n * props. Deletes a line style object if it contains no other character styles.\n *\n * @param {String} props The property to remove from character styles.\n */\n removeStyle: function(property) {\n if (!this.styles || !property || property === '') {\n return;\n }\n var obj = this.styles, line, lineNum, charNum;\n for (lineNum in obj) {\n line = obj[lineNum];\n for (charNum in line) {\n delete line[charNum][property];\n if (Object.keys(line[charNum]).length === 0) {\n delete line[charNum];\n }\n }\n if (Object.keys(line).length === 0) {\n delete obj[lineNum];\n }\n }\n },\n\n /**\n * @private\n */\n _extendStyles: function(index, styles) {\n var loc = this.get2DCursorLocation(index);\n\n if (!this._getLineStyle(loc.lineIndex)) {\n this._setLineStyle(loc.lineIndex);\n }\n\n if (!this._getStyleDeclaration(loc.lineIndex, loc.charIndex)) {\n this._setStyleDeclaration(loc.lineIndex, loc.charIndex, {});\n }\n\n fabric.util.object.extend(this._getStyleDeclaration(loc.lineIndex, loc.charIndex), styles);\n },\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)\n * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. usefull to manage styles.\n */\n get2DCursorLocation: function(selectionStart, skipWrapping) {\n if (typeof selectionStart === 'undefined') {\n selectionStart = this.selectionStart;\n }\n var lines = skipWrapping ? this._unwrappedTextLines : this._textLines,\n len = lines.length;\n for (var i = 0; i < len; i++) {\n if (selectionStart <= lines[i].length) {\n return {\n lineIndex: i,\n charIndex: selectionStart\n };\n }\n selectionStart -= lines[i].length + this.missingNewlineOffset(i);\n }\n return {\n lineIndex: i - 1,\n charIndex: lines[i - 1].length < selectionStart ? lines[i - 1].length : selectionStart\n };\n },\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * if startIndex or endIndex are not provided, slectionStart or selectionEnd will be used.\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles: function(startIndex, endIndex, complete) {\n if (typeof startIndex === 'undefined') {\n startIndex = this.selectionStart || 0;\n }\n if (typeof endIndex === 'undefined') {\n endIndex = this.selectionEnd || startIndex;\n }\n var styles = [];\n for (var i = startIndex; i < endIndex; i++) {\n styles.push(this.getStyleAtPosition(i, complete));\n }\n return styles;\n },\n\n /**\n * Gets style of a current selection/cursor position\n * @param {Number} position to get styles at\n * @param {Boolean} [complete] full style if true\n * @return {Object} style Style object at a specified index\n * @private\n */\n getStyleAtPosition: function(position, complete) {\n var loc = this.get2DCursorLocation(position),\n style = complete ? this.getCompleteStyleDeclaration(loc.lineIndex, loc.charIndex) :\n this._getStyleDeclaration(loc.lineIndex, loc.charIndex);\n return style || {};\n },\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} [styles] Styles object\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @return {fabric.IText} thisArg\n * @chainable\n */\n setSelectionStyles: function(styles, startIndex, endIndex) {\n if (typeof startIndex === 'undefined') {\n startIndex = this.selectionStart || 0;\n }\n if (typeof endIndex === 'undefined') {\n endIndex = this.selectionEnd || startIndex;\n }\n for (var i = startIndex; i < endIndex; i++) {\n this._extendStyles(i, styles);\n }\n /* not included in _extendStyles to avoid clearing cache more than once */\n this._forceClearCache = true;\n return this;\n },\n\n /**\n * get the reference, not a clone, of the style object for a given character\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Object} style object\n */\n _getStyleDeclaration: function(lineIndex, charIndex) {\n var lineStyle = this.styles && this.styles[lineIndex];\n if (!lineStyle) {\n return null;\n }\n return lineStyle[charIndex];\n },\n\n /**\n * return a new object that contains all the style property for a character\n * the object returned is newly created\n * @param {Number} lineIndex of the line where the character is\n * @param {Number} charIndex position of the character on the line\n * @return {Object} style object\n */\n getCompleteStyleDeclaration: function(lineIndex, charIndex) {\n var style = this._getStyleDeclaration(lineIndex, charIndex) || { },\n styleObject = { }, prop;\n for (var i = 0; i < this._styleProperties.length; i++) {\n prop = this._styleProperties[i];\n styleObject[prop] = typeof style[prop] === 'undefined' ? this[prop] : style[prop];\n }\n return styleObject;\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n _setStyleDeclaration: function(lineIndex, charIndex, style) {\n this.styles[lineIndex][charIndex] = style;\n },\n\n /**\n *\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n _deleteStyleDeclaration: function(lineIndex, charIndex) {\n delete this.styles[lineIndex][charIndex];\n },\n\n /**\n * @param {Number} lineIndex\n * @return {Boolean} if the line exists or not\n * @private\n */\n _getLineStyle: function(lineIndex) {\n return !!this.styles[lineIndex];\n },\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @private\n */\n _setLineStyle: function(lineIndex) {\n this.styles[lineIndex] = {};\n },\n\n /**\n * @param {Number} lineIndex\n * @private\n */\n _deleteLineStyle: function(lineIndex) {\n delete this.styles[lineIndex];\n }\n });\n})();\n\n\n(function() {\n\n function parseDecoration(object) {\n if (object.textDecoration) {\n object.textDecoration.indexOf('underline') > -1 && (object.underline = true);\n object.textDecoration.indexOf('line-through') > -1 && (object.linethrough = true);\n object.textDecoration.indexOf('overline') > -1 && (object.overline = true);\n delete object.textDecoration;\n }\n }\n\n /**\n * IText class (introduced in v1.4) Events are also fired with \"text:\"\n * prefix when observing canvas.\n * @class fabric.IText\n * @extends fabric.Text\n * @mixes fabric.Observable\n *\n * @fires changed\n * @fires selection:changed\n * @fires editing:entered\n * @fires editing:exited\n *\n * @return {fabric.IText} thisArg\n * @see {@link fabric.IText#initialize} for constructor definition\n *\n *

Supported key combinations:

\n *
\n   *   Move cursor:                    left, right, up, down\n   *   Select character:               shift + left, shift + right\n   *   Select text vertically:         shift + up, shift + down\n   *   Move cursor by word:            alt + left, alt + right\n   *   Select words:                   shift + alt + left, shift + alt + right\n   *   Move cursor to line start/end:  cmd + left, cmd + right or home, end\n   *   Select till start/end of line:  cmd + shift + left, cmd + shift + right or shift + home, shift + end\n   *   Jump to start/end of text:      cmd + up, cmd + down\n   *   Select till start/end of text:  cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown\n   *   Delete character:               backspace\n   *   Delete word:                    alt + backspace\n   *   Delete line:                    cmd + backspace\n   *   Forward delete:                 delete\n   *   Copy text:                      ctrl/cmd + c\n   *   Paste text:                     ctrl/cmd + v\n   *   Cut text:                       ctrl/cmd + x\n   *   Select entire text:             ctrl/cmd + a\n   *   Quit editing                    tab or esc\n   * 
\n *\n *

Supported mouse/touch combination

\n *
\n   *   Position cursor:                click/touch\n   *   Create selection:               click/touch & drag\n   *   Create selection:               click & shift + click\n   *   Select word:                    double click\n   *   Select line:                    triple click\n   * 
\n */\n fabric.IText = fabric.util.createClass(fabric.Text, fabric.Observable, /** @lends fabric.IText.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'i-text',\n\n /**\n * Index where text selection starts (or where cursor is when there is no selection)\n * @type Number\n * @default\n */\n selectionStart: 0,\n\n /**\n * Index where text selection ends\n * @type Number\n * @default\n */\n selectionEnd: 0,\n\n /**\n * Color of text selection\n * @type String\n * @default\n */\n selectionColor: 'rgba(17,119,255,0.3)',\n\n /**\n * Indicates whether text is in editing mode\n * @type Boolean\n * @default\n */\n isEditing: false,\n\n /**\n * Indicates whether a text can be edited\n * @type Boolean\n * @default\n */\n editable: true,\n\n /**\n * Border color of text object while it's in editing mode\n * @type String\n * @default\n */\n editingBorderColor: 'rgba(102,153,255,0.25)',\n\n /**\n * Width of cursor (in px)\n * @type Number\n * @default\n */\n cursorWidth: 2,\n\n /**\n * Color of default cursor (when not overwritten by character style)\n * @type String\n * @default\n */\n cursorColor: '#333',\n\n /**\n * Delay between cursor blink (in ms)\n * @type Number\n * @default\n */\n cursorDelay: 1000,\n\n /**\n * Duration of cursor fadein (in ms)\n * @type Number\n * @default\n */\n cursorDuration: 600,\n\n /**\n * Indicates whether internal text char widths can be cached\n * @type Boolean\n * @default\n */\n caching: true,\n\n /**\n * @private\n */\n _reSpace: /\\s|\\n/,\n\n /**\n * @private\n */\n _currentCursorOpacity: 0,\n\n /**\n * @private\n */\n _selectionDirection: null,\n\n /**\n * @private\n */\n _abortCursorAnimation: false,\n\n /**\n * @private\n */\n __widthOfSpace: [],\n\n /**\n * Helps determining when the text is in composition, so that the cursor\n * rendering is altered.\n */\n inCompositionMode: false,\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n * @return {fabric.IText} thisArg\n */\n initialize: function(text, options) {\n this.callSuper('initialize', text, options);\n this.initBehavior();\n },\n\n /**\n * Sets selection start (left boundary of a selection)\n * @param {Number} index Index to set selection start to\n */\n setSelectionStart: function(index) {\n index = Math.max(index, 0);\n this._updateAndFire('selectionStart', index);\n },\n\n /**\n * Sets selection end (right boundary of a selection)\n * @param {Number} index Index to set selection end to\n */\n setSelectionEnd: function(index) {\n index = Math.min(index, this.text.length);\n this._updateAndFire('selectionEnd', index);\n },\n\n /**\n * @private\n * @param {String} property 'selectionStart' or 'selectionEnd'\n * @param {Number} index new position of property\n */\n _updateAndFire: function(property, index) {\n if (this[property] !== index) {\n this._fireSelectionChanged();\n this[property] = index;\n }\n this._updateTextarea();\n },\n\n /**\n * Fires the even of selection changed\n * @private\n */\n _fireSelectionChanged: function() {\n this.fire('selection:changed');\n this.canvas && this.canvas.fire('text:selection:changed', { target: this });\n },\n\n /**\n * Initialize text dimensions. Render all text on given context\n * or on a offscreen canvas to get the text width with measureText.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n * @private\n */\n initDimensions: function() {\n this.isEditing && this.initDelayedCursor();\n this.clearContextTop();\n this.callSuper('initDimensions');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render: function(ctx) {\n this.clearContextTop();\n this.callSuper('render', ctx);\n // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor\n // the correct position but not at every cursor animation.\n this.cursorOffsetCache = { };\n this.renderCursorOrSelection();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n this.callSuper('_render', ctx);\n },\n\n /**\n * Prepare and clean the contextTop\n */\n clearContextTop: function(skipRestore) {\n if (!this.isEditing || !this.canvas || !this.canvas.contextTop) {\n return;\n }\n var ctx = this.canvas.contextTop, v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this.transform(ctx);\n this.transformMatrix && ctx.transform.apply(ctx, this.transformMatrix);\n this._clearTextArea(ctx);\n skipRestore || ctx.restore();\n },\n\n /**\n * Renders cursor or selection (depending on what exists)\n * it does on the contextTop. If contextTop is not available, do nothing.\n */\n renderCursorOrSelection: function() {\n if (!this.isEditing || !this.canvas || !this.canvas.contextTop) {\n return;\n }\n var boundaries = this._getCursorBoundaries(),\n ctx = this.canvas.contextTop;\n this.clearContextTop(true);\n if (this.selectionStart === this.selectionEnd) {\n this.renderCursor(boundaries, ctx);\n }\n else {\n this.renderSelection(boundaries, ctx);\n }\n ctx.restore();\n },\n\n _clearTextArea: function(ctx) {\n // we add 4 pixel, to be sure to do not leave any pixel out\n var width = this.width + 4, height = this.height + 4;\n ctx.clearRect(-width / 2, -height / 2, width, height);\n },\n\n /**\n * Returns cursor boundaries (left, top, leftOffset, topOffset)\n * @private\n * @param {Array} chars Array of characters\n * @param {String} typeOfBoundaries\n */\n _getCursorBoundaries: function(position) {\n\n // left/top are left/top of entire text box\n // leftOffset/topOffset are offset from that left/top point of a text box\n\n if (typeof position === 'undefined') {\n position = this.selectionStart;\n }\n\n var left = this._getLeftOffset(),\n top = this._getTopOffset(),\n offsets = this._getCursorBoundariesOffsets(position);\n\n return {\n left: left,\n top: top,\n leftOffset: offsets.left,\n topOffset: offsets.top\n };\n },\n\n /**\n * @private\n */\n _getCursorBoundariesOffsets: function(position) {\n if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {\n return this.cursorOffsetCache;\n }\n var lineLeftOffset,\n lineIndex,\n charIndex,\n topOffset = 0,\n leftOffset = 0,\n boundaries,\n cursorPosition = this.get2DCursorLocation(position);\n charIndex = cursorPosition.charIndex;\n lineIndex = cursorPosition.lineIndex;\n for (var i = 0; i < lineIndex; i++) {\n topOffset += this.getHeightOfLine(i);\n }\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n var bound = this.__charBounds[lineIndex][charIndex];\n bound && (leftOffset = bound.left);\n if (this.charSpacing !== 0 && charIndex === this._textLines[lineIndex].length) {\n leftOffset -= this._getWidthOfCharSpacing();\n }\n boundaries = {\n top: topOffset,\n left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0),\n };\n this.cursorOffsetCache = boundaries;\n return this.cursorOffsetCache;\n },\n\n /**\n * Renders cursor\n * @param {Object} boundaries\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderCursor: function(boundaries, ctx) {\n var cursorLocation = this.get2DCursorLocation(),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),\n multiplier = this.scaleX * this.canvas.getZoom(),\n cursorWidth = this.cursorWidth / multiplier,\n topOffset = boundaries.topOffset,\n dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY');\n\n topOffset += (1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex) / this.lineHeight\n - charHeight * (1 - this._fontSizeFraction);\n\n if (this.inCompositionMode) {\n this.renderSelection(boundaries, ctx);\n }\n\n ctx.fillStyle = this.getValueOfPropertyAt(lineIndex, charIndex, 'fill');\n ctx.globalAlpha = this.__isMousedown ? 1 : this._currentCursorOpacity;\n ctx.fillRect(\n boundaries.left + boundaries.leftOffset - cursorWidth / 2,\n topOffset + boundaries.top + dy,\n cursorWidth,\n charHeight);\n },\n\n /**\n * Renders text selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderSelection: function(boundaries, ctx) {\n\n var selectionStart = this.inCompositionMode ? this.hiddenTextarea.selectionStart : this.selectionStart,\n selectionEnd = this.inCompositionMode ? this.hiddenTextarea.selectionEnd : this.selectionEnd,\n isJustify = this.textAlign.indexOf('justify') !== -1,\n start = this.get2DCursorLocation(selectionStart),\n end = this.get2DCursorLocation(selectionEnd),\n startLine = start.lineIndex,\n endLine = end.lineIndex,\n startChar = start.charIndex < 0 ? 0 : start.charIndex,\n endChar = end.charIndex < 0 ? 0 : end.charIndex;\n\n for (var i = startLine; i <= endLine; i++) {\n var lineOffset = this._getLineLeftOffset(i) || 0,\n lineHeight = this.getHeightOfLine(i),\n realLineHeight = 0, boxStart = 0, boxEnd = 0;\n\n if (i === startLine) {\n boxStart = this.__charBounds[startLine][startChar].left;\n }\n if (i >= startLine && i < endLine) {\n boxEnd = isJustify && !this.isEndOfWrapping(i) ? this.width : this.getLineWidth(i) || 5; // WTF is this 5?\n }\n else if (i === endLine) {\n if (endChar === 0) {\n boxEnd = this.__charBounds[endLine][endChar].left;\n }\n else {\n var charSpacing = this._getWidthOfCharSpacing();\n boxEnd = this.__charBounds[endLine][endChar - 1].left\n + this.__charBounds[endLine][endChar - 1].width - charSpacing;\n }\n }\n realLineHeight = lineHeight;\n if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {\n lineHeight /= this.lineHeight;\n }\n if (this.inCompositionMode) {\n ctx.fillStyle = this.compositionColor || 'black';\n ctx.fillRect(\n boundaries.left + lineOffset + boxStart,\n boundaries.top + boundaries.topOffset + lineHeight,\n boxEnd - boxStart,\n 1);\n }\n else {\n ctx.fillStyle = this.selectionColor;\n ctx.fillRect(\n boundaries.left + lineOffset + boxStart,\n boundaries.top + boundaries.topOffset,\n boxEnd - boxStart,\n lineHeight);\n }\n\n\n boundaries.topOffset += realLineHeight;\n }\n },\n\n /**\n * High level function to know the height of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns fontSize of char at the current cursor\n * @return {Number} Character font size\n */\n getCurrentCharFontSize: function() {\n var cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');\n },\n\n /**\n * High level function to know the color of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns color (fill) of char at the current cursor\n * @return {String} Character color (fill)\n */\n getCurrentCharColor: function() {\n var cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fill');\n },\n\n /**\n * Returns the cursor position for the getCurrent.. functions\n * @private\n */\n _getCurrentCharIndex: function() {\n var cursorPosition = this.get2DCursorLocation(this.selectionStart, true),\n charIndex = cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;\n return { l: cursorPosition.lineIndex, c: charIndex };\n }\n });\n\n /**\n * Returns fabric.IText instance from an object representation\n * @static\n * @memberOf fabric.IText\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as argument\n */\n fabric.IText.fromObject = function(object, callback) {\n parseDecoration(object);\n if (object.styles) {\n for (var i in object.styles) {\n for (var j in object.styles[i]) {\n parseDecoration(object.styles[i][j]);\n }\n }\n }\n fabric.Object._fromObject('IText', object, callback, 'text');\n };\n})();\n\n\n(function() {\n\n var clone = fabric.util.object.clone;\n\n fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n\n /**\n * Initializes all the interactive behavior of IText\n */\n initBehavior: function() {\n this.initAddedHandler();\n this.initRemovedHandler();\n this.initCursorSelectionHandlers();\n this.initDoubleClickSimulation();\n this.mouseMoveHandler = this.mouseMoveHandler.bind(this);\n },\n\n onDeselect: function() {\n this.isEditing && this.exitEditing();\n this.selected = false;\n },\n\n /**\n * Initializes \"added\" event handler\n */\n initAddedHandler: function() {\n var _this = this;\n this.on('added', function() {\n var canvas = _this.canvas;\n if (canvas) {\n if (!canvas._hasITextHandlers) {\n canvas._hasITextHandlers = true;\n _this._initCanvasHandlers(canvas);\n }\n canvas._iTextInstances = canvas._iTextInstances || [];\n canvas._iTextInstances.push(_this);\n }\n });\n },\n\n initRemovedHandler: function() {\n var _this = this;\n this.on('removed', function() {\n var canvas = _this.canvas;\n if (canvas) {\n canvas._iTextInstances = canvas._iTextInstances || [];\n fabric.util.removeFromArray(canvas._iTextInstances, _this);\n if (canvas._iTextInstances.length === 0) {\n canvas._hasITextHandlers = false;\n _this._removeCanvasHandlers(canvas);\n }\n }\n });\n },\n\n /**\n * register canvas event to manage exiting on other instances\n * @private\n */\n _initCanvasHandlers: function(canvas) {\n canvas._mouseUpITextHandler = function() {\n if (canvas._iTextInstances) {\n canvas._iTextInstances.forEach(function(obj) {\n obj.__isMousedown = false;\n });\n }\n };\n canvas.on('mouse:up', canvas._mouseUpITextHandler);\n },\n\n /**\n * remove canvas event to manage exiting on other instances\n * @private\n */\n _removeCanvasHandlers: function(canvas) {\n canvas.off('mouse:up', canvas._mouseUpITextHandler);\n },\n\n /**\n * @private\n */\n _tick: function() {\n this._currentTickState = this._animateCursor(this, 1, this.cursorDuration, '_onTickComplete');\n },\n\n /**\n * @private\n */\n _animateCursor: function(obj, targetOpacity, duration, completeMethod) {\n\n var tickState;\n\n tickState = {\n isAborted: false,\n abort: function() {\n this.isAborted = true;\n },\n };\n\n obj.animate('_currentCursorOpacity', targetOpacity, {\n duration: duration,\n onComplete: function() {\n if (!tickState.isAborted) {\n obj[completeMethod]();\n }\n },\n onChange: function() {\n // we do not want to animate a selection, only cursor\n if (obj.canvas && obj.selectionStart === obj.selectionEnd) {\n obj.renderCursorOrSelection();\n }\n },\n abort: function() {\n return tickState.isAborted;\n }\n });\n return tickState;\n },\n\n /**\n * @private\n */\n _onTickComplete: function() {\n\n var _this = this;\n\n if (this._cursorTimeout1) {\n clearTimeout(this._cursorTimeout1);\n }\n this._cursorTimeout1 = setTimeout(function() {\n _this._currentTickCompleteState = _this._animateCursor(_this, 0, this.cursorDuration / 2, '_tick');\n }, 100);\n },\n\n /**\n * Initializes delayed cursor\n */\n initDelayedCursor: function(restart) {\n var _this = this,\n delay = restart ? 0 : this.cursorDelay;\n\n this.abortCursorAnimation();\n this._currentCursorOpacity = 1;\n this._cursorTimeout2 = setTimeout(function() {\n _this._tick();\n }, delay);\n },\n\n /**\n * Aborts cursor animation and clears all timeouts\n */\n abortCursorAnimation: function() {\n var shouldClear = this._currentTickState || this._currentTickCompleteState,\n canvas = this.canvas;\n this._currentTickState && this._currentTickState.abort();\n this._currentTickCompleteState && this._currentTickCompleteState.abort();\n\n clearTimeout(this._cursorTimeout1);\n clearTimeout(this._cursorTimeout2);\n\n this._currentCursorOpacity = 0;\n // to clear just itext area we need to transform the context\n // it may not be worth it\n if (shouldClear && canvas) {\n canvas.clearContext(canvas.contextTop || canvas.contextContainer);\n }\n\n },\n\n /**\n * Selects entire text\n * @return {fabric.IText} thisArg\n * @chainable\n */\n selectAll: function() {\n this.selectionStart = 0;\n this.selectionEnd = this._text.length;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n },\n\n /**\n * Returns selected text\n * @return {String}\n */\n getSelectedText: function() {\n return this._text.slice(this.selectionStart, this.selectionEnd).join('');\n },\n\n /**\n * Find new selection index representing start of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryLeft: function(startFrom) {\n var offset = 0, index = startFrom - 1;\n\n // remove space before cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index--;\n }\n }\n while (/\\S/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n },\n\n /**\n * Find new selection index representing end of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryRight: function(startFrom) {\n var offset = 0, index = startFrom;\n\n // remove space after cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index++;\n }\n }\n while (/\\S/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n },\n\n /**\n * Find new selection index representing start of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryLeft: function(startFrom) {\n var offset = 0, index = startFrom - 1;\n\n while (!/\\n/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n },\n\n /**\n * Find new selection index representing end of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryRight: function(startFrom) {\n var offset = 0, index = startFrom;\n\n while (!/\\n/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n },\n\n /**\n * Finds index corresponding to beginning or end of a word\n * @param {Number} selectionStart Index of a character\n * @param {Number} direction 1 or -1\n * @return {Number} Index of the beginning or end of a word\n */\n searchWordBoundary: function(selectionStart, direction) {\n var text = this._text,\n index = this._reSpace.test(text[selectionStart]) ? selectionStart - 1 : selectionStart,\n _char = text[index],\n // wrong\n reNonWord = fabric.reNonWord;\n\n while (!reNonWord.test(_char) && index > 0 && index < text.length) {\n index += direction;\n _char = text[index];\n }\n if (reNonWord.test(_char)) {\n index += direction === 1 ? 0 : 1;\n }\n return index;\n },\n\n /**\n * Selects a word based on the index\n * @param {Number} selectionStart Index of a character\n */\n selectWord: function(selectionStart) {\n selectionStart = selectionStart || this.selectionStart;\n var newSelectionStart = this.searchWordBoundary(selectionStart, -1), /* search backwards */\n newSelectionEnd = this.searchWordBoundary(selectionStart, 1); /* search forward */\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n },\n\n /**\n * Selects a line based on the index\n * @param {Number} selectionStart Index of a character\n * @return {fabric.IText} thisArg\n * @chainable\n */\n selectLine: function(selectionStart) {\n selectionStart = selectionStart || this.selectionStart;\n var newSelectionStart = this.findLineBoundaryLeft(selectionStart),\n newSelectionEnd = this.findLineBoundaryRight(selectionStart);\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n },\n\n /**\n * Enters editing state\n * @return {fabric.IText} thisArg\n * @chainable\n */\n enterEditing: function(e) {\n if (this.isEditing || !this.editable) {\n return;\n }\n\n if (this.canvas) {\n this.canvas.calcOffset();\n this.exitEditingOnOthers(this.canvas);\n }\n\n this.isEditing = true;\n\n this.initHiddenTextarea(e);\n this.hiddenTextarea.focus();\n this.hiddenTextarea.value = this.text;\n this._updateTextarea();\n this._saveEditingProps();\n this._setEditingProps();\n this._textBeforeEdit = this.text;\n\n this._tick();\n this.fire('editing:entered');\n this._fireSelectionChanged();\n if (!this.canvas) {\n return this;\n }\n this.canvas.fire('text:editing:entered', { target: this });\n this.initMouseMoveHandler();\n this.canvas.requestRenderAll();\n return this;\n },\n\n exitEditingOnOthers: function(canvas) {\n if (canvas._iTextInstances) {\n canvas._iTextInstances.forEach(function(obj) {\n obj.selected = false;\n if (obj.isEditing) {\n obj.exitEditing();\n }\n });\n }\n },\n\n /**\n * Initializes \"mousemove\" event handler\n */\n initMouseMoveHandler: function() {\n this.canvas.on('mouse:move', this.mouseMoveHandler);\n },\n\n /**\n * @private\n */\n mouseMoveHandler: function(options) {\n if (!this.__isMousedown || !this.isEditing) {\n return;\n }\n\n var newSelectionStart = this.getSelectionStartFromPointer(options.e),\n currentStart = this.selectionStart,\n currentEnd = this.selectionEnd;\n if (\n (newSelectionStart !== this.__selectionStartOnMouseDown || currentStart === currentEnd)\n &&\n (currentStart === newSelectionStart || currentEnd === newSelectionStart)\n ) {\n return;\n }\n if (newSelectionStart > this.__selectionStartOnMouseDown) {\n this.selectionStart = this.__selectionStartOnMouseDown;\n this.selectionEnd = newSelectionStart;\n }\n else {\n this.selectionStart = newSelectionStart;\n this.selectionEnd = this.__selectionStartOnMouseDown;\n }\n if (this.selectionStart !== currentStart || this.selectionEnd !== currentEnd) {\n this.restartCursorIfNeeded();\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n },\n\n /**\n * @private\n */\n _setEditingProps: function() {\n this.hoverCursor = 'text';\n\n if (this.canvas) {\n this.canvas.defaultCursor = this.canvas.moveCursor = 'text';\n }\n\n this.borderColor = this.editingBorderColor;\n this.hasControls = this.selectable = false;\n this.lockMovementX = this.lockMovementY = true;\n },\n\n /**\n * convert from textarea to grapheme indexes\n */\n fromStringToGraphemeSelection: function(start, end, text) {\n var smallerTextStart = text.slice(0, start),\n graphemeStart = fabric.util.string.graphemeSplit(smallerTextStart).length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n var smallerTextEnd = text.slice(start, end),\n graphemeEnd = fabric.util.string.graphemeSplit(smallerTextEnd).length;\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd };\n },\n\n /**\n * convert from fabric to textarea values\n */\n fromGraphemeToStringSelection: function(start, end, _text) {\n var smallerTextStart = _text.slice(0, start),\n graphemeStart = smallerTextStart.join('').length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n var smallerTextEnd = _text.slice(start, end),\n graphemeEnd = smallerTextEnd.join('').length;\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd };\n },\n\n /**\n * @private\n */\n _updateTextarea: function() {\n this.cursorOffsetCache = { };\n if (!this.hiddenTextarea) {\n return;\n }\n if (!this.inCompositionMode) {\n var newSelection = this.fromGraphemeToStringSelection(this.selectionStart, this.selectionEnd, this._text);\n this.hiddenTextarea.selectionStart = newSelection.selectionStart;\n this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;\n }\n this.updateTextareaPosition();\n },\n\n /**\n * @private\n */\n updateFromTextArea: function() {\n if (!this.hiddenTextarea) {\n return;\n }\n this.cursorOffsetCache = { };\n this.text = this.hiddenTextarea.value;\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n var newSelection = this.fromStringToGraphemeSelection(\n this.hiddenTextarea.selectionStart, this.hiddenTextarea.selectionEnd, this.hiddenTextarea.value);\n this.selectionEnd = this.selectionStart = newSelection.selectionEnd;\n if (!this.inCompositionMode) {\n this.selectionStart = newSelection.selectionStart;\n }\n this.updateTextareaPosition();\n },\n\n /**\n * @private\n */\n updateTextareaPosition: function() {\n if (this.selectionStart === this.selectionEnd) {\n var style = this._calcTextareaPosition();\n this.hiddenTextarea.style.left = style.left;\n this.hiddenTextarea.style.top = style.top;\n }\n },\n\n /**\n * @private\n * @return {Object} style contains style for hiddenTextarea\n */\n _calcTextareaPosition: function() {\n if (!this.canvas) {\n return { x: 1, y: 1 };\n }\n var desiredPosition = this.inCompositionMode ? this.compositionStart : this.selectionStart,\n boundaries = this._getCursorBoundaries(desiredPosition),\n cursorLocation = this.get2DCursorLocation(desiredPosition),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') * this.lineHeight,\n leftOffset = boundaries.leftOffset,\n m = this.calcTransformMatrix(),\n p = {\n x: boundaries.left + leftOffset,\n y: boundaries.top + boundaries.topOffset + charHeight\n },\n retinaScaling = this.canvas.getRetinaScaling(),\n upperCanvas = this.canvas.upperCanvasEl,\n upperCanvasWidth = upperCanvas.width / retinaScaling,\n upperCanvasHeight = upperCanvas.height / retinaScaling,\n maxWidth = upperCanvasWidth - charHeight,\n maxHeight = upperCanvasHeight - charHeight,\n scaleX = upperCanvas.clientWidth / upperCanvasWidth,\n scaleY = upperCanvas.clientHeight / upperCanvasHeight;\n\n p = fabric.util.transformPoint(p, m);\n p = fabric.util.transformPoint(p, this.canvas.viewportTransform);\n p.x *= scaleX;\n p.y *= scaleY;\n if (p.x < 0) {\n p.x = 0;\n }\n if (p.x > maxWidth) {\n p.x = maxWidth;\n }\n if (p.y < 0) {\n p.y = 0;\n }\n if (p.y > maxHeight) {\n p.y = maxHeight;\n }\n\n // add canvas offset on document\n p.x += this.canvas._offset.left;\n p.y += this.canvas._offset.top;\n\n return { left: p.x + 'px', top: p.y + 'px', fontSize: charHeight + 'px', charHeight: charHeight };\n },\n\n /**\n * @private\n */\n _saveEditingProps: function() {\n this._savedProps = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n lockMovementX: this.lockMovementX,\n lockMovementY: this.lockMovementY,\n hoverCursor: this.hoverCursor,\n selectable: this.selectable,\n defaultCursor: this.canvas && this.canvas.defaultCursor,\n moveCursor: this.canvas && this.canvas.moveCursor\n };\n },\n\n /**\n * @private\n */\n _restoreEditingProps: function() {\n if (!this._savedProps) {\n return;\n }\n\n this.hoverCursor = this._savedProps.hoverCursor;\n this.hasControls = this._savedProps.hasControls;\n this.borderColor = this._savedProps.borderColor;\n this.selectable = this._savedProps.selectable;\n this.lockMovementX = this._savedProps.lockMovementX;\n this.lockMovementY = this._savedProps.lockMovementY;\n\n if (this.canvas) {\n this.canvas.defaultCursor = this._savedProps.defaultCursor;\n this.canvas.moveCursor = this._savedProps.moveCursor;\n }\n },\n\n /**\n * Exits from editing state\n * @return {fabric.IText} thisArg\n * @chainable\n */\n exitEditing: function() {\n var isTextChanged = (this._textBeforeEdit !== this.text);\n var hiddenTextarea = this.hiddenTextarea;\n this.selected = false;\n this.isEditing = false;\n\n this.selectionEnd = this.selectionStart;\n\n if (hiddenTextarea) {\n hiddenTextarea.blur && hiddenTextarea.blur();\n hiddenTextarea.parentNode && hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n }\n this.hiddenTextarea = null;\n this.abortCursorAnimation();\n this._restoreEditingProps();\n this._currentCursorOpacity = 0;\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n this.fire('editing:exited');\n isTextChanged && this.fire('modified');\n if (this.canvas) {\n this.canvas.off('mouse:move', this.mouseMoveHandler);\n this.canvas.fire('text:editing:exited', { target: this });\n isTextChanged && this.canvas.fire('object:modified', { target: this });\n }\n return this;\n },\n\n /**\n * @private\n */\n _removeExtraneousStyles: function() {\n for (var prop in this.styles) {\n if (!this._textLines[prop]) {\n delete this.styles[prop];\n }\n }\n },\n\n /**\n * remove and reflow a style block from start to end.\n * @param {Number} start linear start position for removal (included in removal)\n * @param {Number} end linear end position for removal ( excluded from removal )\n */\n removeStyleFromTo: function(start, end) {\n var cursorStart = this.get2DCursorLocation(start, true),\n cursorEnd = this.get2DCursorLocation(end, true),\n lineStart = cursorStart.lineIndex,\n charStart = cursorStart.charIndex,\n lineEnd = cursorEnd.lineIndex,\n charEnd = cursorEnd.charIndex,\n i, styleObj;\n if (lineStart !== lineEnd) {\n // step1 remove the trailing of lineStart\n if (this.styles[lineStart]) {\n for (i = charStart; i < this._unwrappedTextLines[lineStart].length; i++) {\n delete this.styles[lineStart][i];\n }\n }\n // step2 move the trailing of lineEnd to lineStart if needed\n if (this.styles[lineEnd]) {\n for (i = charEnd; i < this._unwrappedTextLines[lineEnd].length; i++) {\n styleObj = this.styles[lineEnd][i];\n if (styleObj) {\n this.styles[lineStart] || (this.styles[lineStart] = { });\n this.styles[lineStart][charStart + i - charEnd] = styleObj;\n }\n }\n }\n // step3 detects lines will be completely removed.\n for (i = lineStart + 1; i <= lineEnd; i++) {\n delete this.styles[i];\n }\n // step4 shift remaining lines.\n this.shiftLineStyles(lineEnd, lineStart - lineEnd);\n }\n else {\n // remove and shift left on the same line\n if (this.styles[lineStart]) {\n styleObj = this.styles[lineStart];\n var diff = charEnd - charStart, numericChar, _char;\n for (i = charStart; i < charEnd; i++) {\n delete styleObj[i];\n }\n for (_char in this.styles[lineStart]) {\n numericChar = parseInt(_char, 10);\n if (numericChar >= charEnd) {\n styleObj[numericChar - diff] = styleObj[_char];\n delete styleObj[_char];\n }\n }\n }\n }\n },\n\n /**\n * Shifts line styles up or down\n * @param {Number} lineIndex Index of a line\n * @param {Number} offset Can any number?\n */\n shiftLineStyles: function(lineIndex, offset) {\n // shift all line styles by offset upward or downward\n // do not clone deep. we need new array, not new style objects\n var clonedStyles = clone(this.styles);\n for (var line in this.styles) {\n var numericLine = parseInt(line, 10);\n if (numericLine > lineIndex) {\n this.styles[numericLine + offset] = clonedStyles[numericLine];\n if (!clonedStyles[numericLine - offset]) {\n delete this.styles[numericLine];\n }\n }\n }\n },\n\n restartCursorIfNeeded: function() {\n if (!this._currentTickState || this._currentTickState.isAborted\n || !this._currentTickCompleteState || this._currentTickCompleteState.isAborted\n ) {\n this.initDelayedCursor();\n }\n },\n\n /**\n * Inserts new style object\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} qty number of lines to add\n * @param {Array} copiedStyle Array of objects styles\n */\n insertNewlineStyleObject: function(lineIndex, charIndex, qty, copiedStyle) {\n var currentCharStyle,\n newLineStyles = {},\n somethingAdded = false;\n\n qty || (qty = 1);\n this.shiftLineStyles(lineIndex, qty);\n if (this.styles[lineIndex]) {\n currentCharStyle = this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1];\n }\n\n // we clone styles of all chars\n // after cursor onto the current line\n for (var index in this.styles[lineIndex]) {\n var numIndex = parseInt(index, 10);\n if (numIndex >= charIndex) {\n somethingAdded = true;\n newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];\n // remove lines from the previous line since they're on a new line now\n delete this.styles[lineIndex][index];\n }\n }\n if (somethingAdded) {\n this.styles[lineIndex + qty] = newLineStyles;\n }\n else {\n delete this.styles[lineIndex + qty];\n }\n // for the other lines\n // we clone current char style onto the next (otherwise empty) line\n while (qty > 1) {\n qty--;\n if (copiedStyle && copiedStyle[qty]) {\n this.styles[lineIndex + qty] = { 0: clone(copiedStyle[qty]) };\n }\n else if (currentCharStyle) {\n this.styles[lineIndex + qty] = { 0: clone(currentCharStyle) };\n }\n else {\n delete this.styles[lineIndex + qty];\n }\n }\n this._forceClearCache = true;\n },\n\n /**\n * Inserts style object for a given line/char index\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} quantity number Style object to insert, if given\n * @param {Array} copiedStyle array of style objects\n */\n insertCharStyleObject: function(lineIndex, charIndex, quantity, copiedStyle) {\n if (!this.styles) {\n this.styles = {};\n }\n var currentLineStyles = this.styles[lineIndex],\n currentLineStylesCloned = currentLineStyles ? clone(currentLineStyles) : {};\n\n quantity || (quantity = 1);\n // shift all char styles by quantity forward\n // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4\n for (var index in currentLineStylesCloned) {\n var numericIndex = parseInt(index, 10);\n if (numericIndex >= charIndex) {\n currentLineStyles[numericIndex + quantity] = currentLineStylesCloned[numericIndex];\n // only delete the style if there was nothing moved there\n if (!currentLineStylesCloned[numericIndex - quantity]) {\n delete currentLineStyles[numericIndex];\n }\n }\n }\n this._forceClearCache = true;\n if (copiedStyle) {\n while (quantity--) {\n if (!Object.keys(copiedStyle[quantity]).length) {\n continue;\n }\n if (!this.styles[lineIndex]) {\n this.styles[lineIndex] = {};\n }\n this.styles[lineIndex][charIndex + quantity] = clone(copiedStyle[quantity]);\n }\n return;\n }\n if (!currentLineStyles) {\n return;\n }\n var newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];\n while (newStyle && quantity--) {\n this.styles[lineIndex][charIndex + quantity] = clone(newStyle);\n }\n },\n\n /**\n * Inserts style object(s)\n * @param {Array} insertedText Characters at the location where style is inserted\n * @param {Number} start cursor index for inserting style\n * @param {Array} [copiedStyle] array of style objects to insert.\n */\n insertNewStyleBlock: function(insertedText, start, copiedStyle) {\n var cursorLoc = this.get2DCursorLocation(start, true),\n addedLines = [0], linesLength = 0;\n for (var i = 0; i < insertedText.length; i++) {\n if (insertedText[i] === '\\n') {\n linesLength++;\n addedLines[linesLength] = 0;\n }\n else {\n addedLines[linesLength]++;\n }\n }\n if (addedLines[0] > 0) {\n this.insertCharStyleObject(cursorLoc.lineIndex, cursorLoc.charIndex, addedLines[0], copiedStyle);\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);\n }\n linesLength && this.insertNewlineStyleObject(\n cursorLoc.lineIndex, cursorLoc.charIndex + addedLines[0], linesLength);\n for (var i = 1; i < linesLength; i++) {\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle);\n }\n else if (copiedStyle) {\n this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];\n }\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);\n }\n // we use i outside the loop to get it like linesLength\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle);\n }\n },\n\n /**\n * Set the selectionStart and selectionEnd according to the new position of cursor\n * mimic the key - mouse navigation when shift is pressed.\n */\n setSelectionStartEndWithShift: function(start, end, newSelection) {\n if (newSelection <= start) {\n if (end === start) {\n this._selectionDirection = 'left';\n }\n else if (this._selectionDirection === 'right') {\n this._selectionDirection = 'left';\n this.selectionEnd = start;\n }\n this.selectionStart = newSelection;\n }\n else if (newSelection > start && newSelection < end) {\n if (this._selectionDirection === 'right') {\n this.selectionEnd = newSelection;\n }\n else {\n this.selectionStart = newSelection;\n }\n }\n else {\n // newSelection is > selection start and end\n if (end === start) {\n this._selectionDirection = 'right';\n }\n else if (this._selectionDirection === 'left') {\n this._selectionDirection = 'right';\n this.selectionStart = end;\n }\n this.selectionEnd = newSelection;\n }\n },\n\n setSelectionInBoundaries: function() {\n var length = this.text.length;\n if (this.selectionStart > length) {\n this.selectionStart = length;\n }\n else if (this.selectionStart < 0) {\n this.selectionStart = 0;\n }\n if (this.selectionEnd > length) {\n this.selectionEnd = length;\n }\n else if (this.selectionEnd < 0) {\n this.selectionEnd = 0;\n }\n }\n });\n})();\n\n\nfabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n /**\n * Initializes \"dbclick\" event handler\n */\n initDoubleClickSimulation: function() {\n\n // for double click\n this.__lastClickTime = +new Date();\n\n // for triple click\n this.__lastLastClickTime = +new Date();\n\n this.__lastPointer = { };\n\n this.on('mousedown', this.onMouseDown);\n },\n\n /**\n * Default event handler to simulate triple click\n * @private\n */\n onMouseDown: function(options) {\n if (!this.canvas) {\n return;\n }\n this.__newClickTime = +new Date();\n var newPointer = options.pointer;\n if (this.isTripleClick(newPointer)) {\n this.fire('tripleclick', options);\n this._stopEvent(options.e);\n }\n this.__lastLastClickTime = this.__lastClickTime;\n this.__lastClickTime = this.__newClickTime;\n this.__lastPointer = newPointer;\n this.__lastIsEditing = this.isEditing;\n this.__lastSelected = this.selected;\n },\n\n isTripleClick: function(newPointer) {\n return this.__newClickTime - this.__lastClickTime < 500 &&\n this.__lastClickTime - this.__lastLastClickTime < 500 &&\n this.__lastPointer.x === newPointer.x &&\n this.__lastPointer.y === newPointer.y;\n },\n\n /**\n * @private\n */\n _stopEvent: function(e) {\n e.preventDefault && e.preventDefault();\n e.stopPropagation && e.stopPropagation();\n },\n\n /**\n * Initializes event handlers related to cursor or selection\n */\n initCursorSelectionHandlers: function() {\n this.initMousedownHandler();\n this.initMouseupHandler();\n this.initClicks();\n },\n\n /**\n * Default handler for double click, select a word\n */\n doubleClickHandler: function(options) {\n if (!this.isEditing) {\n return;\n }\n this.selectWord(this.getSelectionStartFromPointer(options.e));\n },\n\n /**\n * Default handler for triple click, select a line\n */\n tripleClickHandler: function(options) {\n if (!this.isEditing) {\n return;\n }\n this.selectLine(this.getSelectionStartFromPointer(options.e));\n },\n\n /**\n * Initializes double and triple click event handlers\n */\n initClicks: function() {\n this.on('mousedblclick', this.doubleClickHandler);\n this.on('tripleclick', this.tripleClickHandler);\n },\n\n /**\n * Default event handler for the basic functionalities needed on _mouseDown\n * can be overridden to do something different.\n * Scope of this implementation is: find the click position, set selectionStart\n * find selectionEnd, initialize the drawing of either cursor or selection area\n */\n _mouseDownHandler: function(options) {\n if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) {\n return;\n }\n\n this.__isMousedown = true;\n\n if (this.selected) {\n this.setCursorByClick(options.e);\n }\n\n if (this.isEditing) {\n this.__selectionStartOnMouseDown = this.selectionStart;\n if (this.selectionStart === this.selectionEnd) {\n this.abortCursorAnimation();\n }\n this.renderCursorOrSelection();\n }\n },\n\n /**\n * Default event handler for the basic functionalities needed on mousedown:before\n * can be overridden to do something different.\n * Scope of this implementation is: verify the object is already selected when mousing down\n */\n _mouseDownHandlerBefore: function(options) {\n if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) {\n return;\n }\n // we want to avoid that an object that was selected and then becomes unselectable,\n // may trigger editing mode in some way.\n this.selected = this === this.canvas._activeObject;\n },\n\n /**\n * Initializes \"mousedown\" event handler\n */\n initMousedownHandler: function() {\n this.on('mousedown', this._mouseDownHandler);\n this.on('mousedown:before', this._mouseDownHandlerBefore);\n },\n\n /**\n * Initializes \"mouseup\" event handler\n */\n initMouseupHandler: function() {\n this.on('mouseup', this.mouseUpHandler);\n },\n\n /**\n * standard hander for mouse up, overridable\n * @private\n */\n mouseUpHandler: function(options) {\n this.__isMousedown = false;\n if (!this.editable || this.group ||\n (options.transform && options.transform.actionPerformed) ||\n (options.e.button && options.e.button !== 1)) {\n return;\n }\n\n if (this.canvas) {\n var currentActive = this.canvas._activeObject;\n if (currentActive && currentActive !== this) {\n // avoid running this logic when there is an active object\n // this because is possible with shift click and fast clicks,\n // to rapidly deselect and reselect this object and trigger an enterEdit\n return;\n }\n }\n\n if (this.__lastSelected && !this.__corner) {\n this.selected = false;\n this.__lastSelected = false;\n this.enterEditing(options.e);\n if (this.selectionStart === this.selectionEnd) {\n this.initDelayedCursor(true);\n }\n else {\n this.renderCursorOrSelection();\n }\n }\n else {\n this.selected = true;\n }\n },\n\n /**\n * Changes cursor location in a text depending on passed pointer (x/y) object\n * @param {Event} e Event object\n */\n setCursorByClick: function(e) {\n var newSelection = this.getSelectionStartFromPointer(e),\n start = this.selectionStart, end = this.selectionEnd;\n if (e.shiftKey) {\n this.setSelectionStartEndWithShift(start, end, newSelection);\n }\n else {\n this.selectionStart = newSelection;\n this.selectionEnd = newSelection;\n }\n if (this.isEditing) {\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n },\n\n /**\n * Returns index of a character corresponding to where an object was clicked\n * @param {Event} e Event object\n * @return {Number} Index of a character\n */\n getSelectionStartFromPointer: function(e) {\n var mouseOffset = this.getLocalPointer(e),\n prevWidth = 0,\n width = 0,\n height = 0,\n charIndex = 0,\n lineIndex = 0,\n lineLeftOffset,\n line;\n\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n if (height <= mouseOffset.y) {\n height += this.getHeightOfLine(i) * this.scaleY;\n lineIndex = i;\n if (i > 0) {\n charIndex += this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n }\n }\n else {\n break;\n }\n }\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n width = lineLeftOffset * this.scaleX;\n line = this._textLines[lineIndex];\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n prevWidth = width;\n // i removed something about flipX here, check.\n width += this.__charBounds[lineIndex][j].kernedWidth * this.scaleX;\n if (width <= mouseOffset.x) {\n charIndex++;\n }\n else {\n break;\n }\n }\n return this._getNewSelectionStartFromOffset(mouseOffset, prevWidth, width, charIndex, jlen);\n },\n\n /**\n * @private\n */\n _getNewSelectionStartFromOffset: function(mouseOffset, prevWidth, width, index, jlen) {\n // we need Math.abs because when width is after the last char, the offset is given as 1, while is 0\n var distanceBtwLastCharAndCursor = mouseOffset.x - prevWidth,\n distanceBtwNextCharAndCursor = width - mouseOffset.x,\n offset = distanceBtwNextCharAndCursor > distanceBtwLastCharAndCursor ||\n distanceBtwNextCharAndCursor < 0 ? 0 : 1,\n newSelectionStart = index + offset;\n // if object is horizontally flipped, mirror cursor location from the end\n if (this.flipX) {\n newSelectionStart = jlen - newSelectionStart;\n }\n\n if (newSelectionStart > this._text.length) {\n newSelectionStart = this._text.length;\n }\n\n return newSelectionStart;\n }\n});\n\n\nfabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n\n /**\n * Initializes hidden textarea (needed to bring up keyboard in iOS)\n */\n initHiddenTextarea: function() {\n this.hiddenTextarea = fabric.document.createElement('textarea');\n this.hiddenTextarea.setAttribute('autocapitalize', 'off');\n this.hiddenTextarea.setAttribute('autocorrect', 'off');\n this.hiddenTextarea.setAttribute('autocomplete', 'off');\n this.hiddenTextarea.setAttribute('spellcheck', 'false');\n this.hiddenTextarea.setAttribute('data-fabric-hiddentextarea', '');\n this.hiddenTextarea.setAttribute('wrap', 'off');\n var style = this._calcTextareaPosition();\n // line-height: 1px; was removed from the style to fix this:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=870966\n this.hiddenTextarea.style.cssText = 'position: absolute; top: ' + style.top +\n '; left: ' + style.left + '; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px;' +\n ' paddingーtop: ' + style.fontSize + ';';\n fabric.document.body.appendChild(this.hiddenTextarea);\n\n fabric.util.addListener(this.hiddenTextarea, 'keydown', this.onKeyDown.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'keyup', this.onKeyUp.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'input', this.onInput.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'copy', this.copy.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'cut', this.copy.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'paste', this.paste.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'compositionstart', this.onCompositionStart.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'compositionupdate', this.onCompositionUpdate.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'compositionend', this.onCompositionEnd.bind(this));\n\n if (!this._clickHandlerInitialized && this.canvas) {\n fabric.util.addListener(this.canvas.upperCanvasEl, 'click', this.onClick.bind(this));\n this._clickHandlerInitialized = true;\n }\n },\n\n /**\n * For functionalities on keyDown\n * Map a special key to a function of the instance/prototype\n * If you need different behaviour for ESC or TAB or arrows, you have to change\n * this map setting the name of a function that you build on the fabric.Itext or\n * your prototype.\n * the map change will affect all Instances unless you need for only some text Instances\n * in that case you have to clone this object and assign your Instance.\n * this.keysMap = fabric.util.object.clone(this.keysMap);\n * The function must be in fabric.Itext.prototype.myFunction And will receive event as args[0]\n */\n keysMap: {\n 9: 'exitEditing',\n 27: 'exitEditing',\n 33: 'moveCursorUp',\n 34: 'moveCursorDown',\n 35: 'moveCursorRight',\n 36: 'moveCursorLeft',\n 37: 'moveCursorLeft',\n 38: 'moveCursorUp',\n 39: 'moveCursorRight',\n 40: 'moveCursorDown',\n },\n\n /**\n * For functionalities on keyUp + ctrl || cmd\n */\n ctrlKeysMapUp: {\n 67: 'copy',\n 88: 'cut'\n },\n\n /**\n * For functionalities on keyDown + ctrl || cmd\n */\n ctrlKeysMapDown: {\n 65: 'selectAll'\n },\n\n onClick: function() {\n // No need to trigger click event here, focus is enough to have the keyboard appear on Android\n this.hiddenTextarea && this.hiddenTextarea.focus();\n },\n\n /**\n * Handles keyup event\n * @param {Event} e Event object\n */\n onKeyDown: function(e) {\n if (!this.isEditing || this.inCompositionMode) {\n return;\n }\n if (e.keyCode in this.keysMap) {\n this[this.keysMap[e.keyCode]](e);\n }\n else if ((e.keyCode in this.ctrlKeysMapDown) && (e.ctrlKey || e.metaKey)) {\n this[this.ctrlKeysMapDown[e.keyCode]](e);\n }\n else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n if (e.keyCode >= 33 && e.keyCode <= 40) {\n // if i press an arrow key just update selection\n this.clearContextTop();\n this.renderCursorOrSelection();\n }\n else {\n this.canvas && this.canvas.requestRenderAll();\n }\n },\n\n /**\n * Handles keyup event\n * We handle KeyUp because ie11 and edge have difficulties copy/pasting\n * if a copy/cut event fired, keyup is dismissed\n * @param {Event} e Event object\n */\n onKeyUp: function(e) {\n if (!this.isEditing || this._copyDone || this.inCompositionMode) {\n this._copyDone = false;\n return;\n }\n if ((e.keyCode in this.ctrlKeysMapUp) && (e.ctrlKey || e.metaKey)) {\n this[this.ctrlKeysMapUp[e.keyCode]](e);\n }\n else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n this.canvas && this.canvas.requestRenderAll();\n },\n\n /**\n * Handles onInput event\n * @param {Event} e Event object\n */\n onInput: function(e) {\n var fromPaste = this.fromPaste;\n this.fromPaste = false;\n e && e.stopPropagation();\n if (!this.isEditing) {\n return;\n }\n // decisions about style changes.\n var nextText = this._splitTextIntoLines(this.hiddenTextarea.value).graphemeText,\n charCount = this._text.length,\n nextCharCount = nextText.length,\n removedText, insertedText,\n charDiff = nextCharCount - charCount;\n if (this.hiddenTextarea.value === '') {\n this.styles = { };\n this.updateFromTextArea();\n this.fire('changed');\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this });\n this.canvas.requestRenderAll();\n }\n return;\n }\n\n var textareaSelection = this.fromStringToGraphemeSelection(\n this.hiddenTextarea.selectionStart,\n this.hiddenTextarea.selectionEnd,\n this.hiddenTextarea.value\n );\n var backDelete = this.selectionStart > textareaSelection.selectionStart;\n\n if (this.selectionStart !== this.selectionEnd) {\n removedText = this._text.slice(this.selectionStart, this.selectionEnd);\n charDiff += this.selectionEnd - this.selectionStart;\n }\n else if (nextCharCount < charCount) {\n if (backDelete) {\n removedText = this._text.slice(this.selectionEnd + charDiff, this.selectionEnd);\n }\n else {\n removedText = this._text.slice(this.selectionStart, this.selectionStart - charDiff);\n }\n }\n insertedText = nextText.slice(textareaSelection.selectionEnd - charDiff, textareaSelection.selectionEnd);\n if (removedText && removedText.length) {\n if (this.selectionStart !== this.selectionEnd) {\n this.removeStyleFromTo(this.selectionStart, this.selectionEnd);\n }\n else if (backDelete) {\n // detect differencies between forwardDelete and backDelete\n this.removeStyleFromTo(this.selectionEnd - removedText.length, this.selectionEnd);\n }\n else {\n this.removeStyleFromTo(this.selectionEnd, this.selectionEnd + removedText.length);\n }\n }\n if (insertedText.length) {\n if (fromPaste && insertedText.join('') === fabric.copiedText && !fabric.disableStyleCopyPaste) {\n this.insertNewStyleBlock(insertedText, this.selectionStart, fabric.copiedTextStyle);\n }\n else {\n this.insertNewStyleBlock(insertedText, this.selectionStart);\n }\n }\n this.updateFromTextArea();\n this.fire('changed');\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this });\n this.canvas.requestRenderAll();\n }\n },\n /**\n * Composition start\n */\n onCompositionStart: function() {\n this.inCompositionMode = true;\n },\n\n /**\n * Composition end\n */\n onCompositionEnd: function() {\n this.inCompositionMode = false;\n },\n\n // /**\n // * Composition update\n // */\n onCompositionUpdate: function(e) {\n this.compositionStart = e.target.selectionStart;\n this.compositionEnd = e.target.selectionEnd;\n this.updateTextareaPosition();\n },\n\n /**\n * Copies selected text\n * @param {Event} e Event object\n */\n copy: function() {\n if (this.selectionStart === this.selectionEnd) {\n //do not cut-copy if no selection\n return;\n }\n\n fabric.copiedText = this.getSelectedText();\n if (!fabric.disableStyleCopyPaste) {\n fabric.copiedTextStyle = this.getSelectionStyles(this.selectionStart, this.selectionEnd, true);\n }\n else {\n fabric.copiedTextStyle = null;\n }\n this._copyDone = true;\n },\n\n /**\n * Pastes text\n * @param {Event} e Event object\n */\n paste: function() {\n this.fromPaste = true;\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @return {Object} Clipboard data object\n */\n _getClipboardData: function(e) {\n return (e && e.clipboardData) || fabric.window.clipboardData;\n },\n\n /**\n * Finds the width in pixels before the cursor on the same line\n * @private\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Number} widthBeforeCursor width before cursor\n */\n _getWidthBeforeCursor: function(lineIndex, charIndex) {\n var widthBeforeCursor = this._getLineLeftOffset(lineIndex), bound;\n\n if (charIndex > 0) {\n bound = this.__charBounds[lineIndex][charIndex - 1];\n widthBeforeCursor += bound.left + bound.width;\n }\n return widthBeforeCursor;\n },\n\n /**\n * Gets start offset of a selection\n * @param {Event} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getDownCursorOffset: function(e, isRight) {\n var selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n // if on last line, down cursor goes to end of line\n if (lineIndex === this._textLines.length - 1 || e.metaKey || e.keyCode === 34) {\n // move to the end of a text\n return this._text.length - selectionProp;\n }\n var charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),\n textAfterCursor = this._textLines[lineIndex].slice(charIndex);\n return textAfterCursor.length + indexOnOtherLine + 1 + this.missingNewlineOffset(lineIndex);\n },\n\n /**\n * private\n * Helps finding if the offset should be counted from Start or End\n * @param {Event} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n _getSelectionForOffset: function(e, isRight) {\n if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {\n return this.selectionEnd;\n }\n else {\n return this.selectionStart;\n }\n },\n\n /**\n * @param {Event} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getUpCursorOffset: function(e, isRight) {\n var selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {\n // if on first line, up cursor goes to start of line\n return -selectionProp;\n }\n var charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),\n textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),\n missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);\n // return a negative offset\n return -this._textLines[lineIndex - 1].length\n + indexOnOtherLine - textBeforeCursor.length + (1 - missingNewlineOffset);\n },\n\n /**\n * for a given width it founds the matching character.\n * @private\n */\n _getIndexOnLine: function(lineIndex, width) {\n\n var line = this._textLines[lineIndex],\n lineLeftOffset = this._getLineLeftOffset(lineIndex),\n widthOfCharsOnLine = lineLeftOffset,\n indexOnLine = 0, charWidth, foundMatch;\n\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charWidth = this.__charBounds[lineIndex][j].width;\n widthOfCharsOnLine += charWidth;\n if (widthOfCharsOnLine > width) {\n foundMatch = true;\n var leftEdge = widthOfCharsOnLine - charWidth,\n rightEdge = widthOfCharsOnLine,\n offsetFromLeftEdge = Math.abs(leftEdge - width),\n offsetFromRightEdge = Math.abs(rightEdge - width);\n\n indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : (j - 1);\n break;\n }\n }\n\n // reached end\n if (!foundMatch) {\n indexOnLine = line.length - 1;\n }\n\n return indexOnLine;\n },\n\n\n /**\n * Moves cursor down\n * @param {Event} e Event object\n */\n moveCursorDown: function(e) {\n if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) {\n return;\n }\n this._moveCursorUpOrDown('Down', e);\n },\n\n /**\n * Moves cursor up\n * @param {Event} e Event object\n */\n moveCursorUp: function(e) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorUpOrDown('Up', e);\n },\n\n /**\n * Moves cursor up or down, fires the events\n * @param {String} direction 'Up' or 'Down'\n * @param {Event} e Event object\n */\n _moveCursorUpOrDown: function(direction, e) {\n // getUpCursorOffset\n // getDownCursorOffset\n var action = 'get' + direction + 'CursorOffset',\n offset = this[action](e, this._selectionDirection === 'right');\n if (e.shiftKey) {\n this.moveCursorWithShift(offset);\n }\n else {\n this.moveCursorWithoutShift(offset);\n }\n if (offset !== 0) {\n this.setSelectionInBoundaries();\n this.abortCursorAnimation();\n this._currentCursorOpacity = 1;\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n },\n\n /**\n * Moves cursor with shift\n * @param {Number} offset\n */\n moveCursorWithShift: function(offset) {\n var newSelection = this._selectionDirection === 'left'\n ? this.selectionStart + offset\n : this.selectionEnd + offset;\n this.setSelectionStartEndWithShift(this.selectionStart, this.selectionEnd, newSelection);\n return offset !== 0;\n },\n\n /**\n * Moves cursor up without shift\n * @param {Number} offset\n */\n moveCursorWithoutShift: function(offset) {\n if (offset < 0) {\n this.selectionStart += offset;\n this.selectionEnd = this.selectionStart;\n }\n else {\n this.selectionEnd += offset;\n this.selectionStart = this.selectionEnd;\n }\n return offset !== 0;\n },\n\n /**\n * Moves cursor left\n * @param {Event} e Event object\n */\n moveCursorLeft: function(e) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorLeftOrRight('Left', e);\n },\n\n /**\n * @private\n * @return {Boolean} true if a change happened\n */\n _move: function(e, prop, direction) {\n var newValue;\n if (e.altKey) {\n newValue = this['findWordBoundary' + direction](this[prop]);\n }\n else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36 ) {\n newValue = this['findLineBoundary' + direction](this[prop]);\n }\n else {\n this[prop] += direction === 'Left' ? -1 : 1;\n return true;\n }\n if (typeof newValue !== undefined && this[prop] !== newValue) {\n this[prop] = newValue;\n return true;\n }\n },\n\n /**\n * @private\n */\n _moveLeft: function(e, prop) {\n return this._move(e, prop, 'Left');\n },\n\n /**\n * @private\n */\n _moveRight: function(e, prop) {\n return this._move(e, prop, 'Right');\n },\n\n /**\n * Moves cursor left without keeping selection\n * @param {Event} e\n */\n moveCursorLeftWithoutShift: function(e) {\n var change = true;\n this._selectionDirection = 'left';\n\n // only move cursor when there is no selection,\n // otherwise we discard it, and leave cursor on same place\n if (this.selectionEnd === this.selectionStart && this.selectionStart !== 0) {\n change = this._moveLeft(e, 'selectionStart');\n\n }\n this.selectionEnd = this.selectionStart;\n return change;\n },\n\n /**\n * Moves cursor left while keeping selection\n * @param {Event} e\n */\n moveCursorLeftWithShift: function(e) {\n if (this._selectionDirection === 'right' && this.selectionStart !== this.selectionEnd) {\n return this._moveLeft(e, 'selectionEnd');\n }\n else if (this.selectionStart !== 0){\n this._selectionDirection = 'left';\n return this._moveLeft(e, 'selectionStart');\n }\n },\n\n /**\n * Moves cursor right\n * @param {Event} e Event object\n */\n moveCursorRight: function(e) {\n if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) {\n return;\n }\n this._moveCursorLeftOrRight('Right', e);\n },\n\n /**\n * Moves cursor right or Left, fires event\n * @param {String} direction 'Left', 'Right'\n * @param {Event} e Event object\n */\n _moveCursorLeftOrRight: function(direction, e) {\n var actionName = 'moveCursor' + direction + 'With';\n this._currentCursorOpacity = 1;\n\n if (e.shiftKey) {\n actionName += 'Shift';\n }\n else {\n actionName += 'outShift';\n }\n if (this[actionName](e)) {\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n },\n\n /**\n * Moves cursor right while keeping selection\n * @param {Event} e\n */\n moveCursorRightWithShift: function(e) {\n if (this._selectionDirection === 'left' && this.selectionStart !== this.selectionEnd) {\n return this._moveRight(e, 'selectionStart');\n }\n else if (this.selectionEnd !== this._text.length) {\n this._selectionDirection = 'right';\n return this._moveRight(e, 'selectionEnd');\n }\n },\n\n /**\n * Moves cursor right without keeping selection\n * @param {Event} e Event object\n */\n moveCursorRightWithoutShift: function(e) {\n var changed = true;\n this._selectionDirection = 'right';\n\n if (this.selectionStart === this.selectionEnd) {\n changed = this._moveRight(e, 'selectionStart');\n this.selectionEnd = this.selectionStart;\n }\n else {\n this.selectionStart = this.selectionEnd;\n }\n return changed;\n },\n\n /**\n * Removes characters from start/end\n * start/end ar per grapheme position in _text array.\n *\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n removeChars: function(start, end) {\n if (typeof end === 'undefined') {\n end = start + 1;\n }\n this.removeStyleFromTo(start, end);\n this._text.splice(start, end - start);\n this.text = this._text.join('');\n this.set('dirty', true);\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n this._removeExtraneousStyles();\n },\n\n /**\n * insert characters at start position, before start position.\n * start equal 1 it means the text get inserted between actual grapheme 0 and 1\n * if style array is provided, it must be as the same length of text in graphemes\n * if end is provided and is bigger than start, old text is replaced.\n * start/end ar per grapheme position in _text array.\n *\n * @param {String} text text to insert\n * @param {Array} style array of style objects\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n insertChars: function(text, style, start, end) {\n if (typeof end === 'undefined') {\n end = start;\n }\n if (end > start) {\n this.removeStyleFromTo(start, end);\n }\n var graphemes = fabric.util.string.graphemeSplit(text);\n this.insertNewStyleBlock(graphemes, start, style);\n this._text = [].concat(this._text.slice(0, start), graphemes, this._text.slice(end));\n this.text = this._text.join('');\n this.set('dirty', true);\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n this._removeExtraneousStyles();\n },\n\n});\n\n\n/* _TO_SVG_START_ */\n(function() {\n var toFixed = fabric.util.toFixed,\n multipleSpacesRegex = / +/g;\n\n fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ {\n\n /**\n * Returns SVG representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG: function() {\n var offsets = this._getSVGLeftTopOffsets(),\n textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft);\n return this._wrapSVGTextAndBg(textAndBg);\n },\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG: function(reviver) {\n return this._createBaseSVGMarkup(\n this._toSVG(),\n { reviver: reviver, noStyle: true, withShadow: true }\n );\n },\n\n /**\n * @private\n */\n _getSVGLeftTopOffsets: function() {\n return {\n textLeft: -this.width / 2,\n textTop: -this.height / 2,\n lineTop: this.getHeightOfLine(0)\n };\n },\n\n /**\n * @private\n */\n _wrapSVGTextAndBg: function(textAndBg) {\n var noShadow = true,\n textDecoration = this.getSvgTextDecoration(this);\n return [\n textAndBg.textBgRects.join(''),\n '\\t\\t',\n textAndBg.textSpans.join(''),\n '\\n'\n ];\n },\n\n /**\n * @private\n * @param {Number} textTopOffset Text top offset\n * @param {Number} textLeftOffset Text left offset\n * @return {Object}\n */\n _getSVGTextAndBg: function(textTopOffset, textLeftOffset) {\n var textSpans = [],\n textBgRects = [],\n height = textTopOffset, lineOffset;\n // bounding-box background\n this._setSVGBg(textBgRects);\n\n // text and text-background\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n lineOffset = this._getLineLeftOffset(i);\n if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) {\n this._setSVGTextLineBg(textBgRects, i, textLeftOffset + lineOffset, height);\n }\n this._setSVGTextLineText(textSpans, i, textLeftOffset + lineOffset, height);\n height += this.getHeightOfLine(i);\n }\n\n return {\n textSpans: textSpans,\n textBgRects: textBgRects\n };\n },\n\n /**\n * @private\n */\n _createTextCharSpan: function(_char, styleDecl, left, top) {\n var shouldUseWhitespace = _char !== _char.trim() || _char.match(multipleSpacesRegex),\n styleProps = this.getSvgSpanStyles(styleDecl, shouldUseWhitespace),\n fillStyles = styleProps ? 'style=\"' + styleProps + '\"' : '',\n dy = styleDecl.deltaY, dySpan = '',\n NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n if (dy) {\n dySpan = ' dy=\"' + toFixed(dy, NUM_FRACTION_DIGITS) + '\" ';\n }\n return [\n '',\n fabric.util.string.escapeXml(_char),\n ''\n ].join('');\n },\n\n _setSVGTextLineText: function(textSpans, lineIndex, textLeftOffset, textTopOffset) {\n // set proper line offset\n var lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.indexOf('justify') !== -1,\n actualStyle,\n nextStyle,\n charsToRender = '',\n charBox, style,\n boxWidth = 0,\n line = this._textLines[lineIndex],\n timeToRender;\n\n textTopOffset += lineHeight * (1 - this._fontSizeFraction) / this.lineHeight;\n for (var i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n textLeftOffset += charBox.kernedWidth - charBox.width;\n boxWidth += charBox.width;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = this._hasStyleChangedForSvg(actualStyle, nextStyle);\n }\n if (timeToRender) {\n style = this._getStyleDeclaration(lineIndex, i) || { };\n textSpans.push(this._createTextCharSpan(charsToRender, style, textLeftOffset, textTopOffset));\n charsToRender = '';\n actualStyle = nextStyle;\n textLeftOffset += boxWidth;\n boxWidth = 0;\n }\n }\n },\n\n _pushTextBgRect: function(textBgRects, color, left, top, width, height) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n textBgRects.push(\n '\\t\\t\\n');\n },\n\n _setSVGTextLineBg: function(textBgRects, i, leftOffset, textTopOffset) {\n var line = this._textLines[i],\n heightOfLine = this.getHeightOfLine(i) / this.lineHeight,\n boxWidth = 0,\n boxStart = 0,\n charBox, currentColor,\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charBox = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (currentColor !== lastColor) {\n lastColor && this._pushTextBgRect(textBgRects, lastColor, leftOffset + boxStart,\n textTopOffset, boxWidth, heightOfLine);\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastColor = currentColor;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n }\n currentColor && this._pushTextBgRect(textBgRects, currentColor, leftOffset + boxStart,\n textTopOffset, boxWidth, heightOfLine);\n },\n\n /**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n *\n * @private\n * @param {*} value\n * @return {String}\n */\n _getFillAttributes: function(value) {\n var fillColor = (value && typeof value === 'string') ? new fabric.Color(value) : '';\n if (!fillColor || !fillColor.getSource() || fillColor.getAlpha() === 1) {\n return 'fill=\"' + value + '\"';\n }\n return 'opacity=\"' + fillColor.getAlpha() + '\" fill=\"' + fillColor.setAlpha(1).toRgb() + '\"';\n },\n\n /**\n * @private\n */\n _getSVGLineTopOffset: function(lineIndex) {\n var lineTopOffset = 0, lastHeight = 0;\n for (var j = 0; j < lineIndex; j++) {\n lineTopOffset += this.getHeightOfLine(j);\n }\n lastHeight = this.getHeightOfLine(j);\n return {\n lineTop: lineTopOffset,\n offset: (this._fontSizeMult - this._fontSizeFraction) * lastHeight / (this.lineHeight * this._fontSizeMult)\n };\n },\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles: function(skipShadow) {\n var svgStyle = fabric.Object.prototype.getSvgStyles.call(this, skipShadow);\n return svgStyle + ' white-space: pre;';\n },\n });\n})();\n/* _TO_SVG_END_ */\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = {});\n\n /**\n * Textbox class, based on IText, allows the user to resize the text rectangle\n * and wraps lines automatically. Textboxes have their Y scaling locked, the\n * user can only change width. Height is adjusted automatically based on the\n * wrapping of lines.\n * @class fabric.Textbox\n * @extends fabric.IText\n * @mixes fabric.Observable\n * @return {fabric.Textbox} thisArg\n * @see {@link fabric.Textbox#initialize} for constructor definition\n */\n fabric.Textbox = fabric.util.createClass(fabric.IText, fabric.Observable, {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'textbox',\n\n /**\n * Minimum width of textbox, in pixels.\n * @type Number\n * @default\n */\n minWidth: 20,\n\n /**\n * Minimum calculated width of a textbox, in pixels.\n * fixed to 2 so that an empty textbox cannot go to 0\n * and is still selectable without text.\n * @type Number\n * @default\n */\n dynamicMinWidth: 2,\n\n /**\n * Cached array of text wrapping.\n * @type Array\n */\n __cachedLines: null,\n\n /**\n * Override standard Object class values\n */\n lockScalingFlip: true,\n\n /**\n * Override standard Object class values\n * Textbox needs this on false\n */\n noScaleCache: false,\n\n /**\n * Properties which when set cause object to change dimensions\n * @type Object\n * @private\n */\n _dimensionAffectingProps: fabric.Text.prototype._dimensionAffectingProps.concat('width'),\n\n /**\n * Use this regular expression to split strings in breakable lines\n * @private\n */\n _wordJoiners: /[ \\t\\r]/,\n\n /**\n * Use this boolean property in order to split strings that have no white space concept.\n * this is a cheap way to help with chinese/japaense\n * @type Boolean\n * @since 2.6.0\n */\n splitByGrapheme: false,\n\n /**\n * Unlike superclass's version of this function, Textbox does not update\n * its width.\n * @private\n * @override\n */\n initDimensions: function() {\n if (this.__skipDimension) {\n return;\n }\n this.isEditing && this.initDelayedCursor();\n this.clearContextTop();\n this._clearCache();\n // clear dynamicMinWidth as it will be different after we re-wrap line\n this.dynamicMinWidth = 0;\n // wrap lines\n this._styleMap = this._generateStyleMap(this._splitText());\n // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap\n if (this.dynamicMinWidth > this.width) {\n this._set('width', this.dynamicMinWidth);\n }\n if (this.textAlign.indexOf('justify') !== -1) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n // clear cache and re-calculate height\n this.height = this.calcTextHeight();\n this.saveState({ propertySet: '_dimensionAffectingProps' });\n },\n\n /**\n * Generate an object that translates the style object so that it is\n * broken up by visual lines (new lines and automatic wrapping).\n * The original text styles object is broken up by actual lines (new lines only),\n * which is only sufficient for Text / IText\n * @private\n */\n _generateStyleMap: function(textInfo) {\n var realLineCount = 0,\n realLineCharCount = 0,\n charCount = 0,\n map = {};\n\n for (var i = 0; i < textInfo.graphemeLines.length; i++) {\n if (textInfo.graphemeText[charCount] === '\\n' && i > 0) {\n realLineCharCount = 0;\n charCount++;\n realLineCount++;\n }\n else if (!this.splitByGrapheme && this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) && i > 0) {\n // this case deals with space's that are removed from end of lines when wrapping\n realLineCharCount++;\n charCount++;\n }\n\n map[i] = { line: realLineCount, offset: realLineCharCount };\n\n charCount += textInfo.graphemeLines[i].length;\n realLineCharCount += textInfo.graphemeLines[i].length;\n }\n\n return map;\n },\n\n /**\n * Returns true if object has a style property or has it on a specified line\n * @param {Number} lineIndex\n * @return {Boolean}\n */\n styleHas: function(property, lineIndex) {\n if (this._styleMap && !this.isWrapping) {\n var map = this._styleMap[lineIndex];\n if (map) {\n lineIndex = map.line;\n }\n }\n return fabric.Text.prototype.styleHas.call(this, property, lineIndex);\n },\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles: function(lineIndex) {\n if (!this.styles) {\n return true;\n }\n var offset = 0, nextLineIndex = lineIndex + 1, nextOffset, obj, shouldLimit = false,\n map = this._styleMap[lineIndex], mapNextLine = this._styleMap[lineIndex + 1];\n if (map) {\n lineIndex = map.line;\n offset = map.offset;\n }\n if (mapNextLine) {\n nextLineIndex = mapNextLine.line;\n shouldLimit = nextLineIndex === lineIndex;\n nextOffset = mapNextLine.offset;\n }\n obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] };\n for (var p1 in obj) {\n for (var p2 in obj[p1]) {\n if (p2 >= offset && (!shouldLimit || p2 < nextOffset)) {\n // eslint-disable-next-line no-unused-vars\n for (var p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n }\n return true;\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n _getStyleDeclaration: function(lineIndex, charIndex) {\n if (this._styleMap && !this.isWrapping) {\n var map = this._styleMap[lineIndex];\n if (!map) {\n return null;\n }\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n }\n return this.callSuper('_getStyleDeclaration', lineIndex, charIndex);\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n _setStyleDeclaration: function(lineIndex, charIndex, style) {\n var map = this._styleMap[lineIndex];\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n\n this.styles[lineIndex][charIndex] = style;\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n _deleteStyleDeclaration: function(lineIndex, charIndex) {\n var map = this._styleMap[lineIndex];\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n delete this.styles[lineIndex][charIndex];\n },\n\n /**\n * probably broken need a fix\n * Returns the real style line that correspond to the wrapped lineIndex line\n * Used just to verify if the line does exist or not.\n * @param {Number} lineIndex\n * @returns {Boolean} if the line exists or not\n * @private\n */\n _getLineStyle: function(lineIndex) {\n var map = this._styleMap[lineIndex];\n return !!this.styles[map.line];\n },\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @param {Object} style\n * @private\n */\n _setLineStyle: function(lineIndex) {\n var map = this._styleMap[lineIndex];\n this.styles[map.line] = {};\n },\n\n /**\n * Wraps text using the 'width' property of Textbox. First this function\n * splits text on newlines, so we preserve newlines entered by the user.\n * Then it wraps each line using the width of the Textbox by calling\n * _wrapLine().\n * @param {Array} lines The string array of text that is split into lines\n * @param {Number} desiredWidth width you want to wrap to\n * @returns {Array} Array of lines\n */\n _wrapText: function(lines, desiredWidth) {\n var wrapped = [], i;\n this.isWrapping = true;\n for (i = 0; i < lines.length; i++) {\n wrapped = wrapped.concat(this._wrapLine(lines[i], i, desiredWidth));\n }\n this.isWrapping = false;\n return wrapped;\n },\n\n /**\n * Helper function to measure a string of text, given its lineIndex and charIndex offset\n * it gets called when charBounds are not available yet.\n * @param {CanvasRenderingContext2D} ctx\n * @param {String} text\n * @param {number} lineIndex\n * @param {number} charOffset\n * @returns {number}\n * @private\n */\n _measureWord: function(word, lineIndex, charOffset) {\n var width = 0, prevGrapheme, skipLeft = true;\n charOffset = charOffset || 0;\n for (var i = 0, len = word.length; i < len; i++) {\n var box = this._getGraphemeBox(word[i], lineIndex, i + charOffset, prevGrapheme, skipLeft);\n width += box.kernedWidth;\n prevGrapheme = word[i];\n }\n return width;\n },\n\n /**\n * Wraps a line of text using the width of the Textbox and a context.\n * @param {Array} line The grapheme array that represent the line\n * @param {Number} lineIndex\n * @param {Number} desiredWidth width you want to wrap the line to\n * @param {Number} reservedSpace space to remove from wrapping for custom functionalities\n * @returns {Array} Array of line(s) into which the given text is wrapped\n * to.\n */\n _wrapLine: function(_line, lineIndex, desiredWidth, reservedSpace) {\n var lineWidth = 0,\n splitByGrapheme = this.splitByGrapheme,\n graphemeLines = [],\n line = [],\n // spaces in different languges?\n words = splitByGrapheme ? fabric.util.string.graphemeSplit(_line) : _line.split(this._wordJoiners),\n word = '',\n offset = 0,\n infix = splitByGrapheme ? '' : ' ',\n wordWidth = 0,\n infixWidth = 0,\n largestWordWidth = 0,\n lineJustStarted = true,\n additionalSpace = splitByGrapheme ? 0 : this._getWidthOfCharSpacing(),\n reservedSpace = reservedSpace || 0;\n // fix a difference between split and graphemeSplit\n if (words.length === 0) {\n words.push([]);\n }\n desiredWidth -= reservedSpace;\n for (var i = 0; i < words.length; i++) {\n // if using splitByGrapheme words are already in graphemes.\n word = splitByGrapheme ? words[i] : fabric.util.string.graphemeSplit(words[i]);\n wordWidth = this._measureWord(word, lineIndex, offset);\n offset += word.length;\n\n lineWidth += infixWidth + wordWidth - additionalSpace;\n\n if (lineWidth >= desiredWidth && !lineJustStarted) {\n graphemeLines.push(line);\n line = [];\n lineWidth = wordWidth;\n lineJustStarted = true;\n }\n else {\n lineWidth += additionalSpace;\n }\n\n if (!lineJustStarted && !splitByGrapheme) {\n line.push(infix);\n }\n line = line.concat(word);\n\n infixWidth = this._measureWord([infix], lineIndex, offset);\n offset++;\n lineJustStarted = false;\n // keep track of largest word\n if (wordWidth > largestWordWidth) {\n largestWordWidth = wordWidth;\n }\n }\n\n i && graphemeLines.push(line);\n\n if (largestWordWidth + reservedSpace > this.dynamicMinWidth) {\n this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace;\n }\n\n return graphemeLines;\n },\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @param {Number} lineIndex text to split\n * @return {Boolean}\n */\n isEndOfWrapping: function(lineIndex) {\n if (!this._styleMap[lineIndex + 1]) {\n // is last line, return true;\n return true;\n }\n if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) {\n // this is last line before a line break, return true;\n return true;\n }\n return false;\n },\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * @return Number\n */\n missingNewlineOffset: function(lineIndex) {\n if (this.splitByGrapheme) {\n return this.isEndOfWrapping(lineIndex) ? 1 : 0;\n }\n return 1;\n },\n\n /**\n * Gets lines of text to render in the Textbox. This function calculates\n * text wrapping on the fly every time it is called.\n * @param {String} text text to split\n * @returns {Array} Array of lines in the Textbox.\n * @override\n */\n _splitTextIntoLines: function(text) {\n var newText = fabric.Text.prototype._splitTextIntoLines.call(this, text),\n graphemeLines = this._wrapText(newText.lines, this.width),\n lines = new Array(graphemeLines.length);\n for (var i = 0; i < graphemeLines.length; i++) {\n lines[i] = graphemeLines[i].join('');\n }\n newText.lines = lines;\n newText.graphemeLines = graphemeLines;\n return newText;\n },\n\n getMinWidth: function() {\n return Math.max(this.minWidth, this.dynamicMinWidth);\n },\n\n _removeExtraneousStyles: function() {\n var linesToKeep = {};\n for (var prop in this._styleMap) {\n if (this._textLines[prop]) {\n linesToKeep[this._styleMap[prop].line] = 1;\n }\n }\n for (var prop in this.styles) {\n if (!linesToKeep[prop]) {\n delete this.styles[prop];\n }\n }\n },\n\n /**\n * Returns object representation of an instance\n * @method toObject\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['minWidth', 'splitByGrapheme'].concat(propertiesToInclude));\n }\n });\n\n /**\n * Returns fabric.Textbox instance from an object representation\n * @static\n * @memberOf fabric.Textbox\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Textbox instance is created\n */\n fabric.Textbox.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Textbox', object, callback, 'text');\n };\n})(typeof exports !== 'undefined' ? exports : this);\n\n","exports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DesignEditor.vue?vue&type=style&index=0&id=543d8d62&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DesignEditor.vue?vue&type=style&index=0&id=543d8d62&lang=scss&scoped=true&\"","/**!\n * Sortable 1.10.2\n * @author\tRubaXa \n * @author\towenm \n * @license MIT\n */\nfunction _typeof(obj) {\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _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\n return obj;\n}\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n\n ownKeys.forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n }\n\n return target;\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n}\n\nfunction _iterableToArray(iter) {\n if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n}\n\nvar version = \"1.10.2\";\n\nfunction userAgent(pattern) {\n if (typeof window !== 'undefined' && window.navigator) {\n return !!\n /*@__PURE__*/\n navigator.userAgent.match(pattern);\n }\n}\n\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n\nvar captureMode = {\n capture: false,\n passive: false\n};\n\nfunction on(el, event, fn) {\n el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\n\nfunction off(el, event, fn) {\n el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\n\nfunction matches(\n/**HTMLElement*/\nel,\n/**String*/\nselector) {\n if (!selector) return;\n selector[0] === '>' && (selector = selector.substring(1));\n\n if (el) {\n try {\n if (el.matches) {\n return el.matches(selector);\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(selector);\n } else if (el.webkitMatchesSelector) {\n return el.webkitMatchesSelector(selector);\n }\n } catch (_) {\n return false;\n }\n }\n\n return false;\n}\n\nfunction getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\n\nfunction closest(\n/**HTMLElement*/\nel,\n/**String*/\nselector,\n/**HTMLElement*/\nctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n\n do {\n if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n return el;\n }\n\n if (el === ctx) break;\n /* jshint boss:true */\n } while (el = getParentOrHost(el));\n }\n\n return null;\n}\n\nvar R_SPACE = /\\s+/g;\n\nfunction toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) {\n el.classList[state ? 'add' : 'remove'](name);\n } else {\n var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\n el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\n }\n }\n}\n\nfunction css(el, prop, val) {\n var style = el && el.style;\n\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) {\n val = document.defaultView.getComputedStyle(el, '');\n } else if (el.currentStyle) {\n val = el.currentStyle;\n }\n\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf('webkit') === -1) {\n prop = '-webkit-' + prop;\n }\n\n style[prop] = val + (typeof val === 'string' ? '' : 'px');\n }\n }\n}\n\nfunction matrix(el, selfOnly) {\n var appliedTransforms = '';\n\n if (typeof el === 'string') {\n appliedTransforms = el;\n } else {\n do {\n var transform = css(el, 'transform');\n\n if (transform && transform !== 'none') {\n appliedTransforms = transform + ' ' + appliedTransforms;\n }\n /* jshint boss:true */\n\n } while (!selfOnly && (el = el.parentNode));\n }\n\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */\n\n return matrixFn && new matrixFn(appliedTransforms);\n}\n\nfunction find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName),\n i = 0,\n n = list.length;\n\n if (iterator) {\n for (; i < n; i++) {\n iterator(list[i], i);\n }\n }\n\n return list;\n }\n\n return [];\n}\n\nfunction getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n\n if (scrollingElement) {\n return scrollingElement;\n } else {\n return document.documentElement;\n }\n}\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\r\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\r\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\r\n * @param {[HTMLElement]} container The parent the element will be placed in\r\n * @return {Object} The boundingClientRect of el, with specified adjustments\r\n */\n\n\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n\n if (el !== window && el !== getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode; // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n\n if (!IE11OrLess) {\n do {\n if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\n var containerRect = container.getBoundingClientRect(); // Set relative to edges of padding box of container\n\n top -= containerRect.top + parseInt(css(container, 'border-top-width'));\n left -= containerRect.left + parseInt(css(container, 'border-left-width'));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n /* jshint boss:true */\n\n } while (container = container.parentNode);\n }\n }\n\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = matrix(container || el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d;\n\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\r\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */\n\n\nfunction isScrolledPast(el, elSide, parentSide) {\n var parent = getParentAutoScrollElement(el, true),\n elSideVal = getRect(el)[elSide];\n /* jshint boss:true */\n\n while (parent) {\n var parentSideVal = getRect(parent)[parentSide],\n visible = void 0;\n\n if (parentSide === 'top' || parentSide === 'left') {\n visible = elSideVal >= parentSideVal;\n } else {\n visible = elSideVal <= parentSideVal;\n }\n\n if (!visible) return parent;\n if (parent === getWindowScrollingElement()) break;\n parent = getParentAutoScrollElement(parent, false);\n }\n\n return false;\n}\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param {HTMLElement} el The parent element\r\n * @param {Number} childNum The index of the child\r\n * @param {Object} options Parent Sortable's options\r\n * @return {HTMLElement} The child at index childNum, or null if not found\r\n */\n\n\nfunction getChild(el, childNum, options) {\n var currentChild = 0,\n i = 0,\n children = el.children;\n\n while (i < children.length) {\n if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && children[i] !== Sortable.dragged && closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) {\n return children[i];\n }\n\n currentChild++;\n }\n\n i++;\n }\n\n return null;\n}\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param {HTMLElement} el Parent element\r\n * @param {selector} selector Any other elements that should be ignored\r\n * @return {HTMLElement} The last child, ignoring ghostEl\r\n */\n\n\nfunction lastChild(el, selector) {\n var last = el.lastElementChild;\n\n while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\n last = last.previousElementSibling;\n }\n\n return last || null;\n}\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param {HTMLElement} el\r\n * @param {selector} selector\r\n * @return {number}\r\n */\n\n\nfunction index(el, selector) {\n var index = 0;\n\n if (!el || !el.parentNode) {\n return -1;\n }\n /* jshint boss:true */\n\n\n while (el = el.previousElementSibling) {\n if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n index++;\n }\n }\n\n return index;\n}\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param {HTMLElement} el\r\n * @return {Array} Offsets in the format of [left, top]\r\n */\n\n\nfunction getRelativeScrollOffset(el) {\n var offsetLeft = 0,\n offsetTop = 0,\n winScroller = getWindowScrollingElement();\n\n if (el) {\n do {\n var elMatrix = matrix(el),\n scaleX = elMatrix.a,\n scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n } while (el !== winScroller && (el = el.parentNode));\n }\n\n return [offsetLeft, offsetTop];\n}\n/**\r\n * Returns the index of the object within the given array\r\n * @param {Array} arr Array that may or may not hold the object\r\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number} The index of the object in the array, or -1\r\n */\n\n\nfunction indexOfObject(arr, obj) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n\n return -1;\n}\n\nfunction getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n\n do {\n // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = css(elem);\n\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\n if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n /* jshint boss:true */\n\n } while (elem = elem.parentNode);\n\n return getWindowScrollingElement();\n}\n\nfunction extend(dst, src) {\n if (dst && src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dst[key] = src[key];\n }\n }\n }\n\n return dst;\n}\n\nfunction isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\n\nvar _throttleTimeout;\n\nfunction throttle(callback, ms) {\n return function () {\n if (!_throttleTimeout) {\n var args = arguments,\n _this = this;\n\n if (args.length === 1) {\n callback.call(_this, args[0]);\n } else {\n callback.apply(_this, args);\n }\n\n _throttleTimeout = setTimeout(function () {\n _throttleTimeout = void 0;\n }, ms);\n }\n };\n}\n\nfunction cancelThrottle() {\n clearTimeout(_throttleTimeout);\n _throttleTimeout = void 0;\n}\n\nfunction scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\n\nfunction clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n\n if (Polymer && Polymer.dom) {\n return Polymer.dom(el).cloneNode(true);\n } else if ($) {\n return $(el).clone(true)[0];\n } else {\n return el.cloneNode(true);\n }\n}\n\nfunction setRect(el, rect) {\n css(el, 'position', 'absolute');\n css(el, 'top', rect.top);\n css(el, 'left', rect.left);\n css(el, 'width', rect.width);\n css(el, 'height', rect.height);\n}\n\nfunction unsetRect(el) {\n css(el, 'position', '');\n css(el, 'top', '');\n css(el, 'left', '');\n css(el, 'width', '');\n css(el, 'height', '');\n}\n\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n var animationStates = [],\n animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function (child) {\n if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n animationStates.push({\n target: child,\n rect: getRect(child)\n });\n\n var fromRect = _objectSpread({}, animationStates[animationStates.length - 1].rect); // If animating: compensate for current animation\n\n\n if (child.thisAnimationDuration) {\n var childMatrix = matrix(child, true);\n\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice(indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === 'function') callback();\n return;\n }\n\n var animating = false,\n animationTime = 0;\n animationStates.forEach(function (state) {\n var time = 0,\n target = state.target,\n fromRect = target.fromRect,\n toRect = getRect(target),\n prevFromRect = target.prevFromRect,\n prevToRect = target.prevToRect,\n animatingRect = state.rect,\n targetMatrix = matrix(target, true);\n\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n\n target.toRect = toRect;\n\n if (target.thisAnimationDuration) {\n // Could also check if animatingRect is between fromRect and toRect\n if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n // If returning to same place as started from animation and on same axis\n time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n } // if fromRect != toRect: animate\n\n\n if (!isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n\n if (!time) {\n time = _this.options.animation;\n }\n\n _this.animate(target, animatingRect, toRect, time);\n }\n\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function () {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n\n if (!animating) {\n if (typeof callback === 'function') callback();\n } else {\n animationCallbackId = setTimeout(function () {\n if (typeof callback === 'function') callback();\n }, animationTime);\n }\n\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n css(target, 'transition', '');\n css(target, 'transform', '');\n var elMatrix = matrix(this.el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d,\n translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\n repaint(target); // repaint\n\n css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\n css(target, 'transform', 'translate3d(0,0,0)');\n typeof target.animated === 'number' && clearTimeout(target.animated);\n target.animated = setTimeout(function () {\n css(target, 'transition', '');\n css(target, 'transform', '');\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\n\nfunction repaint(target) {\n return target.offsetWidth;\n}\n\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\n\nvar plugins = [];\nvar defaults = {\n initializeByDefault: true\n};\nvar PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for (var option in defaults) {\n if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n plugin[option] = defaults[option];\n }\n }\n\n plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n\n this.eventCanceled = false;\n\n evt.cancel = function () {\n _this.eventCanceled = true;\n };\n\n var eventNameGlobal = eventName + 'Global';\n plugins.forEach(function (plugin) {\n if (!sortable[plugin.pluginName]) return; // Fire global events if it exists in this sortable\n\n if (sortable[plugin.pluginName][eventNameGlobal]) {\n sortable[plugin.pluginName][eventNameGlobal](_objectSpread({\n sortable: sortable\n }, evt));\n } // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n\n\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n sortable[plugin.pluginName][eventName](_objectSpread({\n sortable: sortable\n }, evt));\n }\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n plugins.forEach(function (plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized; // Add default options from plugin\n\n _extends(defaults, initialized.defaults);\n });\n\n for (var option in sortable.options) {\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n\n if (typeof modified !== 'undefined') {\n sortable.options[option] = modified;\n }\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n plugins.forEach(function (plugin) {\n if (typeof plugin.eventProperties !== 'function') return;\n\n _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n plugins.forEach(function (plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return; // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\n modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n }\n });\n return modifiedValue;\n }\n};\n\nfunction dispatchEvent(_ref) {\n var sortable = _ref.sortable,\n rootEl = _ref.rootEl,\n name = _ref.name,\n targetEl = _ref.targetEl,\n cloneEl = _ref.cloneEl,\n toEl = _ref.toEl,\n fromEl = _ref.fromEl,\n oldIndex = _ref.oldIndex,\n newIndex = _ref.newIndex,\n oldDraggableIndex = _ref.oldDraggableIndex,\n newDraggableIndex = _ref.newDraggableIndex,\n originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[expando];\n if (!sortable) return;\n var evt,\n options = sortable.options,\n onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); // Support for new CustomEvent feature\n\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent(name, true, true);\n }\n\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n\n var allEventProperties = _objectSpread({}, extraEventProperties, PluginManager.getEventProperties(name, sortable));\n\n for (var option in allEventProperties) {\n evt[option] = allEventProperties[option];\n }\n\n if (rootEl) {\n rootEl.dispatchEvent(evt);\n }\n\n if (options[onName]) {\n options[onName].call(sortable, evt);\n }\n}\n\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n originalEvent = _ref.evt,\n data = _objectWithoutProperties(_ref, [\"evt\"]);\n\n PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread({\n dragEl: dragEl,\n parentEl: parentEl,\n ghostEl: ghostEl,\n rootEl: rootEl,\n nextEl: nextEl,\n lastDownEl: lastDownEl,\n cloneEl: cloneEl,\n cloneHidden: cloneHidden,\n dragStarted: moved,\n putSortable: putSortable,\n activeSortable: Sortable.active,\n originalEvent: originalEvent,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n hideGhostForTarget: _hideGhostForTarget,\n unhideGhostForTarget: _unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n _dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\n\nfunction _dispatchEvent(info) {\n dispatchEvent(_objectSpread({\n putSortable: putSortable,\n cloneEl: cloneEl,\n targetEl: dragEl,\n rootEl: rootEl,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex\n }, info));\n}\n\nvar dragEl,\n parentEl,\n ghostEl,\n rootEl,\n nextEl,\n lastDownEl,\n cloneEl,\n cloneHidden,\n oldIndex,\n newIndex,\n oldDraggableIndex,\n newDraggableIndex,\n activeGroup,\n putSortable,\n awaitingDragStarted = false,\n ignoreNextClick = false,\n sortables = [],\n tapEvt,\n touchEvt,\n lastDx,\n lastDy,\n tapDistanceLeft,\n tapDistanceTop,\n moved,\n lastTarget,\n lastDirection,\n pastFirstInvertThresh = false,\n isCircumstantialInvert = false,\n targetMoveDistance,\n // For positioning ghost absolutely\nghostRelativeParent,\n ghostRelativeParentInitialScroll = [],\n // (left, top)\n_silent = false,\n savedInputChecked = [];\n/** @const */\n\nvar documentExists = typeof document !== 'undefined',\n PositionGhostAbsolutely = IOS,\n CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n // This will not pass for IE9, because IE9 DnD only works on anchors\nsupportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n supportCssPointerEvents = function () {\n if (!documentExists) return; // false when <= IE11\n\n if (IE11OrLess) {\n return false;\n }\n\n var el = document.createElement('x');\n el.style.cssText = 'pointer-events:auto';\n return el.style.pointerEvents === 'auto';\n}(),\n _detectDirection = function _detectDirection(el, options) {\n var elCSS = css(el),\n elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n child1 = getChild(el, 0, options),\n child2 = getChild(el, 1, options),\n firstChildCSS = child1 && css(child1),\n secondChildCSS = child2 && css(child2),\n firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n\n if (elCSS.display === 'flex') {\n return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\n }\n\n if (elCSS.display === 'grid') {\n return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\n }\n\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\n var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\n return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\n }\n\n return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\n},\n _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n dragElOppLength = vertical ? dragRect.width : dragRect.height,\n targetS1Opp = vertical ? targetRect.left : targetRect.top,\n targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n},\n\n/**\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\n * @param {Number} x X position\n * @param {Number} y Y position\n * @return {HTMLElement} Element of the first found nearest Sortable\n */\n_detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n sortables.some(function (sortable) {\n if (lastChild(sortable)) return;\n var rect = getRect(sortable),\n threshold = sortable[expando].options.emptyInsertThreshold,\n insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n\n if (threshold && insideHorizontally && insideVertically) {\n return ret = sortable;\n }\n });\n return ret;\n},\n _prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function (to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n\n if (value == null && (pull || sameGroup)) {\n // Default pull value\n // Default pull and put value if same group\n return true;\n } else if (value == null || value === false) {\n return false;\n } else if (pull && value === 'clone') {\n return value;\n } else if (typeof value === 'function') {\n return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n } else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n\n var group = {};\n var originalGroup = options.group;\n\n if (!originalGroup || _typeof(originalGroup) != 'object') {\n originalGroup = {\n name: originalGroup\n };\n }\n\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n},\n _hideGhostForTarget = function _hideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', 'none');\n }\n},\n _unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', '');\n }\n}; // #1184 fix - Prevent click event on fallback if dragged but item not changed position\n\n\nif (documentExists) {\n document.addEventListener('click', function (evt) {\n if (ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n ignoreNextClick = false;\n return false;\n }\n }, true);\n}\n\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if (dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n\n var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n\n if (nearest) {\n // Create imitation event\n var event = {};\n\n for (var i in evt) {\n if (evt.hasOwnProperty(i)) {\n event[i] = evt[i];\n }\n }\n\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n\n nearest[expando]._onDragOver(event);\n }\n }\n};\n\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if (dragEl) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n }\n};\n/**\n * @class Sortable\n * @param {HTMLElement} el\n * @param {Object} [options]\n */\n\n\nfunction Sortable(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) {\n throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n }\n\n this.el = el; // root element\n\n this.options = options = _extends({}, options); // Export instance\n\n el[expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return _detectDirection(el, this.options);\n },\n ghostClass: 'sortable-ghost',\n chosenClass: 'sortable-chosen',\n dragClass: 'sortable-drag',\n ignore: 'a, img',\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData('Text', dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: 'data-id',\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: 'sortable-fallback',\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window,\n emptyInsertThreshold: 5\n };\n PluginManager.initializePlugins(this, el, defaults); // Set default options\n\n for (var name in defaults) {\n !(name in options) && (options[name] = defaults[name]);\n }\n\n _prepareGroup(options); // Bind all private methods\n\n\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n } // Setup drag mode\n\n\n this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n\n if (this.nativeDraggable) {\n // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n } // Bind events\n\n\n if (options.supportPointer) {\n on(el, 'pointerdown', this._onTapStart);\n } else {\n on(el, 'mousedown', this._onTapStart);\n on(el, 'touchstart', this._onTapStart);\n }\n\n if (this.nativeDraggable) {\n on(el, 'dragover', this);\n on(el, 'dragenter', this);\n }\n\n sortables.push(this.el); // Restore sorting\n\n options.store && options.store.get && this.sort(options.store.get(this) || []); // Add animation state manager\n\n _extends(this, AnimationStateManager());\n}\n\nSortable.prototype =\n/** @lends Sortable.prototype */\n{\n constructor: Sortable,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) {\n lastTarget = null;\n }\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart(\n /** Event|TouchEvent */\n evt) {\n if (!evt.cancelable) return;\n\n var _this = this,\n el = this.el,\n options = this.options,\n preventOnFilter = options.preventOnFilter,\n type = evt.type,\n touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n target = (touch || evt).target,\n originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n filter = options.filter;\n\n _saveInputCheckedState(el); // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n\n\n if (dragEl) {\n return;\n }\n\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n return; // only left button and enabled\n } // cancel dnd if original target is content editable\n\n\n if (originalTarget.isContentEditable) {\n return;\n }\n\n target = closest(target, options.draggable, el, false);\n\n if (target && target.animated) {\n return;\n }\n\n if (lastDownEl === target) {\n // Ignoring duplicate `down`\n return;\n } // Get the index of the dragged element within its parent\n\n\n oldIndex = index(target);\n oldDraggableIndex = index(target, options.draggable); // Check filter\n\n if (typeof filter === 'function') {\n if (filter.call(this, evt, target, this)) {\n _dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: 'filter',\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n\n pluginEvent('filter', _this, {\n evt: evt\n });\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(',').some(function (criteria) {\n criteria = closest(originalTarget, criteria.trim(), el, false);\n\n if (criteria) {\n _dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: 'filter',\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n\n pluginEvent('filter', _this, {\n evt: evt\n });\n return true;\n }\n });\n\n if (filter) {\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n }\n\n if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n return;\n } // Prepare `dragstart`\n\n\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart(\n /** Event */\n evt,\n /** Touch */\n touch,\n /** HTMLElement */\n target) {\n var _this = this,\n el = _this.el,\n options = _this.options,\n ownerDocument = el.ownerDocument,\n dragStartFn;\n\n if (target && !dragEl && target.parentNode === el) {\n var dragRect = getRect(target);\n rootEl = el;\n dragEl = target;\n parentEl = dragEl.parentNode;\n nextEl = dragEl.nextSibling;\n lastDownEl = target;\n activeGroup = options.group;\n Sortable.dragged = dragEl;\n tapEvt = {\n target: dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n tapDistanceLeft = tapEvt.clientX - dragRect.left;\n tapDistanceTop = tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n dragEl.style['will-change'] = 'all';\n\n dragStartFn = function dragStartFn() {\n pluginEvent('delayEnded', _this, {\n evt: evt\n });\n\n if (Sortable.eventCanceled) {\n _this._onDrop();\n\n return;\n } // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n\n\n _this._disableDelayedDragEvents();\n\n if (!FireFox && _this.nativeDraggable) {\n dragEl.draggable = true;\n } // Bind the events: dragstart/dragend\n\n\n _this._triggerDragStart(evt, touch); // Drag start event\n\n\n _dispatchEvent({\n sortable: _this,\n name: 'choose',\n originalEvent: evt\n }); // Chosen item\n\n\n toggleClass(dragEl, options.chosenClass, true);\n }; // Disable \"draggable\"\n\n\n options.ignore.split(',').forEach(function (criteria) {\n find(dragEl, criteria.trim(), _disableDraggable);\n });\n on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mouseup', _this._onDrop);\n on(ownerDocument, 'touchend', _this._onDrop);\n on(ownerDocument, 'touchcancel', _this._onDrop); // Make dragEl draggable (must be before delay for FireFox)\n\n if (FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n dragEl.draggable = true;\n }\n\n pluginEvent('delayStart', this, {\n evt: evt\n }); // Delay is impossible for native DnD in Edge or IE\n\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n if (Sortable.eventCanceled) {\n this._onDrop();\n\n return;\n } // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n\n\n on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\n on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\n options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else {\n dragStartFn();\n }\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler(\n /** TouchEvent|PointerEvent **/\n e) {\n var touch = e.touches ? e.touches[0] : e;\n\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n this._disableDelayedDrag();\n }\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n dragEl && _disableDraggable(dragEl);\n clearTimeout(this._dragStartTimer);\n\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._disableDelayedDrag);\n off(ownerDocument, 'touchend', this._disableDelayedDrag);\n off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\n off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart(\n /** Event */\n evt,\n /** Touch */\n touch) {\n touch = touch || evt.pointerType == 'touch' && evt;\n\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._onTouchMove);\n } else if (touch) {\n on(document, 'touchmove', this._onTouchMove);\n } else {\n on(document, 'mousemove', this._onTouchMove);\n }\n } else {\n on(dragEl, 'dragend', this);\n on(rootEl, 'dragstart', this._onDragStart);\n }\n\n try {\n if (document.selection) {\n // Timeout neccessary for IE9\n _nextTick(function () {\n document.selection.empty();\n });\n } else {\n window.getSelection().removeAllRanges();\n }\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n\n awaitingDragStarted = false;\n\n if (rootEl && dragEl) {\n pluginEvent('dragStarted', this, {\n evt: evt\n });\n\n if (this.nativeDraggable) {\n on(document, 'dragover', _checkOutsideTargetEl);\n }\n\n var options = this.options; // Apply effect\n\n !fallback && toggleClass(dragEl, options.dragClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n Sortable.active = this;\n fallback && this._appendGhost(); // Drag start event\n\n _dispatchEvent({\n sortable: this,\n name: 'start',\n originalEvent: evt\n });\n } else {\n this._nulling();\n }\n },\n _emulateDragOver: function _emulateDragOver() {\n if (touchEvt) {\n this._lastX = touchEvt.clientX;\n this._lastY = touchEvt.clientY;\n\n _hideGhostForTarget();\n\n var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n var parent = target;\n\n while (target && target.shadowRoot) {\n target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n\n dragEl.parentNode[expando]._isOutsideThisEl(target);\n\n if (parent) {\n do {\n if (parent[expando]) {\n var inserted = void 0;\n inserted = parent[expando]._onDragOver({\n clientX: touchEvt.clientX,\n clientY: touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n\n if (inserted && !this.options.dragoverBubble) {\n break;\n }\n }\n\n target = parent; // store last element\n }\n /* jshint boss:true */\n while (parent = parent.parentNode);\n }\n\n _unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove(\n /**TouchEvent*/\n evt) {\n if (tapEvt) {\n var options = this.options,\n fallbackTolerance = options.fallbackTolerance,\n fallbackOffset = options.fallbackOffset,\n touch = evt.touches ? evt.touches[0] : evt,\n ghostMatrix = ghostEl && matrix(ghostEl, true),\n scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1); // only set the status to dragging, when we are actually dragging\n\n if (!Sortable.active && !awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n return;\n }\n\n this._onDragStart(evt, true);\n }\n\n if (ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - (lastDx || 0);\n ghostMatrix.f += dy - (lastDy || 0);\n } else {\n ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n }\n\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n css(ghostEl, 'webkitTransform', cssMatrix);\n css(ghostEl, 'mozTransform', cssMatrix);\n css(ghostEl, 'msTransform', cssMatrix);\n css(ghostEl, 'transform', cssMatrix);\n lastDx = dx;\n lastDy = dy;\n touchEvt = touch;\n }\n\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : rootEl,\n rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n options = this.options; // Position absolutely\n\n if (PositionGhostAbsolutely) {\n // Get relatively positioned parent\n ghostRelativeParent = container;\n\n while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\n ghostRelativeParent = ghostRelativeParent.parentNode;\n }\n\n if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n rect.top += ghostRelativeParent.scrollTop;\n rect.left += ghostRelativeParent.scrollLeft;\n } else {\n ghostRelativeParent = getWindowScrollingElement();\n }\n\n ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n }\n\n ghostEl = dragEl.cloneNode(true);\n toggleClass(ghostEl, options.ghostClass, false);\n toggleClass(ghostEl, options.fallbackClass, true);\n toggleClass(ghostEl, options.dragClass, true);\n css(ghostEl, 'transition', '');\n css(ghostEl, 'transform', '');\n css(ghostEl, 'box-sizing', 'border-box');\n css(ghostEl, 'margin', 0);\n css(ghostEl, 'top', rect.top);\n css(ghostEl, 'left', rect.left);\n css(ghostEl, 'width', rect.width);\n css(ghostEl, 'height', rect.height);\n css(ghostEl, 'opacity', '0.8');\n css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\n css(ghostEl, 'zIndex', '100000');\n css(ghostEl, 'pointerEvents', 'none');\n Sortable.ghost = ghostEl;\n container.appendChild(ghostEl); // Set transform-origin\n\n css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n }\n },\n _onDragStart: function _onDragStart(\n /**Event*/\n evt,\n /**boolean*/\n fallback) {\n var _this = this;\n\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n pluginEvent('dragStart', this, {\n evt: evt\n });\n\n if (Sortable.eventCanceled) {\n this._onDrop();\n\n return;\n }\n\n pluginEvent('setupClone', this);\n\n if (!Sortable.eventCanceled) {\n cloneEl = clone(dragEl);\n cloneEl.draggable = false;\n cloneEl.style['will-change'] = '';\n\n this._hideClone();\n\n toggleClass(cloneEl, this.options.chosenClass, false);\n Sortable.clone = cloneEl;\n } // #1143: IFrame support workaround\n\n\n _this.cloneId = _nextTick(function () {\n pluginEvent('clone', _this);\n if (Sortable.eventCanceled) return;\n\n if (!_this.options.removeCloneOnHide) {\n rootEl.insertBefore(cloneEl, dragEl);\n }\n\n _this._hideClone();\n\n _dispatchEvent({\n sortable: _this,\n name: 'clone'\n });\n });\n !fallback && toggleClass(dragEl, options.dragClass, true); // Set proper drop events\n\n if (fallback) {\n ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n off(document, 'mouseup', _this._onDrop);\n off(document, 'touchend', _this._onDrop);\n off(document, 'touchcancel', _this._onDrop);\n\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move';\n options.setData && options.setData.call(_this, dataTransfer, dragEl);\n }\n\n on(document, 'drop', _this); // #1276 fix:\n\n css(dragEl, 'transform', 'translateZ(0)');\n }\n\n awaitingDragStarted = true;\n _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n on(document, 'selectstart', _this);\n moved = true;\n\n if (Safari) {\n css(document.body, 'user-select', 'none');\n }\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver(\n /**Event*/\n evt) {\n var el = this.el,\n target = evt.target,\n dragRect,\n targetRect,\n revert,\n options = this.options,\n group = options.group,\n activeSortable = Sortable.active,\n isOwner = activeGroup === group,\n canSort = options.sort,\n fromSortable = putSortable || activeSortable,\n vertical,\n _this = this,\n completedFired = false;\n\n if (_silent) return;\n\n function dragOverEvent(name, extra) {\n pluginEvent(name, _this, _objectSpread({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? 'vertical' : 'horizontal',\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n } // Capture animation state\n\n\n function capture() {\n dragOverEvent('dragOverAnimationCapture');\n\n _this.captureAnimationState();\n\n if (_this !== fromSortable) {\n fromSortable.captureAnimationState();\n }\n } // Return invocation when dragEl is inserted (or completed)\n\n\n function completed(insertion) {\n dragOverEvent('dragOverCompleted', {\n insertion: insertion\n });\n\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n } else {\n activeSortable._showClone(_this);\n }\n\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n }\n\n if (putSortable !== _this && _this !== Sortable.active) {\n putSortable = _this;\n } else if (_this === Sortable.active && putSortable) {\n putSortable = null;\n } // Animation\n\n\n if (fromSortable === _this) {\n _this._ignoreWhileAnimating = target;\n }\n\n _this.animateAll(function () {\n dragOverEvent('dragOverAnimationComplete');\n _this._ignoreWhileAnimating = null;\n });\n\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n } // Null lastTarget if it is not inside a previously swapped element\n\n\n if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n lastTarget = null;\n } // no bubbling and not fallback\n\n\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target); // Do not detect for empty insert if already inserted\n\n\n !insertion && nearestEmptyInsertDetectEvent(evt);\n }\n\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n } // Call when dragEl has been inserted\n\n\n function changed() {\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n\n _dispatchEvent({\n sortable: _this,\n name: 'change',\n toEl: el,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n originalEvent: evt\n });\n }\n\n if (evt.preventDefault !== void 0) {\n evt.cancelable && evt.preventDefault();\n }\n\n target = closest(target, options.draggable, el, true);\n dragOverEvent('dragOver');\n if (Sortable.eventCanceled) return completedFired;\n\n if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n return completed(false);\n }\n\n ignoreNextClick = false;\n\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = !rootEl.contains(dragEl)) // Reverting item into the original list\n : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n vertical = this._getDirection(evt, target) === 'vertical';\n dragRect = getRect(dragEl);\n dragOverEvent('dragOverValid');\n if (Sortable.eventCanceled) return completedFired;\n\n if (revert) {\n parentEl = rootEl; // actualization\n\n capture();\n\n this._hideClone();\n\n dragOverEvent('revert');\n\n if (!Sortable.eventCanceled) {\n if (nextEl) {\n rootEl.insertBefore(dragEl, nextEl);\n } else {\n rootEl.appendChild(dragEl);\n }\n }\n\n return completed(true);\n }\n\n var elLastChild = lastChild(el, options.draggable);\n\n if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // If already at end of list: Do not insert\n if (elLastChild === dragEl) {\n return completed(false);\n } // assign target only if condition is true\n\n\n if (elLastChild && el === evt.target) {\n target = elLastChild;\n }\n\n if (target) {\n targetRect = getRect(target);\n }\n\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n el.appendChild(dragEl);\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = getRect(target);\n var direction = 0,\n targetBeforeFirstSwap,\n differentLevel = dragEl.parentNode !== el,\n differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n side1 = vertical ? 'top' : 'left',\n scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n\n if (lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n pastFirstInvertThresh = false;\n isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n\n direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n var sibling;\n\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = index(dragEl);\n\n do {\n dragIndex -= direction;\n sibling = parentEl.children[dragIndex];\n } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\n } // If dragEl is already beside target: Do not insert\n\n\n if (direction === 0 || sibling === target) {\n return completed(false);\n }\n\n lastTarget = target;\n lastDirection = direction;\n var nextSibling = target.nextElementSibling,\n after = false;\n after = direction === 1;\n\n var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) {\n after = moveVector === 1;\n }\n\n _silent = true;\n setTimeout(_unsilent, 30);\n capture();\n\n if (after && !nextSibling) {\n el.appendChild(dragEl);\n } else {\n target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n } // Undo chrome's scroll adjustment (has no effect on other browsers)\n\n\n if (scrolledPastTop) {\n scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n }\n\n parentEl = dragEl.parentNode; // actualization\n // must be done before animation\n\n if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n }\n\n changed();\n return completed(true);\n }\n }\n\n if (el.contains(dragEl)) {\n return completed(false);\n }\n }\n\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n off(document, 'mousemove', this._onTouchMove);\n off(document, 'touchmove', this._onTouchMove);\n off(document, 'pointermove', this._onTouchMove);\n off(document, 'dragover', nearestEmptyInsertDetectEvent);\n off(document, 'mousemove', nearestEmptyInsertDetectEvent);\n off(document, 'touchmove', nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._onDrop);\n off(ownerDocument, 'touchend', this._onDrop);\n off(ownerDocument, 'pointerup', this._onDrop);\n off(ownerDocument, 'touchcancel', this._onDrop);\n off(document, 'selectstart', this);\n },\n _onDrop: function _onDrop(\n /**Event*/\n evt) {\n var el = this.el,\n options = this.options; // Get the index of the dragged element within its parent\n\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n pluginEvent('drop', this, {\n evt: evt\n });\n parentEl = dragEl && dragEl.parentNode; // Get again after plugin event\n\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n\n if (Sortable.eventCanceled) {\n this._nulling();\n\n return;\n }\n\n awaitingDragStarted = false;\n isCircumstantialInvert = false;\n pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n\n _cancelNextTick(this.cloneId);\n\n _cancelNextTick(this._dragStartId); // Unbind events\n\n\n if (this.nativeDraggable) {\n off(document, 'drop', this);\n off(el, 'dragstart', this._onDragStart);\n }\n\n this._offMoveEvents();\n\n this._offUpEvents();\n\n if (Safari) {\n css(document.body, 'user-select', '');\n }\n\n css(dragEl, 'transform', '');\n\n if (evt) {\n if (moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n\n ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n // Remove clone(s)\n cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n }\n\n if (dragEl) {\n if (this.nativeDraggable) {\n off(dragEl, 'dragend', this);\n }\n\n _disableDraggable(dragEl);\n\n dragEl.style['will-change'] = ''; // Remove classes\n // ghostClass is added in dragStarted\n\n if (moved && !awaitingDragStarted) {\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n }\n\n toggleClass(dragEl, this.options.chosenClass, false); // Drag stop event\n\n _dispatchEvent({\n sortable: this,\n name: 'unchoose',\n toEl: parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n\n if (rootEl !== parentEl) {\n if (newIndex >= 0) {\n // Add event\n _dispatchEvent({\n rootEl: parentEl,\n name: 'add',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n }); // Remove event\n\n\n _dispatchEvent({\n sortable: this,\n name: 'remove',\n toEl: parentEl,\n originalEvent: evt\n }); // drag from one list and drop into another\n\n\n _dispatchEvent({\n rootEl: parentEl,\n name: 'sort',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n\n putSortable && putSortable.save();\n } else {\n if (newIndex !== oldIndex) {\n if (newIndex >= 0) {\n // drag & drop within the same list\n _dispatchEvent({\n sortable: this,\n name: 'update',\n toEl: parentEl,\n originalEvent: evt\n });\n\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n }\n }\n\n if (Sortable.active) {\n /* jshint eqnull:true */\n if (newIndex == null || newIndex === -1) {\n newIndex = oldIndex;\n newDraggableIndex = oldDraggableIndex;\n }\n\n _dispatchEvent({\n sortable: this,\n name: 'end',\n toEl: parentEl,\n originalEvent: evt\n }); // Save sorting\n\n\n this.save();\n }\n }\n }\n\n this._nulling();\n },\n _nulling: function _nulling() {\n pluginEvent('nulling', this);\n rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n savedInputChecked.forEach(function (el) {\n el.checked = true;\n });\n savedInputChecked.length = lastDx = lastDy = 0;\n },\n handleEvent: function handleEvent(\n /**Event*/\n evt) {\n switch (evt.type) {\n case 'drop':\n case 'dragend':\n this._onDrop(evt);\n\n break;\n\n case 'dragenter':\n case 'dragover':\n if (dragEl) {\n this._onDragOver(evt);\n\n _globalDragOver(evt);\n }\n\n break;\n\n case 'selectstart':\n evt.preventDefault();\n break;\n }\n },\n\n /**\n * Serializes the item into an array of string.\n * @returns {String[]}\n */\n toArray: function toArray() {\n var order = [],\n el,\n children = this.el.children,\n i = 0,\n n = children.length,\n options = this.options;\n\n for (; i < n; i++) {\n el = children[i];\n\n if (closest(el, options.draggable, this.el, false)) {\n order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n }\n }\n\n return order;\n },\n\n /**\n * Sorts the elements according to the array.\n * @param {String[]} order order of the items\n */\n sort: function sort(order) {\n var items = {},\n rootEl = this.el;\n this.toArray().forEach(function (id, i) {\n var el = rootEl.children[i];\n\n if (closest(el, this.options.draggable, rootEl, false)) {\n items[id] = el;\n }\n }, this);\n order.forEach(function (id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n },\n\n /**\n * Save the current sorting\n */\n save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n\n /**\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\n * @param {HTMLElement} el\n * @param {String} [selector] default: `options.draggable`\n * @returns {HTMLElement|null}\n */\n closest: function closest$1(el, selector) {\n return closest(el, selector || this.options.draggable, this.el, false);\n },\n\n /**\n * Set/get option\n * @param {string} name\n * @param {*} [value]\n * @returns {*}\n */\n option: function option(name, value) {\n var options = this.options;\n\n if (value === void 0) {\n return options[name];\n } else {\n var modifiedValue = PluginManager.modifyOption(this, name, value);\n\n if (typeof modifiedValue !== 'undefined') {\n options[name] = modifiedValue;\n } else {\n options[name] = value;\n }\n\n if (name === 'group') {\n _prepareGroup(options);\n }\n }\n },\n\n /**\n * Destroy\n */\n destroy: function destroy() {\n pluginEvent('destroy', this);\n var el = this.el;\n el[expando] = null;\n off(el, 'mousedown', this._onTapStart);\n off(el, 'touchstart', this._onTapStart);\n off(el, 'pointerdown', this._onTapStart);\n\n if (this.nativeDraggable) {\n off(el, 'dragover', this);\n off(el, 'dragenter', this);\n } // Remove draggable attributes\n\n\n Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n el.removeAttribute('draggable');\n });\n\n this._onDrop();\n\n this._disableDelayedDragEvents();\n\n sortables.splice(sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!cloneHidden) {\n pluginEvent('hideClone', this);\n if (Sortable.eventCanceled) return;\n css(cloneEl, 'display', 'none');\n\n if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n cloneEl.parentNode.removeChild(cloneEl);\n }\n\n cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== 'clone') {\n this._hideClone();\n\n return;\n }\n\n if (cloneHidden) {\n pluginEvent('showClone', this);\n if (Sortable.eventCanceled) return; // show clone at dragEl or original position\n\n if (rootEl.contains(dragEl) && !this.options.group.revertClone) {\n rootEl.insertBefore(cloneEl, dragEl);\n } else if (nextEl) {\n rootEl.insertBefore(cloneEl, nextEl);\n } else {\n rootEl.appendChild(cloneEl);\n }\n\n if (this.options.group.revertClone) {\n this.animate(dragEl, cloneEl);\n }\n\n css(cloneEl, 'display', '');\n cloneHidden = false;\n }\n }\n};\n\nfunction _globalDragOver(\n/**Event*/\nevt) {\n if (evt.dataTransfer) {\n evt.dataTransfer.dropEffect = 'move';\n }\n\n evt.cancelable && evt.preventDefault();\n}\n\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt,\n sortable = fromEl[expando],\n onMoveFn = sortable.options.onMove,\n retVal; // Support for new CustomEvent feature\n\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent('move', {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent('move', true, true);\n }\n\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n\n if (onMoveFn) {\n retVal = onMoveFn.call(sortable, evt, originalEvent);\n }\n\n return retVal;\n}\n\nfunction _disableDraggable(el) {\n el.draggable = false;\n}\n\nfunction _unsilent() {\n _silent = false;\n}\n\nfunction _ghostIsLast(evt, vertical, sortable) {\n var rect = getRect(lastChild(sortable.el, sortable.options.draggable));\n var spacer = 10;\n return vertical ? evt.clientX > rect.right + spacer || evt.clientX <= rect.right && evt.clientY > rect.bottom && evt.clientX >= rect.left : evt.clientX > rect.right && evt.clientY > rect.top || evt.clientX <= rect.right && evt.clientY > rect.bottom + spacer;\n}\n\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n targetLength = vertical ? targetRect.height : targetRect.width,\n targetS1 = vertical ? targetRect.top : targetRect.left,\n targetS2 = vertical ? targetRect.bottom : targetRect.right,\n invert = false;\n\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n pastFirstInvertThresh = true;\n }\n\n if (!pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - targetMoveDistance) {\n return -lastDirection;\n }\n } else {\n invert = true;\n }\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n return _getInsertDirection(target);\n }\n }\n }\n\n invert = invert || invertSwap;\n\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n }\n\n return 0;\n}\n/**\n * Gets the direction dragEl must be swapped relative to target in order to make it\n * seem that dragEl has been \"inserted\" into that element's position\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\n * @return {Number} Direction dragEl must be swapped\n */\n\n\nfunction _getInsertDirection(target) {\n if (index(dragEl) < index(target)) {\n return 1;\n } else {\n return -1;\n }\n}\n/**\n * Generate id\n * @param {HTMLElement} el\n * @returns {String}\n * @private\n */\n\n\nfunction _generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent,\n i = str.length,\n sum = 0;\n\n while (i--) {\n sum += str.charCodeAt(i);\n }\n\n return sum.toString(36);\n}\n\nfunction _saveInputCheckedState(root) {\n savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName('input');\n var idx = inputs.length;\n\n while (idx--) {\n var el = inputs[idx];\n el.checked && savedInputChecked.push(el);\n }\n}\n\nfunction _nextTick(fn) {\n return setTimeout(fn, 0);\n}\n\nfunction _cancelNextTick(id) {\n return clearTimeout(id);\n} // Fixed #973:\n\n\nif (documentExists) {\n on(document, 'touchmove', function (evt) {\n if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n evt.preventDefault();\n }\n });\n} // Export utils\n\n\nSortable.utils = {\n on: on,\n off: off,\n css: css,\n find: find,\n is: function is(el, selector) {\n return !!closest(el, selector, el, false);\n },\n extend: extend,\n throttle: throttle,\n closest: closest,\n toggleClass: toggleClass,\n clone: clone,\n index: index,\n nextTick: _nextTick,\n cancelNextTick: _cancelNextTick,\n detectDirection: _detectDirection,\n getChild: getChild\n};\n/**\n * Get the Sortable instance of an element\n * @param {HTMLElement} element The element\n * @return {Sortable|undefined} The instance of Sortable\n */\n\nSortable.get = function (element) {\n return element[expando];\n};\n/**\n * Mount a plugin to Sortable\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\n */\n\n\nSortable.mount = function () {\n for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n plugins[_key] = arguments[_key];\n }\n\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function (plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) {\n throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n }\n\n if (plugin.utils) Sortable.utils = _objectSpread({}, Sortable.utils, plugin.utils);\n PluginManager.mount(plugin);\n });\n};\n/**\n * Create sortable instance\n * @param {HTMLElement} el\n * @param {Object} [options]\n */\n\n\nSortable.create = function (el, options) {\n return new Sortable(el, options);\n}; // Export\n\n\nSortable.version = version;\n\nvar autoScrolls = [],\n scrollEl,\n scrollRootEl,\n scrolling = false,\n lastAutoScrollX,\n lastAutoScrollY,\n touchEvt$1,\n pointerElemChangedInterval;\n\nfunction AutoScrollPlugin() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n }; // Bind all private methods\n\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n }\n\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n\n if (this.sortable.nativeDraggable) {\n on(document, 'dragover', this._handleAutoScroll);\n } else {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._handleFallbackAutoScroll);\n } else if (originalEvent.touches) {\n on(document, 'touchmove', this._handleFallbackAutoScroll);\n } else {\n on(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n this._handleAutoScroll(originalEvent);\n }\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) {\n off(document, 'dragover', this._handleAutoScroll);\n } else {\n off(document, 'pointermove', this._handleFallbackAutoScroll);\n off(document, 'touchmove', this._handleFallbackAutoScroll);\n off(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n\n clearPointerElemChangedInterval();\n clearAutoScrolls();\n cancelThrottle();\n },\n nulling: function nulling() {\n touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n elem = document.elementFromPoint(x, y);\n touchEvt$1 = evt; // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n\n if (fallback || Edge || IE11OrLess || Safari) {\n autoScroll(evt, this.options, elem, fallback); // Listener for pointer element change\n\n var ogElemScroller = getParentAutoScrollElement(elem, true);\n\n if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n pointerElemChangedInterval && clearPointerElemChangedInterval(); // Detect for pointer elem change, emulating native DnD behaviour\n\n pointerElemChangedInterval = setInterval(function () {\n var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n clearAutoScrolls();\n }\n\n autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n lastAutoScrollX = x;\n lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n clearAutoScrolls();\n return;\n }\n\n autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return _extends(AutoScroll, {\n pluginName: 'scroll',\n initializeByDefault: true\n });\n}\n\nfunction clearAutoScrolls() {\n autoScrolls.forEach(function (autoScroll) {\n clearInterval(autoScroll.pid);\n });\n autoScrolls = [];\n}\n\nfunction clearPointerElemChangedInterval() {\n clearInterval(pointerElemChangedInterval);\n}\n\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n sens = options.scrollSensitivity,\n speed = options.scrollSpeed,\n winScroller = getWindowScrollingElement();\n var scrollThisInstance = false,\n scrollCustomFn; // New scroll root, set scrollEl\n\n if (scrollRootEl !== rootEl) {\n scrollRootEl = rootEl;\n clearAutoScrolls();\n scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n\n if (scrollEl === true) {\n scrollEl = getParentAutoScrollElement(rootEl, true);\n }\n }\n\n var layersOut = 0;\n var currentParent = scrollEl;\n\n do {\n var el = currentParent,\n rect = getRect(el),\n top = rect.top,\n bottom = rect.bottom,\n left = rect.left,\n right = rect.right,\n width = rect.width,\n height = rect.height,\n canScrollX = void 0,\n canScrollY = void 0,\n scrollWidth = el.scrollWidth,\n scrollHeight = el.scrollHeight,\n elCSS = css(el),\n scrollPosX = el.scrollLeft,\n scrollPosY = el.scrollTop;\n\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\n }\n\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n\n if (!autoScrolls[layersOut]) {\n for (var i = 0; i <= layersOut; i++) {\n if (!autoScrolls[i]) {\n autoScrolls[i] = {};\n }\n }\n }\n\n if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n autoScrolls[layersOut].el = el;\n autoScrolls[layersOut].vx = vx;\n autoScrolls[layersOut].vy = vy;\n clearInterval(autoScrolls[layersOut].pid);\n\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */\n\n autoScrolls[layersOut].pid = setInterval(function () {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) {\n Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n\n }\n\n var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n\n if (typeof scrollCustomFn === 'function') {\n if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\n return;\n }\n }\n\n scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }.bind({\n layer: layersOut\n }), 24);\n }\n }\n\n layersOut++;\n } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n\n scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n dragEl = _ref.dragEl,\n activeSortable = _ref.activeSortable,\n dispatchSortableEvent = _ref.dispatchSortableEvent,\n hideGhostForTarget = _ref.hideGhostForTarget,\n unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent('spill');\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\n\nfunction Revert() {}\n\nRevert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl,\n putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n\n if (putSortable) {\n putSortable.captureAnimationState();\n }\n\n var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n\n if (nextSibling) {\n this.sortable.el.insertBefore(dragEl, nextSibling);\n } else {\n this.sortable.el.appendChild(dragEl);\n }\n\n this.sortable.animateAll();\n\n if (putSortable) {\n putSortable.animateAll();\n }\n },\n drop: drop\n};\n\n_extends(Revert, {\n pluginName: 'revertOnSpill'\n});\n\nfunction Remove() {}\n\nRemove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl,\n putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: drop\n};\n\n_extends(Remove, {\n pluginName: 'removeOnSpill'\n});\n\nvar lastSwapEl;\n\nfunction SwapPlugin() {\n function Swap() {\n this.defaults = {\n swapClass: 'sortable-swap-highlight'\n };\n }\n\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed,\n target = _ref2.target,\n onMove = _ref2.onMove,\n activeSortable = _ref2.activeSortable,\n changed = _ref2.changed,\n cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el,\n options = this.options;\n\n if (target && target !== el) {\n var prevSwapEl = lastSwapEl;\n\n if (onMove(target) !== false) {\n toggleClass(target, options.swapClass, true);\n lastSwapEl = target;\n } else {\n lastSwapEl = null;\n }\n\n if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n toggleClass(prevSwapEl, options.swapClass, false);\n }\n }\n\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable,\n putSortable = _ref3.putSortable,\n dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n\n if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n swapNodes(dragEl, lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n lastSwapEl = null;\n }\n };\n return _extends(Swap, {\n pluginName: 'swap',\n eventProperties: function eventProperties() {\n return {\n swapItem: lastSwapEl\n };\n }\n });\n}\n\nfunction swapNodes(n1, n2) {\n var p1 = n1.parentNode,\n p2 = n2.parentNode,\n i1,\n i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = index(n1);\n i2 = index(n2);\n\n if (p1.isEqualNode(p2) && i1 < i2) {\n i2++;\n }\n\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n multiDragClones = [],\n lastMultiDragSelect,\n // for selection with modifier key down (SHIFT)\nmultiDragSortable,\n initialFolding = false,\n // Initial multi-drag fold when drag started\nfolding = false,\n // Folding any other time\ndragStarted = false,\n dragEl$1,\n clonesFromRect,\n clonesHidden;\n\nfunction MultiDragPlugin() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n\n if (sortable.options.supportPointer) {\n on(document, 'pointerup', this._deselectMultiDrag);\n } else {\n on(document, 'mouseup', this._deselectMultiDrag);\n on(document, 'touchend', this._deselectMultiDrag);\n }\n\n on(document, 'keydown', this._checkKeyDown);\n on(document, 'keyup', this._checkKeyUp);\n this.defaults = {\n selectedClass: 'sortable-selected',\n multiDragKey: null,\n setData: function setData(dataTransfer, dragEl) {\n var data = '';\n\n if (multiDragElements.length && multiDragSortable === sortable) {\n multiDragElements.forEach(function (multiDragElement, i) {\n data += (!i ? '' : ', ') + multiDragElement.textContent;\n });\n } else {\n data = dragEl.textContent;\n }\n\n dataTransfer.setData('Text', data);\n }\n };\n }\n\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable,\n cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n\n for (var i = 0; i < multiDragElements.length; i++) {\n multiDragClones.push(clone(multiDragElements[i]));\n multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n multiDragClones[i].draggable = false;\n multiDragClones[i].style['will-change'] = '';\n toggleClass(multiDragClones[i], this.options.selectedClass, false);\n multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n }\n\n sortable._hideClone();\n\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable,\n rootEl = _ref3.rootEl,\n dispatchSortableEvent = _ref3.dispatchSortableEvent,\n cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n\n if (!this.options.removeCloneOnHide) {\n if (multiDragElements.length && multiDragSortable === sortable) {\n insertMultiDragClones(true, rootEl);\n dispatchSortableEvent('clone');\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown,\n rootEl = _ref4.rootEl,\n cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n insertMultiDragClones(false, rootEl);\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', '');\n });\n cloneNowShown();\n clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n\n var sortable = _ref5.sortable,\n cloneNowHidden = _ref5.cloneNowHidden,\n cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', 'none');\n\n if (_this.options.removeCloneOnHide && clone.parentNode) {\n clone.parentNode.removeChild(clone);\n }\n });\n cloneNowHidden();\n clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n\n if (!this.isMultiDrag && multiDragSortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n }\n\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.sortableIndex = index(multiDragElement);\n }); // Sort multi-drag elements\n\n multiDragElements = multiDragElements.sort(function (a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n sortable.captureAnimationState();\n\n if (this.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n css(multiDragElement, 'position', 'absolute');\n });\n var dragRect = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRect);\n });\n folding = true;\n initialFolding = true;\n }\n }\n\n sortable.animateAll(function () {\n folding = false;\n initialFolding = false;\n\n if (_this2.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n } // Remove all auxiliary multidrag items from el, if sorting enabled\n\n\n if (_this2.options.sort) {\n removeMultiDragElements();\n }\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target,\n completed = _ref8.completed,\n cancel = _ref8.cancel;\n\n if (folding && ~multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable,\n rootEl = _ref9.rootEl,\n sortable = _ref9.sortable,\n dragRect = _ref9.dragRect;\n\n if (multiDragElements.length > 1) {\n // Setup unfold animation\n multiDragElements.forEach(function (multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: folding ? getRect(multiDragElement) : dragRect\n });\n unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n folding = false;\n insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable,\n isOwner = _ref10.isOwner,\n insertion = _ref10.insertion,\n activeSortable = _ref10.activeSortable,\n parentEl = _ref10.parentEl,\n putSortable = _ref10.putSortable;\n var options = this.options;\n\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n }\n\n initialFolding = false; // If leaving sort:false root, or already folding - Fold to new location\n\n if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRectAbsolute); // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n\n parentEl.appendChild(multiDragElement);\n });\n folding = true;\n } // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n\n\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!folding) {\n removeMultiDragElements();\n }\n\n if (multiDragElements.length > 1) {\n var clonesHiddenBefore = clonesHidden;\n\n activeSortable._showClone(sortable); // Unfold animation for clones if showing from hidden\n\n\n if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n multiDragClones.forEach(function (clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: clonesFromRect\n });\n clone.fromRect = clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n }\n } else {\n activeSortable._showClone(sortable);\n }\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect,\n isOwner = _ref11.isOwner,\n activeSortable = _ref11.activeSortable;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n clonesFromRect = _extends({}, dragRect);\n var dragMatrix = matrix(dragEl$1, true);\n clonesFromRect.top -= dragMatrix.f;\n clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if (folding) {\n folding = false;\n removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent,\n rootEl = _ref12.rootEl,\n parentEl = _ref12.parentEl,\n sortable = _ref12.sortable,\n dispatchSortableEvent = _ref12.dispatchSortableEvent,\n oldIndex = _ref12.oldIndex,\n putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options,\n children = parentEl.children; // Multi-drag selection\n\n if (!dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) {\n this._deselectMultiDrag();\n }\n\n toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n\n if (!~multiDragElements.indexOf(dragEl$1)) {\n multiDragElements.push(dragEl$1);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: dragEl$1,\n originalEvt: evt\n }); // Modifier activated, select from last to dragEl\n\n if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n var lastIndex = index(lastMultiDragSelect),\n currentIndex = index(dragEl$1);\n\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n\n for (; i < n; i++) {\n if (~multiDragElements.indexOf(children[i])) continue;\n toggleClass(children[i], options.selectedClass, true);\n multiDragElements.push(children[i]);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: children[i],\n originalEvt: evt\n });\n }\n }\n } else {\n lastMultiDragSelect = dragEl$1;\n }\n\n multiDragSortable = toSortable;\n } else {\n multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n lastMultiDragSelect = null;\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'deselect',\n targetEl: dragEl$1,\n originalEvt: evt\n });\n }\n } // Multi-drag drop\n\n\n if (dragStarted && this.isMultiDrag) {\n // Do not \"unfold\" after around dragEl if reverted\n if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n var dragRect = getRect(dragEl$1),\n multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n\n if (!initialFolding) {\n if (options.animation) {\n dragEl$1.fromRect = dragRect;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n\n if (multiDragElement !== dragEl$1) {\n var rect = folding ? getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect; // Prepare unfold animation\n\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n } // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n\n\n removeMultiDragElements();\n multiDragElements.forEach(function (multiDragElement) {\n if (children[multiDragIndex]) {\n parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n } else {\n parentEl.appendChild(multiDragElement);\n }\n\n multiDragIndex++;\n }); // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n\n if (oldIndex === index(dragEl$1)) {\n var update = false;\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n update = true;\n return;\n }\n });\n\n if (update) {\n dispatchSortableEvent('update');\n }\n }\n } // Must be done after capturing individual rects (scroll bar)\n\n\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n\n multiDragSortable = toSortable;\n } // Remove clones if necessary\n\n\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n multiDragClones.forEach(function (clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n }\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = dragStarted = false;\n multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n\n off(document, 'pointerup', this._deselectMultiDrag);\n off(document, 'mouseup', this._deselectMultiDrag);\n off(document, 'touchend', this._deselectMultiDrag);\n off(document, 'keydown', this._checkKeyDown);\n off(document, 'keyup', this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof dragStarted !== \"undefined\" && dragStarted) return; // Only deselect if selection is in this sortable\n\n if (multiDragSortable !== this.sortable) return; // Only deselect if target is not item in this sortable\n\n if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return; // Only deselect if left click\n\n if (evt && evt.button !== 0) return;\n\n while (multiDragElements.length) {\n var el = multiDragElements[0];\n toggleClass(el, this.options.selectedClass, false);\n multiDragElements.shift();\n dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: 'deselect',\n targetEl: el,\n originalEvt: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = true;\n }\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = false;\n }\n }\n };\n return _extends(MultiDrag, {\n // Static methods & properties\n pluginName: 'multiDrag',\n utils: {\n /**\r\n * Selects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be selected\r\n */\n select: function select(el) {\n var sortable = el.parentNode[expando];\n if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n\n if (multiDragSortable && multiDragSortable !== sortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n\n multiDragSortable = sortable;\n }\n\n toggleClass(el, sortable.options.selectedClass, true);\n multiDragElements.push(el);\n },\n\n /**\r\n * Deselects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be deselected\r\n */\n deselect: function deselect(el) {\n var sortable = el.parentNode[expando],\n index = multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n toggleClass(el, sortable.options.selectedClass, false);\n multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n\n var oldIndicies = [],\n newIndicies = [];\n multiDragElements.forEach(function (multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n }); // multiDragElements will already be sorted if folding\n\n var newIndex;\n\n if (folding && multiDragElement !== dragEl$1) {\n newIndex = -1;\n } else if (folding) {\n newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n } else {\n newIndex = index(multiDragElement);\n }\n\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: _toConsumableArray(multiDragElements),\n clones: [].concat(multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n\n if (key === 'ctrl') {\n key = 'Control';\n } else if (key.length > 1) {\n key = key.charAt(0).toUpperCase() + key.substr(1);\n }\n\n return key;\n }\n }\n });\n}\n\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n multiDragElements.forEach(function (multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n\n if (target) {\n rootEl.insertBefore(multiDragElement, target);\n } else {\n rootEl.appendChild(multiDragElement);\n }\n });\n}\n/**\r\n * Insert multi-drag clones\r\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\r\n * @param {HTMLElement} rootEl\r\n */\n\n\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n multiDragClones.forEach(function (clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n\n if (target) {\n rootEl.insertBefore(clone, target);\n } else {\n rootEl.appendChild(clone);\n }\n });\n}\n\nfunction removeMultiDragElements() {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\n\nSortable.mount(new AutoScrollPlugin());\nSortable.mount(Remove, Revert);\n\nexport default Sortable;\nexport { MultiDragPlugin as MultiDrag, Sortable, SwapPlugin as Swap };\n","// Styles\nimport './VImg.sass'\n\n// Directives\nimport intersect from '../../directives/intersect'\n\n// Types\nimport { VNode } from 'vue'\nimport { PropValidator } from 'vue/types/options'\n\n// Components\nimport VResponsive from '../VResponsive'\n\n// Mixins\nimport Themeable from '../../mixins/themeable'\n\n// Utils\nimport mixins from '../../util/mixins'\nimport mergeData from '../../util/mergeData'\nimport { consoleWarn } from '../../util/console'\n\n// not intended for public use, this is passed in by vuetify-loader\nexport interface srcObject {\n src: string\n srcset?: string\n lazySrc: string\n aspect: number\n}\n\nconst hasIntersect = typeof window !== 'undefined' && 'IntersectionObserver' in window\n\n/* @vue/component */\nexport default mixins(\n VResponsive,\n Themeable,\n).extend({\n name: 'v-img',\n\n directives: { intersect },\n\n props: {\n alt: String,\n contain: Boolean,\n eager: Boolean,\n gradient: String,\n lazySrc: String,\n options: {\n type: Object,\n // For more information on types, navigate to:\n // https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API\n default: () => ({\n root: undefined,\n rootMargin: undefined,\n threshold: undefined,\n }),\n } as PropValidator,\n position: {\n type: String,\n default: 'center center',\n },\n sizes: String,\n src: {\n type: [String, Object],\n default: '',\n } as PropValidator,\n srcset: String,\n transition: {\n type: [Boolean, String],\n default: 'fade-transition',\n },\n },\n\n data () {\n return {\n currentSrc: '', // Set from srcset\n image: null as HTMLImageElement | null,\n isLoading: true,\n calculatedAspectRatio: undefined as number | undefined,\n naturalWidth: undefined as number | undefined,\n hasError: false,\n }\n },\n\n computed: {\n computedAspectRatio (): number {\n return Number(this.normalisedSrc.aspect || this.calculatedAspectRatio)\n },\n normalisedSrc (): srcObject {\n return this.src && typeof this.src === 'object'\n ? {\n src: this.src.src,\n srcset: this.srcset || this.src.srcset,\n lazySrc: this.lazySrc || this.src.lazySrc,\n aspect: Number(this.aspectRatio || this.src.aspect),\n } : {\n src: this.src,\n srcset: this.srcset,\n lazySrc: this.lazySrc,\n aspect: Number(this.aspectRatio || 0),\n }\n },\n __cachedImage (): VNode | [] {\n if (!(this.normalisedSrc.src || this.normalisedSrc.lazySrc || this.gradient)) return []\n\n const backgroundImage: string[] = []\n const src = this.isLoading ? this.normalisedSrc.lazySrc : this.currentSrc\n\n if (this.gradient) backgroundImage.push(`linear-gradient(${this.gradient})`)\n if (src) backgroundImage.push(`url(\"${src}\")`)\n\n const image = this.$createElement('div', {\n staticClass: 'v-image__image',\n class: {\n 'v-image__image--preload': this.isLoading,\n 'v-image__image--contain': this.contain,\n 'v-image__image--cover': !this.contain,\n },\n style: {\n backgroundImage: backgroundImage.join(', '),\n backgroundPosition: this.position,\n },\n key: +this.isLoading,\n })\n\n /* istanbul ignore if */\n if (!this.transition) return image\n\n return this.$createElement('transition', {\n attrs: {\n name: this.transition,\n mode: 'in-out',\n },\n }, [image])\n },\n },\n\n watch: {\n src () {\n // Force re-init when src changes\n if (!this.isLoading) this.init(undefined, undefined, true)\n else this.loadImage()\n },\n '$vuetify.breakpoint.width': 'getSrc',\n },\n\n mounted () {\n this.init()\n },\n\n methods: {\n init (\n entries?: IntersectionObserverEntry[],\n observer?: IntersectionObserver,\n isIntersecting?: boolean\n ) {\n // If the current browser supports the intersection\n // observer api, the image is not observable, and\n // the eager prop isn't being used, do not load\n if (\n hasIntersect &&\n !isIntersecting &&\n !this.eager\n ) return\n\n if (this.normalisedSrc.lazySrc) {\n const lazyImg = new Image()\n lazyImg.src = this.normalisedSrc.lazySrc\n this.pollForSize(lazyImg, null)\n }\n /* istanbul ignore else */\n if (this.normalisedSrc.src) this.loadImage()\n },\n onLoad () {\n this.getSrc()\n this.isLoading = false\n this.$emit('load', this.src)\n },\n onError () {\n this.hasError = true\n this.$emit('error', this.src)\n },\n getSrc () {\n /* istanbul ignore else */\n if (this.image) this.currentSrc = this.image.currentSrc || this.image.src\n },\n loadImage () {\n const image = new Image()\n this.image = image\n\n image.onload = () => {\n /* istanbul ignore if */\n if (image.decode) {\n image.decode().catch((err: DOMException) => {\n consoleWarn(\n `Failed to decode image, trying to render anyway\\n\\n` +\n `src: ${this.normalisedSrc.src}` +\n (err.message ? `\\nOriginal error: ${err.message}` : ''),\n this\n )\n }).then(this.onLoad)\n } else {\n this.onLoad()\n }\n }\n image.onerror = this.onError\n\n this.hasError = false\n image.src = this.normalisedSrc.src\n this.sizes && (image.sizes = this.sizes)\n this.normalisedSrc.srcset && (image.srcset = this.normalisedSrc.srcset)\n\n this.aspectRatio || this.pollForSize(image)\n this.getSrc()\n },\n pollForSize (img: HTMLImageElement, timeout: number | null = 100) {\n const poll = () => {\n const { naturalHeight, naturalWidth } = img\n\n if (naturalHeight || naturalWidth) {\n this.naturalWidth = naturalWidth\n this.calculatedAspectRatio = naturalWidth / naturalHeight\n } else {\n timeout != null && !this.hasError && setTimeout(poll, timeout)\n }\n }\n\n poll()\n },\n genContent () {\n const content: VNode = VResponsive.options.methods.genContent.call(this)\n if (this.naturalWidth) {\n this._b(content.data!, 'div', {\n style: { width: `${this.naturalWidth}px` },\n })\n }\n\n return content\n },\n __genPlaceholder (): VNode | void {\n if (this.$slots.placeholder) {\n const placeholder = this.isLoading\n ? [this.$createElement('div', {\n staticClass: 'v-image__placeholder',\n }, this.$slots.placeholder)]\n : []\n\n if (!this.transition) return placeholder[0]\n\n return this.$createElement('transition', {\n props: {\n appear: true,\n name: this.transition,\n },\n }, placeholder)\n }\n },\n },\n\n render (h): VNode {\n const node = VResponsive.options.render.call(this, h)\n\n const data = mergeData(node.data!, {\n staticClass: 'v-image',\n attrs: {\n 'aria-label': this.alt,\n role: this.alt ? 'img' : undefined,\n },\n class: this.themeClasses,\n // Only load intersect directive if it\n // will work in the current browser.\n directives: hasIntersect\n ? [{\n name: 'intersect',\n modifiers: { once: true },\n value: {\n handler: this.init,\n options: this.options,\n },\n }]\n : undefined,\n })\n\n node.children = [\n this.__cachedSizer,\n this.__cachedImage,\n this.__genPlaceholder(),\n this.genContent(),\n ] as VNode[]\n\n return h(node.tag, data, node.children)\n },\n})\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('isarray')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n * incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n ? global.TYPED_ARRAY_SUPPORT\n : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n try {\n var arr = new Uint8Array(1)\n arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n return arr.foo() === 42 && // typed array instances can be augmented\n typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n } catch (e) {\n return false\n }\n}\n\nfunction kMaxLength () {\n return Buffer.TYPED_ARRAY_SUPPORT\n ? 0x7fffffff\n : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n if (kMaxLength() < length) {\n throw new RangeError('Invalid typed array length')\n }\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = new Uint8Array(length)\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n if (that === null) {\n that = new Buffer(length)\n }\n that.length = length\n }\n\n return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n return new Buffer(arg, encodingOrOffset, length)\n }\n\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new Error(\n 'If encoding is specified then the first argument must be a string'\n )\n }\n return allocUnsafe(this, arg)\n }\n return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n arr.__proto__ = Buffer.prototype\n return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number')\n }\n\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return fromArrayBuffer(that, value, encodingOrOffset, length)\n }\n\n if (typeof value === 'string') {\n return fromString(that, value, encodingOrOffset)\n }\n\n return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n Buffer.prototype.__proto__ = Uint8Array.prototype\n Buffer.__proto__ = Uint8Array\n if (typeof Symbol !== 'undefined' && Symbol.species &&\n Buffer[Symbol.species] === Buffer) {\n // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n Object.defineProperty(Buffer, Symbol.species, {\n value: null,\n configurable: true\n })\n }\n}\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be a number')\n } else if (size < 0) {\n throw new RangeError('\"size\" argument must not be negative')\n }\n}\n\nfunction alloc (that, size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(that, size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpretted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(that, size).fill(fill, encoding)\n : createBuffer(that, size).fill(fill)\n }\n return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n assertSize(size)\n that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) {\n for (var i = 0; i < size; ++i) {\n that[i] = 0\n }\n }\n return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('\"encoding\" must be a valid string encoding')\n }\n\n var length = byteLength(string, encoding) | 0\n that = createBuffer(that, length)\n\n var actual = that.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n that = that.slice(0, actual)\n }\n\n return that\n}\n\nfunction fromArrayLike (that, array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n that = createBuffer(that, length)\n for (var i = 0; i < length; i += 1) {\n that[i] = array[i] & 255\n }\n return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\\'offset\\' is out of bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\\'length\\' is out of bounds')\n }\n\n if (byteOffset === undefined && length === undefined) {\n array = new Uint8Array(array)\n } else if (length === undefined) {\n array = new Uint8Array(array, byteOffset)\n } else {\n array = new Uint8Array(array, byteOffset, length)\n }\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = array\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n that = fromArrayLike(that, array)\n }\n return that\n}\n\nfunction fromObject (that, obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0\n that = createBuffer(that, len)\n\n if (that.length === 0) {\n return that\n }\n\n obj.copy(that, 0, 0, len)\n return that\n }\n\n if (obj) {\n if ((typeof ArrayBuffer !== 'undefined' &&\n obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n if (typeof obj.length !== 'number' || isnan(obj.length)) {\n return createBuffer(that, 0)\n }\n return fromArrayLike(that, obj)\n }\n\n if (obj.type === 'Buffer' && isArray(obj.data)) {\n return fromArrayLike(that, obj.data)\n }\n }\n\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n // Note: cannot use `length < kMaxLength()` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= kMaxLength()) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + kMaxLength().toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError('Arguments must be Buffers')\n }\n\n if (a === b) return 0\n\n var x = a.length\n var y = b.length\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = Buffer.allocUnsafe(length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos)\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n string = '' + string\n }\n\n var len = string.length\n if (len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n case undefined:\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) return utf8ToBytes(string).length // assume utf8\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n var i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n var length = this.length | 0\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n var str = ''\n var max = exports.INSPECT_MAX_BYTES\n if (this.length > 0) {\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n if (this.length > max) str += ' ... '\n }\n return ''\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (!Buffer.isBuffer(target)) {\n throw new TypeError('Argument must be a Buffer')\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart\n var y = end - start\n var len = Math.min(x, y)\n\n var thisCopy = this.slice(thisStart, thisEnd)\n var targetCopy = target.slice(start, end)\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (isNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (Buffer.TYPED_ARRAY_SUPPORT &&\n typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1\n var arrLength = arr.length\n var valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i\n if (dir) {\n var foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n var found = true\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n var remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n // must be an even number of digits\n var strLen = string.length\n if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16)\n if (isNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset | 0\n if (isFinite(length)) {\n length = length | 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n // legacy write(string, encoding, offset, length) - remove in v0.13\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n return asciiWrite(this, string, offset, length)\n\n case 'latin1':\n case 'binary':\n return latin1Write(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n var res = []\n\n var i = start\n while (i < end) {\n var firstByte = buf[i]\n var codePoint = null\n var bytesPerSequence = (firstByte > 0xEF) ? 4\n : (firstByte > 0xDF) ? 3\n : (firstByte > 0xBF) ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = ''\n var i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n var out = ''\n for (var i = start; i < end; ++i) {\n out += toHex(buf[i])\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end)\n var res = ''\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n newBuf = this.subarray(start, end)\n newBuf.__proto__ = Buffer.prototype\n } else {\n var sliceLen = end - start\n newBuf = new Buffer(sliceLen, undefined)\n for (var i = 0; i < sliceLen; ++i) {\n newBuf[i] = this[i + start]\n }\n }\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n var val = this[offset + --byteLength]\n var mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var i = byteLength\n var mul = 1\n var val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var mul = 1\n var i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var i = byteLength - 1\n var mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n (littleEndian ? i : 1 - i) * 8\n }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffffffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = 0\n var mul = 1\n var sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = byteLength - 1\n var mul = 1\n var sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n var i\n\n if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start]\n }\n } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n // ascending copy from start\n for (i = 0; i < len; ++i) {\n target[i + targetStart] = this[i + start]\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, start + len),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if (code < 256) {\n val = code\n }\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n } else if (typeof val === 'number') {\n val = val & 255\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = Buffer.isBuffer(val)\n ? val\n : utf8ToBytes(new Buffer(val, encoding).toString())\n var len = bytes.length\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction stringtrim (str) {\n if (str.trim) return str.trim()\n return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n if (n < 16) return '0' + n.toString(16)\n return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\nfunction isnan (val) {\n return val !== val // eslint-disable-line no-self-compare\n}\n","'use strict';\nvar $ = require('../internals/export');\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\n$({ target: 'URL', proto: true, enumerable: true }, {\n toJSON: function toJSON() {\n return URL.prototype.toString.call(this);\n }\n});\n","var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n return toString.call(arr) == '[object Array]';\n};\n"],"sourceRoot":""}