Index: imaps-frontend/node_modules/utila/lib/object.js
===================================================================
--- imaps-frontend/node_modules/utila/lib/object.js	(revision 79a03170cdde4e801d12257ee86723774970427b)
+++ imaps-frontend/node_modules/utila/lib/object.js	(revision 79a03170cdde4e801d12257ee86723774970427b)
@@ -0,0 +1,158 @@
+// Generated by CoffeeScript 1.6.3
+var object, _common,
+  __hasProp = {}.hasOwnProperty;
+
+_common = require('./_common');
+
+module.exports = object = {
+  isBareObject: _common.isBareObject.bind(_common),
+  /*
+  	if object is an instance of a class
+  */
+
+  isInstance: function(what) {
+    return !this.isBareObject(what);
+  },
+  /*
+  	Alias to _common.typeOf
+  */
+
+  typeOf: _common.typeOf.bind(_common),
+  /*
+  	Alias to _common.clone
+  */
+
+  clone: _common.clone.bind(_common),
+  /*
+  	Empties an object of its properties.
+  */
+
+  empty: function(o) {
+    var prop;
+    for (prop in o) {
+      if (o.hasOwnProperty(prop)) {
+        delete o[prop];
+      }
+    }
+    return o;
+  },
+  /*
+  	Empties an object. Doesn't check for hasOwnProperty, so it's a tiny
+  	bit faster. Use it for plain objects.
+  */
+
+  fastEmpty: function(o) {
+    var property;
+    for (property in o) {
+      delete o[property];
+    }
+    return o;
+  },
+  /*
+  	Overrides values fomr `newValues` on `base`, as long as they
+  	already exist in base.
+  */
+
+  overrideOnto: function(base, newValues) {
+    var key, newVal, oldVal;
+    if (!this.isBareObject(newValues) || !this.isBareObject(base)) {
+      return base;
+    }
+    for (key in base) {
+      oldVal = base[key];
+      newVal = newValues[key];
+      if (newVal === void 0) {
+        continue;
+      }
+      if (typeof newVal !== 'object' || this.isInstance(newVal)) {
+        base[key] = this.clone(newVal);
+      } else {
+        if (typeof oldVal !== 'object' || this.isInstance(oldVal)) {
+          base[key] = this.clone(newVal);
+        } else {
+          this.overrideOnto(oldVal, newVal);
+        }
+      }
+    }
+    return base;
+  },
+  /*
+  	Takes a clone of 'base' and runs #overrideOnto on it
+  */
+
+  override: function(base, newValues) {
+    return this.overrideOnto(this.clone(base), newValues);
+  },
+  append: function(base, toAppend) {
+    return this.appendOnto(this.clone(base), toAppend);
+  },
+  appendOnto: function(base, toAppend) {
+    var key, newVal, oldVal;
+    if (!this.isBareObject(toAppend) || !this.isBareObject(base)) {
+      return base;
+    }
+    for (key in toAppend) {
+      if (!__hasProp.call(toAppend, key)) continue;
+      newVal = toAppend[key];
+      if (newVal === void 0) {
+        continue;
+      }
+      if (typeof newVal !== 'object' || this.isInstance(newVal)) {
+        base[key] = newVal;
+      } else {
+        oldVal = base[key];
+        if (typeof oldVal !== 'object' || this.isInstance(oldVal)) {
+          base[key] = this.clone(newVal);
+        } else {
+          this.appendOnto(oldVal, newVal);
+        }
+      }
+    }
+    return base;
+  },
+  groupProps: function(obj, groups) {
+    var def, defs, grouped, key, name, shouldAdd, val, _i, _len;
+    grouped = {};
+    for (name in groups) {
+      defs = groups[name];
+      grouped[name] = {};
+    }
+    grouped['rest'] = {};
+    top: //;
+    for (key in obj) {
+      val = obj[key];
+      shouldAdd = false;
+      for (name in groups) {
+        defs = groups[name];
+        if (!Array.isArray(defs)) {
+          defs = [defs];
+        }
+        for (_i = 0, _len = defs.length; _i < _len; _i++) {
+          def = defs[_i];
+          if (typeof def === 'string') {
+            if (key === def) {
+              shouldAdd = true;
+            }
+          } else if (def instanceof RegExp) {
+            if (def.test(key)) {
+              shouldAdd = true;
+            }
+          } else if (def instanceof Function) {
+            if (def(key)) {
+              shouldAdd = true;
+            }
+          } else {
+            throw Error('Group definitions must either\
+						be strings, regexes, or functions.');
+          }
+          if (shouldAdd) {
+            grouped[name][key] = val;
+            continue top;
+          }
+        }
+      }
+      grouped['rest'][key] = val;
+    }
+    return grouped;
+  }
+};
