<html xmlns="http://www.w3.org/1999/xhtml">
<meta charset="UTF-8">
<head>
    <style>
        body{
            background-color:#ccc;
            margin: 0px;
            height: 100%;
            font-family: sans-serif;
            font-size: 10px;
            overflow: hidden;
        }
        #bodymovin{
            background-color:#333;
            width:700px;
            height:700px;
            /*width:800px;
            height:500px;*/
            display:block;
            overflow: hidden;
            transform: translate3d(0,0,0);
            /*margin: auto;*/
            opacity: 1;
        }

        rect{
           /* opacity: .5!important;*/
        }

        svg{
            /*border: 1px solid red;*/
        }

    </style>
    <!-- build:js bodymovin.js -->
     <script src="js/main.js"></script>
    <script src="js/3rd_party/transformation-matrix.js"></script>
    <script src="js/utils/MatrixManager.js"></script>
    <script src="js/utils/animationFramePolyFill.js"></script>
    <script src="js/utils/common.js"></script>
    <script src="js/utils/functionExtensions.js"></script>
    <script src="js/utils/bez.js"></script>
    <script src="js/utils/DataManager.js"></script>
    <script src="js/utils/FontManager.js"></script>
    <script src="js/utils/expressions/ExpressionManager.js"></script>
    <script src="js/utils/expressions/ExpressionComp.js"></script>
    <script src="js/utils/expressions/ShapeInterface.js"></script>
    <script src="js/utils/PropertyFactory.js"></script>
    <script src="js/renderers/SVGRenderer.js"></script>
    <script src="js/renderers/CanvasRenderer.js"></script>
    <script src="js/renderers/HybridRenderer.js"></script>
    <script src="js/mask.js"></script>
    <script src="js/effects/SliderEffect.js"></script>
    <script src="js/effects.js"></script>
    <script src="js/elements/BaseElement.js"></script>
    <script src="js/elements/svgElements/SVGBaseElement.js"></script>
    <script src="js/elements/TextElement.js"></script>
    <script src="js/elements/svgElements/SVGTextElement.js"></script>
    <script src="js/elements/PlaceHolderElement.js"></script>
    <script src="js/elements/CompElement.js"></script>
    <script src="js/elements/ImageElement.js"></script>
    <script src="js/elements/ShapeElement.js"></script>
    <script src="js/elements/SolidElement.js"></script>
    <script src="js/elements/canvasElements/CVBaseElement.js"></script>
    <script src="js/elements/canvasElements/CVCompElement.js"></script>
    <script src="js/elements/canvasElements/CVImageElement.js"></script>
    <script src="js/elements/canvasElements/CVMaskElement.js"></script>
    <script src="js/elements/canvasElements/CVShapeElement.js"></script>
    <script src="js/elements/canvasElements/CVSolidElement.js"></script>
    <script src="js/elements/canvasElements/CVTextElement.js"></script>
    <script src="js/elements/htmlElements/HBaseElement.js"></script>
    <script src="js/elements/htmlElements/HSolidElement.js"></script>
    <script src="js/elements/htmlElements/HCompElement.js"></script>
    <script src="js/elements/htmlElements/HShapeElement.js"></script>
    <script src="js/elements/htmlElements/HTextElement.js"></script>
    <script src="js/elements/htmlElements/HImageElement.js"></script>
    <script src="js/elements/htmlElements/HCameraElement.js"></script>
    <script src="js/animation/AnimationManager.js"></script>
    <script src="js/animation/AnimationItem.js"></script>
     <script src="js/module.js"></script>
    <!-- endbuild -->
    <!-- <script src="bodymovin.js"></script> -->
    <script src="js/utils/stats.js"></script>
</head>
<body>
<canvas id="cvs" width="100" height="100" style="position: absolute;top:0;left: 0"></canvas>
<div id="bodymovin"></div>

<script>
    var count = 0;
    var animData = {
        container: document.getElementById('bodymovin'),
        renderer: 'html',
        loop: true,
        prerender: false,
        autoplay: true,
        path: 'exports/render/data.json'
        //path: 'exports/render/data_glyphs.json'
    };

    var anim;

    anim = bodymovin.loadAnimation(animData);

    //anim.play();
    //anim.playSegments([0,40],true);
    //window.onresize = anim.resize.bind(anim);

    var stats = new Stats();
    stats.setMode( 0 ); // 0: fps, 1: ms, 2: mb

    // align top-left
    stats.domElement.style.position = 'absolute';
    stats.domElement.style.left = '0px';
    stats.domElement.style.top = '0px';

    document.body.appendChild( stats.domElement );

    function loadAndDestroy(){


        function loadAnimation(){
            anim = bodymovin.loadAnimation(animData);
            setTimeout(destroyAnimation,2000);
        }

        function destroyAnimation(){
            anim.destroy();
            anim = null;
            count += 1;
            if(count<50){
                setTimeout(loadAnimation,2000);
            }
        }

        setTimeout(function(){
            loadAnimation();
        },2000);
    }

</script>
</body>
</html>
