fabric-with-gestures
Version:
Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.
1 lines • 344 kB
JavaScript
var fabric=fabric||{version:"4.5.0"};if("undefined"!=typeof exports?exports.fabric=fabric:"function"==typeof define&&define.amd&&define([],function(){return fabric}),"undefined"!=typeof document&&"undefined"!=typeof window)document instanceof("undefined"!=typeof HTMLDocument?HTMLDocument:Document)?fabric.document=document:fabric.document=document.implementation.createHTMLDocument(""),fabric.window=window;else{var jsdom=require("jsdom"),virtualWindow=new jsdom.JSDOM(decodeURIComponent("%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E"),{features:{FetchExternalResources:["img"]},resources:"usable"}).window;fabric.document=virtualWindow.document,fabric.jsdomImplForWrapper=require("jsdom/lib/jsdom/living/generated/utils").implForWrapper,fabric.nodeCanvas=require("jsdom/lib/jsdom/utils").Canvas,fabric.window=virtualWindow,DOMParser=fabric.window.DOMParser}if(fabric.isTouchSupported="ontouchstart"in fabric.window||"ontouchstart"in fabric.document||fabric.window&&fabric.window.navigator&&0<fabric.window.navigator.maxTouchPoints,fabric.isLikelyNode="undefined"!=typeof Buffer&&"undefined"==typeof window,fabric.SHARED_ATTRIBUTES=["display","transform","fill","fill-opacity","fill-rule","opacity","stroke","stroke-dasharray","stroke-linecap","stroke-dashoffset","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","id","paint-order","vector-effect","instantiated_by_use","clip-path"],fabric.DPI=96,fabric.reNum="(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:[eE][-+]?\\d+)?)",fabric.commaWsp="(?:\\s+,?\\s*|,\\s*)",fabric.rePathCommand=/([-+]?((\d+\.\d+)|((\d+)|(\.\d+)))(?:[eE][-+]?\d+)?)/gi,fabric.reNonWord=/[ \n\.,;!\?\-]/,fabric.fontPaths={},fabric.iMatrix=[1,0,0,1,0,0],fabric.svgNS="http://www.w3.org/2000/svg",fabric.perfLimitSizeTotal=2097152,fabric.maxCacheSideLimit=4096,fabric.minCacheSideLimit=256,fabric.charWidthsCache={},fabric.textureSize=2048,fabric.disableStyleCopyPaste=!1,fabric.enableGLFiltering=!0,fabric.devicePixelRatio=fabric.window.devicePixelRatio||fabric.window.webkitDevicePixelRatio||fabric.window.mozDevicePixelRatio||1,fabric.browserShadowBlurConstant=1,fabric.arcToSegmentsCache={},fabric.boundsOfCurveCache={},fabric.cachesBoundsOfCurve=!0,fabric.forceGLPutImageData=!1,fabric.initFilterBackend=function(){return fabric.enableGLFiltering&&fabric.isWebglSupported&&fabric.isWebglSupported(fabric.textureSize)?(console.log("max texture size: "+fabric.maxTextureSize),new fabric.WebglFilterBackend({tileSize:fabric.textureSize})):fabric.Canvas2dFilterBackend?new fabric.Canvas2dFilterBackend:void 0},"undefined"!=typeof document&&"undefined"!=typeof window&&(window.fabric=fabric),void 0===eventjs)var eventjs={};if(function(E){"use strict";E.modifyEventListener=!1,E.modifySelectors=!1,E.configure=function(t){isFinite(t.modifyEventListener)&&(E.modifyEventListener=t.modifyEventListener),isFinite(t.modifySelectors)&&(E.modifySelectors=t.modifySelectors),!1===i&&E.modifyEventListener&&r(),!1===n&&E.modifySelectors&&a()},E.add=function(t,e,i,r){return M(t,e,i,r,"add")},E.remove=function(t,e,i,r){return M(t,e,i,r,"remove")},E.returnFalse=function(t){return!1},E.stop=function(t){t&&(t.stopPropagation&&t.stopPropagation(),t.cancelBubble=!0,t.cancelBubbleCount=0)},E.prevent=function(t){t&&(t.preventDefault?t.preventDefault():t.preventManipulation?t.preventManipulation():t.returnValue=!1)},E.cancel=function(t){E.stop(t),E.prevent(t)},E.blur=function(){var t=document.activeElement;if(t){var e=document.activeElement.nodeName;"INPUT"!==e&&"TEXTAREA"!==e&&"true"!==t.contentEditable||t.blur&&t.blur()}},E.getEventSupport=function(t,e){if("string"==typeof t&&(e=t,t=window),(e="on"+e)in t)return!0;if(t.setAttribute||(t=document.createElement("div")),t.setAttribute&&t.removeAttribute){t.setAttribute(e,"");var i="function"==typeof t[e];return void 0!==t[e]&&(t[e]=null),t.removeAttribute(e),i}};var D=function(t){if(!t||"object"!=typeof t)return t;var e=new t.constructor;for(var i in t)t[i]&&"object"==typeof t[i]?e[i]=D(t[i]):e[i]=t[i];return e},M=function(r,t,e,i,n,s){if(i=i||{},"[object Object]"===String(r)){var o=r;if(r=o.target,delete o.target,!o.type||!o.listener){for(var a in o){var c=o[a];"function"!=typeof c&&(i[a]=c)}var h={};for(var l in o){a=l.split(",");var u=o[l],f={};for(var d in i)f[d]=i[d];if("function"==typeof u)e=u;else{if("function"!=typeof u.listener)continue;e=u.listener;for(var d in u)"function"!=typeof u[d]&&(f[d]=u[d])}for(var g=0;g<a.length;g++)h[l]=eventjs.add(r,a[g],e,f,n)}return h}for(var l in t=o.type,delete o.type,e=o.listener,delete o.listener,o)i[l]=o[l]}if(r&&t&&e){if("string"==typeof r&&"ready"===t){if(!window.eventjs_stallOnReady){var p=(new Date).getTime(),v=i.timeout,m=i.interval||1e3/60,b=window.setInterval(function(){(new Date).getTime()-p>v&&window.clearInterval(b),document.querySelector(r)&&(window.clearInterval(b),setTimeout(e,1))},m);return}t="load",r=window}if("string"==typeof r){if(0===(r=document.querySelectorAll(r)).length)return F("Missing target on listener!",arguments);1===r.length&&(r=r[0])}var y,_={};if(0<r.length&&r!==window){for(var x=0,C=r.length;x<C;x++)(y=M(r[x],t,e,D(i),n))&&(_[x]=y);return A(_)}if("string"==typeof t&&(-1!==(t=t.toLowerCase()).indexOf(" ")?t=t.split(" "):-1!==t.indexOf(",")&&(t=t.split(","))),"string"!=typeof t){if("number"==typeof t.length)for(var S=0,w=t.length;S<w;S++)(y=M(r,t[S],e,D(i),n))&&(_[t[S]]=y);else for(var l in t)(y="function"==typeof t[l]?M(r,l,t[l],D(i),n):M(r,l,t[l].listener,D(t[l]),n))&&(_[l]=y);return A(_)}if(0===t.indexOf("on")&&(t=t.substr(2)),"object"!=typeof r)return F("Target is not defined!",arguments);if("function"!=typeof e)return F("Listener is not a function!",arguments);var T=i.useCapture||!1,O=R(r)+"."+R(e)+"."+(T?1:0);if(E.Gesture&&E.Gesture._gestureHandlers[t]){if(O=t+O,"remove"===n){if(!I[O])return;I[O].remove(),delete I[O]}else if("add"===n){if(I[O])return I[O].add(),I[O];if(i.useCall&&!E.modifyEventListener){var j=e;e=function(t,e){for(var i in e)t[i]=e[i];return j.call(r,t)}}i.gesture=t,i.target=r,i.listener=e,i.fromOverwrite=s,I[O]=E.proxy[t](i)}return I[O]}var P,k=L(t);for(g=0;g<k.length;g++)if(P=(t=k[g])+"."+O,"remove"===n){if(!I[P])continue;r[X](t,e,T),delete I[P]}else if("add"===n){if(I[P])return I[P];r[B](t,e,T),I[P]={id:P,type:t,target:r,listener:e,remove:function(){for(var t=0;t<k.length;t++)E.remove(r,k[t],e,i)}}}return I[P]}},A=function(e){return{remove:function(){for(var t in e)e[t].remove()},add:function(){for(var t in e)e[t].add()}}},F=function(t,e){"undefined"!=typeof console&&void 0!==console.error&&console.error(t,e)},s={msPointer:["MSPointerDown","MSPointerMove","MSPointerUp"],touch:["touchstart","touchmove","touchend"],mouse:["mousedown","mousemove","mouseup"]},o={MSPointerDown:0,MSPointerMove:1,MSPointerUp:2,touchstart:0,touchmove:1,touchend:2,mousedown:0,mousemove:1,mouseup:2},L=(E.supports={},window.navigator.msPointerEnabled&&(E.supports.msPointer=!0),E.getEventSupport("touchstart")&&(E.supports.touch=!0),E.getEventSupport("mousedown")&&(E.supports.mouse=!0),function(t){var e=document.addEventListener?"":"on",i=o[t];if(isFinite(i)){var r=[];for(var n in E.supports)r.push(e+s[n][i]);return r}return[e+t]}),I={},e=0,R=function(t){return t===window?"#window":t===document?"#document":(t.uniqueID||(t.uniqueID="e"+e++),t.uniqueID)},B=document.addEventListener?"addEventListener":"attachEvent",X=document.removeEventListener?"removeEventListener":"detachEvent",i=!(E.createPointerEvent=function(t,e,i){var r=e.gesture,n=e.target,s=t.changedTouches||E.proxy.getCoords(t);if(s.length){var o=s[0];e.pointers=i?[]:s,e.pageX=o.pageX,e.pageY=o.pageY,e.x=e.pageX,e.y=e.pageY}var a=document.createEvent("Event");for(var c in a.initEvent(r,!0,!0),a.originalEvent=t,e)"target"!==c&&(a[c]=e[c]);var h=a.type;E.Gesture&&E.Gesture._gestureHandlers[h]&&e.oldListener.call(n,a,e,!1)}),r=function(){if(window.HTMLElement){var t=function(e){var t=function(o){var t=o+"EventListener",a=e[t];e[t]=function(t,e,i){if(E.Gesture&&E.Gesture._gestureHandlers[t]){var r=i;"object"==typeof i?r.useCall=!0:r={useCall:!0,useCapture:i},M(this,t,e,r,o,!0)}else for(var n=L(t),s=0;s<n.length;s++)a.call(this,n[s],e,i)}};t("add"),t("remove")};navigator.userAgent.match(/Firefox/)?(t(HTMLDivElement.prototype),t(HTMLCanvasElement.prototype)):t(HTMLElement.prototype),t(document),t(window)}},n=!1,a=function(){var t=NodeList.prototype;t.removeEventListener=function(t,e,i){for(var r=0,n=this.length;r<n;r++)this[r].removeEventListener(t,e,i)},t.addEventListener=function(t,e,i){for(var r=0,n=this.length;r<n;r++)this[r].addEventListener(t,e,i)}}}(eventjs),void 0===eventjs)eventjs={};if(void 0===eventjs.proxy&&(eventjs.proxy={}),eventjs.proxy=function(g){"use strict";g.pointerSetup=function(e,i){e.target=e.target||window,e.doc=e.target.ownerDocument||e.target,e.minFingers=e.minFingers||e.fingers||1,e.maxFingers=e.maxFingers||e.fingers||1/0,e.position=e.position||"relative",delete e.fingers,(i=i||{}).enabled=!0,i.gesture=e.gesture,i.target=e.target,i.env=e.env,eventjs.modifyEventListener&&e.fromOverwrite&&(e.oldListener=e.listener,e.listener=eventjs.createPointerEvent);var r=0,n=0===i.gesture.indexOf("pointer")&&eventjs.modifyEventListener?"pointer":"mouse";return e.oldListener&&(i.oldListener=e.oldListener),i.listener=e.listener,i.proxy=function(t){i.defaultListener=e.listener,(e.listener=t)(e.event,i)},i.add=function(){!0!==i.enabled&&(e.onPointerDown&&eventjs.add(e.target,n+"down",e.onPointerDown),e.onPointerMove&&eventjs.add(e.doc,n+"move",e.onPointerMove),e.onPointerUp&&eventjs.add(e.doc,n+"up",e.onPointerUp),i.enabled=!0)},i.remove=function(){!1!==i.enabled&&(e.onPointerDown&&eventjs.remove(e.target,n+"down",e.onPointerDown),e.onPointerMove&&eventjs.remove(e.doc,n+"move",e.onPointerMove),e.onPointerUp&&eventjs.remove(e.doc,n+"up",e.onPointerUp),i.reset(),i.enabled=!1)},i.pause=function(t){!e.onPointerMove||t&&!t.move||eventjs.remove(e.doc,n+"move",e.onPointerMove),!e.onPointerUp||t&&!t.up||eventjs.remove(e.doc,n+"up",e.onPointerUp),r=e.fingers,e.fingers=0},i.resume=function(t){!e.onPointerMove||t&&!t.move||eventjs.add(e.doc,n+"move",e.onPointerMove),!e.onPointerUp||t&&!t.up||eventjs.add(e.doc,n+"up",e.onPointerUp),e.fingers=r},i.reset=function(){e.tracker={},e.fingers=0},i};var t=eventjs.supports;eventjs.isMouse=!!t.mouse,eventjs.isMSPointer=!!t.touch,eventjs.isTouch=!!t.msPointer,g.pointerStart=function(t,e,o){var i=(t.type||"mousedown").toUpperCase();0===i.indexOf("MOUSE")?(eventjs.isMouse=!0,eventjs.isTouch=!1,eventjs.isMSPointer=!1):0===i.indexOf("TOUCH")?(eventjs.isMouse=!1,eventjs.isTouch=!0,eventjs.isMSPointer=!1):0===i.indexOf("MSPOINTER")&&(eventjs.isMouse=!1,eventjs.isTouch=!1,eventjs.isMSPointer=!0);var r=function(t,e){var i=o.bbox,r=a[e]={};switch(o.position){case"absolute":r.offsetX=0,r.offsetY=0;break;case"differenceFromLast":case"difference":r.offsetX=t.pageX,r.offsetY=t.pageY;break;case"move":r.offsetX=t.pageX-i.x1,r.offsetY=t.pageY-i.y1;break;default:r.offsetX=i.x1-i.scrollLeft,r.offsetY=i.y1-i.scrollTop}var n=t.pageX-r.offsetX,s=t.pageY-r.offsetY;r.rotation=0,r.scale=1,r.startTime=r.moveTime=(new Date).getTime(),r.move={x:n,y:s},r.start={x:n,y:s},o.fingers++};o.event=t,e.defaultListener&&(o.listener=e.defaultListener,delete e.defaultListener);for(var n=!o.fingers,a=o.tracker,s=t.changedTouches||g.getCoords(t),c=s.length,h=0;h<c;h++){var l=s[h],u=l.identifier||1/0;if(o.fingers){if(o.fingers>=o.maxFingers){var f=[];for(var u in o.tracker)f.push(u);return e.identifier=f.join(","),n}for(var d in a){if(a[d].up){delete a[d],r(l,u),o.cancel=!0;break}0}if(a[u])continue;r(l,u)}else a=o.tracker={},e.bbox=o.bbox=g.getBoundingBox(o.target),o.fingers=0,o.cancel=!1,r(l,u)}f=[];for(var u in o.tracker)f.push(u);return e.identifier=f.join(","),n},g.pointerEnd=function(t,e,i,r){for(var n=t.touches||[],s=n.length,o={},a=0;a<s;a++){o[(c=n[a].identifier)||1/0]=!0}for(var c in i.tracker){var h=i.tracker[c];o[c]||h.up||(r&&r({pageX:h.pageX,pageY:h.pageY,changedTouches:[{pageX:h.pageX,pageY:h.pageY,identifier:"Infinity"===c?1/0:c}]},"up"),h.up=!0,i.fingers--)}if(0!==i.fingers)return!1;var l=[];for(var c in i.gestureFingers=0,i.tracker)i.gestureFingers++,l.push(c);return e.identifier=l.join(","),!0},g.getCoords=function(t){return void 0!==t.pageX?g.getCoords=function(t){return Array({type:"mouse",x:t.pageX,y:t.pageY,pageX:t.pageX,pageY:t.pageY,identifier:t.pointerId||1/0})}:g.getCoords=function(t){var e=document.documentElement;return t=t||window.event,Array({type:"mouse",x:t.clientX+e.scrollLeft,y:t.clientY+e.scrollTop,pageX:t.clientX+e.scrollLeft,pageY:t.clientY+e.scrollTop,identifier:1/0})},g.getCoords(t)},g.getCoord=function(t){if("ontouchstart"in window){var i=0,r=0;g.getCoord=function(t){var e=t.changedTouches;return e&&e.length?{x:i=e[0].pageX,y:r=e[0].pageY}:{x:i,y:r}}}else void 0!==t.pageX&&void 0!==t.pageY?g.getCoord=function(t){return{x:t.pageX,y:t.pageY}}:g.getCoord=function(t){var e=document.documentElement;return{x:(t=t||window.event).clientX+e.scrollLeft,y:t.clientY+e.scrollTop}};return g.getCoord(t)};var i,e,r,l=function(t,e){var i=parseFloat(t.getPropertyValue(e),10);return isFinite(i)?i:0};return g.getBoundingBox=function(t){t!==window&&t!==document||(t=document.body);var e={},i=t.getBoundingClientRect();if(e.width=i.width,e.height=i.height,e.x1=i.left,e.y1=i.top,e.scaleX=i.width/t.offsetWidth||1,e.scaleY=i.height/t.offsetHeight||1,e.scrollLeft=0,e.scrollTop=0,!1===("border-box"===(c=window.getComputedStyle(t)).getPropertyValue("box-sizing"))){var r=l(c,"border-left-width"),n=l(c,"border-right-width"),s=l(c,"border-bottom-width"),o=l(c,"border-top-width");e.border=[r,n,o,s],e.x1+=r,e.y1+=o,e.width-=n+r,e.height-=s+o}e.x2=e.x1+e.width,e.y2=e.y1+e.height;for(var a="fixed"===(h=c.getPropertyValue("position"))?t:t.parentNode;null!==a&&a!==document.body&&void 0!==a.scrollTop;){var c,h;if("absolute"===(h=(c=window.getComputedStyle(a)).getPropertyValue("position")));else{if("fixed"===h){e.scrollTop-=a.parentNode.scrollTop,e.scrollLeft-=a.parentNode.scrollLeft;break}e.scrollLeft+=a.scrollLeft,e.scrollTop+=a.scrollTop}a=a.parentNode}return e.scrollBodyLeft=void 0!==window.pageXOffset?window.pageXOffset:(document.documentElement||document.body.parentNode||document.body).scrollLeft,e.scrollBodyTop=void 0!==window.pageYOffset?window.pageYOffset:(document.documentElement||document.body.parentNode||document.body).scrollTop,e.scrollLeft-=e.scrollBodyLeft,e.scrollTop-=e.scrollBodyTop,e},e=navigator.userAgent.toLowerCase(),r=-1!==e.indexOf("macintosh"),i=r&&-1!==e.indexOf("khtml")?{91:!0,93:!0}:r&&-1!==e.indexOf("firefox")?{224:!0}:{17:!0},(g.metaTrackerReset=function(){eventjs.fnKey=g.fnKey=!1,eventjs.metaKey=g.metaKey=!1,eventjs.escKey=g.escKey=!1,eventjs.ctrlKey=g.ctrlKey=!1,eventjs.shiftKey=g.shiftKey=!1,eventjs.altKey=g.altKey=!1})(),g.metaTracker=function(t){var e="keydown"===t.type;27===t.keyCode&&(eventjs.escKey=g.escKey=e),i[t.keyCode]&&(eventjs.metaKey=g.metaKey=e),eventjs.ctrlKey=g.ctrlKey=t.ctrlKey,eventjs.shiftKey=g.shiftKey=t.shiftKey,eventjs.altKey=g.altKey=t.altKey},g}(eventjs.proxy),void 0===eventjs)eventjs={};if(eventjs.MutationObserver=function(){var t=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,r=!t&&function(){var t=document.createElement("p"),e=!1,i=function(){e=!0};if(t.addEventListener)t.addEventListener("DOMAttrModified",i,!1);else{if(!t.attachEvent)return!1;t.attachEvent("onDOMAttrModified",i)}return t.setAttribute("id","target"),e}();return function(e,i){if(t){new t(function(t){t.forEach(function(t){i.call(t.target,t.attributeName)})}).observe(e,{subtree:!1,attributes:!0})}else r?eventjs.add(e,"DOMAttrModified",function(t){i.call(e,t.attrName)}):"onpropertychange"in document.body&&eventjs.add(e,"propertychange",function(t){i.call(e,window.event.propertyName)})}}(),void 0===eventjs)eventjs={};if(void 0===eventjs.proxy&&(eventjs.proxy={}),eventjs.proxy=function(l){"use strict";return l.click=function(c){c.gesture=c.gesture||"click",c.maxFingers=c.maxFingers||c.fingers||1,c.onPointerDown=function(t){l.pointerStart(t,h,c)&&eventjs.add(c.target,"mouseup",c.onPointerUp)},c.onPointerUp=function(t){if(l.pointerEnd(t,h,c)){eventjs.remove(c.target,"mouseup",c.onPointerUp);var e=(t.changedTouches||l.getCoords(t))[0],i=c.bbox,r=l.getBoundingBox(c.target),n=e.pageY-r.scrollBodyTop,s=e.pageX-r.scrollBodyLeft;if(s>i.x1&&n>i.y1&&s<i.x2&&n<i.y2&&i.scrollTop===r.scrollTop){for(var o in c.tracker)break;var a=c.tracker[o];h.x=a.start.x,h.y=a.start.y,c.listener(t,h)}}};var h=l.pointerSetup(c);return h.state="click",eventjs.add(c.target,"mousedown",c.onPointerDown),h},eventjs.Gesture=eventjs.Gesture||{},eventjs.Gesture._gestureHandlers=eventjs.Gesture._gestureHandlers||{},eventjs.Gesture._gestureHandlers.click=l.click,l}(eventjs.proxy),void 0===eventjs)eventjs={};if(void 0===eventjs.proxy&&(eventjs.proxy={}),eventjs.proxy=function(u){"use strict";return u.dbltap=u.dblclick=function(s){s.gesture=s.gesture||"dbltap",s.maxFingers=s.maxFingers||s.fingers||1;var o,a,c,h,l;s.onPointerDown=function(t){var e=t.changedTouches||u.getCoords(t);o&&!a?(l=e[0],a=(new Date).getTime()-o):(h=e[0],o=(new Date).getTime(),a=0,clearTimeout(c),c=setTimeout(function(){o=0},700)),u.pointerStart(t,r,s)&&(eventjs.add(s.target,"mousemove",s.onPointerMove).listener(t),eventjs.add(s.target,"mouseup",s.onPointerUp))},s.onPointerMove=function(t){if(o&&!a){var e=t.changedTouches||u.getCoords(t);l=e[0]}var i=s.bbox,r=l.pageX-i.x1,n=l.pageY-i.y1;0<r&&r<i.width&&0<n&&n<i.height&&Math.abs(l.pageX-h.pageX)<=25&&Math.abs(l.pageY-h.pageY)<=25||(eventjs.remove(s.target,"mousemove",s.onPointerMove),clearTimeout(c),o=a=0)},s.onPointerUp=function(t){if(u.pointerEnd(t,r,s)&&(eventjs.remove(s.target,"mousemove",s.onPointerMove),eventjs.remove(s.target,"mouseup",s.onPointerUp)),o&&a){if(a<=700){for(var e in r.state=s.gesture,s.tracker)break;var i=s.tracker[e];r.x=i.start.x,r.y=i.start.y,s.listener(t,r)}clearTimeout(c),o=a=0}};var r=u.pointerSetup(s);return r.state="dblclick",eventjs.add(s.target,"mousedown",s.onPointerDown),r},eventjs.Gesture=eventjs.Gesture||{},eventjs.Gesture._gestureHandlers=eventjs.Gesture._gestureHandlers||{},eventjs.Gesture._gestureHandlers.dbltap=u.dbltap,eventjs.Gesture._gestureHandlers.dblclick=u.dblclick,u}(eventjs.proxy),void 0===eventjs)eventjs={};if(void 0===eventjs.proxy&&(eventjs.proxy={}),eventjs.proxy=function(l){"use strict";return l.dragElement=function(i,t){l.drag({event:t,target:i,position:"move",listener:function(t,e){i.style.left=e.x+"px",i.style.top=e.y+"px",eventjs.prevent(t)}})},l.drag=function(c){c.gesture="drag",c.onPointerDown=function(t){l.pointerStart(t,h,c)&&(c.monitor||(eventjs.add(c.doc,"mousemove",c.onPointerMove),eventjs.add(c.doc,"mouseup",c.onPointerUp))),c.onPointerMove(t,"down")},c.onPointerMove=function(t,e){if(!c.tracker)return c.onPointerDown(t);c.bbox;for(var i=t.changedTouches||l.getCoords(t),r=i.length,n=0;n<r;n++){var s=i[n],o=s.identifier||1/0,a=c.tracker[o];a&&(a.pageX=s.pageX,a.pageY=s.pageY,h.state=e||"move",h.identifier=o,h.start=a.start,h.fingers=c.fingers,"differenceFromLast"===c.position?(h.x=a.pageX-a.offsetX,h.y=a.pageY-a.offsetY,a.offsetX=a.pageX,a.offsetY=a.pageY):(h.x=a.pageX-a.offsetX,h.y=a.pageY-a.offsetY),c.listener(t,h))}},c.onPointerUp=function(t){l.pointerEnd(t,h,c,c.onPointerMove)&&(c.monitor||(eventjs.remove(c.doc,"mousemove",c.onPointerMove),eventjs.remove(c.doc,"mouseup",c.onPointerUp)))};var h=l.pointerSetup(c);return c.event?c.onPointerDown(c.event):(eventjs.add(c.target,"mousedown",c.onPointerDown),c.monitor&&(eventjs.add(c.doc,"mousemove",c.onPointerMove),eventjs.add(c.doc,"mouseup",c.onPointerUp))),h},eventjs.Gesture=eventjs.Gesture||{},eventjs.Gesture._gestureHandlers=eventjs.Gesture._gestureHandlers||{},eventjs.Gesture._gestureHandlers.drag=l.drag,l}(eventjs.proxy),void 0===eventjs)eventjs={};if(void 0===eventjs.proxy&&(eventjs.proxy={}),eventjs.proxy=function(y){"use strict";var _=Math.PI/180,x=function(t,e){var i=0,r=0,n=0;for(var s in e){var o=e[s];o.up||(i+=o.move.x,r+=o.move.y,n++)}return t.x=i/=n,t.y=r/=n,t};return y.gesture=function(m){m.gesture=m.gesture||"gesture",m.minFingers=m.minFingers||m.fingers||2,m.onPointerDown=function(t){var e=m.fingers;if(y.pointerStart(t,b,m)&&(eventjs.add(m.doc,"mousemove",m.onPointerMove),eventjs.add(m.doc,"mouseup",m.onPointerUp)),m.fingers===m.minFingers&&e!==m.fingers){b.fingers=m.minFingers,b.scale=1,b.rotation=0,b.state="start";var i="";for(var r in m.tracker)i+=r;b.identifier=parseInt(i),x(b,m.tracker),m.listener(t,b)}},m.onPointerMove=function(t,e){for(var i=m.bbox,r=m.tracker,n=(a=t.changedTouches||y.getCoords(t)).length,s=0;s<n;s++){var o=r[l=(u=a[s]).identifier||1/0];o&&(o.move.x=u.pageX-i.x1,o.move.y=u.pageY-i.y1)}if(!(m.fingers<m.minFingers)){var a=[],c=0,h=0;for(var l in x(b,r),r){var u;if(!(u=r[l]).up){var f=u.start;if(!f.distance){var d=f.x-b.x,g=f.y-b.y;f.distance=Math.sqrt(d*d+g*g),f.angle=Math.atan2(d,g)/_}d=u.move.x-b.x,g=u.move.y-b.y;c+=Math.sqrt(d*d+g*g)/f.distance;var p=Math.atan2(d,g)/_,v=(f.angle-p+360)%360-180;u.DEG2=u.DEG1,u.DEG1=0<v?v:-v,void 0!==u.DEG2&&(0<v?u.rotation+=u.DEG1-u.DEG2:u.rotation-=u.DEG1-u.DEG2,h+=u.rotation),a.push(u.move)}}b.touches=a,b.fingers=m.fingers,b.scale=c/m.fingers,b.rotation=h/m.fingers,b.state="change",m.listener(t,b)}},m.onPointerUp=function(t){var e=m.fingers;y.pointerEnd(t,b,m)&&(eventjs.remove(m.doc,"mousemove",m.onPointerMove),eventjs.remove(m.doc,"mouseup",m.onPointerUp)),e===m.minFingers&&m.fingers<m.minFingers&&(b.fingers=m.fingers,b.state="end",m.listener(t,b))};var b=y.pointerSetup(m);return eventjs.add(m.target,"mousedown",m.onPointerDown),b},eventjs.Gesture=eventjs.Gesture||{},eventjs.Gesture._gestureHandlers=eventjs.Gesture._gestureHandlers||{},eventjs.Gesture._gestureHandlers.gesture=y.gesture,y}(eventjs.proxy),void 0===eventjs)eventjs={};if(void 0===eventjs.proxy&&(eventjs.proxy={}),eventjs.proxy=function(t){"use strict";return t.pointerdown=t.pointermove=t.pointerup=function(e){if(e.gesture=e.gesture||"pointer",!e.target.isPointerEmitter){var i=!0;e.onPointerDown=function(t){i=!1,r.gesture="pointerdown",e.listener(t,r)},e.onPointerMove=function(t){r.gesture="pointermove",e.listener(t,r,i)},e.onPointerUp=function(t){i=!0,r.gesture="pointerup",e.listener(t,r,!0)};var r=t.pointerSetup(e);return eventjs.add(e.target,"mousedown",e.onPointerDown),eventjs.add(e.target,"mousemove",e.onPointerMove),eventjs.add(e.doc,"mouseup",e.onPointerUp),e.target.isPointerEmitter=!0,r}},eventjs.Gesture=eventjs.Gesture||{},eventjs.Gesture._gestureHandlers=eventjs.Gesture._gestureHandlers||{},eventjs.Gesture._gestureHandlers.pointerdown=t.pointerdown,eventjs.Gesture._gestureHandlers.pointermove=t.pointermove,eventjs.Gesture._gestureHandlers.pointerup=t.pointerup,t}(eventjs.proxy),void 0===eventjs)eventjs={};if(void 0===eventjs.proxy&&(eventjs.proxy={}),eventjs.proxy=function(t){"use strict";return t.shake=function(u){var f={gesture:"devicemotion",acceleration:{},accelerationIncludingGravity:{},target:u.target,listener:u.listener,remove:function(){window.removeEventListener("devicemotion",t,!1)}},d=(new Date).getTime(),g={x:0,y:0,z:0},p={x:{count:0,value:0},y:{count:0,value:0},z:{count:0,value:0}},t=function(t){var e=t.accelerationIncludingGravity;if(g.x=.8*g.x+(1-.8)*e.x,g.y=.8*g.y+(1-.8)*e.y,g.z=.8*g.z+(1-.8)*e.z,f.accelerationIncludingGravity=g,f.acceleration.x=e.x-g.x,f.acceleration.y=e.y-g.y,f.acceleration.z=e.z-g.z,"devicemotion"!==u.gesture)for(var i=(new Date).getTime(),r=0,n="xyz".length;r<n;r++){var s="xyz"[r],o=f.acceleration[s],a=p[s],c=Math.abs(o);if(!(i-d<1e3)&&4<c){var h=i*o/c,l=Math.abs(h+a.value);a.value&&l<200?(a.value=h,a.count++,3===a.count&&(u.listener(t,f),d=i,a.value=0,a.count=0)):(a.value=h,a.count=1)}}else u.listener(t,f)};if(window.addEventListener)return window.addEventListener("devicemotion",t,!1),f},eventjs.Gesture=eventjs.Gesture||{},eventjs.Gesture._gestureHandlers=eventjs.Gesture._gestureHandlers||{},eventjs.Gesture._gestureHandlers.shake=t.shake,t}(eventjs.proxy),void 0===eventjs)eventjs={};if(void 0===eventjs.proxy&&(eventjs.proxy={}),eventjs.proxy=function(b){"use strict";var y=Math.PI/180;return b.swipe=function(v){v.snap=v.snap||90,v.threshold=v.threshold||1,v.gesture=v.gesture||"swipe",v.onPointerDown=function(t){b.pointerStart(t,m,v)&&(eventjs.add(v.doc,"mousemove",v.onPointerMove).listener(t),eventjs.add(v.doc,"mouseup",v.onPointerUp))},v.onPointerMove=function(t){for(var e=t.changedTouches||b.getCoords(t),i=e.length,r=0;r<i;r++){var n=e[r],s=n.identifier||1/0,o=v.tracker[s];o&&(o.move.x=n.pageX,o.move.y=n.pageY,o.moveTime=(new Date).getTime())}},v.onPointerUp=function(t){if(b.pointerEnd(t,m,v)){var e,i;eventjs.remove(v.doc,"mousemove",v.onPointerMove),eventjs.remove(v.doc,"mouseup",v.onPointerUp);var r={x:0,y:0},n=0,s=0,o=0;for(var a in v.tracker){var c=v.tracker[a],h=c.move.x-c.start.x,l=c.move.y-c.start.y;n+=c.move.x,s+=c.move.y,r.x+=c.start.x,r.y+=c.start.y,o++;var u=Math.sqrt(h*h+l*l),f=c.moveTime-c.startTime,d=Math.atan2(h,l)/y+180,g=f?u/f:0;if(void 0===i)i=d,e=g;else{if(!(Math.abs(d-i)<=20))return;i=(i+d)/2,e=(e+g)/2}}var p=v.gestureFingers;v.minFingers<=p&&v.maxFingers>=p&&e>v.threshold&&(r.x/=o,r.y/=o,m.start=r,m.x=n/o,m.y=s/o,m.angle=-(((i/v.snap+.5>>0)*v.snap||360)-360),m.velocity=e,m.fingers=p,m.state="swipe",v.listener(t,m))}};var m=b.pointerSetup(v);return eventjs.add(v.target,"mousedown",v.onPointerDown),m},eventjs.Gesture=eventjs.Gesture||{},eventjs.Gesture._gestureHandlers=eventjs.Gesture._gestureHandlers||{},eventjs.Gesture._gestureHandlers.swipe=b.swipe,b}(eventjs.proxy),void 0===eventjs)eventjs={};if(void 0===eventjs.proxy&&(eventjs.proxy={}),eventjs.proxy=function(g){"use strict";return g.longpress=function(t){return t.gesture="longpress",g.tap(t)},g.tap=function(d){var i,n;d.delay=d.delay||500,d.timeout=d.timeout||250,d.driftDeviance=d.driftDeviance||10,d.gesture=d.gesture||"tap",d.onPointerDown=function(r){if(g.pointerStart(r,s,d)){if(i=(new Date).getTime(),eventjs.add(d.doc,"mousemove",d.onPointerMove).listener(r),eventjs.add(d.doc,"mouseup",d.onPointerUp),"longpress"!==d.gesture)return;n=setTimeout(function(){if(!(r.cancelBubble&&1<++r.cancelBubbleCount)){var t=0;for(var e in d.tracker){var i=d.tracker[e];if(!0===i.end)return;if(d.cancel)return;t++}d.minFingers<=t&&d.maxFingers>=t&&(s.state="start",s.fingers=t,s.x=i.start.x,s.y=i.start.y,d.listener(r,s))}},d.delay)}},d.onPointerMove=function(t){for(var e=d.bbox,i=t.changedTouches||g.getCoords(t),r=i.length,n=0;n<r;n++){var s=i[n],o=s.identifier||1/0,a=d.tracker[o];if(a){var c=s.pageX-e.x1,h=s.pageY-e.y1,l=c-a.start.x,u=h-a.start.y,f=Math.sqrt(l*l+u*u);if(!(0<c&&c<e.width&&0<h&&h<e.height&&f<=d.driftDeviance))return eventjs.remove(d.doc,"mousemove",d.onPointerMove),void(d.cancel=!0)}}},d.onPointerUp=function(t){if(g.pointerEnd(t,s,d)){if(clearTimeout(n),eventjs.remove(d.doc,"mousemove",d.onPointerMove),eventjs.remove(d.doc,"mouseup",d.onPointerUp),t.cancelBubble&&1<++t.cancelBubbleCount)return;if("longpress"===d.gesture)return void("start"===s.state&&(s.state="end",d.listener(t,s)));if(d.cancel)return;if((new Date).getTime()-i>d.timeout)return;var e=d.gestureFingers;d.minFingers<=e&&d.maxFingers>=e&&(s.state="tap",s.fingers=d.gestureFingers,d.listener(t,s))}};var s=g.pointerSetup(d);return eventjs.add(d.target,"mousedown",d.onPointerDown),s},eventjs.Gesture=eventjs.Gesture||{},eventjs.Gesture._gestureHandlers=eventjs.Gesture._gestureHandlers||{},eventjs.Gesture._gestureHandlers.tap=g.tap,eventjs.Gesture._gestureHandlers.longpress=g.longpress,g}(eventjs.proxy),void 0===eventjs)eventjs={};if(void 0===eventjs.proxy&&(eventjs.proxy={}),eventjs.proxy=function(t){"use strict";return t.wheelPreventElasticBounce=function(t){t&&("string"==typeof t&&(t=document.querySelector(t)),eventjs.add(t,"wheel",function(t,e){e.preventElasticBounce(),eventjs.stop(t)}))},t.wheel=function(e){var i,r=e.timeout||150,n=0,s={gesture:"wheel",state:"start",wheelDelta:0,target:e.target,listener:e.listener,preventElasticBounce:function(t){var e=this.target,i=e.scrollTop;i+e.offsetHeight===e.scrollHeight&&this.wheelDelta<=0?eventjs.cancel(t):0===i&&0<=this.wheelDelta&&eventjs.cancel(t),eventjs.stop(t)},add:function(){e.target[o](c,t,!1)},remove:function(){e.target[a](c,t,!1)}},t=function(t){t=t||window.event,s.state=n++?"change":"start",s.wheelDelta=t.detail?-20*t.detail:t.wheelDelta,e.listener(t,s),clearTimeout(i),i=setTimeout(function(){n=0,s.state="end",s.wheelDelta=0,e.listener(t,s)},r)},o=document.addEventListener?"addEventListener":"attachEvent",a=document.removeEventListener?"removeEventListener":"detachEvent",c=eventjs.getEventSupport("mousewheel")?"mousewheel":"DOMMouseScroll";return e.target[o](c,t,!1),s},eventjs.Gesture=eventjs.Gesture||{},eventjs.Gesture._gestureHandlers=eventjs.Gesture._gestureHandlers||{},eventjs.Gesture._gestureHandlers.wheel=t.wheel,t}(eventjs.proxy),void 0===Event)var Event={};function resizeCanvasIfNeeded(t){var e=t.targetCanvas,i=e.width,r=e.height,n=t.destinationWidth,s=t.destinationHeight;i===n&&r===s||(e.width=n,e.height=s)}function copyGLTo2DDrawImage(t,e){var i=t.canvas,r=e.targetCanvas,n=r.getContext("2d");n.translate(0,r.height),n.scale(1,-1);var s=i.height-r.height;n.drawImage(i,0,s,r.width,r.height,0,0,r.width,r.height)}function copyGLTo2DPutImageData(t,e){var i=e.targetCanvas.getContext("2d"),r=e.destinationWidth,n=e.destinationHeight,s=r*n*4,o=new Uint8Array(this.imageBuffer,0,s),a=new Uint8ClampedArray(this.imageBuffer,0,s);t.readPixels(0,0,r,n,t.RGBA,t.UNSIGNED_BYTE,o);var c=new ImageData(a,r,n);i.putImageData(c,0,0)}void 0===Event.proxy&&(Event.proxy={}),Event.proxy=function(t){"use strict";return t.orientation=function(e){var i={gesture:"orientationchange",previous:null,current:window.orientation,target:e.target,listener:e.listener,remove:function(){window.removeEventListener("orientationchange",t,!1)}},t=function(t){i.previous=i.current,i.current=window.orientation,null===i.previous||i.previous==i.current||e.listener(t,i)};return window.DeviceOrientationEvent&&window.addEventListener("orientationchange",t,!1),i},Event.Gesture=Event.Gesture||{},Event.Gesture._gestureHandlers=Event.Gesture._gestureHandlers||{},Event.Gesture._gestureHandlers.orientation=t.orientation,t}(Event.proxy),function(){function r(t,e){if(this.__eventListeners[t]){var i=this.__eventListeners[t];e?i[i.indexOf(e)]=!1:fabric.util.array.fill(i,!1)}}fabric.Observable={fire:function(t,e){if(!this.__eventListeners)return this;var i=this.__eventListeners[t];if(!i)return this;for(var r=0,n=i.length;r<n;r++)i[r]&&i[r].call(this,e||{});return this.__eventListeners[t]=i.filter(function(t){return!1!==t}),this},on:function(t,e){if(this.__eventListeners||(this.__eventListeners={}),1===arguments.length)for(var i in t)this.on(i,t[i]);else this.__eventListeners[t]||(this.__eventListeners[t]=[]),this.__eventListeners[t].push(e);return this},off:function(t,e){if(!this.__eventListeners)return this;if(0===arguments.length)for(t in this.__eventListeners)r.call(this,t);else if(1===arguments.length&&"object"==typeof t)for(var i in t)r.call(this,i,t[i]);else r.call(this,t,e);return this}}}(),fabric.Collection={_objects:[],add:function(){if(this._objects.push.apply(this._objects,arguments),this._onObjectAdded)for(var t=0,e=arguments.length;t<e;t++)this._onObjectAdded(arguments[t]);return this.renderOnAddRemove&&this.requestRenderAll(),this},insertAt:function(t,e,i){var r=this._objects;return i?r[e]=t:r.splice(e,0,t),this._onObjectAdded&&this._onObjectAdded(t),this.renderOnAddRemove&&this.requestRenderAll(),this},remove:function(){for(var t,e=this._objects,i=!1,r=0,n=arguments.length;r<n;r++)-1!==(t=e.indexOf(arguments[r]))&&(i=!0,e.splice(t,1),this._onObjectRemoved&&this._onObjectRemoved(arguments[r]));return this.renderOnAddRemove&&i&&this.requestRenderAll(),this},forEachObject:function(t,e){for(var i=this.getObjects(),r=0,n=i.length;r<n;r++)t.call(e,i[r],r,i);return this},getObjects:function(e){return void 0===e?this._objects.concat():this._objects.filter(function(t){return t.type===e})},item:function(t){return this._objects[t]},isEmpty:function(){return 0===this._objects.length},size:function(){return this._objects.length},contains:function(t){return-1<this._objects.indexOf(t)},complexity:function(){return this._objects.reduce(function(t,e){return t+=e.complexity?e.complexity():0},0)}},fabric.CommonMethods={_setOptions:function(t){for(var e in t)this.set(e,t[e])},_initGradient:function(t,e){!t||!t.colorStops||t instanceof fabric.Gradient||this.set(e,new fabric.Gradient(t))},_initPattern:function(t,e,i){!t||!t.source||t instanceof fabric.Pattern?i&&i():this.set(e,new fabric.Pattern(t,i))},_setObject:function(t){for(var e in t)this._set(e,t[e])},set:function(t,e){return"object"==typeof t?this._setObject(t):this._set(t,e),this},_set:function(t,e){this[t]=e},toggle:function(t){var e=this.get(t);return"boolean"==typeof e&&this.set(t,!e),this},get:function(t){return this[t]}},function(s){var d=Math.sqrt,g=Math.atan2,o=Math.pow,a=Math.PI/180,i=Math.PI/2;fabric.util={cos:function(t){if(0===t)return 1;switch(t<0&&(t=-t),t/i){case 1:case 3:return 0;case 2:return-1}return Math.cos(t)},sin:function(t){if(0===t)return 0;var e=1;switch(t<0&&(e=-1),t/i){case 1:return e;case 2:return 0;case 3:return-e}return Math.sin(t)},removeFromArray:function(t,e){var i=t.indexOf(e);return-1!==i&&t.splice(i,1),t},getRandomInt:function(t,e){return Math.floor(Math.random()*(e-t+1))+t},degreesToRadians:function(t){return t*a},radiansToDegrees:function(t){return t/a},rotatePoint:function(t,e,i){t.subtractEquals(e);var r=fabric.util.rotateVector(t,i);return new fabric.Point(r.x,r.y).addEquals(e)},rotateVector:function(t,e){var i=fabric.util.sin(e),r=fabric.util.cos(e);return{x:t.x*r-t.y*i,y:t.x*i+t.y*r}},transformPoint:function(t,e,i){return i?new fabric.Point(e[0]*t.x+e[2]*t.y,e[1]*t.x+e[3]*t.y):new fabric.Point(e[0]*t.x+e[2]*t.y+e[4],e[1]*t.x+e[3]*t.y+e[5])},makeBoundingBoxFromPoints:function(t,e){if(e)for(var i=0;i<t.length;i++)t[i]=fabric.util.transformPoint(t[i],e);var r=[t[0].x,t[1].x,t[2].x,t[3].x],n=fabric.util.array.min(r),s=fabric.util.array.max(r)-n,o=[t[0].y,t[1].y,t[2].y,t[3].y],a=fabric.util.array.min(o);return{left:n,top:a,width:s,height:fabric.util.array.max(o)-a}},invertTransform:function(t){var e=1/(t[0]*t[3]-t[1]*t[2]),i=[e*t[3],-e*t[1],-e*t[2],e*t[0]],r=fabric.util.transformPoint({x:t[4],y:t[5]},i,!0);return i[4]=-r.x,i[5]=-r.y,i},toFixed:function(t,e){return parseFloat(Number(t).toFixed(e))},parseUnit:function(t,e){var i=/\D{0,2}$/.exec(t),r=parseFloat(t);switch(e||(e=fabric.Text.DEFAULT_SVG_FONT_SIZE),i[0]){case"mm":return r*fabric.DPI/25.4;case"cm":return r*fabric.DPI/2.54;case"in":return r*fabric.DPI;case"pt":return r*fabric.DPI/72;case"pc":return r*fabric.DPI/72*12;case"em":return r*e;default:return r}},falseFunction:function(){return!1},getKlass:function(t,e){return t=fabric.util.string.camelize(t.charAt(0).toUpperCase()+t.slice(1)),fabric.util.resolveNamespace(e)[t]},getSvgAttributes:function(t){var e=["instantiated_by_use","style","id","class"];switch(t){case"linearGradient":e=e.concat(["x1","y1","x2","y2","gradientUnits","gradientTransform"]);break;case"radialGradient":e=e.concat(["gradientUnits","gradientTransform","cx","cy","r","fx","fy","fr"]);break;case"stop":e=e.concat(["offset","stop-color","stop-opacity"])}return e},resolveNamespace:function(t){if(!t)return fabric;var e,i=t.split("."),r=i.length,n=s||fabric.window;for(e=0;e<r;++e)n=n[i[e]];return n},loadImage:function(t,e,i,r){if(t){var n=fabric.util.createImage(),s=function(){e&&e.call(i,n,!1),n=n.onload=n.onerror=null};n.onload=s,n.onerror=function(){fabric.log("Error loading "+n.src),e&&e.call(i,null,!0),n=n.onload=n.onerror=null},0!==t.indexOf("data")&&null!=r&&(n.crossOrigin=r),"data:image/svg"===t.substring(0,14)&&(n.onload=null,fabric.util.loadImageInDom(n,s)),n.src=t}else e&&e.call(i,t)},loadImageInDom:function(t,e){var i=fabric.document.createElement("div");i.style.width=i.style.height="1px",i.style.left=i.style.top="-100%",i.style.position="absolute",i.appendChild(t),fabric.document.querySelector("body").appendChild(i),t.onload=function(){e(),i.parentNode.removeChild(i),i=null}},enlivenObjects:function(t,e,n,s){var o=[],i=0,r=(t=t||[]).length;function a(){++i===r&&e&&e(o.filter(function(t){return t}))}r?t.forEach(function(i,r){i&&i.type?fabric.util.getKlass(i.type,n).fromObject(i,function(t,e){e||(o[r]=t),s&&s(i,t,e),a()}):a()}):e&&e(o)},enlivenPatterns:function(t,e){function i(){++n===s&&e&&e(r)}var r=[],n=0,s=(t=t||[]).length;s?t.forEach(function(t,e){t&&t.source?new fabric.Pattern(t,function(t){r[e]=t,i()}):(r[e]=t,i())}):e&&e(r)},groupSVGElements:function(t,e,i){var r;return t&&1===t.length?t[0]:(e&&(e.width&&e.height?e.centerPoint={x:e.width/2,y:e.height/2}:(delete e.width,delete e.height)),r=new fabric.Group(t,e),void 0!==i&&(r.sourcePath=i),r)},populateWithProperties:function(t,e,i){if(i&&"[object Array]"===Object.prototype.toString.call(i))for(var r=0,n=i.length;r<n;r++)i[r]in t&&(e[i[r]]=t[i[r]])},drawDashedLine:function(t,e,i,r,n,s){var o=r-e,a=n-i,c=d(o*o+a*a),h=g(a,o),l=s.length,u=0,f=!0;for(t.save(),t.translate(e,i),t.moveTo(0,0),t.rotate(h),e=0;e<c;)c<(e+=s[u++%l])&&(e=c),t[f?"lineTo":"moveTo"](e,0),f=!f;t.restore()},createCanvasElement:function(){return fabric.document.createElement("canvas")},copyCanvasElement:function(t){var e=fabric.util.createCanvasElement();return e.width=t.width,e.height=t.height,e.getContext("2d").drawImage(t,0,0),e},toDataURL:function(t,e,i){return t.toDataURL("image/"+e,i)},createImage:function(){return fabric.document.createElement("img")},multiplyTransformMatrices:function(t,e,i){return[t[0]*e[0]+t[2]*e[1],t[1]*e[0]+t[3]*e[1],t[0]*e[2]+t[2]*e[3],t[1]*e[2]+t[3]*e[3],i?0:t[0]*e[4]+t[2]*e[5]+t[4],i?0:t[1]*e[4]+t[3]*e[5]+t[5]]},qrDecompose:function(t){var e=g(t[1],t[0]),i=o(t[0],2)+o(t[1],2),r=d(i),n=(t[0]*t[3]-t[2]*t[1])/r,s=g(t[0]*t[2]+t[1]*t[3],i);return{angle:e/a,scaleX:r,scaleY:n,skewX:s/a,skewY:0,translateX:t[4],translateY:t[5]}},calcRotateMatrix:function(t){if(!t.angle)return fabric.iMatrix.concat();var e=fabric.util.degreesToRadians(t.angle),i=fabric.util.cos(e),r=fabric.util.sin(e);return[i,r,-r,i,0,0]},calcDimensionsMatrix:function(t){var e=void 0===t.scaleX?1:t.scaleX,i=void 0===t.scaleY?1:t.scaleY,r=[t.flipX?-e:e,0,0,t.flipY?-i:i,0,0],n=fabric.util.multiplyTransformMatrices,s=fabric.util.degreesToRadians;return t.skewX&&(r=n(r,[1,0,Math.tan(s(t.skewX)),1],!0)),t.skewY&&(r=n(r,[1,Math.tan(s(t.skewY)),0,1],!0)),r},composeMatrix:function(t){var e=[1,0,0,1,t.translateX||0,t.translateY||0],i=fabric.util.multiplyTransformMatrices;return t.angle&&(e=i(e,fabric.util.calcRotateMatrix(t))),(1!==t.scaleX||1!==t.scaleY||t.skewX||t.skewY||t.flipX||t.flipY)&&(e=i(e,fabric.util.calcDimensionsMatrix(t))),e},resetObjectTransform:function(t){t.scaleX=1,t.scaleY=1,t.skewX=0,t.skewY=0,t.flipX=!1,t.flipY=!1,t.rotate(0)},saveObjectTransform:function(t){return{scaleX:t.scaleX,scaleY:t.scaleY,skewX:t.skewX,skewY:t.skewY,angle:t.angle,left:t.left,flipX:t.flipX,flipY:t.flipY,top:t.top}},isTransparent:function(t,e,i,r){0<r&&(r<e?e-=r:e=0,r<i?i-=r:i=0);var n,s=!0,o=t.getImageData(e,i,2*r||1,2*r||1),a=o.data.length;for(n=3;n<a&&!1!==(s=o.data[n]<=0);n+=4);return o=null,s},parsePreserveAspectRatioAttribute:function(t){var e,i="meet",r=t.split(" ");return r&&r.length&&("meet"!==(i=r.pop())&&"slice"!==i?(e=i,i="meet"):r.length&&(e=r.pop())),{meetOrSlice:i,alignX:"none"!==e?e.slice(1,4):"none",alignY:"none"!==e?e.slice(5,8):"none"}},clearFabricFontCache:function(t){(t=(t||"").toLowerCase())?fabric.charWidthsCache[t]&&delete fabric.charWidthsCache[t]:fabric.charWidthsCache={}},limitDimsByArea:function(t,e){var i=Math.sqrt(e*t),r=Math.floor(e/i);return{x:Math.floor(i),y:r}},capValue:function(t,e,i){return Math.max(t,Math.min(e,i))},findScaleToFit:function(t,e){return Math.min(e.width/t.width,e.height/t.height)},findScaleToCover:function(t,e){return Math.max(e.width/t.width,e.height/t.height)},matrixToSVG:function(t){return"matrix("+t.map(function(t){return fabric.util.toFixed(t,fabric.Object.NUM_FRACTION_DIGITS)}).join(" ")+")"},removeTransformFromObject:function(t,e){var i=fabric.util.invertTransform(e),r=fabric.util.multiplyTransformMatrices(i,t.calcOwnMatrix());fabric.util.applyTransformToObject(t,r)},addTransformToObject:function(t,e){fabric.util.applyTransformToObject(t,fabric.util.multiplyTransformMatrices(e,t.calcOwnMatrix()))},applyTransformToObject:function(t,e){var i=fabric.util.qrDecompose(e),r=new fabric.Point(i.translateX,i.translateY);t.flipX=!1,t.flipY=!1,t.set("scaleX",i.scaleX),t.set("scaleY",i.scaleY),t.skewX=i.skewX,t.skewY=i.skewY,t.angle=i.angle,t.setPositionByOrigin(r,"center","center")},sizeAfterTransform:function(t,e,i){var r=t/2,n=e/2,s=[{x:-r,y:-n},{x:r,y:-n},{x:-r,y:n},{x:r,y:n}],o=fabric.util.calcDimensionsMatrix(i),a=fabric.util.makeBoundingBoxFromPoints(s,o);return{x:a.width,y:a.height}}}}("undefined"!=typeof exports?exports:this),function(){var E=Array.prototype.join,w={m:2,l:2,h:1,v:1,c:6,s:4,q:4,t:2,a:7},T={m:"l",M:"L"};function v(t,e,i,r,n,s,o){var a=Math.PI,c=o*a/180,h=fabric.util.sin(c),l=fabric.util.cos(c),u=0,f=0,d=-l*t*.5-h*e*.5,g=-l*e*.5+h*t*.5,p=(i=Math.abs(i))*i,v=(r=Math.abs(r))*r,m=g*g,b=d*d,y=p*v-p*m-v*b,_=0;if(y<0){var x=Math.sqrt(1-y/(p*v));i*=x,r*=x}else _=(n===s?-1:1)*Math.sqrt(y/(p*m+v*b));var C=_*i*g/r,S=-_*r*d/i,w=l*C-h*S+.5*t,T=h*C+l*S+.5*e,O=$(1,0,(d-C)/i,(g-S)/r),j=$((d-C)/i,(g-S)/r,(-d-C)/i,(-g-S)/r);0===s&&0<j?j-=2*a:1===s&&j<0&&(j+=2*a);for(var P,k,E,D,M,A,F,L,I,R,B,X,Y,G,H,W,z,U=Math.ceil(Math.abs(j/a*2)),N=[],V=j/U,q=8/3*Math.sin(V/4)*Math.sin(V/4)/Math.sin(V/2),K=O+V,J=0;J<U;J++)N[J]=(P=O,k=K,E=l,D=h,M=i,A=r,F=w,L=T,I=q,R=u,B=f,void 0,X=fabric.util.cos(P),Y=fabric.util.sin(P),G=fabric.util.cos(k),H=fabric.util.sin(k),["C",R+I*(-E*M*Y-D*A*X),B+I*(-D*M*Y+E*A*X),(W=E*M*G-D*A*H+F)+I*(E*M*H+D*A*G),(z=D*M*G+E*A*H+L)+I*(D*M*H-E*A*G),W,z]),u=N[J][5],f=N[J][6],O=K,K+=V;return N}function $(t,e,i,r){var n=Math.atan2(e,t),s=Math.atan2(r,i);return n<=s?s-n:2*Math.PI-(n-s)}function m(t,e,i,r,n,s,o,a){var c;if(fabric.cachesBoundsOfCurve&&(c=E.call(arguments),fabric.boundsOfCurveCache[c]))return fabric.boundsOfCurveCache[c];var h,l,u,f,d,g,p,v,m=Math.sqrt,b=Math.min,y=Math.max,_=Math.abs,x=[],C=[[],[]];l=6*t-12*i+6*n,h=-3*t+9*i-9*n+3*o,u=3*i-3*t;for(var S=0;S<2;++S)if(0<S&&(l=6*e-12*r+6*s,h=-3*e+9*r-9*s+3*a,u=3*r-3*e),_(h)<1e-12){if(_(l)<1e-12)continue;0<(f=-u/l)&&f<1&&x.push(f)}else(p=l*l-4*u*h)<0||(0<(d=(-l+(v=m(p)))/(2*h))&&d<1&&x.push(d),0<(g=(-l-v)/(2*h))&&g<1&&x.push(g));for(var w,T,O,j=x.length,P=j;j--;)w=(O=1-(f=x[j]))*O*O*t+3*O*O*f*i+3*O*f*f*n+f*f*f*o,C[0][j]=w,T=O*O*O*e+3*O*O*f*r+3*O*f*f*s+f*f*f*a,C[1][j]=T;C[0][P]=t,C[1][P]=e,C[0][P+1]=o,C[1][P+1]=a;var k=[{x:b.apply(null,C[0]),y:b.apply(null,C[1])},{x:y.apply(null,C[0]),y:y.apply(null,C[1])}];return fabric.cachesBoundsOfCurve&&(fabric.boundsOfCurveCache[c]=k),k}function d(t,e,i){for(var r=i[1],n=i[2],s=i[3],o=i[4],a=i[5],c=v(i[6]-t,i[7]-e,r,n,o,a,s),h=0,l=c.length;h<l;h++)c[h][1]+=t,c[h][2]+=e,c[h][3]+=t,c[h][4]+=e,c[h][5]+=t,c[h][6]+=e;return c}function g(t,e,i,r){return Math.sqrt((i-t)*(i-t)+(r-e)*(r-e))}function p(h,l,u,f,d,g,p,v){return function(t){var e,i,r,n,s=(n=t)*n*n,o=3*(r=t)*r*(1-r),a=3*(i=t)*(1-i)*(1-i),c=(1-(e=t))*(1-e)*(1-e);return{x:p*s+d*o+u*a+h*c,y:v*s+g*o+f*a+l*c}}}function b(n,s,o,a,c,h,l,u){return function(t){var e=1-t,i=3*e*e*(o-n)+6*e*t*(c-o)+3*t*t*(l-c),r=3*e*e*(a-s)+6*e*t*(h-a)+3*t*t*(u-h);return Math.atan2(r,i)}}function y(a,c,h,l,u,f){return function(t){var e,i,r,n=(r=t)*r,s=2*(i=t)*(1-i),o=(1-(e=t))*(1-e);return{x:u*n+h*s+a*o,y:f*n+l*s+c*o}}}function _(n,s,o,a,c,h){return function(t){var e=1-t,i=2*e*(o-n)+2*t*(c-o),r=2*e*(a-s)+2*t*(h-a);return Math.atan2(r,i)}}function x(t,e,i){var r,n,s={x:e,y:i},o=0;for(n=.01;n<=1;n+=.01)r=t(n),o+=g(s.x,s.y,r.x,r.y),s=r;return o}function h(t,e){for(var i,r,n,s=0,o=0,a=t.iterator,c={x:t.x,y:t.y},h=.01,l=t.angleFinder;o<e&&s<=1&&1e-4<h;)i=a(s),n=s,e<(r=g(c.x,c.y,i.x,i.y))+o?s-=h/=2:(c=i,s+=h,o+=r);return i.angle=l(n),i}function l(t){for(var e,i,r,n,s=0,o=t.length,a=0,c=0,h=0,l=0,u=[],f=0;f<o;f++){switch(r={x:a,y:c,command:(e=t[f])[0]},e[0]){case"M":r.length=0,h=a=e[1],l=c=e[2];break;case"L":r.length=g(a,c,e[1],e[2]),a=e[1],c=e[2];break;case"C":i=p(a,c,e[1],e[2],e[3],e[4],e[5],e[6]),n=b(a,c,e[1],e[2],e[3],e[4],e[5],e[6]),r.iterator=i,r.angleFinder=n,r.length=x(i,a,c),a=e[5],c=e[6];break;case"Q":i=y(a,c,e[1],e[2],e[3],e[4]),n=_(a,c,e[1],e[2],e[3],e[4]),r.iterator=i,r.angleFinder=n,r.length=x(i,a,c),a=e[3],c=e[4];break;case"Z":case"z":r.destX=h,r.destY=l,r.length=g(a,c,h,l),a=h,c=l}s+=r.length,u.push(r)}return u.push({length:s,x:a,y:c}),u}fabric.util.parsePath=function(t){var e,i,r,n,s,o=[],a=[],c=fabric.rePathCommand,h="[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?\\s*",l="("+h+")"+fabric.commaWsp,u="([01])"+fabric.commaWsp+"?",f=new RegExp(l+"?"+l+"?"+l+u+u+l+"?("+h+")","g");if(!t||!t.match)return o;for(var d,g=0,p=(s=t.match(/[mzlhvcsqta][^mzlhvcsqta]*/gi)).length;g<p;g++){n=(e=s[g]).slice(1).trim(),a.length=0;var v=e.charAt(0);if(d=[v],"a"===v.toLowerCase())for(var m;m=f.exec(n);)for(var b=1;b<m.length;b++)a.push(m[b]);else for(;r=c.exec(n);)a.push(r[0]);b=0;for(var y=a.length;b<y;b++)i=parseFloat(a[b]),isNaN(i)||d.push(i);var _=w[v.toLowerCase()],x=T[v]||v;if(d.length-1>_)for(var C=1,S=d.length;C<S;C+=_)o.push([v].concat(d.slice(C,C+_))),v=x;else o.push(d)}return o},fabric.util.makePathSimpler=function(t){var e,i,r,n,s,o,a=0,c=0,h=t.length,l=0,u=0,f=[];for(i=0;i<h;++i){switch(r=!1,(e=t[i].slice(0))[0]){case"l":e[0]="L",e[1]+=a,e[2]+=c;case"L":a=e[1],c=e[2];break;case"h":e[1]+=a;case"H":e[0]="L",e[2]=c,a=e[1];break;case"v":e[1]+=c;case"V":e[0]="L",c=e[1],e[1]=a,e[2]=c;break;case"m":e[0]="M",e[1]+=a,e[2]+=c;case"M":a=e[1],c=e[2],l=e[1],u=e[2];break;case"c":e[0]="C",e[1]+=a,e[2]+=c,e[3]+=a,e[4]+=c,e[5]+=a,e[6]+=c;case"C":s=e[3],o=e[4],a=e[5],c=e[6];break;case"s":e[0]="S",e[1]+=a,e[2]+=c,e[3]+=a,e[4]+=c;case"S":"C"===n?(s=2*a-s,o=2*c-o):(s=a,o=c),a=e[3],c=e[4],e[0]="C",e[5]=e[3],e[6]=e[4],e[3]=e[1],e[4]=e[2],e[1]=s,e[2]=o,s=e[3],o=e[4];break;case"q":e[0]="Q",e[1]+=a,e[2]+=c,e[3]+=a,e[4]+=c;case"Q":s=e[1],o=e[2],a=e[3],c=e[4];break;case"t":e[0]="T",e[1]+=a,e[2]+=c;case"T":"Q"===n?(s=2*a-s,o=2*c-o):(s=a,o=c),e[0]="Q",a=e[1],c=e[2],e[1]=s,e[2]=o,e[3]=a,e[4]=c;break;case"a":e[0]="A",e[6]+=a,e[7]+=c;case"A":r=!0,f=f.concat(d(a,c,e)),a=e[6],c=e[7];break;case"z":case"Z":a=l,c=u}r||f.push(e),n=e[0]}return f},fabric.util.getPathSegmentsInfo=l,fabric.util.fromArcToBeziers=d,fabric.util.fromArcToBeizers=d,fabric.util.getBoundsOfCurve=m,fabric.util.getPointOnPath=function(t,e,i){i||(i=l(t));for(var r=0;0<e-i[r].length&&r<i.length-2;)e-=i[r].length,r++;var n,s=i[r],o=e/s.length,a=s.command,c=t[r];switch(a){case"M":return{x:s.x,y:s.y,angle:0};case"Z":case"z":return(n=new fabric.Point(s.x,s.y).lerp(new fabric.Point(s.destX,s.destY),o)).angle=Math.atan2(s.destY-s.y,s.destX-s.x),n;case"L":return(n=new fabric.Point(s.x,s.y).lerp(new fabric.Point(c[1],c[2]),o)).angle=Math.atan2(c[2]-s.y,c[1]-s.x),n;case"C":case"Q":return h(s,e)}},fabric.util.getBoundsOfArc=function(t,e,i,r,n,s,o,a,c){for(var h,l=0,u=0,f=[],d=v(a-t,c-e,i,r,s,o,n),g=0,p=d.length;g<p;g++)h=m(l,u,d[g][1],d[g][2],d[g][3],d[g][4],d[g][5],d[g][6]),f.push({x:h[0].x+t,y:h[0].y+e}),f.push({x:h[1].x+t,y:h[1].y+e}),l=d[g][5],u=d[g][6];return f},fabric.util.drawArc=function(e,t,i,r){d(t,i,r=r.slice(0).unshift("X")).forEach(function(t){e.bezierCurveTo.apply(e,t.slice(1))})}}(),function(){var o=Array.prototype.slice;function i(t,e,i){if(t&&0!==t.length){var r=t.length-1,n=e?t[r][e]:t[r];if(e)for(;r--;)i(t[r][e],n)&&(n=t[r][e]);else for(;r--;)i(t[r],n)&&(n=t[r]);return n}}fabric.util.array={fill:function(t,e){for(var i=t.length;i--;)t[i]=e;return t},invoke:function(t,e){for(var i=o.call(arguments,2),r=[],n=0,s=t.length;n<s;n++)r[n]=i.length?t[n][e].apply(t[n],i):t[n][e].call(t[n]);return r},min:function(t,e){return i(t,e,function(t,e){return t<e})},max:function(t,e){return i(t,e,function(t,e){return e<=t})}}}(),function(){function o(t,e,i){if(i)if(!fabric.isLikelyNode&&e instanceof Element)t=e;else if(e instanceof Array){t=[];for(var r=0,n=e.length;r<n;r++)t[r]=o({},e[r],i)}else if(e&&"object"==typeof e)for(var s in e)"canvas"===s||"group"===s?t[s]=null:e.hasOwnProperty(s)&&(t[s]=o({},e[s],i));else t=e;else for(var s in e)t[s]=e[s];return t}fabric.util.object={extend:o,clone:function(t,e){return o({},t,e)}},fabric.util.object.extend(fabric.util,fabric.Observable)}(),function(){function n(t,e){var i=t.charCodeAt(e);if(isNaN(i))return"";if(i<55296||57343<i)return t.charAt(e);if(55296<=i&&i<=56319){if(t.length<=e+1)throw"High surrogate without following low surrogate";var r=t.charCodeAt(e+1);if(r<56320||57343<r)throw"High surrogate without following low surrogate";return t.charAt(e)+t.charAt(e+1)}if(0===e)throw"Low surrogate without preceding high surrogate";var n=t.charCodeAt(e-1);if(n<55296||56319<n)throw"Low surrogate without preceding high surrogate";return!1}fabric.util.string={camelize:function(t){return t.replace(/-+(.)?/g,function(t,e){return e?e.toUpperCase():""})},capitalize:function(t,e){return t.charAt(0).toUpperCase()+(e?t.slice(1):t.slice(1).toLowerCase())},escapeXml:function(t){return t.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">")},graphemeSplit:function(t){var e,i=0,r=[];for(i=0;i<t.length;i++)!1!==(e=n(t,i))&&r.push(e);return r}}}(),function(){var s=Array.prototype.slice,o=function(){},i=function(){for(var t in{toString:1})if("toString"===t)return!1;return!0}(),a=function(t,r,n){for(var e in r)e in t.prototype&&"function"==typeof t.prototype[e]&&-1<(r[e]+"").indexOf("callSuper")?t.prototype[e]=function(i){return function(){var t=this.constructor.superclass;this.constructor.superclass=n;var e=r[i].apply(this,arguments);if(this.constructor.superclass=t,"initialize"!==i)return e}}(e):t.prototype[e]=r[e],i&&(r.toString!==Object.prototype.toString