(function(window){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,i,s,r,n,o,h){var l,p,m,d,c,u,f;return l=$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]]),p=$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]]),m=$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([[i,0,0,0],[0,s,0,0],[0,0,r,0],[0,0,0,1]]),u=l.x(p).x(m).x(c),u=u.transpose(),f=$M([[1,0,0,0],[0,1,0,0],[0,0,1,0],[n,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,i,s,r){return t.reset().translate(s,r).rotate(e).scale(a,i).toCSS()},i=function(e,a,i,s,r){return t.reset().translate(s,r).rotate(e).scale(a,i).toArray()},s=function(t){return a(t.r,t.s[0],t.s[1],t.p[0],t.p[1])},r=function(t,i){return i?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])},n=function(t,i){return i?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:i(t.r[2],t.s[0],t.s[1],t.p[0],t.p[1])};return{get2DMatrix:s,getMatrix:r,getMatrix2:n,getMatrixArray:o,getMatrixArrayFromParams:i,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,i="";for(a=t;a>0;--a)i+=e[Math.round(Math.random()*(e.length-1))];return i}function componentToHex(t){var e=t.toString(16);return 1==e.length?"0"+e:e}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 createElement(t,e,a){if(!e){var i=Object.create(t.prototype,a),s={};return i&&"[object Function]"===s.toString.call(i.init)&&i.init(),i}e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.prototype.parent=t.prototype}function defineDescriptor(t,e,a,i){var s={writable:!1,configurable:!1,enumerable:!1,value:a};if(i)for(var r in i)s[r]=i[r];var n={};t&&"[object Function]"===n.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,s)}function defineAccessor(t,e,a){var i,s={enumerable:!1,configurable:!1,get:function(){return i},set:function(t){i=t}};if(a)for(var r in a)s[r]=a[r];var n={};t&&"[object Function]"===n.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,s)}function bezFunction(){function t(t,e,a,i,s,r){return o.abs((a-t)*(r-e)-(s-t)*(i-e))<1e-5}function e(t){return n[t].fnc}function a(t,e,a,i,s){if(s||(s=("bez_"+t+"_"+e+"_"+a+"_"+i).replace(/\./g,"p")),n[s])return n[s];var r,o,h,l,p,m;return n[s]=function(s,n,d,c,u){var f=n/u;s=f;for(var y,g=0;++g<14&&(h=3*t,o=3*(a-t)-h,r=1-h-o,y=s*(h+s*(o+s*r))-f,!(Math.abs(y)<.001));)s-=y/(h+s*(2*o+3*r*s));m=3*e,p=3*(i-e)-m,l=1-m-p;var v=s*(m+s*(p+s*l));return c*v+d},n[s]}function i(e){var a,i,s,r,n,o,h,l=e.s,p=e.e,m=e.to,d=e.ti,c=500,u=0,f=null,y={points:[],segmentLength:0};for((l[0]!=p[0]||l[1]!=p[1])&&t(l[0],l[1],p[0],p[1],l[0]+m[0],l[1]+m[1])&&t(l[0],l[1],p[0],p[1],p[0]+d[0],p[1]+d[1])&&(c=2),s=m.length,a=0;c>a;a+=1){for(h=[],n=a/(c-1),o=0,i=0;s>i;i+=1)r=Math.pow(1-n,3)*l[i]+3*Math.pow(1-n,2)*n*(l[i]+m[i])+3*(1-n)*Math.pow(n,2)*(p[i]+d[i])+Math.pow(n,3)*p[i],h.push(r),null!==f&&(o+=Math.pow(h[i]-f[i],2));o=Math.sqrt(o),u+=o,y.points.push({partialLength:o,cumulatedLength:u,point:h}),f=h}y.segmentLength=u,e.bezierData=y}function s(t,e){var a=e.segments,i=a.length,s=Math.floor((i-1)*t),r=t*e.addedLength,n=0;if(r==a[s].l)return a[s].p;for(var o=a[s].l>r?-1:1,h=!0;h;)a[s].l<=r&&a[s+1].l>r?(n=(r-a[s].l)/(a[s+1].l-a[s].l),h=!1):s+=o,(0>s||s>=i-1)&&(h=!1);return a[s].p+(a[s+1].p-a[s].p)*n}function r(t,e,a,i,r,n,o){var h={pt1:[],pt2:[],pt3:[],pt4:[]};r=0>r?0:r;var l=s(r,o);n=n>1?1:n;var p,m=s(n,o),d=t.length,c=1-l,u=1-m,f=[],y=[],g=[],v=[];for(p=0;d>p;p+=1)f[p]=c*c*c*t[p]+(l*c*c+c*l*c+c*c*l)*a[p]+(l*l*c+c*l*l+l*c*l)*i[p]+l*l*l*e[p],y[p]=c*c*u*t[p]+(l*c*u+c*l*u+c*c*m)*a[p]+(l*l*u+c*l*m+l*c*m)*i[p]+l*l*m*e[p],g[p]=c*u*u*t[p]+(l*u*u+c*m*u+c*u*m)*a[p]+(l*m*u+c*m*m+l*u*m)*i[p]+l*m*m*e[p],v[p]=u*u*u*t[p]+(m*u*u+u*m*u+u*u*m)*a[p]+(m*m*u+u*m*m+m*u*m)*i[p]+m*m*m*e[p];return h.pt1=f,h.pt2=v,h.pt3=y,h.pt4=g,h}var n=[],o=Math,h=function(){var e={};return function(a,i,s,r){var n=(a.join("_")+"_"+i.join("_")+"_"+s.join("_")+"_"+r.join("_")).replace(/\./g,"p");if(e[n])return e[n];var o,h,l,p,m,d,c=100,u=0,f=[],y=[],g={addedLength:0,segments:[]};for((a[0]!=i[0]||a[1]!=i[1])&&t(a[0],a[1],i[0],i[1],s[0],s[1])&&t(a[0],a[1],i[0],i[1],r[0],r[1])&&(c=2),l=s.length,o=0;c>o;o+=1){for(m=o/(c-1),d=0,h=0;l>h;h+=1)p=Math.pow(1-m,3)*a[h]+3*Math.pow(1-m,2)*m*s[h]+3*(1-m)*Math.pow(m,2)*r[h]+Math.pow(m,3)*i[h],f[h]=p,null!==y[h]&&(d+=Math.pow(f[h]-y[h],2)),y[h]=f[h];d&&(d=Math.sqrt(d),u+=d),g.segments.push({l:u,p:m})}return g.addedLength=u,e[n]=g,g}}();return{getEasingCurve:a,getEasingCurveByIndex:e,getBezierLength:h,getNewSegment:r,buildBezierData:i}}function dataFunctionManager(){function t(t,e,a){var i,s=h(t,e,a),r=[];for(i=0;e>i;i+=1)r.push(Math.floor(s[i]*b));return r}function e(t,e){var a,i,s,r=t.length;for(a=0;r>a;a+=1)if(void 0!==t[a].t)if(t[a].s instanceof Array)for(s=t[a].s.length,i=0;s>i;i+=1)t[a].s[i]*=e,void 0!=t[a].e&&(t[a].e[i]*=e);else t[a].s&&(t[a].s*=e,t[a].e&&(t[a].e*=e));else t[a]=t[a]*e}function a(n,h){h||(h=n);var l,p,m,d,c,u,f,y,g,v,x=n.length;for(u=0;x>u;u+=1){if(m=n[u],l=m.outPoint-m.startTime,p=m.startTime,m.layerName=o(m.layerName),m.parent&&(m.parent=o(m.parent)),m.renderedFrame={},m.renderedData={},d=[],c=-1,m.tm&&(m.trmp=m.tm,m.tm=t(m.tm,l,p)),m.ks.o instanceof Array?e(m.ks.o,.01):m.ks.o/=100,m.ks.s instanceof Array?e(m.ks.s,.01):m.ks.s/=100,m.ks.r instanceof Array?e(m.ks.r,D):m.ks.r*=D,m.hasMask){var b=m.masksProperties;for(y=b.length,f=0;y>f;f+=1)if(b[f].pt.i)r(b[f].pt);else for(v=b[f].pt.length,g=0;v>g;g+=1)b[f].pt[g].s&&r(b[f].pt[g].s[0]),b[f].pt[g].e&&r(b[f].pt[g].e[0])}"PreCompLayer"==m.type?m.refId&&!m.layers?m.layers=i(m.refId,h):a(m.layers,h):"ShapeLayer"==m.type&&s(m.shapes)}}function i(t,e,a){a||(a=e);var s,r=e.length;for(s=0;r>s;s+=1){if(e[s].compId==t)return e[s].layers||(e[s].layers=i(e[s].refId,a)),e[s].layers;if("PreCompLayer"==e[s].type){var n=i(t,e[s].layers,a);if(n)return n}}return null}function s(t,a){var i,n,o,h,l=t.length,p=a?a:!1;for(i=l-1;i>=0;i-=1)if(t[i].renderedData=[],"tm"==t[i].ty&&(p=!0),"fl"==t[i].ty||"st"==t[i].ty)t[i].o instanceof Array?e(t[i].o,.01):t[i].o*=.01;else if("sh"==t[i].ty)if(t[i].trimmed=p,t[i].ks.i)r(t[i].ks);else for(o=t[i].ks.length,n=0;o>n;n+=1)t[i].ks[n].s&&(r(t[i].ks[n].s[0]),r(t[i].ks[n].e[0]));else"gr"==t[i].ty?s(t[i].it,p):"tr"==t[i].ty?(h=t[i],h.renderedData=[],h.o instanceof Array?e(h.o,.01):h.o/=100,h.s instanceof Array?e(h.s,.01):h.s/=100,h.r instanceof Array?e(h.r,D):h.r*=D):"rc"==t[i].ty&&(t[i].trimmed=p,t[i].trimmed=!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 n(t){C[t._id]={data:t,renderedFrames:[]},b=t.animation.frameRate,a(t.animation.layers)}function o(t){return t=t.replace(/ /g,"_"),t=t.replace(/-/g,"_"),t=t.replace(/\./g,"_"),t=t.replace(/\//g,"_")}function h(t,e,a){var i,s,r=[];if(!(t instanceof Array)||null===t[0].t)return r.push(t),r;var n,o;r=[];var h,l,p,m=[];s=t.length;var d,c,u;for(i=0;s>i;i+=1)n=t[i],n.t-=a;var f=0,y=0;for(i=0;e>i;i+=1){h=f;for(var g=!1;s-1>h;){if(n=t[h],o=t[h+1],i<n.t&&0===h){for(p=n.s.length,m=[],l=0;p>l;l+=1)m.push(n.s[l]);r.push(m),g=!0,f!=h&&(f=h,y=0);break}if(i>=n.t&&i<o.t){if(m=[],n.to){d=bez.getEasingCurve(n.o.x,n.o.y,n.i.x,n.i.y)("",i-n.t,0,1,o.t-n.t),c=n.bezierData;var v,x,b=c.segmentLength*d;for(l=y;l<c.points.length;){if(0===i||0===b||0===d){m=c.points[l].point,y=l;break}if(l==c.points.length-1)m=c.points[l].point;else if(b>c.points[l].partialLength&&b<c.points[l+1].partialLength){for(v=c.points[l].point.length,x=(b-c.points[l].partialLength)/(c.points[l+1].partialLength-c.points[l].partialLength),u=0;v>u;u+=1)m.push(c.points[l].point[u]+(c.points[l+1].point[u]-c.points[l].point[u])*x);y=l;break}l+=1}}else{var E,C,D,S;n.s.forEach(function(t,e){if(1!==n.h&&(n.o.x instanceof Array?(E=n.o.x[e],C=n.o.y[e],D=n.i.x[e],S=n.i.y[e]):(E=n.o.x,C=n.o.y,D=n.i.x,S=n.i.y),d=bez.getEasingCurve(E,C,D,S)("",i-n.t,0,1,o.t-n.t)),t.i){var a={i:[],o:[],v:[]};t.i.forEach(function(i,s){var r=[],o=[],h=[];i.forEach(function(a,i){1===n.h?(r.push(a),o.push(t.o[s][i]),h.push(t.v[s][i])):(r.push(a+(n.e[e].i[s][i]-a)*d),o.push(t.o[s][i]+(n.e[e].o[s][i]-t.o[s][i])*d),h.push(t.v[s][i]+(n.e[e].v[s][i]-t.v[s][i])*d))}),a.i.push(r),a.o.push(o),a.v.push(h)}),m.push(a)}else m.push(1===n.h?t:t+(n.e[e]-t)*d)})}r.push(m),g=!0,f!=h&&(f=h,y=0);break}h+=1}g===!1&&(n=t[t.length-2],m=[],n.e.forEach(function(t){m.push(t)}),r.push(m))}for(h=r.length;e>h;)r.push(m),h+=1;return r}function l(t,e,a,i){var s,r,n,o,h,l;if(!t.length)return"p"==i.type?(F.px=t,F.py=t):"s"==i.type?(F.sx=t,F.sy=t):"r"==i.type&&(F.r=t),i.toArray?[t]:t;if(void 0===t[0].t)return"p"==i.type?(F.px=t[0],F.py=t[1]):"s"==i.type?(F.sx=t[0],F.sy=t[1]):"r"==i.type&&(F.r=t[0]),t;h=0,l=t.length-1;for(var p=1,m=!0;!(!m||(s=t[h],r=t[h+1],h==l-1&&e>=r.t-a)||r.t-a>e&&1==p);){if(r.t-a<e&&-1==p){h+=1,s=t[h],r=t[h+1];break}l-1>h&&1==p||h>0&&-1==p?h+=p:m=!1}s.to&&!s.bezierData&&bez.buildBezierData(s);var d,c,u,f,y,g=0;if("default"==i.type&&(n=[]),s.to){if(o=s.bezierData,e>=r.t-a)return"p"==i.type?(F.px=o.points[o.points.length-1].point[0],F.py=o.points[o.points.length-1].point[1]):"s"==i.type?(F.sx=o.points[o.points.length-1].point[0],F.sy=o.points[o.points.length-1].point[1]):"r"==i.type&&(F.r=o.points[o.points.length-1].point[0]),o.points[o.points.length-1].point;if(e<s.t-a)return"p"==i.type?(F.px=o.points[0].point[0],F.py=o.points[0].point[1]):"s"==i.type?(F.sx=o.points[0].point[0],F.sy=o.points[0].point[1]):"r"==i.type&&(F.r=o.points[0].point[0]),o.points[0].point;s.__fnct?y=s.__fnct:(y=bez.getEasingCurve(s.o.x,s.o.y,s.i.x,s.i.y,s.n),s.__fnct=y),u=y("",e-(s.t-a),0,1,r.t-a-(s.t-a));var v,x=o.segmentLength*u,b=0;for(p=1,m=!0,f=o.points.length;m;){if(b+=o.points[g].partialLength*p,0===x||0===u){"p"==i.type?(F.px=o.points[g].point[0],F.py=o.points[g].point[1]):"s"==i.type?(F.sx=o.points[g].point[0],F.sy=o.points[g].point[1]):"r"==i.type?F.r=o.points[g].point[0]:n=o.points[g].point;break}if(g==o.points.length-1){"p"==i.type?(F.px=o.points[g].point[0],F.py=o.points[g].point[1]):"s"==i.type?(F.sx=o.points[g].point[0],F.sy=o.points[g].point[1]):"r"==i.type?F.r=o.points[g].point[0]:n=o.points[g].point;break}if(x>b&&x<b+o.points[g+1].partialLength){if(v=(x-b)/o.points[g+1].partialLength,"p"==i.type)F.px=o.points[g].point[0]+(o.points[g+1].point[0]-o.points[g].point[0])*v,F.py=o.points[g].point[1]+(o.points[g+1].point[1]-o.points[g].point[1])*v;else if("s"==i.type)F.sx=o.points[g].point[0]+(o.points[g+1].point[0]-o.points[g].point[0])*v,F.sy=o.points[g].point[1]+(o.points[g+1].point[1]-o.points[g].point[1])*v;else if("r"==i.type)F.r=o.points[g].point[0]+(o.points[g+1].point[0]-o.points[g].point[0])*v;else for(c=o.points[g].point.length,d=0;c>d;d+=1)n.push(o.points[g].point[d]+(o.points[g+1].point[d]-o.points[g].point[d])*v);break}f-1>g&&1==p||g>0&&-1==p?g+=p:m=!1}}else{var E,C,D,S,w=!1;for(l=s.s.length,h=0;l>h;h+=1)1!==s.h&&(s.o.x instanceof Array?(w=!0,E=s.o.x[h]?s.o.x[h]:s.o.x[0],C=s.o.y[h]?s.o.y[h]:s.o.y[0],D=s.i.x[h]?s.i.x[h]:s.i.x[0],S=s.i.y[h]?s.i.y[h]:s.i.y[0],s.__fnct||(s.__fnct=[])):(w=!1,E=s.o.x,C=s.o.y,D=s.i.x,S=s.i.y),w?s.__fnct[h]?y=s.__fnct[h]:(y=bez.getEasingCurve(E,C,D,S),s.__fnct[h]=y):s.__fnct?y=s.__fnct:(y=bez.getEasingCurve(E,C,D,S),s.__fnct=y),u=e>=r.t-a?1:e<s.t-a?0:y("",e-(s.t-a),0,1,r.t-a-(s.t-a))),1===s.h?"p"==i.type?0===h?F.px=s.s[h]:1==h&&(F.py=s.s[h]):"s"==i.type?0===h?F.sx=s.s[h]:1==h&&(F.sy=s.s[h]):"r"==i.type?F.r=s.s[h]:n.push(s.s[h]):"p"==i.type?0===h?F.px=s.s[h]+(s.e[h]-s.s[h])*u:1==h&&(F.py=s.s[h]+(s.e[h]-s.s[h])*u):"s"==i.type?0===h?F.sx=s.s[h]+(s.e[h]-s.s[h])*u:1==h&&(F.sy=s.s[h]+(s.e[h]-s.s[h])*u):"r"==i.type?F.r=s.s[h]+(s.e[h]-s.s[h])*u:n.push(s.s[h]+(s.e[h]-s.s[h])*u)}return n}function p(t,e){if(!t.__lengths){t.__lengths=[],t.__totalLength=0;var a,i=t.v,s=t.o,r=t.i,n=i.length;for(a=0;n-1>a;a+=1)t.__lengths.push(bez.getBezierLength(i[a],i[a+1],s[a],r[a+1])),t.__totalLength+=t.__lengths[a].addedLength;e&&(t.__lengths.push(bez.getBezierLength(i[a],i[0],s[a],r[0])),t.__totalLength+=t.__lengths[a].addedLength)}}function m(t,e,a,i,s,r){var n=r&&r.length>0,o={};o.closed=s?t.cl:t.closed;var h=s?t.pt:t.ks;if(h.v)return n?"svg"==i?o.pathString=w(h,o.closed,r,!0):o.pathNodes=w(h,o.closed,r,!1):"svg"==i?(h.__pathString||(h.__pathString=d(h,o.closed)),o.pathString=h.__pathString):o.pathNodes=h,o;t={i:[],o:[],v:[]};var l,p,m,c,u,f,y,g=[];if(e<h[0].t-a){if(!h.__minValue){for(p=h[0].s[0].i.length,l=0;p>l;l+=1){for(u=[],f=[],y=[],c=h[0].s[0].i[l].length,m=0;c>m;m+=1)u.push(h[0].s[0].i[l][m]),f.push(h[0].s[0].o[l][m]),y.push(h[0].s[0].v[l][m]);t.i.push(u),t.o.push(f),t.v.push(y)}g.push(t),h.__minValue="svg"!=i||n?g[0]:d(g,o.closed)}return n?"svg"==i?o.pathString=w(h.__minValue,o.closed,r,!0):o.pathNodes=w(h.__minValue,o.closed,r,!1):"svg"==i?o.pathString=h.__minValue:o.pathNodes=h.__minValue,o}if(e>h[h.length-1].t-a){if(!h.__maxValue){var v=h.length-2;for(p=h[v].s[0].i.length,l=0;p>l;l+=1){for(u=[],f=[],y=[],c=h[v].s[0].i[l].length,m=0;c>m;m+=1)u.push(h[v].e[0].i[l][m]),f.push(h[v].e[0].o[l][m]),y.push(h[v].e[0].v[l][m]);t.i.push(u),t.o.push(f),t.v.push(y)}g.push(t),h.__maxValue="svg"!=i||n?g[0]:d(g,o.closed)}return n?"svg"==i?o.pathString=w(h.__maxValue,o.closed,r,!0):o.pathNodes=w(h.__maxValue,o.closed,r,!1):"svg"==i?o.pathString=h.__maxValue:o.pathNodes=h.__maxValue,o}for(var x,b,E=0,C=h.length-1,D=1,S=!0;S&&(x=h[E],b=h[E+1],!(b.t-a>e&&1==D));)C-1>E&&1==D||E>0&&-1==D?E+=D:S=!1;var F,I,M,A,P;if(1!==x.h){F=x.o.x,I=x.o.y,M=x.i.x,A=x.i.y;var _;x.__fnct?_=x.__fnct:(_=bez.getEasingCurve(F,I,M,A),x.__fnct=_),P=_("",e-(x.t-a),0,1,b.t-a-(x.t-a)),e>=b.t-a?P=1:e<x.t-a&&(P=0)}if(1===x.h&&x.__hValue)g.push(x.__hValue);else for(t={i:[],o:[],v:[]},p=x.s[0].i.length,l=0;p>l;l+=1){for(u=[],f=[],y=[],c=x.s[0].i[l].length,m=0;c>m;m+=1)1===x.h?(u.push(x.s[0].i[l][m]),f.push(x.s[0].o[l][m]),y.push(x.s[0].v[l][m])):(u.push(x.s[0].i[l][m]+(x.e[0].i[l][m]-x.s[0].i[l][m])*P),f.push(x.s[0].o[l][m]+(x.e[0].o[l][m]-x.s[0].o[l][m])*P),y.push(x.s[0].v[l][m]+(x.e[0].v[l][m]-x.s[0].v[l][m])*P));t.i.push(u),t.o.push(f),t.v.push(y),1===x.h&&(x.__hValue=t),g.push(t)}return n?"svg"==i?o.pathString=w(g[0],o.closed,r,!0):o.pathNodes=w(g[0],o.closed,r,!1):"svg"==i?o.pathString=d(g[0],o.closed):o.pathNodes=g[0],o}function d(t,e){var a,i,s,r,n,o,h="";if(!(t instanceof Array)){for(a=t.v,i=t.o,s=t.i,o=a.length,h+="M"+a[0].join(","),n=1;o>n;n++)h+=" C"+i[n-1].join(",")+" "+s[n].join(",")+" "+a[n].join(",");return e!==!1&&(h+=" C"+i[n-1].join(",")+" "+s[0].join(",")+" "+a[0].join(",")),h}var l,p=t.length;for(h="",l=0;p>l;l+=1){for(r=t[l],a=r.v,i=r.o,s=r.i,o=a.length,h+="M"+a[0].join(","),n=1;o>n;n++)h+=" C"+i[n-1].join(",")+" "+s[n].join(",")+" "+a[n].join(",");e!==!1&&(h+=" C"+i[n-1].join(",")+" "+s[0].join(",")+" "+a[0].join(","))}return h}function c(t,e,a){var i,s,r,n,o,h,p,d,u,y=t.length;for(d=0;y>d;d+=1)if(u=t[d],n=e-u.startTime,!u.an[n]){if(i={},S.arrayFlag=!1,S.type="default",i.a=l(u.ks.a,n,u.startTime,S),i.o=l(u.ks.o,n,u.startTime,S),S.arrayFlag=!1,S.type="p",l(u.ks.p,n,u.startTime,S),S.arrayFlag=!0,S.type="r",l(u.ks.r,n,u.startTime,S),S.arrayFlag=!0,S.type="s",l(u.ks.s,n,u.startTime,S),p={},p.an={tr:i},S.arrayFlag=!1,S.type="default","canvas"==a?p.an.matrixArray=E.getMatrixArrayFromParams(F.r,F.sx,F.sy,F.px,F.py):(p.an.matrixArray=E.getMatrixArrayFromParams(F.r,F.sx,F.sy,F.px,F.py),p.an.matrixValue=E.getMatrix2FromParams(F.r,F.sx,F.sy,F.px,F.py)+"translate("+-i.a[0]+" "+-i.a[1]+")"),u.renderedData[n]=p,u.hasMask)for(s=u.masksProperties,h=s.length,o=0;h>o;o+=1)s[o].paths||(s[o].paths=[],s[o].opacity=[]),s[o].paths[n]=m(s[o],n,u.startTime,a,!0),s[o].opacity[n]=l(s[o].o,n,u.startTime,S),s[o].opacity[n]=s[o].opacity[n]instanceof Array?s[o].opacity[n][0]/100:s[o].opacity[n]/100;e<u.inPoint||e>u.outPoint||("PreCompLayer"==u.type?(r=u.tm?u.tm[n]<0?0:n>=u.tm.length?u.tm[u.tm.length-1]:u.tm[n]:n,void 0===r&&(r=l(u.trmp,n,0,S)[0]*b,u.tm[n]=r),c(u.layers,r,a)):"ShapeLayer"==u.type&&f(u.shapes,n,u.startTime,a))}}function u(t,e,a){var i=[],s=[],r=[],n=a/2;return a*=1,i.push([t[0]+e[0]/2,t[1]-e[1]/2+a]),r.push(i[0]),s.push([t[0]+e[0]/2,t[1]-e[1]/2+n]),i.push([t[0]+e[0]/2,t[1]+e[1]/2-a]),r.push([t[0]+e[0]/2,t[1]+e[1]/2-n]),s.push(i[1]),i.push([t[0]+e[0]/2-a,t[1]+e[1]/2]),r.push(i[2]),s.push([t[0]+e[0]/2-n,t[1]+e[1]/2]),i.push([t[0]-e[0]/2+a,t[1]+e[1]/2]),r.push([t[0]-e[0]/2+n,t[1]+e[1]/2]),s.push(i[3]),i.push([t[0]-e[0]/2,t[1]+e[1]/2-a]),r.push(i[4]),s.push([t[0]-e[0]/2,t[1]+e[1]/2-n]),i.push([t[0]-e[0]/2,t[1]-e[1]/2+a]),r.push([t[0]-e[0]/2,t[1]-e[1]/2+n]),s.push(i[5]),i.push([t[0]-e[0]/2+a,t[1]-e[1]/2]),r.push(i[6]),s.push([t[0]-e[0]/2+n,t[1]-e[1]/2]),i.push([t[0]+e[0]/2-a,t[1]-e[1]/2]),r.push([t[0]+e[0]/2-n,t[1]-e[1]/2]),s.push(i[7]),{v:i,o:r,i:s,c:!0}}function f(t,e,a,i,s){var r,n,o,h,p,d,c,g,v,x,b=t.length;s||(s=[]);var C,D,I,M,A;for(r=b-1;r>=0;r-=1)if(n=t[r],"sh"==n.ty)n.renderedData[e]={path:m(n,e,a,i,!1,s)};else if("fl"==n.ty)o=l(n.c,e,a,S),h=l(n.o,e,a,S),n.renderedData[e]={opacity:h instanceof Array?h[0]:h},"canvas"==i?(y(o),n.renderedData[e].color=o):n.renderedData[e].color=rgbToHex(Math.round(o[0]),Math.round(o[1]),Math.round(o[2]));else if("rc"==n.ty)p=l(n.p,e,a,S),d=l(n.s,e,a,S),c=l(n.r,e,a,S),n.trimmed?(n.renderedData[e]={path:{closed:!0}},"svg"==i?n.renderedData[e].path.pathString=w(u(p,d,c),!0,s,!0):n.renderedData[e].path.pathNodes=w(u(p,d,c),!0,s,!1)):n.renderedData[e]={position:p,size:d,roundness:c};else if("el"==n.ty)p=l(n.p,e,a,S),d=l(n.s,e,a,S),n.renderedData[e]={p:p,size:d};else if("st"==n.ty){if(g=l(n.c,e,a,S),v=l(n.o,e,a,S),x=l(n.w,e,a,S),n.renderedData[e]={opacity:v instanceof Array?v[0]:v,width:x instanceof Array?x[0]:x},n.d){var P=[];A=n.d.length;var _;for(M=0;A>M;M+=1)_=l(n.d[M].v,e,a,S),P.push({v:_ instanceof Array?_[0]:_,n:n.d[M].n});n.renderedData[e].dashes=P}"canvas"==i?(y(g),n.renderedData[e].color=g):n.renderedData[e].color=rgbToHex(Math.round(g[0]),Math.round(g[1]),Math.round(g[2]))}else if("tr"==n.ty)n.renderedData[e]={a:l(n.a,e,a,S),o:l(n.o,e,a,S)},S.arrayFlag=!0,S.type="s",l(n.s,e,a,S),S.arrayFlag=!0,S.type="r",l(n.r,e,a,S),S.arrayFlag=!1,S.type="p",l(n.p,e,a,S),S.arrayFlag=!1,S.type="default","canvas"==i?n.renderedData[e].mtArr=E.getMatrixArrayFromParams(F.r,F.sx,F.sy,F.px,F.py):(n.renderedData[e].mtArr=E.getMatrixArrayFromParams(F.r,F.sx,F.sy,F.px,F.py),n.renderedData[e].mt=E.getMatrix2FromParams(F.r,F.sx,F.sy,F.px,F.py));else if("tm"==n.ty){C=l(n.s,e,a,S),D=l(n.e,e,a,S),I=l(n.o,e,a,S);var k={s:C,e:D,o:I};s.push(k),n.renderedData[e]=k}else"gr"==n.ty&&f(n.it,e,a,i,s)}function y(t){var e,a=t.length;for(e=0;a>e;e+=1)t[e]=Math.round(t[e])}function g(t,e){for(var a=1;a>0;){if(e+=1,e>=t.data.animation.totalFrames){t.renderFinished=!0;break}t.renderedFrames[e]||(v(t.data._id,e),a-=1)}}function v(t,e){return 2==C[t].renderedFrames[e]?void(C[t].renderFinished||g(C[t],e)):(b=C[t].data.animation.frameRate,C[t].renderedFrames[e]=2,void c(C[t].data.animation.layers,e,C[t].data._animType))}function x(t){var e,a=C[t].data,i=a.animation.totalFrames,s=[];for(e=0;i>e;e+=1)s.push({num:e,data:v(t,e)})}var b=0,E=new MatrixManager,C={},D=Math.PI/180,S={arrayFlag:!1},w=function(){function t(t,r,n,p){i[o]=r,e[o+1]=n,a[o+1]=p,h?a[o]=t:(l+=" M"+t.join(","),h=!0,s[o]=t),l+=" C"+r.join(",")+" "+n.join(",")+" "+p.join(","),o+=1}var e,a,i,s,r,n,o,h=!1,l="";return function(m,d,c,u){p(m,d);var f,y=c.length,g=m;for(a=e=i=s=null,f=y-1;f>=0;f-=1){var v=[],x=c[f].o%360/360;if(0!=x||0!=c[f].s||100!=c[f].e){l="",h=!1,e=[],i=[],a=[],s=[],r=[],n=0,0>x&&(x+=1);var b=c[f].s/100+x,E=c[f].e/100+x;if(b==E)return u?"":{};if(b>E){var C=b;b=E,E=C}1>=E?v.push({s:g.__totalLength*b,e:g.__totalLength*E}):b>=1?v.push({s:g.__totalLength*(b-1),e:g.__totalLength*(E-1)}):(v.push({s:g.__totalLength*b,e:g.__totalLength}),v.push({s:0,e:g.__totalLength*(E-1)}));var D,S,w,F=[],I=[],M=[];F=g.v,I=g.o,M=g.i,D=g.__lengths,w=F.length;var A,P,_=0,k=0,T=v.length;for(o=0,A=0;T>A;A+=1){for(_=0,S=1;w>S;S++)if(k=D[S-1].addedLength,_+k<v[A].s)_+=k;else{if(_>v[A].e)break;v[A].s<=_&&v[A].e>=_+k?t(F[S-1],I[S-1],M[S],F[S],D[S-1]):(P=bez.getNewSegment(F[S-1],F[S],I[S-1],M[S],(v[A].s-_)/k,(v[A].e-_)/k,D[S-1]),t(P.pt1,P.pt3,P.pt4,P.pt2)),_+=k}d!==!1?_>v[A].e||(k=D[S-1].addedLength,v[A].s<=_&&v[A].e>=_+k?t(F[S-1],I[S-1],M[0],F[0],D[S-1]):(P=bez.getNewSegment(F[S-1],F[0],I[S-1],M[0],(v[A].s-_)/k,(v[A].e-_)/k,D[S-1]),t(P.pt1,P.pt3,P.pt4,P.pt2))):h=!1}d=!1}}if(a?(F=a,I=i,M=e):(F=g.v,I=g.o,M=g.i,s=[]),w=F.length,u){for(l="",S=1;w>S;S++)s[S-1]?l+="M"+s[S-1].join(","):1==S&&(l+="M"+F[0].join(",")),l+=" C"+I[S-1].join(",")+" "+M[S].join(",")+" "+F[S].join(",");return d!==!1&&(l+=" C"+I[S-1].join(",")+" "+M[0].join(",")+" "+F[0].join(",")),l}return{i:M,o:I,v:F,s:s,c:d}}}(),F={r:0,sx:1,sy:1,px:1,py:1},I={};return I.completeData=n,I.renderFrame=v,I.renderAllFrames=x,I}function SVGRenderer(t){this.animationItem=t,this.layers=null,this.lastFrame=-1,this.globalData={frameNum:-1},this.elements=[]}function CanvasRenderer(t,e){this.animationItem=t,this.renderConfig=e?e:{clearCanvas:!0,context:null,scaleMode:"fit"},this.lastFrame=-1,this.globalData={frameNum:-1},this.elements=[]}function MaskElement(t){this.data=null,this.element=null,this.globalData=t,this.paths=[]}function ICompElement(t,e,a,i){this.parent.constructor.call(this,t,e,a,i),this.layers=t.layers}function IImageElement(t,e,a,i){this.animationItem=e,this.assets=this.animationItem.getAssets(),this.path=this.animationItem.getPath(),this.parent.constructor.call(this,t,e,a,i)}function IShapeElement(t,e,a,i){this.shapes=[],this.parent.constructor.call(this,t,e,a,i)}function ShapeItemElement(t,e,a){this.stylesList=[],this.viewData=[],this.currentMatrix=new Matrix,this.shape=e,this.data=t,this.globalData=a,this.searchShapes(this.data,this.viewData),styleUnselectableDiv(this.shape),this.currentTrim={s:0,e:100,o:0,active:!1}}function ISolidElement(t,e,a,i){this.parent.constructor.call(this,t,e,a,i)}function ITextElement(t,e,a,i){this.parent.constructor.call(this,t,e,a,i)}function CVBaseElement(t,e){this.data=t,this.globalData=e,this.canvasContext=e.canvasContext,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.animationItem=renderer.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,a){this.data=t,this.globalData=a,this.canvasContext=a.canvasContext,this.frameNum=-1,this.dataLength=this.data.length,this.mainFlag=e,this.stylesList=[],this.ownStylesList=[],this.stylesPool=[],this.currentStylePoolPos=0,this.currentMatrix=document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGMatrix(),this.mat=document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGMatrix();var i,s=this.dataLength-1;this.renderedPaths={};var r;for(i=s;i>=0;i-=1)"gr"==this.data[i].ty?this.data[i].item=new CVShapeItemElement(this.data[i].it,!1,this.globalData):("st"==this.data[i].ty||"fl"==this.data[i].ty)&&(r={type:"fill",styleOpacity:0,opacity:0,value:"rgba(0,0,0,0)",closed:!1},"fl"==this.data[i].ty?r.type="fill":(r.type="stroke",r.width=0),this.stylesPool.push(r))}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),i=2*(a.x*t+a.y*e);return t-=i*a.x,e-=i*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,i,s,r){return this.props[0]=t,this.props[1]=e,this.props[2]=a,this.props[3]=i,this.props[4]=s,this.props[5]=r,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,i,s,r){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*i,this.props[3]=this.b1*a+this.d1*i,this.props[4]=this.a1*s+this.c1*r+this.e1,this.props[5]=this.b1*s+this.d1*r+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,i=t.c,s=t.d,r=t.e,n=t.f,o=new Matrix,h=e*s-a*i;return o.a=s/h,o.b=-a/h,o.c=-i/h,o.d=e/h,o.e=(i*n-s*r)/h,o.f=-(e*n-a*r)/h,o}throw"Matrix is not invertible."},interpolate:function(t,e,a){var i=this,s=a?new Matrix(a):new Matrix;return s.a=i.a+(t.a-i.a)*e,s.b=i.b+(t.b-i.b)*e,s.c=i.c+(t.c-i.c)*e,s.d=i.d+(t.d-i.d)*e,s.e=i.e+(t.e-i.e)*e,s.f=i.f+(t.f-i.f)*e,s._x()},interpolateAnim:function(t,e,a){var i=this,s=a?new Matrix(a):new Matrix,r=i.decompose(),n=t.decompose(),o=r.rotation+(n.rotation-r.rotation)*e,h=r.translate.x+(n.translate.x-r.translate.x)*e,l=r.translate.y+(n.translate.y-r.translate.y)*e,p=r.scale.x+(n.scale.x-r.scale.x)*e,m=r.scale.y+(n.scale.y-r.scale.y)*e;return s.translate(h,l),s.rotate(o),s.scale(p,m),s._x()},decompose:function(t){var e=this.props[0],a=this.props[1],i=this.props[2],s=this.props[3],r=Math.acos,n=Math.atan,o=Math.sqrt,h=Math.PI,l={x:this.props[4],y:this.props[5]},p=0,m={x:1,y:1},d={x:0,y:0},c=e*s-a*i;if(t)e?(d={x:n(i/e),y:n(a/e)},m={x:e,y:c/e}):a?(p=.5*h,m={x:a,y:c/a},d.x=n(s/a)):(m={x:i,y:s},d.x=.25*h);else if(e||a){var u=o(e*e+a*a);p=a>0?r(e/u):-r(e/u),m={x:u,y:c/u},d.x=n((e*i+a*s)/(u*u))}else if(i||s){var f=o(i*i+s*s);p=.5*h-(s>0?r(-i/f):-r(i/f)),m={x:c/f,y:f},d.y=n((e*i+a*s)/(f*f))}else m={x:0,y:0};return{scale:m,translate:l,rotation:p,skew:d}},determinant:function(){return this.a*this.d-this.b*this.c},applyToPoint:function(t,e){return{x:t*this.props[0]+e*this.props[2]+this.props[4],y:t*this.props[1]+e*this.props[3]+this.props[5]}},applyToArray:function(t){var e,a,i=0,s=[];if("number"==typeof t[0])for(a=t.length;a>i;)e=this.applyToPoint(t[i++],t[i++]),s.push(e.x,e.y);else for(a=t.length,i=0;a>i;i++)s.push(this.applyToPoint(t[i].x,t[i].y));return s},applyToTypedArray:function(t,e){for(var a,i=0,s=t.length,r=e?new Float64Array(s):new Float32Array(s);s>i;)a=this.applyToPoint(t[i],t[i+1]),r[i++]=a.x,r[i++]=a.y;return r},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}},void 0===CanvasRenderingContext2D.prototype.ellipse&&(CanvasRenderingContext2D.prototype.ellipse=function(t,e,a,i,s,r,n,o){this.save(),this.translate(t,e),this.rotate(s),this.scale(a,i),this.arc(0,0,1,r,n,o),this.restore()}),("function"!=typeof Path2D||"function"!=typeof Path2D.prototype.addPath||"function"!=typeof Path2D.prototype.ellipse)&&!function(){function t(t){if(this.ops_=[],void 0!==t)if("string"==typeof t)try{this.ops_=parser.parse(t)}catch(e){}else{if(!t.hasOwnProperty("ops_"))throw"Error: "+typeof t+"is not a valid argument to Path";this.ops_=t.ops_.slice(0)}}function e(t){return function(){var e,a=arguments.length,i=[];for(e=0;a>e;e+=1)i.push(arguments[e]);this.ops_.push({type:t,args:i})}}for(var a=CanvasRenderingContext2D.prototype,i=["closePath","moveTo","lineTo","quadraticCurveTo","bezierCurveTo","rect","arc","arcTo","ellipse"],s=0;s<i.length;s++){var r=i[s];t.prototype[r]=e(r)}t.prototype.addPath=function(t,e){var a=!1;!e||1==e.a&&0==e.b&&0==e.c&&1==e.d&&0==e.e&&0==e.f||(a=!0,this.ops_.push({type:"save",args:[]}),this.ops_.push({type:"transform",args:[e.a,e.b,e.c,e.d,e.e,e.f]})),this.ops_=this.ops_.concat(t.ops_),a&&this.ops_.push({type:"restore",args:[]})};var n=a.fill,o=a.stroke,h=a.clip;a.fill=function(e){if(e instanceof t){this.beginPath();for(var i=0,s=e.ops_.length;s>i;i++){var r=e.ops_[i];a[r.type].apply(this,r.args)}s=arguments.length;var o=[];for(i=1;s>i;i+=1)o.push(arguments[i]);n.apply(this,o)}else n.apply(this,arguments)},a.stroke=function(e){if(e instanceof t){this.beginPath();for(var i=0,s=e.ops_.length;s>i;i++){var r=e.ops_[i];a[r.type].apply(this,r.args)}o.call(this)}else o.call(this)},a.clip=function(e){if(e instanceof t){this.beginPath();for(var i=0,s=e.ops_.length;s>i;i++){var r=e.ops_[i];a[r.type].apply(this,r.args)}s=arguments.length;var n=[];for(i=1;s>i;i+=1)n.push(arguments[i]);h.apply(this,n)}else h.apply(this,arguments)},Path2D=t}();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(),i=Math.max(0,16-(a-t)),s=window.setTimeout(function(){e(a+i)},i);return t=a+i,s}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var subframeEnabled=!1,cachedColors={},rgbToHex=function(){var t,e,a=[];for(t=0;256>t;t+=1)e=t.toString(16),a[t]=1==e.length?"0"+e:e;return function(t,e,i){return 0>t&&(t=0),0>e&&(e=0),0>i&&(i=0),"#"+a[t]+a[e]+a[i]}}(),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]]}}(),bez=bezFunction(),dataManager=dataFunctionManager();SVGRenderer.prototype.buildItems=function(t,e,a){var i,s=0,r=t.length;for(a||(a=this.elements),e||(e=this.animationItem.container),i=r-1;i>=0;i--)if("StillLayer"==t[i].type)s++,a[i]=this.createImage(t[i],e);else if("PreCompLayer"==t[i].type){a[i]=this.createComp(t[i],e);var n=[];this.buildItems(t[i].layers,a[i].getDomElement(),n),a[i].setElements(n)}else a[i]="SolidLayer"==t[i].type?this.createSolid(t[i],e):"ShapeLayer"==t[i].type?this.createShape(t[i],e):"TextLayer"==t[i].type?this.createText(t[i],e):this.createBase(t[i],e)},SVGRenderer.prototype.createBase=function(t,e){return new BaseElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.createShape=function(t,e){return new IShapeElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.createText=function(t,e){return new ITextElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.createImage=function(t,e){return new IImageElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.createComp=function(t,e){return new ICompElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.createSolid=function(t,e){return new ISolidElement(t,this.animationItem,e,this.globalData)},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.globalData.defs=e,this.animationItem.container.appendChild(e);var a=document.createElementNS(svgNS,"clipPath"),i=document.createElementNS(svgNS,"rect");i.setAttribute("width",t.animation.compWidth),i.setAttribute("height",t.animation.compHeight),i.setAttribute("x",0),i.setAttribute("y",0),a.setAttribute("id","animationMask"),a.appendChild(i);var s=document.createElementNS(svgNS,"g");s.setAttribute("clip-path","url(#animationMask)"),this.animationItem.container.appendChild(s),e.appendChild(a),this.animationItem.container=s,this.layers=t.animation.layers},SVGRenderer.prototype.buildStage=function(t,e,a){var i,s,r=e.length;for(a||(a=this.elements),i=r-1;i>=0;i--)s=e[i],s.parent&&this.buildItemParenting(s,a[i],e,s.parent,a),a[i].setMainElement(),"PreCompLayer"==s.type&&this.buildStage(a[i].getComposingElement(),s.layers,a[i].getElements())},SVGRenderer.prototype.buildItemParenting=function(t,e,a,i,s){t.parents||(t.parents=[]);for(var r=0,n=a.length;n>r;){if(a[r].layerName==i){e.getHierarchy().push(s[r]),a[r].parent&&this.buildItemParenting(t,e,a,a[r].parent,s);break}r+=1}},SVGRenderer.prototype.updateContainerSize=function(){},SVGRenderer.prototype.renderFrame=function(t){if(this.lastFrame!=t){this.lastFrame=t,this.globalData.frameNum=t;var e,a=this.layers.length;for(e=0;a>e;e++)this.elements[e].prepareFrame(t-this.layers[e].startTime);for(e=0;a>e;e++)this.elements[e].renderFrame(t-this.layers[e].startTime)}},CanvasRenderer.prototype.buildItems=function(t,e){e||(e=this.elements);var a,i=0,s=t.length;for(a=0;s>a;a++)if("StillLayer"==t[a].type)i++,e.push(this.createImage(t[a]));else if("PreCompLayer"==t[a].type){e.push(this.createComp(t[a]));var r=[];this.buildItems(t[a].layers,r),e[e.length-1].setElements(r)}else e.push("SolidLayer"==t[a].type?this.createSolid(t[a]):"ShapeLayer"==t[a].type?this.createShape(t[a]):"TextLayer"==t[a].type?this.createText(t[a]):this.createBase(t[a]))},CanvasRenderer.prototype.createBase=function(t){return new CVBaseElement(t,this.globalData)},CanvasRenderer.prototype.createShape=function(t){return new CVShapeElement(t,this.globalData)},CanvasRenderer.prototype.createText=function(t){return new CVTextElement(t,this.globalData)},CanvasRenderer.prototype.createImage=function(t){return new CVImageElement(t,this.globalData)},CanvasRenderer.prototype.createComp=function(t){return new CVCompElement(t,this.globalData)},CanvasRenderer.prototype.createSolid=function(t){return new CVSolidElement(t,this.globalData)},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.globalData.canvasContext=this.canvasContext,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(){var t,e;if(this.animationItem.wrapper&&this.animationItem.container?(t=this.animationItem.wrapper.offsetWidth,e=this.animationItem.wrapper.offsetHeight,this.animationItem.container.setAttribute("width",t),this.animationItem.container.setAttribute("height",e)):(t=this.canvasContext.canvas.width,e=this.canvasContext.canvas.height),"fit"==this.renderConfig.scaleMode){var a=t/e,i=this.transformCanvas.w/this.transformCanvas.h;i>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,a){a||(a=this.elements);var i,s,r=e.length;for(i=r-1;i>=0;i--)s=e[i],s.parent&&this.buildItemHierarchy(s,a[i],e,s.parent,a),"PreCompLayer"==s.type&&this.buildStage(null,s.layers,a[i].getElements())},CanvasRenderer.prototype.buildItemHierarchy=function(t,e,a,i,s){for(var r=0,n=a.length;n>r;){if(a[r].layerName==i){e.getHierarchy().push(s[r]),void 0===a[r].parent||this.buildItemHierarchy(t,e,a,a[r].parent,s);break}r+=1}},CanvasRenderer.prototype.prepareFrame=function(t){var e,a=this.elements.length;for(e=0;a>e;e++)this.elements[e].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.elements[t].draw()},CanvasRenderer.prototype.renderFrame=function(t){(this.lastFrame!=t||this.renderConfig.clearCanvas!==!0)&&(this.lastFrame=t,this.globalData.frameNum=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.maskedElement,e=this.globalData.defs,a=0,i=this.masksProperties.length;this.layerSize=this.element.getLayerSize(),this.maskElement=document.createElementNS(svgNS,"clipPath");var s,r=this.data.masksProperties;for(a=0;i>a;a++)r[a].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),s=document.createElementNS(svgNS,"path"),r[a].cl?s.setAttribute("fill","#ffffff"):(s.setAttribute("fill","none"),s.setAttribute("stroke","#ffffff"),s.setAttribute("stroke-width","1"),s.setAttribute("stroke-miterlimit","10")),s.setAttribute("clip-rule","nonzero"),this.maskElement.appendChild(s),r[a].elem=s,r[a].lastPath="";var n=randomString(10);this.maskElement.setAttribute("id",n),t.setAttribute("clip-path","url(#"+n+")"),e.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,i=this.registeredEffects.length;for(a=0;i>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,a,i){this.animationItem=e,this.globalData=i,this.data=t,this.ownMatrix=new Matrix,this.finalTransform={mat:new Matrix,op:1},this.renderedFrames=[],this.lastData={},this.parentContainer=a,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.data.hasMask?(this.layerElement=document.createElementNS(svgNS,"g"),this.parentContainer.appendChild(this.layerElement),this.maskedElement=this.layerElement):this.layerElement=this.parentContainer},BaseElement.prototype.prepareFrame=function(t){this.currentAnimData=this.data.renderedData[t].an,this.data.renderedFrame.tr=this.currentAnimData.matrixValue;var e=this.currentAnimData.matrixArray;this.ownMatrix.reset(),this.ownMatrix.transform(e[0],e[1],e[2],e[3],e[4],e[5]),this.ownMatrix.translate(-this.currentAnimData.tr.a[0],-this.currentAnimData.tr.a[1])},BaseElement.prototype.renderFrame=function(t,e){if("NullLayer"!=this.data.type){if(this.data.inPoint-this.data.startTime<=t&&this.data.outPoint-this.data.startTime>=t?(this.isVisible!==!0&&(this.isVisible=!0),this.finalTransform.opacity=1):(this.isVisible!==!1&&(this.isVisible=!1),this.finalTransform.opacity=0),this.data.eff&&this.effectsManager.renderFrame(t,this.currentAnimData.mk),t===this.data.renderedFrame.num)return this.isVisible;if(this.data.hasMask&&this.maskManager.renderFrame(t),this.finalTransform.opacity*=this.currentAnimData.tr.o,e&&(this.finalTransform.mat.reset(),i=e.mat.props,this.finalTransform.mat.transform(i[0],i[1],i[2],i[3],i[4],i[5]),this.finalTransform.opacity*=e.opacity),this.hierarchy){var a,i,s=this.hierarchy.length;for(e||this.finalTransform.mat.reset(),a=s-1;a>=0;a-=1)i=this.hierarchy[a].ownMatrix.props,this.finalTransform.mat.transform(i[0],i[1],i[2],i[3],i[4],i[5]);i=this.ownMatrix.props,this.finalTransform.mat.transform(i[0],i[1],i[2],i[3],i[4],i[5])}else this.isVisible&&(e?(i=this.ownMatrix.props,this.finalTransform.mat.transform(i[0],i[1],i[2],i[3],i[4],i[5])):this.finalTransform.mat=this.ownMatrix);if(this.data.hasMask){this.renderedFrames[this.globalData.frameNum]||(this.renderedFrames[this.globalData.frameNum]={tr:"matrix("+this.finalTransform.mat.props.join(",")+")",o:this.finalTransform.opacity});var r=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=r.tr&&(this.lastData.tr=r.tr,this.layerElement.setAttribute("transform",r.tr)),this.lastData.o!==r.o&&(this.lastData.o=r.o,this.layerElement.setAttribute("opacity",r.o))}return this.isVisible}},BaseElement.prototype.getDomElement=function(){return this.layerElement},BaseElement.prototype.setMainElement=function(){this.mainElement=this.layerElement},BaseElement.prototype.getMaskManager=function(){return this.maskManager},BaseElement.prototype.addMasks=function(t){var e={data:{value:t},element:{value:this},globalData:{value:this.globalData}};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}},BaseElement.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},BaseElement.prototype.hide=function(){},createElement(BaseElement,ICompElement),ICompElement.prototype.getComposingElement=function(){return this.layerElement},ICompElement.prototype.hide=function(){if(!this.hidden){var t,e=this.elements.length;for(t=0;e>t;t+=1)this.elements[t].hide();this.hidden=!0}},ICompElement.prototype.renderFrame=function(t,e){var a=this.parent.renderFrame.call(this,t,e);if(a===!1)return void this.hide();this.hidden=!1;var i,s=this.layers.length,r=this.data.tm?this.data.tm[t]<0?0:t>=this.data.tm.length?this.data.tm[this.data.tm.length-1]:this.data.tm[t]:t;for(i=0;s>i;i+=1)this.elements[i].prepareFrame(r-this.layers[i].startTime);for(i=0;s>i;i+=1)this.data.hasMask?this.elements[i].renderFrame(r-this.layers[i].startTime):this.elements[i].renderFrame(r-this.layers[i].startTime,this.finalTransform)},ICompElement.prototype.setElements=function(t){this.elements=t},ICompElement.prototype.getElements=function(){return this.elements},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.addEventListener("error",e,!1),a.src=this.path+this.assets[this.data.assetId].path,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.layerElement.appendChild(this.image)},IImageElement.prototype.hide=function(){this.hidden||this.data.hasMask||(this.image.setAttribute("opacity","0"),this.hidden=!0)},IImageElement.prototype.renderFrame=function(t,e){var a=this.parent.renderFrame.call(this,t,e);if(a===!1)return void this.hide();if(this.hidden=!1,!this.data.hasMask){this.renderedFrames[this.globalData.frameNum]||(this.renderedFrames[this.globalData.frameNum]={tr:"matrix("+this.finalTransform.mat.props.join(",")+")",o:this.finalTransform.opacity});var i=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=i.tr&&(this.lastData.tr=i.tr,this.image.setAttribute("transform",i.tr)),this.lastData.o!==i.o&&(this.lastData.o=i.o,this.image.setAttribute("opacity",i.o))}},createElement(BaseElement,IShapeElement),IShapeElement.prototype.createElements=function(){this.parent.createElements.call(this),this.mainShape=new ShapeItemElement(this.data.shapes,this.layerElement,this.globalData)},IShapeElement.prototype.renderFrame=function(t,e){var a=this.parent.renderFrame.call(this,t,e);return a===!1?void this.hide():void this.renderShapes(t)},IShapeElement.prototype.hide=function(){this.hidden||(this.mainShape.hideShape(),this.hidden=!0)},IShapeElement.prototype.renderShapes=function(t){this.hidden=!1,this.data.hasMask?this.mainShape.renderShape(t):this.mainShape.renderShape(t,this.finalTransform)},ShapeItemElement.prototype.searchShapes=function(t,e){var a,i,s,r,n=t.length-1,o=[];for(a=n;a>=0;a-=1)if("fl"==t[a].ty||"st"==t[a].ty)e[a]={renderedFrames:[],lastData:{c:"",o:"",w:""}},this.stylesList.push({elements:[],type:t[a].ty,d:""}),e[a].style=this.stylesList[this.stylesList.length-1],o.push(e[a].style);else if("gr"==t[a].ty)e[a]={it:[]},this.searchShapes(t[a].it,e[a].it);else if("tr"==t[a].ty)e[a]={transform:{mat:new Matrix,opacity:1}};else if("sh"==t[a].ty)for(e[a]={elements:[],renderedFrames:[],lastData:{d:"",o:"",tr:""}},s=this.stylesList.length,i=0;s>i;i+=1)this.stylesList[i].closed||(r=document.createElementNS(svgNS,"path"),e[a].elements.push(r),this.shape.appendChild(r),this.stylesList[i].elements.push(r),"st"==this.stylesList[i].type&&(r.setAttribute("fill-opacity",0),r.setAttribute("stroke-linejoin","round"),r.setAttribute("stroke-linecap","round")));else if("rc"==t[a].ty)for(e[a]={elements:[],renderedFrames:[],lastData:{roundness:"",w:"",h:"",x:"",y:"",o:"",tr:""}},s=this.stylesList.length,i=0;s>i;i+=1)this.stylesList[i].closed||(r=t[a].trimmed?document.createElementNS(svgNS,"path"):document.createElementNS(svgNS,"rect"),e[a].elements.push(r),this.shape.appendChild(r),this.stylesList[i].elements.push(r),"st"==this.stylesList[i].type&&(r.setAttribute("fill-opacity",0),t[a].trimmed&&(r.setAttribute("stroke-linejoin","round"),r.setAttribute("stroke-linecap","round"))));else if("el"==t[a].ty)for(e[a]={elements:[],renderedFrames:[],lastData:{cx:"",cy:"",rx:"",ry:"",o:"",tr:""}},s=this.stylesList.length,i=0;s>i;i+=1)this.stylesList[i].closed||(r=document.createElementNS(svgNS,"ellipse"),e[a].elements.push(r),this.shape.appendChild(r),this.stylesList[i].elements.push(r),"st"==this.stylesList[i].type&&r.setAttribute("fill-opacity",0));for(n=o.length,a=0;n>a;a+=1)o[a].closed=!0},ShapeItemElement.prototype.getElement=function(){return this.shape},ShapeItemElement.prototype.hideShape=function(t,e){t||(t=this.data),e||(e=this.viewData);var a,i,s,r,n=this.stylesList.length;for(n=t.length-1,a=n;a>=0;a-=1)if("sh"==t[a].ty||"el"==t[a].ty||"rc"==t[a].ty)for(e[a].lastData.o=-1,r=e[a].elements,s=r.length,i=0;s>i;i+=1)r[i].setAttribute("opacity","0");else"gr"==t[a].ty&&this.hideShape(t[a].it,e[a].it)},ShapeItemElement.prototype.renderShape=function(t,e,a,i){a||(a=this.data),i||(i=this.viewData),this.currentTrim.active&&(this.currentTrim.active=!1),this.posCount=0,this.frameNum=t;var s,r;r=a.length-1;var n,o;for(n=e,s=r;s>=0;s-=1)if("tr"==a[s].ty){var h=a[s].renderedData[t].mtArr;if(n=i[s].transform,o=n.mat,o.reset(),e){var l=e.mat.props;n.opacity=e.opacity,n.opacity*=a[s].renderedData[t].o,o.transform(l[0],l[1],l[2],l[3],l[4],l[5])}else n.opacity=a[s].renderedData[t].o;o.transform(h[0],h[1],h[2],h[3],h[4],h[5]).translate(-a[s].renderedData[t].a[0],-a[s].renderedData[t].a[1])}else"sh"==a[s].ty?this.renderPath(a[s],i[s],t,n):"el"==a[s].ty?this.renderEllipse(a[s],i[s],t,n):"rc"==a[s].ty?a[s].trimmed?this.renderPath(a[s],i[s],t,n):this.renderRect(a[s],i[s],t,n):"fl"==a[s].ty?this.renderFill(a[s],i[s],t):"st"==a[s].ty?this.renderStroke(a[s],i[s],t):"gr"==a[s].ty?this.renderShape(t,n,a[s].it,i[s].it):"tm"==a[s].ty},ShapeItemElement.prototype.renderPath=function(t,e,a,i){e.renderedFrames[this.globalData.frameNum]||(e.renderedFrames[this.globalData.frameNum]={d:t.renderedData[a].path.pathString,tr:"matrix("+i.mat.props.join(",")+")",o:i.opacity});{var s,r,n=e.renderedFrames[this.globalData.frameNum],o=n.d,h=n.tr,l=n.o,p=e.elements,m=p.length;t.renderedData[a].path.pathNodes}for(s=0;m>s;s+=1)r=p[s],e.lastData.d!=o&&p[s].setAttribute("d",o),e.lastData.tr!=h&&p[s].setAttribute("transform",h),e.lastData.o!==l&&p[s].setAttribute("opacity",l);e.lastData.d=o,e.lastData.tr=h,e.lastData.o=l},ShapeItemElement.prototype.renderEllipse=function(t,e,a,i){var s=t.renderedData[a];e.renderedFrames[this.globalData.frameNum]||(e.renderedFrames[this.globalData.frameNum]={cx:s.p[0],cy:s.p[1],rx:s.size[0]/2,ry:s.size[1]/2,tr:"matrix("+i.mat.props.join(",")+")",o:i.opacity});var r,n=e.renderedFrames[this.globalData.frameNum],o=n.cx,h=n.cy,l=n.rx,p=n.ry,m=n.tr,d=n.o,c=e.elements,u=c.length;for(r=0;u>r;r+=1)e.lastData.cx!=o&&c[r].setAttribute("cx",o),e.lastData.cy!=h&&c[r].setAttribute("cy",h),e.lastData.rx!=l&&c[r].setAttribute("rx",l),e.lastData.ry!=p&&c[r].setAttribute("ry",p),e.lastData.tr!=m&&c[r].setAttribute("transform",m),e.lastData.o!=d&&c[r].setAttribute("opacity",d);e.lastData.cx=o,e.lastData.cy=h,e.lastData.rx=l,e.lastData.ry=p,e.lastData.tr=m,e.lastData.o=d},ShapeItemElement.prototype.renderRect=function(t,e,a,i){var s,r=e.elements,n=t.renderedData[a];e.renderedFrames[this.globalData.frameNum]||(s=n.roundness,s>n.size[0]/2&&(s=n.size[0]/2),s>n.size[1]/2&&(s=n.size[1]/2),e.renderedFrames[this.globalData.frameNum]={round:s,w:n.size[0],h:n.size[1],x:n.position[0]-n.size[0]/2,y:n.position[1]-n.size[1]/2,tr:"matrix("+i.mat.props.join(",")+")",o:i.opacity});var o=e.renderedFrames[this.globalData.frameNum];s=o.round;var h,l=o.w,p=o.h,m=o.x,d=o.y,c=o.tr,u=o.o,f=r.length;for(h=0;f>h;h+=1)e.lastData.roundness!=s&&(r[h].setAttribute("rx",s),r[h].setAttribute("ry",s)),e.lastData.w!=l&&r[h].setAttribute("width",l),e.lastData.h!=p&&r[h].setAttribute("height",p),e.lastData.x!=m&&r[h].setAttribute("x",m),e.lastData.y!=d&&r[h].setAttribute("y",d),e.lastData.tr!=c&&r[h].setAttribute("transform",c),e.lastData.o!=u&&r[h].setAttribute("opacity",u);e.lastData.roundness=s,e.lastData.w=l,e.lastData.h=p,e.lastData.x=m,e.lastData.y=d,e.lastData.o=u},ShapeItemElement.prototype.renderFill=function(t,e,a){var i=t.renderedData[a],s=e.style;e.renderedFrames[this.globalData.frameNum]||(e.renderedFrames[this.globalData.frameNum]={c:i.color,o:i.opacity});var r,n=e.renderedFrames[this.globalData.frameNum],o=n.c,h=n.o,l=s.elements,p=l.length;for(r=0;p>r;r+=1)e.lastData.c!=o&&l[r].setAttribute("fill",o),e.lastData.o!=h&&l[r].setAttribute("fill-opacity",h);e.lastData.c=o,e.lastData.o=h},ShapeItemElement.prototype.renderStroke=function(t,e,a){var i=t.renderedData[a],s=e.style;e.renderedFrames[this.globalData.frameNum]||(e.renderedFrames[this.globalData.frameNum]={c:i.color,o:i.opacity,w:i.width},i.dashes&&(e.renderedFrames[this.globalData.frameNum].d=i.dashes));var r=e.renderedFrames[this.globalData.frameNum],n=r.c,o=r.o,h=r.w,l=r.d;if(l){var p,m=l.length,d="",c="";for(p=0;m>p;p+=1)"o"!=l[p].n?d+=" "+l[p].v:c+=l[p].v}var u,f=s.elements,y=f.length;for(u=0;y>u;u+=1)e.lastData.c!=n&&f[u].setAttribute("stroke",n),e.lastData.o!=o&&f[u].setAttribute("stroke-opacity",o),e.lastData.w!=h&&f[u].setAttribute("stroke-width",h),l&&(e.lastData.da!=d&&f[u].setAttribute("stroke-dasharray",d),e.lastData["do"]!=c&&f[u].setAttribute("stroke-dashoffset",c));e.lastData.c=n,e.lastData.o=o,e.lastData.w=h,l&&(e.lastData.da=d,e.lastData["do"]=c)},createElement(BaseElement,ISolidElement),ISolidElement.prototype.createElements=function(){this.parent.createElements.call(this);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.layerElement.appendChild(t),this.rectElement=t},ISolidElement.prototype.hide=function(){this.hidden||this.data.hasMask||(this.rectElement.setAttribute("opacity","0"),this.hidden=!0)},ISolidElement.prototype.renderFrame=function(t,e){var a=this.parent.renderFrame.call(this,t,e);if(a===!1)return void this.hide();if(this.hidden&&(this.lastData.o=-1,this.hidden=!1),!this.data.hasMask){this.renderedFrames[this.globalData.frameNum]||(this.renderedFrames[this.globalData.frameNum]={tr:"matrix("+this.finalTransform.mat.props.join(",")+")",o:this.finalTransform.opacity});var i=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=i.tr&&(this.lastData.tr=i.tr,this.rectElement.setAttribute("transform",i.tr)),this.lastData.o!==i.o&&(this.lastData.o=i.o,this.rectElement.setAttribute("opacity",i.o))}},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=this.svgElem.style.webkitTransform="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.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("NullLayer"!=this.data.type){if(t!==!1&&this.canvasContext.save(),!this.renderFrame)return!1;var e,a=this.canvasContext;if(this.hierarchy){var i,s,r=this.hierarchy.length;for(i=r-1;i>=0;i-=1)s=this.hierarchy[i].getCurrentAnimData(),e=s.matrixArray,a.transform(e[0],e[1],e[2],e[3],e[4],e[5]),a.translate(-s.tr.a[0],-s.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.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.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},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,i=this.elements.length,s=this.data.tm?this.data.tm[t]<0?0:t>=this.data.tm.length?this.data.tm[this.data.tm.length-1]:this.data.tm[t]:t;for(a=0;i>a;a+=1)this.elements[a].prepareFrame(s-this.layers[a].startTime)}},CVCompElement.prototype.draw=function(){if(this.canvasContext.save(),this.parent.draw.call(this,!1)===!1)return void this.canvasContext.restore();var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].draw();this.canvasContext.restore()},CVCompElement.prototype.setElements=function(t){this.elements=t},CVCompElement.prototype.getElements=function(){return this.elements},createElement(CVBaseElement,CVImageElement),CVImageElement.prototype.createElements=function(){var t=this,e=function(){t.animationItem.elementLoaded()},a=function(){t.failed=!0,t.animationItem.elementLoaded()};this.img=new Image,this.img.addEventListener("load",e,!1),this.img.addEventListener("error",a,!1),this.img.src=this.path+this.assets[this.data.assetId].path,this.parent.createElements.call(this)},CVImageElement.prototype.draw=function(){if(!this.failed){if(this.canvasContext.save(),this.parent.draw.call(this,!1)===!1)return void this.canvasContext.restore();var t=this.canvasContext;t.drawImage(this.img,0,0),this.canvasContext.restore()}},createElement(CVBaseElement,CVShapeElement),CVShapeElement.prototype.createElements=function(){this.parent.createElements.call(this),this.mainShape=new CVShapeItemElement(this.data.shapes,!0,this.globalData)},CVShapeElement.prototype.prepareFrame=function(t){var e=this.parent.prepareFrame.call(this,t);e!==!1&&this.mainShape.prepareFrame(t)},CVShapeElement.prototype.draw=function(){return this.canvasContext.save(),this.parent.draw.call(this,!1)===!1?void this.canvasContext.restore():(this.drawShapes(),void this.canvasContext.restore())},CVShapeElement.prototype.drawShapes=function(){this.mainShape.renderShape()},CVShapeItemElement.prototype.drawPaths=function(t){var e;if(t){var a=[];e=this.stylesList}else e=this.renderedPaths[this.globalData.frameNum];var i,s=e.length,r=this.canvasContext;for(r.save(),r.lineCap="round",r.lineJoin="round",i=0;s>i;i+=1)"stroke"==e[i].type?(r.globalAlpha*=e[i].opacity,r.strokeStyle=e[i].value,r.lineWidth=e[i].width,e[i].dasharray?(r.setLineDash(e[i].dasharray),r.lineDashOffset=e[i].dashoffset):(r.setLineDash([]),r.lineDashOffset=0),r.stroke(e[i].path),t&&(a.push({type:e[i].type,opacity:e[i].opacity,value:e[i].value,width:e[i].width,path:e[i].path}),e[i].dasharray&&(a[a.length-1].dasharray=e[i].dasharray,a[a.length-1].dashoffset=e[i].dashoffset))):"fill"==e[i].type&&(r.globalAlpha*=e[i].opacity,r.fillStyle=e[i].value,r.fill(e[i].path),t&&a.push({type:e[i].type,opacity:e[i].opacity,value:e[i].value,path:e[i].path}));r.restore(),t&&(this.renderedPaths[this.globalData.frameNum]=a)},CVShapeItemElement.prototype.prepareFrame=function(t){this.frameNum=t;var e,a=this.dataLength-1;for(e=a;e>=0;e-=1)"gr"==this.data[e].ty&&this.data[e].item.prepareFrame(t)},CVShapeItemElement.prototype.renderShape=function(t,e){if(this.renderedPaths[this.globalData.frameNum])return void this.drawPaths(!1);this.opacityMultiplier=1;var a,i;for(this.ownStylesList.length=0,this.currentStylePoolPos=0,t?this.stylesList=t:this.stylesList.length=0,e?this.currentMatrix=e:(this.currentMatrix.a=this.currentMatrix.d=1,this.currentMatrix.b=this.currentMatrix.c=this.currentMatrix.e=this.currentMatrix.f=0),i=this.dataLength-1,a=i;a>=0;a-=1)"gr"==this.data[a].ty?this.data[a].item.renderShape(this.stylesList,this.currentMatrix):"tr"==this.data[a].ty?this.renderTransform(this.data[a]):"sh"==this.data[a].ty?this.renderPath(this.data[a]):"el"==this.data[a].ty?this.renderEllipse(this.data[a]):"rc"==this.data[a].ty?this.data[a].trimmed?this.renderPath(this.data[a]):this.renderRect(this.data[a]):"fl"==this.data[a].ty?this.renderFill(this.data[a]):"st"==this.data[a].ty&&this.renderStroke(this.data[a]);if(this.mainFlag)this.drawPaths(!0);else for(i=this.ownStylesList.length,a=0;i>a;a+=1)this.ownStylesList[a].closed=!0},CVShapeItemElement.prototype.renderTransform=function(t){var e=t.renderedData[this.frameNum],a=e.mtArr;this.mat.a=a[0],this.mat.b=a[1],this.mat.c=a[2],this.mat.d=a[3],this.mat.e=a[4],this.mat.f=a[5],this.mat=this.mat.translate(-e.a[0],-e.a[1]),this.opacityMultiplier*=e.o,this.currentMatrix=this.currentMatrix.multiply(this.mat)
},CVShapeItemElement.prototype.renderPath=function(t){if(t.trimmed){var e=this.canvasContext;e.lineCap="round",e.lineJoin="round"}var a=t.renderedData[this.frameNum].path,i=new Path2D,s=a.pathNodes;if(s instanceof Array&&(s=s[0]),s.v){var r,n=s.v.length,o=s.s?s.s:[];for(r=1;n>r;r+=1)o[r-1]?i.moveTo(o[r-1][0],o[r-1][1]):1==r&&i.moveTo(s.v[0][0],s.v[0][1]),i.bezierCurveTo(s.o[r-1][0],s.o[r-1][1],s.i[r][0],s.i[r][1],s.v[r][0],s.v[r][1]);!a.closed||t.trimmed&&!s.c||i.bezierCurveTo(s.o[r-1][0],s.o[r-1][1],s.i[0][0],s.i[0][1],s.v[0][0],s.v[0][1]),this.addPathToStyles(i)}},CVShapeItemElement.prototype.renderEllipse=function(t){var e=new Path2D,a=t.renderedData[this.frameNum];e.moveTo(a.p[0]+a.size[0]/2,a.p[1]),e.ellipse(a.p[0],a.p[1],a.size[0]/2,a.size[1]/2,0,0,2*Math.PI,!1),this.addPathToStyles(e)},CVShapeItemElement.prototype.renderRect=function(t){var e=new Path2D,a=t.renderedData[this.frameNum],i=a.roundness;if(0===i)e.rect(a.position[0]-a.size[0]/2,a.position[1]-a.size[1]/2,a.size[0],a.size[1]);else{var s=a.position[0]-a.size[0]/2,r=a.position[1]-a.size[1]/2,n=a.size[0],o=a.size[1];i instanceof Array&&(i=i[0]),i>n/2&&(i=n/2),i>o/2&&(i=o/2),e.moveTo(s+i,r),e.lineTo(s+n-i,r),e.quadraticCurveTo(s+n,r,s+n,r+i),e.lineTo(s+n,r+o-i),e.quadraticCurveTo(s+n,r+o,s+n-i,r+o),e.lineTo(s+i,r+o),e.quadraticCurveTo(s,r+o,s,r+o-i),e.lineTo(s,r+i),e.quadraticCurveTo(s,r,s+i,r)}this.addPathToStyles(e)},CVShapeItemElement.prototype.addPathToStyles=function(t){var e,a=this.stylesList.length,i=!0,s=0;for(e=a-1;e>=0;e-=1)this.stylesList[e].closed||("stroke"==this.stylesList[e].type?(this.stylesList[e].width>s&&this.stylesList[e].path.addPath(t,this.currentMatrix),1==this.stylesList[e].styleOpacity&&1==this.stylesList[e].opacity&&(s=this.stylesList[e].width)):i&&"fill"==this.stylesList[e].type&&(this.stylesList[e].path.addPath(t,this.currentMatrix),1==this.stylesList[e].styleOpacity&&1==this.stylesList[e].opacity&&(i=!1)))},CVShapeItemElement.prototype.renderFill=function(t){var e=t.renderedData[this.frameNum];return t.fillEnabled!==!1?(this.stylesPool[this.currentStylePoolPos].path=new Path2D,this.stylesPool[this.currentStylePoolPos].closed=!1,this.stylesPool[this.currentStylePoolPos].styleOpacity=e.opacity<1?e.opacity:1,this.stylesPool[this.currentStylePoolPos].opacity=this.opacityMultiplier,this.stylesPool[this.currentStylePoolPos].value=e.opacity<1?fillColorToString(e.color,e.opacity):fillColorToString(e.color),this.stylesList.push(this.stylesPool[this.currentStylePoolPos]),this.ownStylesList.push(this.stylesList[this.stylesList.length-1]),void(this.currentStylePoolPos+=1)):(this.stylesList.push(this.stylesPool[this.currentStylePoolPos]),this.ownStylesList.push(this.stylesList[this.stylesList.length-1]),void(this.currentStylePoolPos+=1))},CVShapeItemElement.prototype.renderStroke=function(t){var e=t.renderedData[this.frameNum];if(this.data.strokeEnabled!==!1){if(this.stylesPool[this.currentStylePoolPos].path=new Path2D,this.stylesPool[this.currentStylePoolPos].closed=!1,this.stylesPool[this.currentStylePoolPos].styleOpacity=e.opacity<1?e.opacity:1,this.stylesPool[this.currentStylePoolPos].width=e.width,this.stylesPool[this.currentStylePoolPos].opacity=this.opacityMultiplier,this.stylesPool[this.currentStylePoolPos].value=e.opacity<1?fillColorToString(e.color,e.opacity):fillColorToString(e.color),e.dashes){var a,i=e.dashes,s=i.length,r=[],n="";for(a=0;s>a;a+=1)"o"!=i[a].n?r.push(i[a].v):n=i[a].v;this.stylesPool[this.currentStylePoolPos].dasharray=r,this.stylesPool[this.currentStylePoolPos].dashoffset=n}return this.stylesList.push(this.stylesPool[this.currentStylePoolPos]),this.ownStylesList.push(this.stylesList[this.stylesList.length-1]),void(this.currentStylePoolPos+=1)}this.stylesList.push(this.stylesPool[this.currentStylePoolPos]),this.ownStylesList.push(this.stylesList[this.stylesList.length-1]),this.currentStylePoolPos+=1},createElement(CVBaseElement,CVSolidElement),CVSolidElement.prototype.draw=function(){if(this.canvasContext.save(),this.parent.draw.call(this,!1)===!1)return void this.canvasContext.restore();var t=this.canvasContext;t.fillStyle=this.data.color,t.fillRect(0,0,this.data.width,this.data.height),this.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=this.svgElem.style.webkitTransform="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.maskedElement=t},CVMaskElement.prototype.init=function(){this.registeredEffects=[],this.masksProperties=this.data.masksProperties,this.totalMasks=this.masksProperties.length,this.ctx=this.element.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,i=e.v.length;for(t.moveTo(e.v[0][0],e.v[0][1]),a=1;i>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 i(t,e){var a;for(a=0;v>a;a+=1)f[a].animation.setDirection(t,e)}function s(t){var e;for(e=0;v>e;e+=1)f[e].animation.play(t)}function r(t,e){g=!1,y=Date.now();var a;for(a=0;v>a;a+=1)f[a].animation.moveFrame(t,e)}function n(){var t,e=Date.now(),a=e-y;for(t=0;v>t;t+=1)f[t].animation.advanceTime(a);y=e,requestAnimationFrame(n)}function o(t){var e;for(e=0;v>e;e+=1)f[e].animation.pause(t)}function h(t,e,a){var i;for(i=0;v>i;i+=1)f[i].animation.goToAndStop(t,e,a)}function l(t){var e;for(e=0;v>e;e+=1)f[e].animation.stop(t)}function p(t){var e;for(e=0;v>e;e+=1)f[e].animation.togglePause(t)}function m(){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(n)}var u={},f=[],y=0,g=!0,v=0;return setTimeout(c,0),u.registerAnimation=t,u.loadAnimation=e,u.setSpeed=a,u.setDirection=i,u.play=s,u.moveFrame=r,u.pause=o,u.stop=l,u.togglePause=p,u.searchAnimations=m,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 i=new XMLHttpRequest;this.path=t.path.substr(0,t.path.lastIndexOf("/")+1),i.open("GET",t.path,!0),i.send(),i.onreadystatechange=function(){if(4==i.readyState)if(200==i.status)e.configAnimation(JSON.parse(i.responseText));else try{var t=JSON.parse(i.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 i=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:"";""===i||(e.loop="false"===i?!1:"true"===i?!0:parseInt(i)),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 s=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"===s&&(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.firstFrame=Math.round(this.animationData.animation.ff*this.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.firstFrame),this.renderer.renderFrame(this.currentFrame+this.firstFrame)):(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.firstFrame),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.firstFrame),this.renderer.renderFrame(this.currentFrame+this.firstFrame))},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 i(t){animationManager.togglePause(t)}function s(t,e){animationManager.setSpeed(t,e)}function r(t,e){animationManager.setDirection(t,e)}function n(t){animationManager.stop(t)}function o(t){animationManager.moveFrame(t)}function h(){animationManager.searchAnimations()}function l(t){return animationManager.registerAnimation(t)}function p(){animationManager.resize()}function m(){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=i,y.setSpeed=s,y.setDirection=r,y.stop=n,y.moveFrame=o,y.searchAnimations=h,y.registerAnimation=l,y.loadAnimation=u,y.setSubframeRendering=c,y.resize=p,y.start=m,y.goToAndStop=d,y.checkReady=f,t.bodymovin=y;var g=setInterval(f,100)}(window);}(window));