(function (root, factory) { if(typeof define === "function" && define.amd) { define( factory); } else if(typeof module === "object" && module.exports) { module.exports = factory(); } else { root.bodymovin = factory(); } }(window, function() {function roundValues(t){bm_rnd=t?Math.round:function(t){return t}}function roundTo2Decimals(t){return Math.round(1e4*t)/1e4}function roundTo3Decimals(t){return Math.round(100*t)/100}function styleDiv(t){t.style.position="absolute",t.style.top=0,t.style.left=0,t.style.display="block",t.style.transformOrigin=t.style.webkitTransformOrigin="0 0",t.style.backfaceVisibility=t.style.webkitBackfaceVisibility="visible",t.style.transformStyle=t.style.webkitTransformStyle=t.style.mozTransformStyle="preserve-3d"}function styleUnselectableDiv(t){t.style.userSelect="none",t.style.MozUserSelect="none",t.style.webkitUserSelect="none",t.style.oUserSelect="none"}function BMEnterFrameEvent(t,e,s,i){this.type=t,this.currentTime=e,this.totalTime=s,this.direction=0>i?-1:1}function BMCompleteEvent(t,e){this.type=t,this.direction=0>e?-1:1}function BMCompleteLoopEvent(t,e,s,i){this.type=t,this.currentLoop=e,this.totalLoops=s,this.direction=0>i?-1:1}function BMSegmentStartEvent(t,e,s){this.type=t,this.firstFrame=e,this.totalFrames=s}function BMDestroyEvent(t,e){this.type=t,this.target=e}function _addEventListener(t,e){this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e)}function _removeEventListener(t,e){if(e){if(this._cbs[t]){for(var s=0,i=this._cbs[t].length;i>s;)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}function _triggerEvent(t,e){if(this._cbs[t])for(var s=this._cbs[t].length,i=0;s>i;i++)this._cbs[t][i](e)}function randomString(t,e){void 0===e&&(e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");var s,i="";for(s=t;s>0;--s)i+=e[Math.round(Math.random()*(e.length-1))];return i}function HSVtoRGB(t,e,s){var i,a,r,n,o,h,l,p;switch(1===arguments.length&&(e=t.s,s=t.v,t=t.h),n=Math.floor(6*t),o=6*t-n,h=s*(1-e),l=s*(1-o*e),p=s*(1-(1-o)*e),n%6){case 0:i=s,a=p,r=h;break;case 1:i=l,a=s,r=h;break;case 2:i=h,a=s,r=p;break;case 3:i=h,a=l,r=s;break;case 4:i=p,a=h,r=s;break;case 5:i=s,a=h,r=l}return[Math.round(255*i),Math.round(255*a),Math.round(255*r)]}function RGBtoHSV(t,e,s){1===arguments.length&&(e=t.g,s=t.b,t=t.r);var i,a=Math.max(t,e,s),r=Math.min(t,e,s),n=a-r,o=0===a?0:n/a,h=a/255;switch(a){case r:i=0;break;case t:i=e-s+n*(s>e?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,o,h]}function addSaturationToRGB(t,e){var s=RGBtoHSV(t[0],t[1],t[2]);return s[1]+=e,s[1]>1?s[1]=1:s[1]<=0&&(s[1]=0),HSVtoRGB(s[0],s[1],s[2])}function addBrightnessToRGB(t,e){var s=RGBtoHSV(t[0],t[1],t[2]);return s[2]+=e,s[2]>1?s[2]=1:s[2]<0&&(s[2]=0),HSVtoRGB(s[0],s[1],s[2])}function addHueToRGB(t,e){var s=RGBtoHSV(t[0],t[1],t[2]);return s[0]+=e/360,s[0]>1?s[0]-=1:s[0]<0&&(s[0]+=1),HSVtoRGB(s[0],s[1],s[2])}function componentToHex(t){var e=t.toString(16);return 1==e.length?"0"+e:e}function fillToRgba(t,e){if(!cachedColors[t]){var s=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);cachedColors[t]=parseInt(s[1],16)+","+parseInt(s[2],16)+","+parseInt(s[3],16)}return"rgba("+cachedColors[t]+","+e+")"}function RenderedFrame(t,e){this.tr=t,this.o=e}function LetterProps(t,e,s,i,a,r){this.o=t,this.sw=e,this.sc=s,this.fc=i,this.m=a,this.props=r}function iterateDynamicProperties(t){var e,s=this.dynamicProperties;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t)}function reversePath(t,e){var s,i,a=[],r=[],n=[],o={},h=0;e&&(a[0]=t.o[0],r[0]=t.i[0],n[0]=t.v[0],h=1),i=t.i.length;var l=i-1;for(s=h;i>s;s+=1)a.push(t.o[l]),r.push(t.i[l]),n.push(t.v[l]),l-=1;return o.i=a,o.o=r,o.v=n,o}function Matrix(){}function matrixManagerFunction(){var t=new Matrix,e=function(e,s,i,a,r){return t.reset().translate(a,r).rotate(e).scale(s,i).toCSS()},s=function(t){return e(t.tr.r[2],t.tr.s[0],t.tr.s[1],t.tr.p[0],t.tr.p[1])};return{getMatrix:s}}function createElement(t,e,s){if(!e){var i=Object.create(t.prototype,s),a={};return i&&"[object Function]"===a.toString.call(i.init)&&i.init(),i}e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.prototype.parent=t.prototype}function extendPrototype(t,e){for(var s in t.prototype)t.prototype.hasOwnProperty(s)&&(e.prototype[s]=t.prototype[s])}function bezFunction(){function t(t,e,s,i,a,r){var n=t*i+e*a+s*r-a*i-r*t-s*e;return n>-1e-4&&1e-4>n}function e(e,s,i,a,r,n,o,h,l){return t(e,s,a,r,o,h)&&t(e,i,a,n,o,l)}function s(t){this.segmentLength=0,this.points=new Array(t)}function i(t,e){this.partialLength=t,this.point=e}function a(t,e){var s=e.segments,i=s.length,a=bm_floor((i-1)*t),r=t*e.addedLength,n=0;if(r==s[a].l)return s[a].p;for(var o=s[a].l>r?-1:1,h=!0;h;)s[a].l<=r&&s[a+1].l>r?(n=(r-s[a].l)/(s[a+1].l-s[a].l),h=!1):a+=o,(0>a||a>=i-1)&&(h=!1);return s[a].p+(s[a+1].p-s[a].p)*n}function r(){this.pt1=new Array(2),this.pt2=new Array(2),this.pt3=new Array(2),this.pt4=new Array(2)}function n(t,e,s,i,n,o,h){var l=new r;n=0>n?0:n;var p=a(n,h);o=o>1?1:o;var m,f=a(o,h),d=t.length,c=1-p,u=1-f;for(m=0;d>m;m+=1)l.pt1[m]=c*c*c*t[m]+(p*c*c+c*p*c+c*c*p)*s[m]+(p*p*c+c*p*p+p*c*p)*i[m]+p*p*p*e[m],l.pt3[m]=c*c*u*t[m]+(p*c*u+c*p*u+c*c*f)*s[m]+(p*p*u+c*p*f+p*c*f)*i[m]+p*p*f*e[m],l.pt4[m]=c*u*u*t[m]+(p*u*u+c*f*u+c*u*f)*s[m]+(p*f*u+c*f*f+p*u*f)*i[m]+p*f*f*e[m],l.pt2[m]=u*u*u*t[m]+(f*u*u+u*f*u+u*u*f)*s[m]+(f*f*u+u*f*f+f*u*f)*i[m]+f*f*f*e[m];return l}var o=(Math,function(){function t(t,e){this.l=t,this.p=e}var e={};return function(s,i,a,r){var n=(s.join("_")+"_"+i.join("_")+"_"+a.join("_")+"_"+r.join("_")).replace(/\./g,"p");if(e[n])return e[n];var o,h,l,p,m,f,d=defaultCurveSegments,c=0,u=[],y=[],v={addedLength:0,segments:[]};for(l=a.length,o=0;d>o;o+=1){for(m=o/(d-1),f=0,h=0;l>h;h+=1)p=bm_pow(1-m,3)*s[h]+3*bm_pow(1-m,2)*m*a[h]+3*(1-m)*bm_pow(m,2)*r[h]+bm_pow(m,3)*i[h],u[h]=p,null!==y[h]&&(f+=bm_pow(u[h]-y[h],2)),y[h]=u[h];f&&(f=bm_sqrt(f),c+=f),v.segments.push(new t(c,m))}return v.addedLength=c,e[n]=v,v}}()),h=function(){var e={};return function(a){var r=a.s,n=a.e,o=a.to,h=a.ti,l=(r.join("_")+"_"+n.join("_")+"_"+o.join("_")+"_"+h.join("_")).replace(/\./g,"p");if(e[l])return void(a.bezierData=e[l]);var p,m,f,d,c,u,y,v=defaultCurveSegments,g=0,b=null;2===r.length&&(r[0]!=n[0]||r[1]!=n[1])&&t(r[0],r[1],n[0],n[1],r[0]+o[0],r[1]+o[1])&&t(r[0],r[1],n[0],n[1],n[0]+h[0],n[1]+h[1])&&(v=2);var E=new s(v);for(f=o.length,p=0;v>p;p+=1){for(y=new Array(f),c=p/(v-1),u=0,m=0;f>m;m+=1)d=bm_pow(1-c,3)*r[m]+3*bm_pow(1-c,2)*c*(r[m]+o[m])+3*(1-c)*bm_pow(c,2)*(n[m]+h[m])+bm_pow(c,3)*n[m],y[m]=d,null!==b&&(u+=bm_pow(y[m]-b[m],2));u=bm_sqrt(u),g+=u,E.points[p]=new i(u,y),b=y}E.segmentLength=g,a.bezierData=E,e[l]=E}}();return{getBezierLength:o,getNewSegment:n,buildBezierData:h,pointOnLine2D:t,pointOnLine3D:e}}function dataFunctionManager(){function t(a,n,o){var h,l,p,m,f,d,c,u,y=a.length;for(m=0;y>m;m+=1)if(h=a[m],"ks"in h&&!h.completed){if(h.completed=!0,h.tt&&(a[m-1].td=h.tt),l=[],p=-1,h.hasMask){var v=h.masksProperties;for(d=v.length,f=0;d>f;f+=1)if(v[f].pt.k.i)i(v[f].pt.k);else for(u=v[f].pt.k.length,c=0;u>c;c+=1)v[f].pt.k[c].s&&i(v[f].pt.k[c].s[0]),v[f].pt.k[c].e&&i(v[f].pt.k[c].e[0])}0===h.ty?(h.layers=e(h.refId,n),t(h.layers,n,o)):4===h.ty?s(h.shapes,!1):5==h.ty&&r(h,o)}}function e(t,e){for(var s=0,i=e.length;i>s;){if(e[s].id===t)return JSON.parse(JSON.stringify(e[s].layers));s+=1}}function s(t,e){var a,r,n,o=t.length,h=e?e:!1;for(a=o-1;a>=0;a-=1)if("tm"==t[a].ty&&(h=!0),"sh"==t[a].ty)if(t[a].trimmed=h,t[a].ks.k.i)i(t[a].ks.k);else for(n=t[a].ks.k.length,r=0;n>r;r+=1)t[a].ks.k[r].s&&i(t[a].ks.k[r].s[0]),t[a].ks.k[r].e&&i(t[a].ks.k[r].e[0]);else"gr"==t[a].ty?s(t[a].it,h):("el"==t[a].ty||"rc"==t[a].ty)&&(t[a].trimmed=h)}function i(t){var e,s=t.i.length;for(e=0;s>e;e+=1)t.i[e][0]+=t.v[e][0],t.i[e][1]+=t.v[e][1],t.o[e][0]+=t.v[e][0],t.o[e][1]+=t.v[e][1]}function a(e,s){t(e.layers,e.assets,s)}function r(t,e){var s,i,a,r,n,o,h,l=[],p=t.t.d,m=0,f=t.t.m.g,d=0,c=0,u=0,y=[],v=0,g=0,b=e.getFontByName(p.f),E=0,P=b.fStyle.split(" "),k="normal",S="normal";for(i=P.length,s=0;i>s;s+=1)"italic"===P[s].toLowerCase()?S="italic":"bold"===P[s].toLowerCase()?k="700":"black"===P[s].toLowerCase()?k="900":"medium"===P[s].toLowerCase()?k="500":"regular"===P[s].toLowerCase()||"normal"===P[s].toLowerCase()?k="400":("light"===P[s].toLowerCase()||"thin"===P[s].toLowerCase())&&(k="200");if(p.fWeight=k,p.fStyle=S,i=p.t.length,p.sz){var C=p.sz[0],x=-1;for(s=0;i>s;s+=1)a=!1," "===p.t.charAt(s)?x=s:13===p.t.charCodeAt(s)&&(v=0,a=!0),e.chars?(h=e.getCharData(p.t.charAt(s),b.fStyle,b.fFamily),E=a?0:h.w*p.s/100):E=e.measureText(p.t.charAt(s),p.f,p.s),v+E>C?(-1===x?(p.t=p.t.substr(0,s)+"\r"+p.t.substr(s),i+=1):(s=x,p.t=p.t.substr(0,s)+"\r"+p.t.substr(s+1)),x=-1,v=0):v+=E;i=p.t.length}for(v=0,E=0,s=0;i>s;s+=1)if(a=!1," "===p.t.charAt(s)?r=" ":13===p.t.charCodeAt(s)?(y.push(v),g=v>g?v:g,v=0,r="",a=!0,u+=1):r=p.t.charAt(s),e.chars?(h=e.getCharData(p.t.charAt(s),b.fStyle,e.getFontByName(p.f).fFamily),E=a?0:h.w*p.s/100):E=e.measureText(r,p.f,p.s),v+=E,l.push({l:E,an:E,add:d,n:a,anIndexes:[],val:r,line:u}),2==f){if(d+=E,""==r||" "==r||s==i-1){for((""==r||" "==r)&&(d-=E);s>=c;)l[c].an=d,l[c].ind=m,l[c].extra=E,c+=1;m+=1,d=0}}else if(3==f){if(d+=E,""==r||s==i-1){for(""==r&&(d-=E);s>=c;)l[c].an=d,l[c].ind=m,l[c].extra=E,c+=1;d=0,m+=1}}else l[m].ind=m,l[m].extra=0,m+=1;if(p.l=l,g=v>g?v:g,y.push(v),p.sz)p.boxWidth=p.sz[0],t.t.d.justifyOffset=0;else switch(p.boxWidth=g,p.j){case 1:t.t.d.justifyOffset=-p.boxWidth;break;case 2:t.t.d.justifyOffset=-p.boxWidth/2;break;default:t.t.d.justifyOffset=0}p.lineWidths=y;var w=t.t.a;o=w.length;var D,T,M=[];for(n=0;o>n;n+=1){for(w[n].a.sc&&(p.strokeColorAnim=!0),w[n].a.sw&&(p.strokeWidthAnim=!0),(w[n].a.fc||w[n].a.fh||w[n].a.fs||w[n].a.fb)&&(p.fillColorAnim=!0),T=0,D=w[n].s.b,s=0;i>s;s+=1)l[s].anIndexes[n]=T,(1==D&&""!=l[s].val||2==D&&""!=l[s].val&&" "!=l[s].val||3==D&&(l[s].n||" "==l[s].val||s==i-1)||4==D&&(l[s].n||s==i-1))&&(1===w[n].s.rn&&M.push(T),T+=1);t.t.a[n].s.totalChars=T;var I,F=-1;if(1===w[n].s.rn)for(s=0;i>s;s+=1)F!=l[s].anIndexes[n]&&(F=l[s].anIndexes[n],I=M.splice(Math.floor(Math.random()*M.length),1)[0]),l[s].anIndexes[n]=I}0!==o||"m"in t.t.p||(t.singleShape=!0),p.yOffset=1.2*p.s,p.ascent=b.ascent*p.s/100}var n={};return n.completeData=a,n}function ExpressionComp(){}function ShapeInterface(){}function LayerInterface(){}function SVGRenderer(t){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.globalData={frameNum:-1},this.elements=[],this.destroyed=!1}function CanvasRenderer(t,e){this.animationItem=t,this.renderConfig={clearCanvas:e&&e.clearCanvas||!0,context:e&&e.context||null,scaleMode:e&&e.scaleMode||"fit"},this.renderConfig.dpr=e&&e.dpr||1,this.animationItem.wrapper&&(this.renderConfig.dpr=e&&e.dpr||window.devicePixelRatio||1),this.renderedFrame=-1,this.globalData={frameNum:-1},this.contextData={saved:new Array(15),savedOp:new Array(15),cArrPos:0,cTr:new Matrix,cO:1};var s,i=15;for(s=0;i>s;s+=1)this.contextData.saved[s]=new Array(16);this.elements=[],this.transformMat=new Matrix}function HybridRenderer(t){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.globalData={frameNum:-1},this.elements=[],this.threeDElements=[],this.destroyed=!1,this.camera=null}function MaskElement(t,e,s){this.dynamicProperties=[],this.data=t,this.element=e,this.globalData=s,this.paths=[],this.storedData=[],this.masksProperties=this.data.masksProperties,this.viewData=new Array(this.masksProperties.length),this.maskElement=null,this.firstFrame=!0;var i,a,r,n,o,h,l,p,m=(this.element.maskedElement,this.globalData.defs),f=this.masksProperties.length,d=this.masksProperties,c=0,u=[],y=randomString(10),v="clipPath",g="clip-path";for(i=0;f>i;i++)if(("a"!==d[i].mode&&"n"!==d[i].mode||d[i].inv)&&(v="mask",g="mask"),"s"!=d[i].mode&&"i"!=d[i].mode||0!=c||(o=document.createElementNS(svgNS,"rect"),o.setAttribute("fill","#ffffff"),o.setAttribute("x","0"),o.setAttribute("y","0"),o.setAttribute("width","100%"),o.setAttribute("height","100%"),u.push(o)),"n"!=d[i].mode&&d[i].cl!==!1){if(c+=1,a=document.createElementNS(svgNS,"path"),d[i].cl?"s"==d[i].mode?a.setAttribute("fill","#000000"):a.setAttribute("fill","#ffffff"):(a.setAttribute("fill","none"),"s"==d[i].mode?a.setAttribute("fill","#000000"):a.setAttribute("fill","#ffffff"),a.setAttribute("stroke-width","1"),a.setAttribute("stroke-miterlimit","10")),a.setAttribute("clip-rule","nonzero"),0!==d[i].x.k){v="mask",g="mask",p=PropertyFactory.getProp(this.element,d[i].x,0,null,this.dynamicProperties);var b="fi_"+randomString(10);h=document.createElementNS(svgNS,"filter"),h.setAttribute("id",b),l=document.createElementNS(svgNS,"feMorphology"),l.setAttribute("operator","dilate"),l.setAttribute("in","SourceGraphic"),l.setAttribute("radius","0"),h.appendChild(l),m.appendChild(h),"s"==d[i].mode?a.setAttribute("stroke","#000000"):a.setAttribute("stroke","#ffffff")}else l=null,p=null;if(this.storedData[i]={elem:a,x:p,expan:l,lastPath:"",lastOperator:"",filterId:b,lastRadius:0},"i"==d[i].mode){n=u.length;var E=document.createElementNS(svgNS,"g");for(r=0;n>r;r+=1)E.appendChild(u[r]);var P=document.createElementNS(svgNS,"mask");P.setAttribute("mask-type","alpha"),P.setAttribute("id",y+"_"+c),P.appendChild(a),m.appendChild(P),E.setAttribute("mask","url(#"+y+"_"+c+")"),u.length=0,u.push(E)}else u.push(a);d[i].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[i]={elem:a,lastPath:"",prop:PropertyFactory.getShapeProp(this.element,d[i],3,this.dynamicProperties,null)},this.viewData[i].prop.k||this.drawPath(d[i],this.viewData[i].prop.v,this.viewData[i])}else this.viewData[i]={prop:PropertyFactory.getShapeProp(this.element,d[i],3,this.dynamicProperties,null)};for(this.maskElement=document.createElementNS(svgNS,v),f=u.length,i=0;f>i;i+=1)this.maskElement.appendChild(u[i]);this.maskElement.setAttribute("id",y),c>0&&this.element.maskedElement.setAttribute(g,"url(#"+y+")"),m.appendChild(this.maskElement)}function SliderEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,0,0,s)}function AngleEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,0,0,s)}function ColorEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,1,1/255,s)}function PointEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,1,0,s)}function CheckboxEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,1,0,s)}function EffectsManager(t,e,s){this.data=t,this.element=e;var i=t.ef;this.effectElements=[];var a,r,n=i.length;for(a=0;n>a;a++)switch(i[a].ty){case 0:r=new SliderEffect(i[a],e,s),this.effectElements.push(r.proxyFunction.bind(r));break;case 1:r=new AngleEffect(i[a],e,s),this.effectElements.push(r.proxyFunction.bind(r));break;case 2:r=new ColorEffect(i[a],e,s),this.effectElements.push(r.proxyFunction.bind(r));break;case 3:r=new PointEffect(i[a],e,s),this.effectElements.push(r.proxyFunction.bind(r));break;case 4:r=new CheckboxEffect(i[a],e,s),this.effectElements.push(r.proxyFunction.bind(r))}}function BaseElement(){}function SVGBaseElement(t,e,s,i,a){this.globalData=s,this.comp=i,this.data=t,this.matteElement=null,this.parentContainer=e,this.layerId=a?a.layerId:"ly_"+randomString(10),this.placeholder=a,this.init()}function ITextElement(t,e,s,i){}function SVGTextElement(t,e,s,i,a){this.textSpans=[],this.renderType="svg",this.parent.constructor.call(this,t,e,s,i,a)}function ICompElement(t,e,s,i,a){this.parent.constructor.call(this,t,e,s,i,a),this.layers=t.layers,this.isSvg=!0,this.data.tm&&(this.tm=PropertyFactory.getProp(this,this.data.tm,0,s.frameRate,this.dynamicProperties))}function IImageElement(t,e,s,i,a){this.assetData=s.getAssetData(t.refId),this.path=s.getPath(),this.parent.constructor.call(this,t,e,s,i,a)}function IShapeElement(t,e,s,i,a){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.viewData=[],this.shapesContainer=document.createElementNS(svgNS,"g"),this.parent.constructor.call(this,t,e,s,i,a)}function ISolidElement(t,e,s,i,a){this.parent.constructor.call(this,t,e,s,i,a)}function CVBaseElement(t,e,s){this.globalData=s,this.data=t,this.comp=e,this.canvasContext=s.canvasContext,this.init()}function CVCompElement(t,e,s){this.parent.constructor.call(this,t,e,s),this.layers=t.layers,this.data.tm&&(this.tm=PropertyFactory.getProp(this,this.data.tm,0,s.frameRate,this.dynamicProperties))}function CVImageElement(t,e,s){this.animationItem=s.renderer.animationItem,this.assetData=this.animationItem.getAssetData(t.refId),this.path=this.animationItem.getPath(),this.parent.constructor.call(this,t,e,s),this.animationItem.pendingElements+=1}function CVMaskElement(t,e,s){this.data=t,this.element=e,this.globalData=s,this.dynamicProperties=[],this.masksProperties=this.data.masksProperties,this.ctx=this.element.canvasContext,this.viewData=new Array(this.masksProperties.length);var i,a=this.masksProperties.length;for(i=0;a>i;i++)this.viewData[i]=PropertyFactory.getShapeProp(this.element,this.masksProperties[i],3,this.dynamicProperties,null)}function CVShapeElement(t,e,s){this.shapes=[],this.stylesList=[],this.viewData=[],this.shapesData=t.shapes,this.firstFrame=!0,this.parent.constructor.call(this,t,e,s)}function CVSolidElement(t,e,s){this.parent.constructor.call(this,t,e,s)}function CVTextElement(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.parent.constructor.call(this,t,e,s)}function HBaseElement(t,e,s,i,a){this.globalData=s,this.comp=i,this.data=t,this.matteElement=null,this.parentContainer=e,this.layerId=a?a.layerId:"ly_"+randomString(10),this.placeholder=a,this.init()}function HSolidElement(t,e,s,i,a){this.parent.constructor.call(this,t,e,s,i,a)}function HCompElement(t,e,s,i,a){this.parent.constructor.call(this,t,e,s,i,a),this.layers=t.layers,this.isSvg=!1,this.data.tm&&(this.tm=PropertyFactory.getProp(this,this.data.tm,0,s.frameRate,this.dynamicProperties)),this.data.hasMask&&(this.isSvg=!0)}function HShapeElement(t,e,s,i,a){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.viewData=[],this.parent.constructor.call(this,t,e,s,i,a)}function HTextElement(t,e,s,i,a){this.textSpans=[],this.textPaths=[],this.currentBBox={x:999999,y:-999999,h:0,w:0},this.renderType="svg",this.isMasked=!1,this.parent.constructor.call(this,t,e,s,i,a)}function HImageElement(t,e,s,i,a){this.assetData=s.getAssetData(t.refId),this.path=s.getPath(),this.parent.constructor.call(this,t,e,s,i,a)}function HCameraElement(t,e,s,i,a){if(this.parent.constructor.call(this,t,e,s,i,a),this.pe=PropertyFactory.getProp(this,t.pe,0,0,this.dynamicProperties),t.ks.p.s?(this.px=PropertyFactory.getProp(this,t.ks.p.x,1,0,this.dynamicProperties),this.py=PropertyFactory.getProp(this,t.ks.p.y,1,0,this.dynamicProperties),this.pz=PropertyFactory.getProp(this,t.ks.p.z,1,0,this.dynamicProperties)):this.p=PropertyFactory.getProp(this,t.ks.p,1,0,this.dynamicProperties),t.ks.a&&(this.a=PropertyFactory.getProp(this,t.ks.a,1,0,this.dynamicProperties)),t.ks.or.k.length){var r,n=t.ks.or.k.length;for(r=0;n>r;r+=1)t.ks.or.k[r].to=null,t.ks.or.k[r].ti=null}this.or=PropertyFactory.getProp(this,t.ks.or,1,degToRads,this.dynamicProperties),this.or.sh=!0,this.rx=PropertyFactory.getProp(this,t.ks.rx,0,degToRads,this.dynamicProperties),this.ry=PropertyFactory.getProp(this,t.ks.ry,0,degToRads,this.dynamicProperties),this.rz=PropertyFactory.getProp(this,t.ks.rz,0,degToRads,this.dynamicProperties),this.mat=new Matrix}var svgNS="http://www.w3.org/2000/svg",subframeEnabled=!0,isSafari=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),cachedColors={},bm_rounder=Math.round,bm_rnd,bm_pow=Math.pow,bm_sqrt=Math.sqrt,bm_abs=Math.abs,bm_floor=Math.floor,bm_max=Math.max,bm_min=Math.min,BMMath={pow:bm_pow,random:Math.random},defaultCurveSegments=75,degToRads=Math.PI/180;roundValues(!1);var rgbToHex=function(){var t,e,s=[];for(t=0;256>t;t+=1)e=t.toString(16),s[t]=1==e.length?"0"+e:e;return function(t,e,i){return 0>t&&(t=0),0>e&&(e=0),0>i&&(i=0),"#"+s[t]+s[e]+s[i]}}(),fillColorToString=function(){var t=[];return function(e,s){return void 0!==s&&(e[3]=s),t[e[0]]||(t[e[0]]={}),t[e[0]][e[1]]||(t[e[0]][e[1]]={}),t[e[0]][e[1]][e[2]]||(t[e[0]][e[1]][e[2]]={}),t[e[0]][e[1]][e[2]][e[3]]||(t[e[0]][e[1]][e[2]][e[3]]="rgba("+e.join(",")+")"),t[e[0]][e[1]][e[2]][e[3]]}}(),Matrix=function(){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=Math.cos(t),s=Math.sin(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=Math.cos(t),s=Math.sin(t);return this._t(1,0,0,0,0,e,-s,0,0,s,e,0,0,0,0,1)}function i(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,0,s,0,0,1,0,0,-s,0,e,0,0,0,0,1)}function a(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1)}function r(t,e){return this._t(1,e,t,1,0,0)}function n(t,e){return this.shear(Math.tan(t),Math.tan(e))}function o(t,e){var s=Math.cos(e),i=Math.sin(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,Math.tan(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 h(t,e,s){return s=isNaN(s)?1:s,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 l(t,e,s,i,a,r,n,o,h,l,p,m,f,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]=o,this.props[8]=h,this.props[9]=l,this.props[10]=p,this.props[11]=m,this.props[12]=f,this.props[13]=d,this.props[14]=c,this.props[15]=u,this}function p(t,e,s){return s=isNaN(s)?0:s,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 m(t,e,s,i,a,r,n,o,h,l,p,m,f,d,c,u){if(1===t&&0===e&&0===s&&0===i&&0===a&&1===r&&0===n&&0===o&&0===h&&0===l&&1===p&&0===m)return(0!==f||0!==d||0!==c)&&(this.props[12]=this.props[12]*t+this.props[13]*a+this.props[14]*h+this.props[15]*f,this.props[13]=this.props[12]*e+this.props[13]*r+this.props[14]*l+this.props[15]*d,this.props[14]=this.props[12]*s+this.props[13]*n+this.props[14]*p+this.props[15]*c,this.props[15]=this.props[12]*i+this.props[13]*o+this.props[14]*m+this.props[15]*u),this;var y=this.props[0],v=this.props[1],g=this.props[2],b=this.props[3],E=this.props[4],P=this.props[5],k=this.props[6],S=this.props[7],C=this.props[8],x=this.props[9],w=this.props[10],D=this.props[11],T=this.props[12],M=this.props[13],I=this.props[14],F=this.props[15];return this.props[0]=y*t+v*a+g*h+b*f,this.props[1]=y*e+v*r+g*l+b*d,this.props[2]=y*s+v*n+g*p+b*c,this.props[3]=y*i+v*o+g*m+b*u,this.props[4]=E*t+P*a+k*h+S*f,this.props[5]=E*e+P*r+k*l+S*d,this.props[6]=E*s+P*n+k*p+S*c,this.props[7]=E*i+P*o+k*m+S*u,this.props[8]=C*t+x*a+w*h+D*f,this.props[9]=C*e+x*r+w*l+D*d,this.props[10]=C*s+x*n+w*p+D*c,this.props[11]=C*i+x*o+w*m+D*u,this.props[12]=T*t+M*a+I*h+F*f,this.props[13]=T*e+M*r+I*l+F*d,this.props[14]=T*s+M*n+I*p+F*c,this.props[15]=T*i+M*o+I*m+F*u,this}function f(t){var e;for(e=0;16>e;e+=1)t.props[e]=this.props[e]}function d(t){var e;for(e=0;16>e;e+=1)this.props[e]=t[e]}function c(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 u(t,e,s){return t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12]}function y(t,e,s){return t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13]}function v(t,e,s){return t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]}function g(t,e,s){return[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 b(t,e){return bm_rnd(t*this.props[0]+e*this.props[4]+this.props[12])+","+bm_rnd(t*this.props[1]+e*this.props[5]+this.props[13])}function E(){return[this.props[0],this.props[1],this.props[2],this.props[3],this.props[4],this.props[5],this.props[6],this.props[7],this.props[8],this.props[9],this.props[10],this.props[11],this.props[12],this.props[13],this.props[14],this.props[15]]}function P(){return isSafari?"matrix3d("+roundTo2Decimals(this.props[0])+","+roundTo2Decimals(this.props[1])+","+roundTo2Decimals(this.props[2])+","+roundTo2Decimals(this.props[3])+","+roundTo2Decimals(this.props[4])+","+roundTo2Decimals(this.props[5])+","+roundTo2Decimals(this.props[6])+","+roundTo2Decimals(this.props[7])+","+roundTo2Decimals(this.props[8])+","+roundTo2Decimals(this.props[9])+","+roundTo2Decimals(this.props[10])+","+roundTo2Decimals(this.props[11])+","+roundTo2Decimals(this.props[12])+","+roundTo2Decimals(this.props[13])+","+roundTo2Decimals(this.props[14])+","+roundTo2Decimals(this.props[15])+")":(this.cssParts[1]=this.props.join(","),this.cssParts.join(""))}function k(){return"matrix("+this.props[0]+","+this.props[1]+","+this.props[4]+","+this.props[5]+","+this.props[12]+","+this.props[13]+")"}function S(){return""+this.toArray()}return function(){this.reset=t,this.rotate=e,this.rotateX=s,this.rotateY=i,this.rotateZ=a,this.skew=n,this.skewFromAxis=o,this.shear=r,this.scale=h,this.setTransform=l,this.translate=p,this.transform=m,this.applyToPoint=c,this.applyToX=u,this.applyToY=y,this.applyToZ=v,this.applyToPointArray=g,this.applyToPointStringified=b,this.toArray=E,this.toCSS=P,this.to2dCSS=k,this.toString=S,this.clone=f,this.cloneFromProps=d,this._t=this.transform,this.props=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],this.cssParts=["matrix3d(","",")"]}}();!function(t,e){function s(s,l,p){var d=[];l=1==l?{entropy:!0}:l||{};var g=n(r(l.entropy?[s,h(t)]:null==s?o():s,3),d),b=new i(d),E=function(){for(var t=b.g(f),e=u,s=0;y>t;)t=(t+s)*m,e*=m,s=b.g(1);for(;t>=v;)t/=2,e/=2,s>>>=1;return(t+s)/e};return E.int32=function(){return 0|b.g(4)},E.quick=function(){return b.g(4)/4294967296},E["double"]=E,n(h(b.S),t),(l.pass||p||function(t,s,i,r){return r&&(r.S&&a(r,b),t.state=function(){return a(b,{})}),i?(e[c]=t,s):t})(E,g,"global"in l?l.global:this==e,l.state)}function i(t){var e,s=t.length,i=this,a=0,r=i.i=i.j=0,n=i.S=[];for(s||(t=[s++]);m>a;)n[a]=a++;for(a=0;m>a;a++)n[a]=n[r=g&r+t[a%s]+(e=n[a])],n[r]=e;(i.g=function(t){for(var e,s=0,a=i.i,r=i.j,n=i.S;t--;)e=n[a=g&a+1],s=s*m+n[g&(n[a]=n[r=g&r+e])+(n[r]=e)];return i.i=a,i.j=r,s})(m)}function a(t,e){return e.i=t.i,e.j=t.j,e.S=t.S.slice(),e}function r(t,e){var s,i=[],a=typeof t;if(e&&"object"==a)for(s in t)try{i.push(r(t[s],e-1))}catch(n){}return i.length?i:"string"==a?t:t+"\x00"}function n(t,e){for(var s,i=t+"",a=0;a<i.length;)e[g&a]=g&(s^=19*e[g&a])+i.charCodeAt(a++);return h(e)}function o(){try{if(l)return h(l.randomBytes(m));var e=new Uint8Array(m);return(p.crypto||p.msCrypto).getRandomValues(e),h(e)}catch(s){var i=p.navigator,a=i&&i.plugins;return[+new Date,p,a,p.screen,h(t)]}}function h(t){return String.fromCharCode.apply(0,t)}var l,p=this,m=256,f=6,d=52,c="random",u=e.pow(m,f),y=e.pow(2,d),v=2*y,g=m-1;if(e["seed"+c]=s,n(e.random(),t),"object"==typeof module&&module.exports){module.exports=s;try{l=require("crypto")}catch(b){}}else"function"==typeof define&&define.amd&&define(function(){return s})}([],BMMath);var BezierFactory=function(){function t(t,e,s,i,a){var r=a||("bez_"+t+"_"+e+"_"+s+"_"+i).replace(/\./g,"p");if(p[r])return p[r];var n=new h([t,e,s,i]);return p[r]=n,n}function e(t,e){return 1-3*e+3*t}function s(t,e){return 3*e-6*t}function i(t){return 3*t}function a(t,a,r){return((e(a,r)*t+s(a,r))*t+i(a))*t}function r(t,a,r){return 3*e(a,r)*t*t+2*s(a,r)*t+i(a)}function n(t,e,s,i,r){var n,o,h=0;do o=e+(s-e)/2,n=a(o,i,r)-t,n>0?s=o:e=o;while(Math.abs(n)>d&&++h<c);return o}function o(t,e,s,i){for(var n=0;m>n;++n){var o=r(e,s,i);if(0===o)return e;var h=a(e,s,i)-t;e-=h/o}return e}function h(t){this._p=t,this._mSampleValues=v?new Float32Array(u):new Array(u),this._precomputed=!1,this.get=this.get.bind(this)}var l={};l.getBezierEasing=t;var p={},m=4,f=.001,d=1e-7,c=10,u=11,y=1/(u-1),v="function"==typeof Float32Array;return h.prototype={get:function(t){var e=this._p[0],s=this._p[1],i=this._p[2],r=this._p[3];return this._precomputed||this._precompute(),e===s&&i===r?t:0===t?0:1===t?1:a(this._getTForX(t),s,r)},_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;u>s;++s)this._mSampleValues[s]=a(s*y,t,e)},_getTForX:function(t){for(var e=this._p[0],s=this._p[2],i=this._mSampleValues,a=0,h=1,l=u-1;h!==l&&i[h]<=t;++h)a+=y;--h;var p=(t-i[h])/(i[h+1]-i[h]),m=a+p*y,d=r(m,e,s);return d>=f?o(t,m,e,s):0===d?m:n(t,a,a+y,e,s)}},l}(),MatrixManager=matrixManagerFunction;!function(){for(var t=0,e=["ms","moz","webkit","o"],s=0;s<e.length&&!window.requestAnimationFrame;++s)window.requestAnimationFrame=window[e[s]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[s]+"CancelAnimationFrame"]||window[e[s]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e,s){var i=(new Date).getTime(),a=Math.max(0,16-(i-t)),r=window.setTimeout(function(){e(i+a)},a);return t=i+a,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var bez=bezFunction(),dataManager=dataFunctionManager(),FontManager=function(){function t(t,e){var s=document.createElement("span");s.style.fontFamily=e;var i=document.createElement("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}}function e(){var t,s,i,a=this.fonts.length,r=a;for(t=0;a>t;t+=1)if(this.fonts[t].loaded)r-=1;else if("t"===this.fonts[t].fOrigin){if(window.Typekit&&window.Typekit.load&&0===this.typekitLoaded){this.typekitLoaded=1;try{Typekit.load({async:!0,active:function(){this.typekitLoaded=2}.bind(this)})}catch(n){}}2===this.typekitLoaded&&(this.fonts[t].loaded=!0)}else"n"===this.fonts[t].fOrigin?this.fonts[t].loaded=!0:(s=this.fonts[t].monoCase.node,i=this.fonts[t].monoCase.w,s.offsetWidth!==i?(r-=1,this.fonts[t].loaded=!0):(s=this.fonts[t].sansCase.node,i=this.fonts[t].sansCase.w,s.offsetWidth!==i&&(r-=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!==r&&Date.now()-this.initTime<h?setTimeout(e.bind(this),20):setTimeout(function(){this.loaded=!0}.bind(this),0)}function s(t,e){var s=document.createElementNS(svgNS,"text");return s.style.fontSize="100px",s.style.fontFamily=e.fFamily,s.textContent="1",e.fClass?(s.style.fontFamily="inherit",s.className=e.fClass):s.style.fontFamily=e.fFamily,t.appendChild(s),s}function i(i,a){if(!i)return void(this.loaded=!0);if(this.chars)return this.loaded=!0,void(this.fonts=i.list);var r,n=i.list,o=n.length;for(r=0;o>r;r+=1){if(n[r].loaded=!1,n[r].monoCase=t(n[r].fFamily,"monospace"),n[r].sansCase=t(n[r].fFamily,"sans-serif"),n[r].fPath){if("p"===n[r].fOrigin){var h=document.createElement("style");h.type="text/css",h.innerHTML="@font-face {font-family: "+n[r].fFamily+"; font-style: normal; src: url('"+n[r].fPath+"');}",a.appendChild(h)}else if("g"===n[r].fOrigin){var l=document.createElement("link");l.type="text/css",l.rel="stylesheet",l.href=n[r].fPath,a.appendChild(l)}else if("t"===n[r].fOrigin){var p=document.createElement("script");p.setAttribute("src",n[r].fPath),a.appendChild(p)}}else n[r].loaded=!0;n[r].helper=s(a,n[r]),this.fonts.push(n[r])}e.bind(this)()}function a(t){if(t){this.chars||(this.chars=[]);var e,s,i,a=t.length,r=this.chars.length;for(e=0;a>e;e+=1){for(s=0,i=!1;r>s;)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)}}}function r(t,e,s){for(var i=0,a=this.chars.length;a>i;){if(this.chars[i].ch===t&&this.chars[i].style===e&&this.chars[i].fFamily===s)return this.chars[i];i+=1}}function n(t,e,s){var i=this.getFontByName(e),a=i.helper;return a.textContent=t,a.getComputedTextLength()*s/100}function o(t){for(var e=0,s=this.fonts.length;s>e;){if(this.fonts[e].fName===t)return this.fonts[e];e+=1}return"sans-serif"}var h=5e3,l=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.loaded=!1,this.initTime=Date.now()};return l.prototype.addChars=a,l.prototype.addFonts=i,l.prototype.getCharData=r,l.prototype.getFontByName=o,l.prototype.measureText=n,l}(),ExpressionManager=function(){function sum(t,e){var s=typeof t,i=typeof e;if(!("number"!==s&&"boolean"!==s||"number"!==i&&"boolean"!==i))return t+e;if("object"===s&&("number"===i||"boolean"===i))return t[0]=t[0]+e,t;if(("number"===s||"boolean"===s)&&"object"===i)return e[0]=t+e[0],e;if("object"===s&&"object"===i){for(var a=0,r=t.length,n=e.length,o=[];r>a||n>a;)o[a]="number"==typeof t[a]&&"number"==typeof e[a]?t[a]+e[a]:t[a]||e[a],a+=1;return o}return 0}function sub(t,e){var s=typeof t,i=typeof e;if(!("number"!==s&&"boolean"!==s||"number"!==i&&"boolean"!==i))return t-e;if("object"===s&&("number"===i||"boolean"===i))return t[0]=t[0]-e,t;if(("number"===s||"boolean"===s)&&"object"===i)return e[0]=t-e[0],e;if("object"===s&&"object"===i){for(var a=0,r=t.length,n=e.length,o=[];r>a||n>a;)o[a]="number"==typeof t[a]&&"number"==typeof e[a]?t[a]-e[a]:t[a]||e[a],a+=1;return o}return 0}function mul(t,e){var s=typeof t,i=typeof e;if(!("number"!==s&&"boolean"!==s||"number"!==i&&"boolean"!==i))return t*e;var a,r;if("object"===s&&("number"===i||"boolean"===i)){for(r=t.length,arr=Array.apply(null,{length:r}),a=0;r>a;a+=1)arr[a]=t[a]*e;return arr}if(("number"===s||"boolean"===s)&&"object"===i){for(r=e.length,arr=Array.apply(null,{length:r}),a=0;r>a;a+=1)arr[a]=t*e[a];return arr}return 0}function div(t,e){var s=typeof t,i=typeof e;if(!("number"!==s&&"boolean"!==s||"number"!==i&&"boolean"!==i))return t/e;var a,r;if("object"===s&&("number"===i||"boolean"===i)){for(r=t.length,arr=Array.apply(null,{length:r}),a=0;r>a;a+=1)arr[a]=t[a]/e;return arr}if(("number"===s||"boolean"===s)&&"object"===i){for(r=e.length,arr=Array.apply(null,{length:r}),a=0;r>a;a+=1)arr[a]=t/e[a];return arr}return 0}function clamp(t,e,s){if(e>s){var i=s;s=e,e=i}return Math.min(Math.max(t,e),s)}function radiansToDegrees(t){return t/degToRads}function length(t,e){var s,i=t.length,a=0;for(s=0;i>s;s+=1)a+=Math.pow(e[s]-t[s],2);return Math.sqrt(a)}function linear(t,e,s,i,a){if(e>=t)return i;if(t>=s)return a;var r=t/(s-e);if(!i.length)return i+(a-i)*r;var n,o=i.length,h=Array.apply(null,{length:o});for(n=0;o>n;n+=1)h[n]=i[n]+(a[n]-i[n])*r;return h}function seedRandom(t){BMMath.seedrandom(t)}function random(t,e){if(void 0===e&&(void 0===t?(t=0,e=1):(e=t,t=void 0)),e.length){var s,i=e.length;t||(t=Array.apply(null,{length:i}));var a=Array.apply(null,{length:i}),r=BMMath.random();for(s=0;i>s;s+=1)a[s]=t[s]+r*(e[s]-t[s]);return a}void 0===t&&(t=0);var n=BMMath.random();return t+n*(e-t)}function initiateExpression(elem,data){function effect(t){return elem.effectsManager.getEffect(t)}function nearestKey(t){var e,s,i=data.k.length;if(data.k.length&&"number"!=typeof data.k[0])for(e=0;i>e;e+=1){if(t===data.k[e].t){s=e+1;break}if(t<data.k[e].t){s=e+1;break}if(t>data.k[e].t&&e===i-1){s=i;break}}else s=0;var a={};return a.index=s,a}function key(t){if(!data.k.length||"number"==typeof data.k[0])return{time:0};t-=1;var e,s={time:data.k[t].t/thisComp.globalData.frameRate};e=t===data.k.length-1?data.k[t-1].e:data.k[t].s;var i,a=e.length;for(i=0;a>i;i+=1)s[i]=e[i];return s}function hasParentGetter(){}function execute(){seedRandom(0),"textSelector"===this.type&&(textIndex=this.textIndex,textTotal=this.textTotal,selectorValue=this.selectorValue),transform||(transform=elem.transform),!content&&elem.content&&(content=elem.content.bind(elem)),this.getPreValue&&this.getPreValue(),value=this.pv,time=this.comp.renderedFrame/this.comp.globalData.frameRate,bindedFn();var t,e;if(this.mult)if("number"==typeof this.v)this.v*=this.mult;else for(!this.v,e=this.v.length,value===this.v&&(this.v=2===e?[value[0],value[1]]:[value[0],value[1],value[2]]),t=0;e>t;t+=1)this.v[t]*=this.mult;if("number"==typeof this.v)this.lastValue!==this.v&&(this.lastValue=this.v,this.mdf=!0);else if(this.v.i)this.mdf=!0;else for(!this.lastValue,e=this.v.length,t=0;e>t;t+=1)this.v[t]!==this.lastValue[t]&&(this.lastValue[t]=this.v[t],this.mdf=!0)}var val=data.x,transform,content,effect,thisComp=elem.comp;elem.comp.frameDuration=1/thisComp.globalData.frameRate;var inPoint=elem.data.ip/thisComp.globalData.frameRate,outPoint=elem.data.op/thisComp.globalData.frameRate,thisLayer=elem,fnStr="var fn = function(){"+val+";this.v = $bm_rt;}";eval(fnStr);var bindedFn=fn.bind(this),numKeys=data.k?data.k.length:0,wiggle=function(t,e){var s,i,a=this.pv.length?this.pv.length:1,r=Array.apply(null,{len:a});for(i=0;a>i;i+=1)r[i]=0;t=5;var n=Math.floor(time*t);for(s=0,i=0;n>s;){for(i=0;a>i;i+=1)r[i]+=-e+2*e*BMMath.random();s+=1}var o=time*t,h=o-Math.floor(o),l=Array.apply({length:a});for(i=0;a>i;i+=1)l[i]=this.pv[i]+r[i]+(-e+2*e*BMMath.random())*h;return l}.bind(this),loopIn=function(t,e,s){if(!this.k)return this.pv;var i=time*thisComp.globalData.frameRate,a=this.keyframes,r=a[0].t;if(i>=r)return this.pv;var n,o;s?(n=e?Math.abs(thisComp.globalData.frameRate*e):Math.max(0,this.elem.data.op-r),o=r+n):((!e||e>a.length-1)&&(e=a.length-1),o=a[e].t,n=o-r);var h,l,p;if("pingpong"===t){var m=Math.floor((r-i)/n);if(m%2===0)return this.getValueAtTime((r-i)%n+r)}else{if("offset"===t){var f=this.getValueAtTime(r),d=this.getValueAtTime(o),c=this.getValueAtTime(n-(r-i)%n+r),u=Math.floor((r-i)/n)+1;if(this.pv.length){for(p=new Array(f.length),l=p.length,h=0;l>h;h+=1)p[h]=c[h]-(d[h]-f[h])*u;return p}return c-(d-f)*u}if("continue"===t){var y=this.getValueAtTime(r),v=this.getValueAtTime(r+.001);if(this.pv.length){for(p=new Array(y.length),l=p.length,h=0;l>h;h+=1)p[h]=y[h]+(y[h]-v[h])*(r-i)/5e-4;return p}return y+(y-v)*(r-i)/5e-4}}return this.getValueAtTime(n-(r-i)%n+r)}.bind(this),loopInDuration=function(t,e){return loopIn(t,e,!0)}.bind(this),loopOut=function(t,e,s){if(!this.k)return this.pv;var i=time*thisComp.globalData.frameRate,a=this.keyframes,r=a[a.length-1].t;if(r>=i)return this.pv;var n,o;s?(n=e?Math.abs(r-thisComp.globalData.frameRate*e):Math.max(0,r-this.elem.data.ip),o=r-n):((!e||e>a.length-1)&&(e=a.length-1),o=a[a.length-1-e].t,n=r-o);var h,l,p;if("pingpong"===t){var m=Math.floor((i-o)/n);if(m%2!==0)return this.getValueAtTime(n-(i-o)%n+o)}else{if("offset"===t){var f=this.getValueAtTime(o),d=this.getValueAtTime(r),c=this.getValueAtTime((i-o)%n+o),u=Math.floor((i-o)/n);if(this.pv.length){for(p=new Array(f.length),l=p.length,h=0;l>h;h+=1)p[h]=(d[h]-f[h])*u+c[h];return p}return(d-f)*u+c}if("continue"===t){var y=this.getValueAtTime(r),v=this.getValueAtTime(r-.001);if(this.pv.length){for(p=new Array(y.length),l=p.length,h=0;l>h;h+=1)p[h]=y[h]+(y[h]-v[h])*(i-r)/5e-4;return p}return y+(y-v)*(i-r)/5e-4}}return this.getValueAtTime((i-o)%n+o)}.bind(this),loopOutDuration=function(t,e){return loopOut(t,e,!0)}.bind(this),valueAtTime=function(t){return this.getValueAtTime(t*thisComp.globalData.frameRate)}.bind(this),velocityAtTime=function(t){return this.getVelocityAtTime(t*thisComp.globalData.frameRate)}.bind(this);Object.defineProperty(this,"hasParent",{get:hasParentGetter});var time,value,textIndex,textTotal,selectorValue,index=elem.data.ind+1,hasParent=!(!elem.hierarchy||!elem.hierarchy.length);return execute}var ob={};return ob.initiateExpression=initiateExpression,ob}();!function(){ExpressionComp.prototype.layer=function(t){for(var e=0,s=this.layers.length;s>e;){if(this.layers[e].nm===t)return this.elements[e];e+=1}},ExpressionComp.prototype.pixelAspect=1}(),ShapeInterface.prototype.fillInterface=function(t){var e={get color(){return t.c.k&&t.c.getValue(),[t.c.pv[0],t.c.pv[1],t.c.pv[2]]},get opacity(){return t.o.k&&t.o.getValue(),t.o.pv}};return e},ShapeInterface.prototype.strokeInterface=function(t,e){var s={get color(){return e.c.k&&e.c.getValue(),[e.c.pv[0],e.c.pv[1],e.c.pv[2]]},get opacity(){return e.o.k&&e.o.getValue(),e.o.pv},get strokeWidth(){return e.w.k&&e.w.getValue(),e.w.pv},dashOb:{},get dash(){var s,i=e.d,a=t.d,r=a.length;for(s=0;r>s;s+=1)i.dataProps[s].p.k&&i.dataProps[s].p.getValue(),this.dashOb[a[s].nm]=i.dataProps[s].p.v;return this.dashOb}};return s},ShapeInterface.prototype.shapeInterface=function(t){var e={get shape(){return t.sh.k&&t.sh.getValue(),t.sh.pv}};return e},ShapeInterface.prototype.ellipseInterface=function(t){var e={get size(){return t.sh.s.k&&t.sh.s.getValue(),[t.sh.s.pv[0],t.sh.s.pv[1]]},get position(){return t.sh.p.k&&t.sh.p.getValue(),[t.sh.p.pv[0],t.sh.p.pv[1]]}};return e},ShapeInterface.prototype.rectangleInterface=function(t){var e="tm"===t.sh.ty?t.sh.prop:t.sh,s={get size(){return e.s.k&&e.s.getValue(),[e.s.pv[0],e.s.pv[1]]},get position(){return e.p.k&&e.p.getValue(),[e.p.pv[0],e.p.pv[1]]},get roundness(){return e.r.k&&e.r.getValue(),e.r.pv}};return s},ShapeInterface.prototype.trimInterface=function(t){var e={get start(){return t.tr.s.k&&t.tr.s.getValue(),t.tr.s.pv},get end(){return t.tr.e.k&&t.tr.e.getValue(),t.tr.e.pv},get offset(){return t.tr.o.k&&t.tr.o.getValue(),t.tr.o.pv}};return e},ShapeInterface.prototype.transformInterface=function(t){var e={get opacity(){return t.transform.mProps.o.k&&t.transform.mProps.o.getValue(),t.transform.mProps.o.pv},get position(){return t.transform.mProps.p.k&&t.transform.mProps.p.getValue(),[t.transform.mProps.p.pv[0],t.transform.mProps.p.pv[1]]},get anchorPoint(){return t.transform.mProps.a.k&&t.transform.mProps.a.getValue(),[t.transform.mProps.a.pv[0],t.transform.mProps.a.pv[1]]},get scale(){return t.transform.mProps.s.k&&t.transform.mProps.s.getValue(),[t.transform.mProps.s.pv[0],t.transform.mProps.s.pv[1]]},get rotation(){return t.transform.mProps.r.k&&t.transform.mProps.r.getValue(),t.transform.mProps.r.pv},get skew(){return t.transform.mProps.sk.k&&t.transform.mProps.sk.getValue(),t.transform.mProps.sk.pv},get skewAxis(){return t.transform.mProps.sa.k&&t.transform.mProps.sa.getValue(),t.transform.mProps.sa.pv}};return e},ShapeInterface.prototype.groupInterface=function(t,e,s){var i,a,r=[],n=t.length;for(i=0;n>i;i+=1)"gr"===t[i].ty?(a={},this.groupInterface(t[i].it,e[i].it,a),r.push(a)):"sh"===t[i].ty?(a=this.shapeInterface(e[i]),r.push(a)):"fl"===t[i].ty?(a=this.fillInterface(e[i]),r.push(a)):"st"===t[i].ty?(a=this.strokeInterface(t[i],e[i]),r.push(a)):"el"===t[i].ty?(a=this.ellipseInterface(e[i]),r.push(a)):"rc"===t[i].ty?(a=this.rectangleInterface(e[i]),r.push(a)):"tr"===t[i].ty?s.transform=this.transformInterface(e[i]):"tm"===t[i].ty?(a=this.trimInterface(e[i]),r.push(a)):r.push("");s.content=function(e){var s,i=t.length;for(s=0;i>s;s+=1)if(t[s].nm===e)return r[s]}},ShapeInterface.prototype.buildExpressionInterface=function(){this.groupInterface(this.shapesData,this.viewData,this)},LayerInterface.prototype.toWorld=function(t){if(this.hierarchy&&this.hierarchy.length){var e,s=new Matrix,i=this.hierarchy.length;for(this.finalTransform.mProp.applyToMatrix(s,!1),e=0;i>e;e+=1)this.hierarchy[e].finalTransform.mProp.applyToMatrix(s,!0);var a=s.applyToPointArray(t[0],t[1],t[2]||0);return a}return t},LayerInterface.prototype.effect=function(t){console.log(this.effectsManager),console.log(t)};var PropertyFactory=function(){function t(t){for(var e,s,i=0,a=this.keyframes.length-1,r=1,n=!0,o=0,h="object"==typeof this.pv?[this.pv.length]:0;n;){if(e=this.keyframes[i],s=this.keyframes[i+1],i==a-1&&t>=s.t-o){e.h&&(e=s);break}if(s.t-o>t)break;a-1>i?i+=r:n=!1}var l,p,m,f,d,c=0;if(e.to){e.bezierData||bez.buildBezierData(e);var u=e.bezierData;if(t>=s.t-o||t<e.t-o){var y=t>=s.t-o?u.points.length-1:0;for(p=u.points[y].point.length,l=0;p>l;l+=1)h[l]=u.points[y].point[l]}else{e.__fnct?d=e.__fnct:(d=BezierFactory.getBezierEasing(e.o.x,e.o.y,e.i.x,e.i.y,e.n).get,e.__fnct=d),m=d((t-(e.t-o))/(s.t-o-(e.t-o)));var v,g=u.segmentLength*m,b=0;for(r=1,n=!0,f=u.points.length;n;){if(b+=u.points[c].partialLength*r,0===g||0===m||c==u.points.length-1){for(p=u.points[c].point.length,l=0;p>l;l+=1)h[l]=u.points[c].point[l];break}if(g>=b&&g<b+u.points[c+1].partialLength){for(v=(g-b)/u.points[c+1].partialLength,p=u.points[c].point.length,l=0;p>l;l+=1)h[l]=u.points[c].point[l]+(u.points[c+1].point[l]-u.points[c].point[l])*v;break}f-1>c&&1==r||c>0&&-1==r?c+=r:n=!1}}}else{var E,P,k,S,C,x=!1;for(a=e.s.length,i=0;a>i;i+=1){if(1!==e.h&&(e.o.x instanceof Array?(x=!0,e.__fnct||(e.__fnct=[]),e.__fnct[i]||(E=e.o.x[i]||e.o.x[0],P=e.o.y[i]||e.o.y[0],k=e.i.x[i]||e.i.x[0],S=e.i.y[i]||e.i.y[0])):(x=!1,e.__fnct||(E=e.o.x,P=e.o.y,k=e.i.x,S=e.i.y)),x?e.__fnct[i]?d=e.__fnct[i]:(d=BezierFactory.getBezierEasing(E,P,k,S).get,e.__fnct[i]=d):e.__fnct?d=e.__fnct:(d=BezierFactory.getBezierEasing(E,P,k,S).get,e.__fnct=d),m=t>=s.t-o?1:t<e.t-o?0:d((t-(e.t-o))/(s.t-o-(e.t-o)))),this.sh&&1!==e.h){var w=e.s[i],D=e.e[i];-180>w-D?w+=360:w-D>180&&(w-=360),C=w+(D-w)*m}else C=1===e.h?e.s[i]:e.s[i]+(e.e[i]-e.s[i])*m;1===a?h=C:h[i]=C}}return h}function e(t){var e,s=.01,i=this.getValueAtTime(t),a=this.getValueAtTime(t+s);if(i.length){e=Array.apply(null,{length:i.length});var r;for(r=0;r<i.length;r+=1)e[r]=this.elem.globalData.frameRate*((a[r]-i[r])/s)}else e=(a-i)/s;return e}function s(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem.globalData.frameId;var t=this.comp.renderedFrame-this.offsetTime;if(t===this.lastFrame||this.lastFrame!==y&&(this.lastFrame>=this.keyframes[this.keyframes.length-1].t-this.offsetTime&&t>=this.keyframes[this.keyframes.length-1].t-this.offsetTime||this.lastFrame<this.keyframes[0].t-this.offsetTime&&t<this.keyframes[0].t-this.offsetTime));else{for(var e,s,i=0,a=this.keyframes.length-1,r=1,n=!0;n;){if(e=this.keyframes[i],s=this.keyframes[i+1],i==a-1&&t>=s.t-this.offsetTime){e.h&&(e=s);break}if(s.t-this.offsetTime>t)break;a-1>i?i+=r:n=!1}var o,h,l,p,m,f=0;if(e.to){e.bezierData||bez.buildBezierData(e);var d=e.bezierData;if(t>=s.t-this.offsetTime||t<e.t-this.offsetTime){var c=t>=s.t-this.offsetTime?d.points.length-1:0;for(h=d.points[c].point.length,o=0;h>o;o+=1)this.v[o]=this.mult?d.points[c].point[o]*this.mult:d.points[c].point[o],this.pv[o]=d.points[c].point[o],this.lastPValue[o]!==this.pv[o]&&(this.mdf=!0,this.lastPValue[o]=this.pv[o])}else{e.__fnct?m=e.__fnct:(m=BezierFactory.getBezierEasing(b,E,P,k,e.n).get,e.__fnct=m),l=m((t-(e.t-this.offsetTime))/(s.t-this.offsetTime-(e.t-this.offsetTime)));var u,v=d.segmentLength*l,g=0;for(r=1,n=!0,p=d.points.length;n;){if(g+=d.points[f].partialLength*r,0===v||0===l||f==d.points.length-1){for(h=d.points[f].point.length,o=0;h>o;o+=1)this.v[o]=this.mult?d.points[f].point[o]*this.mult:d.points[f].point[o],this.pv[o]=d.points[f].point[o],this.lastPValue[o]!==this.pv[o]&&(this.mdf=!0,this.lastPValue[o]=this.pv[o]);break}if(v>=g&&v<g+d.points[f+1].partialLength){for(u=(v-g)/d.points[f+1].partialLength,h=d.points[f].point.length,o=0;h>o;o+=1)this.v[o]=this.mult?(d.points[f].point[o]+(d.points[f+1].point[o]-d.points[f].point[o])*u)*this.mult:d.points[f].point[o]+(d.points[f+1].point[o]-d.points[f].point[o])*u,this.pv[o]=d.points[f].point[o]+(d.points[f+1].point[o]-d.points[f].point[o])*u,this.lastPValue[o]!==this.pv[o]&&(this.mdf=!0,this.lastPValue[o]=this.pv[o]);break}p-1>f&&1==r||f>0&&-1==r?f+=r:n=!1}}}else{var b,E,P,k,S,C=!1;for(a=e.s.length,i=0;a>i;i+=1){if(1!==e.h&&(e.o.x instanceof Array?(C=!0,e.__fnct||(e.__fnct=[]),e.__fnct[i]||(b=e.o.x[i]||e.o.x[0],E=e.o.y[i]||e.o.y[0],P=e.i.x[i]||e.i.x[0],k=e.i.y[i]||e.i.y[0])):(C=!1,e.__fnct||(b=e.o.x,E=e.o.y,P=e.i.x,k=e.i.y)),C?e.__fnct[i]?m=e.__fnct[i]:(m=BezierFactory.getBezierEasing(b,E,P,k).get,e.__fnct[i]=m):e.__fnct?m=e.__fnct:(m=BezierFactory.getBezierEasing(b,E,P,k).get,e.__fnct=m),l=t>=s.t-this.offsetTime?1:t<e.t-this.offsetTime?0:m((t-(e.t-this.offsetTime))/(s.t-this.offsetTime-(e.t-this.offsetTime)))),this.sh&&1!==e.h){var x=e.s[i],w=e.e[i];-180>x-w?x+=360:x-w>180&&(x-=360),S=x+(w-x)*l}else S=1===e.h?e.s[i]:e.s[i]+(e.e[i]-e.s[i])*l;1===a?(this.v=this.mult?S*this.mult:S,this.pv=S,this.lastPValue!=this.pv&&(this.mdf=!0,this.lastPValue=this.pv)):(this.v[i]=this.mult?S*this.mult:S,this.pv[i]=S,this.lastPValue[i]!==this.pv[i]&&(this.mdf=!0,this.lastPValue[i]=this.pv[i]))}}}this.lastFrame=t}}function i(){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime;if(this.lastFrame!==y&&(this.lastFrame<this.keyframes[0].t-this.offsetTime&&t<this.keyframes[0].t-this.offsetTime||this.lastFrame>this.keyframes[this.keyframes.length-1].t-this.offsetTime&&t>this.keyframes[this.keyframes.length-1].t-this.offsetTime));else{var e,s,i;if(t<this.keyframes[0].t-this.offsetTime)this.mdf=!0,e=this.keyframes[0].s[0],i=!0;else if(t>this.keyframes[this.keyframes.length-1].t-this.offsetTime)this.mdf=!0,e=1===this.keyframes[this.keyframes.length-2].h?this.keyframes[this.keyframes.length-2].s[0]:this.keyframes[this.keyframes.length-2].e[0],i=!0;else{this.mdf=!0;for(var a,r,n,o,h,l,p=0,m=this.keyframes.length-1,f=1,d=!0;d&&(a=this.keyframes[p],r=this.keyframes[p+1],!(r.t-this.offsetTime>t&&1==f));)m-1>p&&1==f||p>0&&-1==f?p+=f:d=!1;var c;if(1!==a.h){var u;a.__fnct?u=a.__fnct:(u=BezierFactory.getBezierEasing(a.o.x,a.o.y,a.i.x,a.i.y).get,a.__fnct=u),c=t>=r.t-this.offsetTime?1:t<a.t-this.offsetTime?0:u((t-(a.t-this.offsetTime))/(r.t-this.offsetTime-(a.t-this.offsetTime))),s=a.e[0]}e=a.s[0],i=1===a.h}for(o=this.v.i.length,l=e.i[0].length,n=0;o>n;n+=1)for(h=0;l>h;h+=1)i?(this.v.i[n][h]=e.i[n][h],this.v.o[n][h]=e.o[n][h],this.v.v[n][h]=e.v[n][h],this.pv.i[n][h]=e.i[n][h],this.pv.o[n][h]=e.o[n][h],this.pv.v[n][h]=e.v[n][h]):(this.v.i[n][h]=e.i[n][h]+(s.i[n][h]-e.i[n][h])*c,this.v.o[n][h]=e.o[n][h]+(s.o[n][h]-e.o[n][h])*c,this.v.v[n][h]=e.v[n][h]+(s.v[n][h]-e.v[n][h])*c,this.pv.i[n][h]=e.i[n][h]+(s.i[n][h]-e.i[n][h])*c,this.pv.o[n][h]=e.o[n][h]+(s.o[n][h]-e.o[n][h])*c,this.pv.v[n][h]=e.v[n][h]+(s.v[n][h]-e.v[n][h])*c)}this.lastFrame=t}function a(t,e){this.getExpression=ExpressionManager.initiateExpression,e.x&&(this.k=!0,this.x=!0,this.getValue&&(this.getPreValue=this.getValue),this.getValue=this.getExpression(t,e))}function r(t,e,s){this.mult=s,this.v=s?e.k*s:e.k,this.pv=e.k,this.mdf=!1,this.comp=t.comp,this.k=!1,a.bind(this)(t,e)}function n(t,e,s){this.mult=s,this.data=e,this.mdf=!1,this.comp=t.comp,this.k=!1,a.bind(this)(t,e),this.v=new Array(e.k.length),this.pv=new Array(e.k.length),this.lastValue=new Array(e.k.length);var i,r=e.k.length;for(i=0;r>i;i+=1)this.v[i]=s?e.k[i]*s:e.k[i],this.pv[i]=e.k[i]}function o(i,r,n){this.keyframes=r.k,this.offsetTime=i.data.st,this.lastValue=-99999,this.lastPValue=-99999,this.frameId=-1,this.k=!0,this.data=r,this.mult=n,this.elem=i,this.comp=i.comp,this.lastFrame=y,this.v=n?r.k[0].s[0]*n:r.k[0].s[0],this.pv=r.k[0].s[0],this.getValue=s,this.getValueAtTime=t,this.getVelocityAtTime=e,a.bind(this)(i,r)}function h(i,r,n){var o,h,l,p,m,f=r.k.length;for(o=0;f-1>o;o+=1)r.k[o].to&&r.k[o].s&&r.k[o].e&&(h=r.k[o].s,l=r.k[o].e,p=r.k[o].to,m=r.k[o].ti,(2==h.length&&bez.pointOnLine2D(h[0],h[1],l[0],l[1],h[0]+p[0],h[1]+p[1])&&bez.pointOnLine2D(h[0],h[1],l[0],l[1],l[0]+m[0],l[1]+m[1])||bez.pointOnLine3D(h[0],h[1],h[2],l[0],l[1],l[2],h[0]+p[0],h[1]+p[1],h[2]+p[2])&&bez.pointOnLine3D(h[0],h[1],h[2],l[0],l[1],l[2],l[0]+m[0],l[1]+m[1],l[2]+m[2]))&&(r.k[o].to=null,r.k[o].ti=null));this.keyframes=r.k,this.offsetTime=i.data.st,this.k=!0,this.mult=n,this.elem=i,this.comp=i.comp,this.getValue=s,this.getValueAtTime=t,this.getVelocityAtTime=e,this.frameId=-1,this.v=new Array(r.k[0].s.length),this.pv=new Array(r.k[0].s.length),this.lastValue=new Array(r.k[0].s.length),this.lastPValue=new Array(r.k[0].s.length),this.lastFrame=y,a.bind(this)(i,r)}function l(t,e,s,i,a){var l;if(2===s)l=new v(t,e,a);else if(7===s)l=new P(t,e,a);else if(e.k.length)if("number"==typeof e.k[0])l=new n(t,e,i);else switch(s){case 0:l=new o(t,e,i);break;case 1:l=new h(t,e,i)}else l=new r(t,e,i);return(l.k||l.x)&&a.push(l),l}function p(){return this.v}function m(t,e,s){this.comp=t.comp,this.k=!1,this.mdf=!1,this.closed=3===s?e.cl:e.closed,this.numNodes=3===s?e.pt.k.v.length:e.ks.k.v.length,this.v=3===s?e.pt.k:e.ks.k;var i=3===s?e.pt:e.ks;this.getValue=p,this.pv=this.v,a.bind(this)(t,i)}function f(t,e,s){this.comp=t.comp,this.offsetTime=t.data.st,this.getValue=i,this.keyframes=3===s?e.pt.k:e.ks.k,this.k=!0,this.closed=3===s?e.cl:e.closed;var r,n=this.keyframes[0].s[0].i.length,o=this.keyframes[0].s[0].i[0].length;for(this.numNodes=n,this.v={i:new Array(n),o:new Array(n),v:new Array(n)},this.pv={i:new Array(n),o:new Array(n),v:new Array(n)},r=0;n>r;r+=1)this.v.i[r]=new Array(o),this.v.o[r]=new Array(o),this.v.v[r]=new Array(o),this.pv.i[r]=new Array(o),this.pv.o[r]=new Array(o),this.pv.v[r]=new Array(o);this.lastFrame=y;var h=3===s?e.pt:e.ks;a.bind(this)(t,h)}function d(t,e,s,i,a){var r;if(3===s||4===s){var n=3===s?e.pt.k:e.ks.k;r=n.length?new f(t,e,s):new m(t,e,s)}else 5===s?r=new E(t,e):6===s?r=new g(t,e):7===s&&(r=new b(t,e));var o=!1;if(a)for(var h=0,l=a.length;l>h;){if(!a[h].closed){o=!0;break}h+=1}return o&&(r=new k(r,a)),r.k&&i.push(r),r}function c(t,e,s,i){return new S(t,e,s,i)}function u(t,e,s){switch(e.t){case 0:return new x(t,e,s);case 1:return new C(t,e)}}var y=-999999,v=function(){function t(){return this.p.k&&this.getValue(),this.p.pv}function e(){return this.a.k&&this.getValue(),this.a.pv}function s(){return this.or.k&&this.getValue(),this.or.pv}function i(){return this.r.k&&this.getValue(),this.r.pv}function a(){return this.s.k&&this.getValue(),this.s.pv}function r(){return this.o.k&&this.o.getValue(),this.o.pv}function n(){return this.sk.k&&this.sk.getValue(),this.sk.pv}function o(){return this.sa.k&&this.sa.getValue(),this.sa.pv}function h(t,e){var s,i=this.dynamicProperties.length;if(e){for(s=0;i>s;s+=1)this.dynamicProperties[s].getValue(),this.dynamicProperties[s].mdf&&(this.mdf=!0);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.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])}else this.a&&t.translate(-this.a.pv[0],-this.a.pv[1],this.a.pv[2]),this.s&&t.scale(this.s.pv[0],this.s.pv[1],this.s.pv[2]),this.r?t.rotate(-this.r.pv):t.rotateZ(-this.rz.pv).rotateY(this.ry.pv).rotateX(this.rx.pv).rotateZ(-this.or.pv[2]).rotateY(this.or.pv[1]).rotateX(this.or.pv[0]),this.data.p.s?this.data.p.z?t.translate(this.px.pv,this.py.pv,-this.pz.pv):t.translate(this.px.pv,this.py.pv,0):t.translate(this.p.pv[0],this.p.pv[1],-this.p.pv[2])}function p(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem.globalData.frameId;var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0);this.mdf&&(this.v.reset(),this.a&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r?this.v.rotate(-this.r.v):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.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]))}}function m(){this.inverted=!0,this.iv=new Matrix,this.k||(this.data.p.s?this.iv.translate(this.px.v,this.py.v,-this.pz.v):this.iv.translate(this.p.v[0],this.p.v[1],-this.p.v[2]),this.r?this.iv.rotate(-this.r.v):this.iv.rotateX(-this.rx.v).rotateY(-this.ry.v).rotateZ(this.rz.v),this.s&&this.iv.scale(this.s.v[0],this.s.v[1],1),this.a&&this.iv.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]))}return function(f,d,c){this.elem=f,this.frameId=-1,this.dynamicProperties=[],this.mdf=!1,this.data=d,this.getValue=p,this.applyToMatrix=h,this.setInverted=m,this.v=new Matrix,d.p.s?(this.px=l(f,d.p.x,0,0,this.dynamicProperties),this.py=l(f,d.p.y,0,0,this.dynamicProperties),d.p.z&&(this.pz=l(f,d.p.z,0,0,this.dynamicProperties))):this.p=l(f,d.p,1,0,this.dynamicProperties),d.r?this.r=l(f,d.r,0,degToRads,this.dynamicProperties):d.rx&&(this.rx=l(f,d.rx,0,degToRads,this.dynamicProperties),this.ry=l(f,d.ry,0,degToRads,this.dynamicProperties),this.rz=l(f,d.rz,0,degToRads,this.dynamicProperties),this.or=l(f,d.or,0,degToRads,this.dynamicProperties)),d.sk&&(this.sk=l(f,d.sk,0,degToRads,this.dynamicProperties),this.sa=l(f,d.sa,0,degToRads,this.dynamicProperties)),d.a&&(this.a=l(f,d.a,1,0,this.dynamicProperties)),d.s&&(this.s=l(f,d.s,1,.01,this.dynamicProperties)),this.o=d.o?l(f,d.o,0,.01,c):{mdf:!1,v:1},this.dynamicProperties.length?c.push(this):(this.a&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r?this.v.rotate(-this.r.v):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.data.p.s?d.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])),Object.defineProperty(this,"position",{get:t}),Object.defineProperty(this,"orientation",{get:s}),Object.defineProperty(this,"anchorPoint",{get:e}),Object.defineProperty(this,"rotation",{get:i}),Object.defineProperty(this,"scale",{get:a}),Object.defineProperty(this,"opacity",{get:r}),Object.defineProperty(this,"skew",{get:n}),Object.defineProperty(this,"skewAxis",{get:o})}}(),g=function(){function t(){var t=this.p.v[0],e=this.p.v[1],i=this.s.v[0]/2,a=this.s.v[1]/2;2!==this.d&&3!==this.d?(this.v.v[0]=[t,e-a],this.v.i[0]=[t-i*s,e-a],this.v.o[0]=[t+i*s,e-a],this.v.v[1]=[t+i,e],this.v.i[1]=[t+i,e-a*s],this.v.o[1]=[t+i,e+a*s],this.v.v[2]=[t,e+a],this.v.i[2]=[t+i*s,e+a],this.v.o[2]=[t-i*s,e+a],this.v.v[3]=[t-i,e],this.v.i[3]=[t-i,e+a*s],this.v.o[3]=[t-i,e-a*s]):(this.v.v[0]=[t,e-a],this.v.o[0]=[t-i*s,e-a],this.v.i[0]=[t+i*s,e-a],this.v.v[1]=[t-i,e],this.v.o[1]=[t-i,e+a*s],this.v.i[1]=[t-i,e-a*s],this.v.v[2]=[t,e+a],this.v.o[2]=[t+i*s,e+a],this.v.i[2]=[t-i*s,e+a],this.v.v[3]=[t+i,e],this.v.o[3]=[t+i,e-a*s],this.v.i[3]=[t+i,e+a*s])}function e(t){var e,s=this.dynamicProperties.length;if(this.elem.globalData.frameId!==this.frameId){for(this.mdf=!1,this.frameId=this.elem.globalData.frameId,e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.mdf&&this.convertEllToPath()}}var s=.5519;return function(s,i){this.v={v:new Array(4),i:new Array(4),o:new Array(4),c:!0},this.numNodes=4,this.d=i.d,this.dynamicProperties=[],i.closed=!0,this.closed=!0,this.elem=s,this.comp=s.comp,this.frameId=-1,this.mdf=!1,this.getValue=e,this.convertEllToPath=t,this.p=l(s,i.p,1,0,this.dynamicProperties),this.s=l(s,i.s,1,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertEllToPath()}}(),b=function(){function t(){var t=Math.floor(this.pt.v),e=2*Math.PI/t;this.v.v.length=t,this.v.i.length=t,this.v.o.length=t;var s,i=this.or.v,a=this.os.v,r=2*Math.PI*i/(4*t),n=-Math.PI/2,o=3===this.data.d?-1:1;for(n+=this.r.v,s=0;t>s;s+=1){var h=i*Math.cos(n),l=i*Math.sin(n),p=0===h&&0===l?0:l/Math.sqrt(h*h+l*l),m=0===h&&0===l?0:-h/Math.sqrt(h*h+l*l);h+=+this.p.v[0],l+=+this.p.v[1],this.v.v[s]=[h,l],this.v.i[s]=[h+p*r*a*o,l+m*r*a*o],this.v.o[s]=[h-p*r*a*o,l-m*r*a*o],n+=e*o}this.numNodes=t}function e(){var t=2*Math.floor(this.pt.v),e=2*Math.PI/t;this.v.v.length=t,this.v.i.length=t,this.v.o.length=t;var s,i,a,r,n=!0,o=this.or.v,h=this.ir.v,l=this.os.v,p=this.is.v,m=2*Math.PI*o/(2*t),f=2*Math.PI*h/(2*t),d=-Math.PI/2;d+=this.r.v;var c=3===this.data.d?-1:1;for(s=0;t>s;s+=1){i=n?o:h,a=n?l:p,r=n?m:f;var u=i*Math.cos(d),y=i*Math.sin(d),v=0===u&&0===y?0:y/Math.sqrt(u*u+y*y),g=0===u&&0===y?0:-u/Math.sqrt(u*u+y*y);u+=+this.p.v[0],y+=+this.p.v[1],this.v.v[s]=[u,y],this.v.i[s]=[u+v*r*a*c,y+g*r*a*c],this.v.o[s]=[u-v*r*a*c,y-g*r*a*c],n=!n,d+=e*c}this.numNodes=t}function s(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem.globalData.frameId;var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0);this.mdf&&this.convertToPath()}}return function(i,a){this.v={v:[],i:[],o:[],c:!0},this.elem=i,this.comp=i.comp,this.data=a,this.frameId=-1,this.d=a.d,this.dynamicProperties=[],this.mdf=!1,a.closed=!0,this.closed=!0,this.getValue=s,1===a.sy?(this.ir=l(i,a.ir,0,0,this.dynamicProperties),this.is=l(i,a.is,0,.01,this.dynamicProperties),this.convertToPath=e):this.convertToPath=t,this.pt=l(i,a.pt,0,0,this.dynamicProperties),this.p=l(i,a.p,1,0,this.dynamicProperties),this.r=l(i,a.r,0,degToRads,this.dynamicProperties),this.or=l(i,a.or,0,0,this.dynamicProperties),this.os=l(i,a.os,0,.01,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertToPath()}}(),E=function(){function t(t){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.mdf&&this.convertRectToPath()}}function e(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,i=this.s.v[1]/2,a=bm_min(s,i,this.r.v),r=a*(1-.5519);2===this.d||1===this.d?(this.v.v[0]=[t+s,e-i+a],this.v.o[0]=this.v.v[0],this.v.i[0]=[t+s,e-i+r],this.v.v[1]=[t+s,e+i-a],this.v.o[1]=[t+s,e+i-r],this.v.i[1]=this.v.v[1],this.v.v[2]=[t+s-a,e+i],this.v.o[2]=this.v.v[2],this.v.i[2]=[t+s-r,e+i],this.v.v[3]=[t-s+a,e+i],this.v.o[3]=[t-s+r,e+i],this.v.i[3]=this.v.v[3],this.v.v[4]=[t-s,e+i-a],this.v.o[4]=this.v.v[4],this.v.i[4]=[t-s,e+i-r],this.v.v[5]=[t-s,e-i+a],this.v.o[5]=[t-s,e-i+r],this.v.i[5]=this.v.v[5],this.v.v[6]=[t-s+a,e-i],this.v.o[6]=this.v.v[6],this.v.i[6]=[t-s+r,e-i],this.v.v[7]=[t+s-a,e-i],this.v.o[7]=[t+s-r,e-i],this.v.i[7]=this.v.v[7]):(this.v.v[0]=[t+s,e-i+a],this.v.o[0]=[t+s,e-i+r],this.v.i[0]=this.v.v[0],this.v.v[1]=[t+s-a,e-i],this.v.o[1]=this.v.v[1],this.v.i[1]=[t+s-r,e-i],this.v.v[2]=[t-s+a,e-i],this.v.o[2]=[t-s+r,e-i],this.v.i[2]=this.v.v[2],this.v.v[3]=[t-s,e-i+a],this.v.o[3]=this.v.v[3],this.v.i[3]=[t-s,e-i+r],this.v.v[4]=[t-s,e+i-a],this.v.o[4]=[t-s,e+i-r],this.v.i[4]=this.v.v[4],this.v.v[5]=[t-s+a,e+i],this.v.o[5]=this.v.v[5],this.v.i[5]=[t-s+r,e+i],this.v.v[6]=[t+s-a,e+i],this.v.o[6]=[t+s-r,e+i],this.v.i[6]=this.v.v[6],this.v.v[7]=[t+s,e+i-a],this.v.o[7]=this.v.v[7],this.v.i[7]=[t+s,e+i-r])}return function(s,i){this.v={v:new Array(8),i:new Array(8),o:new Array(8),c:!0},this.numNodes=8,this.elem=s,this.comp=s.comp,this.frameId=-1,this.d=i.d,this.dynamicProperties=[],this.mdf=!1,i.closed=!0,this.closed=!0,this.getValue=t,this.convertRectToPath=e,this.p=l(s,i.p,1,0,this.dynamicProperties),this.s=l(s,i.s,1,0,this.dynamicProperties),this.r=l(s,i.r,0,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertRectToPath()}}(),P=function(){function t(t){if(this.elem.globalData.frameId!==this.frameId||t){this.mdf=!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0);if(this.mdf||t){var i=this.o.v%360/360;if(0===i&&0===this.s.v&&1==this.e.v)return void(this.isTrimming=!1);this.isTrimming=!0,0>i&&(i+=1);var a=this.s.v+i,r=this.e.v+i;if(a>r){var n=a;a=r,r=n}this.sValue=a,this.eValue=r,this.oValue=i}}}return function(e,s){this.elem=e,this.frameId=-1,this.dynamicProperties=[],this.sValue=0,this.eValue=0,this.oValue=0,this.mdf=!1,this.getValue=t,this.k=!1,this.isTrimming=!1,
this.comp=e.comp,this.s=l(e,s.s,0,.01,this.dynamicProperties),this.e=l(e,s.e,0,.01,this.dynamicProperties),this.o=l(e,s.o,0,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.getValue(!0)}}(),k=function(){function t(t,e){this.totalLength=0;var s,i=t.v,a=t.o,r=t.i,n=i.length;for(s=0;n-1>s;s+=1)this.lengths[s]=bez.getBezierLength(i[s],i[s+1],a[s],r[s+1]),this.totalLength+=this.lengths[s].addedLength;e&&(this.lengths[s]=bez.getBezierLength(i[s],i[0],a[s],r[0]),this.totalLength+=this.lengths[s].addedLength)}function e(t,e,s,i,a){this.nextO[this.segmentCount]=e,this.nextI[this.segmentCount+1]=s,this.nextV[this.segmentCount+1]=i,this.pathStarted?this.nextV[this.segmentCount]=t:(this.pathStarted=!0,this.v.s[this.segmentCount]=t),this.segmentCount+=1}function s(t){this.mdf=t?!0:!1,this.prop.k&&this.prop.getValue();var e=0,s=this.trims.length;for(this.pathStarted=!1;s>e;){if(this.trims[e].mdf){this.mdf=!0;break}e+=1}if(this.mdf=this.prop.mdf?!0:this.mdf,this.mdf){this.nextO.length=0,this.nextI.length=0,this.nextV.length=0,this.v.s.length=0;var i=this.prop.closed;this.getSegmentsLength(this.prop.v,i);var a,r,n,o,h,l,p=this.prop.v,m=this.trims.length;for(a=0;m>a;a+=1)if(this.trims[a].isTrimming){if(r=this.trims[a].eValue,n=this.trims[a].sValue,o=this.trims[a].oValue,r===n)return this.v.v=this.nextV,this.v.o=this.nextO,void(this.v.i=this.nextI);1>=r?(this.segments[0].s=this.totalLength*n,this.segments[0].e=this.totalLength*r,this.segments[1].vl=!1):n>=1?(this.segments[0].s=this.totalLength*(n-1),this.segments[0].e=this.totalLength*(r-1),this.segments[1].vl=!1):(this.segments[0].s=this.totalLength*n,this.segments[0].e=this.totalLength,this.segments[1].s=0,this.segments[1].e=this.totalLength*(r-1),this.segments[1].vl=!0),this.v.v=p.v,this.v.o=p.o,this.v.i=p.i,l=this.v.v.length;var f=0,d=0;s=this.segments[1].vl?2:1;var c;for(this.segmentCount=0,e=0;s>e;e+=1){for(f=0,h=1;l>h;h++)if(d=this.lengths[h-1].addedLength,f+d<this.segments[e].s)f+=d;else{if(f>this.segments[e].e)break;this.segments[e].s<=f&&this.segments[e].e>=f+d?this.addSegment(this.v.v[h-1],this.v.o[h-1],this.v.i[h],this.v.v[h],this.lengths[h-1]):(c=bez.getNewSegment(this.v.v[h-1],this.v.v[h],this.v.o[h-1],this.v.i[h],(this.segments[e].s-f)/d,(this.segments[e].e-f)/d,this.lengths[h-1]),this.addSegment(c.pt1,c.pt3,c.pt4,c.pt2)),f+=d}i!==!1?f<=this.segments[e].e&&(d=this.lengths[h-1].addedLength,this.segments[e].s<=f&&this.segments[e].e>=f+d?this.addSegment(this.v.v[h-1],this.v.o[h-1],this.v.i[0],this.v.v[0],this.lengths[h-1]):(c=bez.getNewSegment(this.v.v[h-1],this.v.v[0],this.v.o[h-1],this.v.i[0],(this.segments[e].s-f)/d,(this.segments[e].e-f)/d,this.lengths[h-1]),this.addSegment(c.pt1,c.pt3,c.pt4,c.pt2))):this.pathStarted=!1}i=!1}else this.v.v=p.v,this.v.o=p.o,this.v.i=p.i;this.nextV.length?(this.v.v=this.nextV,this.v.o=this.nextO,this.v.i=this.nextI):this.v.s.length=0,this.v.c=i}}return function(i,a){this.trims=[],this.k=!1,this.mdf=!1,this.ty="tm",this.pathStarted=!1,this.segments=[{s:0,e:0,vl:!0},{s:0,e:0,vl:!1}],this.nextO=[],this.nextV=[],this.nextI=[],this.v={i:null,o:null,v:null,s:[],c:!1};var r,n=a.length;for(r=0;n>r;r+=1)a[r].closed||(this.k=a[r].trimProp.k?!0:this.k,this.trims.push(a[r].trimProp));this.prop=i,this.prop.numNodes?(n=this.prop.numNodes-1,n+=this.prop.closed?1:0,this.lengths=new Array(n)):this.lengths=[],this.k=i.k?!0:this.k,this.totalLength=0,this.getValue=s,this.addSegment=e,this.getSegmentsLength=t,this.k||(this.prop.getValue(),this.getValue(!0))}}(),S=function(){function t(t){var e=0,s=this.dataProps.length;if(this.elem.globalData.frameId!==this.frameId||t){for(this.mdf=!1,this.frameId=this.elem.globalData.frameId;s>e;){if(this.dataProps[e].p.mdf){this.mdf=!0;break}e+=1}if(this.mdf||t)for("svg"===this.renderer&&(this.dasharray=""),e=0;s>e;e+=1)"o"!=this.dataProps[e].n?"svg"===this.renderer?this.dasharray+=" "+this.dataProps[e].p.v:this.dasharray[e]=this.dataProps[e].p.v:this.dashoffset=this.dataProps[e].p.v}}return function(e,s,i,a){this.elem=e,this.frameId=-1,this.dataProps=new Array(s.length),this.renderer=i,this.mdf=!1,this.k=!1,this.dasharray="svg"===this.renderer?"":new Array(s.length-1),this.dashoffset=0;var r,n,o=s.length;for(r=0;o>r;r+=1)n=l(e,s[r].v,0,0,a),this.k=n.k?!0:this.k,this.dataProps[r]={n:s[r].n,p:n};this.getValue=t,this.k?a.push(this):this.getValue(!0)}}(),C=function(){function t(t,e){return this.textIndex=t+1,this.textTotal=e,this.getValue(),this.v}return function(e,s){this.pv=1,this.comp=e.comp,this.mult=.01,this.type="textSelector",this.textTotal=s.totalChars,this.selectorValue=100,this.lastValue=[1,1,1],a.bind(this)(e,s),this.getMult=t}}(),x=function(){function t(){if(this.dynamicProperties.length){var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue()}var s=this.data.totalChars,i=2===this.data.r?1:100/s,a=this.o.v/i,r=this.s.v/i+a,n=this.e.v/i+a;if(r>n){var o=r;r=n,n=o}this.finalS=r,this.finalE=n}function e(t){var e=BezierFactory.getBezierEasing(this.ne.v/100,0,1-this.xe.v/100,1).get,r=0,n=this.finalS,o=this.finalE,h=this.data.sh;if(2==h)r=o===n?t>=o?1:0:s(0,i(.5/(o-n)+(t-n)/(o-n),1)),r=e(r);else if(3==h)r=o===n?t>=o?0:1:1-s(0,i(.5/(o-n)+(t-n)/(o-n),1)),r=e(r);else if(4==h)o===n?r=t>=o?0:1:(r=s(0,i(.5/(o-n)+(t-n)/(o-n),1)),.5>r?r*=2:r=1-r);else if(5==h)if(o===n)r=t>=o?0:1;else{var l=o-n;r=-4/(l*l)*t*t+4/l*t}else 6==h?r=o===n?t>=o?0:1:(1+(Math.cos(Math.PI+2*Math.PI*(t-n)/(o-n))+0))/2:t>=a(n)&&(r=0>t-n?1-(n-t):s(0,i(o-t,1)));return r*this.a.v}var s=Math.max,i=Math.min,a=Math.floor;return function(s,i,a){this.mdf=!1,this.k=!1,this.data=i,this.dynamicProperties=[],this.getValue=t,this.getMult=e,this.comp=s.comp,this.finalS=0,this.finalE=0,this.s=l(s,i.s||{k:0},0,0,this.dynamicProperties),this.e="e"in i?l(s,i.e,0,0,this.dynamicProperties):{v:2===i.r?i.totalChars:100},this.o=l(s,i.o||{k:0},0,0,this.dynamicProperties),this.xe=l(s,i.xe||{k:0},0,0,this.dynamicProperties),this.ne=l(s,i.ne||{k:0},0,0,this.dynamicProperties),this.a=l(s,i.a,0,.01,this.dynamicProperties),this.dynamicProperties.length?a.push(this):this.getValue()}}(),w={};return w.getProp=l,w.getShapeProp=d,w.getDashProp=c,w.getTextSelectorProp=u,w}();SVGRenderer.prototype.createItem=function(t,e,s,i){switch(t.ty){case 2:return this.createImage(t,e,s,i);case 0:return this.createComp(t,e,s,i);case 1:return this.createSolid(t,e,s,i);case 4:return this.createShape(t,e,s,i);case 5:return this.createText(t,e,s,i);case 99:return this.createPlaceHolder(t,e)}return this.createBase(t,e,s)},SVGRenderer.prototype.buildItems=function(t,e,s,i,a){var r,n=t.length;s||(s=this.elements),e||(e=this.animationItem.container),i||(i=this);var o;for(r=n-1;r>=0;r--)s[r]=this.createItem(t[r],e,i,a),0===t[r].ty&&(o=[],this.buildItems(t[r].layers,s[r].getDomElement(),o,s[r],s[r].placeholder),s[r].setElements(o)),t[r].td&&s[r+1].setMatte(s[r].layerId)},SVGRenderer.prototype.includeLayers=function(t,e,s){var i,a=t.length;s||(s=this.elements),e||(e=this.animationItem.container);var r,n,o,h=s.length;for(i=0;a>i;i+=1)for(r=0;h>r;){if(s[r].data.id==t[i].id){o=s[r],s[r]=this.createItem(t[i],e,this,o),0===t[i].ty&&(n=[],this.buildItems(t[i].layers,s[r].getDomElement(),n,s[r],s[i].placeholder),s[r].setElements(n));break}r+=1}for(i=0;a>i;i+=1)t[i].td&&s[i+1].setMatte(s[i].layerId)},SVGRenderer.prototype.createBase=function(t,e,s,i){return new SVGBaseElement(t,e,this.globalData,s,i)},SVGRenderer.prototype.createPlaceHolder=function(t,e){return new PlaceHolderElement(t,e,this.globalData)},SVGRenderer.prototype.createShape=function(t,e,s,i){return new IShapeElement(t,e,this.globalData,s,i)},SVGRenderer.prototype.createText=function(t,e,s,i){return new SVGTextElement(t,e,this.globalData,s,i)},SVGRenderer.prototype.createImage=function(t,e,s,i){return new IImageElement(t,e,this.globalData,s,i)},SVGRenderer.prototype.createComp=function(t,e,s,i){return new ICompElement(t,e,this.globalData,s,i)},SVGRenderer.prototype.createSolid=function(t,e,s,i){return new ISolidElement(t,e,this.globalData,s,i)},SVGRenderer.prototype.configAnimation=function(t){this.animationItem.container=document.createElementNS(svgNS,"svg"),this.animationItem.container.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.animationItem.container.setAttribute("width",t.w),this.animationItem.container.setAttribute("height",t.h),this.animationItem.container.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.animationItem.container.setAttribute("preserveAspectRatio","xMidYMid meet"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transform="translate3d(0,0,0)",this.animationItem.container.style.transformOrigin=this.animationItem.container.style.mozTransformOrigin=this.animationItem.container.style.webkitTransformOrigin=this.animationItem.container.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.animationItem.container);var e=document.createElementNS(svgNS,"defs");this.globalData.defs=e,this.animationItem.container.appendChild(e),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getPath=this.animationItem.getPath.bind(this.animationItem),this.globalData.elementLoaded=this.animationItem.elementLoaded.bind(this.animationItem),this.globalData.frameId=0,this.globalData.compSize={w:t.w,h:t.h},this.globalData.frameRate=t.fr;var s=document.createElementNS(svgNS,"clipPath"),i=document.createElementNS(svgNS,"rect");i.setAttribute("width",t.w),i.setAttribute("height",t.h),i.setAttribute("x",0),i.setAttribute("y",0);var a="animationMask_"+randomString(10);s.setAttribute("id",a),s.appendChild(i);var r=document.createElementNS(svgNS,"g");r.setAttribute("clip-path","url(#"+a+")"),this.animationItem.container.appendChild(r),e.appendChild(s),this.animationItem.container=r,this.layers=t.layers,this.globalData.fontManager=new FontManager,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,e)},SVGRenderer.prototype.buildStage=function(t,e,s){var i,a,r=e.length;for(s||(s=this.elements),i=r-1;i>=0;i--)a=e[i],void 0!==a.parent&&this.buildItemParenting(a,s[i],e,a.parent,s,!0),0===a.ty&&this.buildStage(s[i].getComposingElement(),a.layers,s[i].getElements())},SVGRenderer.prototype.buildItemParenting=function(t,e,s,i,a,r){t.parents||(t.parents=[]),r&&e.resetHierarchy();for(var n=0,o=s.length;o>n;)s[n].ind==i&&(e.getHierarchy().push(a[n]),void 0!==s[n].parent&&this.buildItemParenting(t,e,s,s[n].parent,a,!1)),n+=1},SVGRenderer.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.animationItem.container=null,this.globalData.defs=null;var t,e=this.layers.length;for(t=0;e>t;t++)this.elements[t].destroy();this.elements.length=0,this.destroyed=!0},SVGRenderer.prototype.updateContainerSize=function(){},SVGRenderer.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;var e,s=this.layers.length;for(e=0;s>e;e++)this.elements[e].prepareFrame(t-this.layers[e].st);for(e=0;s>e;e++)this.elements[e].renderFrame()}},SVGRenderer.prototype.hide=function(){this.animationItem.container.style.display="none"},SVGRenderer.prototype.show=function(){this.animationItem.container.style.display="block"},extendPrototype(ExpressionComp,SVGRenderer),CanvasRenderer.prototype.createItem=function(t,e){switch(t.ty){case 0:return this.createComp(t,e);case 1:return this.createSolid(t,e);case 2:return this.createImage(t,e);case 4:return this.createShape(t,e);case 5:return this.createText(t,e);case 99:return this.createPlaceHolder(t,e);default:return this.createBase(t,e)}return this.createBase(t,e)},CanvasRenderer.prototype.buildItems=function(t,e,s){e||(e=this.elements),s||(s=this);var i,a=t.length;for(i=0;a>i;i++)if(e[i]=this.createItem(t[i],s),0===t[i].ty){var r=[];this.buildItems(t[i].layers,r,e[i]),e[e.length-1].setElements(r)}},CanvasRenderer.prototype.includeLayers=function(t,e,s){var i,a=t.length;s||(s=this.elements);var r,n,o=s.length;for(i=0;a>i;i+=1)for(r=0;o>r;){if(s[r].data.id==t[i].id){s[r]=this.createItem(t[i],this),0===t[i].ty&&(n=[],this.buildItems(t[i].layers,n,s[r]),s[r].setElements(n));break}r+=1}},CanvasRenderer.prototype.createBase=function(t,e){return new CVBaseElement(t,e,this.globalData)},CanvasRenderer.prototype.createShape=function(t,e){return new CVShapeElement(t,e,this.globalData)},CanvasRenderer.prototype.createText=function(t,e){return new CVTextElement(t,e,this.globalData)},CanvasRenderer.prototype.createPlaceHolder=function(t){return new PlaceHolderElement(t,null,this.globalData)},CanvasRenderer.prototype.createImage=function(t,e){return new CVImageElement(t,e,this.globalData)},CanvasRenderer.prototype.createComp=function(t,e){return new CVCompElement(t,e,this.globalData)},CanvasRenderer.prototype.createSolid=function(t,e){return new CVSolidElement(t,e,this.globalData)},CanvasRenderer.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)return void this.canvasContext.transform(t[0],t[1],t[4],t[5],t[12],t[13]);this.transformMat.cloneFromProps(t),this.transformMat.transform(this.contextData.cTr.props[0],this.contextData.cTr.props[1],this.contextData.cTr.props[2],this.contextData.cTr.props[3],this.contextData.cTr.props[4],this.contextData.cTr.props[5],this.contextData.cTr.props[6],this.contextData.cTr.props[7],this.contextData.cTr.props[8],this.contextData.cTr.props[9],this.contextData.cTr.props[10],this.contextData.cTr.props[11],this.contextData.cTr.props[12],this.contextData.cTr.props[13],this.contextData.cTr.props[14],this.contextData.cTr.props[15]),this.contextData.cTr.cloneFromProps(this.transformMat.props);var e=this.contextData.cTr.props;this.canvasContext.setTransform(e[0],e[1],e[4],e[5],e[12],e[13])}},CanvasRenderer.prototype.ctxOpacity=function(t){if(1!==t){if(!this.renderConfig.clearCanvas)return void(this.canvasContext.globalAlpha*=0>t?0:t);this.contextData.cO*=0>t?0:t,this.canvasContext.globalAlpha=this.contextData.cO}},CanvasRenderer.prototype.reset=function(){return this.renderConfig.clearCanvas?(this.contextData.cArrPos=0,this.contextData.cTr.reset(),void(this.contextData.cO=1)):void this.canvasContext.restore()},CanvasRenderer.prototype.save=function(t){if(!this.renderConfig.clearCanvas)return void this.canvasContext.save();t&&this.canvasContext.save();var e=this.contextData.cTr.props;(null===this.contextData.saved[this.contextData.cArrPos]||void 0===this.contextData.saved[this.contextData.cArrPos])&&(this.contextData.saved[this.contextData.cArrPos]=new Array(16));var s,i=this.contextData.saved[this.contextData.cArrPos];for(s=0;16>s;s+=1)i[s]=e[s];this.contextData.savedOp[this.contextData.cArrPos]=this.contextData.cO,this.contextData.cArrPos+=1},CanvasRenderer.prototype.restore=function(t){if(!this.renderConfig.clearCanvas)return void this.canvasContext.restore();t&&this.canvasContext.restore(),this.contextData.cArrPos-=1;var e,s=this.contextData.saved[this.contextData.cArrPos],i=this.contextData.cTr.props;for(e=0;16>e;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.canvasContext.globalAlpha=s},CanvasRenderer.prototype.configAnimation=function(t){this.animationItem.wrapper?(this.animationItem.container=document.createElement("canvas"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transformOrigin=this.animationItem.container.style.mozTransformOrigin=this.animationItem.container.style.webkitTransformOrigin=this.animationItem.container.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.animationItem.container),this.canvasContext=this.animationItem.container.getContext("2d")):this.canvasContext=this.renderConfig.context,this.globalData.canvasContext=this.canvasContext,this.globalData.renderer=this,this.globalData.isDashed=!1,this.globalData.totalFrames=Math.floor(t.tf),this.globalData.compWidth=t.w,this.globalData.compHeight=t.h,this.globalData.frameRate=t.fr,this.globalData.frameId=0,this.layers=t.layers,this.transformCanvas={},this.transformCanvas.w=t.w,this.transformCanvas.h=t.h,this.updateContainerSize(),this.globalData.fontManager=new FontManager,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,document)},CanvasRenderer.prototype.updateContainerSize=function(){var t,e;if(this.animationItem.wrapper&&this.animationItem.container?(t=this.animationItem.wrapper.offsetWidth,e=this.animationItem.wrapper.offsetHeight,this.animationItem.container.setAttribute("width",t*this.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),"fit"==this.renderConfig.scaleMode){var s=t/e,i=this.transformCanvas.w/this.transformCanvas.h;i>s?(this.transformCanvas.sx=t/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=t/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.tx=0,this.transformCanvas.ty=(e-this.transformCanvas.h*(t/this.transformCanvas.w))/2*this.renderConfig.dpr):(this.transformCanvas.sx=e/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.sy=e/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.tx=(t-this.transformCanvas.w*(e/this.transformCanvas.h))/2*this.renderConfig.dpr,this.transformCanvas.ty=0)}else 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.globalData.cWidth=t,this.globalData.cHeight=e},CanvasRenderer.prototype.buildStage=function(t,e,s){s||(s=this.elements);var i,a,r=e.length;for(i=r-1;i>=0;i--)a=e[i],void 0!==a.parent&&this.buildItemHierarchy(a,s[i],e,a.parent,s,!0),0==a.ty&&this.buildStage(null,a.layers,s[i].getElements())},CanvasRenderer.prototype.buildItemHierarchy=function(t,e,s,i,a,r){var n=0,o=s.length;for(r&&e.resetHierarchy();o>n;)s[n].ind===i&&(e.getHierarchy().push(a[n]),void 0!==s[n].parent&&this.buildItemHierarchy(t,e,s,s[n].parent,a,!1)),n+=1},CanvasRenderer.prototype.destroy=function(){this.renderConfig.clearCanvas&&(this.animationItem.wrapper.innerHTML="");var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].destroy();this.elements.length=0,this.globalData.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},CanvasRenderer.prototype.renderFrame=function(t){if(!(this.renderedFrame==t&&this.renderConfig.clearCanvas===!0||this.destroyed||null===t)){this.renderedFrame=t,this.globalData.frameNum=t-this.animationItem.firstFrame,this.globalData.frameId+=1,this.renderConfig.clearCanvas===!0?(this.reset(),this.canvasContext.clearRect(0,0,this.transformCanvas.w,this.transformCanvas.h)):this.save(),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();var e,s=this.layers.length;for(e=0;s>e;e++)this.elements[e].prepareFrame(t-this.layers[e].st);for(e=s-1;e>=0;e-=1)this.elements[e].renderFrame();this.renderConfig.clearCanvas!==!0&&this.restore()}},CanvasRenderer.prototype.hide=function(){this.animationItem.container.style.display="none"},CanvasRenderer.prototype.show=function(){this.animationItem.container.style.display="block"},extendPrototype(ExpressionComp,CanvasRenderer),HybridRenderer.prototype.createItem=function(t,e,s,i){switch(t.ty){case 2:return this.createImage(t,e,s,i);case 0:return this.createComp(t,e,s,i);case 1:return this.createSolid(t,e,s,i);case 4:return this.createShape(t,e,s,i);case 5:return this.createText(t,e,s,i);case 13:return this.createCamera(t,e,s,i);case 99:return this.createPlaceHolder(t,e)}return this.createBase(t,e,s)},HybridRenderer.prototype.buildItems=function(t,e,s,i,a){var r,n=t.length;s||(s=this.elements),i||(i=this);var o,h,l=!1;for(r=n-1;r>=0;r--)e?s[r]=this.createItem(t[r],e,i,a):t[r].ddd?(l||(l=!0,o=this.getThreeDContainer()),s[r]=this.createItem(t[r],o,i,a)):(l=!1,s[r]=this.createItem(t[r],this.animationItem.resizerElem,i,a)),0===t[r].ty&&(h=[],this.buildItems(t[r].layers,s[r].getDomElement(),h,s[r],s[r].placeholder),s[r].setElements(h)),t[r].td&&s[r+1].setMatte(s[r].layerId);if(this.currentContainer=this.animationItem.resizerElem,!e&&this.threeDElements.length)if(this.camera)this.camera.setup();else{var p=this.globalData.compSize.w,m=this.globalData.compSize.h;for(n=this.threeDElements.length,r=0;n>r;r+=1)this.threeDElements[0][r].style.perspective=this.threeDElements[0][r].style.webkitPerspective=Math.sqrt(Math.pow(p,2)+Math.pow(m,2))+"px"}},HybridRenderer.prototype.includeLayers=function(t,e,s){var i,a=t.length;s||(s=this.elements),e||(e=this.currentContainer);var r,n,o,h=s.length;for(i=0;a>i;i+=1)if(t[i].id)for(r=0;h>r;)s[r].data.id==t[i].id&&(o=s[r],s[r]=this.createItem(t[i],e,this,o),0===t[i].ty&&(n=[],this.buildItems(t[i].layers,s[r].getDomElement(),n,s[r],s[i].placeholder),s[r].setElements(n))),r+=1;else{var l=this.createItem(t[i],e,this);s.push(l),0===t[i].ty&&(n=[],this.buildItems(t[i].layers,l.getDomElement(),n,l),l.setElements(n))}for(i=0;a>i;i+=1)t[i].td&&s[i+1].setMatte(s[i].layerId)},HybridRenderer.prototype.createBase=function(t,e,s,i){return new SVGBaseElement(t,e,this.globalData,s,i)},HybridRenderer.prototype.createPlaceHolder=function(t,e){return new PlaceHolderElement(t,e,this.globalData)},HybridRenderer.prototype.createShape=function(t,e,s,i){return s.isSvg?new IShapeElement(t,e,this.globalData,s,i):new HShapeElement(t,e,this.globalData,s,i)},HybridRenderer.prototype.createText=function(t,e,s,i){return s.isSvg?new SVGTextElement(t,e,this.globalData,s,i):new HTextElement(t,e,this.globalData,s,i)},HybridRenderer.prototype.createCamera=function(t,e,s,i){return this.camera=new HCameraElement(t,e,this.globalData,s,i),this.camera},HybridRenderer.prototype.createImage=function(t,e,s,i){return s.isSvg?new IImageElement(t,e,this.globalData,s,i):new HImageElement(t,e,this.globalData,s,i)},HybridRenderer.prototype.createComp=function(t,e,s,i){return s.isSvg?new ICompElement(t,e,this.globalData,s,i):new HCompElement(t,e,this.globalData,s,i)},HybridRenderer.prototype.createSolid=function(t,e,s,i){return s.isSvg?new ISolidElement(t,e,this.globalData,s,i):new HSolidElement(t,e,this.globalData,s,i)},HybridRenderer.prototype.getThreeDContainer=function(){var t=document.createElement("div");styleDiv(t),t.style.width=this.globalData.compSize.w+"px",t.style.height=this.globalData.compSize.h+"px",t.style.transformOrigin=t.style.mozTransformOrigin=t.style.webkitTransformOrigin="50% 50%";var e=document.createElement("div");return styleDiv(e),e.style.transform=e.style.webkitTransform="matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)",t.appendChild(e),this.animationItem.resizerElem.appendChild(t),this.threeDElements.push([t,e]),e},HybridRenderer.prototype.configAnimation=function(t){var e=document.createElement("div"),s=this.animationItem.wrapper;e.style.width=t.w+"px",e.style.height=t.h+"px",this.animationItem.resizerElem=e,styleDiv(e),e.style.transformStyle=e.style.webkitTransformStyle=e.style.mozTransformStyle="flat",s.appendChild(e),e.style.overflow="hidden";var i=document.createElementNS(svgNS,"svg");i.setAttribute("width","1"),i.setAttribute("height","1"),styleDiv(i),this.animationItem.resizerElem.appendChild(i);var a=document.createElementNS(svgNS,"defs");i.appendChild(a),this.globalData.defs=a,this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getPath=this.animationItem.getPath.bind(this.animationItem),this.globalData.elementLoaded=this.animationItem.elementLoaded.bind(this.animationItem),this.globalData.frameId=0,this.globalData.compSize={w:t.w,h:t.h},this.globalData.frameRate=t.fr,this.layers=t.layers,this.globalData.fontManager=new FontManager,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,i),this.updateContainerSize()},HybridRenderer.prototype.buildStage=function(t,e,s){var i,a,r=e.length;for(s||(s=this.elements),i=r-1;i>=0;i--)a=e[i],void 0!==a.parent&&this.buildItemParenting(a,s[i],e,a.parent,s,!0),0===a.ty&&this.buildStage(s[i].getComposingElement(),a.layers,s[i].getElements())},HybridRenderer.prototype.buildItemParenting=function(t,e,s,i,a,r){t.parents||(t.parents=[]),r&&e.resetHierarchy();for(var n=0,o=s.length;o>n;)s[n].ind==i&&(e.getHierarchy().push(a[n]),13===e.data.ty&&a[n].finalTransform.mProp.setInverted(),void 0!==s[n].parent&&this.buildItemParenting(t,e,s,s[n].parent,a,!1)),n+=1},HybridRenderer.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.animationItem.container=null,this.globalData.defs=null;var t,e=this.layers.length;for(t=0;e>t;t++)this.elements[t].destroy();this.elements.length=0,this.destroyed=!0},HybridRenderer.prototype.updateContainerSize=function(){var t,e,s,i,a=this.animationItem.wrapper.offsetWidth,r=this.animationItem.wrapper.offsetHeight,n=a/r,o=this.globalData.compSize.w/this.globalData.compSize.h;o>n?(t=a/this.globalData.compSize.w,e=a/this.globalData.compSize.w,s=0,i=(r-this.globalData.compSize.h*(a/this.globalData.compSize.w))/2):(t=r/this.globalData.compSize.h,e=r/this.globalData.compSize.h,s=(a-this.globalData.compSize.w*(r/this.globalData.compSize.h))/2,i=0),this.animationItem.resizerElem.style.transform=this.animationItem.resizerElem.style.webkitTransform="matrix3d("+t+",0,0,0,0,"+e+",0,0,0,0,1,0,"+s+","+i+",0,1)"},HybridRenderer.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;var e,s=this.layers.length;for(e=0;s>e;e++)this.elements[e].prepareFrame(t-this.layers[e].st);for(e=0;s>e;e++)this.elements[e].renderFrame()}},HybridRenderer.prototype.hide=function(){this.animationItem.resizerElem.style.display="none"},HybridRenderer.prototype.show=function(){this.animationItem.resizerElem.style.display="block"},extendPrototype(ExpressionComp,HybridRenderer),MaskElement.prototype.getMaskProperty=function(t){return this.viewData[t].prop},MaskElement.prototype.prepareFrame=function(){var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue()},MaskElement.prototype.renderFrame=function(){var t,e=this.masksProperties.length;for(t=0;e>t;t++)if("n"!==this.masksProperties[t].mode&&this.masksProperties[t].cl!==!1&&((this.viewData[t].prop.mdf||this.firstFrame)&&this.drawPath(this.masksProperties[t],this.viewData[t].prop.v,this.viewData[t]),this.storedData[t].x&&(this.storedData[t].x.mdf||this.firstFrame))){var s=this.storedData[t].expan;this.storedData[t].x.v<0?("erode"!==this.storedData[t].lastOperator&&(this.storedData[t].lastOperator="erode",this.storedData[t].elem.setAttribute("filter","url(#"+this.storedData[t].filterId+")")),s.setAttribute("radius",-this.storedData[t].x.v)):("dilate"!==this.storedData[t].lastOperator&&(this.storedData[t].lastOperator="dilate",this.storedData[t].elem.setAttribute("filter",null)),this.storedData[t].elem.setAttribute("stroke-width",2*this.storedData[t].x.v))}this.firstFrame=!1},MaskElement.prototype.getMaskelement=function(){return this.maskElement},MaskElement.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+" "},MaskElement.prototype.drawPath=function(t,e,s){var i,a,r="";for(a=e.v.length,i=1;a>i;i+=1)1==i&&(r+=" M"+bm_rnd(e.v[0][0])+","+bm_rnd(e.v[0][1])),r+=" C"+bm_rnd(e.o[i-1][0])+","+bm_rnd(e.o[i-1][1])+" "+bm_rnd(e.i[i][0])+","+bm_rnd(e.i[i][1])+" "+bm_rnd(e.v[i][0])+","+bm_rnd(e.v[i][1]);t.cl&&(r+=" C"+bm_rnd(e.o[i-1][0])+","+bm_rnd(e.o[i-1][1])+" "+bm_rnd(e.i[0][0])+","+bm_rnd(e.i[0][1])+" "+bm_rnd(e.v[0][0])+","+bm_rnd(e.v[0][1])),s.lastPath!==r&&(t.inv?s.elem.setAttribute("d",this.solidPath+r):s.elem.setAttribute("d",r),s.lastPath=r)},MaskElement.prototype.getMask=function(t){for(var e=0,s=this.masksProperties.length;s>e;){if(this.masksProperties[e].nm===t)return{maskPath:this.viewData[e].prop.pv};e+=1}},MaskElement.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.paths=null,this.masksProperties=null},SliderEffect.prototype.proxyFunction=function(){return this.p.v},AngleEffect.prototype.proxyFunction=SliderEffect.prototype.proxyFunction,ColorEffect.prototype.proxyFunction=SliderEffect.prototype.proxyFunction,PointEffect.prototype.proxyFunction=SliderEffect.prototype.proxyFunction,CheckboxEffect.prototype.proxyFunction=SliderEffect.prototype.proxyFunction,EffectsManager.prototype.getEffect=function(t){for(var e=this.data.ef,s=0,i=e.length;i>s;){if(e[s].nm===t)return this.effectElements[s];s+=1}},BaseElement.prototype.checkMasks=function(){if(!this.data.hasMask)return!1;for(var t=0,e=this.data.masksProperties.length;e>t;){if("n"!==this.data.masksProperties[t].mode&&this.data.masksProperties[t].cl!==!1)return!0;t+=1}return!1},BaseElement.prototype.prepareFrame=function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?this.isVisible!==!0&&(this.isVisible=!0,this.firstFrame=!0,this.data.hasMask&&(this.maskManager.firstFrame=!0)):this.isVisible!==!1&&(this.isVisible=!1);var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t);return this.data.hasMask&&this.maskManager.prepareFrame(t),this.currentFrameNum=t,this.isVisible},BaseElement.prototype.init=function(){this.hidden=!1,this.firstFrame=!0,this.isVisible=!1,this.dynamicProperties=[],this.currentFrameNum=-99999,this.lastNum=-99999,this.data.ef&&(this.effectsManager=new EffectsManager(this.data,this,this.dynamicProperties),this.effect=this.effectsManager.getEffect.bind(this.effectsManager)),this.finalTransform={mProp:PropertyFactory.getProp(this,this.data.ks,2,null,this.dynamicProperties),matMdf:!1,opMdf:!1,mat:new Matrix,opacity:1},this.finalTransform.op=this.finalTransform.mProp.o,this.transform=this.finalTransform.mProp,this.createElements(),this.data.hasMask&&this.addMasks(this.data)},BaseElement.prototype.getType=function(){return this.type},BaseElement.prototype.resetHierarchy=function(){this.hierarchy?this.hierarchy.length=0:this.hierarchy=[]},BaseElement.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},BaseElement.prototype.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}},BaseElement.prototype.hide=function(){},BaseElement.prototype.mHelper=new Matrix,BaseElement.prototype.mask=function(t){return this.maskManager.getMask(t)},extendPrototype(LayerInterface,BaseElement),Object.defineProperty(BaseElement.prototype,"anchorPoint",{get:function(){return this.finalTransform.mProp.anchorPoint}}),createElement(BaseElement,SVGBaseElement),SVGBaseElement.prototype.appendNodeToParent=function(t){if(this.placeholder){var e=this.placeholder.phElement;e.parentNode.insertBefore(t,e)}else this.parentContainer.appendChild(t)},SVGBaseElement.prototype.createElements=function(){if(this.data.td){if(3==this.data.td)this.layerElement=document.createElementNS(svgNS,"mask"),this.layerElement.setAttribute("id",this.layerId),this.layerElement.setAttribute("mask-type","luminance"),this.globalData.defs.appendChild(this.layerElement);else if(2==this.data.td){var t=document.createElementNS(svgNS,"mask");t.setAttribute("id",this.layerId),t.setAttribute("mask-type","alpha");var e=document.createElementNS(svgNS,"g");

t.appendChild(e),this.layerElement=document.createElementNS(svgNS,"g");var s=document.createElementNS(svgNS,"filter"),i=randomString(10);s.setAttribute("id",i),s.setAttribute("filterUnits","objectBoundingBox"),s.setAttribute("x","0%"),s.setAttribute("y","0%"),s.setAttribute("width","100%"),s.setAttribute("height","100%");var a=document.createElementNS(svgNS,"feComponentTransfer");a.setAttribute("in","SourceGraphic"),s.appendChild(a);var r=document.createElementNS(svgNS,"feFuncA");r.setAttribute("type","table"),r.setAttribute("tableValues","1.0 0.0"),a.appendChild(r),this.globalData.defs.appendChild(s);var n=document.createElementNS(svgNS,"rect");n.setAttribute("width","100%"),n.setAttribute("height","100%"),n.setAttribute("x","0"),n.setAttribute("y","0"),n.setAttribute("fill","#ffffff"),n.setAttribute("opacity","0"),e.setAttribute("filter","url(#"+i+")"),e.appendChild(n),e.appendChild(this.layerElement),this.globalData.defs.appendChild(t)}else{this.layerElement=document.createElementNS(svgNS,"g");var o=document.createElementNS(svgNS,"mask");o.setAttribute("id",this.layerId),o.setAttribute("mask-type","alpha"),o.appendChild(this.layerElement),this.globalData.defs.appendChild(o)}this.data.hasMask&&(this.maskedElement=this.layerElement)}else this.data.hasMask?(this.layerElement=document.createElementNS(svgNS,"g"),this.data.tt?(this.matteElement=document.createElementNS(svgNS,"g"),this.matteElement.appendChild(this.layerElement),this.appendNodeToParent(this.matteElement)):this.appendNodeToParent(this.layerElement),this.maskedElement=this.layerElement):this.data.tt?(this.matteElement=document.createElementNS(svgNS,"g"),this.matteElement.setAttribute("id",this.layerId),this.appendNodeToParent(this.matteElement),this.layerElement=this.matteElement):this.layerElement=this.parentContainer;!this.data.ln||4!==this.data.ty&&0!==this.data.ty||(this.layerElement===this.parentContainer&&(this.layerElement=document.createElementNS(svgNS,"g"),this.appendNodeToParent(this.layerElement)),this.layerElement.setAttribute("id",this.data.ln)),this.layerElement!==this.parentContainer&&(this.placeholder=null)},SVGBaseElement.prototype.renderFrame=function(t){if(3===this.data.ty)return!1;if(this.currentFrameNum===this.lastNum||!this.isVisible)return this.isVisible;this.lastNum=this.currentFrameNum,this.data.hasMask&&this.maskManager.renderFrame(),this.finalTransform.opMdf=this.finalTransform.op.mdf,this.finalTransform.matMdf=this.finalTransform.mProp.mdf,this.finalTransform.opacity=this.finalTransform.op.v,this.firstFrame&&(this.finalTransform.opMdf=!0,this.finalTransform.matMdf=!0);var e,s=this.finalTransform.mat;if(this.hierarchy){var i,a=this.hierarchy.length;for(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e),i=0;a>i;i+=1)this.finalTransform.matMdf=this.hierarchy[i].finalTransform.mProp.mdf?!0:this.finalTransform.matMdf,e=this.hierarchy[i].finalTransform.mProp.v.props,s.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])}else this.isVisible&&(t?(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e)):s.cloneFromProps(this.finalTransform.mProp.v.props));return t&&(e=t.mat.props,s.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.finalTransform.opacity*=t.opacity,this.finalTransform.opMdf=t.opMdf?!0:this.finalTransform.opMdf,this.finalTransform.matMdf=t.matMdf?!0:this.finalTransform.matMdf),this.data.hasMask&&(this.finalTransform.matMdf&&this.layerElement.setAttribute("transform",s.to2dCSS()),this.finalTransform.opMdf&&this.layerElement.setAttribute("opacity",this.finalTransform.opacity)),this.isVisible},SVGBaseElement.prototype.destroy=function(){this.layerElement=null,this.parentContainer=null,this.matteElement&&(this.matteElement=null),this.maskManager&&this.maskManager.destroy()},SVGBaseElement.prototype.getDomElement=function(){return this.layerElement},SVGBaseElement.prototype.addMasks=function(t){this.maskManager=new MaskElement(t,this,this.globalData)},SVGBaseElement.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url(#"+t+")")},SVGBaseElement.prototype.hide=function(){},ITextElement.prototype.init=function(){this.parent.init.call(this),this.lettersChangedFlag=!1;var t=this.data;this.renderedLetters=Array.apply(null,{length:t.t.d.l.length}),this.viewData={m:{a:PropertyFactory.getProp(this,t.t.m.a,1,0,this.dynamicProperties)}};var e=this.data.t;if(e.a.length){this.viewData.a=Array.apply(null,{length:e.a.length});var s,i,a,r=e.a.length;for(s=0;r>s;s+=1)a=e.a[s],i={a:{},s:{}},"r"in a.a&&(i.a.r=PropertyFactory.getProp(this,a.a.r,0,degToRads,this.dynamicProperties)),"rx"in a.a&&(i.a.rx=PropertyFactory.getProp(this,a.a.rx,0,degToRads,this.dynamicProperties)),"ry"in a.a&&(i.a.ry=PropertyFactory.getProp(this,a.a.ry,0,degToRads,this.dynamicProperties)),"sk"in a.a&&(i.a.sk=PropertyFactory.getProp(this,a.a.sk,0,degToRads,this.dynamicProperties)),"sa"in a.a&&(i.a.sa=PropertyFactory.getProp(this,a.a.sa,0,degToRads,this.dynamicProperties)),"s"in a.a&&(i.a.s=PropertyFactory.getProp(this,a.a.s,1,.01,this.dynamicProperties)),"a"in a.a&&(i.a.a=PropertyFactory.getProp(this,a.a.a,1,0,this.dynamicProperties)),"o"in a.a&&(i.a.o=PropertyFactory.getProp(this,a.a.o,0,.01,this.dynamicProperties)),"p"in a.a&&(i.a.p=PropertyFactory.getProp(this,a.a.p,1,0,this.dynamicProperties)),"sw"in a.a&&(i.a.sw=PropertyFactory.getProp(this,a.a.sw,0,0,this.dynamicProperties)),"sc"in a.a&&(i.a.sc=PropertyFactory.getProp(this,a.a.sc,1,0,this.dynamicProperties)),"fc"in a.a&&(i.a.fc=PropertyFactory.getProp(this,a.a.fc,1,0,this.dynamicProperties)),"fh"in a.a&&(i.a.fh=PropertyFactory.getProp(this,a.a.fh,0,0,this.dynamicProperties)),"fs"in a.a&&(i.a.fs=PropertyFactory.getProp(this,a.a.fs,0,.01,this.dynamicProperties)),"fb"in a.a&&(i.a.fb=PropertyFactory.getProp(this,a.a.fb,0,.01,this.dynamicProperties)),"t"in a.a&&(i.a.t=PropertyFactory.getProp(this,a.a.t,0,0,this.dynamicProperties)),i.s=PropertyFactory.getTextSelectorProp(this,a.s,this.dynamicProperties),i.s.t=a.s.t,this.viewData.a[s]=i}else this.viewData.a=[];e.p&&"m"in e.p?(this.viewData.p={f:PropertyFactory.getProp(this,e.p.f,0,0,this.dynamicProperties),l:PropertyFactory.getProp(this,e.p.l,0,0,this.dynamicProperties),r:e.p.r,m:this.maskManager.getMaskProperty(e.p.m)},this.maskPath=!0):this.maskPath=!1},ITextElement.prototype.createPathShape=function(t,e){var s,i,a,r,n=e.length,o="";for(s=0;n>s;s+=1){for(a=e[s].ks.k.i.length,r=e[s].ks.k,i=1;a>i;i+=1)1==i&&(o+=" M"+t.applyToPointStringified(r.v[0][0],r.v[0][1])),o+=" C"+t.applyToPointStringified(r.o[i-1][0],r.o[i-1][1])+" "+t.applyToPointStringified(r.i[i][0],r.i[i][1])+" "+t.applyToPointStringified(r.v[i][0],r.v[i][1]);o+=" C"+t.applyToPointStringified(r.o[i-1][0],r.o[i-1][1])+" "+t.applyToPointStringified(r.i[0][0],r.i[0][1])+" "+t.applyToPointStringified(r.v[0][0],r.v[0][1]),o+="z"}return o},ITextElement.prototype.getMeasures=function(){var t,e,s,i,a=this.mHelper,r=this.renderType,n=this.data,o=n.t.d,h=o.l;if(this.maskPath){var l=this.viewData.p.m;if(!this.viewData.p.n||this.viewData.p.mdf){var p=l.v;this.viewData.p.r&&(p=reversePath(p,l.closed));var m={tLength:0,segments:[]};i=p.v.length-1;var f,d=0;for(s=0;i>s;s+=1)f={s:p.v[s],e:p.v[s+1],to:[p.o[s][0]-p.v[s][0],p.o[s][1]-p.v[s][1]],ti:[p.i[s+1][0]-p.v[s+1][0],p.i[s+1][1]-p.v[s+1][1]]},bez.buildBezierData(f),m.tLength+=f.bezierData.segmentLength,m.segments.push(f),d+=f.bezierData.segmentLength;s=i,l.closed&&(f={s:p.v[s],e:p.v[0],to:[p.o[s][0]-p.v[s][0],p.o[s][1]-p.v[s][1]],ti:[p.i[0][0]-p.v[0][0],p.i[0][1]-p.v[0][1]]},bez.buildBezierData(f),m.tLength+=f.bezierData.segmentLength,m.segments.push(f),d+=f.bezierData.segmentLength),this.viewData.p.pi=m}var c,u,y,m=this.viewData.p.pi,v=this.viewData.p.f.v,g=0,b=1,E=0,P=!0,k=m.segments;if(0>v&&l.closed)for(m.tLength<Math.abs(v)&&(v=-Math.abs(v)%m.tLength),g=k.length-1,y=k[g].bezierData.points,b=y.length-1;0>v;)v+=y[b].partialLength,b-=1,0>b&&(g-=1,y=k[g].bezierData.points,b=y.length-1);y=k[g].bezierData.points,u=y[b-1],c=y[b];var S,C,x=c.partialLength}i=h.length,t=0,e=0;var w,D,T,M,I,F=1.2*n.t.d.s*.714,A=!0,V=this.viewData,N=Array.apply(null,{length:i});this.lettersChangedFlag=!1,M=V.a.length;var L,B,_,H,R,z,O,j,G,W,X,q,Y,Z,J,U,K=-1,Q=v,$=g,tt=b,et=-1,st=0;for(s=0;i>s;s+=1)if(a.reset(),z=1,h[s].n)t=0,e+=o.yOffset,e+=A?1:0,v=Q,A=!1,st=0,this.maskPath&&(g=$,b=tt,y=k[g].bezierData.points,u=y[b-1],c=y[b],x=c.partialLength,E=0),N[s]=this.emptyProp;else{if(this.maskPath){if(et!==h[s].line){switch(o.j){case 1:v+=d-o.lineWidths[h[s].line];break;case 2:v+=(d-o.lineWidths[h[s].line])/2}et=h[s].line}K!==h[s].ind&&(h[K]&&(v+=h[K].extra),v+=h[s].an/2,K=h[s].ind),v+=V.m.a.v[0]*h[s].an/200;var it=0;for(T=0;M>T;T+=1)w=V.a[T].a,"p"in w&&(D=V.a[T].s,B=D.getMult(h[s].anIndexes[T]),it+=B.length?w.p.v[0]*B[0]:w.p.v[0]*B);for(P=!0;P;)E+x>=v+it||!y?(S=(v+it-E)/c.partialLength,H=u.point[0]+(c.point[0]-u.point[0])*S,R=u.point[1]+(c.point[1]-u.point[1])*S,a.translate(0,-(V.m.a.v[1]*F/100)+e),P=!1):y&&(E+=c.partialLength,b+=1,b>=y.length&&(b=0,g+=1,k[g]?y=k[g].bezierData.points:l.closed?(b=0,g=0,y=k[g].bezierData.points):(E-=c.partialLength,y=null)),y&&(u=c,c=y[b],x=c.partialLength));_=h[s].an/2-h[s].add,a.translate(-_,0,0)}else _=h[s].an/2-h[s].add,a.translate(-_,0,0),a.translate(-V.m.a.v[0]*h[s].an/200,-V.m.a.v[1]*F/100,0);for(st+=h[s].l/2,T=0;M>T;T+=1)w=V.a[T].a,"t"in w&&(D=V.a[T].s,B=D.getMult(h[s].anIndexes[T]),this.maskPath?v+=B.length?w.t*B[0]:w.t*B:t+=B.length?w.t.v*B[0]:w.t.v*B);for(st+=h[s].l/2,o.strokeWidthAnim&&(j=n.t.d.sw||0),o.strokeColorAnim&&(O=n.t.d.sc?[n.t.d.sc[0],n.t.d.sc[1],n.t.d.sc[2]]:[0,0,0]),o.fillColorAnim&&(G=[n.t.d.fc[0],n.t.d.fc[1],n.t.d.fc[2]]),T=0;M>T;T+=1)w=V.a[T].a,"a"in w&&(D=V.a[T].s,B=D.getMult(h[s].anIndexes[T]),B.length?a.translate(-w.a.v[0]*B[0],-w.a.v[1]*B[1],w.a.v[2]*B[2]):a.translate(-w.a.v[0]*B,-w.a.v[1]*B,w.a.v[2]*B));for(T=0;M>T;T+=1)w=V.a[T].a,"s"in w&&(D=V.a[T].s,B=D.getMult(h[s].anIndexes[T]),B.length?a.scale(1+(w.s.v[0]-1)*B[0],1+(w.s.v[1]-1)*B[1],1):a.scale(1+(w.s.v[0]-1)*B,1+(w.s.v[1]-1)*B,1));for(T=0;M>T;T+=1){if(w=V.a[T].a,D=V.a[T].s,B=D.getMult(h[s].anIndexes[T]),"sk"in w&&(B.length?a.skewFromAxis(-w.sk.v*B[0],w.sa.v*B[1]):a.skewFromAxis(-w.sk.v*B,w.sa.v*B)),"r"in w&&a.rotateZ(B.length?-w.r.v*B[2]:-w.r.v*B),"ry"in w&&a.rotateY(B.length?w.ry.v*B[1]:w.ry.v*B),"rx"in w&&a.rotateX(B.length?w.rx.v*B[0]:w.rx.v*B),"o"in w&&(z+=B.length?(w.o.v*B[0]-z)*B[0]:(w.o.v*B-z)*B),o.strokeWidthAnim&&"sw"in w&&(j+=B.length?w.sw.v*B[0]:w.sw.v*B),o.strokeColorAnim&&"sc"in w)for(W=0;3>W;W+=1)O[W]=Math.round(B.length?O[W]+(w.sc.v[W]-O[W])*B[0]:O[W]+(w.sc.v[W]-O[W])*B);if(o.fillColorAnim){if("fc"in w)for(W=0;3>W;W+=1)G[W]=Math.round(B.length?G[W]+(w.fc.v[W]-G[W])*B[0]:G[W]+(w.fc.v[W]-G[W])*B);"fh"in w&&(G=B.length?addHueToRGB(G,w.fh.v*B[0]):addHueToRGB(G,w.fh.v*B)),"fs"in w&&(G=B.length?addSaturationToRGB(G,w.fs.v*B[0]):addSaturationToRGB(G,w.fs.v*B)),"fb"in w&&(G=B.length?addBrightnessToRGB(G,w.fb.v*B[0]):addBrightnessToRGB(G,w.fb.v*B))}}for(T=0;M>T;T+=1)w=V.a[T].a,"p"in w&&(D=V.a[T].s,B=D.getMult(h[s].anIndexes[T]),this.maskPath?B.length?a.translate(0,w.p.v[1]*B[0],-w.p.v[2]*B[1]):a.translate(0,w.p.v[1]*B,-w.p.v[2]*B):B.length?a.translate(w.p.v[0]*B[0],w.p.v[1]*B[1],-w.p.v[2]*B[2]):a.translate(w.p.v[0]*B,w.p.v[1]*B,-w.p.v[2]*B));if(o.strokeWidthAnim&&(X=0>j?0:j),o.strokeColorAnim&&(q="rgb("+O[0]+","+O[1]+","+O[2]+")"),o.fillColorAnim&&(Y="rgb("+G[0]+","+G[1]+","+G[2]+")"),this.maskPath){if(n.t.p.p){C=(c.point[1]-u.point[1])/(c.point[0]-u.point[0]);var at=180*Math.atan(C)/Math.PI;c.point[0]<u.point[0]&&(at+=180),a.rotate(-at*Math.PI/180)}a.translate(H,R,0),a.translate(V.m.a.v[0]*h[s].an/200,V.m.a.v[1]*F/100,0),v-=V.m.a.v[0]*h[s].an/200,h[s+1]&&K!==h[s+1].ind&&(v+=h[s].an/2,v+=o.tr/1e3*n.t.d.s)}else{switch(a.translate(t,e,0),o.ps&&a.translate(o.ps[0],o.ps[1]+o.ascent,0),o.j){case 1:a.translate(o.justifyOffset+(o.boxWidth-o.lineWidths[h[s].line]),0,0);break;case 2:a.translate(o.justifyOffset+(o.boxWidth-o.lineWidths[h[s].line])/2,0,0)}a.translate(_,0,0),a.translate(V.m.a.v[0]*h[s].an/200,V.m.a.v[1]*F/100,0),t+=h[s].l+o.tr/1e3*n.t.d.s}"html"===r?Z=a.toCSS():"svg"===r?Z=a.to2dCSS():J=[a.props[0],a.props[1],a.props[2],a.props[3],a.props[4],a.props[5],a.props[6],a.props[7],a.props[8],a.props[9],a.props[10],a.props[11],a.props[12],a.props[13],a.props[14],a.props[15]],U=z,L=this.renderedLetters[s],!L||L.o===U&&L.sw===X&&L.sc===q&&L.fc===Y?"svg"!==r&&"html"!==r||L&&L.m===Z?"canvas"!==r||L&&L.props[0]===J[0]&&L.props[1]===J[1]&&L.props[4]===J[4]&&L.props[5]===J[5]&&L.props[12]===J[12]&&L.props[13]===J[13]?I=L:(this.lettersChangedFlag=!0,I=new LetterProps(U,X,q,Y,null,J)):(this.lettersChangedFlag=!0,I=new LetterProps(U,X,q,Y,Z)):(this.lettersChangedFlag=!0,I=new LetterProps(U,X,q,Y,Z,J)),this.renderedLetters[s]=I}},ITextElement.prototype.emptyProp=new LetterProps,createElement(SVGBaseElement,SVGTextElement),SVGTextElement.prototype.init=ITextElement.prototype.init,SVGTextElement.prototype.createPathShape=ITextElement.prototype.createPathShape,SVGTextElement.prototype.getMeasures=ITextElement.prototype.getMeasures,SVGTextElement.prototype.createElements=function(){this.parent.createElements.call(this);var t=this.data.t.d;this.innerElem=document.createElementNS(svgNS,"g"),t.fc?this.innerElem.setAttribute("fill","rgb("+t.fc[0]+","+t.fc[1]+","+t.fc[2]+")"):this.innerElem.setAttribute("fill","rgba(0,0,0,0)"),t.sc&&(this.innerElem.setAttribute("stroke","rgb("+t.sc[0]+","+t.sc[1]+","+t.sc[2]+")"),this.innerElem.setAttribute("stroke-width",t.sw)),this.innerElem.setAttribute("font-size",t.s);var e=this.globalData.fontManager.getFontByName(t.f);if(e.fClass)this.innerElem.setAttribute("class",e.fClass);else{this.innerElem.setAttribute("font-family",e.fFamily);var s=t.fWeight,i=t.fStyle;this.innerElem.setAttribute("font-style",i),this.innerElem.setAttribute("font-weight",s)}var a,r;this.layerElement===this.parentContainer?this.appendNodeToParent(this.innerElem):this.layerElement.appendChild(this.innerElem);var n=t.l;if(r=n.length){var o,h,l=this.mHelper,p="",m=this.data.singleShape;if(m)var f=0,d=0,c=t.lineWidths,u=t.boxWidth,y=!0;for(a=0;r>a;a+=1){if(this.globalData.fontManager.chars?m&&0!==a||(o=document.createElementNS(svgNS,"path")):o=document.createElementNS(svgNS,"text"),o.setAttribute("stroke-linecap","butt"),o.setAttribute("stroke-linejoin","round"),o.setAttribute("stroke-miterlimit","4"),m&&n[a].n&&(f=0,d+=t.yOffset,d+=y?1:0,y=!1),l.reset(),this.globalData.fontManager.chars&&l.scale(t.s/100,t.s/100),m){switch(t.ps&&l.translate(t.ps[0],t.ps[1]+t.ascent,0),t.j){case 1:l.translate(t.justifyOffset+(u-c[n[a].line]),0,0);break;case 2:l.translate(t.justifyOffset+(u-c[n[a].line])/2,0,0)}l.translate(f,d,0)}if(this.globalData.fontManager.chars){var v,g=this.globalData.fontManager.getCharData(t.t.charAt(a),e.fStyle,this.globalData.fontManager.getFontByName(t.f).fFamily);v=g?g.data:null,v&&v.shapes&&(h=v.shapes[0].it,m||(p=""),p+=this.createPathShape(l,h),m||o.setAttribute("d",p)),m||this.innerElem.appendChild(o)}else o.textContent=n[a].val,o.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),this.innerElem.appendChild(o),m&&o.setAttribute("transform",l.to2dCSS());m&&(f+=n[a].l),this.textSpans.push(o)}m&&this.globalData.fontManager.chars&&(o.setAttribute("d",p),this.innerElem.appendChild(o))}},SVGTextElement.prototype.hide=function(){this.hidden||(this.innerElem.style.display="none",this.hidden=!0)},SVGTextElement.prototype.renderFrame=function(t){var e=this.parent.renderFrame.call(this,t);if(e===!1)return void this.hide();if(this.hidden&&(this.hidden=!1,this.innerElem.style.display="block"),this.data.hasMask||(this.finalTransform.matMdf&&this.innerElem.setAttribute("transform",this.finalTransform.mat.to2dCSS()),this.finalTransform.opMdf&&this.innerElem.setAttribute("opacity",this.finalTransform.opacity)),!this.data.singleShape&&(this.getMeasures(),this.lettersChangedFlag)){var s,i,a=this.renderedLetters,r=this.data.t.d.l;i=r.length;var n;for(s=0;i>s;s+=1)r[s].n||(n=a[s],this.textSpans[s].setAttribute("transform",n.m),this.textSpans[s].setAttribute("opacity",n.o),n.sw&&this.textSpans[s].setAttribute("stroke-width",n.sw),n.sc&&this.textSpans[s].setAttribute("stroke",n.sc),n.fc&&this.textSpans[s].setAttribute("fill",n.fc));this.firstFrame&&(this.firstFrame=!1)}},SVGTextElement.prototype.destroy=function(){this.parent.destroy.call(),this.innerElem=null};var PlaceHolderElement=function(t,e,s){if(this.data=t,this.globalData=s,e){this.parentContainer=e;var i=document.createElementNS(svgNS,"g");i.setAttribute("id",this.data.id),e.appendChild(i),this.phElement=i}this.layerId="ly_"+randomString(10)};PlaceHolderElement.prototype.prepareFrame=function(){},PlaceHolderElement.prototype.renderFrame=function(){},PlaceHolderElement.prototype.draw=function(){},createElement(SVGBaseElement,ICompElement),extendPrototype(ExpressionComp,ICompElement),ICompElement.prototype.getComposingElement=function(){return this.layerElement},ICompElement.prototype.hide=function(){if(!this.hidden){var t,e=this.elements.length;for(t=0;e>t;t+=1)this.elements[t].hide();this.hidden=!0}},ICompElement.prototype.prepareFrame=function(t){if(this.parent.prepareFrame.call(this,t),this.isVisible!==!1){var e=t;this.tm&&(e=this.tm.v,e===this.data.op&&(e=this.data.op-1)),this.renderedFrame=e;var s,i=this.elements.length;for(s=0;i>s;s+=1)this.elements[s].prepareFrame(e-this.layers[s].st)}},ICompElement.prototype.renderFrame=function(t){var e,s=this.parent.renderFrame.call(this,t),i=this.layers.length;if(s===!1)return void this.hide();for(this.hidden=!1,e=0;i>e;e+=1)this.data.hasMask?this.elements[e].renderFrame():this.elements[e].renderFrame(this.finalTransform);this.firstFrame&&(this.firstFrame=!1)},ICompElement.prototype.setElements=function(t){this.elements=t},ICompElement.prototype.getElements=function(){return this.elements},ICompElement.prototype.destroy=function(){this.parent.destroy.call();var t,e=this.layers.length;for(t=0;e>t;t+=1)this.elements[t].destroy()},createElement(SVGBaseElement,IImageElement),IImageElement.prototype.createElements=function(){var t=this,e=function(){t.innerElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t.path+t.assetData.p),t.maskedElement=t.innerElem},s=new Image;s.addEventListener("load",e,!1),s.addEventListener("error",e,!1),s.src=this.path+this.assetData.p,this.parent.createElements.call(this),this.innerElem=document.createElementNS(svgNS,"image"),this.innerElem.setAttribute("width",this.assetData.w+"px"),this.innerElem.setAttribute("height",this.assetData.h+"px"),this.layerElement===this.parentContainer?this.appendNodeToParent(this.innerElem):this.layerElement.appendChild(this.innerElem),this.data.ln&&this.innerElem.setAttribute("id",this.data.ln)},IImageElement.prototype.hide=function(){this.hidden||(this.innerElem.setAttribute("visibility","hidden"),this.hidden=!0)},IImageElement.prototype.renderFrame=function(t){var e=this.parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.hidden&&(this.hidden=!1,this.innerElem.setAttribute("visibility","visible")),this.data.hasMask||((this.finalTransform.matMdf||this.firstFrame)&&this.innerElem.setAttribute("transform",this.finalTransform.mat.to2dCSS()),(this.finalTransform.opMdf||this.firstFrame)&&this.innerElem.setAttribute("opacity",this.finalTransform.opacity)),void(this.firstFrame&&(this.firstFrame=!1)))},IImageElement.prototype.destroy=function(){this.parent.destroy.call(),this.innerElem=null},createElement(SVGBaseElement,IShapeElement),IShapeElement.prototype.lcEnum={1:"butt",2:"round",3:"butt"},IShapeElement.prototype.ljEnum={1:"miter",2:"round",3:"butt"},IShapeElement.prototype.transformHelper={opacity:1,mat:new Matrix,matMdf:!1,opMdf:!1},IShapeElement.prototype.createElements=function(){this.parent.createElements.call(this),this.searchShapes(this.shapesData,this.viewData,this.dynamicProperties,[]),this.layerElement.appendChild(this.shapesContainer),styleUnselectableDiv(this.layerElement),styleUnselectableDiv(this.shapesContainer),this.buildExpressionInterface()},IShapeElement.prototype.searchShapes=function(t,e,s,i){var a,r,n,o=t.length-1,h=[],l=[];for(a=o;a>=0;a-=1)if("fl"==t[a].ty||"st"==t[a].ty){e[a]={};var p;if(e[a].c=PropertyFactory.getProp(this,t[a].c,1,null,s),e[a].o=PropertyFactory.getProp(this,t[a].o,0,.01,s),"st"==t[a].ty){if(p=document.createElementNS(svgNS,"g"),p.style.strokeLinecap=this.lcEnum[t[a].lc]||"round",p.style.strokeLinejoin=this.ljEnum[t[a].lj]||"round",p.style.fillOpacity=0,1==t[a].lj&&(p.style.strokeMiterlimit=t[a].ml),e[a].c.k||(p.style.stroke="rgb("+e[a].c.v[0]+","+e[a].c.v[1]+","+e[a].c.v[2]+")"),e[a].o.k||(p.style.strokeOpacity=e[a].o.v),e[a].w=PropertyFactory.getProp(this,t[a].w,0,null,s),e[a].w.k||(p.style.strokeWidth=e[a].w.v),t[a].d){var m=PropertyFactory.getDashProp(this,t[a].d,"svg",s);m.k||(p.style.strokeDasharray=m.dasharray,p.style.strokeDashoffset=m.dashoffset),e[a].d=m}}else p=document.createElementNS(svgNS,"path"),e[a].c.k||(p.style.fill="rgb("+e[a].c.v[0]+","+e[a].c.v[1]+","+e[a].c.v[2]+")"),e[a].o.k||(p.style.fillOpacity=e[a].o.v);this.shapesContainer.appendChild(p),this.stylesList.push({pathElement:p,type:t[a].ty,d:"",ld:"",mdf:!1}),e[a].style=this.stylesList[this.stylesList.length-1],h.push(e[a].style)}else if("gr"==t[a].ty)e[a]={it:[]},this.searchShapes(t[a].it,e[a].it,s,i);else if("tr"==t[a].ty)e[a]={transform:{mat:new Matrix,opacity:1,matMdf:!1,opMdf:!1,op:PropertyFactory.getProp(this,t[a].o,0,.01,s),mProps:PropertyFactory.getProp(this,t[a],2,null,s)},elements:[]};else if("sh"==t[a].ty||"rc"==t[a].ty||"el"==t[a].ty||"sr"==t[a].ty){e[a]={elements:[],styles:[],lStr:""};var f=4;"rc"==t[a].ty?f=5:"el"==t[a].ty?f=6:"sr"==t[a].ty&&(f=7),i.length&&(t[a].trimmed=!0),e[a].sh=PropertyFactory.getShapeProp(this,t[a],f,s,i),n=this.stylesList.length;var d,c=!1,u=!1;for(r=0;n>r;r+=1)this.stylesList[r].closed||("st"===this.stylesList[r].type?(c=!0,d=document.createElementNS(svgNS,"path"),this.stylesList[r].pathElement.appendChild(d),e[a].elements.push({ty:this.stylesList[r].type,el:d})):(u=!0,e[a].elements.push({ty:this.stylesList[r].type,st:this.stylesList[r]})));e[a].st=c,e[a].fl=u}else if("tm"==t[a].ty){var y={closed:!1,trimProp:PropertyFactory.getProp(this,t[a],7,null,s)};e[a]={tr:y.trimProp},i.push(y),l.push(y)}for(o=h.length,a=0;o>a;a+=1)h[a].closed=!0;for(o=l.length,a=0;o>a;a+=1)l[a].closed=!0},IShapeElement.prototype.renderFrame=function(t){var e=this.parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.hidden=!1,this.finalTransform.matMdf&&!this.data.hasMask&&this.shapesContainer.setAttribute("transform",this.finalTransform.mat.to2dCSS()),this.transformHelper.opacity=this.finalTransform.opacity,this.transformHelper.matMdf=!1,this.transformHelper.opMdf=this.finalTransform.opMdf,void this.renderShape(this.transformHelper,null,null,!0))},IShapeElement.prototype.hide=function(){if(!this.hidden){var t,e=this.stylesList.length;for(t=e-1;t>=0;t-=1)"0"!==this.stylesList[t].ld&&(this.stylesList[t].ld="0",this.stylesList[t].pathElement.style.display="none",this.stylesList[t].pathElement.parentNode&&(this.stylesList[t].parent=this.stylesList[t].pathElement.parentNode));this.hidden=!0}},IShapeElement.prototype.renderShape=function(t,e,s,i){var a,r;if(!e)for(e=this.shapesData,r=this.stylesList.length,a=0;r>a;a+=1)this.stylesList[a].d="",this.stylesList[a].mdf=!1;s||(s=this.viewData),r=e.length-1;var n,o;for(n=t,a=r;a>=0;a-=1)if("tr"==e[a].ty){n=s[a].transform;var h=s[a].transform.mProps.v.props;if(n.matMdf=n.mProps.mdf,n.opMdf=n.op.mdf,o=n.mat,o.cloneFromProps(h),t){var l=t.mat.props;n.opacity=t.opacity,n.opacity*=s[a].transform.op.v,n.matMdf=t.matMdf?!0:n.matMdf,n.opMdf=t.opMdf?!0:n.opMdf,o.transform(l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],l[8],l[9],l[10],l[11],l[12],l[13],l[14],l[15])}else n.opacity=n.op.o}else"sh"==e[a].ty||"el"==e[a].ty||"rc"==e[a].ty||"sr"==e[a].ty?this.renderPath(e[a],s[a],n):"fl"==e[a].ty?this.renderFill(e[a],s[a],n):"st"==e[a].ty?this.renderStroke(e[a],s[a],n):"gr"==e[a].ty?this.renderShape(n,e[a].it,s[a].it):"tm"==e[a].ty;if(i){for(r=this.stylesList.length,a=0;r>a;a+=1)"0"===this.stylesList[a].ld&&(this.stylesList[a].ld="1",this.stylesList[a].pathElement.style.display="block"),"fl"===this.stylesList[a].type&&(this.stylesList[a].mdf||this.firstFrame)&&this.stylesList[a].pathElement.setAttribute("d",this.stylesList[a].d);this.firstFrame&&(this.firstFrame=!1)}},IShapeElement.prototype.renderPath=function(t,e,s){var i,a,r=e.sh.v,n="";if(r.v){i=r.v.length;var o=s.matMdf||e.sh.mdf||this.firstFrame;if(o){var h=r.s?r.s:[];for(a=1;i>a;a+=1)h[a-1]?n+=" M"+s.mat.applyToPointStringified(h[a-1][0],h[a-1][1]):1==a&&(n+=" M"+s.mat.applyToPointStringified(r.v[0][0],r.v[0][1])),n+=" C"+s.mat.applyToPointStringified(r.o[a-1][0],r.o[a-1][1])+" "+s.mat.applyToPointStringified(r.i[a][0],r.i[a][1])+" "+s.mat.applyToPointStringified(r.v[a][0],r.v[a][1]);1==i&&(n+=h[0]?" M"+s.mat.applyToPointStringified(h[0][0],h[0][1]):" M"+s.mat.applyToPointStringified(r.v[0][0],r.v[0][1])),i&&t.closed&&(!t.trimmed||r.c)&&(n+=" C"+s.mat.applyToPointStringified(r.o[a-1][0],r.o[a-1][1])+" "+s.mat.applyToPointStringified(r.i[0][0],r.i[0][1])+" "+s.mat.applyToPointStringified(r.v[0][0],r.v[0][1]),n+="z"),e.lStr=n}else n=e.lStr;for(i=e.elements.length,a=0;i>a;a+=1)"st"===e.elements[a].ty?((e.sh.mdf||this.firstFrame)&&e.elements[a].el.setAttribute("d",n),s.matMdf||this.firstFrame):(e.elements[a].st.mdf=o?!0:e.elements[a].st.mdf,e.elements[a].st.d+=n)}},IShapeElement.prototype.renderFill=function(t,e,s){var i=e.style;(e.c.mdf||this.firstFrame)&&(i.pathElement.style.fill="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||s.opMdf||this.firstFrame)&&(i.pathElement.style.fillOpacity=e.o.v*s.opacity)},IShapeElement.prototype.renderStroke=function(t,e,s){var i=e.style,a=e.d;a&&a.k&&(a.mdf||this.firstFrame)&&(i.pathElement.style.strokeDasharray=a.dasharray,i.pathElement.style.strokeDashoffset=a.dashoffset),(e.c.mdf||this.firstFrame)&&(i.pathElement.style.stroke="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||s.opMdf||this.firstFrame)&&(i.pathElement.style.strokeOpacity=e.o.v*s.opacity),(e.w.mdf||this.firstFrame)&&(i.pathElement.style.strokeWidth=e.w.v)},IShapeElement.prototype.destroy=function(){this.parent.destroy.call(),this.shapeData=null,this.viewData=null,this.parentContainer=null,this.placeholder=null},extendPrototype(ShapeInterface,IShapeElement),createElement(SVGBaseElement,ISolidElement),ISolidElement.prototype.createElements=function(){this.parent.createElements.call(this);var t=document.createElementNS(svgNS,"rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.layerElement===this.parentContainer?this.appendNodeToParent(t):this.layerElement.appendChild(t),this.data.ln&&this.innerElem.setAttribute("id",this.data.ln),this.innerElem=t},ISolidElement.prototype.hide=IImageElement.prototype.hide,ISolidElement.prototype.renderFrame=IImageElement.prototype.renderFrame,ISolidElement.prototype.destroy=IImageElement.prototype.destroy,createElement(BaseElement,CVBaseElement),CVBaseElement.prototype.createElements=function(){},CVBaseElement.prototype.renderFrame=function(t){if(3===this.data.ty)return!1;if(!this.isVisible)return this.isVisible;this.finalTransform.opMdf=this.finalTransform.op.mdf,this.finalTransform.matMdf=this.finalTransform.mProp.mdf,this.finalTransform.opacity=this.finalTransform.op.v;var e,s=this.finalTransform.mat;if(this.hierarchy){var i,a=this.hierarchy.length;for(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e),i=0;a>i;i+=1)this.finalTransform.matMdf=this.hierarchy[i].finalTransform.mProp.mdf?!0:this.finalTransform.matMdf,e=this.hierarchy[i].finalTransform.mProp.v.props,s.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])}else t?(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e)):s.cloneFromProps(this.finalTransform.mProp.v.props);return t&&(e=t.mat.props,s.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.finalTransform.opacity*=t.opacity,this.finalTransform.opMdf=t.opMdf?!0:this.finalTransform.opMdf,this.finalTransform.matMdf=t.matMdf?!0:this.finalTransform.matMdf),this.data.hasMask&&(this.globalData.renderer.save(!0),this.maskManager.renderFrame(s)),this.isVisible},CVBaseElement.prototype.getCurrentAnimData=function(){return this.currentAnimData},CVBaseElement.prototype.addMasks=function(t){this.maskManager=new CVMaskElement(t,this,this.globalData)},CVBaseElement.prototype.destroy=function(){this.canvasContext=null,this.data=null,this.globalData=null,this.maskManager&&this.maskManager.destroy()},CVBaseElement.prototype.mHelper=new Matrix,createElement(CVBaseElement,CVCompElement),CVCompElement.prototype.prepareFrame=function(t){if(this.parent.prepareFrame.call(this,t),this.isVisible!==!1){var e=t;this.tm&&(e=this.tm.v,e===this.data.op&&(e=this.data.op-1)),this.renderedFrame=e;var s,i=this.elements.length;for(s=0;i>s;s+=1)this.elements[s].prepareFrame(e-this.layers[s].st)}},CVCompElement.prototype.renderFrame=function(t){if(this.parent.renderFrame.call(this,t)!==!1){var e,s=this.layers.length;for(e=s-1;e>=0;e-=1)this.elements[e].renderFrame(this.finalTransform);this.data.hasMask&&this.globalData.renderer.restore(!0),this.firstFrame&&(this.firstFrame=!1)}},CVCompElement.prototype.setElements=function(t){this.elements=t},CVCompElement.prototype.getElements=function(){return this.elements},CVCompElement.prototype.destroy=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].destroy();this.layers=null,this.elements=null,this.parent.destroy.call()},createElement(CVBaseElement,CVImageElement),CVImageElement.prototype.createElements=function(){var t=this,e=function(){t.animationItem.elementLoaded()},s=function(){t.failed=!0,t.animationItem.elementLoaded()};this.img=new Image,this.img.addEventListener("load",e,!1),this.img.addEventListener("error",s,!1),this.img.src=this.path+this.assetData.p,this.parent.createElements.call(this)},CVImageElement.prototype.renderFrame=function(t){if(!this.failed&&this.parent.renderFrame.call(this,t)!==!1){var e=this.canvasContext;this.globalData.renderer.save();var s=this.finalTransform.mat.props;this.globalData.renderer.ctxTransform(s),this.globalData.renderer.ctxOpacity(this.finalTransform.opacity),e.drawImage(this.img,0,0),this.globalData.renderer.restore(this.data.hasMask),this.firstFrame&&(this.firstFrame=!1)}},CVImageElement.prototype.destroy=function(){this.img=null,this.animationItem=null,this.parent.destroy.call()},CVMaskElement.prototype.getMaskProperty=function(t){return this.viewData[t]},CVMaskElement.prototype.prepareFrame=function(t){var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t)},CVMaskElement.prototype.renderFrame=function(t){var e,s,i,a,r,n=this.ctx,o=this.data.masksProperties.length,h=!1;for(e=0;o>e;e++)if("n"!==this.masksProperties[e].mode){h===!1&&(n.beginPath(),h=!0),this.masksProperties[e].inv&&(n.moveTo(0,0),n.lineTo(this.globalData.compWidth,0),n.lineTo(this.globalData.compWidth,this.globalData.compHeight),n.lineTo(0,this.globalData.compHeight),n.lineTo(0,0)),r=this.viewData[e].v,s=t.applyToPointArray(r.v[0][0],r.v[0][1],0),n.moveTo(s[0],s[1]);var l,p=r.v.length;for(l=1;p>l;l++)s=t.applyToPointArray(r.o[l-1][0],r.o[l-1][1],0),i=t.applyToPointArray(r.i[l][0],r.i[l][1],0),a=t.applyToPointArray(r.v[l][0],r.v[l][1],0),n.bezierCurveTo(s[0],s[1],i[0],i[1],a[0],a[1]);s=t.applyToPointArray(r.o[l-1][0],r.o[l-1][1],0),i=t.applyToPointArray(r.i[0][0],r.i[0][1],0),a=t.applyToPointArray(r.v[0][0],r.v[0][1],0),n.bezierCurveTo(s[0],s[1],i[0],i[1],a[0],a[1])}h&&n.clip()},CVMaskElement.prototype.getMask=function(t){for(var e=0,s=this.masksProperties.length;s>e;){if(this.masksProperties[e].nm===t)return{maskPath:this.viewData[e].pv};e+=1}},CVMaskElement.prototype.destroy=function(){
this.ctx=null},createElement(CVBaseElement,CVShapeElement),CVShapeElement.prototype.lcEnum={1:"butt",2:"round",3:"butt"},CVShapeElement.prototype.ljEnum={1:"miter",2:"round",3:"butt"},CVShapeElement.prototype.transformHelper={opacity:1,mat:new Matrix,matMdf:!1,opMdf:!1},CVShapeElement.prototype.dashResetter=[],CVShapeElement.prototype.createElements=function(){this.parent.createElements.call(this),this.searchShapes(this.shapesData,this.viewData,this.dynamicProperties,[]),this.buildExpressionInterface()},CVShapeElement.prototype.searchShapes=function(t,e,s,i){var a,r,n,o,h=t.length-1,l=[],p=[];for(a=h;a>=0;a-=1)if("fl"==t[a].ty||"st"==t[a].ty){if(o={type:t[a].ty,elements:[]},e[a]={},e[a].c=PropertyFactory.getProp(this,t[a].c,1,null,s),e[a].c.k||(o.co="rgb("+bm_floor(e[a].c.v[0])+","+bm_floor(e[a].c.v[1])+","+bm_floor(e[a].c.v[2])+")"),e[a].o=PropertyFactory.getProp(this,t[a].o,0,.01,s),"st"==t[a].ty&&(o.lc=this.lcEnum[t[a].lc]||"round",o.lj=this.ljEnum[t[a].lj]||"round",1==t[a].lj&&(o.ml=t[a].ml),e[a].w=PropertyFactory.getProp(this,t[a].w,0,null,s),e[a].w.k||(o.wi=e[a].w.v),t[a].d)){var m=PropertyFactory.getDashProp(this,t[a].d,"canvas",s);e[a].d=m,e[a].d.k||(o.da=e[a].d.dasharray,o["do"]=e[a].d.dashoffset)}this.stylesList.push(o),e[a].style=o,l.push(e[a].style)}else if("gr"==t[a].ty)e[a]={it:[]},this.searchShapes(t[a].it,e[a].it,s,i);else if("tr"==t[a].ty)e[a]={transform:{mat:new Matrix,opacity:1,matMdf:!1,opMdf:!1,op:PropertyFactory.getProp(this,t[a].o,0,.01,s),mProps:PropertyFactory.getProp(this,t[a],2,null,s)},elements:[]};else if("sh"==t[a].ty||"rc"==t[a].ty||"el"==t[a].ty||"sr"==t[a].ty){e[a]={nodes:[],trNodes:[],tr:[0,0,0,0,0,0]};var f=4;"rc"==t[a].ty?f=5:"el"==t[a].ty?f=6:"sr"==t[a].ty&&(f=7),i.length&&(t[a].trimmed=!0),e[a].sh=PropertyFactory.getShapeProp(this,t[a],f,s,i),n=this.stylesList.length;var d=!1,c=!1;for(r=0;n>r;r+=1)this.stylesList[r].closed||(this.stylesList[r].elements.push(e[a]),"st"===this.stylesList[r].type?d=!0:c=!0);e[a].st=d,e[a].fl=c}else if("tm"==t[a].ty){var u={closed:!1,trimProp:PropertyFactory.getProp(this,t[a],7,null,s)};i.push(u),p.push(u)}for(h=l.length,a=0;h>a;a+=1)l[a].closed=!0;for(h=p.length,a=0;h>a;a+=1)p[a].closed=!0},CVShapeElement.prototype.renderFrame=function(t){this.parent.renderFrame.call(this,t)!==!1&&(this.transformHelper.mat.reset(),this.transformHelper.opacity=this.finalTransform.opacity,this.transformHelper.matMdf=!1,this.transformHelper.opMdf=this.finalTransform.opMdf,this.renderShape(this.transformHelper,null,null,!0),this.data.hasMask&&this.globalData.renderer.restore(!0))},CVShapeElement.prototype.renderShape=function(t,e,s,i){var a,r;if(!e)for(e=this.shapesData,r=this.stylesList.length,a=0;r>a;a+=1)this.stylesList[a].d="",this.stylesList[a].mdf=!1;s||(s=this.viewData),r=e.length-1;var n,o;for(n=t,a=r;a>=0;a-=1)if("tr"==e[a].ty){n=s[a].transform;var h=s[a].transform.mProps.v.props;if(n.matMdf=n.mProps.mdf,n.opMdf=n.op.mdf,o=n.mat,o.cloneFromProps(h),t){var l=t.mat.props;n.opacity=t.opacity,n.opacity*=s[a].transform.op.v,n.matMdf=t.matMdf?!0:n.matMdf,n.opMdf=t.opMdf?!0:n.opMdf,o.transform(l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],l[8],l[9],l[10],l[11],l[12],l[13],l[14],l[15])}else n.opacity=n.op.o}else"sh"==e[a].ty||"el"==e[a].ty||"rc"==e[a].ty||"sr"==e[a].ty?this.renderPath(e[a],s[a],n):"fl"==e[a].ty?this.renderFill(e[a],s[a],n):"st"==e[a].ty?this.renderStroke(e[a],s[a],n):"gr"==e[a].ty?this.renderShape(n,e[a].it,s[a].it):"tm"==e[a].ty;if(i){r=this.stylesList.length;var p,m,f,d,c,u,y,v=this.globalData.renderer,g=this.globalData.canvasContext;for(v.save(),v.ctxTransform(this.finalTransform.mat.props),a=0;r>a;a+=1)if(y=this.stylesList[a].type,"st"!==y||0!==this.stylesList[a].wi){for(v.save(),c=this.stylesList[a].elements,m=c.length,"st"===y?(g.strokeStyle=this.stylesList[a].co,g.lineWidth=this.stylesList[a].wi,g.lineCap=this.stylesList[a].lc,g.lineJoin=this.stylesList[a].lj,g.miterLimit=this.stylesList[a].ml||0):g.fillStyle=this.stylesList[a].co,v.ctxOpacity(this.stylesList[a].coOp),"st"!==y&&g.beginPath(),p=0;m>p;p+=1){for("st"===y&&(g.beginPath(),this.stylesList[a].da?(g.setLineDash(this.stylesList[a].da),g.lineDashOffset=this.stylesList[a]["do"],this.globalData.isDashed=!0):this.globalData.isDashed&&(g.setLineDash(this.dashResetter),this.globalData.isDashed=!1)),u=c[p].trNodes,d=u.length,f=0;d>f;f+=1)"m"==u[f].t?g.moveTo(u[f].p[0],u[f].p[1]):"c"==u[f].t?g.bezierCurveTo(u[f].p1[0],u[f].p1[1],u[f].p2[0],u[f].p2[1],u[f].p3[0],u[f].p3[1]):g.closePath();"st"===y&&g.stroke()}"st"!==y&&g.fill(),v.restore()}v.restore(),this.firstFrame&&(this.firstFrame=!1)}},CVShapeElement.prototype.renderPath=function(t,e,s){var i,a,r=e.sh.v;if(r.v){i=r.v.length;var n=s.matMdf||e.sh.mdf||this.firstFrame;if(n){var o=e.trNodes;o.length=0;var h=r.s?r.s:[];for(a=1;i>a;a+=1)h[a-1]?o.push({t:"m",p:s.mat.applyToPointArray(h[a-1][0],h[a-1][1],0)}):1==a&&o.push({t:"m",p:s.mat.applyToPointArray(r.v[0][0],r.v[0][1],0)}),o.push({t:"c",p1:s.mat.applyToPointArray(r.o[a-1][0],r.o[a-1][1],0),p2:s.mat.applyToPointArray(r.i[a][0],r.i[a][1],0),p3:s.mat.applyToPointArray(r.v[a][0],r.v[a][1],0)});if(1==i&&o.push(h[0]?{t:"m",p:s.mat.applyToPointArray(h[0][0],h[0][1],0)}:{t:"m",p:s.mat.applyToPointArray(r.v[0][0],r.v[0][1],0)}),i&&t.closed&&(!t.trimmed||r.c)&&(o.push({t:"c",p1:s.mat.applyToPointArray(r.o[a-1][0],r.o[a-1][1],0),p2:s.mat.applyToPointArray(r.i[0][0],r.i[0][1],0),p3:s.mat.applyToPointArray(r.v[0][0],r.v[0][1],0)}),o.push({t:"z"})),e.st)for(a=0;16>a;a+=1)e.tr[a]=s.mat.props[a];e.trNodes=o}}},CVShapeElement.prototype.renderFill=function(t,e,s){var i=e.style;(e.c.mdf||this.firstFrame)&&(i.co="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||s.opMdf||this.firstFrame)&&(i.coOp=e.o.v*s.opacity)},CVShapeElement.prototype.renderStroke=function(t,e,s){var i=e.style,a=e.d;a&&(a.mdf||this.firstFrame)&&(i.da=a.dasharray,i["do"]=a.dashoffset),(e.c.mdf||this.firstFrame)&&(i.co="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||s.opMdf||this.firstFrame)&&(i.coOp=e.o.v*s.opacity),(e.w.mdf||this.firstFrame)&&(i.wi=e.w.v)},CVShapeElement.prototype.destroy=function(){this.shapesData=null,this.globalData=null,this.canvasContext=null,this.stylesList.length=0,this.viewData.length=0,this.parent.destroy.call()},extendPrototype(ShapeInterface,CVShapeElement),createElement(CVBaseElement,CVSolidElement),CVSolidElement.prototype.renderFrame=function(t){if(this.parent.renderFrame.call(this,t)!==!1){var e=this.canvasContext;this.globalData.renderer.save();var s=this.finalTransform.mat.props;this.globalData.renderer.ctxTransform(s),this.globalData.renderer.ctxOpacity(this.finalTransform.opacity),e.fillStyle=this.data.sc,e.fillRect(0,0,this.data.sw,this.data.sh),this.globalData.renderer.restore(this.data.hasMask),this.firstFrame&&(this.firstFrame=!1)}},createElement(CVBaseElement,CVTextElement),CVTextElement.prototype.init=ITextElement.prototype.init,CVTextElement.prototype.getMeasures=ITextElement.prototype.getMeasures,CVTextElement.prototype.getMult=ITextElement.prototype.getMult,CVTextElement.prototype.tHelper=document.createElement("canvas").getContext("2d"),CVTextElement.prototype.createElements=function(){this.parent.createElements.call(this);var t=this.data.t.d,e=!1;t.fc?(e=!0,this.values.fill="rgb("+t.fc[0]+","+t.fc[1]+","+t.fc[2]+")"):this.values.fill="rgba(0,0,0,0)",this.fill=e;var s=!1;t.sc&&(s=!0,this.values.stroke="rgb("+t.sc[0]+","+t.sc[1]+","+t.sc[2]+")",this.values.sWidth=t.sw);var i,a,r=this.globalData.fontManager.getFontByName(t.f),n=t.l,o=this.mHelper;this.stroke=s,this.values.fValue=t.s+"px "+this.globalData.fontManager.getFontByName(t.f).fFamily,a=t.t.length,this.tHelper.font=this.values.fValue;var h,l,p,m,f,d,c,u,y,v,g=this.data.singleShape;if(g)var b=0,E=0,P=t.lineWidths,k=t.boxWidth,S=!0;for(i=0;a>i;i+=1){h=this.globalData.fontManager.getCharData(t.t.charAt(i),r.fStyle,this.globalData.fontManager.getFontByName(t.f).fFamily);var l;if(l=h?h.data:null,o.reset(),g&&n[i].n&&(b=0,E+=t.yOffset,E+=S?1:0,S=!1),l&&l.shapes){if(f=l.shapes[0].it,c=f.length,o.scale(t.s/100,t.s/100),g){switch(t.ps&&o.translate(t.ps[0],t.ps[1]+t.ascent,0),t.j){case 1:o.translate(t.justifyOffset+(k-P[n[i].line]),0,0);break;case 2:o.translate(t.justifyOffset+(k-P[n[i].line])/2,0,0)}o.translate(b,E,0)}for(y=new Array(c),d=0;c>d;d+=1){for(m=f[d].ks.k.i.length,u=f[d].ks.k,v=[],p=1;m>p;p+=1)1==p&&v.push(o.applyToX(u.v[0][0],u.v[0][1],0),o.applyToY(u.v[0][0],u.v[0][1],0)),v.push(o.applyToX(u.o[p-1][0],u.o[p-1][1],0),o.applyToY(u.o[p-1][0],u.o[p-1][1],0),o.applyToX(u.i[p][0],u.i[p][1],0),o.applyToY(u.i[p][0],u.i[p][1],0),o.applyToX(u.v[p][0],u.v[p][1],0),o.applyToY(u.v[p][0],u.v[p][1],0));v.push(o.applyToX(u.o[p-1][0],u.o[p-1][1],0),o.applyToY(u.o[p-1][0],u.o[p-1][1],0),o.applyToX(u.i[0][0],u.i[0][1],0),o.applyToY(u.i[0][0],u.i[0][1],0),o.applyToX(u.v[0][0],u.v[0][1],0),o.applyToY(u.v[0][0],u.v[0][1],0)),y[d]=v}}else y=[];g&&(b+=n[i].l),this.textSpans.push({elem:y})}},CVTextElement.prototype.renderFrame=function(t){if(this.parent.renderFrame.call(this,t)!==!1){var e=this.canvasContext,s=this.finalTransform.mat.props;this.globalData.renderer.save(),this.globalData.renderer.ctxTransform(s),this.globalData.renderer.ctxOpacity(this.finalTransform.opacity),e.font=this.values.fValue,e.lineCap="butt",e.lineJoin="miter",e.miterLimit=4,this.data.singleShape||this.getMeasures();var i,a,r,n,o,h,l=this.renderedLetters,p=this.data.t.d.l;a=p.length;var m,f,d,c=null,u=null,y=null;for(i=0;a>i;i+=1)if(!p[i].n){if(m=l[i],m&&(this.globalData.renderer.save(),this.globalData.renderer.ctxTransform(m.props),this.globalData.renderer.ctxOpacity(m.o)),this.fill){for(m&&m.fc?c!==m.fc&&(c=m.fc,e.fillStyle=m.fc):c!==this.values.fill&&(c=this.values.fill,e.fillStyle=this.values.fill),f=this.textSpans[i].elem,n=f.length,this.globalData.canvasContext.beginPath(),r=0;n>r;r+=1)for(d=f[r],h=d.length,this.globalData.canvasContext.moveTo(d[0],d[1]),o=2;h>o;o+=6)this.globalData.canvasContext.bezierCurveTo(d[o],d[o+1],d[o+2],d[o+3],d[o+4],d[o+5]);this.globalData.canvasContext.closePath(),this.globalData.canvasContext.fill()}if(this.stroke){for(m&&m.sw?y!==m.sw&&(y=m.sw,e.lineWidth=m.sw):y!==this.values.sWidth&&(y=this.values.sWidth,e.lineWidth=this.values.sWidth),m&&m.sc?u!==m.sc&&(u=m.sc,e.strokeStyle=m.sc):u!==this.values.stroke&&(u=this.values.stroke,e.strokeStyle=this.values.stroke),f=this.textSpans[i].elem,n=f.length,this.globalData.canvasContext.beginPath(),r=0;n>r;r+=1)for(d=f[r],h=d.length,this.globalData.canvasContext.moveTo(d[0],d[1]),o=2;h>o;o+=6)this.globalData.canvasContext.bezierCurveTo(d[o],d[o+1],d[o+2],d[o+3],d[o+4],d[o+5]);this.globalData.canvasContext.closePath(),this.globalData.canvasContext.stroke()}m&&this.globalData.renderer.restore()}this.globalData.renderer.restore(this.data.hasMask),this.firstFrame&&(this.firstFrame=!1)}},createElement(BaseElement,HBaseElement),HBaseElement.prototype.appendNodeToParent=function(t){if(this.placeholder){var e=this.placeholder.phElement;e.parentNode.insertBefore(t,e)}else this.parentContainer.appendChild(t)},HBaseElement.prototype.createElements=function(){this.data.hasMask?(this.layerElement=document.createElementNS(svgNS,"svg"),this.appendNodeToParent(this.layerElement),this.maskedElement=this.layerElement):this.layerElement=this.parentContainer,!this.data.ln||4!==this.data.ty&&0!==this.data.ty||(this.layerElement===this.parentContainer&&(this.layerElement=document.createElementNS(svgNS,"g"),this.appendNodeToParent(this.layerElement)),this.layerElement.setAttribute("id",this.data.ln)),this.layerElement!==this.parentContainer&&(this.placeholder=null)},HBaseElement.prototype.renderFrame=function(t){if(3===this.data.ty)return!1;if(this.currentFrameNum===this.lastNum||!this.isVisible)return this.isVisible;this.lastNum=this.currentFrameNum,this.data.hasMask&&this.maskManager.renderFrame(),this.finalTransform.opMdf=this.finalTransform.op.mdf,this.finalTransform.matMdf=this.finalTransform.mProp.mdf,this.finalTransform.opacity=this.finalTransform.op.v,this.firstFrame&&(this.finalTransform.opMdf=!0,this.finalTransform.matMdf=!0);var e,s=this.finalTransform.mat;if(this.hierarchy){var i,a=this.hierarchy.length;for(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e),i=0;a>i;i+=1)this.finalTransform.matMdf=this.hierarchy[i].finalTransform.mProp.mdf?!0:this.finalTransform.matMdf,e=this.hierarchy[i].finalTransform.mProp.v.props,s.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])}else this.isVisible&&this.finalTransform.matMdf&&(t?(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e)):s.cloneFromProps(this.finalTransform.mProp.v.props));return t&&(e=t.mat.props,s.cloneFromProps(e),this.finalTransform.opacity*=t.opacity,this.finalTransform.opMdf=t.opMdf?!0:this.finalTransform.opMdf,this.finalTransform.matMdf=t.matMdf?!0:this.finalTransform.matMdf),this.finalTransform.matMdf&&(this.layerElement.style.transform=this.layerElement.style.webkitTransform=s.toCSS()),this.finalTransform.opMdf&&(this.layerElement.style.opacity=this.finalTransform.opacity),this.isVisible},HBaseElement.prototype.destroy=function(){this.layerElement=null,this.parentContainer=null,this.matteElement&&(this.matteElement=null),this.maskManager&&(this.maskManager.destroy(),this.maskManager=null)},HBaseElement.prototype.getDomElement=function(){return this.layerElement},HBaseElement.prototype.addMasks=function(t){this.maskManager=new MaskElement(t,this,this.globalData)},HBaseElement.prototype.hide=function(){},HBaseElement.prototype.setMatte=function(){},createElement(HBaseElement,HSolidElement),HSolidElement.prototype.createElements=function(){var t=document.createElement("div");styleDiv(t);var e=document.createElementNS(svgNS,"svg");e.setAttribute("width",this.data.sw),e.setAttribute("height",this.data.sh),t.appendChild(e),this.layerElement=t,this.parentContainer.appendChild(t),this.innerElem=t,this.data.ln&&this.innerElem.setAttribute("id",this.data.ln);var s=document.createElementNS(svgNS,"rect");s.setAttribute("width",this.data.sw),s.setAttribute("height",this.data.sh),s.setAttribute("fill",this.data.sc),e.appendChild(s),this.data.hasMask&&(this.maskedElement=s)},HSolidElement.prototype.hide=function(){this.hidden||(this.innerElem.style.display="none",this.hidden=!0)},HSolidElement.prototype.renderFrame=function(t){var e=this.parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.hidden&&(this.hidden=!1,this.innerElem.style.display="block"),void(this.firstFrame&&(this.firstFrame=!1)))},HSolidElement.prototype.destroy=function(){this.parent.destroy.call(),this.innerElem=null},createElement(HBaseElement,HCompElement),extendPrototype(ExpressionComp,HCompElement),HCompElement.prototype.getDomElement=function(){return this.composingElement},HCompElement.prototype.getComposingElement=function(){return this.layerElement},HCompElement.prototype.createElements=function(){if(this.layerElement=document.createElement("div"),styleDiv(this.layerElement),this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.layerElement.style.clip="rect(0px, "+this.data.w+"px, "+this.data.h+"px, 0px)",this.layerElement!==this.parentContainer&&(this.placeholder=null),this.data.hasMask){var t=document.createElementNS(svgNS,"svg");t.setAttribute("width",this.data.w),t.setAttribute("height",this.data.h);var e=document.createElementNS(svgNS,"g");t.appendChild(e),this.layerElement.appendChild(t),this.maskedElement=e,this.composingElement=e}else this.composingElement=this.layerElement;this.appendNodeToParent(this.layerElement)},HCompElement.prototype.hide=ICompElement.prototype.hide,HCompElement.prototype.prepareFrame=ICompElement.prototype.prepareFrame,HCompElement.prototype.setElements=ICompElement.prototype.setElements,HCompElement.prototype.getElements=ICompElement.prototype.getElements,HCompElement.prototype.destroy=ICompElement.prototype.destroy,HCompElement.prototype.renderFrame=function(t){var e,s=this.parent.renderFrame.call(this,t),i=this.layers.length;if(s===!1)return void this.hide();for(this.hidden=!1,e=0;i>e;e+=1)this.elements[e].renderFrame();this.firstFrame&&(this.firstFrame=!1)},createElement(HBaseElement,HShapeElement);var parent=HShapeElement.prototype.parent;extendPrototype(IShapeElement,HShapeElement),HShapeElement.prototype.parent=parent,HShapeElement.prototype.createElements=function(){var t=document.createElement("div");styleDiv(t);var e=document.createElementNS(svgNS,"svg");if(999999===this.data.bounds.l,e.setAttribute("width",this.data.bounds.r-this.data.bounds.l),e.setAttribute("height",this.data.bounds.b-this.data.bounds.t),e.setAttribute("viewBox",this.data.bounds.l+" "+this.data.bounds.t+" "+(this.data.bounds.r-this.data.bounds.l)+" "+(this.data.bounds.b-this.data.bounds.t)),e.style.transform=e.style.webkitTransform="translate("+this.data.bounds.l+"px,"+this.data.bounds.t+"px)",this.data.hasMask){var s=document.createElementNS(svgNS,"g");t.appendChild(e),e.appendChild(s),this.maskedElement=s,this.layerElement=s,this.shapesContainer=s}else t.appendChild(e),this.layerElement=e,this.shapesContainer=document.createElementNS(svgNS,"g"),this.layerElement.appendChild(this.shapesContainer);this.parentContainer.appendChild(t),this.innerElem=t,this.data.ln&&this.innerElem.setAttribute("id",this.data.ln),this.searchShapes(this.shapesData,this.viewData,this.dynamicProperties,[]),this.buildExpressionInterface(),this.layerElement=t},HShapeElement.prototype.renderFrame=function(t){var e=this.parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.hidden=!1,this.transformHelper.opacity=this.finalTransform.opacity,this.transformHelper.matMdf=!1,this.transformHelper.opMdf=this.finalTransform.opMdf,void this.renderShape(this.transformHelper,null,null,!0))},createElement(HBaseElement,HTextElement),HTextElement.prototype.init=ITextElement.prototype.init,HTextElement.prototype.getMeasures=ITextElement.prototype.getMeasures,HTextElement.prototype.createPathShape=ITextElement.prototype.createPathShape,HTextElement.prototype.createElements=function(){this.isMasked=this.checkMasks();var t=this.data.t.d,e=document.createElement("div");if(styleDiv(e),this.layerElement=e,this.isMasked){this.renderType="svg";var s=document.createElementNS(svgNS,"svg");this.cont=s,this.compW=this.comp.data?this.comp.data.w:this.globalData.compSize.w,this.compH=this.comp.data?this.comp.data.h:this.globalData.compSize.h,s.setAttribute("width",this.compW),s.setAttribute("height",this.compH);var i=document.createElementNS(svgNS,"g");s.appendChild(i),e.appendChild(s),this.maskedElement=i,this.innerElem=i}else this.renderType="html",this.innerElem=e;this.parentContainer.appendChild(e),this.innerElem.style.color=this.innerElem.style.fill=t.fc?"rgb("+t.fc[0]+","+t.fc[1]+","+t.fc[2]+")":"rgba(0,0,0,0)",t.sc&&(this.innerElem.style.stroke="rgb("+t.sc[0]+","+t.sc[1]+","+t.sc[2]+")",this.innerElem.style.strokeWidth=t.sw+"px");var a=this.globalData.fontManager.getFontByName(t.f);if(!this.globalData.fontManager.chars)if(this.innerElem.style.fontSize=t.s+"px",this.innerElem.style.lineHeight=t.s+"px",a.fClass)this.innerElem.className=a.fClass;else{this.innerElem.style.fontFamily=a.fFamily;var r=t.fWeight,n=t.fStyle;this.innerElem.style.fontStyle=n,this.innerElem.style.fontWeight=r}var o,h,l=t.l;h=l.length;var p,m,f,d,c=this.mHelper,u="";for(o=0;h>o;o+=1){if(this.globalData.fontManager.chars?(p=document.createElementNS(svgNS,"path"),this.isMasked||(m=document.createElement("div"),f=document.createElementNS(svgNS,"svg"),m.appendChild(f),f.appendChild(p),styleDiv(m)),p.setAttribute("stroke-linecap","butt"),p.setAttribute("stroke-linejoin","round"),p.setAttribute("stroke-miterlimit","4")):this.isMasked?p=document.createElementNS(svgNS,"text"):(m=document.createElement("span"),styleDiv(m),p=document.createElement("span"),styleDiv(p),m.appendChild(p)),this.globalData.fontManager.chars){var y,v=this.globalData.fontManager.getCharData(t.t.charAt(o),a.fStyle,this.globalData.fontManager.getFontByName(t.f).fFamily);if(y=v?v.data:null,c.reset(),y&&y.shapes&&(d=y.shapes[0].it,c.scale(t.s/100,t.s/100),u=this.createPathShape(c,d),p.setAttribute("d",u)),this.isMasked)this.innerElem.appendChild(p);else{this.innerElem.appendChild(m);var g=t.s/100;if(y&&y.shapes){var b=Math.ceil(y.bounds.r*g),E=Math.floor(y.bounds.t*g),P=Math.floor(y.bounds.l*g),k=Math.ceil(y.bounds.b*g);f.setAttribute("width",b-P),f.setAttribute("height",k-E),f.setAttribute("viewBox",P+" "+E+" "+(b-P)+" "+(k-E)),f.style.transform=f.style.webkitTransform="translate("+P+"px,"+E+"px)",l[o].yOffset=E}else f.setAttribute("width",1),f.setAttribute("height",1)}}else p.textContent=l[o].val,p.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),this.isMasked?this.innerElem.appendChild(p):(this.innerElem.appendChild(m),p.style.transform=p.style.webkitTransform="translate3d(0,"+-t.s/1.2+"px,0)");this.textSpans.push(this.isMasked?p:m),this.textPaths.push(p)}},HTextElement.prototype.hide=SVGTextElement.prototype.hide,HTextElement.prototype.renderFrame=function(t){var e=this.parent.renderFrame.call(this,t);if(e===!1)return void this.hide();if(this.hidden&&(this.hidden=!1,this.innerElem.style.display="block"),this.data.singleShape){if(!this.firstFrame)return;this.isMasked&&this.finalTransform.matMdf&&(this.cont.setAttribute("viewBox",-this.finalTransform.mProp.p.v[0]+" "+-this.finalTransform.mProp.p.v[1]+" "+this.compW+" "+this.compH),this.cont.style.transform=this.cont.style.webkitTransform="translate("+-this.finalTransform.mProp.p.v[0]+"px,"+-this.finalTransform.mProp.p.v[1]+"px)")}if(this.getMeasures(),this.lettersChangedFlag){var s,i,a=this.renderedLetters,r=this.data.t.d.l;i=r.length;var n;for(s=0;i>s;s+=1)r[s].n||(n=a[s],this.isMasked?this.textSpans[s].setAttribute("transform",n.m):this.textSpans[s].style.transform=this.textSpans[s].style.webkitTransform=n.m,this.textSpans[s].style.opacity=n.o,n.sw&&this.textPaths[s].setAttribute("stroke-width",n.sw),n.sc&&this.textPaths[s].setAttribute("stroke",n.sc),n.fc&&(this.textPaths[s].setAttribute("fill",n.fc),this.textPaths[s].style.color=n.fc));if(this.isMasked){var o=this.innerElem.getBBox();this.currentBBox.w!==o.width&&(this.currentBBox.w=o.width,this.cont.setAttribute("width",o.width)),this.currentBBox.h!==o.height&&(this.currentBBox.h=o.height,this.cont.setAttribute("height",o.height)),(this.currentBBox.w!==o.width||this.currentBBox.h!==o.height||this.currentBBox.x!==o.x||this.currentBBox.y!==o.y)&&(this.currentBBox.w=o.width,this.currentBBox.h=o.height,this.currentBBox.x=o.x,this.currentBBox.y=o.y,this.cont.setAttribute("viewBox",this.currentBBox.x+" "+this.currentBBox.y+" "+this.currentBBox.w+" "+this.currentBBox.h),this.cont.style.transform=this.cont.style.webkitTransform="translate("+this.currentBBox.x+"px,"+this.currentBBox.y+"px)")}this.firstFrame&&(this.firstFrame=!1)}},HTextElement.prototype.destroy=SVGTextElement.prototype.destroy,createElement(HBaseElement,HImageElement),HImageElement.prototype.createElements=function(){var t,e=function(){this.imageElem.setAttributeNS("http://www.w3.org/1999/xlink","href",this.path+this.assetData.p)},s=new Image;if(this.data.hasMask){var t=document.createElement("div");styleDiv(t);var i=document.createElementNS(svgNS,"svg");i.setAttribute("width",this.assetData.w),i.setAttribute("height",this.assetData.h),t.appendChild(i),this.imageElem=document.createElementNS(svgNS,"image"),this.imageElem.setAttribute("width",this.assetData.w+"px"),this.imageElem.setAttribute("height",this.assetData.h+"px"),i.appendChild(this.imageElem),this.layerElement=t,this.parentContainer.appendChild(t),this.innerElem=t,this.maskedElement=this.imageElem,s.addEventListener("load",e.bind(this),!1),s.addEventListener("error",e.bind(this),!1)}else styleDiv(s),this.layerElement=s,this.parentContainer.appendChild(s),this.innerElem=s;s.src=this.path+this.assetData.p,this.data.ln&&this.innerElem.setAttribute("id",this.data.ln)},HImageElement.prototype.hide=HSolidElement.prototype.hide,HImageElement.prototype.renderFrame=HSolidElement.prototype.renderFrame,HImageElement.prototype.destroy=HSolidElement.prototype.destroy,createElement(HBaseElement,HCameraElement),HCameraElement.prototype.setup=function(){var t,e,s=this.comp.threeDElements.length;for(t=0;s>t;t+=1)e=this.comp.threeDElements[t],e[0].style.perspective=e[0].style.webkitPerspective=this.pe.v+"px",e[1].style.transformOrigin=e[1].style.mozTransformOrigin=e[1].style.webkitTransformOrigin="0px 0px 0px",e[0].style.transform=e[0].style.webkitTransform="matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)"},HCameraElement.prototype.createElements=function(){},HCameraElement.prototype.hide=function(){},HCameraElement.prototype.renderFrame=function(){var t,e,s=this.firstFrame;if(this.hierarchy)for(e=this.hierarchy.length,t=0;e>t;t+=1)s=this.hierarchy[t].finalTransform.mProp.mdf?!0:s;if(s||this.p&&this.p.mdf||this.px&&(this.px.mdf||this.py.mdf||this.pz.mdf)||this.rx.mdf||this.ry.mdf||this.rz.mdf||this.or.mdf||this.a&&this.a.mdf){if(this.mat.reset(),this.p?this.mat.translate(-this.p.v[0],-this.p.v[1],this.p.v[2]):this.mat.translate(-this.px.v,-this.py.v,this.pz.v),this.a){var i=[this.p.v[0]-this.a.v[0],this.p.v[1]-this.a.v[1],this.p.v[2]-this.a.v[2]],a=Math.sqrt(Math.pow(i[0],2)+Math.pow(i[1],2)+Math.pow(i[2],2)),r=[i[0]/a,i[1]/a,i[2]/a],n=Math.sqrt(r[2]*r[2]+r[0]*r[0]),o=Math.atan2(r[1],n),h=Math.atan2(r[0],-r[2]);this.mat.rotateY(h).rotateX(-o)}if(this.mat.rotateX(-this.rx.v).rotateY(-this.ry.v).rotateZ(this.rz.v),this.mat.rotateX(-this.or.v[0]).rotateY(-this.or.v[1]).rotateZ(this.or.v[2]),this.mat.translate(this.globalData.compSize.w/2,this.globalData.compSize.h/2,0),this.mat.translate(0,0,this.pe.v),this.hierarchy){var l;for(e=this.hierarchy.length,t=0;e>t;t+=1)l=this.hierarchy[t].finalTransform.mProp.iv.props,this.mat.transform(l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],l[8],l[9],l[10],l[11],-l[12],-l[13],l[14],l[15])}e=this.comp.threeDElements.length;var p;for(t=0;e>t;t+=1)p=this.comp.threeDElements[t],p[1].style.transform=p[1].style.webkitTransform=this.mat.toCSS()}this.firstFrame=!1},HCameraElement.prototype.destroy=function(){};var animationManager=function(){function t(e){var s=0,i=e.target;for(i.removeEventListener("destroy",t);P>s;)g[s].animation===i&&(g.splice(s,1),s-=1,P-=1),s+=1}function e(e,s){if(!e)return null;for(var i=0;P>i;){if(g[i].elem==e&&null!==g[i].elem)return g[i].animation;i+=1}var a=new AnimationItem;return a.setData(e,s),a.addEventListener("destroy",t),g.push({elem:e,animation:a}),P+=1,a}function s(e){var s=new AnimationItem;return s.setParams(e),s.addEventListener("destroy",t),g.push({elem:null,animation:s}),P+=1,s}function i(t,e){var s;for(s=0;P>s;s+=1)g[s].animation.setSpeed(t,e)}function a(t,e){var s;for(s=0;P>s;s+=1)g[s].animation.setDirection(t,e)}function r(t){var e;for(e=0;P>e;e+=1)g[e].animation.play(t)}function n(t,e){E=!1,b=Date.now();var s;for(s=0;P>s;s+=1)g[s].animation.moveFrame(t,e)}function o(t){var e,s=t-b;for(e=0;P>e;e+=1)g[e].animation.advanceTime(s);b=t,requestAnimationFrame(o)}function h(t){b=t,requestAnimationFrame(o)}function l(t){var e;for(e=0;P>e;e+=1)g[e].animation.pause(t)}function p(t,e,s){var i;for(i=0;P>i;i+=1)g[i].animation.goToAndStop(t,e,s)}function m(t){var e;for(e=0;P>e;e+=1)g[e].animation.stop(t)}function f(t){var e;for(e=0;P>e;e+=1)g[e].animation.togglePause(t)}function d(t){var e;for(e=0;P>e;e+=1)g[e].animation.destroy(t)}function c(t,s,i){var a,r=document.getElementsByClassName("bodymovin"),n=r.length;for(a=0;n>a;a+=1)i&&r[a].setAttribute("data-bm-type",i),e(r[a],t);if(s&&0===n){i||(i="svg");var o=document.getElementsByTagName("body")[0];o.innerHTML="";var h=document.createElement("div");h.style.width="100%",h.style.height="100%",h.setAttribute("data-bm-type",i),o.appendChild(h),e(h,t)}}function u(){var t;for(t=0;P>t;t+=1)g[t].animation.resize()}function y(){requestAnimationFrame(h)}var v={},g=[],b=0,E=!0,P=0;return setTimeout(y,0),v.registerAnimation=e,v.loadAnimation=s,v.setSpeed=i,v.setDirection=a,v.play=r,v.moveFrame=n,v.pause=l,v.stop=m,v.togglePause=f,v.searchAnimations=c,v.resize=u,v.start=y,v.goToAndStop=p,v.destroy=d,v}(),AnimationItem=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.pendingElements=0,this.playCount=0,this.prerenderFramesFlag=!0,this.repeat="indefinite",this.animationData={},this.layers=[],this.assets=[],this.isPaused=!0,this.isScrolling=!1,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=randomString(10),this.renderedFrameCount=0,this.scaleMode="fit",this.math=Math,this.removed=!1,this.timeCompleted=0,this.segmentPos=0,this.segments=[]};AnimationItem.prototype.setParams=function(t){var e=this;t.context&&(this.context=t.context),(t.wrapper||t.container)&&(this.wrapper=t.wrapper||t.container);var s=t.animType?t.animType:t.renderer?t.renderer:"canvas";switch(s){case"canvas":this.renderer=new CanvasRenderer(this,t.rendererSettings);break;case"svg":this.renderer=new SVGRenderer(this,t.rendererSettings);break;case"hybrid":case"html":default:this.renderer=new HybridRenderer(this,t.rendererSettings)}if(this.animType=s,""===t.loop||null===t.loop||(this.loop=t.loop===!1?!1:t.loop===!0?!0:parseInt(t.loop)),this.autoplay="autoplay"in t?t.autoplay:!0,this.name=t.name?t.name:"",this.prerenderFramesFlag="prerender"in t?t.prerender:!0,this.autoloadSegments=t.hasOwnProperty("autoloadSegments")?t.autoloadSegments:!0,t.animationData)e.configAnimation(t.animationData);else if(t.path){"json"!=t.path.substr(-4)&&("/"!=t.path.substr(-1,1)&&(t.path+="/"),t.path+="data.json");var i=new XMLHttpRequest;this.path=-1!=t.path.lastIndexOf("\\")?t.path.substr(0,t.path.lastIndexOf("\\")+1):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")),i.open("GET",t.path,!0),i.send(),i.onreadystatechange=function(){if(4==i.readyState)if(200==i.status)e.configAnimation(JSON.parse(i.responseText));else try{var t=JSON.parse(i.responseText);e.configAnimation(t)}catch(s){}}}},AnimationItem.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").value?i.getNamedItem("data-bm-renderer").value:i.getNamedItem("bm-renderer").value?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?!1:"true"===a?!0:parseInt(a)),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:"";var r=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:"";"false"===r&&(s.prerender=!1),this.setParams(s)},AnimationItem.prototype.includeLayers=function(t){t.op>this.animationData.op&&(this.animationData.op=t.op,this.totalFrames=Math.floor(t.op-this.animationData.ip),this.animationData.tf=this.totalFrames);var e,s,i=this.animationData.layers,a=i.length,r=t.layers,n=r.length;for(s=0;n>s;s+=1)for(e=0;a>e;){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;a>e;e+=1)this.animationData.assets.push(t.assets[e]);dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),this.renderer.includeLayers(t.layers),this.renderer.buildStage(this.container,this.layers),this.renderer.renderFrame(null),this.loadNextSegment()},AnimationItem.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(!t||0===t.length||!this.autoloadSegments)return this.trigger("data_ready"),void(this.timeCompleted=this.animationData.tf);var e=t.shift();this.timeCompleted=e.time*this.frameRate;var s=new XMLHttpRequest,i=this,a=this.path+this.fileName+"_"+this.segmentPos+".json";this.segmentPos+=1,s.open("GET",a,!0),s.send(),s.onreadystatechange=function(){if(4==s.readyState)if(200==s.status)i.includeLayers(JSON.parse(s.responseText));else try{var t=JSON.parse(s.responseText);i.includeLayers(t)}catch(e){}}},AnimationItem.prototype.loadSegments=function(){var t=this.animationData.segments;t||(this.timeCompleted=this.animationData.tf),this.loadNextSegment()},AnimationItem.prototype.configAnimation=function(t){this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.animationData.tf=this.totalFrames,this.renderer.configAnimation(t),t.assets||(t.assets=[]),t.comps&&(t.assets=t.assets.concat(t.comps),t.comps=null),this.animationData._id=this.animationID,this.animationData._animType=this.animType,this.layers=this.animationData.layers,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.loadSegments(),this.updaFrameModifier(),this.renderer.globalData.fontManager?this.waitForFontsLoaded():(dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),this.checkLoaded())},AnimationItem.prototype.waitForFontsLoaded=function(){function t(){this.renderer.globalData.fontManager.loaded?(dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),this.renderer.buildItems(this.animationData.layers),this.checkLoaded()):setTimeout(t.bind(this),20)}return function(){t.bind(this)()}}(),AnimationItem.prototype.elementLoaded=function(){this.pendingElements--,this.checkLoaded()},AnimationItem.prototype.checkLoaded=function(){0===this.pendingElements&&(this.renderer.buildStage(this.container,this.layers),this.trigger("DOMLoaded"),this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play())},AnimationItem.prototype.resize=function(){this.renderer.updateContainerSize()},AnimationItem.prototype.gotoFrame=function(){this.currentFrame=subframeEnabled?this.currentRawFrame:this.math.floor(this.currentRawFrame),this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this.renderFrame()},AnimationItem.prototype.renderFrame=function(){this.isLoaded!==!1&&this.renderer.renderFrame(this.currentFrame+this.firstFrame)},AnimationItem.prototype.play=function(t){t&&this.name!=t||this.isPaused===!0&&(this.isPaused=!1)},AnimationItem.prototype.pause=function(t){t&&this.name!=t||this.isPaused===!1&&(this.isPaused=!0)},AnimationItem.prototype.togglePause=function(t){t&&this.name!=t||(this.isPaused===!0?(this.isPaused=!1,this.play()):(this.isPaused=!0,this.pause()))},AnimationItem.prototype.stop=function(t){t&&this.name!=t||(this.isPaused=!0,this.currentFrame=this.currentRawFrame=0,this.playCount=0,this.gotoFrame())},AnimationItem.prototype.goToAndStop=function(t,e,s){s&&this.name!=s||(this.setCurrentRawFrameValue(e?t:t*this.frameModifier),this.isPaused=!0)},AnimationItem.prototype.advanceTime=function(t){this.isPaused!==!0&&this.isScrolling!==!0&&this.isLoaded!==!1&&this.setCurrentRawFrameValue(this.currentRawFrame+t*this.frameModifier)},AnimationItem.prototype.updateAnimation=function(t){this.setCurrentRawFrameValue(this.totalFrames*t)},AnimationItem.prototype.moveFrame=function(t,e){e&&this.name!=e||this.setCurrentRawFrameValue(this.currentRawFrame+t)},AnimationItem.prototype.adjustSegment=function(t){this.totalFrames=t[1]-t[0],this.firstFrame=t[0],this.trigger("segmentStart")},AnimationItem.prototype.playSegments=function(t,e){if("object"==typeof t[0]){var s,i=t.length;for(s=0;i>s;s+=1)this.segments.push(t[s])}else this.segments.push(t);e&&(this.adjustSegment(this.segments.shift()),this.setCurrentRawFrameValue(0)),this.isPaused&&this.play()},AnimationItem.prototype.resetSegments=function(t){this.segments.length=0,this.segments.push([this.animationData.ip*this.frameRate,Math.floor(this.animationData.op-this.animationData.ip+this.animationData.ip*this.frameRate)]),t&&this.adjustSegment(this.segments.shift())},AnimationItem.prototype.remove=function(t){t&&this.name!=t||this.renderer.destroy()},AnimationItem.prototype.destroy=function(t){t&&this.name!=t||this.renderer&&this.renderer.destroyed||(this.renderer.destroy(),this.trigger("destroy"),this._cbs=null)},AnimationItem.prototype.setCurrentRawFrameValue=function(t){this.currentRawFrame=t;var e=!1;if(this.currentRawFrame>=this.totalFrames){if(this.segments.length&&(e=!0),this.loop===!1)return this.currentRawFrame=this.totalFrames-.01,this.gotoFrame(),this.pause(),void this.trigger("complete");if(this.trigger("loopComplete"),this.playCount+=1,this.loop!==!0&&this.playCount==this.loop)return this.currentRawFrame=this.totalFrames-.01,this.gotoFrame(),this.pause(),void this.trigger("complete")}else if(this.currentRawFrame<0)return this.playCount-=1,this.playCount<0&&(this.playCount=0),this.loop===!1?(this.currentRawFrame=0,this.gotoFrame(),this.pause(),void this.trigger("complete")):(this.trigger("loopComplete"),this.currentRawFrame=this.totalFrames+this.currentRawFrame,void this.gotoFrame());if(e){var s=this.currentRawFrame%this.totalFrames;this.adjustSegment(this.segments.shift()),this.currentRawFrame=s}else this.currentRawFrame=this.currentRawFrame%this.totalFrames;this.gotoFrame()},AnimationItem.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},AnimationItem.prototype.setDirection=function(t){this.playDirection=0>t?-1:1,this.updaFrameModifier()},AnimationItem.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},AnimationItem.prototype.getPath=function(){return this.path},AnimationItem.prototype.getAssetData=function(t){for(var e=0,s=this.assets.length;s>e;){if(t==this.assets[e].id)return this.assets[e];e+=1}},AnimationItem.prototype.hide=function(){this.renderer.hide()},AnimationItem.prototype.show=function(){this.renderer.show()},AnimationItem.prototype.getAssets=function(){return this.assets},AnimationItem.prototype.trigger=function(t){if(this._cbs[t])switch(t){case"enterFrame":this.triggerEvent(t,new BMEnterFrameEvent(t,this.currentFrame,this.totalFrames,this.frameMult));break;case"loopComplete":this.triggerEvent(t,new BMCompleteLoopEvent(t,this.loop,this.playCount,this.frameMult));break;case"complete":this.triggerEvent(t,new BMCompleteEvent(t,this.frameMult));break;case"segmentStart":this.triggerEvent(t,new BMSegmentStartEvent(t,this.firstFrame,this.totalFrames));break;case"destroy":this.triggerEvent(t,new BMDestroyEvent(t,this));break;default:this.triggerEvent(t)}"enterFrame"===t&&this.onEnterFrame&&this.onEnterFrame.call(this,new BMEnterFrameEvent(t,this.currentFrame,this.totalFrames,this.frameMult)),"loopComplete"===t&&this.onLoopComplete&&this.onLoopComplete.call(this,new BMCompleteLoopEvent(t,this.loop,this.playCount,this.frameMult)),"complete"===t&&this.onComplete&&this.onComplete.call(this,new BMCompleteEvent(t,this.frameMult)),"segmentStart"===t&&this.onSegmentStart&&this.onSegmentStart.call(this,new BMSegmentStartEvent(t,this.firstFrame,this.totalFrames)),"destroy"===t&&this.onDestroy&&this.onDestroy.call(this,new BMDestroyEvent(t,this))},AnimationItem.prototype.addEventListener=_addEventListener,AnimationItem.prototype.removeEventListener=_removeEventListener,AnimationItem.prototype.triggerEvent=_triggerEvent;var bodymovinjs = {}; function play(animation){ animationManager.play(animation); } function pause(animation){ animationManager.pause(animation); } function togglePause(animation){ animationManager.togglePause(animation); } function setSpeed(value,animation){ animationManager.setSpeed(value, animation); } function setDirection(value,animation){ animationManager.setDirection(value, animation); } function stop(animation){ animationManager.stop(animation); } function moveFrame(value){ animationManager.moveFrame(value); } function searchAnimations(){ if(standalone === true){ animationManager.searchAnimations(animationData,standalone, renderer); }else{ animationManager.searchAnimations(); } } function registerAnimation(elem){ return animationManager.registerAnimation(elem); } function resize(){ animationManager.resize(); } function start(){ animationManager.start(); } function goToAndStop(val,isFrame, animation){ animationManager.goToAndStop(val,isFrame, animation); } function setSubframeRendering(flag){ subframeEnabled = flag; } function loadAnimation(params){ if(standalone === true){ params.animationData = JSON.parse(animationData); } return animationManager.loadAnimation(params); } function destroy(animation){ return animationManager.destroy(animation); } function setQuality(value){ if(typeof value === 'string'){ switch(value){ case 'high': defaultCurveSegments = 200; break; case 'medium': defaultCurveSegments = 50; break; case 'low': defaultCurveSegments = 10; break; } }else if(!isNaN(value) && value > 1){ defaultCurveSegments = value; } if(defaultCurveSegments >= 50){ roundValues(false); }else{ roundValues(true); } } bodymovinjs.play = play; bodymovinjs.pause = pause; bodymovinjs.togglePause = togglePause; bodymovinjs.setSpeed = setSpeed; bodymovinjs.setDirection = setDirection; bodymovinjs.stop = stop; bodymovinjs.moveFrame = moveFrame; bodymovinjs.searchAnimations = searchAnimations; bodymovinjs.registerAnimation = registerAnimation; bodymovinjs.loadAnimation = loadAnimation; bodymovinjs.setSubframeRendering = setSubframeRendering; bodymovinjs.resize = resize; bodymovinjs.start = start; bodymovinjs.goToAndStop = goToAndStop; bodymovinjs.destroy = destroy; bodymovinjs.setQuality = setQuality; bodymovinjs.version = '4.1.2'; function checkReady(){ if (document.readyState === "complete") { clearInterval(readyStateCheckInterval); searchAnimations(); } } function getQueryVariable(variable) { var vars = queryString.split('&'); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split('='); if (decodeURIComponent(pair[0]) == variable) { return decodeURIComponent(pair[1]); } } } var standalone = '__[STANDALONE]__'; var animationData = '__[ANIMATIONDATA]__'; var renderer = ''; if(standalone) { var scripts = document.getElementsByTagName('script'); var index = scripts.length - 1; var myScript = scripts[index]; var queryString = myScript.src.replace(/^[^\?]+\??/,''); renderer = getQueryVariable('renderer'); } var readyStateCheckInterval = setInterval(checkReady, 100); return bodymovinjs; })); 