"undefined"!=typeof navigator&&function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).lottie=e()}(this,(function(){"use strict";var t="",e=!1,i=-999999,s=function(){return t};function r(t){return document.createElement(t)}function a(t,e){var i,s,r=t.length;for(i=0;i<r;i+=1)for(var a in s=t[i].prototype)Object.prototype.hasOwnProperty.call(s,a)&&(e.prototype[a]=s[a])}function n(t,e){return Object.getOwnPropertyDescriptor(t,e)}function o(t){function e(){}return e.prototype=t,e}var h=function(){function t(t){this.audios=[],this.audioFactory=t,this._volume=1,this._isMuted=!1}return t.prototype={addAudio:function(t){this.audios.push(t)},pause:function(){var t,e=this.audios.length;for(t=0;t<e;t+=1)this.audios[t].pause()},resume:function(){var t,e=this.audios.length;for(t=0;t<e;t+=1)this.audios[t].resume()},setRate:function(t){var e,i=this.audios.length;for(e=0;e<i;e+=1)this.audios[e].setRate(t)},createAudio:function(t){return this.audioFactory?this.audioFactory(t):window.Howl?new window.Howl({src:[t]}):{isPlaying:!1,play:function(){this.isPlaying=!0},seek:function(){this.isPlaying=!1},playing:function(){},rate:function(){},setVolume:function(){}}},setAudioFactory:function(t){this.audioFactory=t},setVolume:function(t){this._volume=t,this._updateVolume()},mute:function(){this._isMuted=!0,this._updateVolume()},unmute:function(){this._isMuted=!1,this._updateVolume()},getVolume:function(){return this._volume},_updateVolume:function(){var t,e=this.audios.length;for(t=0;t<e;t+=1)this.audios[t].volume(this._volume*(this._isMuted?0:1))}},function(){return new t}}(),l=function(){function t(t,e){var i,s=0,r=[];switch(t){case"int16":case"uint8c":i=1;break;default:i=1.1}for(s=0;s<e;s+=1)r.push(i);return r}return"function"==typeof Uint8ClampedArray&&"function"==typeof Float32Array?function(e,i){return"float32"===e?new Float32Array(i):"int16"===e?new Int16Array(i):"uint8c"===e?new Uint8ClampedArray(i):t(e,i)}:t}();function p(t){return Array.apply(null,{length:t})}function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}var m=!0,d=null,u="",c=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),g=Math.pow,y=Math.sqrt,v=Math.floor,b=Math.max,_=Math.min,k={};!function(){var t,e=["abs","acos","acosh","asin","asinh","atan","atanh","atan2","ceil","cbrt","expm1","clz32","cos","cosh","exp","floor","fround","hypot","imul","log","log1p","log2","log10","max","min","pow","random","round","sign","sin","sinh","sqrt","tan","tanh","trunc","E","LN10","LN2","LOG10E","LOG2E","PI","SQRT1_2","SQRT2"],i=e.length;for(t=0;t<i;t+=1)k[e[t]]=Math[e[t]]}(),k.random=Math.random,k.abs=function(t){if("object"===f(t)&&t.length){var e,i=p(t.length),s=t.length;for(e=0;e<s;e+=1)i[e]=Math.abs(t[e]);return i}return Math.abs(t)};var x=150,P=Math.PI/180,A=.5519;function w(t){!!t}function E(t){t.style.position="absolute",t.style.top=0,t.style.left=0,t.style.display="block",t.style.transformOrigin="0 0",t.style.webkitTransformOrigin="0 0",t.style.backfaceVisibility="visible",t.style.webkitBackfaceVisibility="visible",t.style.transformStyle="preserve-3d",t.style.webkitTransformStyle="preserve-3d",t.style.mozTransformStyle="preserve-3d"}function C(t,e,i,s){this.type=t,this.currentTime=e,this.totalTime=i,this.direction=s<0?-1:1}function D(t,e){this.type=t,this.direction=e<0?-1:1}function S(t,e,i,s){this.type=t,this.currentLoop=i,this.totalLoops=e,this.direction=s<0?-1:1}function M(t,e,i){this.type=t,this.firstFrame=e,this.totalFrames=i}function F(t,e){this.type=t,this.target=e}function T(t,e){this.type="renderFrameError",this.nativeError=t,this.currentTime=e}function I(t){this.type="configError",this.nativeError=t}var B,L=(B=0,function(){return u+"__lottie_element_"+(B+=1)});function z(t,e,i){var s,r,a,n,o,h,l,p;switch(h=i*(1-e),l=i*(1-(o=6*t-(n=Math.floor(6*t)))*e),p=i*(1-(1-o)*e),n%6){case 0:s=i,r=p,a=h;break;case 1:s=l,r=i,a=h;break;case 2:s=h,r=i,a=p;break;case 3:s=h,r=l,a=i;break;case 4:s=p,r=h,a=i;break;case 5:s=i,r=h,a=l}return[s,r,a]}function R(t,e,i){var s,r=Math.max(t,e,i),a=Math.min(t,e,i),n=r-a,o=0===r?0:n/r,h=r/255;switch(r){case a:s=0;break;case t:s=e-i+n*(e<i?6:0),s/=6*n;break;case e:s=i-t+2*n,s/=6*n;break;case i:s=t-e+4*n,s/=6*n}return[s,o,h]}function V(t,e){var i=R(255*t[0],255*t[1],255*t[2]);return i[1]+=e,i[1]>1?i[1]=1:i[1]<=0&&(i[1]=0),z(i[0],i[1],i[2])}function O(t,e){var i=R(255*t[0],255*t[1],255*t[2]);return i[2]+=e,i[2]>1?i[2]=1:i[2]<0&&(i[2]=0),z(i[0],i[1],i[2])}function N(t,e){var i=R(255*t[0],255*t[1],255*t[2]);return i[0]+=e/360,i[0]>1?i[0]-=1:i[0]<0&&(i[0]+=1),z(i[0],i[1],i[2])}var G=function(){var t,e,i=[];for(t=0;t<256;t+=1)e=t.toString(16),i[t]=1===e.length?"0"+e:e;return function(t,e,s){return t<0&&(t=0),e<0&&(e=0),s<0&&(s=0),"#"+i[t]+i[e]+i[s]}}(),j=function(){return d},q=function(t){x=t},W=function(){return x};function H(t){return document.createElementNS("http://www.w3.org/2000/svg",t)}function X(t){return X="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},X(t)}var Y=function(){var t,i,s=1,r=[],a={onmessage:function(){},postMessage:function(e){t({data:e})}},n={postMessage:function(t){a.onmessage({data:t})}};function o(i){if(window.Worker&&window.Blob&&e){var s=new Blob(["var _workerSelf = self; self.onmessage = ",i.toString()],{type:"text/javascript"}),r=URL.createObjectURL(s);return new Worker(r)}return t=i,a}function h(){i||(i=o((function(t){if(n.dataManager||(n.dataManager=function(){function t(r,a){var n,o,h,l,p,m,d=r.length;for(o=0;o<d;o+=1)if("ks"in(n=r[o])&&!n.completed){if(n.completed=!0,n.tt&&(r[o-1].td=n.tt),n.hasMask){var u=n.masksProperties;for(l=u.length,h=0;h<l;h+=1)if(u[h].pt.k.i)s(u[h].pt.k);else for(m=u[h].pt.k.length,p=0;p<m;p+=1)u[h].pt.k[p].s&&s(u[h].pt.k[p].s[0]),u[h].pt.k[p].e&&s(u[h].pt.k[p].e[0])}0===n.ty?(n.layers=e(n.refId,a),t(n.layers,a)):4===n.ty?i(n.shapes):5===n.ty&&f(n)}}function e(t,e){var i=function(t,e){for(var i=0,s=e.length;i<s;){if(e[i].id===t)return e[i];i+=1}return null}(t,e);return i?i.layers.__used?JSON.parse(JSON.stringify(i.layers)):(i.layers.__used=!0,i.layers):null}function i(t){var e,r,a;for(e=t.length-1;e>=0;e-=1)if("sh"===t[e].ty)if(t[e].ks.k.i)s(t[e].ks.k);else for(a=t[e].ks.k.length,r=0;r<a;r+=1)t[e].ks.k[r].s&&s(t[e].ks.k[r].s[0]),t[e].ks.k[r].e&&s(t[e].ks.k[r].e[0]);else"gr"===t[e].ty&&i(t[e].it)}function s(t){var e,i=t.i.length;for(e=0;e<i;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 r(t,e){var i=e?e.split("."):[100,100,100];return t[0]>i[0]||!(i[0]>t[0])&&(t[1]>i[1]||!(i[1]>t[1])&&(t[2]>i[2]||!(i[2]>t[2])&&null))}var a,n=function(){var t=[4,4,14];function e(t){var e,i,s,r=t.length;for(e=0;e<r;e+=1)5===t[e].ty&&(s=void 0,s=(i=t[e]).t.d,i.t.d={k:[{s:s,t:0}]})}return function(i){if(r(t,i.v)&&(e(i.layers),i.assets)){var s,a=i.assets.length;for(s=0;s<a;s+=1)i.assets[s].layers&&e(i.assets[s].layers)}}}(),o=(a=[4,7,99],function(t){if(t.chars&&!r(a,t.v)){var e,s=t.chars.length;for(e=0;e<s;e+=1){var n=t.chars[e];n.data&&n.data.shapes&&(i(n.data.shapes),n.data.ip=0,n.data.op=99999,n.data.st=0,n.data.sr=1,n.data.ks={p:{k:[0,0],a:0},s:{k:[100,100],a:0},a:{k:[0,0],a:0},r:{k:0,a:0},o:{k:100,a:0}},t.chars[e].t||(n.data.shapes.push({ty:"no"}),n.data.shapes[0].it.push({p:{k:[0,0],a:0},s:{k:[100,100],a:0},a:{k:[0,0],a:0},r:{k:0,a:0},o:{k:100,a:0},sk:{k:0,a:0},sa:{k:0,a:0},ty:"tr"})))}}}),h=function(){var t=[5,7,15];function e(t){var e,i,s=t.length;for(e=0;e<s;e+=1)5===t[e].ty&&(i=void 0,"number"==typeof(i=t[e].t.p).a&&(i.a={a:0,k:i.a}),"number"==typeof i.p&&(i.p={a:0,k:i.p}),"number"==typeof i.r&&(i.r={a:0,k:i.r}))}return function(i){if(r(t,i.v)&&(e(i.layers),i.assets)){var s,a=i.assets.length;for(s=0;s<a;s+=1)i.assets[s].layers&&e(i.assets[s].layers)}}}(),l=function(){var t=[4,1,9];function e(t){var i,s,r,a=t.length;for(i=0;i<a;i+=1)if("gr"===t[i].ty)e(t[i].it);else if("fl"===t[i].ty||"st"===t[i].ty)if(t[i].c.k&&t[i].c.k[0].i)for(r=t[i].c.k.length,s=0;s<r;s+=1)t[i].c.k[s].s&&(t[i].c.k[s].s[0]/=255,t[i].c.k[s].s[1]/=255,t[i].c.k[s].s[2]/=255,t[i].c.k[s].s[3]/=255),t[i].c.k[s].e&&(t[i].c.k[s].e[0]/=255,t[i].c.k[s].e[1]/=255,t[i].c.k[s].e[2]/=255,t[i].c.k[s].e[3]/=255);else t[i].c.k[0]/=255,t[i].c.k[1]/=255,t[i].c.k[2]/=255,t[i].c.k[3]/=255}function i(t){var i,s=t.length;for(i=0;i<s;i+=1)4===t[i].ty&&e(t[i].shapes)}return function(e){if(r(t,e.v)&&(i(e.layers),e.assets)){var s,a=e.assets.length;for(s=0;s<a;s+=1)e.assets[s].layers&&i(e.assets[s].layers)}}}(),p=function(){var t=[4,4,18];function e(t){var i,s,r;for(i=t.length-1;i>=0;i-=1)if("sh"===t[i].ty)if(t[i].ks.k.i)t[i].ks.k.c=t[i].closed;else for(r=t[i].ks.k.length,s=0;s<r;s+=1)t[i].ks.k[s].s&&(t[i].ks.k[s].s[0].c=t[i].closed),t[i].ks.k[s].e&&(t[i].ks.k[s].e[0].c=t[i].closed);else"gr"===t[i].ty&&e(t[i].it)}function i(t){var i,s,r,a,n,o,h=t.length;for(s=0;s<h;s+=1){if((i=t[s]).hasMask){var l=i.masksProperties;for(a=l.length,r=0;r<a;r+=1)if(l[r].pt.k.i)l[r].pt.k.c=l[r].cl;else for(o=l[r].pt.k.length,n=0;n<o;n+=1)l[r].pt.k[n].s&&(l[r].pt.k[n].s[0].c=l[r].cl),l[r].pt.k[n].e&&(l[r].pt.k[n].e[0].c=l[r].cl)}4===i.ty&&e(i.shapes)}}return function(e){if(r(t,e.v)&&(i(e.layers),e.assets)){var s,a=e.assets.length;for(s=0;s<a;s+=1)e.assets[s].layers&&i(e.assets[s].layers)}}}();function f(t){0===t.t.a.length&&t.t.p}var m={completeData:function(i){i.__complete||(l(i),n(i),o(i),h(i),p(i),t(i.layers,i.assets),function(i,s){if(i){var r=0,a=i.length;for(r=0;r<a;r+=1)1===i[r].t&&(i[r].data.layers=e(i[r].data.refId,s),t(i[r].data.layers,s))}}(i.chars,i.assets),i.__complete=!0)}};return m.checkColors=l,m.checkChars=o,m.checkPathProperties=h,m.checkShapes=p,m.completeLayers=t,m}()),n.assetLoader||(n.assetLoader=function(){function t(t){var e=t.getResponseHeader("content-type");return e&&"json"===t.responseType&&-1!==e.indexOf("json")||t.response&&"object"===X(t.response)?t.response:t.response&&"string"==typeof t.response?JSON.parse(t.response):t.responseText?JSON.parse(t.responseText):null}return{load:function(e,i,s,r){var a,n=new XMLHttpRequest;try{n.responseType="json"}catch(t){}n.onreadystatechange=function(){if(4===n.readyState)if(200===n.status)a=t(n),s(a);else try{a=t(n),s(a)}catch(t){r&&r(t)}};try{n.open("GET",e,!0)}catch(t){n.open("GET",i+"/"+e,!0)}n.send()}}}()),"loadAnimation"===t.data.type)n.assetLoader.load(t.data.path,t.data.fullPath,(function(e){n.dataManager.completeData(e),n.postMessage({id:t.data.id,payload:e,status:"success"})}),(function(){n.postMessage({id:t.data.id,status:"error"})}));else if("complete"===t.data.type){var e=t.data.animation;n.dataManager.completeData(e),n.postMessage({id:t.data.id,payload:e,status:"success"})}else"loadData"===t.data.type&&n.assetLoader.load(t.data.path,t.data.fullPath,(function(e){n.postMessage({id:t.data.id,payload:e,status:"success"})}),(function(){n.postMessage({id:t.data.id,status:"error"})}))})),i.onmessage=function(t){var e=t.data,i=e.id,s=r[i];r[i]=null,"success"===e.status?s.onComplete(e.payload):s.onError&&s.onError()})}function l(t,e){var i="processId_"+(s+=1);return r[i]={onComplete:t,onError:e},i}return{loadAnimation:function(t,e,s){h();var r=l(e,s);i.postMessage({type:"loadAnimation",path:t,fullPath:window.location.origin+window.location.pathname,id:r})},loadData:function(t,e,s){h();var r=l(e,s);i.postMessage({type:"loadData",path:t,fullPath:window.location.origin+window.location.pathname,id:r})},completeAnimation:function(t,e,s){h();var r=l(e,s);i.postMessage({type:"complete",animation:t,id:r})}}}(),Z=function(){var t=function(){var t=r("canvas");t.width=1,t.height=1;var e=t.getContext("2d");return e.fillStyle="rgba(0,0,0,0)",e.fillRect(0,0,1,1),t}();function e(){this.loadedAssets+=1,this.loadedAssets===this.totalImages&&this.loadedFootagesCount===this.totalFootages&&this.imagesLoadedCb&&this.imagesLoadedCb(null)}function i(){this.loadedFootagesCount+=1,this.loadedAssets===this.totalImages&&this.loadedFootagesCount===this.totalFootages&&this.imagesLoadedCb&&this.imagesLoadedCb(null)}function s(t,e,i){var s="";if(t.e)s=t.p;else if(e){var r=t.p;-1!==r.indexOf("images/")&&(r=r.split("/")[1]),s=e+r}else s=i,s+=t.u?t.u:"",s+=t.p;return s}function a(t){var e=0,i=setInterval(function(){(t.getBBox().width||e>500)&&(this._imageLoaded(),clearInterval(i)),e+=1}.bind(this),50)}function n(t){var e={assetData:t},i=s(t,this.assetsPath,this.path);return Y.loadData(i,function(t){e.img=t,this._footageLoaded()}.bind(this),function(){e.img={},this._footageLoaded()}.bind(this)),e}function o(){this._imageLoaded=e.bind(this),this._footageLoaded=i.bind(this),this.testImageLoaded=a.bind(this),this.createFootageData=n.bind(this),this.assetsPath="",this.path="",this.totalImages=0,this.totalFootages=0,this.loadedAssets=0,this.loadedFootagesCount=0,this.imagesLoadedCb=null,this.images=[]}return o.prototype={loadAssets:function(t,e){var i;this.imagesLoadedCb=e;var s=t.length;for(i=0;i<s;i+=1)t[i].layers||(t[i].t&&"seq"!==t[i].t?3===t[i].t&&(this.totalFootages+=1,this.images.push(this.createFootageData(t[i]))):(this.totalImages+=1,this.images.push(this._createImageData(t[i]))))},setAssetsPath:function(t){this.assetsPath=t||""},setPath:function(t){this.path=t||""},loadedImages:function(){return this.totalImages===this.loadedAssets},loadedFootages:function(){return this.totalFootages===this.loadedFootagesCount},destroy:function(){this.imagesLoadedCb=null,this.images.length=0},getAsset:function(t){for(var e=0,i=this.images.length;e<i;){if(this.images[e].assetData===t)return this.images[e].img;e+=1}return null},createImgData:function(e){var i=s(e,this.assetsPath,this.path),a=r("img");a.crossOrigin="anonymous",a.addEventListener("load",this._imageLoaded,!1),a.addEventListener("error",function(){n.img=t,this._imageLoaded()}.bind(this),!1),a.src=i;var n={img:a,assetData:e};return n},createImageData:function(e){var i=s(e,this.assetsPath,this.path),r=H("image");c?this.testImageLoaded(r):r.addEventListener("load",this._imageLoaded,!1),r.addEventListener("error",function(){a.img=t,this._imageLoaded()}.bind(this),!1),r.setAttributeNS("http://www.w3.org/1999/xlink","href",i),this._elementHelper.append?this._elementHelper.append(r):this._elementHelper.appendChild(r);var a={img:r,assetData:e};return a},imageLoaded:e,footageLoaded:i,setCacheType:function(t,e){"svg"===t?(this._elementHelper=e,this._createImageData=this.createImageData.bind(this)):this._createImageData=this.createImgData.bind(this)}},o}();function K(){}K.prototype={triggerEvent:function(t,e){if(this._cbs[t])for(var i=this._cbs[t],s=0;s<i.length;s+=1)i[s](e)},addEventListener:function(t,e){return this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e),function(){this.removeEventListener(t,e)}.bind(this)},removeEventListener:function(t,e){if(e){if(this._cbs[t]){for(var i=0,s=this._cbs[t].length;i<s;)this._cbs[t][i]===e&&(this._cbs[t].splice(i,1),i-=1,s-=1),i+=1;this._cbs[t].length||(this._cbs[t]=null)}}else this._cbs[t]=null}};var J=function(){function t(t){for(var e,i=t.split("\r\n"),s={},r=0,a=0;a<i.length;a+=1)2===(e=i[a].split(":")).length&&(s[e[0]]=e[1].trim(),r+=1);if(0===r)throw new Error;return s}return function(e){for(var i=[],s=0;s<e.length;s+=1){var r=e[s],a={time:r.tm,duration:r.dr};try{a.payload=JSON.parse(e[s].cm)}catch(i){try{a.payload=t(e[s].cm)}catch(t){a.payload={name:e[s]}}}i.push(a)}return i}}(),U=function(){function t(t){this.compositions.push(t)}return function(){function e(t){for(var e=0,i=this.compositions.length;e<i;){if(this.compositions[e].data&&this.compositions[e].data.nm===t)return this.compositions[e].prepareFrame&&this.compositions[e].data.xt&&this.compositions[e].prepareFrame(this.currentFrame),this.compositions[e].compInterface;e+=1}return null}return e.compositions=[],e.currentFrame=0,e.registerComposition=t,e}}(),Q={};function $(t){return $="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},$(t)}var tt=function(){this._cbs=[],this.name="",this.path="",this.isLoaded=!1,this.currentFrame=0,this.currentRawFrame=0,this.firstFrame=0,this.totalFrames=0,this.frameRate=0,this.frameMult=0,this.playSpeed=1,this.playDirection=1,this.playCount=0,this.animationData={},this.assets=[],this.isPaused=!0,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=L(),this.assetsPath="",this.timeCompleted=0,this.segmentPos=0,this.isSubframeEnabled=m,this.segments=[],this._idle=!0,this._completedLoop=!1,this.projectInterface=U(),this.imagePreloader=new Z,this.audioController=h(),this.markers=[],this.configAnimation=this.configAnimation.bind(this),this.onSetupError=this.onSetupError.bind(this),this.onSegmentComplete=this.onSegmentComplete.bind(this),this.drawnFrameEvent=new C("drawnFrame",0,0,0)};a([K],tt),tt.prototype.setParams=function(t){(t.wrapper||t.container)&&(this.wrapper=t.wrapper||t.container);var e="svg";t.animType?e=t.animType:t.renderer&&(e=t.renderer);var i=Q[e];this.renderer=new i(this,t.rendererSettings),this.imagePreloader.setCacheType(e,this.renderer.globalData.defs),this.renderer.setProjectInterface(this.projectInterface),this.animType=e,""===t.loop||null===t.loop||void 0===t.loop||!0===t.loop?this.loop=!0:!1===t.loop?this.loop=!1:this.loop=parseInt(t.loop,10),this.autoplay=!("autoplay"in t)||t.autoplay,this.name=t.name?t.name:"",this.autoloadSegments=!Object.prototype.hasOwnProperty.call(t,"autoloadSegments")||t.autoloadSegments,this.assetsPath=t.assetsPath,this.initialSegment=t.initialSegment,t.audioFactory&&this.audioController.setAudioFactory(t.audioFactory),t.animationData?this.setupAnimation(t.animationData):t.path&&(-1!==t.path.lastIndexOf("\\")?this.path=t.path.substr(0,t.path.lastIndexOf("\\")+1):this.path=t.path.substr(0,t.path.lastIndexOf("/")+1),this.fileName=t.path.substr(t.path.lastIndexOf("/")+1),this.fileName=this.fileName.substr(0,this.fileName.lastIndexOf(".json")),Y.loadAnimation(t.path,this.configAnimation,this.onSetupError))},tt.prototype.onSetupError=function(){this.trigger("data_failed")},tt.prototype.setupAnimation=function(t){Y.completeAnimation(t,this.configAnimation)},tt.prototype.setData=function(t,e){e&&"object"!==$(e)&&(e=JSON.parse(e));var i={wrapper:t,animationData:e},s=t.attributes;i.path=s.getNamedItem("data-animation-path")?s.getNamedItem("data-animation-path").value:s.getNamedItem("data-bm-path")?s.getNamedItem("data-bm-path").value:s.getNamedItem("bm-path")?s.getNamedItem("bm-path").value:"",i.animType=s.getNamedItem("data-anim-type")?s.getNamedItem("data-anim-type").value:s.getNamedItem("data-bm-type")?s.getNamedItem("data-bm-type").value:s.getNamedItem("bm-type")?s.getNamedItem("bm-type").value:s.getNamedItem("data-bm-renderer")?s.getNamedItem("data-bm-renderer").value:s.getNamedItem("bm-renderer")?s.getNamedItem("bm-renderer").value:"canvas";var r=s.getNamedItem("data-anim-loop")?s.getNamedItem("data-anim-loop").value:s.getNamedItem("data-bm-loop")?s.getNamedItem("data-bm-loop").value:s.getNamedItem("bm-loop")?s.getNamedItem("bm-loop").value:"";"false"===r?i.loop=!1:"true"===r?i.loop=!0:""!==r&&(i.loop=parseInt(r,10));var a=s.getNamedItem("data-anim-autoplay")?s.getNamedItem("data-anim-autoplay").value:s.getNamedItem("data-bm-autoplay")?s.getNamedItem("data-bm-autoplay").value:!s.getNamedItem("bm-autoplay")||s.getNamedItem("bm-autoplay").value;i.autoplay="false"!==a,i.name=s.getNamedItem("data-name")?s.getNamedItem("data-name").value:s.getNamedItem("data-bm-name")?s.getNamedItem("data-bm-name").value:s.getNamedItem("bm-name")?s.getNamedItem("bm-name").value:"","false"===(s.getNamedItem("data-anim-prerender")?s.getNamedItem("data-anim-prerender").value:s.getNamedItem("data-bm-prerender")?s.getNamedItem("data-bm-prerender").value:s.getNamedItem("bm-prerender")?s.getNamedItem("bm-prerender").value:"")&&(i.prerender=!1),this.setParams(i)},tt.prototype.includeLayers=function(t){t.op>this.animationData.op&&(this.animationData.op=t.op,this.totalFrames=Math.floor(t.op-this.animationData.ip));var e,i,s=this.animationData.layers,r=s.length,a=t.layers,n=a.length;for(i=0;i<n;i+=1)for(e=0;e<r;){if(s[e].id===a[i].id){s[e]=a[i];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(r=t.assets.length,e=0;e<r;e+=1)this.animationData.assets.push(t.assets[e]);this.animationData.__complete=!1,Y.completeAnimation(this.animationData,this.onSegmentComplete)},tt.prototype.onSegmentComplete=function(t){this.animationData=t;var e=j();e&&e.initExpressions(this),this.loadNextSegment()},tt.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(!t||0===t.length||!this.autoloadSegments)return this.trigger("data_ready"),void(this.timeCompleted=this.totalFrames);var e=t.shift();this.timeCompleted=e.time*this.frameRate;var i=this.path+this.fileName+"_"+this.segmentPos+".json";this.segmentPos+=1,Y.loadData(i,this.includeLayers.bind(this),function(){this.trigger("data_failed")}.bind(this))},tt.prototype.loadSegments=function(){this.animationData.segments||(this.timeCompleted=this.totalFrames),this.loadNextSegment()},tt.prototype.imagesLoaded=function(){this.trigger("loaded_images"),this.checkLoaded()},tt.prototype.preloadImages=function(){this.imagePreloader.setAssetsPath(this.assetsPath),this.imagePreloader.setPath(this.path),this.imagePreloader.loadAssets(this.animationData.assets,this.imagesLoaded.bind(this))},tt.prototype.configAnimation=function(t){if(this.renderer)try{this.animationData=t,this.initialSegment?(this.totalFrames=Math.floor(this.initialSegment[1]-this.initialSegment[0]),this.firstFrame=Math.round(this.initialSegment[0])):(this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.firstFrame=Math.round(this.animationData.ip)),this.renderer.configAnimation(t),t.assets||(t.assets=[]),this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.frameMult=this.animationData.fr/1e3,this.renderer.searchExtraCompositions(t.assets),this.markers=J(t.markers||[]),this.trigger("config_ready"),this.preloadImages(),this.loadSegments(),this.updaFrameModifier(),this.waitForFontsLoaded(),this.isPaused&&this.audioController.pause()}catch(t){this.triggerConfigError(t)}},tt.prototype.waitForFontsLoaded=function(){this.renderer&&(this.renderer.globalData.fontManager.isLoaded?this.checkLoaded():setTimeout(this.waitForFontsLoaded.bind(this),20))},tt.prototype.checkLoaded=function(){if(!this.isLoaded&&this.renderer.globalData.fontManager.isLoaded&&(this.imagePreloader.loadedImages()||"canvas"!==this.renderer.rendererType)&&this.imagePreloader.loadedFootages()){this.isLoaded=!0;var t=j();t&&t.initExpressions(this),this.renderer.initItems(),setTimeout(function(){this.trigger("DOMLoaded")}.bind(this),0),this.gotoFrame(),this.autoplay&&this.play()}},tt.prototype.resize=function(){this.renderer.updateContainerSize()},tt.prototype.setSubframe=function(t){this.isSubframeEnabled=!!t},tt.prototype.gotoFrame=function(){this.currentFrame=this.isSubframeEnabled?this.currentRawFrame:~~this.currentRawFrame,this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this.renderFrame(),this.trigger("drawnFrame")},tt.prototype.renderFrame=function(){if(!1!==this.isLoaded&&this.renderer)try{this.renderer.renderFrame(this.currentFrame+this.firstFrame)}catch(t){this.triggerRenderFrameError(t)}},tt.prototype.play=function(t){t&&this.name!==t||!0===this.isPaused&&(this.isPaused=!1,this.trigger("_pause"),this.audioController.resume(),this._idle&&(this._idle=!1,this.trigger("_active")))},tt.prototype.pause=function(t){t&&this.name!==t||!1===this.isPaused&&(this.isPaused=!0,this.trigger("_play"),this._idle=!0,this.trigger("_idle"),this.audioController.pause())},tt.prototype.togglePause=function(t){t&&this.name!==t||(!0===this.isPaused?this.play():this.pause())},tt.prototype.stop=function(t){t&&this.name!==t||(this.pause(),this.playCount=0,this._completedLoop=!1,this.setCurrentRawFrameValue(0))},tt.prototype.getMarkerData=function(t){for(var e,i=0;i<this.markers.length;i+=1)if((e=this.markers[i]).payload&&e.payload.name.cm===t)return e;return null},tt.prototype.goToAndStop=function(t,e,i){if(!i||this.name===i){var s=Number(t);if(isNaN(s)){var r=this.getMarkerData(t);r&&this.goToAndStop(r.time,!0)}else e?this.setCurrentRawFrameValue(t):this.setCurrentRawFrameValue(t*this.frameModifier);this.pause()}},tt.prototype.goToAndPlay=function(t,e,i){if(!i||this.name===i){var s=Number(t);if(isNaN(s)){var r=this.getMarkerData(t);r&&(r.duration?this.playSegments([r.time,r.time+r.duration],!0):this.goToAndStop(r.time,!0))}else this.goToAndStop(s,e,i);this.play()}},tt.prototype.advanceTime=function(t){if(!0!==this.isPaused&&!1!==this.isLoaded){var e=this.currentRawFrame+t*this.frameModifier,i=!1;e>=this.totalFrames-1&&this.frameModifier>0?this.loop&&this.playCount!==this.loop?e>=this.totalFrames?(this.playCount+=1,this.checkSegments(e%this.totalFrames)||(this.setCurrentRawFrameValue(e%this.totalFrames),this._completedLoop=!0,this.trigger("loopComplete"))):this.setCurrentRawFrameValue(e):this.checkSegments(e>this.totalFrames?e%this.totalFrames:0)||(i=!0,e=this.totalFrames-1):e<0?this.checkSegments(e%this.totalFrames)||(!this.loop||this.playCount--<=0&&!0!==this.loop?(i=!0,e=0):(this.setCurrentRawFrameValue(this.totalFrames+e%this.totalFrames),this._completedLoop?this.trigger("loopComplete"):this._completedLoop=!0)):this.setCurrentRawFrameValue(e),i&&(this.setCurrentRawFrameValue(e),this.pause(),this.trigger("complete"))}},tt.prototype.adjustSegment=function(t,e){this.playCount=0,t[1]<t[0]?(this.frameModifier>0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(-1)),this.totalFrames=t[0]-t[1],this.timeCompleted=this.totalFrames,this.firstFrame=t[1],this.setCurrentRawFrameValue(this.totalFrames-.001-e)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.totalFrames=t[1]-t[0],this.timeCompleted=this.totalFrames,this.firstFrame=t[0],this.setCurrentRawFrameValue(.001+e)),this.trigger("segmentStart")},tt.prototype.setSegment=function(t,e){var i=-1;this.isPaused&&(this.currentRawFrame+this.firstFrame<t?i=t:this.currentRawFrame+this.firstFrame>e&&(i=e-t)),this.firstFrame=t,this.totalFrames=e-t,this.timeCompleted=this.totalFrames,-1!==i&&this.goToAndStop(i,!0)},tt.prototype.playSegments=function(t,e){if(e&&(this.segments.length=0),"object"===$(t[0])){var i,s=t.length;for(i=0;i<s;i+=1)this.segments.push(t[i])}else this.segments.push(t);this.segments.length&&e&&this.adjustSegment(this.segments.shift(),0),this.isPaused&&this.play()},tt.prototype.resetSegments=function(t){this.segments.length=0,this.segments.push([this.animationData.ip,this.animationData.op]),t&&this.checkSegments(0)},tt.prototype.checkSegments=function(t){return!!this.segments.length&&(this.adjustSegment(this.segments.shift(),t),!0)},tt.prototype.destroy=function(t){t&&this.name!==t||!this.renderer||(this.renderer.destroy(),this.imagePreloader.destroy(),this.trigger("destroy"),this._cbs=null,this.onEnterFrame=null,this.onLoopComplete=null,this.onComplete=null,this.onSegmentStart=null,this.onDestroy=null,this.renderer=null,this.renderer=null,this.imagePreloader=null,this.projectInterface=null)},tt.prototype.setCurrentRawFrameValue=function(t){this.currentRawFrame=t,this.gotoFrame()},tt.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},tt.prototype.setDirection=function(t){this.playDirection=t<0?-1:1,this.updaFrameModifier()},tt.prototype.setVolume=function(t,e){e&&this.name!==e||this.audioController.setVolume(t)},tt.prototype.getVolume=function(){return this.audioController.getVolume()},tt.prototype.mute=function(t){t&&this.name!==t||this.audioController.mute()},tt.prototype.unmute=function(t){t&&this.name!==t||this.audioController.unmute()},tt.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection,this.audioController.setRate(this.playSpeed*this.playDirection)},tt.prototype.getPath=function(){return this.path},tt.prototype.getAssetsPath=function(t){var e="";if(t.e)e=t.p;else if(this.assetsPath){var i=t.p;-1!==i.indexOf("images/")&&(i=i.split("/")[1]),e=this.assetsPath+i}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e},tt.prototype.getAssetData=function(t){for(var e=0,i=this.assets.length;e<i;){if(t===this.assets[e].id)return this.assets[e];e+=1}return null},tt.prototype.hide=function(){this.renderer.hide()},tt.prototype.show=function(){this.renderer.show()},tt.prototype.getDuration=function(t){return t?this.totalFrames:this.totalFrames/this.frameRate},tt.prototype.updateDocumentData=function(t,e,i){try{this.renderer.getElementByPath(t).updateDocumentData(e,i)}catch(t){}},tt.prototype.trigger=function(t){if(this._cbs&&this._cbs[t])switch(t){case"enterFrame":this.triggerEvent(t,new C(t,this.currentFrame,this.totalFrames,this.frameModifier));break;case"drawnFrame":this.drawnFrameEvent.currentTime=this.currentFrame,this.drawnFrameEvent.totalTime=this.totalFrames,this.drawnFrameEvent.direction=this.frameModifier,this.triggerEvent(t,this.drawnFrameEvent);break;case"loopComplete":this.triggerEvent(t,new S(t,this.loop,this.playCount,this.frameMult));break;case"complete":this.triggerEvent(t,new D(t,this.frameMult));break;case"segmentStart":this.triggerEvent(t,new M(t,this.firstFrame,this.totalFrames));break;case"destroy":this.triggerEvent(t,new F(t,this));break;default:this.triggerEvent(t)}"enterFrame"===t&&this.onEnterFrame&&this.onEnterFrame.call(this,new C(t,this.currentFrame,this.totalFrames,this.frameMult)),"loopComplete"===t&&this.onLoopComplete&&this.onLoopComplete.call(this,new S(t,this.loop,this.playCount,this.frameMult)),"complete"===t&&this.onComplete&&this.onComplete.call(this,new D(t,this.frameMult)),"segmentStart"===t&&this.onSegmentStart&&this.onSegmentStart.call(this,new M(t,this.firstFrame,this.totalFrames)),"destroy"===t&&this.onDestroy&&this.onDestroy.call(this,new F(t,this))},tt.prototype.triggerRenderFrameError=function(t){var e=new T(t,this.currentFrame);this.triggerEvent("error",e),this.onError&&this.onError.call(this,e)},tt.prototype.triggerConfigError=function(t){var e=new I(t,this.currentFrame);this.triggerEvent("error",e),this.onError&&this.onError.call(this,e)};var et=function(){var t={},e=[],i=0,s=0,a=0,n=!0,o=!1;function h(t){for(var i=0,r=t.target;i<s;)e[i].animation===r&&(e.splice(i,1),i-=1,s-=1,r.isPaused||f()),i+=1}function l(t,i){if(!t)return null;for(var r=0;r<s;){if(e[r].elem===t&&null!==e[r].elem)return e[r].animation;r+=1}var a=new tt;return m(a,t),a.setData(t,i),a}function p(){a+=1,c()}function f(){a-=1}function m(t,i){t.addEventListener("destroy",h),t.addEventListener("_active",p),t.addEventListener("_idle",f),e.push({elem:i,animation:t}),s+=1}function d(t){var r,h=t-i;for(r=0;r<s;r+=1)e[r].animation.advanceTime(h);i=t,a&&!o?window.requestAnimationFrame(d):n=!0}function u(t){i=t,window.requestAnimationFrame(d)}function c(){!o&&a&&n&&(window.requestAnimationFrame(u),n=!1)}return t.registerAnimation=l,t.loadAnimation=function(t){var e=new tt;return m(e,null),e.setParams(t),e},t.setSpeed=function(t,i){var r;for(r=0;r<s;r+=1)e[r].animation.setSpeed(t,i)},t.setDirection=function(t,i){var r;for(r=0;r<s;r+=1)e[r].animation.setDirection(t,i)},t.play=function(t){var i;for(i=0;i<s;i+=1)e[i].animation.play(t)},t.pause=function(t){var i;for(i=0;i<s;i+=1)e[i].animation.pause(t)},t.stop=function(t){var i;for(i=0;i<s;i+=1)e[i].animation.stop(t)},t.togglePause=function(t){var i;for(i=0;i<s;i+=1)e[i].animation.togglePause(t)},t.searchAnimations=function(t,e,i){var s,a=[].concat([].slice.call(document.getElementsByClassName("lottie")),[].slice.call(document.getElementsByClassName("bodymovin"))),n=a.length;for(s=0;s<n;s+=1)i&&a[s].setAttribute("data-bm-type",i),l(a[s],t);if(e&&0===n){i||(i="svg");var o=document.getElementsByTagName("body")[0];o.innerText="";var h=r("div");h.style.width="100%",h.style.height="100%",h.setAttribute("data-bm-type",i),o.appendChild(h),l(h,t)}},t.resize=function(){var t;for(t=0;t<s;t+=1)e[t].animation.resize()},t.goToAndStop=function(t,i,r){var a;for(a=0;a<s;a+=1)e[a].animation.goToAndStop(t,i,r)},t.destroy=function(t){var i;for(i=s-1;i>=0;i-=1)e[i].animation.destroy(t)},t.freeze=function(){o=!0},t.unfreeze=function(){o=!1,c()},t.setVolume=function(t,i){var r;for(r=0;r<s;r+=1)e[r].animation.setVolume(t,i)},t.mute=function(t){var i;for(i=0;i<s;i+=1)e[i].animation.mute(t)},t.unmute=function(t){var i;for(i=0;i<s;i+=1)e[i].animation.unmute(t)},t.getRegisteredAnimations=function(){var t,i=e.length,s=[];for(t=0;t<i;t+=1)s.push(e[t].animation);return s},t}(),it=function(){var t={getBezierEasing:function(t,i,s,r,a){var n=a||("bez_"+t+"_"+i+"_"+s+"_"+r).replace(/\./g,"p");if(e[n])return e[n];var o=new l([t,i,s,r]);return e[n]=o,o}},e={};var i=.1,s="function"==typeof Float32Array;function r(t,e){return 1-3*e+3*t}function a(t,e){return 3*e-6*t}function n(t){return 3*t}function o(t,e,i){return((r(e,i)*t+a(e,i))*t+n(e))*t}function h(t,e,i){return 3*r(e,i)*t*t+2*a(e,i)*t+n(e)}function l(t){this._p=t,this._mSampleValues=s?new Float32Array(11):new Array(11),this._precomputed=!1,this.get=this.get.bind(this)}return l.prototype={get:function(t){var e=this._p[0],i=this._p[1],s=this._p[2],r=this._p[3];return this._precomputed||this._precompute(),e===i&&s===r?t:0===t?0:1===t?1:o(this._getTForX(t),i,r)},_precompute:function(){var t=this._p[0],e=this._p[1],i=this._p[2],s=this._p[3];this._precomputed=!0,t===e&&i===s||this._calcSampleValues()},_calcSampleValues:function(){for(var t=this._p[0],e=this._p[2],s=0;s<11;++s)this._mSampleValues[s]=o(s*i,t,e)},_getTForX:function(t){for(var e=this._p[0],s=this._p[2],r=this._mSampleValues,a=0,n=1;10!==n&&r[n]<=t;++n)a+=i;var l=a+(t-r[--n])/(r[n+1]-r[n])*i,p=h(l,e,s);return p>=.001?function(t,e,i,s){for(var r=0;r<4;++r){var a=h(e,i,s);if(0===a)return e;e-=(o(e,i,s)-t)/a}return e}(t,l,e,s):0===p?l:function(t,e,i,s,r){var a,n,h=0;do{(a=o(n=e+(i-e)/2,s,r)-t)>0?i=n:e=n}while(Math.abs(a)>1e-7&&++h<10);return n}(t,a,a+i,e,s)}},t}(),st={double:function(t){return t.concat(p(t.length))}},rt=function(t,e,i){var s=0,r=t,a=p(r);return{newElement:function(){return s?a[s-=1]:e()},release:function(t){s===r&&(a=st.double(a),r*=2),i&&i(t),a[s]=t,s+=1}}},at=rt(8,(function(){return{addedLength:0,percents:l("float32",W()),lengths:l("float32",W())}})),nt=rt(8,(function(){return{lengths:[],totalLength:0}}),(function(t){var e,i=t.lengths.length;for(e=0;e<i;e+=1)at.release(t.lengths[e]);t.lengths.length=0}));var ot=function(){var t=Math;function e(t,e,i,s,r,a){var n=t*s+e*r+i*a-r*s-a*t-i*e;return n>-.001&&n<.001}var i=function(t,e,i,s){var r,a,n,o,h,l,p=W(),f=0,m=[],d=[],u=at.newElement();for(n=i.length,r=0;r<p;r+=1){for(h=r/(p-1),l=0,a=0;a<n;a+=1)o=g(1-h,3)*t[a]+3*g(1-h,2)*h*i[a]+3*(1-h)*g(h,2)*s[a]+g(h,3)*e[a],m[a]=o,null!==d[a]&&(l+=g(m[a]-d[a],2)),d[a]=m[a];l&&(f+=l=y(l)),u.percents[r]=h,u.lengths[r]=f}return u.addedLength=f,u};function s(t){this.segmentLength=0,this.points=new Array(t)}function r(t,e){this.partialLength=t,this.point=e}var a,n=(a={},function(t,i,n,o){var h=(t[0]+"_"+t[1]+"_"+i[0]+"_"+i[1]+"_"+n[0]+"_"+n[1]+"_"+o[0]+"_"+o[1]).replace(/\./g,"p");if(!a[h]){var l,f,m,d,u,c,v,b=W(),_=0,k=null;2===t.length&&(t[0]!==i[0]||t[1]!==i[1])&&e(t[0],t[1],i[0],i[1],t[0]+n[0],t[1]+n[1])&&e(t[0],t[1],i[0],i[1],i[0]+o[0],i[1]+o[1])&&(b=2);var x=new s(b);for(m=n.length,l=0;l<b;l+=1){for(v=p(m),u=l/(b-1),c=0,f=0;f<m;f+=1)d=g(1-u,3)*t[f]+3*g(1-u,2)*u*(t[f]+n[f])+3*(1-u)*g(u,2)*(i[f]+o[f])+g(u,3)*i[f],v[f]=d,null!==k&&(c+=g(v[f]-k[f],2));_+=c=y(c),x.points[l]=new r(c,v),k=v}x.segmentLength=_,a[h]=x}return a[h]});function o(t,e){var i=e.percents,s=e.lengths,r=i.length,a=v((r-1)*t),n=t*e.addedLength,o=0;if(a===r-1||0===a||n===s[a])return i[a];for(var h=s[a]>n?-1:1,l=!0;l;)if(s[a]<=n&&s[a+1]>n?(o=(n-s[a])/(s[a+1]-s[a]),l=!1):a+=h,a<0||a>=r-1){if(a===r-1)return i[a];l=!1}return i[a]+(i[a+1]-i[a])*o}var h=l("float32",8);return{getSegmentsLength:function(t){var e,s=nt.newElement(),r=t.c,a=t.v,n=t.o,o=t.i,h=t._length,l=s.lengths,p=0;for(e=0;e<h-1;e+=1)l[e]=i(a[e],a[e+1],n[e],o[e+1]),p+=l[e].addedLength;return r&&h&&(l[e]=i(a[e],a[0],n[e],o[0]),p+=l[e].addedLength),s.totalLength=p,s},getNewSegment:function(e,i,s,r,a,n,l){a<0?a=0:a>1&&(a=1);var p,f=o(a,l),m=o(n=n>1?1:n,l),d=e.length,u=1-f,c=1-m,g=u*u*u,y=f*u*u*3,v=f*f*u*3,b=f*f*f,_=u*u*c,k=f*u*c+u*f*c+u*u*m,x=f*f*c+u*f*m+f*u*m,P=f*f*m,A=u*c*c,w=f*c*c+u*m*c+u*c*m,E=f*m*c+u*m*m+f*c*m,C=f*m*m,D=c*c*c,S=m*c*c+c*m*c+c*c*m,M=m*m*c+c*m*m+m*c*m,F=m*m*m;for(p=0;p<d;p+=1)h[4*p]=t.round(1e3*(g*e[p]+y*s[p]+v*r[p]+b*i[p]))/1e3,h[4*p+1]=t.round(1e3*(_*e[p]+k*s[p]+x*r[p]+P*i[p]))/1e3,h[4*p+2]=t.round(1e3*(A*e[p]+w*s[p]+E*r[p]+C*i[p]))/1e3,h[4*p+3]=t.round(1e3*(D*e[p]+S*s[p]+M*r[p]+F*i[p]))/1e3;return h},getPointInSegment:function(e,i,s,r,a,n){var h=o(a,n),l=1-h;return[t.round(1e3*(l*l*l*e[0]+(h*l*l+l*h*l+l*l*h)*s[0]+(h*h*l+l*h*h+h*l*h)*r[0]+h*h*h*i[0]))/1e3,t.round(1e3*(l*l*l*e[1]+(h*l*l+l*h*l+l*l*h)*s[1]+(h*h*l+l*h*h+h*l*h)*r[1]+h*h*h*i[1]))/1e3]},buildBezierData:n,pointOnLine2D:e,pointOnLine3D:function(i,s,r,a,n,o,h,l,p){if(0===r&&0===o&&0===p)return e(i,s,a,n,h,l);var f,m=t.sqrt(t.pow(a-i,2)+t.pow(n-s,2)+t.pow(o-r,2)),d=t.sqrt(t.pow(h-i,2)+t.pow(l-s,2)+t.pow(p-r,2)),u=t.sqrt(t.pow(h-a,2)+t.pow(l-n,2)+t.pow(p-o,2));return(f=m>d?m>u?m-d-u:u-d-m:u>d?u-d-m:d-m-u)>-1e-4&&f<1e-4}}}(),ht=function(){var t=i,e=Math.abs;function s(t,e){var i,s=this.offsetTime;"multidimensional"===this.propType&&(i=l("float32",this.pv.length));for(var a,n,o,h,p,f,m,d,u,c=e.lastIndex,g=c,y=this.keyframes.length-1,v=!0;v;){if(a=this.keyframes[g],n=this.keyframes[g+1],g===y-1&&t>=n.t-s){a.h&&(a=n),c=0;break}if(n.t-s>t){c=g;break}g<y-1?g+=1:(c=0,v=!1)}o=this.keyframesMetadata[g]||{};var b,_,k,x,A,w,E,C,D,S,M=n.t-s,F=a.t-s;if(a.to){o.bezierData||(o.bezierData=ot.buildBezierData(a.s,n.s||a.e,a.to,a.ti));var T=o.bezierData;if(t>=M||t<F){var I=t>=M?T.points.length-1:0;for(p=T.points[I].point.length,h=0;h<p;h+=1)i[h]=T.points[I].point[h]}else{o.__fnct?u=o.__fnct:(u=it.getBezierEasing(a.o.x,a.o.y,a.i.x,a.i.y,a.n).get,o.__fnct=u),f=u((t-F)/(M-F));var B,L=T.segmentLength*f,z=e.lastFrame<t&&e._lastKeyframeIndex===g?e._lastAddedLength:0;for(d=e.lastFrame<t&&e._lastKeyframeIndex===g?e._lastPoint:0,v=!0,m=T.points.length;v;){if(z+=T.points[d].partialLength,0===L||0===f||d===T.points.length-1){for(p=T.points[d].point.length,h=0;h<p;h+=1)i[h]=T.points[d].point[h];break}if(L>=z&&L<z+T.points[d+1].partialLength){for(B=(L-z)/T.points[d+1].partialLength,p=T.points[d].point.length,h=0;h<p;h+=1)i[h]=T.points[d].point[h]+(T.points[d+1].point[h]-T.points[d].point[h])*B;break}d<m-1?d+=1:v=!1}e._lastPoint=d,e._lastAddedLength=z-T.points[d].partialLength,e._lastKeyframeIndex=g}}else{var R,V,O,N,G;if(y=a.s.length,b=n.s||a.e,this.sh&&1!==a.h)if(t>=M)i[0]=b[0],i[1]=b[1],i[2]=b[2];else if(t<=F)i[0]=a.s[0],i[1]=a.s[1],i[2]=a.s[2];else{var j=r(a.s),q=r(b);_=i,k=function(t,e,i){var s,r,a,n,o,h=[],l=t[0],p=t[1],f=t[2],m=t[3],d=e[0],u=e[1],c=e[2],g=e[3];return(r=l*d+p*u+f*c+m*g)<0&&(r=-r,d=-d,u=-u,c=-c,g=-g),1-r>1e-6?(s=Math.acos(r),a=Math.sin(s),n=Math.sin((1-i)*s)/a,o=Math.sin(i*s)/a):(n=1-i,o=i),h[0]=n*l+o*d,h[1]=n*p+o*u,h[2]=n*f+o*c,h[3]=n*m+o*g,h}(j,q,(t-F)/(M-F)),x=k[0],A=k[1],w=k[2],E=k[3],C=Math.atan2(2*A*E-2*x*w,1-2*A*A-2*w*w),D=Math.asin(2*x*A+2*w*E),S=Math.atan2(2*x*E-2*A*w,1-2*x*x-2*w*w),_[0]=C/P,_[1]=D/P,_[2]=S/P}else for(g=0;g<y;g+=1)1!==a.h&&(t>=M?f=1:t<F?f=0:(a.o.x.constructor===Array?(o.__fnct||(o.__fnct=[]),o.__fnct[g]?u=o.__fnct[g]:(R=void 0===a.o.x[g]?a.o.x[0]:a.o.x[g],V=void 0===a.o.y[g]?a.o.y[0]:a.o.y[g],O=void 0===a.i.x[g]?a.i.x[0]:a.i.x[g],N=void 0===a.i.y[g]?a.i.y[0]:a.i.y[g],u=it.getBezierEasing(R,V,O,N).get,o.__fnct[g]=u)):o.__fnct?u=o.__fnct:(R=a.o.x,V=a.o.y,O=a.i.x,N=a.i.y,u=it.getBezierEasing(R,V,O,N).get,a.keyframeMetadata=u),f=u((t-F)/(M-F)))),b=n.s||a.e,G=1===a.h?a.s[g]:a.s[g]+(b[g]-a.s[g])*f,"multidimensional"===this.propType?i[g]=G:i=G}return e.lastIndex=c,i}function r(t){var e=t[0]*P,i=t[1]*P,s=t[2]*P,r=Math.cos(e/2),a=Math.cos(i/2),n=Math.cos(s/2),o=Math.sin(e/2),h=Math.sin(i/2),l=Math.sin(s/2);return[o*h*n+r*a*l,o*a*n+r*h*l,r*h*n-o*a*l,r*a*n-o*h*l]}function a(){var e=this.comp.renderedFrame-this.offsetTime,i=this.keyframes[0].t-this.offsetTime,s=this.keyframes[this.keyframes.length-1].t-this.offsetTime;if(!(e===this._caching.lastFrame||this._caching.lastFrame!==t&&(this._caching.lastFrame>=s&&e>=s||this._caching.lastFrame<i&&e<i))){this._caching.lastFrame>=e&&(this._caching._lastKeyframeIndex=-1,this._caching.lastIndex=0);var r=this.interpolateValue(e,this._caching);this.pv=r}return this._caching.lastFrame=e,this.pv}function n(t){var i;if("unidimensional"===this.propType)i=t*this.mult,e(this.v-i)>1e-5&&(this.v=i,this._mdf=!0);else for(var s=0,r=this.v.length;s<r;)i=t[s]*this.mult,e(this.v[s]-i)>1e-5&&(this.v[s]=i,this._mdf=!0),s+=1}function o(){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length)if(this.lock)this.setVValue(this.pv);else{var t;this.lock=!0,this._mdf=this._isFirstFrame;var e=this.effectsSequence.length,i=this.kf?this.pv:this.data.k;for(t=0;t<e;t+=1)i=this.effectsSequence[t](i);this.setVValue(i),this._isFirstFrame=!1,this.lock=!1,this.frameId=this.elem.globalData.frameId}}function h(t){this.effectsSequence.push(t),this.container.addDynamicProperty(this)}function p(t,e,i,s){this.propType="unidimensional",this.mult=i||1,this.data=e,this.v=i?e.k*i:e.k,this.pv=e.k,this._mdf=!1,this.elem=t,this.container=s,this.comp=t.comp,this.k=!1,this.kf=!1,this.vel=0,this.effectsSequence=[],this._isFirstFrame=!0,this.getValue=o,this.setVValue=n,this.addEffect=h}function f(t,e,i,s){var r;this.propType="multidimensional",this.mult=i||1,this.data=e,this._mdf=!1,this.elem=t,this.container=s,this.comp=t.comp,this.k=!1,this.kf=!1,this.frameId=-1;var a=e.k.length;for(this.v=l("float32",a),this.pv=l("float32",a),this.vel=l("float32",a),r=0;r<a;r+=1)this.v[r]=e.k[r]*this.mult,this.pv[r]=e.k[r];this._isFirstFrame=!0,this.effectsSequence=[],this.getValue=o,this.setVValue=n,this.addEffect=h}function m(e,i,r,l){this.propType="unidimensional",this.keyframes=i.k,this.keyframesMetadata=[],this.offsetTime=e.data.st,this.frameId=-1,this._caching={lastFrame:t,lastIndex:0,value:0,_lastKeyframeIndex:-1},this.k=!0,this.kf=!0,this.data=i,this.mult=r||1,this.elem=e,this.container=l,this.comp=e.comp,this.v=t,this.pv=t,this._isFirstFrame=!0,this.getValue=o,this.setVValue=n,this.interpolateValue=s,this.effectsSequence=[a.bind(this)],this.addEffect=h}function d(e,i,r,p){var f;this.propType="multidimensional";var m,d,u,c,g=i.k.length;for(f=0;f<g-1;f+=1)i.k[f].to&&i.k[f].s&&i.k[f+1]&&i.k[f+1].s&&(m=i.k[f].s,d=i.k[f+1].s,u=i.k[f].to,c=i.k[f].ti,(2===m.length&&(m[0]!==d[0]||m[1]!==d[1])&&ot.pointOnLine2D(m[0],m[1],d[0],d[1],m[0]+u[0],m[1]+u[1])&&ot.pointOnLine2D(m[0],m[1],d[0],d[1],d[0]+c[0],d[1]+c[1])||3===m.length&&(m[0]!==d[0]||m[1]!==d[1]||m[2]!==d[2])&&ot.pointOnLine3D(m[0],m[1],m[2],d[0],d[1],d[2],m[0]+u[0],m[1]+u[1],m[2]+u[2])&&ot.pointOnLine3D(m[0],m[1],m[2],d[0],d[1],d[2],d[0]+c[0],d[1]+c[1],d[2]+c[2]))&&(i.k[f].to=null,i.k[f].ti=null),m[0]===d[0]&&m[1]===d[1]&&0===u[0]&&0===u[1]&&0===c[0]&&0===c[1]&&(2===m.length||m[2]===d[2]&&0===u[2]&&0===c[2])&&(i.k[f].to=null,i.k[f].ti=null));this.effectsSequence=[a.bind(this)],this.data=i,this.keyframes=i.k,this.keyframesMetadata=[],this.offsetTime=e.data.st,this.k=!0,this.kf=!0,this._isFirstFrame=!0,this.mult=r||1,this.elem=e,this.container=p,this.comp=e.comp,this.getValue=o,this.setVValue=n,this.interpolateValue=s,this.frameId=-1;var y=i.k[0].s.length;for(this.v=l("float32",y),this.pv=l("float32",y),f=0;f<y;f+=1)this.v[f]=t,this.pv[f]=t;this._caching={lastFrame:t,lastIndex:0,value:l("float32",y)},this.addEffect=h}return{getProp:function(t,e,i,s,r){var a;if(e.k.length)if("number"==typeof e.k[0])a=new f(t,e,s,r);else switch(i){case 0:a=new m(t,e,s,r);break;case 1:a=new d(t,e,s,r)}else a=new p(t,e,s,r);return a.effectsSequence.length&&r.addDynamicProperty(a),a}}}();function lt(){}lt.prototype={addDynamicProperty:function(t){-1===this.dynamicProperties.indexOf(t)&&(this.dynamicProperties.push(t),this.container.addDynamicProperty(this),this._isAnimated=!0)},iterateDynamicProperties:function(){var t;this._mdf=!1;var e=this.dynamicProperties.length;for(t=0;t<e;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t]._mdf&&(this._mdf=!0)},initDynamicPropertyContainer:function(t){this.container=t,this.dynamicProperties=[],this._mdf=!1,this._isAnimated=!1}};var pt=rt(8,(function(){return l("float32",2)}));function ft(){this.c=!1,this._length=0,this._maxLength=8,this.v=p(this._maxLength),this.o=p(this._maxLength),this.i=p(this._maxLength)}ft.prototype.setPathData=function(t,e){this.c=t,this.setLength(e);for(var i=0;i<e;)this.v[i]=pt.newElement(),this.o[i]=pt.newElement(),this.i[i]=pt.newElement(),i+=1},ft.prototype.setLength=function(t){for(;this._maxLength<t;)this.doubleArrayLength();this._length=t},ft.prototype.doubleArrayLength=function(){this.v=this.v.concat(p(this._maxLength)),this.i=this.i.concat(p(this._maxLength)),this.o=this.o.concat(p(this._maxLength)),this._maxLength*=2},ft.prototype.setXYAt=function(t,e,i,s,r){var a;switch(this._length=Math.max(this._length,s+1),this._length>=this._maxLength&&this.doubleArrayLength(),i){case"v":a=this.v;break;case"i":a=this.i;break;case"o":a=this.o;break;default:a=[]}(!a[s]||a[s]&&!r)&&(a[s]=pt.newElement()),a[s][0]=t,a[s][1]=e},ft.prototype.setTripleAt=function(t,e,i,s,r,a,n,o){this.setXYAt(t,e,"v",n,o),this.setXYAt(i,s,"o",n,o),this.setXYAt(r,a,"i",n,o)},ft.prototype.reverse=function(){var t=new ft;t.setPathData(this.c,this._length);var e=this.v,i=this.o,s=this.i,r=0;this.c&&(t.setTripleAt(e[0][0],e[0][1],s[0][0],s[0][1],i[0][0],i[0][1],0,!1),r=1);var a,n=this._length-1,o=this._length;for(a=r;a<o;a+=1)t.setTripleAt(e[n][0],e[n][1],s[n][0],s[n][1],i[n][0],i[n][1],a,!1),n-=1;return t};var mt,dt=((mt=rt(4,(function(){return new ft}),(function(t){var e,i=t._length;for(e=0;e<i;e+=1)pt.release(t.v[e]),pt.release(t.i[e]),pt.release(t.o[e]),t.v[e]=null,t.i[e]=null,t.o[e]=null;t._length=0,t.c=!1}))).clone=function(t){var e,i=mt.newElement(),s=void 0===t._length?t.v.length:t._length;for(i.setLength(s),i.c=t.c,e=0;e<s;e+=1)i.setTripleAt(t.v[e][0],t.v[e][1],t.o[e][0],t.o[e][1],t.i[e][0],t.i[e][1],e);return i},mt);function ut(){this._length=0,this._maxLength=4,this.shapes=p(this._maxLength)}ut.prototype.addShape=function(t){this._length===this._maxLength&&(this.shapes=this.shapes.concat(p(this._maxLength)),this._maxLength*=2),this.shapes[this._length]=t,this._length+=1},ut.prototype.releaseShapes=function(){var t;for(t=0;t<this._length;t+=1)dt.release(this.shapes[t]);this._length=0};var ct,gt,yt,vt,bt=(ct={newShapeCollection:function(){return gt?vt[gt-=1]:new ut},release:function(t){var e,i=t._length;for(e=0;e<i;e+=1)dt.release(t.shapes[e]);t._length=0,gt===yt&&(vt=st.double(vt),yt*=2),vt[gt]=t,gt+=1}},gt=0,vt=p(yt=4),ct),_t=function(){var t=-999999;function e(t,e,i){var s,r,a,n,o,h,l,p,f,m=i.lastIndex,d=this.keyframes;if(t<d[0].t-this.offsetTime)s=d[0].s[0],a=!0,m=0;else if(t>=d[d.length-1].t-this.offsetTime)s=d[d.length-1].s?d[d.length-1].s[0]:d[d.length-2].e[0],a=!0;else{for(var u,c,g,y=m,v=d.length-1,b=!0;b&&(u=d[y],!((c=d[y+1]).t-this.offsetTime>t));)y<v-1?y+=1:b=!1;if(g=this.keyframesMetadata[y]||{},m=y,!(a=1===u.h)){if(t>=c.t-this.offsetTime)p=1;else if(t<u.t-this.offsetTime)p=0;else{var _;g.__fnct?_=g.__fnct:(_=it.getBezierEasing(u.o.x,u.o.y,u.i.x,u.i.y).get,g.__fnct=_),p=_((t-(u.t-this.offsetTime))/(c.t-this.offsetTime-(u.t-this.offsetTime)))}r=c.s?c.s[0]:u.e[0]}s=u.s[0]}for(h=e._length,l=s.i[0].length,i.lastIndex=m,n=0;n<h;n+=1)for(o=0;o<l;o+=1)f=a?s.i[n][o]:s.i[n][o]+(r.i[n][o]-s.i[n][o])*p,e.i[n][o]=f,f=a?s.o[n][o]:s.o[n][o]+(r.o[n][o]-s.o[n][o])*p,e.o[n][o]=f,f=a?s.v[n][o]:s.v[n][o]+(r.v[n][o]-s.v[n][o])*p,e.v[n][o]=f}function i(){var e=this.comp.renderedFrame-this.offsetTime,i=this.keyframes[0].t-this.offsetTime,s=this.keyframes[this.keyframes.length-1].t-this.offsetTime,r=this._caching.lastFrame;return r!==t&&(r<i&&e<i||r>s&&e>s)||(this._caching.lastIndex=r<e?this._caching.lastIndex:0,this.interpolateShape(e,this.pv,this._caching)),this._caching.lastFrame=e,this.pv}function s(){this.paths=this.localShapeCollection}function r(t){(function(t,e){if(t._length!==e._length||t.c!==e.c)return!1;var i,s=t._length;for(i=0;i<s;i+=1)if(t.v[i][0]!==e.v[i][0]||t.v[i][1]!==e.v[i][1]||t.o[i][0]!==e.o[i][0]||t.o[i][1]!==e.o[i][1]||t.i[i][0]!==e.i[i][0]||t.i[i][1]!==e.i[i][1])return!1;return!0})(this.v,t)||(this.v=dt.clone(t),this.localShapeCollection.releaseShapes(),this.localShapeCollection.addShape(this.v),this._mdf=!0,this.paths=this.localShapeCollection)}function n(){if(this.elem.globalData.frameId!==this.frameId)if(this.effectsSequence.length)if(this.lock)this.setVValue(this.pv);else{var t,e;this.lock=!0,this._mdf=!1,t=this.kf?this.pv:this.data.ks?this.data.ks.k:this.data.pt.k;var i=this.effectsSequence.length;for(e=0;e<i;e+=1)t=this.effectsSequence[e](t);this.setVValue(t),this.lock=!1,this.frameId=this.elem.globalData.frameId}else this._mdf=!1}function o(t,e,i){this.propType="shape",this.comp=t.comp,this.container=t,this.elem=t,this.data=e,this.k=!1,this.kf=!1,this._mdf=!1;var r=3===i?e.pt.k:e.ks.k;this.v=dt.clone(r),this.pv=dt.clone(this.v),this.localShapeCollection=bt.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.reset=s,this.effectsSequence=[]}function h(t){this.effectsSequence.push(t),this.container.addDynamicProperty(this)}function l(e,r,a){this.propType="shape",this.comp=e.comp,this.elem=e,this.container=e,this.offsetTime=e.data.st,this.keyframes=3===a?r.pt.k:r.ks.k,this.keyframesMetadata=[],this.k=!0,this.kf=!0;var n=this.keyframes[0].s[0].i.length;this.v=dt.newElement(),this.v.setPathData(this.keyframes[0].s[0].c,n),this.pv=dt.clone(this.v),this.localShapeCollection=bt.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.lastFrame=t,this.reset=s,this._caching={lastFrame:t,lastIndex:0},this.effectsSequence=[i.bind(this)]}o.prototype.interpolateShape=e,o.prototype.getValue=n,o.prototype.setVValue=r,o.prototype.addEffect=h,l.prototype.getValue=n,l.prototype.interpolateShape=e,l.prototype.setVValue=r,l.prototype.addEffect=h;var p=function(){var t=A;function e(t,e){this.v=dt.newElement(),this.v.setPathData(!0,4),this.localShapeCollection=bt.newShapeCollection(),this.paths=this.localShapeCollection,this.localShapeCollection.addShape(this.v),this.d=e.d,this.elem=t,this.comp=t.comp,this.frameId=-1,this.initDynamicPropertyContainer(t),this.p=ht.getProp(t,e.p,1,0,this),this.s=ht.getProp(t,e.s,1,0,this),this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertEllToPath())}return e.prototype={reset:s,getValue:function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertEllToPath())},convertEllToPath:function(){var e=this.p.v[0],i=this.p.v[1],s=this.s.v[0]/2,r=this.s.v[1]/2,a=3!==this.d,n=this.v;n.v[0][0]=e,n.v[0][1]=i-r,n.v[1][0]=a?e+s:e-s,n.v[1][1]=i,n.v[2][0]=e,n.v[2][1]=i+r,n.v[3][0]=a?e-s:e+s,n.v[3][1]=i,n.i[0][0]=a?e-s*t:e+s*t,n.i[0][1]=i-r,n.i[1][0]=a?e+s:e-s,n.i[1][1]=i-r*t,n.i[2][0]=a?e+s*t:e-s*t,n.i[2][1]=i+r,n.i[3][0]=a?e-s:e+s,n.i[3][1]=i+r*t,n.o[0][0]=a?e+s*t:e-s*t,n.o[0][1]=i-r,n.o[1][0]=a?e+s:e-s,n.o[1][1]=i+r*t,n.o[2][0]=a?e-s*t:e+s*t,n.o[2][1]=i+r,n.o[3][0]=a?e-s:e+s,n.o[3][1]=i-r*t}},a([lt],e),e}(),f=function(){function t(t,e){this.v=dt.newElement(),this.v.setPathData(!0,0),this.elem=t,this.comp=t.comp,this.data=e,this.frameId=-1,this.d=e.d,this.initDynamicPropertyContainer(t),1===e.sy?(this.ir=ht.getProp(t,e.ir,0,0,this),this.is=ht.getProp(t,e.is,0,.01,this),this.convertToPath=this.convertStarToPath):this.convertToPath=this.convertPolygonToPath,this.pt=ht.getProp(t,e.pt,0,0,this),this.p=ht.getProp(t,e.p,1,0,this),this.r=ht.getProp(t,e.r,0,P,this),this.or=ht.getProp(t,e.or,0,0,this),this.os=ht.getProp(t,e.os,0,.01,this),this.localShapeCollection=bt.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertToPath())}return t.prototype={reset:s,getValue:function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertToPath())},convertStarToPath:function(){var t,e,i,s,r=2*Math.floor(this.pt.v),a=2*Math.PI/r,n=!0,o=this.or.v,h=this.ir.v,l=this.os.v,p=this.is.v,f=2*Math.PI*o/(2*r),m=2*Math.PI*h/(2*r),d=-Math.PI/2;d+=this.r.v;var u=3===this.data.d?-1:1;for(this.v._length=0,t=0;t<r;t+=1){i=n?l:p,s=n?f:m;var c=(e=n?o:h)*Math.cos(d),g=e*Math.sin(d),y=0===c&&0===g?0:g/Math.sqrt(c*c+g*g),v=0===c&&0===g?0:-c/Math.sqrt(c*c+g*g);c+=+this.p.v[0],g+=+this.p.v[1],this.v.setTripleAt(c,g,c-y*s*i*u,g-v*s*i*u,c+y*s*i*u,g+v*s*i*u,t,!0),n=!n,d+=a*u}},convertPolygonToPath:function(){var t,e=Math.floor(this.pt.v),i=2*Math.PI/e,s=this.or.v,r=this.os.v,a=2*Math.PI*s/(4*e),n=.5*-Math.PI,o=3===this.data.d?-1:1;for(n+=this.r.v,this.v._length=0,t=0;t<e;t+=1){var h=s*Math.cos(n),l=s*Math.sin(n),p=0===h&&0===l?0:l/Math.sqrt(h*h+l*l),f=0===h&&0===l?0:-h/Math.sqrt(h*h+l*l);h+=+this.p.v[0],l+=+this.p.v[1],this.v.setTripleAt(h,l,h-p*a*r*o,l-f*a*r*o,h+p*a*r*o,l+f*a*r*o,t,!0),n+=i*o}this.paths.length=0,this.paths[0]=this.v}},a([lt],t),t}(),m=function(){function t(t,e){this.v=dt.newElement(),this.v.c=!0,this.localShapeCollection=bt.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.elem=t,this.comp=t.comp,this.frameId=-1,this.d=e.d,this.initDynamicPropertyContainer(t),this.p=ht.getProp(t,e.p,1,0,this),this.s=ht.getProp(t,e.s,1,0,this),this.r=ht.getProp(t,e.r,0,0,this),this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertRectToPath())}return t.prototype={convertRectToPath:function(){var t=this.p.v[0],e=this.p.v[1],i=this.s.v[0]/2,s=this.s.v[1]/2,r=_(i,s,this.r.v),a=r*(1-A);this.v._length=0,2===this.d||1===this.d?(this.v.setTripleAt(t+i,e-s+r,t+i,e-s+r,t+i,e-s+a,0,!0),this.v.setTripleAt(t+i,e+s-r,t+i,e+s-a,t+i,e+s-r,1,!0),0!==r?(this.v.setTripleAt(t+i-r,e+s,t+i-r,e+s,t+i-a,e+s,2,!0),this.v.setTripleAt(t-i+r,e+s,t-i+a,e+s,t-i+r,e+s,3,!0),this.v.setTripleAt(t-i,e+s-r,t-i,e+s-r,t-i,e+s-a,4,!0),this.v.setTripleAt(t-i,e-s+r,t-i,e-s+a,t-i,e-s+r,5,!0),this.v.setTripleAt(t-i+r,e-s,t-i+r,e-s,t-i+a,e-s,6,!0),this.v.setTripleAt(t+i-r,e-s,t+i-a,e-s,t+i-r,e-s,7,!0)):(this.v.setTripleAt(t-i,e+s,t-i+a,e+s,t-i,e+s,2),this.v.setTripleAt(t-i,e-s,t-i,e-s+a,t-i,e-s,3))):(this.v.setTripleAt(t+i,e-s+r,t+i,e-s+a,t+i,e-s+r,0,!0),0!==r?(this.v.setTripleAt(t+i-r,e-s,t+i-r,e-s,t+i-a,e-s,1,!0),this.v.setTripleAt(t-i+r,e-s,t-i+a,e-s,t-i+r,e-s,2,!0),this.v.setTripleAt(t-i,e-s+r,t-i,e-s+r,t-i,e-s+a,3,!0),this.v.setTripleAt(t-i,e+s-r,t-i,e+s-a,t-i,e+s-r,4,!0),this.v.setTripleAt(t-i+r,e+s,t-i+r,e+s,t-i+a,e+s,5,!0),this.v.setTripleAt(t+i-r,e+s,t+i-a,e+s,t+i-r,e+s,6,!0),this.v.setTripleAt(t+i,e+s-r,t+i,e+s-r,t+i,e+s-a,7,!0)):(this.v.setTripleAt(t-i,e-s,t-i+a,e-s,t-i,e-s,1,!0),this.v.setTripleAt(t-i,e+s,t-i,e+s-a,t-i,e+s,2,!0),this.v.setTripleAt(t+i,e+s,t+i-a,e+s,t+i,e+s,3,!0)))},getValue:function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertRectToPath())},reset:s},a([lt],t),t}();var d={getShapeProp:function(t,e,i){var s;return 3===i||4===i?s=(3===i?e.pt:e.ks).k.length?new l(t,e,i):new o(t,e,i):5===i?s=new m(t,e):6===i?s=new p(t,e):7===i&&(s=new f(t,e)),s.k&&t.addDynamicProperty(s),s},getConstructorFunction:function(){return o},getKeyframedConstructorFunction:function(){return l}};return d}(),kt=function(){var t=Math.cos,e=Math.sin,i=Math.tan,s=Math.round;function r(){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 a(i){if(0===i)return this;var s=t(i),r=e(i);return this._t(s,-r,0,0,r,s,0,0,0,0,1,0,0,0,0,1)}function n(i){if(0===i)return this;var s=t(i),r=e(i);return this._t(1,0,0,0,0,s,-r,0,0,r,s,0,0,0,0,1)}function o(i){if(0===i)return this;var s=t(i),r=e(i);return this._t(s,0,r,0,0,1,0,0,-r,0,s,0,0,0,0,1)}function h(i){if(0===i)return this;var s=t(i),r=e(i);return this._t(s,-r,0,0,r,s,0,0,0,0,1,0,0,0,0,1)}function p(t,e){return this._t(1,e,t,1,0,0)}function f(t,e){return this.shear(i(t),i(e))}function m(s,r){var a=t(r),n=e(r);return this._t(a,n,0,0,-n,a,0,0,0,0,1,0,0,0,0,1)._t(1,0,0,0,i(s),1,0,0,0,0,1,0,0,0,0,1)._t(a,-n,0,0,n,a,0,0,0,0,1,0,0,0,0,1)}function d(t,e,i){return i||0===i||(i=1),1===t&&1===e&&1===i?this:this._t(t,0,0,0,0,e,0,0,0,0,i,0,0,0,0,1)}function u(t,e,i,s,r,a,n,o,h,l,p,f,m,d,u,c){return this.props[0]=t,this.props[1]=e,this.props[2]=i,this.props[3]=s,this.props[4]=r,this.props[5]=a,this.props[6]=n,this.props[7]=o,this.props[8]=h,this.props[9]=l,this.props[10]=p,this.props[11]=f,this.props[12]=m,this.props[13]=d,this.props[14]=u,this.props[15]=c,this}function c(t,e,i){return i=i||0,0!==t||0!==e||0!==i?this._t(1,0,0,0,0,1,0,0,0,0,1,0,t,e,i,1):this}function g(t,e,i,s,r,a,n,o,h,l,p,f,m,d,u,c){var g=this.props;if(1===t&&0===e&&0===i&&0===s&&0===r&&1===a&&0===n&&0===o&&0===h&&0===l&&1===p&&0===f)return g[12]=g[12]*t+g[15]*m,g[13]=g[13]*a+g[15]*d,g[14]=g[14]*p+g[15]*u,g[15]*=c,this._identityCalculated=!1,this;var y=g[0],v=g[1],b=g[2],_=g[3],k=g[4],x=g[5],P=g[6],A=g[7],w=g[8],E=g[9],C=g[10],D=g[11],S=g[12],M=g[13],F=g[14],T=g[15];return g[0]=y*t+v*r+b*h+_*m,g[1]=y*e+v*a+b*l+_*d,g[2]=y*i+v*n+b*p+_*u,g[3]=y*s+v*o+b*f+_*c,g[4]=k*t+x*r+P*h+A*m,g[5]=k*e+x*a+P*l+A*d,g[6]=k*i+x*n+P*p+A*u,g[7]=k*s+x*o+P*f+A*c,g[8]=w*t+E*r+C*h+D*m,g[9]=w*e+E*a+C*l+D*d,g[10]=w*i+E*n+C*p+D*u,g[11]=w*s+E*o+C*f+D*c,g[12]=S*t+M*r+F*h+T*m,g[13]=S*e+M*a+F*l+T*d,g[14]=S*i+M*n+F*p+T*u,g[15]=S*s+M*o+F*f+T*c,this._identityCalculated=!1,this}function y(){return this._identityCalculated||(this._identity=!(1!==this.props[0]||0!==this.props[1]||0!==this.props[2]||0!==this.props[3]||0!==this.props[4]||1!==this.props[5]||0!==this.props[6]||0!==this.props[7]||0!==this.props[8]||0!==this.props[9]||1!==this.props[10]||0!==this.props[11]||0!==this.props[12]||0!==this.props[13]||0!==this.props[14]||1!==this.props[15]),this._identityCalculated=!0),this._identity}function v(t){for(var e=0;e<16;){if(t.props[e]!==this.props[e])return!1;e+=1}return!0}function b(t){var e;for(e=0;e<16;e+=1)t.props[e]=this.props[e];return t}function _(t){var e;for(e=0;e<16;e+=1)this.props[e]=t[e]}function k(t,e,i){return{x:t*this.props[0]+e*this.props[4]+i*this.props[8]+this.props[12],y:t*this.props[1]+e*this.props[5]+i*this.props[9]+this.props[13],z:t*this.props[2]+e*this.props[6]+i*this.props[10]+this.props[14]}}function x(t,e,i){return t*this.props[0]+e*this.props[4]+i*this.props[8]+this.props[12]}function P(t,e,i){return t*this.props[1]+e*this.props[5]+i*this.props[9]+this.props[13]}function A(t,e,i){return t*this.props[2]+e*this.props[6]+i*this.props[10]+this.props[14]}function w(){var t=this.props[0]*this.props[5]-this.props[1]*this.props[4],e=this.props[5]/t,i=-this.props[1]/t,s=-this.props[4]/t,r=this.props[0]/t,a=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/t,n=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/t,o=new kt;return o.props[0]=e,o.props[1]=i,o.props[4]=s,o.props[5]=r,o.props[12]=a,o.props[13]=n,o}function E(t){return this.getInverseMatrix().applyToPointArray(t[0],t[1],t[2]||0)}function C(t){var e,i=t.length,s=[];for(e=0;e<i;e+=1)s[e]=E(t[e]);return s}function D(t,e,i){var s=l("float32",6);if(this.isIdentity())s[0]=t[0],s[1]=t[1],s[2]=e[0],s[3]=e[1],s[4]=i[0],s[5]=i[1];else{var r=this.props[0],a=this.props[1],n=this.props[4],o=this.props[5],h=this.props[12],p=this.props[13];s[0]=t[0]*r+t[1]*n+h,s[1]=t[0]*a+t[1]*o+p,s[2]=e[0]*r+e[1]*n+h,s[3]=e[0]*a+e[1]*o+p,s[4]=i[0]*r+i[1]*n+h,s[5]=i[0]*a+i[1]*o+p}return s}function S(t,e,i){return this.isIdentity()?[t,e,i]:[t*this.props[0]+e*this.props[4]+i*this.props[8]+this.props[12],t*this.props[1]+e*this.props[5]+i*this.props[9]+this.props[13],t*this.props[2]+e*this.props[6]+i*this.props[10]+this.props[14]]}function M(t,e){if(this.isIdentity())return t+","+e;var i=this.props;return Math.round(100*(t*i[0]+e*i[4]+i[12]))/100+","+Math.round(100*(t*i[1]+e*i[5]+i[13]))/100}function F(){for(var t=0,e=this.props,i="matrix3d(";t<16;)i+=s(1e4*e[t])/1e4,i+=15===t?")":",",t+=1;return i}function T(t){return t<1e-6&&t>0||t>-1e-6&&t<0?s(1e4*t)/1e4:t}function I(){var t=this.props;return"matrix("+T(t[0])+","+T(t[1])+","+T(t[4])+","+T(t[5])+","+T(t[12])+","+T(t[13])+")"}return function(){this.reset=r,this.rotate=a,this.rotateX=n,this.rotateY=o,this.rotateZ=h,this.skew=f,this.skewFromAxis=m,this.shear=p,this.scale=d,this.setTransform=u,this.translate=c,this.transform=g,this.applyToPoint=k,this.applyToX=x,this.applyToY=P,this.applyToZ=A,this.applyToPointArray=S,this.applyToTriplePoints=D,this.applyToPointStringified=M,this.toCSS=F,this.to2dCSS=I,this.clone=b,this.cloneFromProps=_,this.equals=v,this.inversePoints=C,this.inversePoint=E,this.getInverseMatrix=w,this._t=this.transform,this.isIdentity=y,this._identity=!0,this._identityCalculated=!1,this.props=l("float32",16),this.reset()}}();function xt(t){return xt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},xt(t)}var Pt={};function At(){et.searchAnimations()}Pt.play=et.play,Pt.pause=et.pause,Pt.setLocationHref=function(e){t=e},Pt.togglePause=et.togglePause,Pt.setSpeed=et.setSpeed,Pt.setDirection=et.setDirection,Pt.stop=et.stop,Pt.searchAnimations=At,Pt.registerAnimation=et.registerAnimation,Pt.loadAnimation=function(t){return et.loadAnimation(t)},Pt.setSubframeRendering=function(t){!function(t){m=!!t}(t)},Pt.resize=et.resize,Pt.goToAndStop=et.goToAndStop,Pt.destroy=et.destroy,Pt.setQuality=function(t){if("string"==typeof t)switch(t){case"high":q(200);break;default:case"medium":q(50);break;case"low":q(10)}else!isNaN(t)&&t>1&&q(t);W()>=50?w(!1):w(!0)},Pt.inBrowser=function(){return"undefined"!=typeof navigator},Pt.installPlugin=function(t,e){"expressions"===t&&(d=e)},Pt.freeze=et.freeze,Pt.unfreeze=et.unfreeze,Pt.setVolume=et.setVolume,Pt.mute=et.mute,Pt.unmute=et.unmute,Pt.getRegisteredAnimations=et.getRegisteredAnimations,Pt.useWebWorker=function(t){e=!!t},Pt.setIDPrefix=function(t){u=t},Pt.__getFactory=function(t){switch(t){case"propertyFactory":return ht;case"shapePropertyFactory":return _t;case"matrix":return kt;default:return null}},Pt.version="5.9.3";var wt="",Et=document.getElementsByTagName("script"),Ct=Et[Et.length-1]||{src:""};wt=Ct.src?Ct.src.replace(/^[^\?]+\??/,""):"",function(t){for(var e=wt.split("&"),i=0;i<e.length;i+=1){var s=e[i].split("=");if(decodeURIComponent(s[0])==t)return decodeURIComponent(s[1])}}("renderer");var Dt=setInterval((function(){"complete"===document.readyState&&(clearInterval(Dt),At())}),100);try{"object"===("undefined"==typeof exports?"undefined":xt(exports))&&"undefined"!=typeof module||"function"==typeof define&&define.amd||(window.bodymovin=Pt)}catch(t){}var St=function(){var t={},e={};return t.registerModifier=function(t,i){e[t]||(e[t]=i)},t.getModifier=function(t,i,s){return new e[t](i,s)},t}();function Mt(){}function Ft(){}function Tt(){}Mt.prototype.initModifierProperties=function(){},Mt.prototype.addShapeToModifier=function(){},Mt.prototype.addShape=function(t){if(!this.closed){t.sh.container.addDynamicProperty(t.sh);var e={shape:t.sh,data:t,localShapeCollection:bt.newShapeCollection()};this.shapes.push(e),this.addShapeToModifier(e),this._isAnimated&&t.setAsAnimated()}},Mt.prototype.init=function(t,e){this.shapes=[],this.elem=t,this.initDynamicPropertyContainer(t),this.initModifierProperties(t,e),this.frameId=i,this.closed=!1,this.k=!1,this.dynamicProperties.length?this.k=!0:this.getValue(!0)},Mt.prototype.processKeys=function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties())},a([lt],Mt),a([Mt],Ft),Ft.prototype.initModifierProperties=function(t,e){this.s=ht.getProp(t,e.s,0,.01,this),this.e=ht.getProp(t,e.e,0,.01,this),this.o=ht.getProp(t,e.o,0,0,this),this.sValue=0,this.eValue=0,this.getValue=this.processKeys,this.m=e.m,this._isAnimated=!!this.s.effectsSequence.length||!!this.e.effectsSequence.length||!!this.o.effectsSequence.length},Ft.prototype.addShapeToModifier=function(t){t.pathsData=[]},Ft.prototype.calculateShapeEdges=function(t,e,i,s,r){var a=[];e<=1?a.push({s:t,e:e}):t>=1?a.push({s:t-1,e:e-1}):(a.push({s:t,e:1}),a.push({s:0,e:e-1}));var n,o,h=[],l=a.length;for(n=0;n<l;n+=1){var p,f;if(!((o=a[n]).e*r<s||o.s*r>s+i))p=o.s*r<=s?0:(o.s*r-s)/i,f=o.e*r>=s+i?1:(o.e*r-s)/i,h.push([p,f])}return h.length||h.push([0,0]),h},Ft.prototype.releasePathsData=function(t){var e,i=t.length;for(e=0;e<i;e+=1)nt.release(t[e]);return t.length=0,t},Ft.prototype.processShapes=function(t){var e,i,s,r;if(this._mdf||t){var a=this.o.v%360/360;if(a<0&&(a+=1),(e=this.s.v>1?1+a:this.s.v<0?0+a:this.s.v+a)>(i=this.e.v>1?1+a:this.e.v<0?0+a:this.e.v+a)){var n=e;e=i,i=n}e=1e-4*Math.round(1e4*e),i=1e-4*Math.round(1e4*i),this.sValue=e,this.eValue=i}else e=this.sValue,i=this.eValue;var o,h,l,p,f,m=this.shapes.length,d=0;if(i===e)for(r=0;r<m;r+=1)this.shapes[r].localShapeCollection.releaseShapes(),this.shapes[r].shape._mdf=!0,this.shapes[r].shape.paths=this.shapes[r].localShapeCollection,this._mdf&&(this.shapes[r].pathsData.length=0);else if(1===i&&0===e||0===i&&1===e){if(this._mdf)for(r=0;r<m;r+=1)this.shapes[r].pathsData.length=0,this.shapes[r].shape._mdf=!0}else{var u,c,g=[];for(r=0;r<m;r+=1)if((u=this.shapes[r]).shape._mdf||this._mdf||t||2===this.m){if(h=(s=u.shape.paths)._length,f=0,!u.shape._mdf&&u.pathsData.length)f=u.totalShapeLength;else{for(l=this.releasePathsData(u.pathsData),o=0;o<h;o+=1)p=ot.getSegmentsLength(s.shapes[o]),l.push(p),f+=p.totalLength;u.totalShapeLength=f,u.pathsData=l}d+=f,u.shape._mdf=!0}else u.shape.paths=u.localShapeCollection;var y,v=e,b=i,_=0;for(r=m-1;r>=0;r-=1)if((u=this.shapes[r]).shape._mdf){for((c=u.localShapeCollection).releaseShapes(),2===this.m&&m>1?(y=this.calculateShapeEdges(e,i,u.totalShapeLength,_,d),_+=u.totalShapeLength):y=[[v,b]],h=y.length,o=0;o<h;o+=1){v=y[o][0],b=y[o][1],g.length=0,b<=1?g.push({s:u.totalShapeLength*v,e:u.totalShapeLength*b}):v>=1?g.push({s:u.totalShapeLength*(v-1),e:u.totalShapeLength*(b-1)}):(g.push({s:u.totalShapeLength*v,e:u.totalShapeLength}),g.push({s:0,e:u.totalShapeLength*(b-1)}));var k=this.addShapes(u,g[0]);if(g[0].s!==g[0].e){if(g.length>1)if(u.shape.paths.shapes[u.shape.paths._length-1].c){var x=k.pop();this.addPaths(k,c),k=this.addShapes(u,g[1],x)}else this.addPaths(k,c),k=this.addShapes(u,g[1]);this.addPaths(k,c)}}u.shape.paths=c}}},Ft.prototype.addPaths=function(t,e){var i,s=t.length;for(i=0;i<s;i+=1)e.addShape(t[i])},Ft.prototype.addSegment=function(t,e,i,s,r,a,n){r.setXYAt(e[0],e[1],"o",a),r.setXYAt(i[0],i[1],"i",a+1),n&&r.setXYAt(t[0],t[1],"v",a),r.setXYAt(s[0],s[1],"v",a+1)},Ft.prototype.addSegmentFromArray=function(t,e,i,s){e.setXYAt(t[1],t[5],"o",i),e.setXYAt(t[2],t[6],"i",i+1),s&&e.setXYAt(t[0],t[4],"v",i),e.setXYAt(t[3],t[7],"v",i+1)},Ft.prototype.addShapes=function(t,e,i){var s,r,a,n,o,h,l,p,f=t.pathsData,m=t.shape.paths.shapes,d=t.shape.paths._length,u=0,c=[],g=!0;for(i?(o=i._length,p=i._length):(i=dt.newElement(),o=0,p=0),c.push(i),s=0;s<d;s+=1){for(h=f[s].lengths,i.c=m[s].c,a=m[s].c?h.length:h.length+1,r=1;r<a;r+=1)if(u+(n=h[r-1]).addedLength<e.s)u+=n.addedLength,i.c=!1;else{if(u>e.e){i.c=!1;break}e.s<=u&&e.e>=u+n.addedLength?(this.addSegment(m[s].v[r-1],m[s].o[r-1],m[s].i[r],m[s].v[r],i,o,g),g=!1):(l=ot.getNewSegment(m[s].v[r-1],m[s].v[r],m[s].o[r-1],m[s].i[r],(e.s-u)/n.addedLength,(e.e-u)/n.addedLength,h[r-1]),this.addSegmentFromArray(l,i,o,g),g=!1,i.c=!1),u+=n.addedLength,o+=1}if(m[s].c&&h.length){if(n=h[r-1],u<=e.e){var y=h[r-1].addedLength;e.s<=u&&e.e>=u+y?(this.addSegment(m[s].v[r-1],m[s].o[r-1],m[s].i[0],m[s].v[0],i,o,g),g=!1):(l=ot.getNewSegment(m[s].v[r-1],m[s].v[0],m[s].o[r-1],m[s].i[0],(e.s-u)/y,(e.e-u)/y,h[r-1]),this.addSegmentFromArray(l,i,o,g),g=!1,i.c=!1)}else i.c=!1;u+=n.addedLength,o+=1}if(i._length&&(i.setXYAt(i.v[p][0],i.v[p][1],"i",p),i.setXYAt(i.v[i._length-1][0],i.v[i._length-1][1],"o",i._length-1)),u>e.e)break;s<d-1&&(i=dt.newElement(),g=!0,c.push(i),o=0)}return c},a([Mt],Tt),Tt.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.amount=ht.getProp(t,e.a,0,null,this),this._isAnimated=!!this.amount.effectsSequence.length},Tt.prototype.processPath=function(t,e){var i=e/100,s=[0,0],r=t._length,a=0;for(a=0;a<r;a+=1)s[0]+=t.v[a][0],s[1]+=t.v[a][1];s[0]/=r,s[1]/=r;var n,o,h,l,p,f,m=dt.newElement();for(m.c=t.c,a=0;a<r;a+=1)n=t.v[a][0]+(s[0]-t.v[a][0])*i,o=t.v[a][1]+(s[1]-t.v[a][1])*i,h=t.o[a][0]+(s[0]-t.o[a][0])*-i,l=t.o[a][1]+(s[1]-t.o[a][1])*-i,p=t.i[a][0]+(s[0]-t.i[a][0])*-i,f=t.i[a][1]+(s[1]-t.i[a][1])*-i,m.setTripleAt(n,o,h,l,p,f,a);return m},Tt.prototype.processShapes=function(t){var e,i,s,r,a,n,o=this.shapes.length,h=this.amount.v;if(0!==h)for(i=0;i<o;i+=1){if(n=(a=this.shapes[i]).localShapeCollection,a.shape._mdf||this._mdf||t)for(n.releaseShapes(),a.shape._mdf=!0,e=a.shape.paths.shapes,r=a.shape.paths._length,s=0;s<r;s+=1)n.addShape(this.processPath(e[s],h));a.shape.paths=a.localShapeCollection}this.dynamicProperties.length||(this._mdf=!1)};var It=function(){var t=[0,0];function e(t,e,i){if(this.elem=t,this.frameId=-1,this.propType="transform",this.data=e,this.v=new kt,this.pre=new kt,this.appliedTransformations=0,this.initDynamicPropertyContainer(i||t),e.p&&e.p.s?(this.px=ht.getProp(t,e.p.x,0,0,this),this.py=ht.getProp(t,e.p.y,0,0,this),e.p.z&&(this.pz=ht.getProp(t,e.p.z,0,0,this))):this.p=ht.getProp(t,e.p||{k:[0,0,0]},1,0,this),e.rx){if(this.rx=ht.getProp(t,e.rx,0,P,this),this.ry=ht.getProp(t,e.ry,0,P,this),this.rz=ht.getProp(t,e.rz,0,P,this),e.or.k[0].ti){var s,r=e.or.k.length;for(s=0;s<r;s+=1)e.or.k[s].to=null,e.or.k[s].ti=null}this.or=ht.getProp(t,e.or,1,P,this),this.or.sh=!0}else this.r=ht.getProp(t,e.r||{k:0},0,P,this);e.sk&&(this.sk=ht.getProp(t,e.sk,0,P,this),this.sa=ht.getProp(t,e.sa,0,P,this)),this.a=ht.getProp(t,e.a||{k:[0,0,0]},1,0,this),this.s=ht.getProp(t,e.s||{k:[100,100,100]},1,.01,this),e.o?this.o=ht.getProp(t,e.o,0,.01,t):this.o={_mdf:!1,v:1},this._isDirty=!0,this.dynamicProperties.length||this.getValue(!0)}return e.prototype={applyToMatrix:function(t){var e=this._mdf;this.iterateDynamicProperties(),this._mdf=this._mdf||e,this.a&&t.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&t.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&t.skewFromAxis(-this.sk.v,this.sa.v),this.r?t.rotate(-this.r.v):t.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?this.data.p.z?t.translate(this.px.v,this.py.v,-this.pz.v):t.translate(this.px.v,this.py.v,0):t.translate(this.p.v[0],this.p.v[1],-this.p.v[2])},getValue:function(e){if(this.elem.globalData.frameId!==this.frameId){if(this._isDirty&&(this.precalculateMatrix(),this._isDirty=!1),this.iterateDynamicProperties(),this._mdf||e){var i;if(this.v.cloneFromProps(this.pre.props),this.appliedTransformations<1&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations<2&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.appliedTransformations<3&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r&&this.appliedTransformations<4?this.v.rotate(-this.r.v):!this.r&&this.appliedTransformations<4&&this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.autoOriented){var s,r;if(i=this.elem.globalData.frameRate,this.p&&this.p.keyframes&&this.p.getValueAtTime)this.p._caching.lastFrame+this.p.offsetTime<=this.p.keyframes[0].t?(s=this.p.getValueAtTime((this.p.keyframes[0].t+.01)/i,0),r=this.p.getValueAtTime(this.p.keyframes[0].t/i,0)):this.p._caching.lastFrame+this.p.offsetTime>=this.p.keyframes[this.p.keyframes.length-1].t?(s=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t/i,0),r=this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length-1].t-.05)/i,0)):(s=this.p.pv,r=this.p.getValueAtTime((this.p._caching.lastFrame+this.p.offsetTime-.01)/i,this.p.offsetTime));else if(this.px&&this.px.keyframes&&this.py.keyframes&&this.px.getValueAtTime&&this.py.getValueAtTime){s=[],r=[];var a=this.px,n=this.py;a._caching.lastFrame+a.offsetTime<=a.keyframes[0].t?(s[0]=a.getValueAtTime((a.keyframes[0].t+.01)/i,0),s[1]=n.getValueAtTime((n.keyframes[0].t+.01)/i,0),r[0]=a.getValueAtTime(a.keyframes[0].t/i,0),r[1]=n.getValueAtTime(n.keyframes[0].t/i,0)):a._caching.lastFrame+a.offsetTime>=a.keyframes[a.keyframes.length-1].t?(s[0]=a.getValueAtTime(a.keyframes[a.keyframes.length-1].t/i,0),s[1]=n.getValueAtTime(n.keyframes[n.keyframes.length-1].t/i,0),r[0]=a.getValueAtTime((a.keyframes[a.keyframes.length-1].t-.01)/i,0),r[1]=n.getValueAtTime((n.keyframes[n.keyframes.length-1].t-.01)/i,0)):(s=[a.pv,n.pv],r[0]=a.getValueAtTime((a._caching.lastFrame+a.offsetTime-.01)/i,a.offsetTime),r[1]=n.getValueAtTime((n._caching.lastFrame+n.offsetTime-.01)/i,n.offsetTime))}else s=r=t;this.v.rotate(-Math.atan2(s[1]-r[1],s[0]-r[0]))}this.data.p&&this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem.globalData.frameId}},precalculateMatrix:function(){if(!this.a.k&&(this.pre.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations=1,!this.s.effectsSequence.length)){if(this.pre.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.appliedTransformations=2,this.sk){if(this.sk.effectsSequence.length||this.sa.effectsSequence.length)return;this.pre.skewFromAxis(-this.sk.v,this.sa.v),this.appliedTransformations=3}this.r?this.r.effectsSequence.length||(this.pre.rotate(-this.r.v),this.appliedTransformations=4):this.rz.effectsSequence.length||this.ry.effectsSequence.length||this.rx.effectsSequence.length||this.or.effectsSequence.length||(this.pre.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.appliedTransformations=4)}},autoOrient:function(){}},a([lt],e),e.prototype.addDynamicProperty=function(t){this._addDynamicProperty(t),this.elem.addDynamicProperty(t),this._isDirty=!0},e.prototype._addDynamicProperty=lt.prototype.addDynamicProperty,{getTransformProperty:function(t,i,s){return new e(t,i,s)}}}();function Bt(){}function Lt(){}function zt(t){for(var e=t.fStyle?t.fStyle.split(" "):[],i="normal",s="normal",r=e.length,a=0;a<r;a+=1)switch(e[a].toLowerCase()){case"italic":s="italic";break;case"bold":i="700";break;case"black":i="900";break;case"medium":i="500";break;case"regular":case"normal":i="400";break;case"light":case"thin":i="200"}return{style:s,weight:t.fWeight||i}}a([Mt],Bt),Bt.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.c=ht.getProp(t,e.c,0,null,this),this.o=ht.getProp(t,e.o,0,null,this),this.tr=It.getTransformProperty(t,e.tr,this),this.so=ht.getProp(t,e.tr.so,0,.01,this),this.eo=ht.getProp(t,e.tr.eo,0,.01,this),this.data=e,this.dynamicProperties.length||this.getValue(!0),this._isAnimated=!!this.dynamicProperties.length,this.pMatrix=new kt,this.rMatrix=new kt,this.sMatrix=new kt,this.tMatrix=new kt,this.matrix=new kt},Bt.prototype.applyTransforms=function(t,e,i,s,r,a){var n=a?-1:1,o=s.s.v[0]+(1-s.s.v[0])*(1-r),h=s.s.v[1]+(1-s.s.v[1])*(1-r);t.translate(s.p.v[0]*n*r,s.p.v[1]*n*r,s.p.v[2]),e.translate(-s.a.v[0],-s.a.v[1],s.a.v[2]),e.rotate(-s.r.v*n*r),e.translate(s.a.v[0],s.a.v[1],s.a.v[2]),i.translate(-s.a.v[0],-s.a.v[1],s.a.v[2]),i.scale(a?1/o:o,a?1/h:h),i.translate(s.a.v[0],s.a.v[1],s.a.v[2])},Bt.prototype.init=function(t,e,i,s){for(this.elem=t,this.arr=e,this.pos=i,this.elemsData=s,this._currentCopies=0,this._elements=[],this._groups=[],this.frameId=-1,this.initDynamicPropertyContainer(t),this.initModifierProperties(t,e[i]);i>0;)i-=1,this._elements.unshift(e[i]);this.dynamicProperties.length?this.k=!0:this.getValue(!0)},Bt.prototype.resetElements=function(t){var e,i=t.length;for(e=0;e<i;e+=1)t[e]._processed=!1,"gr"===t[e].ty&&this.resetElements(t[e].it)},Bt.prototype.cloneElements=function(t){var e=JSON.parse(JSON.stringify(t));return this.resetElements(e),e},Bt.prototype.changeGroupRender=function(t,e){var i,s=t.length;for(i=0;i<s;i+=1)t[i]._render=e,"gr"===t[i].ty&&this.changeGroupRender(t[i].it,e)},Bt.prototype.processShapes=function(t){var e,i,s,r,a,n=!1;if(this._mdf||t){var o,h=Math.ceil(this.c.v);if(this._groups.length<h){for(;this._groups.length<h;){var l={it:this.cloneElements(this._elements),ty:"gr"};l.it.push({a:{a:0,ix:1,k:[0,0]},nm:"Transform",o:{a:0,ix:7,k:100},p:{a:0,ix:2,k:[0,0]},r:{a:1,ix:6,k:[{s:0,e:0,t:0},{s:0,e:0,t:1}]},s:{a:0,ix:3,k:[100,100]},sa:{a:0,ix:5,k:0},sk:{a:0,ix:4,k:0},ty:"tr"}),this.arr.splice(0,0,l),this._groups.splice(0,0,l),this._currentCopies+=1}this.elem.reloadShapes(),n=!0}for(a=0,s=0;s<=this._groups.length-1;s+=1){if(o=a<h,this._groups[s]._render=o,this.changeGroupRender(this._groups[s].it,o),!o){var p=this.elemsData[s].it,f=p[p.length-1];0!==f.transform.op.v?(f.transform.op._mdf=!0,f.transform.op.v=0):f.transform.op._mdf=!1}a+=1}this._currentCopies=h;var m=this.o.v,d=m%1,u=m>0?Math.floor(m):Math.ceil(m),c=this.pMatrix.props,g=this.rMatrix.props,y=this.sMatrix.props;this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset();var v,b,_=0;if(m>0){for(;_<u;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),_+=1;d&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,d,!1),_+=d)}else if(m<0){for(;_>u;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),_-=1;d&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-d,!0),_-=d)}for(s=1===this.data.m?0:this._currentCopies-1,r=1===this.data.m?1:-1,a=this._currentCopies;a;){if(b=(i=(e=this.elemsData[s].it)[e.length-1].transform.mProps.v.props).length,e[e.length-1].transform.mProps._mdf=!0,e[e.length-1].transform.op._mdf=!0,e[e.length-1].transform.op.v=1===this._currentCopies?this.so.v:this.so.v+(this.eo.v-this.so.v)*(s/(this._currentCopies-1)),0!==_){for((0!==s&&1===r||s!==this._currentCopies-1&&-1===r)&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),this.matrix.transform(g[0],g[1],g[2],g[3],g[4],g[5],g[6],g[7],g[8],g[9],g[10],g[11],g[12],g[13],g[14],g[15]),this.matrix.transform(y[0],y[1],y[2],y[3],y[4],y[5],y[6],y[7],y[8],y[9],y[10],y[11],y[12],y[13],y[14],y[15]),this.matrix.transform(c[0],c[1],c[2],c[3],c[4],c[5],c[6],c[7],c[8],c[9],c[10],c[11],c[12],c[13],c[14],c[15]),v=0;v<b;v+=1)i[v]=this.matrix.props[v];this.matrix.reset()}else for(this.matrix.reset(),v=0;v<b;v+=1)i[v]=this.matrix.props[v];_+=1,a-=1,s+=r}}else for(a=this._currentCopies,s=0,r=1;a;)i=(e=this.elemsData[s].it)[e.length-1].transform.mProps.v.props,e[e.length-1].transform.mProps._mdf=!1,e[e.length-1].transform.op._mdf=!1,a-=1,s+=r;return n},Bt.prototype.addShape=function(){},a([Mt],Lt),Lt.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.rd=ht.getProp(t,e.r,0,null,this),this._isAnimated=!!this.rd.effectsSequence.length},Lt.prototype.processPath=function(t,e){var i,s=dt.newElement();s.c=t.c;var r,a,n,o,h,l,p,f,m,d,u,c,g=t._length,y=0;for(i=0;i<g;i+=1)r=t.v[i],n=t.o[i],a=t.i[i],r[0]===n[0]&&r[1]===n[1]&&r[0]===a[0]&&r[1]===a[1]?0!==i&&i!==g-1||t.c?(o=0===i?t.v[g-1]:t.v[i-1],l=(h=Math.sqrt(Math.pow(r[0]-o[0],2)+Math.pow(r[1]-o[1],2)))?Math.min(h/2,e)/h:0,p=u=r[0]+(o[0]-r[0])*l,f=c=r[1]-(r[1]-o[1])*l,m=p-(p-r[0])*A,d=f-(f-r[1])*A,s.setTripleAt(p,f,m,d,u,c,y),y+=1,o=i===g-1?t.v[0]:t.v[i+1],l=(h=Math.sqrt(Math.pow(r[0]-o[0],2)+Math.pow(r[1]-o[1],2)))?Math.min(h/2,e)/h:0,p=m=r[0]+(o[0]-r[0])*l,f=d=r[1]+(o[1]-r[1])*l,u=p-(p-r[0])*A,c=f-(f-r[1])*A,s.setTripleAt(p,f,m,d,u,c,y),y+=1):(s.setTripleAt(r[0],r[1],n[0],n[1],a[0],a[1],y),y+=1):(s.setTripleAt(t.v[i][0],t.v[i][1],t.o[i][0],t.o[i][1],t.i[i][0],t.i[i][1],y),y+=1);return s},Lt.prototype.processShapes=function(t){var e,i,s,r,a,n,o=this.shapes.length,h=this.rd.v;if(0!==h)for(i=0;i<o;i+=1){if(n=(a=this.shapes[i]).localShapeCollection,a.shape._mdf||this._mdf||t)for(n.releaseShapes(),a.shape._mdf=!0,e=a.shape.paths.shapes,r=a.shape.paths._length,s=0;s<r;s+=1)n.addShape(this.processPath(e[s],h));a.shape.paths=a.localShapeCollection}this.dynamicProperties.length||(this._mdf=!1)};var Rt=function(){var t={w:0,size:0,shapes:[],data:{shapes:[]}},e=[];e=e.concat([2304,2305,2306,2307,2362,2363,2364,2364,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2387,2388,2389,2390,2391,2402,2403]);var i=["d83cdffb","d83cdffc","d83cdffd","d83cdffe","d83cdfff"],s=[65039,8205];function a(t,e){var i=r("span");i.setAttribute("aria-hidden",!0),i.style.fontFamily=e;var s=r("span");s.innerText="giItT1WQy@!-/#",i.style.position="absolute",i.style.left="-10000px",i.style.top="-10000px",i.style.fontSize="300px",i.style.fontVariant="normal",i.style.fontStyle="normal",i.style.fontWeight="normal",i.style.letterSpacing="0",i.appendChild(s),document.body.appendChild(i);var a=s.offsetWidth;return s.style.fontFamily=function(t){var e,i=t.split(","),s=i.length,r=[];for(e=0;e<s;e+=1)"sans-serif"!==i[e]&&"monospace"!==i[e]&&r.push(i[e]);return r.join(",")}(t)+", "+e,{node:s,w:a,parent:i}}function n(t,e){var i,s=document.body&&e?"svg":"canvas",r=zt(t);if("svg"===s){var a=H("text");a.style.fontSize="100px",a.setAttribute("font-family",t.fFamily),a.setAttribute("font-style",r.style),a.setAttribute("font-weight",r.weight),a.textContent="1",t.fClass?(a.style.fontFamily="inherit",a.setAttribute("class",t.fClass)):a.style.fontFamily=t.fFamily,e.appendChild(a),i=a}else{var n=new OffscreenCanvas(500,500).getContext("2d");n.font=r.style+" "+r.weight+" 100px "+t.fFamily,i=n}return{measureText:function(t){return"svg"===s?(i.textContent=t,i.getComputedTextLength()):i.measureText(t).width}}}var o=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.isLoaded=!1,this._warned=!1,this.initTime=Date.now(),this.setIsLoadedBinded=this.setIsLoaded.bind(this),this.checkLoadedFontsBinded=this.checkLoadedFonts.bind(this)};o.isModifier=function(t,e){var s=t.toString(16)+e.toString(16);return-1!==i.indexOf(s)},o.isZeroWidthJoiner=function(t,e){return e?t===s[0]&&e===s[1]:t===s[1]},o.isCombinedCharacter=function(t){return-1!==e.indexOf(t)};var h={addChars:function(t){if(t){var e;this.chars||(this.chars=[]);var i,s,r=t.length,a=this.chars.length;for(e=0;e<r;e+=1){for(i=0,s=!1;i<a;)this.chars[i].style===t[e].style&&this.chars[i].fFamily===t[e].fFamily&&this.chars[i].ch===t[e].ch&&(s=!0),i+=1;s||(this.chars.push(t[e]),a+=1)}}},addFonts:function(t,e){if(t){if(this.chars)return this.isLoaded=!0,void(this.fonts=t.list);if(!document.body)return this.isLoaded=!0,t.list.forEach((function(t){t.helper=n(t),t.cache={}})),void(this.fonts=t.list);var i,s=t.list,o=s.length,h=o;for(i=0;i<o;i+=1){var l,p,f=!0;if(s[i].loaded=!1,s[i].monoCase=a(s[i].fFamily,"monospace"),s[i].sansCase=a(s[i].fFamily,"sans-serif"),s[i].fPath){if("p"===s[i].fOrigin||3===s[i].origin){if((l=document.querySelectorAll('style[f-forigin="p"][f-family="'+s[i].fFamily+'"], style[f-origin="3"][f-family="'+s[i].fFamily+'"]')).length>0&&(f=!1),f){var m=r("style");m.setAttribute("f-forigin",s[i].fOrigin),m.setAttribute("f-origin",s[i].origin),m.setAttribute("f-family",s[i].fFamily),m.type="text/css",m.innerText="@font-face {font-family: "+s[i].fFamily+"; font-style: normal; src: url('"+s[i].fPath+"');}",e.appendChild(m)}}else if("g"===s[i].fOrigin||1===s[i].origin){for(l=document.querySelectorAll('link[f-forigin="g"], link[f-origin="1"]'),p=0;p<l.length;p+=1)-1!==l[p].href.indexOf(s[i].fPath)&&(f=!1);if(f){var d=r("link");d.setAttribute("f-forigin",s[i].fOrigin),d.setAttribute("f-origin",s[i].origin),d.type="text/css",d.rel="stylesheet",d.href=s[i].fPath,document.body.appendChild(d)}}else if("t"===s[i].fOrigin||2===s[i].origin){for(l=document.querySelectorAll('script[f-forigin="t"], script[f-origin="2"]'),p=0;p<l.length;p+=1)s[i].fPath===l[p].src&&(f=!1);if(f){var u=r("link");u.setAttribute("f-forigin",s[i].fOrigin),u.setAttribute("f-origin",s[i].origin),u.setAttribute("rel","stylesheet"),u.setAttribute("href",s[i].fPath),e.appendChild(u)}}}else s[i].loaded=!0,h-=1;s[i].helper=n(s[i],e),s[i].cache={},this.fonts.push(s[i])}0===h?this.isLoaded=!0:setTimeout(this.checkLoadedFonts.bind(this),100)}else this.isLoaded=!0},getCharData:function(e,i,s){for(var r=0,a=this.chars.length;r<a;){if(this.chars[r].ch===e&&this.chars[r].style===i&&this.chars[r].fFamily===s)return this.chars[r];r+=1}return("string"==typeof e&&13!==e.charCodeAt(0)||!e)&&console&&console.warn&&!this._warned&&(this._warned=!0,console.warn("Missing character from exported characters list: ",e,i,s)),t},getFontByName:function(t){for(var e=0,i=this.fonts.length;e<i;){if(this.fonts[e].fName===t)return this.fonts[e];e+=1}return this.fonts[0]},measureText:function(t,e,i){var s=this.getFontByName(e),r=t.charCodeAt(0);if(!s.cache[r+1]){var a=s.helper;if(" "===t){var n=a.measureText("|"+t+"|"),o=a.measureText("||");s.cache[r+1]=(n-o)/100}else s.cache[r+1]=a.measureText(t)/100}return s.cache[r+1]*i},checkLoadedFonts:function(){var t,e,i,s=this.fonts.length,r=s;for(t=0;t<s;t+=1)this.fonts[t].loaded?r-=1:"n"===this.fonts[t].fOrigin||0===this.fonts[t].origin?this.fonts[t].loaded=!0:(e=this.fonts[t].monoCase.node,i=this.fonts[t].monoCase.w,e.offsetWidth!==i?(r-=1,this.fonts[t].loaded=!0):(e=this.fonts[t].sansCase.node,i=this.fonts[t].sansCase.w,e.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<5e3?setTimeout(this.checkLoadedFontsBinded,20):setTimeout(this.setIsLoadedBinded,10)},setIsLoaded:function(){this.isLoaded=!0}};return o.prototype=h,o}();function Vt(){}Vt.prototype={initRenderable:function(){this.isInRange=!1,this.hidden=!1,this.isTransparent=!1,this.renderableComponents=[]},addRenderableComponent:function(t){-1===this.renderableComponents.indexOf(t)&&this.renderableComponents.push(t)},removeRenderableComponent:function(t){-1!==this.renderableComponents.indexOf(t)&&this.renderableComponents.splice(this.renderableComponents.indexOf(t),1)},prepareRenderableFrame:function(t){this.checkLayerLimits(t)},checkTransparency:function(){this.finalTransform.mProp.o.v<=0?!this.isTransparent&&this.globalData.renderConfig.hideOnTransparent&&(this.isTransparent=!0,this.hide()):this.isTransparent&&(this.isTransparent=!1,this.show())},checkLayerLimits:function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?!0!==this.isInRange&&(this.globalData._mdf=!0,this._mdf=!0,this.isInRange=!0,this.show()):!1!==this.isInRange&&(this.globalData._mdf=!0,this.isInRange=!1,this.hide())},renderRenderable:function(){var t,e=this.renderableComponents.length;for(t=0;t<e;t+=1)this.renderableComponents[t].renderFrame(this._isFirstFrame)},sourceRectAtTime:function(){return{top:0,left:0,width:100,height:100}},getLayerSize:function(){return 5===this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}}};var Ot,Nt=function(){function t(t,e){this._mask=t,this._data=e}Object.defineProperty(t.prototype,"maskPath",{get:function(){return this._mask.prop.k&&this._mask.prop.getValue(),this._mask.prop}}),Object.defineProperty(t.prototype,"maskOpacity",{get:function(){return this._mask.op.k&&this._mask.op.getValue(),100*this._mask.op.v}});return function(e){var i,s=p(e.viewData.length),r=e.viewData.length;for(i=0;i<r;i+=1)s[i]=new t(e.viewData[i],e.masksProperties[i]);return function(t){for(i=0;i<r;){if(e.masksProperties[i].nm===t)return s[i];i+=1}return null}}}(),Gt=function(){var t={pv:0,v:0,mult:1},e={pv:[0,0,0],v:[0,0,0],mult:1};function i(t,e,i){Object.defineProperty(t,"velocity",{get:function(){return e.getVelocityAtTime(e.comp.currentFrame)}}),t.numKeys=e.keyframes?e.keyframes.length:0,t.key=function(s){if(!t.numKeys)return 0;var r="";r="s"in e.keyframes[s-1]?e.keyframes[s-1].s:"e"in e.keyframes[s-2]?e.keyframes[s-2].e:e.keyframes[s-2].s;var a="unidimensional"===i?new Number(r):Object.assign({},r);return a.time=e.keyframes[s-1].t/e.elem.comp.globalData.frameRate,a.value="unidimensional"===i?r[0]:r,a},t.valueAtTime=e.getValueAtTime,t.speedAtTime=e.getSpeedAtTime,t.velocityAtTime=e.getVelocityAtTime,t.propertyGroup=e.propertyGroup}function s(){return t}return function(r){return r?"unidimensional"===r.propType?function(e){e&&"pv"in e||(e=t);var s=1/e.mult,r=e.pv*s,a=new Number(r);return a.value=r,i(a,e,"unidimensional"),function(){return e.k&&e.getValue(),r=e.v*s,a.value!==r&&((a=new Number(r)).value=r,i(a,e,"unidimensional")),a}}(r):function(t){t&&"pv"in t||(t=e);var s=1/t.mult,r=t.data&&t.data.l||t.pv.length,a=l("float32",r),n=l("float32",r);return a.value=n,i(a,t,"multidimensional"),function(){t.k&&t.getValue();for(var e=0;e<r;e+=1)n[e]=t.v[e]*s,a[e]=n[e];return a}}(r):s}}(),jt=function(t){function e(t){switch(t){case"scale":case"Scale":case"ADBE Scale":case 6:return e.scale;case"rotation":case"Rotation":case"ADBE Rotation":case"ADBE Rotate Z":case 10:return e.rotation;case"ADBE Rotate X":return e.xRotation;case"ADBE Rotate Y":return e.yRotation;case"position":case"Position":case"ADBE Position":case 2:return e.position;case"ADBE Position_0":return e.xPosition;case"ADBE Position_1":return e.yPosition;case"ADBE Position_2":return e.zPosition;case"anchorPoint":case"AnchorPoint":case"Anchor Point":case"ADBE AnchorPoint":case 1:return e.anchorPoint;case"opacity":case"Opacity":case 11:return e.opacity;default:return null}}var i,s,r,a;return Object.defineProperty(e,"rotation",{get:Gt(t.r||t.rz)}),Object.defineProperty(e,"zRotation",{get:Gt(t.rz||t.r)}),Object.defineProperty(e,"xRotation",{get:Gt(t.rx)}),Object.defineProperty(e,"yRotation",{get:Gt(t.ry)}),Object.defineProperty(e,"scale",{get:Gt(t.s)}),t.p?a=Gt(t.p):(i=Gt(t.px),s=Gt(t.py),t.pz&&(r=Gt(t.pz))),Object.defineProperty(e,"position",{get:function(){return t.p?a():[i(),s(),r?r():0]}}),Object.defineProperty(e,"xPosition",{get:Gt(t.px)}),Object.defineProperty(e,"yPosition",{get:Gt(t.py)}),Object.defineProperty(e,"zPosition",{get:Gt(t.pz)}),Object.defineProperty(e,"anchorPoint",{get:Gt(t.a)}),Object.defineProperty(e,"opacity",{get:Gt(t.o)}),Object.defineProperty(e,"skew",{get:Gt(t.sk)}),Object.defineProperty(e,"skewAxis",{get:Gt(t.sa)}),Object.defineProperty(e,"orientation",{get:Gt(t.or)}),e},qt=function(){function t(t){var e=new kt;void 0!==t?this._elem.finalTransform.mProp.getValueAtTime(t).clone(e):this._elem.finalTransform.mProp.applyToMatrix(e);return e}function e(t,e){var i=this.getMatrix(e);return i.props[12]=0,i.props[13]=0,i.props[14]=0,this.applyPoint(i,t)}function i(t,e){var i=this.getMatrix(e);return this.applyPoint(i,t)}function s(t,e){var i=this.getMatrix(e);return i.props[12]=0,i.props[13]=0,i.props[14]=0,this.invertPoint(i,t)}function r(t,e){var i=this.getMatrix(e);return this.invertPoint(i,t)}function a(t,e){if(this._elem.hierarchy&&this._elem.hierarchy.length){var i,s=this._elem.hierarchy.length;for(i=0;i<s;i+=1)this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(t)}return t.applyToPointArray(e[0],e[1],e[2]||0)}function o(t,e){if(this._elem.hierarchy&&this._elem.hierarchy.length){var i,s=this._elem.hierarchy.length;for(i=0;i<s;i+=1)this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(t)}return t.inversePoint(e)}function h(t){var e=new kt;if(e.reset(),this._elem.finalTransform.mProp.applyToMatrix(e),this._elem.hierarchy&&this._elem.hierarchy.length){var i,s=this._elem.hierarchy.length;for(i=0;i<s;i+=1)this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(e);return e.inversePoint(t)}return e.inversePoint(t)}function l(){return[1,1,1,1]}return function(p){var f;function m(t){switch(t){case"ADBE Root Vectors Group":case"Contents":case 2:return m.shapeInterface;case 1:case 6:case"Transform":case"transform":case"ADBE Transform Group":return f;case 4:case"ADBE Effect Parade":case"effects":case"Effects":return m.effect;case"ADBE Text Properties":return m.textInterface;default:return null}}m.getMatrix=t,m.invertPoint=o,m.applyPoint=a,m.toWorld=i,m.toWorldVec=e,m.fromWorld=r,m.fromWorldVec=s,m.toComp=i,m.fromComp=h,m.sampleImage=l,m.sourceRectAtTime=p.sourceRectAtTime.bind(p),m._elem=p;var d=n(f=jt(p.finalTransform.mProp),"anchorPoint");return Object.defineProperties(m,{hasParent:{get:function(){return p.hierarchy.length}},parent:{get:function(){return p.hierarchy[0].layerInterface}},rotation:n(f,"rotation"),scale:n(f,"scale"),position:n(f,"position"),opacity:n(f,"opacity"),anchorPoint:d,anchor_point:d,transform:{get:function(){return f}},active:{get:function(){return p.isInRange}}}),m.startTime=p.data.st,m.index=p.data.ind,m.source=p.data.refId,m.height=0===p.data.ty?p.data.h:100,m.width=0===p.data.ty?p.data.w:100,m.inPoint=p.data.ip/p.comp.globalData.frameRate,m.outPoint=p.data.op/p.comp.globalData.frameRate,m._name=p.data.nm,m.registerMaskInterface=function(t){m.mask=new Nt(t,p)},m.registerEffectsInterface=function(t){m.effect=t},m}}(),Wt=function(t,e){return function(i){return(i=void 0===i?1:i)<=0?t:e(i-1)}},Ht=function(t,e){var i={_name:t};return function(t){return(t=void 0===t?1:t)<=0?i:e(t-1)}},Xt=function(){function t(i,s,r,a){function n(t){for(var e=i.ef,s=0,r=e.length;s<r;){if(t===e[s].nm||t===e[s].mn||t===e[s].ix)return 5===e[s].ty?l[s]:l[s]();s+=1}throw new Error}var o,h=Wt(n,r),l=[],p=i.ef.length;for(o=0;o<p;o+=1)5===i.ef[o].ty?l.push(t(i.ef[o],s.effectElements[o],s.effectElements[o].propertyGroup,a)):l.push(e(s.effectElements[o],i.ef[o].ty,a,h));return"ADBE Color Control"===i.mn&&Object.defineProperty(n,"color",{get:function(){return l[0]()}}),Object.defineProperties(n,{numProperties:{get:function(){return i.np}},_name:{value:i.nm},propertyGroup:{value:h}}),n.enabled=0!==i.en,n.active=n.enabled,n}function e(t,e,i,s){var r=Gt(t.p);return t.p.setGroupProperty&&t.p.setGroupProperty(Ht("",s)),function(){return 10===e?i.comp.compInterface(t.p.v):r()}}return{createEffectsInterface:function(e,i){if(e.effectsManager){var s,r=[],a=e.data.ef,n=e.effectsManager.effectElements.length;for(s=0;s<n;s+=1)r.push(t(a[s],e.effectsManager.effectElements[s],i,e));var o=e.data.ef||[],h=function(t){for(s=0,n=o.length;s<n;){if(t===o[s].nm||t===o[s].mn||t===o[s].ix)return r[s];s+=1}return null};return Object.defineProperty(h,"numProperties",{get:function(){return o.length}}),h}return null}}}(),Yt=function(t){function e(e){for(var i=0,s=t.layers.length;i<s;){if(t.layers[i].nm===e||t.layers[i].ind===e)return t.elements[i].layerInterface;i+=1}return null}return Object.defineProperty(e,"_name",{value:t.data.nm}),e.layer=e,e.pixelAspect=1,e.height=t.data.h||t.globalData.compSize.h,e.width=t.data.w||t.globalData.compSize.w,e.pixelAspect=1,e.frameDuration=1/t.globalData.frameRate,e.displayStartTime=0,e.numLayers=t.layers.length,e},Zt=function(t,e,i){var s=e.sh;function r(t){return"Shape"===t||"shape"===t||"Path"===t||"path"===t||"ADBE Vector Shape"===t||2===t?r.path:null}var a=Wt(r,i);return s.setGroupProperty(Ht("Path",a)),Object.defineProperties(r,{path:{get:function(){return s.k&&s.getValue(),s}},shape:{get:function(){return s.k&&s.getValue(),s}},_name:{value:t.nm},ix:{value:t.ix},propertyIndex:{value:t.ix},mn:{value:t.mn},propertyGroup:{value:i}}),r},Kt=function(){function t(t,o,d){var u,c=[],g=t?t.length:0;for(u=0;u<g;u+=1)"gr"===t[u].ty?c.push(e(t[u],o[u],d)):"fl"===t[u].ty?c.push(i(t[u],o[u],d)):"st"===t[u].ty?c.push(a(t[u],o[u],d)):"tm"===t[u].ty?c.push(n(t[u],o[u],d)):"tr"===t[u].ty||("el"===t[u].ty?c.push(h(t[u],o[u],d)):"sr"===t[u].ty?c.push(l(t[u],o[u],d)):"sh"===t[u].ty?c.push(Zt(t[u],o[u],d)):"rc"===t[u].ty?c.push(p(t[u],o[u],d)):"rd"===t[u].ty?c.push(f(t[u],o[u],d)):"rp"===t[u].ty?c.push(m(t[u],o[u],d)):"gf"===t[u].ty?c.push(s(t[u],o[u],d)):c.push(r(t[u],o[u])));return c}function e(e,i,s){var r=function(t){switch(t){case"ADBE Vectors Group":case"Contents":case 2:return r.content;default:return r.transform}};r.propertyGroup=Wt(r,s);var a=function(e,i,s){var r,a=function(t){for(var e=0,i=r.length;e<i;){if(r[e]._name===t||r[e].mn===t||r[e].propertyIndex===t||r[e].ix===t||r[e].ind===t)return r[e];e+=1}return"number"==typeof t?r[t-1]:null};a.propertyGroup=Wt(a,s),r=t(e.it,i.it,a.propertyGroup),a.numProperties=r.length;var n=o(e.it[e.it.length-1],i.it[i.it.length-1],a.propertyGroup);return a.transform=n,a.propertyIndex=e.cix,a._name=e.nm,a}(e,i,r.propertyGroup),n=o(e.it[e.it.length-1],i.it[i.it.length-1],r.propertyGroup);return r.content=a,r.transform=n,Object.defineProperty(r,"_name",{get:function(){return e.nm}}),r.numProperties=e.np,r.propertyIndex=e.ix,r.nm=e.nm,r.mn=e.mn,r}function i(t,e,i){function s(t){return"Color"===t||"color"===t?s.color:"Opacity"===t||"opacity"===t?s.opacity:null}return Object.defineProperties(s,{color:{get:Gt(e.c)},opacity:{get:Gt(e.o)},_name:{value:t.nm},mn:{value:t.mn}}),e.c.setGroupProperty(Ht("Color",i)),e.o.setGroupProperty(Ht("Opacity",i)),s}function s(t,e,i){function s(t){return"Start Point"===t||"start point"===t?s.startPoint:"End Point"===t||"end point"===t?s.endPoint:"Opacity"===t||"opacity"===t?s.opacity:null}return Object.defineProperties(s,{startPoint:{get:Gt(e.s)},endPoint:{get:Gt(e.e)},opacity:{get:Gt(e.o)},type:{get:function(){return"a"}},_name:{value:t.nm},mn:{value:t.mn}}),e.s.setGroupProperty(Ht("Start Point",i)),e.e.setGroupProperty(Ht("End Point",i)),e.o.setGroupProperty(Ht("Opacity",i)),s}function r(){return function(){return null}}function a(t,e,i){var s,r=Wt(l,i),a=Wt(h,r);function n(i){Object.defineProperty(h,t.d[i].nm,{get:Gt(e.d.dataProps[i].p)})}var o=t.d?t.d.length:0,h={};for(s=0;s<o;s+=1)n(s),e.d.dataProps[s].p.setGroupProperty(a);function l(t){return"Color"===t||"color"===t?l.color:"Opacity"===t||"opacity"===t?l.opacity:"Stroke Width"===t||"stroke width"===t?l.strokeWidth:null}return Object.defineProperties(l,{color:{get:Gt(e.c)},opacity:{get:Gt(e.o)},strokeWidth:{get:Gt(e.w)},dash:{get:function(){return h}},_name:{value:t.nm},mn:{value:t.mn}}),e.c.setGroupProperty(Ht("Color",r)),e.o.setGroupProperty(Ht("Opacity",r)),e.w.setGroupProperty(Ht("Stroke Width",r)),l}function n(t,e,i){function s(e){return e===t.e.ix||"End"===e||"end"===e?s.end:e===t.s.ix?s.start:e===t.o.ix?s.offset:null}var r=Wt(s,i);return s.propertyIndex=t.ix,e.s.setGroupProperty(Ht("Start",r)),e.e.setGroupProperty(Ht("End",r)),e.o.setGroupProperty(Ht("Offset",r)),s.propertyIndex=t.ix,s.propertyGroup=i,Object.defineProperties(s,{start:{get:Gt(e.s)},end:{get:Gt(e.e)},offset:{get:Gt(e.o)},_name:{value:t.nm}}),s.mn=t.mn,s}function o(t,e,i){function s(e){return t.a.ix===e||"Anchor Point"===e?s.anchorPoint:t.o.ix===e||"Opacity"===e?s.opacity:t.p.ix===e||"Position"===e?s.position:t.r.ix===e||"Rotation"===e||"ADBE Vector Rotation"===e?s.rotation:t.s.ix===e||"Scale"===e?s.scale:t.sk&&t.sk.ix===e||"Skew"===e?s.skew:t.sa&&t.sa.ix===e||"Skew Axis"===e?s.skewAxis:null}var r=Wt(s,i);return e.transform.mProps.o.setGroupProperty(Ht("Opacity",r)),e.transform.mProps.p.setGroupProperty(Ht("Position",r)),e.transform.mProps.a.setGroupProperty(Ht("Anchor Point",r)),e.transform.mProps.s.setGroupProperty(Ht("Scale",r)),e.transform.mProps.r.setGroupProperty(Ht("Rotation",r)),e.transform.mProps.sk&&(e.transform.mProps.sk.setGroupProperty(Ht("Skew",r)),e.transform.mProps.sa.setGroupProperty(Ht("Skew Angle",r))),e.transform.op.setGroupProperty(Ht("Opacity",r)),Object.defineProperties(s,{opacity:{get:Gt(e.transform.mProps.o)},position:{get:Gt(e.transform.mProps.p)},anchorPoint:{get:Gt(e.transform.mProps.a)},scale:{get:Gt(e.transform.mProps.s)},rotation:{get:Gt(e.transform.mProps.r)},skew:{get:Gt(e.transform.mProps.sk)},skewAxis:{get:Gt(e.transform.mProps.sa)},_name:{value:t.nm}}),s.ty="tr",s.mn=t.mn,s.propertyGroup=i,s}function h(t,e,i){function s(e){return t.p.ix===e?s.position:t.s.ix===e?s.size:null}var r=Wt(s,i);s.propertyIndex=t.ix;var a="tm"===e.sh.ty?e.sh.prop:e.sh;return a.s.setGroupProperty(Ht("Size",r)),a.p.setGroupProperty(Ht("Position",r)),Object.defineProperties(s,{size:{get:Gt(a.s)},position:{get:Gt(a.p)},_name:{value:t.nm}}),s.mn=t.mn,s}function l(t,e,i){function s(e){return t.p.ix===e?s.position:t.r.ix===e?s.rotation:t.pt.ix===e?s.points:t.or.ix===e||"ADBE Vector Star Outer Radius"===e?s.outerRadius:t.os.ix===e?s.outerRoundness:!t.ir||t.ir.ix!==e&&"ADBE Vector Star Inner Radius"!==e?t.is&&t.is.ix===e?s.innerRoundness:null:s.innerRadius}var r=Wt(s,i),a="tm"===e.sh.ty?e.sh.prop:e.sh;return s.propertyIndex=t.ix,a.or.setGroupProperty(Ht("Outer Radius",r)),a.os.setGroupProperty(Ht("Outer Roundness",r)),a.pt.setGroupProperty(Ht("Points",r)),a.p.setGroupProperty(Ht("Position",r)),a.r.setGroupProperty(Ht("Rotation",r)),t.ir&&(a.ir.setGroupProperty(Ht("Inner Radius",r)),a.is.setGroupProperty(Ht("Inner Roundness",r))),Object.defineProperties(s,{position:{get:Gt(a.p)},rotation:{get:Gt(a.r)},points:{get:Gt(a.pt)},outerRadius:{get:Gt(a.or)},outerRoundness:{get:Gt(a.os)},innerRadius:{get:Gt(a.ir)},innerRoundness:{get:Gt(a.is)},_name:{value:t.nm}}),s.mn=t.mn,s}function p(t,e,i){function s(e){return t.p.ix===e?s.position:t.r.ix===e?s.roundness:t.s.ix===e||"Size"===e||"ADBE Vector Rect Size"===e?s.size:null}var r=Wt(s,i),a="tm"===e.sh.ty?e.sh.prop:e.sh;return s.propertyIndex=t.ix,a.p.setGroupProperty(Ht("Position",r)),a.s.setGroupProperty(Ht("Size",r)),a.r.setGroupProperty(Ht("Rotation",r)),Object.defineProperties(s,{position:{get:Gt(a.p)},roundness:{get:Gt(a.r)},size:{get:Gt(a.s)},_name:{value:t.nm}}),s.mn=t.mn,s}function f(t,e,i){function s(e){return t.r.ix===e||"Round Corners 1"===e?s.radius:null}var r=Wt(s,i),a=e;return s.propertyIndex=t.ix,a.rd.setGroupProperty(Ht("Radius",r)),Object.defineProperties(s,{radius:{get:Gt(a.rd)},_name:{value:t.nm}}),s.mn=t.mn,s}function m(t,e,i){function s(e){return t.c.ix===e||"Copies"===e?s.copies:t.o.ix===e||"Offset"===e?s.offset:null}var r=Wt(s,i),a=e;return s.propertyIndex=t.ix,a.c.setGroupProperty(Ht("Copies",r)),a.o.setGroupProperty(Ht("Offset",r)),Object.defineProperties(s,{copies:{get:Gt(a.c)},offset:{get:Gt(a.o)},_name:{value:t.nm}}),s.mn=t.mn,s}return function(e,i,s){var r;function a(t){if("number"==typeof t)return 0===(t=void 0===t?1:t)?s:r[t-1];for(var e=0,i=r.length;e<i;){if(r[e]._name===t)return r[e];e+=1}return null}return a.propertyGroup=Wt(a,(function(){return s})),r=t(e,i,a.propertyGroup),a.numProperties=r.length,a._name="Contents",a}}(),Jt=function(t){var e,i;function s(t){return"ADBE Text Document"===t?s.sourceText:null}return Object.defineProperty(s,"sourceText",{get:function(){t.textProperty.getValue();var s=t.textProperty.currentData.t;return s!==e&&(t.textProperty.currentData.t=e,(i=new String(s)).value=s||new String(s)),i}}),s},Ut=(Ot={0:"source-over",1:"multiply",2:"screen",3:"overlay",4:"darken",5:"lighten",6:"color-dodge",7:"color-burn",8:"hard-light",9:"soft-light",10:"difference",11:"exclusion",12:"hue",13:"saturation",14:"color",15:"luminosity"},function(t){return Ot[t]||""});function Qt(t,e,i){this.p=ht.getProp(e,t.v,0,0,i)}function $t(t,e,i){this.p=ht.getProp(e,t.v,0,0,i)}function te(t,e,i){this.p=ht.getProp(e,t.v,1,0,i)}function ee(t,e,i){this.p=ht.getProp(e,t.v,1,0,i)}function ie(t,e,i){this.p=ht.getProp(e,t.v,0,0,i)}function se(t,e,i){this.p=ht.getProp(e,t.v,0,0,i)}function re(t,e,i){this.p=ht.getProp(e,t.v,0,0,i)}function ae(){this.p={}}function ne(t,e){var i,s=t.ef||[];this.effectElements=[];var r,a=s.length;for(i=0;i<a;i+=1)r=new oe(s[i],e),this.effectElements.push(r)}function oe(t,e){this.init(t,e)}function he(){}function le(){}function pe(t){return pe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},pe(t)}a([lt],oe),oe.prototype.getValue=oe.prototype.iterateDynamicProperties,oe.prototype.init=function(t,e){var i;this.data=t,this.effectElements=[],this.initDynamicPropertyContainer(e);var s,r=this.data.ef.length,a=this.data.ef;for(i=0;i<r;i+=1){switch(s=null,a[i].ty){case 0:s=new Qt(a[i],e,this);break;case 1:s=new $t(a[i],e,this);break;case 2:s=new te(a[i],e,this);break;case 3:s=new ee(a[i],e,this);break;case 4:case 7:s=new re(a[i],e,this);break;case 10:s=new ie(a[i],e,this);break;case 11:s=new se(a[i],e,this);break;case 5:s=new ne(a[i],e,this);break;default:s=new ae(a[i],e,this)}s&&this.effectElements.push(s)}},he.prototype={checkMasks:function(){if(!this.data.hasMask)return!1;for(var t=0,e=this.data.masksProperties.length;t<e;){if("n"!==this.data.masksProperties[t].mode&&!1!==this.data.masksProperties[t].cl)return!0;t+=1}return!1},initExpressions:function(){this.layerInterface=qt(this),this.data.hasMask&&this.maskManager&&this.layerInterface.registerMaskInterface(this.maskManager);var t=Xt.createEffectsInterface(this,this.layerInterface);this.layerInterface.registerEffectsInterface(t),0===this.data.ty||this.data.xt?this.compInterface=Yt(this):4===this.data.ty?(this.layerInterface.shapeInterface=Kt(this.shapesData,this.itemsData,this.layerInterface),this.layerInterface.content=this.layerInterface.shapeInterface):5===this.data.ty&&(this.layerInterface.textInterface=Jt(this),this.layerInterface.text=this.layerInterface.textInterface)},setBlendMode:function(){var t=Ut(this.data.bm);(this.baseElement||this.layerElement).style["mix-blend-mode"]=t},initBaseData:function(t,e,i){this.globalData=e,this.comp=i,this.data=t,this.layerId=L(),this.data.sr||(this.data.sr=1),this.effectsManager=new ne(this.data,this,this.dynamicProperties)},getType:function(){return this.type},sourceRectAtTime:function(){}},le.prototype={initFrame:function(){this._isFirstFrame=!1,this.dynamicProperties=[],this._mdf=!1},prepareProperties:function(t,e){var i,s=this.dynamicProperties.length;for(i=0;i<s;i+=1)(e||this._isParent&&"transform"===this.dynamicProperties[i].propType)&&(this.dynamicProperties[i].getValue(),this.dynamicProperties[i]._mdf&&(this.globalData._mdf=!0,this._mdf=!0))},addDynamicProperty:function(t){-1===this.dynamicProperties.indexOf(t)&&this.dynamicProperties.push(t)}};var fe,me=(fe=function(t){function e(t){return"Outline"===t?e.outlineInterface():null}return e._name="Outline",e.outlineInterface=function(t){var e="",i=t.getFootageData();function s(t){if(i[t])return e=t,"object"===pe(i=i[t])?s:i;var r=t.indexOf(e);if(-1!==r){var a=parseInt(t.substr(r+e.length),10);return"object"===pe(i=i[a])?s:i}return""}return function(){return e="",i=t.getFootageData(),s}}(t),e},function(t){function e(t){return"Data"===t?e.dataInterface:null}return e._name="Data",e.dataInterface=fe(t),e});function de(t,e,i){this.initFrame(),this.initRenderable(),this.assetData=e.getAssetData(t.refId),this.footageData=e.imageLoader.getAsset(this.assetData),this.initBaseData(t,e,i)}function ue(t,e,i){this.initFrame(),this.initRenderable(),this.assetData=e.getAssetData(t.refId),this.initBaseData(t,e,i),this._isPlaying=!1,this._canPlay=!1;var s=this.globalData.getAssetsPath(this.assetData);this.audio=this.globalData.audioController.createAudio(s),this._currentTime=0,this.globalData.audioController.addAudio(this),this._volumeMultiplier=1,this._volume=1,this._previousVolume=null,this.tm=t.tm?ht.getProp(this,t.tm,0,e.frameRate,this):{_placeholder:!0},this.lv=ht.getProp(this,t.au&&t.au.lv?t.au.lv:{k:[100]},1,.01,this)}function ce(){}function ge(){}function ye(t,e,i){this.data=t,this.element=e,this.globalData=i,this.storedData=[],this.masksProperties=this.data.masksProperties||[],this.maskElement=null;var r,a,n=this.globalData.defs,o=this.masksProperties?this.masksProperties.length:0;this.viewData=p(o),this.solidPath="";var h,l,f,m,d,u,c=this.masksProperties,g=0,y=[],v=L(),b="clipPath",_="clip-path";for(r=0;r<o;r+=1)if(("a"!==c[r].mode&&"n"!==c[r].mode||c[r].inv||100!==c[r].o.k||c[r].o.x)&&(b="mask",_="mask"),"s"!==c[r].mode&&"i"!==c[r].mode||0!==g?f=null:((f=H("rect")).setAttribute("fill","#ffffff"),f.setAttribute("width",this.element.comp.data.w||0),f.setAttribute("height",this.element.comp.data.h||0),y.push(f)),a=H("path"),"n"===c[r].mode)this.viewData[r]={op:ht.getProp(this.element,c[r].o,0,.01,this.element),prop:_t.getShapeProp(this.element,c[r],3),elem:a,lastPath:""},n.appendChild(a);else{var k;if(g+=1,a.setAttribute("fill","s"===c[r].mode?"#000000":"#ffffff"),a.setAttribute("clip-rule","nonzero"),0!==c[r].x.k?(b="mask",_="mask",u=ht.getProp(this.element,c[r].x,0,null,this.element),k=L(),(m=H("filter")).setAttribute("id",k),(d=H("feMorphology")).setAttribute("operator","erode"),d.setAttribute("in","SourceGraphic"),d.setAttribute("radius","0"),m.appendChild(d),n.appendChild(m),a.setAttribute("stroke","s"===c[r].mode?"#000000":"#ffffff")):(d=null,u=null),this.storedData[r]={elem:a,x:u,expan:d,lastPath:"",lastOperator:"",filterId:k,lastRadius:0},"i"===c[r].mode){l=y.length;var x=H("g");for(h=0;h<l;h+=1)x.appendChild(y[h]);var P=H("mask");P.setAttribute("mask-type","alpha"),P.setAttribute("id",v+"_"+g),P.appendChild(a),n.appendChild(P),x.setAttribute("mask","url("+s()+"#"+v+"_"+g+")"),y.length=0,y.push(x)}else y.push(a);c[r].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[r]={elem:a,lastPath:"",op:ht.getProp(this.element,c[r].o,0,.01,this.element),prop:_t.getShapeProp(this.element,c[r],3),invRect:f},this.viewData[r].prop.k||this.drawPath(c[r],this.viewData[r].prop.v,this.viewData[r])}for(this.maskElement=H(b),o=y.length,r=0;r<o;r+=1)this.maskElement.appendChild(y[r]);g>0&&(this.maskElement.setAttribute("id",v),this.element.maskedElement.setAttribute(_,"url("+s()+"#"+v+")"),n.appendChild(this.maskElement)),this.viewData.length&&this.element.addRenderableComponent(this)}de.prototype.prepareFrame=function(){},a([Vt,he,le],de),de.prototype.getBaseElement=function(){return null},de.prototype.renderFrame=function(){},de.prototype.destroy=function(){},de.prototype.initExpressions=function(){this.layerInterface=me(this)},de.prototype.getFootageData=function(){return this.footageData},ue.prototype.prepareFrame=function(t){if(this.prepareRenderableFrame(t,!0),this.prepareProperties(t,!0),this.tm._placeholder)this._currentTime=t/this.data.sr;else{var e=this.tm.v;this._currentTime=e}this._volume=this.lv.v[0];var i=this._volume*this._volumeMultiplier;this._previousVolume!==i&&(this._previousVolume=i,this.audio.volume(i))},a([Vt,he,le],ue),ue.prototype.renderFrame=function(){this.isInRange&&this._canPlay&&(this._isPlaying?(!this.audio.playing()||Math.abs(this._currentTime/this.globalData.frameRate-this.audio.seek())>.1)&&this.audio.seek(this._currentTime/this.globalData.frameRate):(this.audio.play(),this.audio.seek(this._currentTime/this.globalData.frameRate),this._isPlaying=!0))},ue.prototype.show=function(){},ue.prototype.hide=function(){this.audio.pause(),this._isPlaying=!1},ue.prototype.pause=function(){this.audio.pause(),this._isPlaying=!1,this._canPlay=!1},ue.prototype.resume=function(){this._canPlay=!0},ue.prototype.setRate=function(t){this.audio.rate(t)},ue.prototype.volume=function(t){this._volumeMultiplier=t,this._previousVolume=t*this._volume,this.audio.volume(this._previousVolume)},ue.prototype.getBaseElement=function(){return null},ue.prototype.destroy=function(){},ue.prototype.sourceRectAtTime=function(){},ue.prototype.initExpressions=function(){},ce.prototype.checkLayers=function(t){var e,i,s=this.layers.length;for(this.completeLayers=!0,e=s-1;e>=0;e-=1)this.elements[e]||(i=this.layers[e]).ip-i.st<=t-this.layers[e].st&&i.op-i.st>t-this.layers[e].st&&this.buildItem(e),this.completeLayers=!!this.elements[e]&&this.completeLayers;this.checkPendingElements()},ce.prototype.createItem=function(t){switch(t.ty){case 2:return this.createImage(t);case 0:return this.createComp(t);case 1:return this.createSolid(t);case 3:default:return this.createNull(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 6:return this.createAudio(t);case 13:return this.createCamera(t);case 15:return this.createFootage(t)}},ce.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},ce.prototype.createAudio=function(t){return new ue(t,this.globalData,this)},ce.prototype.createFootage=function(t){return new de(t,this.globalData,this)},ce.prototype.buildAllItems=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this.buildItem(t);this.checkPendingElements()},ce.prototype.includeLayers=function(t){var e;this.completeLayers=!1;var i,s=t.length,r=this.layers.length;for(e=0;e<s;e+=1)for(i=0;i<r;){if(this.layers[i].id===t[e].id){this.layers[i]=t[e];break}i+=1}},ce.prototype.setProjectInterface=function(t){this.globalData.projectInterface=t},ce.prototype.initItems=function(){this.globalData.progressiveLoad||this.buildAllItems()},ce.prototype.buildElementParenting=function(t,e,i){for(var s=this.elements,r=this.layers,a=0,n=r.length;a<n;)r[a].ind==e&&(s[a]&&!0!==s[a]?(i.push(s[a]),s[a].setAsParent(),void 0!==r[a].parent?this.buildElementParenting(t,r[a].parent,i):t.setHierarchy(i)):(this.buildItem(a),this.addPendingElement(t))),a+=1},ce.prototype.addPendingElement=function(t){this.pendingElements.push(t)},ce.prototype.searchExtraCompositions=function(t){var e,i=t.length;for(e=0;e<i;e+=1)if(t[e].xt){var s=this.createComp(t[e]);s.initExpressions(),this.globalData.projectInterface.registerComposition(s)}},ce.prototype.getElementByPath=function(t){var e,i=t.shift();if("number"==typeof i)e=this.elements[i];else{var s,r=this.elements.length;for(s=0;s<r;s+=1)if(this.elements[s].data.nm===i){e=this.elements[s];break}}return 0===t.length?e:e.getElementByPath(t)},ce.prototype.setupGlobalData=function(t,e){this.globalData.fontManager=new Rt,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,e),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.imageLoader=this.animationItem.imagePreloader,this.globalData.audioController=this.animationItem.audioController,this.globalData.frameId=0,this.globalData.frameRate=t.fr,this.globalData.nm=t.nm,this.globalData.compSize={w:t.w,h:t.h}},ge.prototype={initTransform:function(){this.finalTransform={mProp:this.data.ks?It.getTransformProperty(this,this.data.ks,this):{o:0},_matMdf:!1,_opMdf:!1,mat:new kt},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),this.data.ty},renderTransform:function(){if(this.finalTransform._opMdf=this.finalTransform.mProp.o._mdf||this._isFirstFrame,this.finalTransform._matMdf=this.finalTransform.mProp._mdf||this._isFirstFrame,this.hierarchy){var t,e=this.finalTransform.mat,i=0,s=this.hierarchy.length;if(!this.finalTransform._matMdf)for(;i<s;){if(this.hierarchy[i].finalTransform.mProp._mdf){this.finalTransform._matMdf=!0;break}i+=1}if(this.finalTransform._matMdf)for(t=this.finalTransform.mProp.v.props,e.cloneFromProps(t),i=0;i<s;i+=1)t=this.hierarchy[i].finalTransform.mProp.v.props,e.transform(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}},globalToLocal:function(t){var e=[];e.push(this.finalTransform);for(var i,s=!0,r=this.comp;s;)r.finalTransform?(r.data.hasMask&&e.splice(0,0,r.finalTransform),r=r.comp):s=!1;var a,n=e.length;for(i=0;i<n;i+=1)a=e[i].mat.applyToPointArray(0,0,0),t=[t[0]-a[0],t[1]-a[1],0];return t},mHelper:new kt},ye.prototype.getMaskProperty=function(t){return this.viewData[t].prop},ye.prototype.renderFrame=function(t){var e,i=this.element.finalTransform.mat,r=this.masksProperties.length;for(e=0;e<r;e+=1)if((this.viewData[e].prop._mdf||t)&&this.drawPath(this.masksProperties[e],this.viewData[e].prop.v,this.viewData[e]),(this.viewData[e].op._mdf||t)&&this.viewData[e].elem.setAttribute("fill-opacity",this.viewData[e].op.v),"n"!==this.masksProperties[e].mode&&(this.viewData[e].invRect&&(this.element.finalTransform.mProp._mdf||t)&&this.viewData[e].invRect.setAttribute("transform",i.getInverseMatrix().to2dCSS()),this.storedData[e].x&&(this.storedData[e].x._mdf||t))){var a=this.storedData[e].expan;this.storedData[e].x.v<0?("erode"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="erode",this.storedData[e].elem.setAttribute("filter","url("+s()+"#"+this.storedData[e].filterId+")")),a.setAttribute("radius",-this.storedData[e].x.v)):("dilate"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="dilate",this.storedData[e].elem.setAttribute("filter",null)),this.storedData[e].elem.setAttribute("stroke-width",2*this.storedData[e].x.v))}},ye.prototype.getMaskelement=function(){return this.maskElement},ye.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+" "},ye.prototype.drawPath=function(t,e,i){var s,r,a=" M"+e.v[0][0]+","+e.v[0][1];for(r=e._length,s=1;s<r;s+=1)a+=" C"+e.o[s-1][0]+","+e.o[s-1][1]+" "+e.i[s][0]+","+e.i[s][1]+" "+e.v[s][0]+","+e.v[s][1];if(e.c&&r>1&&(a+=" C"+e.o[s-1][0]+","+e.o[s-1][1]+" "+e.i[0][0]+","+e.i[0][1]+" "+e.v[0][0]+","+e.v[0][1]),i.lastPath!==a){var n="";i.elem&&(e.c&&(n=t.inv?this.solidPath+a:a),i.elem.setAttribute("d",n)),i.lastPath=a}},ye.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.masksProperties=null};var ve=function(){var t={};return t.createFilter=function(t,e){var i=H("filter");i.setAttribute("id",t),!0!==e&&(i.setAttribute("filterUnits","objectBoundingBox"),i.setAttribute("x","0%"),i.setAttribute("y","0%"),i.setAttribute("width","100%"),i.setAttribute("height","100%"));return i},t.createAlphaToLuminanceFilter=function(){var t=H("feColorMatrix");return t.setAttribute("type","matrix"),t.setAttribute("color-interpolation-filters","sRGB"),t.setAttribute("values","0 0 0 1 0  0 0 0 1 0  0 0 0 1 0  0 0 0 1 1"),t},t}(),be=function(){var t={maskType:!0};return(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(t.maskType=!1),t}();function _e(t,e){this.filterManager=e;var i=H("feColorMatrix");if(i.setAttribute("type","matrix"),i.setAttribute("color-interpolation-filters","linearRGB"),i.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),i.setAttribute("result","f1"),t.appendChild(i),(i=H("feColorMatrix")).setAttribute("type","matrix"),i.setAttribute("color-interpolation-filters","sRGB"),i.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),i.setAttribute("result","f2"),t.appendChild(i),this.matrixFilter=i,100!==e.effectElements[2].p.v||e.effectElements[2].p.k){var s,r=H("feMerge");t.appendChild(r),(s=H("feMergeNode")).setAttribute("in","SourceGraphic"),r.appendChild(s),(s=H("feMergeNode")).setAttribute("in","f2"),r.appendChild(s)}}function ke(t,e){this.filterManager=e;var i=H("feColorMatrix");i.setAttribute("type","matrix"),i.setAttribute("color-interpolation-filters","sRGB"),i.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),t.appendChild(i),this.matrixFilter=i}function xe(t,e){this.initialized=!1,this.filterManager=e,this.elem=t,this.paths=[]}function Pe(t,e){this.filterManager=e;var i=H("feColorMatrix");i.setAttribute("type","matrix"),i.setAttribute("color-interpolation-filters","linearRGB"),i.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),i.setAttribute("result","f1"),t.appendChild(i);var s=H("feComponentTransfer");s.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(s),this.matrixFilter=s;var r=H("feFuncR");r.setAttribute("type","table"),s.appendChild(r),this.feFuncR=r;var a=H("feFuncG");a.setAttribute("type","table"),s.appendChild(a),this.feFuncG=a;var n=H("feFuncB");n.setAttribute("type","table"),s.appendChild(n),this.feFuncB=n}function Ae(t,e){this.filterManager=e;var i=this.filterManager.effectElements,s=H("feComponentTransfer");(i[10].p.k||0!==i[10].p.v||i[11].p.k||1!==i[11].p.v||i[12].p.k||1!==i[12].p.v||i[13].p.k||0!==i[13].p.v||i[14].p.k||1!==i[14].p.v)&&(this.feFuncR=this.createFeFunc("feFuncR",s)),(i[17].p.k||0!==i[17].p.v||i[18].p.k||1!==i[18].p.v||i[19].p.k||1!==i[19].p.v||i[20].p.k||0!==i[20].p.v||i[21].p.k||1!==i[21].p.v)&&(this.feFuncG=this.createFeFunc("feFuncG",s)),(i[24].p.k||0!==i[24].p.v||i[25].p.k||1!==i[25].p.v||i[26].p.k||1!==i[26].p.v||i[27].p.k||0!==i[27].p.v||i[28].p.k||1!==i[28].p.v)&&(this.feFuncB=this.createFeFunc("feFuncB",s)),(i[31].p.k||0!==i[31].p.v||i[32].p.k||1!==i[32].p.v||i[33].p.k||1!==i[33].p.v||i[34].p.k||0!==i[34].p.v||i[35].p.k||1!==i[35].p.v)&&(this.feFuncA=this.createFeFunc("feFuncA",s)),(this.feFuncR||this.feFuncG||this.feFuncB||this.feFuncA)&&(s.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(s),s=H("feComponentTransfer")),(i[3].p.k||0!==i[3].p.v||i[4].p.k||1!==i[4].p.v||i[5].p.k||1!==i[5].p.v||i[6].p.k||0!==i[6].p.v||i[7].p.k||1!==i[7].p.v)&&(s.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(s),this.feFuncRComposed=this.createFeFunc("feFuncR",s),this.feFuncGComposed=this.createFeFunc("feFuncG",s),this.feFuncBComposed=this.createFeFunc("feFuncB",s))}function we(t,e){var i=e.container.globalData.renderConfig.filterSize;t.setAttribute("x",i.x),t.setAttribute("y",i.y),t.setAttribute("width",i.width),t.setAttribute("height",i.height),this.filterManager=e;var s=H("feGaussianBlur");s.setAttribute("in","SourceAlpha"),s.setAttribute("result","drop_shadow_1"),s.setAttribute("stdDeviation","0"),this.feGaussianBlur=s,t.appendChild(s);var r=H("feOffset");r.setAttribute("dx","25"),r.setAttribute("dy","0"),r.setAttribute("in","drop_shadow_1"),r.setAttribute("result","drop_shadow_2"),this.feOffset=r,t.appendChild(r);var a=H("feFlood");a.setAttribute("flood-color","#00ff00"),a.setAttribute("flood-opacity","1"),a.setAttribute("result","drop_shadow_3"),this.feFlood=a,t.appendChild(a);var n=H("feComposite");n.setAttribute("in","drop_shadow_3"),n.setAttribute("in2","drop_shadow_2"),n.setAttribute("operator","in"),n.setAttribute("result","drop_shadow_4"),t.appendChild(n);var o,h=H("feMerge");t.appendChild(h),o=H("feMergeNode"),h.appendChild(o),(o=H("feMergeNode")).setAttribute("in","SourceGraphic"),this.feMergeNode=o,this.feMerge=h,this.originalNodeAdded=!1,h.appendChild(o)}_e.prototype.renderFrame=function(t){if(t||this.filterManager._mdf){var e=this.filterManager.effectElements[0].p.v,i=this.filterManager.effectElements[1].p.v,s=this.filterManager.effectElements[2].p.v/100;this.matrixFilter.setAttribute("values",i[0]-e[0]+" 0 0 0 "+e[0]+" "+(i[1]-e[1])+" 0 0 0 "+e[1]+" "+(i[2]-e[2])+" 0 0 0 "+e[2]+" 0 0 0 "+s+" 0")}},ke.prototype.renderFrame=function(t){if(t||this.filterManager._mdf){var e=this.filterManager.effectElements[2].p.v,i=this.filterManager.effectElements[6].p.v;this.matrixFilter.setAttribute("values","0 0 0 0 "+e[0]+" 0 0 0 0 "+e[1]+" 0 0 0 0 "+e[2]+" 0 0 0 "+i+" 0")}},xe.prototype.initialize=function(){var t,e,i,r,a=this.elem.layerElement.children||this.elem.layerElement.childNodes;for(1===this.filterManager.effectElements[1].p.v?(r=this.elem.maskManager.masksProperties.length,i=0):r=(i=this.filterManager.effectElements[0].p.v-1)+1,(e=H("g")).setAttribute("fill","none"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-dashoffset",1);i<r;i+=1)t=H("path"),e.appendChild(t),this.paths.push({p:t,m:i});if(3===this.filterManager.effectElements[10].p.v){var n=H("mask"),o=L();n.setAttribute("id",o),n.setAttribute("mask-type","alpha"),n.appendChild(e),this.elem.globalData.defs.appendChild(n);var h=H("g");for(h.setAttribute("mask","url("+s()+"#"+o+")");a[0];)h.appendChild(a[0]);this.elem.layerElement.appendChild(h),this.masker=n,e.setAttribute("stroke","#fff")}else if(1===this.filterManager.effectElements[10].p.v||2===this.filterManager.effectElements[10].p.v){if(2===this.filterManager.effectElements[10].p.v)for(a=this.elem.layerElement.children||this.elem.layerElement.childNodes;a.length;)this.elem.layerElement.removeChild(a[0]);this.elem.layerElement.appendChild(e),this.elem.layerElement.removeAttribute("mask"),e.setAttribute("stroke","#fff")}this.initialized=!0,this.pathMasker=e},xe.prototype.renderFrame=function(t){var e;this.initialized||this.initialize();var i,s,r=this.paths.length;for(e=0;e<r;e+=1)if(-1!==this.paths[e].m&&(i=this.elem.maskManager.viewData[this.paths[e].m],s=this.paths[e].p,(t||this.filterManager._mdf||i.prop._mdf)&&s.setAttribute("d",i.lastPath),t||this.filterManager.effectElements[9].p._mdf||this.filterManager.effectElements[4].p._mdf||this.filterManager.effectElements[7].p._mdf||this.filterManager.effectElements[8].p._mdf||i.prop._mdf)){var a;if(0!==this.filterManager.effectElements[7].p.v||100!==this.filterManager.effectElements[8].p.v){var n=.01*Math.min(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v),o=.01*Math.max(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v),h=s.getTotalLength();a="0 0 0 "+h*n+" ";var l,p=h*(o-n),f=1+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v*.01,m=Math.floor(p/f);for(l=0;l<m;l+=1)a+="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v*.01+" ";a+="0 "+10*h+" 0 0"}else a="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v*.01;s.setAttribute("stroke-dasharray",a)}if((t||this.filterManager.effectElements[4].p._mdf)&&this.pathMasker.setAttribute("stroke-width",2*this.filterManager.effectElements[4].p.v),(t||this.filterManager.effectElements[6].p._mdf)&&this.pathMasker.setAttribute("opacity",this.filterManager.effectElements[6].p.v),(1===this.filterManager.effectElements[10].p.v||2===this.filterManager.effectElements[10].p.v)&&(t||this.filterManager.effectElements[3].p._mdf)){var d=this.filterManager.effectElements[3].p.v;this.pathMasker.setAttribute("stroke","rgb("+v(255*d[0])+","+v(255*d[1])+","+v(255*d[2])+")")}},Pe.prototype.renderFrame=function(t){if(t||this.filterManager._mdf){var e=this.filterManager.effectElements[0].p.v,i=this.filterManager.effectElements[1].p.v,s=this.filterManager.effectElements[2].p.v,r=s[0]+" "+i[0]+" "+e[0],a=s[1]+" "+i[1]+" "+e[1],n=s[2]+" "+i[2]+" "+e[2];this.feFuncR.setAttribute("tableValues",r),this.feFuncG.setAttribute("tableValues",a),this.feFuncB.setAttribute("tableValues",n)}},Ae.prototype.createFeFunc=function(t,e){var i=H(t);return i.setAttribute("type","table"),e.appendChild(i),i},Ae.prototype.getTableValue=function(t,e,i,s,r){for(var a,n,o=0,h=Math.min(t,e),l=Math.max(t,e),p=Array.call(null,{length:256}),f=0,m=r-s,d=e-t;o<=256;)n=(a=o/256)<=h?d<0?r:s:a>=l?d<0?s:r:s+m*Math.pow((a-t)/d,1/i),p[f]=n,f+=1,o+=256/255;return p.join(" ")},Ae.prototype.renderFrame=function(t){if(t||this.filterManager._mdf){var e,i=this.filterManager.effectElements;this.feFuncRComposed&&(t||i[3].p._mdf||i[4].p._mdf||i[5].p._mdf||i[6].p._mdf||i[7].p._mdf)&&(e=this.getTableValue(i[3].p.v,i[4].p.v,i[5].p.v,i[6].p.v,i[7].p.v),this.feFuncRComposed.setAttribute("tableValues",e),this.feFuncGComposed.setAttribute("tableValues",e),this.feFuncBComposed.setAttribute("tableValues",e)),this.feFuncR&&(t||i[10].p._mdf||i[11].p._mdf||i[12].p._mdf||i[13].p._mdf||i[14].p._mdf)&&(e=this.getTableValue(i[10].p.v,i[11].p.v,i[12].p.v,i[13].p.v,i[14].p.v),this.feFuncR.setAttribute("tableValues",e)),this.feFuncG&&(t||i[17].p._mdf||i[18].p._mdf||i[19].p._mdf||i[20].p._mdf||i[21].p._mdf)&&(e=this.getTableValue(i[17].p.v,i[18].p.v,i[19].p.v,i[20].p.v,i[21].p.v),this.feFuncG.setAttribute("tableValues",e)),this.feFuncB&&(t||i[24].p._mdf||i[25].p._mdf||i[26].p._mdf||i[27].p._mdf||i[28].p._mdf)&&(e=this.getTableValue(i[24].p.v,i[25].p.v,i[26].p.v,i[27].p.v,i[28].p.v),this.feFuncB.setAttribute("tableValues",e)),this.feFuncA&&(t||i[31].p._mdf||i[32].p._mdf||i[33].p._mdf||i[34].p._mdf||i[35].p._mdf)&&(e=this.getTableValue(i[31].p.v,i[32].p.v,i[33].p.v,i[34].p.v,i[35].p.v),this.feFuncA.setAttribute("tableValues",e))}},we.prototype.renderFrame=function(t){if(t||this.filterManager._mdf){if((t||this.filterManager.effectElements[4].p._mdf)&&this.feGaussianBlur.setAttribute("stdDeviation",this.filterManager.effectElements[4].p.v/4),t||this.filterManager.effectElements[0].p._mdf){var e=this.filterManager.effectElements[0].p.v;this.feFlood.setAttribute("flood-color",G(Math.round(255*e[0]),Math.round(255*e[1]),Math.round(255*e[2])))}if((t||this.filterManager.effectElements[1].p._mdf)&&this.feFlood.setAttribute("flood-opacity",this.filterManager.effectElements[1].p.v/255),t||this.filterManager.effectElements[2].p._mdf||this.filterManager.effectElements[3].p._mdf){var i=this.filterManager.effectElements[3].p.v,s=(this.filterManager.effectElements[2].p.v-90)*P,r=i*Math.cos(s),a=i*Math.sin(s);this.feOffset.setAttribute("dx",r),this.feOffset.setAttribute("dy",a)}}};var Ee=[];function Ce(t,e,i){this.initialized=!1,this.filterManager=e,this.filterElem=t,this.elem=i,i.matteElement=H("g"),i.matteElement.appendChild(i.layerElement),i.matteElement.appendChild(i.transformedElement),i.baseElement=i.matteElement}function De(t,e){t.setAttribute("x","-100%"),t.setAttribute("y","-100%"),t.setAttribute("width","300%"),t.setAttribute("height","300%"),this.filterManager=e;var i=H("feGaussianBlur");t.appendChild(i),this.feGaussianBlur=i}Ce.prototype.findSymbol=function(t){for(var e=0,i=Ee.length;e<i;){if(Ee[e]===t)return Ee[e];e+=1}return null},Ce.prototype.replaceInParent=function(t,e){var i=t.layerElement.parentNode;if(i){for(var s,r=i.children,a=0,n=r.length;a<n&&r[a]!==t.layerElement;)a+=1;a<=n-2&&(s=r[a+1]);var o=H("use");o.setAttribute("href","#"+e),s?i.insertBefore(o,s):i.appendChild(o)}},Ce.prototype.setElementAsMask=function(t,e){if(!this.findSymbol(e)){var i=L(),s=H("mask");s.setAttribute("id",e.layerId),s.setAttribute("mask-type","alpha"),Ee.push(e);var r=t.globalData.defs;r.appendChild(s);var a=H("symbol");a.setAttribute("id",i),this.replaceInParent(e,i),a.appendChild(e.layerElement),r.appendChild(a);var n=H("use");n.setAttribute("href","#"+i),s.appendChild(n),e.data.hd=!1,e.show()}t.setMatte(e.layerId)},Ce.prototype.initialize=function(){for(var t=this.filterManager.effectElements[0].p.v,e=this.elem.comp.elements,i=0,s=e.length;i<s;)e[i]&&e[i].data.ind===t&&this.setElementAsMask(this.elem,e[i]),i+=1;this.initialized=!0},Ce.prototype.renderFrame=function(){this.initialized||this.initialize()},De.prototype.renderFrame=function(t){if(t||this.filterManager._mdf){var e=.3*this.filterManager.effectElements[0].p.v,i=this.filterManager.effectElements[1].p.v,s=3==i?0:e,r=2==i?0:e;this.feGaussianBlur.setAttribute("stdDeviation",s+" "+r);var a=1==this.filterManager.effectElements[2].p.v?"wrap":"duplicate";this.feGaussianBlur.setAttribute("edgeMode",a)}};var Se={};function Me(t){var e,i,r=t.data.ef?t.data.ef.length:0,a=L(),n=ve.createFilter(a,!0),o=0;for(this.filters=[],e=0;e<r;e+=1){i=null;var h=t.data.ef[e].ty;if(Se[h])i=new(0,Se[h].effect)(n,t.effectsManager.effectElements[e],t),Se[h].countsAsEffect&&(o+=1);20===t.data.ef[e].ty?(o+=1,i=new _e(n,t.effectsManager.effectElements[e])):21===t.data.ef[e].ty?(o+=1,i=new ke(n,t.effectsManager.effectElements[e])):22===t.data.ef[e].ty?i=new xe(t,t.effectsManager.effectElements[e]):23===t.data.ef[e].ty?(o+=1,i=new Pe(n,t.effectsManager.effectElements[e])):24===t.data.ef[e].ty?(o+=1,i=new Ae(n,t.effectsManager.effectElements[e])):25===t.data.ef[e].ty?(o+=1,i=new we(n,t.effectsManager.effectElements[e])):28===t.data.ef[e].ty?i=new Ce(n,t.effectsManager.effectElements[e],t):29===t.data.ef[e].ty&&(o+=1,i=new De(n,t.effectsManager.effectElements[e])),i&&this.filters.push(i)}o&&(t.globalData.defs.appendChild(n),t.layerElement.setAttribute("filter","url("+s()+"#"+a+")")),this.filters.length&&t.addRenderableComponent(this)}function Fe(){}function Te(){}function Ie(){}function Be(t,e,i){this.assetData=e.getAssetData(t.refId),this.initElement(t,e,i),this.sourceRect={top:0,left:0,width:this.assetData.w,height:this.assetData.h}}function Le(t,e){this.elem=t,this.pos=e}function ze(){}Me.prototype.renderFrame=function(t){var e,i=this.filters.length;for(e=0;e<i;e+=1)this.filters[e].renderFrame(t)},Fe.prototype={initRendererElement:function(){this.layerElement=H("g")},createContainerElements:function(){this.matteElement=H("g"),this.transformedElement=this.layerElement,this.maskedElement=this.layerElement,this._sizeChanged=!1;var t,e,i,r=null;if(this.data.td){if(3==this.data.td||1==this.data.td){var a=H("mask");a.setAttribute("id",this.layerId),a.setAttribute("mask-type",3==this.data.td?"luminance":"alpha"),a.appendChild(this.layerElement),r=a,this.globalData.defs.appendChild(a),be.maskType||1!=this.data.td||(a.setAttribute("mask-type","luminance"),t=L(),e=ve.createFilter(t),this.globalData.defs.appendChild(e),e.appendChild(ve.createAlphaToLuminanceFilter()),(i=H("g")).appendChild(this.layerElement),r=i,a.appendChild(i),i.setAttribute("filter","url("+s()+"#"+t+")"))}else if(2==this.data.td){var n=H("mask");n.setAttribute("id",this.layerId),n.setAttribute("mask-type","alpha");var o=H("g");n.appendChild(o),t=L(),e=ve.createFilter(t);var h=H("feComponentTransfer");h.setAttribute("in","SourceGraphic"),e.appendChild(h);var l=H("feFuncA");l.setAttribute("type","table"),l.setAttribute("tableValues","1.0 0.0"),h.appendChild(l),this.globalData.defs.appendChild(e);var p=H("rect");p.setAttribute("width",this.comp.data.w),p.setAttribute("height",this.comp.data.h),p.setAttribute("x","0"),p.setAttribute("y","0"),p.setAttribute("fill","#ffffff"),p.setAttribute("opacity","0"),o.setAttribute("filter","url("+s()+"#"+t+")"),o.appendChild(p),o.appendChild(this.layerElement),r=o,be.maskType||(n.setAttribute("mask-type","luminance"),e.appendChild(ve.createAlphaToLuminanceFilter()),i=H("g"),o.appendChild(p),i.appendChild(this.layerElement),r=i,o.appendChild(i)),this.globalData.defs.appendChild(n)}}else this.data.tt?(this.matteElement.appendChild(this.layerElement),r=this.matteElement,this.baseElement=this.matteElement):this.baseElement=this.layerElement;if(this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl),0===this.data.ty&&!this.data.hd){var f=H("clipPath"),m=H("path");m.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var d=L();if(f.setAttribute("id",d),f.appendChild(m),this.globalData.defs.appendChild(f),this.checkMasks()){var u=H("g");u.setAttribute("clip-path","url("+s()+"#"+d+")"),u.appendChild(this.layerElement),this.transformedElement=u,r?r.appendChild(this.transformedElement):this.baseElement=this.transformedElement}else this.layerElement.setAttribute("clip-path","url("+s()+"#"+d+")")}0!==this.data.bm&&this.setBlendMode()},renderElement:function(){this.finalTransform._matMdf&&this.transformedElement.setAttribute("transform",this.finalTransform.mat.to2dCSS()),this.finalTransform._opMdf&&this.transformedElement.setAttribute("opacity",this.finalTransform.mProp.o.v)},destroyBaseElement:function(){this.layerElement=null,this.matteElement=null,this.maskManager.destroy()},getBaseElement:function(){return this.data.hd?null:this.baseElement},createRenderableComponents:function(){this.maskManager=new ye(this.data,this,this.globalData),this.renderableEffectsManager=new Me(this)},setMatte:function(t){this.matteElement&&this.matteElement.setAttribute("mask","url("+s()+"#"+t+")")}},Te.prototype={initHierarchy:function(){this.hierarchy=[],this._isParent=!1,this.checkParenting()},setHierarchy:function(t){this.hierarchy=t},setAsParent:function(){this._isParent=!0},checkParenting:function(){void 0!==this.data.parent&&this.comp.buildElementParenting(this,this.data.parent,[])}},a([Vt,o({initElement:function(t,e,i){this.initFrame(),this.initBaseData(t,e,i),this.initTransform(t,e,i),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide()},hide:function(){this.hidden||this.isInRange&&!this.isTransparent||((this.baseElement||this.layerElement).style.display="none",this.hidden=!0)},show:function(){this.isInRange&&!this.isTransparent&&(this.data.hd||((this.baseElement||this.layerElement).style.display="block"),this.hidden=!1,this._isFirstFrame=!0)},renderFrame:function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderElement(),this.renderInnerContent(),this._isFirstFrame&&(this._isFirstFrame=!1))},renderInnerContent:function(){},prepareFrame:function(t){this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.checkTransparency()},destroy:function(){this.innerElem=null,this.destroyBaseElement()}})],Ie),a([he,ge,Fe,Te,le,Ie],Be),Be.prototype.createContent=function(){var t=this.globalData.getAssetsPath(this.assetData);this.innerElem=H("image"),this.innerElem.setAttribute("width",this.assetData.w+"px"),this.innerElem.setAttribute("height",this.assetData.h+"px"),this.innerElem.setAttribute("preserveAspectRatio",this.assetData.pr||this.globalData.renderConfig.imagePreserveAspectRatio),this.innerElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this.layerElement.appendChild(this.innerElem)},Be.prototype.sourceRectAtTime=function(){return this.sourceRect},ze.prototype={addShapeToModifiers:function(t){var e,i=this.shapeModifiers.length;for(e=0;e<i;e+=1)this.shapeModifiers[e].addShape(t)},isShapeInAnimatedModifiers:function(t){for(var e=this.shapeModifiers.length;0<e;)if(this.shapeModifiers[0].isAnimatedWithShape(t))return!0;return!1},renderModifiers:function(){if(this.shapeModifiers.length){var t,e=this.shapes.length;for(t=0;t<e;t+=1)this.shapes[t].sh.reset();for(t=(e=this.shapeModifiers.length)-1;t>=0&&!this.shapeModifiers[t].processShapes(this._isFirstFrame);t-=1);}},searchProcessedElement:function(t){for(var e=this.processedElements,i=0,s=e.length;i<s;){if(e[i].elem===t)return e[i].pos;i+=1}return 0},addProcessedElement:function(t,e){for(var i=this.processedElements,s=i.length;s;)if(i[s-=1].elem===t)return void(i[s].pos=e);i.push(new Le(t,e))},prepareFrame:function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange)}};var Re={1:"butt",2:"round",3:"square"},Ve={1:"miter",2:"round",3:"bevel"};function Oe(t,e,i){this.caches=[],this.styles=[],this.transformers=t,this.lStr="",this.sh=i,this.lvl=e,this._isAnimated=!!i.k;for(var s=0,r=t.length;s<r;){if(t[s].mProps.dynamicProperties.length){this._isAnimated=!0;break}s+=1}}function Ne(t,e){this.data=t,this.type=t.ty,this.d="",this.lvl=e,this._mdf=!1,this.closed=!0===t.hd,this.pElem=H("path"),this.msElem=null}function Ge(t,e,i,s){var r;this.elem=t,this.frameId=-1,this.dataProps=p(e.length),this.renderer=i,this.k=!1,this.dashStr="",this.dashArray=l("float32",e.length?e.length-1:0),this.dashoffset=l("float32",1),this.initDynamicPropertyContainer(s);var a,n=e.length||0;for(r=0;r<n;r+=1)a=ht.getProp(t,e[r].v,0,0,this),this.k=a.k||this.k,this.dataProps[r]={n:e[r].n,p:a};this.k||this.getValue(!0),this._isAnimated=this.k}function je(t,e,i){this.initDynamicPropertyContainer(t),this.getValue=this.iterateDynamicProperties,this.o=ht.getProp(t,e.o,0,.01,this),this.w=ht.getProp(t,e.w,0,null,this),this.d=new Ge(t,e.d||{},"svg",this),this.c=ht.getProp(t,e.c,1,255,this),this.style=i,this._isAnimated=!!this._isAnimated}function qe(t,e,i){this.initDynamicPropertyContainer(t),this.getValue=this.iterateDynamicProperties,this.o=ht.getProp(t,e.o,0,.01,this),this.c=ht.getProp(t,e.c,1,255,this),this.style=i}function We(t,e,i){this.initDynamicPropertyContainer(t),this.getValue=this.iterateDynamicProperties,this.style=i}function He(t,e,i){this.data=e,this.c=l("uint8c",4*e.p);var s=e.k.k[0].s?e.k.k[0].s.length-4*e.p:e.k.k.length-4*e.p;this.o=l("float32",s),this._cmdf=!1,this._omdf=!1,this._collapsable=this.checkCollapsable(),this._hasOpacity=s,this.initDynamicPropertyContainer(i),this.prop=ht.getProp(t,e.k,1,null,this),this.k=this.prop.k,this.getValue(!0)}function Xe(t,e,i){this.initDynamicPropertyContainer(t),this.getValue=this.iterateDynamicProperties,this.initGradientData(t,e,i)}function Ye(t,e,i){this.initDynamicPropertyContainer(t),this.getValue=this.iterateDynamicProperties,this.w=ht.getProp(t,e.w,0,null,this),this.d=new Ge(t,e.d||{},"svg",this),this.initGradientData(t,e,i),this._isAnimated=!!this._isAnimated}function Ze(){this.it=[],this.prevViewData=[],this.gr=H("g")}function Ke(t,e,i){this.transform={mProps:t,op:e,container:i},this.elements=[],this._isAnimated=this.transform.mProps.dynamicProperties.length||this.transform.op.effectsSequence.length}Oe.prototype.setAsAnimated=function(){this._isAnimated=!0},Ne.prototype.reset=function(){this.d="",this._mdf=!1},Ge.prototype.getValue=function(t){if((this.elem.globalData.frameId!==this.frameId||t)&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf=this._mdf||t,this._mdf)){var e=0,i=this.dataProps.length;for("svg"===this.renderer&&(this.dashStr=""),e=0;e<i;e+=1)"o"!==this.dataProps[e].n?"svg"===this.renderer?this.dashStr+=" "+this.dataProps[e].p.v:this.dashArray[e]=this.dataProps[e].p.v:this.dashoffset[0]=this.dataProps[e].p.v}},a([lt],Ge),a([lt],je),a([lt],qe),a([lt],We),He.prototype.comparePoints=function(t,e){for(var i=0,s=this.o.length/2;i<s;){if(Math.abs(t[4*i]-t[4*e+2*i])>.01)return!1;i+=1}return!0},He.prototype.checkCollapsable=function(){if(this.o.length/2!=this.c.length/4)return!1;if(this.data.k.k[0].s)for(var t=0,e=this.data.k.k.length;t<e;){if(!this.comparePoints(this.data.k.k[t].s,this.data.p))return!1;t+=1}else if(!this.comparePoints(this.data.k.k,this.data.p))return!1;return!0},He.prototype.getValue=function(t){if(this.prop.getValue(),this._mdf=!1,this._cmdf=!1,this._omdf=!1,this.prop._mdf||t){var e,i,s,r=4*this.data.p;for(e=0;e<r;e+=1)i=e%4==0?100:255,s=Math.round(this.prop.v[e]*i),this.c[e]!==s&&(this.c[e]=s,this._cmdf=!t);if(this.o.length)for(r=this.prop.v.length,e=4*this.data.p;e<r;e+=1)i=e%2==0?100:1,s=e%2==0?Math.round(100*this.prop.v[e]):this.prop.v[e],this.o[e-4*this.data.p]!==s&&(this.o[e-4*this.data.p]=s,this._omdf=!t);this._mdf=!t}},a([lt],He),Xe.prototype.initGradientData=function(t,e,i){this.o=ht.getProp(t,e.o,0,.01,this),this.s=ht.getProp(t,e.s,1,null,this),this.e=ht.getProp(t,e.e,1,null,this),this.h=ht.getProp(t,e.h||{k:0},0,.01,this),this.a=ht.getProp(t,e.a||{k:0},0,P,this),this.g=new He(t,e.g,this),this.style=i,this.stops=[],this.setGradientData(i.pElem,e),this.setGradientOpacity(e,i),this._isAnimated=!!this._isAnimated},Xe.prototype.setGradientData=function(t,e){var i=L(),r=H(1===e.t?"linearGradient":"radialGradient");r.setAttribute("id",i),r.setAttribute("spreadMethod","pad"),r.setAttribute("gradientUnits","userSpaceOnUse");var a,n,o,h=[];for(o=4*e.g.p,n=0;n<o;n+=4)a=H("stop"),r.appendChild(a),h.push(a);t.setAttribute("gf"===e.ty?"fill":"stroke","url("+s()+"#"+i+")"),this.gf=r,this.cst=h},Xe.prototype.setGradientOpacity=function(t,e){if(this.g._hasOpacity&&!this.g._collapsable){var i,r,a,n=H("mask"),o=H("path");n.appendChild(o);var h=L(),l=L();n.setAttribute("id",l);var p=H(1===t.t?"linearGradient":"radialGradient");p.setAttribute("id",h),p.setAttribute("spreadMethod","pad"),p.setAttribute("gradientUnits","userSpaceOnUse"),a=t.g.k.k[0].s?t.g.k.k[0].s.length:t.g.k.k.length;var f=this.stops;for(r=4*t.g.p;r<a;r+=2)(i=H("stop")).setAttribute("stop-color","rgb(255,255,255)"),p.appendChild(i),f.push(i);o.setAttribute("gf"===t.ty?"fill":"stroke","url("+s()+"#"+h+")"),"gs"===t.ty&&(o.setAttribute("stroke-linecap",Re[t.lc||2]),o.setAttribute("stroke-linejoin",Ve[t.lj||2]),1===t.lj&&o.setAttribute("stroke-miterlimit",t.ml)),this.of=p,this.ms=n,this.ost=f,this.maskId=l,e.msElem=o}},a([lt],Xe),a([Xe,lt],Ye);var Je=function(t,e,i,s){if(0===e)return"";var r,a=t.o,n=t.i,o=t.v,h=" M"+s.applyToPointStringified(o[0][0],o[0][1]);for(r=1;r<e;r+=1)h+=" C"+s.applyToPointStringified(a[r-1][0],a[r-1][1])+" "+s.applyToPointStringified(n[r][0],n[r][1])+" "+s.applyToPointStringified(o[r][0],o[r][1]);return i&&e&&(h+=" C"+s.applyToPointStringified(a[r-1][0],a[r-1][1])+" "+s.applyToPointStringified(n[0][0],n[0][1])+" "+s.applyToPointStringified(o[0][0],o[0][1]),h+="z"),h},Ue=function(){var t=new kt,e=new kt;function i(t,e,i){(i||e.transform.op._mdf)&&e.transform.container.setAttribute("opacity",e.transform.op.v),(i||e.transform.mProps._mdf)&&e.transform.container.setAttribute("transform",e.transform.mProps.v.to2dCSS())}function s(){}function r(i,s,r){var a,n,o,h,l,p,f,m,d,u,c,g=s.styles.length,y=s.lvl;for(p=0;p<g;p+=1){if(h=s.sh._mdf||r,s.styles[p].lvl<y){for(m=e.reset(),u=y-s.styles[p].lvl,c=s.transformers.length-1;!h&&u>0;)h=s.transformers[c].mProps._mdf||h,u-=1,c-=1;if(h)for(u=y-s.styles[p].lvl,c=s.transformers.length-1;u>0;)d=s.transformers[c].mProps.v.props,m.transform(d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7],d[8],d[9],d[10],d[11],d[12],d[13],d[14],d[15]),u-=1,c-=1}else m=t;if(n=(f=s.sh.paths)._length,h){for(o="",a=0;a<n;a+=1)(l=f.shapes[a])&&l._length&&(o+=Je(l,l._length,l.c,m));s.caches[p]=o}else o=s.caches[p];s.styles[p].d+=!0===i.hd?"":o,s.styles[p]._mdf=h||s.styles[p]._mdf}}function a(t,e,i){var s=e.style;(e.c._mdf||i)&&s.pElem.setAttribute("fill","rgb("+v(e.c.v[0])+","+v(e.c.v[1])+","+v(e.c.v[2])+")"),(e.o._mdf||i)&&s.pElem.setAttribute("fill-opacity",e.o.v)}function n(t,e,i){o(t,e,i),h(t,e,i)}function o(t,e,i){var s,r,a,n,o,h=e.gf,l=e.g._hasOpacity,p=e.s.v,f=e.e.v;if(e.o._mdf||i){var m="gf"===t.ty?"fill-opacity":"stroke-opacity";e.style.pElem.setAttribute(m,e.o.v)}if(e.s._mdf||i){var d=1===t.t?"x1":"cx",u="x1"===d?"y1":"cy";h.setAttribute(d,p[0]),h.setAttribute(u,p[1]),l&&!e.g._collapsable&&(e.of.setAttribute(d,p[0]),e.of.setAttribute(u,p[1]))}if(e.g._cmdf||i){s=e.cst;var c=e.g.c;for(a=s.length,r=0;r<a;r+=1)(n=s[r]).setAttribute("offset",c[4*r]+"%"),n.setAttribute("stop-color","rgb("+c[4*r+1]+","+c[4*r+2]+","+c[4*r+3]+")")}if(l&&(e.g._omdf||i)){var g=e.g.o;for(a=(s=e.g._collapsable?e.cst:e.ost).length,r=0;r<a;r+=1)n=s[r],e.g._collapsable||n.setAttribute("offset",g[2*r]+"%"),n.setAttribute("stop-opacity",g[2*r+1])}if(1===t.t)(e.e._mdf||i)&&(h.setAttribute("x2",f[0]),h.setAttribute("y2",f[1]),l&&!e.g._collapsable&&(e.of.setAttribute("x2",f[0]),e.of.setAttribute("y2",f[1])));else if((e.s._mdf||e.e._mdf||i)&&(o=Math.sqrt(Math.pow(p[0]-f[0],2)+Math.pow(p[1]-f[1],2)),h.setAttribute("r",o),l&&!e.g._collapsable&&e.of.setAttribute("r",o)),e.e._mdf||e.h._mdf||e.a._mdf||i){o||(o=Math.sqrt(Math.pow(p[0]-f[0],2)+Math.pow(p[1]-f[1],2)));var y=Math.atan2(f[1]-p[1],f[0]-p[0]),v=e.h.v;v>=1?v=.99:v<=-1&&(v=-.99);var b=o*v,_=Math.cos(y+e.a.v)*b+p[0],k=Math.sin(y+e.a.v)*b+p[1];h.setAttribute("fx",_),h.setAttribute("fy",k),l&&!e.g._collapsable&&(e.of.setAttribute("fx",_),e.of.setAttribute("fy",k))}}function h(t,e,i){var s=e.style,r=e.d;r&&(r._mdf||i)&&r.dashStr&&(s.pElem.setAttribute("stroke-dasharray",r.dashStr),s.pElem.setAttribute("stroke-dashoffset",r.dashoffset[0])),e.c&&(e.c._mdf||i)&&s.pElem.setAttribute("stroke","rgb("+v(e.c.v[0])+","+v(e.c.v[1])+","+v(e.c.v[2])+")"),(e.o._mdf||i)&&s.pElem.setAttribute("stroke-opacity",e.o.v),(e.w._mdf||i)&&(s.pElem.setAttribute("stroke-width",e.w.v),s.msElem&&s.msElem.setAttribute("stroke-width",e.w.v))}return{createRenderFunction:function(t){switch(t.ty){case"fl":return a;case"gf":return o;case"gs":return n;case"st":return h;case"sh":case"el":case"rc":case"sr":return r;case"tr":return i;case"no":return s;default:return null}}}}();function Qe(t,e,i){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.shapeModifiers=[],this.itemsData=[],this.processedElements=[],this.animatedContents=[],this.initElement(t,e,i),this.prevViewData=[]}function $e(t,e,i,s,r,a){this.o=t,this.sw=e,this.sc=i,this.fc=s,this.m=r,this.p=a,this._mdf={o:!0,sw:!!e,sc:!!i,fc:!!s,m:!0,p:!0}}function ti(t,e){this._frameId=i,this.pv="",this.v="",this.kf=!1,this._isFirstFrame=!0,this._mdf=!1,this.data=e,this.elem=t,this.comp=this.elem.comp,this.keysIndex=0,this.canResize=!1,this.minimumFontSize=1,this.effectsSequence=[],this.currentData={ascent:0,boxWidth:this.defaultBoxWidth,f:"",fStyle:"",fWeight:"",fc:"",j:"",justifyOffset:"",l:[],lh:0,lineWidths:[],ls:"",of:"",s:"",sc:"",sw:0,t:0,tr:0,sz:0,ps:null,fillColorAnim:!1,strokeColorAnim:!1,strokeWidthAnim:!1,yOffset:0,finalSize:0,finalText:[],finalLineHeight:0,__complete:!1},this.copyData(this.currentData,this.data.d.k[0].s),this.searchProperty()||this.completeTextData(this.currentData)}a([he,ge,Fe,ze,Te,le,Ie],Qe),Qe.prototype.initSecondaryElement=function(){},Qe.prototype.identityMatrix=new kt,Qe.prototype.buildExpressionInterface=function(){},Qe.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes()},Qe.prototype.filterUniqueShapes=function(){var t,e,i,s,r=this.shapes.length,a=this.stylesList.length,n=[],o=!1;for(i=0;i<a;i+=1){for(s=this.stylesList[i],o=!1,n.length=0,t=0;t<r;t+=1)-1!==(e=this.shapes[t]).styles.indexOf(s)&&(n.push(e),o=e._isAnimated||o);n.length>1&&o&&this.setShapesAsAnimated(n)}},Qe.prototype.setShapesAsAnimated=function(t){var e,i=t.length;for(e=0;e<i;e+=1)t[e].setAsAnimated()},Qe.prototype.createStyleElement=function(t,e){var i,r=new Ne(t,e),a=r.pElem;if("st"===t.ty)i=new je(this,t,r);else if("fl"===t.ty)i=new qe(this,t,r);else if("gf"===t.ty||"gs"===t.ty){i=new("gf"===t.ty?Xe:Ye)(this,t,r),this.globalData.defs.appendChild(i.gf),i.maskId&&(this.globalData.defs.appendChild(i.ms),this.globalData.defs.appendChild(i.of),a.setAttribute("mask","url("+s()+"#"+i.maskId+")"))}else"no"===t.ty&&(i=new We(this,t,r));return"st"!==t.ty&&"gs"!==t.ty||(a.setAttribute("stroke-linecap",Re[t.lc||2]),a.setAttribute("stroke-linejoin",Ve[t.lj||2]),a.setAttribute("fill-opacity","0"),1===t.lj&&a.setAttribute("stroke-miterlimit",t.ml)),2===t.r&&a.setAttribute("fill-rule","evenodd"),t.ln&&a.setAttribute("id",t.ln),t.cl&&a.setAttribute("class",t.cl),t.bm&&(a.style["mix-blend-mode"]=Ut(t.bm)),this.stylesList.push(r),this.addToAnimatedContents(t,i),i},Qe.prototype.createGroupElement=function(t){var e=new Ze;return t.ln&&e.gr.setAttribute("id",t.ln),t.cl&&e.gr.setAttribute("class",t.cl),t.bm&&(e.gr.style["mix-blend-mode"]=Ut(t.bm)),e},Qe.prototype.createTransformElement=function(t,e){var i=It.getTransformProperty(this,t,this),s=new Ke(i,i.o,e);return this.addToAnimatedContents(t,s),s},Qe.prototype.createShapeElement=function(t,e,i){var s=4;"rc"===t.ty?s=5:"el"===t.ty?s=6:"sr"===t.ty&&(s=7);var r=new Oe(e,i,_t.getShapeProp(this,t,s,this));return this.shapes.push(r),this.addShapeToModifiers(r),this.addToAnimatedContents(t,r),r},Qe.prototype.addToAnimatedContents=function(t,e){for(var i=0,s=this.animatedContents.length;i<s;){if(this.animatedContents[i].element===e)return;i+=1}this.animatedContents.push({fn:Ue.createRenderFunction(t),element:e,data:t})},Qe.prototype.setElementStyles=function(t){var e,i=t.styles,s=this.stylesList.length;for(e=0;e<s;e+=1)this.stylesList[e].closed||i.push(this.stylesList[e])},Qe.prototype.reloadShapes=function(){var t;this._isFirstFrame=!0;var e=this.itemsData.length;for(t=0;t<e;t+=1)this.prevViewData[t]=this.itemsData[t];for(this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes(),e=this.dynamicProperties.length,t=0;t<e;t+=1)this.dynamicProperties[t].getValue();this.renderModifiers()},Qe.prototype.searchShapes=function(t,e,i,s,r,a,n){var o,h,l,p,f,m,d=[].concat(a),u=t.length-1,c=[],g=[];for(o=u;o>=0;o-=1){if((m=this.searchProcessedElement(t[o]))?e[o]=i[m-1]:t[o]._render=n,"fl"===t[o].ty||"st"===t[o].ty||"gf"===t[o].ty||"gs"===t[o].ty||"no"===t[o].ty)m?e[o].style.closed=!1:e[o]=this.createStyleElement(t[o],r),t[o]._render&&e[o].style.pElem.parentNode!==s&&s.appendChild(e[o].style.pElem),c.push(e[o].style);else if("gr"===t[o].ty){if(m)for(l=e[o].it.length,h=0;h<l;h+=1)e[o].prevViewData[h]=e[o].it[h];else e[o]=this.createGroupElement(t[o]);this.searchShapes(t[o].it,e[o].it,e[o].prevViewData,e[o].gr,r+1,d,n),t[o]._render&&e[o].gr.parentNode!==s&&s.appendChild(e[o].gr)}else"tr"===t[o].ty?(m||(e[o]=this.createTransformElement(t[o],s)),p=e[o].transform,d.push(p)):"sh"===t[o].ty||"rc"===t[o].ty||"el"===t[o].ty||"sr"===t[o].ty?(m||(e[o]=this.createShapeElement(t[o],d,r)),this.setElementStyles(e[o])):"tm"===t[o].ty||"rd"===t[o].ty||"ms"===t[o].ty||"pb"===t[o].ty?(m?(f=e[o]).closed=!1:((f=St.getModifier(t[o].ty)).init(this,t[o]),e[o]=f,this.shapeModifiers.push(f)),g.push(f)):"rp"===t[o].ty&&(m?(f=e[o]).closed=!0:(f=St.getModifier(t[o].ty),e[o]=f,f.init(this,t,o,e),this.shapeModifiers.push(f),n=!1),g.push(f));this.addProcessedElement(t[o],o+1)}for(u=c.length,o=0;o<u;o+=1)c[o].closed=!0;for(u=g.length,o=0;o<u;o+=1)g[o].closed=!0},Qe.prototype.renderInnerContent=function(){var t;this.renderModifiers();var e=this.stylesList.length;for(t=0;t<e;t+=1)this.stylesList[t].reset();for(this.renderShape(),t=0;t<e;t+=1)(this.stylesList[t]._mdf||this._isFirstFrame)&&(this.stylesList[t].msElem&&(this.stylesList[t].msElem.setAttribute("d",this.stylesList[t].d),this.stylesList[t].d="M0 0"+this.stylesList[t].d),this.stylesList[t].pElem.setAttribute("d",this.stylesList[t].d||"M0 0"))},Qe.prototype.renderShape=function(){var t,e,i=this.animatedContents.length;for(t=0;t<i;t+=1)e=this.animatedContents[t],(this._isFirstFrame||e.element._isAnimated)&&!0!==e.data&&e.fn(e.data,e.element,this._isFirstFrame)},Qe.prototype.destroy=function(){this.destroyBaseElement(),this.shapesData=null,this.itemsData=null},$e.prototype.update=function(t,e,i,s,r,a){this._mdf.o=!1,this._mdf.sw=!1,this._mdf.sc=!1,this._mdf.fc=!1,this._mdf.m=!1,this._mdf.p=!1;var n=!1;return this.o!==t&&(this.o=t,this._mdf.o=!0,n=!0),this.sw!==e&&(this.sw=e,this._mdf.sw=!0,n=!0),this.sc!==i&&(this.sc=i,this._mdf.sc=!0,n=!0),this.fc!==s&&(this.fc=s,this._mdf.fc=!0,n=!0),this.m!==r&&(this.m=r,this._mdf.m=!0,n=!0),!a.length||this.p[0]===a[0]&&this.p[1]===a[1]&&this.p[4]===a[4]&&this.p[5]===a[5]&&this.p[12]===a[12]&&this.p[13]===a[13]||(this.p=a,this._mdf.p=!0,n=!0),n},ti.prototype.defaultBoxWidth=[0,0],ti.prototype.copyData=function(t,e){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t},ti.prototype.setCurrentData=function(t){t.__complete||this.completeTextData(t),this.currentData=t,this.currentData.boxWidth=this.currentData.boxWidth||this.defaultBoxWidth,this._mdf=!0},ti.prototype.searchProperty=function(){return this.searchKeyframes()},ti.prototype.searchKeyframes=function(){return this.kf=this.data.d.k.length>1,this.kf&&this.addEffect(this.getKeyframeValue.bind(this)),this.kf},ti.prototype.addEffect=function(t){this.effectsSequence.push(t),this.elem.addDynamicProperty(this)},ti.prototype.getValue=function(t){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length||t){this.currentData.t=this.data.d.k[this.keysIndex].s.t;var e=this.currentData,i=this.keysIndex;if(this.lock)this.setCurrentData(this.currentData);else{var s;this.lock=!0,this._mdf=!1;var r=this.effectsSequence.length,a=t||this.data.d.k[this.keysIndex].s;for(s=0;s<r;s+=1)a=i!==this.keysIndex?this.effectsSequence[s](a,a.t):this.effectsSequence[s](this.currentData,a.t);e!==a&&this.setCurrentData(a),this.v=this.currentData,this.pv=this.v,this.lock=!1,this.frameId=this.elem.globalData.frameId}}},ti.prototype.getKeyframeValue=function(){for(var t=this.data.d.k,e=this.elem.comp.renderedFrame,i=0,s=t.length;i<=s-1&&!(i===s-1||t[i+1].t>e);)i+=1;return this.keysIndex!==i&&(this.keysIndex=i),this.data.d.k[this.keysIndex].s},ti.prototype.buildFinalText=function(t){for(var e,i,s=[],r=0,a=t.length,n=!1;r<a;)e=t.charCodeAt(r),Rt.isCombinedCharacter(e)?s[s.length-1]+=t.charAt(r):e>=55296&&e<=56319?(i=t.charCodeAt(r+1))>=56320&&i<=57343?(n||Rt.isModifier(e,i)?(s[s.length-1]+=t.substr(r,2),n=!1):s.push(t.substr(r,2)),r+=1):s.push(t.charAt(r)):e>56319?(i=t.charCodeAt(r+1),Rt.isZeroWidthJoiner(e,i)?(n=!0,s[s.length-1]+=t.substr(r,2),r+=1):s.push(t.charAt(r))):Rt.isZeroWidthJoiner(e)?(s[s.length-1]+=t.charAt(r),n=!0):s.push(t.charAt(r)),r+=1;return s},ti.prototype.completeTextData=function(t){t.__complete=!0;var e,i,s,r,a,n,o,h=this.elem.globalData.fontManager,l=this.data,p=[],f=0,m=l.m.g,d=0,u=0,c=0,g=[],y=0,v=0,b=h.getFontByName(t.f),_=0,k=zt(b);t.fWeight=k.weight,t.fStyle=k.style,t.finalSize=t.s,t.finalText=this.buildFinalText(t.t),i=t.finalText.length,t.finalLineHeight=t.lh;var x,P=t.tr/1e3*t.finalSize;if(t.sz)for(var A,w,E=!0,C=t.sz[0],D=t.sz[1];E;){A=0,y=0,i=(w=this.buildFinalText(t.t)).length,P=t.tr/1e3*t.finalSize;var S=-1;for(e=0;e<i;e+=1)x=w[e].charCodeAt(0),s=!1," "===w[e]?S=e:13!==x&&3!==x||(y=0,s=!0,A+=t.finalLineHeight||1.2*t.finalSize),h.chars?(o=h.getCharData(w[e],b.fStyle,b.fFamily),_=s?0:o.w*t.finalSize/100):_=h.measureText(w[e],t.f,t.finalSize),y+_>C&&" "!==w[e]?(-1===S?i+=1:e=S,A+=t.finalLineHeight||1.2*t.finalSize,w.splice(e,S===e?1:0,"\r"),S=-1,y=0):(y+=_,y+=P);A+=b.ascent*t.finalSize/100,this.canResize&&t.finalSize>this.minimumFontSize&&D<A?(t.finalSize-=1,t.finalLineHeight=t.finalSize*t.lh/t.s):(t.finalText=w,i=t.finalText.length,E=!1)}y=-P,_=0;var M,F=0;for(e=0;e<i;e+=1)if(s=!1,13===(x=(M=t.finalText[e]).charCodeAt(0))||3===x?(F=0,g.push(y),v=y>v?y:v,y=-2*P,r="",s=!0,c+=1):r=M,h.chars?(o=h.getCharData(M,b.fStyle,h.getFontByName(t.f).fFamily),_=s?0:o.w*t.finalSize/100):_=h.measureText(r,t.f,t.finalSize)," "===M?F+=_+P:(y+=_+P+F,F=0),p.push({l:_,an:_,add:d,n:s,anIndexes:[],val:r,line:c,animatorJustifyOffset:0}),2==m){if(d+=_,""===r||" "===r||e===i-1){for(""!==r&&" "!==r||(d-=_);u<=e;)p[u].an=d,p[u].ind=f,p[u].extra=_,u+=1;f+=1,d=0}}else if(3==m){if(d+=_,""===r||e===i-1){for(""===r&&(d-=_);u<=e;)p[u].an=d,p[u].ind=f,p[u].extra=_,u+=1;d=0,f+=1}}else p[f].ind=f,p[f].extra=0,f+=1;if(t.l=p,v=y>v?y:v,g.push(y),t.sz)t.boxWidth=t.sz[0],t.justifyOffset=0;else switch(t.boxWidth=v,t.j){case 1:t.justifyOffset=-t.boxWidth;break;case 2:t.justifyOffset=-t.boxWidth/2;break;default:t.justifyOffset=0}t.lineWidths=g;var T,I,B,L,z=l.a;n=z.length;var R=[];for(a=0;a<n;a+=1){for((T=z[a]).a.sc&&(t.strokeColorAnim=!0),T.a.sw&&(t.strokeWidthAnim=!0),(T.a.fc||T.a.fh||T.a.fs||T.a.fb)&&(t.fillColorAnim=!0),L=0,B=T.s.b,e=0;e<i;e+=1)(I=p[e]).anIndexes[a]=L,(1==B&&""!==I.val||2==B&&""!==I.val&&" "!==I.val||3==B&&(I.n||" "==I.val||e==i-1)||4==B&&(I.n||e==i-1))&&(1===T.s.rn&&R.push(L),L+=1);l.a[a].s.totalChars=L;var V,O=-1;if(1===T.s.rn)for(e=0;e<i;e+=1)O!=(I=p[e]).anIndexes[a]&&(O=I.anIndexes[a],V=R.splice(Math.floor(Math.random()*R.length),1)[0]),I.anIndexes[a]=V}t.yOffset=t.finalLineHeight||1.2*t.finalSize,t.ls=t.ls||0,t.ascent=b.ascent*t.finalSize/100},ti.prototype.updateDocumentData=function(t,e){e=void 0===e?this.keysIndex:e;var i=this.copyData({},this.data.d.k[e].s);i=this.copyData(i,t),this.data.d.k[e].s=i,this.recalculate(e),this.elem.addDynamicProperty(this)},ti.prototype.recalculate=function(t){var e=this.data.d.k[t].s;e.__complete=!1,this.keysIndex=0,this._isFirstFrame=!0,this.getValue(e)},ti.prototype.canResizeFont=function(t){this.canResize=t,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)},ti.prototype.setMinimumFontSize=function(t){this.minimumFontSize=Math.floor(t)||1,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)};var ei=function(){var t=Math.max,e=Math.min,i=Math.floor;function s(t,e){this._currentTextLength=-1,this.k=!1,this.data=e,this.elem=t,this.comp=t.comp,this.finalS=0,this.finalE=0,this.initDynamicPropertyContainer(t),this.s=ht.getProp(t,e.s||{k:0},0,0,this),this.e="e"in e?ht.getProp(t,e.e,0,0,this):{v:100},this.o=ht.getProp(t,e.o||{k:0},0,0,this),this.xe=ht.getProp(t,e.xe||{k:0},0,0,this),this.ne=ht.getProp(t,e.ne||{k:0},0,0,this),this.sm=ht.getProp(t,e.sm||{k:100},0,0,this),this.a=ht.getProp(t,e.a,0,.01,this),this.dynamicProperties.length||this.getValue()}return s.prototype={getMult:function(s){this._currentTextLength!==this.elem.textProperty.currentData.l.length&&this.getValue();var r=0,a=0,n=1,o=1;this.ne.v>0?r=this.ne.v/100:a=-this.ne.v/100,this.xe.v>0?n=1-this.xe.v/100:o=1+this.xe.v/100;var h=it.getBezierEasing(r,a,n,o).get,l=0,p=this.finalS,f=this.finalE,m=this.data.sh;if(2===m)l=h(l=f===p?s>=f?1:0:t(0,e(.5/(f-p)+(s-p)/(f-p),1)));else if(3===m)l=h(l=f===p?s>=f?0:1:1-t(0,e(.5/(f-p)+(s-p)/(f-p),1)));else if(4===m)f===p?l=0:(l=t(0,e(.5/(f-p)+(s-p)/(f-p),1)))<.5?l*=2:l=1-2*(l-.5),l=h(l);else if(5===m){if(f===p)l=0;else{var d=f-p,u=-d/2+(s=e(t(0,s+.5-p),f-p)),c=d/2;l=Math.sqrt(1-u*u/(c*c))}l=h(l)}else 6===m?(f===p?l=0:(s=e(t(0,s+.5-p),f-p),l=(1+Math.cos(Math.PI+2*Math.PI*s/(f-p)))/2),l=h(l)):(s>=i(p)&&(l=t(0,e(s-p<0?e(f,1)-(p-s):f-s,1))),l=h(l));if(100!==this.sm.v){var g=.01*this.sm.v;0===g&&(g=1e-8);var y=.5-.5*g;l<y?l=0:(l=(l-y)/g)>1&&(l=1)}return l*this.a.v},getValue:function(t){this.iterateDynamicProperties(),this._mdf=t||this._mdf,this._currentTextLength=this.elem.textProperty.currentData.l.length||0,t&&2===this.data.r&&(this.e.v=this._currentTextLength);var e=2===this.data.r?1:100/this.data.totalChars,i=this.o.v/e,s=this.s.v/e+i,r=this.e.v/e+i;if(s>r){var a=s;s=r,r=a}this.finalS=s,this.finalE=r}},a([lt],s),{getTextSelectorProp:function(t,e,i){return new s(t,e,i)}}}();function ii(t,e,i){var s={propType:!1},r=ht.getProp,a=e.a;this.a={r:a.r?r(t,a.r,0,P,i):s,rx:a.rx?r(t,a.rx,0,P,i):s,ry:a.ry?r(t,a.ry,0,P,i):s,sk:a.sk?r(t,a.sk,0,P,i):s,sa:a.sa?r(t,a.sa,0,P,i):s,s:a.s?r(t,a.s,1,.01,i):s,a:a.a?r(t,a.a,1,0,i):s,o:a.o?r(t,a.o,0,.01,i):s,p:a.p?r(t,a.p,1,0,i):s,sw:a.sw?r(t,a.sw,0,0,i):s,sc:a.sc?r(t,a.sc,1,0,i):s,fc:a.fc?r(t,a.fc,1,0,i):s,fh:a.fh?r(t,a.fh,0,0,i):s,fs:a.fs?r(t,a.fs,0,.01,i):s,fb:a.fb?r(t,a.fb,0,.01,i):s,t:a.t?r(t,a.t,0,0,i):s},this.s=ei.getTextSelectorProp(t,e.s,i),this.s.t=e.s.t}function si(t,e,i){this._isFirstFrame=!0,this._hasMaskedPath=!1,this._frameId=-1,this._textData=t,this._renderType=e,this._elem=i,this._animatorsData=p(this._textData.a.length),this._pathData={},this._moreOptions={alignment:{}},this.renderedLetters=[],this.lettersChangedFlag=!1,this.initDynamicPropertyContainer(i)}function ri(){}si.prototype.searchProperties=function(){var t,e,i=this._textData.a.length,s=ht.getProp;for(t=0;t<i;t+=1)e=this._textData.a[t],this._animatorsData[t]=new ii(this._elem,e,this);this._textData.p&&"m"in this._textData.p?(this._pathData={a:s(this._elem,this._textData.p.a,0,0,this),f:s(this._elem,this._textData.p.f,0,0,this),l:s(this._elem,this._textData.p.l,0,0,this),r:s(this._elem,this._textData.p.r,0,0,this),p:s(this._elem,this._textData.p.p,0,0,this),m:this._elem.maskManager.getMaskProperty(this._textData.p.m)},this._hasMaskedPath=!0):this._hasMaskedPath=!1,this._moreOptions.alignment=s(this._elem,this._textData.m.a,1,0,this)},si.prototype.getMeasures=function(t,e){if(this.lettersChangedFlag=e,this._mdf||this._isFirstFrame||e||this._hasMaskedPath&&this._pathData.m._mdf){this._isFirstFrame=!1;var i,s,r,a,n,o,h,l,p,f,m,d,u,c,g,y,v,b,_,k=this._moreOptions.alignment.v,x=this._animatorsData,P=this._textData,A=this.mHelper,w=this._renderType,E=this.renderedLetters.length,C=t.l;if(this._hasMaskedPath){if(_=this._pathData.m,!this._pathData.n||this._pathData._mdf){var D,S=_.v;for(this._pathData.r.v&&(S=S.reverse()),n={tLength:0,segments:[]},a=S._length-1,y=0,r=0;r<a;r+=1)D=ot.buildBezierData(S.v[r],S.v[r+1],[S.o[r][0]-S.v[r][0],S.o[r][1]-S.v[r][1]],[S.i[r+1][0]-S.v[r+1][0],S.i[r+1][1]-S.v[r+1][1]]),n.tLength+=D.segmentLength,n.segments.push(D),y+=D.segmentLength;r=a,_.v.c&&(D=ot.buildBezierData(S.v[r],S.v[0],[S.o[r][0]-S.v[r][0],S.o[r][1]-S.v[r][1]],[S.i[0][0]-S.v[0][0],S.i[0][1]-S.v[0][1]]),n.tLength+=D.segmentLength,n.segments.push(D),y+=D.segmentLength),this._pathData.pi=n}if(n=this._pathData.pi,o=this._pathData.f.v,m=0,f=1,l=0,p=!0,c=n.segments,o<0&&_.v.c)for(n.tLength<Math.abs(o)&&(o=-Math.abs(o)%n.tLength),f=(u=c[m=c.length-1].points).length-1;o<0;)o+=u[f].partialLength,(f-=1)<0&&(f=(u=c[m-=1].points).length-1);d=(u=c[m].points)[f-1],g=(h=u[f]).partialLength}a=C.length,i=0,s=0;var M,F,T,I,B,L=1.2*t.finalSize*.714,z=!0;T=x.length;var R,G,j,q,W,H,X,Y,Z,K,J,U,Q=-1,$=o,tt=m,et=f,it=-1,st="",rt=this.defaultPropsArray;if(2===t.j||1===t.j){var at=0,nt=0,ht=2===t.j?-.5:-1,lt=0,pt=!0;for(r=0;r<a;r+=1)if(C[r].n){for(at&&(at+=nt);lt<r;)C[lt].animatorJustifyOffset=at,lt+=1;at=0,pt=!0}else{for(F=0;F<T;F+=1)(M=x[F].a).t.propType&&(pt&&2===t.j&&(nt+=M.t.v*ht),(B=x[F].s.getMult(C[r].anIndexes[F],P.a[F].s.totalChars)).length?at+=M.t.v*B[0]*ht:at+=M.t.v*B*ht);pt=!1}for(at&&(at+=nt);lt<r;)C[lt].animatorJustifyOffset=at,lt+=1}for(r=0;r<a;r+=1){if(A.reset(),q=1,C[r].n)i=0,s+=t.yOffset,s+=z?1:0,o=$,z=!1,this._hasMaskedPath&&(f=et,d=(u=c[m=tt].points)[f-1],g=(h=u[f]).partialLength,l=0),st="",J="",Z="",U="",rt=this.defaultPropsArray;else{if(this._hasMaskedPath){if(it!==C[r].line){switch(t.j){case 1:o+=y-t.lineWidths[C[r].line];break;case 2:o+=(y-t.lineWidths[C[r].line])/2}it=C[r].line}Q!==C[r].ind&&(C[Q]&&(o+=C[Q].extra),o+=C[r].an/2,Q=C[r].ind),o+=k[0]*C[r].an*.005;var ft=0;for(F=0;F<T;F+=1)(M=x[F].a).p.propType&&((B=x[F].s.getMult(C[r].anIndexes[F],P.a[F].s.totalChars)).length?ft+=M.p.v[0]*B[0]:ft+=M.p.v[0]*B),M.a.propType&&((B=x[F].s.getMult(C[r].anIndexes[F],P.a[F].s.totalChars)).length?ft+=M.a.v[0]*B[0]:ft+=M.a.v[0]*B);for(p=!0,this._pathData.a.v&&(o=.5*C[0].an+(y-this._pathData.f.v-.5*C[0].an-.5*C[C.length-1].an)*Q/(a-1),o+=this._pathData.f.v);p;)l+g>=o+ft||!u?(v=(o+ft-l)/h.partialLength,G=d.point[0]+(h.point[0]-d.point[0])*v,j=d.point[1]+(h.point[1]-d.point[1])*v,A.translate(-k[0]*C[r].an*.005,-k[1]*L*.01),p=!1):u&&(l+=h.partialLength,(f+=1)>=u.length&&(f=0,c[m+=1]?u=c[m].points:_.v.c?(f=0,u=c[m=0].points):(l-=h.partialLength,u=null)),u&&(d=h,g=(h=u[f]).partialLength));R=C[r].an/2-C[r].add,A.translate(-R,0,0)}else R=C[r].an/2-C[r].add,A.translate(-R,0,0),A.translate(-k[0]*C[r].an*.005,-k[1]*L*.01,0);for(F=0;F<T;F+=1)(M=x[F].a).t.propType&&(B=x[F].s.getMult(C[r].anIndexes[F],P.a[F].s.totalChars),0===i&&0===t.j||(this._hasMaskedPath?B.length?o+=M.t.v*B[0]:o+=M.t.v*B:B.length?i+=M.t.v*B[0]:i+=M.t.v*B));for(t.strokeWidthAnim&&(H=t.sw||0),t.strokeColorAnim&&(W=t.sc?[t.sc[0],t.sc[1],t.sc[2]]:[0,0,0]),t.fillColorAnim&&t.fc&&(X=[t.fc[0],t.fc[1],t.fc[2]]),F=0;F<T;F+=1)(M=x[F].a).a.propType&&((B=x[F].s.getMult(C[r].anIndexes[F],P.a[F].s.totalChars)).length?A.translate(-M.a.v[0]*B[0],-M.a.v[1]*B[1],M.a.v[2]*B[2]):A.translate(-M.a.v[0]*B,-M.a.v[1]*B,M.a.v[2]*B));for(F=0;F<T;F+=1)(M=x[F].a).s.propType&&((B=x[F].s.getMult(C[r].anIndexes[F],P.a[F].s.totalChars)).length?A.scale(1+(M.s.v[0]-1)*B[0],1+(M.s.v[1]-1)*B[1],1):A.scale(1+(M.s.v[0]-1)*B,1+(M.s.v[1]-1)*B,1));for(F=0;F<T;F+=1){if(M=x[F].a,B=x[F].s.getMult(C[r].anIndexes[F],P.a[F].s.totalChars),M.sk.propType&&(B.length?A.skewFromAxis(-M.sk.v*B[0],M.sa.v*B[1]):A.skewFromAxis(-M.sk.v*B,M.sa.v*B)),M.r.propType&&(B.length?A.rotateZ(-M.r.v*B[2]):A.rotateZ(-M.r.v*B)),M.ry.propType&&(B.length?A.rotateY(M.ry.v*B[1]):A.rotateY(M.ry.v*B)),M.rx.propType&&(B.length?A.rotateX(M.rx.v*B[0]):A.rotateX(M.rx.v*B)),M.o.propType&&(B.length?q+=(M.o.v*B[0]-q)*B[0]:q+=(M.o.v*B-q)*B),t.strokeWidthAnim&&M.sw.propType&&(B.length?H+=M.sw.v*B[0]:H+=M.sw.v*B),t.strokeColorAnim&&M.sc.propType)for(Y=0;Y<3;Y+=1)B.length?W[Y]+=(M.sc.v[Y]-W[Y])*B[0]:W[Y]+=(M.sc.v[Y]-W[Y])*B;if(t.fillColorAnim&&t.fc){if(M.fc.propType)for(Y=0;Y<3;Y+=1)B.length?X[Y]+=(M.fc.v[Y]-X[Y])*B[0]:X[Y]+=(M.fc.v[Y]-X[Y])*B;M.fh.propType&&(X=B.length?N(X,M.fh.v*B[0]):N(X,M.fh.v*B)),M.fs.propType&&(X=B.length?V(X,M.fs.v*B[0]):V(X,M.fs.v*B)),M.fb.propType&&(X=B.length?O(X,M.fb.v*B[0]):O(X,M.fb.v*B))}}for(F=0;F<T;F+=1)(M=x[F].a).p.propType&&(B=x[F].s.getMult(C[r].anIndexes[F],P.a[F].s.totalChars),this._hasMaskedPath?B.length?A.translate(0,M.p.v[1]*B[0],-M.p.v[2]*B[1]):A.translate(0,M.p.v[1]*B,-M.p.v[2]*B):B.length?A.translate(M.p.v[0]*B[0],M.p.v[1]*B[1],-M.p.v[2]*B[2]):A.translate(M.p.v[0]*B,M.p.v[1]*B,-M.p.v[2]*B));if(t.strokeWidthAnim&&(Z=H<0?0:H),t.strokeColorAnim&&(K="rgb("+Math.round(255*W[0])+","+Math.round(255*W[1])+","+Math.round(255*W[2])+")"),t.fillColorAnim&&t.fc&&(J="rgb("+Math.round(255*X[0])+","+Math.round(255*X[1])+","+Math.round(255*X[2])+")"),this._hasMaskedPath){if(A.translate(0,-t.ls),A.translate(0,k[1]*L*.01+s,0),this._pathData.p.v){b=(h.point[1]-d.point[1])/(h.point[0]-d.point[0]);var mt=180*Math.atan(b)/Math.PI;h.point[0]<d.point[0]&&(mt+=180),A.rotate(-mt*Math.PI/180)}A.translate(G,j,0),o-=k[0]*C[r].an*.005,C[r+1]&&Q!==C[r+1].ind&&(o+=C[r].an/2,o+=.001*t.tr*t.finalSize)}else{switch(A.translate(i,s,0),t.ps&&A.translate(t.ps[0],t.ps[1]+t.ascent,0),t.j){case 1:A.translate(C[r].animatorJustifyOffset+t.justifyOffset+(t.boxWidth-t.lineWidths[C[r].line]),0,0);break;case 2:A.translate(C[r].animatorJustifyOffset+t.justifyOffset+(t.boxWidth-t.lineWidths[C[r].line])/2,0,0)}A.translate(0,-t.ls),A.translate(R,0,0),A.translate(k[0]*C[r].an*.005,k[1]*L*.01,0),i+=C[r].l+.001*t.tr*t.finalSize}"html"===w?st=A.toCSS():"svg"===w?st=A.to2dCSS():rt=[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=q}E<=r?(I=new $e(U,Z,K,J,st,rt),this.renderedLetters.push(I),E+=1,this.lettersChangedFlag=!0):(I=this.renderedLetters[r],this.lettersChangedFlag=I.update(U,Z,K,J,st,rt)||this.lettersChangedFlag)}}},si.prototype.getValue=function(){this._elem.globalData.frameId!==this._frameId&&(this._frameId=this._elem.globalData.frameId,this.iterateDynamicProperties())},si.prototype.mHelper=new kt,si.prototype.defaultPropsArray=[],a([lt],si),ri.prototype.initElement=function(t,e,i){this.lettersChangedFlag=!0,this.initFrame(),this.initBaseData(t,e,i),this.textProperty=new ti(this,t.t,this.dynamicProperties),this.textAnimator=new si(t.t,this.renderType,this),this.initTransform(t,e,i),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide(),this.textAnimator.searchProperties(this.dynamicProperties)},ri.prototype.prepareFrame=function(t){this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),(this.textProperty._mdf||this.textProperty._isFirstFrame)&&(this.buildNewText(),this.textProperty._isFirstFrame=!1,this.textProperty._mdf=!1)},ri.prototype.createPathShape=function(t,e){var i,s,r=e.length,a="";for(i=0;i<r;i+=1)"sh"===e[i].ty&&(s=e[i].ks.k,a+=Je(s,s.i.length,!0,t));return a},ri.prototype.updateDocumentData=function(t,e){this.textProperty.updateDocumentData(t,e)},ri.prototype.canResizeFont=function(t){this.textProperty.canResizeFont(t)},ri.prototype.setMinimumFontSize=function(t){this.textProperty.setMinimumFontSize(t)},ri.prototype.applyTextPropertiesToMatrix=function(t,e,i,s,r){switch(t.ps&&e.translate(t.ps[0],t.ps[1]+t.ascent,0),e.translate(0,-t.ls,0),t.j){case 1:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[i]),0,0);break;case 2:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[i])/2,0,0)}e.translate(s,r,0)},ri.prototype.buildColor=function(t){return"rgb("+Math.round(255*t[0])+","+Math.round(255*t[1])+","+Math.round(255*t[2])+")"},ri.prototype.emptyProp=new $e,ri.prototype.destroy=function(){};var ai,ni={shapes:[]};function oi(t,e,i){this.textSpans=[],this.renderType="svg",this.initElement(t,e,i)}function hi(t,e,i){this.initElement(t,e,i)}function li(t,e,i){this.initFrame(),this.initBaseData(t,e,i),this.initFrame(),this.initTransform(t,e,i),this.initHierarchy()}function pi(){}function fi(){}function mi(t,e,i){this.layers=t.layers,this.supports3d=!0,this.completeLayers=!1,this.pendingElements=[],this.elements=this.layers?p(this.layers.length):[],this.initElement(t,e,i),this.tm=t.tm?ht.getProp(this,t.tm,0,e.frameRate,this):{_placeholder:!0}}function di(t,e){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.svgElement=H("svg");var i="";if(e&&e.title){var s=H("title"),r=L();s.setAttribute("id",r),s.textContent=e.title,this.svgElement.appendChild(s),i+=r}if(e&&e.description){var a=H("desc"),n=L();a.setAttribute("id",n),a.textContent=e.description,this.svgElement.appendChild(a),i+=" "+n}i&&this.svgElement.setAttribute("aria-labelledby",i);var o=H("defs");this.svgElement.appendChild(o);var h=H("g");this.svgElement.appendChild(h),this.layerElement=h,this.renderConfig={preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",imagePreserveAspectRatio:e&&e.imagePreserveAspectRatio||"xMidYMid slice",contentVisibility:e&&e.contentVisibility||"visible",progressiveLoad:e&&e.progressiveLoad||!1,hideOnTransparent:!(e&&!1===e.hideOnTransparent),viewBoxOnly:e&&e.viewBoxOnly||!1,viewBoxSize:e&&e.viewBoxSize||!1,className:e&&e.className||"",id:e&&e.id||"",focusable:e&&e.focusable,filterSize:{width:e&&e.filterSize&&e.filterSize.width||"100%",height:e&&e.filterSize&&e.filterSize.height||"100%",x:e&&e.filterSize&&e.filterSize.x||"0%",y:e&&e.filterSize&&e.filterSize.y||"0%"},width:e&&e.width,height:e&&e.height},this.globalData={_mdf:!1,frameNum:-1,defs:o,renderConfig:this.renderConfig},this.elements=[],this.pendingElements=[],this.destroyed=!1,this.rendererType="svg"}function ui(){}function ci(){}function gi(t,e,i){this.initElement(t,e,i)}function yi(t,e,i){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.shapeModifiers=[],this.itemsData=[],this.processedElements=[],this.animatedContents=[],this.shapesContainer=H("g"),this.initElement(t,e,i),this.prevViewData=[],this.currentBBox={x:999999,y:-999999,h:0,w:0}}function vi(t,e,i){this.textSpans=[],this.textPaths=[],this.currentBBox={x:999999,y:-999999,h:0,w:0},this.renderType="svg",this.isMasked=!1,this.initElement(t,e,i)}function bi(t,e,i){this.initFrame(),this.initBaseData(t,e,i),this.initHierarchy();var s=ht.getProp;if(this.pe=s(this,t.pe,0,0,this),t.ks.p.s?(this.px=s(this,t.ks.p.x,1,0,this),this.py=s(this,t.ks.p.y,1,0,this),this.pz=s(this,t.ks.p.z,1,0,this)):this.p=s(this,t.ks.p,1,0,this),t.ks.a&&(this.a=s(this,t.ks.a,1,0,this)),t.ks.or.k.length&&t.ks.or.k[0].to){var r,a=t.ks.or.k.length;for(r=0;r<a;r+=1)t.ks.or.k[r].to=null,t.ks.or.k[r].ti=null}this.or=s(this,t.ks.or,1,P,this),this.or.sh=!0,this.rx=s(this,t.ks.rx,0,P,this),this.ry=s(this,t.ks.ry,0,P,this),this.rz=s(this,t.ks.rz,0,P,this),this.mat=new kt,this._prevMat=new kt,this._isFirstFrame=!0,this.finalTransform={mProp:this}}function _i(t,e,i){this.assetData=e.getAssetData(t.refId),this.initElement(t,e,i)}function ki(t,e){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.renderConfig={className:e&&e.className||"",imagePreserveAspectRatio:e&&e.imagePreserveAspectRatio||"xMidYMid slice",hideOnTransparent:!(e&&!1===e.hideOnTransparent),filterSize:{width:e&&e.filterSize&&e.filterSize.width||"400%",height:e&&e.filterSize&&e.filterSize.height||"400%",x:e&&e.filterSize&&e.filterSize.x||"-100%",y:e&&e.filterSize&&e.filterSize.y||"-100%"}},this.globalData={_mdf:!1,frameNum:-1,renderConfig:this.renderConfig},this.pendingElements=[],this.elements=[],this.threeDElements=[],this.destroyed=!1,this.camera=null,this.supports3d=!0,this.rendererType="html"}function xi(t,e,i){this.layers=t.layers,this.supports3d=!t.hasMask,this.completeLayers=!1,this.pendingElements=[],this.elements=this.layers?p(this.layers.length):[],this.initElement(t,e,i),this.tm=t.tm?ht.getProp(this,t.tm,0,e.frameRate,this):{_placeholder:!0}}function Pi(t,e){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.renderConfig={className:e&&e.className||"",imagePreserveAspectRatio:e&&e.imagePreserveAspectRatio||"xMidYMid slice",hideOnTransparent:!(e&&!1===e.hideOnTransparent),filterSize:{width:e&&e.filterSize&&e.filterSize.width||"400%",height:e&&e.filterSize&&e.filterSize.height||"400%",x:e&&e.filterSize&&e.filterSize.x||"-100%",y:e&&e.filterSize&&e.filterSize.y||"-100%"}},this.globalData={_mdf:!1,frameNum:-1,renderConfig:this.renderConfig},this.pendingElements=[],this.elements=[],this.threeDElements=[],this.destroyed=!1,this.camera=null,this.supports3d=!0,this.rendererType="html"}return a([he,ge,Fe,Te,le,Ie,ri],oi),oi.prototype.createContent=function(){this.data.singleShape&&!this.globalData.fontManager.chars&&(this.textContainer=H("text"))},oi.prototype.buildTextContents=function(t){for(var e=0,i=t.length,s=[],r="";e<i;)t[e]===String.fromCharCode(13)||t[e]===String.fromCharCode(3)?(s.push(r),r=""):r+=t[e],e+=1;return s.push(r),s},oi.prototype.buildNewText=function(){var t,e;this.addDynamicProperty(this);var i=this.textProperty.currentData;this.renderedLetters=p(i?i.l.length:0),i.fc?this.layerElement.setAttribute("fill",this.buildColor(i.fc)):this.layerElement.setAttribute("fill","rgba(0,0,0,0)"),i.sc&&(this.layerElement.setAttribute("stroke",this.buildColor(i.sc)),this.layerElement.setAttribute("stroke-width",i.sw)),this.layerElement.setAttribute("font-size",i.finalSize);var s=this.globalData.fontManager.getFontByName(i.f);if(s.fClass)this.layerElement.setAttribute("class",s.fClass);else{this.layerElement.setAttribute("font-family",s.fFamily);var r=i.fWeight,a=i.fStyle;this.layerElement.setAttribute("font-style",a),this.layerElement.setAttribute("font-weight",r)}this.layerElement.setAttribute("aria-label",i.t);var n,o=i.l||[],h=!!this.globalData.fontManager.chars;e=o.length;var l=this.mHelper,f=this.data.singleShape,m=0,d=0,u=!0,c=.001*i.tr*i.finalSize;if(!f||h||i.sz){var g,y=this.textSpans.length;for(t=0;t<e;t+=1){if(this.textSpans[t]||(this.textSpans[t]={span:null,childSpan:null,glyph:null}),!h||!f||0===t){if(n=y>t?this.textSpans[t].span:H(h?"g":"text"),y<=t){if(n.setAttribute("stroke-linecap","butt"),n.setAttribute("stroke-linejoin","round"),n.setAttribute("stroke-miterlimit","4"),this.textSpans[t].span=n,h){var v=H("g");n.appendChild(v),this.textSpans[t].childSpan=v}this.textSpans[t].span=n,this.layerElement.appendChild(n)}n.style.display="inherit"}if(l.reset(),l.scale(i.finalSize/100,i.finalSize/100),f&&(o[t].n&&(m=-c,d+=i.yOffset,d+=u?1:0,u=!1),this.applyTextPropertiesToMatrix(i,l,o[t].line,m,d),m+=o[t].l||0,m+=c),h){var b;if(1===(g=this.globalData.fontManager.getCharData(i.finalText[t],s.fStyle,this.globalData.fontManager.getFontByName(i.f).fFamily)).t)b=new mi(g.data,this.globalData,this);else{var _=ni;g.data&&g.data.shapes&&(_=g.data),b=new Qe(_,this.globalData,this)}if(this.textSpans[t].glyph){var k=this.textSpans[t].glyph;this.textSpans[t].childSpan.removeChild(k.layerElement),k.destroy()}this.textSpans[t].glyph=b,b._debug=!0,b.prepareFrame(0),b.renderFrame(),this.textSpans[t].childSpan.appendChild(b.layerElement),this.textSpans[t].childSpan.setAttribute("transform","scale("+i.finalSize/100+","+i.finalSize/100+")")}else f&&n.setAttribute("transform","translate("+l.props[12]+","+l.props[13]+")"),n.textContent=o[t].val,n.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve")}f&&n&&n.setAttribute("d","")}else{var x=this.textContainer,P="start";switch(i.j){case 1:P="end";break;case 2:P="middle";break;default:P="start"}x.setAttribute("text-anchor",P),x.setAttribute("letter-spacing",c);var A=this.buildTextContents(i.finalText);for(e=A.length,d=i.ps?i.ps[1]+i.ascent:0,t=0;t<e;t+=1)(n=this.textSpans[t].span||H("tspan")).textContent=A[t],n.setAttribute("x",0),n.setAttribute("y",d),n.style.display="inherit",x.appendChild(n),this.textSpans[t]||(this.textSpans[t]={span:null,glyph:null}),this.textSpans[t].span=n,d+=i.finalLineHeight;this.layerElement.appendChild(x)}for(;t<this.textSpans.length;)this.textSpans[t].span.style.display="none",t+=1;this._sizeChanged=!0},oi.prototype.sourceRectAtTime=function(){if(this.prepareFrame(this.comp.renderedFrame-this.data.st),this.renderInnerContent(),this._sizeChanged){this._sizeChanged=!1;var t=this.layerElement.getBBox();this.bbox={top:t.y,left:t.x,width:t.width,height:t.height}}return this.bbox},oi.prototype.getValue=function(){var t,e,i=this.textSpans.length;for(this.renderedFrame=this.comp.renderedFrame,t=0;t<i;t+=1)(e=this.textSpans[t].glyph)&&(e.prepareFrame(this.comp.renderedFrame-this.data.st),e._mdf&&(this._mdf=!0))},oi.prototype.renderInnerContent=function(){if((!this.data.singleShape||this._mdf)&&(this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag),this.lettersChangedFlag||this.textAnimator.lettersChangedFlag)){var t,e;this._sizeChanged=!0;var i,s,r,a=this.textAnimator.renderedLetters,n=this.textProperty.currentData.l;for(e=n.length,t=0;t<e;t+=1)n[t].n||(i=a[t],s=this.textSpans[t].span,(r=this.textSpans[t].glyph)&&r.renderFrame(),i._mdf.m&&s.setAttribute("transform",i.m),i._mdf.o&&s.setAttribute("opacity",i.o),i._mdf.sw&&s.setAttribute("stroke-width",i.sw),i._mdf.sc&&s.setAttribute("stroke",i.sc),i._mdf.fc&&s.setAttribute("fill",i.fc))}},a([Be],hi),hi.prototype.createContent=function(){var t=H("rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.layerElement.appendChild(t)},li.prototype.prepareFrame=function(t){this.prepareProperties(t,!0)},li.prototype.renderFrame=function(){},li.prototype.getBaseElement=function(){return null},li.prototype.destroy=function(){},li.prototype.sourceRectAtTime=function(){},li.prototype.hide=function(){},a([he,ge,Te,le],li),a([ce],pi),pi.prototype.createNull=function(t){return new li(t,this.globalData,this)},pi.prototype.createShape=function(t){return new Qe(t,this.globalData,this)},pi.prototype.createText=function(t){return new oi(t,this.globalData,this)},pi.prototype.createImage=function(t){return new Be(t,this.globalData,this)},pi.prototype.createSolid=function(t){return new hi(t,this.globalData,this)},pi.prototype.configAnimation=function(t){this.svgElement.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.renderConfig.viewBoxSize?this.svgElement.setAttribute("viewBox",this.renderConfig.viewBoxSize):this.svgElement.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.renderConfig.viewBoxOnly||(this.svgElement.setAttribute("width",t.w),this.svgElement.setAttribute("height",t.h),this.svgElement.style.width="100%",this.svgElement.style.height="100%",this.svgElement.style.transform="translate3d(0,0,0)",this.svgElement.style.contentVisibility=this.renderConfig.contentVisibility),this.renderConfig.width&&this.svgElement.setAttribute("width",this.renderConfig.width),this.renderConfig.height&&this.svgElement.setAttribute("height",this.renderConfig.height),this.renderConfig.className&&this.svgElement.setAttribute("class",this.renderConfig.className),this.renderConfig.id&&this.svgElement.setAttribute("id",this.renderConfig.id),void 0!==this.renderConfig.focusable&&this.svgElement.setAttribute("focusable",this.renderConfig.focusable),this.svgElement.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this.animationItem.wrapper.appendChild(this.svgElement);var e=this.globalData.defs;this.setupGlobalData(t,e),this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.data=t;var i=H("clipPath"),r=H("rect");r.setAttribute("width",t.w),r.setAttribute("height",t.h),r.setAttribute("x",0),r.setAttribute("y",0);var a=L();i.setAttribute("id",a),i.appendChild(r),this.layerElement.setAttribute("clip-path","url("+s()+"#"+a+")"),e.appendChild(i),this.layers=t.layers,this.elements=p(t.layers.length)},pi.prototype.destroy=function(){var t;this.animationItem.wrapper&&(this.animationItem.wrapper.innerText=""),this.layerElement=null,this.globalData.defs=null;var e=this.layers?this.layers.length:0;for(t=0;t<e;t+=1)this.elements[t]&&this.elements[t].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},pi.prototype.updateContainerSize=function(){},pi.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!==this.layers[t].ty){e[t]=!0;var i=this.createItem(this.layers[t]);e[t]=i,j()&&(0===this.layers[t].ty&&this.globalData.projectInterface.registerComposition(i),i.initExpressions()),this.appendElementInPos(i,t),this.layers[t].tt&&(this.elements[t-1]&&!0!==this.elements[t-1]?i.setMatte(e[t-1].layerId):(this.buildItem(t-1),this.addPendingElement(i)))}},pi.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();if(t.checkParenting(),t.data.tt)for(var e=0,i=this.elements.length;e<i;){if(this.elements[e]===t){t.setMatte(this.elements[e-1].layerId);break}e+=1}}},pi.prototype.renderFrame=function(t){if(this.renderedFrame!==t&&!this.destroyed){var e;null===t?t=this.renderedFrame:this.renderedFrame=t,this.globalData.frameNum=t,this.globalData.frameId+=1,this.globalData.projectInterface.currentFrame=t,this.globalData._mdf=!1;var i=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=i-1;e>=0;e-=1)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(t-this.layers[e].st);if(this.globalData._mdf)for(e=0;e<i;e+=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame()}},pi.prototype.appendElementInPos=function(t,e){var i=t.getBaseElement();if(i){for(var s,r=0;r<e;)this.elements[r]&&!0!==this.elements[r]&&this.elements[r].getBaseElement()&&(s=this.elements[r].getBaseElement()),r+=1;s?this.layerElement.insertBefore(i,s):this.layerElement.appendChild(i)}},pi.prototype.hide=function(){this.layerElement.style.display="none"},pi.prototype.show=function(){this.layerElement.style.display="block"},a([he,ge,Te,le,Ie],fi),fi.prototype.initElement=function(t,e,i){this.initFrame(),this.initBaseData(t,e,i),this.initTransform(t,e,i),this.initRenderable(),this.initHierarchy(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),!this.data.xt&&e.progressiveLoad||this.buildAllItems(),this.hide()},fi.prototype.prepareFrame=function(t){if(this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.isInRange||this.data.xt){if(this.tm._placeholder)this.renderedFrame=t/this.data.sr;else{var e=this.tm.v;e===this.data.op&&(e=this.data.op-1),this.renderedFrame=e}var i,s=this.elements.length;for(this.completeLayers||this.checkLayers(this.renderedFrame),i=s-1;i>=0;i-=1)(this.completeLayers||this.elements[i])&&(this.elements[i].prepareFrame(this.renderedFrame-this.layers[i].st),this.elements[i]._mdf&&(this._mdf=!0))}},fi.prototype.renderInnerContent=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)(this.completeLayers||this.elements[t])&&this.elements[t].renderFrame()},fi.prototype.setElements=function(t){this.elements=t},fi.prototype.getElements=function(){return this.elements},fi.prototype.destroyElements=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this.elements[t]&&this.elements[t].destroy()},fi.prototype.destroy=function(){this.destroyElements(),this.destroyBaseElement()},a([pi,fi,Fe],mi),mi.prototype.createComp=function(t){return new mi(t,this.globalData,this)},a([pi],di),di.prototype.createComp=function(t){return new mi(t,this.globalData,this)},ui.prototype.renderFrame=function(){},ci.prototype={checkBlendMode:function(){},initRendererElement:function(){this.baseElement=r(this.data.tg||"div"),this.data.hasMask?(this.svgElement=H("svg"),this.layerElement=H("g"),this.maskedElement=this.layerElement,this.svgElement.appendChild(this.layerElement),this.baseElement.appendChild(this.svgElement)):this.layerElement=this.baseElement,E(this.baseElement)},createContainerElements:function(){this.renderableEffectsManager=new ui(this),this.transformedElement=this.baseElement,this.maskedElement=this.layerElement,this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl),0!==this.data.bm&&this.setBlendMode()},renderElement:function(){var t=this.transformedElement?this.transformedElement.style:{};if(this.finalTransform._matMdf){var e=this.finalTransform.mat.toCSS();t.transform=e,t.webkitTransform=e}this.finalTransform._opMdf&&(t.opacity=this.finalTransform.mProp.o.v)},renderFrame:function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderElement(),this.renderInnerContent(),this._isFirstFrame&&(this._isFirstFrame=!1))},destroy:function(){this.layerElement=null,this.transformedElement=null,this.matteElement&&(this.matteElement=null),this.maskManager&&(this.maskManager.destroy(),this.maskManager=null)},createRenderableComponents:function(){this.maskManager=new ye(this.data,this,this.globalData)},addEffects:function(){},setMatte:function(){}},ci.prototype.getBaseElement=Fe.prototype.getBaseElement,ci.prototype.destroyBaseElement=ci.prototype.destroy,ci.prototype.buildElementParenting=ce.prototype.buildElementParenting,a([he,ge,ci,Te,le,Ie],gi),gi.prototype.createContent=function(){var t;this.data.hasMask?((t=H("rect")).setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.svgElement.setAttribute("width",this.data.sw),this.svgElement.setAttribute("height",this.data.sh)):((t=r("div")).style.width=this.data.sw+"px",t.style.height=this.data.sh+"px",t.style.backgroundColor=this.data.sc),this.layerElement.appendChild(t)},a([he,ge,gi,Qe,ci,Te,le,Vt],yi),yi.prototype._renderShapeFrame=yi.prototype.renderInnerContent,yi.prototype.createContent=function(){var t;if(this.baseElement.style.fontSize=0,this.data.hasMask)this.layerElement.appendChild(this.shapesContainer),t=this.svgElement;else{t=H("svg");var e=this.comp.data?this.comp.data:this.globalData.compSize;t.setAttribute("width",e.w),t.setAttribute("height",e.h),t.appendChild(this.shapesContainer),this.layerElement.appendChild(t)}this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.shapesContainer,0,[],!0),this.filterUniqueShapes(),this.shapeCont=t},yi.prototype.getTransformedPoint=function(t,e){var i,s=t.length;for(i=0;i<s;i+=1)e=t[i].mProps.v.applyToPointArray(e[0],e[1],0);return e},yi.prototype.calculateShapeBoundingBox=function(t,e){var i,s,r,a,n,o=t.sh.v,h=t.transformers,l=o._length;if(!(l<=1)){for(i=0;i<l-1;i+=1)s=this.getTransformedPoint(h,o.v[i]),r=this.getTransformedPoint(h,o.o[i]),a=this.getTransformedPoint(h,o.i[i+1]),n=this.getTransformedPoint(h,o.v[i+1]),this.checkBounds(s,r,a,n,e);o.c&&(s=this.getTransformedPoint(h,o.v[i]),r=this.getTransformedPoint(h,o.o[i]),a=this.getTransformedPoint(h,o.i[0]),n=this.getTransformedPoint(h,o.v[0]),this.checkBounds(s,r,a,n,e))}},yi.prototype.checkBounds=function(t,e,i,s,r){this.getBoundsOfCurve(t,e,i,s);var a=this.shapeBoundingBox;r.x=_(a.left,r.x),r.xMax=b(a.right,r.xMax),r.y=_(a.top,r.y),r.yMax=b(a.bottom,r.yMax)},yi.prototype.shapeBoundingBox={left:0,right:0,top:0,bottom:0},yi.prototype.tempBoundingBox={x:0,xMax:0,y:0,yMax:0,width:0,height:0},yi.prototype.getBoundsOfCurve=function(t,e,i,s){for(var r,a,n,o,h,l,p,f=[[t[0],s[0]],[t[1],s[1]]],m=0;m<2;++m)a=6*t[m]-12*e[m]+6*i[m],r=-3*t[m]+9*e[m]-9*i[m]+3*s[m],n=3*e[m]-3*t[m],a|=0,n|=0,0===(r|=0)&&0===a||(0===r?(o=-n/a)>0&&o<1&&f[m].push(this.calculateF(o,t,e,i,s,m)):(h=a*a-4*n*r)>=0&&((l=(-a+y(h))/(2*r))>0&&l<1&&f[m].push(this.calculateF(l,t,e,i,s,m)),(p=(-a-y(h))/(2*r))>0&&p<1&&f[m].push(this.calculateF(p,t,e,i,s,m))));this.shapeBoundingBox.left=_.apply(null,f[0]),this.shapeBoundingBox.top=_.apply(null,f[1]),this.shapeBoundingBox.right=b.apply(null,f[0]),this.shapeBoundingBox.bottom=b.apply(null,f[1])},yi.prototype.calculateF=function(t,e,i,s,r,a){return g(1-t,3)*e[a]+3*g(1-t,2)*t*i[a]+3*(1-t)*g(t,2)*s[a]+g(t,3)*r[a]},yi.prototype.calculateBoundingBox=function(t,e){var i,s=t.length;for(i=0;i<s;i+=1)t[i]&&t[i].sh?this.calculateShapeBoundingBox(t[i],e):t[i]&&t[i].it&&this.calculateBoundingBox(t[i].it,e)},yi.prototype.currentBoxContains=function(t){return this.currentBBox.x<=t.x&&this.currentBBox.y<=t.y&&this.currentBBox.width+this.currentBBox.x>=t.x+t.width&&this.currentBBox.height+this.currentBBox.y>=t.y+t.height},yi.prototype.renderInnerContent=function(){if(this._renderShapeFrame(),!this.hidden&&(this._isFirstFrame||this._mdf)){var t=this.tempBoundingBox,e=999999;if(t.x=e,t.xMax=-e,t.y=e,t.yMax=-e,this.calculateBoundingBox(this.itemsData,t),t.width=t.xMax<t.x?0:t.xMax-t.x,t.height=t.yMax<t.y?0:t.yMax-t.y,this.currentBoxContains(t))return;var i=!1;if(this.currentBBox.w!==t.width&&(this.currentBBox.w=t.width,this.shapeCont.setAttribute("width",t.width),i=!0),this.currentBBox.h!==t.height&&(this.currentBBox.h=t.height,this.shapeCont.setAttribute("height",t.height),i=!0),i||this.currentBBox.x!==t.x||this.currentBBox.y!==t.y){this.currentBBox.w=t.width,this.currentBBox.h=t.height,this.currentBBox.x=t.x,this.currentBBox.y=t.y,this.shapeCont.setAttribute("viewBox",this.currentBBox.x+" "+this.currentBBox.y+" "+this.currentBBox.w+" "+this.currentBBox.h);var s=this.shapeCont.style,r="translate("+this.currentBBox.x+"px,"+this.currentBBox.y+"px)";s.transform=r,s.webkitTransform=r}}},a([he,ge,ci,Te,le,Ie,ri],vi),vi.prototype.createContent=function(){if(this.isMasked=this.checkMasks(),this.isMasked){this.renderType="svg",this.compW=this.comp.data.w,this.compH=this.comp.data.h,this.svgElement.setAttribute("width",this.compW),this.svgElement.setAttribute("height",this.compH);var t=H("g");this.maskedElement.appendChild(t),this.innerElem=t}else this.renderType="html",this.innerElem=this.layerElement;this.checkParenting()},vi.prototype.buildNewText=function(){var t=this.textProperty.currentData;this.renderedLetters=p(t.l?t.l.length:0);var e=this.innerElem.style,i=t.fc?this.buildColor(t.fc):"rgba(0,0,0,0)";e.fill=i,e.color=i,t.sc&&(e.stroke=this.buildColor(t.sc),e.strokeWidth=t.sw+"px");var s,a,n=this.globalData.fontManager.getFontByName(t.f);if(!this.globalData.fontManager.chars)if(e.fontSize=t.finalSize+"px",e.lineHeight=t.finalSize+"px",n.fClass)this.innerElem.className=n.fClass;else{e.fontFamily=n.fFamily;var o=t.fWeight,h=t.fStyle;e.fontStyle=h,e.fontWeight=o}var l,f,m,d=t.l;a=d.length;var u,c=this.mHelper,g="",y=0;for(s=0;s<a;s+=1){if(this.globalData.fontManager.chars?(this.textPaths[y]?l=this.textPaths[y]:((l=H("path")).setAttribute("stroke-linecap",Re[1]),l.setAttribute("stroke-linejoin",Ve[2]),l.setAttribute("stroke-miterlimit","4")),this.isMasked||(this.textSpans[y]?m=(f=this.textSpans[y]).children[0]:((f=r("div")).style.lineHeight=0,(m=H("svg")).appendChild(l),E(f)))):this.isMasked?l=this.textPaths[y]?this.textPaths[y]:H("text"):this.textSpans[y]?(f=this.textSpans[y],l=this.textPaths[y]):(E(f=r("span")),E(l=r("span")),f.appendChild(l)),this.globalData.fontManager.chars){var v,b=this.globalData.fontManager.getCharData(t.finalText[s],n.fStyle,this.globalData.fontManager.getFontByName(t.f).fFamily);if(v=b?b.data:null,c.reset(),v&&v.shapes&&v.shapes.length&&(u=v.shapes[0].it,c.scale(t.finalSize/100,t.finalSize/100),g=this.createPathShape(c,u),l.setAttribute("d",g)),this.isMasked)this.innerElem.appendChild(l);else{if(this.innerElem.appendChild(f),v&&v.shapes){document.body.appendChild(m);var _=m.getBBox();m.setAttribute("width",_.width+2),m.setAttribute("height",_.height+2),m.setAttribute("viewBox",_.x-1+" "+(_.y-1)+" "+(_.width+2)+" "+(_.height+2));var k=m.style,x="translate("+(_.x-1)+"px,"+(_.y-1)+"px)";k.transform=x,k.webkitTransform=x,d[s].yOffset=_.y-1}else m.setAttribute("width",1),m.setAttribute("height",1);f.appendChild(m)}}else if(l.textContent=d[s].val,l.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),this.isMasked)this.innerElem.appendChild(l);else{this.innerElem.appendChild(f);var P=l.style,A="translate3d(0,"+-t.finalSize/1.2+"px,0)";P.transform=A,P.webkitTransform=A}this.isMasked?this.textSpans[y]=l:this.textSpans[y]=f,this.textSpans[y].style.display="block",this.textPaths[y]=l,y+=1}for(;y<this.textSpans.length;)this.textSpans[y].style.display="none",y+=1},vi.prototype.renderInnerContent=function(){var t;if(this.data.singleShape){if(!this._isFirstFrame&&!this.lettersChangedFlag)return;if(this.isMasked&&this.finalTransform._matMdf){this.svgElement.setAttribute("viewBox",-this.finalTransform.mProp.p.v[0]+" "+-this.finalTransform.mProp.p.v[1]+" "+this.compW+" "+this.compH),t=this.svgElement.style;var e="translate("+-this.finalTransform.mProp.p.v[0]+"px,"+-this.finalTransform.mProp.p.v[1]+"px)";t.transform=e,t.webkitTransform=e}}if(this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag),this.lettersChangedFlag||this.textAnimator.lettersChangedFlag){var i,s,r,a,n,o=0,h=this.textAnimator.renderedLetters,l=this.textProperty.currentData.l;for(s=l.length,i=0;i<s;i+=1)l[i].n?o+=1:(a=this.textSpans[i],n=this.textPaths[i],r=h[o],o+=1,r._mdf.m&&(this.isMasked?a.setAttribute("transform",r.m):(a.style.webkitTransform=r.m,a.style.transform=r.m)),a.style.opacity=r.o,r.sw&&r._mdf.sw&&n.setAttribute("stroke-width",r.sw),r.sc&&r._mdf.sc&&n.setAttribute("stroke",r.sc),r.fc&&r._mdf.fc&&(n.setAttribute("fill",r.fc),n.style.color=r.fc));if(this.innerElem.getBBox&&!this.hidden&&(this._isFirstFrame||this._mdf)){var p=this.innerElem.getBBox();this.currentBBox.w!==p.width&&(this.currentBBox.w=p.width,this.svgElement.setAttribute("width",p.width)),this.currentBBox.h!==p.height&&(this.currentBBox.h=p.height,this.svgElement.setAttribute("height",p.height));if(this.currentBBox.w!==p.width+2||this.currentBBox.h!==p.height+2||this.currentBBox.x!==p.x-1||this.currentBBox.y!==p.y-1){this.currentBBox.w=p.width+2,this.currentBBox.h=p.height+2,this.currentBBox.x=p.x-1,this.currentBBox.y=p.y-1,this.svgElement.setAttribute("viewBox",this.currentBBox.x+" "+this.currentBBox.y+" "+this.currentBBox.w+" "+this.currentBBox.h),t=this.svgElement.style;var f="translate("+this.currentBBox.x+"px,"+this.currentBBox.y+"px)";t.transform=f,t.webkitTransform=f}}}},a([he,le,Te],bi),bi.prototype.setup=function(){var t,e,i,s,r=this.comp.threeDElements.length;for(t=0;t<r;t+=1)if("3d"===(e=this.comp.threeDElements[t]).type){i=e.perspectiveElem.style,s=e.container.style;var a=this.pe.v+"px",n="0px 0px 0px",o="matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)";i.perspective=a,i.webkitPerspective=a,s.transformOrigin=n,s.mozTransformOrigin=n,s.webkitTransformOrigin=n,i.transform=o,i.webkitTransform=o}},bi.prototype.createElements=function(){},bi.prototype.hide=function(){},bi.prototype.renderFrame=function(){var t,e,i=this._isFirstFrame;if(this.hierarchy)for(e=this.hierarchy.length,t=0;t<e;t+=1)i=this.hierarchy[t].finalTransform.mProp._mdf||i;if(i||this.pe._mdf||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.hierarchy)for(t=e=this.hierarchy.length-1;t>=0;t-=1){var s=this.hierarchy[t].finalTransform.mProp;this.mat.translate(-s.p.v[0],-s.p.v[1],s.p.v[2]),this.mat.rotateX(-s.or.v[0]).rotateY(-s.or.v[1]).rotateZ(s.or.v[2]),this.mat.rotateX(-s.rx.v).rotateY(-s.ry.v).rotateZ(s.rz.v),this.mat.scale(1/s.s.v[0],1/s.s.v[1],1/s.s.v[2]),this.mat.translate(s.a.v[0],s.a.v[1],s.a.v[2])}if(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 r;r=this.p?[this.p.v[0]-this.a.v[0],this.p.v[1]-this.a.v[1],this.p.v[2]-this.a.v[2]]:[this.px.v-this.a.v[0],this.py.v-this.a.v[1],this.pz.v-this.a.v[2]];var a=Math.sqrt(Math.pow(r[0],2)+Math.pow(r[1],2)+Math.pow(r[2],2)),n=[r[0]/a,r[1]/a,r[2]/a],o=Math.sqrt(n[2]*n[2]+n[0]*n[0]),h=Math.atan2(n[1],o),l=Math.atan2(n[0],-n[2]);this.mat.rotateY(l).rotateX(-h)}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);var p=!this._prevMat.equals(this.mat);if((p||this.pe._mdf)&&this.comp.threeDElements){var f,m,d;for(e=this.comp.threeDElements.length,t=0;t<e;t+=1)if("3d"===(f=this.comp.threeDElements[t]).type){if(p){var u=this.mat.toCSS();(d=f.container.style).transform=u,d.webkitTransform=u}this.pe._mdf&&((m=f.perspectiveElem.style).perspective=this.pe.v+"px",m.webkitPerspective=this.pe.v+"px")}this.mat.clone(this._prevMat)}}this._isFirstFrame=!1},bi.prototype.prepareFrame=function(t){this.prepareProperties(t,!0)},bi.prototype.destroy=function(){},bi.prototype.getBaseElement=function(){return null},a([he,ge,ci,gi,Te,le,Vt],_i),_i.prototype.createContent=function(){var t=this.globalData.getAssetsPath(this.assetData),e=new Image;this.data.hasMask?(this.imageElem=H("image"),this.imageElem.setAttribute("width",this.assetData.w+"px"),this.imageElem.setAttribute("height",this.assetData.h+"px"),this.imageElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this.layerElement.appendChild(this.imageElem),this.baseElement.setAttribute("width",this.assetData.w),this.baseElement.setAttribute("height",this.assetData.h)):this.layerElement.appendChild(e),e.crossOrigin="anonymous",e.src=t,this.data.ln&&this.baseElement.setAttribute("id",this.data.ln)},a([ce],ki),ki.prototype.buildItem=di.prototype.buildItem,ki.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){this.pendingElements.pop().checkParenting()}},ki.prototype.appendElementInPos=function(t,e){var i=t.getBaseElement();if(i){var s=this.layers[e];if(s.ddd&&this.supports3d)this.addTo3dContainer(i,e);else if(this.threeDElements)this.addTo3dContainer(i,e);else{for(var r,a,n=0;n<e;)this.elements[n]&&!0!==this.elements[n]&&this.elements[n].getBaseElement&&(a=this.elements[n],r=(this.layers[n].ddd?this.getThreeDContainerByPos(n):a.getBaseElement())||r),n+=1;r?s.ddd&&this.supports3d||this.layerElement.insertBefore(i,r):s.ddd&&this.supports3d||this.layerElement.appendChild(i)}}},ki.prototype.createShape=function(t){return this.supports3d?new yi(t,this.globalData,this):new Qe(t,this.globalData,this)},ki.prototype.createText=function(t){return this.supports3d?new vi(t,this.globalData,this):new oi(t,this.globalData,this)},ki.prototype.createCamera=function(t){return this.camera=new bi(t,this.globalData,this),this.camera},ki.prototype.createImage=function(t){return this.supports3d?new _i(t,this.globalData,this):new Be(t,this.globalData,this)},ki.prototype.createSolid=function(t){return this.supports3d?new gi(t,this.globalData,this):new hi(t,this.globalData,this)},ki.prototype.createNull=di.prototype.createNull,ki.prototype.getThreeDContainerByPos=function(t){for(var e=0,i=this.threeDElements.length;e<i;){if(this.threeDElements[e].startPos<=t&&this.threeDElements[e].endPos>=t)return this.threeDElements[e].perspectiveElem;e+=1}return null},ki.prototype.createThreeDContainer=function(t,e){var i,s,a=r("div");E(a);var n=r("div");if(E(n),"3d"===e){(i=a.style).width=this.globalData.compSize.w+"px",i.height=this.globalData.compSize.h+"px";var o="50% 50%";i.webkitTransformOrigin=o,i.mozTransformOrigin=o,i.transformOrigin=o;var h="matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)";(s=n.style).transform=h,s.webkitTransform=h}a.appendChild(n);var l={container:n,perspectiveElem:a,startPos:t,endPos:t,type:e};return this.threeDElements.push(l),l},ki.prototype.build3dContainers=function(){var t,e,i=this.layers.length,s="";for(t=0;t<i;t+=1)this.layers[t].ddd&&3!==this.layers[t].ty?("3d"!==s&&(s="3d",e=this.createThreeDContainer(t,"3d")),e.endPos=Math.max(e.endPos,t)):("2d"!==s&&(s="2d",e=this.createThreeDContainer(t,"2d")),e.endPos=Math.max(e.endPos,t));for(t=(i=this.threeDElements.length)-1;t>=0;t-=1)this.resizerElem.appendChild(this.threeDElements[t].perspectiveElem)},ki.prototype.addTo3dContainer=function(t,e){for(var i=0,s=this.threeDElements.length;i<s;){if(e<=this.threeDElements[i].endPos){for(var r,a=this.threeDElements[i].startPos;a<e;)this.elements[a]&&this.elements[a].getBaseElement&&(r=this.elements[a].getBaseElement()),a+=1;r?this.threeDElements[i].container.insertBefore(t,r):this.threeDElements[i].container.appendChild(t);break}i+=1}},ki.prototype.configAnimation=function(t){var e=r("div"),i=this.animationItem.wrapper,s=e.style;s.width=t.w+"px",s.height=t.h+"px",this.resizerElem=e,E(e),s.transformStyle="flat",s.mozTransformStyle="flat",s.webkitTransformStyle="flat",this.renderConfig.className&&e.setAttribute("class",this.renderConfig.className),i.appendChild(e),s.overflow="hidden";var a=H("svg");a.setAttribute("width","1"),a.setAttribute("height","1"),E(a),this.resizerElem.appendChild(a);var n=H("defs");a.appendChild(n),this.data=t,this.setupGlobalData(t,a),this.globalData.defs=n,this.layers=t.layers,this.layerElement=this.resizerElem,this.build3dContainers(),this.updateContainerSize()},ki.prototype.destroy=function(){var t;this.animationItem.wrapper&&(this.animationItem.wrapper.innerText=""),this.animationItem.container=null,this.globalData.defs=null;var e=this.layers?this.layers.length:0;for(t=0;t<e;t+=1)this.elements[t].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},ki.prototype.updateContainerSize=function(){var t,e,i,s,r=this.animationItem.wrapper.offsetWidth,a=this.animationItem.wrapper.offsetHeight,n=r/a;this.globalData.compSize.w/this.globalData.compSize.h>n?(t=r/this.globalData.compSize.w,e=r/this.globalData.compSize.w,i=0,s=(a-this.globalData.compSize.h*(r/this.globalData.compSize.w))/2):(t=a/this.globalData.compSize.h,e=a/this.globalData.compSize.h,i=(r-this.globalData.compSize.w*(a/this.globalData.compSize.h))/2,s=0);var o=this.resizerElem.style;o.webkitTransform="matrix3d("+t+",0,0,0,0,"+e+",0,0,0,0,1,0,"+i+","+s+",0,1)",o.transform=o.webkitTransform},ki.prototype.renderFrame=di.prototype.renderFrame,ki.prototype.hide=function(){this.resizerElem.style.display="none"},ki.prototype.show=function(){this.resizerElem.style.display="block"},ki.prototype.initItems=function(){if(this.buildAllItems(),this.camera)this.camera.setup();else{var t,e=this.globalData.compSize.w,i=this.globalData.compSize.h,s=this.threeDElements.length;for(t=0;t<s;t+=1){var r=this.threeDElements[t].perspectiveElem.style;r.webkitPerspective=Math.sqrt(Math.pow(e,2)+Math.pow(i,2))+"px",r.perspective=r.webkitPerspective}}},ki.prototype.searchExtraCompositions=function(t){var e,i=t.length,s=r("div");for(e=0;e<i;e+=1)if(t[e].xt){var a=this.createComp(t[e],s,this.globalData.comp,null);a.initExpressions(),this.globalData.projectInterface.registerComposition(a)}},a([ki,fi,ci],xi),xi.prototype._createBaseContainerElements=xi.prototype.createContainerElements,xi.prototype.createContainerElements=function(){this._createBaseContainerElements(),this.data.hasMask?(this.svgElement.setAttribute("width",this.data.w),this.svgElement.setAttribute("height",this.data.h),this.transformedElement=this.baseElement):this.transformedElement=this.layerElement},xi.prototype.addTo3dContainer=function(t,e){for(var i,s=0;s<e;)this.elements[s]&&this.elements[s].getBaseElement&&(i=this.elements[s].getBaseElement()),s+=1;i?this.layerElement.insertBefore(t,i):this.layerElement.appendChild(t)},xi.prototype.createComp=function(t){return this.supports3d?new xi(t,this.globalData,this):new mi(t,this.globalData,this)},a([ki],Pi),Pi.prototype.createComp=function(t){return this.supports3d?new xi(t,this.globalData,this):new mi(t,this.globalData,this)},ai=Pi,Q["html"]=ai,St.registerModifier("tm",Ft),St.registerModifier("pb",Tt),St.registerModifier("rp",Bt),St.registerModifier("rd",Lt),Pt}));
