{"version":3,"sources":["webpack:///../WCC.UI/Scripts/durandal/activator.js","webpack:///../WCC.UI/Scripts/durandal/app.js","webpack:///../WCC.UI/Scripts/durandal/binder.js","webpack:///../WCC.UI/Scripts/durandal/composition.js","webpack:///../WCC.UI/Scripts/durandal/events.js","webpack:///../WCC.UI/Scripts/durandal/plugins/history.js","webpack:///../WCC.UI/Scripts/durandal/plugins/router.js","webpack:///../WCC.UI/Scripts/durandal/system.js","webpack:///../WCC.UI/Scripts/durandal/viewEngine.js","webpack:///../WCC.UI/Scripts/durandal/viewLocator.js"],"names":[],"mappings":";;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAA6B,CAAC,2DAAiB,EAAE,sFAAU,CAAC,mCAAE;AAC9D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA,kCAAkC;AAClC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;;AAEA;AACA,yBAAyB;AACzB,qBAAqB;AACrB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA,SAAS;AACT;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;;AAEA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,SAAS;;AAET;;AAEA;AACA;AACA,sBAAsB,kBAAkB;AACxC;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,QAAQ;AAC3B,mBAAmB,OAAO;AAC1B,oBAAoB;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,QAAQ;AAC3B,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;;AAEA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,oBAAoB;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,oBAAoB;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC,qCAAqC;AACrC,6BAA6B;AAC7B;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;AACzB,qBAAqB;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2CAA2C,oBAAoB;AAC/D;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,uCAAuC,iBAAiB;AACxD;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC,6BAA6B;AAC7B;;AAEA,uCAAuC,gBAAgB;AACvD;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA;AACA;AACA;AACA,sBAAsB,SAAS;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,oBAAoB;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,QAAQ;AAC3B,mBAAmB,SAAS;AAC5B;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,kBAAkB;AACxC;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,kBAAkB;AACrC,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,oBAAoB,QAAQ,oCAAoC;AAChE;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;AChpBF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAuB,CAAC,2DAAiB,EAAE,+DAAqB,EAAE,gEAAsB,EAAE,2DAAiB,EAAE,mEAAQ,CAAC,mCAAE;AACxH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,mBAAmB;AACjD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;;AAEA;AACA,aAAa;AACb;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B;AACA;AACA,yCAAyC;;AAEzC;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA,iCAAiC;AACjC,6BAA6B;AAC7B;AACA;AACA,yBAAyB;AACzB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;AC3KF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAA0B,CAAC,2DAAiB,EAAE,sFAAU,CAAC,mCAAE;AAC3D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB;AACpB;;AAEA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb,iEAAiE,YAAY;AAC7E;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT,sCAAsC,yBAAyB;AAC/D;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,WAAW;AAC9B,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,WAAW;AAC9B,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,WAAW;AAC9B,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,uBAAuB;AAC1C,mBAAmB,WAAW;AAC9B,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,WAAW;AAC9B;AACA;AACA;AACA;AACA;AACA,CAAC;AAAA,oGAAC;;;;;;;;ACvJF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAA+B,CAAC,2DAAiB,EAAE,gEAAsB,EAAE,2DAAiB,EAAE,+DAAqB,EAAE,8DAAoB,EAAE,mEAAQ,EAAE,sFAAU,CAAC,mCAAE;AAClK,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA,qBAAqB;AACrB;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,kEAAkE,OAAO;AACzE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,6CAA6C,SAAS;AACtD;AACA;AACA;AACA;;AAEA,wCAAwC,SAAS;AACjD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,uDAAuD,YAAY;AACnE;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,SAAS;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA;AACA;AACA,sBAAsB,uBAAuB;AAC7C;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,mBAAmB,SAAS;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA,kEAAkE,kBAAkB;;AAEpF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA,qBAAqB;AACrB;;AAEA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,wBAAwB;AAC3C,oBAAoB,OAAO;AAC3B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qDAAqD,YAAY;AACjE;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,iEAAiE;AACjE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,WAAW;AAC9B,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,+DAA+D,iBAAiB,EAAE;AAClF;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA,aAAa;;AAEb;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA,qBAAqB;AACrB;AACA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB;AACpB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;ACtuBF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAA0B,CAAC,2DAAiB,CAAC,mCAAE;AAC/C;AACA,6BAA6B;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,SAAS;AACxB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,SAAS;AACxB,eAAe,OAAO;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,SAAS;AACxB,eAAe,OAAO;AACtB,gBAAgB,oBAAoB;AACpC;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT,0DAA0D;AAC1D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,SAAS;AACxB,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,qCAAqC,QAAQ;AAC7C;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8CAA8C,YAAY;AAC1D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,iDAAiD,YAAY;AAC7D;AACA;AACA;;AAEA;AACA;AACA;AACA,gDAAgD,YAAY;AAC5D;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;ACvNF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAA0B,CAAC,2DAAiB,EAAE,mEAAQ,CAAC,mCAAE;AACzD;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+CAA+C,yCAAyC;AACxF,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA;AACA;AACA,sBAAsB,OAAO;AAC7B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe,eAAe;AAC9B,gBAAgB,kBAAkB;AAClC;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,0CAA0C,GAAG,YAAY;AACzD;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA,4CAA4C;AAC5C;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,eAAe;AAC9B,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,8EAA8E;;AAE9E;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,SAAS;AAC3B;;AAEA;AACA;AACA,kBAAkB,OAAO;AACzB;;AAEA;AACA;AACA,kBAAkB,QAAQ;AAC1B;AACA;;AAEA;AACA;AACA,kBAAkB,QAAQ;AAC1B;AACA;;AAEA;AACA;AACA,kBAAkB,QAAQ;AAC1B;AACA;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;AC3UF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAyB,CAAC,2DAAiB,EAAE,wDAAc,EAAE,8DAAoB,EAAE,2DAAiB,EAAE,gEAAsB,EAAE,oEAAiB,EAAE,sFAAU,EAAE,mEAAQ,CAAC,mCAAE;AACxK;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,2CAA2C,SAAS;AACpD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,0BAA0B,SAAS;AACnC;AACA;AACA;AACA;AACA,0BAA0B,SAAS;AACnC;AACA;AACA;AACA;AACA,0BAA0B,wBAAwB;AAClD;AACA;AACA;AACA;AACA,0BAA0B,UAAU;AACpC;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,0BAA0B,mBAAmB;AAC7C;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kCAAkC,+BAA+B;AACjE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,yBAAyB;AACzB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,oBAAoB,uBAAuB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,yBAAyB;AACzB;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,mBAAmB;AAC9C;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;;AAEA;AACA;AACA;;AAEA,4DAA4D,YAAY;AACxE,kDAAkD;;AAElD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,oBAAoB,OAAO;AAC3B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,2BAA2B,kBAAkB;AAC7C;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,MAAM;AACzB,mBAAmB,SAAS;AAC5B;AACA;AACA,kCAAkC,iDAAiD;AACnF;;AAEA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,uCAAuC,8BAA8B;;AAErE;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,eAAe;AAClC,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,oBAAoB,OAAO;AAC3B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,uBAAuB;AAC1C,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA,UAAU,6DAA6D;AACvE,UAAU;AACV;AACA;AACA;AACA;AACA,+BAA+B,kBAAkB;AACjD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB,8BAA8B;AAC9B;;AAEA;AACA,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,mBAAmB;AAC9C;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qCAAqC,sBAAsB,EAAE;AAC7D;;AAEA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,gBAAgB;AACnC;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;;AAEA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,wDAAwD,8BAA8B;AACtF;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;;AAEb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,cAAc;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;;AAEA,kCAAkC,+BAA+B;AACjE;AACA;;AAEA;AACA;AACA;AACA,6BAA6B;;AAE7B;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA,gEAAgE,aAAa;;AAE7E;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA,gDAAgD,mCAAmC;;AAEnF;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;ACjnCF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAA0B,CAAC,mEAAQ,CAAC,mCAAE;AACtC,WAAW,0BAA0B,GAAG,mBAAO,CAAC,6DAA4C;;AAE5F,WAAW,eAAe,GAAG,mBAAO,CAAC,wCAAuB;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,2BAA2B;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS,iBAAiB;AAC1B;;AAEA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,iBAAiB;;AAE1B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,iBAAiB;;AAEjB;AACA,aAAa;AACb;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA,mBAAmB,aAAa;AAChC;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,SAAS;AAC5B,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,mBAAmB,gBAAgB;AACnC,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B;AACA;AACA;;AAEA,2BAA2B,iBAAiB;AAC5C;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,oBAAoB;AACpB;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,QAAQ;AACxB;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,QAAQ;AACxB;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,QAAQ;AACxB;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,QAAQ;AACxB;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,QAAQ;AACxB;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,QAAQ;AACxB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,mBAAmB,qBAAqB;AACxC;AACA;;AAEA;AACA,CAAC;AAAA,oGAAC;;;;;;;;;ACrcF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAA8B,CAAC,2DAAiB,EAAE,mEAAQ,CAAC,mCAAE;AAC7D;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA;AACA;AACA,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA;AACA;AACA,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,oBAAoB,aAAa;AACjC;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,aAAa;AAChC,oBAAoB,WAAW;AAC/B;AACA;AACA,+B;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA,2BAA2B,wBAAwB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,WAAW;AAC9B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,mBAAmB,MAAM;AACzB,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA,CAAC;AAAA,oGAAC;;;;;;;;ACnMF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAA+B,CAAC,2DAAiB,EAAE,+DAAqB,CAAC,mCAAE;AAC3E;AACA,uBAAuB,kBAAkB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,6DAA6D,EAAE;AAC/D;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,mBAAmB,aAAa;AAChC,oBAAoB,QAAQ;AAC5B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,oBAAoB,OAAO;AAC3B;AACA;AACA,6CAA6C,GAAG;AAChD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B,mBAAmB,OAAO;AAC1B,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,kBAAkB;AACrC,mBAAmB,OAAO;AAC1B,mBAAmB,aAAa;AAChC,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb;AACA;AACA,CAAC;AAAA,oGAAC","file":"Scripts.durandal.2cee1515264b4a343126.js","sourcesContent":["/**\r\n * Durandal 2.2.0 Copyright (c) 2010-2016 Blue Spire Consulting, Inc. All Rights Reserved.\r\n * Available via the MIT license.\r\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\r\n */\r\n/**\r\n * The activator module encapsulates all logic related to screen/component activation.\r\n * An activator is essentially an asynchronous state machine that understands a particular state transition protocol.\r\n * The protocol ensures that the following series of events always occur: `canDeactivate` (previous state), `canActivate` (new state), `deactivate` (previous state), `activate` (new state).\r\n * Each of the _can_ callbacks may return a boolean, affirmative value or promise for one of those. If either of the _can_ functions yields a false result, then activation halts.\r\n * @module activator\r\n * @requires system\r\n * @requires knockout\r\n */\r\ndefine('durandal/activator', ['durandal/system', 'knockout'], function (system, ko) {\r\n var activator;\r\n var defaultOptions = {\r\n canDeactivate:true\r\n };\r\n\r\n function ensureSettings(settings) {\r\n if (settings == undefined) {\r\n settings = {};\r\n }\r\n\r\n if (!system.isBoolean(settings.closeOnDeactivate)) {\r\n settings.closeOnDeactivate = activator.defaults.closeOnDeactivate;\r\n }\r\n\r\n if (!settings.beforeActivate) {\r\n settings.beforeActivate = activator.defaults.beforeActivate;\r\n }\r\n\r\n if (!settings.afterDeactivate) {\r\n settings.afterDeactivate = activator.defaults.afterDeactivate;\r\n }\r\n\r\n if(!settings.affirmations){\r\n settings.affirmations = activator.defaults.affirmations;\r\n }\r\n\r\n if (!settings.interpretResponse) {\r\n settings.interpretResponse = activator.defaults.interpretResponse;\r\n }\r\n\r\n if (!settings.areSameItem) {\r\n settings.areSameItem = activator.defaults.areSameItem;\r\n }\r\n\r\n if (!settings.findChildActivator) {\r\n settings.findChildActivator = activator.defaults.findChildActivator;\r\n }\r\n\r\n return settings;\r\n }\r\n\r\n function invoke(target, method, data) {\r\n if (system.isArray(data)) {\r\n return target[method].apply(target, data);\r\n }\r\n\r\n return target[method](data);\r\n }\r\n\r\n function deactivate(item, close, settings, dfd, setter) {\r\n if (item && item.deactivate) {\r\n system.log('Deactivating', item);\r\n\r\n var result;\r\n try {\r\n result = item.deactivate(close);\r\n } catch(error) {\r\n system.log('ERROR: ' + error.message, error);\r\n dfd.resolve(false);\r\n return;\r\n }\r\n\r\n if (result && result.then) {\r\n result.then(function() {\r\n settings.afterDeactivate(item, close, setter);\r\n dfd.resolve(true);\r\n }, function(reason) {\r\n if (reason) {\r\n system.log(reason);\r\n }\r\n\r\n dfd.resolve(false);\r\n });\r\n } else {\r\n settings.afterDeactivate(item, close, setter);\r\n dfd.resolve(true);\r\n }\r\n } else {\r\n if (item) {\r\n settings.afterDeactivate(item, close, setter);\r\n }\r\n\r\n dfd.resolve(true);\r\n }\r\n }\r\n\r\n function activate(newItem, activeItem, callback, activationData) {\r\n var result;\r\n\r\n if(newItem && newItem.activate) {\r\n system.log('Activating', newItem);\r\n\r\n try {\r\n result = invoke(newItem, 'activate', activationData);\r\n } catch (error) {\r\n system.log('ERROR: ' + error.message, error);\r\n callback(false);\r\n return;\r\n }\r\n }\r\n\r\n if(result && result.then) {\r\n result.then(function() {\r\n activeItem(newItem);\r\n callback(true);\r\n }, function (reason) {\r\n if (reason) {\r\n system.log('ERROR: ' + reason.message, reason);\r\n }\r\n\r\n callback(false);\r\n });\r\n } else {\r\n activeItem(newItem);\r\n callback(true);\r\n }\r\n }\r\n\r\n function canDeactivateItem(item, close, settings, options) {\r\n options = system.extend({}, defaultOptions, options);\r\n settings.lifecycleData = null;\r\n\r\n return system.defer(function (dfd) {\r\n function continueCanDeactivate() {\r\n if (item && item.canDeactivate && options.canDeactivate) {\r\n var resultOrPromise;\r\n try {\r\n resultOrPromise = item.canDeactivate(close);\r\n } catch (error) {\r\n system.log('ERROR: ' + error.message, error);\r\n dfd.resolve(false);\r\n return;\r\n }\r\n\r\n if (resultOrPromise.then) {\r\n resultOrPromise.then(function (result) {\r\n settings.lifecycleData = result;\r\n dfd.resolve(settings.interpretResponse(result));\r\n }, function (reason) {\r\n if (reason) {\r\n system.log('ERROR: ' + reason.message, reason);\r\n }\r\n\r\n dfd.resolve(false);\r\n });\r\n } else {\r\n settings.lifecycleData = resultOrPromise;\r\n dfd.resolve(settings.interpretResponse(resultOrPromise));\r\n }\r\n } else {\r\n dfd.resolve(true);\r\n }\r\n }\r\n\r\n var childActivator = settings.findChildActivator(item);\r\n if (childActivator) {\r\n childActivator.canDeactivate().then(function(result) {\r\n if (result) {\r\n continueCanDeactivate();\r\n } else {\r\n dfd.resolve(false);\r\n }\r\n });\r\n } else {\r\n continueCanDeactivate();\r\n }\r\n }).promise();\r\n };\r\n\r\n function canActivateItem(newItem, activeItem, settings, activeData, newActivationData) {\r\n settings.lifecycleData = null;\r\n\r\n return system.defer(function (dfd) {\r\n if (settings.areSameItem(activeItem(), newItem, activeData, newActivationData)) {\r\n dfd.resolve(true);\r\n return;\r\n }\r\n\r\n if (newItem && newItem.canActivate) {\r\n var resultOrPromise;\r\n try {\r\n resultOrPromise = invoke(newItem, 'canActivate', newActivationData);\r\n } catch (error) {\r\n system.log('ERROR: ' + error.message, error);\r\n dfd.resolve(false);\r\n return;\r\n }\r\n\r\n if (resultOrPromise.then) {\r\n resultOrPromise.then(function(result) {\r\n settings.lifecycleData = result;\r\n dfd.resolve(settings.interpretResponse(result));\r\n }, function(reason) {\r\n if (reason) {\r\n system.log('ERROR: ' + reason.message, reason);\r\n }\r\n\r\n dfd.resolve(false);\r\n });\r\n } else {\r\n settings.lifecycleData = resultOrPromise;\r\n dfd.resolve(settings.interpretResponse(resultOrPromise));\r\n }\r\n } else {\r\n dfd.resolve(true);\r\n }\r\n }).promise();\r\n };\r\n\r\n /**\r\n * An activator is a read/write computed observable that enforces the activation lifecycle whenever changing values.\r\n * @class Activator\r\n */\r\n function createActivator(initialActiveItem, settings) {\r\n var activeItem = ko.observable(null);\r\n var activeData;\r\n\r\n settings = ensureSettings(settings);\r\n\r\n var computed = ko.computed({\r\n read: function () {\r\n return activeItem();\r\n },\r\n write: function (newValue) {\r\n computed.viaSetter = true;\r\n computed.activateItem(newValue);\r\n }\r\n });\r\n\r\n computed.__activator__ = true;\r\n\r\n /**\r\n * The settings for this activator.\r\n * @property {ActivatorSettings} settings\r\n */\r\n computed.settings = settings;\r\n settings.activator = computed;\r\n\r\n /**\r\n * An observable which indicates whether or not the activator is currently in the process of activating an instance.\r\n * @method isActivating\r\n * @return {boolean}\r\n */\r\n computed.isActivating = ko.observable(false);\r\n\r\n computed.forceActiveItem = function (item) {\r\n activeItem(item);\r\n };\r\n\r\n /**\r\n * Determines whether or not the specified item can be deactivated.\r\n * @method canDeactivateItem\r\n * @param {object} item The item to check.\r\n * @param {boolean} close Whether or not to check if close is possible.\r\n * @param {object} options Options for controlling the activation process.\r\n * @return {promise}\r\n */\r\n computed.canDeactivateItem = function (item, close, options) {\r\n return canDeactivateItem(item, close, settings, options);\r\n };\r\n\r\n /**\r\n * Deactivates the specified item.\r\n * @method deactivateItem\r\n * @param {object} item The item to deactivate.\r\n * @param {boolean} close Whether or not to close the item.\r\n * @return {promise}\r\n */\r\n computed.deactivateItem = function (item, close) {\r\n return system.defer(function(dfd) {\r\n computed.canDeactivateItem(item, close).then(function(canDeactivate) {\r\n if (canDeactivate) {\r\n deactivate(item, close, settings, dfd, activeItem);\r\n } else {\r\n computed.notifySubscribers();\r\n dfd.resolve(false);\r\n }\r\n });\r\n }).promise();\r\n };\r\n\r\n /**\r\n * Determines whether or not the specified item can be activated.\r\n * @method canActivateItem\r\n * @param {object} item The item to check.\r\n * @param {object} activationData Data associated with the activation.\r\n * @return {promise}\r\n */\r\n computed.canActivateItem = function (newItem, activationData) {\r\n return canActivateItem(newItem, activeItem, settings, activeData, activationData);\r\n };\r\n\r\n /**\r\n * Activates the specified item.\r\n * @method activateItem\r\n * @param {object} newItem The item to activate.\r\n * @param {object} newActivationData Data associated with the activation.\r\n * @param {object} options Options for controlling the activation process.\r\n * @return {promise}\r\n */\r\n computed.activateItem = function (newItem, newActivationData, options) {\r\n var viaSetter = computed.viaSetter;\r\n computed.viaSetter = false;\r\n\r\n return system.defer(function (dfd) {\r\n if (computed.isActivating()) {\r\n dfd.resolve(false);\r\n return;\r\n }\r\n\r\n computed.isActivating(true);\r\n\r\n var currentItem = activeItem();\r\n if (settings.areSameItem(currentItem, newItem, activeData, newActivationData)) {\r\n computed.isActivating(false);\r\n dfd.resolve(true);\r\n return;\r\n }\r\n\r\n computed.canDeactivateItem(currentItem, settings.closeOnDeactivate, options).then(function (canDeactivate) {\r\n if (canDeactivate) {\r\n computed.canActivateItem(newItem, newActivationData).then(function (canActivate) {\r\n if (canActivate) {\r\n system.defer(function (dfd2) {\r\n deactivate(currentItem, settings.closeOnDeactivate, settings, dfd2);\r\n }).promise().then(function () {\r\n newItem = settings.beforeActivate(newItem, newActivationData);\r\n activate(newItem, activeItem, function (result) {\r\n activeData = newActivationData;\r\n computed.isActivating(false);\r\n dfd.resolve(result);\r\n }, newActivationData);\r\n });\r\n } else {\r\n if (viaSetter) {\r\n computed.notifySubscribers();\r\n }\r\n\r\n computed.isActivating(false);\r\n dfd.resolve(false);\r\n }\r\n });\r\n } else {\r\n if (viaSetter) {\r\n computed.notifySubscribers();\r\n }\r\n\r\n computed.isActivating(false);\r\n dfd.resolve(false);\r\n }\r\n });\r\n }).promise();\r\n };\r\n\r\n /**\r\n * Determines whether or not the activator, in its current state, can be activated.\r\n * @method canActivate\r\n * @return {promise}\r\n */\r\n computed.canActivate = function () {\r\n var toCheck;\r\n\r\n if (initialActiveItem) {\r\n toCheck = initialActiveItem;\r\n initialActiveItem = false;\r\n } else {\r\n toCheck = computed();\r\n }\r\n\r\n return computed.canActivateItem(toCheck);\r\n };\r\n\r\n /**\r\n * Activates the activator, in its current state.\r\n * @method activate\r\n * @return {promise}\r\n */\r\n computed.activate = function () {\r\n var toActivate;\r\n\r\n if (initialActiveItem) {\r\n toActivate = initialActiveItem;\r\n initialActiveItem = false;\r\n } else {\r\n toActivate = computed();\r\n }\r\n\r\n return computed.activateItem(toActivate);\r\n };\r\n\r\n /**\r\n * Determines whether or not the activator, in its current state, can be deactivated.\r\n * @method canDeactivate\r\n * @return {promise}\r\n */\r\n computed.canDeactivate = function (close) {\r\n return computed.canDeactivateItem(computed(), close);\r\n };\r\n\r\n /**\r\n * Deactivates the activator, in its current state.\r\n * @method deactivate\r\n * @return {promise}\r\n */\r\n computed.deactivate = function (close) {\r\n return computed.deactivateItem(computed(), close);\r\n };\r\n\r\n computed.includeIn = function (includeIn) {\r\n includeIn.canActivate = function () {\r\n return computed.canActivate();\r\n };\r\n\r\n includeIn.activate = function () {\r\n return computed.activate();\r\n };\r\n\r\n includeIn.canDeactivate = function (close) {\r\n return computed.canDeactivate(close);\r\n };\r\n\r\n includeIn.deactivate = function (close) {\r\n return computed.deactivate(close);\r\n };\r\n };\r\n\r\n if (settings.includeIn) {\r\n computed.includeIn(settings.includeIn);\r\n } else if (initialActiveItem) {\r\n computed.activate();\r\n }\r\n\r\n computed.forItems = function (items) {\r\n settings.closeOnDeactivate = false;\r\n\r\n settings.determineNextItemToActivate = function (list, lastIndex) {\r\n var toRemoveAt = lastIndex - 1;\r\n\r\n if (toRemoveAt == -1 && list.length > 1) {\r\n return list[1];\r\n }\r\n\r\n if (toRemoveAt > -1 && toRemoveAt < list.length - 1) {\r\n return list[toRemoveAt];\r\n }\r\n\r\n return null;\r\n };\r\n\r\n settings.beforeActivate = function (newItem) {\r\n var currentItem = computed();\r\n\r\n if (!newItem) {\r\n newItem = settings.determineNextItemToActivate(items, currentItem ? items.indexOf(currentItem) : 0);\r\n } else {\r\n var index = items.indexOf(newItem);\r\n\r\n if (index == -1) {\r\n items.push(newItem);\r\n } else {\r\n newItem = items()[index];\r\n }\r\n }\r\n\r\n return newItem;\r\n };\r\n\r\n settings.afterDeactivate = function (oldItem, close) {\r\n if (close) {\r\n items.remove(oldItem);\r\n }\r\n };\r\n\r\n var originalCanDeactivate = computed.canDeactivate;\r\n computed.canDeactivate = function (close) {\r\n if (close) {\r\n return system.defer(function (dfd) {\r\n var list = items();\r\n var results = [];\r\n\r\n function finish() {\r\n for (var j = 0; j < results.length; j++) {\r\n if (!results[j]) {\r\n dfd.resolve(false);\r\n return;\r\n }\r\n }\r\n\r\n dfd.resolve(true);\r\n }\r\n\r\n for (var i = 0; i < list.length; i++) {\r\n computed.canDeactivateItem(list[i], close).then(function (result) {\r\n results.push(result);\r\n if (results.length == list.length) {\r\n finish();\r\n }\r\n });\r\n }\r\n }).promise();\r\n } else {\r\n return originalCanDeactivate();\r\n }\r\n };\r\n\r\n var originalDeactivate = computed.deactivate;\r\n computed.deactivate = function (close) {\r\n if (close) {\r\n return system.defer(function (dfd) {\r\n var list = items();\r\n var results = 0;\r\n var listLength = list.length;\r\n\r\n function doDeactivate(item) {\r\n setTimeout(function () {\r\n computed.deactivateItem(item, close).then(function () {\r\n results++;\r\n items.remove(item);\r\n if (results == listLength) {\r\n dfd.resolve();\r\n }\r\n });\r\n }, 1);\r\n }\r\n\r\n for (var i = 0; i < listLength; i++) {\r\n doDeactivate(list[i]);\r\n }\r\n }).promise();\r\n } else {\r\n return originalDeactivate();\r\n }\r\n };\r\n\r\n return computed;\r\n };\r\n\r\n return computed;\r\n }\r\n\r\n /**\r\n * @class ActivatorSettings\r\n * @static\r\n */\r\n var activatorSettings = {\r\n /**\r\n * The default value passed to an object's deactivate function as its close parameter.\r\n * @property {boolean} closeOnDeactivate\r\n * @default true\r\n */\r\n closeOnDeactivate: true,\r\n /**\r\n * Lower-cased words which represent a truthy value.\r\n * @property {string[]} affirmations\r\n * @default ['yes', 'ok', 'true']\r\n */\r\n affirmations: ['yes', 'ok', 'true'],\r\n /**\r\n * Interprets the response of a `canActivate` or `canDeactivate` call using the known affirmative values in the `affirmations` array.\r\n * @method interpretResponse\r\n * @param {object} value\r\n * @return {boolean}\r\n */\r\n interpretResponse: function(value) {\r\n if(system.isObject(value)) {\r\n value = value.can || false;\r\n }\r\n\r\n if(system.isString(value)) {\r\n return ko.utils.arrayIndexOf(this.affirmations, value.toLowerCase()) !== -1;\r\n }\r\n\r\n return value;\r\n },\r\n /**\r\n * Determines whether or not the current item and the new item are the same.\r\n * @method areSameItem\r\n * @param {object} currentItem\r\n * @param {object} newItem\r\n * @param {object} currentActivationData\r\n * @param {object} newActivationData\r\n * @return {boolean}\r\n */\r\n areSameItem: function(currentItem, newItem, currentActivationData, newActivationData) {\r\n return currentItem == newItem;\r\n },\r\n /**\r\n * Called immediately before the new item is activated.\r\n * @method beforeActivate\r\n * @param {object} newItem\r\n */\r\n beforeActivate: function(newItem) {\r\n return newItem;\r\n },\r\n /**\r\n * Called immediately after the old item is deactivated.\r\n * @method afterDeactivate\r\n * @param {object} oldItem The previous item.\r\n * @param {boolean} close Whether or not the previous item was closed.\r\n * @param {function} setter The activate item setter function.\r\n */\r\n afterDeactivate: function(oldItem, close, setter) {\r\n if(close && setter) {\r\n setter(null);\r\n }\r\n },\r\n findChildActivator: function(item){\r\n return null;\r\n }\r\n };\r\n\r\n /**\r\n * @class ActivatorModule\r\n * @static\r\n */\r\n activator = {\r\n /**\r\n * The default settings used by activators.\r\n * @property {ActivatorSettings} defaults\r\n */\r\n defaults: activatorSettings,\r\n /**\r\n * Creates a new activator.\r\n * @method create\r\n * @param {object} [initialActiveItem] The item which should be immediately activated upon creation of the ativator.\r\n * @param {ActivatorSettings} [settings] Per activator overrides of the default activator settings.\r\n * @return {Activator} The created activator.\r\n */\r\n create: createActivator,\r\n /**\r\n * Determines whether or not the provided object is an activator or not.\r\n * @method isActivator\r\n * @param {object} object Any object you wish to verify as an activator or not.\r\n * @return {boolean} True if the object is an activator; false otherwise.\r\n */\r\n isActivator:function(object){\r\n return object && object.__activator__;\r\n }\r\n };\r\n\r\n return activator;\r\n});\r\n","/**\r\n * Durandal 2.2.0 Copyright (c) 2010-2016 Blue Spire Consulting, Inc. All Rights Reserved.\r\n * Available via the MIT license.\r\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\r\n */\r\n/**\r\n * The app module controls app startup, plugin loading/configuration and root visual display.\r\n * @module app\r\n * @requires system\r\n * @requires viewEngine\r\n * @requires composition\r\n * @requires events\r\n * @requires jquery\r\n */\r\ndefine('durandal/app', ['durandal/system', 'durandal/viewEngine', 'durandal/composition', 'durandal/events', 'jquery'], function(system, viewEngine, composition, Events, $) {\r\n var app,\r\n allPluginIds = [],\r\n allPluginConfigs = [];\r\n\r\n function loadPlugins(){\r\n return system.defer(function(dfd){\r\n if(allPluginIds.length == 0){\r\n dfd.resolve();\r\n return;\r\n }\r\n\r\n system.acquire(allPluginIds).then(function(loaded){\r\n for(var i = 0; i < loaded.length; i++){\r\n var currentModule = loaded[i];\r\n\r\n if(currentModule.install){\r\n var config = allPluginConfigs[i];\r\n if(!system.isObject(config)){\r\n config = {};\r\n }\r\n\r\n currentModule.install(config);\r\n system.log('Plugin:Installed ' + allPluginIds[i]);\r\n }else{\r\n system.log('Plugin:Loaded ' + allPluginIds[i]);\r\n }\r\n }\r\n\r\n dfd.resolve();\r\n }).fail(function(err){\r\n system.error('Failed to load plugin(s). Details: ' + err.message);\r\n });\r\n }).promise();\r\n }\r\n\r\n /**\r\n * @class AppModule\r\n * @static\r\n * @uses Events\r\n */\r\n app = {\r\n /**\r\n * The title of your application.\r\n * @property {string} title\r\n */\r\n title: 'Application',\r\n /**\r\n * Configures one or more plugins to be loaded and installed into the application.\r\n * @method configurePlugins\r\n * @param {object} config Keys are plugin names. Values can be truthy, to simply install the plugin, or a configuration object to pass to the plugin.\r\n * @param {string} [baseUrl] The base url to load the plugins from.\r\n */\r\n configurePlugins:function(config, baseUrl){\r\n var pluginIds = system.keys(config);\r\n baseUrl = baseUrl || 'plugins/';\r\n\r\n if(baseUrl.indexOf('/', baseUrl.length - 1) === -1){\r\n baseUrl += '/';\r\n }\r\n\r\n for(var i = 0; i < pluginIds.length; i++){\r\n var key = pluginIds[i];\r\n allPluginIds.push(baseUrl + key);\r\n allPluginConfigs.push(config[key]);\r\n }\r\n },\r\n /**\r\n * Starts the application.\r\n * @method start\r\n * @return {promise}\r\n */\r\n start: function() {\r\n system.log('Application:Starting');\r\n\r\n if (this.title) {\r\n document.title = this.title;\r\n }\r\n\r\n return system.defer(function (dfd) {\r\n $(function() {\r\n loadPlugins().then(function(){\r\n dfd.resolve();\r\n system.log('Application:Started');\r\n });\r\n });\r\n }).promise();\r\n },\r\n /**\r\n * Sets the root module/view for the application.\r\n * @method setRoot\r\n * @param {string} root The root view or module.\r\n * @param {string} [transition] The transition to use from the previous root (or splash screen) into the new root.\r\n * @param {string} [applicationHost] The application host element or id. By default the id 'applicationHost' will be used.\r\n */\r\n setRoot: function(root, transition, applicationHost) {\r\n var hostElement, settings = { activate:true, transition: transition };\r\n\r\n if (!applicationHost || system.isString(applicationHost)) {\r\n hostElement = document.getElementById(applicationHost || 'applicationHost');\r\n } else {\r\n hostElement = applicationHost;\r\n }\r\n\r\n if (system.isString(root)) {\r\n if (viewEngine.isViewUrl(root)) {\r\n settings.view = root;\r\n } else {\r\n settings.model = root;\r\n }\r\n } else {\r\n settings.model = root;\r\n }\r\n\r\n function finishComposition() {\r\n if(settings.model) {\r\n if (settings.model.canActivate) {\r\n try {\r\n var result = settings.model.canActivate();\r\n if (result && result.then) {\r\n result.then(function (actualResult) {\r\n if (actualResult) {\r\n composition.compose(hostElement, settings);\r\n }\r\n }).fail(function (err) {\r\n system.error(err);\r\n });\r\n } else if (result) {\r\n composition.compose(hostElement, settings);\r\n }\r\n } catch (er) {\r\n system.error(er);\r\n }\r\n } else {\r\n composition.compose(hostElement, settings);\r\n }\r\n } else {\r\n composition.compose(hostElement, settings);\r\n }\r\n }\r\n\r\n if(system.isString(settings.model)) {\r\n system.acquire(settings.model).then(function(module) {\r\n settings.model = system.resolveObject(module);\r\n finishComposition();\r\n }).fail(function(err) {\r\n system.error('Failed to load root module (' + settings.model + '). Details: ' + err.message);\r\n });\r\n } else {\r\n finishComposition();\r\n }\r\n }\r\n };\r\n\r\n Events.includeIn(app);\r\n\r\n return app;\r\n});\r\n","/**\r\n * Durandal 2.2.0 Copyright (c) 2010-2016 Blue Spire Consulting, Inc. All Rights Reserved.\r\n * Available via the MIT license.\r\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\r\n */\r\n/**\r\n * The binder joins an object instance and a DOM element tree by applying databinding and/or invoking binding lifecycle callbacks (binding and bindingComplete).\r\n * @module binder\r\n * @requires system\r\n * @requires knockout\r\n */\r\ndefine('durandal/binder', ['durandal/system', 'knockout'], function (system, ko) {\r\n var binder,\r\n insufficientInfoMessage = 'Insufficient Information to Bind',\r\n unexpectedViewMessage = 'Unexpected View Type',\r\n bindingInstructionKey = 'durandal-binding-instruction',\r\n koBindingContextKey = '__ko_bindingContext__';\r\n\r\n function normalizeBindingInstruction(result){\r\n if(result === undefined){\r\n return { applyBindings: true };\r\n }\r\n\r\n if(system.isBoolean(result)){\r\n return { applyBindings:result };\r\n }\r\n\r\n if(result.applyBindings === undefined){\r\n result.applyBindings = true;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function doBind(obj, view, bindingTarget, data){\r\n if (!view || !bindingTarget) {\r\n if (binder.throwOnErrors) {\r\n system.error(insufficientInfoMessage);\r\n } else {\r\n system.log(insufficientInfoMessage, view, data);\r\n }\r\n return;\r\n }\r\n\r\n if (!view.getAttribute) {\r\n if (binder.throwOnErrors) {\r\n system.error(unexpectedViewMessage);\r\n } else {\r\n system.log(unexpectedViewMessage, view, data);\r\n }\r\n return;\r\n }\r\n\r\n var viewName = view.getAttribute('data-view');\r\n\r\n try {\r\n var instruction;\r\n\r\n if (obj && obj.binding) {\r\n instruction = obj.binding(view);\r\n }\r\n\r\n instruction = normalizeBindingInstruction(instruction);\r\n binder.binding(data, view, instruction);\r\n\r\n if(instruction.applyBindings){\r\n system.log('Binding', viewName, data);\r\n ko.applyBindings(bindingTarget, view);\r\n }else if(obj){\r\n ko.utils.domData.set(view, koBindingContextKey, { $data:obj });\r\n }\r\n\r\n binder.bindingComplete(data, view, instruction);\r\n\r\n if (obj && obj.bindingComplete) {\r\n obj.bindingComplete(view);\r\n }\r\n\r\n ko.utils.domData.set(view, bindingInstructionKey, instruction);\r\n return instruction;\r\n } catch (e) {\r\n e.message = e.message + ';\\nView: ' + viewName + \";\\nModuleId: \" + system.getModuleId(data);\r\n if (binder.throwOnErrors) {\r\n system.error(e);\r\n } else {\r\n system.log(e.message);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @class BinderModule\r\n * @static\r\n */\r\n return binder = {\r\n /**\r\n * Called before every binding operation. Does nothing by default.\r\n * @method binding\r\n * @param {object} data The data that is about to be bound.\r\n * @param {DOMElement} view The view that is about to be bound.\r\n * @param {object} instruction The object that carries the binding instructions.\r\n */\r\n binding: system.noop,\r\n /**\r\n * Called after every binding operation. Does nothing by default.\r\n * @method bindingComplete\r\n * @param {object} data The data that has just been bound.\r\n * @param {DOMElement} view The view that has just been bound.\r\n * @param {object} instruction The object that carries the binding instructions.\r\n */\r\n bindingComplete: system.noop,\r\n /**\r\n * Indicates whether or not the binding system should throw errors or not.\r\n * @property {boolean} throwOnErrors\r\n * @default false The binding system will not throw errors by default. Instead it will log them.\r\n */\r\n throwOnErrors: false,\r\n /**\r\n * Gets the binding instruction that was associated with a view when it was bound.\r\n * @method getBindingInstruction\r\n * @param {DOMElement} view The view that was previously bound.\r\n * @return {object} The object that carries the binding instructions.\r\n */\r\n getBindingInstruction:function(view){\r\n return ko.utils.domData.get(view, bindingInstructionKey);\r\n },\r\n /**\r\n * Binds the view, preserving the existing binding context. Optionally, a new context can be created, parented to the previous context.\r\n * @method bindContext\r\n * @param {KnockoutBindingContext} bindingContext The current binding context.\r\n * @param {DOMElement} view The view to bind.\r\n * @param {object} [obj] The data to bind to, causing the creation of a child binding context if present.\r\n * @param {string} [dataAlias] An alias for $data if present.\r\n */\r\n bindContext: function(bindingContext, view, obj, dataAlias) {\r\n if (obj && bindingContext) {\r\n bindingContext = bindingContext.createChildContext(obj, typeof(dataAlias) === 'string' ? dataAlias : null);\r\n }\r\n\r\n return doBind(obj, view, bindingContext, obj || (bindingContext ? bindingContext.$data : null));\r\n },\r\n /**\r\n * Binds the view, preserving the existing binding context. Optionally, a new context can be created, parented to the previous context.\r\n * @method bind\r\n * @param {object} obj The data to bind to.\r\n * @param {DOMElement} view The view to bind.\r\n */\r\n bind: function(obj, view) {\r\n return doBind(obj, view, obj, obj);\r\n }\r\n };\r\n});\r\n","/**\r\n * Durandal 2.2.0 Copyright (c) 2010-2016 Blue Spire Consulting, Inc. All Rights Reserved.\r\n * Available via the MIT license.\r\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\r\n */\r\n/**\r\n * The composition module encapsulates all functionality related to visual composition.\r\n * @module composition\r\n * @requires system\r\n * @requires viewLocator\r\n * @requires binder\r\n * @requires viewEngine\r\n * @requires activator\r\n * @requires jquery\r\n * @requires knockout\r\n */\r\ndefine('durandal/composition', ['durandal/system', 'durandal/viewLocator', 'durandal/binder', 'durandal/viewEngine', 'durandal/activator', 'jquery', 'knockout'], function (system, viewLocator, binder, viewEngine, activator, $, ko) {\r\n var dummyModel = {},\r\n activeViewAttributeName = 'data-active-view',\r\n composition,\r\n compositionCompleteCallbacks = [],\r\n compositionCount = 0,\r\n compositionDataKey = 'durandal-composition-data',\r\n partAttributeName = 'data-part',\r\n bindableSettings = ['model', 'view', 'transition', 'area', 'strategy', 'activationData', 'onError'],\r\n visibilityKey = \"durandal-visibility-data\",\r\n composeBindings = ['compose:'];\r\n \r\n function onError(context, error, element) {\r\n try {\r\n if (context.onError) {\r\n try {\r\n context.onError(error, element);\r\n } catch (e) {\r\n system.error(e);\r\n }\r\n } else {\r\n system.error(error);\r\n }\r\n } finally {\r\n endComposition(context, element, true);\r\n }\r\n }\r\n\r\n function getHostState(parent) {\r\n var elements = [];\r\n var state = {\r\n childElements: elements,\r\n activeView: null\r\n };\r\n\r\n var child = ko.virtualElements.firstChild(parent);\r\n\r\n while (child) {\r\n if (child.nodeType == 1) {\r\n elements.push(child);\r\n if (child.getAttribute(activeViewAttributeName)) {\r\n state.activeView = child;\r\n }\r\n }\r\n\r\n child = ko.virtualElements.nextSibling(child);\r\n }\r\n\r\n if(!state.activeView){\r\n state.activeView = elements[0];\r\n }\r\n\r\n return state;\r\n }\r\n\r\n function endComposition(context, element, error) {\r\n compositionCount--;\r\n\r\n if(compositionCount === 0) {\r\n var callBacks = compositionCompleteCallbacks;\r\n compositionCompleteCallbacks = [];\r\n \r\n if (!error) {\r\n setTimeout(function () {\r\n var i = callBacks.length;\r\n\r\n while (i--) {\r\n try {\r\n callBacks[i]();\r\n } catch (e) {\r\n onError(context, e, element);\r\n }\r\n }\r\n }, 1);\r\n }\r\n }\r\n\r\n cleanUp(context);\r\n }\r\n\r\n function cleanUp(context){\r\n delete context.activeView;\r\n delete context.viewElements;\r\n }\r\n\r\n function tryActivate(context, successCallback, skipActivation, element) {\r\n if(skipActivation){\r\n successCallback();\r\n } else if (context.activate && context.model && context.model.activate) {\r\n var result;\r\n\r\n try{\r\n if(system.isArray(context.activationData)) {\r\n result = context.model.activate.apply(context.model, context.activationData);\r\n } else {\r\n result = context.model.activate(context.activationData);\r\n }\r\n\r\n if(result && result.then) {\r\n result.then(successCallback, function(reason) {\r\n onError(context, reason, element);\r\n successCallback();\r\n });\r\n } else if(result || result === undefined) {\r\n successCallback();\r\n } else {\r\n endComposition(context, element);\r\n }\r\n }\r\n catch(e){\r\n onError(context, e, element);\r\n }\r\n } else {\r\n successCallback();\r\n }\r\n }\r\n\r\n function triggerAttach(context, element) {\r\n var context = this;\r\n\r\n if (context.activeView) {\r\n context.activeView.removeAttribute(activeViewAttributeName);\r\n }\r\n\r\n if (context.child) {\r\n try{\r\n if (context.model && context.model.attached) {\r\n if (context.composingNewView || context.alwaysTriggerAttach) {\r\n context.model.attached(context.child, context.parent, context);\r\n }\r\n }\r\n\r\n if (context.attached) {\r\n context.attached(context.child, context.parent, context);\r\n }\r\n\r\n context.child.setAttribute(activeViewAttributeName, true);\r\n\r\n if (context.composingNewView && context.model && context.model.detached) {\r\n ko.utils.domNodeDisposal.addDisposeCallback(context.child, function () {\r\n try{\r\n context.model.detached(context.child, context.parent, context);\r\n }catch(e2){\r\n onError(context, e2, element);\r\n }\r\n });\r\n }\r\n }catch(e){\r\n onError(context, e, element);\r\n }\r\n }\r\n\r\n context.triggerAttach = system.noop;\r\n }\r\n\r\n function shouldTransition(context) {\r\n if (system.isString(context.transition)) {\r\n if (context.activeView) {\r\n if (context.activeView == context.child) {\r\n return false;\r\n }\r\n\r\n if (!context.child) {\r\n return true;\r\n }\r\n\r\n if (context.skipTransitionOnSameViewId) {\r\n var currentViewId = context.activeView.getAttribute('data-view');\r\n var newViewId = context.child.getAttribute('data-view');\r\n return currentViewId != newViewId;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n function cloneNodes(nodesArray) {\r\n for (var i = 0, j = nodesArray.length, newNodesArray = []; i < j; i++) {\r\n var clonedNode = nodesArray[i].cloneNode(true);\r\n newNodesArray.push(clonedNode);\r\n }\r\n return newNodesArray;\r\n }\r\n\r\n function replaceParts(context){\r\n var parts = cloneNodes(context.parts);\r\n var replacementParts = composition.getParts(parts);\r\n var standardParts = composition.getParts(context.child);\r\n\r\n for (var partId in replacementParts) {\r\n var toReplace = standardParts[partId];\r\n if (!toReplace) {\r\n toReplace = $('[data-part=\"' + partId + '\"]', context.child).get(0);\r\n if (!toReplace) {\r\n system.log('Could not find part to override: ' + partId);\r\n continue;\r\n }\r\n }\r\n\r\n toReplace.parentNode.replaceChild(replacementParts[partId], toReplace);\r\n }\r\n }\r\n\r\n function removePreviousView(context){\r\n var children = ko.virtualElements.childNodes(context.parent), i, len;\r\n\r\n if(!system.isArray(children)){\r\n var arrayChildren = [];\r\n for(i = 0, len = children.length; i < len; i++){\r\n arrayChildren[i] = children[i];\r\n }\r\n children = arrayChildren;\r\n }\r\n\r\n for(i = 1,len = children.length; i < len; i++){\r\n ko.removeNode(children[i]);\r\n }\r\n }\r\n\r\n function hide(view) {\r\n ko.utils.domData.set(view, visibilityKey, view.style.display);\r\n view.style.display = 'none';\r\n }\r\n\r\n function show(view) {\r\n var displayStyle = ko.utils.domData.get(view, visibilityKey);\r\n view.style.display = displayStyle === 'none' ? 'block' : displayStyle;\r\n }\r\n\r\n function hasComposition(element){\r\n var dataBind = element.getAttribute('data-bind');\r\n if(!dataBind){\r\n return false;\r\n }\r\n\r\n for(var i = 0, length = composeBindings.length; i < length; i++){\r\n if(dataBind.indexOf(composeBindings[i]) > -1){\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * @class CompositionTransaction\r\n * @static\r\n */\r\n var compositionTransaction = {\r\n /**\r\n * Registers a callback which will be invoked when the current composition transaction has completed. The transaction includes all parent and children compositions.\r\n * @method complete\r\n * @param {function} callback The callback to be invoked when composition is complete.\r\n */\r\n complete: function (callback) {\r\n compositionCompleteCallbacks.push(callback);\r\n }\r\n };\r\n\r\n /**\r\n * @class CompositionModule\r\n * @static\r\n */\r\n composition = {\r\n /**\r\n * An array of all the binding handler names (includeing :) that trigger a composition.\r\n * @property {string} composeBindings\r\n * @default ['compose:']\r\n */\r\n composeBindings:composeBindings,\r\n /**\r\n * Converts a transition name to its moduleId.\r\n * @method convertTransitionToModuleId\r\n * @param {string} name The name of the transtion.\r\n * @return {string} The moduleId.\r\n */\r\n convertTransitionToModuleId: function (name) {\r\n return 'transitions/' + name;\r\n },\r\n /**\r\n * The name of the transition to use in all compositions.\r\n * @property {string} defaultTransitionName\r\n * @default null\r\n */\r\n defaultTransitionName: null,\r\n /**\r\n * Represents the currently executing composition transaction.\r\n * @property {CompositionTransaction} current\r\n */\r\n current: compositionTransaction,\r\n /**\r\n * Registers a binding handler that will be invoked when the current composition transaction is complete.\r\n * @method addBindingHandler\r\n * @param {string} name The name of the binding handler.\r\n * @param {object} [config] The binding handler instance. If none is provided, the name will be used to look up an existing handler which will then be converted to a composition handler.\r\n * @param {function} [initOptionsFactory] If the registered binding needs to return options from its init call back to knockout, this function will server as a factory for those options. It will receive the same parameters that the init function does.\r\n */\r\n addBindingHandler:function(name, config, initOptionsFactory){\r\n var key,\r\n dataKey = 'composition-handler-' + name,\r\n handler;\r\n\r\n config = config || ko.bindingHandlers[name];\r\n initOptionsFactory = initOptionsFactory || function(){ return undefined; };\r\n\r\n handler = ko.bindingHandlers[name] = {\r\n init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {\r\n if(compositionCount > 0){\r\n var data = {\r\n trigger:ko.observable(null)\r\n };\r\n\r\n composition.current.complete(function(){\r\n if(config.init){\r\n config.init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);\r\n }\r\n\r\n if(config.update){\r\n ko.utils.domData.set(element, dataKey, config);\r\n data.trigger('trigger');\r\n }\r\n });\r\n\r\n ko.utils.domData.set(element, dataKey, data);\r\n }else{\r\n ko.utils.domData.set(element, dataKey, config);\r\n\r\n if(config.init){\r\n config.init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);\r\n }\r\n }\r\n\r\n return initOptionsFactory(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);\r\n },\r\n update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {\r\n var data = ko.utils.domData.get(element, dataKey);\r\n\r\n if(data.update){\r\n return data.update(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);\r\n }\r\n\r\n if(data.trigger){\r\n data.trigger();\r\n }\r\n }\r\n };\r\n\r\n for (key in config) {\r\n if (key !== \"init\" && key !== \"update\") {\r\n handler[key] = config[key];\r\n }\r\n }\r\n },\r\n /**\r\n * Gets an object keyed with all the elements that are replacable parts, found within the supplied elements. The key will be the part name and the value will be the element itself.\r\n * @method getParts\r\n * @param {DOMElement\\DOMElement[]} elements The element(s) to search for parts.\r\n * @return {object} An object keyed by part.\r\n */\r\n getParts: function(elements, parts) {\r\n parts = parts || {};\r\n\r\n if (!elements) {\r\n return parts;\r\n }\r\n\r\n if (elements.length === undefined) {\r\n elements = [elements];\r\n }\r\n\r\n for (var i = 0, length = elements.length; i < length; i++) {\r\n var element = elements[i],\r\n id;\r\n\r\n if (element.getAttribute) {\r\n id = element.getAttribute(partAttributeName);\r\n if (id) {\r\n parts[id] = element;\r\n }\r\n\r\n if (element.hasChildNodes() && !hasComposition(element)) {\r\n composition.getParts(element.childNodes, parts);\r\n }\r\n }\r\n }\r\n\r\n return parts;\r\n },\r\n cloneNodes:cloneNodes,\r\n finalize: function (context, element) {\r\n if(context.transition === undefined) {\r\n context.transition = this.defaultTransitionName;\r\n }\r\n\r\n if(!context.child && !context.activeView){\r\n if (!context.cacheViews) {\r\n ko.virtualElements.emptyNode(context.parent);\r\n }\r\n\r\n context.triggerAttach(context, element);\r\n endComposition(context, element);\r\n } else if (shouldTransition(context)) {\r\n var transitionModuleId = this.convertTransitionToModuleId(context.transition);\r\n\r\n system.acquire(transitionModuleId).then(function (transition) {\r\n context.transition = transition;\r\n\r\n transition(context).then(function () {\r\n if (!context.cacheViews) {\r\n if(!context.child){\r\n ko.virtualElements.emptyNode(context.parent);\r\n }else{\r\n removePreviousView(context);\r\n }\r\n }else if(context.activeView){\r\n var instruction = binder.getBindingInstruction(context.activeView);\r\n if(instruction && instruction.cacheViews != undefined && !instruction.cacheViews){\r\n ko.removeNode(context.activeView);\r\n }else{\r\n hide(context.activeView);\r\n }\r\n }\r\n\r\n if (context.child) {\r\n show(context.child);\r\n }\r\n\r\n context.triggerAttach(context, element);\r\n endComposition(context, element);\r\n });\r\n }).fail(function(err){\r\n onError(context, 'Failed to load transition (' + transitionModuleId + '). Details: ' + err.message, element);\r\n });\r\n } else {\r\n if (context.child != context.activeView) {\r\n if (context.cacheViews && context.activeView) {\r\n var instruction = binder.getBindingInstruction(context.activeView);\r\n if(!instruction || (instruction.cacheViews != undefined && !instruction.cacheViews)){\r\n ko.removeNode(context.activeView);\r\n }else{\r\n hide(context.activeView);\r\n }\r\n }\r\n\r\n if (!context.child) {\r\n if (!context.cacheViews) {\r\n ko.virtualElements.emptyNode(context.parent);\r\n }\r\n } else {\r\n if (!context.cacheViews) {\r\n removePreviousView(context);\r\n }\r\n\r\n show(context.child);\r\n }\r\n }\r\n\r\n context.triggerAttach(context, element);\r\n endComposition(context, element);\r\n }\r\n },\r\n bindAndShow: function (child, element, context, skipActivation) {\r\n context.child = child;\r\n context.parent.__composition_context = context;\r\n\r\n if (context.cacheViews) {\r\n context.composingNewView = (ko.utils.arrayIndexOf(context.viewElements, child) == -1);\r\n } else {\r\n context.composingNewView = true;\r\n }\r\n\r\n tryActivate(context, function () {\r\n if (context.parent.__composition_context == context) {\r\n try {\r\n delete context.parent.__composition_context;\r\n }\r\n catch(e) {\r\n context.parent.__composition_context = undefined;\r\n }\r\n\r\n if (context.binding) {\r\n context.binding(context.child, context.parent, context);\r\n }\r\n\r\n if (context.preserveContext && context.bindingContext) {\r\n if (context.composingNewView) {\r\n if(context.parts){\r\n replaceParts(context);\r\n }\r\n\r\n hide(child);\r\n ko.virtualElements.prepend(context.parent, child);\r\n\r\n binder.bindContext(context.bindingContext, child, context.model, context.as);\r\n }\r\n } else if (child) {\r\n var modelToBind = context.model || dummyModel;\r\n var currentModel = ko.dataFor(child);\r\n\r\n if (currentModel != modelToBind) {\r\n if (!context.composingNewView) {\r\n ko.removeNode(child);\r\n viewEngine.createView(child.getAttribute('data-view')).then(function(recreatedView) {\r\n composition.bindAndShow(recreatedView, element, context, true);\r\n });\r\n return;\r\n }\r\n\r\n if(context.parts){\r\n replaceParts(context);\r\n }\r\n\r\n hide(child);\r\n ko.virtualElements.prepend(context.parent, child);\r\n\r\n binder.bind(modelToBind, child);\r\n }\r\n }\r\n\r\n composition.finalize(context, element);\r\n } else {\r\n endComposition(context, element);\r\n }\r\n }, skipActivation, element);\r\n },\r\n /**\r\n * Eecutes the default view location strategy.\r\n * @method defaultStrategy\r\n * @param {object} context The composition context containing the model and possibly existing viewElements.\r\n * @return {promise} A promise for the view.\r\n */\r\n defaultStrategy: function (context) {\r\n return viewLocator.locateViewForObject(context.model, context.area, context.viewElements);\r\n },\r\n getSettings: function (valueAccessor, element) {\r\n var value = valueAccessor(),\r\n settings = ko.utils.unwrapObservable(value) || {},\r\n activatorPresent = activator.isActivator(value),\r\n moduleId;\r\n\r\n if (system.isString(settings)) {\r\n if (viewEngine.isViewUrl(settings)) {\r\n settings = {\r\n view: settings\r\n };\r\n } else {\r\n settings = {\r\n model: settings,\r\n activate: !activatorPresent\r\n };\r\n }\r\n\r\n return settings;\r\n }\r\n\r\n moduleId = system.getModuleId(settings);\r\n if (moduleId) {\r\n settings = {\r\n model: settings,\r\n activate: !activatorPresent\r\n };\r\n\r\n return settings;\r\n }\r\n\r\n if(!activatorPresent && settings.model) {\r\n activatorPresent = activator.isActivator(settings.model);\r\n }\r\n\r\n for (var attrName in settings) {\r\n if (ko.utils.arrayIndexOf(bindableSettings, attrName) != -1) {\r\n settings[attrName] = ko.utils.unwrapObservable(settings[attrName]);\r\n } else {\r\n settings[attrName] = settings[attrName];\r\n }\r\n }\r\n\r\n if (activatorPresent) {\r\n settings.activate = false;\r\n } else if (settings.activate === undefined) {\r\n settings.activate = true;\r\n }\r\n\r\n return settings;\r\n },\r\n executeStrategy: function (context, element) {\r\n context.strategy(context).then(function (child) {\r\n composition.bindAndShow(child, element, context);\r\n });\r\n },\r\n inject: function (context, element) {\r\n if (!context.model) {\r\n this.bindAndShow(null, element, context);\r\n return;\r\n }\r\n\r\n if (context.view) {\r\n viewLocator.locateView(context.view, context.area, context.viewElements).then(function (child) {\r\n composition.bindAndShow(child, element, context);\r\n });\r\n return;\r\n }\r\n\r\n if (!context.strategy) {\r\n context.strategy = this.defaultStrategy;\r\n }\r\n\r\n if (system.isString(context.strategy)) {\r\n system.acquire(context.strategy).then(function (strategy) {\r\n context.strategy = strategy;\r\n composition.executeStrategy(context, element);\r\n }).fail(function (err) {\r\n onError(context, 'Failed to load view strategy (' + context.strategy + '). Details: ' + err.message, element);\r\n });\r\n } else {\r\n this.executeStrategy(context, element);\r\n }\r\n },\r\n /**\r\n * Initiates a composition.\r\n * @method compose\r\n * @param {DOMElement} element The DOMElement or knockout virtual element that serves as the parent for the composition.\r\n * @param {object} settings The composition settings.\r\n * @param {object} [bindingContext] The current binding context.\r\n */\r\n compose: function (element, settings, bindingContext, fromBinding) {\r\n // If the `model` isn't a `moduleId` string, assume it's the module\r\n // itself and resolve it using the `system` module\r\n if ('string' !== typeof settings.model) {\r\n settings.model = system.resolveObject(settings.model);\r\n }\r\n\r\n compositionCount++;\r\n\r\n if(!fromBinding){\r\n settings = composition.getSettings(function() { return settings; }, element);\r\n }\r\n\r\n if (settings.compositionComplete) {\r\n compositionCompleteCallbacks.push(function () {\r\n settings.compositionComplete(settings.child, settings.parent, settings);\r\n });\r\n }\r\n\r\n compositionCompleteCallbacks.push(function () {\r\n if(settings.composingNewView && settings.model && settings.model.compositionComplete){\r\n settings.model.compositionComplete(settings.child, settings.parent, settings);\r\n }\r\n });\r\n\r\n var hostState = getHostState(element);\r\n\r\n settings.activeView = hostState.activeView;\r\n settings.parent = element;\r\n settings.triggerAttach = triggerAttach;\r\n settings.bindingContext = bindingContext;\r\n\r\n if (settings.cacheViews && !settings.viewElements) {\r\n settings.viewElements = hostState.childElements;\r\n }\r\n\r\n if (!settings.model) {\r\n if (!settings.view) {\r\n this.bindAndShow(null, element, settings);\r\n } else {\r\n settings.area = settings.area || 'partial';\r\n settings.preserveContext = true;\r\n\r\n viewLocator.locateView(settings.view, settings.area, settings.viewElements).then(function (child) {\r\n composition.bindAndShow(child, element, settings);\r\n });\r\n }\r\n } else if (system.isString(settings.model)) {\r\n system.acquire(settings.model).then(function (module) {\r\n settings.model = system.resolveObject(module);\r\n composition.inject(settings, element);\r\n }).fail(function (err) {\r\n onError(settings, 'Failed to load composed module (' + settings.model + '). Details: ' + err.message, element);\r\n });\r\n } else {\r\n composition.inject(settings, element);\r\n }\r\n }\r\n };\r\n\r\n ko.bindingHandlers.compose = {\r\n init: function() {\r\n return { controlsDescendantBindings: true };\r\n },\r\n update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {\r\n var settings = composition.getSettings(valueAccessor, element);\r\n if(settings.mode){\r\n var data = ko.utils.domData.get(element, compositionDataKey);\r\n if(!data){\r\n var childNodes = ko.virtualElements.childNodes(element);\r\n data = {};\r\n\r\n if(settings.mode === 'inline'){\r\n data.view = viewEngine.ensureSingleElement(childNodes);\r\n }else if(settings.mode === 'templated'){\r\n data.parts = cloneNodes(childNodes);\r\n }\r\n\r\n ko.virtualElements.emptyNode(element);\r\n ko.utils.domData.set(element, compositionDataKey, data);\r\n }\r\n\r\n if(settings.mode === 'inline'){\r\n settings.view = data.view.cloneNode(true);\r\n }else if(settings.mode === 'templated'){\r\n settings.parts = data.parts;\r\n }\r\n\r\n settings.preserveContext = true;\r\n }\r\n\r\n composition.compose(element, settings, bindingContext, true);\r\n }\r\n };\r\n\r\n ko.virtualElements.allowedBindings.compose = true;\r\n\r\n return composition;\r\n});\r\n","/**\r\n * Durandal 2.2.0 Copyright (c) 2010-2016 Blue Spire Consulting, Inc. All Rights Reserved.\r\n * Available via the MIT license.\r\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\r\n */\r\n/**\r\n * Durandal events originate from backbone.js but also combine some ideas from signals.js as well as some additional improvements.\r\n * Events can be installed into any object and are installed into the `app` module by default for convenient app-wide eventing.\r\n * @module events\r\n * @requires system\r\n */\r\ndefine('durandal/events', ['durandal/system'], function (system) {\r\n var eventSplitter = /\\s+/;\r\n var Events = function() { };\r\n\r\n /**\r\n * Represents an event subscription.\r\n * @class Subscription\r\n */\r\n var Subscription = function(owner, events) {\r\n this.owner = owner;\r\n this.events = events;\r\n };\r\n\r\n /**\r\n * Attaches a callback to the event subscription.\r\n * @method then\r\n * @param {function} callback The callback function to invoke when the event is triggered.\r\n * @param {object} [context] An object to use as `this` when invoking the `callback`.\r\n * @chainable\r\n */\r\n Subscription.prototype.then = function (callback, context) {\r\n this.callback = callback || this.callback;\r\n this.context = context || this.context;\r\n \r\n if (!this.callback) {\r\n return this;\r\n }\r\n\r\n this.owner.on(this.events, this.callback, this.context);\r\n return this;\r\n };\r\n\r\n /**\r\n * Attaches a callback to the event subscription.\r\n * @method on\r\n * @param {function} [callback] The callback function to invoke when the event is triggered. If `callback` is not provided, the previous callback will be re-activated.\r\n * @param {object} [context] An object to use as `this` when invoking the `callback`.\r\n * @chainable\r\n */\r\n Subscription.prototype.on = Subscription.prototype.then;\r\n\r\n /**\r\n * Cancels the subscription.\r\n * @method off\r\n * @chainable\r\n */\r\n Subscription.prototype.off = function () {\r\n this.owner.off(this.events, this.callback, this.context);\r\n return this;\r\n };\r\n\r\n /**\r\n * Creates an object with eventing capabilities.\r\n * @class Events\r\n */\r\n\r\n /**\r\n * Creates a subscription or registers a callback for the specified event.\r\n * @method on\r\n * @param {string} events One or more events, separated by white space.\r\n * @param {function} [callback] The callback function to invoke when the event is triggered. If `callback` is not provided, a subscription instance is returned.\r\n * @param {object} [context] An object to use as `this` when invoking the `callback`.\r\n * @return {Subscription|Events} A subscription is returned if no callback is supplied, otherwise the events object is returned for chaining.\r\n */\r\n Events.prototype.on = function(events, callback, context) {\r\n var calls, event, list;\r\n\r\n if (!callback) {\r\n return new Subscription(this, events);\r\n } else {\r\n calls = this.callbacks || (this.callbacks = {});\r\n events = events.split(eventSplitter);\r\n\r\n while (event = events.shift()) {\r\n list = calls[event] || (calls[event] = []);\r\n list.push(callback, context);\r\n }\r\n\r\n return this;\r\n }\r\n };\r\n\r\n /**\r\n * Removes the callbacks for the specified events.\r\n * @method off\r\n * @param {string} [events] One or more events, separated by white space to turn off. If no events are specified, then the callbacks will be removed.\r\n * @param {function} [callback] The callback function to remove. If `callback` is not provided, all callbacks for the specified events will be removed.\r\n * @param {object} [context] The object that was used as `this`. Callbacks with this context will be removed.\r\n * @chainable\r\n */\r\n Events.prototype.off = function(events, callback, context) {\r\n var event, calls, list, i;\r\n\r\n // No events\r\n if (!(calls = this.callbacks)) {\r\n return this;\r\n }\r\n\r\n //removing all\r\n if (!(events || callback || context)) {\r\n delete this.callbacks;\r\n return this;\r\n }\r\n\r\n events = events ? events.split(eventSplitter) : system.keys(calls);\r\n\r\n // Loop through the callback list, splicing where appropriate.\r\n while (event = events.shift()) {\r\n if (!(list = calls[event]) || !(callback || context)) {\r\n delete calls[event];\r\n continue;\r\n }\r\n\r\n for (i = list.length - 2; i >= 0; i -= 2) {\r\n if (!(callback && list[i] !== callback || context && list[i + 1] !== context)) {\r\n list.splice(i, 2);\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n };\r\n\r\n /**\r\n * Triggers the specified events.\r\n * @method trigger\r\n * @param {string} [events] One or more events, separated by white space to trigger.\r\n * @chainable\r\n */\r\n Events.prototype.trigger = function(events) {\r\n var event, calls, list, i, length, args, all, rest;\r\n if (!(calls = this.callbacks)) {\r\n return this;\r\n }\r\n\r\n rest = [];\r\n events = events.split(eventSplitter);\r\n for (i = 1, length = arguments.length; i < length; i++) {\r\n rest[i - 1] = arguments[i];\r\n }\r\n\r\n // For each event, walk through the list of callbacks twice, first to\r\n // trigger the event, then to trigger any `\"all\"` callbacks.\r\n while (event = events.shift()) {\r\n // Copy callback lists to prevent modification.\r\n if (all = calls.all) {\r\n all = all.slice();\r\n }\r\n\r\n if (list = calls[event]) {\r\n list = list.slice();\r\n }\r\n\r\n // Execute event callbacks.\r\n if (list) {\r\n for (i = 0, length = list.length; i < length; i += 2) {\r\n list[i].apply(list[i + 1] || this, rest);\r\n }\r\n }\r\n\r\n // Execute \"all\" callbacks.\r\n if (all) {\r\n args = [event].concat(rest);\r\n for (i = 0, length = all.length; i < length; i += 2) {\r\n all[i].apply(all[i + 1] || this, args);\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n };\r\n\r\n /**\r\n * Creates a function that will trigger the specified events when called. Simplifies proxying jQuery (or other) events through to the events object.\r\n * @method proxy\r\n * @param {string} events One or more events, separated by white space to trigger by invoking the returned function.\r\n * @return {function} Calling the function will invoke the previously specified events on the events object.\r\n */\r\n Events.prototype.proxy = function(events) {\r\n var that = this;\r\n return (function(arg) {\r\n that.trigger(events, arg);\r\n });\r\n };\r\n\r\n /**\r\n * Creates an object with eventing capabilities.\r\n * @class EventsModule\r\n * @static\r\n */\r\n\r\n /**\r\n * Adds eventing capabilities to the specified object.\r\n * @method includeIn\r\n * @param {object} targetObject The object to add eventing capabilities to.\r\n */\r\n Events.includeIn = function(targetObject) {\r\n targetObject.on = Events.prototype.on;\r\n targetObject.off = Events.prototype.off;\r\n targetObject.trigger = Events.prototype.trigger;\r\n targetObject.proxy = Events.prototype.proxy;\r\n };\r\n\r\n return Events;\r\n});\r\n","/**\r\n * Durandal 2.2.0 Copyright (c) 2010-2016 Blue Spire Consulting, Inc. All Rights Reserved.\r\n * Available via the MIT license.\r\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\r\n */\r\n/**\r\n * This module is based on Backbone's core history support. It abstracts away the low level details of working with browser history and url changes in order to provide a solid foundation for a router.\r\n * @module history\r\n * @requires system\r\n * @requires jquery\r\n */\r\ndefine('plugins/history', ['durandal/system', 'jquery'], function (system, $) {\r\n // Cached regex for stripping a leading hash/slash and trailing space.\r\n var routeStripper = /^[#\\/]|\\s+$/g;\r\n\r\n // Cached regex for stripping leading and trailing slashes.\r\n var rootStripper = /^\\/+|\\/+$/g;\r\n\r\n // Cached regex for detecting MSIE.\r\n var isExplorer = /msie [\\w.]+/;\r\n\r\n // Cached regex for removing a trailing slash.\r\n var trailingSlash = /\\/$/;\r\n\r\n // Update the hash location, either replacing the current entry, or adding\r\n // a new one to the browser history.\r\n function updateHash(location, fragment, replace) {\r\n if (replace) {\r\n var href = location.href.replace(/(javascript:|#).*$/, '');\r\n\r\n if (history.history.replaceState) {\r\n history.history.replaceState({}, document.title, href + '#' + fragment); // using history.replaceState instead of location.replace to work around chrom bug\r\n } else {\r\n location.replace(href + '#' + fragment);\r\n }\r\n } else {\r\n // Some browsers require that `hash` contains a leading #.\r\n location.hash = '#' + fragment;\r\n }\r\n };\r\n\r\n /**\r\n * @class HistoryModule\r\n * @static\r\n */\r\n var history = {\r\n /**\r\n * The setTimeout interval used when the browser does not support hash change events.\r\n * @property {string} interval\r\n * @default 50\r\n */\r\n interval: 50,\r\n /**\r\n * Indicates whether or not the history module is actively tracking history.\r\n * @property {string} active\r\n */\r\n active: false\r\n };\r\n \r\n // Ensure that `History` can be used outside of the browser.\r\n if (typeof window !== 'undefined') {\r\n history.location = window.location;\r\n history.history = window.history;\r\n }\r\n\r\n /**\r\n * Gets the true hash value. Cannot use location.hash directly due to a bug in Firefox where location.hash will always be decoded.\r\n * @method getHash\r\n * @param {string} [window] The optional window instance\r\n * @return {string} The hash.\r\n */\r\n history.getHash = function(window) {\r\n var match = (window || history).location.href.match(/#(.*)$/);\r\n return match ? match[1] : '';\r\n };\r\n \r\n /**\r\n * Get the cross-browser normalized URL fragment, either from the URL, the hash, or the override.\r\n * @method getFragment\r\n * @param {string} fragment The fragment.\r\n * @param {boolean} forcePushState Should we force push state?\r\n * @return {string} he fragment.\r\n */\r\n history.getFragment = function(fragment, forcePushState) {\r\n if (fragment == null) {\r\n if (history._hasPushState || !history._wantsHashChange || forcePushState) {\r\n fragment = history.location.pathname + history.location.search;\r\n var root = history.root.replace(trailingSlash, '');\r\n if (!fragment.indexOf(root)) {\r\n fragment = fragment.substr(root.length);\r\n }\r\n } else {\r\n fragment = history.getHash();\r\n }\r\n }\r\n \r\n return fragment.replace(routeStripper, '');\r\n };\r\n\r\n /**\r\n * Activate the hash change handling, returning `true` if the current URL matches an existing route, and `false` otherwise.\r\n * @method activate\r\n * @param {HistoryOptions} options.\r\n * @return {boolean|undefined} Returns true/false from loading the url unless the silent option was selected.\r\n */\r\n history.activate = function(options) {\r\n if (history.active) {\r\n system.error(\"History has already been activated.\");\r\n }\r\n\r\n history.active = true;\r\n\r\n // Figure out the initial configuration. Do we need an iframe?\r\n // Is pushState desired ... is it available?\r\n history.options = system.extend({}, { root: '/' }, history.options, options);\r\n history.root = history.options.root;\r\n history._wantsHashChange = history.options.hashChange !== false;\r\n history._wantsPushState = !!history.options.pushState;\r\n history._hasPushState = !!(history.options.pushState && history.history && history.history.pushState);\r\n\r\n var fragment = history.getFragment();\r\n var docMode = document.documentMode;\r\n var oldIE = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7));\r\n\r\n // Normalize root to always include a leading and trailing slash.\r\n history.root = ('/' + history.root + '/').replace(rootStripper, '/');\r\n\r\n if (oldIE && history._wantsHashChange) {\r\n history.iframe = $('').hide().appendTo('body')[0].contentWindow;\r\n history.navigate(fragment, false);\r\n }\r\n\r\n // Depending on whether we're using pushState or hashes, and whether\r\n // 'onhashchange' is supported, determine how we check the URL state.\r\n if (history._hasPushState) {\r\n $(window).on('popstate', history.checkUrl);\r\n } else if (history._wantsHashChange && ('onhashchange' in window) && !oldIE) {\r\n $(window).on('hashchange', history.checkUrl);\r\n } else if (history._wantsHashChange) {\r\n history._checkUrlInterval = setInterval(history.checkUrl, history.interval);\r\n }\r\n\r\n // Determine if we need to change the base url, for a pushState link\r\n // opened by a non-pushState browser.\r\n history.fragment = fragment;\r\n var loc = history.location;\r\n var atRoot = loc.pathname.replace(/[^\\/]$/, '$&/') === history.root;\r\n\r\n // Transition from hashChange to pushState or vice versa if both are requested.\r\n if (history._wantsHashChange && history._wantsPushState) {\r\n // If we've started off with a route from a `pushState`-enabled\r\n // browser, but we're currently in a browser that doesn't support it...\r\n if (!history._hasPushState && !atRoot) {\r\n history.fragment = history.getFragment(null, true);\r\n history.location.replace(history.root + history.location.search + '#' + history.fragment);\r\n // Return immediately as browser will do redirect to new url\r\n return true;\r\n\r\n // Or if we've started out with a hash-based route, but we're currently\r\n // in a browser where it could be `pushState`-based instead...\r\n } else if (history._hasPushState && atRoot && loc.hash) {\r\n this.fragment = history.getHash().replace(routeStripper, '');\r\n this.history.replaceState({}, document.title, history.root + history.fragment + loc.search);\r\n }\r\n }\r\n\r\n if (!history.options.silent) {\r\n return history.loadUrl(options.startRoute);\r\n }\r\n };\r\n\r\n /**\r\n * Disable history, perhaps temporarily. Not useful in a real app, but possibly useful for unit testing Routers.\r\n * @method deactivate\r\n */\r\n history.deactivate = function() {\r\n $(window).off('popstate', history.checkUrl).off('hashchange', history.checkUrl);\r\n clearInterval(history._checkUrlInterval);\r\n history.active = false;\r\n };\r\n\r\n /**\r\n * Checks the current URL to see if it has changed, and if it has, calls `loadUrl`, normalizing across the hidden iframe.\r\n * @method checkUrl\r\n * @return {boolean} Returns true/false from loading the url.\r\n */\r\n history.checkUrl = function() {\r\n var current = history.getFragment();\r\n if (current === history.fragment && history.iframe) {\r\n current = history.getFragment(history.getHash(history.iframe));\r\n }\r\n\r\n if (current === history.fragment) {\r\n return false;\r\n }\r\n\r\n if (history.iframe) {\r\n history.navigate(current, false);\r\n }\r\n \r\n history.loadUrl();\r\n };\r\n \r\n /**\r\n * Attempts to load the current URL fragment. A pass-through to options.routeHandler.\r\n * @method loadUrl\r\n * @return {boolean} Returns true/false from the route handler.\r\n */\r\n history.loadUrl = function(fragmentOverride) {\r\n var fragment = history.fragment = history.getFragment(fragmentOverride);\r\n\r\n return history.options.routeHandler ?\r\n history.options.routeHandler(fragment) :\r\n false;\r\n };\r\n\r\n /**\r\n * Save a fragment into the hash history, or replace the URL state if the\r\n * 'replace' option is passed. You are responsible for properly URL-encoding\r\n * the fragment in advance.\r\n * The options object can contain `trigger: false` if you wish to not have the\r\n * route callback be fired, or `replace: true`, if\r\n * you wish to modify the current URL without adding an entry to the history.\r\n * @method navigate\r\n * @param {string} fragment The url fragment to navigate to.\r\n * @param {object|boolean} options An options object with optional trigger and replace flags. You can also pass a boolean directly to set the trigger option. Trigger is `true` by default.\r\n * @return {boolean} Returns true/false from loading the url.\r\n */\r\n history.navigate = function(fragment, options) {\r\n if (!history.active) {\r\n return false;\r\n }\r\n\r\n if(options === undefined) {\r\n options = {\r\n trigger: true\r\n };\r\n }else if(system.isBoolean(options)) {\r\n options = {\r\n trigger: options\r\n };\r\n }\r\n\r\n fragment = history.getFragment(fragment || '');\r\n\r\n //if (history.fragment === fragment) {\r\n // return;\r\n //}\r\n\r\n history.fragment = fragment;\r\n\r\n var url = history.root + fragment;\r\n\r\n // Don't include a trailing slash on the root.\r\n if(fragment === '' && url !== '/') {\r\n url = url.slice(0, -1);\r\n }\r\n\r\n // If pushState is available, we use it to set the fragment as a real URL.\r\n if (history._hasPushState) {\r\n history.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url);\r\n\r\n // If hash changes haven't been explicitly disabled, update the hash\r\n // fragment to store history.\r\n } else if (history._wantsHashChange) {\r\n updateHash(history.location, fragment, options.replace);\r\n \r\n if (history.iframe && (fragment !== history.getFragment(history.getHash(history.iframe)))) {\r\n // Opening and closing the iframe tricks IE7 and earlier to push a\r\n // history entry on hash-tag change. When replace is true, we don't\r\n // want history.\r\n if (!options.replace) {\r\n history.iframe.document.open().close();\r\n }\r\n \r\n updateHash(history.iframe.location, fragment, options.replace);\r\n }\r\n\r\n // If you've told us that you explicitly don't want fallback hashchange-\r\n // based history, then `navigate` becomes a page refresh.\r\n } else {\r\n return history.location.assign(url);\r\n }\r\n\r\n if (options.trigger) {\r\n return history.loadUrl(fragment);\r\n }\r\n };\r\n\r\n /**\r\n * Navigates back in the browser history.\r\n * @method navigateBack\r\n */\r\n history.navigateBack = function() {\r\n history.history.back();\r\n };\r\n\r\n /**\r\n * @class HistoryOptions\r\n * @static\r\n */\r\n\r\n /**\r\n * The function that will be called back when the fragment changes.\r\n * @property {function} routeHandler\r\n */\r\n\r\n /**\r\n * The url root used to extract the fragment when using push state.\r\n * @property {string} root\r\n */\r\n\r\n /**\r\n * Use hash change when present.\r\n * @property {boolean} hashChange\r\n * @default true\r\n */\r\n\r\n /**\r\n * Use push state when present.\r\n * @property {boolean} pushState\r\n * @default false\r\n */\r\n\r\n /**\r\n * Prevents loading of the current url when activating history.\r\n * @property {boolean} silent\r\n * @default false\r\n */\r\n\r\n return history;\r\n});\r\n","/**\r\n * Durandal 2.2.0 Copyright (c) 2010-2016 Blue Spire Consulting, Inc. All Rights Reserved.\r\n * Available via the MIT license.\r\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\r\n */\r\n/**\r\n * Connects the history module's url and history tracking support to Durandal's activation and composition engine allowing you to easily build navigation-style applications.\r\n * @module router\r\n * @requires system\r\n * @requires app\r\n * @requires activator\r\n * @requires events\r\n * @requires composition\r\n * @requires history\r\n * @requires knockout\r\n * @requires jquery\r\n */\r\ndefine('plugins/router', ['durandal/system', 'durandal/app', 'durandal/activator', 'durandal/events', 'durandal/composition', 'plugins/history', 'knockout', 'jquery'], function (system, app, activator, events, composition, history, ko, $) {\r\n var optionalParam = /\\((.*?)\\)/g;\r\n var namedParam = /(\\(\\?)?:\\w+/g;\r\n var splatParam = /\\*\\w+/g;\r\n var escapeRegExp = /[\\-{}\\[\\]+?.,\\\\\\^$|#\\s]/g;\r\n var startDeferred, rootRouter;\r\n var trailingSlash = /\\/$/;\r\n var routesAreCaseSensitive = false;\r\n var lastUrl = '/', lastTryUrl = '/';\r\n\r\n function routeStringToRegExp(routeString) {\r\n routeString = routeString.replace(escapeRegExp, '\\\\$&')\r\n .replace(optionalParam, '(?:$1)?')\r\n .replace(namedParam, function(match, optional) {\r\n return optional ? match : '([^\\/]+)';\r\n })\r\n .replace(splatParam, '(.*?)');\r\n\r\n return new RegExp('^' + routeString + '$', routesAreCaseSensitive ? undefined : 'i');\r\n }\r\n\r\n function stripParametersFromRoute(route) {\r\n var colonIndex = route.indexOf(':');\r\n var length = colonIndex > 0 ? colonIndex - 1 : route.length;\r\n return route.substring(0, length);\r\n }\r\n\r\n function endsWith(str, suffix) {\r\n return str.indexOf(suffix, str.length - suffix.length) !== -1;\r\n }\r\n\r\n function compareArrays(first, second) {\r\n if (!first || !second){\r\n return false;\r\n }\r\n\r\n if (first.length != second.length) {\r\n return false;\r\n }\r\n\r\n for (var i = 0, len = first.length; i < len; i++) {\r\n if (first[i] != second[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function reconstructUrl(instruction){\r\n if(!instruction.queryString){\r\n return instruction.fragment;\r\n }\r\n\r\n return instruction.fragment + '?' + instruction.queryString;\r\n }\r\n\r\n /**\r\n * @class Router\r\n * @uses Events\r\n */\r\n\r\n /**\r\n * Triggered when the navigation logic has completed.\r\n * @event router:navigation:complete\r\n * @param {object} instance The activated instance.\r\n * @param {object} instruction The routing instruction.\r\n * @param {Router} router The router.\r\n */\r\n\r\n /**\r\n * Triggered when the navigation has been cancelled.\r\n * @event router:navigation:cancelled\r\n * @param {object} instance The activated instance.\r\n * @param {object} instruction The routing instruction.\r\n * @param {Router} router The router.\r\n */\r\n\r\n /**\r\n * Triggered when navigation begins.\r\n * @event router:navigation:processing\r\n * @param {object} instruction The routing instruction.\r\n * @param {Router} router The router.\r\n */\r\n\r\n /**\r\n * Triggered right before a route is activated.\r\n * @event router:route:activating\r\n * @param {object} instance The activated instance.\r\n * @param {object} instruction The routing instruction.\r\n * @param {Router} router The router.\r\n */\r\n\r\n /**\r\n * Triggered right before a route is configured.\r\n * @event router:route:before-config\r\n * @param {object} config The route config.\r\n * @param {Router} router The router.\r\n */\r\n\r\n /**\r\n * Triggered just after a route is configured.\r\n * @event router:route:after-config\r\n * @param {object} config The route config.\r\n * @param {Router} router The router.\r\n */\r\n\r\n /**\r\n * Triggered when the view for the activated instance is attached.\r\n * @event router:navigation:attached\r\n * @param {object} instance The activated instance.\r\n * @param {object} instruction The routing instruction.\r\n * @param {Router} router The router.\r\n */\r\n\r\n /**\r\n * Triggered when the composition that the activated instance participates in is complete.\r\n * @event router:navigation:composition-complete\r\n * @param {object} instance The activated instance.\r\n * @param {object} instruction The routing instruction.\r\n * @param {Router} router The router.\r\n */\r\n\r\n /**\r\n * Triggered when the router does not find a matching route.\r\n * @event router:route:not-found\r\n * @param {string} fragment The url fragment.\r\n * @param {Router} router The router.\r\n */\r\n\r\n var createRouter = function() {\r\n var queue = [],\r\n isProcessing = ko.observable(false),\r\n currentActivation,\r\n currentInstruction,\r\n activeItem = activator.create();\r\n\r\n var router = {\r\n /**\r\n * The route handlers that are registered. Each handler consists of a `routePattern` and a `callback`.\r\n * @property {object[]} handlers\r\n */\r\n handlers: [],\r\n /**\r\n * The route configs that are registered.\r\n * @property {object[]} routes\r\n */\r\n routes: [],\r\n /**\r\n * The route configurations that have been designated as displayable in a nav ui (nav:true).\r\n * @property {KnockoutObservableArray} navigationModel\r\n */\r\n navigationModel: ko.observableArray([]),\r\n /**\r\n * The active item/screen based on the current navigation state.\r\n * @property {Activator} activeItem\r\n */\r\n activeItem: activeItem,\r\n /**\r\n * Indicates that the router (or a child router) is currently in the process of navigating.\r\n * @property {KnockoutComputed} isNavigating\r\n */\r\n isNavigating: ko.computed(function() {\r\n var current = activeItem();\r\n var processing = isProcessing();\r\n var currentRouterIsProcesing = current\r\n && current.router\r\n && current.router != router\r\n && current.router.isNavigating() ? true : false;\r\n return processing || currentRouterIsProcesing;\r\n }),\r\n /**\r\n * An observable surfacing the active routing instruction that is currently being processed or has recently finished processing.\r\n * The instruction object has `config`, `fragment`, `queryString`, `params` and `queryParams` properties.\r\n * @property {KnockoutObservable} activeInstruction\r\n */\r\n activeInstruction:ko.observable(null),\r\n __router__:true\r\n };\r\n\r\n events.includeIn(router);\r\n\r\n activeItem.settings.areSameItem = function (currentItem, newItem, currentActivationData, newActivationData) {\r\n if (currentItem == newItem) {\r\n return compareArrays(currentActivationData, newActivationData);\r\n }\r\n\r\n return false;\r\n };\r\n\r\n activeItem.settings.findChildActivator = function(item) {\r\n if (item && item.router && item.router.parent == router) {\r\n return item.router.activeItem;\r\n }\r\n\r\n return null;\r\n };\r\n\r\n function hasChildRouter(instance, parentRouter) {\r\n return instance.router && instance.router.parent == parentRouter;\r\n }\r\n\r\n function setCurrentInstructionRouteIsActive(flag) {\r\n if (currentInstruction && currentInstruction.config.isActive) {\r\n currentInstruction.config.isActive(flag);\r\n }\r\n }\r\n\r\n function completeNavigation(instance, instruction, mode) {\r\n system.log('Navigation Complete', instance, instruction);\r\n\r\n var fromModuleId = system.getModuleId(currentActivation);\r\n if (fromModuleId) {\r\n router.trigger('router:navigation:from:' + fromModuleId);\r\n }\r\n\r\n currentActivation = instance;\r\n\r\n setCurrentInstructionRouteIsActive(false);\r\n currentInstruction = instruction;\r\n setCurrentInstructionRouteIsActive(true);\r\n\r\n var toModuleId = system.getModuleId(currentActivation);\r\n if (toModuleId) {\r\n router.trigger('router:navigation:to:' + toModuleId);\r\n }\r\n\r\n if (!hasChildRouter(instance, router)) {\r\n router.updateDocumentTitle(instance, instruction);\r\n }\r\n\r\n switch (mode) {\r\n case 'rootRouter':\r\n lastUrl = reconstructUrl(currentInstruction);\r\n break;\r\n case 'rootRouterWithChild':\r\n lastTryUrl = reconstructUrl(currentInstruction);\r\n break;\r\n case 'lastChildRouter':\r\n lastUrl = lastTryUrl;\r\n break;\r\n }\r\n\r\n rootRouter.explicitNavigation = false;\r\n rootRouter.navigatingBack = false;\r\n\r\n router.trigger('router:navigation:complete', instance, instruction, router);\r\n }\r\n\r\n function cancelNavigation(instance, instruction) {\r\n system.log('Navigation Cancelled');\r\n\r\n router.activeInstruction(currentInstruction);\r\n\r\n router.navigate(lastUrl, false);\r\n\r\n isProcessing(false);\r\n rootRouter.explicitNavigation = false;\r\n rootRouter.navigatingBack = false;\r\n router.trigger('router:navigation:cancelled', instance, instruction, router);\r\n }\r\n\r\n function redirect(url) {\r\n system.log('Navigation Redirecting');\r\n\r\n isProcessing(false);\r\n rootRouter.explicitNavigation = false;\r\n rootRouter.navigatingBack = false;\r\n router.navigate(url, { trigger: true, replace: true });\r\n }\r\n\r\n function activateRoute(activator, instance, instruction) {\r\n rootRouter.navigatingBack = !rootRouter.explicitNavigation && currentActivation != instruction.fragment;\r\n router.trigger('router:route:activating', instance, instruction, router);\r\n\r\n var options = {\r\n canDeactivate: !router.parent\r\n };\r\n\r\n activator.activateItem(instance, instruction.params, options).then(function(succeeded) {\r\n if (succeeded) {\r\n var previousActivation = currentActivation;\r\n var withChild = hasChildRouter(instance, router);\r\n var mode = '';\r\n\r\n if (router.parent) {\r\n if(!withChild) {\r\n mode = 'lastChildRouter';\r\n }\r\n } else {\r\n if (withChild) {\r\n mode = 'rootRouterWithChild';\r\n } else {\r\n mode = 'rootRouter';\r\n }\r\n }\r\n\r\n completeNavigation(instance, instruction, mode);\r\n\r\n if (withChild) {\r\n instance.router.trigger('router:route:before-child-routes', instance, instruction, router);\r\n\r\n var fullFragment = instruction.fragment;\r\n if (instruction.queryString) {\r\n fullFragment += \"?\" + instruction.queryString;\r\n }\r\n\r\n instance.router.loadUrl(fullFragment);\r\n }\r\n\r\n if (previousActivation == instance) {\r\n router.attached();\r\n router.compositionComplete();\r\n }\r\n } else if(activator.settings.lifecycleData && activator.settings.lifecycleData.redirect){\r\n redirect(activator.settings.lifecycleData.redirect);\r\n }else{\r\n cancelNavigation(instance, instruction);\r\n }\r\n\r\n if (startDeferred) {\r\n startDeferred.resolve();\r\n startDeferred = null;\r\n }\r\n }).fail(function(err){\r\n system.error(err);\r\n });\r\n }\r\n\r\n /**\r\n * Inspects routes and modules before activation. Can be used to protect access by cancelling navigation or redirecting.\r\n * @method guardRoute\r\n * @param {object} instance The module instance that is about to be activated by the router.\r\n * @param {object} instruction The route instruction. The instruction object has config, fragment, queryString, params and queryParams properties.\r\n * @return {Promise|Boolean|String} If a boolean, determines whether or not the route should activate or be cancelled. If a string, causes a redirect to the specified route. Can also be a promise for either of these value types.\r\n */\r\n function handleGuardedRoute(activator, instance, instruction) {\r\n var resultOrPromise = router.guardRoute(instance, instruction);\r\n if (resultOrPromise || resultOrPromise === '') {\r\n if (resultOrPromise.then) {\r\n resultOrPromise.then(function(result) {\r\n if (result) {\r\n if (system.isString(result)) {\r\n redirect(result);\r\n } else {\r\n activateRoute(activator, instance, instruction);\r\n }\r\n } else {\r\n cancelNavigation(instance, instruction);\r\n }\r\n });\r\n } else {\r\n if (system.isString(resultOrPromise)) {\r\n redirect(resultOrPromise);\r\n } else {\r\n activateRoute(activator, instance, instruction);\r\n }\r\n }\r\n } else {\r\n cancelNavigation(instance, instruction);\r\n }\r\n }\r\n\r\n function ensureActivation(activator, instance, instruction) {\r\n if (router.guardRoute) {\r\n handleGuardedRoute(activator, instance, instruction);\r\n } else {\r\n activateRoute(activator, instance, instruction);\r\n }\r\n }\r\n\r\n function canReuseCurrentActivation(instruction) {\r\n return currentInstruction\r\n && currentInstruction.config.moduleId == instruction.config.moduleId\r\n && currentActivation\r\n && ((currentActivation.canReuseForRoute && currentActivation.canReuseForRoute.apply(currentActivation, instruction.params))\r\n || (!currentActivation.canReuseForRoute && currentActivation.router && currentActivation.router.loadUrl));\r\n }\r\n\r\n function dequeueInstruction() {\r\n if (isProcessing()) {\r\n return;\r\n }\r\n\r\n var instruction = queue.shift();\r\n queue = [];\r\n\r\n if (!instruction) {\r\n return;\r\n }\r\n\r\n isProcessing(true);\r\n router.activeInstruction(instruction);\r\n router.trigger('router:navigation:processing', instruction, router);\r\n\r\n if (canReuseCurrentActivation(instruction)) {\r\n var tempActivator = activator.create();\r\n tempActivator.forceActiveItem(currentActivation); //enforce lifecycle without re-compose\r\n tempActivator.settings.areSameItem = activeItem.settings.areSameItem;\r\n tempActivator.settings.findChildActivator = activeItem.settings.findChildActivator;\r\n ensureActivation(tempActivator, currentActivation, instruction);\r\n } else if(!instruction.config.moduleId) {\r\n ensureActivation(activeItem, {\r\n viewUrl:instruction.config.viewUrl,\r\n canReuseForRoute:function() {\r\n return true;\r\n }\r\n }, instruction);\r\n } else {\r\n system.acquire(instruction.config.moduleId).then(function(m) {\r\n var instance = system.resolveObject(m);\r\n\r\n if(instruction.config.viewUrl) {\r\n instance.viewUrl = instruction.config.viewUrl;\r\n }\r\n\r\n ensureActivation(activeItem, instance, instruction);\r\n }).fail(function(err) {\r\n cancelNavigation(null, instruction);\r\n system.error('Failed to load routed module (' + instruction.config.moduleId + '). Details: ' + err.message, err);\r\n });\r\n }\r\n }\r\n\r\n function queueInstruction(instruction) {\r\n queue.unshift(instruction);\r\n dequeueInstruction();\r\n }\r\n\r\n // Given a route, and a URL fragment that it matches, return the array of\r\n // extracted decoded parameters. Empty or unmatched parameters will be\r\n // treated as `null` to normalize cross-browser behavior.\r\n function createParams(routePattern, fragment, queryString) {\r\n var params = routePattern.exec(fragment).slice(1);\r\n\r\n for (var i = 0; i < params.length; i++) {\r\n var current = params[i];\r\n params[i] = current ? decodeURIComponent(current) : null;\r\n }\r\n\r\n var queryParams = router.parseQueryString(queryString);\r\n if (queryParams) {\r\n params.push(queryParams);\r\n }\r\n\r\n return {\r\n params:params,\r\n queryParams:queryParams\r\n };\r\n }\r\n\r\n function configureRoute(config){\r\n router.trigger('router:route:before-config', config, router);\r\n\r\n if (!system.isRegExp(config.route)) {\r\n config.title = config.title || router.convertRouteToTitle(config.route);\r\n\r\n if (!config.viewUrl) {\r\n config.moduleId = config.moduleId || router.convertRouteToModuleId(config.route);\r\n }\r\n\r\n config.hash = config.hash || router.convertRouteToHash(config.route);\r\n\r\n if (config.hasChildRoutes) {\r\n config.route = config.route + '*childRoutes';\r\n }\r\n\r\n config.routePattern = routeStringToRegExp(config.route);\r\n }else{\r\n config.routePattern = config.route;\r\n }\r\n\r\n config.isActive = config.isActive || ko.observable(false);\r\n router.trigger('router:route:after-config', config, router);\r\n router.routes.push(config);\r\n\r\n router.route(config.routePattern, function(fragment, queryString) {\r\n var paramInfo = createParams(config.routePattern, fragment, queryString);\r\n queueInstruction({\r\n fragment: fragment,\r\n queryString:queryString,\r\n config: config,\r\n params: paramInfo.params,\r\n queryParams:paramInfo.queryParams\r\n });\r\n });\r\n };\r\n\r\n function mapRoute(config) {\r\n if(system.isArray(config.route)){\r\n var isActive = config.isActive || ko.observable(false);\r\n\r\n for(var i = 0, length = config.route.length; i < length; i++){\r\n var current = system.extend({}, config);\r\n\r\n current.route = config.route[i];\r\n current.isActive = isActive;\r\n\r\n if(i > 0){\r\n delete current.nav;\r\n }\r\n\r\n configureRoute(current);\r\n }\r\n }else{\r\n configureRoute(config);\r\n }\r\n\r\n return router;\r\n }\r\n\r\n /**\r\n * Parses a query string into an object.\r\n * @method parseQueryString\r\n * @param {string} queryString The query string to parse.\r\n * @return {object} An object keyed according to the query string parameters.\r\n */\r\n router.parseQueryString = function (queryString) {\r\n var queryObject, pairs;\r\n\r\n if (!queryString) {\r\n return null;\r\n }\r\n\r\n pairs = queryString.split('&');\r\n\r\n if (pairs.length == 0) {\r\n return null;\r\n }\r\n\r\n queryObject = {};\r\n\r\n for (var i = 0; i < pairs.length; i++) {\r\n var pair = pairs[i];\r\n if (pair === '') {\r\n continue;\r\n }\r\n\r\n var sp = pair.indexOf(\"=\"),\r\n key = sp === -1 ? pair : pair.substr(0, sp),\r\n value = sp === -1 ? null : decodeURIComponent(pair.substr(sp + 1).replace(/\\+/g, ' '));\r\n\r\n var existing = queryObject[key];\r\n\r\n if (existing) {\r\n if (system.isArray(existing)) {\r\n existing.push(value);\r\n } else {\r\n queryObject[key] = [existing, value];\r\n }\r\n }\r\n else {\r\n queryObject[key] = value;\r\n }\r\n }\r\n\r\n return queryObject;\r\n };\r\n\r\n /**\r\n * Add a route to be tested when the url fragment changes.\r\n * @method route\r\n * @param {RegEx} routePattern The route pattern to test against.\r\n * @param {function} callback The callback to execute when the route pattern is matched.\r\n */\r\n router.route = function(routePattern, callback) {\r\n router.handlers.push({ routePattern: routePattern, callback: callback });\r\n };\r\n\r\n /**\r\n * Attempt to load the specified URL fragment. If a route succeeds with a match, returns `true`. If no defined routes matches the fragment, returns `false`.\r\n * @method loadUrl\r\n * @param {string} fragment The URL fragment to find a match for.\r\n * @return {boolean} True if a match was found, false otherwise.\r\n */\r\n router.loadUrl = function(fragment) {\r\n var handlers = router.handlers,\r\n queryString = null,\r\n coreFragment = fragment,\r\n queryIndex = fragment.indexOf('?');\r\n\r\n if (queryIndex != -1) {\r\n coreFragment = fragment.substring(0, queryIndex);\r\n queryString = fragment.substr(queryIndex + 1);\r\n }\r\n\r\n if(router.relativeToParentRouter){\r\n var instruction = this.parent.activeInstruction();\r\n\t\t\t\tcoreFragment = queryIndex == -1 ? instruction.params.join('/') : instruction.params.slice(0, -1).join('/');\r\n\r\n if(coreFragment && coreFragment.charAt(0) == '/'){\r\n coreFragment = coreFragment.substr(1);\r\n }\r\n\r\n if(!coreFragment){\r\n coreFragment = '';\r\n }\r\n\r\n coreFragment = coreFragment.replace('//', '/').replace('//', '/');\r\n }\r\n\r\n coreFragment = coreFragment.replace(trailingSlash, '');\r\n\r\n for (var i = 0; i < handlers.length; i++) {\r\n var current = handlers[i];\r\n if (current.routePattern.test(coreFragment)) {\r\n current.callback(coreFragment, queryString);\r\n return true;\r\n }\r\n }\r\n\r\n system.log('Route Not Found', fragment, currentInstruction);\r\n router.trigger('router:route:not-found', fragment, router);\r\n\r\n if (router.parent) {\r\n lastUrl = lastTryUrl;\r\n }\r\n\r\n history.navigate(lastUrl, { trigger:false, replace:true });\r\n\r\n rootRouter.explicitNavigation = false;\r\n rootRouter.navigatingBack = false;\r\n\r\n return false;\r\n };\r\n\r\n var titleSubscription;\r\n function setTitle(value) {\r\n var appTitle = ko.unwrap(app.title);\r\n\r\n if (appTitle) {\r\n document.title = value + \" | \" + appTitle;\r\n } else {\r\n document.title = value;\r\n }\r\n }\r\n\r\n // Allow observable to be used for app.title\r\n if(ko.isObservable(app.title)) {\r\n app.title.subscribe(function () {\r\n var instruction = router.activeInstruction();\r\n var title = instruction != null ? ko.unwrap(instruction.config.title) : '';\r\n setTitle(title);\r\n });\r\n }\r\n\r\n /**\r\n * Updates the document title based on the activated module instance, the routing instruction and the app.title.\r\n * @method updateDocumentTitle\r\n * @param {object} instance The activated module.\r\n * @param {object} instruction The routing instruction associated with the action. It has a `config` property that references the original route mapping config.\r\n */\r\n router.updateDocumentTitle = function (instance, instruction) {\r\n var appTitle = ko.unwrap(app.title),\r\n title = instruction.config.title;\r\n\r\n if (titleSubscription) {\r\n titleSubscription.dispose();\r\n }\r\n\r\n if (title) {\r\n if (ko.isObservable(title)) {\r\n titleSubscription = title.subscribe(setTitle);\r\n setTitle(title());\r\n } else {\r\n setTitle(title);\r\n }\r\n } else if (appTitle) {\r\n document.title = appTitle;\r\n }\r\n };\r\n\r\n /**\r\n * Save a fragment into the hash history, or replace the URL state if the\r\n * 'replace' option is passed. You are responsible for properly URL-encoding\r\n * the fragment in advance.\r\n * The options object can contain `trigger: false` if you wish to not have the\r\n * route callback be fired, or `replace: true`, if\r\n * you wish to modify the current URL without adding an entry to the history.\r\n * @method navigate\r\n * @param {string} fragment The url fragment to navigate to.\r\n * @param {object|boolean} options An options object with optional trigger and replace flags. You can also pass a boolean directly to set the trigger option. Trigger is `true` by default.\r\n * @return {boolean} Returns true/false from loading the url.\r\n */\r\n router.navigate = function(fragment, options) {\r\n if(fragment && fragment.indexOf('://') != -1) {\r\n window.location.href = fragment;\r\n return true;\r\n }\r\n\r\n if(options === undefined || (system.isBoolean(options) && options) || (system.isObject(options) && options.trigger)) {\r\n rootRouter.explicitNavigation = true;\r\n }\r\n\r\n if ((system.isBoolean(options) && !options) || (options && options.trigger != undefined && !options.trigger)) {\r\n lastUrl = fragment;\r\n }\r\n\r\n return history.navigate(fragment, options);\r\n };\r\n\r\n /**\r\n * Navigates back in the browser history.\r\n * @method navigateBack\r\n */\r\n router.navigateBack = function() {\r\n history.navigateBack();\r\n };\r\n\r\n router.attached = function() {\r\n router.trigger('router:navigation:attached', currentActivation, currentInstruction, router);\r\n };\r\n\r\n router.compositionComplete = function(){\r\n isProcessing(false);\r\n router.trigger('router:navigation:composition-complete', currentActivation, currentInstruction, router);\r\n dequeueInstruction();\r\n };\r\n\r\n /**\r\n * Converts a route to a hash suitable for binding to a link's href.\r\n * @method convertRouteToHash\r\n * @param {string} route\r\n * @return {string} The hash.\r\n */\r\n router.convertRouteToHash = function(route) {\r\n route = route.replace(/\\*.*$/, '');\r\n\r\n if(router.relativeToParentRouter){\r\n var instruction = router.parent.activeInstruction(),\r\n hash = route ? instruction.config.hash + '/' + route : instruction.config.hash;\r\n\r\n if(history._hasPushState){\r\n hash = '/' + hash;\r\n }\r\n\r\n hash = hash.replace('//', '/').replace('//', '/');\r\n return hash;\r\n }\r\n\r\n if(history._hasPushState){\r\n return route;\r\n }\r\n\r\n return \"#\" + route;\r\n };\r\n\r\n /**\r\n * Converts a route to a module id. This is only called if no module id is supplied as part of the route mapping.\r\n * @method convertRouteToModuleId\r\n * @param {string} route\r\n * @return {string} The module id.\r\n */\r\n router.convertRouteToModuleId = function(route) {\r\n return stripParametersFromRoute(route);\r\n };\r\n\r\n /**\r\n * Converts a route to a displayable title. This is only called if no title is specified as part of the route mapping.\r\n * @method convertRouteToTitle\r\n * @param {string} route\r\n * @return {string} The title.\r\n */\r\n router.convertRouteToTitle = function(route) {\r\n var value = stripParametersFromRoute(route);\r\n return value.substring(0, 1).toUpperCase() + value.substring(1);\r\n };\r\n\r\n /**\r\n * Maps route patterns to modules.\r\n * @method map\r\n * @param {string|object|object[]} route A route, config or array of configs.\r\n * @param {object} [config] The config for the specified route.\r\n * @chainable\r\n * @example\r\n router.map([\r\n { route: '', title:'Home', moduleId: 'homeScreen', nav: true },\r\n { route: 'customer/:id', moduleId: 'customerDetails'}\r\n ]);\r\n */\r\n router.map = function(route, config) {\r\n if (system.isArray(route)) {\r\n for (var i = 0; i < route.length; i++) {\r\n router.map(route[i]);\r\n }\r\n\r\n return router;\r\n }\r\n\r\n if (system.isString(route) || system.isRegExp(route)) {\r\n if (!config) {\r\n config = {};\r\n } else if (system.isString(config)) {\r\n config = { moduleId: config };\r\n }\r\n\r\n config.route = route;\r\n } else {\r\n config = route;\r\n }\r\n\r\n return mapRoute(config);\r\n };\r\n\r\n /**\r\n * Builds an observable array designed to bind a navigation UI to. The model will exist in the `navigationModel` property.\r\n * @method buildNavigationModel\r\n * @param {number} defaultOrder The default order to use for navigation visible routes that don't specify an order. The default is 100 and each successive route will be one more than that.\r\n * @chainable\r\n */\r\n router.buildNavigationModel = function(defaultOrder) {\r\n var nav = [], routes = router.routes;\r\n var fallbackOrder = defaultOrder || 100;\r\n\r\n for (var i = 0; i < routes.length; i++) {\r\n var current = routes[i];\r\n\r\n if (current.nav) {\r\n if (!system.isNumber(current.nav)) {\r\n current.nav = ++fallbackOrder;\r\n }\r\n\r\n nav.push(current);\r\n }\r\n }\r\n\r\n nav.sort(function(a, b) { return a.nav - b.nav; });\r\n router.navigationModel(nav);\r\n\r\n return router;\r\n };\r\n\r\n /**\r\n * Configures how the router will handle unknown routes.\r\n * @method mapUnknownRoutes\r\n * @param {string|function} [config] If not supplied, then the router will map routes to modules with the same name.\r\n * If a string is supplied, it represents the module id to route all unknown routes to.\r\n * Finally, if config is a function, it will be called back with the route instruction containing the route info. The function can then modify the instruction by adding a moduleId and the router will take over from there.\r\n * @param {string} [replaceRoute] If config is a module id, then you can optionally provide a route to replace the url with.\r\n * @chainable\r\n */\r\n router.mapUnknownRoutes = function(config, replaceRoute) {\r\n var catchAllRoute = \"*catchall\";\r\n var catchAllPattern = routeStringToRegExp(catchAllRoute);\r\n\r\n router.route(catchAllPattern, function (fragment, queryString) {\r\n var paramInfo = createParams(catchAllPattern, fragment, queryString);\r\n var instruction = {\r\n fragment: fragment,\r\n queryString: queryString,\r\n config: {\r\n route: catchAllRoute,\r\n routePattern: catchAllPattern\r\n },\r\n params: paramInfo.params,\r\n queryParams: paramInfo.queryParams\r\n };\r\n\r\n if (!config) {\r\n instruction.config.moduleId = fragment;\r\n } else if (system.isString(config)) {\r\n instruction.config.moduleId = config;\r\n if(replaceRoute){\r\n history.navigate(replaceRoute, { trigger:false, replace:true });\r\n }\r\n } else if (system.isFunction(config)) {\r\n var result = config(instruction);\r\n if (result && result.then) {\r\n result.then(function() {\r\n router.trigger('router:route:before-config', instruction.config, router);\r\n router.trigger('router:route:after-config', instruction.config, router);\r\n queueInstruction(instruction);\r\n });\r\n return;\r\n }\r\n } else {\r\n instruction.config = config;\r\n instruction.config.route = catchAllRoute;\r\n instruction.config.routePattern = catchAllPattern;\r\n }\r\n\r\n router.trigger('router:route:before-config', instruction.config, router);\r\n router.trigger('router:route:after-config', instruction.config, router);\r\n queueInstruction(instruction);\r\n });\r\n\r\n return router;\r\n };\r\n\r\n /**\r\n * Resets the router by removing handlers, routes, event handlers and previously configured options.\r\n * @method reset\r\n * @chainable\r\n */\r\n router.reset = function() {\r\n currentInstruction = currentActivation = undefined;\r\n router.handlers = [];\r\n router.routes = [];\r\n router.off();\r\n delete router.options;\r\n return router;\r\n };\r\n\r\n /**\r\n * Makes all configured routes and/or module ids relative to a certain base url.\r\n * @method makeRelative\r\n * @param {string|object} settings If string, the value is used as the base for routes and module ids. If an object, you can specify `route` and `moduleId` separately. In place of specifying route, you can set `fromParent:true` to make routes automatically relative to the parent router's active route.\r\n * @chainable\r\n */\r\n router.makeRelative = function(settings){\r\n if(system.isString(settings)){\r\n settings = {\r\n moduleId:settings,\r\n route:settings\r\n };\r\n }\r\n\r\n if(settings.moduleId && !endsWith(settings.moduleId, '/')){\r\n settings.moduleId += '/';\r\n }\r\n\r\n if(settings.route && !endsWith(settings.route, '/')){\r\n settings.route += '/';\r\n }\r\n\r\n if(settings.fromParent){\r\n router.relativeToParentRouter = true;\r\n }\r\n\r\n router.on('router:route:before-config').then(function(config){\r\n if(settings.moduleId){\r\n config.moduleId = settings.moduleId + config.moduleId;\r\n }\r\n\r\n if(settings.route){\r\n if(config.route === ''){\r\n config.route = settings.route.substring(0, settings.route.length - 1);\r\n }else{\r\n config.route = settings.route + config.route;\r\n }\r\n }\r\n });\r\n\r\n if (settings.dynamicHash) {\r\n router.on('router:route:after-config').then(function (config) {\r\n config.routePattern = routeStringToRegExp(config.route ? settings.dynamicHash + '/' + config.route : settings.dynamicHash);\r\n config.dynamicHash = config.dynamicHash || ko.observable(config.hash);\r\n });\r\n\r\n router.on('router:route:before-child-routes').then(function(instance, instruction, parentRouter) {\r\n var childRouter = instance.router;\r\n\r\n for(var i = 0; i < childRouter.routes.length; i++) {\r\n var route = childRouter.routes[i];\r\n var params = instruction.params.slice(0);\r\n\r\n route.hash = childRouter.convertRouteToHash(route.route)\r\n .replace(namedParam, function(match) {\r\n return params.length > 0 ? params.shift() : match;\r\n });\r\n\r\n route.dynamicHash(route.hash);\r\n }\r\n });\r\n }\r\n\r\n return router;\r\n };\r\n\r\n /**\r\n * Creates a child router.\r\n * @method createChildRouter\r\n * @return {Router} The child router.\r\n */\r\n router.createChildRouter = function() {\r\n var childRouter = createRouter();\r\n childRouter.parent = router;\r\n return childRouter;\r\n };\r\n\r\n return router;\r\n };\r\n\r\n /**\r\n * @class RouterModule\r\n * @extends Router\r\n * @static\r\n */\r\n rootRouter = createRouter();\r\n rootRouter.explicitNavigation = false;\r\n rootRouter.navigatingBack = false;\r\n\r\n /**\r\n * Makes the RegExp generated for routes case sensitive, rather than the default of case insensitive.\r\n * @method makeRoutesCaseSensitive\r\n */\r\n rootRouter.makeRoutesCaseSensitive = function(){\r\n routesAreCaseSensitive = true;\r\n };\r\n\r\n /**\r\n * Verify that the target is the current window\r\n * @method targetIsThisWindow\r\n * @return {boolean} True if the event's target is the current window, false otherwise.\r\n */\r\n rootRouter.targetIsThisWindow = function(event) {\r\n var targetWindow = $(event.target).attr('target');\r\n\r\n if (!targetWindow ||\r\n targetWindow === window.name ||\r\n targetWindow === '_self' ||\r\n (targetWindow === 'top' && window === window.top)) { return true; }\r\n\r\n return false;\r\n };\r\n\r\n /**\r\n * Activates the router and the underlying history tracking mechanism.\r\n * @method activate\r\n * @return {Promise} A promise that resolves when the router is ready.\r\n */\r\n rootRouter.activate = function(options) {\r\n return system.defer(function(dfd) {\r\n startDeferred = dfd;\r\n rootRouter.options = system.extend({ routeHandler: rootRouter.loadUrl }, rootRouter.options, options);\r\n\r\n history.activate(rootRouter.options);\r\n\r\n if(history._hasPushState){\r\n var routes = rootRouter.routes,\r\n i = routes.length;\r\n\r\n while(i--){\r\n var current = routes[i];\r\n current.hash = current.hash.replace('#', '/');\r\n }\r\n }\r\n\r\n var rootStripper = rootRouter.options.root && new RegExp(\"^\" + rootRouter.options.root + \"/\");\r\n\r\n $(document).delegate(\"a\", 'click', function(evt){\r\n \r\n // ignore default prevented since these are not supposed to behave like links anyway\r\n if(evt.isDefaultPrevented()){\r\n return;\r\n }\r\n\r\n if(history._hasPushState){\r\n if(!evt.altKey && !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && rootRouter.targetIsThisWindow(evt)){\r\n var href = $(this).attr(\"href\");\r\n\r\n // Ensure the protocol is not part of URL, meaning its relative.\r\n // Stop the event bubbling to ensure the link will not cause a page refresh.\r\n if (href != null && !(href.charAt(0) === \"#\" || /^[a-z]+:/i.test(href))) {\r\n rootRouter.explicitNavigation = true;\r\n evt.preventDefault();\r\n\r\n if (rootStripper) {\r\n href = href.replace(rootStripper, \"\");\r\n }\r\n\r\n history.navigate(href);\r\n }\r\n }\r\n }else{\r\n rootRouter.explicitNavigation = true;\r\n }\r\n });\r\n\r\n if(history.options.silent && startDeferred){\r\n startDeferred.resolve();\r\n startDeferred = null;\r\n }\r\n }).promise();\r\n };\r\n\r\n /**\r\n * Deactivate current items and turn history listening off.\r\n * @method deactivate\r\n */\r\n rootRouter.deactivate = function() {\r\n rootRouter.activeItem(null);\r\n history.deactivate();\r\n };\r\n\r\n /**\r\n * Installs the router's custom ko binding handler.\r\n * @method install\r\n */\r\n rootRouter.install = function(){\r\n ko.bindingHandlers.router = {\r\n init: function() {\r\n return { controlsDescendantBindings: true };\r\n },\r\n update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {\r\n var settings = ko.utils.unwrapObservable(valueAccessor()) || {};\r\n\r\n if (settings.__router__) {\r\n settings = {\r\n model:settings.activeItem(),\r\n attached:settings.attached,\r\n compositionComplete:settings.compositionComplete,\r\n activate: false\r\n };\r\n } else {\r\n var theRouter = ko.utils.unwrapObservable(settings.router || viewModel.router) || rootRouter;\r\n settings.model = theRouter.activeItem();\r\n settings.attached = theRouter.attached;\r\n settings.compositionComplete = theRouter.compositionComplete;\r\n settings.activate = false;\r\n }\r\n\r\n composition.compose(element, settings, bindingContext);\r\n }\r\n };\r\n\r\n ko.virtualElements.allowedBindings.router = true;\r\n };\r\n\r\n return rootRouter;\r\n});\r\n","/**\n * Durandal 2.2.0 Copyright (c) 2010-2016 Blue Spire Consulting, Inc. All Rights Reserved.\n * Available via the MIT license.\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\n */\n/**\n * The system module encapsulates the most basic features used by other modules.\n * @module system\n * @requires require\n * @requires jquery\n */\ndefine('durandal/system', ['jquery'], function ($) {\n const { createExtendedContainer } = require('configuration/inversify/container/extended');\n\n const { isInjectable } = require('interfaces/injectable');\n\n var isDebugging = false,\n nativeKeys = Object.keys,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n toString = Object.prototype.toString,\n system,\n treatAsIE8 = false,\n nativeIsArray = Array.isArray,\n slice = Array.prototype.slice;\n\n //polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim\n if (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^\\s+|\\s+$/g, '');\n };\n }\n\n //see http://patik.com/blog/complete-cross-browser-console-log/\n // Tell IE9 to use its built-in console\n if (Function.prototype.bind && (typeof console === 'object' || typeof console === 'function') && typeof console.log == 'object') {\n try {\n ['log', 'info', 'warn', 'error', 'assert', 'dir', 'clear', 'profile', 'profileEnd']\n .forEach(function(method) {\n console[method] = this.call(console[method], console);\n }, Function.prototype.bind);\n } catch (ex) {\n treatAsIE8 = true;\n }\n }\n\n // callback for require.js loader\n if (typeof requirejs !== 'undefined') {\n var _onResourceLoad = requirejs.onResourceLoad;\n requirejs.onResourceLoad = function(context, map, depArray) {\n system.setModuleId(context.defined[map.id], map.id);\n\n if (_onResourceLoad)\n _onResourceLoad(context, map, depArray);\n };\n }\n\n var noop = function() { };\n\n var log = function() {\n try {\n // Modern browsers\n if (typeof console != 'undefined' && typeof console.log == 'function') {\n // Opera 11\n if (window.opera) {\n var i = 0;\n while (i < arguments.length) {\n console.log('Item ' + (i + 1) + ': ' + arguments[i]);\n i++;\n }\n }\n // All other modern browsers\n else if ((slice.call(arguments)).length == 1 && typeof slice.call(arguments)[0] == 'string') {\n console.log((slice.call(arguments)).toString());\n } else {\n console.log.apply(console, slice.call(arguments));\n }\n }\n // IE8\n else if ((!Function.prototype.bind || treatAsIE8) && typeof console != 'undefined' && typeof console.log == 'object') {\n Function.prototype.call.call(console.log, console, slice.call(arguments));\n }\n\n // IE7 and lower, and other old browsers\n } catch (ignore) { }\n };\n\n var logError = function(error, err) {\n var exception;\n\n if(error instanceof Error){\n exception = error;\n } else {\n exception = new Error(error);\n }\n\n exception.innerError = err;\n\n //Report the error as an error, not as a log\n try {\n // Modern browsers (it's only a single item, no need for argument splitting as in log() above)\n if (typeof console != 'undefined' && typeof console.error == 'function') {\n console.error(exception);\n }\n // IE8\n else if ((!Function.prototype.bind || treatAsIE8) && typeof console != 'undefined' && typeof console.error == 'object') {\n Function.prototype.call.call(console.error, console, exception);\n }\n // IE7 and lower, and other old browsers\n } catch (ignore) { }\n\n throw exception;\n };\n\n /**\n * @class SystemModule\n * @static\n */\n system = {\n /**\n * Durandal's version.\n * @property {string} version\n */\n version: \"2.2.0\",\n /**\n * A noop function.\n * @method noop\n */\n noop: noop,\n /**\n * Gets the module id for the specified object.\n * @method getModuleId\n * @param {object} obj The object whose module id you wish to determine.\n * @return {string} The module id.\n */\n getModuleId: function(obj) {\n if (!obj) {\n return null;\n }\n\n var moduleId = obj.__moduleId__;\n\n if (typeof obj == 'function' && obj.prototype) {\n moduleId = obj.prototype.__moduleId__;\n }\n\n if (typeof obj == 'string') {\n moduleId = null;\n }\n\n return moduleId ? moduleId.replace('promise!', '') : moduleId;\n },\n /**\n * Sets the module id for the specified object.\n * @method setModuleId\n * @param {object} obj The object whose module id you wish to set.\n * @param {string} id The id to set for the specified object.\n */\n setModuleId: function(obj, id) {\n if (!obj) {\n return;\n }\n\n if (typeof obj == 'function' && obj.prototype) {\n obj.prototype.__moduleId__ = id;\n return;\n }\n\n if (typeof obj == 'string') {\n return;\n }\n\n obj.__moduleId__ = id;\n },\n /**\n * Resolves the default object instance for a module. If the module is an object, the module is returned. If the module is a function, that function is called with `new` and it's result is returned.\n * @method resolveObject\n * @param {object} module The module to use to get/create the default object for.\n * @return {object} The default object for the module.\n */\n resolveObject: function (pageModule) {\n if (isInjectable(pageModule)) {\n const [container, disposeContainer] = createExtendedContainer(module => module instanceof pageModule);\r\n container.bind(pageModule).toSelf();\r\n\r\n const proxy = new Proxy(container.get(pageModule), {\r\n get(target, propKey, receiver) {\r\n const origMethod = target[propKey];\r\n\r\n if (propKey == 'detached') {\r\n return function (...args) {\r\n disposeContainer();\r\n\r\n if (origMethod != undefined)\r\n return origMethod.apply(this, args);\r\n }\r\n }\r\n\r\n return origMethod;\r\n }\r\n\r\n });\r\n\r\n return proxy;\r\n } else if (system.isFunction(pageModule)) {\n return new pageModule();\n } else {\n return pageModule;\n }\n },\n /**\n * Gets/Sets whether or not Durandal is in debug mode.\n * @method debug\n * @param {boolean} [enable] Turns on/off debugging.\n * @return {boolean} Whether or not Durandal is current debugging.\n */\n debug: function(enable) {\n if (arguments.length == 1) {\n isDebugging = enable;\n if (isDebugging) {\n this.log = log;\n this.error = logError;\n this.log('Debug:Enabled');\n } else {\n this.log('Debug:Disabled');\n this.log = noop;\n this.error = noop;\n }\n }\n\n return isDebugging;\n },\n /**\n * Logs data to the console. Pass any number of parameters to be logged. Log output is not processed if the framework is not running in debug mode.\n * @method log\n * @param {object} info* The objects to log.\n */\n log: noop,\n /**\n * Logs an error.\n * @method error\n * @param {string|Error} obj The error to report.\n */\n error: noop,\n /**\n * Asserts a condition by throwing an error if the condition fails.\n * @method assert\n * @param {boolean} condition The condition to check.\n * @param {string} message The message to report in the error if the condition check fails.\n */\n assert: function (condition, message) {\n if (!condition) {\n system.error(new Error(message || 'Assert:Failed'));\n }\n },\n /**\n * Creates a deferred object which can be used to create a promise. Optionally pass a function action to perform which will be passed an object used in resolving the promise.\n * @method defer\n * @param {function} [action] The action to defer. You will be passed the deferred object as a paramter.\n * @return {Deferred} The deferred object.\n */\n defer: function(action) {\n return $.Deferred(action);\n },\n /**\n * Creates a simple V4 UUID. This should not be used as a PK in your database. It can be used to generate internal, unique ids. For a more robust solution see [node-uuid](https://github.com/broofa/node-uuid).\n * @method guid\n * @return {string} The guid.\n */\n guid: function() {\n var d = new Date().getTime();\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n var r = (d + Math.random() * 16) % 16 | 0;\n d = Math.floor(d/16);\n return (c == 'x' ? r : (r & 0x7 | 0x8)).toString(16);\n });\n },\n /**\n * Uses require.js to obtain a module. This function returns a promise which resolves with the module instance. You can pass more than one module id to this function or an array of ids. If more than one or an array is passed, then the promise will resolve with an array of module instances.\n * @method acquire\n * @param {string|string[]} moduleId The id(s) of the modules to load.\n * @return {Promise} A promise for the loaded module(s).\n */\n acquire: function (factory) {\n return system.defer(function (dfd) {\n Promise.resolve(factory())\n .then(module => module.__esModule ? module.default : module)\n .then(module => components.awaitAll().then(() => module))\n .then(dfd.resolve, dfd.reject);\n });\n },\n /**\n * Extends the first object with the properties of the following objects.\n * @method extend\n * @param {object} obj The target object to extend.\n * @param {object} extension* Uses to extend the target object.\n */\n extend: function(obj) {\n var rest = slice.call(arguments, 1);\n\n for (var i = 0; i < rest.length; i++) {\n var source = rest[i];\n\n if (source) {\n for (var prop in source) {\n obj[prop] = source[prop];\n }\n }\n }\n\n return obj;\n },\n /**\n * Uses a setTimeout to wait the specified milliseconds.\n * @method wait\n * @param {number} milliseconds The number of milliseconds to wait.\n * @return {Promise}\n */\n wait: function(milliseconds) {\n return system.defer(function(dfd) {\n setTimeout(dfd.resolve, milliseconds);\n }).promise();\n }\n };\n\n /**\n * Gets all the owned keys of the specified object.\n * @method keys\n * @param {object} object The object whose owned keys should be returned.\n * @return {string[]} The keys.\n */\n system.keys = nativeKeys || function(obj) {\n if (obj !== Object(obj)) {\n throw new TypeError('Invalid object');\n }\n\n var keys = [];\n\n for (var key in obj) {\n if (hasOwnProperty.call(obj, key)) {\n keys[keys.length] = key;\n }\n }\n\n return keys;\n };\n\n /**\n * Determines if the specified object is an html element.\n * @method isElement\n * @param {object} object The object to check.\n * @return {boolean} True if matches the type, false otherwise.\n */\n system.isElement = function(obj) {\n return !!(obj && obj.nodeType === 1);\n };\n\n /**\n * Determines if the specified object is an array.\n * @method isArray\n * @param {object} object The object to check.\n * @return {boolean} True if matches the type, false otherwise.\n */\n system.isArray = nativeIsArray || function(obj) {\n return toString.call(obj) == '[object Array]';\n };\n\n /**\n * Determines if the specified object is...an object. ie. Not an array, string, etc.\n * @method isObject\n * @param {object} object The object to check.\n * @return {boolean} True if matches the type, false otherwise.\n */\n system.isObject = function(obj) {\n return obj === Object(obj);\n };\n\n /**\n * Determines if the specified object is a boolean.\n * @method isBoolean\n * @param {object} object The object to check.\n * @return {boolean} True if matches the type, false otherwise.\n */\n system.isBoolean = function(obj) {\n return typeof(obj) === \"boolean\";\n };\n\n /**\n * Determines if the specified object is a promise.\n * @method isPromise\n * @param {object} object The object to check.\n * @return {boolean} True if matches the type, false otherwise.\n */\n system.isPromise = function(obj) {\n return obj && system.isFunction(obj.then);\n };\n\n /**\n * Determines if the specified object is a function arguments object.\n * @method isArguments\n * @param {object} object The object to check.\n * @return {boolean} True if matches the type, false otherwise.\n */\n\n /**\n * Determines if the specified object is a function.\n * @method isFunction\n * @param {object} object The object to check.\n * @return {boolean} True if matches the type, false otherwise.\n */\n\n /**\n * Determines if the specified object is a string.\n * @method isString\n * @param {object} object The object to check.\n * @return {boolean} True if matches the type, false otherwise.\n */\n\n /**\n * Determines if the specified object is a number.\n * @method isNumber\n * @param {object} object The object to check.\n * @return {boolean} True if matches the type, false otherwise.\n */\n\n /**\n * Determines if the specified object is a date.\n * @method isDate\n * @param {object} object The object to check.\n * @return {boolean} True if matches the type, false otherwise.\n */\n\n /**\n * Determines if the specified object is a boolean.\n * @method isBoolean\n * @param {object} object The object to check.\n * @return {boolean} True if matches the type, false otherwise.\n */\n\n //isArguments, isFunction, isString, isNumber, isDate, isRegExp.\n var isChecks = ['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'];\n\n function makeIsFunction(name) {\n var value = '[object ' + name + ']';\n system['is' + name] = function(obj) {\n return toString.call(obj) == value;\n };\n }\n\n for (var i = 0; i < isChecks.length; i++) {\n makeIsFunction(isChecks[i]);\n }\n\n return system;\n});\n","/**\r\n * Durandal 2.2.0 Copyright (c) 2010-2016 Blue Spire Consulting, Inc. All Rights Reserved.\r\n * Available via the MIT license.\r\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\r\n */\r\n/**\r\n * The viewEngine module provides information to the viewLocator module which is used to locate the view's source file. The viewEngine also transforms a view id into a view instance.\r\n * @module viewEngine\r\n * @requires system\r\n * @requires jquery\r\n */\r\ndefine('durandal/viewEngine', ['durandal/system', 'jquery'], function (system, $) {\r\n var parseMarkup;\r\n\r\n if ($.parseHTML) {\r\n parseMarkup = function (html) {\r\n return $.parseHTML(html);\r\n };\r\n } else {\r\n parseMarkup = function (html) {\r\n return $(html).get();\r\n };\r\n }\r\n\r\n /**\r\n * @class ViewEngineModule\r\n * @static\r\n */\r\n return {\r\n cache:{},\r\n /**\r\n * The file extension that view source files are expected to have.\r\n * @property {string} viewExtension\r\n * @default .html\r\n */\r\n viewExtension: '.html',\r\n /**\r\n * The name of the RequireJS loader plugin used by the viewLocator to obtain the view source. (Use requirejs to map the plugin's full path).\r\n * @property {string} viewPlugin\r\n * @default text\r\n */\r\n viewPlugin: 'text',\r\n /**\r\n * Parameters passed to the RequireJS loader plugin used by the viewLocator to obtain the view source.\r\n * @property {string} viewPluginParameters\r\n * @default The empty string by default.\r\n */\r\n viewPluginParameters: '',\r\n /**\r\n * Determines if the url is a url for a view, according to the view engine.\r\n * @method isViewUrl\r\n * @param {string} url The potential view url.\r\n * @return {boolean} True if the url is a view url, false otherwise.\r\n */\r\n isViewUrl: function (url) {\r\n return url.indexOf(this.viewExtension, url.length - this.viewExtension.length) !== -1;\r\n },\r\n /**\r\n * Converts a view url into a view id.\r\n * @method convertViewUrlToViewId\r\n * @param {string} url The url to convert.\r\n * @return {string} The view id.\r\n */\r\n convertViewUrlToViewId: function (url) {\r\n return url.substring(0, url.length - this.viewExtension.length);\r\n },\r\n /**\r\n * Converts a view id into a full RequireJS path.\r\n * @method convertViewIdToRequirePath\r\n * @param {string} viewId The view id to convert.\r\n * @return {string} The require path.\r\n */\r\n convertViewIdToRequirePath: function (viewId) {\r\n var plugin = this.viewPlugin ? this.viewPlugin + '!' : '';\r\n return plugin + viewId + this.viewExtension + this.viewPluginParameters;\r\n },\r\n /**\r\n * Parses the view engine recognized markup and returns DOM elements.\r\n * @method parseMarkup\r\n * @param {string} markup The markup to parse.\r\n * @return {DOMElement[]} The elements.\r\n */\r\n parseMarkup: parseMarkup,\r\n /**\r\n * Calls `parseMarkup` and then pipes the results through `ensureSingleElement`.\r\n * @method processMarkup\r\n * @param {string} markup The markup to process.\r\n * @return {DOMElement} The view.\r\n */\r\n processMarkup: function (markup) {\r\n var allElements = this.parseMarkup(markup);\r\n return this.ensureSingleElement(allElements);\r\n },\r\n /**\r\n * Converts an array of elements into a single element. White space and comments are removed. If a single element does not remain, then the elements are wrapped.\r\n * @method ensureSingleElement\r\n * @param {DOMElement[]} allElements The elements.\r\n * @return {DOMElement} A single element.\r\n */\r\n ensureSingleElement:function(allElements){\r\n if (!allElements) { \r\n $('
')[0];\r\n } else if (allElements.length == 1) {\r\n return allElements[0];\r\n }\r\n\r\n var withoutCommentsOrEmptyText = [];\r\n\r\n for (var i = 0; i < allElements.length; i++) {\r\n var current = allElements[i];\r\n if (current.nodeType != 8) {\r\n if (current.nodeType == 3) {\r\n var result = /\\S/.test(current.nodeValue);\r\n if (!result) {\r\n continue;\r\n }\r\n }\r\n\r\n withoutCommentsOrEmptyText.push(current);\r\n }\r\n }\r\n\r\n if (withoutCommentsOrEmptyText.length > 1) {\r\n return $(withoutCommentsOrEmptyText).wrapAll('').parent().get(0);\r\n }\r\n\r\n return withoutCommentsOrEmptyText[0];\r\n },\r\n /**\r\n * Gets the view associated with the id from the cache of parsed views.\r\n * @method tryGetViewFromCache\r\n * @param {string} id The view id to lookup in the cache.\r\n * @return {DOMElement|null} The cached view or null if it's not in the cache.\r\n */\r\n tryGetViewFromCache:function(id) {\r\n return this.cache[id];\r\n },\r\n /**\r\n * Puts the view associated with the id into the cache of parsed views.\r\n * @method putViewInCache\r\n * @param {string} id The view id whose view should be cached.\r\n * @param {DOMElement} view The view to cache.\r\n */\r\n putViewInCache: function (id, view) {\r\n this.cache[id] = view;\r\n },\r\n /**\r\n * Creates the view associated with the view id.\r\n * @method createView\r\n * @param {string} viewId The view id whose view should be created.\r\n * @return {Promise} A promise of the view.\r\n */\r\n createView: function(viewId) {\r\n var that = this;\r\n var requirePath = this.convertViewIdToRequirePath(viewId);\r\n var existing = this.tryGetViewFromCache(requirePath);\r\n\r\n if (existing) {\r\n return system.defer(function(dfd) {\r\n dfd.resolve(existing.cloneNode(true));\r\n }).promise();\r\n }\r\n\r\n return system.defer(function(dfd) {\r\n system.acquire(requirePath).then(function(markup) {\r\n var element = that.processMarkup(markup);\r\n element.setAttribute('data-view', viewId);\r\n that.putViewInCache(requirePath, element);\r\n dfd.resolve(element.cloneNode(true));\r\n }).fail(function(err) {\r\n that.createFallbackView(viewId, requirePath, err).then(function(element) {\r\n element.setAttribute('data-view', viewId);\r\n that.cache[requirePath] = element;\r\n dfd.resolve(element.cloneNode(true));\r\n });\r\n });\r\n }).promise();\r\n },\r\n /**\r\n * Called when a view cannot be found to provide the opportunity to locate or generate a fallback view. Mainly used to ease development.\r\n * @method createFallbackView\r\n * @param {string} viewId The view id whose view should be created.\r\n * @param {string} requirePath The require path that was attempted.\r\n * @param {Error} requirePath The error that was returned from the attempt to locate the default view.\r\n * @return {Promise} A promise for the fallback view.\r\n */\r\n createFallbackView: function (viewId, requirePath, err) {\r\n var that = this,\r\n message = 'View Not Found. Searched for \"' + viewId + '\" via path \"' + requirePath + '\".';\r\n\r\n return system.defer(function(dfd) {\r\n dfd.resolve(that.processMarkup('