<h2class="title title-3"id="notification-changesMade-title">You've Made Some Changes</h2>
<pid="notification-changesMade-description">Your changes will not take effect until you <strong>save your progress</strong>. Take care with key and value formatting, as validation is <strong>not implemented</strong>.</p>
b));returna},shift:function(a){varb=this.at(0);this.remove(b,a);returnb},slice:function(a,b){returnthis.models.slice(a,b)},get:function(a){if(null!=a)returnthis._idAttr||(this._idAttr=this.model.prototype.idAttribute),this._byId[a.id||a.cid||a[this._idAttr]||a]},at:function(a){returnthis.models[a]},where:function(a){returnf.isEmpty(a)?[]:this.filter(function(b){for(varcina)if(a[c]!==b.get(c))return!1;return!0})},sort:function(a){if(!this.comparator)throwError("Cannot sort a set without a comparator");
b)),this.trigger.apply(this,arguments))},sortedIndex:function(a,b,c){b||(b=this.comparator);vard=f.isFunction(b)?b:function(a){returna.get(b)};returnf.sortedIndex(this.models,a,d,c)}});f.each("forEach each map collect reduce foldl inject reduceRight foldr find detect filter select reject every all some any include contains invoke max min toArray size first head take initial rest tail drop last without indexOf shuffle lastIndexOf isEmpty chain".split(" "),function(a){s.prototype[a]=function(){varb=
b){if(null==a)if(this._hasPushState||!this._wantsHashChange||b){a=this.location.pathname;varc=this.root.replace(K,"");a.indexOf(c)||(a=a.substr(c.length))}elsea=this.getHash();returna.replace(z,"")},start:function(a){if(m.started)throwError("Backbone.history has already been started");m.started=!0;this.options=f.extend({},{root:"/"},this.options,a);this.root=this.options.root;this._wantsHashChange=!1!==this.options.hashChange;this._wantsPushState=!!this.options.pushState;this._hasPushState=!(!this.options.pushState||
(b.replace||this.iframe.document.open().close(),this._updateHash(this.iframe.location,a,b.replace));elsereturnthis.location.assign(c);b.trigger&&this.loadUrl(a)}},_updateHash:function(a,b,c){c?(c=a.href.replace(/(javascript:|#).*$/,""),a.replace(c+"#"+b)):a.hash="#"+b}});g.history=newm;varA=g.View=function(a){this.cid=f.uniqueId("view");this._configure(a||{});this._ensureElement();this.initialize.apply(this,arguments);this.delegateEvents()},L=/^(\S+)\s*(.*)$/,M="model collection el id attributes className tagName events".split(" ");
if(!c)throwError('Method "'+a[b]+'" does not exist');vard=b.match(L),e=d[1],d=d[2],c=f.bind(c,this),e=e+(".delegateEvents"+this.cid);if(""===d)this.$el.on(e,c);elsethis.$el.on(e,d,c)}}},undelegateEvents:function(){this.$el.off(".delegateEvents"+this.cid)},_configure:function(a){this.options&&(a=f.extend({},f.result(this,"options"),a));f.extend(this,f.pick(a,M));this.options=a},_ensureElement:function(){if(this.el)this.setElement(f.result(this,"el"),!1);else{vara=f.extend({},f.result(this,"attributes"));
varx=function(){throwError('A "url" property or function must be specified');}}).call(this);
(function(){vart=this;vare=t.Backbone;vari=[];varr=i.push;vars=i.slice;varn=i.splice;vara;if(typeofexports!=="undefined"){a=exports}else{a=t.Backbone={}}a.VERSION="1.0.0";varh=t._;if(!h&&typeofrequire!=="undefined")h=require("underscore");a.$=t.jQuery||t.Zepto||t.ender||t.$;a.noConflict=function(){t.Backbone=e;returnthis};a.emulateHTTP=false;a.emulateJSON=false;varo=a.Events={on:function(t,e,i){if(!l(this,"on",t,[e,i])||!e)returnthis;this._events||(this._events={});varr=this._events[t]||(this._events[t]=[]);r.push({callback:e,context:i,ctx:i||this});returnthis},once:function(t,e,i){if(!l(this,"once",t,[e,i])||!e)returnthis;varr=this;vars=h.once(function(){r.off(t,s);e.apply(this,arguments)});s._callback=e;returnthis.on(t,s,i)},off:function(t,e,i){varr,s,n,a,o,u,c,f;if(!this._events||!l(this,"off",t,[e,i]))returnthis;if(!t&&!e&&!i){this._events={};returnthis}a=t?[t]:h.keys(this._events);for(o=0,u=a.length;o<u;o++){t=a[o];if(n=this._events[t]){this._events[t]=r=[];if(e||i){for(c=0,f=n.length;c<f;c++){s=n[c];if(e&&e!==s.callback&&e!==s.callback._callback||i&&i!==s.context){r.push(s)}}}if(!r.length)deletethis._events[t]}}returnthis},trigger:function(t){if(!this._events)returnthis;vare=s.call(arguments,1);if(!l(this,"trigger",t,e))returnthis;vari=this._events[t];varr=this._events.all;if(i)c(i,e);if(r)c(r,arguments);returnthis},stopListening:function(t,e,i){varr=this._listeners;if(!r)returnthis;vars=!e&&!i;if(typeofe==="object")i=this;if(t)(r={})[t._listenerId]=t;for(varninr){r[n].off(e,i,this);if(s)deletethis._listeners[n]}returnthis}};varu=/\s+/;varl=function(t,e,i,r){if(!i)returntrue;if(typeofi==="object"){for(varsini){t[e].apply(t,[s,i[s]].concat(r))}returnfalse}if(u.test(i)){varn=i.split(u);for(vara=0,h=n.length;a<h;a++){t[e].apply(t,[n[a]].concat(r))}returnfalse}returntrue};varc=function(t,e){vari,r=-1,s=t.length,n=e[0],a=e[1],h=e[2];switch(e.length){case0:while(++r<s)(i=t[r]).callback.call(i.ctx);return;case1:while(++r<s)(i=t[r]).callback.call(i.ctx,n);return;case2:while(++r<s)(i=t[r]).callback.call(i.ctx,n,a);return;case3:while(++r<s)(i=t[r]).callback.call(i.ctx,n,a,h);return;default:while(++r<s)(i=t[r]).callback.apply(i.ctx,e)}};varf={listenTo:"on",listenToOnce:"once"};h.each(f,function(t,e){o[e]=function(e,i,r){vars=this._listeners||(this._listeners={});varn=e._listenerId||(e._listenerId=h.uniqueId("l"));s[n]=e;if(typeofi==="object")r=this;e[t](i,r,this);returnthis}});o.bind=o.on;o.unbind=o.off;h.extend(a,o);vard=a.Model=function(t,e){vari;varr=t||{};e||(e={});this.cid=h.uniqueId("c");this.attributes={};h.extend(this,h.pick(e,p));if(e.parse)r=this.parse(r,e)||{};if(i=h.result(this,"defaults")){r=h.defaults({},r,i)}this.set(r,e);this.changed={};this.initialize.apply(this,arguments)};varp=["url","urlRoot","collection"];h.extend(d.prototype,o,{changed:null,validationError:null,idAttribute:"id",initialize:function(){},toJSON:function(t){returnh.clone(this.attributes)},sync:function(){returna.sync.apply(this,arguments)},get:function(t){returnthis.attributes[t]},escape:function(t){returnh.escape(this.get(t))},has:function(t){returnthis.get(t)!=null},set:function(t,e,i){varr,s,n,a,o,u,l,c;if(t==null)returnthis;if(typeoft==="object"){s=t;i=e}else{(s={})[t]=e}i||(i={});if(!this._validate(s,i))returnfalse;n=i.unset;o=i.silent;a=[];u=this._changing;this._changing=true;if(!u){this._previousAttributes=h.clone(this.attributes);this.changed={}}c=this.attributes,l=this._previousAttributes;if(this.idAttributeins)this.id=s[this.idAttribute];for(rins){e=s[r];if(!h.isEqual(c[r],e))a.push(r);if(!h.isEqual(l[r],e)){this.changed[r]=e}else{deletethis.changed[r]}n?deletec[r]:c[r]=e}if(!o){if(a.length)this._pending=true;for(varf=0,d=a.length;f<d;f++){this.trigger("change:"+a[f],this,c[a[f]],i)}}if(u)returnthis;if(!o){while(this._pending){this._pending=false;this.trigger("change",this,i)}}this._pending=false;this._changing=false;returnthis},unset:function(t,e){returnthis.set(t,void0,h.extend({},e,{unset:true}))},clear:function(t){vare={};for(variinthis.attributes)e[i]=void0;returnthis.set(e,h.extend({},t,{unset:true}))},hasChanged:function(t){if(t==null)return!h.isEmpty(this.changed);returnh.has(this.changed,t)},changedAttributes:function(t){if(!t)returnthis.hasChanged()?h.clone(this.changed):false;vare,i=false;varr=this._changing?this._previousAttributes:this.attributes;for(varsint){if(h.isEqual(r[s],e=t[s]))continue;(i||(i={}))[s]=e}returni},previous:function(t){if(t==null||!this._previousAttributes)returnnull;returnthis._previousAttributes[t]},previousAttributes:function(){returnh.clone(this._previousAttributes)},fetch:function(t){t=t?h.clone(t):{};if(t.parse===void0)t.parse=true;vare=this;vari=t.success;t.success=function(r){if(!e.set(e.parse(r,t),t))returnfalse;if(i)i(e,r,t);e.trigger("sync",e,r,t)};R(this,t);returnthis.sync("read",this,t)},save:function(t,e,i){varr,s,n,a=this.attributes;if(t==null||typeoft==="object"){r=t;i=e}else{(r={})[t]=e}if(r&&(!i||!i.wait)&&!this.set(r,i))returnfalse;i=h.extend({validate:true},i);if(!this._validate(r,i))returnfalse;if(r&&i.wait){this.attributes=h.extend({},a,r)}if(i.parse===void0)i.parse=true;varo=this;varu=i.success;i.success=function(t){o.attributes=a;vare=o.parse(t,i);if(i.wait)e=h.extend(r||{},e);if(h.isObject(e)&&!o.set(e,i)){returnfalse}if(u)u(o,t,i);o.trigger("sync",o,t,i)};R(this,i);s=this.isNew()?"create":i.patch?"patch":"update";if(s==="patch")i.attrs=r;n=this.sync(s,this,i);if(r&&i.wait)this.attributes=a;returnn},destroy:function(t){t=t?h.clone(t):{};vare=this;vari=t.success;varr=function(){e.trigger("destroy",e,e.collection,t)};t.success=function(s){if(t.wait||e.isNew())r();if(i)i(e,s,t);if(!e.isNew())e.trigger("sync",e,s,t)};if(this.isNew()){t.success();returnfalse}R(this,t);vars=this.sync("delete",this,t);if(!t.wait)r();returns},url:function(){vart=h.result(this,"urlRoot")||h.result(this.collection,"url")||U();if(this.isNew())returnt;returnt+(t.charAt(t.length-1)==="/"?"":"/")+encodeURIComponent(this.id)},parse:function(t,e){returnt},clone:function(){returnnewthis.constructor(this.attributes)},isNew:function(){returnthis.id==null},isValid:function(t){returnthis._validate({},h.extend(t||{},{validate:true}))},_validate:function(t,e){if(!e.validate||!this.validate)returntrue;t=h.extend({},this.attributes,t);vari=this.validationError=this.validate(t,e)||null;if(!i)returntrue;this.trigger("invalid",this,i,h.extend(e||{},{validationError:i}));returnfalse}});varv=["keys","values","pairs","invert","pick","omit"];h.each(v,function(t){d.prototype[t]=function(){vare=s.call(arguments);e.unshift(this.attributes);returnh[t].apply(h,e)}});varg=a.Collection=function(t,e){e||(e={});if(e.url)this.url=e.url;if(e.model)this.model=e.model;if(e.comparator!==void0)this.comparator=e.comparator;this._reset();this.initialize.apply(this,arguments);if(t)this.reset(t,h.extend({silent:true},e))};varm={add:true,remove:true,merge:true};vary={add:true,merge:false,remove:false};h.extend(g.prototype,o,{model:d,initialize:function(){},toJSON:function(t){returnthis.map(function(e){returne.toJSON(t)})},sync:function(){returna.sync.apply(this,arguments)},add:function(t,e){returnthis.set(t,h.defaults(e||{},y))},remove:function(t,e){t=h.isArray(t)?t.slice():[t];e||(e={});vari,r,s,n;for(i=0,r=t.length;i<r;i++){n=this.get(t[i]);if(!n)continue;deletethis._byId[n.id];deletethis._byId[n.cid];s=this.indexOf(n);this.models.splice(s,1);this.length--;if(!e.silent){e.index=s;n.trigger("remove",n,this,e)}this._removeReference(n)}returnthis},set:function(t,e){e=h.defaults(e||{},m);if(e.parse)t=this.parse(t,e);if(!h.isArray(t))t=t?[t]:[];vari,s,a,o,u,l;varc=e.at;varf=this.comparator&&c==null&&e.sort!==false;vard=h.isString(this.comparator)?this.comparator:null;varp=[],v=[],g={};for(i=0,s=t.length;i<s;i++){if(!(a=this._prepareModel(t[i],e)))continue;if(u=this.get(a)){if(e.remove)g[u.cid]=true;if(e.merge){u.set(a.attributes,e);if(f&&!l&&u.hasChanged(d))l=true}}elseif(e.add){p.push(a);a.on("all",this._onModelEvent,this);this._byId[a.cid]=a;if(a.id!=null)this._byId[a.id]=a}}if(e.remove){for(i=0,s=this.length;i<s;++i){if(!g[(a=this.models[i]).cid])v.push(a)}if(v.length)this.remove(v,e)}if(p.length){if(f)l=true;this.length+=p.length;if(c!=null){n.apply(this.models,[c,0].concat(p))}else{r.apply(this.models,p)}}if(l)this.sort({silent:true});if(e.silent)returnthis;for(i=0,s=p.length;i<s;i++){(a=p[i]).trigger("add",a,this,e)}if(l)this.trigger("sort",this,e);returnthis},reset:function(t,e){e||(e={});for(vari=0,r=this.models.length;i<r;i++){this._removeReference(this.models[i])}e.previousModels=this.models;this._reset();this.add(t,h.extend({silent:true},e));if(!e.silent)this.trigger("reset",this,e);returnthis},push:function(t,e){t=this._prepareModel(t,e);this.add(t,h.extend({at:this.length},e));returnt},pop:function(t){vare=this.at(this.length-1);this.remove(e,t);returne},unshift:function(t,e){t=this._prepareModel(t,e);this.add(t,h.extend({at:0},e));returnt},shift:function(t){vare=this.at(0);this.remove(e,t);returne},slice:function(t,e){returnthis.models.slice(t,e)},get:function(t){if(t==null)returnvoid0;returnthis._byId[t.id!=null?t.id:t.cid||t]},at:function(t){returnthis.models[t]},where:function(t,e){if(h.isEmpty(t))returne?void0:[];returnthis[e?"find":"filter"](function(e){for(variint){if(t[i]!==e.get(i))returnfalse}returntrue})},findWhere:function(t){returnthis.where(t,true)},sort:function(t){if(!this.comparator)thrownewError("Cannot sort a set without a comparator");t||(t={});if(h.isString(this.comparator)||this.comparator.length===1){this.models=this.sortBy(this.comparator,this)}else{this.models.sort(h.bind(this.comparator,this))}if(!t.silent)this.trigger("sort",this,t);returnthis},sortedIndex:function(t,e,i){e||(e=this.comparator);varr=h.isFunction(e)?e:function(t){returnt.get(e)};returnh.sortedIndex(this.models,t,r,i)},pluck:function(t){returnh.invoke(this.models,"get",t)},fetch:function(t){t=t?h.clone(t):{};if(t.parse===void0)t.parse=true;vare=t.success;vari=this;t.success=function(r){vars=t.reset?"reset":"set";i[s](r,t);if(e)e(i,r,t);i.trigger("sync",i,r,t)};R(this,t);returnthis.sync("read",this,t)},create:function(t,e){e=e?h.clone(e):{};if(!(t=this._prepareModel(t,e)))returnfalse;if(!e.wait)this.add(t,e);vari=this;varr=e.success;e.success=function(s){if(e.wait)i.add(t,e);if(r)r(t,s,e)};t.save(null,e);returnt},parse:function(t,e){returnt},clone:function(){returnnewthis.constructor(this.models)},_reset:function(){this.length=0;this.models=[];this._byId={}},_prepareModel:function(t,e){if(tinstanceofd){if(!t.collection)t.collection=this;returnt}e||(e={});e.collection=this;vari=newthis.model(t,e);if(!i._validate(t,e)){this.trigger("invalid",this,t,e);returnfalse}returni},_removeReference:function(t){if(this===t.collection)deletet.collection;t.off("all",this._onModelEvent,this)},_onModelEvent:function(t,e,i,r){if((t==="add"||t==="remove")&&i!==this)return;if(t==="destroy")this.remove(e,r);if(e&&t==="change:"+e.idAttribute){deletethis._byId[e.previous(e.idAttribute)];if(e.id!=null)this._byId[e.id]=e}this.trigger.apply(this,arguments)}});var_=["forEach","each","map","collect","reduce","foldl","inject","reduceRight","foldr","find","detect","filter","select","reject","every","all","some","any","include","contains","invoke","max","min","toArray","size","first","head","take","initial","rest","tail","drop","last","without","indexOf","shuffle","lastIndexOf","isEmpty","chain"];h.each(_,function(t){g.prototype[t]=function(){vare=s.call(arguments);e.unshift(this.models);returnh[t].apply(h,e)}});varw=["groupBy","countBy","sortBy"];h.each(w,function(t){g.prototype[t]=function(e,i){varr=h.isFunction(e)?e:function(t){returnt.get(e)};returnh[t](this.models,r,i)}});varb=a.View=function(t){this.cid=h.uniqueId("view");this._configure(t||{});this._ensureElement();this.initialize.apply(this,arguments);this.delegateEvents()};varx=/^(\S+)\s*(.*)$/;varE=["model","collection","el","id","attributes","className","tagName","events"];h.extend(b.prototype,o,{tagName:"div",$:function(t){returnthis.$el.find(t)},initialize:function(){},render:function(){returnthis},remove:function(){this.$el.remove();this.stopListening();returnthis},setElement:function(t,e){if(this.$el)this.undelegateEvents();this.$el=tinstanceofa.$?t:a.$(t);this.el=this.$el[0];if(e!==false)this.delegateEvents();returnthis},delegateEvents:function(t){if(!(t||(t=h.result(this,"events"))))returnthis;this.undelegateEvents();for(vareint){vari=t[e];if(!h.isFunction(i))i=this[t[e]];if(!i)continue;varr=e.match(x);vars=r[1],n=r[2];i=h.bind(i,this);s+=".delegateEvents"+this.cid;if(n===""){this.$el.on(s,i)}else{this.$el.on(s,n,i)}}returnthis},undelegateEvents:function(){this.$el.off(".delegateEvents"+this.cid);returnthis},_configure:function(t){if(this.options)t=h.extend({},h.result(this,"options"),t);h.extend(this,h.pick(t,E));this.options=t},_ensureElement:function(){if(!this.el){vart=h.extend({},h.result(this,"attributes"));if(this.id)t.id=h.result(this,"id");if(this.className)t["class"]=h.result(this,"className");vare=a.$("<"+h.result(this,"tagName")+">").attr(t);this.setElement(e,false)}else{this.setElement(h.result(this,"el"),false)}}});a.sync=function(t,e,i){varr=k[t];h.defaults(i||(i={}),{emulateHTTP:a.emulateHTTP,emulateJSON:a.emulateJSON});vars={type:r,dataType:"json"};if(!i.url){s.url=h.result(e,"url")||U()}if(i.data==null&&e&&(t==="create"||t==="update"||t==="patch")){s.contentType="application/json";s.data=JSON.stringify(i.attrs||e.toJSON(i))}if(i.emulateJSON){s.contentType="application/x-www-form-urlencoded";s.data=s.data?{model:s.data}:{}}if(i.emulateHTTP&&(r==="PUT"||r==="DELETE"||r==="PATCH")){s.type="POST";if(i.emulateJSON)s.data._method=r;varn=i.beforeSend;i.beforeSend=function(t){t.setRequestHeader("X-HTTP-Method-Override",r);if(n)returnn.apply(this,arguments)}}if(s.type!=="GET"&&!i.emulateJSON){s.processData=false}if(s.type==="PATCH"&&window.ActiveXObject&&!(window.external&&window.external.msActiveXFilteringEnabled)){s.xhr=function(){returnnewActiveXObject("Microsoft.XMLHTTP")}}varo=i.xhr=a.ajax(h.extend(s,i));e.trigger("request",e,o,i);returno};vark={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};a.ajax=function(){returna.$.ajax.apply(a.$,arguments)};varS=a.Router=function(t){t||(t={});if(t.routes)this.routes=t.routes;this._bindRoutes();this.initialize.apply(this,arguments)};var$=/\((.*?)\)/g;varT=/(\(\?)?:\w+/g;varH=/\*\w+/g;varA=/[\-{}\[\]+?.,\\\^$|#\s]/g;h.extend(S.prototype,o,{initialize:function(){},route:function(t,e,i){if(!h.isRegExp(t))t=this._routeToRegExp(t);if(h.isFunction(e)){i=e;e=""}if(!i)i=this[e];varr=this;a.history.route(t,function(s){varn=r._extractParameters(t,s);i&&i.apply(r,n);r.trigger.apply(r,["route:"+e].concat(n));r.trigger("route",e,n);a.history.trigger("route",r,e,n)});returnthis},navigate:function(t,e){a.history.navigate(t,e);returnthis},_bindRoutes:function(){if(!this.routes)return;this.routes=h.result(this,"routes");vart,e=h.keys(this.routes);while((t=e.pop())!=null){this.route(t,this.routes[t])}},_routeToRegExp:function(t){t=t.replace(A,"\\$&").replace($,"(?:$1)?").replace(T,function(t,e){returne?t:"([^/]+)"}).replace(H,"(.*?)");returnnewRegExp("^"+t+"$")},_extractParameters:function(t,e){vari=t.exec(e).slice(1);returnh.map(i,function(t){returnt?decodeURIComponent(t):null})}});varI=a.History=function(){this.handlers=[];h.bindAll(this,"checkUrl");if(typeofwindow!=="undefined"){this.location=window.location;this.history=window.history}};varN=/^[#\/]|\s+$/g;varP=/^\/+|\/+$/g;varO=/msie [\w.]+/;varC=/\/$/;I.started=false;h.extend(I.prototype,o,{interval:50,getHash:function(t){vare=(t||this).location.href.match(/#(.*)$/);returne?e[1]:""},getFragment:function(t,e){if(t==null){if(this._hasPushState||!this._wantsHashChange||e){t=this.location.pathname;vari=this.root.replace(C,"");if(!t.indexOf(i))t=t.substr(i.length)}else{t=this.getHash()}}returnt.replace(N,"")},start:function(t){if(I.started)thrownewError("Backbone.history has already been started");I.started=true;this.options=h.extend({},{root:"/"},this.options,t);this.root=this.options.root;this._wantsHashChange=this.options.hashChange!==false;this._wantsPushState=!!this.options.pushState;this._hasPushState=!!(this.options.pushState&&this.history&&this.history.pushState);vare=this.getFragment();vari=document.documentMode;varr=O.exec(navigator.userAgent.toLowerCase())&&(!i||i<=7);this.root=("/"+this.root+"/").replace(P,"/");if(r&&this._wantsHashChange){this.iframe=a.$('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo("body")[0].contentWindow;this.navigate(e)}if(this._hasPushState){a.$(window).on("popstate",this.checkUrl)}elseif(this._wantsHashChange&&"onhashchange"inwindow&&!r){a.$(window).on("hashchange",this.checkUrl)}elseif(this._wantsHashChange){this._checkUrlInterval=setInterval(this.checkUrl,this.interval)}this.fragment=e;vars=this.location;varn=s.pathname.replace(/[^\/]$/,"$&/")===this.root;if(this._wantsHashChange&&this._wantsPushState&&!this._hasPushState&&!n){this.fragment=this.getFragment(null,true);this.location.replace(this.root+this.location.search+"#"+this.fragment);returntrue}elseif(this._wantsPushState&&this._hasPushState&&n&&s.hash){this.fragment=this.getHash().replace(N,"");this.history.replaceState({},document.title,this.root+this.fragment+s.search)}if(!this.options.silent)returnthis.loadUrl()},stop:function(){a.$(window).off("popstate",this.checkUrl).off("hashchange",this.checkUrl);clearInterval(this._checkUrlInterval);I.started=false},route:function(t,e){this.handlers.unshift({route:t,callback:e})},checkUrl:function(t){vare=this.getFragment();if(e===this.fragment&&this.iframe){e=this.getFragment(this.getHash(this.iframe))}if(e===this.fragment)returnfalse;if(this.iframe)this.navigate(e);this.loadUrl()||this.loadUrl(this.getHash())},loadUrl:function(t){vare=this.fragment=this.getFragment(t);vari=h.any(this.handlers,function(t){if(t.route.test(e)){t.callback(e);returntrue}});returni},navigate:function(t,e){if(!I.started)returnfalse;if(!e||e===true)e={trigger:e};t=this.getFragment(t||"");if(this.fragment===t)return;this.fragment=t;vari=this.root+t;if(this._hasPushState){this.history[e.replace?"replaceState":"pushState"]({},document.title,i)}elseif(this._wantsHashChange){this._updateHash(this.location,t,e.replace);if(this.iframe&&t!==this.getFragment(this.getHash(this.iframe))){if(!e.replace)this.iframe.document.open().close();this._updateHash(this.iframe.location,t,e.replace)}}else{returnthis.location.assign(i)}if(e.trigger)this.loadUrl(t)},_updateHash:function(t,e,i){if(i){varr=t.href.replace(/(javascript:|#).*$/,"");t.replace(r+"#"+e)}else{t.hash="#"+e}}});a.history=newI;varj=function(t,e){vari=this;varr;if(t&&h.has(t,"constructor")){r=t.constructor}else{r=function(){returni.apply(this,arguments)}}h.extend(r,i,e);vars=function(){this.constructor=r};s.prototype=i.prototype;r.prototype=news;if(t)h.extend(r.prototype,t);r.__super__=i.prototype;returnr};d.extend=g.extend=S.extend=b.extend=I.extend=j;varU=function(){thrownewError('A "url" property or function must be specified')};varR=function(t,e){vari=e.error;e.error=function(r){if(i)i(t,r,e);t.trigger("error",t,r,e)}}}).call(this);
<h3><strong>DEVOPS ENGINEER – SYSTEMS ADMINISTRATOR</strong></h3>
<p>The Devop Engineers at edX help develop and maintain the infrastructure in AWS for all services and systems required to run edX. We're seeking a capable systems administrator who is unafraid of scripting languages and development to build out tools in order to improve the functionality of edX. The devops team primarily focuses on the provisioning, configuration, and deployment of services at edX. If you have a passion for automation and constant improvement then we want to hear from you. Our production environment is primarily built on Ubuntu (in AWS) and we use Puppet and Fabric to manage most of the environment.</p>
<p>In addition to the primary task of building infrastructure the Devops team supports the developers in a variety of other contexts, including helping with desktop development environments if required. We participate in on-call and emergency support and there will be occasional out of normal hours work required.</p>
<p><strong>Responsibilities:</strong></p>
<ul>
<li>Work with developers and staff to maintain and improve the infrastructure of edX.</li>
<li>Assist where needed with other technical support tasks to support the fast moving pace of edX.</li>
<li>Rapidly diagnose and resolve faults with organization-wide servers and services, and communicate to users as appropriate.</li>
</ul>
<p><strong>Requirements:</strong></p>
<ul>
<li>Bachelor's degree in engineering or computer science. But we're all about education, so let us know how you gained what you need to succeed in this role: projects after completing 6.00x or CS50x, Xbox cheevos, on-line guilds led, large scale innovations championed.</li>
<li>Three or more years of systems administration. </li>
<li>Must have an excellent working knowledge of Linux both as an end-user and as an administrator.</li>
<li>Must be adept in programming/scripting languages such as Python, Ruby, Bash.</li>
<li>Must be familiar with a configuration management system such as Puppet, Chef, Ansible.</li>
<li>Must have experience running web applications in a production environment.</li>
<li>Must have excellent personal interaction skills as the position requires interfacing with a wide range of people up to board level.</li>
<li>Ideally possesses experience with some of the following technologies: nginx, mysql, mongodb, django environments, splunk, git.</li>
</ul>
<p>If you are interested in this position, please send an email to <ahref="mailto:jobs@edx.org">jobs@edx.org</a>.</p>
<p>EdX is looking for a Web Designer to join our Product Team and shape the experience of edX's online learning tools. With thousands and thousands of students and hundreds of professors using our software every day, our online learning tools have to sing. Our ideal candidates are passionate and picky about what makes a good user experience; sweat the mechanical, visual, and transactional details when designing; know how to bring an idea or project from a sketch on paper to being alive in a browser; can instinctually bring organization to a design meeting, deliverable, or project; and thrive on collaboration with colleagues and constant iteration/refinement.</p>
<p>As an edX Designer, you:</p>
<ul>
<li>Have an innate sense of – and strong opinion about – good usability when it comes to web applications, and an ability to clearly articulate both.</li>
<li>Understand established interactive technologies and possess an undying thirst to learn about new ones.</li>
<li>Define and work within visual themes based on your excellent understanding of grids, typography, color, and design principles.</li>
<li>Marry design aesthetics to user experiences while keeping in mind accessibility, usability, and web standards.</li>
<li>Can use HTML5, CSS3, and DOM-manipulating JavaScript to represent your designs in the browser.</li>
<li>Conceptualize and articulate complex ideas to drive decisions, facilitate understanding, and reach consensus.</li>
<li>Document your thinking using appropriately chosen, informed deliverables such as sketches, wireframes, prototypes, site maps/flows, personas, style tiles, and design comps.</li>
<li>Have a perfectionist mindset, but won’t lose momentum in projects because of it.</li>
<li>Expertly present user experience and design recommendations to team members.</li>
</ul>
<p><strong>Requirements:</strong></p>
<ul>
<li>Have at least 2 years of professional, post-collegiate experience.</li>
<li>Have a BA, BS, BFA, or equivalent work experience in areas such as human-computer interaction, information science, graphic or industrial design, computer science, fine arts, social sciences such as psychology, or another related field. But we're all about education, so let us know how you gained what you need to succeed in this role: projects after completing 6.00x or CS50x, Xbox cheevos, on-line guilds led, large scale innovations championed.</li>
</ul>
<p><strong>About the Product Design Team:</strong></p>
<p>We are a small team with a startup, lean culture, committed to building tools that help our users learn and teach online. Working alongside developers, course staff, product owners, and project stakeholders, our Designers shepherd the experience of an idea or tool through research and strategy phases and lead the Information Architecture, Interaction Design, Visual Design, and Front End Development efforts in bringing that experience to life. We enjoy holding Design Studio exercises, finding the right design tool to do the job efficiently, and our CSS preprocessors.</p>
<p>If you wish to apply, please send your resume (PDF, text, or Word Doc), a thoughtful email that includes specifics about how your previous experience matches the Designer role at edX, and online samples of your work to <ahref="mailto:jobs@edx.org">jobs@edx.org</a>. Candidates who do not provide these will not be considered. EdX is open to considering candidates outside of the Boston/Cambridge, MA area who are willing to relocate.</p>
</div>
</article>
<articleid="front-end-developer"class="job">
<divclass="inner-wrapper">
<h3><strong>FRONT END DEVELOPER</strong></h3>
...
...
@@ -546,6 +485,72 @@ development and program management teams.</p>
</div>
</article>
<articleid="test-engineer"class="job">
<divclass="inner-wrapper">
<h3><strong>TEST ENGINEER</strong></h3>
<p>EdX is looking for a Software Engineer in Test to help architect and implement improvements to our testing infrastructure and write code to validate and verify development and deployment of our MOOC platform.</p>
<p>You are an experienced professional who is passionate about and current with cutting edge methodologies and practices for delivering high quality software. For example, you understand and can articulate the difference between BDD and TDD. You champion for developers to be confident in the quality of their code by giving them the tools they need to create and execute their own tests. You write unit tests that follow best practices for each layer of an MVC architecture. You work side by side with the DevOps team to define environments and automate their buildouts.</p>
<p><strong>Responsibilities:</strong></p>
<ul>
<li>Review software designs with a focus on code quality, risk, and testability</li>
<li>Build tools and frameworks that enable fellow engineers be more productive, write better code and test it themselves</li>
<li>Code test automation at all levels including class library, web application framework, javascript, and end-to-end</li>
<li>Enable metrics collection to measure adoption and expand the reach of the delivered tools</li>
<li>Fix framework bugs and improve test architecture, including adding required unit tests</li>
<li>Train and mentor other team members</li>
</ul>
<p><strong>Qualifications:</strong></p>
<ul>
<li>Excellent coding skills across a number of languages: Python or other high level programming languages, Javascript, bash, etc.</li>
<li>Experience in building test automation frameworks</li>
<li>Comfortable with source code in various languages (Python/Django, Ruby/Rails, Javascript/Backbone/JQuery, etc.)</li>
<li>Highly proficient in a Unix/Linux environment</li>
<li>Experience with database technologies from SQLite to MongoDB</li>
<li>Familiar with deployment automation (Puppet, Jenkins, AWS)</li>
<li>Open Source development experience preferred, extra points for sharing your GitHub / StackOverflow / etc. profile</li>
</ul>
<p>If you are interested in this position, please send an email to <ahref="mailto:jobs@edx.org">jobs@edx.org</a>.</p>
<h3><strong>COORDINATOR OF UNIVERSITY AND BUSINESS AFFAIRS</strong></h3>
<p>EdX is looking for a Coordinator of External Affairs, to streamline, organize and maintain our efforts in Business Development and University Relations.</p>
<p><strong>There are 4 primary areas of responsibility:</strong></p>
<ol>
<li>To ensure all visits to and from the edX offices by any partners and affiliates are managed, coordinated, and documented. This involves developing itineraries, booking flights and schedules, and managing meetings and events in concert with members of our executive team in University Relations and Business Development and our consortium of partners.</li>
<li>To maintain a database of partners and prospects and manage any data flows/reporting required.</li>
<li>To manage the information flow, recording activity on the edX Wiki page by synthesizing data and analysis from all visits and meetings and create updates on the edX Wiki page.</li>
<li>To act as a central point of contact for all relationship and event activity within this scope.</li>
<li>Provide support and coordinate activities for these 3 executives</li>
<li>Acquire strong user knowledge of related systems, processes and tools</li>
<li>Participate in the new partner on-boarding process</li>
<li>Provide an escalation point for Sales personnel for systems, procedures and policies</li>
<li>Maintain Salesforce database for client/partner set up and support information, generating reports as needed</li>
<li>Document proofreading, editing as directed for proposals, contracts, contact and call reports</li>
<li>Coordinate and manage travel, events and meetings, including invitations, RSVP’s, hotel/meeting space contracts, and providing event materials to attendees</li>
</ul>
<p><strong>Qualifications:</strong></p>
<ul>
<li>5-7 years of experience in a similar project/coordinator type position with progressively responsible administrative experience</li>
<li>Self-starter, possessing tenacity and a desire for challenges, not afraid to take risks, and the initiative to get things done with little direction </li>
<li>Superior interpersonal and communications skills, including concise writing and editing skills</li>
<li>Strong organizational skills to manage multiple competing priorities and projects with attention to detail </li>
<li>Exceptional ability to effectively interact with multiple external and internal stakeholders </li>
<li>Adept at analyzing complex issues with the ability to synthesize data and perform gap analyses</li>
<li>Performs well with a variety of disciplines while remaining effective in a high-volume, fast-pace start-up environment with high workload</li>
<li>Must be proficient in: MS PowerPoint, Word and Excel, Salesforce.com, and online tools such as Google docs and Wiki, and knowledge of Kanban is also helpful</li>
</ul>
<p>If you are interested in this position, please send an email to <ahref="mailto:jobs@edx.org">jobs@edx.org</a>.</p>
</div>
</article>
</section>
<sectionclass="jobs-sidebar">
...
...
@@ -559,11 +564,11 @@ development and program management teams.</p>