diff --git a/build/player/bodymovin.js b/build/player/bodymovin.js
index 2b6ff2a..156661e 100644
--- a/build/player/bodymovin.js
+++ b/build/player/bodymovin.js
@@ -1,3 +1,3 @@
-(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=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 y;i.__fnct?y=i.__fnct:(y=bez.getEasingCurve(i.o.x,i.o.y,i.i.x,i.i.y,i.n),i.__fnct=y),u=y("",e-(i.t-a),0,1,n.t-a-(i.t-a));var g,v=o.segmentLength*u,x=0;for(m=1,l=!0,jLen=o.points.length;l;){if(x+=o.points[f].partialLength*m,0==v||0==u){"p"==r.type?(E.px=o.points[f].point[0],E.py=o.points[f].point[1]):"s"==r.type?(E.sx=o.points[f].point[0],E.sy=o.points[f].point[1]):"r"==r.type?E.r=o.points[f].point[0]:s=o.points[f].point;break}if(f==o.points.length-1){"p"==r.type?(E.px=o.points[f].point[0],E.py=o.points[f].point[1]):"s"==r.type?(E.sx=o.points[f].point[0],E.sy=o.points[f].point[1]):"r"==r.type?E.r=o.points[f].point[0]:s=o.points[f].point;break}if(v>x&&v<x+o.points[f+1].partialLength){if(g=(v-x)/o.points[f+1].partialLength,"p"==r.type)E.px=o.points[f].point[0]+(o.points[f+1].point[0]-o.points[f].point[0])*g,E.py=o.points[f].point[1]+(o.points[f+1].point[1]-o.points[f].point[1])*g;else if("s"==r.type)E.sx=o.points[f].point[0]+(o.points[f+1].point[0]-o.points[f].point[0])*g,E.sy=o.points[f].point[1]+(o.points[f+1].point[1]-o.points[f].point[1])*g;else if("r"==r.type)E.r=o.points[f].point[0]+(o.points[f+1].point[0]-o.points[f].point[0])*g;else for(c=o.points[f].point.length,d=0;c>d;d+=1)s.push(o.points[f].point[d]+(o.points[f+1].point[d]-o.points[f].point[d])*g);break}f<jLen-1&&1==m||f>0&&-1==m?f+=m:l=!1}}else{var C,b,F,S,A=!1;for(p=i.s.length,h=0;p>h;h+=1){if(1!==i.h){i.o.x instanceof Array?(A=!0,C=i.o.x[h]?i.o.x[h]:i.o.x[0],b=i.o.y[h]?i.o.y[h]:i.o.y[0],F=i.i.x[h]?i.i.x[h]:i.i.x[0],S=i.i.y[h]?i.i.y[h]:i.i.y[0],i.__fnct||(i.__fnct=[])):(A=!1,C=i.o.x,b=i.o.y,F=i.i.x,S=i.i.y);var y;A?i.__fnct[h]?y=i.__fnct[h]:(y=bez.getEasingCurve(C,b,F,S),i.__fnct[h]=y):i.__fnct?y=i.__fnct:(y=bez.getEasingCurve(C,b,F,S),i.__fnct=y),u=y("",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()
+(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));
\ No newline at end of file
diff --git a/player/js/utils/DataManager.js b/player/js/utils/DataManager.js
index 78bf90e..23d0c30 100644
--- a/player/js/utils/DataManager.js
+++ b/player/js/utils/DataManager.js
@@ -447,7 +447,7 @@
             bez.buildBezierData(keyData);
         }
         var k, kLen;
-        var perc, j = 0;
+        var perc,jLen, j = 0;
         if(interpolatedParams.type == 'default'){
             propertyArray = [];
         }
