reusing rendered data
diff --git a/player/index.html b/player/index.html
index 93013ee..89f85bf 100644
--- a/player/index.html
+++ b/player/index.html
@@ -73,12 +73,12 @@
 
     var animData = {
         wrapper: document.getElementById('bodymovin'),
-        animType: 'canvas',
-        loop: true,
+        animType: 'svg',
+        loop: false,
         prerender: false,
         autoplay: true,
-        animationData: bmsmd
-        //path: 'exports/bm'
+        //animationData: bmsmd
+        path: 'exports/navidad'
 
     };
     bodymovin.setQuality(50);
diff --git a/player/js/animation/AnimationItem.js b/player/js/animation/AnimationItem.js
index aa721fb..3e84011 100644
--- a/player/js/animation/AnimationItem.js
+++ b/player/js/animation/AnimationItem.js
@@ -203,8 +203,8 @@
     this.assets = this.animationData.assets;
     this.frameRate = this.animationData.fr;
     this.firstFrame = Math.round(this.animationData.ip*this.frameRate);
-    this.firstFrame = 1500;
-    this.totalFrames = 10;
+    /*this.firstFrame = 0;
+    this.totalFrames = 10;*/
     this.frameMult = this.animationData.fr / 1000;
     this.trigger('bm:config_ready');
     this.loadSegments();
diff --git a/player/js/elements/BaseElement.js b/player/js/elements/BaseElement.js
index 533c89e..7d7419c 100644
--- a/player/js/elements/BaseElement.js
+++ b/player/js/elements/BaseElement.js
@@ -113,8 +113,8 @@
         return;
     }
     this.currentAnimData = this.data.renderedData[num].an;
-    var mat = this.currentAnimData.matrixArray;
-    this.ownMatrix.reset().transform(mat[0],mat[1],mat[2],mat[3],mat[4],mat[5]).translate(-this.currentAnimData.tr.a[0],-this.currentAnimData.tr.a[1]);
+    var mat = this.currentAnimData.m;
+    this.ownMatrix.reset().transform(mat[0],mat[1],mat[2],mat[3],mat[4],mat[5]).translate(-this.currentAnimData.a[0],-this.currentAnimData.a[1]);
 };
 
 BaseElement.prototype.renderFrame = function(num,parentTransform){
@@ -145,7 +145,7 @@
     if(this.data.hasMask){
         this.maskManager.renderFrame(num);
     }
-    this.finalTransform.opacity *= this.currentAnimData.tr.o;
+    this.finalTransform.opacity *= this.currentAnimData.o;
 
     var mat;
     var finalMat = this.finalTransform.mat;
diff --git a/player/js/elements/ShapeItemElement.js b/player/js/elements/ShapeItemElement.js
index 6229ae9..3fe260a 100644
--- a/player/js/elements/ShapeItemElement.js
+++ b/player/js/elements/ShapeItemElement.js
@@ -174,7 +174,7 @@
     groupTransform = parentTransform;
     for(i=len;i>=0;i-=1){
         if(items[i].ty == 'tr'){
-            var mtArr = items[i].renderedData[num].mtArr;
+            var mtArr = items[i].renderedData[num].m;
             groupTransform = data[i].transform;
             groupMatrix = groupTransform.mat;
             groupMatrix.reset();
@@ -352,8 +352,7 @@
                 viewData.ld = renderedFrameData.dNTr;
             }
             if(viewData.lt != renderedFrameData.t) {
-                ////viewData.elements[i].el.setAttribute('transform',renderedFrameData.t);
-                viewData.elements[i].el.style.transform = renderedFrameData.t;
+                viewData.elements[i].el.setAttribute('transform',renderedFrameData.t);
                 viewData.lt = renderedFrameData.t;
             }
         }else{
diff --git a/player/js/elements/canvasElements/CVBaseElement.js b/player/js/elements/canvasElements/CVBaseElement.js
index 9eee8f7..4fa7e2b 100644
--- a/player/js/elements/canvasElements/CVBaseElement.js
+++ b/player/js/elements/canvasElements/CVBaseElement.js
@@ -31,8 +31,8 @@
         return false;
     }
     this.currentAnimData = this.data.renderedData[num].an;
-    var mat = this.currentAnimData.matrixArray;
-    this.ownMatrix.reset().transform(mat[0],mat[1],mat[2],mat[3],mat[4],mat[5]).translate(-this.currentAnimData.tr.a[0],-this.currentAnimData.tr.a[1]);
+    var mat = this.currentAnimData.m;
+    this.ownMatrix.reset().transform(mat[0],mat[1],mat[2],mat[3],mat[4],mat[5]).translate(-this.currentAnimData.a[0],-this.currentAnimData.a[1]);
     if(this.data.ip - this.data.st <= num && this.data.op - this.data.st >= num)
     {
         this.renderFrame = true;
@@ -60,7 +60,7 @@
 
     var mat, finalMat = this.finalTransform.mat;
 
-    this.finalTransform.opacity *= this.currentAnimData.tr.o;
+    this.finalTransform.opacity *= this.currentAnimData.o;
 
     if(parentTransform){
         mat = parentTransform.mat.props;
diff --git a/player/js/elements/canvasElements/CVShapeItemElement.js b/player/js/elements/canvasElements/CVShapeItemElement.js
index d69c06c..421210e 100644
--- a/player/js/elements/canvasElements/CVShapeItemElement.js
+++ b/player/js/elements/canvasElements/CVShapeItemElement.js
@@ -201,7 +201,7 @@
 
 CVShapeItemElement.prototype.renderTransform = function(animData){
     var tr = animData.renderedData[this.frameNum];
-    var matrixValue = tr.mtArr;
+    var matrixValue = tr.m;
     this.transform.mat.transform(matrixValue[0],matrixValue[1],matrixValue[2],matrixValue[3],matrixValue[4],matrixValue[5]).translate(-tr.a[0],-tr.a[1]);
     this.transform.opacity *= tr.o;
 };
diff --git a/player/js/renderers/SVGRenderer.js b/player/js/renderers/SVGRenderer.js
index 88218ee..69309f2 100644
--- a/player/js/renderers/SVGRenderer.js
+++ b/player/js/renderers/SVGRenderer.js
@@ -200,7 +200,6 @@
     if(this.lastFrame == num || this.destroyed){
         return;
     }
-    window.contador = 0;
     if(num === null){
         num = this.lastFrame;
     }else{
@@ -214,5 +213,4 @@
     for (i = 0; i < len; i++) {
         this.elements[i].renderFrame(num - this.layers[i].st);
     }
-    //console.log('window.contador: ',window.contador);
 };
\ No newline at end of file
diff --git a/player/js/utils/DataManager.js b/player/js/utils/DataManager.js
index 7e12618..2e957d6 100644
--- a/player/js/utils/DataManager.js
+++ b/player/js/utils/DataManager.js
@@ -46,6 +46,7 @@
             }
             layerData.renderedFrame = {};
             layerData.renderedData = {};
+            layerData.__lastMatrix = [0,0,0,0,0];
             animArray = [];
             lastFrame = -1;
             if(layerData.tm){
@@ -158,6 +159,7 @@
                 }else{
                     transformData.r *= degToRads;
                 }
+                transformData.lastMat = [0,0,0,0,0];
             }else if(arr[i].ty == 'rc' || arr[i].ty == 'el'){
                 arr[i].trimmed = isTrimmed;
                 arr[i].trimmed = true;
@@ -706,23 +708,27 @@
         };
     }());
 
+    function RenderedTransform(a,o,m){
+        this.a = a;
+        this.o = o;
+        this.m = m;
+    }
+
     var mtParams = [0,1,1,0,0];
     function iterateLayers(layers, frameNum,renderType){
-        var dataOb;
         var maskProps;
         var timeRemapped;
 
         var offsettedFrameNum, i, len, renderedData;
-        var j, jLen = layers.length, item, matArr, newData;
+        var j, jLen = layers.length, item, newData;
         for(j=0;j<jLen;j+=1){
             item = layers[j];
             if(!('ks' in layers[j])) {
                 continue;
             }
             offsettedFrameNum = frameNum - item.st;
-            dataOb = {};
-            dataOb.a = getInterpolatedValue(item.ks.a,offsettedFrameNum, item.st);
-            dataOb.o = getInterpolatedValue(item.ks.o,offsettedFrameNum, item.st);
+            var a = getInterpolatedValue(item.ks.a,offsettedFrameNum, item.st);
+           var o = getInterpolatedValue(item.ks.o,offsettedFrameNum, item.st);
             if(item.ks.p.s){
                 getInterpolatedValue(item.ks.p.x,offsettedFrameNum, item.st,mtParams,3,1);
                 getInterpolatedValue(item.ks.p.y,offsettedFrameNum, item.st,mtParams,4,1);
@@ -732,15 +738,15 @@
             getInterpolatedValue(item.ks.r,offsettedFrameNum, item.st,mtParams,0,1);
             getInterpolatedValue(item.ks.s,offsettedFrameNum, item.st,mtParams,1,2);
             renderedData = {};
-            matArr = matrixInstance.getMatrixArrayFromParams(mtParams[0],mtParams[1],mtParams[2],mtParams[3],mtParams[4]);
             newData = false;
 
-            if(!item.__lastRenderAn || dataOb.o !== item.__lastRenderAn.tr.o || dataOb.a[0] !== item.__lastRenderAn.tr.a[0] || dataOb.a[1] !== item.__lastRenderAn.tr.a[1] || matArr[1] !== item.__lastRenderAn.matrixArray[1] || matArr[2] !== item.__lastRenderAn.matrixArray[2] || matArr[3] !== item.__lastRenderAn.matrixArray[3] || matArr[4] !== item.__lastRenderAn.matrixArray[4] || matArr[5] !== item.__lastRenderAn.matrixArray[5]){
-                renderedData.an = {
-                    tr: dataOb
-                };
-                renderedData.an.matrixArray = matArr;
+            if(!item.__lastRenderAn || o !== item.__lastRenderAn.o || a !== item.__lastRenderAn.a || mtParams[0] !== item.__lastMatrix[0]
+                || mtParams[1] !== item.__lastMatrix[1] || mtParams[2] !== item.__lastMatrix[2] || mtParams[3] !== item.__lastMatrix[3] || mtParams[4] !== item.__lastMatrix[4] ){
+                renderedData.an = new RenderedTransform(a,o,matrixInstance.getMatrixArrayFromParams(mtParams[0],mtParams[1],mtParams[2],mtParams[3],mtParams[4]))
                 item.__lastRenderAn = renderedData.an;
+                for(i=0;i<5;i+=1){
+                    item.__lastMatrix[i] = mtParams[i];
+                }
             }else{
                 renderedData.an = item.__lastRenderAn;
             }
@@ -986,14 +992,21 @@
                     shapeItem.renderedData[offsettedFrameNum].color = rgbToHex(bm_rounder(strokeColor[0]),bm_rounder(strokeColor[1]),bm_rounder(strokeColor[2]));
                 }
             }else if(shapeItem.ty == 'tr'){
-                shapeItem.renderedData[offsettedFrameNum] = {
-                    a : getInterpolatedValue(shapeItem.a,offsettedFrameNum, startTime),
-                    o : getInterpolatedValue(shapeItem.o,offsettedFrameNum, startTime)
-                };
+                var a = getInterpolatedValue(shapeItem.a,offsettedFrameNum, startTime);
+                var o = getInterpolatedValue(shapeItem.o,offsettedFrameNum, startTime);
                 getInterpolatedValue(shapeItem.s,offsettedFrameNum, startTime,mtParams,1,2);
                 getInterpolatedValue(shapeItem.r,offsettedFrameNum, startTime,mtParams,0,1);
                 getInterpolatedValue(shapeItem.p,offsettedFrameNum, startTime,mtParams,3,2);
-                shapeItem.renderedData[offsettedFrameNum].mtArr = matrixInstance.getMatrixArrayFromParams(mtParams[0],mtParams[1],mtParams[2],mtParams[3],mtParams[4]);
+                if(shapeItem.lastData && shapeItem.lastData.a == a && shapeItem.lastData.o == o && shapeItem.lastMat[0] == mtParams[0]
+                    && shapeItem.lastMat[1] == mtParams[1] && shapeItem.lastMat[2] == mtParams[2] && shapeItem.lastMat[3] == mtParams[3] && shapeItem.lastMat[4] == mtParams[4]){
+                    shapeItem.renderedData[offsettedFrameNum] = shapeItem.lastData;
+                }else{
+                    shapeItem.renderedData[offsettedFrameNum] = new RenderedTransform(a,o,matrixInstance.getMatrixArrayFromParams(mtParams[0],mtParams[1],mtParams[2],mtParams[3],mtParams[4]));
+                    for(j=0;j<5;j+=1){
+                        shapeItem.lastMat[j] = mtParams[j];
+                    }
+                    shapeItem.lastData = shapeItem.renderedData[offsettedFrameNum];
+                }
             }else if(shapeItem.ty == 'tm'){
                 trimS = getInterpolatedValue(shapeItem.s,offsettedFrameNum, startTime);
                 trimE = getInterpolatedValue(shapeItem.e,offsettedFrameNum, startTime);