(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,u,c,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]]),u=$M([[i,0,0,0],[0,s,0,0],[0,0,r,0],[0,0,0,1]]),c=l.x(p).x(m).x(u),c=c.transpose(),f=$M([[1,0,0,0],[0,1,0,0],[0,0,1,0],[n,o,h,1]]),c=c.x(f),d="matrix3d(",d+=c.e(1,1).toFixed(5)+","+c.e(1,2).toFixed(5)+","+c.e(1,3).toFixed(5)+","+c.e(1,4).toFixed(5)+",",d+=c.e(2,1).toFixed(5)+","+c.e(2,2).toFixed(5)+","+c.e(2,3).toFixed(5)+","+c.e(2,4).toFixed(5)+",",d+=c.e(3,1).toFixed(5)+","+c.e(3,2).toFixed(5)+","+c.e(3,3).toFixed(5)+","+c.e(3,4).toFixed(5)+",",d+=c.e(4,1).toFixed(5)+","+c.e(4,2).toFixed(5)+","+c.e(4,3).toFixed(5)+","+c.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,u,c){var f=n/c;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 u*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,u=500,c=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])&&(u=2),s=m.length,a=0;u>a;a+=1){for(h=[],n=a/(u-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),c+=o,y.points.push({partialLength:o,cumulatedLength:c,point:h}),f=h}y.segmentLength=c,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,u=1-l,c=1-m,f=[],y=[],g=[],v=[];for(p=0;d>p;p+=1)f[p]=u*u*u*t[p]+(l*u*u+u*l*u+u*u*l)*a[p]+(l*l*u+u*l*l+l*u*l)*i[p]+l*l*l*e[p],y[p]=u*u*c*t[p]+(l*u*c+u*l*c+u*u*m)*a[p]+(l*l*c+u*l*m+l*u*m)*i[p]+l*l*m*e[p],g[p]=u*c*c*t[p]+(l*c*c+u*m*c+u*c*m)*a[p]+(l*m*c+u*m*m+l*c*m)*i[p]+l*m*m*e[p],v[p]=c*c*c*t[p]+(m*c*c+c*m*c+c*c*m)*a[p]+(m*m*c+c*m*m+m*c*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,u=100,c=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])&&(u=2),l=s.length,o=0;u>o;o+=1){for(m=o/(u-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),c+=d),g.segments.push({l:c,p:m})}return g.addedLength=c,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]*x));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,u,c,f,y,g,v,x=n.length;for(c=0;x>c;c+=1){if(m=n[c],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=[],u=-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,C):m.ks.r*=C,m.hasMask){var E=m.masksProperties;for(y=E.length,f=0;y>f;f+=1)if(E[f].pt.i)r(E[f].pt);else for(v=E[f].pt.length,g=0;v>g;g+=1)E[f].pt[g].s&&r(E[f].pt[g].s[0]),E[f].pt[g].e&&r(E[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,C):h.r*=C):"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){b[t._id]={data:t,renderedFrames:[]},x=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,u,c;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),u=n.bezierData;var v,x,E=u.segmentLength*d;for(l=y;l<u.points.length;){if(0===i||0===E||0===d){m=u.points[l].point,y=l;break}if(l==u.points.length-1)m=u.points[l].point;else if(E>u.points[l].partialLength&&E<u.points[l+1].partialLength){for(v=u.points[l].point.length,x=(E-u.points[l].partialLength)/(u.points[l+1].partialLength-u.points[l].partialLength),c=0;v>c;c+=1)m.push(u.points[l].point[c]+(u.points[l+1].point[c]-u.points[l].point[c])*x);y=l;break}l+=1}}else{var b,C,S,w;n.s.forEach(function(t,e){if(1!==n.h&&(n.o.x instanceof Array?(b=n.o.x[e],C=n.o.y[e],S=n.i.x[e],w=n.i.y[e]):(b=n.o.x,C=n.o.y,S=n.i.x,w=n.i.y),d=bez.getEasingCurve(b,C,S,w)("",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?(D.px=t,D.py=t):"s"==i.type?(D.sx=t,D.sy=t):"r"==i.type&&(D.r=t),i.toArray?[t]:t;if(void 0===t[0].t)return"p"==i.type?(D.px=t[0],D.py=t[1]):"s"==i.type?(D.sx=t[0],D.sy=t[1]):"r"==i.type&&(D.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,u,c,f,y,g=0;if("default"==i.type&&(n=[]),s.to){if(o=s.bezierData,e>=r.t-a)return"p"==i.type?(D.px=o.points[o.points.length-1].point[0],D.py=o.points[o.points.length-1].point[1]):"s"==i.type?(D.sx=o.points[o.points.length-1].point[0],D.sy=o.points[o.points.length-1].point[1]):"r"==i.type&&(D.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?(D.px=o.points[0].point[0],D.py=o.points[0].point[1]):"s"==i.type?(D.sx=o.points[0].point[0],D.sy=o.points[0].point[1]):"r"==i.type&&(D.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),c=y("",e-(s.t-a),0,1,r.t-a-(s.t-a));var v,x=o.segmentLength*c,E=0;for(p=1,m=!0,f=o.points.length;m;){if(E+=o.points[g].partialLength*p,0===x||0===c){"p"==i.type?(D.px=o.points[g].point[0],D.py=o.points[g].point[1]):"s"==i.type?(D.sx=o.points[g].point[0],D.sy=o.points[g].point[1]):"r"==i.type?D.r=o.points[g].point[0]:n=o.points[g].point;break}if(g==o.points.length-1){"p"==i.type?(D.px=o.points[g].point[0],D.py=o.points[g].point[1]):"s"==i.type?(D.sx=o.points[g].point[0],D.sy=o.points[g].point[1]):"r"==i.type?D.r=o.points[g].point[0]:n=o.points[g].point;break}if(x>E&&x<E+o.points[g+1].partialLength){if(v=(x-E)/o.points[g+1].partialLength,"p"==i.type)D.px=o.points[g].point[0]+(o.points[g+1].point[0]-o.points[g].point[0])*v,D.py=o.points[g].point[1]+(o.points[g+1].point[1]-o.points[g].point[1])*v;else if("s"==i.type)D.sx=o.points[g].point[0]+(o.points[g+1].point[0]-o.points[g].point[0])*v,D.sy=o.points[g].point[1]+(o.points[g+1].point[1]-o.points[g].point[1])*v;else if("r"==i.type)D.r=o.points[g].point[0]+(o.points[g+1].point[0]-o.points[g].point[0])*v;else for(u=o.points[g].point.length,d=0;u>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 b,C,S,w,M=!1;for(l=s.s.length,h=0;l>h;h+=1)1!==s.h&&(s.o.x instanceof Array?(M=!0,b=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],S=s.i.x[h]?s.i.x[h]:s.i.x[0],w=s.i.y[h]?s.i.y[h]:s.i.y[0],s.__fnct||(s.__fnct=[])):(M=!1,b=s.o.x,C=s.o.y,S=s.i.x,w=s.i.y),M?s.__fnct[h]?y=s.__fnct[h]:(y=bez.getEasingCurve(b,C,S,w),s.__fnct[h]=y):s.__fnct?y=s.__fnct:(y=bez.getEasingCurve(b,C,S,w),s.__fnct=y),c=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?D.px=s.s[h]:1==h&&(D.py=s.s[h]):"s"==i.type?0===h?D.sx=s.s[h]:1==h&&(D.sy=s.s[h]):"r"==i.type?D.r=s.s[h]:n.push(s.s[h]):"p"==i.type?0===h?D.px=s.s[h]+(s.e[h]-s.s[h])*c:1==h&&(D.py=s.s[h]+(s.e[h]-s.s[h])*c):"s"==i.type?0===h?D.sx=s.s[h]+(s.e[h]-s.s[h])*c:1==h&&(D.sy=s.s[h]+(s.e[h]-s.s[h])*c):"r"==i.type?D.r=s.s[h]+(s.e[h]-s.s[h])*c:n.push(s.s[h]+(s.e[h]-s.s[h])*c)}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 o.pathNodes=n?"svg"==i?w(h,o.closed,r,!1):w(h,o.closed,r,!1):"svg"==i?h:h,o;t={i:[],o:[],v:[]};var l,p,m,d,u,c,f,y=[];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=[],c=[],f=[],d=h[0].s[0].i[l].length,m=0;d>m;m+=1)u.push(h[0].s[0].i[l][m]),c.push(h[0].s[0].o[l][m]),f.push(h[0].s[0].v[l][m]);t.i.push(u),t.o.push(c),t.v.push(f)}y.push(t),"svg"!=i||n?h.__minValue=y[0]:h.__minValueN=y[0]}return o.pathNodes=n?"svg"==i?w(h.__minValue,o.closed,r,!1):w(h.__minValue,o.closed,r,!1):"svg"==i?h.__minValueN:h.__minValue,o}if(e>h[h.length-1].t-a){if(!h.__maxValue){var g=h.length-2;for(p=h[g].s[0].i.length,l=0;p>l;l+=1){for(u=[],c=[],f=[],d=h[g].s[0].i[l].length,m=0;d>m;m+=1)u.push(h[g].e[0].i[l][m]),c.push(h[g].e[0].o[l][m]),f.push(h[g].e[0].v[l][m]);t.i.push(u),t.o.push(c),t.v.push(f)}y.push(t),"svg"!=i||n?h.__maxValue=y[0]:h.__maxValueN=y[0]}return o.pathNodes=n?"svg"==i?w(h.__maxValue,o.closed,r,!1):w(h.__maxValue,o.closed,r,!1):"svg"==i?h.__maxValueN:h.__maxValue,o}for(var v,x,E=0,b=h.length-1,C=1,S=!0;S&&(v=h[E],x=h[E+1],!(x.t-a>e&&1==C));)b-1>E&&1==C||E>0&&-1==C?E+=C:S=!1;var D,M,F,I,P;if(1!==v.h){D=v.o.x,M=v.o.y,F=v.i.x,I=v.i.y;var A;v.__fnct?A=v.__fnct:(A=bez.getEasingCurve(D,M,F,I),v.__fnct=A),P=A("",e-(v.t-a),0,1,x.t-a-(v.t-a)),e>=x.t-a?P=1:e<v.t-a&&(P=0)}if(1===v.h&&v.__hValue)y.push(v.__hValue);else for(t={i:[],o:[],v:[]},p=v.s[0].i.length,l=0;p>l;l+=1){for(u=[],c=[],f=[],d=v.s[0].i[l].length,m=0;d>m;m+=1)1===v.h?(u.push(v.s[0].i[l][m]),c.push(v.s[0].o[l][m]),f.push(v.s[0].v[l][m])):(u.push(v.s[0].i[l][m]+(v.e[0].i[l][m]-v.s[0].i[l][m])*P),c.push(v.s[0].o[l][m]+(v.e[0].o[l][m]-v.s[0].o[l][m])*P),f.push(v.s[0].v[l][m]+(v.e[0].v[l][m]-v.s[0].v[l][m])*P));t.i.push(u),t.o.push(c),t.v.push(f),1===v.h&&(v.__hValue=t),y.push(t)}return o.pathNodes=n?"svg"==i?w(y[0],o.closed,r,!1):w(y[0],o.closed,r,!1):"svg"==i?y[0]:y[0],o}function d(t,e,a){var i,s,r,n,o,h,p,u,f,y=t.length;for(u=0;y>u;u+=1)if(f=t[u],n=e-f.startTime,!f.an[n]){if(i={},S.arrayFlag=!1,S.type="default",i.a=l(f.ks.a,n,f.startTime,S),i.o=l(f.ks.o,n,f.startTime,S),S.arrayFlag=!1,S.type="p",l(f.ks.p,n,f.startTime,S),S.arrayFlag=!0,S.type="r",l(f.ks.r,n,f.startTime,S),S.arrayFlag=!0,S.type="s",l(f.ks.s,n,f.startTime,S),p={},p.an={tr:i},S.arrayFlag=!1,S.type="default","canvas"==a?p.an.matrixArray=E.getMatrixArrayFromParams(D.r,D.sx,D.sy,D.px,D.py):(p.an.matrixArray=E.getMatrixArrayFromParams(D.r,D.sx,D.sy,D.px,D.py),p.an.matrixValue=E.getMatrix2FromParams(D.r,D.sx,D.sy,D.px,D.py)+"translate("+-i.a[0]+" "+-i.a[1]+")"),f.renderedData[n]=p,f.hasMask)for(s=f.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,f.startTime,a,!0),s[o].opacity[n]=l(s[o].o,n,f.startTime,S),s[o].opacity[n]=s[o].opacity[n]instanceof Array?s[o].opacity[n][0]/100:s[o].opacity[n]/100;e<f.inPoint||e>f.outPoint||("PreCompLayer"==f.type?(r=f.tm?f.tm[n]<0?0:n>=f.tm.length?f.tm[f.tm.length-1]:f.tm[n]:n,void 0===r&&(r=l(f.trmp,n,0,S)[0]*x,f.tm[n]=r),d(f.layers,r,a)):"ShapeLayer"==f.type&&c(f.shapes,n,f.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 c(t,e,a,i,s){var r,n,o,h,p,d,y,g,v,x,b=t.length;s||(s=[]);var C,M,F,I,P;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?(f(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),y=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,y),!0,s,!0):n.renderedData[e].path.pathNodes=w(u(p,d,y),!0,s,!1)):n.renderedData[e]={position:p,size:d,roundness:y};else if("el"==n.ty){if(p=l(n.p,e,a,S),d=l(n.s,e,a,S),n.renderedData[e]={p:p,size:d},"svg"==i){var A,_,k,T,L="";L+="M"+p[0]+","+(p[1]-d[1]/2),A=p[0]-d[0]/2*.55,_=p[1]-d[1]/2,k=p[0]-d[0]/2,T=p[1]-d[1]/2*.55,L+=" C"+A+","+_+" "+k+","+T+" "+(p[0]-d[0]/2)+","+p[1],A=p[0]-d[0]/2,_=p[1]+d[1]/2*.55,k=p[0]-d[0]/2*.55,T=p[1]+d[1]/2,L+=" C"+A+","+_+" "+k+","+T+" "+p[0]+","+(p[1]+d[1]/2),A=p[0]+d[0]/2*.55,_=p[1]+d[1]/2,k=p[0]+d[0]/2,T=p[1]+d[1]/2*.55,L+=" C"+A+","+_+" "+k+","+T+" "+(p[0]+d[0]/2)+","+p[1],A=p[0]+d[0]/2,_=p[1]-d[1]/2*.55,k=p[0]+d[0]/2*.55,T=p[1]-d[1]/2,L+=" C"+A+","+_+" "+k+","+T+" "+p[0]+","+(p[1]-d[1]/2);var N={v:[],i:[],o:[]};N.v.push([p[0],p[1]-d[1]/2]),N.o.push([p[0]-d[0]/2*.55,p[1]-d[1]/2]),N.i.push([p[0]+d[0]/2*.55,p[1]-d[1]/2]),N.v.push([p[0]-d[0]/2,p[1]]),N.o.push([p[0]-d[0]/2,p[1]+d[1]/2*.55]),N.i.push([p[0]-d[0]/2,p[1]-d[1]/2*.55]),N.v.push([p[0],p[1]+d[1]/2]),N.o.push([p[0]+d[0]/2*.55,p[1]+d[1]/2]),N.i.push([p[0]-d[0]/2*.55,p[1]+d[1]/2]),N.v.push([p[0]+d[0]/2,p[1]]),N.o.push([p[0]+d[0]/2,p[1]-d[1]/2*.55]),N.i.push([p[0]+d[0]/2,p[1]+d[1]/2*.55]),n.renderedData[e].path={pathString:L,pathNodes:N},n.closed=!0}}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 V=[];P=n.d.length;var z;for(I=0;P>I;I+=1)z=l(n.d[I].v,e,a,S),V.push({v:z instanceof Array?z[0]:z,n:n.d[I].n});n.renderedData[e].dashes=V}"canvas"==i?(f(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(D.r,D.sx,D.sy,D.px,D.py):(n.renderedData[e].mtArr=E.getMatrixArrayFromParams(D.r,D.sx,D.sy,D.px,D.py),n.renderedData[e].mt=E.getMatrix2FromParams(D.r,D.sx,D.sy,D.px,D.py));else if("tm"==n.ty){C=l(n.s,e,a,S),M=l(n.e,e,a,S),F=l(n.o,e,a,S);var R={s:C,e:M,o:F};s.push(R),n.renderedData[e]=R}else"gr"==n.ty&&c(n.it,e,a,i,s)}function f(t){var e,a=t.length;for(e=0;a>e;e+=1)t[e]=Math.round(t[e])}function y(t,e){for(var a=1;a>0;){if(e+=1,e>=t.data.animation.totalFrames){t.renderFinished=!0;break}t.renderedFrames[e]||(g(t.data._id,e),a-=1)}}function g(t,e){return 2==b[t].renderedFrames[e]?void(b[t].renderFinished||y(b[t],e)):(x=b[t].data.animation.frameRate,b[t].renderedFrames[e]=2,void d(b[t].data.animation.layers,e,b[t].data._animType))}function v(t){var e,a=b[t].data,i=a.animation.totalFrames,s=[];for(e=0;i>e;e+=1)s.push({num:e,data:g(t,e)})}var x=0,E=new MatrixManager,b={},C=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,u,c){p(m,d);var f,y=u.length,g=m;for(a=e=i=s=null,f=y-1;f>=0;f-=1){var v=[],x=u[f].o%360/360;if(0!=x||0!=u[f].s||100!=u[f].e){l="",h=!1,e=[],i=[],a=[],s=[],r=[],n=0,0>x&&(x+=1);var E=u[f].s/100+x,b=u[f].e/100+x;if(E==b)return c?"":{};if(E>b){var C=E;E=b,b=C}1>=b?v.push({s:g.__totalLength*E,e:g.__totalLength*b}):E>=1?v.push({s:g.__totalLength*(E-1),e:g.__totalLength*(b-1)}):(v.push({s:g.__totalLength*E,e:g.__totalLength}),v.push({s:0,e:g.__totalLength*(b-1)}));var S,w,D,M=[],F=[],I=[];M=g.v,F=g.o,I=g.i,S=g.__lengths,D=M.length;var P,A,_=0,k=0,T=v.length;for(o=0,P=0;T>P;P+=1){for(_=0,w=1;D>w;w++)if(k=S[w-1].addedLength,_+k<v[P].s)_+=k;else{if(_>v[P].e)break;v[P].s<=_&&v[P].e>=_+k?t(M[w-1],F[w-1],I[w],M[w],S[w-1]):(A=bez.getNewSegment(M[w-1],M[w],F[w-1],I[w],(v[P].s-_)/k,(v[P].e-_)/k,S[w-1]),t(A.pt1,A.pt3,A.pt4,A.pt2)),_+=k}d!==!1?_>v[P].e||(k=S[w-1].addedLength,v[P].s<=_&&v[P].e>=_+k?t(M[w-1],F[w-1],I[0],M[0],S[w-1]):(A=bez.getNewSegment(M[w-1],M[0],F[w-1],I[0],(v[P].s-_)/k,(v[P].e-_)/k,S[w-1]),t(A.pt1,A.pt3,A.pt4,A.pt2))):h=!1}d=!1}}if(a?(M=a,F=i,I=e):(M=g.v,F=g.o,I=g.i,s=[]),D=M.length,c){for(l="",w=1;D>w;w++)s[w-1]?l+="M"+s[w-1].join(","):1==w&&(l+="M"+M[0].join(",")),l+=" C"+F[w-1].join(",")+" "+I[w].join(",")+" "+M[w].join(",");return d!==!1&&(l+=" C"+F[w-1].join(",")+" "+I[0].join(",")+" "+M[0].join(",")),l}return{i:I,o:F,v:M,s:s,c:d}}}(),D={r:0,sx:1,sy:1,px:1,py:1},M={};return M.completeData=n,M.renderFrame=g,M.renderAllFrames=v,M}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)}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},u=e*s-a*i;if(t)e?(d={x:n(i/e),y:n(a/e)},m={x:e,y:u/e}):a?(p=.5*h,m={x:a,y:u/a},d.x=n(s/a)):(m={x:i,y:s},d.x=.25*h);else if(e||a){var c=o(e*e+a*a);p=a>0?r(e/c):-r(e/c),m={x:c,y:u/c},d.x=n((e*i+a*s)/(c*c))}else if(i||s){var f=o(i*i+s*s);p=.5*h-(s>0?r(-i/f):-r(i/f)),m={x:u/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]}},applyToPointStringified:function(t,e){return t*this.props[0]+e*this.props[2]+this.props[4]+","+(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].pathNodes)},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){var a="";if(e.__renderedString)a=e.__renderedString;else{var i,s=e.v.length;for(i=1;s>i;i+=1)1==i&&(a+=" M"+e.v[0][0]+","+e.v[0][1]),a+=" C"+e.o[i-1][0]+","+e.o[i-1][1]+" "+e.i[i][0]+","+e.i[i][1]+" "+e.v[i][0]+","+e.v[i][1];t.cl&&(a+=" C"+e.o[i-1][0]+","+e.o[i-1][1]+" "+e.i[0][0]+","+e.i[0][1]+" "+e.v[0][0]+","+e.v[0][1]),e.__renderedString=a}t.lastPath!==a&&(t.inv?t.elem.setAttribute("d",this.solidPath+a):t.elem.setAttribute("d",a),t.lastPath=a)};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=t.length-1,n=[];for(a=r;a>=0;a-=1)if("fl"==t[a].ty||"st"==t[a].ty){e[a]={renderedFrames:[],lastData:{c:"",o:-1,w:""}};var o=document.createElementNS(svgNS,"path");this.shape.appendChild(o),this.stylesList.push({pathElement:o,type:t[a].ty,d:""}),e[a].style=this.stylesList[this.stylesList.length-1],n.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||"rc"==t[a].ty||"el"==t[a].ty)for(e[a]={elements:[],renderedFrames:[],styles:[],lastData:{d:"",o:"",tr:""}},s=this.stylesList.length,i=0;s>i;i+=1)this.stylesList[i].closed||(e[a].styles.push(this.stylesList[i]),"st"==this.stylesList[i].type&&(this.stylesList[i].pathElement.setAttribute("fill-opacity",0),this.stylesList[i].pathElement.setAttribute("stroke-linejoin","round"),this.stylesList[i].pathElement.setAttribute("stroke-linecap","round")));for(r=n.length,a=0;r>a;a+=1)n[a].closed=!0},ShapeItemElement.prototype.getElement=function(){return this.shape},ShapeItemElement.prototype.hideShape=function(){var t,e=this.stylesList.length;for(t=e-1;t>=0;t-=1)this.stylesList[t].pathElement.setAttribute("d","")},ShapeItemElement.prototype.renderShape=function(t,e,a,i){var s,r;if(!a)for(a=this.data,r=this.stylesList.length,s=0;r>s;s+=1)this.stylesList[s].d="";i||(i=this.viewData),this.frameNum=t,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.renderPath(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,n):"st"==a[s].ty?this.renderStroke(a[s],i[s],t,n):"gr"==a[s].ty?this.renderShape(t,n,a[s].it,i[s].it):"tm"==a[s].ty;for(r=this.stylesList.length,s=0;r>s;s+=1)this.stylesList[s].pathElement.setAttribute("d",this.stylesList[s].d)},ShapeItemElement.prototype.renderPath=function(t,e,a,i){if(!e.renderedFrames[this.globalData.frameNum]){var s=t.renderedData[a].path.pathNodes;if(!s.v)return;var r,n=s.v.length,o=s.s?s.s:[],h="";for(r=1;n>r;r+=1)o[r-1]?h+=" M"+i.mat.applyToPointStringified(o[r-1][0],o[r-1][1]):1==r&&(h+=" M"+i.mat.applyToPointStringified(s.v[0][0],s.v[0][1])),h+=" C"+i.mat.applyToPointStringified(s.o[r-1][0],s.o[r-1][1])+" "+i.mat.applyToPointStringified(s.i[r][0],s.i[r][1])+" "+i.mat.applyToPointStringified(s.v[r][0],s.v[r][1]);!t.closed||t.trimmed&&!s.c||(h+=" C"+i.mat.applyToPointStringified(s.o[r-1][0],s.o[r-1][1])+" "+i.mat.applyToPointStringified(s.i[0][0],s.i[0][1])+" "+i.mat.applyToPointStringified(s.v[0][0],s.v[0][1])),e.renderedFrames[this.globalData.frameNum]={dTr:h}}var l=e.renderedFrames[this.globalData.frameNum];for(n=e.styles.length,r=0;n>r;r+=1)e.styles[r].d+=l.dTr},ShapeItemElement.prototype.renderFill=function(t,e,a,i){var s=t.renderedData[a],r=e.style;e.renderedFrames[this.globalData.frameNum]||(e.renderedFrames[this.globalData.frameNum]={c:s.color,o:s.opacity*i.opacity});var n=e.renderedFrames[this.globalData.frameNum],o=n.c,h=n.o;e.lastData.c!=o&&r.pathElement.setAttribute("fill",o),e.lastData.o!=h&&r.pathElement.setAttribute("fill-opacity",h),e.lastData.c=o,e.lastData.o=h},ShapeItemElement.prototype.renderStroke=function(t,e,a,i){var s=t.renderedData[a],r=e.style;e.renderedFrames[this.globalData.frameNum]||(e.renderedFrames[this.globalData.frameNum]={c:s.color,o:s.opacity*i.opacity,w:s.width},s.dashes&&(e.renderedFrames[this.globalData.frameNum].d=s.dashes));var n=e.renderedFrames[this.globalData.frameNum],o=n.c,h=n.o,l=n.w,p=n.d;if(p){var m,d=p.length,u="",c="";for(m=0;d>m;m+=1)"o"!=p[m].n?u+=" "+p[m].v:c+=p[m].v}e.lastData.c!=o&&r.pathElement.setAttribute("stroke",o),e.lastData.o!=h&&r.pathElement.setAttribute("stroke-opacity",h),e.lastData.w!=l&&r.pathElement.setAttribute("stroke-width",l),p&&(e.lastData.da!=u&&r.pathElement.setAttribute("stroke-dasharray",u),e.lastData["do"]!=c&&r.pathElement.setAttribute("stroke-dashoffset",c)),e.lastData.c=o,e.lastData.o=h,e.lastData.w=l,p&&(e.lastData.da=u,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 u(){y=Date.now(),requestAnimationFrame(n)}var c={},f=[],y=0,g=!0,v=0;return setTimeout(u,0),c.registerAnimation=t,c.loadAnimation=e,c.setSpeed=a,c.setDirection=i,c.play=s,c.moveFrame=r,c.pause=o,c.stop=l,c.togglePause=p,c.searchAnimations=m,c.resize=d,c.start=u,c.goToAndStop=h,c}(),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 u(t){subframeEnabled=t}function c(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=c,y.setSubframeRendering=u,y.resize=p,y.start=m,y.goToAndStop=d,y.checkReady=f,t.bodymovin=y;var g=setInterval(f,100)}(window);}(window));