var t,e;"undefined"!=typeof navigator&&(t=window||{},e=function(u){"use strict";var h,D="",s=-999999,e=!0,k=(/^((?!chrome|android).)*safari/i.test(navigator.userAgent),Math.round,Math.pow),C=Math.sqrt,f=(Math.abs,Math.floor),m=(Math.max,Math.min),i={};!function(){var t,e=Object.getOwnPropertyNames(Math),s=e.length;for(t=0;t<s;t+=1)i[e[t]]=Math[e[t]]}(),i.random=Math.random,i.abs=function(t){if("object"===typeof t&&t.length){var e,s=S(t.length),i=t.length;for(e=0;e<i;e+=1)s[e]=Math.abs(t[e]);return s}return Math.abs(t)};var x=150,q=Math.PI/180,v=.5519;function a(t){t?Math.round:function(t){return t}}function r(t,e,s,i){this.type=t,this.currentTime=e,this.totalTime=s,this.direction=i<0?-1:1}function n(t,e){this.type=t,this.direction=e<0?-1:1}function o(t,e,s,i){this.type=t,this.currentLoop=s,this.totalLoops=e,this.direction=i<0?-1:1}function l(t,e,s){this.type=t,this.firstFrame=e,this.totalFrames=s}function p(t,e){this.type=t,this.target=e}function P(t,e){var s;void 0===e&&(e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");var i="";for(s=t;0<s;--s)i+=e[Math.round(Math.random()*(e.length-1))];return i}function d(t,e,s){var i,a,r,n,h,o,l,p;switch(o=s*(1-e),l=s*(1-(h=6*t-(n=Math.floor(6*t)))*e),p=s*(1-(1-h)*e),n%6){case 0:i=s,a=p,r=o;break;case 1:i=l,a=s,r=o;break;case 2:i=o,a=s,r=p;break;case 3:i=o,a=l,r=s;break;case 4:i=p,a=o,r=s;break;case 5:i=s,a=o,r=l}return[i,a,r]}function c(t,e,s){var i,a=Math.max(t,e,s),r=Math.min(t,e,s),n=a-r,h=0===a?0:n/a,o=a/255;switch(a){case r:i=0;break;case t:i=e-s+n*(e<s?6:0),i/=6*n;break;case e:i=s-t+2*n,i/=6*n;break;case s:i=t-e+4*n,i/=6*n}return[i,h,o]}function lt(t,e){var s=c(255*t[0],255*t[1],255*t[2]);return s[1]+=e,1<s[1]?s[1]=1:s[1]<=0&&(s[1]=0),d(s[0],s[1],s[2])}function pt(t,e){var s=c(255*t[0],255*t[1],255*t[2]);return s[2]+=e,1<s[2]?s[2]=1:s[2]<0&&(s[2]=0),d(s[0],s[1],s[2])}function ft(t,e){var s=c(255*t[0],255*t[1],255*t[2]);return s[0]+=e/360,1<s[0]?s[0]-=1:s[0]<0&&(s[0]+=1),d(s[0],s[1],s[2])}a(!1);!function(){var t,e,s=[];for(t=0;t<256;t+=1)e=t.toString(16),s[t]=1==e.length?"0"+e:e}();function t(){}t.prototype={triggerEvent:function(t,e){if(this._cbs[t])for(var s=this._cbs[t].length,i=0;i<s;i++)this._cbs[t][i](e)},addEventListener:function(t,e){return this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e),function(){this.removeEventListener(t,e)}.bind(this)},removeEventListener:function(t,e){if(e){if(this._cbs[t]){for(var s=0,i=this._cbs[t].length;s<i;)this._cbs[t][s]===e&&(this._cbs[t].splice(s,1),s-=1,i-=1),s+=1;this._cbs[t].length||(this._cbs[t]=null)}}else this._cbs[t]=null}};var B="function"==typeof Uint8ClampedArray&&"function"==typeof Float32Array?function(t,e){return"float32"===t?new Float32Array(e):"int16"===t?new Int16Array(e):"uint8c"===t?new Uint8ClampedArray(e):void 0}:function(t,e){var s,i=0,a=[];switch(t){case"int16":case"uint8c":s=1;break;default:s=1.1}for(i=0;i<e;i+=1)a.push(s);return a};function S(t){return Array.apply(null,{length:t})}function g(t){return document.createElement(t)}function y(){}y.prototype={addDynamicProperty:function(t){-1===this.dynamicProperties.indexOf(t)&&(this.dynamicProperties.push(t),this.container.addDynamicProperty(this),this._isAnimated=!0)},iterateDynamicProperties:function(){this._mdf=!1;var t,e=this.dynamicProperties.length;for(t=0;t<e;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t]._mdf&&(this._mdf=!0)},initDynamicPropertyContainer:function(t){this.container=t,this.dynamicProperties=[],this._mdf=!1,this._isAnimated=!1}};var b=function(){var a=Math.cos,r=Math.sin,n=Math.tan,i=Math.round;function t(){return this.props[0]=1,this.props[1]=0,this.props[2]=0,this.props[3]=0,this.props[4]=0,this.props[5]=1,this.props[6]=0,this.props[7]=0,this.props[8]=0,this.props[9]=0,this.props[10]=1,this.props[11]=0,this.props[12]=0,this.props[13]=0,this.props[14]=0,this.props[15]=1,this}function e(t){if(0===t)return this;var e=a(t),s=r(t);return this._t(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1)}function s(t){if(0===t)return this;var e=a(t),s=r(t);return this._t(1,0,0,0,0,e,-s,0,0,s,e,0,0,0,0,1)}function h(t){if(0===t)return this;var e=a(t),s=r(t);return this._t(e,0,s,0,0,1,0,0,-s,0,e,0,0,0,0,1)}function o(t){if(0===t)return this;var e=a(t),s=r(t);return this._t(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1)}function l(t,e){return this._t(1,e,t,1,0,0)}function p(t,e){return this.shear(n(t),n(e))}function f(t,e){var s=a(e),i=r(e);return this._t(s,i,0,0,-i,s,0,0,0,0,1,0,0,0,0,1)._t(1,0,0,0,n(t),1,0,0,0,0,1,0,0,0,0,1)._t(s,-i,0,0,i,s,0,0,0,0,1,0,0,0,0,1)}function m(t,e,s){return s||0===s||(s=1),1===t&&1===e&&1===s?this:this._t(t,0,0,0,0,e,0,0,0,0,s,0,0,0,0,1)}function d(t,e,s,i,a,r,n,h,o,l,p,f,m,d,c,u){return this.props[0]=t,this.props[1]=e,this.props[2]=s,this.props[3]=i,this.props[4]=a,this.props[5]=r,this.props[6]=n,this.props[7]=h,this.props[8]=o,this.props[9]=l,this.props[10]=p,this.props[11]=f,this.props[12]=m,this.props[13]=d,this.props[14]=c,this.props[15]=u,this}function c(t,e,s){return s=s||0,0!==t||0!==e||0!==s?this._t(1,0,0,0,0,1,0,0,0,0,1,0,t,e,s,1):this}function u(t,e,s,i,a,r,n,h,o,l,p,f,m,d,c,u){var g=this.props;if(1===t&&0===e&&0===s&&0===i&&0===a&&1===r&&0===n&&0===h&&0===o&&0===l&&1===p&&0===f)return g[12]=g[12]*t+g[15]*m,g[13]=g[13]*r+g[15]*d,g[14]=g[14]*p+g[15]*c,g[15]=g[15]*u,this._identityCalculated=!1,this;var y=g[0],v=g[1],b=g[2],_=g[3],k=g[4],D=g[5],C=g[6],x=g[7],P=g[8],S=g[9],T=g[10],A=g[11],w=g[12],M=g[13],F=g[14],I=g[15];return g[0]=y*t+v*a+b*o+_*m,g[1]=y*e+v*r+b*l+_*d,g[2]=y*s+v*n+b*p+_*c,g[3]=y*i+v*h+b*f+_*u,g[4]=k*t+D*a+C*o+x*m,g[5]=k*e+D*r+C*l+x*d,g[6]=k*s+D*n+C*p+x*c,g[7]=k*i+D*h+C*f+x*u,g[8]=P*t+S*a+T*o+A*m,g[9]=P*e+S*r+T*l+A*d,g[10]=P*s+S*n+T*p+A*c,g[11]=P*i+S*h+T*f+A*u,g[12]=w*t+M*a+F*o+I*m,g[13]=w*e+M*r+F*l+I*d,g[14]=w*s+M*n+F*p+I*c,g[15]=w*i+M*h+F*f+I*u,this._identityCalculated=!1,this}function g(){return this._identityCalculated||(this._identity=!(1!==this.props[0]||0!==this.props[1]||0!==this.props[2]||0!==this.props[3]||0!==this.props[4]||1!==this.props[5]||0!==this.props[6]||0!==this.props[7]||0!==this.props[8]||0!==this.props[9]||1!==this.props[10]||0!==this.props[11]||0!==this.props[12]||0!==this.props[13]||0!==this.props[14]||1!==this.props[15]),this._identityCalculated=!0),this._identity}function y(t){for(var e=0;e<16;){if(t.props[e]!==this.props[e])return!1;e+=1}return!0}function v(t){var e;for(e=0;e<16;e+=1)t.props[e]=this.props[e]}function b(t){var e;for(e=0;e<16;e+=1)this.props[e]=t[e]}function _(t,e,s){return{x:t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],y:t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],z:t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]}}function k(t,e,s){return t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12]}function D(t,e,s){return t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13]}function C(t,e,s){return t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]}function x(t){var e=this.props[0]*this.props[5]-this.props[1]*this.props[4],s=this.props[5]/e,i=-this.props[1]/e,a=-this.props[4]/e,r=this.props[0]/e,n=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/e,h=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/e;return[t[0]*s+t[1]*a+n,t[0]*i+t[1]*r+h,0]}function P(t){var e,s=t.length,i=[];for(e=0;e<s;e+=1)i[e]=x(t[e]);return i}function S(t,e,s){var i=B("float32",6);if(this.isIdentity())i[0]=t[0],i[1]=t[1],i[2]=e[0],i[3]=e[1],i[4]=s[0],i[5]=s[1];else{var a=this.props[0],r=this.props[1],n=this.props[4],h=this.props[5],o=this.props[12],l=this.props[13];i[0]=t[0]*a+t[1]*n+o,i[1]=t[0]*r+t[1]*h+l,i[2]=e[0]*a+e[1]*n+o,i[3]=e[0]*r+e[1]*h+l,i[4]=s[0]*a+s[1]*n+o,i[5]=s[0]*r+s[1]*h+l}return i}function T(t,e,s){return this.isIdentity()?[t,e,s]:[t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]]}function A(t,e){if(this.isIdentity())return t+","+e;var s=this.props;return Math.round(100*(t*s[0]+e*s[4]+s[12]))/100+","+Math.round(100*(t*s[1]+e*s[5]+s[13]))/100}function w(){for(var t=0,e=this.props,s="matrix3d(";t<16;)s+=i(1e4*e[t])/1e4,s+=15===t?")":",",t+=1;return s}function M(t){return t<1e-6&&0<t||-1e-6<t&&t<0?i(1e4*t)/1e4:t}function F(){var t=this.props;return"matrix("+M(t[0])+","+M(t[1])+","+M(t[4])+","+M(t[5])+","+M(t[12])+","+M(t[13])+")"}return function(){this.reset=t,this.rotate=e,this.rotateX=s,this.rotateY=h,this.rotateZ=o,this.skew=p,this.skewFromAxis=f,this.shear=l,this.scale=m,this.setTransform=d,this.translate=c,this.transform=u,this.applyToPoint=_,this.applyToX=k,this.applyToY=D,this.applyToZ=C,this.applyToPointArray=T,this.applyToTriplePoints=S,this.applyToPointStringified=A,this.toCSS=w,this.to2dCSS=F,this.clone=v,this.cloneFromProps=b,this.equals=y,this.inversePoints=P,this.inversePoint=x,this._t=this.transform,this.isIdentity=g,this._identity=!0,this._identityCalculated=!1,this.props=B("float32",16),this.reset()}}();!function(h,o){var l,p=this,f=256,m=6,d="random",c=o.pow(f,m),u=o.pow(2,52),g=2*u,y=f-1;function v(t){var e,s=t.length,n=this,i=0,a=n.i=n.j=0,r=n.S=[];for(s||(t=[s++]);i<f;)r[i]=i++;for(i=0;i<f;i++)r[i]=r[a=y&a+t[i%s]+(e=r[i])],r[a]=e;n.g=function(t){for(var e,s=0,i=n.i,a=n.j,r=n.S;t--;)e=r[i=y&i+1],s=s*f+r[y&(r[i]=r[a=y&a+e])+(r[a]=e)];return n.i=i,n.j=a,s}}function b(t,e){return e.i=t.i,e.j=t.j,e.S=t.S.slice(),e}function _(t,e){for(var s,i=t+"",a=0;a<i.length;)e[y&a]=y&(s^=19*e[y&a])+i.charCodeAt(a++);return k(e)}function k(t){return String.fromCharCode.apply(0,t)}o["seed"+d]=function(t,e,s){var i=[],a=_(function t(e,s){var i,a=[],r=typeof e;if(s&&"object"==r)for(i in e)try{a.push(t(e[i],s-1))}catch(t){}return a.length?a:"string"==r?e:e+"\0"}((e=!0===e?{entropy:!0}:e||{}).entropy?[t,k(h)]:null===t?function(){try{if(l)return k(l.randomBytes(f));var t=new Uint8Array(f);return(p.crypto||p.msCrypto).getRandomValues(t),k(t)}catch(t){var e=p.navigator,s=e&&e.plugins;return[+new Date,p,s,p.screen,k(h)]}}():t,3),i),r=new v(i),n=function(){for(var t=r.g(m),e=c,s=0;t<u;)t=(t+s)*f,e*=f,s=r.g(1);for(;g<=t;)t/=2,e/=2,s>>>=1;return(t+s)/e};return n.int32=function(){return 0|r.g(4)},n.quick=function(){return r.g(4)/4294967296},n.double=n,_(k(r.S),h),(e.pass||s||function(t,e,s,i){return i&&(i.S&&b(i,r),t.state=function(){return b(r,{})}),s?(o[d]=t,e):t})(n,a,"global"in e?e.global:this==o,e.state)},_(o.random(),h)}([],i);var j=function(){var t={getBezierEasing:function(t,e,s,i,a){var r=a||("bez_"+t+"_"+e+"_"+s+"_"+i).replace(/\./g,"p");if(h[r])return h[r];var n=new o([t,e,s,i]);return h[r]=n}},h={};var l=11,p=1/(l-1),e="function"==typeof Float32Array;function i(t,e){return 1-3*e+3*t}function a(t,e){return 3*e-6*t}function r(t){return 3*t}function f(t,e,s){return((i(e,s)*t+a(e,s))*t+r(e))*t}function m(t,e,s){return 3*i(e,s)*t*t+2*a(e,s)*t+r(e)}function o(t){this._p=t,this._mSampleValues=e?new Float32Array(l):new Array(l),this._precomputed=!1,this.get=this.get.bind(this)}return o.prototype={get:function(t){var e=this._p[0],s=this._p[1],i=this._p[2],a=this._p[3];return this._precomputed||this._precompute(),e===s&&i===a?t:0===t?0:1===t?1:f(this._getTForX(t),s,a)},_precompute:function(){var t=this._p[0],e=this._p[1],s=this._p[2],i=this._p[3];this._precomputed=!0,t===e&&s===i||this._calcSampleValues()},_calcSampleValues:function(){for(var t=this._p[0],e=this._p[2],s=0;s<l;++s)this._mSampleValues[s]=f(s*p,t,e)},_getTForX:function(t){for(var e=this._p[0],s=this._p[2],i=this._mSampleValues,a=0,r=1,n=l-1;r!==n&&i[r]<=t;++r)a+=p;var h=a+(t-i[--r])/(i[r+1]-i[r])*p,o=m(h,e,s);return.001<=o?function(t,e,s,i){for(var a=0;a<4;++a){var r=m(e,s,i);if(0===r)return e;e-=(f(e,s,i)-t)/r}return e}(t,h,e,s):0===o?h:function(t,e,s,i,a){for(var r,n,h=0;0<(r=f(n=e+(s-e)/2,i,a)-t)?s=n:e=n,1e-7<Math.abs(r)&&++h<10;);return n}(t,a,a+p,e,s)}},t}();function _(t,e){var s,i,a=t.length;for(s=0;s<a;s+=1)for(var r in i=t[s].prototype)i.hasOwnProperty(r)&&(e.prototype[r]=i[r])}!function(){for(var r=0,t=["ms","moz","webkit","o"],e=0;e<t.length&&!u.requestAnimationFrame;++e)u.requestAnimationFrame=u[t[e]+"RequestAnimationFrame"],u.cancelAnimationFrame=u[t[e]+"CancelAnimationFrame"]||u[t[e]+"CancelRequestAnimationFrame"];u.requestAnimationFrame||(u.requestAnimationFrame=function(t,e){var s=(new Date).getTime(),i=Math.max(0,16-(s-r)),a=setTimeout(function(){t(s+i)},i);return r=s+i,a}),u.cancelAnimationFrame||(u.cancelAnimationFrame=function(t){clearTimeout(t)})}();var mt=function(){function y(t,e,s,i,a,r){var n=t*i+e*a+s*r-a*i-r*t-s*e;return-.001<n&&n<.001}Math;var p=function(t,e,s,i){var a,r,n,h,o,l,p=x,f=0,m=[],d=[],c=bt.newElement();for(n=s.length,a=0;a<p;a+=1){for(o=a/(p-1),r=l=0;r<n;r+=1)h=k(1-o,3)*t[r]+3*k(1-o,2)*o*s[r]+3*(1-o)*k(o,2)*i[r]+k(o,3)*e[r],m[r]=h,null!==d[r]&&(l+=k(m[r]-d[r],2)),d[r]=m[r];l&&(f+=l=C(l)),c.percents[a]=o,c.lengths[a]=f}return c.addedLength=f,c};function v(t){this.segmentLength=0,this.points=new Array(t)}function b(t,e){this.partialLength=t,this.point=e}var _,t=(_={},function(t){var e=t.s,s=t.e,i=t.to,a=t.ti,r=(e[0]+"_"+e[1]+"_"+s[0]+"_"+s[1]+"_"+i[0]+"_"+i[1]+"_"+a[0]+"_"+a[1]).replace(/\./g,"p");if(_[r])t.bezierData=_[r];else{var n,h,o,l,p,f,m,d=x,c=0,u=null;2===e.length&&(e[0]!=s[0]||e[1]!=s[1])&&y(e[0],e[1],s[0],s[1],e[0]+i[0],e[1]+i[1])&&y(e[0],e[1],s[0],s[1],s[0]+a[0],s[1]+a[1])&&(d=2);var g=new v(d);for(o=i.length,n=0;n<d;n+=1){for(m=S(o),p=n/(d-1),h=f=0;h<o;h+=1)l=k(1-p,3)*e[h]+3*k(1-p,2)*p*(e[h]+i[h])+3*(1-p)*k(p,2)*(s[h]+a[h])+k(p,3)*s[h],m[h]=l,null!==u&&(f+=k(m[h]-u[h],2));c+=f=C(f),g.points[n]=new b(f,m),u=m}g.segmentLength=c,t.bezierData=g,_[r]=g}});function w(t,e){var s=e.percents,i=e.lengths,a=s.length,r=f((a-1)*t),n=t*e.addedLength,h=0;if(r===a-1||0===r||n===i[r])return s[r];for(var o=i[r]>n?-1:1,l=!0;l;)if(i[r]<=n&&i[r+1]>n?(h=(n-i[r])/(i[r+1]-i[r]),l=!1):r+=o,r<0||a-1<=r){if(r===a-1)return s[r];l=!1}return s[r]+(s[r+1]-s[r])*h}var M=B("float32",8);return{getSegmentsLength:function(t){var e,s=vt.newElement(),i=t.c,a=t.v,r=t.o,n=t.i,h=t._length,o=s.lengths,l=0;for(e=0;e<h-1;e+=1)o[e]=p(a[e],a[e+1],r[e],n[e+1]),l+=o[e].addedLength;return i&&h&&(o[e]=p(a[e],a[0],r[e],n[0]),l+=o[e].addedLength),s.totalLength=l,s},getNewSegment:function(t,e,s,i,a,r,n){var h,o=w(a=a<0?0:1<a?1:a,n),l=w(r=1<r?1:r,n),p=t.length,f=1-o,m=1-l,d=f*f*f,c=o*f*f*3,u=o*o*f*3,g=o*o*o,y=f*f*m,v=o*f*m+f*o*m+f*f*l,b=o*o*m+f*o*l+o*f*l,_=o*o*l,k=f*m*m,D=o*m*m+f*l*m+f*m*l,C=o*l*m+f*l*l+o*m*l,x=o*l*l,P=m*m*m,S=l*m*m+m*l*m+m*m*l,T=l*l*m+m*l*l+l*m*l,A=l*l*l;for(h=0;h<p;h+=1)M[4*h]=Math.round(1e3*(d*t[h]+c*s[h]+u*i[h]+g*e[h]))/1e3,M[4*h+1]=Math.round(1e3*(y*t[h]+v*s[h]+b*i[h]+_*e[h]))/1e3,M[4*h+2]=Math.round(1e3*(k*t[h]+D*s[h]+C*i[h]+x*e[h]))/1e3,M[4*h+3]=Math.round(1e3*(P*t[h]+S*s[h]+T*i[h]+A*e[h]))/1e3;return M},getPointInSegment:function(t,e,s,i,a,r){var n=w(a,r),h=1-n;return[Math.round(1e3*(h*h*h*t[0]+(n*h*h+h*n*h+h*h*n)*s[0]+(n*n*h+h*n*n+n*h*n)*i[0]+n*n*n*e[0]))/1e3,Math.round(1e3*(h*h*h*t[1]+(n*h*h+h*n*h+h*h*n)*s[1]+(n*n*h+h*n*n+n*h*n)*i[1]+n*n*n*e[1]))/1e3]},buildBezierData:t,pointOnLine2D:y,pointOnLine3D:function(t,e,s,i,a,r,n,h,o){if(0===s&&0===r&&0===o)return y(t,e,i,a,n,h);var l,p=Math.sqrt(Math.pow(i-t,2)+Math.pow(a-e,2)+Math.pow(r-s,2)),f=Math.sqrt(Math.pow(n-t,2)+Math.pow(h-e,2)+Math.pow(o-s,2)),m=Math.sqrt(Math.pow(n-i,2)+Math.pow(h-a,2)+Math.pow(o-r,2));return-1e-4<(l=f<p?m<p?p-f-m:m-f-p:f<m?m-f-p:f-p-m)&&l<1e-4}}}();var T=function(){function d(t,e){for(var s=0,i=e.length;s<i;){if(e[s].id===t)return e[s].layers.__used?JSON.parse(JSON.stringify(e[s].layers)):(e[s].layers.__used=!0,e[s].layers);s+=1}}function c(t){var e,s,i;for(e=t.length-1;0<=e;e-=1)if("sh"==t[e].ty)if(t[e].ks.k.i)u(t[e].ks.k);else for(i=t[e].ks.k.length,s=0;s<i;s+=1)t[e].ks.k[s].s&&u(t[e].ks.k[s].s[0]),t[e].ks.k[s].e&&u(t[e].ks.k[s].e[0]);else"gr"==t[e].ty&&c(t[e].it)}function u(t){var e,s=t.i.length;for(e=0;e<s;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 h(t,e){var s=e?e.split("."):[100,100,100];return t[0]>s[0]||!(s[0]>t[0])&&(t[1]>s[1]||!(s[1]>t[1])&&(t[2]>s[2]||!(s[2]>t[2])&&void 0))}var o,s=function(){var i=[4,4,14];function a(t){var e,s,i,a=t.length;for(e=0;e<a;e+=1)5===t[e].ty&&(s=t[e],i=s.t.d,s.t.d={k:[{s:i,t:0}]})}return function(t){if(h(i,t.v)&&(a(t.layers),t.assets)){var e,s=t.assets.length;for(e=0;e<s;e+=1)t.assets[e].layers&&a(t.assets[e].layers)}}}(),i=(o=[4,7,99],function(t){if(t.chars&&!h(o,t.v)){var e,s,i,a,r,n=t.chars.length;for(e=0;e<n;e+=1)if(t.chars[e].data&&t.chars[e].data.shapes)for(i=(r=t.chars[e].data.shapes[0].it).length,s=0;s<i;s+=1)(a=r[s].ks.k).__converted||(u(r[s].ks.k),a.__converted=!0)}}),a=function(){var i=[4,1,9];function r(t){var e,s,i,a=t.length;for(e=0;e<a;e+=1)if("gr"===t[e].ty)r(t[e].it);else if("fl"===t[e].ty||"st"===t[e].ty)if(t[e].c.k&&t[e].c.k[0].i)for(i=t[e].c.k.length,s=0;s<i;s+=1)t[e].c.k[s].s&&(t[e].c.k[s].s[0]/=255,t[e].c.k[s].s[1]/=255,t[e].c.k[s].s[2]/=255,t[e].c.k[s].s[3]/=255),t[e].c.k[s].e&&(t[e].c.k[s].e[0]/=255,t[e].c.k[s].e[1]/=255,t[e].c.k[s].e[2]/=255,t[e].c.k[s].e[3]/=255);else t[e].c.k[0]/=255,t[e].c.k[1]/=255,t[e].c.k[2]/=255,t[e].c.k[3]/=255}function a(t){var e,s=t.length;for(e=0;e<s;e+=1)4===t[e].ty&&r(t[e].shapes)}return function(t){if(h(i,t.v)&&(a(t.layers),t.assets)){var e,s=t.assets.length;for(e=0;e<s;e+=1)t.assets[e].layers&&a(t.assets[e].layers)}}}(),r=function(){var i=[4,4,18];function l(t){var e,s,i;for(e=t.length-1;0<=e;e-=1)if("sh"==t[e].ty)if(t[e].ks.k.i)t[e].ks.k.c=t[e].closed;else for(i=t[e].ks.k.length,s=0;s<i;s+=1)t[e].ks.k[s].s&&(t[e].ks.k[s].s[0].c=t[e].closed),t[e].ks.k[s].e&&(t[e].ks.k[s].e[0].c=t[e].closed);else"gr"==t[e].ty&&l(t[e].it)}function a(t){var e,s,i,a,r,n,h=t.length;for(s=0;s<h;s+=1){if((e=t[s]).hasMask){var o=e.masksProperties;for(a=o.length,i=0;i<a;i+=1)if(o[i].pt.k.i)o[i].pt.k.c=o[i].cl;else for(n=o[i].pt.k.length,r=0;r<n;r+=1)o[i].pt.k[r].s&&(o[i].pt.k[r].s[0].c=o[i].cl),o[i].pt.k[r].e&&(o[i].pt.k[r].e[0].c=o[i].cl)}4===e.ty&&l(e.shapes)}}return function(t){if(h(i,t.v)&&(a(t.layers),t.assets)){var e,s=t.assets.length;for(e=0;e<s;e+=1)t.assets[e].layers&&a(t.assets[e].layers)}}}(),t={};return t.completeData=function(t,e){t.__complete||(a(t),s(t),i(t),r(t),function t(e,s,i){var a,r,n,h,o,l,p,f=e.length;for(r=0;r<f;r+=1)if("ks"in(a=e[r])&&!a.completed){if(a.completed=!0,a.tt&&(e[r-1].td=a.tt),a.hasMask){var m=a.masksProperties;for(h=m.length,n=0;n<h;n+=1)if(m[n].pt.k.i)u(m[n].pt.k);else for(l=m[n].pt.k.length,o=0;o<l;o+=1)m[n].pt.k[o].s&&u(m[n].pt.k[o].s[0]),m[n].pt.k[o].e&&u(m[n].pt.k[o].e[0])}0===a.ty?(a.layers=d(a.refId,s),t(a.layers,s,i)):4===a.ty?c(a.shapes):5==a.ty&&(0!==(p=a).t.a.length||"m"in p.t.p||(p.singleShape=!0))}}(t.layers,t.assets,e),t.__complete=!0)},t}(),A=function(){var r={w:0,size:0,shapes:[]},t=[];function u(t,e){var s=g("span");s.style.fontFamily=e;var i=g("span");i.innerHTML="giItT1WQy@!-/#",s.style.position="absolute",s.style.left="-10000px",s.style.top="-10000px",s.style.fontSize="300px",s.style.fontVariant="normal",s.style.fontStyle="normal",s.style.fontWeight="normal",s.style.letterSpacing="0",s.appendChild(i),document.body.appendChild(s);var a=i.offsetWidth;return i.style.fontFamily=t+", "+e,{node:i,w:a,parent:s}}t=t.concat([2304,2305,2306,2307,2362,2363,2364,2364,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2387,2388,2389,2390,2391,2402,2403]);var e=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.isLoaded=!1,this.initTime=Date.now()};return e.getCombinedCharacterCodes=function(){return t},e.prototype.addChars=function(t){if(t){this.chars||(this.chars=[]);var e,s,i,a=t.length,r=this.chars.length;for(e=0;e<a;e+=1){for(s=0,i=!1;s<r;)this.chars[s].style===t[e].style&&this.chars[s].fFamily===t[e].fFamily&&this.chars[s].ch===t[e].ch&&(i=!0),s+=1;i||(this.chars.push(t[e]),r+=1)}}},e.prototype.addFonts=function(t,e){if(t){if(this.chars)return this.isLoaded=!0,void(this.fonts=t.list);var s,i,a,r,n=t.list,h=n.length,o=h;for(s=0;s<h;s+=1){var l,p,f=!0;if(n[s].loaded=!1,n[s].monoCase=u(n[s].fFamily,"monospace"),n[s].sansCase=u(n[s].fFamily,"sans-serif"),n[s].fPath){if("p"===n[s].fOrigin||3===n[s].origin){if(0<(l=document.querySelectorAll('style[f-forigin="p"][f-family="'+n[s].fFamily+'"], style[f-origin="3"][f-family="'+n[s].fFamily+'"]')).length&&(f=!1),f){var m=g("style");m.setAttribute("f-forigin",n[s].fOrigin),m.setAttribute("f-origin",n[s].origin),m.setAttribute("f-family",n[s].fFamily),m.type="text/css",m.innerHTML="@font-face {font-family: "+n[s].fFamily+"; font-style: normal; src: url('"+n[s].fPath+"');}",e.appendChild(m)}}else if("g"===n[s].fOrigin||1===n[s].origin){for(l=document.querySelectorAll('link[f-forigin="g"], link[f-origin="1"]'),p=0;p<l.length;p++)-1!==l[p].href.indexOf(n[s].fPath)&&(f=!1);if(f){var d=g("link");d.setAttribute("f-forigin",n[s].fOrigin),d.setAttribute("f-origin",n[s].origin),d.type="text/css",d.rel="stylesheet",d.href=n[s].fPath,document.body.appendChild(d)}}else if("t"===n[s].fOrigin||2===n[s].origin){for(l=document.querySelectorAll('script[f-forigin="t"], script[f-origin="2"]'),p=0;p<l.length;p++)n[s].fPath===l[p].src&&(f=!1);if(f){var c=g("link");c.setAttribute("f-forigin",n[s].fOrigin),c.setAttribute("f-origin",n[s].origin),c.setAttribute("rel","stylesheet"),c.setAttribute("href",n[s].fPath),e.appendChild(c)}}}else n[s].loaded=!0,o-=1;n[s].helper=(i=e,a=n[s],r=void 0,(r=createNS("text")).style.fontSize="100px",r.setAttribute("font-family",a.fFamily),r.setAttribute("font-style",a.fStyle),r.setAttribute("font-weight",a.fWeight),r.textContent="1",a.fClass?(r.style.fontFamily="inherit",r.className=a.fClass):r.style.fontFamily=a.fFamily,i.appendChild(r),g("canvas").getContext("2d").font=a.fWeight+" "+a.fStyle+" 100px "+a.fFamily,r),n[s].cache={},this.fonts.push(n[s])}0===o?this.isLoaded=!0:setTimeout(this.checkLoadedFonts.bind(this),100)}else this.isLoaded=!0},e.prototype.getCharData=function(t,e,s){for(var i=0,a=this.chars.length;i<a;){if(this.chars[i].ch===t&&this.chars[i].style===e&&this.chars[i].fFamily===s)return this.chars[i];i+=1}return console&&console.warn&&console.warn("Missing character from exported characters list: ",t,e,s),r},e.prototype.getFontByName=function(t){for(var e=0,s=this.fonts.length;e<s;){if(this.fonts[e].fName===t)return this.fonts[e];e+=1}return this.fonts[0]},e.prototype.measureText=function(t,e,s){var i=this.getFontByName(e),a=t.charCodeAt(0);if(!i.cache[a+1]){var r=i.helper;if(" "===t){r.textContent="|"+t+"|";var n=r.getComputedTextLength();r.textContent="||";var h=r.getComputedTextLength();i.cache[a+1]=(n-h)/100}else r.textContent=t,i.cache[a+1]=r.getComputedTextLength()/100}return i.cache[a+1]*s},e.prototype.checkLoadedFonts=function(){var t,e,s,i=this.fonts.length,a=i;for(t=0;t<i;t+=1)this.fonts[t].loaded?a-=1:"n"===this.fonts[t].fOrigin||0===this.fonts[t].origin?this.fonts[t].loaded=!0:(e=this.fonts[t].monoCase.node,s=this.fonts[t].monoCase.w,e.offsetWidth!==s?(a-=1,this.fonts[t].loaded=!0):(e=this.fonts[t].sansCase.node,s=this.fonts[t].sansCase.w,e.offsetWidth!==s&&(a-=1,this.fonts[t].loaded=!0)),this.fonts[t].loaded&&(this.fonts[t].sansCase.parent.parentNode.removeChild(this.fonts[t].sansCase.parent),this.fonts[t].monoCase.parent.parentNode.removeChild(this.fonts[t].monoCase.parent)));0!==a&&Date.now()-this.initTime<5e3?setTimeout(this.checkLoadedFonts.bind(this),20):setTimeout(function(){this.isLoaded=!0}.bind(this),0)},e.prototype.loaded=function(){return this.isLoaded},e}(),w=function(){var f=s,a=Math.abs;function m(t,e){var s,i=this.offsetTime;"multidimensional"===this.propType&&(s=B("float32",this.pv.length));for(var a,r,n,h,o,l,p,f,m=e.lastIndex,d=m,c=this.keyframes.length-1,u=!0;u;){if(a=this.keyframes[d],r=this.keyframes[d+1],d===c-1&&t>=r.t-i){a.h&&(a=r),m=0;break}if(r.t-i>t){m=d;break}d<c-1?d+=1:(m=0,u=!1)}var g,y,v,b,_,k,D,C,x,P=r.t-i,S=a.t-i;if(a.to){a.bezierData||mt.buildBezierData(a);var T=a.bezierData;if(P<=t||t<S){var A=P<=t?T.points.length-1:0;for(h=T.points[A].point.length,n=0;n<h;n+=1)s[n]=T.points[A].point[n]}else{a.__fnct?f=a.__fnct:(f=j.getBezierEasing(a.o.x,a.o.y,a.i.x,a.i.y,a.n).get,a.__fnct=f),o=f((t-S)/(P-S));var w,M=T.segmentLength*o,F=e.lastFrame<t&&e._lastBezierData===T?e._lastAddedLength:0;for(p=e.lastFrame<t&&e._lastBezierData===T?e._lastPoint:0,u=!0,l=T.points.length;u;){if(F+=T.points[p].partialLength,0===M||0===o||p===T.points.length-1){for(h=T.points[p].point.length,n=0;n<h;n+=1)s[n]=T.points[p].point[n];break}if(F<=M&&M<F+T.points[p+1].partialLength){for(w=(M-F)/T.points[p+1].partialLength,h=T.points[p].point.length,n=0;n<h;n+=1)s[n]=T.points[p].point[n]+(T.points[p+1].point[n]-T.points[p].point[n])*w;break}p<l-1?p+=1:u=!1}e._lastPoint=p,e._lastAddedLength=F-T.points[p].partialLength,e._lastBezierData=T}}else{var I,E,L,N,z;if(c=a.s.length,this.sh&&1!==a.h)if(P<=t)s[0]=a.e[0],s[1]=a.e[1],s[2]=a.e[2];else if(t<=S)s[0]=a.s[0],s[1]=a.s[1],s[2]=a.s[2];else{var R=O(a.s),V=O(a.e);g=s,y=function(t,e,s){var i,a,r,n,h,o=[],l=t[0],p=t[1],f=t[2],m=t[3],d=e[0],c=e[1],u=e[2],g=e[3];(a=l*d+p*c+f*u+m*g)<0&&(a=-a,d=-d,c=-c,u=-u,g=-g);h=1e-6<1-a?(i=Math.acos(a),r=Math.sin(i),n=Math.sin((1-s)*i)/r,Math.sin(s*i)/r):(n=1-s,s);return o[0]=n*l+h*d,o[1]=n*p+h*c,o[2]=n*f+h*u,o[3]=n*m+h*g,o}(R,V,(t-S)/(P-S)),v=y[0],b=y[1],_=y[2],k=y[3],D=Math.atan2(2*b*k-2*v*_,1-2*b*b-2*_*_),C=Math.asin(2*v*b+2*_*k),x=Math.atan2(2*v*k-2*b*_,1-2*v*v-2*_*_),g[0]=D/q,g[1]=C/q,g[2]=x/q}else for(d=0;d<c;d+=1)1!==a.h&&(o=P<=t?1:t<S?0:(a.o.x.constructor===Array?(a.__fnct||(a.__fnct=[]),a.__fnct[d]?f=a.__fnct[d]:(I=void 0===typeof a.o.x[d]?a.o.x[0]:a.o.x[d],E=void 0===typeof a.o.y[d]?a.o.y[0]:a.o.y[d],L=void 0===typeof a.i.x[d]?a.i.x[0]:a.i.x[d],N=void 0===typeof a.i.y[d]?a.i.y[0]:a.i.y[d],f=j.getBezierEasing(I,E,L,N).get,a.__fnct[d]=f)):a.__fnct?f=a.__fnct:(I=a.o.x,E=a.o.y,L=a.i.x,N=a.i.y,f=j.getBezierEasing(I,E,L,N).get,a.__fnct=f),f((t-S)/(P-S)))),z=1===a.h?a.s[d]:a.s[d]+(a.e[d]-a.s[d])*o,1===c?s=z:s[d]=z}return e.lastIndex=m,s}function O(t){var e=t[0]*q,s=t[1]*q,i=t[2]*q,a=Math.cos(e/2),r=Math.cos(s/2),n=Math.cos(i/2),h=Math.sin(e/2),o=Math.sin(s/2),l=Math.sin(i/2);return[h*o*n+a*r*l,h*r*n+a*o*l,a*o*n-h*r*l,a*r*n-h*o*l]}function d(){var t=this.comp.renderedFrame-this.offsetTime,e=this.keyframes[0].t-this.offsetTime,s=this.keyframes[this.keyframes.length-1].t-this.offsetTime;if(!(t===this._caching.lastFrame||this._caching.lastFrame!==f&&(this._caching.lastFrame>=s&&s<=t||this._caching.lastFrame<e&&t<e))){this._caching.lastFrame>=t&&(this._caching._lastBezierData=null,this._caching.lastIndex=0);var i=this.interpolateValue(t,this._caching);this.pv=i}return this._caching.lastFrame=t,this.pv}function c(t){var e;if("unidimensional"===this.propType)e=t*this.mult,1e-5<a(this.v-e)&&(this.v=e,this._mdf=!0);else for(var s=0,i=this.v.length;s<i;)e=t[s]*this.mult,1e-5<a(this.v[s]-e)&&(this.v[s]=e,this._mdf=!0),s+=1}function u(){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length)if(this.lock)this.setVValue(this.pv);else{this.lock=!0,this._mdf=this._isFirstFrame;var t,e=this.effectsSequence.length,s=this.kf?this.pv:this.data.k;for(t=0;t<e;t+=1)s=this.effectsSequence[t](s);this.setVValue(s),this._isFirstFrame=!1,this.lock=!1,this.frameId=this.elem.globalData.frameId}}function g(t){this.effectsSequence.push(t),this.container.addDynamicProperty(this)}function n(t,e,s,i){this.propType="unidimensional",this.mult=s||1,this.data=e,this.v=s?e.k*s:e.k,this.pv=e.k,this._mdf=!1,this.elem=t,this.container=i,this.comp=t.comp,this.k=!1,this.kf=!1,this.vel=0,this.effectsSequence=[],this._isFirstFrame=!0,this.getValue=u,this.setVValue=c,this.addEffect=g}function h(t,e,s,i){this.propType="multidimensional",this.mult=s||1,this.data=e,this._mdf=!1,this.elem=t,this.container=i,this.comp=t.comp,this.k=!1,this.kf=!1,this.frameId=-1;var a,r=e.k.length;this.v=B("float32",r),this.pv=B("float32",r);B("float32",r);for(this.vel=B("float32",r),a=0;a<r;a+=1)this.v[a]=e.k[a]*this.mult,this.pv[a]=e.k[a];this._isFirstFrame=!0,this.effectsSequence=[],this.getValue=u,this.setVValue=c,this.addEffect=g}function o(t,e,s,i){this.propType="unidimensional",this.keyframes=e.k,this.offsetTime=t.data.st,this.frameId=-1,this._caching={lastFrame:f,lastIndex:0,value:0,_lastBezierData:null},this.k=!0,this.kf=!0,this.data=e,this.mult=s||1,this.elem=t,this.container=i,this.comp=t.comp,this.v=f,this.pv=f,this._isFirstFrame=!0,this.getValue=u,this.setVValue=c,this.interpolateValue=m,this.effectsSequence=[d.bind(this)],this.addEffect=g}function l(t,e,s,i){this.propType="multidimensional";var a,r,n,h,o,l=e.k.length;for(a=0;a<l-1;a+=1)e.k[a].to&&e.k[a].s&&e.k[a].e&&(r=e.k[a].s,n=e.k[a].e,h=e.k[a].to,o=e.k[a].ti,(2===r.length&&(r[0]!==n[0]||r[1]!==n[1])&&mt.pointOnLine2D(r[0],r[1],n[0],n[1],r[0]+h[0],r[1]+h[1])&&mt.pointOnLine2D(r[0],r[1],n[0],n[1],n[0]+o[0],n[1]+o[1])||3===r.length&&(r[0]!==n[0]||r[1]!==n[1]||r[2]!==n[2])&&mt.pointOnLine3D(r[0],r[1],r[2],n[0],n[1],n[2],r[0]+h[0],r[1]+h[1],r[2]+h[2])&&mt.pointOnLine3D(r[0],r[1],r[2],n[0],n[1],n[2],n[0]+o[0],n[1]+o[1],n[2]+o[2]))&&(e.k[a].to=null,e.k[a].ti=null),r[0]===n[0]&&r[1]===n[1]&&0===h[0]&&0===h[1]&&0===o[0]&&0===o[1]&&(2===r.length||r[2]===n[2]&&0===h[2]&&0===o[2])&&(e.k[a].to=null,e.k[a].ti=null));this.effectsSequence=[d.bind(this)],this.keyframes=e.k,this.offsetTime=t.data.st,this.k=!0,this.kf=!0,this._isFirstFrame=!0,this.mult=s||1,this.elem=t,this.container=i,this.comp=t.comp,this.getValue=u,this.setVValue=c,this.interpolateValue=m,this.frameId=-1;var p=e.k[0].s.length;for(this.v=B("float32",p),this.pv=B("float32",p),a=0;a<p;a+=1)this.v[a]=f,this.pv[a]=f;this._caching={lastFrame:f,lastIndex:0,value:B("float32",p)},this.addEffect=g}return{getProp:function(t,e,s,i,a){var r;if(0===e.a)r=0===s?new n(t,e,i,a):new h(t,e,i,a);else if(1===e.a)r=0===s?new o(t,e,i,a):new l(t,e,i,a);else if(e.k.length)if("number"==typeof e.k[0])r=new h(t,e,i,a);else switch(s){case 0:r=new o(t,e,i,a);break;case 1:r=new l(t,e,i,a)}else r=new n(t,e,i,a);return r.effectsSequence.length&&a.addDynamicProperty(r),r}}}(),M=function(){function i(t,e,s){if(this.elem=t,this.frameId=-1,this.propType="transform",this.data=e,this.v=new b,this.pre=new b,this.appliedTransformations=0,this.initDynamicPropertyContainer(s||t),e.p.s?(this.px=w.getProp(t,e.p.x,0,0,this),this.py=w.getProp(t,e.p.y,0,0,this),e.p.z&&(this.pz=w.getProp(t,e.p.z,0,0,this))):this.p=w.getProp(t,e.p,1,0,this),e.r)this.r=w.getProp(t,e.r,0,q,this);else if(e.rx){if(this.rx=w.getProp(t,e.rx,0,q,this),this.ry=w.getProp(t,e.ry,0,q,this),this.rz=w.getProp(t,e.rz,0,q,this),e.or.k[0].ti){var i,a=e.or.k.length;for(i=0;i<a;i+=1)e.or.k[i].to=e.or.k[i].ti=null}this.or=w.getProp(t,e.or,1,q,this),this.or.sh=!0}e.sk&&(this.sk=w.getProp(t,e.sk,0,q,this),this.sa=w.getProp(t,e.sa,0,q,this)),e.a&&(this.a=w.getProp(t,e.a,1,0,this)),e.s&&(this.s=w.getProp(t,e.s,1,.01,this)),e.o?this.o=w.getProp(t,e.o,0,.01,t):this.o={_mdf:!1,v:1},this._isDirty=!0,this.dynamicProperties.length||this.getValue(!0)}return i.prototype={applyToMatrix:function(t){var e=this._mdf;this.iterateDynamicProperties(),this._mdf=this._mdf||e,this.a&&t.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&t.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&t.skewFromAxis(-this.sk.v,this.sa.v),this.r?t.rotate(-this.r.v):t.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?this.data.p.z?t.translate(this.px.v,this.py.v,-this.pz.v):t.translate(this.px.v,this.py.v,0):t.translate(this.p.v[0],this.p.v[1],-this.p.v[2])},getValue:function(t){if(this.elem.globalData.frameId!==this.frameId){if(this._isDirty&&(this.precalculateMatrix(),this._isDirty=!1),this.iterateDynamicProperties(),this._mdf||t){if(this.v.cloneFromProps(this.pre.props),this.appliedTransformations<1&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations<2&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.appliedTransformations<3&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r&&this.appliedTransformations<4?this.v.rotate(-this.r.v):!this.r&&this.appliedTransformations<4&&this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.autoOriented){var e,s,i=this.elem.globalData.frameRate;if(this.p&&this.p.keyframes&&this.p.getValueAtTime)s=this.p._caching.lastFrame+this.p.offsetTime<=this.p.keyframes[0].t?(e=this.p.getValueAtTime((this.p.keyframes[0].t+.01)/i,0),this.p.getValueAtTime(this.p.keyframes[0].t/i,0)):this.p._caching.lastFrame+this.p.offsetTime>=this.p.keyframes[this.p.keyframes.length-1].t?(e=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t/i,0),this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length-1].t-.01)/i,0)):(e=this.p.pv,this.p.getValueAtTime((this.p._caching.lastFrame+this.p.offsetTime-.01)/i,this.p.offsetTime));else if(this.px&&this.px.keyframes&&this.py.keyframes&&this.px.getValueAtTime&&this.py.getValueAtTime){e=[],s=[];var a=this.px,r=this.py;a._caching.lastFrame+a.offsetTime<=a.keyframes[0].t?(e[0]=a.getValueAtTime((a.keyframes[0].t+.01)/i,0),e[1]=r.getValueAtTime((r.keyframes[0].t+.01)/i,0),s[0]=a.getValueAtTime(a.keyframes[0].t/i,0),s[1]=r.getValueAtTime(r.keyframes[0].t/i,0)):a._caching.lastFrame+a.offsetTime>=a.keyframes[a.keyframes.length-1].t?(e[0]=a.getValueAtTime(a.keyframes[a.keyframes.length-1].t/i,0),e[1]=r.getValueAtTime(r.keyframes[r.keyframes.length-1].t/i,0),s[0]=a.getValueAtTime((a.keyframes[a.keyframes.length-1].t-.01)/i,0),s[1]=r.getValueAtTime((r.keyframes[r.keyframes.length-1].t-.01)/i,0)):(e=[a.pv,r.pv],s[0]=a.getValueAtTime((a._caching.lastFrame+a.offsetTime-.01)/i,a.offsetTime),s[1]=r.getValueAtTime((r._caching.lastFrame+r.offsetTime-.01)/i,r.offsetTime))}this.v.rotate(-Math.atan2(e[1]-s[1],e[0]-s[0]))}this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem.globalData.frameId}},precalculateMatrix:function(){if(!this.a.k&&(this.pre.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations=1,!this.s.effectsSequence.length)){if(this.pre.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.appliedTransformations=2,this.sk){if(this.sk.effectsSequence.length||this.sa.effectsSequence.length)return;this.pre.skewFromAxis(-this.sk.v,this.sa.v),this.appliedTransformations=3}if(this.r){if(this.r.effectsSequence.length)return;this.pre.rotate(-this.r.v),this.appliedTransformations=4}else this.rz.effectsSequence.length||this.ry.effectsSequence.length||this.rx.effectsSequence.length||this.or.effectsSequence.length||(this.pre.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.appliedTransformations=4)}},autoOrient:function(){}},_([y],i),i.prototype.addDynamicProperty=function(t){this._addDynamicProperty(t),this.elem.addDynamicProperty(t),this._isDirty=!0},i.prototype._addDynamicProperty=y.prototype.addDynamicProperty,{getTransformProperty:function(t,e,s){return new i(t,e,s)}}}();function F(){this.c=!1,this._length=0,this._maxLength=8,this.v=S(this._maxLength),this.o=S(this._maxLength),this.i=S(this._maxLength)}F.prototype.setPathData=function(t,e){this.c=t,this.setLength(e);for(var s=0;s<e;)this.v[s]=ut.newElement(),this.o[s]=ut.newElement(),this.i[s]=ut.newElement(),s+=1},F.prototype.setLength=function(t){for(;this._maxLength<t;)this.doubleArrayLength();this._length=t},F.prototype.doubleArrayLength=function(){this.v=this.v.concat(S(this._maxLength)),this.i=this.i.concat(S(this._maxLength)),this.o=this.o.concat(S(this._maxLength)),this._maxLength*=2},F.prototype.setXYAt=function(t,e,s,i,a){var r;switch(this._length=Math.max(this._length,i+1),this._length>=this._maxLength&&this.doubleArrayLength(),s){case"v":r=this.v;break;case"i":r=this.i;break;case"o":r=this.o}(!r[i]||r[i]&&!a)&&(r[i]=ut.newElement()),r[i][0]=t,r[i][1]=e},F.prototype.setTripleAt=function(t,e,s,i,a,r,n,h){this.setXYAt(t,e,"v",n,h),this.setXYAt(s,i,"o",n,h),this.setXYAt(a,r,"i",n,h)},F.prototype.reverse=function(){var t=new F;t.setPathData(this.c,this._length);var e=this.v,s=this.o,i=this.i,a=0;this.c&&(t.setTripleAt(e[0][0],e[0][1],i[0][0],i[0][1],s[0][0],s[0][1],0,!1),a=1);var r,n=this._length-1,h=this._length;for(r=a;r<h;r+=1)t.setTripleAt(e[n][0],e[n][1],i[n][0],i[n][1],s[n][0],s[n][1],r,!1),n-=1;return t};var I,E,L=function(){var a=-999999;function t(t,e,s){var i,a,r,n,h,o,l,p,f,m=s.lastIndex,d=this.keyframes;if(t<d[0].t-this.offsetTime)i=d[0].s[0],r=!0,m=0;else if(t>=d[d.length-1].t-this.offsetTime)i=1===d[d.length-2].h?d[d.length-1].s[0]:d[d.length-2].e[0],r=!0;else{for(var c,u,g=m,y=d.length-1,v=!0;v&&(c=d[g],!((u=d[g+1]).t-this.offsetTime>t));)g<y-1?g+=1:v=!1;if(m=g,!(r=1===c.h)){if(t>=u.t-this.offsetTime)p=1;else if(t<c.t-this.offsetTime)p=0;else{var b;c.__fnct?b=c.__fnct:(b=j.getBezierEasing(c.o.x,c.o.y,c.i.x,c.i.y).get,c.__fnct=b),p=b((t-(c.t-this.offsetTime))/(u.t-this.offsetTime-(c.t-this.offsetTime)))}a=c.e[0]}i=c.s[0]}for(o=e._length,l=i.i[0].length,s.lastIndex=m,n=0;n<o;n+=1)for(h=0;h<l;h+=1)f=r?i.i[n][h]:i.i[n][h]+(a.i[n][h]-i.i[n][h])*p,e.i[n][h]=f,f=r?i.o[n][h]:i.o[n][h]+(a.o[n][h]-i.o[n][h])*p,e.o[n][h]=f,f=r?i.v[n][h]:i.v[n][h]+(a.v[n][h]-i.v[n][h])*p,e.v[n][h]=f}function r(){this.paths=this.localShapeCollection}function e(t){(function(t,e){if(t._length!==e._length||t.c!==e.c)return!1;var s,i=t._length;for(s=0;s<i;s+=1)if(t.v[s][0]!==e.v[s][0]||t.v[s][1]!==e.v[s][1]||t.o[s][0]!==e.o[s][0]||t.o[s][1]!==e.o[s][1]||t.i[s][0]!==e.i[s][0]||t.i[s][1]!==e.i[s][1])return!1;return!0})(this.v,t)||(this.v=gt.clone(t),this.localShapeCollection.releaseShapes(),this.localShapeCollection.addShape(this.v),this._mdf=!0,this.paths=this.localShapeCollection)}function s(){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length)if(this.lock)this.setVValue(this.pv);else{this.lock=!0,this._mdf=!1;var t,e=this.kf?this.pv:this.data.ks?this.data.ks.k:this.data.pt.k,s=this.effectsSequence.length;for(t=0;t<s;t+=1)e=this.effectsSequence[t](e);this.setVValue(e),this.lock=!1,this.frameId=this.elem.globalData.frameId}}function n(t,e,s){this.propType="shape",this.comp=t.comp,this.container=t,this.elem=t,this.data=e,this.k=!1,this.kf=!1,this._mdf=!1;var i=3===s?e.pt.k:e.ks.k;this.v=gt.clone(i),this.pv=gt.clone(this.v),this.localShapeCollection=yt.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.reset=r,this.effectsSequence=[]}function i(t){this.effectsSequence.push(t),this.container.addDynamicProperty(this)}function h(t,e,s){this.propType="shape",this.comp=t.comp,this.elem=t,this.container=t,this.offsetTime=t.data.st,this.keyframes=3===s?e.pt.k:e.ks.k,this.k=!0,this.kf=!0;var i=this.keyframes[0].s[0].i.length;this.keyframes[0].s[0].i[0].length;this.v=gt.newElement(),this.v.setPathData(this.keyframes[0].s[0].c,i),this.pv=gt.clone(this.v),this.localShapeCollection=yt.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.lastFrame=a,this.reset=r,this._caching={lastFrame:a,lastIndex:0},this.effectsSequence=[function(){var t=this.comp.renderedFrame-this.offsetTime,e=this.keyframes[0].t-this.offsetTime,s=this.keyframes[this.keyframes.length-1].t-this.offsetTime,i=this._caching.lastFrame;return i!==a&&(i<e&&t<e||s<i&&s<t)||(this._caching.lastIndex=i<t?this._caching.lastIndex:0,this.interpolateShape(t,this.pv,this._caching)),this._caching.lastFrame=t,this.pv}.bind(this)]}n.prototype.interpolateShape=t,n.prototype.getValue=s,n.prototype.setVValue=e,n.prototype.addEffect=i,h.prototype.getValue=s,h.prototype.interpolateShape=t,h.prototype.setVValue=e,h.prototype.addEffect=i;var o=function(){var n=v;function t(t,e){this.v=gt.newElement(),this.v.setPathData(!0,4),this.localShapeCollection=yt.newShapeCollection(),this.paths=this.localShapeCollection,this.localShapeCollection.addShape(this.v),this.d=e.d,this.elem=t,this.comp=t.comp,this.frameId=-1,this.initDynamicPropertyContainer(t),this.p=w.getProp(t,e.p,1,0,this),this.s=w.getProp(t,e.s,1,0,this),this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertEllToPath())}return t.prototype={reset:r,getValue:function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertEllToPath())},convertEllToPath:function(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,i=this.s.v[1]/2,a=3!==this.d,r=this.v;r.v[0][0]=t,r.v[0][1]=e-i,r.v[1][0]=a?t+s:t-s,r.v[1][1]=e,r.v[2][0]=t,r.v[2][1]=e+i,r.v[3][0]=a?t-s:t+s,r.v[3][1]=e,r.i[0][0]=a?t-s*n:t+s*n,r.i[0][1]=e-i,r.i[1][0]=a?t+s:t-s,r.i[1][1]=e-i*n,r.i[2][0]=a?t+s*n:t-s*n,r.i[2][1]=e+i,r.i[3][0]=a?t-s:t+s,r.i[3][1]=e+i*n,r.o[0][0]=a?t+s*n:t-s*n,r.o[0][1]=e-i,r.o[1][0]=a?t+s:t-s,r.o[1][1]=e+i*n,r.o[2][0]=a?t-s*n:t+s*n,r.o[2][1]=e+i,r.o[3][0]=a?t-s:t+s,r.o[3][1]=e-i*n}},_([y],t),t}(),l=function(){function t(t,e){this.v=gt.newElement(),this.v.setPathData(!0,0),this.elem=t,this.comp=t.comp,this.data=e,this.frameId=-1,this.d=e.d,this.initDynamicPropertyContainer(t),1===e.sy?(this.ir=w.getProp(t,e.ir,0,0,this),this.is=w.getProp(t,e.is,0,.01,this),this.convertToPath=this.convertStarToPath):this.convertToPath=this.convertPolygonToPath,this.pt=w.getProp(t,e.pt,0,0,this),this.p=w.getProp(t,e.p,1,0,this),this.r=w.getProp(t,e.r,0,q,this),this.or=w.getProp(t,e.or,0,0,this),this.os=w.getProp(t,e.os,0,.01,this),this.localShapeCollection=yt.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertToPath())}return t.prototype={reset:r,getValue:function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertToPath())},convertStarToPath:function(){var t,e,s,i,a=2*Math.floor(this.pt.v),r=2*Math.PI/a,n=!0,h=this.or.v,o=this.ir.v,l=this.os.v,p=this.is.v,f=2*Math.PI*h/(2*a),m=2*Math.PI*o/(2*a),d=-Math.PI/2;d+=this.r.v;var c=3===this.data.d?-1:1;for(t=this.v._length=0;t<a;t+=1){s=n?l:p,i=n?f:m;var u=(e=n?h:o)*Math.cos(d),g=e*Math.sin(d),y=0===u&&0===g?0:g/Math.sqrt(u*u+g*g),v=0===u&&0===g?0:-u/Math.sqrt(u*u+g*g);u+=+this.p.v[0],g+=+this.p.v[1],this.v.setTripleAt(u,g,u-y*i*s*c,g-v*i*s*c,u+y*i*s*c,g+v*i*s*c,t,!0),n=!n,d+=r*c}},convertPolygonToPath:function(){var t,e=Math.floor(this.pt.v),s=2*Math.PI/e,i=this.or.v,a=this.os.v,r=2*Math.PI*i/(4*e),n=-Math.PI/2,h=3===this.data.d?-1:1;for(n+=this.r.v,t=this.v._length=0;t<e;t+=1){var o=i*Math.cos(n),l=i*Math.sin(n),p=0===o&&0===l?0:l/Math.sqrt(o*o+l*l),f=0===o&&0===l?0:-o/Math.sqrt(o*o+l*l);o+=+this.p.v[0],l+=+this.p.v[1],this.v.setTripleAt(o,l,o-p*r*a*h,l-f*r*a*h,o+p*r*a*h,l+f*r*a*h,t,!0),n+=s*h}this.paths.length=0,this.paths[0]=this.v}},_([y],t),t}(),p=function(){function t(t,e){this.v=gt.newElement(),this.v.c=!0,this.localShapeCollection=yt.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.elem=t,this.comp=t.comp,this.frameId=-1,this.d=e.d,this.initDynamicPropertyContainer(t),this.p=w.getProp(t,e.p,1,0,this),this.s=w.getProp(t,e.s,1,0,this),this.r=w.getProp(t,e.r,0,0,this),this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertRectToPath())}return t.prototype={convertRectToPath:function(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,i=this.s.v[1]/2,a=m(s,i,this.r.v),r=a*(1-v);this.v._length=0,2===this.d||1===this.d?(this.v.setTripleAt(t+s,e-i+a,t+s,e-i+a,t+s,e-i+r,0,!0),this.v.setTripleAt(t+s,e+i-a,t+s,e+i-r,t+s,e+i-a,1,!0),0!==a?(this.v.setTripleAt(t+s-a,e+i,t+s-a,e+i,t+s-r,e+i,2,!0),this.v.setTripleAt(t-s+a,e+i,t-s+r,e+i,t-s+a,e+i,3,!0),this.v.setTripleAt(t-s,e+i-a,t-s,e+i-a,t-s,e+i-r,4,!0),this.v.setTripleAt(t-s,e-i+a,t-s,e-i+r,t-s,e-i+a,5,!0),this.v.setTripleAt(t-s+a,e-i,t-s+a,e-i,t-s+r,e-i,6,!0),this.v.setTripleAt(t+s-a,e-i,t+s-r,e-i,t+s-a,e-i,7,!0)):(this.v.setTripleAt(t-s,e+i,t-s+r,e+i,t-s,e+i,2),this.v.setTripleAt(t-s,e-i,t-s,e-i+r,t-s,e-i,3))):(this.v.setTripleAt(t+s,e-i+a,t+s,e-i+r,t+s,e-i+a,0,!0),0!==a?(this.v.setTripleAt(t+s-a,e-i,t+s-a,e-i,t+s-r,e-i,1,!0),this.v.setTripleAt(t-s+a,e-i,t-s+r,e-i,t-s+a,e-i,2,!0),this.v.setTripleAt(t-s,e-i+a,t-s,e-i+a,t-s,e-i+r,3,!0),this.v.setTripleAt(t-s,e+i-a,t-s,e+i-r,t-s,e+i-a,4,!0),this.v.setTripleAt(t-s+a,e+i,t-s+a,e+i,t-s+r,e+i,5,!0),this.v.setTripleAt(t+s-a,e+i,t+s-r,e+i,t+s-a,e+i,6,!0),this.v.setTripleAt(t+s,e+i-a,t+s,e+i-a,t+s,e+i-r,7,!0)):(this.v.setTripleAt(t-s,e-i,t-s+r,e-i,t-s,e-i,1,!0),this.v.setTripleAt(t-s,e+i,t-s,e+i-r,t-s,e+i,2,!0),this.v.setTripleAt(t+s,e+i,t+s-r,e+i,t+s,e+i,3,!0)))},getValue:function(t){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertRectToPath())},reset:r},_([y],t),t}();var f={getShapeProp:function(t,e,s){var i;if(3===s||4===s){var a=3===s?e.pt:e.ks,r=a.k;i=1===a.a||r.length?new h(t,e,s):new n(t,e,s)}else 5===s?i=new p(t,e):6===s?i=new o(t,e):7===s&&(i=new l(t,e));return i.k&&t.addDynamicProperty(i),i},getConstructorFunction:function(){return n},getKeyframedConstructorFunction:function(){return h}};return f}(),N=(E={},(I={}).registerModifier=function(t,e){E[t]||(E[t]=e)},I.getModifier=function(t,e,s){return new E[t](e,s)},I);function z(){}function R(){}function V(){}function O(){}function W(){this._length=0,this._maxLength=4,this.shapes=S(this._maxLength)}function Y(t,e,s,i){this.elem=t,this.frameId=-1,this.dataProps=S(e.length),this.renderer=s,this.k=!1,this.dashStr="",this.dashArray=B("float32",e.length?e.length-1:0),this.dashoffset=B("float32",1),this.initDynamicPropertyContainer(i);var a,r,n=e.length||0;for(a=0;a<n;a+=1)r=w.getProp(t,e[a].v,0,0,this),this.k=r.k||this.k,this.dataProps[a]={n:e[a].n,p:r};this.k||this.getValue(!0),this._isAnimated=this.k}function G(t,e,s){this.data=e,this.c=B("uint8c",4*e.p);var i=e.k.k[0].s?e.k.k[0].s.length-4*e.p:e.k.k.length-4*e.p;this.o=B("float32",i),this._cmdf=!1,this._omdf=!1,this._collapsable=this.checkCollapsable(),this._hasOpacity=i,this.initDynamicPropertyContainer(s),this.prop=w.getProp(t,e.k,1,null,this),this.k=this.prop.k,this.getValue(!0)}z.prototype.initModifierProperties=function(){},z.prototype.addShapeToModifier=function(){},z.prototype.addShape=function(t){if(!this.closed){var e={shape:t.sh,data:t,localShapeCollection:yt.newShapeCollection()};this.shapes.push(e),this.addShapeToModifier(e),this._isAnimated&&t.setAsAnimated()}},z.prototype.init=function(t,e){this.shapes=[],this.elem=t,this.initDynamicPropertyContainer(t),this.initModifierProperties(t,e),this.frameId=s,this.closed=!1,this.k=!1,this.dynamicProperties.length?this.k=!0:this.getValue(!0)},z.prototype.processKeys=function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties())},_([y],z),_([z],R),R.prototype.initModifierProperties=function(t,e){this.s=w.getProp(t,e.s,0,.01,this),this.e=w.getProp(t,e.e,0,.01,this),this.o=w.getProp(t,e.o,0,0,this),this.sValue=0,this.eValue=0,this.getValue=this.processKeys,this.m=e.m,this._isAnimated=!!this.s.effectsSequence.length||!!this.e.effectsSequence.length||!!this.o.effectsSequence.length},R.prototype.addShapeToModifier=function(t){t.pathsData=[]},R.prototype.calculateShapeEdges=function(t,e,s,i,a){var r=[];e<=1?r.push({s:t,e:e}):1<=t?r.push({s:t-1,e:e-1}):(r.push({s:t,e:1}),r.push({s:0,e:e-1}));var n,h,o=[],l=r.length;for(n=0;n<l;n+=1){var p,f;if((h=r[n]).e*a<i||h.s*a>i+s);else p=h.s*a<=i?0:(h.s*a-i)/s,f=h.e*a>=i+s?1:(h.e*a-i)/s,o.push([p,f])}return o.length||o.push([0,0]),o},R.prototype.releasePathsData=function(t){var e,s=t.length;for(e=0;e<s;e+=1)vt.release(t[e]);return t.length=0,t},R.prototype.processShapes=function(t){var e,s,i;if(this._mdf||t){var a=this.o.v%360/360;if(a<0&&(a+=1),e=(1<this.s.v?1:this.s.v<0?0:this.s.v)+a,(s=(1<this.e.v?1:this.e.v<0?0:this.e.v)+a)<e){var r=e;e=s,s=r}e=1e-4*Math.round(1e4*e),s=1e-4*Math.round(1e4*s),this.sValue=e,this.eValue=s}else e=this.sValue,s=this.eValue;var n,h,o,l,p,f,m=this.shapes.length,d=0;if(s===e)for(n=0;n<m;n+=1)this.shapes[n].localShapeCollection.releaseShapes(),this.shapes[n].shape._mdf=!0,this.shapes[n].shape.paths=this.shapes[n].localShapeCollection;else if(1===s&&0===e||0===s&&1===e){if(this._mdf)for(n=0;n<m;n+=1)this.shapes[n].pathsData.length=0,this.shapes[n].shape._mdf=!0}else{var c,u,g=[];for(n=0;n<m;n+=1)if((c=this.shapes[n]).shape._mdf||this._mdf||t||2===this.m){if(o=(i=c.shape.paths)._length,f=0,!c.shape._mdf&&c.pathsData.length)f=c.totalShapeLength;else{for(l=this.releasePathsData(c.pathsData),h=0;h<o;h+=1)p=mt.getSegmentsLength(i.shapes[h]),l.push(p),f+=p.totalLength;c.totalShapeLength=f,c.pathsData=l}d+=f,c.shape._mdf=!0}else c.shape.paths=c.localShapeCollection;var y,v=e,b=s,_=0;for(n=m-1;0<=n;n-=1)if((c=this.shapes[n]).shape._mdf){for((u=c.localShapeCollection).releaseShapes(),2===this.m&&1<m?(y=this.calculateShapeEdges(e,s,c.totalShapeLength,_,d),_+=c.totalShapeLength):y=[[v,b]],o=y.length,h=0;h<o;h+=1){v=y[h][0],b=y[h][1],g.length=0,b<=1?g.push({s:c.totalShapeLength*v,e:c.totalShapeLength*b}):1<=v?g.push({s:c.totalShapeLength*(v-1),e:c.totalShapeLength*(b-1)}):(g.push({s:c.totalShapeLength*v,e:c.totalShapeLength}),g.push({s:0,e:c.totalShapeLength*(b-1)}));var k=this.addShapes(c,g[0]);if(g[0].s!==g[0].e){if(1<g.length)if(c.shape.paths.shapes[c.shape.paths._length-1].c){var D=k.pop();this.addPaths(k,u),k=this.addShapes(c,g[1],D)}else this.addPaths(k,u),k=this.addShapes(c,g[1]);this.addPaths(k,u)}}c.shape.paths=u}}},R.prototype.addPaths=function(t,e){var s,i=t.length;for(s=0;s<i;s+=1)e.addShape(t[s])},R.prototype.addSegment=function(t,e,s,i,a,r,n){a.setXYAt(e[0],e[1],"o",r),a.setXYAt(s[0],s[1],"i",r+1),n&&a.setXYAt(t[0],t[1],"v",r),a.setXYAt(i[0],i[1],"v",r+1)},R.prototype.addSegmentFromArray=function(t,e,s,i){e.setXYAt(t[1],t[5],"o",s),e.setXYAt(t[2],t[6],"i",s+1),i&&e.setXYAt(t[0],t[4],"v",s),e.setXYAt(t[3],t[7],"v",s+1)},R.prototype.addShapes=function(t,e,s){var i,a,r,n,h,o,l,p,f=t.pathsData,m=t.shape.paths.shapes,d=t.shape.paths._length,c=0,u=[],g=!0;for(p=s?(h=s._length,s._length):(s=gt.newElement(),h=0),u.push(s),i=0;i<d;i+=1){for(o=f[i].lengths,s.c=m[i].c,r=m[i].c?o.length:o.length+1,a=1;a<r;a+=1)if(c+(n=o[a-1]).addedLength<e.s)c+=n.addedLength,s.c=!1;else{if(c>e.e){s.c=!1;break}e.s<=c&&e.e>=c+n.addedLength?(this.addSegment(m[i].v[a-1],m[i].o[a-1],m[i].i[a],m[i].v[a],s,h,g),g=!1):(l=mt.getNewSegment(m[i].v[a-1],m[i].v[a],m[i].o[a-1],m[i].i[a],(e.s-c)/n.addedLength,(e.e-c)/n.addedLength,o[a-1]),this.addSegmentFromArray(l,s,h,g),g=!1,s.c=!1),c+=n.addedLength,h+=1}if(m[i].c&&o.length){if(n=o[a-1],c<=e.e){var y=o[a-1].addedLength;e.s<=c&&e.e>=c+y?(this.addSegment(m[i].v[a-1],m[i].o[a-1],m[i].i[0],m[i].v[0],s,h,g),g=!1):(l=mt.getNewSegment(m[i].v[a-1],m[i].v[0],m[i].o[a-1],m[i].i[0],(e.s-c)/y,(e.e-c)/y,o[a-1]),this.addSegmentFromArray(l,s,h,g),g=!1,s.c=!1)}else s.c=!1;c+=n.addedLength,h+=1}if(s._length&&(s.setXYAt(s.v[p][0],s.v[p][1],"i",p),s.setXYAt(s.v[s._length-1][0],s.v[s._length-1][1],"o",s._length-1)),c>e.e)break;i<d-1&&(s=gt.newElement(),g=!0,u.push(s),h=0)}return u},N.registerModifier("tm",R),_([z],V),V.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.rd=w.getProp(t,e.r,0,null,this),this._isAnimated=!!this.rd.effectsSequence.length},V.prototype.processPath=function(t,e){var s=gt.newElement();s.c=t.c;var i,a,r,n,h,o,l,p,f,m,d,c,u,g=t._length,y=0;for(i=0;i<g;i+=1)a=t.v[i],n=t.o[i],r=t.i[i],a[0]===n[0]&&a[1]===n[1]&&a[0]===r[0]&&a[1]===r[1]?0!==i&&i!==g-1||t.c?(h=0===i?t.v[g-1]:t.v[i-1],l=(o=Math.sqrt(Math.pow(a[0]-h[0],2)+Math.pow(a[1]-h[1],2)))?Math.min(o/2,e)/o:0,p=c=a[0]+(h[0]-a[0])*l,f=u=a[1]-(a[1]-h[1])*l,m=p-(p-a[0])*v,d=f-(f-a[1])*v,s.setTripleAt(p,f,m,d,c,u,y),y+=1,h=i===g-1?t.v[0]:t.v[i+1],l=(o=Math.sqrt(Math.pow(a[0]-h[0],2)+Math.pow(a[1]-h[1],2)))?Math.min(o/2,e)/o:0,p=m=a[0]+(h[0]-a[0])*l,f=d=a[1]+(h[1]-a[1])*l,c=p-(p-a[0])*v,u=f-(f-a[1])*v,s.setTripleAt(p,f,m,d,c,u,y)):s.setTripleAt(a[0],a[1],n[0],n[1],r[0],r[1],y):s.setTripleAt(t.v[i][0],t.v[i][1],t.o[i][0],t.o[i][1],t.i[i][0],t.i[i][1],y),y+=1;return s},V.prototype.processShapes=function(t){var e,s,i,a,r,n,h=this.shapes.length,o=this.rd.v;if(0!==o)for(s=0;s<h;s+=1){if((r=this.shapes[s]).shape.paths,n=r.localShapeCollection,r.shape._mdf||this._mdf||t)for(n.releaseShapes(),r.shape._mdf=!0,e=r.shape.paths.shapes,a=r.shape.paths._length,i=0;i<a;i+=1)n.addShape(this.processPath(e[i],o));r.shape.paths=r.localShapeCollection}this.dynamicProperties.length||(this._mdf=!1)},N.registerModifier("rd",V),_([z],O),O.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.c=w.getProp(t,e.c,0,null,this),this.o=w.getProp(t,e.o,0,null,this),this.tr=M.getTransformProperty(t,e.tr,this),this.so=w.getProp(t,e.tr.so,0,.01,this),this.eo=w.getProp(t,e.tr.eo,0,.01,this),this.data=e,this.dynamicProperties.length||this.getValue(!0),this._isAnimated=!!this.dynamicProperties.length,this.pMatrix=new b,this.rMatrix=new b,this.sMatrix=new b,this.tMatrix=new b,this.matrix=new b},O.prototype.applyTransforms=function(t,e,s,i,a,r){var n=r?-1:1,h=i.s.v[0]+(1-i.s.v[0])*(1-a),o=i.s.v[1]+(1-i.s.v[1])*(1-a);t.translate(i.p.v[0]*n*a,i.p.v[1]*n*a,i.p.v[2]),e.translate(-i.a.v[0],-i.a.v[1],i.a.v[2]),e.rotate(-i.r.v*n*a),e.translate(i.a.v[0],i.a.v[1],i.a.v[2]),s.translate(-i.a.v[0],-i.a.v[1],i.a.v[2]),s.scale(r?1/h:h,r?1/o:o),s.translate(i.a.v[0],i.a.v[1],i.a.v[2])},O.prototype.init=function(t,e,s,i){this.elem=t,this.arr=e,this.pos=s,this.elemsData=i,this._currentCopies=0,this._elements=[],this._groups=[],this.frameId=-1,this.initDynamicPropertyContainer(t),this.initModifierProperties(t,e[s]);for(;0<s;)s-=1,this._elements.unshift(e[s]),1;this.dynamicProperties.length?this.k=!0:this.getValue(!0)},O.prototype.resetElements=function(t){var e,s=t.length;for(e=0;e<s;e+=1)t[e]._processed=!1,"gr"===t[e].ty&&this.resetElements(t[e].it)},O.prototype.cloneElements=function(t){t.length;var e=JSON.parse(JSON.stringify(t));return this.resetElements(e),e},O.prototype.changeGroupRender=function(t,e){var s,i=t.length;for(s=0;s<i;s+=1)t[s]._render=e,"gr"===t[s].ty&&this.changeGroupRender(t[s].it,e)},O.prototype.processShapes=function(t){var e,s,i,a,r;if(this._mdf||t){var n,h=Math.ceil(this.c.v);if(this._groups.length<h){for(;this._groups.length<h;){var o={it:this.cloneElements(this._elements),ty:"gr"};o.it.push({a:{a:0,ix:1,k:[0,0]},nm:"Transform",o:{a:0,ix:7,k:100},p:{a:0,ix:2,k:[0,0]},r:{a:1,ix:6,k:[{s:0,e:0,t:0},{s:0,e:0,t:1}]},s:{a:0,ix:3,k:[100,100]},sa:{a:0,ix:5,k:0},sk:{a:0,ix:4,k:0},ty:"tr"}),this.arr.splice(0,0,o),this._groups.splice(0,0,o),this._currentCopies+=1}this.elem.reloadShapes()}for(i=r=0;i<=this._groups.length-1;i+=1)n=r<h,this._groups[i]._render=n,this.changeGroupRender(this._groups[i].it,n),r+=1;this._currentCopies=h;var l=this.o.v,p=l%1,f=0<l?Math.floor(l):Math.ceil(l),m=(this.tr.v.props,this.pMatrix.props),d=this.rMatrix.props,c=this.sMatrix.props;this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset();var u,g,y=0;if(0<l){for(;y<f;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),y+=1;p&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,p,!1),y+=p)}else if(l<0){for(;f<y;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),y-=1;p&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-p,!0),y-=p)}for(i=1===this.data.m?0:this._currentCopies-1,a=1===this.data.m?1:-1,r=this._currentCopies;r;){if(g=(s=(e=this.elemsData[i].it)[e.length-1].transform.mProps.v.props).length,e[e.length-1].transform.mProps._mdf=!0,e[e.length-1].transform.op._mdf=!0,e[e.length-1].transform.op.v=this.so.v+(this.eo.v-this.so.v)*(i/(this._currentCopies-1)),0!==y){for((0!==i&&1===a||i!==this._currentCopies-1&&-1===a)&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),this.matrix.transform(d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7],d[8],d[9],d[10],d[11],d[12],d[13],d[14],d[15]),this.matrix.transform(c[0],c[1],c[2],c[3],c[4],c[5],c[6],c[7],c[8],c[9],c[10],c[11],c[12],c[13],c[14],c[15]),this.matrix.transform(m[0],m[1],m[2],m[3],m[4],m[5],m[6],m[7],m[8],m[9],m[10],m[11],m[12],m[13],m[14],m[15]),u=0;u<g;u+=1)s[u]=this.matrix.props[u];this.matrix.reset()}else for(this.matrix.reset(),u=0;u<g;u+=1)s[u]=this.matrix.props[u];y+=1,r-=1,i+=a}}else for(r=this._currentCopies,i=0,a=1;r;)s=(e=this.elemsData[i].it)[e.length-1].transform.mProps.v.props,e[e.length-1].transform.mProps._mdf=!1,e[e.length-1].transform.op._mdf=!1,r-=1,i+=a},O.prototype.addShape=function(){},N.registerModifier("rp",O),W.prototype.addShape=function(t){this._length===this._maxLength&&(this.shapes=this.shapes.concat(S(this._maxLength)),this._maxLength*=2),this.shapes[this._length]=t,this._length+=1},W.prototype.releaseShapes=function(){var t;for(t=0;t<this._length;t+=1)gt.release(this.shapes[t]);this._length=0},Y.prototype.getValue=function(t){if((this.elem.globalData.frameId!==this.frameId||t)&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf=this._mdf||t,this._mdf)){var e=0,s=this.dataProps.length;for("svg"===this.renderer&&(this.dashStr=""),e=0;e<s;e+=1)"o"!=this.dataProps[e].n?"svg"===this.renderer?this.dashStr+=" "+this.dataProps[e].p.v:this.dashArray[e]=this.dataProps[e].p.v:this.dashoffset[0]=this.dataProps[e].p.v}},_([y],Y),G.prototype.comparePoints=function(t,e){for(var s=0,i=this.o.length/2;s<i;){if(.01<Math.abs(t[4*s]-t[4*e+2*s]))return!1;s+=1}return!0},G.prototype.checkCollapsable=function(){if(this.o.length/2!=this.c.length/4)return!1;if(this.data.k.k[0].s)for(var t=0,e=this.data.k.k.length;t<e;){if(!this.comparePoints(this.data.k.k[t].s,this.data.p))return!1;t+=1}else if(!this.comparePoints(this.data.k.k,this.data.p))return!1;return!0},G.prototype.getValue=function(t){if(this.prop.getValue(),this._mdf=!1,this._cmdf=!1,this._omdf=!1,this.prop._mdf||t){var e,s,i,a=4*this.data.p;for(e=0;e<a;e+=1)s=e%4==0?100:255,i=Math.round(this.prop.v[e]*s),this.c[e]!==i&&(this.c[e]=i,this._cmdf=!t);if(this.o.length)for(a=this.prop.v.length,e=4*this.data.p;e<a;e+=1)s=e%2==0?100:1,i=e%2==0?Math.round(100*this.prop.v[e]):this.prop.v[e],this.o[e-4*this.data.p]!==i&&(this.o[e-4*this.data.p]=i,this._omdf=!t);this._mdf=!t}},_([y],G);var X,H,J=function(t,e,s,i){if(0===e)return"";var a,r=t.o,n=t.i,h=t.v,o=" M"+i.applyToPointStringified(h[0][0],h[0][1]);for(a=1;a<e;a+=1)o+=" C"+i.applyToPointStringified(r[a-1][0],r[a-1][1])+" "+i.applyToPointStringified(n[a][0],n[a][1])+" "+i.applyToPointStringified(h[a][0],h[a][1]);return s&&e&&(o+=" C"+i.applyToPointStringified(r[a-1][0],r[a-1][1])+" "+i.applyToPointStringified(n[0][0],n[0][1])+" "+i.applyToPointStringified(h[0][0],h[0][1]),o+="z"),o},K=function(){var a=function(){var t=g("canvas");t.width=1,t.height=1;var e=t.getContext("2d");return e.fillStyle="#FF0000",e.fillRect(0,0,1,1),t}();function t(){this.loadedAssets+=1,this.loadedAssets===this.totalImages&&this.imagesLoadedCb&&this.imagesLoadedCb(null)}function e(t){var e=function(t,e,s){var i="";if(t.e)i=t.p;else if(e){var a=t.p;-1!==a.indexOf("images/")&&(a=a.split("/")[1]),i=e+a}else i=s,i+=t.u?t.u:"",i+=t.p;return i}(t,this.assetsPath,this.path),s=g("img");s.crossOrigin="anonymous",s.addEventListener("load",this._imageLoaded.bind(this),!1),s.addEventListener("error",function(){i.img=a,this._imageLoaded()}.bind(this),!1),s.src=e;var i={img:s,assetData:t};return i}function s(t,e){this.imagesLoadedCb=e;var s,i=t.length;for(s=0;s<i;s+=1)t[s].layers||(this.totalImages+=1,this.images.push(this._createImageData(t[s])))}function i(t){this.path=t||""}function r(t){this.assetsPath=t||""}function n(t){for(var e=0,s=this.images.length;e<s;){if(this.images[e].assetData===t)return this.images[e].img;e+=1}}function h(){this.imagesLoadedCb=null,this.images.length=0}function o(){return this.totalImages===this.loadedAssets}return function(){this.loadAssets=s,this.setAssetsPath=r,this.setPath=i,this.loaded=o,this.destroy=h,this.getImage=n,this._createImageData=e,this._imageLoaded=t,this.assetsPath="",this.path="",this.totalImages=0,this.loadedAssets=0,this.imagesLoadedCb=null,this.images=[]}}(),Z=(X={maskType:!0},(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(X.maskType=!1),X),U=((H={}).createFilter=function(t){var e=createNS("filter");return e.setAttribute("id",t),e.setAttribute("filterUnits","objectBoundingBox"),e.setAttribute("x","0%"),e.setAttribute("y","0%"),e.setAttribute("width","100%"),e.setAttribute("height","100%"),e},H.createAlphaToLuminanceFilter=function(){var t=createNS("feColorMatrix");return t.setAttribute("type","matrix"),t.setAttribute("color-interpolation-filters","sRGB"),t.setAttribute("values","0 0 0 1 0  0 0 0 1 0  0 0 0 1 0  0 0 0 1 1"),t},H),Q=function(){function r(t){return t.response&&"object"==typeof t.response?t.response:t.response&&"string"==typeof t.response?JSON.parse(t.response):t.responseText?JSON.parse(t.responseText):void 0}return{load:function(t,e,s){var i,a=new XMLHttpRequest;a.open("GET",t,!0),a.responseType="json",a.send(),a.onreadystatechange=function(){if(4==a.readyState)if(200==a.status)i=r(a),e(i);else try{i=r(a),e(i)}catch(t){s&&s(t)}}}}}();function $(t,e,s){this._isFirstFrame=!0,this._hasMaskedPath=!1,this._frameId=-1,this._textData=t,this._renderType=e,this._elem=s,this._animatorsData=S(this._textData.a.length),this._pathData={},this._moreOptions={alignment:{}},this.renderedLetters=[],this.lettersChangedFlag=!1,this.initDynamicPropertyContainer(s)}function tt(t,e,s){var i={propType:!1},a=w.getProp,r=e.a;this.a={r:r.r?a(t,r.r,0,q,s):i,rx:r.rx?a(t,r.rx,0,q,s):i,ry:r.ry?a(t,r.ry,0,q,s):i,sk:r.sk?a(t,r.sk,0,q,s):i,sa:r.sa?a(t,r.sa,0,q,s):i,s:r.s?a(t,r.s,1,.01,s):i,a:r.a?a(t,r.a,1,0,s):i,o:r.o?a(t,r.o,0,.01,s):i,p:r.p?a(t,r.p,1,0,s):i,sw:r.sw?a(t,r.sw,0,0,s):i,sc:r.sc?a(t,r.sc,1,0,s):i,fc:r.fc?a(t,r.fc,1,0,s):i,fh:r.fh?a(t,r.fh,0,0,s):i,fs:r.fs?a(t,r.fs,0,.01,s):i,fb:r.fb?a(t,r.fb,0,.01,s):i,t:r.t?a(t,r.t,0,0,s):i},this.s=ht.getTextSelectorProp(t,e.s,s),this.s.t=e.s.t}function dt(t,e,s,i,a,r){this.o=t,this.sw=e,this.sc=s,this.fc=i,this.m=a,this.p=r,this._mdf={o:!0,sw:!!e,sc:!!s,fc:!!i,m:!0,p:!0}}function et(t,e){this._frameId=s,this.pv="",this.v="",this.kf=!1,this._isFirstFrame=!0,this._mdf=!1,this.data=e,this.elem=t,this.comp=this.elem.comp,this.keysIndex=0,this.canResize=!1,this.minimumFontSize=1,this.effectsSequence=[],this.currentData={ascent:0,boxWidth:this.defaultBoxWidth,f:"",fStyle:"",fWeight:"",fc:"",j:"",justifyOffset:"",l:[],lh:0,lineWidths:[],ls:"",of:"",s:"",sc:"",sw:0,t:0,tr:0,sz:0,ps:null,fillColorAnim:!1,strokeColorAnim:!1,strokeWidthAnim:!1,yOffset:0,finalSize:0,finalText:[],finalLineHeight:0,__complete:!1},this.copyData(this.currentData,this.data.d.k[0].s),this.searchProperty()||this.completeTextData(this.currentData)}$.prototype.searchProperties=function(){var t,e,s=this._textData.a.length,i=w.getProp;for(t=0;t<s;t+=1)e=this._textData.a[t],this._animatorsData[t]=new tt(this._elem,e,this);this._textData.p&&"m"in this._textData.p?(this._pathData={f:i(this._elem,this._textData.p.f,0,0,this),l:i(this._elem,this._textData.p.l,0,0,this),r:this._textData.p.r,m:this._elem.maskManager.getMaskProperty(this._textData.p.m)},this._hasMaskedPath=!0):this._hasMaskedPath=!1,this._moreOptions.alignment=i(this._elem,this._textData.m.a,1,0,this)},$.prototype.getMeasures=function(t,e){if(this.lettersChangedFlag=e,this._mdf||this._isFirstFrame||e||this._hasMaskedPath&&this._pathData.m._mdf){this._isFirstFrame=!1;var s,i,a,r,n,h,o,l,p,f,m,d,c,u,g,y,v,b,_,k=this._moreOptions.alignment.v,D=this._animatorsData,C=this._textData,x=this.mHelper,P=this._renderType,S=this.renderedLetters.length,T=(this.data,t.l);if(this._hasMaskedPath){if(_=this._pathData.m,!this._pathData.n||this._pathData._mdf){var A,w=_.v;for(this._pathData.r&&(w=w.reverse()),n={tLength:0,segments:[]},r=w._length-1,a=y=0;a<r;a+=1)A={s:w.v[a],e:w.v[a+1],to:[w.o[a][0]-w.v[a][0],w.o[a][1]-w.v[a][1]],ti:[w.i[a+1][0]-w.v[a+1][0],w.i[a+1][1]-w.v[a+1][1]]},mt.buildBezierData(A),n.tLength+=A.bezierData.segmentLength,n.segments.push(A),y+=A.bezierData.segmentLength;a=r,_.v.c&&(A={s:w.v[a],e:w.v[0],to:[w.o[a][0]-w.v[a][0],w.o[a][1]-w.v[a][1]],ti:[w.i[0][0]-w.v[0][0],w.i[0][1]-w.v[0][1]]},mt.buildBezierData(A),n.tLength+=A.bezierData.segmentLength,n.segments.push(A),y+=A.bezierData.segmentLength),this._pathData.pi=n}if(n=this._pathData.pi,h=this._pathData.f.v,f=1,p=!(l=m=0),u=n.segments,h<0&&_.v.c)for(n.tLength<Math.abs(h)&&(h=-Math.abs(h)%n.tLength),f=(c=u[m=u.length-1].bezierData.points).length-1;h<0;)h+=c[f].partialLength,(f-=1)<0&&(f=(c=u[m-=1].bezierData.points).length-1);d=(c=u[m].bezierData.points)[f-1],g=(o=c[f]).partialLength}r=T.length,i=s=0;var M,F,I,E,L=1.2*t.finalSize*.714,N=!0;I=D.length;var z,R,V,O,q,B,j,W,Y,G,X,H,J,K=-1,Z=h,U=m,Q=f,$=-1,tt="",et=this.defaultPropsArray;if(2===t.j||1===t.j){var st=0,it=0,at=2===t.j?-.5:-1,rt=0,nt=!0;for(a=0;a<r;a+=1)if(T[a].n){for(st&&(st+=it);rt<a;)T[rt].animatorJustifyOffset=st,rt+=1;nt=!(st=0)}else{for(F=0;F<I;F+=1)(M=D[F].a).t.propType&&(nt&&2===t.j&&(it+=M.t.v*at),(z=D[F].s.getMult(T[a].anIndexes[F],C.a[F].s.totalChars)).length?st+=M.t.v*z[0]*at:st+=M.t.v*z*at);nt=!1}for(st&&(st+=it);rt<a;)T[rt].animatorJustifyOffset=st,rt+=1}for(a=0;a<r;a+=1){if(x.reset(),q=1,T[a].n)s=0,i+=t.yOffset,i+=N?1:0,h=Z,N=!1,0,this._hasMaskedPath&&(f=Q,d=(c=u[m=U].bezierData.points)[f-1],g=(o=c[f]).partialLength,l=0),J=G=H=tt="",et=this.defaultPropsArray;else{if(this._hasMaskedPath){if($!==T[a].line){switch(t.j){case 1:h+=y-t.lineWidths[T[a].line];break;case 2:h+=(y-t.lineWidths[T[a].line])/2}$=T[a].line}K!==T[a].ind&&(T[K]&&(h+=T[K].extra),h+=T[a].an/2,K=T[a].ind),h+=k[0]*T[a].an/200;var ht=0;for(F=0;F<I;F+=1)(M=D[F].a).p.propType&&((z=D[F].s.getMult(T[a].anIndexes[F],C.a[F].s.totalChars)).length?ht+=M.p.v[0]*z[0]:ht+=M.p.v[0]*z),M.a.propType&&((z=D[F].s.getMult(T[a].anIndexes[F],C.a[F].s.totalChars)).length?ht+=M.a.v[0]*z[0]:ht+=M.a.v[0]*z);for(p=!0;p;)h+ht<=l+g||!c?(v=(h+ht-l)/o.partialLength,V=d.point[0]+(o.point[0]-d.point[0])*v,O=d.point[1]+(o.point[1]-d.point[1])*v,x.translate(-k[0]*T[a].an/200,-k[1]*L/100),p=!1):c&&(l+=o.partialLength,(f+=1)>=c.length&&(f=0,c=u[m+=1]?u[m].bezierData.points:_.v.c?u[m=f=0].bezierData.points:(l-=o.partialLength,null)),c&&(d=o,g=(o=c[f]).partialLength));R=T[a].an/2-T[a].add,x.translate(-R,0,0)}else R=T[a].an/2-T[a].add,x.translate(-R,0,0),x.translate(-k[0]*T[a].an/200,-k[1]*L/100,0);for(T[a].l/2,F=0;F<I;F+=1)(M=D[F].a).t.propType&&(z=D[F].s.getMult(T[a].anIndexes[F],C.a[F].s.totalChars),0===s&&0===t.j||(this._hasMaskedPath?z.length?h+=M.t.v*z[0]:h+=M.t.v*z:z.length?s+=M.t.v*z[0]:s+=M.t.v*z));for(T[a].l/2,t.strokeWidthAnim&&(j=t.sw||0),t.strokeColorAnim&&(B=t.sc?[t.sc[0],t.sc[1],t.sc[2]]:[0,0,0]),t.fillColorAnim&&t.fc&&(W=[t.fc[0],t.fc[1],t.fc[2]]),F=0;F<I;F+=1)(M=D[F].a).a.propType&&((z=D[F].s.getMult(T[a].anIndexes[F],C.a[F].s.totalChars)).length?x.translate(-M.a.v[0]*z[0],-M.a.v[1]*z[1],M.a.v[2]*z[2]):x.translate(-M.a.v[0]*z,-M.a.v[1]*z,M.a.v[2]*z));for(F=0;F<I;F+=1)(M=D[F].a).s.propType&&((z=D[F].s.getMult(T[a].anIndexes[F],C.a[F].s.totalChars)).length?x.scale(1+(M.s.v[0]-1)*z[0],1+(M.s.v[1]-1)*z[1],1):x.scale(1+(M.s.v[0]-1)*z,1+(M.s.v[1]-1)*z,1));for(F=0;F<I;F+=1){if(M=D[F].a,z=D[F].s.getMult(T[a].anIndexes[F],C.a[F].s.totalChars),M.sk.propType&&(z.length?x.skewFromAxis(-M.sk.v*z[0],M.sa.v*z[1]):x.skewFromAxis(-M.sk.v*z,M.sa.v*z)),M.r.propType&&(z.length?x.rotateZ(-M.r.v*z[2]):x.rotateZ(-M.r.v*z)),M.ry.propType&&(z.length?x.rotateY(M.ry.v*z[1]):x.rotateY(M.ry.v*z)),M.rx.propType&&(z.length?x.rotateX(M.rx.v*z[0]):x.rotateX(M.rx.v*z)),M.o.propType&&(z.length?q+=(M.o.v*z[0]-q)*z[0]:q+=(M.o.v*z-q)*z),t.strokeWidthAnim&&M.sw.propType&&(z.length?j+=M.sw.v*z[0]:j+=M.sw.v*z),t.strokeColorAnim&&M.sc.propType)for(Y=0;Y<3;Y+=1)z.length?B[Y]=B[Y]+(M.sc.v[Y]-B[Y])*z[0]:B[Y]=B[Y]+(M.sc.v[Y]-B[Y])*z;if(t.fillColorAnim&&t.fc){if(M.fc.propType)for(Y=0;Y<3;Y+=1)z.length?W[Y]=W[Y]+(M.fc.v[Y]-W[Y])*z[0]:W[Y]=W[Y]+(M.fc.v[Y]-W[Y])*z;M.fh.propType&&(W=z.length?ft(W,M.fh.v*z[0]):ft(W,M.fh.v*z)),M.fs.propType&&(W=z.length?lt(W,M.fs.v*z[0]):lt(W,M.fs.v*z)),M.fb.propType&&(W=z.length?pt(W,M.fb.v*z[0]):pt(W,M.fb.v*z))}}for(F=0;F<I;F+=1)(M=D[F].a).p.propType&&(z=D[F].s.getMult(T[a].anIndexes[F],C.a[F].s.totalChars),this._hasMaskedPath?z.length?x.translate(0,M.p.v[1]*z[0],-M.p.v[2]*z[1]):x.translate(0,M.p.v[1]*z,-M.p.v[2]*z):z.length?x.translate(M.p.v[0]*z[0],M.p.v[1]*z[1],-M.p.v[2]*z[2]):x.translate(M.p.v[0]*z,M.p.v[1]*z,-M.p.v[2]*z));if(t.strokeWidthAnim&&(G=j<0?0:j),t.strokeColorAnim&&(X="rgb("+Math.round(255*B[0])+","+Math.round(255*B[1])+","+Math.round(255*B[2])+")"),t.fillColorAnim&&t.fc&&(H="rgb("+Math.round(255*W[0])+","+Math.round(255*W[1])+","+Math.round(255*W[2])+")"),this._hasMaskedPath){if(x.translate(0,-t.ls),x.translate(0,k[1]*L/100+i,0),C.p.p){b=(o.point[1]-d.point[1])/(o.point[0]-d.point[0]);var ot=180*Math.atan(b)/Math.PI;o.point[0]<d.point[0]&&(ot+=180),x.rotate(-ot*Math.PI/180)}x.translate(V,O,0),h-=k[0]*T[a].an/200,T[a+1]&&K!==T[a+1].ind&&(h+=T[a].an/2,h+=t.tr/1e3*t.finalSize)}else{switch(x.translate(s,i,0),t.ps&&x.translate(t.ps[0],t.ps[1]+t.ascent,0),t.j){case 1:x.translate(T[a].animatorJustifyOffset+t.justifyOffset+(t.boxWidth-t.lineWidths[T[a].line]),0,0);break;case 2:x.translate(T[a].animatorJustifyOffset+t.justifyOffset+(t.boxWidth-t.lineWidths[T[a].line])/2,0,0)}x.translate(0,-t.ls),x.translate(R,0,0),x.translate(k[0]*T[a].an/200,k[1]*L/100,0),s+=T[a].l+t.tr/1e3*t.finalSize}"html"===P?tt=x.toCSS():"svg"===P?tt=x.to2dCSS():et=[x.props[0],x.props[1],x.props[2],x.props[3],x.props[4],x.props[5],x.props[6],x.props[7],x.props[8],x.props[9],x.props[10],x.props[11],x.props[12],x.props[13],x.props[14],x.props[15]],J=q}this.lettersChangedFlag=S<=a?(E=new dt(J,G,X,H,tt,et),this.renderedLetters.push(E),S+=1,!0):(E=this.renderedLetters[a]).update(J,G,X,H,tt,et)||this.lettersChangedFlag}}},$.prototype.getValue=function(){this._elem.globalData.frameId!==this._frameId&&(this._frameId=this._elem.globalData.frameId,this.iterateDynamicProperties())},$.prototype.mHelper=new b,$.prototype.defaultPropsArray=[],_([y],$),dt.prototype.update=function(t,e,s,i,a,r){this._mdf.o=!1,this._mdf.sw=!1,this._mdf.sc=!1,this._mdf.fc=!1,this._mdf.m=!1;var n=this._mdf.p=!1;return this.o!==t&&(this.o=t,n=this._mdf.o=!0),this.sw!==e&&(this.sw=e,n=this._mdf.sw=!0),this.sc!==s&&(this.sc=s,n=this._mdf.sc=!0),this.fc!==i&&(this.fc=i,n=this._mdf.fc=!0),this.m!==a&&(this.m=a,n=this._mdf.m=!0),!r.length||this.p[0]===r[0]&&this.p[1]===r[1]&&this.p[4]===r[4]&&this.p[5]===r[5]&&this.p[12]===r[12]&&this.p[13]===r[13]||(this.p=r,n=this._mdf.p=!0),n},et.prototype.defaultBoxWidth=[0,0],et.prototype.copyData=function(t,e){for(var s in e)e.hasOwnProperty(s)&&(t[s]=e[s]);return t},et.prototype.setCurrentData=function(t){t.__complete||this.completeTextData(t),this.currentData=t,this.currentData.boxWidth=this.currentData.boxWidth||this.defaultBoxWidth,this._mdf=!0},et.prototype.searchProperty=function(){return this.searchKeyframes()},et.prototype.searchKeyframes=function(){return this.kf=1<this.data.d.k.length,this.kf&&this.addEffect(this.getKeyframeValue.bind(this)),this.kf},et.prototype.addEffect=function(t){this.effectsSequence.push(t),this.elem.addDynamicProperty(this)},et.prototype.getValue=function(t){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length||t){this.currentData.t=this.data.d.k[this.keysIndex].s.t;var e=this.currentData,s=this.keysIndex;if(this.lock)this.setCurrentData(this.currentData);else{this.lock=!0,this._mdf=!1;var i,a=this.effectsSequence.length,r=t||this.data.d.k[this.keysIndex].s;for(i=0;i<a;i+=1)r=s!==this.keysIndex?this.effectsSequence[i](r,r.t):this.effectsSequence[i](this.currentData,r.t);e!==r&&this.setCurrentData(r),this.pv=this.v=this.currentData,this.lock=!1,this.frameId=this.elem.globalData.frameId}}},et.prototype.getKeyframeValue=function(){for(var t=this.data.d.k,e=this.elem.comp.renderedFrame,s=0,i=t.length;s<=i-1&&(t[s].s,!(s===i-1||t[s+1].t>e));)s+=1;return this.keysIndex!==s&&(this.keysIndex=s),this.data.d.k[this.keysIndex].s},et.prototype.buildFinalText=function(t){for(var e=A.getCombinedCharacterCodes(),s=[],i=0,a=t.length;i<a;)-1!==e.indexOf(t.charCodeAt(i))?s[s.length-1]+=t.charAt(i):s.push(t.charAt(i)),i+=1;return s},et.prototype.completeTextData=function(t){t.__complete=!0;var e,s,i,a,r,n,h,o=this.elem.globalData.fontManager,l=this.data,p=[],f=0,m=l.m.g,d=0,c=0,u=0,g=[],y=0,v=0,b=o.getFontByName(t.f),_=0,k=b.fStyle?b.fStyle.split(" "):[],D="normal",C="normal";for(s=k.length,e=0;e<s;e+=1)switch(k[e].toLowerCase()){case"italic":C="italic";break;case"bold":D="700";break;case"black":D="900";break;case"medium":D="500";break;case"regular":case"normal":D="400";break;case"light":case"thin":D="200"}t.fWeight=b.fWeight||D,t.fStyle=C,s=t.t.length,t.finalSize=t.s,t.finalText=this.buildFinalText(t.t),t.finalLineHeight=t.lh;var x,P=t.tr/1e3*t.finalSize;if(t.sz)for(var S,T,A=!0,w=t.sz[0],M=t.sz[1];A;){y=S=0,s=(T=this.buildFinalText(t.t)).length,P=t.tr/1e3*t.finalSize;var F=-1;for(e=0;e<s;e+=1)x=T[e].charCodeAt(0),i=!1," "===T[e]?F=e:13!==x&&3!==x||(i=!(y=0),S+=t.finalLineHeight||1.2*t.finalSize),w<y+(_=o.chars?(h=o.getCharData(T[e],b.fStyle,b.fFamily),i?0:h.w*t.finalSize/100):o.measureText(T[e],t.f,t.finalSize))&&" "!==T[e]?(-1===F?s+=1:e=F,S+=t.finalLineHeight||1.2*t.finalSize,T.splice(e,F===e?1:0,"\r"),F=-1,y=0):(y+=_,y+=P);S+=b.ascent*t.finalSize/100,this.canResize&&t.finalSize>this.minimumFontSize&&M<S?(t.finalSize-=1,t.finalLineHeight=t.finalSize*t.lh/t.s):(t.finalText=T,s=t.finalText.length,A=!1)}y=-P;var I,E=_=0;for(e=0;e<s;e+=1)if(i=!1,x=(I=t.finalText[e]).charCodeAt(0)," "===I?a="\xa0":13===x||3===x?(E=0,g.push(y),v=v<y?y:v,y=-2*P,i=!(a=""),u+=1):a=t.finalText[e],_=o.chars?(h=o.getCharData(I,b.fStyle,o.getFontByName(t.f).fFamily),i?0:h.w*t.finalSize/100):o.measureText(a,t.f,t.finalSize)," "===I?E+=_+P:(y+=_+P+E,E=0),p.push({l:_,an:_,add:d,n:i,anIndexes:[],val:a,line:u,animatorJustifyOffset:0}),2==m){if(d+=_,""===a||"\xa0"===a||e===s-1){for(""!==a&&"\xa0"!==a||(d-=_);c<=e;)p[c].an=d,p[c].ind=f,p[c].extra=_,c+=1;f+=1,d=0}}else if(3==m){if(d+=_,""===a||e===s-1){for(""===a&&(d-=_);c<=e;)p[c].an=d,p[c].ind=f,p[c].extra=_,c+=1;d=0,f+=1}}else p[f].ind=f,p[f].extra=0,f+=1;if(t.l=p,v=v<y?y:v,g.push(y),t.sz)t.boxWidth=t.sz[0],t.justifyOffset=0;else switch(t.boxWidth=v,t.j){case 1:t.justifyOffset=-t.boxWidth;break;case 2:t.justifyOffset=-t.boxWidth/2;break;default:t.justifyOffset=0}t.lineWidths=g;var L,N,z=l.a;n=z.length;var R,V,O=[];for(r=0;r<n;r+=1){for((L=z[r]).a.sc&&(t.strokeColorAnim=!0),L.a.sw&&(t.strokeWidthAnim=!0),(L.a.fc||L.a.fh||L.a.fs||L.a.fb)&&(t.fillColorAnim=!0),V=0,R=L.s.b,e=0;e<s;e+=1)(N=p[e]).anIndexes[r]=V,(1==R&&""!==N.val||2==R&&""!==N.val&&"\xa0"!==N.val||3==R&&(N.n||"\xa0"==N.val||e==s-1)||4==R&&(N.n||e==s-1))&&(1===L.s.rn&&O.push(V),V+=1);l.a[r].s.totalChars=V;var q,B=-1;if(1===L.s.rn)for(e=0;e<s;e+=1)B!=(N=p[e]).anIndexes[r]&&(B=N.anIndexes[r],q=O.splice(Math.floor(Math.random()*O.length),1)[0]),N.anIndexes[r]=q}t.yOffset=t.finalLineHeight||1.2*t.finalSize,t.ls=t.ls||0,t.ascent=b.ascent*t.finalSize/100},et.prototype.updateDocumentData=function(t,e){e=void 0===e?this.keysIndex:e;var s=this.copyData({},this.data.d.k[e].s);s=this.copyData(s,t),this.data.d.k[e].s=s,this.recalculate(e),this.elem.addDynamicProperty(this)},et.prototype.recalculate=function(t){var e=this.data.d.k[t].s;e.__complete=!1,this.keysIndex=0,this._isFirstFrame=!0,this.getValue(e)},et.prototype.canResizeFont=function(t){this.canResize=t,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)},et.prototype.setMinimumFontSize=function(t){this.minimumFontSize=Math.floor(t)||1,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)};var st,it,at,rt,nt,ht=function(){var l=Math.max,p=Math.min,f=Math.floor;function i(t,e){this._currentTextLength=-1,this.k=!1,this.data=e,this.elem=t,this.comp=t.comp,this.finalS=0,this.finalE=0,this.initDynamicPropertyContainer(t),this.s=w.getProp(t,e.s||{k:0},0,0,this),this.e="e"in e?w.getProp(t,e.e,0,0,this):{v:100},this.o=w.getProp(t,e.o||{k:0},0,0,this),this.xe=w.getProp(t,e.xe||{k:0},0,0,this),this.ne=w.getProp(t,e.ne||{k:0},0,0,this),this.a=w.getProp(t,e.a,0,.01,this),this.dynamicProperties.length||this.getValue()}return i.prototype={getMult:function(t){this._currentTextLength!==this.elem.textProperty.currentData.l.length&&this.getValue();var e=j.getBezierEasing(this.ne.v/100,0,1-this.xe.v/100,1).get,s=0,i=this.finalS,a=this.finalE,r=this.data.sh;if(2==r)s=e(s=a===i?a<=t?1:0:l(0,p(.5/(a-i)+(t-i)/(a-i),1)));else if(3==r)s=e(s=a===i?a<=t?0:1:1-l(0,p(.5/(a-i)+(t-i)/(a-i),1)));else if(4==r)a===i?s=0:(s=l(0,p(.5/(a-i)+(t-i)/(a-i),1)))<.5?s*=2:s=1-2*(s-.5),s=e(s);else if(5==r){if(a===i)s=0;else{var n=a-i,h=-n/2+(t=p(l(0,t+.5-i),a-i)),o=n/2;s=Math.sqrt(1-h*h/(o*o))}s=e(s)}else s=6==r?e(s=a===i?0:(t=p(l(0,t+.5-i),a-i),(1+Math.cos(Math.PI+2*Math.PI*t/(a-i)))/2)):(t>=f(i)&&(s=t-i<0?1-(i-t):l(0,p(a-t,1))),e(s));return s*this.a.v},getValue:function(t){this.iterateDynamicProperties(),this._mdf=t||this._mdf,this._currentTextLength=this.elem.textProperty.currentData.l.length||0,t&&2===this.data.r&&(this.e.v=this._currentTextLength);var e=2===this.data.r?1:100/this.data.totalChars,s=this.o.v/e,i=this.s.v/e+s,a=this.e.v/e+s;if(a<i){var r=i;i=a,a=r}this.finalS=i,this.finalE=a}},_([y],i),{getTextSelectorProp:function(t,e,s){return new i(t,e,s)}}}(),ot=function(t,e,s,i){var a=0,r=t,n=S(r);function h(){return a?n[a-=1]:e()}return{newElement:h,release:function(t){a===r&&(n=ct.double(n),r*=2),s&&s(t),n[a]=t,a+=1}}},ct={double:function(t){return t.concat(S(t.length))}},ut=ot(8,function(){return B("float32",2)}),gt=((st=ot(4,function(){return new F},function(t){var e,s=t._length;for(e=0;e<s;e+=1)ut.release(t.v[e]),ut.release(t.i[e]),ut.release(t.o[e]),t.v[e]=null,t.i[e]=null,t.o[e]=null;t._length=0,t.c=!1})).clone=function(t){var e,s=st.newElement(),i=void 0===t._length?t.v.length:t._length;for(s.setLength(i),s.c=t.c,e=0;e<i;e+=1)s.setTripleAt(t.v[e][0],t.v[e][1],t.o[e][0],t.o[e][1],t.i[e][0],t.i[e][1],e);return s},st),yt=(it={newShapeCollection:function(){var t;t=at?nt[at-=1]:new W;return t},release:function(t){var e,s=t._length;for(e=0;e<s;e+=1)gt.release(t.shapes[e]);t._length=0,at===rt&&(nt=ct.double(nt),rt*=2);nt[at]=t,at+=1}},at=0,nt=S(rt=4),it),vt=ot(8,function(){return{lengths:[],totalLength:0}},function(t){var e,s=t.lengths.length;for(e=0;e<s;e+=1)bt.release(t.lengths[e]);t.lengths.length=0}),bt=ot(8,function(){return{addedLength:0,percents:B("float32",x),lengths:B("float32",x)}});function _t(){}function kt(t,e){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.svgElement=createNS("svg");var s=createNS("defs");this.svgElement.appendChild(s);var i=createNS("g");this.svgElement.appendChild(i),this.layerElement=i,this.renderConfig={preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",imagePreserveAspectRatio:e&&e.imagePreserveAspectRatio||"xMidYMid slice",progressiveLoad:e&&e.progressiveLoad||!1,hideOnTransparent:!e||!1!==e.hideOnTransparent,viewBoxOnly:e&&e.viewBoxOnly||!1,viewBoxSize:e&&e.viewBoxSize||!1,className:e&&e.className||""},this.globalData={_mdf:!1,frameNum:-1,defs:s,renderConfig:this.renderConfig},this.elements=[],this.pendingElements=[],this.destroyed=!1,this.rendererType="svg"}function Dt(t,e){this.animationItem=t,this.renderConfig={clearCanvas:!e||void 0===e.clearCanvas||e.clearCanvas,context:e&&e.context||null,progressiveLoad:e&&e.progressiveLoad||!1,preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",imagePreserveAspectRatio:e&&e.imagePreserveAspectRatio||"xMidYMid slice",className:e&&e.className||""},this.renderConfig.dpr=e&&e.dpr||1,this.animationItem.wrapper&&(this.renderConfig.dpr=e&&e.dpr||u.devicePixelRatio||1),this.renderedFrame=-1,this.globalData={frameNum:-1,_mdf:!1,renderConfig:this.renderConfig,currentGlobalAlpha:-1},this.contextData=new Wt,this.elements=[],this.pendingElements=[],this.transformMat=new b,this.completeLayers=!1,this.rendererType="canvas"}function Ct(t,e,s){this.data=t,this.element=e,this.globalData=s,this.storedData=[],this.masksProperties=this.data.masksProperties||[],this.maskElement=null;var i,a=this.globalData.defs,r=this.masksProperties?this.masksProperties.length:0;this.viewData=S(r),this.solidPath="";var n,h,o,l,p,f,m,d=this.masksProperties,c=0,u=[],g=P(10),y="clipPath",v="clip-path";for(i=0;i<r;i++)if(("a"!==d[i].mode&&"n"!==d[i].mode||d[i].inv||100!==d[i].o.k)&&(v=y="mask"),"s"!=d[i].mode&&"i"!=d[i].mode||0!==c?l=null:((l=createNS("rect")).setAttribute("fill","#ffffff"),l.setAttribute("width",this.element.comp.data.w||0),l.setAttribute("height",this.element.comp.data.h||0),u.push(l)),n=createNS("path"),"n"!=d[i].mode){var b;if(c+=1,n.setAttribute("fill","s"===d[i].mode?"#000000":"#ffffff"),n.setAttribute("clip-rule","nonzero"),0!==d[i].x.k?(v=y="mask",m=w.getProp(this.element,d[i].x,0,null,this.element),b="fi_"+P(10),(p=createNS("filter")).setAttribute("id",b),(f=createNS("feMorphology")).setAttribute("operator","dilate"),f.setAttribute("in","SourceGraphic"),f.setAttribute("radius","0"),p.appendChild(f),a.appendChild(p),n.setAttribute("stroke","s"===d[i].mode?"#000000":"#ffffff")):m=f=null,this.storedData[i]={elem:n,x:m,expan:f,lastPath:"",lastOperator:"",filterId:b,lastRadius:0},"i"==d[i].mode){o=u.length;var _=createNS("g");for(h=0;h<o;h+=1)_.appendChild(u[h]);var k=createNS("mask");k.setAttribute("mask-type","alpha"),k.setAttribute("id",g+"_"+c),k.appendChild(n),a.appendChild(k),_.setAttribute("mask","url("+D+"#"+g+"_"+c+")"),u.length=0,u.push(_)}else u.push(n);d[i].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[i]={elem:n,lastPath:"",op:w.getProp(this.element,d[i].o,0,.01,this.element),prop:L.getShapeProp(this.element,d[i],3),invRect:l},this.viewData[i].prop.k||this.drawPath(d[i],this.viewData[i].prop.v,this.viewData[i])}else this.viewData[i]={op:w.getProp(this.element,d[i].o,0,.01,this.element),prop:L.getShapeProp(this.element,d[i],3),elem:n,lastPath:""},a.appendChild(n);for(this.maskElement=createNS(y),r=u.length,i=0;i<r;i+=1)this.maskElement.appendChild(u[i]);0<c&&(this.maskElement.setAttribute("id",g),this.element.maskedElement.setAttribute(v,"url("+D+"#"+g+")"),a.appendChild(this.maskElement)),this.viewData.length&&this.element.addRenderableComponent(this)}function xt(){}function Pt(){}function St(){}function Tt(){}function At(){}function wt(t,e){this.elem=t,this.pos=e}function Mt(t,e,s){this.caches=[],this.styles=[],this.transformers=t,this.lStr="",this.sh=s,this.lvl=e,this._isAnimated=!!s.k;for(var i=0,a=t.length;i<a;){if(t[i].mProps.dynamicProperties.length){this._isAnimated=!0;break}i+=1}}function Ft(){this.it=[],this.prevViewData=[],this.gr=createNS("g")}function It(){this.sequences={},this.sequenceList=[],this.transform_key_count=0}function Et(t,e,s,i){this.styledShapes=[],this.tr=[0,0,0,0,0,0];var a=4;"rc"==e.ty?a=5:"el"==e.ty?a=6:"sr"==e.ty&&(a=7),this.sh=L.getShapeProp(t,e,a,t);var r,n,h=s.length;for(r=0;r<h;r+=1)s[r].closed||(n={transforms:i.addTransformSequence(s[r].transforms),trNodes:[]},this.styledShapes.push(n),s[r].elements.push(n))}function Lt(){}function Nt(t,e,s){this.initFrame(),this.initBaseData(t,e,s),this.initFrame(),this.initTransform(t,e,s),this.initHierarchy()}function zt(){}function Rt(){}function Vt(){}function Ot(){}function qt(t,e,s){this.assetData=e.getAssetData(t.refId),this.initElement(t,e,s)}function Bt(t,e,s){this.initElement(t,e,s)}function jt(t,e,s){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.shapeModifiers=[],this.itemsData=[],this.processedElements=[],this.animatedContents=[],this.initElement(t,e,s),this.prevViewData=[]}function Wt(){this.saved=[],this.cArrPos=0,this.cTr=new b,this.cO=1;var t;for(this.savedOp=B("float32",15),t=0;t<15;t+=1)this.saved[t]=B("float32",16);this._length=15}function Yt(){}function Gt(t,e,s){this.failed=!1,this.assetData=e.getAssetData(t.refId),this.img=e.imageLoader.getImage(this.assetData),this.initElement(t,e,s)}function Xt(t,e,s){this.completeLayers=!1,this.layers=t.layers,this.pendingElements=[],this.elements=S(this.layers.length),this.initElement(t,e,s),this.tm=t.tm?w.getProp(this,t.tm,0,e.frameRate,this):{_placeholder:!0}}function Ht(t,e){this.data=t,this.element=e,this.masksProperties=this.data.masksProperties||[],this.viewData=S(this.masksProperties.length);var s,i=this.masksProperties.length,a=!1;for(s=0;s<i;s++)"n"!==this.masksProperties[s].mode&&(a=!0),this.viewData[s]=L.getShapeProp(this.element,this.masksProperties[s],3);(this.hasMasks=a)&&this.element.addRenderableComponent(this)}function Jt(t,e,s){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.itemsData=[],this.prevViewData=[],this.shapeModifiers=[],this.processedElements=[],this.transformsManager=new It,this.initElement(t,e,s)}function Kt(t,e,s){this.initElement(t,e,s)}function Zt(t,e,s){this.textSpans=[],this.yOffset=0,this.fillColorAnim=!1,this.strokeColorAnim=!1,this.strokeWidthAnim=!1,this.stroke=!1,this.fill=!1,this.justifyOffset=0,this.currentRender=null,this.renderType="canvas",this.values={fill:"rgba(0,0,0,0)",stroke:"rgba(0,0,0,0)",sWidth:0,fValue:""},this.initElement(t,e,s)}function Ut(){}_t.prototype.checkLayers=function(t){var e,s,i=this.layers.length;for(this.completeLayers=!0,e=i-1;0<=e;e--)this.elements[e]||(s=this.layers[e]).ip-s.st<=t-this.layers[e].st&&s.op-s.st>t-this.layers[e].st&&this.buildItem(e),this.completeLayers=!!this.elements[e]&&this.completeLayers;this.checkPendingElements()},_t.prototype.createItem=function(t){switch(t.ty){case 2:return this.createImage(t);case 0:return this.createComp(t);case 1:return this.createSolid(t);case 3:return this.createNull(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 13:return this.createCamera(t)}return this.createNull(t)},_t.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},_t.prototype.buildAllItems=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this.buildItem(t);this.checkPendingElements()},_t.prototype.includeLayers=function(t){this.completeLayers=!1;var e,s,i=t.length,a=this.layers.length;for(e=0;e<i;e+=1)for(s=0;s<a;){if(this.layers[s].id==t[e].id){this.layers[s]=t[e];break}s+=1}},_t.prototype.setProjectInterface=function(t){this.globalData.projectInterface=t},_t.prototype.initItems=function(){this.globalData.progressiveLoad||this.buildAllItems()},_t.prototype.buildElementParenting=function(t,e,s){for(var i=this.elements,a=this.layers,r=0,n=a.length;r<n;)a[r].ind==e&&(i[r]&&!0!==i[r]?(s.push(i[r]),i[r].setAsParent(),void 0!==a[r].parent?this.buildElementParenting(t,a[r].parent,s):t.setHierarchy(s)):(this.buildItem(r),this.addPendingElement(t))),r+=1},_t.prototype.addPendingElement=function(t){this.pendingElements.push(t)},_t.prototype.searchExtraCompositions=function(t){var e,s=t.length;for(e=0;e<s;e+=1)if(t[e].xt){var i=this.createComp(t[e]);i.initExpressions(),this.globalData.projectInterface.registerComposition(i)}},_t.prototype.setupGlobalData=function(t,e){this.globalData.fontManager=new A,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,e),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.imageLoader=this.animationItem.imagePreloader,this.globalData.frameId=0,this.globalData.frameRate=t.fr,this.globalData.nm=t.nm,this.globalData.compSize={w:t.w,h:t.h}},_([_t],kt),kt.prototype.createNull=function(t){return new Nt(t,this.globalData,this)},kt.prototype.createShape=function(t){return new jt(t,this.globalData,this)},kt.prototype.createText=function(t){return new SVGTextElement(t,this.globalData,this)},kt.prototype.createImage=function(t){return new qt(t,this.globalData,this)},kt.prototype.createComp=function(t){return new SVGCompElement(t,this.globalData,this)},kt.prototype.createSolid=function(t){return new Bt(t,this.globalData,this)},kt.prototype.configAnimation=function(t){this.svgElement.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.renderConfig.viewBoxSize?this.svgElement.setAttribute("viewBox",this.renderConfig.viewBoxSize):this.svgElement.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.renderConfig.viewBoxOnly||(this.svgElement.setAttribute("width",t.w),this.svgElement.setAttribute("height",t.h),this.svgElement.style.width="100%",this.svgElement.style.height="100%",this.svgElement.style.transform="translate3d(0,0,0)"),this.renderConfig.className&&this.svgElement.setAttribute("class",this.renderConfig.className),this.svgElement.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this.animationItem.wrapper.appendChild(this.svgElement);var e=this.globalData.defs;this.setupGlobalData(t,e),this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.data=t;var s=createNS("clipPath"),i=createNS("rect");i.setAttribute("width",t.w),i.setAttribute("height",t.h),i.setAttribute("x",0),i.setAttribute("y",0);var a="animationMask_"+P(10);s.setAttribute("id",a),s.appendChild(i),this.layerElement.setAttribute("clip-path","url("+D+"#"+a+")"),e.appendChild(s),this.layers=t.layers,this.elements=S(t.layers.length)},kt.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.layerElement=null,this.globalData.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;t<e;t++)this.elements[t]&&this.elements[t].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},kt.prototype.updateContainerSize=function(){},kt.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!=this.layers[t].ty){e[t]=!0;var s=this.createItem(this.layers[t]);e[t]=s,h&&(0===this.layers[t].ty&&this.globalData.projectInterface.registerComposition(s),s.initExpressions()),this.appendElementInPos(s,t),this.layers[t].tt&&(this.elements[t-1]&&!0!==this.elements[t-1]?s.setMatte(e[t-1].layerId):(this.buildItem(t-1),this.addPendingElement(s)))}},kt.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();if(t.checkParenting(),t.data.tt)for(var e=0,s=this.elements.length;e<s;){if(this.elements[e]===t){t.setMatte(this.elements[e-1].layerId);break}e+=1}}},kt.prototype.renderFrame=function(t){if(this.renderedFrame!==t&&!this.destroyed){null===t?t=this.renderedFrame:this.renderedFrame=t,this.globalData.frameNum=t,this.globalData.frameId+=1,this.globalData.projectInterface.currentFrame=t,this.globalData._mdf=!1;var e,s=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=s-1;0<=e;e--)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(t-this.layers[e].st);if(this.globalData._mdf)for(e=0;e<s;e+=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame()}},kt.prototype.appendElementInPos=function(t,e){var s=t.getBaseElement();if(s){for(var i,a=0;a<e;)this.elements[a]&&!0!==this.elements[a]&&this.elements[a].getBaseElement()&&(i=this.elements[a].getBaseElement()),a+=1;i?this.layerElement.insertBefore(s,i):this.layerElement.appendChild(s)}},kt.prototype.hide=function(){this.layerElement.style.display="none"},kt.prototype.show=function(){this.layerElement.style.display="block"},_([_t],Dt),Dt.prototype.createShape=function(t){return new Jt(t,this.globalData,this)},Dt.prototype.createText=function(t){return new Zt(t,this.globalData,this)},Dt.prototype.createImage=function(t){return new Gt(t,this.globalData,this)},Dt.prototype.createComp=function(t){return new Xt(t,this.globalData,this)},Dt.prototype.createSolid=function(t){return new Kt(t,this.globalData,this)},Dt.prototype.createNull=kt.prototype.createNull,Dt.prototype.ctxTransform=function(t){if(1!==t[0]||0!==t[1]||0!==t[4]||1!==t[5]||0!==t[12]||0!==t[13])if(this.renderConfig.clearCanvas){this.transformMat.cloneFromProps(t);var e=this.contextData.cTr.props;this.transformMat.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15]),this.contextData.cTr.cloneFromProps(this.transformMat.props);var s=this.contextData.cTr.props;this.canvasContext.setTransform(s[0],s[1],s[4],s[5],s[12],s[13])}else this.canvasContext.transform(t[0],t[1],t[4],t[5],t[12],t[13])},Dt.prototype.ctxOpacity=function(t){if(!this.renderConfig.clearCanvas)return this.canvasContext.globalAlpha*=t<0?0:t,void(this.globalData.currentGlobalAlpha=this.contextData.cO);this.contextData.cO*=t<0?0:t,this.globalData.currentGlobalAlpha!==this.contextData.cO&&(this.canvasContext.globalAlpha=this.contextData.cO,this.globalData.currentGlobalAlpha=this.contextData.cO)},Dt.prototype.reset=function(){this.renderConfig.clearCanvas?this.contextData.reset():this.canvasContext.restore()},Dt.prototype.save=function(t){if(this.renderConfig.clearCanvas){t&&this.canvasContext.save();var e=this.contextData.cTr.props;this.contextData._length<=this.contextData.cArrPos&&this.contextData.duplicate();var s,i=this.contextData.saved[this.contextData.cArrPos];for(s=0;s<16;s+=1)i[s]=e[s];this.contextData.savedOp[this.contextData.cArrPos]=this.contextData.cO,this.contextData.cArrPos+=1}else this.canvasContext.save()},Dt.prototype.restore=function(t){if(this.renderConfig.clearCanvas){t&&(this.canvasContext.restore(),this.globalData.blendMode="source-over"),this.contextData.cArrPos-=1;var e,s=this.contextData.saved[this.contextData.cArrPos],i=this.contextData.cTr.props;for(e=0;e<16;e+=1)i[e]=s[e];this.canvasContext.setTransform(s[0],s[1],s[4],s[5],s[12],s[13]),s=this.contextData.savedOp[this.contextData.cArrPos],this.contextData.cO=s,this.globalData.currentGlobalAlpha!==s&&(this.canvasContext.globalAlpha=s,this.globalData.currentGlobalAlpha=s)}else this.canvasContext.restore()},Dt.prototype.configAnimation=function(t){this.animationItem.wrapper?(this.animationItem.container=g("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.renderConfig.className&&this.animationItem.container.setAttribute("class",this.renderConfig.className)):this.canvasContext=this.renderConfig.context,this.data=t,this.layers=t.layers,this.transformCanvas={w:t.w,h:t.h,sx:0,sy:0,tx:0,ty:0},this.setupGlobalData(t,document.body),this.globalData.canvasContext=this.canvasContext,(this.globalData.renderer=this).globalData.isDashed=!1,this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.globalData.transformCanvas=this.transformCanvas,this.elements=S(t.layers.length),this.updateContainerSize()},Dt.prototype.updateContainerSize=function(){var t,e,s,i;if(this.reset(),this.animationItem.wrapper&&this.animationItem.container?(t=this.animationItem.wrapper.offsetWidth,e=this.animationItem.wrapper.offsetHeight,this.animationItem.container.setAttribute("width",t*this.renderConfig.dpr),this.animationItem.container.setAttribute("height",e*this.renderConfig.dpr)):(t=this.canvasContext.canvas.width*this.renderConfig.dpr,e=this.canvasContext.canvas.height*this.renderConfig.dpr),-1!==this.renderConfig.preserveAspectRatio.indexOf("meet")||-1!==this.renderConfig.preserveAspectRatio.indexOf("slice")){var a=this.renderConfig.preserveAspectRatio.split(" "),r=a[1]||"meet",n=a[0]||"xMidYMid",h=n.substr(0,4),o=n.substr(4);s=t/e,i=this.transformCanvas.w/this.transformCanvas.h,this.transformCanvas.sy=s<i&&"meet"===r||i<s&&"slice"===r?(this.transformCanvas.sx=t/(this.transformCanvas.w/this.renderConfig.dpr),t/(this.transformCanvas.w/this.renderConfig.dpr)):(this.transformCanvas.sx=e/(this.transformCanvas.h/this.renderConfig.dpr),e/(this.transformCanvas.h/this.renderConfig.dpr)),this.transformCanvas.tx="xMid"===h&&(i<s&&"meet"===r||s<i&&"slice"===r)?(t-this.transformCanvas.w*(e/this.transformCanvas.h))/2*this.renderConfig.dpr:"xMax"===h&&(i<s&&"meet"===r||s<i&&"slice"===r)?(t-this.transformCanvas.w*(e/this.transformCanvas.h))*this.renderConfig.dpr:0,this.transformCanvas.ty="YMid"===o&&(s<i&&"meet"===r||i<s&&"slice"===r)?(e-this.transformCanvas.h*(t/this.transformCanvas.w))/2*this.renderConfig.dpr:"YMax"===o&&(s<i&&"meet"===r||i<s&&"slice"===r)?(e-this.transformCanvas.h*(t/this.transformCanvas.w))*this.renderConfig.dpr:0}else"none"==this.renderConfig.preserveAspectRatio?(this.transformCanvas.sx=t/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=e/(this.transformCanvas.h/this.renderConfig.dpr)):(this.transformCanvas.sx=this.renderConfig.dpr,this.transformCanvas.sy=this.renderConfig.dpr),this.transformCanvas.tx=0,this.transformCanvas.ty=0;this.transformCanvas.props=[this.transformCanvas.sx,0,0,0,0,this.transformCanvas.sy,0,0,0,0,1,0,this.transformCanvas.tx,this.transformCanvas.ty,0,1],this.ctxTransform(this.transformCanvas.props),this.canvasContext.beginPath(),this.canvasContext.rect(0,0,this.transformCanvas.w,this.transformCanvas.h),this.canvasContext.closePath(),this.canvasContext.clip()},Dt.prototype.destroy=function(){var t;for(this.renderConfig.clearCanvas&&(this.animationItem.wrapper.innerHTML=""),t=(this.layers?this.layers.length:0)-1;0<=t;t-=1)this.elements[t]&&this.elements[t].destroy();this.elements.length=0,this.globalData.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},Dt.prototype.renderFrame=function(t){if(!(this.renderedFrame==t&&!0===this.renderConfig.clearCanvas||this.destroyed||-1===t)){this.renderedFrame=t,this.globalData.frameNum=t-this.animationItem._isFirstFrame,this.globalData.frameId+=1,this.globalData._mdf=!this.renderConfig.clearCanvas,this.globalData.projectInterface.currentFrame=t;var e,s=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=0;e<s;e++)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(t-this.layers[e].st);if(this.globalData._mdf){for(!0===this.renderConfig.clearCanvas?this.canvasContext.clearRect(0,0,this.transformCanvas.w,this.transformCanvas.h):this.save(),e=s-1;0<=e;e-=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame();!0!==this.renderConfig.clearCanvas&&this.restore()}}},Dt.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!=this.layers[t].ty){var s=this.createItem(this.layers[t],this,this.globalData);(e[t]=s).initExpressions()}},Dt.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){this.pendingElements.pop().checkParenting()}},Dt.prototype.hide=function(){this.animationItem.container.style.display="none"},Dt.prototype.show=function(){this.animationItem.container.style.display="block"},Ct.prototype.getMaskProperty=function(t){return this.viewData[t].prop},Ct.prototype.renderFrame=function(t){var e,s=this.element.finalTransform.mat,i=this.masksProperties.length;for(e=0;e<i;e++)if((this.viewData[e].prop._mdf||t)&&this.drawPath(this.masksProperties[e],this.viewData[e].prop.v,this.viewData[e]),(this.viewData[e].op._mdf||t)&&this.viewData[e].elem.setAttribute("fill-opacity",this.viewData[e].op.v),"n"!==this.masksProperties[e].mode&&(this.viewData[e].invRect&&(this.element.finalTransform.mProp._mdf||t)&&(this.viewData[e].invRect.setAttribute("x",-s.props[12]),this.viewData[e].invRect.setAttribute("y",-s.props[13])),this.storedData[e].x&&(this.storedData[e].x._mdf||t))){var a=this.storedData[e].expan;this.storedData[e].x.v<0?("erode"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="erode",this.storedData[e].elem.setAttribute("filter","url("+D+"#"+this.storedData[e].filterId+")")),a.setAttribute("radius",-this.storedData[e].x.v)):("dilate"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="dilate",this.storedData[e].elem.setAttribute("filter",null)),this.storedData[e].elem.setAttribute("stroke-width",2*this.storedData[e].x.v))}},Ct.prototype.getMaskelement=function(){return this.maskElement},Ct.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+=" h"+this.globalData.compSize.w,t+=" v"+this.globalData.compSize.h,t+=" h-"+this.globalData.compSize.w,t+=" v-"+this.globalData.compSize.h+" "},Ct.prototype.drawPath=function(t,e,s){var i,a,r=" M"+e.v[0][0]+","+e.v[0][1];for(a=e._length,i=1;i<a;i+=1)r+=" 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];if(e.c&&1<a&&(r+=" 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]),s.lastPath!==r){var n="";s.elem&&(e.c&&(n=t.inv?this.solidPath+r:r),s.elem.setAttribute("d",n)),s.lastPath=r}},Ct.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.masksProperties=null},xt.prototype={initHierarchy:function(){this.hierarchy=[],this._isParent=!1,this.checkParenting()},setHierarchy:function(t){this.hierarchy=t},setAsParent:function(){this._isParent=!0},checkParenting:function(){void 0!==this.data.parent&&this.comp.buildElementParenting(this,this.data.parent,[])}},Pt.prototype={initFrame:function(){this._isFirstFrame=!1,this.dynamicProperties=[],this._mdf=!1},prepareProperties:function(t,e){var s,i=this.dynamicProperties.length;for(s=0;s<i;s+=1)(e||this._isParent&&"transform"===this.dynamicProperties[s].propType)&&(this.dynamicProperties[s].getValue(),this.dynamicProperties[s]._mdf&&(this.globalData._mdf=!0,this._mdf=!0))},addDynamicProperty:function(t){-1===this.dynamicProperties.indexOf(t)&&this.dynamicProperties.push(t)}},St.prototype={initTransform:function(){this.finalTransform={mProp:this.data.ks?M.getTransformProperty(this,this.data.ks,this):{o:0},_matMdf:!1,_opMdf:!1,mat:new b},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),this.data.ty},renderTransform:function(){if(this.finalTransform._opMdf=this.finalTransform.mProp.o._mdf||this._isFirstFrame,this.finalTransform._matMdf=this.finalTransform.mProp._mdf||this._isFirstFrame,this.hierarchy){var t,e=this.finalTransform.mat,s=0,i=this.hierarchy.length;if(!this.finalTransform._matMdf)for(;s<i;){if(this.hierarchy[s].finalTransform.mProp._mdf){this.finalTransform._matMdf=!0;break}s+=1}if(this.finalTransform._matMdf)for(t=this.finalTransform.mProp.v.props,e.cloneFromProps(t),s=0;s<i;s+=1)t=this.hierarchy[s].finalTransform.mProp.v.props,e.transform(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}},globalToLocal:function(t){var e=[];e.push(this.finalTransform);for(var s=!0,i=this.comp;s;)i.finalTransform?(i.data.hasMask&&e.splice(0,0,i.finalTransform),i=i.comp):s=!1;var a,r,n=e.length;for(a=0;a<n;a+=1)r=e[a].mat.applyToPointArray(0,0,0),t=[t[0]-r[0],t[1]-r[1],0];return t},mHelper:new b},Tt.prototype={initRenderable:function(){this.isInRange=!1,this.hidden=!1,this.isTransparent=!1,this.renderableComponents=[]},addRenderableComponent:function(t){-1===this.renderableComponents.indexOf(t)&&this.renderableComponents.push(t)},removeRenderableComponent:function(t){-1!==this.renderableComponents.indexOf(t)&&this.renderableComponents.splice(this.renderableComponents.indexOf(t),1)},prepareRenderableFrame:function(t){this.checkLayerLimits(t)},checkTransparency:function(){this.finalTransform.mProp.o.v<=0?!this.isTransparent&&this.globalData.renderConfig.hideOnTransparent&&(this.isTransparent=!0,this.hide()):this.isTransparent&&(this.isTransparent=!1,this.show())},checkLayerLimits:function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?!0!==this.isInRange&&(this.globalData._mdf=!0,this._mdf=!0,this.isInRange=!0,this.show()):!1!==this.isInRange&&(this.globalData._mdf=!0,this.isInRange=!1,this.hide())},renderRenderable:function(){var t,e=this.renderableComponents.length;for(t=0;t<e;t+=1)this.renderableComponents[t].renderFrame(this._isFirstFrame)},sourceRectAtTime:function(){return{top:0,left:0,width:100,height:100}},getLayerSize:function(){return 5===this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}}},_([Tt,function(t){function e(){}return e.prototype=t,e}({initElement:function(t,e,s){this.initFrame(),this.initBaseData(t,e,s),this.initTransform(t,e,s),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide()},hide:function(){this.hidden||this.isInRange&&!this.isTransparent||((this.baseElement||this.layerElement).style.display="none",this.hidden=!0)},show:function(){this.isInRange&&!this.isTransparent&&(this.data.hd||((this.baseElement||this.layerElement).style.display="block"),this.hidden=!1,this._isFirstFrame=!0)},renderFrame:function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderElement(),this.renderInnerContent(),this._isFirstFrame&&(this._isFirstFrame=!1))},renderInnerContent:function(){},prepareFrame:function(t){this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.checkTransparency()},destroy:function(){this.innerElem=null,this.destroyBaseElement()}})],At),Mt.prototype.setAsAnimated=function(){this._isAnimated=!0},It.prototype={addTransformSequence:function(t){var e,s=t.length,i="_";for(e=0;e<s;e+=1)i+=t[e].transform.key+"_";var a=this.sequences[i];return a||(a={transforms:[].concat(t),finalTransform:new b,_mdf:!1},this.sequences[i]=a,this.sequenceList.push(a)),a},processSequence:function(t,e){for(var s,i=0,a=t.transforms.length,r=e;i<a&&!e;){if(t.transforms[i].transform.mProps._mdf){r=!0;break}i+=1}if(r)for(t.finalTransform.reset(),i=a-1;0<=i;i-=1)s=t.transforms[i].transform.mProps.v.props,t.finalTransform.transform(s[0],s[1],s[2],s[3],s[4],s[5],s[6],s[7],s[8],s[9],s[10],s[11],s[12],s[13],s[14],s[15]);t._mdf=r},processSequences:function(t){var e,s=this.sequenceList.length;for(e=0;e<s;e+=1)this.processSequence(this.sequenceList[e],t)},getNewKey:function(){return"_"+this.transform_key_count++}},Et.prototype.setAsAnimated=Mt.prototype.setAsAnimated,Lt.prototype={checkMasks:function(){if(!this.data.hasMask)return!1;for(var t=0,e=this.data.masksProperties.length;t<e;){if("n"!==this.data.masksProperties[t].mode&&!1!==this.data.masksProperties[t].cl)return!0;t+=1}return!1},initExpressions:function(){this.layerInterface=LayerExpressionInterface(this),this.data.hasMask&&this.maskManager&&this.layerInterface.registerMaskInterface(this.maskManager);var t=EffectsExpressionInterface.createEffectsInterface(this,this.layerInterface);this.layerInterface.registerEffectsInterface(t),0===this.data.ty||this.data.xt?this.compInterface=CompExpressionInterface(this):4===this.data.ty?(this.layerInterface.shapeInterface=ShapeExpressionInterface(this.shapesData,this.itemsData,this.layerInterface),this.layerInterface.content=this.layerInterface.shapeInterface):5===this.data.ty&&(this.layerInterface.textInterface=TextExpressionInterface(this),this.layerInterface.text=this.layerInterface.textInterface)},blendModeEnums:{1:"multiply",2:"screen",3:"overlay",4:"darken",5:"lighten",6:"color-dodge",7:"color-burn",8:"hard-light",9:"soft-light",10:"difference",11:"exclusion",12:"hue",13:"saturation",14:"color",15:"luminosity"},getBlendMode:function(){return this.blendModeEnums[this.data.bm]||""},setBlendMode:function(){var t=this.getBlendMode();(this.baseElement||this.layerElement).style["mix-blend-mode"]=t},initBaseData:function(t,e,s){this.globalData=e,this.comp=s,this.data=t,this.layerId="ly_"+P(10),this.data.sr||(this.data.sr=1),this.effectsManager=new te(this.data,this,this.dynamicProperties)},getType:function(){return this.type}},Nt.prototype.prepareFrame=function(t){this.prepareProperties(t,!0)},Nt.prototype.renderFrame=function(){},Nt.prototype.getBaseElement=function(){return null},Nt.prototype.destroy=function(){},Nt.prototype.sourceRectAtTime=function(){},Nt.prototype.hide=function(){},_([Lt,St,xt,Pt],Nt),zt.prototype={initRendererElement:function(){this.layerElement=createNS("g")},createContainerElements:function(){this.matteElement=createNS("g"),this.transformedElement=this.layerElement,this.maskedElement=this.layerElement,this._sizeChanged=!1;var t,e,s,i=null;if(this.data.td){if(3==this.data.td||1==this.data.td){var a=createNS("mask");a.setAttribute("id",this.layerId),a.setAttribute("mask-type",3==this.data.td?"luminance":"alpha"),a.appendChild(this.layerElement),i=a,this.globalData.defs.appendChild(a),Z.maskType||1!=this.data.td||(a.setAttribute("mask-type","luminance"),t=P(10),e=U.createFilter(t),this.globalData.defs.appendChild(e),e.appendChild(U.createAlphaToLuminanceFilter()),(s=createNS("g")).appendChild(this.layerElement),i=s,a.appendChild(s),s.setAttribute("filter","url("+D+"#"+t+")"))}else if(2==this.data.td){var r=createNS("mask");r.setAttribute("id",this.layerId),r.setAttribute("mask-type","alpha");var n=createNS("g");r.appendChild(n),t=P(10),e=U.createFilter(t);var h=createNS("feColorMatrix");h.setAttribute("type","matrix"),h.setAttribute("color-interpolation-filters","sRGB"),h.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"),e.appendChild(h),this.globalData.defs.appendChild(e);var o=createNS("rect");o.setAttribute("width",this.comp.data.w),o.setAttribute("height",this.comp.data.h),o.setAttribute("x","0"),o.setAttribute("y","0"),o.setAttribute("fill","#ffffff"),o.setAttribute("opacity","0"),n.setAttribute("filter","url("+D+"#"+t+")"),n.appendChild(o),n.appendChild(this.layerElement),i=n,Z.maskType||(r.setAttribute("mask-type","luminance"),e.appendChild(U.createAlphaToLuminanceFilter()),s=createNS("g"),n.appendChild(o),s.appendChild(this.layerElement),i=s,n.appendChild(s)),this.globalData.defs.appendChild(r)}}else this.data.tt?(this.matteElement.appendChild(this.layerElement),i=this.matteElement,this.baseElement=this.matteElement):this.baseElement=this.layerElement;if(this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl),0===this.data.ty&&!this.data.hd){var l=createNS("clipPath"),p=createNS("path");p.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var f="cp_"+P(8);if(l.setAttribute("id",f),l.appendChild(p),this.globalData.defs.appendChild(l),this.checkMasks()){var m=createNS("g");m.setAttribute("clip-path","url("+D+"#"+f+")"),m.appendChild(this.layerElement),this.transformedElement=m,i?i.appendChild(this.transformedElement):this.baseElement=this.transformedElement}else this.layerElement.setAttribute("clip-path","url("+D+"#"+f+")")}0!==this.data.bm&&this.setBlendMode()},renderElement:function(){this.finalTransform._matMdf&&this.transformedElement.setAttribute("transform",this.finalTransform.mat.to2dCSS()),this.finalTransform._opMdf&&this.transformedElement.setAttribute("opacity",this.finalTransform.mProp.o.v)},destroyBaseElement:function(){this.layerElement=null,this.matteElement=null,this.maskManager.destroy()},getBaseElement:function(){return this.data.hd?null:this.baseElement},createRenderableComponents:function(){this.maskManager=new Ct(this.data,this,this.globalData),this.renderableEffectsManager=new SVGEffects(this)},setMatte:function(t){this.matteElement&&this.matteElement.setAttribute("mask","url("+D+"#"+t+")")}},Rt.prototype={addShapeToModifiers:function(t){var e,s=this.shapeModifiers.length;for(e=0;e<s;e+=1)this.shapeModifiers[e].addShape(t)},isShapeInAnimatedModifiers:function(t){for(var e=this.shapeModifiers.length;0<e;)if(this.shapeModifiers[0].isAnimatedWithShape(t))return!0;return!1},renderModifiers:function(){if(this.shapeModifiers.length){var t,e=this.shapes.length;for(t=0;t<e;t+=1)this.shapes[t].sh.reset();for(t=(e=this.shapeModifiers.length)-1;0<=t;t-=1)this.shapeModifiers[t].processShapes(this._isFirstFrame)}},lcEnum:{1:"butt",2:"round",3:"square"},ljEnum:{1:"miter",2:"round",3:"bevel"},searchProcessedElement:function(t){for(var e=this.processedElements,s=0,i=e.length;s<i;){if(e[s].elem===t)return e[s].pos;s+=1}return 0},addProcessedElement:function(t,e){for(var s=this.processedElements,i=s.length;i;)if(s[i-=1].elem===t)return void(s[i].pos=e);s.push(new wt(t,e))},prepareFrame:function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange)}},Vt.prototype.initElement=function(t,e,s){this.lettersChangedFlag=!0,this.initFrame(),this.initBaseData(t,e,s),this.textProperty=new et(this,t.t,this.dynamicProperties),this.textAnimator=new $(t.t,this.renderType,this),this.initTransform(t,e,s),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide(),this.textAnimator.searchProperties(this.dynamicProperties)},Vt.prototype.prepareFrame=function(t){this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),(this.textProperty._mdf||this.textProperty._isFirstFrame)&&(this.buildNewText(),this.textProperty._isFirstFrame=!1,this.textProperty._mdf=!1)},Vt.prototype.createPathShape=function(t,e){var s,i,a=e.length,r="";for(s=0;s<a;s+=1)i=e[s].ks.k,r+=J(i,i.i.length,!0,t);return r},Vt.prototype.updateDocumentData=function(t,e){this.textProperty.updateDocumentData(t,e)},Vt.prototype.canResizeFont=function(t){this.textProperty.canResizeFont(t)},Vt.prototype.setMinimumFontSize=function(t){this.textProperty.setMinimumFontSize(t)},Vt.prototype.applyTextPropertiesToMatrix=function(t,e,s,i,a){switch(t.ps&&e.translate(t.ps[0],t.ps[1]+t.ascent,0),e.translate(0,-t.ls,0),t.j){case 1:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[s]),0,0);break;case 2:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[s])/2,0,0)}e.translate(i,a,0)},Vt.prototype.buildColor=function(t){return"rgb("+Math.round(255*t[0])+","+Math.round(255*t[1])+","+Math.round(255*t[2])+")"},Vt.prototype.emptyProp=new dt,Vt.prototype.destroy=function(){},_([Lt,St,xt,Pt,At],Ot),Ot.prototype.initElement=function(t,e,s){this.initFrame(),this.initBaseData(t,e,s),this.initTransform(t,e,s),this.initRenderable(),this.initHierarchy(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),!this.data.xt&&e.progressiveLoad||this.buildAllItems(),this.hide()},Ot.prototype.prepareFrame=function(t){if(this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.isInRange||this.data.xt){if(this.tm._placeholder)this.renderedFrame=t/this.data.sr;else{var e=this.tm.v;e===this.data.op&&(e=this.data.op-1),this.renderedFrame=e}var s,i=this.elements.length;for(this.completeLayers||this.checkLayers(this.renderedFrame),s=i-1;0<=s;s-=1)(this.completeLayers||this.elements[s])&&(this.elements[s].prepareFrame(this.renderedFrame-this.layers[s].st),this.elements[s]._mdf&&(this._mdf=!0))}},Ot.prototype.renderInnerContent=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)(this.completeLayers||this.elements[t])&&this.elements[t].renderFrame()},Ot.prototype.setElements=function(t){this.elements=t},Ot.prototype.getElements=function(){return this.elements},Ot.prototype.destroyElements=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this.elements[t]&&this.elements[t].destroy()},Ot.prototype.destroy=function(){this.destroyElements(),this.destroyBaseElement()},_([Lt,St,zt,xt,Pt,At],qt),qt.prototype.createContent=function(){var t=this.globalData.getAssetsPath(this.assetData);this.innerElem=createNS("image"),this.innerElem.setAttribute("width",this.assetData.w+"px"),this.innerElem.setAttribute("height",this.assetData.h+"px"),this.innerElem.setAttribute("preserveAspectRatio",this.assetData.pr||this.globalData.renderConfig.imagePreserveAspectRatio),this.innerElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this.layerElement.appendChild(this.innerElem)},_([qt],Bt),Bt.prototype.createContent=function(){var t=createNS("rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.layerElement.appendChild(t)},_([Lt,St,zt,Rt,xt,Pt,At],jt),jt.prototype.initSecondaryElement=function(){},jt.prototype.identityMatrix=new b,jt.prototype.buildExpressionInterface=function(){},jt.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes()},jt.prototype.filterUniqueShapes=function(){var t,e,s,i,a=this.shapes.length,r=this.stylesList.length,n=[],h=!1;for(s=0;s<r;s+=1){for(i=this.stylesList[s],h=!1,t=n.length=0;t<a;t+=1)-1!==(e=this.shapes[t]).styles.indexOf(i)&&(n.push(e),h=e._isAnimated||h);1<n.length&&h&&this.setShapesAsAnimated(n)}},jt.prototype.setShapesAsAnimated=function(t){var e,s=t.length;for(e=0;e<s;e+=1)t[e].setAsAnimated()},jt.prototype.createStyleElement=function(t,e){var s,i=new SVGStyleData(t,e),a=i.pElem;if("st"===t.ty)s=new SVGStrokeStyleData(this,t,i);else if("fl"===t.ty)s=new SVGFillStyleData(this,t,i);else if("gf"===t.ty||"gs"===t.ty){s=new("gf"===t.ty?SVGGradientFillStyleData:SVGGradientStrokeStyleData)(this,t,i),this.globalData.defs.appendChild(s.gf),s.maskId&&(this.globalData.defs.appendChild(s.ms),this.globalData.defs.appendChild(s.of),a.setAttribute("mask","url("+D+"#"+s.maskId+")"))}return"st"!==t.ty&&"gs"!==t.ty||(a.setAttribute("stroke-linecap",this.lcEnum[t.lc]||"round"),a.setAttribute("stroke-linejoin",this.ljEnum[t.lj]||"round"),a.setAttribute("fill-opacity","0"),1===t.lj&&a.setAttribute("stroke-miterlimit",t.ml)),2===t.r&&a.setAttribute("fill-rule","evenodd"),t.ln&&a.setAttribute("id",t.ln),t.cl&&a.setAttribute("class",t.cl),this.stylesList.push(i),this.addToAnimatedContents(t,s),s},jt.prototype.createGroupElement=function(t){var e=new Ft;return t.ln&&e.gr.setAttribute("id",t.ln),t.cl&&e.gr.setAttribute("class",t.cl),e},jt.prototype.createTransformElement=function(t,e){var s=M.getTransformProperty(this,t,this),i=new SVGTransformData(s,s.o,e);return this.addToAnimatedContents(t,i),i},jt.prototype.createShapeElement=function(t,e,s){var i=4;"rc"===t.ty?i=5:"el"===t.ty?i=6:"sr"===t.ty&&(i=7);var a=new Mt(e,s,L.getShapeProp(this,t,i,this));return this.shapes.push(a),this.addShapeToModifiers(a),this.addToAnimatedContents(t,a),a},jt.prototype.addToAnimatedContents=function(t,e){for(var s=0,i=this.animatedContents.length;s<i;){if(this.animatedContents[s].element===e)return;s+=1}this.animatedContents.push({fn:SVGElementsRenderer.createRenderFunction(t),element:e,data:t})},jt.prototype.setElementStyles=function(t){var e,s=t.styles,i=this.stylesList.length;for(e=0;e<i;e+=1)this.stylesList[e].closed||s.push(this.stylesList[e])},jt.prototype.reloadShapes=function(){this._isFirstFrame=!0;var t,e=this.itemsData.length;for(t=0;t<e;t+=1)this.prevViewData[t]=this.itemsData[t];for(this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes(),e=this.dynamicProperties.length,t=0;t<e;t+=1)this.dynamicProperties[t].getValue();this.renderModifiers()},jt.prototype.searchShapes=function(t,e,s,i,a,r,n){var h,o,l,p,f,m,d=[].concat(r),c=t.length-1,u=[],g=[];for(h=c;0<=h;h-=1){if((m=this.searchProcessedElement(t[h]))?e[h]=s[m-1]:t[h]._render=n,"fl"==t[h].ty||"st"==t[h].ty||"gf"==t[h].ty||"gs"==t[h].ty)m?e[h].style.closed=!1:e[h]=this.createStyleElement(t[h],a),t[h]._render&&i.appendChild(e[h].style.pElem),u.push(e[h].style);else if("gr"==t[h].ty){if(m)for(l=e[h].it.length,o=0;o<l;o+=1)e[h].prevViewData[o]=e[h].it[o];else e[h]=this.createGroupElement(t[h]);this.searchShapes(t[h].it,e[h].it,e[h].prevViewData,e[h].gr,a+1,d,n),t[h]._render&&i.appendChild(e[h].gr)}else"tr"==t[h].ty?(m||(e[h]=this.createTransformElement(t[h],i)),p=e[h].transform,d.push(p)):"sh"==t[h].ty||"rc"==t[h].ty||"el"==t[h].ty||"sr"==t[h].ty?(m||(e[h]=this.createShapeElement(t[h],d,a)),this.setElementStyles(e[h])):"tm"==t[h].ty||"rd"==t[h].ty||"ms"==t[h].ty?(m?(f=e[h]).closed=!1:((f=N.getModifier(t[h].ty)).init(this,t[h]),e[h]=f,this.shapeModifiers.push(f)),g.push(f)):"rp"==t[h].ty&&(m?(f=e[h]).closed=!0:(f=N.getModifier(t[h].ty),(e[h]=f).init(this,t,h,e),this.shapeModifiers.push(f),n=!1),g.push(f));this.addProcessedElement(t[h],h+1)}for(c=u.length,h=0;h<c;h+=1)u[h].closed=!0;for(c=g.length,h=0;h<c;h+=1)g[h].closed=!0},jt.prototype.renderInnerContent=function(){this.renderModifiers();var t,e=this.stylesList.length;for(t=0;t<e;t+=1)this.stylesList[t].reset();for(this.renderShape(),t=0;t<e;t+=1)(this.stylesList[t]._mdf||this._isFirstFrame)&&(this.stylesList[t].msElem&&(this.stylesList[t].msElem.setAttribute("d",this.stylesList[t].d),this.stylesList[t].d="M0 0"+this.stylesList[t].d),this.stylesList[t].pElem.setAttribute("d",this.stylesList[t].d||"M0 0"))},jt.prototype.renderShape=function(){var t,e,s=this.animatedContents.length;for(t=0;t<s;t+=1)e=this.animatedContents[t],(this._isFirstFrame||e.element._isAnimated)&&!0!==e.data&&e.fn(e.data,e.element,this._isFirstFrame)},jt.prototype.destroy=function(){this.destroyBaseElement(),this.shapesData=null,this.itemsData=null},Wt.prototype.duplicate=function(){var t=2*this._length,e=this.savedOp;this.savedOp=B("float32",t),this.savedOp.set(e);var s=0;for(s=this._length;s<t;s+=1)this.saved[s]=B("float32",16);this._length=t},Wt.prototype.reset=function(){this.cArrPos=0,this.cTr.reset(),this.cO=1},(Yt.prototype={createElements:function(){},initRendererElement:function(){},createContainerElements:function(){this.canvasContext=this.globalData.canvasContext,this.renderableEffectsManager=new Ut(this)},createContent:function(){},setBlendMode:function(){var t=this.globalData;if(t.blendMode!==this.data.bm){t.blendMode=this.data.bm;var e=this.getBlendMode();t.canvasContext.globalCompositeOperation=e}},createRenderableComponents:function(){this.maskManager=new Ht(this.data,this)},hideElement:function(){this.hidden||this.isInRange&&!this.isTransparent||(this.hidden=!0)},showElement:function(){this.isInRange&&!this.isTransparent&&(this.hidden=!1,this._isFirstFrame=!0,this.maskManager._isFirstFrame=!0)},renderFrame:function(){this.hidden||this.data.hd||(this.renderTransform(),this.renderRenderable(),this.setBlendMode(),this.globalData.renderer.save(),this.globalData.renderer.ctxTransform(this.finalTransform.mat.props),this.globalData.renderer.ctxOpacity(this.finalTransform.mProp.o.v),this.renderInnerContent(),this.globalData.renderer.restore(),this.maskManager.hasMasks&&this.globalData.renderer.restore(!0),this._isFirstFrame&&(this._isFirstFrame=!1))},destroy:function(){this.canvasContext=null,this.data=null,this.globalData=null,this.maskManager.destroy()},mHelper:new b}).hide=Yt.prototype.hideElement,Yt.prototype.show=Yt.prototype.showElement,_([Lt,St,Yt,xt,Pt,Tt],Gt),Gt.prototype.initElement=jt.prototype.initElement,Gt.prototype.prepareFrame=qt.prototype.prepareFrame,Gt.prototype.createContent=function(){if(this.img.width&&(this.assetData.w!==this.img.width||this.assetData.h!==this.img.height)){var t=g("canvas");t.width=this.assetData.w,t.height=this.assetData.h;var e,s,i=t.getContext("2d"),a=this.img.width,r=this.img.height,n=a/r,h=this.assetData.w/this.assetData.h,o=this.assetData.pr||this.globalData.renderConfig.imagePreserveAspectRatio;h<n&&"xMidYMid slice"===o||n<h&&"xMidYMid slice"!==o?e=(s=r)*h:s=(e=a)/h,i.drawImage(this.img,(a-e)/2,(r-s)/2,e,s,0,0,this.assetData.w,this.assetData.h),this.img=t}},Gt.prototype.renderInnerContent=function(t){this.failed||this.canvasContext.drawImage(this.img,0,0)},Gt.prototype.destroy=function(){this.img=null},_([Dt,Ot,Yt],Xt),Xt.prototype.renderInnerContent=function(){var t;for(t=this.layers.length-1;0<=t;t-=1)(this.completeLayers||this.elements[t])&&this.elements[t].renderFrame()},Xt.prototype.destroy=function(){var t;for(t=this.layers.length-1;0<=t;t-=1)this.elements[t]&&this.elements[t].destroy();this.layers=null,this.elements=null},Ht.prototype.renderFrame=function(){if(this.hasMasks){var t,e,s,i,a=this.element.finalTransform.mat,r=this.element.canvasContext,n=this.masksProperties.length;for(r.beginPath(),t=0;t<n;t++)if("n"!==this.masksProperties[t].mode){this.masksProperties[t].inv&&(r.moveTo(0,0),r.lineTo(this.element.globalData.compSize.w,0),r.lineTo(this.element.globalData.compSize.w,this.element.globalData.compSize.h),r.lineTo(0,this.element.globalData.compSize.h),r.lineTo(0,0)),i=this.viewData[t].v,e=a.applyToPointArray(i.v[0][0],i.v[0][1],0),r.moveTo(e[0],e[1]);var h,o=i._length;for(h=1;h<o;h++)s=a.applyToTriplePoints(i.o[h-1],i.i[h],i.v[h]),r.bezierCurveTo(s[0],s[1],s[2],s[3],s[4],s[5]);s=a.applyToTriplePoints(i.o[h-1],i.i[0],i.v[0]),r.bezierCurveTo(s[0],s[1],s[2],s[3],s[4],s[5])}this.element.globalData.renderer.save(!0),r.clip()}},Ht.prototype.getMaskProperty=Ct.prototype.getMaskProperty,Ht.prototype.destroy=function(){this.element=null},_([Lt,St,Yt,Rt,xt,Pt,Tt],Jt),Jt.prototype.initElement=At.prototype.initElement,Jt.prototype.transformHelper={opacity:1,_opMdf:!1},Jt.prototype.dashResetter=[],Jt.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,!0,[])},Jt.prototype.createStyleElement=function(t,e){var s={data:t,type:t.ty,preTransforms:this.transformsManager.addTransformSequence(e),transforms:[],elements:[],closed:!0===t.hd},i={};if("fl"==t.ty||"st"==t.ty?(i.c=w.getProp(this,t.c,1,255,this),i.c.k||(s.co="rgb("+f(i.c.v[0])+","+f(i.c.v[1])+","+f(i.c.v[2])+")")):"gf"!==t.ty&&"gs"!==t.ty||(i.s=w.getProp(this,t.s,1,null,this),i.e=w.getProp(this,t.e,1,null,this),i.h=w.getProp(this,t.h||{k:0},0,.01,this),i.a=w.getProp(this,t.a||{k:0},0,q,this),i.g=new G(this,t.g,this)),i.o=w.getProp(this,t.o,0,.01,this),"st"==t.ty||"gs"==t.ty){if(s.lc=this.lcEnum[t.lc]||"round",s.lj=this.ljEnum[t.lj]||"round",1==t.lj&&(s.ml=t.ml),i.w=w.getProp(this,t.w,0,null,this),i.w.k||(s.wi=i.w.v),t.d){var a=new Y(this,t.d,"canvas");i.d=a,i.d.k||(s.da=i.d.dashArray,s.do=i.d.dashoffset[0])}}else s.r=2===t.r?"evenodd":"nonzero";return this.stylesList.push(s),i.style=s,i},Jt.prototype.createGroupElement=function(t){return{it:[],prevViewData:[]}},Jt.prototype.createTransformElement=function(t){return{transform:{opacity:1,_opMdf:!1,key:this.transformsManager.getNewKey(),op:w.getProp(this,t.o,0,.01,this),mProps:M.getTransformProperty(this,t,this)}}},Jt.prototype.createShapeElement=function(t){var e=new Et(this,t,this.stylesList,this.transformsManager);return this.shapes.push(e),this.addShapeToModifiers(e),e},Jt.prototype.reloadShapes=function(){this._isFirstFrame=!0;var t,e=this.itemsData.length;for(t=0;t<e;t+=1)this.prevViewData[t]=this.itemsData[t];for(this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,!0,[]),e=this.dynamicProperties.length,t=0;t<e;t+=1)this.dynamicProperties[t].getValue();this.renderModifiers(),this.transformsManager.processSequences(this._isFirstFrame)},Jt.prototype.addTransformToStyleList=function(t){var e,s=this.stylesList.length;for(e=0;e<s;e+=1)this.stylesList[e].closed||this.stylesList[e].transforms.push(t)},Jt.prototype.removeTransformFromStyleList=function(){var t,e=this.stylesList.length;for(t=0;t<e;t+=1)this.stylesList[t].closed||this.stylesList[t].transforms.pop()},Jt.prototype.closeStyles=function(t){var e,s=t.length;for(e=0;e<s;e+=1)t[e].closed=!0},Jt.prototype.searchShapes=function(t,e,s,i,a){var r,n,h,o,l,p,f=t.length-1,m=[],d=[],c=[].concat(a);for(r=f;0<=r;r-=1){if((o=this.searchProcessedElement(t[r]))?e[r]=s[o-1]:t[r]._shouldRender=i,"fl"==t[r].ty||"st"==t[r].ty||"gf"==t[r].ty||"gs"==t[r].ty)o?e[r].style.closed=!1:e[r]=this.createStyleElement(t[r],c),m.push(e[r].style);else if("gr"==t[r].ty){if(o)for(h=e[r].it.length,n=0;n<h;n+=1)e[r].prevViewData[n]=e[r].it[n];else e[r]=this.createGroupElement(t[r]);this.searchShapes(t[r].it,e[r].it,e[r].prevViewData,i,c)}else"tr"==t[r].ty?(o||(p=this.createTransformElement(t[r]),e[r]=p),c.push(e[r]),this.addTransformToStyleList(e[r])):"sh"==t[r].ty||"rc"==t[r].ty||"el"==t[r].ty||"sr"==t[r].ty?o||(e[r]=this.createShapeElement(t[r])):"tm"==t[r].ty||"rd"==t[r].ty?(o?(l=e[r]).closed=!1:((l=N.getModifier(t[r].ty)).init(this,t[r]),e[r]=l,this.shapeModifiers.push(l)),d.push(l)):"rp"==t[r].ty&&(o?(l=e[r]).closed=!0:(l=N.getModifier(t[r].ty),(e[r]=l).init(this,t,r,e),this.shapeModifiers.push(l),i=!1),d.push(l));this.addProcessedElement(t[r],r+1)}for(this.removeTransformFromStyleList(),this.closeStyles(m),f=d.length,r=0;r<f;r+=1)d[r].closed=!0},Jt.prototype.renderInnerContent=function(){this.transformHelper.opacity=1,this.transformHelper._opMdf=!1,this.renderModifiers(),this.transformsManager.processSequences(this._isFirstFrame),this.renderShape(this.transformHelper,this.shapesData,this.itemsData,!0)},Jt.prototype.renderShapeTransform=function(t,e){(t._opMdf||e.op._mdf||this._isFirstFrame)&&(e.opacity=t.opacity,e.opacity*=e.op.v,e._opMdf=!0)},Jt.prototype.drawLayer=function(){var t,e,s,i,a,r,n,h,o,l=this.stylesList.length,p=this.globalData.renderer,f=this.globalData.canvasContext;for(t=0;t<l;t+=1)if(("st"!==(h=(o=this.stylesList[t]).type)&&"gs"!==h||0!==o.wi)&&o.data._shouldRender&&0!==o.coOp&&0!==this.globalData.currentGlobalAlpha){for(p.save(),r=o.elements,"st"===h||"gs"===h?(f.strokeStyle="st"===h?o.co:o.grd,f.lineWidth=o.wi,f.lineCap=o.lc,f.lineJoin=o.lj,f.miterLimit=o.ml||0):f.fillStyle="fl"===h?o.co:o.grd,p.ctxOpacity(o.coOp),"st"!==h&&"gs"!==h&&f.beginPath(),p.ctxTransform(o.preTransforms.finalTransform.props),s=r.length,e=0;e<s;e+=1){for("st"!==h&&"gs"!==h||(f.beginPath(),o.da&&(f.setLineDash(o.da),f.lineDashOffset=o.do)),a=(n=r[e].trNodes).length,i=0;i<a;i+=1)"m"==n[i].t?f.moveTo(n[i].p[0],n[i].p[1]):"c"==n[i].t?f.bezierCurveTo(n[i].pts[0],n[i].pts[1],n[i].pts[2],n[i].pts[3],n[i].pts[4],n[i].pts[5]):f.closePath();"st"!==h&&"gs"!==h||(f.stroke(),o.da&&f.setLineDash(this.dashResetter))}"st"!==h&&"gs"!==h&&f.fill(o.r),p.restore()}},Jt.prototype.renderShape=function(t,e,s,i){var a,r;for(r=t,a=e.length-1;0<=a;a-=1)"tr"==e[a].ty?(r=s[a].transform,this.renderShapeTransform(t,r)):"sh"==e[a].ty||"el"==e[a].ty||"rc"==e[a].ty||"sr"==e[a].ty?this.renderPath(e[a],s[a]):"fl"==e[a].ty?this.renderFill(e[a],s[a],r):"st"==e[a].ty?this.renderStroke(e[a],s[a],r):"gf"==e[a].ty||"gs"==e[a].ty?this.renderGradientFill(e[a],s[a],r):"gr"==e[a].ty?this.renderShape(r,e[a].it,s[a].it):e[a].ty;i&&this.drawLayer()},Jt.prototype.renderStyledShape=function(t,e){if(this._isFirstFrame||e._mdf||t.transforms._mdf){var s,i,a,r=t.trNodes,n=e.paths,h=n._length;r.length=0;var o=t.transforms.finalTransform;for(a=0;a<h;a+=1){var l=n.shapes[a];if(l&&l.v){for(i=l._length,s=1;s<i;s+=1)1===s&&r.push({t:"m",p:o.applyToPointArray(l.v[0][0],l.v[0][1],0)}),r.push({t:"c",pts:o.applyToTriplePoints(l.o[s-1],l.i[s],l.v[s])});1===i&&r.push({t:"m",p:o.applyToPointArray(l.v[0][0],l.v[0][1],0)}),l.c&&i&&(r.push({t:"c",pts:o.applyToTriplePoints(l.o[s-1],l.i[0],l.v[0])}),r.push({t:"z"}))}}t.trNodes=r}},Jt.prototype.renderPath=function(t,e){if(!0!==t.hd&&t._shouldRender){var s,i=e.styledShapes.length;for(s=0;s<i;s+=1)this.renderStyledShape(e.styledShapes[s],e.sh)}},Jt.prototype.renderFill=function(t,e,s){var i=e.style;(e.c._mdf||this._isFirstFrame)&&(i.co="rgb("+f(e.c.v[0])+","+f(e.c.v[1])+","+f(e.c.v[2])+")"),(e.o._mdf||s._opMdf||this._isFirstFrame)&&(i.coOp=e.o.v*s.opacity)},Jt.prototype.renderGradientFill=function(t,e,s){var i=e.style;if(!i.grd||e.g._mdf||e.s._mdf||e.e._mdf||1!==t.t&&(e.h._mdf||e.a._mdf)){var a=this.globalData.canvasContext,r=e.s.v,n=e.e.v;if(1===t.t)m=a.createLinearGradient(r[0],r[1],n[0],n[1]);else var h=Math.sqrt(Math.pow(r[0]-n[0],2)+Math.pow(r[1]-n[1],2)),o=Math.atan2(n[1]-r[1],n[0]-r[0]),l=h*(1<=e.h.v?.99:e.h.v<=-1?-.99:e.h.v),p=Math.cos(o+e.a.v)*l+r[0],f=Math.sin(o+e.a.v)*l+r[1],m=a.createRadialGradient(p,f,0,r[0],r[1],h);var d,c=t.g.p,u=e.g.c,g=1;for(d=0;d<c;d+=1)e.g._hasOpacity&&e.g._collapsable&&(g=e.g.o[2*d+1]),m.addColorStop(u[4*d]/100,"rgba("+u[4*d+1]+","+u[4*d+2]+","+u[4*d+3]+","+g+")");i.grd=m}i.coOp=e.o.v*s.opacity},Jt.prototype.renderStroke=function(t,e,s){var i=e.style,a=e.d;a&&(a._mdf||this._isFirstFrame)&&(i.da=a.dashArray,i.do=a.dashoffset[0]),(e.c._mdf||this._isFirstFrame)&&(i.co="rgb("+f(e.c.v[0])+","+f(e.c.v[1])+","+f(e.c.v[2])+")"),(e.o._mdf||s._opMdf||this._isFirstFrame)&&(i.coOp=e.o.v*s.opacity),(e.w._mdf||this._isFirstFrame)&&(i.wi=e.w.v)},Jt.prototype.destroy=function(){this.shapesData=null,this.globalData=null,this.canvasContext=null,this.stylesList.length=0,this.itemsData.length=0},_([Lt,St,Yt,xt,Pt,Tt],Kt),Kt.prototype.initElement=jt.prototype.initElement,Kt.prototype.prepareFrame=qt.prototype.prepareFrame,Kt.prototype.renderInnerContent=function(){var t=this.canvasContext;t.fillStyle=this.data.sc,t.fillRect(0,0,this.data.sw,this.data.sh)},_([Lt,St,Yt,xt,Pt,Tt,Vt],Zt),Zt.prototype.tHelper=g("canvas").getContext("2d"),Zt.prototype.buildNewText=function(){var t=this.textProperty.currentData;this.renderedLetters=S(t.l?t.l.length:0);var e=!1;t.fc?(e=!0,this.values.fill=this.buildColor(t.fc)):this.values.fill="rgba(0,0,0,0)",this.fill=e;var s=!1;t.sc&&(s=!0,this.values.stroke=this.buildColor(t.sc),this.values.sWidth=t.sw);var i,a,r=this.globalData.fontManager.getFontByName(t.f),n=t.l,h=this.mHelper;this.stroke=s,this.values.fValue=t.finalSize+"px "+this.globalData.fontManager.getFontByName(t.f).fFamily,a=t.finalText.length;var o,l,p,f,m,d,c,u,g,y,v=this.data.singleShape,b=t.tr/1e3*t.finalSize,_=0,k=0,D=!0,C=0;for(i=0;i<a;i+=1){for(l=(o=this.globalData.fontManager.getCharData(t.finalText[i],r.fStyle,this.globalData.fontManager.getFontByName(t.f).fFamily))&&o.data||{},h.reset(),v&&n[i].n&&(_=-b,k+=t.yOffset,k+=D?1:0,D=!1),c=(m=l.shapes?l.shapes[0].it:[]).length,h.scale(t.finalSize/100,t.finalSize/100),v&&this.applyTextPropertiesToMatrix(t,h,n[i].line,_,k),g=S(c),d=0;d<c;d+=1){for(f=m[d].ks.k.i.length,u=m[d].ks.k,y=[],p=1;p<f;p+=1)1==p&&y.push(h.applyToX(u.v[0][0],u.v[0][1],0),h.applyToY(u.v[0][0],u.v[0][1],0)),y.push(h.applyToX(u.o[p-1][0],u.o[p-1][1],0),h.applyToY(u.o[p-1][0],u.o[p-1][1],0),h.applyToX(u.i[p][0],u.i[p][1],0),h.applyToY(u.i[p][0],u.i[p][1],0),h.applyToX(u.v[p][0],u.v[p][1],0),h.applyToY(u.v[p][0],u.v[p][1],0));y.push(h.applyToX(u.o[p-1][0],u.o[p-1][1],0),h.applyToY(u.o[p-1][0],u.o[p-1][1],0),h.applyToX(u.i[0][0],u.i[0][1],0),h.applyToY(u.i[0][0],u.i[0][1],0),h.applyToX(u.v[0][0],u.v[0][1],0),h.applyToY(u.v[0][0],u.v[0][1],0)),g[d]=y}v&&(_+=n[i].l,_+=b),this.textSpans[C]?this.textSpans[C].elem=g:this.textSpans[C]={elem:g},C+=1}},Zt.prototype.renderInnerContent=function(){var t,e,s,i,a,r,n=this.canvasContext;this.finalTransform.mat.props;n.font=this.values.fValue,n.lineCap="butt",n.lineJoin="miter",n.miterLimit=4,this.data.singleShape||this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag);var h,o=this.textAnimator.renderedLetters,l=this.textProperty.currentData.l;e=l.length;var p,f,m=null,d=null,c=null;for(t=0;t<e;t+=1)if(!l[t].n){if((h=o[t])&&(this.globalData.renderer.save(),this.globalData.renderer.ctxTransform(h.p),this.globalData.renderer.ctxOpacity(h.o)),this.fill){for(h&&h.fc?m!==h.fc&&(m=h.fc,n.fillStyle=h.fc):m!==this.values.fill&&(m=this.values.fill,n.fillStyle=this.values.fill),i=(p=this.textSpans[t].elem).length,this.globalData.canvasContext.beginPath(),s=0;s<i;s+=1)for(r=(f=p[s]).length,this.globalData.canvasContext.moveTo(f[0],f[1]),a=2;a<r;a+=6)this.globalData.canvasContext.bezierCurveTo(f[a],f[a+1],f[a+2],f[a+3],f[a+4],f[a+5]);this.globalData.canvasContext.closePath(),this.globalData.canvasContext.fill()}if(this.stroke){for(h&&h.sw?c!==h.sw&&(c=h.sw,n.lineWidth=h.sw):c!==this.values.sWidth&&(c=this.values.sWidth,n.lineWidth=this.values.sWidth),h&&h.sc?d!==h.sc&&(d=h.sc,n.strokeStyle=h.sc):d!==this.values.stroke&&(d=this.values.stroke,n.strokeStyle=this.values.stroke),i=(p=this.textSpans[t].elem).length,this.globalData.canvasContext.beginPath(),s=0;s<i;s+=1)for(r=(f=p[s]).length,this.globalData.canvasContext.moveTo(f[0],f[1]),a=2;a<r;a+=6)this.globalData.canvasContext.bezierCurveTo(f[a],f[a+1],f[a+2],f[a+3],f[a+4],f[a+5]);this.globalData.canvasContext.closePath(),this.globalData.canvasContext.stroke()}h&&this.globalData.renderer.restore()}},Ut.prototype.renderFrame=function(){};var Qt=function(){var t={},a=[],i=0,r=0,n=0,h=!0,o=!1;function s(t){for(var e=0,s=t.target;e<r;)a[e].animation===s&&(a.splice(e,1),e-=1,r-=1,s.isPaused||f()),e+=1}function l(t,e){if(!t)return null;for(var s=0;s<r;){if(a[s].elem==t&&null!==a[s].elem)return a[s].animation;s+=1}var i=new $t;return m(i,t),i.setData(t,e),i}function p(){n+=1,c()}function f(){n-=1}function m(t,e){t.addEventListener("destroy",s),t.addEventListener("_active",p),t.addEventListener("_idle",f),a.push({elem:e,animation:t}),r+=1}function d(t){var e,s=t-i;for(e=0;e<r;e+=1)a[e].animation.advanceTime(s);i=t,n&&!o?u.requestAnimationFrame(d):h=!0}function e(t){i=t,u.requestAnimationFrame(d)}function c(){!o&&n&&h&&(u.requestAnimationFrame(e),h=!1)}return t.registerAnimation=l,t.loadAnimation=function(t){var e=new $t;return m(e,null),e.setParams(t),e},t.setSpeed=function(t,e){var s;for(s=0;s<r;s+=1)a[s].animation.setSpeed(t,e)},t.setDirection=function(t,e){var s;for(s=0;s<r;s+=1)a[s].animation.setDirection(t,e)},t.play=function(t){var e;for(e=0;e<r;e+=1)a[e].animation.play(t)},t.pause=function(t){var e;for(e=0;e<r;e+=1)a[e].animation.pause(t)},t.stop=function(t){var e;for(e=0;e<r;e+=1)a[e].animation.stop(t)},t.togglePause=function(t){var e;for(e=0;e<r;e+=1)a[e].animation.togglePause(t)},t.searchAnimations=function(t,e,s){var i,a=[].concat([].slice.call(document.getElementsByClassName("lottie")),[].slice.call(document.getElementsByClassName("bodymovin"))),r=a.length;for(i=0;i<r;i+=1)s&&a[i].setAttribute("data-bm-type",s),l(a[i],t);if(e&&0===r){s||(s="svg");var n=document.getElementsByTagName("body")[0];n.innerHTML="";var h=g("div");h.style.width="100%",h.style.height="100%",h.setAttribute("data-bm-type",s),n.appendChild(h),l(h,t)}},t.resize=function(){var t;for(t=0;t<r;t+=1)a[t].animation.resize()},t.goToAndStop=function(t,e,s){var i;for(i=0;i<r;i+=1)a[i].animation.goToAndStop(t,e,s)},t.destroy=function(t){var e;for(e=r-1;0<=e;e-=1)a[e].animation.destroy(t)},t.freeze=function(){o=!0},t.unfreeze=function(){o=!1,c()},t.getRegisteredAnimations=function(){var t,e=a.length,s=[];for(t=0;t<e;t+=1)s.push(a[t].animation);return s},t}(),$t=function(){this._cbs=[],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.playCount=0,this.animationData={},this.assets=[],this.isPaused=!0,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=P(10),this.assetsPath="",this.timeCompleted=0,this.segmentPos=0,this.subframeEnabled=e,this.segments=[],this._idle=!0,this._completedLoop=!1,this.projectInterface={},this.imagePreloader=new K};function te(){}_([t],$t),$t.prototype.setParams=function(t){t.context&&(this.context=t.context),(t.wrapper||t.container)&&(this.wrapper=t.wrapper||t.container);var e=t.animType?t.animType:t.renderer?t.renderer:"svg";switch(e){case"canvas":this.renderer=new Dt(this,t.rendererSettings);break;case"svg":this.renderer=new kt(this,t.rendererSettings);break;default:this.renderer=new HybridRenderer(this,t.rendererSettings)}this.renderer.setProjectInterface(this.projectInterface),this.animType=e,""===t.loop||null===t.loop||(!1===t.loop?this.loop=!1:!0===t.loop?this.loop=!0:this.loop=parseInt(t.loop)),this.autoplay=!("autoplay"in t)||t.autoplay,this.name=t.name?t.name:"",this.autoloadSegments=!t.hasOwnProperty("autoloadSegments")||t.autoloadSegments,this.assetsPath=t.assetsPath,t.animationData?this.configAnimation(t.animationData):t.path&&("json"!=t.path.substr(-4)&&("/"!=t.path.substr(-1,1)&&(t.path+="/"),t.path+="data.json"),-1!=t.path.lastIndexOf("\\")?this.path=t.path.substr(0,t.path.lastIndexOf("\\")+1):this.path=t.path.substr(0,t.path.lastIndexOf("/")+1),this.fileName=t.path.substr(t.path.lastIndexOf("/")+1),this.fileName=this.fileName.substr(0,this.fileName.lastIndexOf(".json")),Q.load(t.path,this.configAnimation.bind(this),function(){this.trigger("data_failed")}.bind(this)))},$t.prototype.setData=function(t,e){var s={wrapper:t,animationData:e?"object"==typeof e?e:JSON.parse(e):null},i=t.attributes;s.path=i.getNamedItem("data-animation-path")?i.getNamedItem("data-animation-path").value:i.getNamedItem("data-bm-path")?i.getNamedItem("data-bm-path").value:i.getNamedItem("bm-path")?i.getNamedItem("bm-path").value:"",s.animType=i.getNamedItem("data-anim-type")?i.getNamedItem("data-anim-type").value:i.getNamedItem("data-bm-type")?i.getNamedItem("data-bm-type").value:i.getNamedItem("bm-type")?i.getNamedItem("bm-type").value:i.getNamedItem("data-bm-renderer")?i.getNamedItem("data-bm-renderer").value:i.getNamedItem("bm-renderer")?i.getNamedItem("bm-renderer").value:"canvas";var a=i.getNamedItem("data-anim-loop")?i.getNamedItem("data-anim-loop").value:i.getNamedItem("data-bm-loop")?i.getNamedItem("data-bm-loop").value:i.getNamedItem("bm-loop")?i.getNamedItem("bm-loop").value:"";""===a||(s.loop="false"!==a&&("true"===a||parseInt(a)));var r=i.getNamedItem("data-anim-autoplay")?i.getNamedItem("data-anim-autoplay").value:i.getNamedItem("data-bm-autoplay")?i.getNamedItem("data-bm-autoplay").value:!i.getNamedItem("bm-autoplay")||i.getNamedItem("bm-autoplay").value;s.autoplay="false"!==r,s.name=i.getNamedItem("data-name")?i.getNamedItem("data-name").value:i.getNamedItem("data-bm-name")?i.getNamedItem("data-bm-name").value:i.getNamedItem("bm-name")?i.getNamedItem("bm-name").value:"","false"===(i.getNamedItem("data-anim-prerender")?i.getNamedItem("data-anim-prerender").value:i.getNamedItem("data-bm-prerender")?i.getNamedItem("data-bm-prerender").value:i.getNamedItem("bm-prerender")?i.getNamedItem("bm-prerender").value:"")&&(s.prerender=!1),this.setParams(s)},$t.prototype.includeLayers=function(t){t.op>this.animationData.op&&(this.animationData.op=t.op,this.totalFrames=Math.floor(t.op-this.animationData.ip));var e,s,i=this.animationData.layers,a=i.length,r=t.layers,n=r.length;for(s=0;s<n;s+=1)for(e=0;e<a;){if(i[e].id==r[s].id){i[e]=r[s];break}e+=1}if((t.chars||t.fonts)&&(this.renderer.globalData.fontManager.addChars(t.chars),this.renderer.globalData.fontManager.addFonts(t.fonts,this.renderer.globalData.defs)),t.assets)for(a=t.assets.length,e=0;e<a;e+=1)this.animationData.assets.push(t.assets[e]);this.animationData.__complete=!1,T.completeData(this.animationData,this.renderer.globalData.fontManager),this.renderer.includeLayers(t.layers),h&&h.initExpressions(this),this.loadNextSegment()},$t.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(!t||0===t.length||!this.autoloadSegments)return this.trigger("data_ready"),void(this.timeCompleted=this.totalFrames);var e=t.shift();this.timeCompleted=e.time*this.frameRate;var s=this.path+this.fileName+"_"+this.segmentPos+".json";this.segmentPos+=1,Q.load(s,this.includeLayers.bind(this),function(){this.trigger("data_failed")}.bind(this))},$t.prototype.loadSegments=function(){this.animationData.segments||(this.timeCompleted=this.totalFrames),this.loadNextSegment()},$t.prototype.imagesLoaded=function(){this.trigger("loaded_images"),this.checkLoaded()},$t.prototype.preloadImages=function(){this.imagePreloader.setAssetsPath(this.assetsPath),this.imagePreloader.setPath(this.path),this.imagePreloader.loadAssets(this.animationData.assets,this.imagesLoaded.bind(this))},$t.prototype.configAnimation=function(t){this.renderer&&(this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.renderer.configAnimation(t),t.assets||(t.assets=[]),this.renderer.searchExtraCompositions(t.assets),this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.firstFrame=Math.round(this.animationData.ip),this.frameMult=this.animationData.fr/1e3,this.trigger("config_ready"),this.preloadImages(),this.loadSegments(),this.updaFrameModifier(),this.waitForFontsLoaded())},$t.prototype.waitForFontsLoaded=function(){this.renderer&&(this.renderer.globalData.fontManager.loaded()?this.checkLoaded():setTimeout(this.waitForFontsLoaded.bind(this),20))},$t.prototype.checkLoaded=function(){this.isLoaded||!this.renderer.globalData.fontManager.loaded()||!this.imagePreloader.loaded()&&"canvas"===this.renderer.rendererType||(this.isLoaded=!0,T.completeData(this.animationData,this.renderer.globalData.fontManager),h&&h.initExpressions(this),this.renderer.initItems(),setTimeout(function(){this.trigger("DOMLoaded")}.bind(this),0),this.gotoFrame(),this.autoplay&&this.play())},$t.prototype.resize=function(){this.renderer.updateContainerSize()},$t.prototype.setSubframe=function(t){this.subframeEnabled=!!t},$t.prototype.gotoFrame=function(){this.currentFrame=this.subframeEnabled?this.currentRawFrame:~~this.currentRawFrame,this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this.renderFrame()},$t.prototype.renderFrame=function(){!1!==this.isLoaded&&this.renderer.renderFrame(this.currentFrame+this.firstFrame)},$t.prototype.play=function(t){t&&this.name!=t||!0===this.isPaused&&(this.isPaused=!1,this._idle&&(this._idle=!1,this.trigger("_active")))},$t.prototype.pause=function(t){t&&this.name!=t||!1===this.isPaused&&(this.isPaused=!0,this._idle=!0,this.trigger("_idle"))},$t.prototype.togglePause=function(t){t&&this.name!=t||(!0===this.isPaused?this.play():this.pause())},$t.prototype.stop=function(t){t&&this.name!=t||(this.pause(),this.playCount=0,this._completedLoop=!1,this.setCurrentRawFrameValue(0))},$t.prototype.goToAndStop=function(t,e,s){s&&this.name!=s||(e?this.setCurrentRawFrameValue(t):this.setCurrentRawFrameValue(t*this.frameModifier),this.pause())},$t.prototype.goToAndPlay=function(t,e,s){this.goToAndStop(t,e,s),this.play()},$t.prototype.advanceTime=function(t){if(!0!==this.isPaused&&!1!==this.isLoaded){var e=this.currentRawFrame+t*this.frameModifier,s=!1;e>=this.totalFrames-1&&0<this.frameModifier?this.loop&&this.playCount!==this.loop?e>=this.totalFrames?(this.playCount+=1,this.checkSegments(e%this.totalFrames)||(this.setCurrentRawFrameValue(e%this.totalFrames),this._completedLoop=!0,this.trigger("loopComplete"))):this.setCurrentRawFrameValue(e):this.checkSegments(e>this.totalFrames?e%this.totalFrames:0)||(s=!0,e=this.totalFrames-1):e<0?this.checkSegments(e%this.totalFrames)||(!this.loop||this.playCount--<=0&&!0!==this.loop?(s=!0,e=0):(this.setCurrentRawFrameValue(this.totalFrames+e%this.totalFrames),this._completedLoop?this.trigger("loopComplete"):this._completedLoop=!0)):this.setCurrentRawFrameValue(e),s&&(this.setCurrentRawFrameValue(e),this.pause(),this.trigger("complete"))}},$t.prototype.adjustSegment=function(t,e){this.playCount=0,t[1]<t[0]?(0<this.frameModifier&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(-1)),this.timeCompleted=this.totalFrames=t[0]-t[1],this.firstFrame=t[1],this.setCurrentRawFrameValue(this.totalFrames-.001-e)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.timeCompleted=this.totalFrames=t[1]-t[0],this.firstFrame=t[0],this.setCurrentRawFrameValue(.001+e)),this.trigger("segmentStart")},$t.prototype.setSegment=function(t,e){var s=-1;this.isPaused&&(this.currentRawFrame+this.firstFrame<t?s=t:this.currentRawFrame+this.firstFrame>e&&(s=e-t)),this.firstFrame=t,this.timeCompleted=this.totalFrames=e-t,-1!==s&&this.goToAndStop(s,!0)},$t.prototype.playSegments=function(t,e){if(e&&(this.segments.length=0),"object"==typeof t[0]){var s,i=t.length;for(s=0;s<i;s+=1)this.segments.push(t[s])}else this.segments.push(t);this.segments.length&&this.adjustSegment(this.segments.shift(),0),this.isPaused&&this.play()},$t.prototype.resetSegments=function(t){this.segments.length=0,this.segments.push([this.animationData.ip,this.animationData.op]),t&&this.checkSegments(0)},$t.prototype.checkSegments=function(t){return!!this.segments.length&&(this.adjustSegment(this.segments.shift(),t),!0)},$t.prototype.destroy=function(t){t&&this.name!=t||!this.renderer||(this.renderer.destroy(),this.imagePreloader.destroy(),this.trigger("destroy"),this._cbs=null,this.onEnterFrame=this.onLoopComplete=this.onComplete=this.onSegmentStart=this.onDestroy=null,this.renderer=null)},$t.prototype.setCurrentRawFrameValue=function(t){this.currentRawFrame=t,this.gotoFrame()},$t.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},$t.prototype.setDirection=function(t){this.playDirection=t<0?-1:1,this.updaFrameModifier()},$t.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},$t.prototype.getPath=function(){return this.path},$t.prototype.getAssetsPath=function(t){var e="";if(t.e)e=t.p;else if(this.assetsPath){var s=t.p;-1!==s.indexOf("images/")&&(s=s.split("/")[1]),e=this.assetsPath+s}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e},$t.prototype.getAssetData=function(t){for(var e=0,s=this.assets.length;e<s;){if(t==this.assets[e].id)return this.assets[e];e+=1}},$t.prototype.hide=function(){this.renderer.hide()},$t.prototype.show=function(){this.renderer.show()},$t.prototype.getDuration=function(t){return t?this.totalFrames:this.totalFrames/this.frameRate};var ee={};$t.prototype.trigger=function(t){if(this._cbs&&this._cbs[t])switch(t){case"enterFrame":this.triggerEvent(t,new r(t,this.currentFrame,this.totalFrames,this.frameMult));break;case"loopComplete":this.triggerEvent(t,new o(t,this.loop,this.playCount,this.frameMult));break;case"complete":this.triggerEvent(t,new n(t,this.frameMult));break;case"segmentStart":this.triggerEvent(t,new l(t,this.firstFrame,this.totalFrames));break;case"destroy":this.triggerEvent(t,new p(t,this));break;default:this.triggerEvent(t)}"enterFrame"===t&&this.onEnterFrame&&this.onEnterFrame.call(this,new r(t,this.currentFrame,this.totalFrames,this.frameMult)),"loopComplete"===t&&this.onLoopComplete&&this.onLoopComplete.call(this,new o(t,this.loop,this.playCount,this.frameMult)),"complete"===t&&this.onComplete&&this.onComplete.call(this,new n(t,this.frameMult)),"segmentStart"===t&&this.onSegmentStart&&this.onSegmentStart.call(this,new l(t,this.firstFrame,this.totalFrames)),"destroy"===t&&this.onDestroy&&this.onDestroy.call(this,new p(t,this))};function se(){!0===ie?Qt.searchAnimations(ae,ie,re):Qt.searchAnimations()}ee.play=Qt.play,ee.pause=Qt.pause,ee.setLocationHref=function(t){D=t},ee.togglePause=Qt.togglePause,ee.setSpeed=Qt.setSpeed,ee.setDirection=Qt.setDirection,ee.stop=Qt.stop,ee.searchAnimations=se,ee.registerAnimation=Qt.registerAnimation,ee.loadAnimation=function(t){return!0===ie&&(t.animationData=JSON.parse(ae)),Qt.loadAnimation(t)},ee.setSubframeRendering=function(t){e=t},ee.resize=Qt.resize,ee.goToAndStop=Qt.goToAndStop,ee.destroy=Qt.destroy,ee.setQuality=function(t){if("string"==typeof t)switch(t){case"high":x=200;break;case"medium":x=50;break;case"low":x=10}else!isNaN(t)&&1<t&&(x=t);a(!(50<=x))},ee.inBrowser=function(){return"undefined"!=typeof navigator},ee.installPlugin=function(t,e){"expressions"===t&&(h=e)},ee.freeze=Qt.freeze,ee.unfreeze=Qt.unfreeze,ee.getRegisteredAnimations=Qt.getRegisteredAnimations,ee.__getFactory=function(t){switch(t){case"propertyFactory":return w;case"shapePropertyFactory":return L;case"matrix":return b}},ee.version="5.4.2";var ie="__[STANDALONE]__",ae="__[ANIMATIONDATA]__",re="";if(ie){var ne=document.getElementsByTagName("script"),he=(ne[ne.length-1]||{src:""}).src.replace(/^[^\?]+\??/,"");re=function(t){for(var e=he.split("&"),s=0;s<e.length;s++){var i=e[s].split("=");if(decodeURIComponent(i[0])==t)return decodeURIComponent(i[1])}}("renderer")}var oe=setInterval(function(){"complete"===document.readyState&&(clearInterval(oe),se())},100);return ee},"function"==typeof define&&define.amd?define(function(){return e(t)}):"object"==typeof module&&module.exports?module.exports=e(t):(t.lottie=e(t),t.bodymovin=t.lottie));