Migration to new build pattern and new retrieval code

This also includes lots of minor fixes to just about everything.
The migration only includes moving files for now but will include new
build steps in the future.

For the time being please use /catalog-dev, it is unfiltered original
code. The build script will be building into /catalog in the future.

Change-Id: Ib49515233aa5e7ebfdf1385b763f986341d82f4a
diff --git a/client/.gitignore b/client/.gitignore
new file mode 100644
index 0000000..46d349a
--- /dev/null
+++ b/client/.gitignore
@@ -0,0 +1,3 @@
+node_modules
+catalog
+
diff --git a/client/catalog/README.md b/client/README.md
similarity index 99%
rename from client/catalog/README.md
rename to client/README.md
index 042551b..2e20aad 100644
--- a/client/catalog/README.md
+++ b/client/README.md
@@ -32,4 +32,3 @@
 If you would like to modify the theme go to [this url](http://bootstrap-live-customizer.com/). To modify the current theme, then upload the variables.less in this folder, make your modifications, and overwrite the variables.less file when you are done (and the theme.min.css).
 
 
-
diff --git a/client/catalog/.gitignore b/client/catalog-dev/.gitignore
similarity index 100%
rename from client/catalog/.gitignore
rename to client/catalog-dev/.gitignore
diff --git a/client/catalog/background.jpg b/client/catalog-dev/background.jpg
similarity index 100%
rename from client/catalog/background.jpg
rename to client/catalog-dev/background.jpg
Binary files differ
diff --git a/client/catalog-dev/config-example.json b/client/catalog-dev/config-example.json
new file mode 100644
index 0000000..5a0455b
--- /dev/null
+++ b/client/catalog-dev/config-example.json
@@ -0,0 +1,18 @@
+{
+	"global": {
+		"catalogPrefix": "/catalog",
+		"faceConfig": {
+			"host": "atmos-csu.research-lan.colostate.edu",
+			"port": 9696
+		}
+	},
+	"retrieval": {
+		"demoKey": {
+			"pub": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuAmnWYKE7E8G+hyy4TiTU7t91KyIGvglEeT6HWEkW4LKzXLO22a1jVS9+yP96I6vp7N5vpS1t7oXtgWuzkO+O85u6gfbvwp+67zJe2I89eHO4dmNnP4fx/j7WcCUCyzZfbyW67h5IoouoBIdQge2Xdvh9rFdex9UUhyjEZv5676zlcqlhz8xGBrJmQHsqpD9ijY1XhKBvoSIoQ0ZKkpmwVk8QYM9PbjUqzSQBj4aYXS+BPV6aRudVvyDt2DBXp2FNP0CGrosCXKnSl4Yv8BYp0k0RmFZDuJuntLb/XIvPEfMX5li7g3zHzAlIJIVSwT+FRkd3H5cECFSIZFUYIuSQQIDAQAB",
+			"priv": "MIIEpQIBAAKCAQEAuAmnWYKE7E8G+hyy4TiTU7t91KyIGvglEeT6HWEkW4LKzXLO22a1jVS9+yP96I6vp7N5vpS1t7oXtgWuzkO+O85u6gfbvwp+67zJe2I89eHO4dmNnP4fx/j7WcCUCyzZfbyW67h5IoouoBIdQge2Xdvh9rFdex9UUhyjEZv5676zlcqlhz8xGBrJmQHsqpD9ijY1XhKBvoSIoQ0ZKkpmwVk8QYM9PbjUqzSQBj4aYXS+BPV6aRudVvyDt2DBXp2FNP0CGrosCXKnSl4Yv8BYp0k0RmFZDuJuntLb/XIvPEfMX5li7g3zHzAlIJIVSwT+FRkd3H5cECFSIZFUYIuSQQIDAQABAoIBAQCKBftzfxavn6lM5T8m+GZN0vzRBsBg8Z/jpsYKSLOayiHNKYCIPaSFpXuCIYEo6/JDJLB2xVLvwupLgkGSwm2mrvCyJkihI38Cz6iQF6I+iia9bYrupgwxzsK7klm1c+J9kXXivYxj4hyLwmoc/mnARMtYV7cTQvDbUEzgRQmPykWKBv6Y0SL1WprfiRfKIMwSqQk91ffj6whKxBLAuUdseVBmo/ivLPq0a+wDrcvaJAxSB4eIwCHzAugkRA/NoK0vG3mra0lK5jvQrcNIuffxNAnresDVDTnYRc42etjePLAhlpeK/4sjYE/wPdeP8yzLHUg/hsSpAPIjLXJNZqUBAoGBANxPmUQNf1lGHo/nLY3dVMD3+kYNnTUD8XwS81qdg8/dNyF8t+7DOdJ1j7Itb+zGA1XXAGfTm6JoUG+eKKR2OSuyZcxygpOgzxAFanXKhTWZsKbG70xNmX0sOAEhtTGsgFTEGEv977MwIlFa6n2bsp3Luj/AGmvNsOYvBDPXOklxAoGBANXZyXAaE7M5JALusLuEFxLGvWVz6TRdQ//c+FWvKrnh+nFlTlAPpDvlaPJJca8ViNevxJ2UhGtbENXAqgwTYpnAi/yQD4dATViIveK6Pn4t12mpPAlkMbbMTR8jtp5l1oHchcwe8QuEOKuTX5+STpNGlWs+tsMb12mhCpc3eO3RAoGAMxjDE2WOA8afkACuMBkFbzwUb+r4azNe7sf2aS3fRHaqMroabuYYoxdhHJItQ10pqN8U2P/bOO+4uCqWgo5o9BmMQr7MSjEh1TVsW6V8/9GFhyjcl3XoA4Ad/SU0QTEhEofomrdqwMSJMRVFDZzu8Gov6FlFx3sNbFW7Q8rHWgECgYEAq/TVz3iIgsLdvCXmosHSM9zvCpcr3FlqhmFOpseVmaamVWxajnIlY6xSuRBpg5nTUWwas4Nq/1BYtyiXE+K6lFuJtOq6Mc145EoANkIAYkHGR0Y36m1QtGaPVQzImZHV7NJAHCR9Ov90+jIk4BErca1+FKB3IWhPzLYb6ABJEyECgYEAthhzWSxPkqyiLl+2vnhdR3EEkvDX6MV6hGu4tDAf2A1Y0GSApyEaSAA31hlxu5EgneLD7Ns2HMpIfQMydB5lcwKQc9g/tVI1eRzuk6Myi+2JmPEM2BLyiX8yI+xnZlKDiZleQitCS4RQGz5HbXT70aYQIGxuvkQ/uf68jdrL6o8="
+		},
+		"destinations": [
+			"/retrieve/demo"
+		]
+	}
+}
diff --git a/client/catalog-dev/css/cubeLoader.css b/client/catalog-dev/css/cubeLoader.css
new file mode 100644
index 0000000..008b846
--- /dev/null
+++ b/client/catalog-dev/css/cubeLoader.css
@@ -0,0 +1,61 @@
+.sk-cube-grid {
+  width: 40px;
+  height: 40px;
+  margin: 100px auto;
+}
+
+.sk-cube-grid .sk-cube {
+  width: 33%;
+  height: 33%;
+  background-color: #333;
+  float: left;
+  -webkit-animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out;
+          animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out; 
+}
+.sk-cube-grid .sk-cube1 {
+  -webkit-animation-delay: 0.2s;
+          animation-delay: 0.2s; }
+.sk-cube-grid .sk-cube2 {
+  -webkit-animation-delay: 0.3s;
+          animation-delay: 0.3s; }
+.sk-cube-grid .sk-cube3 {
+  -webkit-animation-delay: 0.4s;
+          animation-delay: 0.4s; }
+.sk-cube-grid .sk-cube4 {
+  -webkit-animation-delay: 0.1s;
+          animation-delay: 0.1s; }
+.sk-cube-grid .sk-cube5 {
+  -webkit-animation-delay: 0.2s;
+          animation-delay: 0.2s; }
+.sk-cube-grid .sk-cube6 {
+  -webkit-animation-delay: 0.3s;
+          animation-delay: 0.3s; }
+.sk-cube-grid .sk-cube7 {
+  -webkit-animation-delay: 0s;
+          animation-delay: 0s; }
+.sk-cube-grid .sk-cube8 {
+  -webkit-animation-delay: 0.1s;
+          animation-delay: 0.1s; }
+.sk-cube-grid .sk-cube9 {
+  -webkit-animation-delay: 0.2s;
+          animation-delay: 0.2s; }
+
+@-webkit-keyframes sk-cubeGridScaleDelay {
+  0%, 70%, 100% {
+    -webkit-transform: scale3D(1, 1, 1);
+            transform: scale3D(1, 1, 1);
+  } 35% {
+    -webkit-transform: scale3D(0, 0, 1);
+            transform: scale3D(0, 0, 1); 
+  }
+}
+
+@keyframes sk-cubeGridScaleDelay {
+  0%, 70%, 100% {
+    -webkit-transform: scale3D(1, 1, 1);
+            transform: scale3D(1, 1, 1);
+  } 35% {
+    -webkit-transform: scale3D(0, 0, 1);
+            transform: scale3D(0, 0, 1);
+  } 
+}
diff --git a/client/catalog/css/style.css b/client/catalog-dev/css/style.css
similarity index 82%
rename from client/catalog/css/style.css
rename to client/catalog-dev/css/style.css
index 1a66da4..94ea89f 100644
--- a/client/catalog/css/style.css
+++ b/client/catalog-dev/css/style.css
@@ -129,7 +129,7 @@
   font-family: "Glyphicons Halflings";
   content: "\e114";
   float: right;
-  color: gray;
+  color: white;
 }
 
 .panel-heading a[data-toggle="collapse"].collapsed::after {
@@ -167,3 +167,45 @@
 .treeExplorer .treeExplorerNode.file::before {
   content: "\e022"
 }
+
+#popup {
+  top: 0;
+  left: 0;
+  position: fixed;
+  width: 100%;
+  height: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  z-index: 9000;
+  pointer-events: none;
+}
+
+#popup > * {
+  display: none;
+  pointer-events: auto;
+}
+
+.modal-open, #request {
+  padding-right: 0 !important;
+}
+
+.sk-cube-grid {
+  display: none;
+}
+
+table:empty ~ .sk-cube-grid {
+  display: block;
+}
+
+#requestForm {
+  max-width: 500px;
+  min-height: 300px;
+  position: relative;
+}
+
+.absBotRight {
+  position: absolute;
+  bottom: 0;
+  right: 0;
+}
diff --git a/client/catalog/css/theme.min.css b/client/catalog-dev/css/theme.min.css
similarity index 99%
rename from client/catalog/css/theme.min.css
rename to client/catalog-dev/css/theme.min.css
index fd241e4..50fa138 100644
--- a/client/catalog/css/theme.min.css
+++ b/client/catalog-dev/css/theme.min.css
@@ -52,7 +52,7 @@
 }
 .img-thumbnail,body{background-color:#fff}
 .btn,.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-warning.active,.btn-warning:active,.btn.active,.btn:active,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover,.form-control,.navbar-toggle,.open>.dropdown-toggle.btn-danger,.open>.dropdown-toggle.btn-default,.open>.dropdown-toggle.btn-info,.open>.dropdown-toggle.btn-primary,.open>.dropdown-toggle.btn-warning{background-image:none}
-@font-face{font-family:'Glyphicons Halflings';src:url(http://bootstrap-live-customizer.com/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.eot);src:url(http://bootstrap-live-customizer.com/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(http://bootstrap-live-customizer.com/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(http://bootstrap-live-customizer.com/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.woff) format('woff'),url(http://bootstrap-live-customizer.com/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(http://bootstrap-live-customizer.com/bootstrap-3.3.5/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}
+@font-face{font-family:'Glyphicons Halflings';src:url(https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/fonts/glyphicons-halflings-regular.eot);src:url(https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/fonts/glyphicons-halflings-regular.woff) format('woff'),url(https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}
 .glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
 .glyphicon-asterisk:before{content:"\2a"}
 .glyphicon-plus:before{content:"\2b"}
diff --git a/client/catalog/index.html b/client/catalog-dev/index.html
similarity index 75%
rename from client/catalog/index.html
rename to client/catalog-dev/index.html
index bd2e933..590fcfb 100644
--- a/client/catalog/index.html
+++ b/client/catalog-dev/index.html
@@ -16,6 +16,7 @@
 </script>
 
 <!-- Styles -->
+<link rel="stylesheet" href="css/cubeLoader.css">
 <link rel="stylesheet" href="css/theme.min.css">
 <link rel="stylesheet" href="css/style.css">
 
@@ -92,7 +93,7 @@
 
         <div id="results" class="panel panel-default hidden">
           <div class="panel-body">
-            <nav class="navbar navbar-inverse col-md-12 resultMenu hidden">
+            <nav class="navbar navbar-inverse col-md-12 resultMenu">
               <ul class="nav navbar-nav navbar-left">
                 <li class="previous disabled">
                   <a href="#">&larr; Previous</a>
@@ -116,7 +117,18 @@
               </ul>
             </nav>
             <table id="resultTable" class="table"></table>
-            <nav class="navbar navbar-inverse col-md-12 resultMenu hidden">
+            <div class="sk-cube-grid">
+              <div class="sk-cube sk-cube1"></div>
+              <div class="sk-cube sk-cube2"></div>
+              <div class="sk-cube sk-cube3"></div>
+              <div class="sk-cube sk-cube4"></div>
+              <div class="sk-cube sk-cube5"></div>
+              <div class="sk-cube sk-cube6"></div>
+              <div class="sk-cube sk-cube7"></div>
+              <div class="sk-cube sk-cube8"></div>
+              <div class="sk-cube sk-cube9"></div>
+            </div>
+            <nav class="navbar navbar-inverse col-md-12 resultMenu">
               <ul class="nav navbar-nav navbar-left">
                 <li class="previous disabled">
                   <a href="#">&larr; Previous</a>
@@ -148,6 +160,36 @@
 
   </div>
 
+  <div id="popup">
+    <div id="request" class="panel panel-primary">
+      <div class="panel-heading">Confirmation</div>
+      <div class="panel-body">
+        <form id="requestForm">
+          <p>Select a destination and press submit if you are sure you want to download the selected data to the selected destination.</p>
+          <div class="dropdown">
+            <button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">
+              Destination
+              <span class="caret"></span>
+            </button>
+            <ul id="requestDest" class="dropdown-menu"></ul>
+          </div>
+          <!-- Disabled For Demo
+          <div class="form-group">
+            <label>Authentication Key</label>
+            <input type="file" class="form-control" placeholder="JSON encoded RSA key">
+            <p class="help-block">It is required that you have authentication to move the files, otherwise this will fail.</p>
+          </div>
+          <div id="requestDrop" class="well">You can also drop your key here instead of using the input above.</div>
+          -->
+          <div class="absBotRight">
+            <button type="submit" class="btn btn-primary">Submit</button>
+            <button id="requestCancel" type="button" class="btn btn-default">Cancel</button>
+          </div>
+        </form>
+      </div>
+    </div>
+  </div>
+
 </body>
 
 </html>
diff --git a/client/catalog/js/autocomplete.js b/client/catalog-dev/js/autocomplete.js
similarity index 100%
rename from client/catalog/js/autocomplete.js
rename to client/catalog-dev/js/autocomplete.js
diff --git a/client/catalog-dev/js/catalog.js b/client/catalog-dev/js/catalog.js
new file mode 100644
index 0000000..d013fda
--- /dev/null
+++ b/client/catalog-dev/js/catalog.js
@@ -0,0 +1,714 @@
+//Run when the document loads AND we have the config loaded.
+(function(){
+  "use strict";
+  var config;
+  Promise.all([
+    new Promise(function(resolve, reject){
+      $.ajax('config.json').done(function(data){
+        config = data;
+        resolve();
+      }).fail(function(){
+        console.error("Failed to get config.");
+        ga('send', 'event', 'error', 'config');
+        reject();
+      });
+    }),
+    new Promise(function(resolve, reject){
+      var timeout = setTimeout(function(){
+        console.error("Document never loaded? Something bad has happened!");
+        reject();
+      }, 10000);
+      $(function () {
+        clearTimeout(timeout);
+        resolve();
+      });
+    })
+  ]).then(function(){
+    new Atmos(config);
+  }, function(){
+    console.error("Failed to initialize!");
+    ga('send', 'event', 'error', 'init');
+  });
+})();
+
+var Atmos = (function(){
+  "use strict";
+
+  var closeButton = '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>';
+
+  var guid = function(){
+    var d = new Date().getTime();
+    var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
+      var r = (d + Math.random()*16)%16 | 0;
+      d = Math.floor(d/16);
+      return (c=='x' ? r : (r&0x3|0x8)).toString(16);
+    });
+    return uuid;
+  }
+
+  /**
+   * Atmos
+   * @version 2.0
+   *
+   * Configures an Atmos object. This manages the atmos interface.
+   *
+   * @constructor
+   * @param {string} catalog - NDN path
+   * @param {Object} config - Object of configuration options for a Face.
+   */
+  var Atmos = function(config){
+
+    //Internal variables.
+    this.results = [];
+    this.resultCount = Infinity;
+    this.name = null;
+    this.page = 0;
+    this.resultsPerPage = 25;
+    this.retrievedSegments = 0;
+
+    //Config/init
+    this.config = config;
+
+    this.catalog = config['global']['catalogPrefix'];
+
+    this.face = new Face(config['global']['faceConfig']);
+
+    //Easy access dom variables
+    this.categories = $('#side-menu');
+    this.resultTable = $('#resultTable');
+    this.filters = $('#filters');
+    this.searchInput = $('#search');
+    this.searchBar = $('#searchBar');
+    this.searchButton = $('#searchButton');
+    this.resultMenu = $('.resultMenu');
+    this.alerts = $('#alerts');
+    this.requestForm = $('#requestForm');
+
+    var scope = this;
+
+    $('.requestSelectedButton').click(function(){
+      ga('send', 'event', 'button', 'click', 'request');
+      scope.request(scope.resultTable.find('.resultSelector:checked:not([disabled])').parent().parent());
+    });
+
+    this.filterSetup();
+
+    //Init autocomplete
+    this.searchInput.autoComplete(function(field, callback){
+      ga('send', 'event', 'search', 'autocomplete');
+      scope.autoComplete(field, function(list){
+        callback(list.map(function(element){
+          return field + element + "/";
+        }));
+      });
+    });
+
+    //Handle search
+    this.searchBar.submit(function(e){
+      ga('send', 'event', 'search', 'submit');
+      e.preventDefault();
+      if (scope.searchInput.val().length === 0){
+        if (!scope.searchBar.hasClass('has-error')){
+          scope.searchBar.addClass('has-error').append('<span class="help-block">Search path is required!</span>');
+        }
+        return;
+      } else {
+        scope.searchBar.removeClass('has-error').find('.help-block').fadeOut(function(){$(this).remove()});
+      }
+      scope.pathSearch();
+    });
+
+    this.searchButton.click(function(){
+      console.log("Search Button Pressed");
+      ga('send', 'event', 'button', 'click', 'search');
+      scope.search();
+    });
+
+    //Result navigation handlers
+    this.resultMenu.find('.next').click(function(){
+      ga('send', 'event', 'button', 'click', 'next');
+      if (!$(this).hasClass('disabled')){
+        scope.getResults(scope.page + 1);
+      }
+    });
+    this.resultMenu.find('.previous').click(function(){
+      ga('send', 'event', 'button', 'click', 'previous');
+      if (!$(this).hasClass('disabled')){
+        scope.getResults(scope.page - 1);
+      }
+    });
+
+    //Change the number of results per page handler
+    var rpps = $('.resultsPerPageSelector').click(function(){
+
+      var t = $(this);
+
+      if (t.hasClass('active')){
+        return;
+      }
+
+      rpps.find('.active').removeClass('active');
+      t.addClass('active');
+      scope.resultsPerPage = Number(t.text());
+      scope.getResults(0); //Force return to page 1;
+
+    });
+
+    //Init tree search
+    $('#treeSearch div').treeExplorer(function(path, callback){
+      console.log("Tree Explorer request", path);
+      ga('send', 'event', 'tree', 'request');
+      scope.autoComplete(path, function(list){
+        console.log("Autocomplete response", list);
+        callback(list.map(function(element){
+          return (path == "/"?"/":"") + element + "/";
+        }));
+      })
+    });
+
+    this.setupRequestForm();
+
+  }
+
+  Atmos.prototype.clearResults = function(){
+    this.results = []; //Drop any old results.
+    this.retrievedSegments = 0;
+    this.resultCount = Infinity;
+    this.page = 0;
+    this.resultTable.empty();
+  }
+
+  Atmos.prototype.pathSearch = function(){
+    var value = this.searchInput.val();
+
+    this.clearResults();
+
+    var scope = this;
+
+    this.query(this.catalog, {"??": value},
+    function(interest, data){
+      console.log("Query response:", interest, data);
+
+      scope.name = data.getContent().toString().replace(/[\n\0]/g,"");
+
+      scope.getResults(0);
+
+    },
+    function(interest){
+      console.warn("Request failed! Timeout", interest);
+      scope.createAlert("Request timed out. \"" + interest.getName().toUri() + "\" See console for details.");
+    });
+
+  }
+
+  Atmos.prototype.search = function(){
+
+    var filters = this.getFilters();
+
+    console.log("Search started!", this.searchInput.val(), filters);
+
+    console.log("Initiating query");
+
+    this.clearResults();
+
+    var scope = this;
+
+    this.query(this.catalog, filters,
+    function(interest, data){ //Response function
+      console.log("Query Response:", interest, data);
+
+      scope.name = data.getContent().toString().replace(/[\n\0]/g,"");
+
+      scope.getResults(0);
+
+    }, function(interest){ //Timeout function
+      console.warn("Request failed! Timeout");
+      scope.createAlert("Request timed out. \"" + interest.getName().toUri() + "\" See console for details.");
+    });
+
+  }
+
+  Atmos.prototype.autoComplete = function(field, callback){
+
+    var scope = this;
+
+    this.query(this.catalog, {"?": field},
+    function(interest, data){
+
+      var name = new Name(data.getContent().toString().replace(/[\n\0]/g,""));
+
+      var interest = new Interest(name);
+      interest.setInterestLifetimeMilliseconds(5000);
+      interest.setMustBeFresh(true);
+
+      scope.face.expressInterest(interest,
+      function(interest, data){
+
+        if (data.getContent().length !== 0){
+          callback(JSON.parse(data.getContent().toString().replace(/[\n\0]/g, "")).next);
+        } else {
+          callback([]);
+        }
+
+      }, function(interest){
+        console.warn("Interest timed out!", interest);
+        scope.createAlert("Request timed out. \"" + interest.getName().toUri() + "\" See console for details.");
+      });
+
+    }, function(interest){
+      console.error("Request failed! Timeout", interest);
+      scope.createAlert("Request timed out. \"" + interest.getName().toUri() + "\" See console for details.");
+    });
+
+  }
+
+  Atmos.prototype.showResults = function(resultIndex) {
+
+    var results = this.results.slice(this.resultsPerPage * resultIndex, this.resultsPerPage * (resultIndex + 1));
+
+    var resultDOM = $(
+      results.reduce(function(prev, current){
+        prev.push('<tr><td><input class="resultSelector" type="checkbox"></td><td>');
+        prev.push(current);
+        prev.push('</td></tr>');
+        return prev;
+      }, ['<tr><th><input id="resultSelectAll" type="checkbox" title="Select All"> Select</th><th>Name</th></tr>']).join('')
+    );
+
+    resultDOM.find('#resultSelectAll').click(function(){
+      if ($(this).is(':checked')){
+        resultDOM.find('.resultSelector:not([disabled])').prop('checked', true);
+      } else {
+        resultDOM.find('.resultSelector:not([disabled])').prop('checked', false);
+      }
+    });
+
+    this.resultTable.hide().empty().append(resultDOM).slideDown('slow');
+
+    this.resultMenu.find('.pageNumber').text(resultIndex + 1);
+    this.resultMenu.find('.pageLength').text(this.resultsPerPage * resultIndex + results.length);
+
+    if (this.resultsPerPage * (resultIndex + 1) >= this.resultCount) {
+      this.resultMenu.find('.next').addClass('disabled');
+    } else if (resultIndex === 0){
+      this.resultMenu.find('.next').removeClass('disabled');
+    }
+
+    if (resultIndex === 0){
+      this.resultMenu.find('.previous').addClass('disabled');
+    } else if (resultIndex === 1) {
+      this.resultMenu.find('.previous').removeClass('disabled');
+    }
+
+  }
+
+  Atmos.prototype.getResults = function(index){
+
+    if ($('#results').hasClass('hidden')){
+      $('#results').removeClass('hidden').slideDown();
+    }
+
+    if ((this.results.length === this.resultCount) || (this.resultsPerPage * (index + 1) < this.results.length)){
+      //console.log("We already have index", index);
+      this.page = index;
+      this.showResults(index);
+      return;
+    }
+
+    if (this.name === null) {
+      console.error("This shouldn't be reached! We are getting results before a search has occured!");
+      throw new Error("Illegal State");
+    }
+
+    var first = new Name(this.name).appendSegment(this.retrievedSegments++);
+
+    console.log("Requesting data index: (", this.retrievedSegments - 1, ") at ", first.toUri());
+
+    var scope = this;
+
+    var interest = new Interest(first)
+    interest.setInterestLifetimeMilliseconds(5000);
+    interest.setMustBeFresh(true);
+
+    this.face.expressInterest(interest,
+      function(interest, data){ //Response
+
+        if (data.getContent().length === 0){
+          scope.resultMenu.find('.totalResults').text(0);
+          scope.resultMenu.find('.pageNumber').text(0);
+          scope.resultMenu.find('.pageLength').text(0);
+          console.log("Empty response.");
+          return;
+        }
+
+        var content = JSON.parse(data.getContent().toString().replace(/[\n\0]/g,""));
+
+        if (!content.results){
+          scope.resultMenu.find('.totalResults').text(0);
+          scope.resultMenu.find('.pageNumber').text(0);
+          scope.resultMenu.find('.pageLength').text(0);
+          console.log("No results were found!");
+          return;
+        }
+
+        scope.results = scope.results.concat(content.results);
+
+        scope.resultCount = content.resultCount;
+
+        scope.resultMenu.find('.totalResults').text(scope.resultCount);
+
+        scope.page = index;
+
+        scope.getResults(index); //Keep calling this until we have enough data.
+
+      },
+      function(interest){ //Timeout
+        console.error("Failed to retrieve results: timeout", interest);
+        scope.createAlert("Request timed out. \"" + interest.getName().toUri() + "\" See console for details.");
+      }
+    );
+
+  }
+
+  Atmos.prototype.query = function(prefix, parameters, callback, timeout) {
+
+    var queryPrefix = new Name(prefix);
+    queryPrefix.append("query");
+
+    var jsonString = JSON.stringify(parameters);
+    queryPrefix.append(jsonString);
+
+    var queryInterest = new Interest(queryPrefix);
+    queryInterest.setInterestLifetimeMilliseconds(4000);
+    queryInterest.setMustBeFresh(true);
+
+    this.face.expressInterest(queryInterest, callback, timeout);
+
+  }
+
+  /**
+   * This function returns a map of all the categories active filters.
+   * @return {Object<string, string>}
+   */
+  Atmos.prototype.getFilters = function(){
+    var filters = this.filters.children().toArray().reduce(function(prev, current){
+      var data = $(current).text().split(/:/);
+      prev[data[0]] = data[1];
+      return prev;
+    }, {}); //Collect a map<category, filter>.
+    //TODO Make the return value map<category, Array<filter>>
+    return filters;
+  }
+
+  /**
+   * Creates a closable alert for the user.
+   *
+   * @param {string} message
+   * @param {string} type - Override the alert type.
+   */
+  Atmos.prototype.createAlert = function(message, type) {
+
+    var alert = $('<div class="alert"><div>');
+    alert.addClass(type?type:'alert-info');
+    alert.text(message);
+    alert.append(closeButton);
+
+    this.alerts.append(alert);
+  }
+
+  /**
+   * Requests all of the names represented by the buttons in the elements list.
+   *
+   * @param elements {Array<jQuery>} A list of the table row elements
+   */
+  Atmos.prototype.request = function(){
+
+    //Pseudo globals.
+    var keyChain;
+    var certificateName;
+    var keyAdded = false;
+
+    return function(elements){
+
+      var names = [];
+      var destination = $('#requestDest .active').text();
+      $(elements).find('>*:nth-child(2)').each(function(){
+        var name = $(this).text();
+        names.push(name);
+      });//.append('<span class="badge">Requested!</span>')
+      //Disabling the checkbox doesn't make sense anymore with the ability to request to multiple destinations.
+      //$(elements).find('.resultSelector').prop('disabled', true).prop('checked', false);
+
+      var scope = this;
+      this.requestForm.on('submit', function(e){ //This will be registered for the next submit from the form.
+        e.preventDefault();
+
+        //Form checking
+        var dest = scope.requestForm.find('#requestDest .active');
+        if (dest.length !== 1){
+          $('#requestForm').append($('<div class="alert alert-warning">A destination is required!' + closeButton + '<div>'));
+          return;
+        }
+
+        $('#request').modal('hide')//Initial params are ok. We can close the form.
+        .remove('.alert') //Remove any alerts
+        .find('.active').removeClass('active'); //Disable the active destination
+
+        $(this).off(e); //Don't fire this again, the request must be regenerated
+
+        //Key setup
+        if (!keyAdded){
+          if (!scope.config.retrieval.demoKey || !scope.config.retrieval.demoKey.pub || !scope.config.retrieval.demoKey.priv){
+            scope.createAlert("This host was not configured to handle retrieval! See console for details.", 'alert-danger');
+            console.error("Missing/invalid key! This must be configured in the config on the server.", scope.config.demoKey);
+            return;
+          }
+
+          //FIXME base64 may or may not exist in other browsers. Need a new polyfill.
+          var pub = new Buffer(base64.toByteArray(scope.config.retrieval.demoKey.pub)); //MUST be a Buffer (Buffer != Uint8Array)
+          var priv = new Buffer(base64.toByteArray(scope.config.retrieval.demoKey.priv));
+
+          var identityStorage = new MemoryIdentityStorage();
+          var privateKeyStorage = new MemoryPrivateKeyStorage();
+          keyChain = new KeyChain(new IdentityManager(identityStorage, privateKeyStorage),
+                        new SelfVerifyPolicyManager(identityStorage));
+
+          var keyName = new Name("/retrieve/DSK-123");
+          certificateName = keyName.getSubName(0, keyName.size() - 1)
+            .append("KEY").append(keyName.get(-1))
+            .append("ID-CERT").append("0");
+
+          identityStorage.addKey(keyName, KeyType.RSA, new Blob(pub, false));
+          privateKeyStorage.setKeyPairForKeyName(keyName, KeyType.RSA, pub, priv);
+
+          scope.face.setCommandSigningInfo(keyChain, certificateName);
+
+          keyAdded = true;
+
+        }
+
+        //Retrieval
+        var retrievePrefix = new Name("/catalog/ui/" + guid());
+
+        //Due to a lack of success callback in the register prefix function, we have to pretend we
+        //know it succeeded with an arbitrary timeout.
+        var sendTimer = setTimeout(function(){
+          var prefix = new Name(dest.text());
+          prefix.append(retrievePrefix);
+          var interest = new Interest(prefix);
+          interest.setInterestLifetimeMilliseconds(3000);
+          scope.face.expressInterest(interest,
+            function(interest, data){ //Success
+              console.log("Request for", prefix.toUri(), "succeeded.", interest, data);
+            }, function(interest){ //Failure
+              console.error("Failure to request", prefix.toUri(), interest);
+              scope.createAlert("Failed to request " + prefix.toUri() + ". This means that the retrieve failed! See console for more details.");
+            }
+          );
+        }, 10000); //Wait 10 seconds
+
+        scope.face.registerPrefix(retrievePrefix,
+          function(prefix, interest, face, interestFilterId, filter){ //On Interest
+            //This function will exist until the page exits but will likely only be used once.
+
+            var data = new Data(interest.getName());
+            var content = JSON.stringify(names);
+            data.setContent(content);
+            keyChain.sign(data, certificateName);
+
+            try {
+              face.putData(data);
+              console.log("Responded for", interest.getName().toUri(), data);
+              scope.createAlert("Data retrieval has initiated.", "alert-success");
+            } catch (e) {
+              console.error("Failed to respond to", interest.getName().toUri(), data);
+              scope.createAlert("Data retrieval failed.");
+            }
+
+          }, function(prefix){ //On fail
+            clearTimeout(sendTimer); //Cancel the earlier request timer
+            scope.createAlert("Failed to register the retrieval URI! See console for details.", "alert-danger");
+            console.error("Failed to register URI:", prefix.toUri(), prefix);
+
+          }
+        );
+
+      });
+      $('#request').modal(); //This forces the form to be the only option.
+
+    }
+  }();
+
+  Atmos.prototype.filterSetup = function() {
+    //Filter setup
+
+    var prefix = new Name(this.catalog).append("filters-initialization");
+
+    var scope = this;
+
+    this.getAll(prefix, function(data) { //Success
+      var raw = JSON.parse(data.replace(/[\n\0]/g, '')); //Remove null byte and parse
+
+      console.log("Filter categories:", raw);
+
+      $.each(raw, function(index, object){ //Unpack list of objects
+        $.each(object, function(category, searchOptions) { //Unpack category from object (We don't know what it is called)
+          //Create the category
+          var e = $('<li><a href="#">' + category.replace(/_/g, " ") + '</a><ul class="subnav nav nav-pills nav-stacked"></ul></li>');
+
+          var sub = e.find('ul.subnav');
+          $.each(searchOptions, function(index, name){
+            //Create the filter list inside the category
+            var item = $('<li><a href="#">' + name + '</a></li>');
+            sub.append(item);
+            item.click(function(){ //Click on the side menu filters
+              if (item.hasClass('active')){ //Does the filter already exist?
+                item.removeClass('active');
+                scope.filters.find(':contains(' + category + ':' + name + ')').remove();
+              } else { //Add a filter
+                item.addClass('active');
+                var filter = $('<span class="label label-default"></span>');
+                filter.text(category + ':' + name);
+
+                scope.filters.append(filter);
+
+                filter.click(function(){ //Click on a filter
+                  filter.remove();
+                  item.removeClass('active');
+                });
+              }
+
+            });
+          });
+
+          //Toggle the menus. (Only respond when the immediate tab is clicked.)
+          e.find('> a').click(function(){
+            scope.categories.find('.subnav').slideUp();
+            var t = $(this).siblings('.subnav');
+            if ( !t.is(':visible') ){ //If the sub menu is not visible
+              t.slideDown(function(){
+                t.triggerHandler('focus');
+              }); //Make it visible and look at it.
+            }
+          });
+
+          scope.categories.append(e);
+
+        });
+      });
+
+    }, function(interest){ //Timeout
+      scope.createAlert("Failed to initialize the filters!", "alert-danger");
+      console.error("Failed to initialize filters!", interest);
+      ga('send', 'event', 'error', 'filters');
+    });
+
+  }
+
+  /**
+   * This function retrieves all segments in order until it knows it has reached the last one.
+   * It then returns the final joined result.
+   */
+  Atmos.prototype.getAll = function(prefix, callback, timeout){
+
+    var scope = this;
+    var d = [];
+
+    var request = function(segment){
+
+      var name = new Name(prefix);
+      name.appendSegment(segment);
+
+      var interest = new Interest(name);
+      interest.setInterestLifetimeMilliseconds(1000);
+      interest.setMustBeFresh(true); //Is this needed?
+
+      scope.face.expressInterest(interest, handleData, timeout);
+
+    }
+
+
+    var handleData = function(interest, data){
+
+      d.push(data.getContent().toString());
+
+      if (interest.getName().get(-1).toSegment() == data.getMetaInfo().getFinalBlockId().toSegment()){
+        callback(d.join(""));
+      } else {
+        request(interest.getName().toSegment()++);
+      }
+
+    }
+
+    request(0);
+
+  }
+
+  Atmos.prototype.setupRequestForm = function(){
+    this.requestForm.find('#requestCancel').click(function(){
+      $('#request').unbind('submit') //Removes all event handlers.
+      .modal('hide'); //Hides the form.
+    });
+
+    var dests = $(this.config['retrieval']['destinations'].reduce(function(prev, current){
+      prev.push('<li><a href="#">');
+      prev.push(current);
+      prev.push("</a></li>");
+      return prev;
+    }, []).join(""));
+
+    this.requestForm.find('#requestDest').append(dests)
+    .on('click', 'a', function(e){
+      $('#requestDest .active').removeClass('active');
+      $(this).parent().addClass('active');
+    });
+
+    //This code will remain unused until users must use their own keys instead of the demo key.
+//    var scope = this;
+
+//    var warning = '<div class="alert alert-warning">' + closeButton + '<div>';
+
+//    var handleFile = function(e){
+//      var t = $(this);
+//      if (e.target.files.length > 1){
+//        var el = $(warning);
+//        t.append(el.append("We are looking for a single file, we will try the first only!"));
+//      } else if (e.target.files.length === 0) {
+//        var el = $(warning.replace("alert-warning", "alert-danger"));
+//        t.append(el.append("No file was supplied!"));
+//        return;
+//      }
+
+//      var reader = new FileReader();
+//      reader.onload = function(e){
+//        var key;
+//        try {
+//          key = JSON.parse(e.target.result);
+//        } catch (e) {
+//          console.error("Could not parse the key! (", key, ")");
+//          var el = $(warning.replace("alert-warning", "alert-danger"));
+//          t.append(el.append("Failed to parse the key file, is it a valid json key?"));
+//        }
+
+//        if (!key.DEFAULT_RSA_PUBLIC_KEY_DER || !key.DEFAULT_RSA_PRIVATE_KEY_DER) {
+//          console.warn("Invalid key", key);
+//          var el = $(warning.replace("alert-warning", "alert-danger"));
+//          t.append(el.append("Failed to parse the key file, it is missing required attributes."));
+//        }
+
+
+//      };
+
+//    }
+
+//    this.requestForm.find('#requestDrop').on('dragover', function(e){
+//      e.dataTransfer.dropEffect = 'copy';
+//    }).on('drop', handleFile);
+
+//    this.requestForm.find('input[type=file]').change(handleFile);
+
+  }
+
+  return Atmos;
+
+})();
diff --git a/client/catalog/js/treeExplorer.js b/client/catalog-dev/js/treeExplorer.js
similarity index 99%
rename from client/catalog/js/treeExplorer.js
rename to client/catalog-dev/js/treeExplorer.js
index fc6a7a3..5037629 100644
--- a/client/catalog/js/treeExplorer.js
+++ b/client/catalog-dev/js/treeExplorer.js
@@ -2,8 +2,8 @@
 (function(){
   "use strict";
   jQuery.fn.extend({
-    treeExplorer: function(getChildren){
 
+    treeExplorer: function(getChildren){
       var cache = {}; //Cache previously requested paths.
 
       var tree = $('<div class="treeExplorer"></div>');
diff --git a/client/catalog/variables.less b/client/catalog-dev/variables.less
similarity index 100%
rename from client/catalog/variables.less
rename to client/catalog-dev/variables.less
diff --git a/client/catalog/config-example.json b/client/catalog/config-example.json
deleted file mode 100644
index 39d20f9..0000000
--- a/client/catalog/config-example.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-	"catalogPrefix": "/catalog/myUniqueName",
-	"faceConfig": {
-		"host": "atmos-csu.research-lan.colostate.edu",
-		"port": 9696
-	}
-}
diff --git a/client/catalog/js/catalog.js b/client/catalog/js/catalog.js
deleted file mode 100644
index 3f703cb..0000000
--- a/client/catalog/js/catalog.js
+++ /dev/null
@@ -1,527 +0,0 @@
-//Run when the document loads AND we have the config loaded.
-(function(){
-  var catalog = null;
-  var config = null;
-  Promise.all([
-    new Promise(function(resolve, reject){
-      $.ajax('config.json').done(function(data){
-        catalog = data.catalogPrefix;
-        config = data.faceConfig;
-        resolve();
-      }).fail(function(){
-        console.error("Failed to get config.");
-        reject()
-      });
-    }),
-    new Promise(function(resolve, reject){
-      var timeout = setTimeout(function(){
-        console.error("Document never loaded? Something bad has happened!");
-        reject();
-      }, 10000);
-      $(function () {
-        clearTimeout(timeout);
-        resolve();
-      });
-    })
-  ]).then(function(){
-    new Atmos(catalog, config);
-  }, function(){
-    console.error("Failed to initialize!");
-  })
-})();
-
-var Atmos = (function(){
-  "use strict";
-  /**
-   * Atmos
-   * @version 2.0
-   *
-   * Configures an Atmos object. This manages the atmos interface.
-   *
-   * @constructor
-   * @param {string} catalog - NDN path
-   * @param {Object} config - Object of configuration options for a Face.
-   */
-  function Atmos(catalog, config){
-
-    //Internal variables.
-    this.results = [];
-    this.resultCount = Infinity;
-    this.name = null;
-    this.page = 0;
-    this.resultsPerPage = 25;
-    this.retrievedSegments = 0;
-
-    this.catalog = catalog;
-
-    this.face = new Face(config);
-
-    this.categories = $('#side-menu');
-    this.resultTable = $('#resultTable');
-    this.filters = $('#filters');
-    this.searchInput = $('#search');
-    this.searchBar = $('#searchBar');
-    this.searchButton = $('#searchButton');
-    this.resultMenu = $('.resultMenu');
-    this.alerts = $('#alerts');
-
-    var scope = this;
-
-    this.resultTable.on('click', '.interest-button', function(){
-      scope.request(this);
-    });
-
-    $('.requestSelectedButton').click(function(){
-      scope.request(
-        scope.resultTable.find('.resultSelector:checked:not([disabled])')
-        .parent().next().find('.interest-button')
-      );
-    });
-
-    this.filterSetup();
-
-    this.searchInput.autoComplete(function(field, callback){
-      scope.autoComplete(field, function(list){
-        callback(list.map(function(element){
-          return field + element + "/";
-        }));
-      });
-    });
-
-    this.searchBar.submit(function(e){
-      e.preventDefault();
-      if (scope.searchInput.val().length === 0){
-        if (!scope.searchBar.hasClass('has-error')){
-          scope.searchBar.addClass('has-error').append('<span class="help-block">Search path is required!</span>');
-        }
-        return;
-      } else {
-        scope.searchBar.removeClass('has-error').find('.help-block').fadeOut(function(){$(this).remove()});
-      }
-      scope.pathSearch();
-    });
-
-    this.searchButton.click(function(){
-      console.log("Search Button Pressed");
-      scope.search();
-    });
-
-    this.resultMenu.find('.next').click(function(){
-      if (!$(this).hasClass('disabled')){
-        scope.getResults(scope.page + 1);
-      }
-    });
-    this.resultMenu.find('.previous').click(function(){
-      if (!$(this).hasClass('disabled')){
-        scope.getResults(scope.page - 1);
-      }
-    });
-
-    var rpps = $('.resultsPerPageSelector').click(function(){
-
-      var t = $(this);
-
-      if (t.hasClass('active')){
-        return;
-      }
-
-      rpps.find('.active').removeClass('active');
-      t.addClass('active');
-      scope.resultsPerPage = Number(t.text());
-      scope.getResults(0); //Force return to page 1;
-
-    });
-
-    $('#treeSearch div').treeExplorer(function(path, callback){
-      console.log("Tree Explorer request", path);
-      scope.autoComplete(path, function(list){
-        console.log("Autocomplete response", list);
-        callback(list.map(function(element){
-          return (path == "/"?"/":"") + element + "/";
-        }));
-      })
-    });
-
-  }
-
-  Atmos.prototype.clearResults = function(){
-    this.results = []; //Drop any old results.
-    this.retrievedSegments = 0;
-    this.resultCount = Infinity;
-    this.page = 0;
-    this.resultTable.empty();
-  }
-
-  Atmos.prototype.pathSearch = function(){
-    var value = this.searchInput.val();
-
-    this.clearResults();
-
-    var scope = this;
-
-    this.query(this.catalog, {"??": value},
-    function(interest, data){
-      console.log("Query response:", interest, data);
-
-      scope.name = data.getContent().toString().replace(/[\n\0]/g,"");
-
-      scope.getResults(0);
-
-    },
-    function(interest){
-      console.warn("Request failed! Timeout", interest);
-      scope.createAlert("Request timed out. \"" + interest.getName().toUri() + "\" See console for details.");
-    });
-
-  }
-
-  Atmos.prototype.search = function(){
-
-    var filters = this.getFilters();
-
-    console.log("Search started!", this.searchInput.val(), filters);
-
-    console.log("Initiating query");
-
-    this.clearResults();
-
-    var scope = this;
-
-    this.query(this.catalog, filters,
-    function(interest, data){ //Response function
-      console.log("Query Response:", interest, data);
-
-      scope.name = data.getContent().toString().replace(/[\n\0]/g,"");
-
-      scope.getResults(0);
-
-    }, function(interest){ //Timeout function
-      console.warn("Request failed! Timeout");
-      scope.createAlert("Request timed out. \"" + interest.getName().toUri() + "\" See console for details.");
-    });
-
-  }
-
-  Atmos.prototype.autoComplete = function(field, callback){
-
-    var scope = this;
-
-    this.query(this.catalog, {"?": field},
-    function(interest, data){
-
-      var name = new Name(data.getContent().toString().replace(/[\n\0]/g,""));
-
-      var interest = new Interest(name);
-      interest.setInterestLifetimeMilliseconds(5000);
-      interest.setMustBeFresh(true);
-
-      scope.face.expressInterest(interest,
-      function(interest, data){
-
-        if (data.getContent().length !== 0){
-          callback(JSON.parse(data.getContent().toString().replace(/[\n\0]/g, "")).next);
-        } else {
-          callback([]);
-        }
-
-      }, function(interest){
-        console.warn("Interest timed out!", interest);
-        scope.createAlert("Request timed out. \"" + interest.getName().toUri() + "\" See console for details.");
-      });
-
-    }, function(interest){
-      console.error("Request failed! Timeout", interest);
-      scope.createAlert("Request timed out. \"" + interest.getName().toUri() + "\" See console for details.");
-    });
-
-  }
-
-  Atmos.prototype.showResults = function(resultIndex) {
-
-    if ($('#results').hasClass('hidden')){
-      $('#results').removeClass('hidden').slideDown();
-    }
-
-    var results = this.results.slice(this.resultsPerPage * resultIndex, this.resultsPerPage * (resultIndex + 1));
-
-    var resultDOM = $(
-      results.reduce(function(prev, current){
-        prev.push('<tr><td><input class="resultSelector" type="checkbox"></td><td>');
-        prev.push(current);
-        prev.push('</td></tr>');
-        return prev;
-      }, ['<tr><th><input id="resultSelectAll" type="checkbox" title="Select All"> Select</th><th>Name</th></tr>']).join('')
-    );
-
-    resultDOM.find('#resultSelectAll').click(function(){
-      if ($(this).is(':checked')){
-        resultDOM.find('.resultSelector:not([disabled])').prop('checked', true);
-      } else {
-        resultDOM.find('.resultSelector:not([disabled])').prop('checked', false);
-      }
-    });
-
-    this.resultTable.empty().append(resultDOM).slideDown();
-    if (this.resultMenu.hasClass('hidden')){
-      this.resultMenu.removeClass('hidden').slideDown();
-    }
-
-    this.resultMenu.find('.pageNumber').text(resultIndex + 1);
-    this.resultMenu.find('.pageLength').text(this.resultsPerPage * (resultIndex + 1));
-
-    if (this.resultsPerPage * (resultIndex + 1) >= this.resultCount) {
-      this.resultMenu.find('.next').addClass('disabled');
-    } else if (resultIndex === 0){
-      this.resultMenu.find('.next').removeClass('disabled');
-    }
-
-    if (resultIndex === 0){
-      this.resultMenu.find('.previous').addClass('disabled');
-    } else if (resultIndex === 1) {
-      this.resultMenu.find('.previous').removeClass('disabled');
-    }
-
-  }
-
-  Atmos.prototype.getResults = function(index){
-
-    if ((this.results.length === this.resultCount) || (this.resultsPerPage * (index + 1) < this.results.length)){
-      //console.log("We already have index", index);
-      this.page = index;
-      this.showResults(index);
-      return;
-    }
-
-    if (this.name === null) {
-      console.error("This shouldn't be reached! We are getting results before a search has occured!");
-      throw new Error("Illegal State");
-    }
-
-    var first = new Name(this.name).appendSegment(this.retrievedSegments++);
-
-    console.log("Requesting data index: (", this.retrievedSegments - 1, ") at ", first.toUri());
-
-    var scope = this;
-
-    var interest = new Interest(first)
-    interest.setInterestLifetimeMilliseconds(5000);
-    interest.setMustBeFresh(true);
-
-    this.face.expressInterest(interest,
-      function(interest, data){ //Response
-
-        if (data.getContent().length === 0){
-          scope.resultMenu.find('.totalResults').text(0);
-          scope.resultMenu.find('.pageNumber').text(0);
-          console.log("Empty response.");
-          return;
-        }
-
-        var content = JSON.parse(data.getContent().toString().replace(/[\n\0]/g,""));
-
-        if (!content.results){
-          scope.resultMenu.find('.totalResults').text(0);
-          scope.resultMenu.find('.pageNumber').text(0);
-          console.log("No results were found!");
-          return;
-        }
-
-        scope.results = scope.results.concat(content.results);
-
-        scope.resultCount = content.resultCount;
-
-        scope.resultMenu.find('.totalResults').text(scope.resultCount);
-
-        scope.page = index;
-
-        scope.getResults(index); //Keep calling this until we have enough data.
-
-      },
-      function(interest){ //Timeout
-        console.error("Failed to retrieve results: timeout", interest);
-        scope.createAlert("Request timed out. \"" + interest.getName().toUri() + "\" See console for details.");
-      }
-    );
-
-  }
-
-  Atmos.prototype.query = function(prefix, parameters, callback, timeout) {
-
-    var queryPrefix = new Name(prefix);
-    queryPrefix.append("query");
-
-    var jsonString = JSON.stringify(parameters);
-    queryPrefix.append(jsonString);
-
-    var queryInterest = new Interest(queryPrefix);
-    queryInterest.setInterestLifetimeMilliseconds(4000);
-    queryInterest.setMustBeFresh(true);
-
-    this.face.expressInterest(queryInterest, callback, timeout);
-
-  }
-
-  /**
-   * This function returns a map of all the categories active filters.
-   * @return {Object<string, string>}
-   */
-  Atmos.prototype.getFilters = function(){
-    var filters = this.filters.children().toArray().reduce(function(prev, current){
-      var data = $(current).text().split(/:/);
-      prev[data[0]] = data[1];
-      return prev;
-    }, {}); //Collect a map<category, filter>.
-    //TODO Make the return value map<category, Array<filter>>
-    return filters;
-  }
-
-  /**
-   * Creates a closable alert for the user.
-   *
-   * @param {string} message
-   * @param {string} type - Override the alert type.
-   */
-  Atmos.prototype.createAlert = function(message, type) {
-
-    var alert = $('<div class="alert"><div>');
-    alert.addClass(type?type:'alert-info');
-    alert.text(message);
-    alert.append(Atmos.closeButton);
-
-    this.alerts.append(alert);
-  }
-
-  /**
-   * Requests all of the names represented by the buttons in the elements list.
-   *
-   * @param elements {Array<jQuery>} A list of the interestButton elements
-   */
-  Atmos.prototype.request = function(elements){
-
-    var scope = this;
-    $(elements).filter(':not(.disabled)').each(function(){
-      var button = $(this);
-
-      if (button.hasClass('disabled')){
-        console.warn("An attempt to request a disabled element has occured");
-        return;
-      }
-
-      var name = button.text();
-      var interest = new Interest(new Name('/retrieve' + name));
-      scope.face.expressInterest(interest, function(){}, function(){});
-
-    })
-    .append('<span class="badge">Requested!</span>')
-    .addClass('disabled')
-    .addClass('label-success')
-    .parent().prev().find('.resultSelector').prop('disabled', true).prop('checked', false);
-
-  }
-
-  Atmos.prototype.filterSetup = function() {
-    //Filter setup
-
-    var prefix = new Name(this.catalog).append("filters-initialization");
-
-    var scope = this;
-
-    this.getAll(prefix, function(data) { //Success
-      var raw = JSON.parse(data.replace(/[\n\0]/g, '')); //Remove null byte and parse
-
-      console.log("Filter categories:", raw);
-
-      $.each(raw, function(index, object){ //Unpack list of objects
-        $.each(object, function(category, searchOptions) { //Unpack category from object (We don't know what it is called)
-          //Create the category
-          var e = $('<li><a href="#">' + category.replace(/\_/g, " ") + '</a><ul class="subnav nav nav-pills nav-stacked"></ul></li>');
-
-          var sub = e.find('ul.subnav');
-          $.each(searchOptions, function(index, name){
-            //Create the filter list inside the category
-            var item = $('<li><a href="#">' + name + '</a></li>');
-            sub.append(item);
-            item.click(function(){ //Click on the side menu filters
-              if (item.hasClass('active')){ //Does the filter already exist?
-                item.removeClass('active');
-                scope.filters.find(':contains(' + category + ':' + name + ')').remove();
-              } else { //Add a filter
-                item.addClass('active');
-                var filter = $('<span class="label label-default"></span>');
-                filter.text(category + ':' + name);
-
-                scope.filters.append(filter);
-
-                filter.click(function(){ //Click on a filter
-                  filter.remove();
-                  item.removeClass('active');
-                });
-              }
-
-            });
-          });
-
-          //Toggle the menus. (Only respond when the immediate tab is clicked.)
-          e.find('> a').click(function(){
-            scope.categories.find('.subnav').slideUp();
-            var t = $(this).siblings('.subnav');
-            if ( !t.is(':visible') ){ //If the sub menu is not visible
-              t.slideDown(function(){
-                t.triggerHandler('focus');
-              }); //Make it visible and look at it.
-            }
-          });
-
-          scope.categories.append(e);
-
-        });
-      });
-
-    }, function(interest){ //Timeout
-      scope.createAlert("Failed to initialize the filters!", "alert-danger");
-      console.error("Failed to initialize filters!", interest);
-    });
-
-  }
-
-  Atmos.prototype.getAll = function(prefix, callback, timeout){
-
-    var scope = this;
-    var d = [];
-
-    var request = function(segment){
-
-      var name = new Name(prefix);
-      name.appendSegment(segment);
-
-      var interest = new Interest(name);
-      interest.setInterestLifetimeMilliseconds(1000);
-      interest.setMustBeFresh(true); //Is this needed?
-
-      scope.face.expressInterest(interest, handleData, timeout);
-
-    }
-
-
-    var handleData = function(interest, data){
-
-      d.push(data.getContent().toString());
-
-      if (interest.getName().get(-1).toSegment() == data.getMetaInfo().getFinalBlockId().toSegment()){
-        callback(d.join(""));
-      } else {
-        request(interest.getName().toSegment()++);
-      }
-
-    }
-
-    request(0);
-
-
-  }
-
-  Atmos.closeButton = '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>';
-
-  return Atmos;
-
-})();
diff --git a/client/catalog/sample.json b/client/catalog/sample.json
deleted file mode 100644
index 260abcc..0000000
--- a/client/catalog/sample.json
+++ /dev/null
@@ -1,727 +0,0 @@
-{
-    "QueryRestrictions": [],
-    "SearchCatagories": {
-        "institute": ["BCC", "BNU", "CCCMA", "CMCC", "CNRM-CERFACS", "COLA-CFS", "CSIRO-BOM", "CSIRO-QCCCE", "FIO", "ICHEC", "INM", "INPE", "IPSL", "LASG-CESS", "LASG-IAP", "MIROC", "MOHC", "MPI-M", "MRI", "NASA-GISS", "NASA-GMAO", "NCAR", "NCC", "NCEP", "NICAM", "NIMR-KMA", "NOAA-GFDL", "NSF-DOE-NCAR", "SMHI", "UNSW"],
-        "model": ["ACCESS1.0", "ACCESS1.3", "BCC - CSM1.1", "BCC - CSM1.1(m)", "BNU - ESM", "CCSM4", "CESM1(BGC)", "CESM1(CAM5)", "CESM1(CAM5.1, FV2)", "CESM1(FASTCHEM)", "CESM1(WACCM)", "CFSv2 - 2011", "CMCC - CESM", "CMCC - CM", "CMCC - CMS", " CNRM - CM5", "CNRM - CM5 - 2", "CSIRO - Mk3.6.0", "CSIRO - Mk3L - 1 - 2", "CanAM4", "CanCM4", "CanESM2", "EC - EARTH", "FGOALS - g2", "FGOALS - gl", "FGOALS - s2", "FIO - ESM", "GEOS - 5", "GFDL - CM2.1", "GFDL - CM3", "GFDL - ESM2G", "GFDL - ESM2M", "GFDL - HIRAM - C180", "GFDL - HIRAM - C360", "GISS - E2 - H", "GISS - E2 - H - CC", "GISS - E2 - R", "GISS - E2 - R - CC", "HadCM3", "HadGEM2 - A", "HadGEM2 - AO", "HadGEM2 - CC ", "HadGEM2 - ES", "INM - CM4", "IPSL - CM5A - LR", "IPSL - CM5A - MR", "IPSL - CM5B - LR", "MIROC - ESM", "MIROC - ESM - CHEM", "MIROC4h", "MIROC5", "MPI - ESM - LR", "MPI - ESM - MR", "MPI - ESM - P", "MRI - AGCM3.2H", "MRI - AGCM3.2S", "MRI - CGCM3", "MRI - ESM1", "NICAM - 09", "NorESM1 - M", "NorESM1 - ME"],
-        "submodel": [],
-        "instrument": [],
-        "experiment_family": ["All", "Atmos - only", "Control", "Decadal", "ESM", "Historical", "Idealized", "Paleo", "RCP"],
-        "experiment": ["abrupt4xCO2", "amip", "amip4K", "amip4xCO2", "amipFuture", "aqua4K", "aqua4xCO2", "aquaControl", "decadal1959", "decadal1960", "decadal1961", "decadal1962", "decadal1963", "decadal1964", "decadal1965", "decadal1966", "decadal1967", "decadal1968", "decadal1969", "decadal1970", "decadal1971", "decadal1972", "decadal1973", "decadal1974", "decadal1975", "decadal1976", "decadal1977", "decadal1978", "decadal1979", "decadal1980", "decadal1981", "decadal1982", "decadal1983", "decadal1984", "decadal1985", "decadal1986", "decadal1987", "decadal1988", "decadal1989", "decadal1990", "decadal1991", "decadal1992", "decadal1993", "decadal1994", "decadal1995", "decadal1996", "decadal1997", "decadal1998", "decadal1999", "decadal2000", "decadal2001", "decadal2002", "decadal2003", "decadal2004", "decadal2005", "decadal2006", "decadal2007", "decadal2008", "decadal2009", "decadal2010", " decadal2011", "decadal2012", "esmControl", "esmFdbk1", "esmFdbk2", "esmFixClim1", "esmFixClim2", "esmHistorical", "esmrcp85", "historical", "historicalExt", "historicalGHG", "historicalMisc", "historicalNat", "lgm", "midHolocene", "noVolc1960", "noVolc1965", "noVolc1970", "noVolc1975", "noVolc1980", "noVolc1985", "noVolc1990", "noVolc1995", "noVolc2000", "noVolc2005", "past1000", "piControl", "rcp26", "rcp45", "rcp60", "rcp85", "sst2030", "sst2090", "sst2090rcp45", "sstClim", "sstClim4xCO2", "sstClimAerosol", "sstClimSulfate", "volcIn2010"],
-        "subexperiment": [],
-        "frequency": ["3hr", "6hr", "day", "fx", "mon", "monClim", "subhr", "yr"],
-        "product": ["output1", "output2", "restricted", "unsolicited"],
-        "realm": ["aerosol", "atmos", "land", "landIce", "ocean", "ocnBgchem", "seaIce"],
-        "variable": ["agessc", "albisccp", "areacella", "areacello", "bmelt", "burntArea", "cCwd", "cLeaf", "cLitter", "cMisc", "cProduct", "cRoot", "cSoil", "cSoilFast", "cSoilMedium", "cSoilSlow", "cVeg", "cWood", "ccb", "cct", "cfc11", "ch4", "chl", "chlcalc", "chldiat", "chldiaz", "chlpico", "ci", "cl", "clcalipso", "clhcalipso", "cli", "clic", "clis", "clisccp", "clivi", "cllcalipso", "clmcalipso", "clt", "cltcalipso", "cltisccp", "clw", "clwc", "clws", "clwvi", "co2", "co3", "co3satarag", "co3satcalc", "deptho", "dfe", "dissic", "dissoc", "divice", "dpco2", "epc100", "epcalc100", "epfe100", "epsi100", "evap", "evspsbl", "evspsblsoi", "evspsblveg", "expc", "expcalc", "expcfe", "expsi", "fFire", "fLitterSoil", "fLuc", "fVegLitter", "fbddtalk", "fbddtdic", "fbddtdife", "fbddtdin", "fbddtdip", "fbddtdisi", "fddtalk", "fddtdic", "fddtdife", "fddtdin", "fddtdip", "fddtdisi", "fgco2", "fgo2", "frn", "gpp", "grCongel", "grFrazil", "h2o", "hfds", "hfdsn", "hfls", "hflssi", "hfss", "hfssi", "hur", "hurs", "hus", "huss", "intdic", "intpbsi", "intpcalc", "intpcalcite", "intpdiat", "intpdiaz", "intpn2", "intpnitrate", "intpp", "intppico", "lai", "lwsnl", "masso", "mc", "mrfso", "mrlsl", "mrro", "mrros", "mrso", "mrsofc", "mrsos", "msftbarot", "msftmyz", "msftmyzba", "n2o", "nbp", "nh4", "no3", "npp", "nppLeaf", "nppRoot", "nppWood", "o2", "o2min", "od550aer", "omlmax", "orog", "parasolRefl", "pctisccp", "ph", "phyc", "phycalc", "phydiat", "phydiaz", "phyfe", "phyn", "phyp", "phypico", "physi", "po4", "pr", "prc", "prsn", "prveg", "prw", "ps", "psl", "rGrowth", "rMaint", "ra", "reffclic", "reffclis", "reffclwc", "reffclws", "reffrains", "reffsnows", "rh", "rhopoto", "rhs", "rlds", "rldscs", "rldssi", "rlus", "rlussi", "rlut", "rlutcs", "rsds", "rsdscs", "rsdssi", "rsdt", "rsntds", "rsus", "rsuscs", "rsut", "rsutcs", "rtmt", "sci", "sfcWind", "sftgif", "sftlf", "sftof", "si", "sic", "sit", "snc", "snd", "snm", "snoToIce", "snomelt", "snw", "so", "soga", "sootsn", "sos", "spco2", "strairx", "strairy", "streng", "strocnx", "strocny", "ta", "ta700", "talk", "tas", "tasmax", "tasmin", "tauu", "tauuo", "tauv", "tauvo", "thetao", "thetaoga", "thkcello", "tmelt", "tnhus", "tnhusa", "tnhusc", "tnhusd", "tnhusmp", "tnhusscpbl", "tnt", "tntc", "tntmp", "tntr", "tntscpbl", "tos", "tossq", "tran", "tro3", "ts", "tsice", "tsl", "ua", "umo", "uo", "usi", "va", "vmo", "vo", "volcello", "vsi", "wap", "wmo", "wmosq", "zg", "zo2min", "zooc", "zos", "zosga", "zossga", "zossq", "zostoga", "zsatarag", "zsatcalc"],
-        "variable_long_name": [],
-        "cmip_table": ["3hr", "3hrExtras", "6hrLev", "6hrPlev", "Aclim", "Amon", "AmonExtras", "LIclim", "LImon", "Lclim", "Lmon", "LmonExtras", "OImon", "Oclim", "Omon", "OmonExtras", "Oyr", "OyrExtras", "aero", "cf3hr", "cfDay", "cfMon", "cfOff", "cfSites", "day", "dayExtras", "fx"],
-        "cf_standardname": [],
-        "ensemble": ["r0i0p0", "r10i1p1", "r10i2p1", "r1i1p1", "r1i1p10", "r1i1p11", "r1i1p12", "r1i1p13", "r1i1p14", "r1i1p15", "r1i1p16", "r1i1p17", "r1i1p2", "r1i1p3", "r1i2p1", "r1i2p2", "r2i1p1", "r2i1p10", "r2i1p11", "r2i1p12", "r2i1p13", "r2i1p14", "r2i1p16", "r2i1p17", "r2i2p1", "r3i1p1", "r3i1p10", "r3i1p11", "r3i1p13", "r3i1p14", "r3i1p16", "r3i1p17", "r3i2p1", "r4i1p1", "r4i1p10", "r4i1p11", "r4i1p12", "r4i1p14", "r4i1p15", "r4i1p16", "r4i1p17", "r4i2p1", "r5i1p1", "r5i2p1", "r6i1p1", "r6i1p10", "r6i1p11", "r6i1p12", "r6i1p13", "r6i1p14", "r6i1p15", "r6i1p16", "r6i1p17", "r6i2p1", "r7i1p1", "r7i2p1", "r8i1p1", "r8i2p1", "r9i1p1", "r9i2p1"],
-        "data_node": ["adm07.cmcc.it", "bcccsm.cma.gov.cn", "bmbf-ipcc-ar5.dkrz.de", "cmip-dn1.badc.rl.ac.uk", "cmip5.fio.org.cn", "dapp2p.cccma.ec.gc.ca", "dias-esg-nd.tkl.iis.u-tokyo.ac.jp", "esg-dn1.nsc.liu.se", "esg.bnu.edu.cn", "esg.cnrm-game-meteo.fr", "esg.lasg.ac.cn", "esg01.nersc.gov", "esg2.e-inis.ie", "esgdata.gfdl.noaa.gov", "esgdata1.nccs.nasa.gov", "esgf.extra.cea.fr", "esgnode2.nci.org.au", "noresg.norstore.uio.no", "pcmdi7.llnl.gov", "pcmdi9.llnl.gov", "tds.ucar.edu", "vesg.ipsl.fr"]
-    },
-    "QueryResults": {
-        "Length": 876342,
-        "View": [10, 19],
-        "Results": [
-            {
-                "psl_6hrPlev_CMCC-CM_rcp85_r1i1p1_2006050100-2006051609": {
-                    "time": "UNLIMITED",
-                    "latitude": 240,
-                    "longitude": 480,
-                    "bounds": 2,
-                    "variables": {
-                        "time:units": "days since 2006-5-1",
-                        "time:calendar": "standard",
-                        "time:axis": "T",
-                        "time:long_name": "time",
-                        "time:standard_name": "time",
-                        "lat:bounds": "lat_bnds",
-                        "lat:units": "degrees_north",
-                        "lat:axis": "Y",
-                        "lat:long_name": "latitude",
-                        "lat:standard_name": "latitude",
-                        "lon:bounds": "lon_bnds",
-                        "lon:units": "degrees_east",
-                        "lon:axis": "X",
-                        "lon:long_name": "longitude",
-                        "lon:standard_name": "longitude",
-                        "psl:standard_name": "air_pressure_at_sea_level",
-                        "psl:long_name": "Sea Level Pressure",
-                        "psl:units": "Pa",
-                        "psl:original_name": "slp",
-                        "psl:cell_measures": "area: areacella",
-                        "psl:associated_files": "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_atmos_fx_CMCC-CM_rcp85_r0i0p0.nc areacella: areacella_fx_CMCC-CM_rcp85_r0i0p0.nc",
-                        "psl:history": "2012-02-10T14:49:14Z altered by CMOR: Inverted axis: lat."
-                    },
-                    "institution": "CMCC - Centro Euro-Mediterraneo per i Cambiamenti",
-                    "institute_id": "CMCC",
-                    "experiment_id": "rcp85",
-                    "source": "CMCC-CM",
-                    "model_id": "CMCC-CM",
-                    "forcing": "Nat,GHG,SA,TO,Sl",
-                    "parent_experiment_id": "N/A",
-                    "parent_experiment_rip": "N/A",
-                    "branch_time": 0,
-                    "contact": "Silvio Gualdi (gualdi@bo.ingv.it)",
-                    "history": "Model output postprocessed with CDO 2012-02-10T14:49:14Z CMOR rewrote data to comply with CF standards and CMIP5 requirements.",
-                    "comment": "Equilibrium reached after more than 600-year spin-up at pre-industrial GHG concentrations after which data were output with nominal date of January 1550",
-                    "references": "model described in the documentation at http://www.cmcc.it/data-models/models",
-                    "initialization_method": 1,
-                    "physics_version": 1,
-                    "tracking_id": "37b43d78-ab42-4b44-bf1f-3e2eda008183",
-                    "product": "output",
-                    "experiment": "RCP8.5",
-                    "frequency": "6hr",
-                    "creation_date": "2012-02-10T14:49:14Z",
-                    "Conventions": "CF-1.4",
-                    "project_id": "CMIP5",
-                    "table_id": "Table 6hrPlev (27 April 2011) 00b465eee32d6d11a7e57f5cc8e067f8",
-                    "title": "CMCC-CM model output prepared for CMIP5 RCP8.5",
-                    "parent_experiment": "N/A",
-                    "modeling_realm": "atmos",
-                    "realization": 1,
-                    "cmor_version": "2.7.1"
-                }
-                    },
-            {
-                "ua_6hrLev_bcc-csm1-1-m_rcp85_r1i1p1_201710200000-201712311800": {
-                    "time": "UNLIMITED",
-                    "lev": "26",
-                    "latitude": "160",
-                    "longitude": "320",
-                    "bnds": 2,
-                    "variables": {
-                        "time:bounds": "time_bnds",
-                        "time:units": "days since 2017-01-01 00:00:00",
-                        "time:calendar": "noleap",
-                        "time:axis": "T",
-                        "time:long_name": "time",
-                        "time:standard_name": "time",
-                        "lev:bounds": "lev_bnds",
-                        "lev:units": "1",
-                        "lev:axis": "Z",
-                        "lev:positive": "down",
-                        "lev:long_name": "hybrid sigma pressure coordinate",
-                        "lev:standard_name": "atmosphere_hybrid_sigma_pressure_coordinate",
-                        "lev:formula": "p = a*p0 + b*ps",
-                        "lev:formula_terms": "p0: p0 a: a b: b ps: ps",
-                        "lev_bnds:formula": "p = a*p0 + b*ps",
-                        "lev_bnds:standard_name": "atmosphere_hybrid_sigma_pressure_coordinate",
-                        "lev_bnds:units": "1",
-                        "lev_bnds:formula_terms": "p0: p0 a: a_bnds b: b_bnds ps: ps",
-                        "p0:long_name": "vertical coordinate formula term: reference pressure",
-                        "p0:units": "Pa",
-                        "a:long_name": "vertical coordinate formula term: a(k)",
-                        "b:long_name": "vertical coordinate formula term: b(k)",
-                        "ps:standard_name": "surface_air_pressure",
-                        "ps:long_name": "Surface Air Pressure",
-                        "ps:comment": "surface pressure, not mean sea level pressure",
-                        "ps:units": "Pa",
-                        "ps:cell_measures": "area: areacella",
-                        "a_bnds:long_name": "vertical coordinate formula term: a(k+1/2)",
-                        "b_bnds:long_name": "vertical coordinate formula term: b(k+1/2)",
-                        "lat:bounds": "lat_bnds",
-                        "lat:units": "degrees_north",
-                        "lat:axis": "Y",
-                        "lat:long_name": "latitude",
-                        "lat:standard_name": "latitude",
-                        "lon:bounds": "lon_bnds",
-                        "lon:units": "degrees_east",
-                        "lon:axis": "X",
-                        "lon:long_name": "longitude",
-                        "lon:standard_name": "longitude",
-                        "ua:standard_name": "eastward_wind",
-                        "ua:long_name": "Eastward Wind",
-                        "ua:units": "m s-1",
-                        "ua:original_name": "U",
-                        "ua:associated_files": "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_atmos_fx_bcc-csm1-1-m_rcp85_r0i0p0.nc",
-                        "ua:history": "2012-07-12T07:31:30Z altered by CMOR: Inverted axis: lev."
-                    },
-                    "institution": "Beijing Climate Center(BCC),China Meteorological Administration,China",
-                    "institute_id": "BCC",
-                    "experiment_id": "rcp85",
-                    "source": "bcc-csm1-1-m:atmosphere:  BCC_AGCM2.2 (T106L26), land: BCC_AVIM1.1,ocean: MOM4_L40v2 (tripolar, 1 lon x (1-1/3) lat, L40),sea ice: SIS (tripolar,1 lon x (1-1/3) lat)",
-                    "model_id": "bcc-csm1-1-m",
-                    "forcing": "Nat Ant GHG SD Oz Sl SS Ds BC OC",
-                    "parent_experiment_id": "historical",
-                    "parent_experiment_rip": "r1i1p1",
-                    "branch_time": 2006,
-                    "contact": "Dr. Tongwen Wu (twwu@cma.gov.cn)",
-                    "history": "Output from monthly mean data 2012-07-12T07:31:30Z CMOR rewrote data to comply with CF standards and CMIP5 requirements.",
-                    "comment": "The main difference between BCC-CSM1-1-M and BCC-CSM1-1 is their horizontal resolutions of the atmospheric component and the corresponding mask of sea-land. Continuation of historical from 2006 to 2099. Future projection (2006-2099) forced with prescribed concentration scenario of RCP8.5. The carbon cycle in land and ocean component model is considered, but the time-evolution of CO2 concentration in atmospheric component is prescribed.",
-                    "initialization_method": 1,
-                    "physics_version": 1,
-                    "tracking_id": "2412b77c-55e2-4796-96a7-8625112fc4f2",
-                    "product": "output",
-                    "experiment": "RCP8.5",
-                    "frequency": "6hr",
-                    "creation_date": "2012-07-12T07:31:30Z",
-                    "Conventions": "CF-1.4",
-                    "project_id": "CMIP5",
-                    "table_id": "Table 6hrLev (11 April 2011) 583cb2bb254a9bc7ec5a7bb9cf07ce44",
-                    "title": "bcc-csm1-1-m model output prepared for CMIP5 RCP8.5",
-                    "parent_experiment": "historical",
-                    "modeling_realm": "atmos",
-                    "realization": 1,
-                    "cmor_version": "2.5.6"
-                }
-            },
-            {
-                "va_6hrPlev_MPI-ESM-LR_rcp85_r1i1p1_2015010100-2015123118": {
-                    "time": "UNLIMITED",
-                    "plev": 3,
-                    "latitude": 96,
-                    "longitude": 192,
-                    "bnds": 2,
-                    "variables": {
-                        "time:units": "days since 1850-1-1 00:00:00",
-                        "time:calendar": "proleptic_gregorian",
-                        "time:axis": "T",
-                        "time:long_name": "time",
-                        "time:standard_name": "time",
-                        "plev:units": "Pa",
-                        "plev:axis": "Z",
-                        "plev:positive": "down",
-                        "plev:long_name": "pressure",
-                        "plev:standard_name": "air_pressure",
-                        "lat:bounds": "lat_bnds",
-                        "lat:units": "degrees_north",
-                        "lat:axis": "Y",
-                        "lat:long_name": "latitude",
-                        "lat:standard_name": "latitude",
-                        "lon:bounds": "lon_bnds",
-                        "lon:units": "degrees_east",
-                        "lon:axis": "X",
-                        "lon:long_name": "longitude",
-                        "lon:standard_name": "longitude",
-                        "va:standard_name": "northward_wind",
-                        "va:long_name": "Northward Wind",
-                        "va:units": "m s-1",
-                        "va:associated_files": "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_atmos_fx_MPI-ESM-LR_rcp85_r0i0p0.nc"
-                    },
-                    "institution": "Max Planck Institute for Meteorology",
-                    "institute_id": "MPI-M",
-                    "experiment_id": "rcp85",
-                    "source": "MPI-ESM-LR 2011, URL: http://svn.zmaw.de/svn/cosmos/branches/releases/mpi-esm-cmip5/src/mod, atmosphere: ECHAM6 (REV: 4619), T63L47, land: JSBACH (REV: 4619), ocean: MPIOM (REV: 4619), GR15L40, sea ice: 4619, marine bgc: HAMOCC (REV: 4619),",
-                    "model_id": "MPI-ESM-LR",
-                    "forcing": "GHG Oz SD Sl Vl LU",
-                    "parent_experiment_id": "historical",
-                    "parent_experiment_rip": "r1i1p1",
-                    "branch_time": 56978,
-                    "contact": "cmip5-mpi-esm@dkrz.de",
-                    "history": "Model raw output postprocessing with modelling environment (IMDI) at DKRZ: URL: http://svn-mad.zmaw.de/svn/mad/Model/IMDI/trunk, REV: 3433 2011-07-14T17:26:52Z CMOR rewrote data to comply with CF standards and CMIP5 requirements.",
-                    "references": "ECHAM6: n/a, JSBACH: Raddatz et al., 2007. Will the tropical land biosphere dominate the climate-carbon cycle feedback during the twenty first century? Climate Dynamics, 29, 565-574, doi 10.1007/s00382-007-0247-8,  MPIOM: Marsland et al., 2003. The Max-Planck-Institute global ocean/sea ice model with orthogonal curvilinear coordinates. Ocean Modelling, 5, 91-127,  HAMOCC: http://www.mpimet.mpg.de/fileadmin/models/MPIOM/HAMOCC5.1_TECHNICAL_REPORT.pdf,",
-                    "initialization_method": 1,
-                    "physics_version": 1,
-                    "tracking_id": "d183f80c-e376-4721-9b3c-374e08df18e7",
-                    "product": "output",
-                    "experiment": "RCP8.5",
-                    "frequency": "6hr",
-                    "creation_date": "2011-07-14T17:28:04Z",
-                    "Conventions": "CF-1.4",
-                    "project_id": "CMIP5",
-                    "table_id": "Table 6hrPlev (27 April 2011) 00b465eee32d6d11a7e57f5cc8e067f8",
-                    "title": "MPI-ESM-LR model output prepared for CMIP5 RCP8.5",
-                    "parent_experiment": "historical",
-                    "modeling_realm": "atmos",
-                    "realization": 1,
-                    "cmor_version": "2.5.9"
-                }
-            },
-            {
-                "psl_6hrPlev_HadGEM2-ES_rcp85_r2i1p1_2093122106-2094122100": {
-                    "time": "UNLIMITED",
-                    "latitude": 145,
-                    "longitude": 192,
-                    "bnds": 2,
-                    "variables": {
-                        "time:units": "days since 1859-12-01",
-                        "time:calendar": "360_day",
-                        "time:axis": "T",
-                        "time:long_name": "time",
-                        "time:standard_name": "time",
-                        "lat:bounds": "lat_bnds",
-                        "lat:units": "degrees_north",
-                        "lat:axis": "Y",
-                        "lat:long_name": "latitude",
-                        "lat:standard_name": "latitude",
-                        "lon:bounds": "lon_bnds",
-                        "lon:units": "degrees_east",
-                        "lon:axis": "X",
-                        "lon:long_name": "longitude",
-                        "lon:standard_name": "longitude",
-                        "psl:standard_name": "air_pressure_at_sea_level",
-                        "psl:long_name": "Sea Level Pressure",
-                        "psl:units": "Pa",
-                        "psl:original_name": "mo: m01s16i222",
-                        "psl:cell_measures": "area: areacella",
-                        "psl:history": "2012-07-09T12:16:27Z altered by CMOR: replaced missing value flag (-1.07374e+09) with standard missing value (1e+20).",
-                        "psl:associated_files": "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_atmos_fx_HadGEM2-ES_rcp85_r0i0p0.nc areacella: areacella_fx_HadGEM2-ES_rcp85_r0i0p0.nc"
-                    },
-                    "institution": "Met Office Hadley Centre, Fitzroy Road, Exeter, Devon, EX1 3PB, UK, (http://www.metoffice.gov.uk)",
-                    "institute_id": "MOHC",
-                    "experiment_id": "rcp85",
-                    "source": "HadGEM2-ES (2009) atmosphere: HadGAM2 (N96L38), ocean: HadGOM2 (lat: 1.0-0.3 lon: 1.0 L40), land-surface/vegetation: MOSES2 and TRIFFID, tropospheric chemistry: UKCA, ocean biogeochemistry: diat-HadOCC",
-                    "model_id": "HadGEM2-ES",
-                    "forcing": "GHG, Oz, SA, LU, Sl, Vl, BC, OC, (GHG = CO2, N2O, CH4, CFCs)",
-                    "parent_experiment_id": "historical",
-                    "parent_experiment_rip": "r2i1p1",
-                    "branch_time": 52560,
-                    "contact": "chris.d.jones@metoffice.gov.uk, ron.kahana@metoffice.gov.uk",
-                    "history": "MOHC pp to CMOR/NetCDF convertor (version 1.10.4) 2012-07-09T12:16:17Z CMOR rewrote data to comply with CF standards and CMIP5 requirements.",
-                    "references": "Bellouin N. et al, (2007) Improved representation of aerosols for HadGEM2. Meteorological Office Hadley Centre, Technical Note 73, March 2007, Collins W.J.  et al, (2008) Evaluation of the HadGEM2 model. Meteorological Office Hadley Centre, Technical Note 74,, McLaren A.J. et al, (2006) Evaluation of the sea ice simulation in a new coupled atmosphere-ocean climate model. Journal of Geophysical Research - Oceans, American Geophysical Union, Vol. 111, C12014, doi:10.1029/2005JC003033., Stott P.A. et al, (2006) Transient climate simulations with the HadGEM1 climate model: Causes of past warming and future climate change. Journal of Climate, American Meteorological Society, Vol. 19, No. 12, pages 2763-2782., Ringer M.A. et al, (2006) The physical properties of the atmosphere in the new Hadley Centre Global Environmental Model, HadGEM1 - Part 2: Aspects of variability and regional climate. Journal of Climate, American Meteorological Society, Vol. 19, No. 7, pages 1302-1326.",
-                    "initialization_method": 1,
-                    "physics_version": 1,
-                    "tracking_id": "3f0dfaa6-125b-4dc0-8ce1-9cb054a9ed31",
-                    "mo_runid": "kaadf",
-                    "product": "output",
-                    "experiment": "RCP8.5",
-                    "frequency": "6hr",
-                    "creation_date": "2012-07-09T14:34:39Z",
-                    "Conventions": "CF-1.4",
-                    "project_id": "CMIP5",
-                    "table_id": "Table 6hrPlev (26 July 2011) cce5a250b13747b7af5d1cddcc61873d",
-                    "title": "HadGEM2-ES model output prepared for CMIP5 RCP8.5",
-                    "parent_experiment": "historical",
-                    "modeling_realm": "atmos",
-                    "realization": 2,
-                    "cmor_version": "2.7.1"
-                }
-            },
-            {
-                "ua_6hrLev_CanESM2_rcp85_r1i1p1_209301010000-209312311800": {
-                    "lev": 35,
-                    "bnds": 2,
-                    "time": "UNLIMITED",
-                    "latitude": 64,
-                    "longitude": 128,
-                    "variables": {
-                        "ap:long_name": "vertical coordinate formula term: ap(k)",
-                        "ap:units": "Pa",
-                        "ap_bnds:long_name": "vertical coordinate formula term: ap(k+1/2)",
-                        "ap_bnds:units": "Pa",
-                        "time:bounds": "time_bnds",
-                        "time:units": "days since 1850-1-1",
-                        "time:calendar": "365_day",
-                        "time:axis": "T",
-                        "time:long_name": "time",
-                        "time:standard_name": "time",
-                        "lev:bounds": "lev_bnds",
-                        "lev:units": "1",
-                        "lev:axis": "Z",
-                        "lev:positive": "down",
-                        "lev:long_name": "hybrid sigma pressure coordinate",
-                        "lev:standard_name": "atmosphere_hybrid_sigma_pressure_coordinate",
-                        "lev:formula": "p = ap + b*ps",
-                        "lev:formula_terms": "ap: ap b: b ps: ps",
-                        "lev_bnds:formula": "p = ap + b*ps",
-                        "lev_bnds:standard_name": "atmosphere_hybrid_sigma_pressure_coordinate",
-                        "lev_bnds:units": "1",
-                        "lev_bnds:formula_terms": "ap: ap_bnds b: b_bnds ps: ps",
-                        "b:long_name": "vertical coordinate formula term: b(k)",
-                        "b:original_units": "1",
-                        "b:history": "2011-04-02T05:52:58Z altered by CMOR: Converted units from '1' to ''.",
-                        "ps:standard_name": "surface_air_pressure",
-                        "ps:long_name": "Surface Air Pressure",
-                        "ps:comment": "surface pressure, not mean sea level pressure",
-                        "ps:units": "Pa",
-                        "ps:cell_measures": "area: areacella",
-                        "b_bnds:long_name": "vertical coordinate formula term: b(k+1/2)",
-                        "b_bnds:original_units": "1",
-                        "b_bnds:history": "2011-04-02T05:52:58Z altered by CMOR: Converted units from '1' to ''.",
-                        "lat:bounds": "lat_bnds",
-                        "lat:units": "degrees_north",
-                        "lat:axis": "Y",
-                        "lat:long_name": "latitude",
-                        "lat:standard_name": "latitude",
-                        "lon:bounds": "lon_bnds",
-                        "lon:units": "degrees_east",
-                        "lon:axis": "X",
-                        "lon:long_name": "longitude",
-                        "lon:standard_name": "longitude",
-                        "ua:standard_name": "eastward_wind",
-                        "ua:long_name": "Eastward Wind",
-                        "ua:units": "m s-1",
-                        "ua:original_name": "U",
-                        "ua:history": "2011-04-02T05:52:58Z altered by CMOR: replaced missing value flag (1e+38) with standard missing value (1e+20). 2011-04-02T05:52:58Z altered by CMOR: Inverted axis: lev.",
-                        "ua:associated_files": "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_atmos_fx_CanESM2_rcp85_r0i0p0.nc"
-                    },
-                    "institution": "CCCma (Canadian Centre for Climate Modelling and Analysis, Victoria, BC, Canada)",
-                    "institute_id": "CCCma",
-                    "experiment_id": "rcp85",
-                    "source": "CanESM2 2010 atmosphere: CanAM4 (AGCM15i, T63L35) ocean: CanOM4 (OGCM4.0, 256x192L40) and CMOC1.2 sea ice: CanSIM1 (Cavitating Fluid, T63 Gaussian Grid) land: CLASS2.7 and CTEM1",
-                    "model_id": "CanESM2",
-                    "forcing": "GHG,Oz,SA,BC,OC,LU,Sl (GHG includes CO2,CH4,N2O,CFC11,effective CFC12. Sl is the repeat of the 23rd solar cycle, years 1997-2008, after year 2008.)",
-                    "parent_experiment_id": "historical",
-                    "parent_experiment_rip": "r1i1p1",
-                    "branch_time": 56940,
-                    "contact": "cccma_info@ec.gc.ca",
-                    "references": "http://www.cccma.ec.gc.ca/models",
-                    "initialization_method": 1,
-                    "physics_version": 1,
-                    "tracking_id": "48df1522-3fda-4146-abd8-3fc1901dcc19",
-                    "branch_time_YMDH": "2006:01:01:00",
-                    "CCCma_runid": "IDR",
-                    "CCCma_parent_runid": "IGM",
-                    "CCCma_data_licence": "1) GRANT OF LICENCE - The Government of Canada (Environment Canada) is the owner of all intellectual property rights (including copyright) that may exist in this Data product. You (as The Licensee) are hereby granted a non-exclusive, non-assignable, non-transferable unrestricted licence to use this data product for any purpose including the right to share these data with others and to make value-added and derivative products from it. This licence is not a sale of any or all of the owner's rights. 2) NO WARRANTY - This Data product is provided as-is, it has not been designed or prepared to meet the Licensee's particular requirements. Environment Canada makes no warranty, either express or implied, including but not limited to, warranties of merchantability and fitness for a particular purpose. In no event will Environment Canada be liable for any indirect, special, consequential or other damages attributed to the Licensee's use of the Data product.",
-                    "product": "output",
-                    "experiment": "RCP8.5",
-                    "frequency": "6hr",
-                    "creation_date": "2011-04-02T05:52:58Z",
-                    "history": "Fri Oct  7 19:57:13 2011: ncap2 -c -O -S div_ap_100 orig_ua_6hrLev_CanESM2_rcp85_r1i1p1_209301010000-209312311800.nc ua_6hrLev_CanESM2_rcp85_r1i1p1_209301010000-209312311800.nc 2011-04-02T05:52:58Z CMOR rewrote data to comply with CF standards and CMIP5 requirements.",
-                    "Conventions": "CF-1.4",
-                    "project_id": "CMIP5",
-                    "table_id": "Table 6hrLev (28 March 2011) 581a244c03c6226a7b266fdcf0d501b7",
-                    "title": "CanESM2 model output prepared for CMIP5 RCP8.5",
-                    "parent_experiment": "historical",
-                    "modeling_realm": "atmos",
-                    "realization": 1,
-                    "cmor_version": "2.5.4",
-                    "nco_openmp_thread_number": 1
-                }
-            },
-            {
-                "va_6hrPlev_IPSL-CM5A-MR_rcp85_r1i1p1_2056010103-2065123121": {
-                    "time": "UNLIMITED",
-                    "plev": 3,
-                    "latitude": 143,
-                    "longitude": 144,
-                    "bnds": 2,
-                    "variables": {
-                        "time:units": "days since 2006-01-01 00:00:00",
-                        "time:calendar": "noleap",
-                        "time:axis": "T",
-                        "time:long_name": "time",
-                        "time:standard_name": "time",
-                        "plev:units": "Pa",
-                        "plev:axis": "Z",
-                        "plev:positive": "down",
-                        "plev:long_name": "pressure",
-                        "plev:standard_name": "air_pressure",
-                        "lat:bounds": "lat_bnds",
-                        "lat:units": "degrees_north",
-                        "lat:axis": "Y",
-                        "lat:long_name": "latitude",
-                        "lat:standard_name": "latitude",
-                        "lon:bounds": "lon_bnds",
-                        "lon:units": "degrees_east",
-                        "lon:axis": "X",
-                        "lon:long_name": "longitude",
-                        "lon:standard_name": "longitude",
-                        "va:standard_name": "northward_wind",
-                        "va:long_name": "Northward Wind",
-                        "va:units": "m s-1",
-                        "va:original_name": "va",
-                        "va:history": "2011-11-05T14:03:28Z altered by CMOR: replaced missing value flag (9.96921e+36) with standard missing value (1e+20). 2011-11-05T14:03:57Z altered by CMOR: Inverted axis: lat.",
-                        "va:associated_files": "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_atmos_fx_IPSL-CM5A-MR_rcp85_r0i0p0.nc"
-                    },
-                    "institution": "IPSL (Institut Pierre Simon Laplace, Paris, France)",
-                    "institute_id": "IPSL",
-                    "experiment_id": "rcp85",
-                    "source": "IPSL-CM5A-MR (2010) : atmos : LMDZ4 (LMDZ4_v5, 144x143x39), ocean : ORCA2 (NEMOV2_3, 2x2L31), seaIce : LIM2 (NEMOV2_3), ocnBgchem : PISCES (NEMOV2_3), land : ORCHIDEE (orchidee_1_9_4_AR5)",
-                    "model_id": "IPSL-CM5A-MR",
-                    "forcing": "Nat,Ant,GHG,SA,Oz,LU,SS,Ds,BC,MD,OC,AA",
-                    "parent_experiment_id": "historical",
-                    "parent_experiment_rip": "r1i1p1",
-                    "branch_time": 2005,
-                    "contact": "ipsl-cmip5 _at_ ipsl.jussieu.fr Data manager : Sebastien Denvil",
-                    "comment": "This 21th century simulation has been forced by prescribed concentration following the rcp 8.5 scenario.",
-                    "references": "Model documentation and further reference available here : http://icmc.ipsl.fr",
-                    "initialization_method": 1,
-                    "physics_version": 1,
-                    "tracking_id": "24d0885e-46e6-44d3-8296-2e2a72d1fd59",
-                    "product": "output",
-                    "experiment": "RCP8.5",
-                    "frequency": "6hr",
-                    "creation_date": "2011-11-05T14:03:57Z",
-                    "history": "2011-11-05T14:03:57Z CMOR rewrote data to comply with CF standards and CMIP5 requirements.",
-                    "Conventions": "CF-1.4",
-                    "project_id": "CMIP5",
-                    "table_id": "Table 6hrPlev (31 January 2011) 2486865d573b5e4add809e0c04e17345",
-                    "title": "IPSL-CM5A-MR model output prepared for CMIP5 RCP8.5",
-                    "parent_experiment": "historical",
-                    "modeling_realm": "atmos",
-                    "realization": 1,
-                    "cmor_version": "2.7.1"
-                }
-            },
-            {
-                "ps_6hrLev_GISS-E2-R_rcp85_r2i1p3_206601010600-207101010000": {
-                    "time": "UNLIMITED",
-                    "latitude": 90,
-                    "longitude": 144,
-                    "bnds": 2,
-                    "variables": {
-                        "time:bounds": "time_bnds",
-                        "time:units": "days since 2066-1-1",
-                        "time:calendar": "365_day",
-                        "time:axis": "T",
-                        "time:long_name": "time",
-                        "time:standard_name": "time",
-                        "lat:bounds": "lat_bnds",
-                        "lat:units": "degrees_north",
-                        "lat:axis": "Y",
-                        "lat:long_name": "latitude",
-                        "lat:standard_name": "latitude",
-                        "lon:bounds": "lon_bnds",
-                        "lon:units": "degrees_east",
-                        "lon:axis": "X",
-                        "lon:long_name": "longitude",
-                        "lon:standard_name": "longitude",
-                        "ps:standard_name": "surface_air_pressure",
-                        "ps:long_name": "Surface Air Pressure",
-                        "ps:comment": "surface pressure, not mean sea level pressure",
-                        "ps:units": "Pa",
-                        "ps:original_name": "dummy",
-                        "ps:cell_measures": "area: areacella",
-                        "ps:history": "2014-01-02T15:46:04Z altered by CMOR: replaced missing value flag (-1e+30) with standard missing value (1e+20).",
-                        "ps:associated_files": "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_atmos_fx_GISS-E2-R_rcp85_r0i0p0.nc areacella: areacella_fx_GISS-E2-R_rcp85_r0i0p0.nc"
-                    },
-                    "institution": "NASA/GISS (Goddard Institute for Space Studies) New York, NY",
-                    "institute_id": "NASA-GISS",
-                    "experiment_id": "rcp85",
-                    "source": "GISS-E2-R-E134TcadiRCP85bF40oQ32 Atmosphere: GISS-E2, Ocean: R",
-                    "model_id": "GISS-E2-R",
-                    "forcing": "GHG, LU, Sl, BC, OC, SA, Oz (also includes BC on snow - Nitrate aerosols - interactive CH4)",
-                    "parent_experiment_id": "historical",
-                    "parent_experiment_rip": "r2i1p3",
-                    "branch_time": 2006,
-                    "contact": "Kenneth Lo (cdkkl@giss.nasa.gov)",
-                    "references": "http://data.giss.nasa.gov/modelE/ar5",
-                    "initialization_method": 1,
-                    "physics_version": 3,
-                    "tracking_id": "894e03dd-fba8-4826-b3fb-c1898b071984",
-                    "product": "output",
-                    "experiment": "RCP8.5",
-                    "frequency": "6hr",
-                    "creation_date": "2014-01-02T15:46:04Z",
-                    "history": "2014-01-02T15:46:04Z CMOR rewrote data to comply with CF standards and CMIP5 requirements.",
-                    "Conventions": "CF-1.4",
-                    "project_id": "CMIP5",
-                    "table_id": "Table 6hrLev (27 April 2011) cf08abb8c40d2c5d1c95297b569db0e6",
-                    "title": "GISS-E2-R model output prepared for CMIP5 RCP8.5",
-                    "parent_experiment": "historical",
-                    "modeling_realm": "atmos",
-                    "realization": 2,
-                    "cmor_version": "2.5.7"
-                }
-            },
-            {
-                "ua_6hrPlev_CSIRO-Mk3-6-0_rcp85_r9i1p1_210001010600-210101010000": {
-                    "time": "UNLIMITED",
-                    "plev": 3,
-                    "latitude": 96,
-                    "longitude": 192,
-                    "bnds": 2,
-                    "variables": {
-                        "time:units": "days since 1850-01-01 00:00:00",
-                        "time:calendar": "noleap",
-                        "time:axis": "T",
-                        "time:long_name": "time",
-                        "time:standard_name": "time",
-                        "plev:units": "Pa",
-                        "plev:axis": "Z",
-                        "plev:positive": "down",
-                        "plev:long_name": "pressure",
-                        "plev:standard_name": "air_pressure",
-                        "lat:bounds": "lat_bnds",
-                        "lat:units": "degrees_north",
-                        "lat:axis": "Y",
-                        "lat:long_name": "latitude",
-                        "lat:standard_name": "latitude",
-                        "lon:bounds": "lon_bnds",
-                        "lon:units": "degrees_east",
-                        "lon:axis": "X",
-                        "lon:long_name": "longitude",
-                        "lon:standard_name": "longitude",
-                        "ua:standard_name": "eastward_wind",
-                        "ua:long_name": "Eastward Wind",
-                        "ua:units": "m s-1",
-                        "ua:original_name": "u01_u18",
-                        "ua:history": "2012-06-06T07:03:10Z altered by CMOR: replaced missing value flag (-7.77778e+06) with standard missing value (1e+20).",
-                        "ua:associated_files": "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_atmos_fx_CSIRO-Mk3-6-0_rcp85_r0i0p0.nc"
-                    },
-                    "institution": "Australian Commonwealth Scientific and Industrial Research Organization (CSIRO) Marine and Atmospheric Research (Melbourne, Australia) in collaboration with the Queensland Climate Change Centre of Excellence (QCCCE) (Brisbane, Australia)",
-                    "institute_id": "CSIRO-QCCCE",
-                    "experiment_id": "rcp85",
-                    "source": "CSIRO-Mk3-6-0 2010 atmosphere: AGCM v7.3.8 (T63 spectral, 1.875 degrees EW x approx. 1.875 degrees NS, 18 levels), ocean: GFDL MOM2.2 (1.875 degrees EW x approx. 0.9375 degrees NS, 31 levels)",
-                    "model_id": "CSIRO-Mk3-6-0",
-                    "forcing": "Ant,Nat (RCP 8.5)",
-                    "parent_experiment_id": "historical",
-                    "parent_experiment_rip": "r9i1p1",
-                    "branch_time": 56940,
-                    "contact": "Project leaders: Stephen Jeffrey (Stephen.Jeffrey@qld.gov.au) & Leon Rotstayn (Leon.Rotstayn@csiro.au). Project team: Mark Collier (Mark.Collier@csiro.au: diagnostics & post-processing), Stacey Dravitzki (Stacey.Dravitzki@csiro.au: post-processing), Carlo Hamalainen (Carlo.Hamalainen@qld.gov.au: post-processing), Steve Jeffrey (Stephen.Jeffrey@qld.gov.au: modeling & post-processing), Chris Moeseneder (Chris.Moeseneder@csiro.au: post-processing), Leon Rotstayn (Leon.Rotstayn@csiro.au: modeling & atmos. physics), Jozef Syktus (Jozef.Syktus@qld.gov.au: model evaluation), Kenneth Wong (Kenneth.Wong@qld.gov.au: data management), Contributors: Martin Dix (Martin.Dix@csiro.au: tech. support), Hal Gordon (Hal.Gordon@csiro.au: atmos. dynamics), Eva Kowalczyk (Eva.Kowalczyk@csiro.au: land-surface), Siobhan O'Farrell (Siobhan.OFarrell@csiro.au: ocean & sea-ice)",
-                    "history": "Forcing datasets for the relevant month/year are used where available. Exceptions are: ozone data from 2099 are used for the period 2100-2300, aerosol emissions (and their impact on snow albedo) from 2100 are used for the period 2101-2300.Model level data was vertically interpolated to prescribed pressure levels using linear interpolation. The missing value was assigned to locations where the pressure surface is underground. 2012-06-06T07:03:10Z CMOR rewrote data to comply with CF standards and CMIP5 requirements.",
-                    "comment": "Model output post-processed by the CSIRO-QCCCE CMIP5 Data post-processor for the IPCC Fifth Assessment.",
-                    "references": "a) Rotstayn, L., Collier, M., Dix, M., Feng, Y., Gordon, H., O'Farrell, S., Smith, I. and Syktus, J. 2010. Improved simulation of Australian climate and ENSO-related climate variability in a GCM with an interactive aerosol treatment. Int. J. Climatology, vol 30(7), pp1067-1088, DOI 10.1002/joc.1952 b) Please refer to online documentation at: http://cmip-pcmdi.llnl.gov/cmip5/",
-                    "initialization_method": 1,
-                    "physics_version": 1,
-                    "tracking_id": "730ac35f-ac55-45c7-9abf-940f22928165",
-                    "version_number": "v20120323",
-                    "product": "output",
-                    "experiment": "RCP8.5",
-                    "frequency": "6hr",
-                    "creation_date": "2012-06-06T07:03:10Z",
-                    "Conventions": "CF-1.4",
-                    "project_id": "CMIP5",
-                    "table_id": "Table 6hrPlev (27 April 2011) 34ae2c93d41ed0ba4f8eeae8ccf1eaa4",
-                    "title": "CSIRO-Mk3-6-0 model output prepared for CMIP5 RCP8.5",
-                    "parent_experiment": "historical",
-                    "modeling_realm": "atmos",
-                    "realization": 9,
-                    "cmor_version": "2.6.0"
-                }
-            },
-            {
-                "psl_6hrPlev_NorESM1-M_rcp85_r1i1p1_2006010100-2015123118": {
-                    "time": "UNLIMITED",
-                    "latitude": 96,
-                    "longitude": 144,
-                    "bnds": 2,
-                    "variables": {
-                        "time:units": "days since 2006-01-01 00:00:00",
-                        "time:calendar": "noleap",
-                        "time:axis": "T",
-                        "time:long_name": "time",
-                        "time:standard_name": "time",
-                        "lat:bounds": "lat_bnds",
-                        "lat:units": "degrees_north",
-                        "lat:axis": "Y",
-                        "lat:long_name": "latitude",
-                        "lat:standard_name": "latitude",
-                        "lon:bounds": "lon_bnds",
-                        "lon:units": "degrees_east",
-                        "lon:axis": "X",
-                        "lon:long_name": "longitude",
-                        "lon:standard_name": "longitude",
-                        "psl:standard_name": "air_pressure_at_sea_level",
-                        "psl:long_name": "Sea Level Pressure",
-                        "psl:units": "Pa",
-                        "psl:original_name": "PSL",
-                        "psl:cell_measures": "area: areacella",
-                        "psl:history": "2011-06-14T14:02:06Z altered by CMOR: replaced missing value flag (1e+20) with standard missing value (1e+20). 2011-06-14T14:02:07Z altered by CMOR: Converted type from 'd' to 'f'.",
-                        "psl:associated_files": "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_atmos_fx_NorESM1-M_rcp85_r0i0p0.nc areacella: areacella_fx_NorESM1-M_rcp85_r0i0p0.nc"
-                    },
-                    "institution": "Norwegian Climate Centre",
-                    "institute_id": "NCC",
-                    "experiment_id": "rcp85",
-                    "source": "NorESM1-M 2011  atmosphere: CAM-Oslo (CAM4-Oslo-noresm-ver1_cmip5-r112, f19L26),  ocean: MICOM (MICOM-noresm-ver1_cmip5-r112, gx1v6L53),  sea ice: CICE (CICE4-noresm-ver1_cmip5-r112),  land: CLM (CLM4-noresm-ver1_cmip5-r112)",
-                    "model_id": "NorESM1-M",
-                    "forcing": "GHG, SA, Oz, Sl, BC, OC",
-                    "parent_experiment_id": "historical",
-                    "parent_experiment_rip": "r1i1p1",
-                    "branch_time": 56940,
-                    "contact": "Please send any requests or bug reports to noresm-ncc@met.no.",
-                    "initialization_method": 1,
-                    "physics_version": 1,
-                    "tracking_id": "ce2a6266-481f-412d-958e-c8b0d3cde60a",
-                    "product": "output",
-                    "experiment": "RCP8.5",
-                    "frequency": "6hr",
-                    "creation_date": "2011-06-14T14:02:07Z",
-                    "history": "2011-06-14T14:02:07Z CMOR rewrote data to comply with CF standards and CMIP5 requirements.",
-                    "Conventions": "CF-1.4",
-                    "project_id": "CMIP5",
-                    "table_id": "Table 6hrPlev (27 April 2011) 00b465eee32d6d11a7e57f5cc8e067f8",
-                    "title": "NorESM1-M model output prepared for CMIP5 RCP8.5",
-                    "parent_experiment": "historical",
-                    "modeling_realm": "atmos",
-                    "realization": 1,
-                    "cmor_version": "2.6.0"
-                }
-            },
-            {
-                "va_6hrLev_CCSM4_rcp85_r6i1p1_2009040100-2009063018": {
-                    "time": "UNLIMITED",
-                    "lev": 26,
-                    "latitude": 192,
-                    "longitude": 288,
-                    "bnds": 2,
-                    "variables": {
-                        "time:units": "days since 2005-01-01 00:00:00",
-                        "time:calendar": "noleap",
-                        "time:axis": "T",
-                        "time:long_name": "time",
-                        "time:standard_name": "time",
-                        "lev:bounds": "lev_bnds",
-                        "lev:units": "1",
-                        "lev:axis": "Z",
-                        "lev:positive": "down",
-                        "lev:long_name": "hybrid sigma pressure coordinate",
-                        "lev:standard_name": "atmosphere_hybrid_sigma_pressure_coordinate",
-                        "lev:formula": "p = a*p0 + b*ps",
-                        "lev:formula_terms": "p0: p0 a: a b: b ps: ps",
-                        "lev_bnds:formula": "p = a*p0 + b*ps",
-                        "lev_bnds:standard_name": "atmosphere_hybrid_sigma_pressure_coordinate",
-                        "lev_bnds:units": "1",
-                        "lev_bnds:formula_terms": "p0: p0 a: a_bnds b: b_bnds ps: ps",
-                        "p0:long_name": "vertical coordinate formula term: reference pressure",
-                        "p0:units": "Pa",
-                        "a:long_name": "vertical coordinate formula term: a(k)",
-                        "b:long_name": "vertical coordinate formula term: b(k)",
-                        "ps:standard_name": "surface_air_pressure",
-                        "ps:long_name": "Surface Air Pressure",
-                        "ps:comment": "surface pressure, not mean sea level pressure",
-                        "ps:units": "Pa",
-                        "ps:cell_measures": "area: areacella",
-                        "a_bnds:long_name": "vertical coordinate formula term: a(k+1/2)",
-                        "b_bnds:long_name": "vertical coordinate formula term: b(k+1/2)",
-                        "lat:bounds": "lat_bnds",
-                        "lat:units": "degrees_north",
-                        "lat:axis": "Y",
-                        "lat:long_name": "latitude",
-                        "lat:standard_name": "latitude",
-                        "lon:bounds": "lon_bnds",
-                        "lon:units": "degrees_east",
-                        "lon:axis": "X",
-                        "lon:long_name": "longitude",
-                        "lon:standard_name": "longitude",
-                        "va:standard_name": "northward_wind",
-                        "va:long_name": "Northward Wind",
-                        "va:units": "m s-1",
-                        "va:original_name": "V,PS",
-                        "va:comment": "V no change",
-                        "va:original_units": "m/s",
-                        "va:history": "2012-05-08T23:56:28Z altered by CMOR: Converted units from 'ms' to 'm s-1'. 2012-05-08T23:56:28Z altered by CMOR: replaced missing value flag (-1e+32) with standard missing value (1e+20). 2012-05-08T23:57:40Z altered by CMOR: Inverted axis: lev. 2012-05-09T00:01:05Z altered by CMOR: Inverted axis: lev. 2012-05-09T00:04:17Z altered by CMOR: Inverted axis: lev. 2012-05-09T00:07:32Z altered by CMOR: Inverted axis: lev. 2012-05-09T00:12:00Z altered by CMOR: Inverted axis: lev. 2012-05-09T00:15:10Z altered by CMOR: Inverted axis: lev. 2012-05-09T00:18:30Z altered by CMOR: Inverted axis: lev. 2012-05-09T00:21:43Z altered by CMOR: Inverted axis: lev. 2012-05-09T00:26:04Z altered by CMOR: Inverted axis: lev. 2012-05-09T00:29:15Z altered by CMOR: Inverted axis: lev. 2012-05-09T00:32:19Z altered by CMOR: Inverted axis: lev. 2012-05-09T00:35:19Z altered by CMOR: Inverted axis: lev. 2012-05-09T00:40:07Z altered by CMOR: Inverted axis: lev. 2012-05-09T00:43:50Z altered by CMOR: Inverted axis: lev.",
-                        "va:associated_files": "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_atmos_fx_CCSM4_rcp85_r0i0p0.nc"
-                    },
-                    "institution": "NCAR (National Center for Atmospheric Research) Boulder, CO, USA",
-                    "institute_id": "NCAR",
-                    "experiment_id": "rcp85",
-                    "source": "CCSM4",
-                    "model_id": "CCSM4",
-                    "forcing": "Sl GHG SS Ds SA BC MD OC Oz AA",
-                    "parent_experiment_id": "historical",
-                    "parent_experiment_rip": "r6i1p1",
-                    "branch_time": 20,
-                    "contact": "cesm_data@ucar.edu",
-                    "comment": "CESM home page: http://www.cesm.ucar.edu",
-                    "references": "Gent P. R., et.al. 2011: The Community Climate System Model version 4. J. Climate, doi: 10.1175/2011JCLI4083.1",
-                    "initialization_method": 1,
-                    "physics_version": 1,
-                    "tracking_id": "c8d8cde8-0e31-4a17-8501-51393743d5c1",
-                    "acknowledgements": "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. Computing resources were provided by the Climate Simulation Laboratory at the NCAR Computational and Information Systems Laboratory (CISL), sponsored by the National Science Foundation and other agencies.",
-                    "cesm_casename": "b40.rcp8_5.1deg.007",
-                    "cesm_repotag": "ccsm4_0_beta53",
-                    "cesm_compset": "BRCP85CN",
-                    "resolution": "f09_g16 (0.9x1.25_gx1v6)",
-                    "forcing_note": "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information",
-                    "processed_by": "strandwg on mirage2 at 20120508  -175628.897",
-                    "processing_code_information": "Last Changed Rev: 748 Last Changed Date: 2012-05-08 15:52:41 -0600 (Tue, 08 May 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d",
-                    "product": "output",
-                    "experiment": "RCP8.5",
-                    "frequency": "6hr",
-                    "creation_date": "2012-05-09T00:43:50Z",
-                    "history": "2012-05-08T23:57:40Z CMOR rewrote data to comply with CF standards and CMIP5 requirements.",
-                    "Conventions": "CF-1.4",
-                    "project_id": "CMIP5",
-                    "table_id": "Table 6hrLev (12 January 2012) 3c5c744334546e0d80549512c0c61cfe",
-                    "title": "CCSM4 model output prepared for CMIP5 RCP8.5",
-                    "parent_experiment": "historical",
-                    "modeling_realm": "atmos",
-                    "realization": 6,
-                    "cmor_version": "2.8.1"
-                }
-            }
-        ]
-    }
-}
diff --git a/client/catalog/search_catagories.json b/client/catalog/search_catagories.json
deleted file mode 100644
index 8d902ad..0000000
--- a/client/catalog/search_catagories.json
+++ /dev/null
@@ -1,539 +0,0 @@
-{
-    "SearchCatagories": {
-        "activity": [
-            "CMIP5"
-        ],
-        "product": [
-            "output1",
-            "output2",
-            "restricted",
-            "unsolicited"
-        ],
-        "organization": [
-            "BCC",
-            "BNU",
-            "CCCMA",
-            "CMCC",
-            "CNRM-CERFACS",
-            "COLA-CFS",
-            "CSIRO-BOM",
-            "CSIRO-QCCCE",
-            "FIO",
-            "ICHEC",
-            "INM",
-            "INPE",
-            "IPSL",
-            "LASG-CESS",
-            "LASG-IAP",
-            "MIROC",
-            "MOHC",
-            "MPI-M",
-            "MRI",
-            "NASA-GISS",
-            "NASA-GMAO",
-            "NCAR",
-            "NCC",
-            "NCEP",
-            "NICAM",
-            "NIMR-KMA",
-            "NOAA-GFDL",
-            "NSF-DOE-NCAR",
-            "SMHI",
-            "UNSW"
-        ],
-        "model": [
-            "ACCESS1.0",
-            "ACCESS1.3",
-            "BCC - CSM1.1",
-            "BCC - CSM1.1(m)",
-            "BNU - ESM",
-            "CCSM4",
-            "CESM1(BGC)",
-            "CESM1(CAM5)",
-            "CESM1(CAM5.1, FV2)",
-            "CESM1(FASTCHEM)",
-            "CESM1(WACCM)",
-            "CFSv2 - 2011",
-            "CMCC - CESM",
-            "CMCC - CM",
-            "CMCC - CMS",
-            " CNRM - CM5",
-            "CNRM - CM5 - 2",
-            "CSIRO - Mk3.6.0",
-            "CSIRO - Mk3L - 1 - 2",
-            "CanAM4",
-            "CanCM4",
-            "CanESM2",
-            "EC - EARTH",
-            "FGOALS - g2",
-            "FGOALS - gl",
-            "FGOALS - s2",
-            "FIO - ESM",
-            "GEOS - 5",
-            "GFDL - CM2.1",
-            "GFDL - CM3",
-            "GFDL - ESM2G",
-            "GFDL - ESM2M",
-            "GFDL - HIRAM - C180",
-            "GFDL - HIRAM - C360",
-            "GISS - E2 - H",
-            "GISS - E2 - H - CC",
-            "GISS - E2 - R",
-            "GISS - E2 - R - CC",
-            "HadCM3",
-            "HadGEM2 - A",
-            "HadGEM2 - AO",
-            "HadGEM2 - CC ",
-            "HadGEM2 - ES",
-            "INM - CM4",
-            "IPSL - CM5A - LR",
-            "IPSL - CM5A - MR",
-            "IPSL - CM5B - LR",
-            "MIROC - ESM",
-            "MIROC - ESM - CHEM",
-            "MIROC4h",
-            "MIROC5",
-            "MPI - ESM - LR",
-            "MPI - ESM - MR",
-            "MPI - ESM - P",
-            "MRI - AGCM3.2H",
-            "MRI - AGCM3.2S",
-            "MRI - CGCM3",
-            "MRI - ESM1",
-            "NICAM - 09",
-            "NorESM1 - M",
-            "NorESM1 - ME"
-        ],
-        "experiment": [
-            "abrupt4xCO2",
-            "amip",
-            "amip4K",
-            "amip4xCO2",
-            "amipFuture",
-            "aqua4K",
-            "aqua4xCO2",
-            "aquaControl",
-            "decadal1959",
-            "decadal1960",
-            "decadal1961",
-            "decadal1962",
-            "decadal1963",
-            "decadal1964",
-            "decadal1965",
-            "decadal1966",
-            "decadal1967",
-            "decadal1968",
-            "decadal1969",
-            "decadal1970",
-            "decadal1971",
-            "decadal1972",
-            "decadal1973",
-            "decadal1974",
-            "decadal1975",
-            "decadal1976",
-            "decadal1977",
-            "decadal1978",
-            "decadal1979",
-            "decadal1980",
-            "decadal1981",
-            "decadal1982",
-            "decadal1983",
-            "decadal1984",
-            "decadal1985",
-            "decadal1986",
-            "decadal1987",
-            "decadal1988",
-            "decadal1989",
-            "decadal1990",
-            "decadal1991",
-            "decadal1992",
-            "decadal1993",
-            "decadal1994",
-            "decadal1995",
-            "decadal1996",
-            "decadal1997",
-            "decadal1998",
-            "decadal1999",
-            "decadal2000",
-            "decadal2001",
-            "decadal2002",
-            "decadal2003",
-            "decadal2004",
-            "decadal2005",
-            "decadal2006",
-            "decadal2007",
-            "decadal2008",
-            "decadal2009",
-            "decadal2010",
-            " decadal2011",
-            "decadal2012",
-            "esmControl",
-            "esmFdbk1",
-            "esmFdbk2",
-            "esmFixClim1",
-            "esmFixClim2",
-            "esmHistorical",
-            "esmrcp85",
-            "historical",
-            "historicalExt",
-            "historicalGHG",
-            "historicalMisc",
-            "historicalNat",
-            "lgm",
-            "midHolocene",
-            "noVolc1960",
-            "noVolc1965",
-            "noVolc1970",
-            "noVolc1975",
-            "noVolc1985",
-            "noVolc1990",
-            "noVolc1995",
-            "noVolc2000",
-            "noVolc2005",
-            "past1000",
-            "piControl",
-            "rcp26",
-            "rcp45",
-            "rcp60",
-            "rcp85",
-            "sst2030",
-            "sst2090",
-            "sst2090rcp45",
-            "sstClim",
-            "sstClim4xCO2",
-            "sstClimAerosol",
-            "sstClimSulfate",
-            "volcIn2010"
-        ],
-        "frequency": [
-            "3hr",
-            "6hr",
-            "day",
-            "fx",
-            "mon",
-            "monClim",
-            "subhr",
-            "yr"
-        ],
-        "modeling_realm": [
-            "aerosol",
-            "atmos",
-            "land",
-            "landIce",
-            "ocean",
-            "seaIce"
-        ],
-        "variable_name": [
-            "agessc",
-            "albisccp",
-            "areacella",
-            "areacello",
-            "bmelt",
-            "burntArea",
-            "cCwd",
-            "cLeaf",
-            "cLitter",
-            "cMisc",
-            "cProduct",
-            "cRoot",
-            "cSoil",
-            "cSoilFast",
-            "cSoilMedium",
-            "cSoilSlow",
-            "cVeg",
-            "cWood",
-            "ccb",
-            "cct",
-            "cfc11",
-            "ch4",
-            "chl",
-            "chlcalc",
-            "chldiat",
-            "chldiaz",
-            "chlpico",
-            "ci",
-            "cl",
-            "clcalipso",
-            "clhcalipso",
-            "cli",
-            "clic",
-            "clis",
-            "clisccp",
-            "clivi",
-            "cllcalipso",
-            "clmcalipso",
-            "clt",
-            "cltcalipso",
-            "cltisccp",
-            "clw",
-            "clwc",
-            "clws",
-            "clwvi",
-            "co2",
-            "co3",
-            "co3satarag",
-            "co3satcalc",
-            "deptho",
-            "dfe",
-            "dissic",
-            "dissoc",
-            "divice",
-            "dpco2",
-            "epc100",
-            "epcalc100",
-            "epfe100",
-            "epsi100",
-            "evap",
-            "evspsbl",
-            "expc",
-            "expcalc",
-            "expcfe",
-            "expsi",
-            "fFire",
-            "fLitterSoil",
-            "fLuc",
-            "fVegLitter",
-            "fbddtalk",
-            "fbddtdic",
-            "fbddtdife",
-            "fbddtdin",
-            "fbddtdip",
-            "fbddtdisi",
-            "fddtalk",
-            "fddtdic",
-            "fddtdife",
-            "fddtdin",
-            "fddtdip",
-            "fddtdisi",
-            "fgco2",
-            "fgo2",
-            "frn",
-            "gpp",
-            "grCongel",
-            "grFrazil",
-            "h2o",
-            "hflssi",
-            "hfss",
-            "hfssi",
-            "hur",
-            "hurs",
-            "hus",
-            "huss",
-            "intdic",
-            "intpbsi",
-            "intpcalc",
-            "intpcalcite",
-            "intpdiat",
-            "intpdiaz",
-            "intpn2",
-            "intpnitrate",
-            "intpp",
-            "intppico",
-            "lai",
-            "lwsnl",
-            "masso",
-            "mc",
-            "mrfso",
-            "mrlsl",
-            "mrro",
-            "mrros",
-            "mrso",
-            "mrsofc",
-            "mrsos",
-            "msftbarot",
-            "msftmyz",
-            "msftmyzba",
-            "n2o",
-            "nbp",
-            "nh4",
-            "no3",
-            "npp",
-            "nppLeaf",
-            "nppRoot",
-            "nppWood",
-            "o2",
-            "o2min",
-            "od550aer",
-            "omlmax",
-            "orog",
-            "ph",
-            "phyc",
-            "phyfe",
-            "phyn",
-            "phyp",
-            "phypico",
-            "physi",
-            "po4",
-            "pr",
-            "prc",
-            "prsn",
-            "prveg",
-            "prw",
-            "ps",
-            "psl",
-            "rGrowth",
-            "rMaint",
-            "ra",
-            "reffclic",
-            "reffclis",
-            "reffclwc",
-            "reffclws",
-            "reffrains",
-            "rlds",
-            "rldscs",
-            "rldssi",
-            "rlus",
-            "rlussi",
-            "rlut",
-            "rlutcs",
-            "rsds",
-            "rsdscs",
-            "rsdssi",
-            "rsdt",
-            "rsntds",
-            "rsus",
-            "rsuscs",
-            "rsut",
-            "rsutcs",
-            "rtmt",
-            "sci",
-            "sfcWind",
-            "sftgif",
-            "sftlf",
-            "sftof",
-            "si",
-            "sic",
-            "sit",
-            "snc",
-            "snoToIce",
-            "snomelt",
-            "snw",
-            "so",
-            "soga",
-            "sootsn",
-            "sos",
-            "spco2",
-            "strairx",
-            "strairy",
-            "streng",
-            "strocnx",
-            "strocny",
-            "ta",
-            "ta700",
-            "talk",
-            "tas",
-            "tasmax",
-            "tasmin",
-            "tauu",
-            "tauuo",
-            "tauv",
-            "tauvo",
-            "thetao",
-            "thetaoga",
-            "thkcello",
-            "tmelt",
-            "tnhus",
-            "tnhusa",
-            "tnhusc",
-            "tnhusd",
-            "tnhusmp",
-            "tnhusscpbl",
-            "tnt",
-            "tntc",
-            "tntmp",
-            "tntr",
-            "tntscpbl",
-            "tos",
-            "tossq",
-            "tran",
-            "tro3",
-            "ts",
-            "tsice",
-            "tsl",
-            "ua",
-            "umo",
-            "uo",
-            "usi",
-            "va",
-            "vmo",
-            "vo",
-            "volcello",
-            "vsi",
-            "wap",
-            "wmo",
-            "wmosq",
-            "zg",
-            "zo2min",
-            "zooc",
-            "zos",
-            "zosga",
-            "zossga",
-            "zossq",
-            "zostoga",
-            "zsatarag",
-            "zsatcalc"
-        ],
-        "ensemble": [
-            "r0i0p0",
-            "r10i1p1",
-            "r10i2p1",
-            "r1i1p1",
-            "r1i1p10",
-            "r1i1p11",
-            "r1i1p12",
-            "r1i1p13",
-            "r1i1p14",
-            "r1i1p15",
-            "r1i1p16",
-            "r1i1p17",
-            "r1i1p2",
-            "r1i1p3",
-            "r1i2p1",
-            "r1i2p2",
-            "r2i1p1",
-            "r2i1p10",
-            "r2i1p11",
-            "r2i1p12",
-            "r2i1p13",
-            "r2i1p14",
-            "r2i1p16",
-            "r2i1p17",
-            "r2i2p1",
-            "r3i1p1",
-            "r3i1p10",
-            "r3i1p11",
-            "r3i1p13",
-            "r3i1p14",
-            "r3i1p16",
-            "r3i1p17",
-            "r3i2p1",
-            "r4i1p1",
-            "r4i1p10",
-            "r4i1p11",
-            "r4i1p12",
-            "r4i1p14",
-            "r4i1p15",
-            "r4i1p16",
-            "r4i1p17",
-            "r4i2p1",
-            "r5i1p1",
-            "r5i2p1",
-            "r6i1p1",
-            "r6i1p10",
-            "r6i1p11",
-            "r6i1p12",
-            "r6i1p13",
-            "r6i1p14",
-            "r6i1p15",
-            "r6i1p16",
-            "r6i1p17",
-            "r6i2p1",
-            "r7i1p1",
-            "r7i2p1",
-            "r8i1p1",
-            "r8i2p1",
-            "r9i1p1",
-            "r9i2p1"
-        ]
-    }
-}
\ No newline at end of file
diff --git a/client/gulpfile.js b/client/gulpfile.js
new file mode 100644
index 0000000..53e2f10
--- /dev/null
+++ b/client/gulpfile.js
@@ -0,0 +1,6 @@
+var gulp = require('gulp');
+
+gulp.task('default, function() {
+
+});
+
diff --git a/client/package.json b/client/package.json
new file mode 100644
index 0000000..f15889c
--- /dev/null
+++ b/client/package.json
@@ -0,0 +1,20 @@
+{
+  "name": "ndn-atmos",
+  "description": "A frontend for the ndn-atmos project",
+  "version": "2.1.0",
+  "license": "MIT",
+  "author": {
+    "name": "Tyler Scott",
+    "email": "tyduptyler13@gmail.com",
+    "url": "myuplay.com"
+  },
+  "contributors": [],
+  "scripts": {
+    "build": "gulp",
+    "host": "http-server -c-1 -p 5555 -a ::1; x-www-browser http://localhost:5555/catalog"
+  },
+  "devDependencies": {
+    "gulp": "^3.9.0",
+    "http-server": "^0.8.0"
+  }
+}