<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
--> 
<!DOCTYPE html>
<html lang="en" class="no-js">
  <head>
    <title>Tile</title>
    <link href="../../css/bootstrap-theme.min.css" type="text/css" rel="stylesheet" />
    <link href="../../css/bootstrap.min.css" type="text/css" rel="stylesheet" />
    <script src="../../js/jquery.js" type="text/javascript"></script>
    <script src="../../js/bootstrap.min.js" type="text/javascript"></script>
  </head>
  <body onResize="resize()">
    <div class="container-fluid">
      <div class="row">
        <div class=".col-xs-1 .col-sm-1 .col-md-1 .col-lg-1 glyhicon-hdd"></div>
        <div class=".col-xs-1 .col-sm-2 .col-md-2 .col-lg-2">1000</div>
      </div>
    </div>
    <script src="js/jquery.js"></script>
    <script>
      var tracker;

      function resize() {
        clearTimeout(tracker);
        tracker = setTimeout(render, 50);
      }

      function render() {
        tracker = setTimeout(render, 3000);
      }

      $( document ).ready(function() {
        render();
      });
    </script>
  </body>
</html>
