(function(window){"use strict";function Matrix(t){var e=this;e._t=e.transform,e.a=e.d=1,e.b=e.c=e.e=e.f=0,e.props=[1,0,0,1,0,0],e.cssParts=["matrix(","",")"],e.a1=e.b1=e.c1=e.d1=e.e1=e.f1=0,e.context=t,e.cos=e.sin=0,t&&t.setTransform(1,0,0,1,0,0)}function matrixManagerFunction(){var t=new Matrix,e=function(t,e,a,r,i,n,s,o,h){var p,m,l,d,c,u,f;return p=$M([[1,0,0,0],[0,Math.cos(t),Math.sin(-t),0],[0,Math.sin(t),Math.cos(t),0],[0,0,0,1]]),m=$M([[Math.cos(e),0,Math.sin(e),0],[0,1,0,0],[Math.sin(-e),0,Math.cos(e),0],[0,0,0,1]]),l=$M([[Math.cos(a),Math.sin(-a),0,0],[Math.sin(a),Math.cos(a),0,0],[0,0,1,0],[0,0,0,1]]),c=$M([[r,0,0,0],[0,i,0,0],[0,0,n,0],[0,0,0,1]]),u=p.x(m).x(l).x(c),u=u.transpose(),f=$M([[1,0,0,0],[0,1,0,0],[0,0,1,0],[s,o,h,1]]),u=u.x(f),d="matrix3d(",d+=u.e(1,1).toFixed(5)+","+u.e(1,2).toFixed(5)+","+u.e(1,3).toFixed(5)+","+u.e(1,4).toFixed(5)+",",d+=u.e(2,1).toFixed(5)+","+u.e(2,2).toFixed(5)+","+u.e(2,3).toFixed(5)+","+u.e(2,4).toFixed(5)+",",d+=u.e(3,1).toFixed(5)+","+u.e(3,2).toFixed(5)+","+u.e(3,3).toFixed(5)+","+u.e(3,4).toFixed(5)+",",d+=u.e(4,1).toFixed(5)+","+u.e(4,2).toFixed(5)+","+u.e(4,3).toFixed(5)+","+u.e(4,4).toFixed(5),d+=")"},a=function(e,a,r,i,n){return t.reset().translate(i,n).rotate(e).scale(a,r).toCSS()},r=function(e,a,r,i,n){return t.reset().translate(i,n).rotate(e).scale(a,r).toArray()},i=function(t){return a(t.r,t.s[0],t.s[1],t.p[0],t.p[1])},n=function(t,r){return r?e(-t.tr.r[0],t.tr.r[1],t.tr.r[2],t.tr.s[0],t.tr.s[1],t.tr.s[2],t.tr.p[0],t.tr.p[1],t.tr.p[2]):a(t.tr.r[2],t.tr.s[0],t.tr.s[1],t.tr.p[0],t.tr.p[1])},s=function(t,r){return r?e(-t.r[0],t.r[1],t.r[2],t.s[0],t.s[1],t.s[2],t.p[0],t.p[1],t.p[2]):a(t.r[2],t.s[0],t.s[1],t.p[0],t.p[1])},o=function(t,e){return e?null:r(t.r[2],t.s[0],t.s[1],t.p[0],t.p[1])};return{get2DMatrix:i,getMatrix:n,getMatrix2:s,getMatrixArray:o,getMatrixArrayFromParams:r,getMatrix2FromParams:a}}function styleDiv(t){t.style.position="absolute",t.style.top=0,t.style.left=0,t.style.display="block",t.style.verticalAlign="top",t.style.backfaceVisibility=t.style.webkitBackfaceVisibility="hidden",styleUnselectableDiv(t)}function styleUnselectableDiv(t){t.style.userSelect="none",t.style.MozUserSelect="none",t.style.webkitUserSelect="none",t.style.oUserSelect="none"}function randomString(t,e){void 0===e&&(e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");var a,r="";for(a=t;a>0;--a)r+=e[Math.round(Math.random()*(e.length-1))];return r}function componentToHex(t){var e=t.toString(16);return 1==e.length?"0"+e:e}function rgbToHex(t,e,a){return 0>t&&(t=0),0>e&&(e=0),0>a&&(a=0),"#"+colorMap[t]+colorMap[e]+colorMap[a]}function fillToRgba(t,e){if(!cachedColors[t]){var a=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);cachedColors[t]=parseInt(a[1],16)+","+parseInt(a[2],16)+","+parseInt(a[3],16)}return"rgba("+cachedColors[t]+","+e+")"}function createColorMap(){var t,e;for(t=0;256>t;t+=1)e=t.toString(16),colorMap[t]=1==e.length?"0"+e:e}function createElement(t,e,a){if(!e){var r=Object.create(t.prototype,a),i={};return r&&"[object Function]"===i.toString.call(r.init)&&r.init(),r}e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.prototype.parent=t.prototype}function defineDescriptor(t,e,a,r){var i={writable:!1,configurable:!1,enumerable:!1,value:a};if(r)for(var n in r)i[n]=r[n];var s={};t&&"[object Function]"===s.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,i)}function defineAccessor(t,e,a){var r,i={enumerable:!1,configurable:!1,get:function(){return r},set:function(t){r=t}};if(a)for(var n in a)i[n]=a[n];var s={};t&&"[object Function]"===s.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,i)}function bezFunction(){function t(t,e,a,r,i,n){return o.abs((a-t)*(n-e)-(i-t)*(r-e))<1e-5}function e(t){return n[t].fnc}function a(t,e,a,r,i){if(i||(i=("bez_"+t+"_"+e+"_"+a+"_"+r).replace(/\./g,"p")),n[i])return n[i];var s,o,h,p,m,l;return n[i]=function(i,n,d,c,u){for(var f,y=n/u,i=y,g=0;++g<14&&(h=3*t,o=3*(a-t)-h,s=1-h-o,f=i*(h+i*(o+i*s))-y,!(Math.abs(f)<.001));)i-=f/(h+i*(2*o+3*s*i));l=3*e,m=3*(r-e)-l,p=1-l-m;var v=i*(l+i*(m+i*p));return c*v+d},n[i]}function r(e,a,r,i){var n=(e.join("_")+"_"+a.join("_")+"_"+r.join("_")+"_"+i.join("_")).replace(/\./g,"p");if(s[n])return s[n];var o,h,p,m,l,d,c,u,f,y,g,v,x=500,E=0,C=null,b={points:[],segmentLength:0};for(t(e[0],e[1],a[0],a[1],r[0],r[1])&&t(e[0],e[1],a[0],a[1],i[0],i[1])&&(x=2),p=r.length,o=0;x>o;o+=1){for(v=[],y=o/(x-1),g=0,h=0;p>h;h+=1)m=e[h]+(r[h]-e[h])*y,l=r[h]+(i[h]-r[h])*y,d=i[h]+(a[h]-i[h])*y,c=m+(l-m)*y,u=l+(d-l)*y,f=c+(u-c)*y,v.push(f),null!==C&&(g+=Math.pow(v[h]-C[h],2));g=Math.sqrt(g),E+=g,b.points.push({partialLength:g,cumulatedLength:E,point:v}),C=v}return b.segmentLength=E,s[n]=b,b}function i(e){var a,r,i,n,s,o,h,p,m,l,d,c,u=e.s,f=e.e,y=e.to,g=e.ti,v=500,x=0,E=null,C={points:[],segmentLength:0};for(t(u[0],u[1],f[0],f[1],u[0]+y[0],u[1]+y[1])&&t(u[0],u[1],f[0],f[1],f[0]+g[0],f[1]+g[1])&&(v=2),i=y.length,a=0;v>a;a+=1){for(c=[],l=a/(v-1),d=0,r=0;i>r;r+=1)n=u[r]+y[r]*l,s=u[r]+y[r]+(f[r]+g[r]-(u[r]+y[r]))*l,o=f[r]+g[r]+-g[r]*l,h=n+(s-n)*l,p=s+(o-s)*l,m=h+(p-h)*l,c.push(m),null!==E&&(d+=Math.pow(c[r]-E[r],2));d=Math.sqrt(d),x+=d,C.points.push({partialLength:d,cumulatedLength:x,point:c}),E=c}C.segmentLength=x,e.bezierData=C}var n=[],s={},o=Math,h={getEasingCurve:a,getEasingCurveByIndex:e,drawBezierCurve:r,buildBezierData:i};return h}function dataFunctionManager(){function t(t,e,a){var r,i=s(t,e,a),n=[];for(r=0;e>r;r+=1)n.push(Math.floor(i[r]*f));return n}function e(t,e){var a,r,i,n=t.length;for(a=0;n>a;a+=1)if(void 0!==t[a].t)if(t[a].s instanceof Array)for(i=t[a].s.length,r=0;i>r;r+=1)t[a].s[r]*=e,t[a].e[r]*=e;else t[a].s&&(t[a].s*=e,t[a].e*=e);else t[a]=t[a]*e}function a(i){var s,o,h,p,m,l,d,c,u,f,y,g=i.length;for(d=0;g>d;d+=1){if(h=i[d],s=h.outPoint-h.startTime,o=h.startTime,h.layerName=n(h.layerName),h.parent&&(h.parent=n(h.parent)),h.renderedFrame={},h.renderedData={},p=[],m=-1,h.tm&&(h.tm=t(h.tm,s,o)),h.ks.o instanceof Array?e(h.ks.o,.01):h.ks.o/=100,h.ks.s instanceof Array?e(h.ks.s,.01):h.ks.s/=100,h.ks.r instanceof Array?e(h.ks.r,v):h.ks.r*=v,h.hasMask){var x=h.masksProperties;for(u=x.length,c=0;u>c;c+=1)if(x[c].pt.i)r(x[c].pt);else for(y=x[c].pt.length,f=0;y>f;f+=1)x[c].pt[f].s&&r(x[c].pt[f].s[0]),x[c].pt[f].e&&r(x[c].pt[f].e[0])}if("PreCompLayer"==h.type)a(h.layers);else if("ShapeLayer"==h.type)for(u=h.shapes.length,c=0;u>c;c+=1)if(l=h.shapes[c],l.renderedData={},l.tr.o instanceof Array?e(l.tr.o,.01):l.tr.o/=100,l.tr.s instanceof Array?e(l.tr.s,.01):l.tr.s/=100,l.tr.r instanceof Array?e(l.tr.r,v):l.tr.r*=v,l.fl&&(l.fl.o instanceof Array?e(l.fl.o,.01):l.fl.o*=.01),l.st&&(l.st.o instanceof Array?e(l.st.o,.01):l.st.o*=.01),l.ks)if(l.ks.i)r(l.ks);else for(y=l.ks.length,f=0;y>f;f+=1)l.ks[f].s&&(r(l.ks[f].s[0]),r(l.ks[f].e[0]))}}function r(t){var e,a=t.i.length;for(e=0;a>e;e+=1)t.i[e][0]+=t.v[e][0],t.i[e][1]+=t.v[e][1],t.o[e][0]+=t.v[e][0],t.o[e][1]+=t.v[e][1]}function i(t){g[t._id]={data:t,renderedFrames:[]},f=t.animation.frameRate,a(t.animation.layers)}function n(t){return t=t.replace(/ /g,"_"),t=t.replace(/-/g,"_"),t=t.replace(/\./g,"_"),t=t.replace(/\//g,"_")}function s(t,e,a){var r,i,n=[];if(!(t instanceof Array)||null==t[0].t)return n.push(t),n;var s,o;n=[];var h,p,m,l=[];i=t.length;var d,c=1e3,u=[],f=[];for(r=0;i>r;r+=1)if(s=t[r],s.t-=a,s.to){var y,g,v,x,E,C,b,d,F,S,A=0,I=null,w={points:[],length:0};for(y=0;c>y;y+=1)S=[],d=y/(c-1),F=0,u=[],f=[],s.to.forEach(function(t,e){null==u[e]&&(u[e]=s.s[e]+s.to[e],f[e]=s.e[e]+s.ti[e]),g=s.s[e]+(u[e]-s.s[e])*d,v=u[e]+(f[e]-u[e])*d,x=f[e]+(s.e[e]-f[e])*d,E=g+(v-g)*d,C=v+(x-v)*d,b=E+(C-E)*d,S.push(b),null!==I&&(F+=Math.pow(S[e]-I[e],2))}),F=Math.sqrt(F),A+=F,w.points.push({partialLength:A,point:S}),I=S,s.bezierData=w;w.segmentLength=A}var M=0,k=0;for(r=0;e>r;r+=1){h=M;for(var T=!1;i-1>h;){if(s=t[h],o=t[h+1],r<s.t&&0==h){for(m=s.s.length,l=[],p=0;m>p;p+=1)l.push(s.s[p]);n.push(l),T=!0,M!=h&&(M=h,k=0);break}if(r>=s.t&&r<o.t){if(l=[],s.to){d=bez.getEasingCurve(s.o.x,s.o.y,s.i.x,s.i.y)("",r-s.t,0,1,o.t-s.t);var y,D,_,w=s.bezierData,P=w.segmentLength*d;for(p=k;p<w.points.length;){if(0==r||0==P||0==d){l=w.points[p].point,k=p;break}if(p==w.points.length-1)l=w.points[p].point;else if(P>w.points[p].partialLength&&P<w.points[p+1].partialLength){for(D=w.points[p].point.length,_=(P-w.points[p].partialLength)/(w.points[p+1].partialLength-w.points[p].partialLength),y=0;D>y;y+=1)l.push(w.points[p].point[y]+(w.points[p+1].point[y]-w.points[p].point[y])*_);k=p;break}p+=1}}else{var V,N,z,L;s.s.forEach(function(t,e){if(1!==s.h&&(s.o.x instanceof Array?(V=s.o.x[e],N=s.o.y[e],z=s.i.x[e],L=s.i.y[e]):(V=s.o.x,N=s.o.y,z=s.i.x,L=s.i.y),d=bez.getEasingCurve(V,N,z,L)("",r-s.t,0,1,o.t-s.t)),t.i){var a={i:[],o:[],v:[]};t.i.forEach(function(r,i){var n=[],o=[],h=[];r.forEach(function(a,r){1===s.h?(n.push(a),o.push(t.o[i][r]),h.push(t.v[i][r])):(n.push(a+(s.e[e].i[i][r]-a)*d),o.push(t.o[i][r]+(s.e[e].o[i][r]-t.o[i][r])*d),h.push(t.v[i][r]+(s.e[e].v[i][r]-t.v[i][r])*d))}),a.i.push(n),a.o.push(o),a.v.push(h)}),l.push(a)}else l.push(1===s.h?t:t+(s.e[e]-t)*d)})}n.push(l),T=!0,M!=h&&(M=h,k=0);break}h+=1}0==T&&(s=t[t.length-2],l=[],s.e.forEach(function(t){l.push(t)}),n.push(l))}for(h=n.length;e>h;)n.push(l),h+=1;return n}function o(t,e,a,r){var i,n,s,o,h,p;if(!t.length)return"p"==r.type?(E.px=t,E.py=t):"s"==r.type?(E.sx=t,E.sy=t):"r"==r.type&&(E.r=t),r.toArray?[t]:t;if(null==t[0].t)return"p"==r.type?(E.px=t[0],E.py=t[1]):"s"==r.type?(E.sx=t[0],E.sy=t[1]):"r"==r.type&&(E.r=t[0]),t;h=0,p=t.length-1;for(var m=1,l=!0;!(!l||(i=t[h],n=t[h+1],h==p-1&&e>=n.t-a)||n.t-a>e&&1==m);){if(n.t-a<e&&-1==m){h+=1,i=t[h],n=t[h+1];break}p-1>h&&1==m||h>0&&-1==m?h+=m:l=!1}i.to&&!i.bezierData&&bez.buildBezierData(i);var d,c,u,f,y=0;if("default"==r.type&&(s=[]),i.to){if(o=i.bezierData,e>=n.t-a)return"p"==r.type?(E.px=o.points[o.points.length-1].point[0],E.py=o.points[o.points.length-1].point[1]):"s"==r.type?(E.sx=o.points[o.points.length-1].point[0],E.sy=o.points[o.points.length-1].point[1]):"r"==r.type&&(E.r=o.points[o.points.length-1].point[0]),o.points[o.points.length-1].point;if(e<i.t-a)return"p"==r.type?(E.px=o.points[0].point[0],E.py=o.points[0].point[1]):"s"==r.type?(E.sx=o.points[0].point[0],E.sy=o.points[0].point[1]):"r"==r.type&&(E.r=o.points[0].point[0]),o.points[0].point;var g;i.__fnct?g=i.__fnct:(g=bez.getEasingCurve(i.o.x,i.o.y,i.i.x,i.i.y,i.n),i.__fnct=g),u=g("",e-(i.t-a),0,1,n.t-a-(i.t-a));var v,x=o.segmentLength*u,C=0;for(m=1,l=!0,f=o.points.length;l;){if(C+=o.points[y].partialLength*m,0==x||0==u){"p"==r.type?(E.px=o.points[y].point[0],E.py=o.points[y].point[1]):"s"==r.type?(E.sx=o.points[y].point[0],E.sy=o.points[y].point[1]):"r"==r.type?E.r=o.points[y].point[0]:s=o.points[y].point;break}if(y==o.points.length-1){"p"==r.type?(E.px=o.points[y].point[0],E.py=o.points[y].point[1]):"s"==r.type?(E.sx=o.points[y].point[0],E.sy=o.points[y].point[1]):"r"==r.type?E.r=o.points[y].point[0]:s=o.points[y].point;break}if(x>C&&x<C+o.points[y+1].partialLength){if(v=(x-C)/o.points[y+1].partialLength,"p"==r.type)E.px=o.points[y].point[0]+(o.points[y+1].point[0]-o.points[y].point[0])*v,E.py=o.points[y].point[1]+(o.points[y+1].point[1]-o.points[y].point[1])*v;else if("s"==r.type)E.sx=o.points[y].point[0]+(o.points[y+1].point[0]-o.points[y].point[0])*v,E.sy=o.points[y].point[1]+(o.points[y+1].point[1]-o.points[y].point[1])*v;else if("r"==r.type)E.r=o.points[y].point[0]+(o.points[y+1].point[0]-o.points[y].point[0])*v;else for(c=o.points[y].point.length,d=0;c>d;d+=1)s.push(o.points[y].point[d]+(o.points[y+1].point[d]-o.points[y].point[d])*v);break}f-1>y&&1==m||y>0&&-1==m?y+=m:l=!1}}else{var b,F,S,A,I=!1;for(p=i.s.length,h=0;p>h;h+=1){if(1!==i.h){i.o.x instanceof Array?(I=!0,b=i.o.x[h]?i.o.x[h]:i.o.x[0],F=i.o.y[h]?i.o.y[h]:i.o.y[0],S=i.i.x[h]?i.i.x[h]:i.i.x[0],A=i.i.y[h]?i.i.y[h]:i.i.y[0],i.__fnct||(i.__fnct=[])):(I=!1,b=i.o.x,F=i.o.y,S=i.i.x,A=i.i.y);var g;I?i.__fnct[h]?g=i.__fnct[h]:(g=bez.getEasingCurve(b,F,S,A),i.__fnct[h]=g):i.__fnct?g=i.__fnct:(g=bez.getEasingCurve(b,F,S,A),i.__fnct=g),u=g("",e-(i.t-a),0,1,n.t-a-(i.t-a)),e>=n.t-a?u=1:e<i.t-a&&(u=0)}1===i.h?"p"==r.type?0==h?E.px=i.s[h]:1==h&&(E.py=i.s[h]):"s"==r.type?0==h?E.sx=i.s[h]:1==h&&(E.sy=i.s[h]):"r"==r.type?E.r=i.s[h]:s.push(i.s[h]):"p"==r.type?0==h?E.px=i.s[h]+(i.e[h]-i.s[h])*u:1==h&&(E.py=i.s[h]+(i.e[h]-i.s[h])*u):"s"==r.type?0==h?E.sx=i.s[h]+(i.e[h]-i.s[h])*u:1==h&&(E.sy=i.s[h]+(i.e[h]-i.s[h])*u):"r"==r.type?E.r=i.s[h]+(i.e[h]-i.s[h])*u:s.push(i.s[h]+(i.e[h]-i.s[h])*u)}}return s}function h(t,e,a,r,i){var n={};n.closed=i?t.cl:t.closed;var s=i?t.pt:t.ks;if(s.v)return"svg"==r?(s.__pathString||(s.__pathString=p(s,n.closed)),n.pathString=s.__pathString):n.pathNodes=s,n;var o,h,m,l,d,c,u,t={i:[],o:[],v:[]},f=[];if(e<s[0].t-a){for(h=s[0].s[0].i.length,o=0;h>o;o+=1){for(d=[],c=[],u=[],l=s[0].s[0].i[o].length,m=0;l>m;m+=1)d.push(s[0].s[0].i[o][m]),c.push(s[0].s[0].o[o][m]),u.push(s[0].s[0].v[o][m]);t.i.push(d),t.o.push(c),t.v.push(u)}return f.push(t),"svg"==r?(s.__minValue||(s.__minValue=p(f,n.closed)),n.pathString=s.__minValue):(s.__minValue||(s.__minValue=f),n.pathNodes=s.__minValue),n}if(e>s[s.length-1].t-a){var y=s.length-2;for(h=s[y].s[0].i.length,o=0;h>o;o+=1){for(d=[],c=[],u=[],l=s[y].s[0].i[o].length,m=0;l>m;m+=1)d.push(s[y].e[0].i[o][m]),c.push(s[y].e[0].o[o][m]),u.push(s[y].e[0].v[o][m]);t.i.push(d),t.o.push(c),t.v.push(u)}return f.push(t),"svg"==r?(s.__maxValue||(s.__maxValue=p(f,n.closed)),n.pathString=s.__maxValue):(s.__maxValue||(s.__maxValue=f),n.pathNodes=s.__maxValue),n}for(var g,v,x=0,E=s.length-1,C=1,b=!0;b&&(g=s[x],v=s[x+1],!(v.t-a>e&&1==C));)E-1>x&&1==C||x>0&&-1==C?x+=C:b=!1;var F,S,A,I,w;if(1!==g.h){F=g.o.x,S=g.o.y,A=g.i.x,I=g.i.y;var M;g.__fnct?M=g.__fnct:(M=bez.getEasingCurve(F,S,A,I),g.__fnct=M),w=M("",e-(g.t-a),0,1,v.t-a-(g.t-a)),e>=v.t-a?w=1:e<g.t-a&&(w=0)}if(1===g.h&&g.__hValue)f.push(g.__hValue);else for(t={i:[],o:[],v:[]},h=g.s[0].i.length,o=0;h>o;o+=1){for(d=[],c=[],u=[],l=g.s[0].i[o].length,m=0;l>m;m+=1)1===g.h?(d.push(g.s[0].i[o][m]),c.push(g.s[0].o[o][m]),u.push(g.s[0].v[o][m])):(d.push(g.s[0].i[o][m]+(g.e[0].i[o][m]-g.s[0].i[o][m])*w),c.push(g.s[0].o[o][m]+(g.e[0].o[o][m]-g.s[0].o[o][m])*w),u.push(g.s[0].v[o][m]+(g.e[0].v[o][m]-g.s[0].v[o][m])*w));t.i.push(d),t.o.push(c),t.v.push(u),1===g.h&&(g.__hValue=t),f.push(t)}return"svg"==r?n.pathString=p(f[0],n.closed):n.pathNodes=f[0],n}function p(t,e){var a,r,i,n,s,o,h="";if(!(t instanceof Array)){for(a=t.v,r=t.o,i=t.i,o=a.length,h+="M"+a[0].join(","),s=1;o>s;s++)h+=" C"+r[s-1].join(",")+" "+i[s].join(",")+" "+a[s].join(",");return e!==!1&&(h+=" C"+r[s-1].join(",")+" "+i[0].join(",")+" "+a[0].join(",")),h}var p,m=t.length;for(h="",p=0;m>p;p+=1){for(n=t[p],a=n.v,r=n.o,i=n.i,o=a.length,h+="M"+a[0].join(","),s=1;o>s;s++)h+=" C"+r[s-1].join(",")+" "+i[s].join(",")+" "+a[s].join(",");e!==!1&&(h+=" C"+r[s-1].join(",")+" "+i[0].join(",")+" "+a[0].join(","))}return h}function m(t,e,a){var r,i,n,s,p,d,c,u,f,g,v,C,b,F,S,A,I,w,M,k={},T=t.length;for(w=0;T>w;w+=1)if(M=t[w],b=e-M.startTime,!M.an[b]){if(r={},x.arrayFlag=!1,x.type="default",r.a=o(M.ks.a,b,M.startTime,x),r.o=o(M.ks.o,b,M.startTime,x),x.arrayFlag=!1,x.type="p",o(M.ks.p,b,M.startTime,x),x.arrayFlag=!0,x.type="r",o(M.ks.r,b,M.startTime,x),x.arrayFlag=!0,x.type="s",o(M.ks.s,b,M.startTime,x),A={},A.an={tr:r},x.arrayFlag=!1,x.type="default","canvas"==a?A.an.matrixArray=y.getMatrixArrayFromParams(E.r,E.sx,E.sy,E.px,E.py):A.an.matrixValue=y.getMatrix2FromParams(E.r,E.sx,E.sy,E.px,E.py)+"translate("+-r.a[0]+" "+-r.a[1]+")",M.renderedData[b]=A,M.hasMask)for(i=M.masksProperties,S=i.length,F=0;S>F;F+=1)i[F].paths||(i[F].paths=[],i[F].opacity=[]),i[F].paths[b]=h(i[F],b,M.startTime,a,!0),i[F].opacity[b]=o(i[F].o,b,M.startTime,x),i[F].opacity[b]=i[F].opacity[b]instanceof Array?i[F].opacity[b][0]/100:i[F].opacity[b]/100;if(!(e<M.inPoint||e>M.outPoint))if("PreCompLayer"==M.type)n=M.tm?M.tm[b]<0?0:M.tm[b]:b,m(M.layers,n,a);else if("ShapeLayer"==M.type)for(S=M.shapes.length,F=0;S>F;F+=1){if(I={},s=M.shapes[F],s.renderedData[b]=I,s._created||(s.an.tr=[],s.an.renderedFrame={},s.ks?s.an.path=[]:s.el?s.an.ell=[]:s.rc&&(s.an.rect=[]),s.fl&&(s.an.fill=[]),s.st&&(s.an.stroke=[])),s.trim&&!s._created&&(s.trim.an=[]),s.fl&&(d=o(s.fl.c,b,M.startTime,x),p=o(s.fl.o,b,M.startTime,x),I.fill={opacity:p instanceof Array?p[0]:p},"canvas"==a?(l(d),I.fill.color=d):I.fill.color=rgbToHex(Math.round(d[0]),Math.round(d[1]),Math.round(d[2]))),s.ks?I.path=h(s,b,M.startTime,a):s.el?(g=o(s.el.p,b,M.startTime,x),v=o(s.el.s,b,M.startTime,x),I.ell={p:g,size:v}):s.rc&&(g=o(s.rc.p,b,M.startTime,x),v=o(s.rc.s,b,M.startTime,x),C=o(s.rc.r,b,M.startTime,x),I.rect={position:g,size:v,roundness:C}),s.st&&(c=o(s.st.c,b,M.startTime,x),u=o(s.st.o,b,M.startTime,x),f=o(s.st.w,b,M.startTime,x),I.stroke={opacity:u instanceof Array?u[0]:u,width:f instanceof Array?f[0]:f},"canvas"==a?(l(c),I.stroke.color=c):I.stroke.color=rgbToHex(Math.round(c[0]),Math.round(c[1]),Math.round(c[2]))),k={},k.a=o(s.tr.a,b,M.startTime,x),k.o=o(s.tr.o,b,M.startTime,x),x.arrayFlag=!0,x.type="s",o(s.tr.s,b,M.startTime,x),x.arrayFlag=!0,x.type="r",o(s.tr.r,b,M.startTime,x),x.arrayFlag=!1,x.type="p",o(s.tr.p,b,M.startTime,x),x.arrayFlag=!1,x.type="default","canvas"==a?k.mtArr=y.getMatrixArrayFromParams(E.r,E.sx,E.sy,E.px,E.py):k.mt=y.getMatrix2FromParams(E.r,E.sx,E.sy,E.px,E.py),s.an.tr[b]=k,I.tr=k,s.trim){var D=o(s.trim.s,b,M.startTime,x),_=o(s.trim.e,b,M.startTime,x),P=o(s.trim.o,b,M.startTime,x);I.trim={s:D,e:_,o:P}}s._created||(s._created=!0)}}}function l(t){var e,a=t.length;for(e=0;a>e;e+=1)t[e]=Math.round(t[e])}function d(t,e){for(var a=1;a>0;){if(e+=1,e>=t.data.animation.totalFrames){t.renderFinished=!0;break}t.renderedFrames[e]||(c(t.data._id,e),a-=1)}}function c(t,e){return 2==g[t].renderedFrames[e]?void(g[t].renderFinished||d(g[t],e)):(g[t].renderedFrames[e]=2,void m(g[t].data.animation.layers,e,g[t].data._animType))}function u(t){var e,a=g[t].data,r=a.animation.totalFrames,i=[];for(e=0;r>e;e+=1)i.push({num:e,data:c(t,e)})}var f=0,y=new MatrixManager,g={},v=Math.PI/180,x={arrayFlag:!1},E={r:0,sx:1,sy:1,px:1,py:1},C={};return C.completeData=i,C.renderFrame=c,C.renderAllFrames=u,C}function SVGRenderer(t){this.animationItem=t,this.layers=null,this.lastFrame=-1}function CanvasRenderer(t,e){this.animationItem=t,this.renderConfig=e?e:{clearCanvas:!0,context:null,scaleMode:"fit"},this.lastFrame=-1}function MaskElement(){this.data=null,this.element=null,this.paths=[]}function ICompElement(t,e){this.parent.constructor.call(this,t,e),this.layers=t.layers}function IImageElement(t,e){this.animationItem=e,this.assets=this.animationItem.getAssets(),this.path=this.animationItem.getPath(),this.parent.constructor.call(this,t,e)}function IShapeElement(t,e){this.shapes=[],this.parent.constructor.call(this,t,e)}function ShapeItemElement(t){this.data=t,this.shapeG=document.createElementNS(svgNS,"g"),this.pathLength=0,this.cachedData=[],this.renderedFrame={path:"",stroke:{},fill:{},tr:{a:[]},trim:{},ellipse:{},rect:{}},"pathShape"===this.data.type?this.shape=document.createElementNS(svgNS,"path"):"rectShape"===this.data.type?this.shape=document.createElementNS(svgNS,"rect"):"ellipseShape"===this.data.type?(this.shape=document.createElementNS(svgNS,"ellipse"),this.data.trim&&this.adjustTrim()):this.shape=document.createElementNS(svgNS,"path"),this.data.trim?this.shape.setAttribute("stroke-linecap","round"):(this.shape.setAttribute("stroke-linejoin","round"),this.shape.setAttribute("stroke-linecap","round")),this.data.renderedData||(this.data.renderedData={}),this.shape.setAttribute("name",this.data.name),styleUnselectableDiv(this.shapeG),styleUnselectableDiv(this.shape),this.shapeG.appendChild(this.shape)}function ISolidElement(t,e){this.parent.constructor.call(this,t,e)}function ITextElement(t,e){this.parent.constructor.call(this,t,e)}function CVBaseElement(t,e){this.renderer=e,this.data=t,this.currentAnimData=null,this.renderFrame=!1,this.init()}function CVCompElement(t,e){this.parent.constructor.call(this,t,e),this.layers=t.layers}function CVImageElement(t,e){this.renderer=e,this.animationItem=e.animationItem,this.assets=this.animationItem.getAssets(),this.path=this.animationItem.getPath(),this.parent.constructor.call(this,t,e),this.animationItem.pendingElements+=1}function CVShapeElement(t,e){this.shapes=[],this.parent.constructor.call(this,t,e)}function CVShapeItemElement(t,e){this.data=t,this.renderer=e,this.frameNum=-1,this.renderedPaths={},this.trims=[]}function CVSolidElement(t,e){this.parent.constructor.call(this,t,e)}function CVTextElement(t,e){this.parent.constructor.call(this,t,e)}function CVMaskElement(){}var svgNS="http://www.w3.org/2000/svg";Matrix.prototype={concat:function(t){return this.clone()._t(t.a,t.b,t.c,t.d,t.e,t.f)},flipX:function(){return this._t(-1,0,0,1,0,0)},flipY:function(){return this._t(1,0,0,-1,0,0)},reflectVector:function(t,e){var a=this.applyToPoint(0,1),r=2*(a.x*t+a.y*e);return t-=r*a.x,e-=r*a.y,{x:t,y:e}},reset:function(){return this.setTransform(1,0,0,1,0,0)},rotate:function(t){return 0==t?this:(this.cos=Math.cos(t),this.sin=Math.sin(t),this._t(this.cos,this.sin,-this.sin,this.cos,0,0))},rotateFromVector:function(t,e){return this.rotate(Math.atan2(e,t))},rotateDeg:function(t){return this.rotate(t*Math.PI/180)},scaleU:function(t){return this._t(t,0,0,t,0,0)},scale:function(t,e){return 1==t&&1==e?this:this._t(t,0,0,e,0,0)},scaleX:function(t){return this._t(t,0,0,1,0,0)},scaleY:function(t){return this._t(1,0,0,t,0,0)},shear:function(t,e){return this._t(1,e,t,1,0,0)},shearX:function(t){return this._t(1,0,t,1,0,0)},shearY:function(t){return this._t(1,t,0,1,0,0)},skew:function(t,e){return this.shear(Math.tan(t),Math.tan(e))},skewX:function(t){return this.shearX(Math.tan(t))},skewY:function(t){return this.shearY(Math.tan(t))},setTransform:function(t,e,a,r,i,n){return this.props[0]=t,this.props[1]=e,this.props[2]=a,this.props[3]=r,this.props[4]=i,this.props[5]=n,this._x()},translate:function(t,e){return this._t(1,0,0,1,t,e)},translateX:function(t){return this._t(1,0,0,1,t,0)},translateY:function(t){return this._t(1,0,0,1,0,t)},transform:function(t,e,a,r,i,n){return this.a1=this.props[0],this.b1=this.props[1],this.c1=this.props[2],this.d1=this.props[3],this.e1=this.props[4],this.f1=this.props[5],this.props[0]=this.a1*t+this.c1*e,this.props[1]=this.b1*t+this.d1*e,this.props[2]=this.a1*a+this.c1*r,this.props[3]=this.b1*a+this.d1*r,this.props[4]=this.a1*i+this.c1*n+this.e1,this.props[5]=this.b1*i+this.d1*n+this.f1,this._x()},divide:function(t){if(!t.isInvertible())throw"Input matrix is not invertible";var e=t.inverse();return this._t(e.a,e.b,e.c,e.d,e.e,e.f)},divideScalar:function(t){var e=this;return e.a/=t,e.b/=t,e.c/=t,e.d/=t,e.e/=t,e.f/=t,e._x()},inverse:function(){if(this.isIdentity())return new Matrix;if(this.isInvertible()){var t=this,e=t.a,a=t.b,r=t.c,i=t.d,n=t.e,s=t.f,o=new Matrix,h=e*i-a*r;return o.a=i/h,o.b=-a/h,o.c=-r/h,o.d=e/h,o.e=(r*s-i*n)/h,o.f=-(e*s-a*n)/h,o}throw"Matrix is not invertible."},interpolate:function(t,e,a){var r=this,i=a?new Matrix(a):new Matrix;return i.a=r.a+(t.a-r.a)*e,i.b=r.b+(t.b-r.b)*e,i.c=r.c+(t.c-r.c)*e,i.d=r.d+(t.d-r.d)*e,i.e=r.e+(t.e-r.e)*e,i.f=r.f+(t.f-r.f)*e,i._x()},interpolateAnim:function(t,e,a){var r=this,i=a?new Matrix(a):new Matrix,n=r.decompose(),s=t.decompose(),o=n.rotation+(s.rotation-n.rotation)*e,h=n.translate.x+(s.translate.x-n.translate.x)*e,p=n.translate.y+(s.translate.y-n.translate.y)*e,m=n.scale.x+(s.scale.x-n.scale.x)*e,l=n.scale.y+(s.scale.y-n.scale.y)*e;return i.translate(h,p),i.rotate(o),i.scale(m,l),i._x()},decompose:function(t){var e=this,a=e.a,r=e.b,i=e.c,n=e.d,s=Math.acos,o=Math.atan,h=Math.sqrt,p=Math.PI,m={x:e.e,y:e.f},l=0,d={x:1,y:1},c={x:0,y:0},u=a*n-r*i;if(t)a?(c={x:o(i/a),y:o(r/a)},d={x:a,y:u/a}):r?(l=.5*p,d={x:r,y:u/r},c.x=o(n/r)):(d={x:i,y:n},c.x=.25*p);else if(a||r){var f=h(a*a+r*r);l=r>0?s(a/f):-s(a/f),d={x:f,y:u/f},c.x=o((a*i+r*n)/(f*f))}else if(i||n){var y=h(i*i+n*n);l=.5*p-(n>0?s(-i/y):-s(i/y)),d={x:u/y,y:y},c.y=o((a*i+r*n)/(y*y))}else d={x:0,y:0};return{scale:d,translate:m,rotation:l,skew:c}},determinant:function(){return this.a*this.d-this.b*this.c},applyToPoint:function(t,e){var a=this;return{x:t*a.a+e*a.c+a.e,y:t*a.b+e*a.d+a.f}},applyToArray:function(t){var e,a,r=0,i=[];if("number"==typeof t[0])for(a=t.length;a>r;)e=this.applyToPoint(t[r++],t[r++]),i.push(e.x,e.y);else for(;e=t[r];r++)i.push(this.applyToPoint(e.x,e.y));return i},applyToTypedArray:function(t,e){for(var a,r=0,i=t.length,n=e?new Float64Array(i):new Float32Array(i);i>r;)a=this.applyToPoint(t[r],t[r+1]),n[r++]=a.x,n[r++]=a.y;return n},applyToContext:function(t){var e=this;return t.setTransform(e.a,e.b,e.c,e.d,e.e,e.f),e},isIdentity:function(){var t=this;return t._q(t.a,1)&&t._q(t.b,0)&&t._q(t.c,0)&&t._q(t.d,1)&&t._q(t.e,0)&&t._q(t.f,0)},isInvertible:function(){return!this._q(this.determinant(),0)},isValid:function(){return!this._q(this.a*this.d,0)},clone:function(t){var e=this,a=new Matrix;return a.a=e.a,a.b=e.b,a.c=e.c,a.d=e.d,a.e=e.e,a.f=e.f,t||(a.context=e.context),a},isEqual:function(t){var e=this,a=e._q;return a(e.a,t.a)&&a(e.b,t.b)&&a(e.c,t.c)&&a(e.d,t.d)&&a(e.e,t.e)&&a(e.f,t.f)},toArray:function(){return[this.props[0],this.props[1],this.props[2],this.props[3],this.props[4],this.props[5]]},toCSS:function(){return this.cssParts[1]=this.props.join(","),this.cssParts.join("")},toJSON:function(){var t=this;return'{"a":'+t.a+',"b":'+t.b+',"c":'+t.c+',"d":'+t.d+',"e":'+t.e+',"f":'+t.f+"}"},toString:function(){return""+this.toArray()},_q:function(t,e){return Math.abs(t-e)<1e-14},_x:function(){return this.context&&this.context.setTransform(this.a,this.b,this.c,this.d,this.e,this.f),this}};var MatrixManager=matrixManagerFunction;!function(){for(var t=0,e=["ms","moz","webkit","o"],a=0;a<e.length&&!window.requestAnimationFrame;++a)window.requestAnimationFrame=window[e[a]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[a]+"CancelAnimationFrame"]||window[e[a]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e){var a=(new Date).getTime(),r=Math.max(0,16-(a-t)),i=window.setTimeout(function(){e(a+r)},r);return t=a+r,i}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var subframeEnabled=!1,supportsPath2D="function"==typeof Path2D,cachedColors={},colorMap=[],body,fillColorToString=function(){var t=[];return function(e,a){return t[e[0]]||(t[e[0]]=[]),t[e[0]][e[1]]||(t[e[0]][e[1]]=[]),t[e[0]][e[1]][e[2]]||(void 0!=a&&(e[3]=a),t[e[0]][e[1]][e[2]]="rgba("+e.join(",")+")"),t[e[0]][e[1]][e[2]]}}();createColorMap(),function(t){function e(){this.commandArrays=[]}void 0==CanvasRenderingContext2D.prototype.ellipse&&(CanvasRenderingContext2D.prototype.ellipse=function(t,e,a,r,i,n,s,o){this.save(),this.translate(t,e),this.rotate(i),this.scale(a,r),this.arc(0,0,1,n,s,o),this.restore()}),supportsPath2D||(e.prototype.moveTo=function(t,e){this.commandArrays.push({type:"move",coord:[t,e]})},e.prototype.lineTo=function(t,e){this.commandArrays.push({type:"line",coord:[t,e]})},e.prototype.bezierCurveTo=function(t,e,a,r,i,n){this.commandArrays.push({type:"bezierCurve",coord:[t,e,a,r,i,n]})},e.prototype.drawToContext=function(t){var e,a,r=this.commandArrays.length;for(t.beginPath(),a=0;r>a;a+=1)switch(e=this.commandArrays[a],e.type){case"move":t.moveTo(e.coord[0],e.coord[1]);break;case"line":t.lineTo(e.coord[0],e.coord[1]);break;case"bezierCurve":t.bezierCurveTo(e.coord[0],e.coord[1],e.coord[2],e.coord[3],e.coord[4],e.coord[5])}},t.Path2D=e)}(window);var bez=bezFunction(),dataManager=dataFunctionManager();SVGRenderer.prototype.buildItems=function(t){var e,a=0,r=t.length;for(e=0;r>e;e++)"StillLayer"==t[e].type?(a++,this.createImage(t[e])):"PreCompLayer"==t[e].type?this.createComp(t[e]):"SolidLayer"==t[e].type?this.createSolid(t[e]):"ShapeLayer"==t[e].type?this.createShape(t[e]):"TextLayer"==t[e].type?this.createText(t[e]):console.log("NO TYPE: ",t[e])},SVGRenderer.prototype.createShape=function(t){t.element=new IShapeElement(t,this.animationItem)},SVGRenderer.prototype.createText=function(t){t.element=new ITextElement(t,this.animationItem)},SVGRenderer.prototype.createImage=function(t){t.element=new IImageElement(t,this.animationItem)},SVGRenderer.prototype.createComp=function(t){t.element=new ICompElement(t,this.animationItem),this.buildItems(t.layers,t.element.getType())},SVGRenderer.prototype.createSolid=function(t){t.element=new ISolidElement(t,this.animationItem)},SVGRenderer.prototype.configAnimation=function(t){this.animationItem.container=document.createElementNS(svgNS,"svg"),this.animationItem.container.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.animationItem.container.setAttribute("width",t.animation.compWidth),this.animationItem.container.setAttribute("height",t.animation.compHeight),this.animationItem.container.setAttribute("viewBox","0 0 "+t.animation.compWidth+" "+t.animation.compHeight),this.animationItem.container.setAttribute("preserveAspectRatio","xMidYMid meet"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transformOrigin=this.animationItem.container.style.mozTransformOrigin=this.animationItem.container.style.webkitTransformOrigin=this.animationItem.container.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.animationItem.container);var e=document.createElementNS(svgNS,"defs");this.animationItem.container.appendChild(e);var a=document.createElementNS(svgNS,"clipPath"),r=document.createElementNS(svgNS,"rect");r.setAttribute("width",t.animation.compWidth),r.setAttribute("height",t.animation.compHeight),r.setAttribute("x",0),r.setAttribute("y",0),a.setAttribute("id","animationMask"),a.appendChild(r);var i=document.createElementNS(svgNS,"g");i.setAttribute("clip-path","url(#animationMask)"),this.animationItem.container.appendChild(i),e.appendChild(a),this.animationItem.container=i,this.layers=t.animation.layers},SVGRenderer.prototype.buildStage=function(t,e){var a,r,i=e.length;for(a=i-1;a>=0;a--){if(r=e[a],r.parent){this.buildItemParenting(r,e,r.parent);var n=r.element.getDomElement();n.setAttribute("data-layer-name",r.layerName),t.appendChild(n),r.element.setMainElement(n)}else r.element.getDomElement().setAttribute("data-layer-name",r.layerName),t.appendChild(r.element.getDomElement()),r.element.setMainElement(r.element.getDomElement());"PreCompLayer"==r.type&&this.buildStage(r.element.getComposingElement(),r.layers,r.element.getType())}},SVGRenderer.prototype.buildItemParenting=function(t,e,a){t.parents||(t.parents=[]);for(var r=0,i=e.length;i>r;){if(e[r].layerName==a){t.parents.push({elem:e[r]}),e[r].parent&&this.buildItemParenting(t,e,e[r].parent);break}r+=1}},SVGRenderer.prototype.updateContainerSize=function(){},SVGRenderer.prototype.renderFrame=function(t){if(this.lastFrame!=t){this.lastFrame=t;var e,a=this.layers.length;for(e=0;a>e;e++)this.layers[e].element.prepareFrame(t-this.layers[e].startTime);for(e=0;a>e;e++)this.layers[e].element.renderFrame(t-this.layers[e].startTime)}},CanvasRenderer.prototype.buildItems=function(t){var e,a=0,r=t.length;for(e=0;r>e;e++)"StillLayer"==t[e].type?(a++,this.createImage(t[e])):"PreCompLayer"==t[e].type?this.createComp(t[e]):"SolidLayer"==t[e].type?this.createSolid(t[e]):"ShapeLayer"==t[e].type?this.createShape(t[e]):"TextLayer"==t[e].type?this.createText(t[e]):(this.createBase(t[e]),console.log("NO TYPE: ",t[e]))},CanvasRenderer.prototype.createBase=function(t){t.element=new CVBaseElement(t,this)},CanvasRenderer.prototype.createShape=function(t){t.element=new CVShapeElement(t,this)},CanvasRenderer.prototype.createText=function(t){t.element=new CVTextElement(t,this)},CanvasRenderer.prototype.createImage=function(t){t.element=new CVImageElement(t,this)},CanvasRenderer.prototype.createComp=function(t){t.element=new CVCompElement(t,this),this.buildItems(t.layers)},CanvasRenderer.prototype.createSolid=function(t){t.element=new CVSolidElement(t,this)},CanvasRenderer.prototype.configAnimation=function(t){this.animationItem.wrapper?(this.animationItem.container=document.createElement("canvas"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transformOrigin=this.animationItem.container.style.mozTransformOrigin=this.animationItem.container.style.webkitTransformOrigin=this.animationItem.container.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.animationItem.container),this.canvasContext=this.animationItem.container.getContext("2d")):this.canvasContext=this.renderConfig.context,this.layers=t.animation.layers,this.transformCanvas={},this.transformCanvas.w=t.animation.compWidth,this.transformCanvas.h=t.animation.compHeight,this.updateContainerSize()
},CanvasRenderer.prototype.updateContainerSize=function(){if(this.animationItem.wrapper&&this.animationItem.container){var t=this.animationItem.wrapper.offsetWidth,e=this.animationItem.wrapper.offsetHeight;this.animationItem.container.setAttribute("width",t),this.animationItem.container.setAttribute("height",e)}else var t=this.canvasContext.canvas.width,e=this.canvasContext.canvas.height;if("fit"==this.renderConfig.scaleMode){var a=t/e,r=this.transformCanvas.w/this.transformCanvas.h;r>a?(this.transformCanvas.sx=t/this.transformCanvas.w,this.transformCanvas.sy=t/this.transformCanvas.w,this.transformCanvas.tx=0,this.transformCanvas.ty=(e-this.transformCanvas.h*(t/this.transformCanvas.w))/2):(this.transformCanvas.sx=e/this.transformCanvas.h,this.transformCanvas.sy=e/this.transformCanvas.h,this.transformCanvas.tx=(t-this.transformCanvas.w*(e/this.transformCanvas.h))/2,this.transformCanvas.ty=0)}else this.transformCanvas.sx=1,this.transformCanvas.sy=1,this.transformCanvas.tx=0,this.transformCanvas.ty=0},CanvasRenderer.prototype.buildStage=function(t,e){var a,r,i=e.length;for(a=i-1;a>=0;a--)r=e[a],r.parent&&(r.parentHierarchy=[],this.buildItemHierarchy(r,e,r.parent)),"PreCompLayer"==r.type&&this.buildStage(null,r.layers)},CanvasRenderer.prototype.buildItemHierarchy=function(t,e,a){for(var r=0,i=e.length;i>r;){if(e[r].layerName==a){t.parentHierarchy.push(e[r]),void 0==e[r].parent||this.buildItemHierarchy(t,e,e[r].parent);break}r+=1}},CanvasRenderer.prototype.prepareFrame=function(t){var e,a=this.layers.length;for(e=0;a>e;e++)this.layers[e].element.prepareFrame(t-this.layers[e].startTime)},CanvasRenderer.prototype.draw=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.layers[t].element.draw()},CanvasRenderer.prototype.renderFrame=function(t){this.lastFrame!=t&&(this.lastFrame=t,this.renderConfig.clearCanvas===!0?this.canvasContext.canvas.width=this.canvasContext.canvas.width:this.canvasContext.save(),this.canvasContext.transform(this.transformCanvas.sx,0,0,this.transformCanvas.sy,this.transformCanvas.tx,this.transformCanvas.ty),this.canvasContext.beginPath(),this.canvasContext.rect(0,0,this.transformCanvas.w,this.transformCanvas.h),this.canvasContext.clip(),this.prepareFrame(t),this.draw(),this.renderConfig.clearCanvas!==!0&&this.canvasContext.restore())},MaskElement.prototype.init=function(){this.registeredEffects=[],this.masksProperties=this.data.masksProperties,this.totalMasks=this.masksProperties.length;var t=this.element.maskingGroup,e=this.element.maskedElement,a=document.createElementNS(svgNS,"defs");t.appendChild(a);var r,i=this.masksProperties.length;this.layerSize=this.element.getLayerSize(),this.maskElement=document.createElementNS(svgNS,"clipPath");var n,s=this.data.masksProperties;for(r=0;i>r;r++)s[r].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),n=document.createElementNS(svgNS,"path"),s[r].cl?n.setAttribute("fill","#ffffff"):(n.setAttribute("fill","none"),n.setAttribute("stroke","#ffffff"),n.setAttribute("stroke-width","1"),n.setAttribute("stroke-miterlimit","10")),n.setAttribute("clip-rule","nonezero"),this.maskElement.appendChild(n),s[r].elem=n,s[r].lastPath="";var o=randomString(10);this.maskElement.setAttribute("id",o),e.setAttribute("clip-path","url(#"+o+")"),a.appendChild(this.maskElement)},MaskElement.prototype.renderFrame=function(t){var e,a=this.data.masksProperties.length;for(e=0;a>e;e++)this.drawPath(this.data.masksProperties[e],this.data.masksProperties[e].paths[t].pathString)},MaskElement.prototype.processMaskFromEffects=function(t,e){var a,r=this.registeredEffects.length;for(a=0;r>a;a++)this.registeredEffects[a].renderMask(t,e)},MaskElement.prototype.registerEffect=function(t){this.registeredEffects.push(t)},MaskElement.prototype.getMaskelement=function(){return this.maskElement},MaskElement.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+="h"+this.layerSize.w,t+="v"+this.layerSize.h,t+="h"+-this.layerSize.w,t+="v"+-this.layerSize.h},MaskElement.prototype.drawPath=function(t,e){t.lastPath!==e&&(t.inv?t.elem.setAttribute("d",this.solidPath+e):t.elem.setAttribute("d",e),t.lastPath=e)};var BaseElement=function(t,e){this.animationItem=e,this.data=t,this.transformChanged=!1,this.forceRender=!1,this.init()};BaseElement.prototype.init=function(){this.createElements(),this.data.hasMask&&this.addMasks(this.data),this.data.eff&&this.createEffectsManager(this.data)},BaseElement.prototype.createElements=function(){this.layerElement=document.createElementNS(svgNS,"g"),this.layerElement.setAttribute("id",this.data.layerName),this.maskingGroup=this.layerElement,this.maskedElement=this.layerElement},BaseElement.prototype.prepareFrame=function(t){this.currentAnimData=this.data.renderedData[t].an,this.data.renderedFrame.tr!==this.currentAnimData.matrixValue?(this.transformChanged=!0,this.data.renderedFrame.tr=this.currentAnimData.matrixValue):this.transformChanged=!1},BaseElement.prototype.renderFrame=function(t){if(this.data.inPoint-this.data.startTime<=t&&this.data.outPoint-this.data.startTime>t?this.isVisible!==!0&&(this.isVisible=!0,this.forceRender=!0,this.mainElement.setAttribute("opacity",1)):this.isVisible!==!1&&(this.isVisible=!1,this.mainElement.setAttribute("opacity",0)),this.data.eff&&this.effectsManager.renderFrame(t,this.currentAnimData.mk),t===this.data.renderedFrame.num)return this.isVisible;this.data.hasMask&&this.maskManager.renderFrame(t),this.data.renderedFrame.o!==this.currentAnimData.tr.o&&(this.data.renderedFrame.o=this.currentAnimData.tr.o,this.isVisible&&this.layerElement.setAttribute("opacity",this.currentAnimData.tr.o));var e="";if(this.data.parents){var a,r=!1,i=0,n=this.data.parents.length;if(this.transformChanged)r=!0;else for(;n>i;){if(this.data.parents[i].elem.element.transformChanged){r=!0;break}i+=1}if(r){for(i=n-1;i>=0;i-=1)a=this.data.parents[i].elem.element.currentAnimData,e+=a.matrixValue+" ";e+=this.currentAnimData.matrixValue,this.isVisible&&this.layerElement.setAttribute("transform",e),this.fullTransform=e}}else this.transformChanged&&(e+=this.currentAnimData.matrixValue,this.isVisible&&this.layerElement.setAttribute("transform",e),this.fullTransform=e);return this.forceRender&&(this.forceRender=!1,this.layerElement.setAttribute("opacity",this.currentAnimData.tr.o),this.layerElement.setAttribute("transform",this.fullTransform)),this.isVisible},BaseElement.prototype.getDomElement=function(){return this.layerElement},BaseElement.prototype.setMainElement=function(t){this.mainElement=t},BaseElement.prototype.getMaskManager=function(){return this.maskManager},BaseElement.prototype.addMasks=function(t){var e={data:{value:t},element:{value:this}};this.maskManager=createElement(MaskElement,null,e)},BaseElement.prototype.createEffectsManager=function(t){var e={effects:{value:t.eff},element:{value:this}};this.effectsManager=createElement(EffectsManager,null,e)},BaseElement.prototype.getType=function(){return this.type},BaseElement.prototype.getLayerSize=function(){return"TextLayer"==this.data.type?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},createElement(BaseElement,ICompElement),ICompElement.prototype.createElements=function(){this.svgElem=document.createElementNS(svgNS,"g"),this.parent.createElements.call(this)},ICompElement.prototype.getComposingElement=function(){return this.layerElement},ICompElement.prototype.renderFrame=function(t){var e=this.parent.renderFrame.call(this,t);if(e!==!1){var a,r=this.layers.length,i=this.data.tm?this.data.tm[t]<0?0:this.data.tm[t]:t;for(a=0;r>a;a+=1)this.layers[a].element.prepareFrame(i-this.layers[a].startTime);for(a=0;r>a;a+=1)this.layers[a].element.renderFrame(i-this.layers[a].startTime)}},createElement(BaseElement,IImageElement),IImageElement.prototype.createElements=function(){var t=this,e=function(){t.image.setAttributeNS("http://www.w3.org/1999/xlink","href",t.path+t.assets[t.data.assetId].path),t.maskedElement=t.image,t.animationItem.elementLoaded()},a=new Image;a.addEventListener("load",e,!1),a.src=this.path+this.assets[this.data.assetId].path,this.svgElem=document.createElementNS(svgNS,"g"),this.parent.createElements.call(this),this.image=document.createElementNS(svgNS,"image"),this.image.setAttribute("width",this.data.width+"px"),this.image.setAttribute("height",this.data.height+"px"),this.svgElem.appendChild(this.image),this.layerElement.appendChild(this.svgElem),this.maskingGroup=this.svgElem,styleUnselectableDiv(this.image)},createElement(BaseElement,IShapeElement),IShapeElement.prototype.createElements=function(){this.parent.createElements.call(this);var t,e,a=this.data.shapes.length;for(t=a-1;t>=0;t--)this.data.trim&&(this.data.shapes[t].trim=this.data.trim),e=new ShapeItemElement(this.data.shapes[t]),this.layerElement.appendChild(e.getElement()),this.shapes.push(e)},IShapeElement.prototype.renderFrame=function(t){var e=this.parent.renderFrame.call(this,t);e!==!1&&this.renderShapes(t)},IShapeElement.prototype.renderShapes=function(t){var e,a,r,i=this.data.shapes.length;for(e=i-1;e>=0;e--)a=this.data.shapes[e],r=this.shapes[i-1-e],r.renderShape(t)},ShapeItemElement.prototype.adjustTrim=function(){var t,e=this.data.trim,a=e.length;for(t=0;a>t;t+=1)e[t].o&&(e[t].o-=90)},ShapeItemElement.prototype.getElement=function(){return this.shapeG},ShapeItemElement.prototype.renderShape=function(t){this.currentData=this.data.renderedData[t],"pathShape"==this.data.type?this.pathLength=this.renderPath(t):"rectShape"==this.data.type?this.renderRect(t):"ellipseShape"==this.data.type&&(this.pathLength=this.renderEllipse(t)),this.data.trim&&this.renderTrim(t),this.renderFill(t),this.renderStroke(t),this.renderTransform(t)},ShapeItemElement.prototype.renderPath=function(){var t=this.currentData,e=t.path;return e.pathString!=this.renderedFrame.path?(this.renderedFrame.path=e.pathString,this.shape.setAttribute("d",e.pathString),this.data.trim?(null==this.cachedData.pathLengths&&(this.cachedData.pathLengths={}),null==this.cachedData.pathLengths[e.pathString]&&(this.cachedData.pathLengths[e.pathString]=this.shape.getTotalLength()),this.cachedData.pathLengths[e.pathString]):void 0):this.data.trim?this.cachedData.pathLengths[e.pathString]:void 0},ShapeItemElement.prototype.renderEllipse=function(t){var e=this.currentData.ell;if(this.renderedFrame.ellipse.rx!=e.size[0]&&(this.shape.setAttribute("rx",e.size[0]/2),this.renderedFrame.ellipse.rx=e.size[0]),this.renderedFrame.ellipse.ry!=e.size[1]&&(this.shape.setAttribute("ry",e.size[1]/2),this.renderedFrame.ellipse.ry=e.size[1]),this.renderedFrame.ellipse.cx!=e.p[0]&&(this.shape.setAttribute("cx",e.p[0]),this.renderedFrame.ellipse.ry=e.p[0]),this.renderedFrame.ellipse.cy!=e.p[1]&&(this.shape.setAttribute("cy",e.p[1]),this.renderedFrame.ellipse.ry=e.p[1]),this.data.trim){if(null==this.cachedData.pathLengths&&(this.cachedData.pathLengths={}),null==this.cachedData.pathLengths["ellipse_"+t])if(e.size[0]==e.size[1])this.cachedData.pathLengths["ellipse_"+t]=Math.PI*e.size[0];else{var a=Math.max(e.size[0],e.size[1])/2,r=Math.max(e.size[0],e.size[1])/2,i=(a-r)/(a+r),n=(a+r)*Math.PI*(1+.25*i+1/64*Math.pow(i,2)+1/256*Math.pow(i,3));this.cachedData.pathLengths["ellipse_"+t]=n}return this.cachedData.pathLengths["ellipse_"+t]}},ShapeItemElement.prototype.renderRect=function(){var t=this.currentData;if(t.rect){var e=t.rect;this.renderedFrame.rect.rx!=e.roundness&&(this.shape.setAttribute("rx",e.roundness),this.shape.setAttribute("ry",e.roundness),this.renderedFrame.rect.rx=e.roundness),this.renderedFrame.rect.width!=e.size[0]&&(this.shape.setAttribute("width",e.size[0]),this.renderedFrame.rect.width=e.size[0]),this.renderedFrame.rect.height!=e.size[1]&&(this.shape.setAttribute("height",e.size[1]),this.renderedFrame.rect.height=e.size[1]),this.renderedFrame.rect.x!=e.position[0]-e.size[0]&&(this.shape.setAttribute("x",e.position[0]-e.size[0]/2),this.renderedFrame.rect.x=e.position[0]-e.size[0]),this.renderedFrame.rect.y!=e.position[1]-e.size[1]&&(this.shape.setAttribute("y",e.position[1]-e.size[1]/2),this.renderedFrame.rect.y=e.position[1]-e.size[1])}},ShapeItemElement.prototype.renderFill=function(){var t=this.currentData;if(t.fill){var e=t.fill;this.renderedFrame.fill.color!==e.color&&(this.shape.setAttribute("fill",e.color),this.renderedFrame.fill.color=e.color),this.data.fillEnabled!==!1?this.renderedFrame.fill.opacity!==e.opacity&&(this.shape.setAttribute("fill-opacity",e.opacity),this.renderedFrame.fill.opacity=e.opacity):0!==this.renderedFrame.fill.opacity&&(this.shape.setAttribute("fill-opacity",0),this.renderedFrame.fill.opacity=0)}else 0!==this.renderedFrame.fill.opacity&&(this.shape.setAttribute("fill-opacity",0),this.renderedFrame.fill.opacity=0)},ShapeItemElement.prototype.renderStroke=function(){var t=this.currentData;if(t.stroke){var e=t.stroke;this.renderedFrame.stroke.color!==e.color&&(this.renderedFrame.stroke.color=e.color,this.shape.setAttribute("stroke",e.color)),this.renderedFrame.stroke.width!==e.width&&(this.renderedFrame.stroke.width=e.width,this.shape.setAttribute("stroke-width",e.width)),this.data.strokeEnabled!==!1?this.renderedFrame.stroke.opacity!==e.opacity&&(this.renderedFrame.stroke.opacity=e.opacity,this.shape.setAttribute("stroke-opacity",e.opacity)):0!==this.renderedFrame.stroke.opacity&&(this.renderedFrame.stroke.opacity=0,this.shape.setAttribute("stroke-opacity",0))}},ShapeItemElement.prototype.renderTransform=function(){var t=this.currentData;if(t.tr){var e=t.tr;this.renderedFrame.tr.o!==e.o&&(this.renderedFrame.tr.o=e.o,this.shapeG.setAttribute("opacity",e.o)),this.renderedFrame.tr.mt!==e.mt&&(this.renderedFrame.tr.mt=e.mt,this.shapeG.setAttribute("transform",e.mt)),(this.renderedFrame.tr.a[0]!==e.a[0]||this.renderedFrame.tr.a[1]!==e.a[1])&&(this.renderedFrame.tr.a[0]=e.a[0],this.renderedFrame.tr.a[1]=e.a[1],this.shape.setAttribute("transform","translate("+-e.a[0]+", "+-e.a[1]+")"))}},ShapeItemElement.prototype.renderTrim=function(){var t=this.currentData.trim;if(0==this.pathLength)this.shape.setAttribute("stroke-opacity",0);else{this.renderedFrame.trim.e==t.e&&this.renderedFrame.trim.s==t.s&&this.renderedFrame.trim.o==t.o,this.renderedFrame.trim.e=t.e,this.renderedFrame.trim.s=t.s,this.renderedFrame.trim.o=t.o;var e=this.pathLength*(t.e-t.s)/100,a=this.pathLength-e,r=this.pathLength*t.s/100+this.pathLength*t.o/360,i=e+" , "+a;this.shape.setAttribute("stroke-dasharray",i),this.shape.setAttribute("stroke-dashoffset",this.pathLength-r),t.e==t.s?this.shape.setAttribute("stroke-opacity",0):this.currentData.stroke&&(this.data.strokeEnabled!==!1?this.shape.setAttribute("stroke-opacity",this.currentData.stroke.opacity):this.shape.setAttribute("stroke-opacity",0))}},createElement(BaseElement,ISolidElement),ISolidElement.prototype.createElements=function(){this.svgElem=document.createElementNS(svgNS,"g"),this.parent.createElements.call(this),this.layerElement.appendChild(this.svgElem);var t=document.createElementNS(svgNS,"rect");t.setAttribute("width",this.data.width),t.setAttribute("height",this.data.height),t.setAttribute("fill",this.data.color),this.svgElem.appendChild(t),styleUnselectableDiv(this.svgElem),styleUnselectableDiv(t),this.maskingGroup=this.svgElem,this.maskedElement=t},createElement(BaseElement,ITextElement),ITextElement.prototype.createElements=function(){this.svgElem=document.createElementNS(svgNS,"g");var t=document.createElementNS(svgNS,"text");t.textContent=this.data.textData.text,t.setAttribute("fill",this.data.textData.fillColor),t.setAttribute("x","0"),t.setAttribute("y",this.data.textData.height-(this.data.textData.fontSize-this.data.textData.height)/2),this.svgElem.setAttribute("width",this.data.textData.width),this.svgElem.setAttribute("height",this.data.textData.height),this.svgElem.style.transform="translate("+this.data.textData.xOffset+"px,"+this.data.textData.yOffset+"px)",this.svgElem.style["-webkit-transform"]="translate("+this.data.textData.xOffset+"px,"+this.data.textData.yOffset+"px)",t.setAttribute("font-size",this.data.textData.fontSize),t.setAttribute("font-family","Arial, sans-serif"),this.svgElem.appendChild(t),this.parent.createElements.call(this),this.anchorElement.appendChild(this.svgElem),this.maskingGroup=this.svgElem,this.maskedElement=t},CVBaseElement.prototype.init=function(){this.createElements(),this.data.hasMask&&this.addMasks(this.data),this.data.eff&&this.createEffectsManager(this.data)},CVBaseElement.prototype.createElements=function(){},CVBaseElement.prototype.prepareFrame=function(t){return this.data.inPoint-this.data.startTime<=t&&this.data.outPoint-this.data.startTime>t?(this.renderFrame=!0,this.currentAnimData=this.data.renderedData[t].an,void(this.data.hasMask&&this.maskManager.prepareFrame(t))):(this.renderFrame=!1,this.currentAnimData=this.data.renderedData[t].an,!1)},CVBaseElement.prototype.draw=function(t){if(t!==!1&&this.renderer.canvasContext.save(),!this.renderFrame)return!1;var e,a=this.renderer.canvasContext;if(this.data.parentHierarchy){var r,i,n=this.data.parentHierarchy.length;for(r=n-1;r>=0;r-=1)i=this.data.parentHierarchy[r].element.getCurrentAnimData(),e=i.matrixArray,a.transform(e[0],e[1],e[2],e[3],e[4],e[5]),a.translate(-i.tr.a[0],-i.tr.a[1])}a.globalAlpha=a.globalAlpha*this.currentAnimData.tr.o,e=this.currentAnimData.matrixArray,a.transform(e[0],e[1],e[2],e[3],e[4],e[5]),a.translate(-this.currentAnimData.tr.a[0],-this.currentAnimData.tr.a[1]),this.data.hasMask&&this.maskManager.draw(),t!==!1&&this.renderer.canvasContext.restore()},CVBaseElement.prototype.getCurrentAnimData=function(){return this.currentAnimData},CVBaseElement.prototype.addMasks=function(t){var e={data:{value:t},element:{value:this}};this.maskManager=createElement(CVMaskElement,null,e)},CVBaseElement.prototype.createEffectsManager=function(t){var e={effects:{value:t.eff},element:{value:this}};this.effectsManager=createElement(EffectsManager,null,e)},CVBaseElement.prototype.getType=function(){return this.type},CVBaseElement.prototype.getLayerSize=function(){return"TextLayer"==this.data.type?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},createElement(CVBaseElement,CVCompElement),CVCompElement.prototype.prepareFrame=function(t){var e=this.parent.prepareFrame.call(this,t);if(e!==!1){var a,r=this.layers.length,i=this.data.tm?this.data.tm[t]<0?0:this.data.tm[t]:t;for(a=0;r>a;a+=1)this.layers[a].element.prepareFrame(i-this.layers[a].startTime)}},CVCompElement.prototype.draw=function(){if(this.renderer.canvasContext.save(),this.parent.draw.call(this,!1)===!1)return void this.renderer.canvasContext.restore();var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.layers[t].element.draw();this.renderer.canvasContext.restore()},createElement(CVBaseElement,CVImageElement),CVImageElement.prototype.createElements=function(){var t=this,e=function(){t.animationItem.elementLoaded()};this.img=new Image,this.img.addEventListener("load",e,!1),this.img.src=this.path+this.assets[this.data.assetId].path,this.parent.createElements.call(this)},CVImageElement.prototype.draw=function(){if(this.renderer.canvasContext.save(),this.parent.draw.call(this,!1)===!1)return void this.renderer.canvasContext.restore();var t=this.renderer.canvasContext;t.drawImage(this.img,0,0),this.renderer.canvasContext.restore()},createElement(CVBaseElement,CVShapeElement),CVShapeElement.prototype.createElements=function(){this.parent.createElements.call(this);var t,e,a=this.data.shapes.length;for(t=a-1;t>=0;t--)this.data.trim&&(this.data.shapes[t].trim=this.data.trim),e=new CVShapeItemElement(this.data.shapes[t],this.renderer),this.shapes.push(e)},CVShapeElement.prototype.prepareFrame=function(t){var e=this.parent.prepareFrame.call(this,t);if(e!==!1){var a,r=this.data.shapes.length;for(a=r-1;a>=0;a--)this.shapes[r-1-a].prepareFrame(t)}},CVShapeElement.prototype.draw=function(){return this.renderer.canvasContext.save(),this.parent.draw.call(this,!1)===!1?void this.renderer.canvasContext.restore():(this.drawShapes(),void this.renderer.canvasContext.restore())},CVShapeElement.prototype.drawShapes=function(){var t,e=this.data.shapes.length;for(t=e-1;t>=0;t--)this.shapes[e-1-t].renderShape()},CVShapeItemElement.prototype.adjustTrim=function(){var t,e=this.data.trim,a=e.length;for(t=0;a>t;t+=1)e[t].o&&(e[t].o-=90)},CVShapeItemElement.prototype.renderShape=function(){if(""!==this.data.type){var t=this.frameNum;this.currentData=this.data.renderedData[t];var e=this.renderer.canvasContext,a=this.renderTransform(t);"pathShape"==this.data.type?this.data.trim?this.renderTrimPath(t):this.renderPath(t):"rectShape"==this.data.type?this.renderRect(t):"ellipseShape"==this.data.type&&(this.pathLength=this.renderEllipse(t)),this.renderFill(t),this.renderStroke(t),this.renderer.canvasContext.lineCap="round",this.renderer.canvasContext.lineJoin="round",this.renderedPaths[t]?supportsPath2D?(this.renderer.canvasContext.fill(this.renderedPaths[t]),this.renderer.canvasContext.stroke(this.renderedPaths[t])):(this.renderedPaths[t].drawToContext(this.renderer.canvasContext),this.renderer.canvasContext.fill(),this.renderer.canvasContext.stroke()):(this.renderer.canvasContext.fill(),this.renderer.canvasContext.stroke()),a&&e.restore()}},CVShapeItemElement.prototype.prepareFrame=function(t){this.frameNum=t},CVShapeItemElement.prototype.renderTransform=function(){var t=this.currentData;if(t.tr){var e=!1,a=this.renderer.canvasContext,r=t.tr,i=r.mtArr;return(1!==i[0]||0!==i[1]||0!==i[2]||1!==i[3]||0!==i[4]||0!==i[5])&&(a.save(),a.transform(i[0],i[1],i[2],i[3],i[4],i[5]),e=!0),(0!=r.a[0]||0!=r.a[1])&&(e||(a.save(),e=!0),a.translate(-r.a[0],-r.a[1])),r.o<1&&(e||(a.save(),e=!0),a.globalAlpha*=r.o),e}},CVShapeItemElement.prototype.addToTrim=function(t,e,a){this.trims[t]||this.trims.push({}),this.trims[t].s=e,this.trims[t].e=a,this.trims[t].ended=!1},CVShapeItemElement.prototype.renderTrimPath=function(t){var e=this.currentData.trim;if(e.e!=e.s&&!this.renderedPaths[t]){var a,r=new Path2D,i=this.currentData.path,n=i.pathNodes,s=[],o=0,h=n.v.length;for(a=0;h-1>a;a+=1)s.push(bez.drawBezierCurve(n.v[a],n.v[a+1],n.o[a],n.i[a+1])),o+=s[a].segmentLength;i.closed&&(s.push(bez.drawBezierCurve(n.v[a],n.v[0],n.o[a],n.i[0])),o+=s[a].segmentLength),h=s.length;var p=o*(e.e-e.s)/100;e.o=e.o%360,e.o<0&&(e.o+=360);var m=(e.s/100+e.o/360)%1*o,l=0;if(m+p-o>1e-5){var d=m+p-o;this.addToTrim(0,m,m+p-d),this.addToTrim(1,0,m+p-o),l+=2}else this.addToTrim(0,m,m+p),l+=1;var c,u,f,y,g,v=0,x=!1,E=this.trims.length;for(a=0;h>a&&!x;a+=1){for(u=s[a].points.length,y=!0,g=0;E>g;g+=1)v+s[a].segmentLength>this.trims[g].s&&(y=!1);if(y)v+=s[a].segmentLength;else{var C,b;for(c=0;u-1>c&&!x;c+=1)for(E=this.trims.length,C=s[a].points[c],b=s[a].points[c+1],v+=C.partialLength,g=0;E>g;g+=1)if(!this.trims[g].ended)if(this.trims[g].s>=v&&this.trims[g].s<v+b.partialLength&&(f=(this.trims[g].s-v)/b.partialLength,r.moveTo(C.point[0]+(b.point[0]-C.point[0])*f,C.point[1]+(b.point[1]-C.point[1])*f)),this.trims[g].e>v&&this.trims[g].e<=v+b.partialLength){if(f=(this.trims[g].e-v)/b.partialLength,r.lineTo(C.point[0]+(b.point[0]-C.point[0])*f,C.point[1]+(b.point[1]-C.point[1])*f),l-=1,this.trims[g].ended=!0,0==l){x=!0;break}}else v>this.trims[g].s&&v<this.trims[g].e&&r.lineTo(C.point[0],C.point[1]);this.renderedPaths[t]=r}}}},CVShapeItemElement.prototype.renderPath=function(t){var e=this.currentData,a=e.path;if(!this.renderedPaths[t]){var r=new Path2D,i=this.renderer.canvasContext,n=a.pathNodes;n instanceof Array&&(n=n[0]);var s,o=n.i.length;for(i.beginPath(),r.moveTo(n.v[0][0],n.v[0][1]),s=1;o>s;s+=1)r.bezierCurveTo(n.o[s-1][0],n.o[s-1][1],n.i[s][0],n.i[s][1],n.v[s][0],n.v[s][1]);a.closed&&r.bezierCurveTo(n.o[s-1][0],n.o[s-1][1],n.i[0][0],n.i[0][1],n.v[0][0],n.v[0][1]),this.renderedPaths[t]=r}},CVShapeItemElement.prototype.renderEllipse=function(){var t=this.currentData.ell,e=this.renderer.canvasContext;e.beginPath(),e.ellipse(t.p[0],t.p[1],t.size[0]/2,t.size[1]/2,0,0,2*Math.PI,!0),e.closePath()},CVShapeItemElement.prototype.renderRect=function(){var t=this.currentData.rect,e=t.roundness,a=this.renderer.canvasContext;if(a.beginPath(),0==e)a.rect(t.position[0]-t.size[0]/2,t.position[1]-t.size[1]/2,t.size[0],t.size[1]);else{var r=t.position[0]-t.size[0]/2,i=t.position[1]-t.size[1]/2,n=t.size[0],s=t.size[1];e instanceof Array&&(e=e[0]),a.moveTo(r+e,i),a.lineTo(r+n-e,i),a.quadraticCurveTo(r+n,i,r+n,i+e),a.lineTo(r+n,i+s-e),a.quadraticCurveTo(r+n,i+s,r+n-e,i+s),a.lineTo(r+e,i+s),a.quadraticCurveTo(r,i+s,r,i+s-e),a.lineTo(r,i+e),a.quadraticCurveTo(r,i,r+e,i)}},CVShapeItemElement.prototype.renderFill=function(){var t=this.currentData;if(t.fill){var e=t.fill;if(this.data.fillEnabled!==!1)return void(this.renderer.canvasContext.fillStyle=e.opacity<1?fillColorToString(e.color,e.opacity):fillColorToString(e.color))}this.renderer.canvasContext.fillStyle="rgba(0,0,0,0)"},CVShapeItemElement.prototype.renderStroke=function(){var t=this.currentData;if(t.stroke){var e=t.stroke;if(this.renderer.canvasContext.lineWidth=e.width,this.data.strokeEnabled!==!1)return void(this.renderer.canvasContext.strokeStyle=e.opacity<1?fillColorToString(e.color,e.opacity):fillColorToString(e.color))}this.renderer.canvasContext.strokeStyle="rgba(0,0,0,0)"},createElement(CVBaseElement,CVSolidElement),CVSolidElement.prototype.draw=function(){if(this.renderer.canvasContext.save(),this.parent.draw.call(this,!1)===!1)return void this.renderer.canvasContext.restore();var t=this.renderer.canvasContext;t.fillStyle=this.data.color,t.fillRect(0,0,this.data.width,this.data.height),this.renderer.canvasContext.restore()},createElement(CVBaseElement,CVTextElement),CVTextElement.prototype.createElements=function(){this.svgElem=document.createElementNS(svgNS,"g");var t=document.createElementNS(svgNS,"text");t.textContent=this.data.textData.text,t.setAttribute("fill",this.data.textData.fillColor),t.setAttribute("x","0"),t.setAttribute("y",this.data.textData.height-(this.data.textData.fontSize-this.data.textData.height)/2),this.svgElem.setAttribute("width",this.data.textData.width),this.svgElem.setAttribute("height",this.data.textData.height),this.svgElem.style.transform="translate("+this.data.textData.xOffset+"px,"+this.data.textData.yOffset+"px)",this.svgElem.style["-webkit-transform"]="translate("+this.data.textData.xOffset+"px,"+this.data.textData.yOffset+"px)",t.setAttribute("font-size",this.data.textData.fontSize),t.setAttribute("font-family","Arial, sans-serif"),this.svgElem.appendChild(t),this.parent.createElements.call(this),this.anchorElement.appendChild(this.svgElem),this.maskingGroup=this.svgElem,this.maskedElement=t},CVMaskElement.prototype.init=function(){this.registeredEffects=[],this.masksProperties=this.data.masksProperties,this.totalMasks=this.masksProperties.length,this.ctx=this.element.renderer.canvasContext,this.layerSize=this.element.getLayerSize()},CVMaskElement.prototype.prepareFrame=function(t){this.frameNum=t},CVMaskElement.prototype.draw=function(){var t,e=this.data.masksProperties.length;for(this.ctx.beginPath(),t=0;e>t;t++)this.masksProperties[t].inv?this.createInvertedMask(this.masksProperties[t],this.frameNum):this.drawShape(this.ctx,this.data.masksProperties[t].paths[this.frameNum].pathNodes);this.ctx.closePath(),this.ctx.clip()},CVMaskElement.prototype.drawShape=function(t,e){var a,r=e.v.length;for(t.moveTo(e.v[0][0],e.v[0][1]),a=1;r>a;a++)t.bezierCurveTo(e.o[a-1][0],e.o[a-1][1],e.i[a][0],e.i[a][1],e.v[a][0],e.v[a][1]);t.bezierCurveTo(e.o[a-1][0],e.o[a-1][1],e.i[0][0],e.i[0][1],e.v[0][0],e.v[0][1])},CVMaskElement.prototype.createInvertedMask=function(){};var animationManager=function(){function t(t){if(!t)return null;for(var e=0;v>e;){if(f[e].elem==t&&null!==f[e].elem)return f[e].animation;e+=1}var a=new AnimationItem;return a.setData(t),f.push({elem:t,animation:a}),v+=1,a}function e(t){var e=new AnimationItem;return e.setParams(t),f.push({elem:null,animation:e}),v+=1,e}function a(t,e){var a;for(a=0;v>a;a+=1)f[a].animation.setSpeed(t,e)}function r(t,e){var a;for(a=0;v>a;a+=1)f[a].animation.setDirection(t,e)}function i(t){var e;for(e=0;v>e;e+=1)f[e].animation.play(t)}function n(t,e){g=!1,y=Date.now();var a;for(a=0;v>a;a+=1)f[a].animation.moveFrame(t,e)}function s(){var t,e=Date.now(),a=e-y;for(t=0;v>t;t+=1)f[t].animation.advanceTime(a);y=e,requestAnimationFrame(s)}function o(t){var e;for(e=0;v>e;e+=1)f[e].animation.pause(t)}function h(t,e,a){var r;for(r=0;v>r;r+=1)f[r].animation.goToAndStop(t,e,a)}function p(t){var e;for(e=0;v>e;e+=1)f[e].animation.stop(t)}function m(t){var e;for(e=0;v>e;e+=1)f[e].animation.togglePause(t)}function l(){var e=document.getElementsByClassName("bodymovin");Array.prototype.forEach.call(e,t)}function d(){var t;for(t=0;v>t;t+=1)f[t].animation.resize()}function c(){y=Date.now(),requestAnimationFrame(s)}var u={},f=[],y=0,g=!0,v=0;return setTimeout(c,0),u.registerAnimation=t,u.loadAnimation=e,u.setSpeed=a,u.setDirection=r,u.play=i,u.moveFrame=n,u.pause=o,u.stop=p,u.togglePause=m,u.searchAnimations=l,u.resize=d,u.start=c,u.goToAndStop=h,u}(),AnimationItem=function(){this.name="",this.path="",this.isLoaded=!1,this.currentFrame=0,this.currentRawFrame=0,this.totalFrames=0,this.frameRate=0,this.frameMult=0,this.playSpeed=1,this.playDirection=1,this.pendingElements=0,this.playCount=0,this.prerenderFramesFlag=!0,this.repeat="indefinite",this.animationData={},this.layers=[],this.assets=[],this.isPaused=!0,this.isScrolling=!1,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=randomString(10),this.renderedFrameCount=0,this.scaleMode="fit",this.math=Math};AnimationItem.prototype.setParams=function(t){var e=this;t.context&&(this.context=t.context),t.wrapper&&(this.wrapper=t.wrapper);var a=t.animType?t.animType:"canvas";switch(a){case"canvas":this.renderer=new CanvasRenderer(this,t.renderer);break;case"svg":this.renderer=new SVGRenderer(this,t.renderer)}if(this.animType=a,""===t.loop||null===t.loop||(this.loop=t.loop===!1?!1:t.loop===!0?!0:parseInt(t.loop)),this.autoplay="autoplay"in t?t.autoplay:!0,this.name=t.name?t.name:"",this.prerenderFramesFlag="prerender"in t?t.prerender:!0,t.animationData)e.configAnimation(t.animationData);else if(t.path){"json"!=t.path.substr(-4)&&("/"!=t.path.substr(-1,1)&&(t.path+="/"),t.path+="data.json");var r=new XMLHttpRequest;this.path=t.path.substr(0,t.path.lastIndexOf("/")+1),r.open("GET",t.path,!0),r.send(),r.onreadystatechange=function(){if(4==r.readyState)if(200==r.status)e.configAnimation(JSON.parse(r.responseText));else try{var t=JSON.parse(r.responseText);e.configAnimation(t)}catch(a){}}}},AnimationItem.prototype.setData=function(t){var e={wrapper:t},a=t.attributes;e.path=a.getNamedItem("data-animation-path")?a.getNamedItem("data-animation-path").value:a.getNamedItem("data-bm-path")?a.getNamedItem("data-bm-path").value:a.getNamedItem("bm-path")?a.getNamedItem("bm-path").value:"",e.animType=a.getNamedItem("data-anim-type")?a.getNamedItem("data-anim-type").value:a.getNamedItem("data-bm-type")?a.getNamedItem("data-bm-type").value:a.getNamedItem("bm-type")?a.getNamedItem("bm-type").value:"canvas";var r=a.getNamedItem("data-anim-loop")?a.getNamedItem("data-anim-loop").value:a.getNamedItem("data-bm-loop")?a.getNamedItem("data-bm-loop").value:a.getNamedItem("bm-loop")?a.getNamedItem("bm-loop").value:"";""==r||(e.loop="false"===r?!1:"true"===r?!0:parseInt(r)),e.name=a.getNamedItem("data-name")?a.getNamedItem("data-name").value:a.getNamedItem("data-bm-name")?a.getNamedItem("data-bm-name").value:a.getNamedItem("bm-name")?a.getNamedItem("bm-name").value:"";var i=a.getNamedItem("data-anim-prerender")?a.getNamedItem("data-anim-prerender").value:a.getNamedItem("data-bm-prerender")?a.getNamedItem("data-bm-prerender").value:a.getNamedItem("bm-prerender")?a.getNamedItem("bm-prerender").value:"";"false"===i&&(e.prerender=!1),this.setParams(e)},AnimationItem.prototype.configAnimation=function(t){this.renderer.configAnimation(t),this.animationData=t,this.animationData._id=this.animationID,this.animationData._animType=this.animType,this.layers=this.animationData.animation.layers,this.assets=this.animationData.assets,this.totalFrames=this.animationData.animation.totalFrames,this.frameRate=this.animationData.animation.frameRate,this.frameMult=this.animationData.animation.frameRate/1e3,dataManager.completeData(this.animationData),this.renderer.buildItems(this.animationData.animation.layers),this.updaFrameModifier(),this.checkLoaded()
},AnimationItem.prototype.elementLoaded=function(){this.pendingElements--,this.checkLoaded()},AnimationItem.prototype.checkLoaded=function(){this.renderer.buildStage(this.container,this.layers),0==this.pendingElements&&(this.prerenderFramesFlag?(this.prerenderFrames(0),dataManager.renderFrame(this.animationID,this.currentFrame),this.renderer.renderFrame(this.currentFrame)):(this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play()))},AnimationItem.prototype.prerenderFrames=function(t){t||(t=0),this.renderedFrameCount===this.totalFrames?(this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play()):(dataManager.renderFrame(this.animationID,this.renderedFrameCount),this.renderedFrameCount+=1,t>5?setTimeout(this.prerenderFrames.bind(this),0):(t+=1,this.prerenderFrames(t)))},AnimationItem.prototype.resize=function(){this.renderer.updateContainerSize()},AnimationItem.prototype.gotoFrame=function(){this.currentFrame=subframeEnabled?this.math.round(100*this.currentRawFrame)/100:this.math.floor(this.currentRawFrame),this.renderFrame()},AnimationItem.prototype.renderFrame=function(){this.isLoaded!==!1&&(dataManager.renderFrame(this.animationID,this.currentFrame),this.renderer.renderFrame(this.currentFrame))},AnimationItem.prototype.play=function(t){t&&this.name!=t||this.isPaused===!0&&(this.isPaused=!1)},AnimationItem.prototype.pause=function(t){t&&this.name!=t||this.isPaused===!1&&(this.isPaused=!0)},AnimationItem.prototype.togglePause=function(t){t&&this.name!=t||(this.isPaused===!0?(this.isPaused=!1,this.play()):(this.isPaused=!0,this.pause()))},AnimationItem.prototype.stop=function(t){t&&this.name!=t||(this.isPaused=!0,this.currentFrame=this.currentRawFrame=0,this.playCount=0,this.gotoFrame())},AnimationItem.prototype.goToAndStop=function(t,e,a){a&&this.name!=a||(this.setCurrentRawFrameValue(e?t:t*this.frameModifier),this.isPaused=!0)},AnimationItem.prototype.advanceTime=function(t){this.isPaused!==!0&&this.isScrolling!==!0&&this.isLoaded!==!1&&this.setCurrentRawFrameValue(this.currentRawFrame+t*this.frameModifier)},AnimationItem.prototype.updateAnimation=function(t){this.setCurrentRawFrameValue(this.totalFrames*t)},AnimationItem.prototype.moveFrame=function(t,e){e&&this.name!=e||this.setCurrentRawFrameValue(this.currentRawFrame+t)},AnimationItem.prototype.setCurrentRawFrameValue=function(t){if(this.currentRawFrame=t,this.currentRawFrame>=this.totalFrames){if(this.loop===!1)return this.currentRawFrame=this.totalFrames-1,this.gotoFrame(),void this.pause();if(this.playCount+=1,this.loop!==!0&&this.playCount==this.loop)return this.currentRawFrame=this.totalFrames-1,this.gotoFrame(),void this.pause()}else if(this.currentRawFrame<0)return this.playCount-=1,this.playCount<0&&(this.playCount=0),this.loop===!1?(this.currentRawFrame=0,this.gotoFrame(),void this.pause()):(this.currentRawFrame=this.totalFrames+this.currentRawFrame,void this.gotoFrame());this.currentRawFrame=this.currentRawFrame%this.totalFrames,this.gotoFrame()},AnimationItem.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},AnimationItem.prototype.setDirection=function(t){this.playDirection=0>t?-1:1,this.updaFrameModifier()},AnimationItem.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},AnimationItem.prototype.getPath=function(){return this.path},AnimationItem.prototype.getAssets=function(){return this.assets},function(t){function e(t){animationManager.play(t)}function a(t){animationManager.pause(t)}function r(t){animationManager.togglePause(t)}function i(t,e){animationManager.setSpeed(t,e)}function n(t,e){animationManager.setDirection(t,e)}function s(t){animationManager.stop(t)}function o(t){animationManager.moveFrame(t)}function h(){animationManager.searchAnimations()}function p(t){return animationManager.registerAnimation(t)}function m(){animationManager.resize()}function l(){animationManager.start()}function d(t,e,a){animationManager.goToAndStop(t,e,a)}function c(t){subframeEnabled=t}function u(t){return animationManager.loadAnimation(t)}function f(){"complete"===document.readyState&&(clearInterval(g),h())}var y={};y.play=e,y.pause=a,y.togglePause=r,y.setSpeed=i,y.setDirection=n,y.stop=s,y.moveFrame=o,y.searchAnimations=h,y.registerAnimation=p,y.loadAnimation=u,y.setSubframeRendering=c,y.resize=m,y.start=l,y.goToAndStop=d,y.checkReady=f,t.bodymovin=y;var g=setInterval(f,100)}(window);}(window));