!function(modules){function __webpack_require__(moduleId){if(installedModules[moduleId])return installedModules[moduleId].exports;var module=installedModules[moduleId]={i:moduleId,l:!1,exports:{}};return modules[moduleId].call(module.exports,module,module.exports,__webpack_require__),module.l=!0,module.exports}var parentJsonpFunction=window.webpackJsonp;window.webpackJsonp=function(chunkIds,moreModules,executeModules){for(var moduleId,chunkId,result,i=0,resolves=[];i<chunkIds.length;i++)chunkId=chunkIds[i],installedChunks[chunkId]&&resolves.push(installedChunks[chunkId][0]),installedChunks[chunkId]=0;for(moduleId in moreModules)Object.prototype.hasOwnProperty.call(moreModules,moduleId)&&(modules[moduleId]=moreModules[moduleId]);for(parentJsonpFunction&&parentJsonpFunction(chunkIds,moreModules,executeModules);resolves.length;)resolves.shift()();if(executeModules)for(i=0;i<executeModules.length;i++)result=__webpack_require__(__webpack_require__.s=executeModules[i]);return result};var installedModules={},installedChunks={1:0};return __webpack_require__.e=function(chunkId){function onScriptComplete(){script.onerror=script.onload=null,clearTimeout(timeout);var chunk=installedChunks[chunkId];0!==chunk&&(chunk&&chunk[1](new Error("Loading chunk "+chunkId+" failed.")),installedChunks[chunkId]=void 0)}if(0===installedChunks[chunkId])return Promise.resolve();if(installedChunks[chunkId])return installedChunks[chunkId][2];var head=document.getElementsByTagName("head")[0],script=document.createElement("script");script.type="text/javascript",script.charset="utf-8",script.async=!0,script.timeout=12e4,script.src=__webpack_require__.p+""+chunkId+".js";var timeout=setTimeout(onScriptComplete,12e4);script.onerror=script.onload=onScriptComplete,head.appendChild(script);var promise=new Promise(function(resolve,reject){installedChunks[chunkId]=[resolve,reject]});return installedChunks[chunkId][2]=promise},__webpack_require__.m=modules,__webpack_require__.c=installedModules,__webpack_require__.i=function(value){return value},__webpack_require__.d=function(exports,name,getter){Object.defineProperty(exports,name,{configurable:!1,enumerable:!0,get:getter})},__webpack_require__.n=function(module){var getter=module&&module.__esModule?function(){return module["default"]}:function(){return module};return __webpack_require__.d(getter,"a",getter),getter},__webpack_require__.o=function(object,property){return Object.prototype.hasOwnProperty.call(object,property)},__webpack_require__.p="/spa/",__webpack_require__.oe=function(err){throw console.error(err),err},__webpack_require__(__webpack_require__.s=479)}([function(module,exports,__webpack_require__){"use strict";var root_1=__webpack_require__(8),toSubscriber_1=__webpack_require__(424),observable_1=__webpack_require__(32),Observable=function(){function Observable(subscribe){this._isScalar=!1,subscribe&&(this._subscribe=subscribe)}return Observable.prototype.lift=function(operator){var observable=new Observable;return observable.source=this,observable.operator=operator,observable},Observable.prototype.subscribe=function(observerOrNext,error,complete){var operator=this.operator,sink=toSubscriber_1.toSubscriber(observerOrNext,error,complete);if(operator?operator.call(sink,this.source):sink.add(this._trySubscribe(sink)),sink.syncErrorThrowable&&(sink.syncErrorThrowable=!1,sink.syncErrorThrown))throw sink.syncErrorValue;return sink},Observable.prototype._trySubscribe=function(sink){try{return this._subscribe(sink)}catch(err){sink.syncErrorThrown=!0,sink.syncErrorValue=err,sink.error(err)}},Observable.prototype.forEach=function(next,PromiseCtor){var _this=this;if(PromiseCtor||(root_1.root.Rx&&root_1.root.Rx.config&&root_1.root.Rx.config.Promise?PromiseCtor=root_1.root.Rx.config.Promise:root_1.root.Promise&&(PromiseCtor=root_1.root.Promise)),!PromiseCtor)throw new Error("no Promise impl found");return new PromiseCtor(function(resolve,reject){var subscription=_this.subscribe(function(value){if(subscription)try{next(value)}catch(err){reject(err),subscription.unsubscribe()}else next(value)},reject,resolve)})},Observable.prototype._subscribe=function(subscriber){return this.source.subscribe(subscriber)},Observable.prototype[observable_1.$$observable]=function(){return this},Observable.create=function(subscribe){return new Observable(subscribe)},Observable}();exports.Observable=Observable},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},isFunction_1=__webpack_require__(38),Subscription_1=__webpack_require__(5),Observer_1=__webpack_require__(71),rxSubscriber_1=__webpack_require__(33),Subscriber=function(_super){function Subscriber(destinationOrNext,error,complete){switch(_super.call(this),this.syncErrorValue=null,this.syncErrorThrown=!1,this.syncErrorThrowable=!1,this.isStopped=!1,arguments.length){case 0:this.destination=Observer_1.empty;break;case 1:if(!destinationOrNext){this.destination=Observer_1.empty;break}if("object"==typeof destinationOrNext){destinationOrNext instanceof Subscriber?(this.destination=destinationOrNext,this.destination.add(this)):(this.syncErrorThrowable=!0,this.destination=new SafeSubscriber(this,destinationOrNext));break}default:this.syncErrorThrowable=!0,this.destination=new SafeSubscriber(this,destinationOrNext,error,complete)}}return __extends(Subscriber,_super),Subscriber.prototype[rxSubscriber_1.$$rxSubscriber]=function(){return this},Subscriber.create=function(next,error,complete){var subscriber=new Subscriber(next,error,complete);return subscriber.syncErrorThrowable=!1,subscriber},Subscriber.prototype.next=function(value){this.isStopped||this._next(value)},Subscriber.prototype.error=function(err){this.isStopped||(this.isStopped=!0,this._error(err))},Subscriber.prototype.complete=function(){this.isStopped||(this.isStopped=!0,this._complete())},Subscriber.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,_super.prototype.unsubscribe.call(this))},Subscriber.prototype._next=function(value){this.destination.next(value)},Subscriber.prototype._error=function(err){this.destination.error(err),this.unsubscribe()},Subscriber.prototype._complete=function(){this.destination.complete(),this.unsubscribe()},Subscriber.prototype._unsubscribeAndRecycle=function(){var _a=this,_parent=_a._parent,_parents=_a._parents;return this._parent=null,this._parents=null,this.unsubscribe(),this.closed=!1,this.isStopped=!1,this._parent=_parent,this._parents=_parents,this},Subscriber}(Subscription_1.Subscription);exports.Subscriber=Subscriber;var SafeSubscriber=function(_super){function SafeSubscriber(_parentSubscriber,observerOrNext,error,complete){_super.call(this),this._parentSubscriber=_parentSubscriber;var next,context=this;isFunction_1.isFunction(observerOrNext)?next=observerOrNext:observerOrNext&&(context=observerOrNext,next=observerOrNext.next,error=observerOrNext.error,complete=observerOrNext.complete,isFunction_1.isFunction(context.unsubscribe)&&this.add(context.unsubscribe.bind(context)),context.unsubscribe=this.unsubscribe.bind(this)),this._context=context,this._next=next,this._error=error,this._complete=complete}return __extends(SafeSubscriber,_super),SafeSubscriber.prototype.next=function(value){if(!this.isStopped&&this._next){var _parentSubscriber=this._parentSubscriber;_parentSubscriber.syncErrorThrowable?this.__tryOrSetError(_parentSubscriber,this._next,value)&&this.unsubscribe():this.__tryOrUnsub(this._next,value)}},SafeSubscriber.prototype.error=function(err){if(!this.isStopped){var _parentSubscriber=this._parentSubscriber;if(this._error)_parentSubscriber.syncErrorThrowable?(this.__tryOrSetError(_parentSubscriber,this._error,err),this.unsubscribe()):(this.__tryOrUnsub(this._error,err),this.unsubscribe());else{if(!_parentSubscriber.syncErrorThrowable)throw this.unsubscribe(),err;_parentSubscriber.syncErrorValue=err,_parentSubscriber.syncErrorThrown=!0,this.unsubscribe()}}},SafeSubscriber.prototype.complete=function(){if(!this.isStopped){var _parentSubscriber=this._parentSubscriber;this._complete?_parentSubscriber.syncErrorThrowable?(this.__tryOrSetError(_parentSubscriber,this._complete),this.unsubscribe()):(this.__tryOrUnsub(this._complete),this.unsubscribe()):this.unsubscribe()}},SafeSubscriber.prototype.__tryOrUnsub=function(fn,value){try{fn.call(this._context,value)}catch(err){throw this.unsubscribe(),err}},SafeSubscriber.prototype.__tryOrSetError=function(parent,fn,value){try{fn.call(this._context,value)}catch(err){return parent.syncErrorValue=err,parent.syncErrorThrown=!0,!0}return!1},SafeSubscriber.prototype._unsubscribe=function(){var _parentSubscriber=this._parentSubscriber;this._context=null,this._parentSubscriber=null,_parentSubscriber.unsubscribe()},SafeSubscriber}(Subscriber)},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),OuterSubscriber=function(_super){function OuterSubscriber(){_super.apply(this,arguments)}return __extends(OuterSubscriber,_super),OuterSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this.destination.next(innerValue)},OuterSubscriber.prototype.notifyError=function(error,innerSub){this.destination.error(error)},OuterSubscriber.prototype.notifyComplete=function(innerSub){this.destination.complete()},OuterSubscriber}(Subscriber_1.Subscriber);exports.OuterSubscriber=OuterSubscriber},function(module,exports,__webpack_require__){"use strict";function subscribeToResult(outerSubscriber,result,outerValue,outerIndex){var destination=new InnerSubscriber_1.InnerSubscriber(outerSubscriber,outerValue,outerIndex);if(destination.closed)return null;if(result instanceof Observable_1.Observable)return result._isScalar?(destination.next(result.value),destination.complete(),null):result.subscribe(destination);if(isArrayLike_1.isArrayLike(result)){for(var i=0,len=result.length;i<len&&!destination.closed;i++)destination.next(result[i]);destination.closed||destination.complete()}else{if(isPromise_1.isPromise(result))return result.then(function(value){destination.closed||(destination.next(value),destination.complete())},function(err){return destination.error(err)}).then(null,function(err){root_1.root.setTimeout(function(){throw err})}),destination;if(result&&"function"==typeof result[iterator_1.$$iterator])for(var iterator=result[iterator_1.$$iterator]();;){var item=iterator.next();if(item.done){destination.complete();break}if(destination.next(item.value),destination.closed)break}else if(result&&"function"==typeof result[observable_1.$$observable]){var obs=result[observable_1.$$observable]();if("function"==typeof obs.subscribe)return obs.subscribe(new InnerSubscriber_1.InnerSubscriber(outerSubscriber,outerValue,outerIndex));destination.error(new TypeError("Provided object does not correctly implement Symbol.observable"))}else{var value=isObject_1.isObject(result)?"an invalid object":"'"+result+"'",msg="You provided "+value+" where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.";destination.error(new TypeError(msg))}}return null}var root_1=__webpack_require__(8),isArrayLike_1=__webpack_require__(95),isPromise_1=__webpack_require__(97),isObject_1=__webpack_require__(96),Observable_1=__webpack_require__(0),iterator_1=__webpack_require__(25),InnerSubscriber_1=__webpack_require__(151),observable_1=__webpack_require__(32);exports.subscribeToResult=subscribeToResult},function(module,exports){var g;g=function(){return this}();try{g=g||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(g=window)}module.exports=g},function(module,exports,__webpack_require__){"use strict";function flattenUnsubscriptionErrors(errors){return errors.reduce(function(errs,err){return errs.concat(err instanceof UnsubscriptionError_1.UnsubscriptionError?err.errors:err)},[])}var isArray_1=__webpack_require__(14),isObject_1=__webpack_require__(96),isFunction_1=__webpack_require__(38),tryCatch_1=__webpack_require__(9),errorObject_1=__webpack_require__(7),UnsubscriptionError_1=__webpack_require__(93),Subscription=function(){function Subscription(unsubscribe){this.closed=!1,this._parent=null,this._parents=null,this._subscriptions=null,unsubscribe&&(this._unsubscribe=unsubscribe)}return Subscription.prototype.unsubscribe=function(){var errors,hasErrors=!1;if(!this.closed){var _a=this,_parent=_a._parent,_parents=_a._parents,_unsubscribe=_a._unsubscribe,_subscriptions=_a._subscriptions;this.closed=!0,this._parent=null,this._parents=null,this._subscriptions=null;for(var index=-1,len=_parents?_parents.length:0;_parent;)_parent.remove(this),_parent=++index<len&&_parents[index]||null;if(isFunction_1.isFunction(_unsubscribe)){var trial=tryCatch_1.tryCatch(_unsubscribe).call(this);trial===errorObject_1.errorObject&&(hasErrors=!0,errors=errors||(errorObject_1.errorObject.e instanceof UnsubscriptionError_1.UnsubscriptionError?flattenUnsubscriptionErrors(errorObject_1.errorObject.e.errors):[errorObject_1.errorObject.e]))}if(isArray_1.isArray(_subscriptions))for(index=-1,len=_subscriptions.length;++index<len;){var sub=_subscriptions[index];if(isObject_1.isObject(sub)){var trial=tryCatch_1.tryCatch(sub.unsubscribe).call(sub);if(trial===errorObject_1.errorObject){hasErrors=!0,errors=errors||[];var err=errorObject_1.errorObject.e;err instanceof UnsubscriptionError_1.UnsubscriptionError?errors=errors.concat(flattenUnsubscriptionErrors(err.errors)):errors.push(err)}}}if(hasErrors)throw new UnsubscriptionError_1.UnsubscriptionError(errors)}},Subscription.prototype.add=function(teardown){if(!teardown||teardown===Subscription.EMPTY)return Subscription.EMPTY;if(teardown===this)return this;var subscription=teardown;switch(typeof teardown){case"function":subscription=new Subscription(teardown);case"object":if(subscription.closed||"function"!=typeof subscription.unsubscribe)return subscription;if(this.closed)return subscription.unsubscribe(),subscription;if("function"!=typeof subscription._addParent){var tmp=subscription;subscription=new Subscription,subscription._subscriptions=[tmp]}break;default:throw new Error("unrecognized teardown "+teardown+" added to Subscription.")}var subscriptions=this._subscriptions||(this._subscriptions=[]);return subscriptions.push(subscription),subscription._addParent(this),subscription},Subscription.prototype.remove=function(subscription){var subscriptions=this._subscriptions;if(subscriptions){var subscriptionIndex=subscriptions.indexOf(subscription);subscriptionIndex!==-1&&subscriptions.splice(subscriptionIndex,1)}},Subscription.prototype._addParent=function(parent){var _a=this,_parent=_a._parent,_parents=_a._parents;_parent&&_parent!==parent?_parents?_parents.indexOf(parent)===-1&&_parents.push(parent):this._parents=[parent]:this._parent=parent},Subscription.EMPTY=function(empty){return empty.closed=!0,empty}(new Subscription),Subscription}();exports.Subscription=Subscription},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Observable_1=__webpack_require__(0),Subscriber_1=__webpack_require__(1),Subscription_1=__webpack_require__(5),ObjectUnsubscribedError_1=__webpack_require__(36),SubjectSubscription_1=__webpack_require__(72),rxSubscriber_1=__webpack_require__(33),SubjectSubscriber=function(_super){function SubjectSubscriber(destination){_super.call(this,destination),this.destination=destination}return __extends(SubjectSubscriber,_super),SubjectSubscriber}(Subscriber_1.Subscriber);exports.SubjectSubscriber=SubjectSubscriber;var Subject=function(_super){function Subject(){_super.call(this),this.observers=[],this.closed=!1,this.isStopped=!1,this.hasError=!1,this.thrownError=null}return __extends(Subject,_super),Subject.prototype[rxSubscriber_1.$$rxSubscriber]=function(){return new SubjectSubscriber(this)},Subject.prototype.lift=function(operator){var subject=new AnonymousSubject(this,this);return subject.operator=operator,subject},Subject.prototype.next=function(value){if(this.closed)throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError;if(!this.isStopped)for(var observers=this.observers,len=observers.length,copy=observers.slice(),i=0;i<len;i++)copy[i].next(value)},Subject.prototype.error=function(err){if(this.closed)throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError;this.hasError=!0,this.thrownError=err,this.isStopped=!0;for(var observers=this.observers,len=observers.length,copy=observers.slice(),i=0;i<len;i++)copy[i].error(err);this.observers.length=0},Subject.prototype.complete=function(){if(this.closed)throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError;this.isStopped=!0;for(var observers=this.observers,len=observers.length,copy=observers.slice(),i=0;i<len;i++)copy[i].complete();this.observers.length=0},Subject.prototype.unsubscribe=function(){this.isStopped=!0,this.closed=!0,this.observers=null},Subject.prototype._trySubscribe=function(subscriber){if(this.closed)throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError;return _super.prototype._trySubscribe.call(this,subscriber)},Subject.prototype._subscribe=function(subscriber){if(this.closed)throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError;return this.hasError?(subscriber.error(this.thrownError),Subscription_1.Subscription.EMPTY):this.isStopped?(subscriber.complete(),Subscription_1.Subscription.EMPTY):(this.observers.push(subscriber),new SubjectSubscription_1.SubjectSubscription(this,subscriber))},Subject.prototype.asObservable=function(){var observable=new Observable_1.Observable;return observable.source=this,observable},Subject.create=function(destination,source){return new AnonymousSubject(destination,source)},Subject}(Observable_1.Observable);exports.Subject=Subject;var AnonymousSubject=function(_super){function AnonymousSubject(destination,source){_super.call(this),this.destination=destination,this.source=source}return __extends(AnonymousSubject,_super),AnonymousSubject.prototype.next=function(value){var destination=this.destination;destination&&destination.next&&destination.next(value)},AnonymousSubject.prototype.error=function(err){var destination=this.destination;destination&&destination.error&&this.destination.error(err)},AnonymousSubject.prototype.complete=function(){var destination=this.destination;destination&&destination.complete&&this.destination.complete()},AnonymousSubject.prototype._subscribe=function(subscriber){var source=this.source;return source?this.source.subscribe(subscriber):Subscription_1.Subscription.EMPTY},AnonymousSubject}(Subject);exports.AnonymousSubject=AnonymousSubject},function(module,exports){"use strict";exports.errorObject={e:{}}},function(module,exports,__webpack_require__){"use strict";(function(global){if(exports.root="object"==typeof window&&window.window===window&&window||"object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global,!exports.root)throw new Error("RxJS could not find any global context (window, self, global)")}).call(exports,__webpack_require__(4))},function(module,exports,__webpack_require__){"use strict";function tryCatcher(){try{return tryCatchTarget.apply(this,arguments)}catch(e){return errorObject_1.errorObject.e=e,errorObject_1.errorObject}}function tryCatch(fn){return tryCatchTarget=fn,tryCatcher}var tryCatchTarget,errorObject_1=__webpack_require__(7);exports.tryCatch=tryCatch},function(module,exports,__webpack_require__){"use strict";var AsyncAction_1=__webpack_require__(23),AsyncScheduler_1=__webpack_require__(24);exports.async=new AsyncScheduler_1.AsyncScheduler(AsyncAction_1.AsyncAction)},function(module,exports,__webpack_require__){var __WEBPACK_AMD_DEFINE_ARRAY__,__WEBPACK_AMD_DEFINE_RESULT__;/*!
 * jQuery JavaScript Library v3.1.1
 * https://jquery.com/
 *
 * Includes Sizzle.js
 * https://sizzlejs.com/
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license
 * https://jquery.org/license
 *
 * Date: 2016-09-22T22:30Z
 */
!function(global,factory){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=global.document?factory(global,!0):function(w){if(!w.document)throw new Error("jQuery requires a window with a document");return factory(w)}:factory(global)}("undefined"!=typeof window?window:this,function(window,noGlobal){"use strict";function DOMEval(code,doc){doc=doc||document;var script=doc.createElement("script");script.text=code,doc.head.appendChild(script).parentNode.removeChild(script)}function isArrayLike(obj){var length=!!obj&&"length"in obj&&obj.length,type=jQuery.type(obj);return"function"!==type&&!jQuery.isWindow(obj)&&("array"===type||0===length||"number"==typeof length&&length>0&&length-1 in obj)}function winnow(elements,qualifier,not){return jQuery.isFunction(qualifier)?jQuery.grep(elements,function(elem,i){return!!qualifier.call(elem,i,elem)!==not}):qualifier.nodeType?jQuery.grep(elements,function(elem){return elem===qualifier!==not}):"string"!=typeof qualifier?jQuery.grep(elements,function(elem){return indexOf.call(qualifier,elem)>-1!==not}):risSimple.test(qualifier)?jQuery.filter(qualifier,elements,not):(qualifier=jQuery.filter(qualifier,elements),jQuery.grep(elements,function(elem){return indexOf.call(qualifier,elem)>-1!==not&&1===elem.nodeType}))}function sibling(cur,dir){for(;(cur=cur[dir])&&1!==cur.nodeType;);return cur}function createOptions(options){var object={};return jQuery.each(options.match(rnothtmlwhite)||[],function(_,flag){object[flag]=!0}),object}function Identity(v){return v}function Thrower(ex){throw ex}function adoptValue(value,resolve,reject){var method;try{value&&jQuery.isFunction(method=value.promise)?method.call(value).done(resolve).fail(reject):value&&jQuery.isFunction(method=value.then)?method.call(value,resolve,reject):resolve.call(void 0,value)}catch(value){reject.call(void 0,value)}}function completed(){document.removeEventListener("DOMContentLoaded",completed),window.removeEventListener("load",completed),jQuery.ready()}function Data(){this.expando=jQuery.expando+Data.uid++}function getData(data){return"true"===data||"false"!==data&&("null"===data?null:data===+data+""?+data:rbrace.test(data)?JSON.parse(data):data)}function dataAttr(elem,key,data){var name;if(void 0===data&&1===elem.nodeType)if(name="data-"+key.replace(rmultiDash,"-$&").toLowerCase(),data=elem.getAttribute(name),"string"==typeof data){try{data=getData(data)}catch(e){}dataUser.set(elem,key,data)}else data=void 0;return data}function adjustCSS(elem,prop,valueParts,tween){var adjusted,scale=1,maxIterations=20,currentValue=tween?function(){return tween.cur()}:function(){return jQuery.css(elem,prop,"")},initial=currentValue(),unit=valueParts&&valueParts[3]||(jQuery.cssNumber[prop]?"":"px"),initialInUnit=(jQuery.cssNumber[prop]||"px"!==unit&&+initial)&&rcssNum.exec(jQuery.css(elem,prop));if(initialInUnit&&initialInUnit[3]!==unit){unit=unit||initialInUnit[3],valueParts=valueParts||[],initialInUnit=+initial||1;do scale=scale||".5",initialInUnit/=scale,jQuery.style(elem,prop,initialInUnit+unit);while(scale!==(scale=currentValue()/initial)&&1!==scale&&--maxIterations)}return valueParts&&(initialInUnit=+initialInUnit||+initial||0,adjusted=valueParts[1]?initialInUnit+(valueParts[1]+1)*valueParts[2]:+valueParts[2],tween&&(tween.unit=unit,tween.start=initialInUnit,tween.end=adjusted)),adjusted}function getDefaultDisplay(elem){var temp,doc=elem.ownerDocument,nodeName=elem.nodeName,display=defaultDisplayMap[nodeName];return display?display:(temp=doc.body.appendChild(doc.createElement(nodeName)),display=jQuery.css(temp,"display"),temp.parentNode.removeChild(temp),"none"===display&&(display="block"),defaultDisplayMap[nodeName]=display,display)}function showHide(elements,show){for(var display,elem,values=[],index=0,length=elements.length;index<length;index++)elem=elements[index],elem.style&&(display=elem.style.display,show?("none"===display&&(values[index]=dataPriv.get(elem,"display")||null,values[index]||(elem.style.display="")),""===elem.style.display&&isHiddenWithinTree(elem)&&(values[index]=getDefaultDisplay(elem))):"none"!==display&&(values[index]="none",dataPriv.set(elem,"display",display)));for(index=0;index<length;index++)null!=values[index]&&(elements[index].style.display=values[index]);return elements}function getAll(context,tag){var ret;return ret="undefined"!=typeof context.getElementsByTagName?context.getElementsByTagName(tag||"*"):"undefined"!=typeof context.querySelectorAll?context.querySelectorAll(tag||"*"):[],void 0===tag||tag&&jQuery.nodeName(context,tag)?jQuery.merge([context],ret):ret}function setGlobalEval(elems,refElements){for(var i=0,l=elems.length;i<l;i++)dataPriv.set(elems[i],"globalEval",!refElements||dataPriv.get(refElements[i],"globalEval"))}function buildFragment(elems,context,scripts,selection,ignored){for(var elem,tmp,tag,wrap,contains,j,fragment=context.createDocumentFragment(),nodes=[],i=0,l=elems.length;i<l;i++)if(elem=elems[i],elem||0===elem)if("object"===jQuery.type(elem))jQuery.merge(nodes,elem.nodeType?[elem]:elem);else if(rhtml.test(elem)){for(tmp=tmp||fragment.appendChild(context.createElement("div")),tag=(rtagName.exec(elem)||["",""])[1].toLowerCase(),wrap=wrapMap[tag]||wrapMap._default,tmp.innerHTML=wrap[1]+jQuery.htmlPrefilter(elem)+wrap[2],j=wrap[0];j--;)tmp=tmp.lastChild;jQuery.merge(nodes,tmp.childNodes),tmp=fragment.firstChild,tmp.textContent=""}else nodes.push(context.createTextNode(elem));for(fragment.textContent="",i=0;elem=nodes[i++];)if(selection&&jQuery.inArray(elem,selection)>-1)ignored&&ignored.push(elem);else if(contains=jQuery.contains(elem.ownerDocument,elem),tmp=getAll(fragment.appendChild(elem),"script"),contains&&setGlobalEval(tmp),scripts)for(j=0;elem=tmp[j++];)rscriptType.test(elem.type||"")&&scripts.push(elem);return fragment}function returnTrue(){return!0}function returnFalse(){return!1}function safeActiveElement(){try{return document.activeElement}catch(err){}}function on(elem,types,selector,data,fn,one){var origFn,type;if("object"==typeof types){"string"!=typeof selector&&(data=data||selector,selector=void 0);for(type in types)on(elem,type,selector,data,types[type],one);return elem}if(null==data&&null==fn?(fn=selector,data=selector=void 0):null==fn&&("string"==typeof selector?(fn=data,data=void 0):(fn=data,data=selector,selector=void 0)),fn===!1)fn=returnFalse;else if(!fn)return elem;return 1===one&&(origFn=fn,fn=function(event){return jQuery().off(event),origFn.apply(this,arguments)},fn.guid=origFn.guid||(origFn.guid=jQuery.guid++)),elem.each(function(){jQuery.event.add(this,types,fn,data,selector)})}function manipulationTarget(elem,content){return jQuery.nodeName(elem,"table")&&jQuery.nodeName(11!==content.nodeType?content:content.firstChild,"tr")?elem.getElementsByTagName("tbody")[0]||elem:elem}function disableScript(elem){return elem.type=(null!==elem.getAttribute("type"))+"/"+elem.type,elem}function restoreScript(elem){var match=rscriptTypeMasked.exec(elem.type);return match?elem.type=match[1]:elem.removeAttribute("type"),elem}function cloneCopyEvent(src,dest){var i,l,type,pdataOld,pdataCur,udataOld,udataCur,events;if(1===dest.nodeType){if(dataPriv.hasData(src)&&(pdataOld=dataPriv.access(src),pdataCur=dataPriv.set(dest,pdataOld),events=pdataOld.events)){delete pdataCur.handle,pdataCur.events={};for(type in events)for(i=0,l=events[type].length;i<l;i++)jQuery.event.add(dest,type,events[type][i])}dataUser.hasData(src)&&(udataOld=dataUser.access(src),udataCur=jQuery.extend({},udataOld),dataUser.set(dest,udataCur))}}function fixInput(src,dest){var nodeName=dest.nodeName.toLowerCase();"input"===nodeName&&rcheckableType.test(src.type)?dest.checked=src.checked:"input"!==nodeName&&"textarea"!==nodeName||(dest.defaultValue=src.defaultValue)}function domManip(collection,args,callback,ignored){args=concat.apply([],args);var fragment,first,scripts,hasScripts,node,doc,i=0,l=collection.length,iNoClone=l-1,value=args[0],isFunction=jQuery.isFunction(value);if(isFunction||l>1&&"string"==typeof value&&!support.checkClone&&rchecked.test(value))return collection.each(function(index){var self=collection.eq(index);isFunction&&(args[0]=value.call(this,index,self.html())),domManip(self,args,callback,ignored)});if(l&&(fragment=buildFragment(args,collection[0].ownerDocument,!1,collection,ignored),first=fragment.firstChild,1===fragment.childNodes.length&&(fragment=first),first||ignored)){for(scripts=jQuery.map(getAll(fragment,"script"),disableScript),hasScripts=scripts.length;i<l;i++)node=fragment,i!==iNoClone&&(node=jQuery.clone(node,!0,!0),hasScripts&&jQuery.merge(scripts,getAll(node,"script"))),callback.call(collection[i],node,i);if(hasScripts)for(doc=scripts[scripts.length-1].ownerDocument,jQuery.map(scripts,restoreScript),i=0;i<hasScripts;i++)node=scripts[i],rscriptType.test(node.type||"")&&!dataPriv.access(node,"globalEval")&&jQuery.contains(doc,node)&&(node.src?jQuery._evalUrl&&jQuery._evalUrl(node.src):DOMEval(node.textContent.replace(rcleanScript,""),doc))}return collection}function remove(elem,selector,keepData){for(var node,nodes=selector?jQuery.filter(selector,elem):elem,i=0;null!=(node=nodes[i]);i++)keepData||1!==node.nodeType||jQuery.cleanData(getAll(node)),node.parentNode&&(keepData&&jQuery.contains(node.ownerDocument,node)&&setGlobalEval(getAll(node,"script")),node.parentNode.removeChild(node));return elem}function curCSS(elem,name,computed){var width,minWidth,maxWidth,ret,style=elem.style;return computed=computed||getStyles(elem),computed&&(ret=computed.getPropertyValue(name)||computed[name],""!==ret||jQuery.contains(elem.ownerDocument,elem)||(ret=jQuery.style(elem,name)),!support.pixelMarginRight()&&rnumnonpx.test(ret)&&rmargin.test(name)&&(width=style.width,minWidth=style.minWidth,maxWidth=style.maxWidth,style.minWidth=style.maxWidth=style.width=ret,ret=computed.width,style.width=width,style.minWidth=minWidth,style.maxWidth=maxWidth)),void 0!==ret?ret+"":ret}function addGetHookIf(conditionFn,hookFn){return{get:function(){return conditionFn()?void delete this.get:(this.get=hookFn).apply(this,arguments)}}}function vendorPropName(name){if(name in emptyStyle)return name;for(var capName=name[0].toUpperCase()+name.slice(1),i=cssPrefixes.length;i--;)if(name=cssPrefixes[i]+capName,name in emptyStyle)return name}function setPositiveNumber(elem,value,subtract){var matches=rcssNum.exec(value);return matches?Math.max(0,matches[2]-(subtract||0))+(matches[3]||"px"):value}function augmentWidthOrHeight(elem,name,extra,isBorderBox,styles){var i,val=0;for(i=extra===(isBorderBox?"border":"content")?4:"width"===name?1:0;i<4;i+=2)"margin"===extra&&(val+=jQuery.css(elem,extra+cssExpand[i],!0,styles)),isBorderBox?("content"===extra&&(val-=jQuery.css(elem,"padding"+cssExpand[i],!0,styles)),"margin"!==extra&&(val-=jQuery.css(elem,"border"+cssExpand[i]+"Width",!0,styles))):(val+=jQuery.css(elem,"padding"+cssExpand[i],!0,styles),"padding"!==extra&&(val+=jQuery.css(elem,"border"+cssExpand[i]+"Width",!0,styles)));return val}function getWidthOrHeight(elem,name,extra){var val,valueIsBorderBox=!0,styles=getStyles(elem),isBorderBox="border-box"===jQuery.css(elem,"boxSizing",!1,styles);if(elem.getClientRects().length&&(val=elem.getBoundingClientRect()[name]),val<=0||null==val){if(val=curCSS(elem,name,styles),(val<0||null==val)&&(val=elem.style[name]),rnumnonpx.test(val))return val;valueIsBorderBox=isBorderBox&&(support.boxSizingReliable()||val===elem.style[name]),val=parseFloat(val)||0}return val+augmentWidthOrHeight(elem,name,extra||(isBorderBox?"border":"content"),valueIsBorderBox,styles)+"px"}function Tween(elem,options,prop,end,easing){return new Tween.prototype.init(elem,options,prop,end,easing)}function raf(){timerId&&(window.requestAnimationFrame(raf),jQuery.fx.tick())}function createFxNow(){return window.setTimeout(function(){fxNow=void 0}),fxNow=jQuery.now()}function genFx(type,includeWidth){var which,i=0,attrs={height:type};for(includeWidth=includeWidth?1:0;i<4;i+=2-includeWidth)which=cssExpand[i],attrs["margin"+which]=attrs["padding"+which]=type;return includeWidth&&(attrs.opacity=attrs.width=type),attrs}function createTween(value,prop,animation){for(var tween,collection=(Animation.tweeners[prop]||[]).concat(Animation.tweeners["*"]),index=0,length=collection.length;index<length;index++)if(tween=collection[index].call(animation,prop,value))return tween}function defaultPrefilter(elem,props,opts){var prop,value,toggle,hooks,oldfire,propTween,restoreDisplay,display,isBox="width"in props||"height"in props,anim=this,orig={},style=elem.style,hidden=elem.nodeType&&isHiddenWithinTree(elem),dataShow=dataPriv.get(elem,"fxshow");opts.queue||(hooks=jQuery._queueHooks(elem,"fx"),null==hooks.unqueued&&(hooks.unqueued=0,oldfire=hooks.empty.fire,hooks.empty.fire=function(){hooks.unqueued||oldfire()}),hooks.unqueued++,anim.always(function(){anim.always(function(){hooks.unqueued--,jQuery.queue(elem,"fx").length||hooks.empty.fire()})}));for(prop in props)if(value=props[prop],rfxtypes.test(value)){if(delete props[prop],toggle=toggle||"toggle"===value,value===(hidden?"hide":"show")){if("show"!==value||!dataShow||void 0===dataShow[prop])continue;hidden=!0}orig[prop]=dataShow&&dataShow[prop]||jQuery.style(elem,prop)}if(propTween=!jQuery.isEmptyObject(props),propTween||!jQuery.isEmptyObject(orig)){isBox&&1===elem.nodeType&&(opts.overflow=[style.overflow,style.overflowX,style.overflowY],restoreDisplay=dataShow&&dataShow.display,null==restoreDisplay&&(restoreDisplay=dataPriv.get(elem,"display")),display=jQuery.css(elem,"display"),"none"===display&&(restoreDisplay?display=restoreDisplay:(showHide([elem],!0),restoreDisplay=elem.style.display||restoreDisplay,display=jQuery.css(elem,"display"),showHide([elem]))),("inline"===display||"inline-block"===display&&null!=restoreDisplay)&&"none"===jQuery.css(elem,"float")&&(propTween||(anim.done(function(){style.display=restoreDisplay}),null==restoreDisplay&&(display=style.display,restoreDisplay="none"===display?"":display)),style.display="inline-block")),opts.overflow&&(style.overflow="hidden",anim.always(function(){style.overflow=opts.overflow[0],style.overflowX=opts.overflow[1],style.overflowY=opts.overflow[2]})),propTween=!1;for(prop in orig)propTween||(dataShow?"hidden"in dataShow&&(hidden=dataShow.hidden):dataShow=dataPriv.access(elem,"fxshow",{display:restoreDisplay}),toggle&&(dataShow.hidden=!hidden),hidden&&showHide([elem],!0),anim.done(function(){hidden||showHide([elem]),dataPriv.remove(elem,"fxshow");for(prop in orig)jQuery.style(elem,prop,orig[prop])})),propTween=createTween(hidden?dataShow[prop]:0,prop,anim),prop in dataShow||(dataShow[prop]=propTween.start,hidden&&(propTween.end=propTween.start,propTween.start=0))}}function propFilter(props,specialEasing){var index,name,easing,value,hooks;for(index in props)if(name=jQuery.camelCase(index),easing=specialEasing[name],value=props[index],jQuery.isArray(value)&&(easing=value[1],value=props[index]=value[0]),index!==name&&(props[name]=value,delete props[index]),hooks=jQuery.cssHooks[name],hooks&&"expand"in hooks){value=hooks.expand(value),delete props[name];for(index in value)index in props||(props[index]=value[index],specialEasing[index]=easing)}else specialEasing[name]=easing}function Animation(elem,properties,options){var result,stopped,index=0,length=Animation.prefilters.length,deferred=jQuery.Deferred().always(function(){delete tick.elem}),tick=function(){if(stopped)return!1;for(var currentTime=fxNow||createFxNow(),remaining=Math.max(0,animation.startTime+animation.duration-currentTime),temp=remaining/animation.duration||0,percent=1-temp,index=0,length=animation.tweens.length;index<length;index++)animation.tweens[index].run(percent);return deferred.notifyWith(elem,[animation,percent,remaining]),percent<1&&length?remaining:(deferred.resolveWith(elem,[animation]),!1)},animation=deferred.promise({elem:elem,props:jQuery.extend({},properties),opts:jQuery.extend(!0,{specialEasing:{},easing:jQuery.easing._default},options),originalProperties:properties,originalOptions:options,startTime:fxNow||createFxNow(),duration:options.duration,tweens:[],createTween:function(prop,end){var tween=jQuery.Tween(elem,animation.opts,prop,end,animation.opts.specialEasing[prop]||animation.opts.easing);return animation.tweens.push(tween),tween},stop:function(gotoEnd){var index=0,length=gotoEnd?animation.tweens.length:0;if(stopped)return this;for(stopped=!0;index<length;index++)animation.tweens[index].run(1);return gotoEnd?(deferred.notifyWith(elem,[animation,1,0]),deferred.resolveWith(elem,[animation,gotoEnd])):deferred.rejectWith(elem,[animation,gotoEnd]),this}}),props=animation.props;for(propFilter(props,animation.opts.specialEasing);index<length;index++)if(result=Animation.prefilters[index].call(animation,elem,props,animation.opts))return jQuery.isFunction(result.stop)&&(jQuery._queueHooks(animation.elem,animation.opts.queue).stop=jQuery.proxy(result.stop,result)),result;return jQuery.map(props,createTween,animation),jQuery.isFunction(animation.opts.start)&&animation.opts.start.call(elem,animation),jQuery.fx.timer(jQuery.extend(tick,{elem:elem,anim:animation,queue:animation.opts.queue})),animation.progress(animation.opts.progress).done(animation.opts.done,animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always)}function stripAndCollapse(value){var tokens=value.match(rnothtmlwhite)||[];return tokens.join(" ")}function getClass(elem){return elem.getAttribute&&elem.getAttribute("class")||""}function buildParams(prefix,obj,traditional,add){var name;if(jQuery.isArray(obj))jQuery.each(obj,function(i,v){traditional||rbracket.test(prefix)?add(prefix,v):buildParams(prefix+"["+("object"==typeof v&&null!=v?i:"")+"]",v,traditional,add)});else if(traditional||"object"!==jQuery.type(obj))add(prefix,obj);else for(name in obj)buildParams(prefix+"["+name+"]",obj[name],traditional,add)}function addToPrefiltersOrTransports(structure){return function(dataTypeExpression,func){"string"!=typeof dataTypeExpression&&(func=dataTypeExpression,dataTypeExpression="*");var dataType,i=0,dataTypes=dataTypeExpression.toLowerCase().match(rnothtmlwhite)||[];if(jQuery.isFunction(func))for(;dataType=dataTypes[i++];)"+"===dataType[0]?(dataType=dataType.slice(1)||"*",(structure[dataType]=structure[dataType]||[]).unshift(func)):(structure[dataType]=structure[dataType]||[]).push(func)}}function inspectPrefiltersOrTransports(structure,options,originalOptions,jqXHR){function inspect(dataType){var selected;return inspected[dataType]=!0,jQuery.each(structure[dataType]||[],function(_,prefilterOrFactory){var dataTypeOrTransport=prefilterOrFactory(options,originalOptions,jqXHR);return"string"!=typeof dataTypeOrTransport||seekingTransport||inspected[dataTypeOrTransport]?seekingTransport?!(selected=dataTypeOrTransport):void 0:(options.dataTypes.unshift(dataTypeOrTransport),inspect(dataTypeOrTransport),!1)}),selected}var inspected={},seekingTransport=structure===transports;return inspect(options.dataTypes[0])||!inspected["*"]&&inspect("*")}function ajaxExtend(target,src){var key,deep,flatOptions=jQuery.ajaxSettings.flatOptions||{};for(key in src)void 0!==src[key]&&((flatOptions[key]?target:deep||(deep={}))[key]=src[key]);return deep&&jQuery.extend(!0,target,deep),target}function ajaxHandleResponses(s,jqXHR,responses){for(var ct,type,finalDataType,firstDataType,contents=s.contents,dataTypes=s.dataTypes;"*"===dataTypes[0];)dataTypes.shift(),void 0===ct&&(ct=s.mimeType||jqXHR.getResponseHeader("Content-Type"));if(ct)for(type in contents)if(contents[type]&&contents[type].test(ct)){dataTypes.unshift(type);break}if(dataTypes[0]in responses)finalDataType=dataTypes[0];else{for(type in responses){if(!dataTypes[0]||s.converters[type+" "+dataTypes[0]]){finalDataType=type;break}firstDataType||(firstDataType=type)}finalDataType=finalDataType||firstDataType}if(finalDataType)return finalDataType!==dataTypes[0]&&dataTypes.unshift(finalDataType),responses[finalDataType]}function ajaxConvert(s,response,jqXHR,isSuccess){var conv2,current,conv,tmp,prev,converters={},dataTypes=s.dataTypes.slice();if(dataTypes[1])for(conv in s.converters)converters[conv.toLowerCase()]=s.converters[conv];for(current=dataTypes.shift();current;)if(s.responseFields[current]&&(jqXHR[s.responseFields[current]]=response),!prev&&isSuccess&&s.dataFilter&&(response=s.dataFilter(response,s.dataType)),prev=current,current=dataTypes.shift())if("*"===current)current=prev;else if("*"!==prev&&prev!==current){if(conv=converters[prev+" "+current]||converters["* "+current],!conv)for(conv2 in converters)if(tmp=conv2.split(" "),tmp[1]===current&&(conv=converters[prev+" "+tmp[0]]||converters["* "+tmp[0]])){conv===!0?conv=converters[conv2]:converters[conv2]!==!0&&(current=tmp[0],dataTypes.unshift(tmp[1]));break}if(conv!==!0)if(conv&&s["throws"])response=conv(response);else try{response=conv(response)}catch(e){return{state:"parsererror",error:conv?e:"No conversion from "+prev+" to "+current}}}return{state:"success",data:response}}function getWindow(elem){return jQuery.isWindow(elem)?elem:9===elem.nodeType&&elem.defaultView}var arr=[],document=window.document,getProto=Object.getPrototypeOf,slice=arr.slice,concat=arr.concat,push=arr.push,indexOf=arr.indexOf,class2type={},toString=class2type.toString,hasOwn=class2type.hasOwnProperty,fnToString=hasOwn.toString,ObjectFunctionString=fnToString.call(Object),support={},version="3.1.1",jQuery=function(selector,context){return new jQuery.fn.init(selector,context)},rtrim=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,rmsPrefix=/^-ms-/,rdashAlpha=/-([a-z])/g,fcamelCase=function(all,letter){return letter.toUpperCase()};jQuery.fn=jQuery.prototype={jquery:version,constructor:jQuery,length:0,toArray:function(){return slice.call(this)},get:function(num){return null==num?slice.call(this):num<0?this[num+this.length]:this[num]},pushStack:function(elems){var ret=jQuery.merge(this.constructor(),elems);return ret.prevObject=this,ret},each:function(callback){return jQuery.each(this,callback)},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem)}))},slice:function(){return this.pushStack(slice.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(i){var len=this.length,j=+i+(i<0?len:0);return this.pushStack(j>=0&&j<len?[this[j]]:[])},end:function(){return this.prevObject||this.constructor()},push:push,sort:arr.sort,splice:arr.splice},jQuery.extend=jQuery.fn.extend=function(){var options,name,src,copy,copyIsArray,clone,target=arguments[0]||{},i=1,length=arguments.length,deep=!1;for("boolean"==typeof target&&(deep=target,target=arguments[i]||{},i++),"object"==typeof target||jQuery.isFunction(target)||(target={}),i===length&&(target=this,i--);i<length;i++)if(null!=(options=arguments[i]))for(name in options)src=target[name],copy=options[name],target!==copy&&(deep&&copy&&(jQuery.isPlainObject(copy)||(copyIsArray=jQuery.isArray(copy)))?(copyIsArray?(copyIsArray=!1,clone=src&&jQuery.isArray(src)?src:[]):clone=src&&jQuery.isPlainObject(src)?src:{},target[name]=jQuery.extend(deep,clone,copy)):void 0!==copy&&(target[name]=copy));return target},jQuery.extend({expando:"jQuery"+(version+Math.random()).replace(/\D/g,""),isReady:!0,error:function(msg){throw new Error(msg)},noop:function(){},isFunction:function(obj){return"function"===jQuery.type(obj)},isArray:Array.isArray,isWindow:function(obj){return null!=obj&&obj===obj.window},isNumeric:function(obj){var type=jQuery.type(obj);return("number"===type||"string"===type)&&!isNaN(obj-parseFloat(obj))},isPlainObject:function(obj){var proto,Ctor;return!(!obj||"[object Object]"!==toString.call(obj))&&(!(proto=getProto(obj))||(Ctor=hasOwn.call(proto,"constructor")&&proto.constructor,"function"==typeof Ctor&&fnToString.call(Ctor)===ObjectFunctionString))},isEmptyObject:function(obj){var name;for(name in obj)return!1;return!0},type:function(obj){return null==obj?obj+"":"object"==typeof obj||"function"==typeof obj?class2type[toString.call(obj)]||"object":typeof obj},globalEval:function(code){DOMEval(code)},camelCase:function(string){return string.replace(rmsPrefix,"ms-").replace(rdashAlpha,fcamelCase)},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toLowerCase()===name.toLowerCase()},each:function(obj,callback){var length,i=0;if(isArrayLike(obj))for(length=obj.length;i<length&&callback.call(obj[i],i,obj[i])!==!1;i++);else for(i in obj)if(callback.call(obj[i],i,obj[i])===!1)break;return obj},trim:function(text){return null==text?"":(text+"").replace(rtrim,"")},makeArray:function(arr,results){var ret=results||[];return null!=arr&&(isArrayLike(Object(arr))?jQuery.merge(ret,"string"==typeof arr?[arr]:arr):push.call(ret,arr)),ret},inArray:function(elem,arr,i){return null==arr?-1:indexOf.call(arr,elem,i)},merge:function(first,second){for(var len=+second.length,j=0,i=first.length;j<len;j++)first[i++]=second[j];return first.length=i,first},grep:function(elems,callback,invert){for(var callbackInverse,matches=[],i=0,length=elems.length,callbackExpect=!invert;i<length;i++)callbackInverse=!callback(elems[i],i),callbackInverse!==callbackExpect&&matches.push(elems[i]);return matches},map:function(elems,callback,arg){var length,value,i=0,ret=[];if(isArrayLike(elems))for(length=elems.length;i<length;i++)value=callback(elems[i],i,arg),null!=value&&ret.push(value);else for(i in elems)value=callback(elems[i],i,arg),null!=value&&ret.push(value);return concat.apply([],ret)},guid:1,proxy:function(fn,context){var tmp,args,proxy;if("string"==typeof context&&(tmp=fn[context],context=fn,fn=tmp),jQuery.isFunction(fn))return args=slice.call(arguments,2),proxy=function(){return fn.apply(context||this,args.concat(slice.call(arguments)))},proxy.guid=fn.guid=fn.guid||jQuery.guid++,proxy},now:Date.now,support:support}),"function"==typeof Symbol&&(jQuery.fn[Symbol.iterator]=arr[Symbol.iterator]),jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(i,name){class2type["[object "+name+"]"]=name.toLowerCase()});var Sizzle=/*!
 * Sizzle CSS Selector Engine v2.3.3
 * https://sizzlejs.com/
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license
 * http://jquery.org/license
 *
 * Date: 2016-08-08
 */
function(window){function Sizzle(selector,context,results,seed){var m,i,elem,nid,match,groups,newSelector,newContext=context&&context.ownerDocument,nodeType=context?context.nodeType:9;if(results=results||[],"string"!=typeof selector||!selector||1!==nodeType&&9!==nodeType&&11!==nodeType)return results;if(!seed&&((context?context.ownerDocument||context:preferredDoc)!==document&&setDocument(context),context=context||document,documentIsHTML)){if(11!==nodeType&&(match=rquickExpr.exec(selector)))if(m=match[1]){if(9===nodeType){if(!(elem=context.getElementById(m)))return results;if(elem.id===m)return results.push(elem),results}else if(newContext&&(elem=newContext.getElementById(m))&&contains(context,elem)&&elem.id===m)return results.push(elem),results}else{if(match[2])return push.apply(results,context.getElementsByTagName(selector)),results;if((m=match[3])&&support.getElementsByClassName&&context.getElementsByClassName)return push.apply(results,context.getElementsByClassName(m)),results}if(support.qsa&&!compilerCache[selector+" "]&&(!rbuggyQSA||!rbuggyQSA.test(selector))){if(1!==nodeType)newContext=context,newSelector=selector;else if("object"!==context.nodeName.toLowerCase()){for((nid=context.getAttribute("id"))?nid=nid.replace(rcssescape,fcssescape):context.setAttribute("id",nid=expando),groups=tokenize(selector),i=groups.length;i--;)groups[i]="#"+nid+" "+toSelector(groups[i]);newSelector=groups.join(","),newContext=rsibling.test(selector)&&testContext(context.parentNode)||context}if(newSelector)try{return push.apply(results,newContext.querySelectorAll(newSelector)),results}catch(qsaError){}finally{nid===expando&&context.removeAttribute("id")}}}return select(selector.replace(rtrim,"$1"),context,results,seed)}function createCache(){function cache(key,value){return keys.push(key+" ")>Expr.cacheLength&&delete cache[keys.shift()],cache[key+" "]=value}var keys=[];return cache}function markFunction(fn){return fn[expando]=!0,fn}function assert(fn){var el=document.createElement("fieldset");try{return!!fn(el)}catch(e){return!1}finally{el.parentNode&&el.parentNode.removeChild(el),el=null}}function addHandle(attrs,handler){for(var arr=attrs.split("|"),i=arr.length;i--;)Expr.attrHandle[arr[i]]=handler}function siblingCheck(a,b){var cur=b&&a,diff=cur&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(diff)return diff;if(cur)for(;cur=cur.nextSibling;)if(cur===b)return-1;return a?1:-1}function createInputPseudo(type){return function(elem){var name=elem.nodeName.toLowerCase();return"input"===name&&elem.type===type}}function createButtonPseudo(type){return function(elem){var name=elem.nodeName.toLowerCase();return("input"===name||"button"===name)&&elem.type===type}}function createDisabledPseudo(disabled){return function(elem){return"form"in elem?elem.parentNode&&elem.disabled===!1?"label"in elem?"label"in elem.parentNode?elem.parentNode.disabled===disabled:elem.disabled===disabled:elem.isDisabled===disabled||elem.isDisabled!==!disabled&&disabledAncestor(elem)===disabled:elem.disabled===disabled:"label"in elem&&elem.disabled===disabled}}function createPositionalPseudo(fn){return markFunction(function(argument){return argument=+argument,markFunction(function(seed,matches){for(var j,matchIndexes=fn([],seed.length,argument),i=matchIndexes.length;i--;)seed[j=matchIndexes[i]]&&(seed[j]=!(matches[j]=seed[j]))})})}function testContext(context){return context&&"undefined"!=typeof context.getElementsByTagName&&context}function setFilters(){}function toSelector(tokens){for(var i=0,len=tokens.length,selector="";i<len;i++)selector+=tokens[i].value;return selector}function addCombinator(matcher,combinator,base){var dir=combinator.dir,skip=combinator.next,key=skip||dir,checkNonElements=base&&"parentNode"===key,doneName=done++;return combinator.first?function(elem,context,xml){for(;elem=elem[dir];)if(1===elem.nodeType||checkNonElements)return matcher(elem,context,xml);return!1}:function(elem,context,xml){var oldCache,uniqueCache,outerCache,newCache=[dirruns,doneName];if(xml){for(;elem=elem[dir];)if((1===elem.nodeType||checkNonElements)&&matcher(elem,context,xml))return!0}else for(;elem=elem[dir];)if(1===elem.nodeType||checkNonElements)if(outerCache=elem[expando]||(elem[expando]={}),uniqueCache=outerCache[elem.uniqueID]||(outerCache[elem.uniqueID]={}),skip&&skip===elem.nodeName.toLowerCase())elem=elem[dir]||elem;else{if((oldCache=uniqueCache[key])&&oldCache[0]===dirruns&&oldCache[1]===doneName)return newCache[2]=oldCache[2];if(uniqueCache[key]=newCache,newCache[2]=matcher(elem,context,xml))return!0}return!1}}function elementMatcher(matchers){return matchers.length>1?function(elem,context,xml){for(var i=matchers.length;i--;)if(!matchers[i](elem,context,xml))return!1;return!0}:matchers[0]}function multipleContexts(selector,contexts,results){for(var i=0,len=contexts.length;i<len;i++)Sizzle(selector,contexts[i],results);return results}function condense(unmatched,map,filter,context,xml){for(var elem,newUnmatched=[],i=0,len=unmatched.length,mapped=null!=map;i<len;i++)(elem=unmatched[i])&&(filter&&!filter(elem,context,xml)||(newUnmatched.push(elem),mapped&&map.push(i)));return newUnmatched}function setMatcher(preFilter,selector,matcher,postFilter,postFinder,postSelector){return postFilter&&!postFilter[expando]&&(postFilter=setMatcher(postFilter)),postFinder&&!postFinder[expando]&&(postFinder=setMatcher(postFinder,postSelector)),markFunction(function(seed,results,context,xml){var temp,i,elem,preMap=[],postMap=[],preexisting=results.length,elems=seed||multipleContexts(selector||"*",context.nodeType?[context]:context,[]),matcherIn=!preFilter||!seed&&selector?elems:condense(elems,preMap,preFilter,context,xml),matcherOut=matcher?postFinder||(seed?preFilter:preexisting||postFilter)?[]:results:matcherIn;if(matcher&&matcher(matcherIn,matcherOut,context,xml),postFilter)for(temp=condense(matcherOut,postMap),postFilter(temp,[],context,xml),i=temp.length;i--;)(elem=temp[i])&&(matcherOut[postMap[i]]=!(matcherIn[postMap[i]]=elem));if(seed){if(postFinder||preFilter){if(postFinder){for(temp=[],i=matcherOut.length;i--;)(elem=matcherOut[i])&&temp.push(matcherIn[i]=elem);postFinder(null,matcherOut=[],temp,xml)}for(i=matcherOut.length;i--;)(elem=matcherOut[i])&&(temp=postFinder?indexOf(seed,elem):preMap[i])>-1&&(seed[temp]=!(results[temp]=elem))}}else matcherOut=condense(matcherOut===results?matcherOut.splice(preexisting,matcherOut.length):matcherOut),postFinder?postFinder(null,results,matcherOut,xml):push.apply(results,matcherOut)})}function matcherFromTokens(tokens){for(var checkContext,matcher,j,len=tokens.length,leadingRelative=Expr.relative[tokens[0].type],implicitRelative=leadingRelative||Expr.relative[" "],i=leadingRelative?1:0,matchContext=addCombinator(function(elem){return elem===checkContext},implicitRelative,!0),matchAnyContext=addCombinator(function(elem){return indexOf(checkContext,elem)>-1},implicitRelative,!0),matchers=[function(elem,context,xml){var ret=!leadingRelative&&(xml||context!==outermostContext)||((checkContext=context).nodeType?matchContext(elem,context,xml):matchAnyContext(elem,context,xml));return checkContext=null,ret}];i<len;i++)if(matcher=Expr.relative[tokens[i].type])matchers=[addCombinator(elementMatcher(matchers),matcher)];else{if(matcher=Expr.filter[tokens[i].type].apply(null,tokens[i].matches),matcher[expando]){for(j=++i;j<len&&!Expr.relative[tokens[j].type];j++);return setMatcher(i>1&&elementMatcher(matchers),i>1&&toSelector(tokens.slice(0,i-1).concat({value:" "===tokens[i-2].type?"*":""})).replace(rtrim,"$1"),matcher,i<j&&matcherFromTokens(tokens.slice(i,j)),j<len&&matcherFromTokens(tokens=tokens.slice(j)),j<len&&toSelector(tokens))}matchers.push(matcher)}return elementMatcher(matchers)}function matcherFromGroupMatchers(elementMatchers,setMatchers){var bySet=setMatchers.length>0,byElement=elementMatchers.length>0,superMatcher=function(seed,context,xml,results,outermost){var elem,j,matcher,matchedCount=0,i="0",unmatched=seed&&[],setMatched=[],contextBackup=outermostContext,elems=seed||byElement&&Expr.find.TAG("*",outermost),dirrunsUnique=dirruns+=null==contextBackup?1:Math.random()||.1,len=elems.length;for(outermost&&(outermostContext=context===document||context||outermost);i!==len&&null!=(elem=elems[i]);i++){if(byElement&&elem){for(j=0,context||elem.ownerDocument===document||(setDocument(elem),xml=!documentIsHTML);matcher=elementMatchers[j++];)if(matcher(elem,context||document,xml)){results.push(elem);break}outermost&&(dirruns=dirrunsUnique)}bySet&&((elem=!matcher&&elem)&&matchedCount--,seed&&unmatched.push(elem))}if(matchedCount+=i,bySet&&i!==matchedCount){for(j=0;matcher=setMatchers[j++];)matcher(unmatched,setMatched,context,xml);if(seed){if(matchedCount>0)for(;i--;)unmatched[i]||setMatched[i]||(setMatched[i]=pop.call(results));setMatched=condense(setMatched)}push.apply(results,setMatched),outermost&&!seed&&setMatched.length>0&&matchedCount+setMatchers.length>1&&Sizzle.uniqueSort(results)}return outermost&&(dirruns=dirrunsUnique,outermostContext=contextBackup),unmatched};return bySet?markFunction(superMatcher):superMatcher}var i,support,Expr,getText,isXML,tokenize,compile,select,outermostContext,sortInput,hasDuplicate,setDocument,document,docElem,documentIsHTML,rbuggyQSA,rbuggyMatches,matches,contains,expando="sizzle"+1*new Date,preferredDoc=window.document,dirruns=0,done=0,classCache=createCache(),tokenCache=createCache(),compilerCache=createCache(),sortOrder=function(a,b){return a===b&&(hasDuplicate=!0),0},hasOwn={}.hasOwnProperty,arr=[],pop=arr.pop,push_native=arr.push,push=arr.push,slice=arr.slice,indexOf=function(list,elem){for(var i=0,len=list.length;i<len;i++)if(list[i]===elem)return i;return-1},booleans="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",whitespace="[\\x20\\t\\r\\n\\f]",identifier="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",attributes="\\["+whitespace+"*("+identifier+")(?:"+whitespace+"*([*^$|!~]?=)"+whitespace+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+identifier+"))|)"+whitespace+"*\\]",pseudos=":("+identifier+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+attributes+")*)|.*)\\)|)",rwhitespace=new RegExp(whitespace+"+","g"),rtrim=new RegExp("^"+whitespace+"+|((?:^|[^\\\\])(?:\\\\.)*)"+whitespace+"+$","g"),rcomma=new RegExp("^"+whitespace+"*,"+whitespace+"*"),rcombinators=new RegExp("^"+whitespace+"*([>+~]|"+whitespace+")"+whitespace+"*"),rattributeQuotes=new RegExp("="+whitespace+"*([^\\]'\"]*?)"+whitespace+"*\\]","g"),rpseudo=new RegExp(pseudos),ridentifier=new RegExp("^"+identifier+"$"),matchExpr={ID:new RegExp("^#("+identifier+")"),CLASS:new RegExp("^\\.("+identifier+")"),TAG:new RegExp("^("+identifier+"|[*])"),ATTR:new RegExp("^"+attributes),PSEUDO:new RegExp("^"+pseudos),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+whitespace+"*(even|odd|(([+-]|)(\\d*)n|)"+whitespace+"*(?:([+-]|)"+whitespace+"*(\\d+)|))"+whitespace+"*\\)|)","i"),bool:new RegExp("^(?:"+booleans+")$","i"),needsContext:new RegExp("^"+whitespace+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+whitespace+"*((?:-\\d)?\\d*)"+whitespace+"*\\)|)(?=[^-]|$)","i")},rinputs=/^(?:input|select|textarea|button)$/i,rheader=/^h\d$/i,rnative=/^[^{]+\{\s*\[native \w/,rquickExpr=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,rsibling=/[+~]/,runescape=new RegExp("\\\\([\\da-f]{1,6}"+whitespace+"?|("+whitespace+")|.)","ig"),funescape=function(_,escaped,escapedWhitespace){var high="0x"+escaped-65536;return high!==high||escapedWhitespace?escaped:high<0?String.fromCharCode(high+65536):String.fromCharCode(high>>10|55296,1023&high|56320)},rcssescape=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,fcssescape=function(ch,asCodePoint){return asCodePoint?"\0"===ch?"�":ch.slice(0,-1)+"\\"+ch.charCodeAt(ch.length-1).toString(16)+" ":"\\"+ch},unloadHandler=function(){setDocument()},disabledAncestor=addCombinator(function(elem){return elem.disabled===!0&&("form"in elem||"label"in elem)},{dir:"parentNode",next:"legend"});try{push.apply(arr=slice.call(preferredDoc.childNodes),preferredDoc.childNodes),arr[preferredDoc.childNodes.length].nodeType}catch(e){push={apply:arr.length?function(target,els){push_native.apply(target,slice.call(els))}:function(target,els){for(var j=target.length,i=0;target[j++]=els[i++];);target.length=j-1}}}support=Sizzle.support={},isXML=Sizzle.isXML=function(elem){var documentElement=elem&&(elem.ownerDocument||elem).documentElement;return!!documentElement&&"HTML"!==documentElement.nodeName},setDocument=Sizzle.setDocument=function(node){var hasCompare,subWindow,doc=node?node.ownerDocument||node:preferredDoc;return doc!==document&&9===doc.nodeType&&doc.documentElement?(document=doc,docElem=document.documentElement,documentIsHTML=!isXML(document),preferredDoc!==document&&(subWindow=document.defaultView)&&subWindow.top!==subWindow&&(subWindow.addEventListener?subWindow.addEventListener("unload",unloadHandler,!1):subWindow.attachEvent&&subWindow.attachEvent("onunload",unloadHandler)),support.attributes=assert(function(el){return el.className="i",!el.getAttribute("className")}),support.getElementsByTagName=assert(function(el){return el.appendChild(document.createComment("")),!el.getElementsByTagName("*").length}),support.getElementsByClassName=rnative.test(document.getElementsByClassName),support.getById=assert(function(el){return docElem.appendChild(el).id=expando,!document.getElementsByName||!document.getElementsByName(expando).length}),support.getById?(Expr.filter.ID=function(id){var attrId=id.replace(runescape,funescape);return function(elem){return elem.getAttribute("id")===attrId}},Expr.find.ID=function(id,context){if("undefined"!=typeof context.getElementById&&documentIsHTML){var elem=context.getElementById(id);return elem?[elem]:[]}}):(Expr.filter.ID=function(id){var attrId=id.replace(runescape,funescape);return function(elem){var node="undefined"!=typeof elem.getAttributeNode&&elem.getAttributeNode("id");return node&&node.value===attrId}},Expr.find.ID=function(id,context){if("undefined"!=typeof context.getElementById&&documentIsHTML){var node,i,elems,elem=context.getElementById(id);if(elem){if(node=elem.getAttributeNode("id"),node&&node.value===id)return[elem];for(elems=context.getElementsByName(id),i=0;elem=elems[i++];)if(node=elem.getAttributeNode("id"),node&&node.value===id)return[elem]}return[]}}),Expr.find.TAG=support.getElementsByTagName?function(tag,context){return"undefined"!=typeof context.getElementsByTagName?context.getElementsByTagName(tag):support.qsa?context.querySelectorAll(tag):void 0}:function(tag,context){var elem,tmp=[],i=0,results=context.getElementsByTagName(tag);if("*"===tag){for(;elem=results[i++];)1===elem.nodeType&&tmp.push(elem);return tmp}return results},Expr.find.CLASS=support.getElementsByClassName&&function(className,context){if("undefined"!=typeof context.getElementsByClassName&&documentIsHTML)return context.getElementsByClassName(className)},rbuggyMatches=[],rbuggyQSA=[],(support.qsa=rnative.test(document.querySelectorAll))&&(assert(function(el){docElem.appendChild(el).innerHTML="<a id='"+expando+"'></a><select id='"+expando+"-\r\\' msallowcapture=''><option selected=''></option></select>",el.querySelectorAll("[msallowcapture^='']").length&&rbuggyQSA.push("[*^$]="+whitespace+"*(?:''|\"\")"),el.querySelectorAll("[selected]").length||rbuggyQSA.push("\\["+whitespace+"*(?:value|"+booleans+")"),el.querySelectorAll("[id~="+expando+"-]").length||rbuggyQSA.push("~="),el.querySelectorAll(":checked").length||rbuggyQSA.push(":checked"),el.querySelectorAll("a#"+expando+"+*").length||rbuggyQSA.push(".#.+[+~]")}),assert(function(el){el.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var input=document.createElement("input");input.setAttribute("type","hidden"),el.appendChild(input).setAttribute("name","D"),el.querySelectorAll("[name=d]").length&&rbuggyQSA.push("name"+whitespace+"*[*^$|!~]?="),2!==el.querySelectorAll(":enabled").length&&rbuggyQSA.push(":enabled",":disabled"),docElem.appendChild(el).disabled=!0,2!==el.querySelectorAll(":disabled").length&&rbuggyQSA.push(":enabled",":disabled"),el.querySelectorAll("*,:x"),rbuggyQSA.push(",.*:")})),(support.matchesSelector=rnative.test(matches=docElem.matches||docElem.webkitMatchesSelector||docElem.mozMatchesSelector||docElem.oMatchesSelector||docElem.msMatchesSelector))&&assert(function(el){support.disconnectedMatch=matches.call(el,"*"),matches.call(el,"[s!='']:x"),rbuggyMatches.push("!=",pseudos)}),rbuggyQSA=rbuggyQSA.length&&new RegExp(rbuggyQSA.join("|")),rbuggyMatches=rbuggyMatches.length&&new RegExp(rbuggyMatches.join("|")),hasCompare=rnative.test(docElem.compareDocumentPosition),contains=hasCompare||rnative.test(docElem.contains)?function(a,b){var adown=9===a.nodeType?a.documentElement:a,bup=b&&b.parentNode;return a===bup||!(!bup||1!==bup.nodeType||!(adown.contains?adown.contains(bup):a.compareDocumentPosition&&16&a.compareDocumentPosition(bup)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1},sortOrder=hasCompare?function(a,b){if(a===b)return hasDuplicate=!0,0;var compare=!a.compareDocumentPosition-!b.compareDocumentPosition;return compare?compare:(compare=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&compare||!support.sortDetached&&b.compareDocumentPosition(a)===compare?a===document||a.ownerDocument===preferredDoc&&contains(preferredDoc,a)?-1:b===document||b.ownerDocument===preferredDoc&&contains(preferredDoc,b)?1:sortInput?indexOf(sortInput,a)-indexOf(sortInput,b):0:4&compare?-1:1)}:function(a,b){if(a===b)return hasDuplicate=!0,0;var cur,i=0,aup=a.parentNode,bup=b.parentNode,ap=[a],bp=[b];if(!aup||!bup)return a===document?-1:b===document?1:aup?-1:bup?1:sortInput?indexOf(sortInput,a)-indexOf(sortInput,b):0;if(aup===bup)return siblingCheck(a,b);for(cur=a;cur=cur.parentNode;)ap.unshift(cur);for(cur=b;cur=cur.parentNode;)bp.unshift(cur);for(;ap[i]===bp[i];)i++;return i?siblingCheck(ap[i],bp[i]):ap[i]===preferredDoc?-1:bp[i]===preferredDoc?1:0},document):document},Sizzle.matches=function(expr,elements){return Sizzle(expr,null,null,elements)},Sizzle.matchesSelector=function(elem,expr){if((elem.ownerDocument||elem)!==document&&setDocument(elem),expr=expr.replace(rattributeQuotes,"='$1']"),support.matchesSelector&&documentIsHTML&&!compilerCache[expr+" "]&&(!rbuggyMatches||!rbuggyMatches.test(expr))&&(!rbuggyQSA||!rbuggyQSA.test(expr)))try{var ret=matches.call(elem,expr);if(ret||support.disconnectedMatch||elem.document&&11!==elem.document.nodeType)return ret}catch(e){}return Sizzle(expr,document,null,[elem]).length>0},Sizzle.contains=function(context,elem){return(context.ownerDocument||context)!==document&&setDocument(context),contains(context,elem)},Sizzle.attr=function(elem,name){(elem.ownerDocument||elem)!==document&&setDocument(elem);var fn=Expr.attrHandle[name.toLowerCase()],val=fn&&hasOwn.call(Expr.attrHandle,name.toLowerCase())?fn(elem,name,!documentIsHTML):void 0;return void 0!==val?val:support.attributes||!documentIsHTML?elem.getAttribute(name):(val=elem.getAttributeNode(name))&&val.specified?val.value:null},Sizzle.escape=function(sel){return(sel+"").replace(rcssescape,fcssescape)},Sizzle.error=function(msg){throw new Error("Syntax error, unrecognized expression: "+msg)},Sizzle.uniqueSort=function(results){var elem,duplicates=[],j=0,i=0;if(hasDuplicate=!support.detectDuplicates,sortInput=!support.sortStable&&results.slice(0),results.sort(sortOrder),hasDuplicate){for(;elem=results[i++];)elem===results[i]&&(j=duplicates.push(i));for(;j--;)results.splice(duplicates[j],1)}return sortInput=null,results},getText=Sizzle.getText=function(elem){var node,ret="",i=0,nodeType=elem.nodeType;if(nodeType){if(1===nodeType||9===nodeType||11===nodeType){if("string"==typeof elem.textContent)return elem.textContent;for(elem=elem.firstChild;elem;elem=elem.nextSibling)ret+=getText(elem)}else if(3===nodeType||4===nodeType)return elem.nodeValue}else for(;node=elem[i++];)ret+=getText(node);return ret},Expr=Sizzle.selectors={cacheLength:50,createPseudo:markFunction,match:matchExpr,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(match){return match[1]=match[1].replace(runescape,funescape),match[3]=(match[3]||match[4]||match[5]||"").replace(runescape,funescape),"~="===match[2]&&(match[3]=" "+match[3]+" "),match.slice(0,4)},CHILD:function(match){return match[1]=match[1].toLowerCase(),"nth"===match[1].slice(0,3)?(match[3]||Sizzle.error(match[0]),match[4]=+(match[4]?match[5]+(match[6]||1):2*("even"===match[3]||"odd"===match[3])),match[5]=+(match[7]+match[8]||"odd"===match[3])):match[3]&&Sizzle.error(match[0]),match},PSEUDO:function(match){var excess,unquoted=!match[6]&&match[2];return matchExpr.CHILD.test(match[0])?null:(match[3]?match[2]=match[4]||match[5]||"":unquoted&&rpseudo.test(unquoted)&&(excess=tokenize(unquoted,!0))&&(excess=unquoted.indexOf(")",unquoted.length-excess)-unquoted.length)&&(match[0]=match[0].slice(0,excess),match[2]=unquoted.slice(0,excess)),match.slice(0,3))}},filter:{TAG:function(nodeNameSelector){var nodeName=nodeNameSelector.replace(runescape,funescape).toLowerCase();return"*"===nodeNameSelector?function(){return!0}:function(elem){return elem.nodeName&&elem.nodeName.toLowerCase()===nodeName}},CLASS:function(className){var pattern=classCache[className+" "];return pattern||(pattern=new RegExp("(^|"+whitespace+")"+className+"("+whitespace+"|$)"))&&classCache(className,function(elem){return pattern.test("string"==typeof elem.className&&elem.className||"undefined"!=typeof elem.getAttribute&&elem.getAttribute("class")||"")})},ATTR:function(name,operator,check){return function(elem){var result=Sizzle.attr(elem,name);return null==result?"!="===operator:!operator||(result+="","="===operator?result===check:"!="===operator?result!==check:"^="===operator?check&&0===result.indexOf(check):"*="===operator?check&&result.indexOf(check)>-1:"$="===operator?check&&result.slice(-check.length)===check:"~="===operator?(" "+result.replace(rwhitespace," ")+" ").indexOf(check)>-1:"|="===operator&&(result===check||result.slice(0,check.length+1)===check+"-"))}},CHILD:function(type,what,argument,first,last){var simple="nth"!==type.slice(0,3),forward="last"!==type.slice(-4),ofType="of-type"===what;return 1===first&&0===last?function(elem){return!!elem.parentNode}:function(elem,context,xml){var cache,uniqueCache,outerCache,node,nodeIndex,start,dir=simple!==forward?"nextSibling":"previousSibling",parent=elem.parentNode,name=ofType&&elem.nodeName.toLowerCase(),useCache=!xml&&!ofType,diff=!1;if(parent){if(simple){for(;dir;){for(node=elem;node=node[dir];)if(ofType?node.nodeName.toLowerCase()===name:1===node.nodeType)return!1;start=dir="only"===type&&!start&&"nextSibling"}return!0}if(start=[forward?parent.firstChild:parent.lastChild],forward&&useCache){for(node=parent,outerCache=node[expando]||(node[expando]={}),uniqueCache=outerCache[node.uniqueID]||(outerCache[node.uniqueID]={}),cache=uniqueCache[type]||[],nodeIndex=cache[0]===dirruns&&cache[1],diff=nodeIndex&&cache[2],node=nodeIndex&&parent.childNodes[nodeIndex];node=++nodeIndex&&node&&node[dir]||(diff=nodeIndex=0)||start.pop();)if(1===node.nodeType&&++diff&&node===elem){uniqueCache[type]=[dirruns,nodeIndex,diff];break}}else if(useCache&&(node=elem,outerCache=node[expando]||(node[expando]={}),uniqueCache=outerCache[node.uniqueID]||(outerCache[node.uniqueID]={}),cache=uniqueCache[type]||[],nodeIndex=cache[0]===dirruns&&cache[1],diff=nodeIndex),diff===!1)for(;(node=++nodeIndex&&node&&node[dir]||(diff=nodeIndex=0)||start.pop())&&((ofType?node.nodeName.toLowerCase()!==name:1!==node.nodeType)||!++diff||(useCache&&(outerCache=node[expando]||(node[expando]={}),uniqueCache=outerCache[node.uniqueID]||(outerCache[node.uniqueID]={}),uniqueCache[type]=[dirruns,diff]),node!==elem)););return diff-=last,diff===first||diff%first===0&&diff/first>=0}}},PSEUDO:function(pseudo,argument){var args,fn=Expr.pseudos[pseudo]||Expr.setFilters[pseudo.toLowerCase()]||Sizzle.error("unsupported pseudo: "+pseudo);return fn[expando]?fn(argument):fn.length>1?(args=[pseudo,pseudo,"",argument],Expr.setFilters.hasOwnProperty(pseudo.toLowerCase())?markFunction(function(seed,matches){for(var idx,matched=fn(seed,argument),i=matched.length;i--;)idx=indexOf(seed,matched[i]),seed[idx]=!(matches[idx]=matched[i])}):function(elem){return fn(elem,0,args)}):fn}},pseudos:{not:markFunction(function(selector){var input=[],results=[],matcher=compile(selector.replace(rtrim,"$1"));return matcher[expando]?markFunction(function(seed,matches,context,xml){for(var elem,unmatched=matcher(seed,null,xml,[]),i=seed.length;i--;)(elem=unmatched[i])&&(seed[i]=!(matches[i]=elem))}):function(elem,context,xml){return input[0]=elem,matcher(input,null,xml,results),input[0]=null,!results.pop()}}),has:markFunction(function(selector){return function(elem){return Sizzle(selector,elem).length>0}}),contains:markFunction(function(text){return text=text.replace(runescape,funescape),function(elem){return(elem.textContent||elem.innerText||getText(elem)).indexOf(text)>-1}}),lang:markFunction(function(lang){return ridentifier.test(lang||"")||Sizzle.error("unsupported lang: "+lang),lang=lang.replace(runescape,funescape).toLowerCase(),function(elem){var elemLang;do if(elemLang=documentIsHTML?elem.lang:elem.getAttribute("xml:lang")||elem.getAttribute("lang"))return elemLang=elemLang.toLowerCase(),elemLang===lang||0===elemLang.indexOf(lang+"-");while((elem=elem.parentNode)&&1===elem.nodeType);return!1}}),target:function(elem){var hash=window.location&&window.location.hash;return hash&&hash.slice(1)===elem.id},root:function(elem){return elem===docElem},focus:function(elem){return elem===document.activeElement&&(!document.hasFocus||document.hasFocus())&&!!(elem.type||elem.href||~elem.tabIndex)},enabled:createDisabledPseudo(!1),disabled:createDisabledPseudo(!0),checked:function(elem){var nodeName=elem.nodeName.toLowerCase();return"input"===nodeName&&!!elem.checked||"option"===nodeName&&!!elem.selected},selected:function(elem){return elem.parentNode&&elem.parentNode.selectedIndex,elem.selected===!0},empty:function(elem){for(elem=elem.firstChild;elem;elem=elem.nextSibling)if(elem.nodeType<6)return!1;return!0},parent:function(elem){return!Expr.pseudos.empty(elem)},header:function(elem){return rheader.test(elem.nodeName)},input:function(elem){return rinputs.test(elem.nodeName)},button:function(elem){var name=elem.nodeName.toLowerCase();return"input"===name&&"button"===elem.type||"button"===name},text:function(elem){var attr;return"input"===elem.nodeName.toLowerCase()&&"text"===elem.type&&(null==(attr=elem.getAttribute("type"))||"text"===attr.toLowerCase())},first:createPositionalPseudo(function(){return[0]}),last:createPositionalPseudo(function(matchIndexes,length){return[length-1]}),eq:createPositionalPseudo(function(matchIndexes,length,argument){return[argument<0?argument+length:argument]}),even:createPositionalPseudo(function(matchIndexes,length){for(var i=0;i<length;i+=2)matchIndexes.push(i);return matchIndexes}),odd:createPositionalPseudo(function(matchIndexes,length){for(var i=1;i<length;i+=2)matchIndexes.push(i);return matchIndexes}),lt:createPositionalPseudo(function(matchIndexes,length,argument){for(var i=argument<0?argument+length:argument;--i>=0;)matchIndexes.push(i);return matchIndexes}),gt:createPositionalPseudo(function(matchIndexes,length,argument){for(var i=argument<0?argument+length:argument;++i<length;)matchIndexes.push(i);return matchIndexes})}},Expr.pseudos.nth=Expr.pseudos.eq;for(i in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})Expr.pseudos[i]=createInputPseudo(i);for(i in{submit:!0,reset:!0})Expr.pseudos[i]=createButtonPseudo(i);return setFilters.prototype=Expr.filters=Expr.pseudos,Expr.setFilters=new setFilters,tokenize=Sizzle.tokenize=function(selector,parseOnly){var matched,match,tokens,type,soFar,groups,preFilters,cached=tokenCache[selector+" "];if(cached)return parseOnly?0:cached.slice(0);for(soFar=selector,groups=[],preFilters=Expr.preFilter;soFar;){matched&&!(match=rcomma.exec(soFar))||(match&&(soFar=soFar.slice(match[0].length)||soFar),groups.push(tokens=[])),matched=!1,(match=rcombinators.exec(soFar))&&(matched=match.shift(),tokens.push({value:matched,type:match[0].replace(rtrim," ")}),soFar=soFar.slice(matched.length));for(type in Expr.filter)!(match=matchExpr[type].exec(soFar))||preFilters[type]&&!(match=preFilters[type](match))||(matched=match.shift(),tokens.push({value:matched,type:type,matches:match}),soFar=soFar.slice(matched.length));if(!matched)break}return parseOnly?soFar.length:soFar?Sizzle.error(selector):tokenCache(selector,groups).slice(0)},compile=Sizzle.compile=function(selector,match){var i,setMatchers=[],elementMatchers=[],cached=compilerCache[selector+" "];if(!cached){for(match||(match=tokenize(selector)),i=match.length;i--;)cached=matcherFromTokens(match[i]),cached[expando]?setMatchers.push(cached):elementMatchers.push(cached);cached=compilerCache(selector,matcherFromGroupMatchers(elementMatchers,setMatchers)),cached.selector=selector}return cached},select=Sizzle.select=function(selector,context,results,seed){var i,tokens,token,type,find,compiled="function"==typeof selector&&selector,match=!seed&&tokenize(selector=compiled.selector||selector);if(results=results||[],1===match.length){if(tokens=match[0]=match[0].slice(0),tokens.length>2&&"ID"===(token=tokens[0]).type&&9===context.nodeType&&documentIsHTML&&Expr.relative[tokens[1].type]){if(context=(Expr.find.ID(token.matches[0].replace(runescape,funescape),context)||[])[0],!context)return results;compiled&&(context=context.parentNode),selector=selector.slice(tokens.shift().value.length)}for(i=matchExpr.needsContext.test(selector)?0:tokens.length;i--&&(token=tokens[i],!Expr.relative[type=token.type]);)if((find=Expr.find[type])&&(seed=find(token.matches[0].replace(runescape,funescape),rsibling.test(tokens[0].type)&&testContext(context.parentNode)||context))){if(tokens.splice(i,1),selector=seed.length&&toSelector(tokens),!selector)return push.apply(results,seed),results;break}}return(compiled||compile(selector,match))(seed,context,!documentIsHTML,results,!context||rsibling.test(selector)&&testContext(context.parentNode)||context),results},support.sortStable=expando.split("").sort(sortOrder).join("")===expando,support.detectDuplicates=!!hasDuplicate,setDocument(),support.sortDetached=assert(function(el){return 1&el.compareDocumentPosition(document.createElement("fieldset"))}),assert(function(el){return el.innerHTML="<a href='#'></a>","#"===el.firstChild.getAttribute("href")})||addHandle("type|href|height|width",function(elem,name,isXML){if(!isXML)return elem.getAttribute(name,"type"===name.toLowerCase()?1:2)}),support.attributes&&assert(function(el){return el.innerHTML="<input/>",el.firstChild.setAttribute("value",""),""===el.firstChild.getAttribute("value")})||addHandle("value",function(elem,name,isXML){if(!isXML&&"input"===elem.nodeName.toLowerCase())return elem.defaultValue}),assert(function(el){return null==el.getAttribute("disabled")})||addHandle(booleans,function(elem,name,isXML){var val;if(!isXML)return elem[name]===!0?name.toLowerCase():(val=elem.getAttributeNode(name))&&val.specified?val.value:null}),Sizzle}(window);jQuery.find=Sizzle,jQuery.expr=Sizzle.selectors,jQuery.expr[":"]=jQuery.expr.pseudos,jQuery.uniqueSort=jQuery.unique=Sizzle.uniqueSort,jQuery.text=Sizzle.getText,jQuery.isXMLDoc=Sizzle.isXML,jQuery.contains=Sizzle.contains,jQuery.escapeSelector=Sizzle.escape;var dir=function(elem,dir,until){for(var matched=[],truncate=void 0!==until;(elem=elem[dir])&&9!==elem.nodeType;)if(1===elem.nodeType){if(truncate&&jQuery(elem).is(until))break;matched.push(elem)}return matched},siblings=function(n,elem){for(var matched=[];n;n=n.nextSibling)1===n.nodeType&&n!==elem&&matched.push(n);return matched},rneedsContext=jQuery.expr.match.needsContext,rsingleTag=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,risSimple=/^.[^:#\[\.,]*$/;
jQuery.filter=function(expr,elems,not){var elem=elems[0];return not&&(expr=":not("+expr+")"),1===elems.length&&1===elem.nodeType?jQuery.find.matchesSelector(elem,expr)?[elem]:[]:jQuery.find.matches(expr,jQuery.grep(elems,function(elem){return 1===elem.nodeType}))},jQuery.fn.extend({find:function(selector){var i,ret,len=this.length,self=this;if("string"!=typeof selector)return this.pushStack(jQuery(selector).filter(function(){for(i=0;i<len;i++)if(jQuery.contains(self[i],this))return!0}));for(ret=this.pushStack([]),i=0;i<len;i++)jQuery.find(selector,self[i],ret);return len>1?jQuery.uniqueSort(ret):ret},filter:function(selector){return this.pushStack(winnow(this,selector||[],!1))},not:function(selector){return this.pushStack(winnow(this,selector||[],!0))},is:function(selector){return!!winnow(this,"string"==typeof selector&&rneedsContext.test(selector)?jQuery(selector):selector||[],!1).length}});var rootjQuery,rquickExpr=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,init=jQuery.fn.init=function(selector,context,root){var match,elem;if(!selector)return this;if(root=root||rootjQuery,"string"==typeof selector){if(match="<"===selector[0]&&">"===selector[selector.length-1]&&selector.length>=3?[null,selector,null]:rquickExpr.exec(selector),!match||!match[1]&&context)return!context||context.jquery?(context||root).find(selector):this.constructor(context).find(selector);if(match[1]){if(context=context instanceof jQuery?context[0]:context,jQuery.merge(this,jQuery.parseHTML(match[1],context&&context.nodeType?context.ownerDocument||context:document,!0)),rsingleTag.test(match[1])&&jQuery.isPlainObject(context))for(match in context)jQuery.isFunction(this[match])?this[match](context[match]):this.attr(match,context[match]);return this}return elem=document.getElementById(match[2]),elem&&(this[0]=elem,this.length=1),this}return selector.nodeType?(this[0]=selector,this.length=1,this):jQuery.isFunction(selector)?void 0!==root.ready?root.ready(selector):selector(jQuery):jQuery.makeArray(selector,this)};init.prototype=jQuery.fn,rootjQuery=jQuery(document);var rparentsprev=/^(?:parents|prev(?:Until|All))/,guaranteedUnique={children:!0,contents:!0,next:!0,prev:!0};jQuery.fn.extend({has:function(target){var targets=jQuery(target,this),l=targets.length;return this.filter(function(){for(var i=0;i<l;i++)if(jQuery.contains(this,targets[i]))return!0})},closest:function(selectors,context){var cur,i=0,l=this.length,matched=[],targets="string"!=typeof selectors&&jQuery(selectors);if(!rneedsContext.test(selectors))for(;i<l;i++)for(cur=this[i];cur&&cur!==context;cur=cur.parentNode)if(cur.nodeType<11&&(targets?targets.index(cur)>-1:1===cur.nodeType&&jQuery.find.matchesSelector(cur,selectors))){matched.push(cur);break}return this.pushStack(matched.length>1?jQuery.uniqueSort(matched):matched)},index:function(elem){return elem?"string"==typeof elem?indexOf.call(jQuery(elem),this[0]):indexOf.call(this,elem.jquery?elem[0]:elem):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(selector,context){return this.pushStack(jQuery.uniqueSort(jQuery.merge(this.get(),jQuery(selector,context))))},addBack:function(selector){return this.add(null==selector?this.prevObject:this.prevObject.filter(selector))}}),jQuery.each({parent:function(elem){var parent=elem.parentNode;return parent&&11!==parent.nodeType?parent:null},parents:function(elem){return dir(elem,"parentNode")},parentsUntil:function(elem,i,until){return dir(elem,"parentNode",until)},next:function(elem){return sibling(elem,"nextSibling")},prev:function(elem){return sibling(elem,"previousSibling")},nextAll:function(elem){return dir(elem,"nextSibling")},prevAll:function(elem){return dir(elem,"previousSibling")},nextUntil:function(elem,i,until){return dir(elem,"nextSibling",until)},prevUntil:function(elem,i,until){return dir(elem,"previousSibling",until)},siblings:function(elem){return siblings((elem.parentNode||{}).firstChild,elem)},children:function(elem){return siblings(elem.firstChild)},contents:function(elem){return elem.contentDocument||jQuery.merge([],elem.childNodes)}},function(name,fn){jQuery.fn[name]=function(until,selector){var matched=jQuery.map(this,fn,until);return"Until"!==name.slice(-5)&&(selector=until),selector&&"string"==typeof selector&&(matched=jQuery.filter(selector,matched)),this.length>1&&(guaranteedUnique[name]||jQuery.uniqueSort(matched),rparentsprev.test(name)&&matched.reverse()),this.pushStack(matched)}});var rnothtmlwhite=/[^\x20\t\r\n\f]+/g;jQuery.Callbacks=function(options){options="string"==typeof options?createOptions(options):jQuery.extend({},options);var firing,memory,fired,locked,list=[],queue=[],firingIndex=-1,fire=function(){for(locked=options.once,fired=firing=!0;queue.length;firingIndex=-1)for(memory=queue.shift();++firingIndex<list.length;)list[firingIndex].apply(memory[0],memory[1])===!1&&options.stopOnFalse&&(firingIndex=list.length,memory=!1);options.memory||(memory=!1),firing=!1,locked&&(list=memory?[]:"")},self={add:function(){return list&&(memory&&!firing&&(firingIndex=list.length-1,queue.push(memory)),function add(args){jQuery.each(args,function(_,arg){jQuery.isFunction(arg)?options.unique&&self.has(arg)||list.push(arg):arg&&arg.length&&"string"!==jQuery.type(arg)&&add(arg)})}(arguments),memory&&!firing&&fire()),this},remove:function(){return jQuery.each(arguments,function(_,arg){for(var index;(index=jQuery.inArray(arg,list,index))>-1;)list.splice(index,1),index<=firingIndex&&firingIndex--}),this},has:function(fn){return fn?jQuery.inArray(fn,list)>-1:list.length>0},empty:function(){return list&&(list=[]),this},disable:function(){return locked=queue=[],list=memory="",this},disabled:function(){return!list},lock:function(){return locked=queue=[],memory||firing||(list=memory=""),this},locked:function(){return!!locked},fireWith:function(context,args){return locked||(args=args||[],args=[context,args.slice?args.slice():args],queue.push(args),firing||fire()),this},fire:function(){return self.fireWith(this,arguments),this},fired:function(){return!!fired}};return self},jQuery.extend({Deferred:function(func){var tuples=[["notify","progress",jQuery.Callbacks("memory"),jQuery.Callbacks("memory"),2],["resolve","done",jQuery.Callbacks("once memory"),jQuery.Callbacks("once memory"),0,"resolved"],["reject","fail",jQuery.Callbacks("once memory"),jQuery.Callbacks("once memory"),1,"rejected"]],state="pending",promise={state:function(){return state},always:function(){return deferred.done(arguments).fail(arguments),this},"catch":function(fn){return promise.then(null,fn)},pipe:function(){var fns=arguments;return jQuery.Deferred(function(newDefer){jQuery.each(tuples,function(i,tuple){var fn=jQuery.isFunction(fns[tuple[4]])&&fns[tuple[4]];deferred[tuple[1]](function(){var returned=fn&&fn.apply(this,arguments);returned&&jQuery.isFunction(returned.promise)?returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject):newDefer[tuple[0]+"With"](this,fn?[returned]:arguments)})}),fns=null}).promise()},then:function(onFulfilled,onRejected,onProgress){function resolve(depth,deferred,handler,special){return function(){var that=this,args=arguments,mightThrow=function(){var returned,then;if(!(depth<maxDepth)){if(returned=handler.apply(that,args),returned===deferred.promise())throw new TypeError("Thenable self-resolution");then=returned&&("object"==typeof returned||"function"==typeof returned)&&returned.then,jQuery.isFunction(then)?special?then.call(returned,resolve(maxDepth,deferred,Identity,special),resolve(maxDepth,deferred,Thrower,special)):(maxDepth++,then.call(returned,resolve(maxDepth,deferred,Identity,special),resolve(maxDepth,deferred,Thrower,special),resolve(maxDepth,deferred,Identity,deferred.notifyWith))):(handler!==Identity&&(that=void 0,args=[returned]),(special||deferred.resolveWith)(that,args))}},process=special?mightThrow:function(){try{mightThrow()}catch(e){jQuery.Deferred.exceptionHook&&jQuery.Deferred.exceptionHook(e,process.stackTrace),depth+1>=maxDepth&&(handler!==Thrower&&(that=void 0,args=[e]),deferred.rejectWith(that,args))}};depth?process():(jQuery.Deferred.getStackHook&&(process.stackTrace=jQuery.Deferred.getStackHook()),window.setTimeout(process))}}var maxDepth=0;return jQuery.Deferred(function(newDefer){tuples[0][3].add(resolve(0,newDefer,jQuery.isFunction(onProgress)?onProgress:Identity,newDefer.notifyWith)),tuples[1][3].add(resolve(0,newDefer,jQuery.isFunction(onFulfilled)?onFulfilled:Identity)),tuples[2][3].add(resolve(0,newDefer,jQuery.isFunction(onRejected)?onRejected:Thrower))}).promise()},promise:function(obj){return null!=obj?jQuery.extend(obj,promise):promise}},deferred={};return jQuery.each(tuples,function(i,tuple){var list=tuple[2],stateString=tuple[5];promise[tuple[1]]=list.add,stateString&&list.add(function(){state=stateString},tuples[3-i][2].disable,tuples[0][2].lock),list.add(tuple[3].fire),deferred[tuple[0]]=function(){return deferred[tuple[0]+"With"](this===deferred?void 0:this,arguments),this},deferred[tuple[0]+"With"]=list.fireWith}),promise.promise(deferred),func&&func.call(deferred,deferred),deferred},when:function(singleValue){var remaining=arguments.length,i=remaining,resolveContexts=Array(i),resolveValues=slice.call(arguments),master=jQuery.Deferred(),updateFunc=function(i){return function(value){resolveContexts[i]=this,resolveValues[i]=arguments.length>1?slice.call(arguments):value,--remaining||master.resolveWith(resolveContexts,resolveValues)}};if(remaining<=1&&(adoptValue(singleValue,master.done(updateFunc(i)).resolve,master.reject),"pending"===master.state()||jQuery.isFunction(resolveValues[i]&&resolveValues[i].then)))return master.then();for(;i--;)adoptValue(resolveValues[i],updateFunc(i),master.reject);return master.promise()}});var rerrorNames=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;jQuery.Deferred.exceptionHook=function(error,stack){window.console&&window.console.warn&&error&&rerrorNames.test(error.name)&&window.console.warn("jQuery.Deferred exception: "+error.message,error.stack,stack)},jQuery.readyException=function(error){window.setTimeout(function(){throw error})};var readyList=jQuery.Deferred();jQuery.fn.ready=function(fn){return readyList.then(fn)["catch"](function(error){jQuery.readyException(error)}),this},jQuery.extend({isReady:!1,readyWait:1,holdReady:function(hold){hold?jQuery.readyWait++:jQuery.ready(!0)},ready:function(wait){(wait===!0?--jQuery.readyWait:jQuery.isReady)||(jQuery.isReady=!0,wait!==!0&&--jQuery.readyWait>0||readyList.resolveWith(document,[jQuery]))}}),jQuery.ready.then=readyList.then,"complete"===document.readyState||"loading"!==document.readyState&&!document.documentElement.doScroll?window.setTimeout(jQuery.ready):(document.addEventListener("DOMContentLoaded",completed),window.addEventListener("load",completed));var access=function(elems,fn,key,value,chainable,emptyGet,raw){var i=0,len=elems.length,bulk=null==key;if("object"===jQuery.type(key)){chainable=!0;for(i in key)access(elems,fn,i,key[i],!0,emptyGet,raw)}else if(void 0!==value&&(chainable=!0,jQuery.isFunction(value)||(raw=!0),bulk&&(raw?(fn.call(elems,value),fn=null):(bulk=fn,fn=function(elem,key,value){return bulk.call(jQuery(elem),value)})),fn))for(;i<len;i++)fn(elems[i],key,raw?value:value.call(elems[i],i,fn(elems[i],key)));return chainable?elems:bulk?fn.call(elems):len?fn(elems[0],key):emptyGet},acceptData=function(owner){return 1===owner.nodeType||9===owner.nodeType||!+owner.nodeType};Data.uid=1,Data.prototype={cache:function(owner){var value=owner[this.expando];return value||(value={},acceptData(owner)&&(owner.nodeType?owner[this.expando]=value:Object.defineProperty(owner,this.expando,{value:value,configurable:!0}))),value},set:function(owner,data,value){var prop,cache=this.cache(owner);if("string"==typeof data)cache[jQuery.camelCase(data)]=value;else for(prop in data)cache[jQuery.camelCase(prop)]=data[prop];return cache},get:function(owner,key){return void 0===key?this.cache(owner):owner[this.expando]&&owner[this.expando][jQuery.camelCase(key)]},access:function(owner,key,value){return void 0===key||key&&"string"==typeof key&&void 0===value?this.get(owner,key):(this.set(owner,key,value),void 0!==value?value:key)},remove:function(owner,key){var i,cache=owner[this.expando];if(void 0!==cache){if(void 0!==key){jQuery.isArray(key)?key=key.map(jQuery.camelCase):(key=jQuery.camelCase(key),key=key in cache?[key]:key.match(rnothtmlwhite)||[]),i=key.length;for(;i--;)delete cache[key[i]]}(void 0===key||jQuery.isEmptyObject(cache))&&(owner.nodeType?owner[this.expando]=void 0:delete owner[this.expando])}},hasData:function(owner){var cache=owner[this.expando];return void 0!==cache&&!jQuery.isEmptyObject(cache)}};var dataPriv=new Data,dataUser=new Data,rbrace=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,rmultiDash=/[A-Z]/g;jQuery.extend({hasData:function(elem){return dataUser.hasData(elem)||dataPriv.hasData(elem)},data:function(elem,name,data){return dataUser.access(elem,name,data)},removeData:function(elem,name){dataUser.remove(elem,name)},_data:function(elem,name,data){return dataPriv.access(elem,name,data)},_removeData:function(elem,name){dataPriv.remove(elem,name)}}),jQuery.fn.extend({data:function(key,value){var i,name,data,elem=this[0],attrs=elem&&elem.attributes;if(void 0===key){if(this.length&&(data=dataUser.get(elem),1===elem.nodeType&&!dataPriv.get(elem,"hasDataAttrs"))){for(i=attrs.length;i--;)attrs[i]&&(name=attrs[i].name,0===name.indexOf("data-")&&(name=jQuery.camelCase(name.slice(5)),dataAttr(elem,name,data[name])));dataPriv.set(elem,"hasDataAttrs",!0)}return data}return"object"==typeof key?this.each(function(){dataUser.set(this,key)}):access(this,function(value){var data;if(elem&&void 0===value){if(data=dataUser.get(elem,key),void 0!==data)return data;if(data=dataAttr(elem,key),void 0!==data)return data}else this.each(function(){dataUser.set(this,key,value)})},null,value,arguments.length>1,null,!0)},removeData:function(key){return this.each(function(){dataUser.remove(this,key)})}}),jQuery.extend({queue:function(elem,type,data){var queue;if(elem)return type=(type||"fx")+"queue",queue=dataPriv.get(elem,type),data&&(!queue||jQuery.isArray(data)?queue=dataPriv.access(elem,type,jQuery.makeArray(data)):queue.push(data)),queue||[]},dequeue:function(elem,type){type=type||"fx";var queue=jQuery.queue(elem,type),startLength=queue.length,fn=queue.shift(),hooks=jQuery._queueHooks(elem,type),next=function(){jQuery.dequeue(elem,type)};"inprogress"===fn&&(fn=queue.shift(),startLength--),fn&&("fx"===type&&queue.unshift("inprogress"),delete hooks.stop,fn.call(elem,next,hooks)),!startLength&&hooks&&hooks.empty.fire()},_queueHooks:function(elem,type){var key=type+"queueHooks";return dataPriv.get(elem,key)||dataPriv.access(elem,key,{empty:jQuery.Callbacks("once memory").add(function(){dataPriv.remove(elem,[type+"queue",key])})})}}),jQuery.fn.extend({queue:function(type,data){var setter=2;return"string"!=typeof type&&(data=type,type="fx",setter--),arguments.length<setter?jQuery.queue(this[0],type):void 0===data?this:this.each(function(){var queue=jQuery.queue(this,type,data);jQuery._queueHooks(this,type),"fx"===type&&"inprogress"!==queue[0]&&jQuery.dequeue(this,type)})},dequeue:function(type){return this.each(function(){jQuery.dequeue(this,type)})},clearQueue:function(type){return this.queue(type||"fx",[])},promise:function(type,obj){var tmp,count=1,defer=jQuery.Deferred(),elements=this,i=this.length,resolve=function(){--count||defer.resolveWith(elements,[elements])};for("string"!=typeof type&&(obj=type,type=void 0),type=type||"fx";i--;)tmp=dataPriv.get(elements[i],type+"queueHooks"),tmp&&tmp.empty&&(count++,tmp.empty.add(resolve));return resolve(),defer.promise(obj)}});var pnum=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,rcssNum=new RegExp("^(?:([+-])=|)("+pnum+")([a-z%]*)$","i"),cssExpand=["Top","Right","Bottom","Left"],isHiddenWithinTree=function(elem,el){return elem=el||elem,"none"===elem.style.display||""===elem.style.display&&jQuery.contains(elem.ownerDocument,elem)&&"none"===jQuery.css(elem,"display")},swap=function(elem,options,callback,args){var ret,name,old={};for(name in options)old[name]=elem.style[name],elem.style[name]=options[name];ret=callback.apply(elem,args||[]);for(name in options)elem.style[name]=old[name];return ret},defaultDisplayMap={};jQuery.fn.extend({show:function(){return showHide(this,!0)},hide:function(){return showHide(this)},toggle:function(state){return"boolean"==typeof state?state?this.show():this.hide():this.each(function(){isHiddenWithinTree(this)?jQuery(this).show():jQuery(this).hide()})}});var rcheckableType=/^(?:checkbox|radio)$/i,rtagName=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,rscriptType=/^$|\/(?:java|ecma)script/i,wrapMap={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};wrapMap.optgroup=wrapMap.option,wrapMap.tbody=wrapMap.tfoot=wrapMap.colgroup=wrapMap.caption=wrapMap.thead,wrapMap.th=wrapMap.td;var rhtml=/<|&#?\w+;/;!function(){var fragment=document.createDocumentFragment(),div=fragment.appendChild(document.createElement("div")),input=document.createElement("input");input.setAttribute("type","radio"),input.setAttribute("checked","checked"),input.setAttribute("name","t"),div.appendChild(input),support.checkClone=div.cloneNode(!0).cloneNode(!0).lastChild.checked,div.innerHTML="<textarea>x</textarea>",support.noCloneChecked=!!div.cloneNode(!0).lastChild.defaultValue}();var documentElement=document.documentElement,rkeyEvent=/^key/,rmouseEvent=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,rtypenamespace=/^([^.]*)(?:\.(.+)|)/;jQuery.event={global:{},add:function(elem,types,handler,data,selector){var handleObjIn,eventHandle,tmp,events,t,handleObj,special,handlers,type,namespaces,origType,elemData=dataPriv.get(elem);if(elemData)for(handler.handler&&(handleObjIn=handler,handler=handleObjIn.handler,selector=handleObjIn.selector),selector&&jQuery.find.matchesSelector(documentElement,selector),handler.guid||(handler.guid=jQuery.guid++),(events=elemData.events)||(events=elemData.events={}),(eventHandle=elemData.handle)||(eventHandle=elemData.handle=function(e){return"undefined"!=typeof jQuery&&jQuery.event.triggered!==e.type?jQuery.event.dispatch.apply(elem,arguments):void 0}),types=(types||"").match(rnothtmlwhite)||[""],t=types.length;t--;)tmp=rtypenamespace.exec(types[t])||[],type=origType=tmp[1],namespaces=(tmp[2]||"").split(".").sort(),type&&(special=jQuery.event.special[type]||{},type=(selector?special.delegateType:special.bindType)||type,special=jQuery.event.special[type]||{},handleObj=jQuery.extend({type:type,origType:origType,data:data,handler:handler,guid:handler.guid,selector:selector,needsContext:selector&&jQuery.expr.match.needsContext.test(selector),namespace:namespaces.join(".")},handleObjIn),(handlers=events[type])||(handlers=events[type]=[],handlers.delegateCount=0,special.setup&&special.setup.call(elem,data,namespaces,eventHandle)!==!1||elem.addEventListener&&elem.addEventListener(type,eventHandle)),special.add&&(special.add.call(elem,handleObj),handleObj.handler.guid||(handleObj.handler.guid=handler.guid)),selector?handlers.splice(handlers.delegateCount++,0,handleObj):handlers.push(handleObj),jQuery.event.global[type]=!0)},remove:function(elem,types,handler,selector,mappedTypes){var j,origCount,tmp,events,t,handleObj,special,handlers,type,namespaces,origType,elemData=dataPriv.hasData(elem)&&dataPriv.get(elem);if(elemData&&(events=elemData.events)){for(types=(types||"").match(rnothtmlwhite)||[""],t=types.length;t--;)if(tmp=rtypenamespace.exec(types[t])||[],type=origType=tmp[1],namespaces=(tmp[2]||"").split(".").sort(),type){for(special=jQuery.event.special[type]||{},type=(selector?special.delegateType:special.bindType)||type,handlers=events[type]||[],tmp=tmp[2]&&new RegExp("(^|\\.)"+namespaces.join("\\.(?:.*\\.|)")+"(\\.|$)"),origCount=j=handlers.length;j--;)handleObj=handlers[j],!mappedTypes&&origType!==handleObj.origType||handler&&handler.guid!==handleObj.guid||tmp&&!tmp.test(handleObj.namespace)||selector&&selector!==handleObj.selector&&("**"!==selector||!handleObj.selector)||(handlers.splice(j,1),handleObj.selector&&handlers.delegateCount--,special.remove&&special.remove.call(elem,handleObj));origCount&&!handlers.length&&(special.teardown&&special.teardown.call(elem,namespaces,elemData.handle)!==!1||jQuery.removeEvent(elem,type,elemData.handle),delete events[type])}else for(type in events)jQuery.event.remove(elem,type+types[t],handler,selector,!0);jQuery.isEmptyObject(events)&&dataPriv.remove(elem,"handle events")}},dispatch:function(nativeEvent){var i,j,ret,matched,handleObj,handlerQueue,event=jQuery.event.fix(nativeEvent),args=new Array(arguments.length),handlers=(dataPriv.get(this,"events")||{})[event.type]||[],special=jQuery.event.special[event.type]||{};for(args[0]=event,i=1;i<arguments.length;i++)args[i]=arguments[i];if(event.delegateTarget=this,!special.preDispatch||special.preDispatch.call(this,event)!==!1){for(handlerQueue=jQuery.event.handlers.call(this,event,handlers),i=0;(matched=handlerQueue[i++])&&!event.isPropagationStopped();)for(event.currentTarget=matched.elem,j=0;(handleObj=matched.handlers[j++])&&!event.isImmediatePropagationStopped();)event.rnamespace&&!event.rnamespace.test(handleObj.namespace)||(event.handleObj=handleObj,event.data=handleObj.data,ret=((jQuery.event.special[handleObj.origType]||{}).handle||handleObj.handler).apply(matched.elem,args),void 0!==ret&&(event.result=ret)===!1&&(event.preventDefault(),event.stopPropagation()));return special.postDispatch&&special.postDispatch.call(this,event),event.result}},handlers:function(event,handlers){var i,handleObj,sel,matchedHandlers,matchedSelectors,handlerQueue=[],delegateCount=handlers.delegateCount,cur=event.target;if(delegateCount&&cur.nodeType&&!("click"===event.type&&event.button>=1))for(;cur!==this;cur=cur.parentNode||this)if(1===cur.nodeType&&("click"!==event.type||cur.disabled!==!0)){for(matchedHandlers=[],matchedSelectors={},i=0;i<delegateCount;i++)handleObj=handlers[i],sel=handleObj.selector+" ",void 0===matchedSelectors[sel]&&(matchedSelectors[sel]=handleObj.needsContext?jQuery(sel,this).index(cur)>-1:jQuery.find(sel,this,null,[cur]).length),matchedSelectors[sel]&&matchedHandlers.push(handleObj);matchedHandlers.length&&handlerQueue.push({elem:cur,handlers:matchedHandlers})}return cur=this,delegateCount<handlers.length&&handlerQueue.push({elem:cur,handlers:handlers.slice(delegateCount)}),handlerQueue},addProp:function(name,hook){Object.defineProperty(jQuery.Event.prototype,name,{enumerable:!0,configurable:!0,get:jQuery.isFunction(hook)?function(){if(this.originalEvent)return hook(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[name]},set:function(value){Object.defineProperty(this,name,{enumerable:!0,configurable:!0,writable:!0,value:value})}})},fix:function(originalEvent){return originalEvent[jQuery.expando]?originalEvent:new jQuery.Event(originalEvent)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==safeActiveElement()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===safeActiveElement()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&jQuery.nodeName(this,"input"))return this.click(),!1},_default:function(event){return jQuery.nodeName(event.target,"a")}},beforeunload:{postDispatch:function(event){void 0!==event.result&&event.originalEvent&&(event.originalEvent.returnValue=event.result)}}}},jQuery.removeEvent=function(elem,type,handle){elem.removeEventListener&&elem.removeEventListener(type,handle)},jQuery.Event=function(src,props){return this instanceof jQuery.Event?(src&&src.type?(this.originalEvent=src,this.type=src.type,this.isDefaultPrevented=src.defaultPrevented||void 0===src.defaultPrevented&&src.returnValue===!1?returnTrue:returnFalse,this.target=src.target&&3===src.target.nodeType?src.target.parentNode:src.target,this.currentTarget=src.currentTarget,this.relatedTarget=src.relatedTarget):this.type=src,props&&jQuery.extend(this,props),this.timeStamp=src&&src.timeStamp||jQuery.now(),void(this[jQuery.expando]=!0)):new jQuery.Event(src,props)},jQuery.Event.prototype={constructor:jQuery.Event,isDefaultPrevented:returnFalse,isPropagationStopped:returnFalse,isImmediatePropagationStopped:returnFalse,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=returnTrue,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=returnTrue,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=returnTrue,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},jQuery.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(event){var button=event.button;return null==event.which&&rkeyEvent.test(event.type)?null!=event.charCode?event.charCode:event.keyCode:!event.which&&void 0!==button&&rmouseEvent.test(event.type)?1&button?1:2&button?3:4&button?2:0:event.which}},jQuery.event.addProp),jQuery.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(orig,fix){jQuery.event.special[orig]={delegateType:fix,bindType:fix,handle:function(event){var ret,target=this,related=event.relatedTarget,handleObj=event.handleObj;return related&&(related===target||jQuery.contains(target,related))||(event.type=handleObj.origType,ret=handleObj.handler.apply(this,arguments),event.type=fix),ret}}}),jQuery.fn.extend({on:function(types,selector,data,fn){return on(this,types,selector,data,fn)},one:function(types,selector,data,fn){return on(this,types,selector,data,fn,1)},off:function(types,selector,fn){var handleObj,type;if(types&&types.preventDefault&&types.handleObj)return handleObj=types.handleObj,jQuery(types.delegateTarget).off(handleObj.namespace?handleObj.origType+"."+handleObj.namespace:handleObj.origType,handleObj.selector,handleObj.handler),this;if("object"==typeof types){for(type in types)this.off(type,selector,types[type]);return this}return selector!==!1&&"function"!=typeof selector||(fn=selector,selector=void 0),fn===!1&&(fn=returnFalse),this.each(function(){jQuery.event.remove(this,types,fn,selector)})}});var rxhtmlTag=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,rnoInnerhtml=/<script|<style|<link/i,rchecked=/checked\s*(?:[^=]|=\s*.checked.)/i,rscriptTypeMasked=/^true\/(.*)/,rcleanScript=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;jQuery.extend({htmlPrefilter:function(html){return html.replace(rxhtmlTag,"<$1></$2>")},clone:function(elem,dataAndEvents,deepDataAndEvents){var i,l,srcElements,destElements,clone=elem.cloneNode(!0),inPage=jQuery.contains(elem.ownerDocument,elem);if(!(support.noCloneChecked||1!==elem.nodeType&&11!==elem.nodeType||jQuery.isXMLDoc(elem)))for(destElements=getAll(clone),srcElements=getAll(elem),i=0,l=srcElements.length;i<l;i++)fixInput(srcElements[i],destElements[i]);if(dataAndEvents)if(deepDataAndEvents)for(srcElements=srcElements||getAll(elem),destElements=destElements||getAll(clone),i=0,l=srcElements.length;i<l;i++)cloneCopyEvent(srcElements[i],destElements[i]);else cloneCopyEvent(elem,clone);return destElements=getAll(clone,"script"),destElements.length>0&&setGlobalEval(destElements,!inPage&&getAll(elem,"script")),clone},cleanData:function(elems){for(var data,elem,type,special=jQuery.event.special,i=0;void 0!==(elem=elems[i]);i++)if(acceptData(elem)){if(data=elem[dataPriv.expando]){if(data.events)for(type in data.events)special[type]?jQuery.event.remove(elem,type):jQuery.removeEvent(elem,type,data.handle);elem[dataPriv.expando]=void 0}elem[dataUser.expando]&&(elem[dataUser.expando]=void 0)}}}),jQuery.fn.extend({detach:function(selector){return remove(this,selector,!0)},remove:function(selector){return remove(this,selector)},text:function(value){return access(this,function(value){return void 0===value?jQuery.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=value)})},null,value,arguments.length)},append:function(){return domManip(this,arguments,function(elem){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var target=manipulationTarget(this,elem);target.appendChild(elem)}})},prepend:function(){return domManip(this,arguments,function(elem){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var target=manipulationTarget(this,elem);target.insertBefore(elem,target.firstChild)}})},before:function(){return domManip(this,arguments,function(elem){this.parentNode&&this.parentNode.insertBefore(elem,this)})},after:function(){return domManip(this,arguments,function(elem){this.parentNode&&this.parentNode.insertBefore(elem,this.nextSibling)})},empty:function(){for(var elem,i=0;null!=(elem=this[i]);i++)1===elem.nodeType&&(jQuery.cleanData(getAll(elem,!1)),elem.textContent="");return this},clone:function(dataAndEvents,deepDataAndEvents){return dataAndEvents=null!=dataAndEvents&&dataAndEvents,deepDataAndEvents=null==deepDataAndEvents?dataAndEvents:deepDataAndEvents,this.map(function(){return jQuery.clone(this,dataAndEvents,deepDataAndEvents)})},html:function(value){return access(this,function(value){var elem=this[0]||{},i=0,l=this.length;if(void 0===value&&1===elem.nodeType)return elem.innerHTML;if("string"==typeof value&&!rnoInnerhtml.test(value)&&!wrapMap[(rtagName.exec(value)||["",""])[1].toLowerCase()]){value=jQuery.htmlPrefilter(value);try{for(;i<l;i++)elem=this[i]||{},1===elem.nodeType&&(jQuery.cleanData(getAll(elem,!1)),elem.innerHTML=value);elem=0}catch(e){}}elem&&this.empty().append(value)},null,value,arguments.length)},replaceWith:function(){var ignored=[];return domManip(this,arguments,function(elem){var parent=this.parentNode;jQuery.inArray(this,ignored)<0&&(jQuery.cleanData(getAll(this)),parent&&parent.replaceChild(elem,this))},ignored)}}),jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(selector){for(var elems,ret=[],insert=jQuery(selector),last=insert.length-1,i=0;i<=last;i++)elems=i===last?this:this.clone(!0),jQuery(insert[i])[original](elems),push.apply(ret,elems.get());return this.pushStack(ret)}});var rmargin=/^margin/,rnumnonpx=new RegExp("^("+pnum+")(?!px)[a-z%]+$","i"),getStyles=function(elem){var view=elem.ownerDocument.defaultView;return view&&view.opener||(view=window),view.getComputedStyle(elem)};!function(){function computeStyleTests(){if(div){div.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",div.innerHTML="",documentElement.appendChild(container);var divStyle=window.getComputedStyle(div);pixelPositionVal="1%"!==divStyle.top,reliableMarginLeftVal="2px"===divStyle.marginLeft,boxSizingReliableVal="4px"===divStyle.width,div.style.marginRight="50%",pixelMarginRightVal="4px"===divStyle.marginRight,documentElement.removeChild(container),div=null}}var pixelPositionVal,boxSizingReliableVal,pixelMarginRightVal,reliableMarginLeftVal,container=document.createElement("div"),div=document.createElement("div");div.style&&(div.style.backgroundClip="content-box",div.cloneNode(!0).style.backgroundClip="",support.clearCloneStyle="content-box"===div.style.backgroundClip,container.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",container.appendChild(div),jQuery.extend(support,{
pixelPosition:function(){return computeStyleTests(),pixelPositionVal},boxSizingReliable:function(){return computeStyleTests(),boxSizingReliableVal},pixelMarginRight:function(){return computeStyleTests(),pixelMarginRightVal},reliableMarginLeft:function(){return computeStyleTests(),reliableMarginLeftVal}}))}();var rdisplayswap=/^(none|table(?!-c[ea]).+)/,cssShow={position:"absolute",visibility:"hidden",display:"block"},cssNormalTransform={letterSpacing:"0",fontWeight:"400"},cssPrefixes=["Webkit","Moz","ms"],emptyStyle=document.createElement("div").style;jQuery.extend({cssHooks:{opacity:{get:function(elem,computed){if(computed){var ret=curCSS(elem,"opacity");return""===ret?"1":ret}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(elem,name,value,extra){if(elem&&3!==elem.nodeType&&8!==elem.nodeType&&elem.style){var ret,type,hooks,origName=jQuery.camelCase(name),style=elem.style;return name=jQuery.cssProps[origName]||(jQuery.cssProps[origName]=vendorPropName(origName)||origName),hooks=jQuery.cssHooks[name]||jQuery.cssHooks[origName],void 0===value?hooks&&"get"in hooks&&void 0!==(ret=hooks.get(elem,!1,extra))?ret:style[name]:(type=typeof value,"string"===type&&(ret=rcssNum.exec(value))&&ret[1]&&(value=adjustCSS(elem,name,ret),type="number"),null!=value&&value===value&&("number"===type&&(value+=ret&&ret[3]||(jQuery.cssNumber[origName]?"":"px")),support.clearCloneStyle||""!==value||0!==name.indexOf("background")||(style[name]="inherit"),hooks&&"set"in hooks&&void 0===(value=hooks.set(elem,value,extra))||(style[name]=value)),void 0)}},css:function(elem,name,extra,styles){var val,num,hooks,origName=jQuery.camelCase(name);return name=jQuery.cssProps[origName]||(jQuery.cssProps[origName]=vendorPropName(origName)||origName),hooks=jQuery.cssHooks[name]||jQuery.cssHooks[origName],hooks&&"get"in hooks&&(val=hooks.get(elem,!0,extra)),void 0===val&&(val=curCSS(elem,name,styles)),"normal"===val&&name in cssNormalTransform&&(val=cssNormalTransform[name]),""===extra||extra?(num=parseFloat(val),extra===!0||isFinite(num)?num||0:val):val}}),jQuery.each(["height","width"],function(i,name){jQuery.cssHooks[name]={get:function(elem,computed,extra){if(computed)return!rdisplayswap.test(jQuery.css(elem,"display"))||elem.getClientRects().length&&elem.getBoundingClientRect().width?getWidthOrHeight(elem,name,extra):swap(elem,cssShow,function(){return getWidthOrHeight(elem,name,extra)})},set:function(elem,value,extra){var matches,styles=extra&&getStyles(elem),subtract=extra&&augmentWidthOrHeight(elem,name,extra,"border-box"===jQuery.css(elem,"boxSizing",!1,styles),styles);return subtract&&(matches=rcssNum.exec(value))&&"px"!==(matches[3]||"px")&&(elem.style[name]=value,value=jQuery.css(elem,name)),setPositiveNumber(elem,value,subtract)}}}),jQuery.cssHooks.marginLeft=addGetHookIf(support.reliableMarginLeft,function(elem,computed){if(computed)return(parseFloat(curCSS(elem,"marginLeft"))||elem.getBoundingClientRect().left-swap(elem,{marginLeft:0},function(){return elem.getBoundingClientRect().left}))+"px"}),jQuery.each({margin:"",padding:"",border:"Width"},function(prefix,suffix){jQuery.cssHooks[prefix+suffix]={expand:function(value){for(var i=0,expanded={},parts="string"==typeof value?value.split(" "):[value];i<4;i++)expanded[prefix+cssExpand[i]+suffix]=parts[i]||parts[i-2]||parts[0];return expanded}},rmargin.test(prefix)||(jQuery.cssHooks[prefix+suffix].set=setPositiveNumber)}),jQuery.fn.extend({css:function(name,value){return access(this,function(elem,name,value){var styles,len,map={},i=0;if(jQuery.isArray(name)){for(styles=getStyles(elem),len=name.length;i<len;i++)map[name[i]]=jQuery.css(elem,name[i],!1,styles);return map}return void 0!==value?jQuery.style(elem,name,value):jQuery.css(elem,name)},name,value,arguments.length>1)}}),jQuery.Tween=Tween,Tween.prototype={constructor:Tween,init:function(elem,options,prop,end,easing,unit){this.elem=elem,this.prop=prop,this.easing=easing||jQuery.easing._default,this.options=options,this.start=this.now=this.cur(),this.end=end,this.unit=unit||(jQuery.cssNumber[prop]?"":"px")},cur:function(){var hooks=Tween.propHooks[this.prop];return hooks&&hooks.get?hooks.get(this):Tween.propHooks._default.get(this)},run:function(percent){var eased,hooks=Tween.propHooks[this.prop];return this.options.duration?this.pos=eased=jQuery.easing[this.easing](percent,this.options.duration*percent,0,1,this.options.duration):this.pos=eased=percent,this.now=(this.end-this.start)*eased+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),hooks&&hooks.set?hooks.set(this):Tween.propHooks._default.set(this),this}},Tween.prototype.init.prototype=Tween.prototype,Tween.propHooks={_default:{get:function(tween){var result;return 1!==tween.elem.nodeType||null!=tween.elem[tween.prop]&&null==tween.elem.style[tween.prop]?tween.elem[tween.prop]:(result=jQuery.css(tween.elem,tween.prop,""),result&&"auto"!==result?result:0)},set:function(tween){jQuery.fx.step[tween.prop]?jQuery.fx.step[tween.prop](tween):1!==tween.elem.nodeType||null==tween.elem.style[jQuery.cssProps[tween.prop]]&&!jQuery.cssHooks[tween.prop]?tween.elem[tween.prop]=tween.now:jQuery.style(tween.elem,tween.prop,tween.now+tween.unit)}}},Tween.propHooks.scrollTop=Tween.propHooks.scrollLeft={set:function(tween){tween.elem.nodeType&&tween.elem.parentNode&&(tween.elem[tween.prop]=tween.now)}},jQuery.easing={linear:function(p){return p},swing:function(p){return.5-Math.cos(p*Math.PI)/2},_default:"swing"},jQuery.fx=Tween.prototype.init,jQuery.fx.step={};var fxNow,timerId,rfxtypes=/^(?:toggle|show|hide)$/,rrun=/queueHooks$/;jQuery.Animation=jQuery.extend(Animation,{tweeners:{"*":[function(prop,value){var tween=this.createTween(prop,value);return adjustCSS(tween.elem,prop,rcssNum.exec(value),tween),tween}]},tweener:function(props,callback){jQuery.isFunction(props)?(callback=props,props=["*"]):props=props.match(rnothtmlwhite);for(var prop,index=0,length=props.length;index<length;index++)prop=props[index],Animation.tweeners[prop]=Animation.tweeners[prop]||[],Animation.tweeners[prop].unshift(callback)},prefilters:[defaultPrefilter],prefilter:function(callback,prepend){prepend?Animation.prefilters.unshift(callback):Animation.prefilters.push(callback)}}),jQuery.speed=function(speed,easing,fn){var opt=speed&&"object"==typeof speed?jQuery.extend({},speed):{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&!jQuery.isFunction(easing)&&easing};return jQuery.fx.off||document.hidden?opt.duration=0:"number"!=typeof opt.duration&&(opt.duration in jQuery.fx.speeds?opt.duration=jQuery.fx.speeds[opt.duration]:opt.duration=jQuery.fx.speeds._default),null!=opt.queue&&opt.queue!==!0||(opt.queue="fx"),opt.old=opt.complete,opt.complete=function(){jQuery.isFunction(opt.old)&&opt.old.call(this),opt.queue&&jQuery.dequeue(this,opt.queue)},opt},jQuery.fn.extend({fadeTo:function(speed,to,easing,callback){return this.filter(isHiddenWithinTree).css("opacity",0).show().end().animate({opacity:to},speed,easing,callback)},animate:function(prop,speed,easing,callback){var empty=jQuery.isEmptyObject(prop),optall=jQuery.speed(speed,easing,callback),doAnimation=function(){var anim=Animation(this,jQuery.extend({},prop),optall);(empty||dataPriv.get(this,"finish"))&&anim.stop(!0)};return doAnimation.finish=doAnimation,empty||optall.queue===!1?this.each(doAnimation):this.queue(optall.queue,doAnimation)},stop:function(type,clearQueue,gotoEnd){var stopQueue=function(hooks){var stop=hooks.stop;delete hooks.stop,stop(gotoEnd)};return"string"!=typeof type&&(gotoEnd=clearQueue,clearQueue=type,type=void 0),clearQueue&&type!==!1&&this.queue(type||"fx",[]),this.each(function(){var dequeue=!0,index=null!=type&&type+"queueHooks",timers=jQuery.timers,data=dataPriv.get(this);if(index)data[index]&&data[index].stop&&stopQueue(data[index]);else for(index in data)data[index]&&data[index].stop&&rrun.test(index)&&stopQueue(data[index]);for(index=timers.length;index--;)timers[index].elem!==this||null!=type&&timers[index].queue!==type||(timers[index].anim.stop(gotoEnd),dequeue=!1,timers.splice(index,1));!dequeue&&gotoEnd||jQuery.dequeue(this,type)})},finish:function(type){return type!==!1&&(type=type||"fx"),this.each(function(){var index,data=dataPriv.get(this),queue=data[type+"queue"],hooks=data[type+"queueHooks"],timers=jQuery.timers,length=queue?queue.length:0;for(data.finish=!0,jQuery.queue(this,type,[]),hooks&&hooks.stop&&hooks.stop.call(this,!0),index=timers.length;index--;)timers[index].elem===this&&timers[index].queue===type&&(timers[index].anim.stop(!0),timers.splice(index,1));for(index=0;index<length;index++)queue[index]&&queue[index].finish&&queue[index].finish.call(this);delete data.finish})}}),jQuery.each(["toggle","show","hide"],function(i,name){var cssFn=jQuery.fn[name];jQuery.fn[name]=function(speed,easing,callback){return null==speed||"boolean"==typeof speed?cssFn.apply(this,arguments):this.animate(genFx(name,!0),speed,easing,callback)}}),jQuery.each({slideDown:genFx("show"),slideUp:genFx("hide"),slideToggle:genFx("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(name,props){jQuery.fn[name]=function(speed,easing,callback){return this.animate(props,speed,easing,callback)}}),jQuery.timers=[],jQuery.fx.tick=function(){var timer,i=0,timers=jQuery.timers;for(fxNow=jQuery.now();i<timers.length;i++)timer=timers[i],timer()||timers[i]!==timer||timers.splice(i--,1);timers.length||jQuery.fx.stop(),fxNow=void 0},jQuery.fx.timer=function(timer){jQuery.timers.push(timer),timer()?jQuery.fx.start():jQuery.timers.pop()},jQuery.fx.interval=13,jQuery.fx.start=function(){timerId||(timerId=window.requestAnimationFrame?window.requestAnimationFrame(raf):window.setInterval(jQuery.fx.tick,jQuery.fx.interval))},jQuery.fx.stop=function(){window.cancelAnimationFrame?window.cancelAnimationFrame(timerId):window.clearInterval(timerId),timerId=null},jQuery.fx.speeds={slow:600,fast:200,_default:400},jQuery.fn.delay=function(time,type){return time=jQuery.fx?jQuery.fx.speeds[time]||time:time,type=type||"fx",this.queue(type,function(next,hooks){var timeout=window.setTimeout(next,time);hooks.stop=function(){window.clearTimeout(timeout)}})},function(){var input=document.createElement("input"),select=document.createElement("select"),opt=select.appendChild(document.createElement("option"));input.type="checkbox",support.checkOn=""!==input.value,support.optSelected=opt.selected,input=document.createElement("input"),input.value="t",input.type="radio",support.radioValue="t"===input.value}();var boolHook,attrHandle=jQuery.expr.attrHandle;jQuery.fn.extend({attr:function(name,value){return access(this,jQuery.attr,name,value,arguments.length>1)},removeAttr:function(name){return this.each(function(){jQuery.removeAttr(this,name)})}}),jQuery.extend({attr:function(elem,name,value){var ret,hooks,nType=elem.nodeType;if(3!==nType&&8!==nType&&2!==nType)return"undefined"==typeof elem.getAttribute?jQuery.prop(elem,name,value):(1===nType&&jQuery.isXMLDoc(elem)||(hooks=jQuery.attrHooks[name.toLowerCase()]||(jQuery.expr.match.bool.test(name)?boolHook:void 0)),void 0!==value?null===value?void jQuery.removeAttr(elem,name):hooks&&"set"in hooks&&void 0!==(ret=hooks.set(elem,value,name))?ret:(elem.setAttribute(name,value+""),value):hooks&&"get"in hooks&&null!==(ret=hooks.get(elem,name))?ret:(ret=jQuery.find.attr(elem,name),null==ret?void 0:ret))},attrHooks:{type:{set:function(elem,value){if(!support.radioValue&&"radio"===value&&jQuery.nodeName(elem,"input")){var val=elem.value;return elem.setAttribute("type",value),val&&(elem.value=val),value}}}},removeAttr:function(elem,value){var name,i=0,attrNames=value&&value.match(rnothtmlwhite);if(attrNames&&1===elem.nodeType)for(;name=attrNames[i++];)elem.removeAttribute(name)}}),boolHook={set:function(elem,value,name){return value===!1?jQuery.removeAttr(elem,name):elem.setAttribute(name,name),name}},jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g),function(i,name){var getter=attrHandle[name]||jQuery.find.attr;attrHandle[name]=function(elem,name,isXML){var ret,handle,lowercaseName=name.toLowerCase();return isXML||(handle=attrHandle[lowercaseName],attrHandle[lowercaseName]=ret,ret=null!=getter(elem,name,isXML)?lowercaseName:null,attrHandle[lowercaseName]=handle),ret}});var rfocusable=/^(?:input|select|textarea|button)$/i,rclickable=/^(?:a|area)$/i;jQuery.fn.extend({prop:function(name,value){return access(this,jQuery.prop,name,value,arguments.length>1)},removeProp:function(name){return this.each(function(){delete this[jQuery.propFix[name]||name]})}}),jQuery.extend({prop:function(elem,name,value){var ret,hooks,nType=elem.nodeType;if(3!==nType&&8!==nType&&2!==nType)return 1===nType&&jQuery.isXMLDoc(elem)||(name=jQuery.propFix[name]||name,hooks=jQuery.propHooks[name]),void 0!==value?hooks&&"set"in hooks&&void 0!==(ret=hooks.set(elem,value,name))?ret:elem[name]=value:hooks&&"get"in hooks&&null!==(ret=hooks.get(elem,name))?ret:elem[name]},propHooks:{tabIndex:{get:function(elem){var tabindex=jQuery.find.attr(elem,"tabindex");return tabindex?parseInt(tabindex,10):rfocusable.test(elem.nodeName)||rclickable.test(elem.nodeName)&&elem.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),support.optSelected||(jQuery.propHooks.selected={get:function(elem){var parent=elem.parentNode;return parent&&parent.parentNode&&parent.parentNode.selectedIndex,null},set:function(elem){var parent=elem.parentNode;parent&&(parent.selectedIndex,parent.parentNode&&parent.parentNode.selectedIndex)}}),jQuery.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){jQuery.propFix[this.toLowerCase()]=this}),jQuery.fn.extend({addClass:function(value){var classes,elem,cur,curValue,clazz,j,finalValue,i=0;if(jQuery.isFunction(value))return this.each(function(j){jQuery(this).addClass(value.call(this,j,getClass(this)))});if("string"==typeof value&&value)for(classes=value.match(rnothtmlwhite)||[];elem=this[i++];)if(curValue=getClass(elem),cur=1===elem.nodeType&&" "+stripAndCollapse(curValue)+" "){for(j=0;clazz=classes[j++];)cur.indexOf(" "+clazz+" ")<0&&(cur+=clazz+" ");finalValue=stripAndCollapse(cur),curValue!==finalValue&&elem.setAttribute("class",finalValue)}return this},removeClass:function(value){var classes,elem,cur,curValue,clazz,j,finalValue,i=0;if(jQuery.isFunction(value))return this.each(function(j){jQuery(this).removeClass(value.call(this,j,getClass(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof value&&value)for(classes=value.match(rnothtmlwhite)||[];elem=this[i++];)if(curValue=getClass(elem),cur=1===elem.nodeType&&" "+stripAndCollapse(curValue)+" "){for(j=0;clazz=classes[j++];)for(;cur.indexOf(" "+clazz+" ")>-1;)cur=cur.replace(" "+clazz+" "," ");finalValue=stripAndCollapse(cur),curValue!==finalValue&&elem.setAttribute("class",finalValue)}return this},toggleClass:function(value,stateVal){var type=typeof value;return"boolean"==typeof stateVal&&"string"===type?stateVal?this.addClass(value):this.removeClass(value):jQuery.isFunction(value)?this.each(function(i){jQuery(this).toggleClass(value.call(this,i,getClass(this),stateVal),stateVal)}):this.each(function(){var className,i,self,classNames;if("string"===type)for(i=0,self=jQuery(this),classNames=value.match(rnothtmlwhite)||[];className=classNames[i++];)self.hasClass(className)?self.removeClass(className):self.addClass(className);else void 0!==value&&"boolean"!==type||(className=getClass(this),className&&dataPriv.set(this,"__className__",className),this.setAttribute&&this.setAttribute("class",className||value===!1?"":dataPriv.get(this,"__className__")||""))})},hasClass:function(selector){var className,elem,i=0;for(className=" "+selector+" ";elem=this[i++];)if(1===elem.nodeType&&(" "+stripAndCollapse(getClass(elem))+" ").indexOf(className)>-1)return!0;return!1}});var rreturn=/\r/g;jQuery.fn.extend({val:function(value){var hooks,ret,isFunction,elem=this[0];{if(arguments.length)return isFunction=jQuery.isFunction(value),this.each(function(i){var val;1===this.nodeType&&(val=isFunction?value.call(this,i,jQuery(this).val()):value,null==val?val="":"number"==typeof val?val+="":jQuery.isArray(val)&&(val=jQuery.map(val,function(value){return null==value?"":value+""})),hooks=jQuery.valHooks[this.type]||jQuery.valHooks[this.nodeName.toLowerCase()],hooks&&"set"in hooks&&void 0!==hooks.set(this,val,"value")||(this.value=val))});if(elem)return hooks=jQuery.valHooks[elem.type]||jQuery.valHooks[elem.nodeName.toLowerCase()],hooks&&"get"in hooks&&void 0!==(ret=hooks.get(elem,"value"))?ret:(ret=elem.value,"string"==typeof ret?ret.replace(rreturn,""):null==ret?"":ret)}}}),jQuery.extend({valHooks:{option:{get:function(elem){var val=jQuery.find.attr(elem,"value");return null!=val?val:stripAndCollapse(jQuery.text(elem))}},select:{get:function(elem){var value,option,i,options=elem.options,index=elem.selectedIndex,one="select-one"===elem.type,values=one?null:[],max=one?index+1:options.length;for(i=index<0?max:one?index:0;i<max;i++)if(option=options[i],(option.selected||i===index)&&!option.disabled&&(!option.parentNode.disabled||!jQuery.nodeName(option.parentNode,"optgroup"))){if(value=jQuery(option).val(),one)return value;values.push(value)}return values},set:function(elem,value){for(var optionSet,option,options=elem.options,values=jQuery.makeArray(value),i=options.length;i--;)option=options[i],(option.selected=jQuery.inArray(jQuery.valHooks.option.get(option),values)>-1)&&(optionSet=!0);return optionSet||(elem.selectedIndex=-1),values}}}}),jQuery.each(["radio","checkbox"],function(){jQuery.valHooks[this]={set:function(elem,value){if(jQuery.isArray(value))return elem.checked=jQuery.inArray(jQuery(elem).val(),value)>-1}},support.checkOn||(jQuery.valHooks[this].get=function(elem){return null===elem.getAttribute("value")?"on":elem.value})});var rfocusMorph=/^(?:focusinfocus|focusoutblur)$/;jQuery.extend(jQuery.event,{trigger:function(event,data,elem,onlyHandlers){var i,cur,tmp,bubbleType,ontype,handle,special,eventPath=[elem||document],type=hasOwn.call(event,"type")?event.type:event,namespaces=hasOwn.call(event,"namespace")?event.namespace.split("."):[];if(cur=tmp=elem=elem||document,3!==elem.nodeType&&8!==elem.nodeType&&!rfocusMorph.test(type+jQuery.event.triggered)&&(type.indexOf(".")>-1&&(namespaces=type.split("."),type=namespaces.shift(),namespaces.sort()),ontype=type.indexOf(":")<0&&"on"+type,event=event[jQuery.expando]?event:new jQuery.Event(type,"object"==typeof event&&event),event.isTrigger=onlyHandlers?2:3,event.namespace=namespaces.join("."),event.rnamespace=event.namespace?new RegExp("(^|\\.)"+namespaces.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,event.result=void 0,event.target||(event.target=elem),data=null==data?[event]:jQuery.makeArray(data,[event]),special=jQuery.event.special[type]||{},onlyHandlers||!special.trigger||special.trigger.apply(elem,data)!==!1)){if(!onlyHandlers&&!special.noBubble&&!jQuery.isWindow(elem)){for(bubbleType=special.delegateType||type,rfocusMorph.test(bubbleType+type)||(cur=cur.parentNode);cur;cur=cur.parentNode)eventPath.push(cur),tmp=cur;tmp===(elem.ownerDocument||document)&&eventPath.push(tmp.defaultView||tmp.parentWindow||window)}for(i=0;(cur=eventPath[i++])&&!event.isPropagationStopped();)event.type=i>1?bubbleType:special.bindType||type,handle=(dataPriv.get(cur,"events")||{})[event.type]&&dataPriv.get(cur,"handle"),handle&&handle.apply(cur,data),handle=ontype&&cur[ontype],handle&&handle.apply&&acceptData(cur)&&(event.result=handle.apply(cur,data),event.result===!1&&event.preventDefault());return event.type=type,onlyHandlers||event.isDefaultPrevented()||special._default&&special._default.apply(eventPath.pop(),data)!==!1||!acceptData(elem)||ontype&&jQuery.isFunction(elem[type])&&!jQuery.isWindow(elem)&&(tmp=elem[ontype],tmp&&(elem[ontype]=null),jQuery.event.triggered=type,elem[type](),jQuery.event.triggered=void 0,tmp&&(elem[ontype]=tmp)),event.result}},simulate:function(type,elem,event){var e=jQuery.extend(new jQuery.Event,event,{type:type,isSimulated:!0});jQuery.event.trigger(e,null,elem)}}),jQuery.fn.extend({trigger:function(type,data){return this.each(function(){jQuery.event.trigger(type,data,this)})},triggerHandler:function(type,data){var elem=this[0];if(elem)return jQuery.event.trigger(type,data,elem,!0)}}),jQuery.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(i,name){jQuery.fn[name]=function(data,fn){return arguments.length>0?this.on(name,null,data,fn):this.trigger(name)}}),jQuery.fn.extend({hover:function(fnOver,fnOut){return this.mouseenter(fnOver).mouseleave(fnOut||fnOver)}}),support.focusin="onfocusin"in window,support.focusin||jQuery.each({focus:"focusin",blur:"focusout"},function(orig,fix){var handler=function(event){jQuery.event.simulate(fix,event.target,jQuery.event.fix(event))};jQuery.event.special[fix]={setup:function(){var doc=this.ownerDocument||this,attaches=dataPriv.access(doc,fix);attaches||doc.addEventListener(orig,handler,!0),dataPriv.access(doc,fix,(attaches||0)+1)},teardown:function(){var doc=this.ownerDocument||this,attaches=dataPriv.access(doc,fix)-1;attaches?dataPriv.access(doc,fix,attaches):(doc.removeEventListener(orig,handler,!0),dataPriv.remove(doc,fix))}}});var location=window.location,nonce=jQuery.now(),rquery=/\?/;jQuery.parseXML=function(data){var xml;if(!data||"string"!=typeof data)return null;try{xml=(new window.DOMParser).parseFromString(data,"text/xml")}catch(e){xml=void 0}return xml&&!xml.getElementsByTagName("parsererror").length||jQuery.error("Invalid XML: "+data),xml};var rbracket=/\[\]$/,rCRLF=/\r?\n/g,rsubmitterTypes=/^(?:submit|button|image|reset|file)$/i,rsubmittable=/^(?:input|select|textarea|keygen)/i;jQuery.param=function(a,traditional){var prefix,s=[],add=function(key,valueOrFunction){var value=jQuery.isFunction(valueOrFunction)?valueOrFunction():valueOrFunction;s[s.length]=encodeURIComponent(key)+"="+encodeURIComponent(null==value?"":value)};if(jQuery.isArray(a)||a.jquery&&!jQuery.isPlainObject(a))jQuery.each(a,function(){add(this.name,this.value)});else for(prefix in a)buildParams(prefix,a[prefix],traditional,add);return s.join("&")},jQuery.fn.extend({serialize:function(){return jQuery.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var elements=jQuery.prop(this,"elements");return elements?jQuery.makeArray(elements):this}).filter(function(){var type=this.type;return this.name&&!jQuery(this).is(":disabled")&&rsubmittable.test(this.nodeName)&&!rsubmitterTypes.test(type)&&(this.checked||!rcheckableType.test(type))}).map(function(i,elem){var val=jQuery(this).val();return null==val?null:jQuery.isArray(val)?jQuery.map(val,function(val){return{name:elem.name,value:val.replace(rCRLF,"\r\n")}}):{name:elem.name,value:val.replace(rCRLF,"\r\n")}}).get()}});var r20=/%20/g,rhash=/#.*$/,rantiCache=/([?&])_=[^&]*/,rheaders=/^(.*?):[ \t]*([^\r\n]*)$/gm,rlocalProtocol=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,rnoContent=/^(?:GET|HEAD)$/,rprotocol=/^\/\//,prefilters={},transports={},allTypes="*/".concat("*"),originAnchor=document.createElement("a");originAnchor.href=location.href,jQuery.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:location.href,type:"GET",isLocal:rlocalProtocol.test(location.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":allTypes,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":jQuery.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(target,settings){return settings?ajaxExtend(ajaxExtend(target,jQuery.ajaxSettings),settings):ajaxExtend(jQuery.ajaxSettings,target)},ajaxPrefilter:addToPrefiltersOrTransports(prefilters),ajaxTransport:addToPrefiltersOrTransports(transports),ajax:function(url,options){function done(status,nativeStatusText,responses,headers){var isSuccess,success,error,response,modified,statusText=nativeStatusText;completed||(completed=!0,timeoutTimer&&window.clearTimeout(timeoutTimer),transport=void 0,responseHeadersString=headers||"",jqXHR.readyState=status>0?4:0,isSuccess=status>=200&&status<300||304===status,responses&&(response=ajaxHandleResponses(s,jqXHR,responses)),response=ajaxConvert(s,response,jqXHR,isSuccess),isSuccess?(s.ifModified&&(modified=jqXHR.getResponseHeader("Last-Modified"),modified&&(jQuery.lastModified[cacheURL]=modified),modified=jqXHR.getResponseHeader("etag"),modified&&(jQuery.etag[cacheURL]=modified)),204===status||"HEAD"===s.type?statusText="nocontent":304===status?statusText="notmodified":(statusText=response.state,success=response.data,error=response.error,isSuccess=!error)):(error=statusText,!status&&statusText||(statusText="error",status<0&&(status=0))),jqXHR.status=status,jqXHR.statusText=(nativeStatusText||statusText)+"",isSuccess?deferred.resolveWith(callbackContext,[success,statusText,jqXHR]):deferred.rejectWith(callbackContext,[jqXHR,statusText,error]),jqXHR.statusCode(statusCode),statusCode=void 0,fireGlobals&&globalEventContext.trigger(isSuccess?"ajaxSuccess":"ajaxError",[jqXHR,s,isSuccess?success:error]),completeDeferred.fireWith(callbackContext,[jqXHR,statusText]),fireGlobals&&(globalEventContext.trigger("ajaxComplete",[jqXHR,s]),--jQuery.active||jQuery.event.trigger("ajaxStop")))}"object"==typeof url&&(options=url,url=void 0),options=options||{};var transport,cacheURL,responseHeadersString,responseHeaders,timeoutTimer,urlAnchor,completed,fireGlobals,i,uncached,s=jQuery.ajaxSetup({},options),callbackContext=s.context||s,globalEventContext=s.context&&(callbackContext.nodeType||callbackContext.jquery)?jQuery(callbackContext):jQuery.event,deferred=jQuery.Deferred(),completeDeferred=jQuery.Callbacks("once memory"),statusCode=s.statusCode||{},requestHeaders={},requestHeadersNames={},strAbort="canceled",jqXHR={readyState:0,getResponseHeader:function(key){var match;if(completed){if(!responseHeaders)for(responseHeaders={};match=rheaders.exec(responseHeadersString);)responseHeaders[match[1].toLowerCase()]=match[2];match=responseHeaders[key.toLowerCase()]}return null==match?null:match},getAllResponseHeaders:function(){return completed?responseHeadersString:null},setRequestHeader:function(name,value){return null==completed&&(name=requestHeadersNames[name.toLowerCase()]=requestHeadersNames[name.toLowerCase()]||name,requestHeaders[name]=value),this},overrideMimeType:function(type){return null==completed&&(s.mimeType=type),this},statusCode:function(map){var code;if(map)if(completed)jqXHR.always(map[jqXHR.status]);else for(code in map)statusCode[code]=[statusCode[code],map[code]];return this},abort:function(statusText){var finalText=statusText||strAbort;return transport&&transport.abort(finalText),done(0,finalText),this}};if(deferred.promise(jqXHR),s.url=((url||s.url||location.href)+"").replace(rprotocol,location.protocol+"//"),s.type=options.method||options.type||s.method||s.type,s.dataTypes=(s.dataType||"*").toLowerCase().match(rnothtmlwhite)||[""],null==s.crossDomain){urlAnchor=document.createElement("a");try{urlAnchor.href=s.url,urlAnchor.href=urlAnchor.href,s.crossDomain=originAnchor.protocol+"//"+originAnchor.host!=urlAnchor.protocol+"//"+urlAnchor.host}catch(e){s.crossDomain=!0}}if(s.data&&s.processData&&"string"!=typeof s.data&&(s.data=jQuery.param(s.data,s.traditional)),inspectPrefiltersOrTransports(prefilters,s,options,jqXHR),completed)return jqXHR;fireGlobals=jQuery.event&&s.global,fireGlobals&&0===jQuery.active++&&jQuery.event.trigger("ajaxStart"),s.type=s.type.toUpperCase(),s.hasContent=!rnoContent.test(s.type),cacheURL=s.url.replace(rhash,""),s.hasContent?s.data&&s.processData&&0===(s.contentType||"").indexOf("application/x-www-form-urlencoded")&&(s.data=s.data.replace(r20,"+")):(uncached=s.url.slice(cacheURL.length),s.data&&(cacheURL+=(rquery.test(cacheURL)?"&":"?")+s.data,delete s.data),s.cache===!1&&(cacheURL=cacheURL.replace(rantiCache,"$1"),uncached=(rquery.test(cacheURL)?"&":"?")+"_="+nonce++ +uncached),s.url=cacheURL+uncached),s.ifModified&&(jQuery.lastModified[cacheURL]&&jqXHR.setRequestHeader("If-Modified-Since",jQuery.lastModified[cacheURL]),jQuery.etag[cacheURL]&&jqXHR.setRequestHeader("If-None-Match",jQuery.etag[cacheURL])),(s.data&&s.hasContent&&s.contentType!==!1||options.contentType)&&jqXHR.setRequestHeader("Content-Type",s.contentType),jqXHR.setRequestHeader("Accept",s.dataTypes[0]&&s.accepts[s.dataTypes[0]]?s.accepts[s.dataTypes[0]]+("*"!==s.dataTypes[0]?", "+allTypes+"; q=0.01":""):s.accepts["*"]);for(i in s.headers)jqXHR.setRequestHeader(i,s.headers[i]);if(s.beforeSend&&(s.beforeSend.call(callbackContext,jqXHR,s)===!1||completed))return jqXHR.abort();if(strAbort="abort",completeDeferred.add(s.complete),jqXHR.done(s.success),jqXHR.fail(s.error),transport=inspectPrefiltersOrTransports(transports,s,options,jqXHR)){if(jqXHR.readyState=1,fireGlobals&&globalEventContext.trigger("ajaxSend",[jqXHR,s]),completed)return jqXHR;s.async&&s.timeout>0&&(timeoutTimer=window.setTimeout(function(){jqXHR.abort("timeout")},s.timeout));try{completed=!1,transport.send(requestHeaders,done)}catch(e){if(completed)throw e;done(-1,e)}}else done(-1,"No Transport");return jqXHR},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json")},getScript:function(url,callback){return jQuery.get(url,void 0,callback,"script")}}),jQuery.each(["get","post"],function(i,method){jQuery[method]=function(url,data,callback,type){return jQuery.isFunction(data)&&(type=type||callback,callback=data,data=void 0),jQuery.ajax(jQuery.extend({url:url,type:method,dataType:type,data:data,success:callback},jQuery.isPlainObject(url)&&url))}}),jQuery._evalUrl=function(url){return jQuery.ajax({url:url,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},jQuery.fn.extend({wrapAll:function(html){var wrap;return this[0]&&(jQuery.isFunction(html)&&(html=html.call(this[0])),wrap=jQuery(html,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&wrap.insertBefore(this[0]),wrap.map(function(){for(var elem=this;elem.firstElementChild;)elem=elem.firstElementChild;return elem}).append(this)),this},wrapInner:function(html){return jQuery.isFunction(html)?this.each(function(i){jQuery(this).wrapInner(html.call(this,i))}):this.each(function(){var self=jQuery(this),contents=self.contents();contents.length?contents.wrapAll(html):self.append(html)})},wrap:function(html){var isFunction=jQuery.isFunction(html);return this.each(function(i){jQuery(this).wrapAll(isFunction?html.call(this,i):html)})},unwrap:function(selector){return this.parent(selector).not("body").each(function(){jQuery(this).replaceWith(this.childNodes)}),this}}),jQuery.expr.pseudos.hidden=function(elem){return!jQuery.expr.pseudos.visible(elem)},jQuery.expr.pseudos.visible=function(elem){return!!(elem.offsetWidth||elem.offsetHeight||elem.getClientRects().length)},jQuery.ajaxSettings.xhr=function(){try{return new window.XMLHttpRequest}catch(e){}};var xhrSuccessStatus={0:200,1223:204},xhrSupported=jQuery.ajaxSettings.xhr();support.cors=!!xhrSupported&&"withCredentials"in xhrSupported,support.ajax=xhrSupported=!!xhrSupported,jQuery.ajaxTransport(function(options){var callback,errorCallback;if(support.cors||xhrSupported&&!options.crossDomain)return{send:function(headers,complete){var i,xhr=options.xhr();if(xhr.open(options.type,options.url,options.async,options.username,options.password),options.xhrFields)for(i in options.xhrFields)xhr[i]=options.xhrFields[i];options.mimeType&&xhr.overrideMimeType&&xhr.overrideMimeType(options.mimeType),
options.crossDomain||headers["X-Requested-With"]||(headers["X-Requested-With"]="XMLHttpRequest");for(i in headers)xhr.setRequestHeader(i,headers[i]);callback=function(type){return function(){callback&&(callback=errorCallback=xhr.onload=xhr.onerror=xhr.onabort=xhr.onreadystatechange=null,"abort"===type?xhr.abort():"error"===type?"number"!=typeof xhr.status?complete(0,"error"):complete(xhr.status,xhr.statusText):complete(xhrSuccessStatus[xhr.status]||xhr.status,xhr.statusText,"text"!==(xhr.responseType||"text")||"string"!=typeof xhr.responseText?{binary:xhr.response}:{text:xhr.responseText},xhr.getAllResponseHeaders()))}},xhr.onload=callback(),errorCallback=xhr.onerror=callback("error"),void 0!==xhr.onabort?xhr.onabort=errorCallback:xhr.onreadystatechange=function(){4===xhr.readyState&&window.setTimeout(function(){callback&&errorCallback()})},callback=callback("abort");try{xhr.send(options.hasContent&&options.data||null)}catch(e){if(callback)throw e}},abort:function(){callback&&callback()}}}),jQuery.ajaxPrefilter(function(s){s.crossDomain&&(s.contents.script=!1)}),jQuery.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(text){return jQuery.globalEval(text),text}}}),jQuery.ajaxPrefilter("script",function(s){void 0===s.cache&&(s.cache=!1),s.crossDomain&&(s.type="GET")}),jQuery.ajaxTransport("script",function(s){if(s.crossDomain){var script,callback;return{send:function(_,complete){script=jQuery("<script>").prop({charset:s.scriptCharset,src:s.url}).on("load error",callback=function(evt){script.remove(),callback=null,evt&&complete("error"===evt.type?404:200,evt.type)}),document.head.appendChild(script[0])},abort:function(){callback&&callback()}}}});var oldCallbacks=[],rjsonp=/(=)\?(?=&|$)|\?\?/;jQuery.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var callback=oldCallbacks.pop()||jQuery.expando+"_"+nonce++;return this[callback]=!0,callback}}),jQuery.ajaxPrefilter("json jsonp",function(s,originalSettings,jqXHR){var callbackName,overwritten,responseContainer,jsonProp=s.jsonp!==!1&&(rjsonp.test(s.url)?"url":"string"==typeof s.data&&0===(s.contentType||"").indexOf("application/x-www-form-urlencoded")&&rjsonp.test(s.data)&&"data");if(jsonProp||"jsonp"===s.dataTypes[0])return callbackName=s.jsonpCallback=jQuery.isFunction(s.jsonpCallback)?s.jsonpCallback():s.jsonpCallback,jsonProp?s[jsonProp]=s[jsonProp].replace(rjsonp,"$1"+callbackName):s.jsonp!==!1&&(s.url+=(rquery.test(s.url)?"&":"?")+s.jsonp+"="+callbackName),s.converters["script json"]=function(){return responseContainer||jQuery.error(callbackName+" was not called"),responseContainer[0]},s.dataTypes[0]="json",overwritten=window[callbackName],window[callbackName]=function(){responseContainer=arguments},jqXHR.always(function(){void 0===overwritten?jQuery(window).removeProp(callbackName):window[callbackName]=overwritten,s[callbackName]&&(s.jsonpCallback=originalSettings.jsonpCallback,oldCallbacks.push(callbackName)),responseContainer&&jQuery.isFunction(overwritten)&&overwritten(responseContainer[0]),responseContainer=overwritten=void 0}),"script"}),support.createHTMLDocument=function(){var body=document.implementation.createHTMLDocument("").body;return body.innerHTML="<form></form><form></form>",2===body.childNodes.length}(),jQuery.parseHTML=function(data,context,keepScripts){if("string"!=typeof data)return[];"boolean"==typeof context&&(keepScripts=context,context=!1);var base,parsed,scripts;return context||(support.createHTMLDocument?(context=document.implementation.createHTMLDocument(""),base=context.createElement("base"),base.href=document.location.href,context.head.appendChild(base)):context=document),parsed=rsingleTag.exec(data),scripts=!keepScripts&&[],parsed?[context.createElement(parsed[1])]:(parsed=buildFragment([data],context,scripts),scripts&&scripts.length&&jQuery(scripts).remove(),jQuery.merge([],parsed.childNodes))},jQuery.fn.load=function(url,params,callback){var selector,type,response,self=this,off=url.indexOf(" ");return off>-1&&(selector=stripAndCollapse(url.slice(off)),url=url.slice(0,off)),jQuery.isFunction(params)?(callback=params,params=void 0):params&&"object"==typeof params&&(type="POST"),self.length>0&&jQuery.ajax({url:url,type:type||"GET",dataType:"html",data:params}).done(function(responseText){response=arguments,self.html(selector?jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector):responseText)}).always(callback&&function(jqXHR,status){self.each(function(){callback.apply(this,response||[jqXHR.responseText,status,jqXHR])})}),this},jQuery.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(i,type){jQuery.fn[type]=function(fn){return this.on(type,fn)}}),jQuery.expr.pseudos.animated=function(elem){return jQuery.grep(jQuery.timers,function(fn){return elem===fn.elem}).length},jQuery.offset={setOffset:function(elem,options,i){var curPosition,curLeft,curCSSTop,curTop,curOffset,curCSSLeft,calculatePosition,position=jQuery.css(elem,"position"),curElem=jQuery(elem),props={};"static"===position&&(elem.style.position="relative"),curOffset=curElem.offset(),curCSSTop=jQuery.css(elem,"top"),curCSSLeft=jQuery.css(elem,"left"),calculatePosition=("absolute"===position||"fixed"===position)&&(curCSSTop+curCSSLeft).indexOf("auto")>-1,calculatePosition?(curPosition=curElem.position(),curTop=curPosition.top,curLeft=curPosition.left):(curTop=parseFloat(curCSSTop)||0,curLeft=parseFloat(curCSSLeft)||0),jQuery.isFunction(options)&&(options=options.call(elem,i,jQuery.extend({},curOffset))),null!=options.top&&(props.top=options.top-curOffset.top+curTop),null!=options.left&&(props.left=options.left-curOffset.left+curLeft),"using"in options?options.using.call(elem,props):curElem.css(props)}},jQuery.fn.extend({offset:function(options){if(arguments.length)return void 0===options?this:this.each(function(i){jQuery.offset.setOffset(this,options,i)});var docElem,win,rect,doc,elem=this[0];if(elem)return elem.getClientRects().length?(rect=elem.getBoundingClientRect(),rect.width||rect.height?(doc=elem.ownerDocument,win=getWindow(doc),docElem=doc.documentElement,{top:rect.top+win.pageYOffset-docElem.clientTop,left:rect.left+win.pageXOffset-docElem.clientLeft}):rect):{top:0,left:0}},position:function(){if(this[0]){var offsetParent,offset,elem=this[0],parentOffset={top:0,left:0};return"fixed"===jQuery.css(elem,"position")?offset=elem.getBoundingClientRect():(offsetParent=this.offsetParent(),offset=this.offset(),jQuery.nodeName(offsetParent[0],"html")||(parentOffset=offsetParent.offset()),parentOffset={top:parentOffset.top+jQuery.css(offsetParent[0],"borderTopWidth",!0),left:parentOffset.left+jQuery.css(offsetParent[0],"borderLeftWidth",!0)}),{top:offset.top-parentOffset.top-jQuery.css(elem,"marginTop",!0),left:offset.left-parentOffset.left-jQuery.css(elem,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var offsetParent=this.offsetParent;offsetParent&&"static"===jQuery.css(offsetParent,"position");)offsetParent=offsetParent.offsetParent;return offsetParent||documentElement})}}),jQuery.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(method,prop){var top="pageYOffset"===prop;jQuery.fn[method]=function(val){return access(this,function(elem,method,val){var win=getWindow(elem);return void 0===val?win?win[prop]:elem[method]:void(win?win.scrollTo(top?win.pageXOffset:val,top?val:win.pageYOffset):elem[method]=val)},method,val,arguments.length)}}),jQuery.each(["top","left"],function(i,prop){jQuery.cssHooks[prop]=addGetHookIf(support.pixelPosition,function(elem,computed){if(computed)return computed=curCSS(elem,prop),rnumnonpx.test(computed)?jQuery(elem).position()[prop]+"px":computed})}),jQuery.each({Height:"height",Width:"width"},function(name,type){jQuery.each({padding:"inner"+name,content:type,"":"outer"+name},function(defaultExtra,funcName){jQuery.fn[funcName]=function(margin,value){var chainable=arguments.length&&(defaultExtra||"boolean"!=typeof margin),extra=defaultExtra||(margin===!0||value===!0?"margin":"border");return access(this,function(elem,type,value){var doc;return jQuery.isWindow(elem)?0===funcName.indexOf("outer")?elem["inner"+name]:elem.document.documentElement["client"+name]:9===elem.nodeType?(doc=elem.documentElement,Math.max(elem.body["scroll"+name],doc["scroll"+name],elem.body["offset"+name],doc["offset"+name],doc["client"+name])):void 0===value?jQuery.css(elem,type,extra):jQuery.style(elem,type,value,extra)},type,chainable?margin:void 0,chainable)}})}),jQuery.fn.extend({bind:function(types,data,fn){return this.on(types,null,data,fn)},unbind:function(types,fn){return this.off(types,null,fn)},delegate:function(selector,types,data,fn){return this.on(types,selector,data,fn)},undelegate:function(selector,types,fn){return 1===arguments.length?this.off(selector,"**"):this.off(types,selector||"**",fn)}}),jQuery.parseJSON=JSON.parse,__WEBPACK_AMD_DEFINE_ARRAY__=[],__WEBPACK_AMD_DEFINE_RESULT__=function(){return jQuery}.apply(exports,__WEBPACK_AMD_DEFINE_ARRAY__),!(void 0!==__WEBPACK_AMD_DEFINE_RESULT__&&(module.exports=__WEBPACK_AMD_DEFINE_RESULT__));var _jQuery=window.jQuery,_$=window.$;return jQuery.noConflict=function(deep){return window.$===jQuery&&(window.$=_$),deep&&window.jQuery===jQuery&&(window.jQuery=_jQuery),jQuery},noGlobal||(window.jQuery=window.$=jQuery),jQuery})},function(module,exports,__webpack_require__){"use strict";(function(Buffer,global){function typedArraySupport(){try{var arr=new Uint8Array(1);return arr.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===arr.foo()&&"function"==typeof arr.subarray&&0===arr.subarray(1,1).byteLength}catch(e){return!1}}function kMaxLength(){return Buffer.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function createBuffer(that,length){if(kMaxLength()<length)throw new RangeError("Invalid typed array length");return Buffer.TYPED_ARRAY_SUPPORT?(that=new Uint8Array(length),that.__proto__=Buffer.prototype):(null===that&&(that=new Buffer(length)),that.length=length),that}function Buffer(arg,encodingOrOffset,length){if(!(Buffer.TYPED_ARRAY_SUPPORT||this instanceof Buffer))return new Buffer(arg,encodingOrOffset,length);if("number"==typeof arg){if("string"==typeof encodingOrOffset)throw new Error("If encoding is specified then the first argument must be a string");return allocUnsafe(this,arg)}return from(this,arg,encodingOrOffset,length)}function from(that,value,encodingOrOffset,length){if("number"==typeof value)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&value instanceof ArrayBuffer?fromArrayBuffer(that,value,encodingOrOffset,length):"string"==typeof value?fromString(that,value,encodingOrOffset):fromObject(that,value)}function assertSize(size){if("number"!=typeof size)throw new TypeError('"size" argument must be a number');if(size<0)throw new RangeError('"size" argument must not be negative')}function alloc(that,size,fill,encoding){return assertSize(size),size<=0?createBuffer(that,size):void 0!==fill?"string"==typeof encoding?createBuffer(that,size).fill(fill,encoding):createBuffer(that,size).fill(fill):createBuffer(that,size)}function allocUnsafe(that,size){if(assertSize(size),that=createBuffer(that,size<0?0:0|checked(size)),!Buffer.TYPED_ARRAY_SUPPORT)for(var i=0;i<size;++i)that[i]=0;return that}function fromString(that,string,encoding){if("string"==typeof encoding&&""!==encoding||(encoding="utf8"),!Buffer.isEncoding(encoding))throw new TypeError('"encoding" must be a valid string encoding');var length=0|byteLength(string,encoding);that=createBuffer(that,length);var actual=that.write(string,encoding);return actual!==length&&(that=that.slice(0,actual)),that}function fromArrayLike(that,array){var length=array.length<0?0:0|checked(array.length);that=createBuffer(that,length);for(var i=0;i<length;i+=1)that[i]=255&array[i];return that}function fromArrayBuffer(that,array,byteOffset,length){if(array.byteLength,byteOffset<0||array.byteLength<byteOffset)throw new RangeError("'offset' is out of bounds");if(array.byteLength<byteOffset+(length||0))throw new RangeError("'length' is out of bounds");return array=void 0===byteOffset&&void 0===length?new Uint8Array(array):void 0===length?new Uint8Array(array,byteOffset):new Uint8Array(array,byteOffset,length),Buffer.TYPED_ARRAY_SUPPORT?(that=array,that.__proto__=Buffer.prototype):that=fromArrayLike(that,array),that}function fromObject(that,obj){if(Buffer.isBuffer(obj)){var len=0|checked(obj.length);return that=createBuffer(that,len),0===that.length?that:(obj.copy(that,0,0,len),that)}if(obj){if("undefined"!=typeof ArrayBuffer&&obj.buffer instanceof ArrayBuffer||"length"in obj)return"number"!=typeof obj.length||isnan(obj.length)?createBuffer(that,0):fromArrayLike(that,obj);if("Buffer"===obj.type&&isArray(obj.data))return fromArrayLike(that,obj.data)}throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}function checked(length){if(length>=kMaxLength())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+kMaxLength().toString(16)+" bytes");return 0|length}function SlowBuffer(length){return+length!=length&&(length=0),Buffer.alloc(+length)}function byteLength(string,encoding){if(Buffer.isBuffer(string))return string.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(string)||string instanceof ArrayBuffer))return string.byteLength;"string"!=typeof string&&(string=""+string);var len=string.length;if(0===len)return 0;for(var loweredCase=!1;;)switch(encoding){case"ascii":case"latin1":case"binary":return len;case"utf8":case"utf-8":case void 0:return utf8ToBytes(string).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*len;case"hex":return len>>>1;case"base64":return base64ToBytes(string).length;default:if(loweredCase)return utf8ToBytes(string).length;encoding=(""+encoding).toLowerCase(),loweredCase=!0}}function slowToString(encoding,start,end){var loweredCase=!1;if((void 0===start||start<0)&&(start=0),start>this.length)return"";if((void 0===end||end>this.length)&&(end=this.length),end<=0)return"";if(end>>>=0,start>>>=0,end<=start)return"";for(encoding||(encoding="utf8");;)switch(encoding){case"hex":return hexSlice(this,start,end);case"utf8":case"utf-8":return utf8Slice(this,start,end);case"ascii":return asciiSlice(this,start,end);case"latin1":case"binary":return latin1Slice(this,start,end);case"base64":return base64Slice(this,start,end);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,start,end);default:if(loweredCase)throw new TypeError("Unknown encoding: "+encoding);encoding=(encoding+"").toLowerCase(),loweredCase=!0}}function swap(b,n,m){var i=b[n];b[n]=b[m],b[m]=i}function bidirectionalIndexOf(buffer,val,byteOffset,encoding,dir){if(0===buffer.length)return-1;if("string"==typeof byteOffset?(encoding=byteOffset,byteOffset=0):byteOffset>2147483647?byteOffset=2147483647:byteOffset<-2147483648&&(byteOffset=-2147483648),byteOffset=+byteOffset,isNaN(byteOffset)&&(byteOffset=dir?0:buffer.length-1),byteOffset<0&&(byteOffset=buffer.length+byteOffset),byteOffset>=buffer.length){if(dir)return-1;byteOffset=buffer.length-1}else if(byteOffset<0){if(!dir)return-1;byteOffset=0}if("string"==typeof val&&(val=Buffer.from(val,encoding)),Buffer.isBuffer(val))return 0===val.length?-1:arrayIndexOf(buffer,val,byteOffset,encoding,dir);if("number"==typeof val)return val=255&val,Buffer.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?dir?Uint8Array.prototype.indexOf.call(buffer,val,byteOffset):Uint8Array.prototype.lastIndexOf.call(buffer,val,byteOffset):arrayIndexOf(buffer,[val],byteOffset,encoding,dir);throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(arr,val,byteOffset,encoding,dir){function read(buf,i){return 1===indexSize?buf[i]:buf.readUInt16BE(i*indexSize)}var indexSize=1,arrLength=arr.length,valLength=val.length;if(void 0!==encoding&&(encoding=String(encoding).toLowerCase(),"ucs2"===encoding||"ucs-2"===encoding||"utf16le"===encoding||"utf-16le"===encoding)){if(arr.length<2||val.length<2)return-1;indexSize=2,arrLength/=2,valLength/=2,byteOffset/=2}var i;if(dir){var foundIndex=-1;for(i=byteOffset;i<arrLength;i++)if(read(arr,i)===read(val,foundIndex===-1?0:i-foundIndex)){if(foundIndex===-1&&(foundIndex=i),i-foundIndex+1===valLength)return foundIndex*indexSize}else foundIndex!==-1&&(i-=i-foundIndex),foundIndex=-1}else for(byteOffset+valLength>arrLength&&(byteOffset=arrLength-valLength),i=byteOffset;i>=0;i--){for(var found=!0,j=0;j<valLength;j++)if(read(arr,i+j)!==read(val,j)){found=!1;break}if(found)return i}return-1}function hexWrite(buf,string,offset,length){offset=Number(offset)||0;var remaining=buf.length-offset;length?(length=Number(length),length>remaining&&(length=remaining)):length=remaining;var strLen=string.length;if(strLen%2!==0)throw new TypeError("Invalid hex string");length>strLen/2&&(length=strLen/2);for(var i=0;i<length;++i){var parsed=parseInt(string.substr(2*i,2),16);if(isNaN(parsed))return i;buf[offset+i]=parsed}return i}function utf8Write(buf,string,offset,length){return blitBuffer(utf8ToBytes(string,buf.length-offset),buf,offset,length)}function asciiWrite(buf,string,offset,length){return blitBuffer(asciiToBytes(string),buf,offset,length)}function latin1Write(buf,string,offset,length){return asciiWrite(buf,string,offset,length)}function base64Write(buf,string,offset,length){return blitBuffer(base64ToBytes(string),buf,offset,length)}function ucs2Write(buf,string,offset,length){return blitBuffer(utf16leToBytes(string,buf.length-offset),buf,offset,length)}function base64Slice(buf,start,end){return 0===start&&end===buf.length?base64.fromByteArray(buf):base64.fromByteArray(buf.slice(start,end))}function utf8Slice(buf,start,end){end=Math.min(buf.length,end);for(var res=[],i=start;i<end;){var firstByte=buf[i],codePoint=null,bytesPerSequence=firstByte>239?4:firstByte>223?3:firstByte>191?2:1;if(i+bytesPerSequence<=end){var secondByte,thirdByte,fourthByte,tempCodePoint;switch(bytesPerSequence){case 1:firstByte<128&&(codePoint=firstByte);break;case 2:secondByte=buf[i+1],128===(192&secondByte)&&(tempCodePoint=(31&firstByte)<<6|63&secondByte,tempCodePoint>127&&(codePoint=tempCodePoint));break;case 3:secondByte=buf[i+1],thirdByte=buf[i+2],128===(192&secondByte)&&128===(192&thirdByte)&&(tempCodePoint=(15&firstByte)<<12|(63&secondByte)<<6|63&thirdByte,tempCodePoint>2047&&(tempCodePoint<55296||tempCodePoint>57343)&&(codePoint=tempCodePoint));break;case 4:secondByte=buf[i+1],thirdByte=buf[i+2],fourthByte=buf[i+3],128===(192&secondByte)&&128===(192&thirdByte)&&128===(192&fourthByte)&&(tempCodePoint=(15&firstByte)<<18|(63&secondByte)<<12|(63&thirdByte)<<6|63&fourthByte,tempCodePoint>65535&&tempCodePoint<1114112&&(codePoint=tempCodePoint))}}null===codePoint?(codePoint=65533,bytesPerSequence=1):codePoint>65535&&(codePoint-=65536,res.push(codePoint>>>10&1023|55296),codePoint=56320|1023&codePoint),res.push(codePoint),i+=bytesPerSequence}return decodeCodePointsArray(res)}function decodeCodePointsArray(codePoints){var len=codePoints.length;if(len<=MAX_ARGUMENTS_LENGTH)return String.fromCharCode.apply(String,codePoints);for(var res="",i=0;i<len;)res+=String.fromCharCode.apply(String,codePoints.slice(i,i+=MAX_ARGUMENTS_LENGTH));return res}function asciiSlice(buf,start,end){var ret="";end=Math.min(buf.length,end);for(var i=start;i<end;++i)ret+=String.fromCharCode(127&buf[i]);return ret}function latin1Slice(buf,start,end){var ret="";end=Math.min(buf.length,end);for(var i=start;i<end;++i)ret+=String.fromCharCode(buf[i]);return ret}function hexSlice(buf,start,end){var len=buf.length;(!start||start<0)&&(start=0),(!end||end<0||end>len)&&(end=len);for(var out="",i=start;i<end;++i)out+=toHex(buf[i]);return out}function utf16leSlice(buf,start,end){for(var bytes=buf.slice(start,end),res="",i=0;i<bytes.length;i+=2)res+=String.fromCharCode(bytes[i]+256*bytes[i+1]);return res}function checkOffset(offset,ext,length){if(offset%1!==0||offset<0)throw new RangeError("offset is not uint");if(offset+ext>length)throw new RangeError("Trying to access beyond buffer length")}function checkInt(buf,value,offset,ext,max,min){if(!Buffer.isBuffer(buf))throw new TypeError('"buffer" argument must be a Buffer instance');if(value>max||value<min)throw new RangeError('"value" argument is out of bounds');if(offset+ext>buf.length)throw new RangeError("Index out of range")}function objectWriteUInt16(buf,value,offset,littleEndian){value<0&&(value=65535+value+1);for(var i=0,j=Math.min(buf.length-offset,2);i<j;++i)buf[offset+i]=(value&255<<8*(littleEndian?i:1-i))>>>8*(littleEndian?i:1-i)}function objectWriteUInt32(buf,value,offset,littleEndian){value<0&&(value=4294967295+value+1);for(var i=0,j=Math.min(buf.length-offset,4);i<j;++i)buf[offset+i]=value>>>8*(littleEndian?i:3-i)&255}function checkIEEE754(buf,value,offset,ext,max,min){if(offset+ext>buf.length)throw new RangeError("Index out of range");if(offset<0)throw new RangeError("Index out of range")}function writeFloat(buf,value,offset,littleEndian,noAssert){return noAssert||checkIEEE754(buf,value,offset,4,3.4028234663852886e38,-3.4028234663852886e38),ieee754.write(buf,value,offset,littleEndian,23,4),offset+4}function writeDouble(buf,value,offset,littleEndian,noAssert){return noAssert||checkIEEE754(buf,value,offset,8,1.7976931348623157e308,-1.7976931348623157e308),ieee754.write(buf,value,offset,littleEndian,52,8),offset+8}function base64clean(str){if(str=stringtrim(str).replace(INVALID_BASE64_RE,""),str.length<2)return"";for(;str.length%4!==0;)str+="=";return str}function stringtrim(str){return str.trim?str.trim():str.replace(/^\s+|\s+$/g,"")}function toHex(n){return n<16?"0"+n.toString(16):n.toString(16)}function utf8ToBytes(string,units){units=units||1/0;for(var codePoint,length=string.length,leadSurrogate=null,bytes=[],i=0;i<length;++i){if(codePoint=string.charCodeAt(i),codePoint>55295&&codePoint<57344){if(!leadSurrogate){if(codePoint>56319){(units-=3)>-1&&bytes.push(239,191,189);continue}if(i+1===length){(units-=3)>-1&&bytes.push(239,191,189);continue}leadSurrogate=codePoint;continue}if(codePoint<56320){(units-=3)>-1&&bytes.push(239,191,189),leadSurrogate=codePoint;continue}codePoint=(leadSurrogate-55296<<10|codePoint-56320)+65536}else leadSurrogate&&(units-=3)>-1&&bytes.push(239,191,189);if(leadSurrogate=null,codePoint<128){if((units-=1)<0)break;bytes.push(codePoint)}else if(codePoint<2048){if((units-=2)<0)break;bytes.push(codePoint>>6|192,63&codePoint|128)}else if(codePoint<65536){if((units-=3)<0)break;bytes.push(codePoint>>12|224,codePoint>>6&63|128,63&codePoint|128)}else{if(!(codePoint<1114112))throw new Error("Invalid code point");if((units-=4)<0)break;bytes.push(codePoint>>18|240,codePoint>>12&63|128,codePoint>>6&63|128,63&codePoint|128)}}return bytes}function asciiToBytes(str){for(var byteArray=[],i=0;i<str.length;++i)byteArray.push(255&str.charCodeAt(i));return byteArray}function utf16leToBytes(str,units){for(var c,hi,lo,byteArray=[],i=0;i<str.length&&!((units-=2)<0);++i)c=str.charCodeAt(i),hi=c>>8,lo=c%256,byteArray.push(lo),byteArray.push(hi);return byteArray}function base64ToBytes(str){return base64.toByteArray(base64clean(str))}function blitBuffer(src,dst,offset,length){for(var i=0;i<length&&!(i+offset>=dst.length||i>=src.length);++i)dst[i+offset]=src[i];return i}function isnan(val){return val!==val}var base64=__webpack_require__(453),ieee754=__webpack_require__(454),isArray=__webpack_require__(455);exports.Buffer=Buffer,exports.SlowBuffer=SlowBuffer,exports.INSPECT_MAX_BYTES=50,Buffer.TYPED_ARRAY_SUPPORT=void 0!==global.TYPED_ARRAY_SUPPORT?global.TYPED_ARRAY_SUPPORT:typedArraySupport(),exports.kMaxLength=kMaxLength(),Buffer.poolSize=8192,Buffer._augment=function(arr){return arr.__proto__=Buffer.prototype,arr},Buffer.from=function(value,encodingOrOffset,length){return from(null,value,encodingOrOffset,length)},Buffer.TYPED_ARRAY_SUPPORT&&(Buffer.prototype.__proto__=Uint8Array.prototype,Buffer.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&Buffer[Symbol.species]===Buffer&&Object.defineProperty(Buffer,Symbol.species,{value:null,configurable:!0})),Buffer.alloc=function(size,fill,encoding){return alloc(null,size,fill,encoding)},Buffer.allocUnsafe=function(size){return allocUnsafe(null,size)},Buffer.allocUnsafeSlow=function(size){return allocUnsafe(null,size)},Buffer.isBuffer=function(b){return!(null==b||!b._isBuffer)},Buffer.compare=function(a,b){if(!Buffer.isBuffer(a)||!Buffer.isBuffer(b))throw new TypeError("Arguments must be Buffers");if(a===b)return 0;for(var x=a.length,y=b.length,i=0,len=Math.min(x,y);i<len;++i)if(a[i]!==b[i]){x=a[i],y=b[i];break}return x<y?-1:y<x?1:0},Buffer.isEncoding=function(encoding){switch(String(encoding).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},Buffer.concat=function(list,length){if(!isArray(list))throw new TypeError('"list" argument must be an Array of Buffers');if(0===list.length)return Buffer.alloc(0);var i;if(void 0===length)for(length=0,i=0;i<list.length;++i)length+=list[i].length;var buffer=Buffer.allocUnsafe(length),pos=0;for(i=0;i<list.length;++i){var buf=list[i];if(!Buffer.isBuffer(buf))throw new TypeError('"list" argument must be an Array of Buffers');buf.copy(buffer,pos),pos+=buf.length}return buffer},Buffer.byteLength=byteLength,Buffer.prototype._isBuffer=!0,Buffer.prototype.swap16=function(){var len=this.length;if(len%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var i=0;i<len;i+=2)swap(this,i,i+1);return this},Buffer.prototype.swap32=function(){var len=this.length;if(len%4!==0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var i=0;i<len;i+=4)swap(this,i,i+3),swap(this,i+1,i+2);return this},Buffer.prototype.swap64=function(){var len=this.length;if(len%8!==0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var i=0;i<len;i+=8)swap(this,i,i+7),swap(this,i+1,i+6),swap(this,i+2,i+5),swap(this,i+3,i+4);return this},Buffer.prototype.toString=function(){var length=0|this.length;return 0===length?"":0===arguments.length?utf8Slice(this,0,length):slowToString.apply(this,arguments)},Buffer.prototype.equals=function(b){if(!Buffer.isBuffer(b))throw new TypeError("Argument must be a Buffer");return this===b||0===Buffer.compare(this,b)},Buffer.prototype.inspect=function(){var str="",max=exports.INSPECT_MAX_BYTES;return this.length>0&&(str=this.toString("hex",0,max).match(/.{2}/g).join(" "),this.length>max&&(str+=" ... ")),"<Buffer "+str+">"},Buffer.prototype.compare=function(target,start,end,thisStart,thisEnd){if(!Buffer.isBuffer(target))throw new TypeError("Argument must be a Buffer");if(void 0===start&&(start=0),void 0===end&&(end=target?target.length:0),void 0===thisStart&&(thisStart=0),void 0===thisEnd&&(thisEnd=this.length),start<0||end>target.length||thisStart<0||thisEnd>this.length)throw new RangeError("out of range index");if(thisStart>=thisEnd&&start>=end)return 0;if(thisStart>=thisEnd)return-1;if(start>=end)return 1;if(start>>>=0,end>>>=0,thisStart>>>=0,thisEnd>>>=0,this===target)return 0;for(var x=thisEnd-thisStart,y=end-start,len=Math.min(x,y),thisCopy=this.slice(thisStart,thisEnd),targetCopy=target.slice(start,end),i=0;i<len;++i)if(thisCopy[i]!==targetCopy[i]){x=thisCopy[i],y=targetCopy[i];break}return x<y?-1:y<x?1:0},Buffer.prototype.includes=function(val,byteOffset,encoding){return this.indexOf(val,byteOffset,encoding)!==-1},Buffer.prototype.indexOf=function(val,byteOffset,encoding){return bidirectionalIndexOf(this,val,byteOffset,encoding,!0)},Buffer.prototype.lastIndexOf=function(val,byteOffset,encoding){return bidirectionalIndexOf(this,val,byteOffset,encoding,!1)},Buffer.prototype.write=function(string,offset,length,encoding){if(void 0===offset)encoding="utf8",length=this.length,offset=0;else if(void 0===length&&"string"==typeof offset)encoding=offset,length=this.length,offset=0;else{if(!isFinite(offset))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");offset=0|offset,isFinite(length)?(length=0|length,void 0===encoding&&(encoding="utf8")):(encoding=length,length=void 0)}var remaining=this.length-offset;if((void 0===length||length>remaining)&&(length=remaining),string.length>0&&(length<0||offset<0)||offset>this.length)throw new RangeError("Attempt to write outside buffer bounds");encoding||(encoding="utf8");for(var loweredCase=!1;;)switch(encoding){case"hex":return hexWrite(this,string,offset,length);case"utf8":case"utf-8":return utf8Write(this,string,offset,length);case"ascii":return asciiWrite(this,string,offset,length);case"latin1":case"binary":return latin1Write(this,string,offset,length);case"base64":return base64Write(this,string,offset,length);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,string,offset,length);default:if(loweredCase)throw new TypeError("Unknown encoding: "+encoding);encoding=(""+encoding).toLowerCase(),loweredCase=!0}},Buffer.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var MAX_ARGUMENTS_LENGTH=4096;Buffer.prototype.slice=function(start,end){var len=this.length;start=~~start,end=void 0===end?len:~~end,start<0?(start+=len,start<0&&(start=0)):start>len&&(start=len),end<0?(end+=len,end<0&&(end=0)):end>len&&(end=len),end<start&&(end=start);var newBuf;if(Buffer.TYPED_ARRAY_SUPPORT)newBuf=this.subarray(start,end),newBuf.__proto__=Buffer.prototype;else{var sliceLen=end-start;newBuf=new Buffer(sliceLen,(void 0));for(var i=0;i<sliceLen;++i)newBuf[i]=this[i+start]}return newBuf},Buffer.prototype.readUIntLE=function(offset,byteLength,noAssert){offset=0|offset,byteLength=0|byteLength,noAssert||checkOffset(offset,byteLength,this.length);for(var val=this[offset],mul=1,i=0;++i<byteLength&&(mul*=256);)val+=this[offset+i]*mul;return val},Buffer.prototype.readUIntBE=function(offset,byteLength,noAssert){offset=0|offset,byteLength=0|byteLength,noAssert||checkOffset(offset,byteLength,this.length);for(var val=this[offset+--byteLength],mul=1;byteLength>0&&(mul*=256);)val+=this[offset+--byteLength]*mul;return val},Buffer.prototype.readUInt8=function(offset,noAssert){return noAssert||checkOffset(offset,1,this.length),this[offset]},Buffer.prototype.readUInt16LE=function(offset,noAssert){return noAssert||checkOffset(offset,2,this.length),this[offset]|this[offset+1]<<8},Buffer.prototype.readUInt16BE=function(offset,noAssert){return noAssert||checkOffset(offset,2,this.length),this[offset]<<8|this[offset+1]},Buffer.prototype.readUInt32LE=function(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),(this[offset]|this[offset+1]<<8|this[offset+2]<<16)+16777216*this[offset+3]},Buffer.prototype.readUInt32BE=function(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),16777216*this[offset]+(this[offset+1]<<16|this[offset+2]<<8|this[offset+3])},Buffer.prototype.readIntLE=function(offset,byteLength,noAssert){offset=0|offset,byteLength=0|byteLength,noAssert||checkOffset(offset,byteLength,this.length);for(var val=this[offset],mul=1,i=0;++i<byteLength&&(mul*=256);)val+=this[offset+i]*mul;return mul*=128,val>=mul&&(val-=Math.pow(2,8*byteLength)),val},Buffer.prototype.readIntBE=function(offset,byteLength,noAssert){offset=0|offset,byteLength=0|byteLength,noAssert||checkOffset(offset,byteLength,this.length);for(var i=byteLength,mul=1,val=this[offset+--i];i>0&&(mul*=256);)val+=this[offset+--i]*mul;return mul*=128,val>=mul&&(val-=Math.pow(2,8*byteLength)),val},Buffer.prototype.readInt8=function(offset,noAssert){return noAssert||checkOffset(offset,1,this.length),128&this[offset]?(255-this[offset]+1)*-1:this[offset]},Buffer.prototype.readInt16LE=function(offset,noAssert){noAssert||checkOffset(offset,2,this.length);var val=this[offset]|this[offset+1]<<8;
return 32768&val?4294901760|val:val},Buffer.prototype.readInt16BE=function(offset,noAssert){noAssert||checkOffset(offset,2,this.length);var val=this[offset+1]|this[offset]<<8;return 32768&val?4294901760|val:val},Buffer.prototype.readInt32LE=function(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),this[offset]|this[offset+1]<<8|this[offset+2]<<16|this[offset+3]<<24},Buffer.prototype.readInt32BE=function(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),this[offset]<<24|this[offset+1]<<16|this[offset+2]<<8|this[offset+3]},Buffer.prototype.readFloatLE=function(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),ieee754.read(this,offset,!0,23,4)},Buffer.prototype.readFloatBE=function(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),ieee754.read(this,offset,!1,23,4)},Buffer.prototype.readDoubleLE=function(offset,noAssert){return noAssert||checkOffset(offset,8,this.length),ieee754.read(this,offset,!0,52,8)},Buffer.prototype.readDoubleBE=function(offset,noAssert){return noAssert||checkOffset(offset,8,this.length),ieee754.read(this,offset,!1,52,8)},Buffer.prototype.writeUIntLE=function(value,offset,byteLength,noAssert){if(value=+value,offset=0|offset,byteLength=0|byteLength,!noAssert){var maxBytes=Math.pow(2,8*byteLength)-1;checkInt(this,value,offset,byteLength,maxBytes,0)}var mul=1,i=0;for(this[offset]=255&value;++i<byteLength&&(mul*=256);)this[offset+i]=value/mul&255;return offset+byteLength},Buffer.prototype.writeUIntBE=function(value,offset,byteLength,noAssert){if(value=+value,offset=0|offset,byteLength=0|byteLength,!noAssert){var maxBytes=Math.pow(2,8*byteLength)-1;checkInt(this,value,offset,byteLength,maxBytes,0)}var i=byteLength-1,mul=1;for(this[offset+i]=255&value;--i>=0&&(mul*=256);)this[offset+i]=value/mul&255;return offset+byteLength},Buffer.prototype.writeUInt8=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,1,255,0),Buffer.TYPED_ARRAY_SUPPORT||(value=Math.floor(value)),this[offset]=255&value,offset+1},Buffer.prototype.writeUInt16LE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,2,65535,0),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=255&value,this[offset+1]=value>>>8):objectWriteUInt16(this,value,offset,!0),offset+2},Buffer.prototype.writeUInt16BE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,2,65535,0),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=value>>>8,this[offset+1]=255&value):objectWriteUInt16(this,value,offset,!1),offset+2},Buffer.prototype.writeUInt32LE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,4,4294967295,0),Buffer.TYPED_ARRAY_SUPPORT?(this[offset+3]=value>>>24,this[offset+2]=value>>>16,this[offset+1]=value>>>8,this[offset]=255&value):objectWriteUInt32(this,value,offset,!0),offset+4},Buffer.prototype.writeUInt32BE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,4,4294967295,0),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=value>>>24,this[offset+1]=value>>>16,this[offset+2]=value>>>8,this[offset+3]=255&value):objectWriteUInt32(this,value,offset,!1),offset+4},Buffer.prototype.writeIntLE=function(value,offset,byteLength,noAssert){if(value=+value,offset=0|offset,!noAssert){var limit=Math.pow(2,8*byteLength-1);checkInt(this,value,offset,byteLength,limit-1,-limit)}var i=0,mul=1,sub=0;for(this[offset]=255&value;++i<byteLength&&(mul*=256);)value<0&&0===sub&&0!==this[offset+i-1]&&(sub=1),this[offset+i]=(value/mul>>0)-sub&255;return offset+byteLength},Buffer.prototype.writeIntBE=function(value,offset,byteLength,noAssert){if(value=+value,offset=0|offset,!noAssert){var limit=Math.pow(2,8*byteLength-1);checkInt(this,value,offset,byteLength,limit-1,-limit)}var i=byteLength-1,mul=1,sub=0;for(this[offset+i]=255&value;--i>=0&&(mul*=256);)value<0&&0===sub&&0!==this[offset+i+1]&&(sub=1),this[offset+i]=(value/mul>>0)-sub&255;return offset+byteLength},Buffer.prototype.writeInt8=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,1,127,-128),Buffer.TYPED_ARRAY_SUPPORT||(value=Math.floor(value)),value<0&&(value=255+value+1),this[offset]=255&value,offset+1},Buffer.prototype.writeInt16LE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,2,32767,-32768),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=255&value,this[offset+1]=value>>>8):objectWriteUInt16(this,value,offset,!0),offset+2},Buffer.prototype.writeInt16BE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,2,32767,-32768),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=value>>>8,this[offset+1]=255&value):objectWriteUInt16(this,value,offset,!1),offset+2},Buffer.prototype.writeInt32LE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,4,2147483647,-2147483648),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=255&value,this[offset+1]=value>>>8,this[offset+2]=value>>>16,this[offset+3]=value>>>24):objectWriteUInt32(this,value,offset,!0),offset+4},Buffer.prototype.writeInt32BE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,4,2147483647,-2147483648),value<0&&(value=4294967295+value+1),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=value>>>24,this[offset+1]=value>>>16,this[offset+2]=value>>>8,this[offset+3]=255&value):objectWriteUInt32(this,value,offset,!1),offset+4},Buffer.prototype.writeFloatLE=function(value,offset,noAssert){return writeFloat(this,value,offset,!0,noAssert)},Buffer.prototype.writeFloatBE=function(value,offset,noAssert){return writeFloat(this,value,offset,!1,noAssert)},Buffer.prototype.writeDoubleLE=function(value,offset,noAssert){return writeDouble(this,value,offset,!0,noAssert)},Buffer.prototype.writeDoubleBE=function(value,offset,noAssert){return writeDouble(this,value,offset,!1,noAssert)},Buffer.prototype.copy=function(target,targetStart,start,end){if(start||(start=0),end||0===end||(end=this.length),targetStart>=target.length&&(targetStart=target.length),targetStart||(targetStart=0),end>0&&end<start&&(end=start),end===start)return 0;if(0===target.length||0===this.length)return 0;if(targetStart<0)throw new RangeError("targetStart out of bounds");if(start<0||start>=this.length)throw new RangeError("sourceStart out of bounds");if(end<0)throw new RangeError("sourceEnd out of bounds");end>this.length&&(end=this.length),target.length-targetStart<end-start&&(end=target.length-targetStart+start);var i,len=end-start;if(this===target&&start<targetStart&&targetStart<end)for(i=len-1;i>=0;--i)target[i+targetStart]=this[i+start];else if(len<1e3||!Buffer.TYPED_ARRAY_SUPPORT)for(i=0;i<len;++i)target[i+targetStart]=this[i+start];else Uint8Array.prototype.set.call(target,this.subarray(start,start+len),targetStart);return len},Buffer.prototype.fill=function(val,start,end,encoding){if("string"==typeof val){if("string"==typeof start?(encoding=start,start=0,end=this.length):"string"==typeof end&&(encoding=end,end=this.length),1===val.length){var code=val.charCodeAt(0);code<256&&(val=code)}if(void 0!==encoding&&"string"!=typeof encoding)throw new TypeError("encoding must be a string");if("string"==typeof encoding&&!Buffer.isEncoding(encoding))throw new TypeError("Unknown encoding: "+encoding)}else"number"==typeof val&&(val=255&val);if(start<0||this.length<start||this.length<end)throw new RangeError("Out of range index");if(end<=start)return this;start>>>=0,end=void 0===end?this.length:end>>>0,val||(val=0);var i;if("number"==typeof val)for(i=start;i<end;++i)this[i]=val;else{var bytes=Buffer.isBuffer(val)?val:utf8ToBytes(new Buffer(val,encoding).toString()),len=bytes.length;for(i=0;i<end-start;++i)this[i+start]=bytes[i%len]}return this};var INVALID_BASE64_RE=/[^+\/0-9A-Za-z-_]/g}).call(exports,__webpack_require__(12).Buffer,__webpack_require__(4))},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Observable_1=__webpack_require__(0),ScalarObservable_1=__webpack_require__(51),EmptyObservable_1=__webpack_require__(17),isScheduler_1=__webpack_require__(15),ArrayObservable=function(_super){function ArrayObservable(array,scheduler){_super.call(this),this.array=array,this.scheduler=scheduler,scheduler||1!==array.length||(this._isScalar=!0,this.value=array[0])}return __extends(ArrayObservable,_super),ArrayObservable.create=function(array,scheduler){return new ArrayObservable(array,scheduler)},ArrayObservable.of=function(){for(var array=[],_i=0;_i<arguments.length;_i++)array[_i-0]=arguments[_i];var scheduler=array[array.length-1];isScheduler_1.isScheduler(scheduler)?array.pop():scheduler=null;var len=array.length;return len>1?new ArrayObservable(array,scheduler):1===len?new ScalarObservable_1.ScalarObservable(array[0],scheduler):new EmptyObservable_1.EmptyObservable(scheduler)},ArrayObservable.dispatch=function(state){var array=state.array,index=state.index,count=state.count,subscriber=state.subscriber;return index>=count?void subscriber.complete():(subscriber.next(array[index]),void(subscriber.closed||(state.index=index+1,this.schedule(state))))},ArrayObservable.prototype._subscribe=function(subscriber){var index=0,array=this.array,count=array.length,scheduler=this.scheduler;if(scheduler)return scheduler.schedule(ArrayObservable.dispatch,0,{array:array,index:index,count:count,subscriber:subscriber});for(var i=0;i<count&&!subscriber.closed;i++)subscriber.next(array[i]);subscriber.complete()},ArrayObservable}(Observable_1.Observable);exports.ArrayObservable=ArrayObservable},function(module,exports){"use strict";exports.isArray=Array.isArray||function(x){return x&&"number"==typeof x.length}},function(module,exports){"use strict";function isScheduler(value){return value&&"function"==typeof value.schedule}exports.isScheduler=isScheduler},function(module,exports){function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(fun){if(cachedSetTimeout===setTimeout)return setTimeout(fun,0);if((cachedSetTimeout===defaultSetTimout||!cachedSetTimeout)&&setTimeout)return cachedSetTimeout=setTimeout,setTimeout(fun,0);try{return cachedSetTimeout(fun,0)}catch(e){try{return cachedSetTimeout.call(null,fun,0)}catch(e){return cachedSetTimeout.call(this,fun,0)}}}function runClearTimeout(marker){if(cachedClearTimeout===clearTimeout)return clearTimeout(marker);if((cachedClearTimeout===defaultClearTimeout||!cachedClearTimeout)&&clearTimeout)return cachedClearTimeout=clearTimeout,clearTimeout(marker);try{return cachedClearTimeout(marker)}catch(e){try{return cachedClearTimeout.call(null,marker)}catch(e){return cachedClearTimeout.call(this,marker)}}}function cleanUpNextTick(){draining&&currentQueue&&(draining=!1,currentQueue.length?queue=currentQueue.concat(queue):queueIndex=-1,queue.length&&drainQueue())}function drainQueue(){if(!draining){var timeout=runTimeout(cleanUpNextTick);draining=!0;for(var len=queue.length;len;){for(currentQueue=queue,queue=[];++queueIndex<len;)currentQueue&&currentQueue[queueIndex].run();queueIndex=-1,len=queue.length}currentQueue=null,draining=!1,runClearTimeout(timeout)}}function Item(fun,array){this.fun=fun,this.array=array}function noop(){}var cachedSetTimeout,cachedClearTimeout,process=module.exports={};!function(){try{cachedSetTimeout="function"==typeof setTimeout?setTimeout:defaultSetTimout}catch(e){cachedSetTimeout=defaultSetTimout}try{cachedClearTimeout="function"==typeof clearTimeout?clearTimeout:defaultClearTimeout}catch(e){cachedClearTimeout=defaultClearTimeout}}();var currentQueue,queue=[],draining=!1,queueIndex=-1;process.nextTick=function(fun){var args=new Array(arguments.length-1);if(arguments.length>1)for(var i=1;i<arguments.length;i++)args[i-1]=arguments[i];queue.push(new Item(fun,args)),1!==queue.length||draining||runTimeout(drainQueue)},Item.prototype.run=function(){this.fun.apply(null,this.array)},process.title="browser",process.browser=!0,process.env={},process.argv=[],process.version="",process.versions={},process.on=noop,process.addListener=noop,process.once=noop,process.off=noop,process.removeListener=noop,process.removeAllListeners=noop,process.emit=noop,process.binding=function(name){throw new Error("process.binding is not supported")},process.cwd=function(){return"/"},process.chdir=function(dir){throw new Error("process.chdir is not supported")},process.umask=function(){return 0}},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Observable_1=__webpack_require__(0),EmptyObservable=function(_super){function EmptyObservable(scheduler){_super.call(this),this.scheduler=scheduler}return __extends(EmptyObservable,_super),EmptyObservable.create=function(scheduler){return new EmptyObservable(scheduler)},EmptyObservable.dispatch=function(arg){var subscriber=arg.subscriber;subscriber.complete()},EmptyObservable.prototype._subscribe=function(subscriber){var scheduler=this.scheduler;return scheduler?scheduler.schedule(EmptyObservable.dispatch,0,{subscriber:subscriber}):void subscriber.complete()},EmptyObservable}(Observable_1.Observable);exports.EmptyObservable=EmptyObservable},function(module,exports,__webpack_require__){(function(process){function useColors(){return"undefined"!=typeof document&&"WebkitAppearance"in document.documentElement.style||window.console&&(console.firebug||console.exception&&console.table)||navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31}function formatArgs(){var args=arguments,useColors=this.useColors;if(args[0]=(useColors?"%c":"")+this.namespace+(useColors?" %c":" ")+args[0]+(useColors?"%c ":" ")+"+"+exports.humanize(this.diff),!useColors)return args;var c="color: "+this.color;args=[args[0],c,"color: inherit"].concat(Array.prototype.slice.call(args,1));var index=0,lastC=0;return args[0].replace(/%[a-z%]/g,function(match){"%%"!==match&&(index++,"%c"===match&&(lastC=index))}),args.splice(lastC,0,c),args}function log(){return"object"==typeof console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}function save(namespaces){try{null==namespaces?exports.storage.removeItem("debug"):exports.storage.debug=namespaces}catch(e){}}function load(){try{return exports.storage.debug}catch(e){}if("undefined"!=typeof process&&"env"in process)return process.env.DEBUG}function localstorage(){try{return window.localStorage}catch(e){}}exports=module.exports=__webpack_require__(427),exports.log=log,exports.formatArgs=formatArgs,exports.save=save,exports.load=load,exports.useColors=useColors,exports.storage="undefined"!=typeof chrome&&"undefined"!=typeof chrome.storage?chrome.storage.local:localstorage(),exports.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],exports.formatters.j=function(v){try{return JSON.stringify(v)}catch(err){return"[UnexpectedJSONParseError]: "+err.message}},exports.enable(load())}).call(exports,__webpack_require__(16))},function(module,exports,__webpack_require__){"use strict";function Duplex(options){return this instanceof Duplex?(Readable.call(this,options),Writable.call(this,options),options&&options.readable===!1&&(this.readable=!1),options&&options.writable===!1&&(this.writable=!1),this.allowHalfOpen=!0,options&&options.allowHalfOpen===!1&&(this.allowHalfOpen=!1),void this.once("end",onend)):new Duplex(options)}function onend(){this.allowHalfOpen||this._writableState.ended||processNextTick(onEndNT,this)}function onEndNT(self){self.end()}var objectKeys=Object.keys||function(obj){var keys=[];for(var key in obj)keys.push(key);return keys};module.exports=Duplex;var processNextTick=__webpack_require__(66),util=__webpack_require__(27);util.inherits=__webpack_require__(28);var Readable=__webpack_require__(111),Writable=__webpack_require__(64);util.inherits(Duplex,Readable);for(var keys=objectKeys(Writable.prototype),v=0;v<keys.length;v++){var method=keys[v];Duplex.prototype[method]||(Duplex.prototype[method]=Writable.prototype[method])}},function(module,exports,__webpack_require__){"use strict";function multicast(subjectOrSubjectFactory,selector){var subjectFactory;if(subjectFactory="function"==typeof subjectOrSubjectFactory?subjectOrSubjectFactory:function(){return subjectOrSubjectFactory},"function"==typeof selector)return this.lift(new MulticastOperator(subjectFactory,selector));var connectable=Object.create(this,ConnectableObservable_1.connectableObservableDescriptor);return connectable.source=this,connectable.subjectFactory=subjectFactory,connectable}var ConnectableObservable_1=__webpack_require__(73);exports.multicast=multicast;var MulticastOperator=function(){function MulticastOperator(subjectFactory,selector){this.subjectFactory=subjectFactory,this.selector=selector}return MulticastOperator.prototype.call=function(subscriber,source){var selector=this.selector,subject=this.subjectFactory(),subscription=selector(subject).subscribe(subscriber);return subscription.add(source.subscribe(subject)),subscription},MulticastOperator}();exports.MulticastOperator=MulticastOperator},function(module,exports,__webpack_require__){(function(global){function encodeBase64Object(packet,callback){var message="b"+exports.packets[packet.type]+packet.data.data;return callback(message)}function encodeArrayBuffer(packet,supportsBinary,callback){if(!supportsBinary)return exports.encodeBase64Packet(packet,callback);var data=packet.data,contentArray=new Uint8Array(data),resultBuffer=new Uint8Array(1+data.byteLength);resultBuffer[0]=packets[packet.type];for(var i=0;i<contentArray.length;i++)resultBuffer[i+1]=contentArray[i];return callback(resultBuffer.buffer)}function encodeBlobAsArrayBuffer(packet,supportsBinary,callback){if(!supportsBinary)return exports.encodeBase64Packet(packet,callback);var fr=new FileReader;return fr.onload=function(){packet.data=fr.result,exports.encodePacket(packet,supportsBinary,!0,callback)},fr.readAsArrayBuffer(packet.data)}function encodeBlob(packet,supportsBinary,callback){if(!supportsBinary)return exports.encodeBase64Packet(packet,callback);if(dontSendBlobs)return encodeBlobAsArrayBuffer(packet,supportsBinary,callback);var length=new Uint8Array(1);length[0]=packets[packet.type];var blob=new Blob([length.buffer,packet.data]);return callback(blob)}function tryDecode(data){try{data=utf8.decode(data)}catch(e){return!1}return data}function map(ary,each,done){for(var result=new Array(ary.length),next=after(ary.length,done),eachWithIndex=function(i,el,cb){each(el,function(error,msg){result[i]=msg,cb(error,result)})},i=0;i<ary.length;i++)eachWithIndex(i,ary[i],next)}var base64encoder,keys=__webpack_require__(435),hasBinary=__webpack_require__(106),sliceBuffer=__webpack_require__(437),after=__webpack_require__(436),utf8=__webpack_require__(440);global&&global.ArrayBuffer&&(base64encoder=__webpack_require__(438));var isAndroid="undefined"!=typeof navigator&&/Android/i.test(navigator.userAgent),isPhantomJS="undefined"!=typeof navigator&&/PhantomJS/i.test(navigator.userAgent),dontSendBlobs=isAndroid||isPhantomJS;exports.protocol=3;var packets=exports.packets={open:0,close:1,ping:2,pong:3,message:4,upgrade:5,noop:6},packetslist=keys(packets),err={type:"error",data:"parser error"},Blob=__webpack_require__(439);exports.encodePacket=function(packet,supportsBinary,utf8encode,callback){"function"==typeof supportsBinary&&(callback=supportsBinary,supportsBinary=!1),"function"==typeof utf8encode&&(callback=utf8encode,utf8encode=null);var data=void 0===packet.data?void 0:packet.data.buffer||packet.data;if(global.ArrayBuffer&&data instanceof ArrayBuffer)return encodeArrayBuffer(packet,supportsBinary,callback);if(Blob&&data instanceof global.Blob)return encodeBlob(packet,supportsBinary,callback);if(data&&data.base64)return encodeBase64Object(packet,callback);var encoded=packets[packet.type];return void 0!==packet.data&&(encoded+=utf8encode?utf8.encode(String(packet.data)):String(packet.data)),callback(""+encoded)},exports.encodeBase64Packet=function(packet,callback){var message="b"+exports.packets[packet.type];if(Blob&&packet.data instanceof global.Blob){var fr=new FileReader;return fr.onload=function(){var b64=fr.result.split(",")[1];callback(message+b64)},fr.readAsDataURL(packet.data)}var b64data;try{b64data=String.fromCharCode.apply(null,new Uint8Array(packet.data))}catch(e){for(var typed=new Uint8Array(packet.data),basic=new Array(typed.length),i=0;i<typed.length;i++)basic[i]=typed[i];b64data=String.fromCharCode.apply(null,basic)}return message+=global.btoa(b64data),callback(message)},exports.decodePacket=function(data,binaryType,utf8decode){if(void 0===data)return err;if("string"==typeof data){if("b"==data.charAt(0))return exports.decodeBase64Packet(data.substr(1),binaryType);if(utf8decode&&(data=tryDecode(data),data===!1))return err;var type=data.charAt(0);return Number(type)==type&&packetslist[type]?data.length>1?{type:packetslist[type],data:data.substring(1)}:{type:packetslist[type]}:err}var asArray=new Uint8Array(data),type=asArray[0],rest=sliceBuffer(data,1);return Blob&&"blob"===binaryType&&(rest=new Blob([rest])),{type:packetslist[type],data:rest}},exports.decodeBase64Packet=function(msg,binaryType){var type=packetslist[msg.charAt(0)];if(!base64encoder)return{type:type,data:{base64:!0,data:msg.substr(1)}};var data=base64encoder.decode(msg.substr(1));return"blob"===binaryType&&Blob&&(data=new Blob([data])),{type:type,data:data}},exports.encodePayload=function(packets,supportsBinary,callback){function setLengthHeader(message){return message.length+":"+message}function encodeOne(packet,doneCallback){exports.encodePacket(packet,!!isBinary&&supportsBinary,!0,function(message){doneCallback(null,setLengthHeader(message))})}"function"==typeof supportsBinary&&(callback=supportsBinary,supportsBinary=null);var isBinary=hasBinary(packets);return supportsBinary&&isBinary?Blob&&!dontSendBlobs?exports.encodePayloadAsBlob(packets,callback):exports.encodePayloadAsArrayBuffer(packets,callback):packets.length?void map(packets,encodeOne,function(err,results){return callback(results.join(""))}):callback("0:")},exports.decodePayload=function(data,binaryType,callback){if("string"!=typeof data)return exports.decodePayloadAsBinary(data,binaryType,callback);"function"==typeof binaryType&&(callback=binaryType,binaryType=null);var packet;if(""==data)return callback(err,0,1);for(var n,msg,length="",i=0,l=data.length;i<l;i++){var chr=data.charAt(i);if(":"!=chr)length+=chr;else{if(""==length||length!=(n=Number(length)))return callback(err,0,1);if(msg=data.substr(i+1,n),length!=msg.length)return callback(err,0,1);if(msg.length){if(packet=exports.decodePacket(msg,binaryType,!0),err.type==packet.type&&err.data==packet.data)return callback(err,0,1);var ret=callback(packet,i+n,l);if(!1===ret)return}i+=n,length=""}}return""!=length?callback(err,0,1):void 0},exports.encodePayloadAsArrayBuffer=function(packets,callback){function encodeOne(packet,doneCallback){exports.encodePacket(packet,!0,!0,function(data){return doneCallback(null,data)})}return packets.length?void map(packets,encodeOne,function(err,encodedPackets){var totalLength=encodedPackets.reduce(function(acc,p){var len;return len="string"==typeof p?p.length:p.byteLength,acc+len.toString().length+len+2},0),resultArray=new Uint8Array(totalLength),bufferIndex=0;return encodedPackets.forEach(function(p){var isString="string"==typeof p,ab=p;if(isString){for(var view=new Uint8Array(p.length),i=0;i<p.length;i++)view[i]=p.charCodeAt(i);ab=view.buffer}isString?resultArray[bufferIndex++]=0:resultArray[bufferIndex++]=1;for(var lenStr=ab.byteLength.toString(),i=0;i<lenStr.length;i++)resultArray[bufferIndex++]=parseInt(lenStr[i]);resultArray[bufferIndex++]=255;for(var view=new Uint8Array(ab),i=0;i<view.length;i++)resultArray[bufferIndex++]=view[i]}),callback(resultArray.buffer)}):callback(new ArrayBuffer(0))},exports.encodePayloadAsBlob=function(packets,callback){function encodeOne(packet,doneCallback){exports.encodePacket(packet,!0,!0,function(encoded){var binaryIdentifier=new Uint8Array(1);if(binaryIdentifier[0]=1,"string"==typeof encoded){for(var view=new Uint8Array(encoded.length),i=0;i<encoded.length;i++)view[i]=encoded.charCodeAt(i);encoded=view.buffer,binaryIdentifier[0]=0}for(var len=encoded instanceof ArrayBuffer?encoded.byteLength:encoded.size,lenStr=len.toString(),lengthAry=new Uint8Array(lenStr.length+1),i=0;i<lenStr.length;i++)lengthAry[i]=parseInt(lenStr[i]);if(lengthAry[lenStr.length]=255,Blob){var blob=new Blob([binaryIdentifier.buffer,lengthAry.buffer,encoded]);doneCallback(null,blob)}})}map(packets,encodeOne,function(err,results){return callback(new Blob(results))})},exports.decodePayloadAsBinary=function(data,binaryType,callback){"function"==typeof binaryType&&(callback=binaryType,binaryType=null);for(var bufferTail=data,buffers=[],numberTooLong=!1;bufferTail.byteLength>0;){for(var tailArray=new Uint8Array(bufferTail),isString=0===tailArray[0],msgLength="",i=1;255!=tailArray[i];i++){if(msgLength.length>310){numberTooLong=!0;break}msgLength+=tailArray[i]}if(numberTooLong)return callback(err,0,1);bufferTail=sliceBuffer(bufferTail,2+msgLength.length),msgLength=parseInt(msgLength);var msg=sliceBuffer(bufferTail,0,msgLength);if(isString)try{msg=String.fromCharCode.apply(null,new Uint8Array(msg))}catch(e){var typed=new Uint8Array(msg);msg="";for(var i=0;i<typed.length;i++)msg+=String.fromCharCode(typed[i])}buffers.push(msg),bufferTail=sliceBuffer(bufferTail,msgLength)}var total=buffers.length;buffers.forEach(function(buffer,i){callback(exports.decodePacket(buffer,binaryType,!0),i,total)})}}).call(exports,__webpack_require__(4))},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),Notification=function(){function Notification(kind,value,error){this.kind=kind,this.value=value,this.error=error,this.hasValue="N"===kind}return Notification.prototype.observe=function(observer){switch(this.kind){case"N":return observer.next&&observer.next(this.value);case"E":return observer.error&&observer.error(this.error);case"C":return observer.complete&&observer.complete()}},Notification.prototype["do"]=function(next,error,complete){var kind=this.kind;switch(kind){case"N":return next&&next(this.value);case"E":return error&&error(this.error);case"C":return complete&&complete()}},Notification.prototype.accept=function(nextOrObserver,error,complete){return nextOrObserver&&"function"==typeof nextOrObserver.next?this.observe(nextOrObserver):this["do"](nextOrObserver,error,complete)},Notification.prototype.toObservable=function(){var kind=this.kind;switch(kind){case"N":return Observable_1.Observable.of(this.value);case"E":return Observable_1.Observable["throw"](this.error);case"C":return Observable_1.Observable.empty()}throw new Error("unexpected notification kind value")},Notification.createNext=function(value){return"undefined"!=typeof value?new Notification("N",value):this.undefinedValueNotification},Notification.createError=function(err){return new Notification("E",(void 0),err)},Notification.createComplete=function(){return this.completeNotification},Notification.completeNotification=new Notification("C"),Notification.undefinedValueNotification=new Notification("N",(void 0)),Notification}();exports.Notification=Notification},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},root_1=__webpack_require__(8),Action_1=__webpack_require__(405),AsyncAction=function(_super){function AsyncAction(scheduler,work){_super.call(this,scheduler,work),this.scheduler=scheduler,this.work=work,this.pending=!1}return __extends(AsyncAction,_super),AsyncAction.prototype.schedule=function(state,delay){if(void 0===delay&&(delay=0),this.closed)return this;this.state=state,this.pending=!0;var id=this.id,scheduler=this.scheduler;return null!=id&&(this.id=this.recycleAsyncId(scheduler,id,delay)),this.delay=delay,this.id=this.id||this.requestAsyncId(scheduler,this.id,delay),this},AsyncAction.prototype.requestAsyncId=function(scheduler,id,delay){return void 0===delay&&(delay=0),root_1.root.setInterval(scheduler.flush.bind(scheduler,this),delay)},AsyncAction.prototype.recycleAsyncId=function(scheduler,id,delay){return void 0===delay&&(delay=0),null!==delay&&this.delay===delay?id:root_1.root.clearInterval(id)&&void 0||void 0},AsyncAction.prototype.execute=function(state,delay){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var error=this._execute(state,delay);return error?error:void(this.pending===!1&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null)))},AsyncAction.prototype._execute=function(state,delay){var errored=!1,errorValue=void 0;try{this.work(state)}catch(e){errored=!0,errorValue=!!e&&e||new Error(e)}if(errored)return this.unsubscribe(),errorValue},AsyncAction.prototype._unsubscribe=function(){var id=this.id,scheduler=this.scheduler,actions=scheduler.actions,index=actions.indexOf(this);this.work=null,this.delay=null,this.state=null,this.pending=!1,this.scheduler=null,index!==-1&&actions.splice(index,1),null!=id&&(this.id=this.recycleAsyncId(scheduler,id,null))},AsyncAction}(Action_1.Action);exports.AsyncAction=AsyncAction},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Scheduler_1=__webpack_require__(152),AsyncScheduler=function(_super){function AsyncScheduler(){_super.apply(this,arguments),this.actions=[],this.active=!1,this.scheduled=void 0}return __extends(AsyncScheduler,_super),AsyncScheduler.prototype.flush=function(action){var actions=this.actions;if(this.active)return void actions.push(action);var error;this.active=!0;do if(error=action.execute(action.state,action.delay))break;while(action=actions.shift());if(this.active=!1,error){for(;action=actions.shift();)action.unsubscribe();throw error}},AsyncScheduler}(Scheduler_1.Scheduler);exports.AsyncScheduler=AsyncScheduler},function(module,exports,__webpack_require__){"use strict";function symbolIteratorPonyfill(root){var Symbol=root.Symbol;if("function"==typeof Symbol)return Symbol.iterator||(Symbol.iterator=Symbol("iterator polyfill")),Symbol.iterator;var Set_1=root.Set;if(Set_1&&"function"==typeof(new Set_1)["@@iterator"])return"@@iterator";var Map_1=root.Map;if(Map_1)for(var keys=Object.getOwnPropertyNames(Map_1.prototype),i=0;i<keys.length;++i){var key=keys[i];if("entries"!==key&&"size"!==key&&Map_1.prototype[key]===Map_1.prototype.entries)return key}return"@@iterator"}var root_1=__webpack_require__(8);exports.symbolIteratorPonyfill=symbolIteratorPonyfill,exports.$$iterator=symbolIteratorPonyfill(root_1.root)},function(module,exports,__webpack_require__){function Emitter(obj){if(obj)return mixin(obj)}function mixin(obj){for(var key in Emitter.prototype)obj[key]=Emitter.prototype[key];return obj}module.exports=Emitter,Emitter.prototype.on=Emitter.prototype.addEventListener=function(event,fn){return this._callbacks=this._callbacks||{},(this._callbacks["$"+event]=this._callbacks["$"+event]||[]).push(fn),this},Emitter.prototype.once=function(event,fn){function on(){this.off(event,on),fn.apply(this,arguments)}return on.fn=fn,this.on(event,on),
this},Emitter.prototype.off=Emitter.prototype.removeListener=Emitter.prototype.removeAllListeners=Emitter.prototype.removeEventListener=function(event,fn){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var callbacks=this._callbacks["$"+event];if(!callbacks)return this;if(1==arguments.length)return delete this._callbacks["$"+event],this;for(var cb,i=0;i<callbacks.length;i++)if(cb=callbacks[i],cb===fn||cb.fn===fn){callbacks.splice(i,1);break}return this},Emitter.prototype.emit=function(event){this._callbacks=this._callbacks||{};var args=[].slice.call(arguments,1),callbacks=this._callbacks["$"+event];if(callbacks){callbacks=callbacks.slice(0);for(var i=0,len=callbacks.length;i<len;++i)callbacks[i].apply(this,args)}return this},Emitter.prototype.listeners=function(event){return this._callbacks=this._callbacks||{},this._callbacks["$"+event]||[]},Emitter.prototype.hasListeners=function(event){return!!this.listeners(event).length}},function(module,exports,__webpack_require__){(function(Buffer){function isArray(arg){return Array.isArray?Array.isArray(arg):"[object Array]"===objectToString(arg)}function isBoolean(arg){return"boolean"==typeof arg}function isNull(arg){return null===arg}function isNullOrUndefined(arg){return null==arg}function isNumber(arg){return"number"==typeof arg}function isString(arg){return"string"==typeof arg}function isSymbol(arg){return"symbol"==typeof arg}function isUndefined(arg){return void 0===arg}function isRegExp(re){return"[object RegExp]"===objectToString(re)}function isObject(arg){return"object"==typeof arg&&null!==arg}function isDate(d){return"[object Date]"===objectToString(d)}function isError(e){return"[object Error]"===objectToString(e)||e instanceof Error}function isFunction(arg){return"function"==typeof arg}function isPrimitive(arg){return null===arg||"boolean"==typeof arg||"number"==typeof arg||"string"==typeof arg||"symbol"==typeof arg||"undefined"==typeof arg}function objectToString(o){return Object.prototype.toString.call(o)}exports.isArray=isArray,exports.isBoolean=isBoolean,exports.isNull=isNull,exports.isNullOrUndefined=isNullOrUndefined,exports.isNumber=isNumber,exports.isString=isString,exports.isSymbol=isSymbol,exports.isUndefined=isUndefined,exports.isRegExp=isRegExp,exports.isObject=isObject,exports.isDate=isDate,exports.isError=isError,exports.isFunction=isFunction,exports.isPrimitive=isPrimitive,exports.isBuffer=Buffer.isBuffer}).call(exports,__webpack_require__(12).Buffer)},function(module,exports){"function"==typeof Object.create?module.exports=function(ctor,superCtor){ctor.super_=superCtor,ctor.prototype=Object.create(superCtor.prototype,{constructor:{value:ctor,enumerable:!1,writable:!0,configurable:!0}})}:module.exports=function(ctor,superCtor){ctor.super_=superCtor;var TempCtor=function(){};TempCtor.prototype=superCtor.prototype,ctor.prototype=new TempCtor,ctor.prototype.constructor=ctor}},function(module,exports,__webpack_require__){(function(setImmediate,clearImmediate){function Timeout(id,clearFn){this._id=id,this._clearFn=clearFn}var nextTick=__webpack_require__(16).nextTick,apply=Function.prototype.apply,slice=Array.prototype.slice,immediateIds={},nextImmediateId=0;exports.setTimeout=function(){return new Timeout(apply.call(setTimeout,window,arguments),clearTimeout)},exports.setInterval=function(){return new Timeout(apply.call(setInterval,window,arguments),clearInterval)},exports.clearTimeout=exports.clearInterval=function(timeout){timeout.close()},Timeout.prototype.unref=Timeout.prototype.ref=function(){},Timeout.prototype.close=function(){this._clearFn.call(window,this._id)},exports.enroll=function(item,msecs){clearTimeout(item._idleTimeoutId),item._idleTimeout=msecs},exports.unenroll=function(item){clearTimeout(item._idleTimeoutId),item._idleTimeout=-1},exports._unrefActive=exports.active=function(item){clearTimeout(item._idleTimeoutId);var msecs=item._idleTimeout;msecs>=0&&(item._idleTimeoutId=setTimeout(function(){item._onTimeout&&item._onTimeout()},msecs))},exports.setImmediate="function"==typeof setImmediate?setImmediate:function(fn){var id=nextImmediateId++,args=!(arguments.length<2)&&slice.call(arguments,1);return immediateIds[id]=!0,nextTick(function(){immediateIds[id]&&(args?fn.apply(null,args):fn.call(null),exports.clearImmediate(id))}),id},exports.clearImmediate="function"==typeof clearImmediate?clearImmediate:function(id){delete immediateIds[id]}}).call(exports,__webpack_require__(29).setImmediate,__webpack_require__(29).clearImmediate)},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subject_1=__webpack_require__(6),Subscription_1=__webpack_require__(5),AsyncSubject=function(_super){function AsyncSubject(){_super.apply(this,arguments),this.value=null,this.hasNext=!1,this.hasCompleted=!1}return __extends(AsyncSubject,_super),AsyncSubject.prototype._subscribe=function(subscriber){return this.hasError?(subscriber.error(this.thrownError),Subscription_1.Subscription.EMPTY):this.hasCompleted&&this.hasNext?(subscriber.next(this.value),subscriber.complete(),Subscription_1.Subscription.EMPTY):_super.prototype._subscribe.call(this,subscriber)},AsyncSubject.prototype.next=function(value){this.hasCompleted||(this.value=value,this.hasNext=!0)},AsyncSubject.prototype.error=function(error){this.hasCompleted||_super.prototype.error.call(this,error)},AsyncSubject.prototype.complete=function(){this.hasCompleted=!0,this.hasNext&&_super.prototype.next.call(this,this.value),_super.prototype.complete.call(this)},AsyncSubject}(Subject_1.Subject);exports.AsyncSubject=AsyncSubject},function(module,exports,__webpack_require__){"use strict";function mergeAll(concurrent){return void 0===concurrent&&(concurrent=Number.POSITIVE_INFINITY),this.lift(new MergeAllOperator(concurrent))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.mergeAll=mergeAll;var MergeAllOperator=function(){function MergeAllOperator(concurrent){this.concurrent=concurrent}return MergeAllOperator.prototype.call=function(observer,source){return source.subscribe(new MergeAllSubscriber(observer,this.concurrent))},MergeAllOperator}();exports.MergeAllOperator=MergeAllOperator;var MergeAllSubscriber=function(_super){function MergeAllSubscriber(destination,concurrent){_super.call(this,destination),this.concurrent=concurrent,this.hasCompleted=!1,this.buffer=[],this.active=0}return __extends(MergeAllSubscriber,_super),MergeAllSubscriber.prototype._next=function(observable){this.active<this.concurrent?(this.active++,this.add(subscribeToResult_1.subscribeToResult(this,observable))):this.buffer.push(observable)},MergeAllSubscriber.prototype._complete=function(){this.hasCompleted=!0,0===this.active&&0===this.buffer.length&&this.destination.complete()},MergeAllSubscriber.prototype.notifyComplete=function(innerSub){var buffer=this.buffer;this.remove(innerSub),this.active--,buffer.length>0?this._next(buffer.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()},MergeAllSubscriber}(OuterSubscriber_1.OuterSubscriber);exports.MergeAllSubscriber=MergeAllSubscriber},function(module,exports,__webpack_require__){"use strict";function getSymbolObservable(context){var $$observable,Symbol=context.Symbol;return"function"==typeof Symbol?Symbol.observable?$$observable=Symbol.observable:($$observable=Symbol("observable"),Symbol.observable=$$observable):$$observable="@@observable",$$observable}var root_1=__webpack_require__(8);exports.getSymbolObservable=getSymbolObservable,exports.$$observable=getSymbolObservable(root_1.root)},function(module,exports,__webpack_require__){"use strict";var root_1=__webpack_require__(8),Symbol=root_1.root.Symbol;exports.$$rxSubscriber="function"==typeof Symbol&&"function"==typeof Symbol["for"]?Symbol["for"]("rxSubscriber"):"@@rxSubscriber"},function(module,exports){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},ArgumentOutOfRangeError=function(_super){function ArgumentOutOfRangeError(){var err=_super.call(this,"argument out of range");this.name=err.name="ArgumentOutOfRangeError",this.stack=err.stack,this.message=err.message}return __extends(ArgumentOutOfRangeError,_super),ArgumentOutOfRangeError}(Error);exports.ArgumentOutOfRangeError=ArgumentOutOfRangeError},function(module,exports){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},EmptyError=function(_super){function EmptyError(){var err=_super.call(this,"no elements in sequence");this.name=err.name="EmptyError",this.stack=err.stack,this.message=err.message}return __extends(EmptyError,_super),EmptyError}(Error);exports.EmptyError=EmptyError},function(module,exports){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},ObjectUnsubscribedError=function(_super){function ObjectUnsubscribedError(){var err=_super.call(this,"object unsubscribed");this.name=err.name="ObjectUnsubscribedError",this.stack=err.stack,this.message=err.message}return __extends(ObjectUnsubscribedError,_super),ObjectUnsubscribedError}(Error);exports.ObjectUnsubscribedError=ObjectUnsubscribedError},function(module,exports){"use strict";function isDate(value){return value instanceof Date&&!isNaN(+value)}exports.isDate=isDate},function(module,exports){"use strict";function isFunction(x){return"function"==typeof x}exports.isFunction=isFunction},function(module,exports,__webpack_require__){"use strict";function isNumeric(val){return!isArray_1.isArray(val)&&val-parseFloat(val)+1>=0}var isArray_1=__webpack_require__(14);exports.isNumeric=isNumeric},function(module,exports){module.exports=function(a,b){var fn=function(){};fn.prototype=b.prototype,a.prototype=new fn,a.prototype.constructor=a}},function(module,exports){module.exports=function(module){return module.webpackPolyfill||(module.deprecate=function(){},module.paths=[],module.children||(module.children=[]),Object.defineProperty(module,"loaded",{enumerable:!0,configurable:!1,get:function(){return module.l}}),Object.defineProperty(module,"id",{enumerable:!0,configurable:!1,get:function(){return module.i}}),module.webpackPolyfill=1),module}},function(module,exports){function EventEmitter(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function isFunction(arg){return"function"==typeof arg}function isNumber(arg){return"number"==typeof arg}function isObject(arg){return"object"==typeof arg&&null!==arg}function isUndefined(arg){return void 0===arg}module.exports=EventEmitter,EventEmitter.EventEmitter=EventEmitter,EventEmitter.prototype._events=void 0,EventEmitter.prototype._maxListeners=void 0,EventEmitter.defaultMaxListeners=10,EventEmitter.prototype.setMaxListeners=function(n){if(!isNumber(n)||n<0||isNaN(n))throw TypeError("n must be a positive number");return this._maxListeners=n,this},EventEmitter.prototype.emit=function(type){var er,handler,len,args,i,listeners;if(this._events||(this._events={}),"error"===type&&(!this._events.error||isObject(this._events.error)&&!this._events.error.length)){if(er=arguments[1],er instanceof Error)throw er;var err=new Error('Uncaught, unspecified "error" event. ('+er+")");throw err.context=er,err}if(handler=this._events[type],isUndefined(handler))return!1;if(isFunction(handler))switch(arguments.length){case 1:handler.call(this);break;case 2:handler.call(this,arguments[1]);break;case 3:handler.call(this,arguments[1],arguments[2]);break;default:args=Array.prototype.slice.call(arguments,1),handler.apply(this,args)}else if(isObject(handler))for(args=Array.prototype.slice.call(arguments,1),listeners=handler.slice(),len=listeners.length,i=0;i<len;i++)listeners[i].apply(this,args);return!0},EventEmitter.prototype.addListener=function(type,listener){var m;if(!isFunction(listener))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",type,isFunction(listener.listener)?listener.listener:listener),this._events[type]?isObject(this._events[type])?this._events[type].push(listener):this._events[type]=[this._events[type],listener]:this._events[type]=listener,isObject(this._events[type])&&!this._events[type].warned&&(m=isUndefined(this._maxListeners)?EventEmitter.defaultMaxListeners:this._maxListeners,m&&m>0&&this._events[type].length>m&&(this._events[type].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[type].length),"function"==typeof console.trace&&console.trace())),this},EventEmitter.prototype.on=EventEmitter.prototype.addListener,EventEmitter.prototype.once=function(type,listener){function g(){this.removeListener(type,g),fired||(fired=!0,listener.apply(this,arguments))}if(!isFunction(listener))throw TypeError("listener must be a function");var fired=!1;return g.listener=listener,this.on(type,g),this},EventEmitter.prototype.removeListener=function(type,listener){var list,position,length,i;if(!isFunction(listener))throw TypeError("listener must be a function");if(!this._events||!this._events[type])return this;if(list=this._events[type],length=list.length,position=-1,list===listener||isFunction(list.listener)&&list.listener===listener)delete this._events[type],this._events.removeListener&&this.emit("removeListener",type,listener);else if(isObject(list)){for(i=length;i-- >0;)if(list[i]===listener||list[i].listener&&list[i].listener===listener){position=i;break}if(position<0)return this;1===list.length?(list.length=0,delete this._events[type]):list.splice(position,1),this._events.removeListener&&this.emit("removeListener",type,listener)}return this},EventEmitter.prototype.removeAllListeners=function(type){var key,listeners;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[type]&&delete this._events[type],this;if(0===arguments.length){for(key in this._events)"removeListener"!==key&&this.removeAllListeners(key);return this.removeAllListeners("removeListener"),this._events={},this}if(listeners=this._events[type],isFunction(listeners))this.removeListener(type,listeners);else if(listeners)for(;listeners.length;)this.removeListener(type,listeners[listeners.length-1]);return delete this._events[type],this},EventEmitter.prototype.listeners=function(type){var ret;return ret=this._events&&this._events[type]?isFunction(this._events[type])?[this._events[type]]:this._events[type].slice():[]},EventEmitter.prototype.listenerCount=function(type){if(this._events){var evlistener=this._events[type];if(isFunction(evlistener))return 1;if(evlistener)return evlistener.length}return 0},EventEmitter.listenerCount=function(emitter,type){return emitter.listenerCount(type)}},function(module,exports,__webpack_require__){(function(global){var ClientRequest=__webpack_require__(468),extend=__webpack_require__(472),statusCodes=__webpack_require__(470),url=__webpack_require__(44),http=exports;http.request=function(opts,cb){opts="string"==typeof opts?url.parse(opts):extend(opts);var defaultProtocol=global.location.protocol.search(/^https?:$/)===-1?"http:":"",protocol=opts.protocol||defaultProtocol,host=opts.hostname||opts.host,port=opts.port,path=opts.path||"/";host&&host.indexOf(":")!==-1&&(host="["+host+"]"),opts.url=(host?protocol+"//"+host:"")+(port?":"+port:"")+path,opts.method=(opts.method||"GET").toUpperCase(),opts.headers=opts.headers||{};var req=new ClientRequest(opts);return cb&&req.on("response",cb),req},http.get=function(opts,cb){var req=http.request(opts,cb);return req.end(),req},http.Agent=function(){},http.Agent.defaultMaxSockets=4,http.STATUS_CODES=statusCodes,http.METHODS=["CHECKOUT","CONNECT","COPY","DELETE","GET","HEAD","LOCK","M-SEARCH","MERGE","MKACTIVITY","MKCOL","MOVE","NOTIFY","OPTIONS","PATCH","POST","PROPFIND","PROPPATCH","PURGE","PUT","REPORT","SEARCH","SUBSCRIBE","TRACE","UNLOCK","UNSUBSCRIBE"]}).call(exports,__webpack_require__(4))},function(module,exports,__webpack_require__){"use strict";function Url(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}function urlParse(url,parseQueryString,slashesDenoteHost){if(url&&util.isObject(url)&&url instanceof Url)return url;var u=new Url;return u.parse(url,parseQueryString,slashesDenoteHost),u}function urlFormat(obj){return util.isString(obj)&&(obj=urlParse(obj)),obj instanceof Url?obj.format():Url.prototype.format.call(obj)}function urlResolve(source,relative){return urlParse(source,!1,!0).resolve(relative)}function urlResolveObject(source,relative){return source?urlParse(source,!1,!0).resolveObject(relative):relative}var punycode=__webpack_require__(456),util=__webpack_require__(473);exports.parse=urlParse,exports.resolve=urlResolve,exports.resolveObject=urlResolveObject,exports.format=urlFormat,exports.Url=Url;var protocolPattern=/^([a-z0-9.+-]+:)/i,portPattern=/:[0-9]*$/,simplePathPattern=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,delims=["<",">",'"',"`"," ","\r","\n","\t"],unwise=["{","}","|","\\","^","`"].concat(delims),autoEscape=["'"].concat(unwise),nonHostChars=["%","/","?",";","#"].concat(autoEscape),hostEndingChars=["/","?","#"],hostnameMaxLen=255,hostnamePartPattern=/^[+a-z0-9A-Z_-]{0,63}$/,hostnamePartStart=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,unsafeProtocol={javascript:!0,"javascript:":!0},hostlessProtocol={javascript:!0,"javascript:":!0},slashedProtocol={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},querystring=__webpack_require__(459);Url.prototype.parse=function(url,parseQueryString,slashesDenoteHost){if(!util.isString(url))throw new TypeError("Parameter 'url' must be a string, not "+typeof url);var queryIndex=url.indexOf("?"),splitter=queryIndex!==-1&&queryIndex<url.indexOf("#")?"?":"#",uSplit=url.split(splitter),slashRegex=/\\/g;uSplit[0]=uSplit[0].replace(slashRegex,"/"),url=uSplit.join(splitter);var rest=url;if(rest=rest.trim(),!slashesDenoteHost&&1===url.split("#").length){var simplePath=simplePathPattern.exec(rest);if(simplePath)return this.path=rest,this.href=rest,this.pathname=simplePath[1],simplePath[2]?(this.search=simplePath[2],parseQueryString?this.query=querystring.parse(this.search.substr(1)):this.query=this.search.substr(1)):parseQueryString&&(this.search="",this.query={}),this}var proto=protocolPattern.exec(rest);if(proto){proto=proto[0];var lowerProto=proto.toLowerCase();this.protocol=lowerProto,rest=rest.substr(proto.length)}if(slashesDenoteHost||proto||rest.match(/^\/\/[^@\/]+@[^@\/]+/)){var slashes="//"===rest.substr(0,2);!slashes||proto&&hostlessProtocol[proto]||(rest=rest.substr(2),this.slashes=!0)}if(!hostlessProtocol[proto]&&(slashes||proto&&!slashedProtocol[proto])){for(var hostEnd=-1,i=0;i<hostEndingChars.length;i++){var hec=rest.indexOf(hostEndingChars[i]);hec!==-1&&(hostEnd===-1||hec<hostEnd)&&(hostEnd=hec)}var auth,atSign;atSign=hostEnd===-1?rest.lastIndexOf("@"):rest.lastIndexOf("@",hostEnd),atSign!==-1&&(auth=rest.slice(0,atSign),rest=rest.slice(atSign+1),this.auth=decodeURIComponent(auth)),hostEnd=-1;for(var i=0;i<nonHostChars.length;i++){var hec=rest.indexOf(nonHostChars[i]);hec!==-1&&(hostEnd===-1||hec<hostEnd)&&(hostEnd=hec)}hostEnd===-1&&(hostEnd=rest.length),this.host=rest.slice(0,hostEnd),rest=rest.slice(hostEnd),this.parseHost(),this.hostname=this.hostname||"";var ipv6Hostname="["===this.hostname[0]&&"]"===this.hostname[this.hostname.length-1];if(!ipv6Hostname)for(var hostparts=this.hostname.split(/\./),i=0,l=hostparts.length;i<l;i++){var part=hostparts[i];if(part&&!part.match(hostnamePartPattern)){for(var newpart="",j=0,k=part.length;j<k;j++)newpart+=part.charCodeAt(j)>127?"x":part[j];if(!newpart.match(hostnamePartPattern)){var validParts=hostparts.slice(0,i),notHost=hostparts.slice(i+1),bit=part.match(hostnamePartStart);bit&&(validParts.push(bit[1]),notHost.unshift(bit[2])),notHost.length&&(rest="/"+notHost.join(".")+rest),this.hostname=validParts.join(".");break}}}this.hostname.length>hostnameMaxLen?this.hostname="":this.hostname=this.hostname.toLowerCase(),ipv6Hostname||(this.hostname=punycode.toASCII(this.hostname));var p=this.port?":"+this.port:"",h=this.hostname||"";this.host=h+p,this.href+=this.host,ipv6Hostname&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==rest[0]&&(rest="/"+rest))}if(!unsafeProtocol[lowerProto])for(var i=0,l=autoEscape.length;i<l;i++){var ae=autoEscape[i];if(rest.indexOf(ae)!==-1){var esc=encodeURIComponent(ae);esc===ae&&(esc=escape(ae)),rest=rest.split(ae).join(esc)}}var hash=rest.indexOf("#");hash!==-1&&(this.hash=rest.substr(hash),rest=rest.slice(0,hash));var qm=rest.indexOf("?");if(qm!==-1?(this.search=rest.substr(qm),this.query=rest.substr(qm+1),parseQueryString&&(this.query=querystring.parse(this.query)),rest=rest.slice(0,qm)):parseQueryString&&(this.search="",this.query={}),rest&&(this.pathname=rest),slashedProtocol[lowerProto]&&this.hostname&&!this.pathname&&(this.pathname="/"),this.pathname||this.search){var p=this.pathname||"",s=this.search||"";this.path=p+s}return this.href=this.format(),this},Url.prototype.format=function(){var auth=this.auth||"";auth&&(auth=encodeURIComponent(auth),auth=auth.replace(/%3A/i,":"),auth+="@");var protocol=this.protocol||"",pathname=this.pathname||"",hash=this.hash||"",host=!1,query="";this.host?host=auth+this.host:this.hostname&&(host=auth+(this.hostname.indexOf(":")===-1?this.hostname:"["+this.hostname+"]"),this.port&&(host+=":"+this.port)),this.query&&util.isObject(this.query)&&Object.keys(this.query).length&&(query=querystring.stringify(this.query));var search=this.search||query&&"?"+query||"";return protocol&&":"!==protocol.substr(-1)&&(protocol+=":"),this.slashes||(!protocol||slashedProtocol[protocol])&&host!==!1?(host="//"+(host||""),pathname&&"/"!==pathname.charAt(0)&&(pathname="/"+pathname)):host||(host=""),hash&&"#"!==hash.charAt(0)&&(hash="#"+hash),search&&"?"!==search.charAt(0)&&(search="?"+search),pathname=pathname.replace(/[?#]/g,function(match){return encodeURIComponent(match)}),search=search.replace("#","%23"),protocol+host+pathname+search+hash},Url.prototype.resolve=function(relative){return this.resolveObject(urlParse(relative,!1,!0)).format()},Url.prototype.resolveObject=function(relative){if(util.isString(relative)){var rel=new Url;rel.parse(relative,!1,!0),relative=rel}for(var result=new Url,tkeys=Object.keys(this),tk=0;tk<tkeys.length;tk++){var tkey=tkeys[tk];result[tkey]=this[tkey]}if(result.hash=relative.hash,""===relative.href)return result.href=result.format(),result;if(relative.slashes&&!relative.protocol){for(var rkeys=Object.keys(relative),rk=0;rk<rkeys.length;rk++){var rkey=rkeys[rk];"protocol"!==rkey&&(result[rkey]=relative[rkey])}return slashedProtocol[result.protocol]&&result.hostname&&!result.pathname&&(result.path=result.pathname="/"),result.href=result.format(),result}if(relative.protocol&&relative.protocol!==result.protocol){if(!slashedProtocol[relative.protocol]){for(var keys=Object.keys(relative),v=0;v<keys.length;v++){var k=keys[v];result[k]=relative[k]}return result.href=result.format(),result}if(result.protocol=relative.protocol,relative.host||hostlessProtocol[relative.protocol])result.pathname=relative.pathname;else{for(var relPath=(relative.pathname||"").split("/");relPath.length&&!(relative.host=relPath.shift()););relative.host||(relative.host=""),relative.hostname||(relative.hostname=""),""!==relPath[0]&&relPath.unshift(""),relPath.length<2&&relPath.unshift(""),result.pathname=relPath.join("/")}if(result.search=relative.search,result.query=relative.query,result.host=relative.host||"",result.auth=relative.auth,result.hostname=relative.hostname||relative.host,result.port=relative.port,result.pathname||result.search){var p=result.pathname||"",s=result.search||"";result.path=p+s}return result.slashes=result.slashes||relative.slashes,result.href=result.format(),result}var isSourceAbs=result.pathname&&"/"===result.pathname.charAt(0),isRelAbs=relative.host||relative.pathname&&"/"===relative.pathname.charAt(0),mustEndAbs=isRelAbs||isSourceAbs||result.host&&relative.pathname,removeAllDots=mustEndAbs,srcPath=result.pathname&&result.pathname.split("/")||[],relPath=relative.pathname&&relative.pathname.split("/")||[],psychotic=result.protocol&&!slashedProtocol[result.protocol];if(psychotic&&(result.hostname="",result.port=null,result.host&&(""===srcPath[0]?srcPath[0]=result.host:srcPath.unshift(result.host)),result.host="",relative.protocol&&(relative.hostname=null,relative.port=null,relative.host&&(""===relPath[0]?relPath[0]=relative.host:relPath.unshift(relative.host)),relative.host=null),mustEndAbs=mustEndAbs&&(""===relPath[0]||""===srcPath[0])),isRelAbs)result.host=relative.host||""===relative.host?relative.host:result.host,result.hostname=relative.hostname||""===relative.hostname?relative.hostname:result.hostname,result.search=relative.search,result.query=relative.query,srcPath=relPath;else if(relPath.length)srcPath||(srcPath=[]),srcPath.pop(),srcPath=srcPath.concat(relPath),result.search=relative.search,result.query=relative.query;else if(!util.isNullOrUndefined(relative.search)){if(psychotic){result.hostname=result.host=srcPath.shift();var authInHost=!!(result.host&&result.host.indexOf("@")>0)&&result.host.split("@");authInHost&&(result.auth=authInHost.shift(),result.host=result.hostname=authInHost.shift())}return result.search=relative.search,result.query=relative.query,util.isNull(result.pathname)&&util.isNull(result.search)||(result.path=(result.pathname?result.pathname:"")+(result.search?result.search:"")),result.href=result.format(),result}if(!srcPath.length)return result.pathname=null,result.search?result.path="/"+result.search:result.path=null,result.href=result.format(),result;for(var last=srcPath.slice(-1)[0],hasTrailingSlash=(result.host||relative.host||srcPath.length>1)&&("."===last||".."===last)||""===last,up=0,i=srcPath.length;i>=0;i--)last=srcPath[i],"."===last?srcPath.splice(i,1):".."===last?(srcPath.splice(i,1),up++):up&&(srcPath.splice(i,1),up--);if(!mustEndAbs&&!removeAllDots)for(;up--;up)srcPath.unshift("..");!mustEndAbs||""===srcPath[0]||srcPath[0]&&"/"===srcPath[0].charAt(0)||srcPath.unshift(""),hasTrailingSlash&&"/"!==srcPath.join("/").substr(-1)&&srcPath.push("");var isAbsolute=""===srcPath[0]||srcPath[0]&&"/"===srcPath[0].charAt(0);if(psychotic){result.hostname=result.host=isAbsolute?"":srcPath.length?srcPath.shift():"";var authInHost=!!(result.host&&result.host.indexOf("@")>0)&&result.host.split("@");authInHost&&(result.auth=authInHost.shift(),result.host=result.hostname=authInHost.shift())}return mustEndAbs=mustEndAbs||result.host&&srcPath.length,mustEndAbs&&!isAbsolute&&srcPath.unshift(""),srcPath.length?result.pathname=srcPath.join("/"):(result.pathname=null,result.path=null),util.isNull(result.pathname)&&util.isNull(result.search)||(result.path=(result.pathname?result.pathname:"")+(result.search?result.search:"")),result.auth=relative.auth||result.auth,result.slashes=result.slashes||relative.slashes,result.href=result.format(),result},Url.prototype.parseHost=function(){var host=this.host,port=portPattern.exec(host);port&&(port=port[0],":"!==port&&(this.port=port.substr(1)),host=host.substr(0,host.length-port.length)),host&&(this.hostname=host)}},function(module,exports,__webpack_require__){__webpack_require__(127),module.exports="ngCookies"},function(module,exports,__webpack_require__){__webpack_require__(128),module.exports="ngResource"},function(module,exports,__webpack_require__){/*!
 * State-based routing for AngularJS
 * @version v1.0.0-beta.1
 * @link https://ui-router.github.io
 * @license MIT License, http://www.opensource.org/licenses/MIT
 */
!function(root,factory){module.exports=factory()}(this,function(){return function(modules){function __webpack_require__(moduleId){if(installedModules[moduleId])return installedModules[moduleId].exports;var module=installedModules[moduleId]={exports:{},id:moduleId,loaded:!1};return modules[moduleId].call(module.exports,module,module.exports,__webpack_require__),module.loaded=!0,module.exports}var installedModules={};return __webpack_require__.m=modules,__webpack_require__.c=installedModules,__webpack_require__.p="",__webpack_require__(0)}([function(module,exports,__webpack_require__){"use strict";function __export(m){for(var p in m)exports.hasOwnProperty(p)||(exports[p]=m[p])}__export(__webpack_require__(1)),__export(__webpack_require__(53)),__export(__webpack_require__(55)),__webpack_require__(58),__webpack_require__(59),__webpack_require__(60),__webpack_require__(61),Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]="ui.router"},function(module,exports,__webpack_require__){"use strict";function __export(m){for(var p in m)exports.hasOwnProperty(p)||(exports[p]=m[p])}__export(__webpack_require__(2)),__export(__webpack_require__(46)),__export(__webpack_require__(47)),__export(__webpack_require__(48)),__export(__webpack_require__(49)),__export(__webpack_require__(50)),__export(__webpack_require__(51)),__export(__webpack_require__(52)),__export(__webpack_require__(44));var router_1=__webpack_require__(26);exports.UIRouter=router_1.UIRouter},function(module,exports,__webpack_require__){"use strict";function __export(m){for(var p in m)exports.hasOwnProperty(p)||(exports[p]=m[p])}__export(__webpack_require__(3)),__export(__webpack_require__(6)),__export(__webpack_require__(7)),__export(__webpack_require__(5)),__export(__webpack_require__(4)),__export(__webpack_require__(8)),__export(__webpack_require__(9)),__export(__webpack_require__(12))},function(module,exports,__webpack_require__){"use strict";function bindFunctions(from,to,bindTo,fnNames){return void 0===fnNames&&(fnNames=Object.keys(from)),fnNames.filter(function(name){return"function"==typeof from[name]}).forEach(function(name){return to[name]=from[name].bind(bindTo)})}function defaults(opts){void 0===opts&&(opts={});for(var defaultsList=[],_i=1;_i<arguments.length;_i++)defaultsList[_i-1]=arguments[_i];var defaults=merge.apply(null,[{}].concat(defaultsList));return exports.extend({},defaults,pick(opts||{},Object.keys(defaults)))}function merge(dst){for(var objs=[],_i=1;_i<arguments.length;_i++)objs[_i-1]=arguments[_i];return exports.forEach(objs,function(obj){exports.forEach(obj,function(value,key){dst.hasOwnProperty(key)||(dst[key]=value)})}),dst}function ancestors(first,second){var path=[];for(var n in first.path){if(first.path[n]!==second.path[n])break;path.push(first.path[n])}return path}function equalForKeys(a,b,keys){void 0===keys&&(keys=Object.keys(a));for(var i=0;i<keys.length;i++){var k=keys[i];if(a[k]!=b[k])return!1}return!0}function pickOmitImpl(predicate,obj){var objCopy={},keys=restArgs(arguments,2);for(var key in obj)predicate(keys,key)&&(objCopy[key]=obj[key]);return objCopy}function pick(obj){return pickOmitImpl.apply(null,[exports.inArray].concat(restArgs(arguments)))}function omit(obj){return pickOmitImpl.apply(null,[hof_1.not(exports.inArray)].concat(restArgs(arguments)))}function pluck(collection,propName){return map(collection,hof_1.prop(propName))}function filter(collection,callback){var arr=predicates_1.isArray(collection),result=arr?[]:{},accept=arr?function(x){return result.push(x)}:function(x,key){return result[key]=x};return exports.forEach(collection,function(item,i){callback(item,i)&&accept(item,i)}),result}function find(collection,callback){var result;return exports.forEach(collection,function(item,i){result||callback(item,i)&&(result=item)}),result}function map(collection,callback){var result=predicates_1.isArray(collection)?[]:{};return exports.forEach(collection,function(item,i){return result[i]=callback(item,i)}),result}function pushR(arr,obj){return arr.push(obj),arr}function assertPredicate(predicate,errMsg){return void 0===errMsg&&(errMsg="assert failure"),function(obj){if(!predicate(obj))throw new Error(predicates_1.isFunction(errMsg)?errMsg(obj):errMsg);return!0}}function arrayTuples(){for(var arrayArgs=[],_i=0;_i<arguments.length;_i++)arrayArgs[_i-0]=arguments[_i];if(0===arrayArgs.length)return[];var length=arrayArgs.reduce(function(min,arr){return Math.min(arr.length,min)},9007199254740991);return Array.apply(null,Array(length)).map(function(ignored,idx){return arrayArgs.map(function(arr){return arr[idx]})})}function applyPairs(memo,keyValTuple){var key,value;if(predicates_1.isArray(keyValTuple)&&(key=keyValTuple[0],value=keyValTuple[1]),!predicates_1.isString(key))throw new Error("invalid parameters to applyPairs");return memo[key]=value,memo}function tail(arr){return arr.length&&arr[arr.length-1]||void 0}function _copy(src,dest){return dest&&Object.keys(dest).forEach(function(key){return delete dest[key]}),dest||(dest={}),exports.extend(dest,src)}function _forEach(obj,cb,_this){return predicates_1.isArray(obj)?obj.forEach(cb,_this):void Object.keys(obj).forEach(function(key){return cb(obj[key],key)})}function _copyProps(to,from){return Object.keys(from).forEach(function(key){return to[key]=from[key]}),to}function _extend(toObj,rest){return restArgs(arguments,1).filter(exports.identity).reduce(_copyProps,toObj)}function _equals(o1,o2){if(o1===o2)return!0;if(null===o1||null===o2)return!1;if(o1!==o1&&o2!==o2)return!0;var t1=typeof o1,t2=typeof o2;if(t1!==t2||"object"!==t1)return!1;var tup=[o1,o2];if(hof_1.all(predicates_1.isArray)(tup))return _arraysEq(o1,o2);if(hof_1.all(predicates_1.isDate)(tup))return o1.getTime()===o2.getTime();if(hof_1.all(predicates_1.isRegExp)(tup))return o1.toString()===o2.toString();if(hof_1.all(predicates_1.isFunction)(tup))return!0;var predicates=[predicates_1.isFunction,predicates_1.isArray,predicates_1.isDate,predicates_1.isRegExp];if(predicates.map(hof_1.any).reduce(function(b,fn){return b||!!fn(tup)},!1))return!1;var key,keys={};for(key in o1){if(!_equals(o1[key],o2[key]))return!1;keys[key]=!0}for(key in o2)if(!keys[key])return!1;return!0}function _arraysEq(a1,a2){return a1.length===a2.length&&arrayTuples(a1,a2).reduce(function(b,t){return b&&_equals(t[0],t[1])},!0)}var predicates_1=__webpack_require__(4),hof_1=__webpack_require__(5),coreservices_1=__webpack_require__(6),w="undefined"==typeof window?{}:window,angular=w.angular||{};exports.fromJson=angular.fromJson||JSON.parse.bind(JSON),exports.toJson=angular.toJson||JSON.stringify.bind(JSON),exports.copy=angular.copy||_copy,exports.forEach=angular.forEach||_forEach,exports.extend=angular.extend||_extend,exports.equals=angular.equals||_equals,exports.identity=function(x){return x},exports.noop=function(){},exports.abstractKey="abstract",exports.bindFunctions=bindFunctions,exports.inherit=function(parent,extra){return exports.extend(new(exports.extend(function(){},{prototype:parent})),extra)};var restArgs=function(args,idx){return void 0===idx&&(idx=0),Array.prototype.concat.apply(Array.prototype,Array.prototype.slice.call(args,idx))};exports.inArray=function(array,obj){return array.indexOf(obj)!==-1},exports.removeFrom=hof_1.curry(function(array,obj){var idx=array.indexOf(obj);return idx>=0&&array.splice(idx,1),array}),exports.defaults=defaults,exports.merge=merge,exports.mergeR=function(memo,item){return exports.extend(memo,item)},exports.ancestors=ancestors,exports.equalForKeys=equalForKeys,exports.pick=pick,exports.omit=omit,exports.pluck=pluck,exports.filter=filter,exports.find=find,exports.mapObj=map,exports.map=map,exports.values=function(obj){return Object.keys(obj).map(function(key){return obj[key]})},exports.allTrueR=function(memo,elem){return memo&&elem},exports.anyTrueR=function(memo,elem){return memo||elem},exports.unnestR=function(memo,elem){return memo.concat(elem)},exports.flattenR=function(memo,elem){return predicates_1.isArray(elem)?memo.concat(elem.reduce(exports.flattenR,[])):pushR(memo,elem)},exports.pushR=pushR,exports.uniqR=function(acc,token){return exports.inArray(acc,token)?acc:pushR(acc,token)},exports.unnest=function(arr){return arr.reduce(exports.unnestR,[])},exports.flatten=function(arr){return arr.reduce(exports.flattenR,[])},exports.assertPredicate=assertPredicate,exports.pairs=function(object){return Object.keys(object).map(function(key){return[key,object[key]]})},exports.arrayTuples=arrayTuples,exports.applyPairs=applyPairs,exports.tail=tail,exports.silenceUncaughtInPromise=function(promise){return promise["catch"](function(e){return 0})&&promise},exports.silentRejection=function(error){return exports.silenceUncaughtInPromise(coreservices_1.services.$q.reject(error))}},function(module,exports,__webpack_require__){"use strict";function isInjectable(val){if(exports.isArray(val)&&val.length){var head=val.slice(0,-1),tail=val.slice(-1);return!(head.filter(hof_1.not(exports.isString)).length||tail.filter(hof_1.not(exports.isFunction)).length)}return exports.isFunction(val)}var hof_1=__webpack_require__(5),toStr=Object.prototype.toString,tis=function(t){return function(x){return typeof x===t}};exports.isUndefined=tis("undefined"),exports.isDefined=hof_1.not(exports.isUndefined),exports.isNull=function(o){return null===o},exports.isFunction=tis("function"),exports.isNumber=tis("number"),exports.isString=tis("string"),exports.isObject=function(x){return null!==x&&"object"==typeof x},exports.isArray=Array.isArray,exports.isDate=function(x){return"[object Date]"===toStr.call(x)},exports.isRegExp=function(x){return"[object RegExp]"===toStr.call(x)},exports.isInjectable=isInjectable,exports.isPromise=hof_1.and(exports.isObject,hof_1.pipe(hof_1.prop("then"),exports.isFunction))},function(module,exports){"use strict";function curry(fn){function curried(args){return args.length>=func_args_length?fn.apply(null,args):function(){return curried(args.concat([].slice.apply(arguments)))}}var initial_args=[].slice.apply(arguments,[1]),func_args_length=fn.length;return curried(initial_args)}function compose(){var args=arguments,start=args.length-1;return function(){for(var i=start,result=args[start].apply(this,arguments);i--;)result=args[i].call(this,result);return result}}function pipe(){for(var funcs=[],_i=0;_i<arguments.length;_i++)funcs[_i-0]=arguments[_i];return compose.apply(null,[].slice.call(arguments).reverse())}function and(fn1,fn2){return function(){for(var args=[],_i=0;_i<arguments.length;_i++)args[_i-0]=arguments[_i];return fn1.apply(null,args)&&fn2.apply(null,args)}}function or(fn1,fn2){return function(){for(var args=[],_i=0;_i<arguments.length;_i++)args[_i-0]=arguments[_i];return fn1.apply(null,args)||fn2.apply(null,args)}}function invoke(fnName,args){return function(obj){return obj[fnName].apply(obj,args)}}function pattern(struct){return function(x){for(var i=0;i<struct.length;i++)if(struct[i][0](x))return struct[i][1](x)}}exports.curry=curry,exports.compose=compose,exports.pipe=pipe,exports.prop=function(name){return function(obj){return obj&&obj[name]}},exports.propEq=curry(function(name,val,obj){return obj&&obj[name]===val}),exports.parse=function(name){return pipe.apply(null,name.split(".").map(exports.prop))},exports.not=function(fn){return function(){for(var args=[],_i=0;_i<arguments.length;_i++)args[_i-0]=arguments[_i];return!fn.apply(null,args)}},exports.and=and,exports.or=or,exports.all=function(fn1){return function(arr){return arr.reduce(function(b,x){return b&&!!fn1(x)},!0)}},exports.any=function(fn1){return function(arr){return arr.reduce(function(b,x){return b||!!fn1(x)},!1)}},exports.none=exports.not(exports.any),exports.is=function(ctor){return function(obj){return null!=obj&&obj.constructor===ctor||obj instanceof ctor}},exports.eq=function(val){return function(other){return val===other}},exports.val=function(v){return function(){return v}},exports.invoke=invoke,exports.pattern=pattern},function(module,exports){"use strict";var notImplemented=function(fnname){return function(){throw new Error(fnname+"(): No coreservices implementation for UI-Router is loaded. You should include one of: ['angular1.js']")}},services={$q:void 0,$injector:void 0,location:{},locationConfig:{},template:{}};exports.services=services,["replace","url","path","search","hash","onChange"].forEach(function(key){return services.location[key]=notImplemented(key)}),["port","protocol","host","baseHref","html5Mode","hashPrefix"].forEach(function(key){return services.locationConfig[key]=notImplemented(key)})},function(module,exports){"use strict";var Glob=function(){function Glob(text){this.text=text,this.glob=text.split(".")}return Glob.prototype.matches=function(name){for(var segments=name.split("."),i=0,l=this.glob.length;i<l;i++)"*"===this.glob[i]&&(segments[i]="*");return"**"===this.glob[0]&&(segments=segments.slice(segments.indexOf(this.glob[1])),segments.unshift("**")),"**"===this.glob[this.glob.length-1]&&(segments.splice(segments.indexOf(this.glob[this.glob.length-2])+1,Number.MAX_VALUE),segments.push("**")),this.glob.length==segments.length&&segments.join("")===this.glob.join("")},Glob.is=function(text){return text.indexOf("*")>-1},Glob.fromString=function(text){return this.is(text)?new Glob(text):null},Glob}();exports.Glob=Glob},function(module,exports){"use strict";var Queue=function(){function Queue(_items,_limit){void 0===_items&&(_items=[]),void 0===_limit&&(_limit=null),this._items=_items,this._limit=_limit}return Queue.prototype.enqueue=function(item){var items=this._items;return items.push(item),this._limit&&items.length>this._limit&&items.shift(),item},Queue.prototype.dequeue=function(){if(this.size())return this._items.splice(0,1)[0]},Queue.prototype.clear=function(){var current=this._items;return this._items=[],current},Queue.prototype.size=function(){return this._items.length},Queue.prototype.remove=function(item){var idx=this._items.indexOf(item);return idx>-1&&this._items.splice(idx,1)[0]},Queue.prototype.peekTail=function(){return this._items[this._items.length-1]},Queue.prototype.peekHead=function(){if(this.size())return this._items[0]},Queue}();exports.Queue=Queue},function(module,exports,__webpack_require__){"use strict";function maxLength(max,str){return str.length<=max?str:str.substr(0,max-3)+"..."}function padString(length,str){for(;str.length<length;)str+=" ";return str}function kebobString(camelCase){return camelCase.replace(/^([A-Z])/,function($1){return $1.toLowerCase()}).replace(/([A-Z])/g,function($1){return"-"+$1.toLowerCase()})}function functionToString(fn){var fnStr=fnToString(fn),namedFunctionMatch=fnStr.match(/^(function [^ ]+\([^)]*\))/);return namedFunctionMatch?namedFunctionMatch[1]:fnStr}function fnToString(fn){var _fn=predicates_1.isArray(fn)?fn.slice(-1)[0]:fn;return _fn&&_fn.toString()||"undefined"}function stringify(o){function format(val){if(predicates_1.isObject(val)){if(seen.indexOf(val)!==-1)return"[circular ref]";seen.push(val)}return stringifyPattern(val)}var seen=[];return JSON.stringify(o,function(key,val){return format(val)}).replace(/\\"/g,'"')}var predicates_1=__webpack_require__(4),rejectFactory_1=__webpack_require__(10),common_1=__webpack_require__(3),hof_1=__webpack_require__(5),transition_1=__webpack_require__(11),resolvable_1=__webpack_require__(19);exports.maxLength=maxLength,exports.padString=padString,exports.kebobString=kebobString,exports.functionToString=functionToString,exports.fnToString=fnToString;var stringifyPatternFn=null,stringifyPattern=function(value){var isTransitionRejectionPromise=rejectFactory_1.Rejection.isTransitionRejectionPromise;return(stringifyPatternFn=stringifyPatternFn||hof_1.pattern([[hof_1.not(predicates_1.isDefined),hof_1.val("undefined")],[predicates_1.isNull,hof_1.val("null")],[predicates_1.isPromise,hof_1.val("[Promise]")],[isTransitionRejectionPromise,function(x){return x._transitionRejection.toString()}],[hof_1.is(rejectFactory_1.Rejection),hof_1.invoke("toString")],[hof_1.is(transition_1.Transition),hof_1.invoke("toString")],[hof_1.is(resolvable_1.Resolvable),hof_1.invoke("toString")],[predicates_1.isInjectable,functionToString],[hof_1.val(!0),common_1.identity]]))(value)};exports.stringify=stringify,exports.beforeAfterSubstr=function(char){return function(str){if(!str)return["",""];var idx=str.indexOf(char);return idx===-1?[str,""]:[str.substr(0,idx),str.substr(idx+1)]}}},function(module,exports,__webpack_require__){"use strict";var common_1=__webpack_require__(3),strings_1=__webpack_require__(9);!function(RejectType){RejectType[RejectType.SUPERSEDED=2]="SUPERSEDED",RejectType[RejectType.ABORTED=3]="ABORTED",RejectType[RejectType.INVALID=4]="INVALID",RejectType[RejectType.IGNORED=5]="IGNORED",RejectType[RejectType.ERROR=6]="ERROR"}(exports.RejectType||(exports.RejectType={}));var RejectType=exports.RejectType,Rejection=function(){function Rejection(type,message,detail){this.type=type,this.message=message,this.detail=detail}return Rejection.prototype.toString=function(){var detailString=function(d){return d&&d.toString!==Object.prototype.toString?d.toString():strings_1.stringify(d)},type=this.type,message=this.message,detail=detailString(this.detail);return"TransitionRejection(type: "+type+", message: "+message+", detail: "+detail+")"},Rejection.prototype.toPromise=function(){return common_1.extend(common_1.silentRejection(this),{_transitionRejection:this})},Rejection.isTransitionRejectionPromise=function(obj){return obj&&"function"==typeof obj.then&&obj._transitionRejection instanceof Rejection},Rejection.superseded=function(detail,options){var message="The transition has been superseded by a different transition (see detail).",rejection=new Rejection(RejectType.SUPERSEDED,message,detail);return options&&options.redirected&&(rejection.redirected=!0),rejection},Rejection.redirected=function(detail){return Rejection.superseded(detail,{redirected:!0})},Rejection.invalid=function(detail){var message="This transition is invalid (see detail)";return new Rejection(RejectType.INVALID,message,detail)},Rejection.ignored=function(detail){var message="The transition was ignored.";return new Rejection(RejectType.IGNORED,message,detail)},Rejection.aborted=function(detail){var message="The transition has been aborted.";return new Rejection(RejectType.ABORTED,message,detail)},Rejection.errored=function(detail){var message="The transition errored.";return new Rejection(RejectType.ERROR,message,detail)},Rejection}();exports.Rejection=Rejection},function(module,exports,__webpack_require__){"use strict";var trace_1=__webpack_require__(12),coreservices_1=__webpack_require__(6),common_1=__webpack_require__(3),predicates_1=__webpack_require__(4),hof_1=__webpack_require__(5),transitionHook_1=__webpack_require__(13),hookRegistry_1=__webpack_require__(15),hookBuilder_1=__webpack_require__(16),node_1=__webpack_require__(21),pathFactory_1=__webpack_require__(20),targetState_1=__webpack_require__(14),param_1=__webpack_require__(22),resolvable_1=__webpack_require__(19),rejectFactory_1=__webpack_require__(10),resolveContext_1=__webpack_require__(17),router_1=__webpack_require__(26),transitionCount=0,stateSelf=hof_1.prop("self"),Transition=function(){function Transition(fromPath,targetState,router){var _this=this;if(this._deferred=coreservices_1.services.$q.defer(),this.promise=this._deferred.promise,this.treeChanges=function(){return _this._treeChanges},this.isActive=function(){return _this===_this._options.current()},this.router=router,!targetState.valid())throw new Error(targetState.error());hookRegistry_1.HookRegistry.mixin(new hookRegistry_1.HookRegistry,this),this._options=common_1.extend({current:hof_1.val(this)},targetState.options()),this.$id=transitionCount++;var toPath=pathFactory_1.PathFactory.buildToPath(fromPath,targetState);this._treeChanges=pathFactory_1.PathFactory.treeChanges(fromPath,toPath,this._options.reloadState);var enteringStates=this._treeChanges.entering.map(function(node){return node.state});pathFactory_1.PathFactory.applyViewConfigs(router.transitionService.$view,this._treeChanges.to,enteringStates);var rootResolvables=[new resolvable_1.Resolvable(router_1.UIRouter,function(){return router},[],(void 0),router),new resolvable_1.Resolvable(Transition,function(){return _this},[],(void 0),this),new resolvable_1.Resolvable("$transition$",function(){return _this},[],(void 0),this),new resolvable_1.Resolvable("$stateParams",function(){return _this.params()},[],(void 0),this.params())],rootNode=this._treeChanges.to[0],context=new resolveContext_1.ResolveContext(this._treeChanges.to);context.addResolvables(rootResolvables,rootNode.state)}return Transition.prototype.onBefore=function(matchCriteria,callback,options){throw""},Transition.prototype.onStart=function(matchCriteria,callback,options){throw""},Transition.prototype.onExit=function(matchCriteria,callback,options){throw""},Transition.prototype.onRetain=function(matchCriteria,callback,options){throw""},Transition.prototype.onEnter=function(matchCriteria,callback,options){throw""},Transition.prototype.onFinish=function(matchCriteria,callback,options){throw""},Transition.prototype.onSuccess=function(matchCriteria,callback,options){throw""},Transition.prototype.onError=function(matchCriteria,callback,options){throw""},Transition.prototype.$from=function(){return common_1.tail(this._treeChanges.from).state},Transition.prototype.$to=function(){return common_1.tail(this._treeChanges.to).state},Transition.prototype.from=function(){return this.$from().self},Transition.prototype.to=function(){return this.$to().self},Transition.prototype.is=function(compare){return compare instanceof Transition?this.is({to:compare.$to().name,from:compare.$from().name}):!(compare.to&&!hookRegistry_1.matchState(this.$to(),compare.to)||compare.from&&!hookRegistry_1.matchState(this.$from(),compare.from))},Transition.prototype.params=function(pathname){return void 0===pathname&&(pathname="to"),this._treeChanges[pathname].map(hof_1.prop("paramValues")).reduce(common_1.mergeR,{})},Transition.prototype.injector=function(state){var path=this.treeChanges().to;return state&&(path=pathFactory_1.PathFactory.subPath(path,function(node){return node.state===state||node.state.name===state})),new resolveContext_1.ResolveContext(path).injector()},Transition.prototype.getResolveTokens=function(){return new resolveContext_1.ResolveContext(this._treeChanges.to).getTokens()},Transition.prototype.getResolveValue=function(token){var resolveContext=new resolveContext_1.ResolveContext(this._treeChanges.to),getData=function(token){var resolvable=resolveContext.getResolvable(token);if(void 0===resolvable)throw new Error("Dependency Injection token not found: ${stringify(token)}");return resolvable.data};return predicates_1.isArray(token)?token.map(getData):getData(token)},Transition.prototype.addResolvable=function(resolvable,state){void 0===state&&(state="");var stateName="string"==typeof state?state:state.name,topath=this._treeChanges.to,targetNode=common_1.find(topath,function(node){return node.state.name===stateName}),resolveContext=new resolveContext_1.ResolveContext(topath);resolveContext.addResolvables([resolvable],targetNode.state)},Transition.prototype.previous=function(){return this._options.previous||null},Transition.prototype.options=function(){return this._options},Transition.prototype.entering=function(){return common_1.map(this._treeChanges.entering,hof_1.prop("state")).map(stateSelf)},Transition.prototype.exiting=function(){return common_1.map(this._treeChanges.exiting,hof_1.prop("state")).map(stateSelf).reverse()},Transition.prototype.retained=function(){return common_1.map(this._treeChanges.retained,hof_1.prop("state")).map(stateSelf)},Transition.prototype.views=function(pathname,state){void 0===pathname&&(pathname="entering");var path=this._treeChanges[pathname];return path=state?path.filter(hof_1.propEq("state",state)):path,path.map(hof_1.prop("views")).filter(common_1.identity).reduce(common_1.unnestR,[])},Transition.prototype.redirect=function(targetState){var newOptions=common_1.extend({},this.options(),targetState.options(),{previous:this});targetState=new targetState_1.TargetState(targetState.identifier(),targetState.$state(),targetState.params(),newOptions);var newTransition=this.router.transitionService.create(this._treeChanges.from,targetState),originalEnteringNodes=this.treeChanges().entering,redirectEnteringNodes=newTransition.treeChanges().entering,nodeIsReloading=function(reloadState){return function(node){return reloadState&&node.state.includes[reloadState.name]}},matchingEnteringNodes=node_1.PathNode.matching(redirectEnteringNodes,originalEnteringNodes).filter(hof_1.not(nodeIsReloading(targetState.options().reloadState)));return matchingEnteringNodes.forEach(function(node,idx){node.resolvables=originalEnteringNodes[idx].resolvables}),newTransition},Transition.prototype._changedParams=function(){var _a=this._treeChanges,to=_a.to,from=_a.from;if(!this._options.reload&&common_1.tail(to).state===common_1.tail(from).state){var nodeSchemas=to.map(function(node){return node.paramSchema}),_b=[to,from].map(function(path){return path.map(function(x){return x.paramValues})}),toValues=_b[0],fromValues=_b[1],tuples=common_1.arrayTuples(nodeSchemas,toValues,fromValues);return tuples.map(function(_a){var schema=_a[0],toVals=_a[1],fromVals=_a[2];return param_1.Param.changed(schema,toVals,fromVals)}).reduce(common_1.unnestR,[])}},Transition.prototype.dynamic=function(){var changes=this._changedParams();return!!changes&&changes.map(function(x){return x.dynamic}).reduce(common_1.anyTrueR,!1)},Transition.prototype.ignored=function(){var changes=this._changedParams();return!!changes&&0===changes.length},Transition.prototype.hookBuilder=function(){return new hookBuilder_1.HookBuilder(this.router.transitionService,this,{transition:this,current:this._options.current})},Transition.prototype.run=function(){var _this=this,runSynchronousHooks=transitionHook_1.TransitionHook.runSynchronousHooks,hookBuilder=this.hookBuilder(),globals=this.router.globals;globals.transitionHistory.enqueue(this);var syncResult=runSynchronousHooks(hookBuilder.getOnBeforeHooks());if(rejectFactory_1.Rejection.isTransitionRejectionPromise(syncResult)){syncResult["catch"](function(){return 0});var rejectReason=syncResult._transitionRejection;return this._deferred.reject(rejectReason),this.promise}if(!this.valid()){var error=new Error(this.error());return this._deferred.reject(error),this.promise}if(this.ignored())return trace_1.trace.traceTransitionIgnored(this),this._deferred.reject(rejectFactory_1.Rejection.ignored()),this.promise;var transitionSuccess=function(){trace_1.trace.traceSuccess(_this.$to(),_this),_this.success=!0,_this._deferred.resolve(_this.to()),runSynchronousHooks(hookBuilder.getOnSuccessHooks(),!0)},transitionError=function(error){trace_1.trace.traceError(error,_this),_this.success=!1,_this._deferred.reject(error),runSynchronousHooks(hookBuilder.getOnErrorHooks(),!0)};trace_1.trace.traceTransitionStart(this);var appendHookToChain=function(prev,nextHook){return prev.then(function(){return nextHook.invokeHook()})};return hookBuilder.asyncHooks().reduce(appendHookToChain,syncResult).then(transitionSuccess,transitionError),this.promise},Transition.prototype.valid=function(){return!this.error()},Transition.prototype.error=function(){var state=this.$to();return state.self[common_1.abstractKey]?"Cannot transition to abstract state '"+state.name+"'":param_1.Param.validates(state.parameters(),this.params())?void 0:"Param values not valid for state '"+state.name+"'"},Transition.prototype.toString=function(){var fromStateOrName=this.from(),toStateOrName=this.to(),avoidEmptyHash=function(params){return null!==params["#"]&&void 0!==params["#"]?params:common_1.omit(params,"#")},id=this.$id,from=predicates_1.isObject(fromStateOrName)?fromStateOrName.name:fromStateOrName,fromParams=common_1.toJson(avoidEmptyHash(this._treeChanges.from.map(hof_1.prop("paramValues")).reduce(common_1.mergeR,{}))),toValid=this.valid()?"":"(X) ",to=predicates_1.isObject(toStateOrName)?toStateOrName.name:toStateOrName,toParams=common_1.toJson(avoidEmptyHash(this.params()));return"Transition#"+id+"( '"+from+"'"+fromParams+" -> "+toValid+"'"+to+"'"+toParams+" )"},Transition.diToken=Transition,Transition}();exports.Transition=Transition},function(module,exports,__webpack_require__){"use strict";function uiViewString(viewData){return viewData?"[ui-view#"+viewData.id+" tag "+("in template from '"+(viewData.creationContext&&viewData.creationContext.name||"(root)")+"' state]: ")+("fqn: '"+viewData.fqn+"', ")+("name: '"+viewData.name+"@"+viewData.creationContext+"')"):"ui-view (defunct)"}function normalizedCat(input){return predicates_1.isNumber(input)?Category[input]:Category[Category[input]]}var hof_1=__webpack_require__(5),predicates_1=__webpack_require__(4),strings_1=__webpack_require__(9),viewConfigString=function(viewConfig){return"[ViewConfig#"+viewConfig.$id+" from '"+(viewConfig.viewDecl.$context.name||"(root)")+"' state]: target ui-view: '"+viewConfig.viewDecl.$uiViewName+"@"+viewConfig.viewDecl.$uiViewContextAnchor+"'"};!function(Category){Category[Category.RESOLVE=0]="RESOLVE",Category[Category.TRANSITION=1]="TRANSITION",Category[Category.HOOK=2]="HOOK",Category[Category.INVOKE=3]="INVOKE",Category[Category.UIVIEW=4]="UIVIEW",Category[Category.VIEWCONFIG=5]="VIEWCONFIG"}(exports.Category||(exports.Category={}));var Category=exports.Category,Trace=function(){function Trace(){this._enabled={},this.approximateDigests=0}return Trace.prototype._set=function(enabled,categories){var _this=this;categories.length||(categories=Object.keys(Category).filter(function(k){return isNaN(parseInt(k,10))}).map(function(key){return Category[key]})),categories.map(normalizedCat).forEach(function(category){return _this._enabled[category]=enabled})},Trace.prototype.enable=function(){for(var categories=[],_i=0;_i<arguments.length;_i++)categories[_i-0]=arguments[_i];this._set(!0,categories)},Trace.prototype.disable=function(){for(var categories=[],_i=0;_i<arguments.length;_i++)categories[_i-0]=arguments[_i];this._set(!1,categories)},Trace.prototype.enabled=function(category){return!!this._enabled[normalizedCat(category)]},Trace.prototype.traceTransitionStart=function(transition){if(this.enabled(Category.TRANSITION)){var tid=transition.$id,digest=this.approximateDigests,transitionStr=strings_1.stringify(transition);console.log("Transition #"+tid+" Digest #"+digest+": Started  -> "+transitionStr)}},Trace.prototype.traceTransitionIgnored=function(trans){if(this.enabled(Category.TRANSITION)){var tid=trans&&trans.$id,digest=this.approximateDigests,transitionStr=strings_1.stringify(trans);console.log("Transition #"+tid+" Digest #"+digest+": Ignored  <> "+transitionStr)}},Trace.prototype.traceHookInvocation=function(step,options){if(this.enabled(Category.HOOK)){var tid=hof_1.parse("transition.$id")(options),digest=this.approximateDigests,event=hof_1.parse("traceData.hookType")(options)||"internal",context=hof_1.parse("traceData.context.state.name")(options)||hof_1.parse("traceData.context")(options)||"unknown",name=strings_1.functionToString(step.fn);console.log("Transition #"+tid+" Digest #"+digest+":   Hook -> "+event+" context: "+context+", "+strings_1.maxLength(200,name))}},Trace.prototype.traceHookResult=function(hookResult,transitionResult,transitionOptions){if(this.enabled(Category.HOOK)){var tid=hof_1.parse("transition.$id")(transitionOptions),digest=this.approximateDigests,hookResultStr=strings_1.stringify(hookResult),transitionResultStr=strings_1.stringify(transitionResult);console.log("Transition #"+tid+" Digest #"+digest+":   <- Hook returned: "+strings_1.maxLength(200,hookResultStr)+", transition result: "+strings_1.maxLength(200,transitionResultStr))}},Trace.prototype.traceResolvePath=function(path,when,trans){if(this.enabled(Category.RESOLVE)){var tid=trans&&trans.$id,digest=this.approximateDigests,pathStr=path&&path.toString();console.log("Transition #"+tid+" Digest #"+digest+":         Resolving "+pathStr+" ("+when+")");
}},Trace.prototype.traceResolvableResolved=function(resolvable,trans){if(this.enabled(Category.RESOLVE)){var tid=trans&&trans.$id,digest=this.approximateDigests,resolvableStr=resolvable&&resolvable.toString(),result=strings_1.stringify(resolvable.data);console.log("Transition #"+tid+" Digest #"+digest+":               <- Resolved  "+resolvableStr+" to: "+strings_1.maxLength(200,result))}},Trace.prototype.traceError=function(error,trans){if(this.enabled(Category.TRANSITION)){var tid=trans&&trans.$id,digest=this.approximateDigests,transitionStr=strings_1.stringify(trans);console.log("Transition #"+tid+" Digest #"+digest+": <- Rejected "+transitionStr+", reason: "+error)}},Trace.prototype.traceSuccess=function(finalState,trans){if(this.enabled(Category.TRANSITION)){var tid=trans&&trans.$id,digest=this.approximateDigests,state=finalState.name,transitionStr=strings_1.stringify(trans);console.log("Transition #"+tid+" Digest #"+digest+": <- Success  "+transitionStr+", final state: "+state)}},Trace.prototype.traceUIViewEvent=function(event,viewData,extra){void 0===extra&&(extra=""),this.enabled(Category.UIVIEW)&&console.log("ui-view: "+strings_1.padString(30,event)+" "+uiViewString(viewData)+extra)},Trace.prototype.traceUIViewConfigUpdated=function(viewData,context){this.enabled(Category.UIVIEW)&&this.traceUIViewEvent("Updating",viewData," with ViewConfig from context='"+context+"'")},Trace.prototype.traceUIViewScopeCreated=function(viewData,newScope){this.enabled(Category.UIVIEW)&&this.traceUIViewEvent("Created scope for",viewData,", scope #"+newScope.$id)},Trace.prototype.traceUIViewFill=function(viewData,html){this.enabled(Category.UIVIEW)&&this.traceUIViewEvent("Fill",viewData," with: "+strings_1.maxLength(200,html))},Trace.prototype.traceViewServiceEvent=function(event,viewConfig){this.enabled(Category.VIEWCONFIG)&&console.log("VIEWCONFIG: "+event+" "+viewConfigString(viewConfig))},Trace.prototype.traceViewServiceUIViewEvent=function(event,viewData){this.enabled(Category.VIEWCONFIG)&&console.log("VIEWCONFIG: "+event+" "+uiViewString(viewData))},Trace}();exports.Trace=Trace;var trace=new Trace;exports.trace=trace},function(module,exports,__webpack_require__){"use strict";var common_1=__webpack_require__(3),strings_1=__webpack_require__(9),predicates_1=__webpack_require__(4),hof_1=__webpack_require__(5),trace_1=__webpack_require__(12),coreservices_1=__webpack_require__(6),rejectFactory_1=__webpack_require__(10),targetState_1=__webpack_require__(14),defaultOptions={async:!0,rejectIfSuperseded:!0,current:common_1.noop,transition:null,traceData:{},bind:null},TransitionHook=function(){function TransitionHook(transition,stateContext,hookFn,resolveContext,options){var _this=this;this.transition=transition,this.stateContext=stateContext,this.hookFn=hookFn,this.resolveContext=resolveContext,this.options=options,this.isSuperseded=function(){return _this.options.current()!==_this.options.transition},this.options=common_1.defaults(options,defaultOptions)}return TransitionHook.prototype.invokeHook=function(){var _a=this,options=_a.options,hookFn=_a.hookFn;_a.resolveContext;if(trace_1.trace.traceHookInvocation(this,options),options.rejectIfSuperseded&&this.isSuperseded())return rejectFactory_1.Rejection.superseded(options.current()).toPromise();var hookResult=hookFn.call(options.bind,this.transition,this.stateContext);return this.handleHookResult(hookResult)},TransitionHook.prototype.handleHookResult=function(hookResult){var _this=this;if(predicates_1.isDefined(hookResult)){var mapHookResult=hof_1.pattern([[this.isSuperseded,function(){return rejectFactory_1.Rejection.superseded(_this.options.current()).toPromise()}],[hof_1.eq(!1),function(){return rejectFactory_1.Rejection.aborted("Hook aborted transition").toPromise()}],[hof_1.is(targetState_1.TargetState),function(target){return rejectFactory_1.Rejection.redirected(target).toPromise()}],[predicates_1.isPromise,function(promise){return promise.then(_this.handleHookResult.bind(_this))}]]),transitionResult=mapHookResult(hookResult);return transitionResult&&trace_1.trace.traceHookResult(hookResult,transitionResult,this.options),transitionResult}},TransitionHook.prototype.toString=function(){var _a=this,options=_a.options,hookFn=_a.hookFn,event=hof_1.parse("traceData.hookType")(options)||"internal",context=hof_1.parse("traceData.context.state.name")(options)||hof_1.parse("traceData.context")(options)||"unknown",name=strings_1.fnToString(hookFn);return event+" context: "+context+", "+strings_1.maxLength(200,name)},TransitionHook.runSynchronousHooks=function(hooks,swallowExceptions){void 0===swallowExceptions&&(swallowExceptions=!1);for(var results=[],i=0;i<hooks.length;i++)try{results.push(hooks[i].invokeHook())}catch(exception){if(!swallowExceptions)return rejectFactory_1.Rejection.errored(exception).toPromise();console.error("Swallowed exception during synchronous hook handler: "+exception)}var rejections=results.filter(rejectFactory_1.Rejection.isTransitionRejectionPromise);return rejections.length?rejections[0]:results.filter(predicates_1.isPromise).reduce(function(chain,promise){return chain.then(hof_1.val(promise))},coreservices_1.services.$q.when())},TransitionHook}();exports.TransitionHook=TransitionHook},function(module,exports){"use strict";var TargetState=function(){function TargetState(_identifier,_definition,_params,_options){void 0===_params&&(_params={}),void 0===_options&&(_options={}),this._identifier=_identifier,this._definition=_definition,this._options=_options,this._params=_params||{}}return TargetState.prototype.name=function(){return this._definition&&this._definition.name||this._identifier},TargetState.prototype.identifier=function(){return this._identifier},TargetState.prototype.params=function(){return this._params},TargetState.prototype.$state=function(){return this._definition},TargetState.prototype.state=function(){return this._definition&&this._definition.self},TargetState.prototype.options=function(){return this._options},TargetState.prototype.exists=function(){return!(!this._definition||!this._definition.self)},TargetState.prototype.valid=function(){return!this.error()},TargetState.prototype.error=function(){var base=this.options().relative;if(!this._definition&&base){var stateName=base.name?base.name:base;return"Could not resolve '"+this.name()+"' from state '"+stateName+"'"}return this._definition?this._definition.self?void 0:"State '"+this.name()+"' has an invalid definition":"No such state '"+this.name()+"'"},TargetState}();exports.TargetState=TargetState},function(module,exports,__webpack_require__){"use strict";function matchState(state,criterion){function matchGlobs(_state){for(var globStrings=toMatch,i=0;i<globStrings.length;i++){var glob=glob_1.Glob.fromString(globStrings[i]);if(glob&&glob.matches(_state.name)||!glob&&globStrings[i]===_state.name)return!0}return!1}var toMatch=predicates_1.isString(criterion)?[criterion]:criterion,matchFn=predicates_1.isFunction(toMatch)?toMatch:matchGlobs;return!!matchFn(state)}function makeHookRegistrationFn(hooks,name){return function(matchObject,callback,options){void 0===options&&(options={});var eventHook=new EventHook(matchObject,callback,options);return hooks[name].push(eventHook),function(){common_1.removeFrom(hooks[name])(eventHook)}}}var common_1=__webpack_require__(3),predicates_1=__webpack_require__(4),glob_1=__webpack_require__(7);exports.matchState=matchState;var EventHook=function(){function EventHook(matchCriteria,callback,options){void 0===options&&(options={}),this.callback=callback,this.matchCriteria=common_1.extend({to:!0,from:!0,exiting:!0,retained:!0,entering:!0},matchCriteria),this.priority=options.priority||0,this.bind=options.bind||null}return EventHook._matchingNodes=function(nodes,criterion){if(criterion===!0)return nodes;var matching=nodes.filter(function(node){return matchState(node.state,criterion)});return matching.length?matching:null},EventHook.prototype.matches=function(treeChanges){var mc=this.matchCriteria,_matchingNodes=EventHook._matchingNodes,matches={to:_matchingNodes([common_1.tail(treeChanges.to)],mc.to),from:_matchingNodes([common_1.tail(treeChanges.from)],mc.from),exiting:_matchingNodes(treeChanges.exiting,mc.exiting),retained:_matchingNodes(treeChanges.retained,mc.retained),entering:_matchingNodes(treeChanges.entering,mc.entering)},allMatched=["to","from","exiting","retained","entering"].map(function(prop){return matches[prop]}).reduce(common_1.allTrueR,!0);return allMatched?matches:null},EventHook}();exports.EventHook=EventHook;var HookRegistry=function(){function HookRegistry(){var _this=this;this._transitionEvents={onBefore:[],onStart:[],onEnter:[],onRetain:[],onExit:[],onFinish:[],onSuccess:[],onError:[]},this.getHooks=function(name){return _this._transitionEvents[name]},this.onBefore=makeHookRegistrationFn(this._transitionEvents,"onBefore"),this.onStart=makeHookRegistrationFn(this._transitionEvents,"onStart"),this.onEnter=makeHookRegistrationFn(this._transitionEvents,"onEnter"),this.onRetain=makeHookRegistrationFn(this._transitionEvents,"onRetain"),this.onExit=makeHookRegistrationFn(this._transitionEvents,"onExit"),this.onFinish=makeHookRegistrationFn(this._transitionEvents,"onFinish"),this.onSuccess=makeHookRegistrationFn(this._transitionEvents,"onSuccess"),this.onError=makeHookRegistrationFn(this._transitionEvents,"onError")}return HookRegistry.mixin=function(source,target){Object.keys(source._transitionEvents).concat(["getHooks"]).forEach(function(key){return target[key]=source[key]})},HookRegistry}();exports.HookRegistry=HookRegistry},function(module,exports,__webpack_require__){"use strict";function tupleSort(reverseDepthSort){return void 0===reverseDepthSort&&(reverseDepthSort=!1),function(l,r){var factor=reverseDepthSort?-1:1,depthDelta=(l.node.state.path.length-r.node.state.path.length)*factor;return 0!==depthDelta?depthDelta:r.hook.priority-l.hook.priority}}var common_1=__webpack_require__(3),predicates_1=__webpack_require__(4),transitionHook_1=__webpack_require__(13),resolveContext_1=__webpack_require__(17),HookBuilder=function(){function HookBuilder($transitions,transition,baseHookOptions){var _this=this;this.$transitions=$transitions,this.transition=transition,this.baseHookOptions=baseHookOptions,this.getOnBeforeHooks=function(){return _this._buildNodeHooks("onBefore","to",tupleSort(),{async:!1})},this.getOnStartHooks=function(){return _this._buildNodeHooks("onStart","to",tupleSort())},this.getOnExitHooks=function(){return _this._buildNodeHooks("onExit","exiting",tupleSort(!0),{stateHook:!0})},this.getOnRetainHooks=function(){return _this._buildNodeHooks("onRetain","retained",tupleSort(!1),{stateHook:!0})},this.getOnEnterHooks=function(){return _this._buildNodeHooks("onEnter","entering",tupleSort(!1),{stateHook:!0})},this.getOnFinishHooks=function(){return _this._buildNodeHooks("onFinish","to",tupleSort())},this.getOnSuccessHooks=function(){return _this._buildNodeHooks("onSuccess","to",tupleSort(),{async:!1,rejectIfSuperseded:!1})},this.getOnErrorHooks=function(){return _this._buildNodeHooks("onError","to",tupleSort(),{async:!1,rejectIfSuperseded:!1})},this.treeChanges=transition.treeChanges(),this.toState=common_1.tail(this.treeChanges.to).state,this.fromState=common_1.tail(this.treeChanges.from).state,this.transitionOptions=transition.options()}return HookBuilder.prototype.asyncHooks=function(){var onStartHooks=this.getOnStartHooks(),onExitHooks=this.getOnExitHooks(),onRetainHooks=this.getOnRetainHooks(),onEnterHooks=this.getOnEnterHooks(),onFinishHooks=this.getOnFinishHooks(),asyncHooks=[onStartHooks,onExitHooks,onRetainHooks,onEnterHooks,onFinishHooks];return asyncHooks.reduce(common_1.unnestR,[]).filter(common_1.identity)},HookBuilder.prototype._buildNodeHooks=function(hookType,matchingNodesProp,sortHooksFn,options){var _this=this,matchingHooks=this._matchingHooks(hookType,this.treeChanges);if(!matchingHooks)return[];var makeTransitionHooks=function(hook){var matches=hook.matches(_this.treeChanges),matchingNodes=matches[matchingNodesProp],resolvePath="exiting"===matchingNodesProp?_this.treeChanges.from:_this.treeChanges.to,resolveContext=new resolveContext_1.ResolveContext(resolvePath);return matchingNodes.map(function(node){var _options=common_1.extend({bind:hook.bind,traceData:{hookType:hookType,context:node}},_this.baseHookOptions,options),state=_options.stateHook?node.state:null,context=resolveContext.subContext(node.state),transitionHook=new transitionHook_1.TransitionHook(_this.transition,state,hook.callback,context,_options);return{hook:hook,node:node,transitionHook:transitionHook}})};return matchingHooks.map(makeTransitionHooks).reduce(common_1.unnestR,[]).sort(sortHooksFn).map(function(tuple){return tuple.transitionHook})},HookBuilder.prototype._matchingHooks=function(hookName,treeChanges){return[this.transition,this.$transitions].map(function(reg){return reg.getHooks(hookName)}).filter(common_1.assertPredicate(predicates_1.isArray,"broken event named: "+hookName)).reduce(common_1.unnestR,[]).filter(function(hook){return hook.matches(treeChanges)})},HookBuilder}();exports.HookBuilder=HookBuilder},function(module,exports,__webpack_require__){"use strict";var common_1=__webpack_require__(3),hof_1=__webpack_require__(5),trace_1=__webpack_require__(12),coreservices_1=__webpack_require__(6),interface_1=__webpack_require__(18),resolvable_1=__webpack_require__(19),pathFactory_1=__webpack_require__(20),strings_1=__webpack_require__(9),when=interface_1.resolvePolicies.when,ALL_WHENS=[when.EAGER,when.LAZY],EAGER_WHENS=[when.EAGER],ResolveContext=function(){function ResolveContext(_path){this._path=_path}return ResolveContext.prototype.getTokens=function(){return this._path.reduce(function(acc,node){return acc.concat(node.resolvables.map(function(r){return r.token}))},[]).reduce(common_1.uniqR,[])},ResolveContext.prototype.getResolvable=function(token){var matching=this._path.map(function(node){return node.resolvables}).reduce(common_1.unnestR,[]).filter(function(r){return r.token===token});return common_1.tail(matching)},ResolveContext.prototype.subContext=function(state){return new ResolveContext(pathFactory_1.PathFactory.subPath(this._path,function(node){return node.state===state}))},ResolveContext.prototype.addResolvables=function(newResolvables,state){var node=common_1.find(this._path,hof_1.propEq("state",state)),keys=newResolvables.map(function(r){return r.token});node.resolvables=node.resolvables.filter(function(r){return keys.indexOf(r.token)===-1}).concat(newResolvables)},ResolveContext.prototype.resolvePath=function(when,trans){var _this=this;void 0===when&&(when="LAZY");var whenOption=common_1.inArray(ALL_WHENS,when)?when:"LAZY",matchedWhens=whenOption===interface_1.resolvePolicies.when.EAGER?EAGER_WHENS:ALL_WHENS;trace_1.trace.traceResolvePath(this._path,when,trans);var promises=this._path.reduce(function(acc,node){var matchesRequestedPolicy=function(resolvable){return common_1.inArray(matchedWhens,resolvable.getPolicy(node.state).when)},nodeResolvables=node.resolvables.filter(matchesRequestedPolicy),subContext=_this.subContext(node.state),getResult=function(r){return r.get(subContext,trans).then(function(value){return{token:r.token,value:value}})};return acc.concat(nodeResolvables.map(getResult))},[]);return coreservices_1.services.$q.all(promises)},ResolveContext.prototype.injector=function(){return new UIInjectorImpl(this)},ResolveContext.prototype.findNode=function(resolvable){return common_1.find(this._path,function(node){return common_1.inArray(node.resolvables,resolvable)})},ResolveContext.prototype.getDependencies=function(resolvable){var node=this.findNode(resolvable),subPath=pathFactory_1.PathFactory.subPath(this._path,function(x){return x===node})||this._path,availableResolvables=subPath.reduce(function(acc,node){return acc.concat(node.resolvables)},[]).filter(function(res){return res!==resolvable}),getDependency=function(token){var matching=availableResolvables.filter(function(r){return r.token===token});if(matching.length)return common_1.tail(matching);var fromInjector=coreservices_1.services.$injector.get(token);if(!fromInjector)throw new Error("Could not find Dependency Injection token: "+strings_1.stringify(token));return new resolvable_1.Resolvable(token,function(){return fromInjector},[],fromInjector)};return resolvable.deps.map(getDependency)},ResolveContext}();exports.ResolveContext=ResolveContext;var UIInjectorImpl=function(){function UIInjectorImpl(context){this.context=context,this["native"]=coreservices_1.services.$injector}return UIInjectorImpl.prototype.get=function(token){var resolvable=this.context.getResolvable(token);if(resolvable){if(!resolvable.resolved)throw new Error("Resolvable async .get() not complete:"+strings_1.stringify(resolvable.token));return resolvable.data}return coreservices_1.services.$injector.get(token)},UIInjectorImpl.prototype.getAsync=function(token){var resolvable=this.context.getResolvable(token);return resolvable?resolvable.get(this.context):coreservices_1.services.$q.when(coreservices_1.services.$injector.get(token))},UIInjectorImpl}()},function(module,exports){"use strict";exports.resolvePolicies={when:{LAZY:"LAZY",EAGER:"EAGER"},async:{WAIT:"WAIT",NOWAIT:"NOWAIT",RXWAIT:"RXWAIT"}}},function(module,exports,__webpack_require__){"use strict";var common_1=__webpack_require__(3),coreservices_1=__webpack_require__(6),trace_1=__webpack_require__(12),strings_1=__webpack_require__(9),predicates_1=__webpack_require__(4);exports.defaultResolvePolicy={when:"LAZY",async:"WAIT"};var Resolvable=function(){function Resolvable(arg1,resolveFn,deps,policy,data){if(this.resolved=!1,this.promise=void 0,arg1 instanceof Resolvable)common_1.extend(this,arg1);else if(predicates_1.isFunction(resolveFn)){if(null==arg1||void 0==arg1)throw new Error("new Resolvable(): token argument is required");if(!predicates_1.isFunction(resolveFn))throw new Error("new Resolvable(): resolveFn argument must be a function");this.token=arg1,this.policy=policy,this.resolveFn=resolveFn,this.deps=deps||[],this.data=data,this.resolved=void 0!==data,this.promise=this.resolved?coreservices_1.services.$q.when(this.data):void 0}else if(predicates_1.isObject(arg1)&&arg1.token&&predicates_1.isFunction(arg1.resolveFn)){var literal=arg1;return new Resolvable(literal.token,literal.resolveFn,literal.deps,literal.policy,literal.data)}}return Resolvable.prototype.getPolicy=function(state){var thisPolicy=this.policy||{},statePolicy=state&&state.resolvePolicy||{};return{when:thisPolicy.when||statePolicy.when||exports.defaultResolvePolicy.when,async:thisPolicy.async||statePolicy.async||exports.defaultResolvePolicy.async}},Resolvable.prototype.resolve=function(resolveContext,trans){var _this=this,$q=coreservices_1.services.$q,getResolvableDependencies=function(){return $q.all(resolveContext.getDependencies(_this).map(function(r){return r.get(resolveContext,trans)}))},invokeResolveFn=function(resolvedDeps){return _this.resolveFn.apply(null,resolvedDeps)},waitForRx=function(observable$){var cached=observable$.cache();return cached.toPromise().then(function(){return cached})},node=resolveContext.findNode(this),state=node&&node.state,maybeWaitForRx="RXWAIT"===this.getPolicy(state).async?waitForRx:function(x){return x},applyResolvedValue=function(resolvedValue){return _this.data=resolvedValue,_this.resolved=!0,trace_1.trace.traceResolvableResolved(_this,trans),_this.data};return this.promise=$q.when().then(getResolvableDependencies).then(invokeResolveFn).then(maybeWaitForRx).then(applyResolvedValue)},Resolvable.prototype.get=function(resolveContext,trans){return this.promise||this.resolve(resolveContext,trans)},Resolvable.prototype.toString=function(){return"Resolvable(token: "+strings_1.stringify(this.token)+", requires: ["+this.deps.map(strings_1.stringify)+"])"},Resolvable.prototype.clone=function(){return new Resolvable(this)},Resolvable}();exports.Resolvable=Resolvable},function(module,exports,__webpack_require__){"use strict";var common_1=__webpack_require__(3),hof_1=__webpack_require__(5),targetState_1=__webpack_require__(14),node_1=__webpack_require__(21),PathFactory=function(){function PathFactory(){}return PathFactory.makeTargetState=function(path){var state=common_1.tail(path).state;return new targetState_1.TargetState(state,state,path.map(hof_1.prop("paramValues")).reduce(common_1.mergeR,{}))},PathFactory.buildPath=function(targetState){var toParams=targetState.params();return targetState.$state().path.map(function(state){return new node_1.PathNode(state).applyRawParams(toParams)})},PathFactory.buildToPath=function(fromPath,targetState){var toPath=PathFactory.buildPath(targetState);return targetState.options().inherit?PathFactory.inheritParams(fromPath,toPath,Object.keys(targetState.params())):toPath},PathFactory.applyViewConfigs=function($view,path,states){path.filter(function(node){return common_1.inArray(states,node.state)}).forEach(function(node){var viewDecls=common_1.values(node.state.views||{}),subPath=PathFactory.subPath(path,function(n){return n===node}),viewConfigs=viewDecls.map(function(view){return $view.createViewConfig(subPath,view)});node.views=viewConfigs.reduce(common_1.unnestR,[])})},PathFactory.inheritParams=function(fromPath,toPath,toKeys){function nodeParamVals(path,state){var node=common_1.find(path,hof_1.propEq("state",state));return common_1.extend({},node&&node.paramValues)}function makeInheritedParamsNode(toNode){var toParamVals=common_1.extend({},toNode&&toNode.paramValues),incomingParamVals=common_1.pick(toParamVals,toKeys);toParamVals=common_1.omit(toParamVals,toKeys);var fromParamVals=nodeParamVals(fromPath,toNode.state)||{},ownParamVals=common_1.extend(toParamVals,fromParamVals,incomingParamVals);return new node_1.PathNode(toNode.state).applyRawParams(ownParamVals)}return void 0===toKeys&&(toKeys=[]),toPath.map(makeInheritedParamsNode)},PathFactory.treeChanges=function(fromPath,toPath,reloadState){function applyToParams(retainedNode,idx){var cloned=node_1.PathNode.clone(retainedNode);return cloned.paramValues=toPath[idx].paramValues,cloned}for(var keep=0,max=Math.min(fromPath.length,toPath.length),staticParams=function(state){return state.parameters({inherit:!1}).filter(hof_1.not(hof_1.prop("dynamic"))).map(hof_1.prop("id"))},nodesMatch=function(node1,node2){return node1.equals(node2,staticParams(node1.state))};keep<max&&fromPath[keep].state!==reloadState&&nodesMatch(fromPath[keep],toPath[keep]);)keep++;var from,retained,exiting,entering,to;from=fromPath,retained=from.slice(0,keep),exiting=from.slice(keep);var retainedWithToParams=retained.map(applyToParams);return entering=toPath.slice(keep),to=retainedWithToParams.concat(entering),{from:from,to:to,retained:retained,exiting:exiting,entering:entering}},PathFactory.subPath=function(path,predicate){var node=common_1.find(path,predicate),elementIdx=path.indexOf(node);return elementIdx===-1?void 0:path.slice(0,elementIdx+1)},PathFactory.paramValues=function(path){return path.reduce(function(acc,node){return common_1.extend(acc,node.paramValues)},{})},PathFactory}();exports.PathFactory=PathFactory},function(module,exports,__webpack_require__){"use strict";var common_1=__webpack_require__(3),hof_1=__webpack_require__(5),param_1=__webpack_require__(22),PathNode=function(){function PathNode(state){if(state instanceof PathNode){var node=state;this.state=node.state,this.paramSchema=node.paramSchema.slice(),this.paramValues=common_1.extend({},node.paramValues),this.resolvables=node.resolvables.slice(),this.views=node.views&&node.views.slice()}else this.state=state,this.paramSchema=state.parameters({inherit:!1}),this.paramValues={},this.resolvables=state.resolvables.map(function(res){return res.clone()})}return PathNode.prototype.applyRawParams=function(params){var getParamVal=function(paramDef){return[paramDef.id,paramDef.value(params[paramDef.id])]};return this.paramValues=this.paramSchema.reduce(function(memo,pDef){return common_1.applyPairs(memo,getParamVal(pDef))},{}),this},PathNode.prototype.parameter=function(name){return common_1.find(this.paramSchema,hof_1.propEq("id",name))},PathNode.prototype.equals=function(node,keys){var _this=this;void 0===keys&&(keys=this.paramSchema.map(hof_1.prop("id")));var paramValsEq=function(key){return _this.parameter(key).type.equals(_this.paramValues[key],node.paramValues[key])};return this.state===node.state&&keys.map(paramValsEq).reduce(common_1.allTrueR,!0)},PathNode.clone=function(node){return new PathNode(node)},PathNode.matching=function(pathA,pathB){for(var matching=[],i=0;i<pathA.length&&i<pathB.length;i++){var a=pathA[i],b=pathB[i];if(a.state!==b.state)break;if(!param_1.Param.equals(a.paramSchema,a.paramValues,b.paramValues))break;matching.push(a)}return matching},PathNode}();exports.PathNode=PathNode},function(module,exports,__webpack_require__){"use strict";function unwrapShorthand(cfg){return cfg=isShorthand(cfg)&&{value:cfg}||cfg,common_1.extend(cfg,{$$fn:predicates_1.isInjectable(cfg.value)?cfg.value:function(){return cfg.value}})}function getType(cfg,urlType,location,id){if(cfg.type&&urlType&&"string"!==urlType.name)throw new Error("Param '"+id+"' has two type configurations.");return cfg.type&&urlType&&"string"===urlType.name&&paramTypes_1.paramTypes.type(cfg.type)?paramTypes_1.paramTypes.type(cfg.type):urlType?urlType:cfg.type?cfg.type instanceof type_1.ParamType?cfg.type:paramTypes_1.paramTypes.type(cfg.type):location===DefType.CONFIG?paramTypes_1.paramTypes.type("any"):paramTypes_1.paramTypes.type("string")}function getSquashPolicy(config,isOptional){var squash=config.squash;if(!isOptional||squash===!1)return!1;if(!predicates_1.isDefined(squash)||null==squash)return urlMatcherConfig_1.matcherConfig.defaultSquashPolicy();if(squash===!0||predicates_1.isString(squash))return squash;throw new Error("Invalid squash policy: '"+squash+"'. Valid policies: false, true, or arbitrary string")}function getReplace(config,arrayMode,isOptional,squash){var replace,configuredKeys,defaultPolicy=[{from:"",to:isOptional||arrayMode?void 0:""},{from:null,to:isOptional||arrayMode?void 0:""}];return replace=predicates_1.isArray(config.replace)?config.replace:[],predicates_1.isString(squash)&&replace.push({from:squash,to:void 0}),configuredKeys=common_1.map(replace,hof_1.prop("from")),common_1.filter(defaultPolicy,function(item){return configuredKeys.indexOf(item.from)===-1}).concat(replace)}var common_1=__webpack_require__(3),hof_1=__webpack_require__(5),predicates_1=__webpack_require__(4),coreservices_1=__webpack_require__(6),urlMatcherConfig_1=__webpack_require__(23),type_1=__webpack_require__(24),paramTypes_1=__webpack_require__(25),hasOwn=Object.prototype.hasOwnProperty,isShorthand=function(cfg){return 0===["value","type","squash","array","dynamic"].filter(hasOwn.bind(cfg||{})).length};!function(DefType){DefType[DefType.PATH=0]="PATH",DefType[DefType.SEARCH=1]="SEARCH",DefType[DefType.CONFIG=2]="CONFIG"}(exports.DefType||(exports.DefType={}));var DefType=exports.DefType,Param=function(){function Param(id,type,config,location){function getArrayMode(){var arrayDefaults={array:location===DefType.SEARCH&&"auto"},arrayParamNomenclature=id.match(/\[\]$/)?{array:!0}:{};return common_1.extend(arrayDefaults,arrayParamNomenclature,config).array}config=unwrapShorthand(config),type=getType(config,type,location,id);var arrayMode=getArrayMode();type=arrayMode?type.$asArray(arrayMode,location===DefType.SEARCH):type;var isOptional=void 0!==config.value,dynamic=predicates_1.isDefined(config.dynamic)?!!config.dynamic:!!type.dynamic,squash=getSquashPolicy(config,isOptional),replace=getReplace(config,arrayMode,isOptional,squash);common_1.extend(this,{id:id,type:type,location:location,squash:squash,replace:replace,isOptional:isOptional,dynamic:dynamic,config:config,array:arrayMode})}return Param.prototype.isDefaultValue=function(value){return this.isOptional&&this.type.equals(this.value(),value)},Param.prototype.value=function(value){var _this=this,$$getDefaultValue=function(){if(!coreservices_1.services.$injector)throw new Error("Injectable functions cannot be called at configuration time");var defaultValue=coreservices_1.services.$injector.invoke(_this.config.$$fn);if(null!==defaultValue&&void 0!==defaultValue&&!_this.type.is(defaultValue))throw new Error("Default value ("+defaultValue+") for parameter '"+_this.id+"' is not an instance of ParamType ("+_this.type.name+")");return defaultValue},$replace=function(val){var replacement=common_1.map(common_1.filter(_this.replace,hof_1.propEq("from",val)),hof_1.prop("to"));return replacement.length?replacement[0]:val};return value=$replace(value),predicates_1.isDefined(value)?this.type.$normalize(value):$$getDefaultValue()},Param.prototype.isSearch=function(){return this.location===DefType.SEARCH},Param.prototype.validates=function(value){if((!predicates_1.isDefined(value)||null===value)&&this.isOptional)return!0;var normalized=this.type.$normalize(value);if(!this.type.is(normalized))return!1;var encoded=this.type.encode(normalized);return!(predicates_1.isString(encoded)&&!this.type.pattern.exec(encoded))},Param.prototype.toString=function(){return"{Param:"+this.id+" "+this.type+" squash: '"+this.squash+"' optional: "+this.isOptional+"}"},Param.fromConfig=function(id,type,config){return new Param(id,type,config,DefType.CONFIG)},Param.fromPath=function(id,type,config){return new Param(id,type,config,DefType.PATH)},Param.fromSearch=function(id,type,config){return new Param(id,type,config,DefType.SEARCH)},Param.values=function(params,values){return void 0===values&&(values={}),params.map(function(param){return[param.id,param.value(values[param.id])]}).reduce(common_1.applyPairs,{})},Param.changed=function(params,values1,values2){return void 0===values1&&(values1={}),void 0===values2&&(values2={}),params.filter(function(param){return!param.type.equals(values1[param.id],values2[param.id])})},Param.equals=function(params,values1,values2){return void 0===values1&&(values1={}),void 0===values2&&(values2={}),0===Param.changed(params,values1,values2).length},Param.validates=function(params,values){return void 0===values&&(values={}),params.map(function(param){return param.validates(values[param.id])}).reduce(common_1.allTrueR,!0)},Param}();exports.Param=Param},function(module,exports,__webpack_require__){"use strict";var predicates_1=__webpack_require__(4),MatcherConfig=function(){function MatcherConfig(){this._isCaseInsensitive=!1,this._isStrictMode=!0,this._defaultSquashPolicy=!1}return MatcherConfig.prototype.caseInsensitive=function(value){return this._isCaseInsensitive=predicates_1.isDefined(value)?value:this._isCaseInsensitive},MatcherConfig.prototype.strictMode=function(value){return this._isStrictMode=predicates_1.isDefined(value)?value:this._isStrictMode},MatcherConfig.prototype.defaultSquashPolicy=function(value){if(predicates_1.isDefined(value)&&value!==!0&&value!==!1&&!predicates_1.isString(value))throw new Error("Invalid squash policy: "+value+". Valid policies: false, true, arbitrary-string");return this._defaultSquashPolicy=predicates_1.isDefined(value)?value:this._defaultSquashPolicy},MatcherConfig}();exports.MatcherConfig=MatcherConfig,exports.matcherConfig=new MatcherConfig},function(module,exports,__webpack_require__){"use strict";function ArrayType(type,mode){function arrayWrap(val){return predicates_1.isArray(val)?val:predicates_1.isDefined(val)?[val]:[]}function arrayUnwrap(val){switch(val.length){case 0:return;case 1:return"auto"===mode?val[0]:val;default:return val}}function arrayHandler(callback,allTruthyMode){return function(val){if(predicates_1.isArray(val)&&0===val.length)return val;var arr=arrayWrap(val),result=common_1.map(arr,callback);return allTruthyMode===!0?0===common_1.filter(result,function(x){return!x}).length:arrayUnwrap(result)}}function arrayEqualsHandler(callback){return function(val1,val2){var left=arrayWrap(val1),right=arrayWrap(val2);if(left.length!==right.length)return!1;for(var i=0;i<left.length;i++)if(!callback(left[i],right[i]))return!1;
return!0}}var _this=this;["encode","decode","equals","$normalize"].map(function(name){_this[name]=("equals"===name?arrayEqualsHandler:arrayHandler)(type[name].bind(type))}),common_1.extend(this,{dynamic:type.dynamic,name:type.name,pattern:type.pattern,is:arrayHandler(type.is.bind(type),!0),$arrayMode:mode})}var common_1=__webpack_require__(3),predicates_1=__webpack_require__(4),ParamType=function(){function ParamType(def){this.pattern=/.*/,common_1.extend(this,def)}return ParamType.prototype.is=function(val,key){return!0},ParamType.prototype.encode=function(val,key){return val},ParamType.prototype.decode=function(val,key){return val},ParamType.prototype.equals=function(a,b){return a==b},ParamType.prototype.$subPattern=function(){var sub=this.pattern.toString();return sub.substr(1,sub.length-2)},ParamType.prototype.toString=function(){return"{ParamType:"+this.name+"}"},ParamType.prototype.$normalize=function(val){return this.is(val)?val:this.decode(val)},ParamType.prototype.$asArray=function(mode,isSearch){if(!mode)return this;if("auto"===mode&&!isSearch)throw new Error("'auto' array mode is for query parameters only");return new ArrayType(this,mode)},ParamType}();exports.ParamType=ParamType},function(module,exports,__webpack_require__){"use strict";function valToString(val){return null!=val?val.toString().replace(/~/g,"~~").replace(/\//g,"~2F"):val}function valFromString(val){return null!=val?val.toString().replace(/~2F/g,"/").replace(/~~/g,"~"):val}var common_1=__webpack_require__(3),predicates_1=__webpack_require__(4),hof_1=__webpack_require__(5),coreservices_1=__webpack_require__(6),type_1=__webpack_require__(24),ParamTypes=function(){function ParamTypes(){this.enqueue=!0,this.typeQueue=[],this.defaultTypes={hash:{encode:valToString,decode:valFromString,is:hof_1.is(String),pattern:/.*/,equals:function(a,b){return a==b}},string:{encode:valToString,decode:valFromString,is:hof_1.is(String),pattern:/[^\/]*/},"int":{encode:valToString,decode:function(val){return parseInt(val,10)},is:function(val){return predicates_1.isDefined(val)&&this.decode(val.toString())===val},pattern:/-?\d+/},bool:{encode:function(val){return val&&1||0},decode:function(val){return 0!==parseInt(val,10)},is:hof_1.is(Boolean),pattern:/0|1/},date:{encode:function(val){return this.is(val)?[val.getFullYear(),("0"+(val.getMonth()+1)).slice(-2),("0"+val.getDate()).slice(-2)].join("-"):void 0},decode:function(val){if(this.is(val))return val;var match=this.capture.exec(val);return match?new Date(match[1],match[2]-1,match[3]):void 0},is:function(val){return val instanceof Date&&!isNaN(val.valueOf())},equals:function(l,r){return["getFullYear","getMonth","getDate"].reduce(function(acc,fn){return acc&&l[fn]()===r[fn]()},!0)},pattern:/[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/,capture:/([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/},json:{encode:common_1.toJson,decode:common_1.fromJson,is:hof_1.is(Object),equals:common_1.equals,pattern:/[^\/]*/},any:{encode:common_1.identity,decode:common_1.identity,equals:common_1.equals,pattern:/.*/}};var makeType=function(definition,name){return new type_1.ParamType(common_1.extend({name:name},definition))};this.types=common_1.inherit(common_1.map(this.defaultTypes,makeType),{})}return ParamTypes.prototype.type=function(name,definition,definitionFn){if(!predicates_1.isDefined(definition))return this.types[name];if(this.types.hasOwnProperty(name))throw new Error("A type named '"+name+"' has already been defined.");return this.types[name]=new type_1.ParamType(common_1.extend({name:name},definition)),definitionFn&&(this.typeQueue.push({name:name,def:definitionFn}),this.enqueue||this._flushTypeQueue()),this},ParamTypes.prototype._flushTypeQueue=function(){for(;this.typeQueue.length;){var type=this.typeQueue.shift();if(type.pattern)throw new Error("You cannot override a type's .pattern at runtime.");common_1.extend(this.types[type.name],coreservices_1.services.$injector.invoke(type.def))}},ParamTypes}();exports.ParamTypes=ParamTypes,exports.paramTypes=new ParamTypes},function(module,exports,__webpack_require__){"use strict";var urlMatcherFactory_1=__webpack_require__(27),urlRouter_1=__webpack_require__(29),state_1=__webpack_require__(30),urlRouter_2=__webpack_require__(29),transitionService_1=__webpack_require__(31),view_1=__webpack_require__(37),stateRegistry_1=__webpack_require__(38),stateService_1=__webpack_require__(43),globals_1=__webpack_require__(44),UIRouter=function(){function UIRouter(){this.viewService=new view_1.ViewService,this.transitionService=new transitionService_1.TransitionService(this),this.globals=new globals_1.Globals(this.transitionService),this.urlMatcherFactory=new urlMatcherFactory_1.UrlMatcherFactory,this.urlRouterProvider=new urlRouter_1.UrlRouterProvider(this.urlMatcherFactory,this.globals.params),this.urlRouter=new urlRouter_2.UrlRouter(this.urlRouterProvider),this.stateRegistry=new stateRegistry_1.StateRegistry(this.urlMatcherFactory,this.urlRouterProvider),this.stateProvider=new state_1.StateProvider(this.stateRegistry),this.stateService=new stateService_1.StateService(this),this.viewService.rootContext(this.stateRegistry.root()),this.globals.$current=this.stateRegistry.root(),this.globals.current=this.globals.$current.self}return UIRouter}();exports.UIRouter=UIRouter},function(module,exports,__webpack_require__){"use strict";function getDefaultConfig(){return{strict:urlMatcherConfig_1.matcherConfig.strictMode(),caseInsensitive:urlMatcherConfig_1.matcherConfig.caseInsensitive()}}var common_1=__webpack_require__(3),predicates_1=__webpack_require__(4),urlMatcher_1=__webpack_require__(28),urlMatcherConfig_1=__webpack_require__(23),param_1=__webpack_require__(22),paramTypes_1=__webpack_require__(25),UrlMatcherFactory=function(){function UrlMatcherFactory(){common_1.extend(this,{UrlMatcher:urlMatcher_1.UrlMatcher,Param:param_1.Param})}return UrlMatcherFactory.prototype.caseInsensitive=function(value){return urlMatcherConfig_1.matcherConfig.caseInsensitive(value)},UrlMatcherFactory.prototype.strictMode=function(value){return urlMatcherConfig_1.matcherConfig.strictMode(value)},UrlMatcherFactory.prototype.defaultSquashPolicy=function(value){return urlMatcherConfig_1.matcherConfig.defaultSquashPolicy(value)},UrlMatcherFactory.prototype.compile=function(pattern,config){return new urlMatcher_1.UrlMatcher(pattern,common_1.extend(getDefaultConfig(),config))},UrlMatcherFactory.prototype.isMatcher=function(object){if(!predicates_1.isObject(object))return!1;var result=!0;return common_1.forEach(urlMatcher_1.UrlMatcher.prototype,function(val,name){predicates_1.isFunction(val)&&(result=result&&predicates_1.isDefined(object[name])&&predicates_1.isFunction(object[name]))}),result},UrlMatcherFactory.prototype.type=function(name,definition,definitionFn){var type=paramTypes_1.paramTypes.type(name,definition,definitionFn);return predicates_1.isDefined(definition)?this:type},UrlMatcherFactory.prototype.$get=function(){return paramTypes_1.paramTypes.enqueue=!1,paramTypes_1.paramTypes._flushTypeQueue(),this},UrlMatcherFactory}();exports.UrlMatcherFactory=UrlMatcherFactory},function(module,exports,__webpack_require__){"use strict";function quoteRegExp(string,param){var surroundPattern=["",""],result=string.replace(/[\\\[\]\^$*+?.()|{}]/g,"\\$&");if(!param)return result;switch(param.squash){case!1:surroundPattern=["(",")"+(param.isOptional?"?":"")];break;case!0:result=result.replace(/\/$/,""),surroundPattern=["(?:/(",")|/)?"];break;default:surroundPattern=["("+param.squash+"|",")?"]}return result+surroundPattern[0]+param.type.pattern.source+surroundPattern[1]}var common_1=__webpack_require__(3),hof_1=__webpack_require__(5),predicates_1=__webpack_require__(4),param_1=__webpack_require__(22),paramTypes_1=__webpack_require__(25),predicates_2=__webpack_require__(4),param_2=__webpack_require__(22),common_2=__webpack_require__(3),common_3=__webpack_require__(3),memoizeTo=function(obj,prop,fn){return obj[prop]=obj[prop]||fn()},UrlMatcher=function(){function UrlMatcher(pattern,config){var _this=this;this.config=config,this._cache={path:[],pattern:null},this._children=[],this._params=[],this._segments=[],this._compiled=[],this.pattern=pattern,this.config=common_1.defaults(this.config,{params:{},strict:!0,caseInsensitive:!1,paramMap:common_1.identity});for(var m,p,segment,placeholder=/([:*])([\w\[\]]+)|\{([\w\[\]]+)(?:\:\s*((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,searchPlaceholder=/([:]?)([\w\[\].-]+)|\{([\w\[\].-]+)(?:\:\s*((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,last=0,patterns=[],checkParamErrors=function(id){if(!UrlMatcher.nameValidator.test(id))throw new Error("Invalid parameter name '"+id+"' in pattern '"+pattern+"'");if(common_1.find(_this._params,hof_1.propEq("id",id)))throw new Error("Duplicate parameter name '"+id+"' in pattern '"+pattern+"'")},matchDetails=function(m,isSearch){var id=m[2]||m[3],regexp=isSearch?m[4]:m[4]||("*"===m[1]?".*":null);return{id:id,regexp:regexp,cfg:_this.config.params[id],segment:pattern.substring(last,m.index),type:regexp?paramTypes_1.paramTypes.type(regexp||"string")||common_1.inherit(paramTypes_1.paramTypes.type("string"),{pattern:new RegExp(regexp,_this.config.caseInsensitive?"i":void 0)}):null}};(m=placeholder.exec(pattern))&&(p=matchDetails(m,!1),!(p.segment.indexOf("?")>=0));)checkParamErrors(p.id),this._params.push(param_1.Param.fromPath(p.id,p.type,this.config.paramMap(p.cfg,!1))),this._segments.push(p.segment),patterns.push([p.segment,common_1.tail(this._params)]),last=placeholder.lastIndex;segment=pattern.substring(last);var i=segment.indexOf("?");if(i>=0){var search=segment.substring(i);if(segment=segment.substring(0,i),search.length>0)for(last=0;m=searchPlaceholder.exec(search);)p=matchDetails(m,!0),checkParamErrors(p.id),this._params.push(param_1.Param.fromSearch(p.id,p.type,this.config.paramMap(p.cfg,!0))),last=placeholder.lastIndex}this._segments.push(segment),common_1.extend(this,{_compiled:patterns.map(function(pattern){return quoteRegExp.apply(null,pattern)}).concat(quoteRegExp(segment)),prefix:this._segments[0]}),Object.freeze(this)}return UrlMatcher.prototype.append=function(url){return this._children.push(url),common_1.forEach(url._cache,function(val,key){return url._cache[key]=predicates_1.isArray(val)?[]:null}),url._cache.path=this._cache.path.concat(this),url},UrlMatcher.prototype.isRoot=function(){return 0===this._cache.path.length},UrlMatcher.prototype.toString=function(){return this.pattern},UrlMatcher.prototype.exec=function(path,search,hash,options){function decodePathArray(string){var reverseString=function(str){return str.split("").reverse().join("")},unquoteDashes=function(str){return str.replace(/\\-/g,"-")},split=reverseString(string).split(/-(?!\\)/),allReversed=common_1.map(split,reverseString);return common_1.map(allReversed,unquoteDashes).reverse()}var _this=this;void 0===search&&(search={}),void 0===options&&(options={});var match=memoizeTo(this._cache,"pattern",function(){return new RegExp(["^",common_1.unnest(_this._cache.path.concat(_this).map(hof_1.prop("_compiled"))).join(""),_this.config.strict===!1?"/?":"","$"].join(""),_this.config.caseInsensitive?"i":void 0)}).exec(path);if(!match)return null;var allParams=this.parameters(),pathParams=allParams.filter(function(param){return!param.isSearch()}),searchParams=allParams.filter(function(param){return param.isSearch()}),nPathSegments=this._cache.path.concat(this).map(function(urlm){return urlm._segments.length-1}).reduce(function(a,x){return a+x}),values={};if(nPathSegments!==match.length-1)throw new Error("Unbalanced capture group in route '"+this.pattern+"'");for(var i=0;i<nPathSegments;i++){for(var param=pathParams[i],value=match[i+1],j=0;j<param.replace.length;j++)param.replace[j].from===value&&(value=param.replace[j].to);value&&param.array===!0&&(value=decodePathArray(value)),predicates_2.isDefined(value)&&(value=param.type.decode(value)),values[param.id]=param.value(value)}return common_1.forEach(searchParams,function(param){for(var value=search[param.id],j=0;j<param.replace.length;j++)param.replace[j].from===value&&(value=param.replace[j].to);predicates_2.isDefined(value)&&(value=param.type.decode(value)),values[param.id]=param.value(value)}),hash&&(values["#"]=hash),values},UrlMatcher.prototype.parameters=function(opts){return void 0===opts&&(opts={}),opts.inherit===!1?this._params:common_1.unnest(this._cache.path.concat(this).map(hof_1.prop("_params")))},UrlMatcher.prototype.parameter=function(id,opts){void 0===opts&&(opts={});var parent=common_1.tail(this._cache.path);return common_1.find(this._params,hof_1.propEq("id",id))||opts.inherit!==!1&&parent&&parent.parameter(id)||null},UrlMatcher.prototype.validates=function(params){var _this=this,validParamVal=function(param,val){return!param||param.validates(val)};return common_1.pairs(params||{}).map(function(_a){var key=_a[0],val=_a[1];return validParamVal(_this.parameter(key),val)}).reduce(common_1.allTrueR,!0)},UrlMatcher.prototype.format=function(values){function getDetails(param){var value=param.value(values[param.id]),isDefaultValue=param.isDefaultValue(value),squash=!!isDefaultValue&&param.squash,encoded=param.type.encode(value);return{param:param,value:value,isDefaultValue:isDefaultValue,squash:squash,encoded:encoded}}if(void 0===values&&(values={}),!this.validates(values))return null;var urlMatchers=this._cache.path.slice().concat(this),pathSegmentsAndParams=urlMatchers.map(UrlMatcher.pathSegmentsAndParams).reduce(common_2.unnestR,[]),queryParams=urlMatchers.map(UrlMatcher.queryParams).reduce(common_2.unnestR,[]),pathString=pathSegmentsAndParams.reduce(function(acc,x){if(predicates_1.isString(x))return acc+x;var _a=getDetails(x),squash=_a.squash,encoded=_a.encoded,param=_a.param;return squash===!0?acc.match(/\/$/)?acc.slice(0,-1):acc:predicates_1.isString(squash)?acc+squash:squash!==!1?acc:null==encoded?acc:predicates_1.isArray(encoded)?acc+common_1.map(encoded,UrlMatcher.encodeDashes).join("-"):param.type.raw?acc+encoded:acc+encodeURIComponent(encoded)},""),queryString=queryParams.map(function(param){var _a=getDetails(param),squash=_a.squash,encoded=_a.encoded,isDefaultValue=_a.isDefaultValue;if(!(null==encoded||isDefaultValue&&squash!==!1)&&(predicates_1.isArray(encoded)||(encoded=[encoded]),0!==encoded.length))return param.type.raw||(encoded=common_1.map(encoded,encodeURIComponent)),encoded.map(function(val){return param.id+"="+val})}).filter(common_1.identity).reduce(common_2.unnestR,[]).join("&");return pathString+(queryString?"?"+queryString:"")+(values["#"]?"#"+values["#"]:"")},UrlMatcher.encodeDashes=function(str){return encodeURIComponent(str).replace(/-/g,function(c){return"%5C%"+c.charCodeAt(0).toString(16).toUpperCase()})},UrlMatcher.pathSegmentsAndParams=function(matcher){var staticSegments=matcher._segments,pathParams=matcher._params.filter(function(p){return p.location===param_2.DefType.PATH});return common_3.arrayTuples(staticSegments,pathParams.concat(void 0)).reduce(common_2.unnestR,[]).filter(function(x){return""!==x&&predicates_2.isDefined(x)})},UrlMatcher.queryParams=function(matcher){return matcher._params.filter(function(p){return p.location===param_2.DefType.SEARCH})},UrlMatcher.nameValidator=/^\w+([-.]+\w+)*(?:\[\])?$/,UrlMatcher}();exports.UrlMatcher=UrlMatcher},function(module,exports,__webpack_require__){"use strict";function regExpPrefix(re){var prefix=/^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(re.source);return null!=prefix?prefix[1].replace(/\\(.)/g,"$1"):""}function interpolate(pattern,match){return pattern.replace(/\$(\$|\d{1,2})/,function(m,what){return match["$"===what?0:Number(what)]})}function handleIfMatch($injector,$stateParams,handler,match){if(!match)return!1;var result=$injector.invoke(handler,handler,{$match:match,$stateParams:$stateParams});return!predicates_1.isDefined(result)||result}function appendBasePath(url,isHtml5,absolute){var baseHref=coreservices_1.services.locationConfig.baseHref();return"/"===baseHref?url:isHtml5?baseHref.slice(0,-1)+url:absolute?baseHref.slice(1)+url:url}function update(rules,otherwiseFn,evt){function check(rule){var handled=rule(coreservices_1.services.$injector,$location);return!!handled&&(predicates_1.isString(handled)&&($location.replace(),$location.url(handled)),!0)}if(!evt||!evt.defaultPrevented){var i,n=rules.length;for(i=0;i<n;i++)if(check(rules[i]))return;otherwiseFn&&check(otherwiseFn)}}var common_1=__webpack_require__(3),predicates_1=__webpack_require__(4),coreservices_1=__webpack_require__(6),$location=coreservices_1.services.location,UrlRouterProvider=function(){function UrlRouterProvider($urlMatcherFactory,$stateParams){this.rules=[],this.interceptDeferred=!1,this.$urlMatcherFactory=$urlMatcherFactory,this.$stateParams=$stateParams}return UrlRouterProvider.prototype.rule=function(rule){if(!predicates_1.isFunction(rule))throw new Error("'rule' must be a function");return this.rules.push(rule),this},UrlRouterProvider.prototype.otherwise=function(rule){if(!predicates_1.isFunction(rule)&&!predicates_1.isString(rule))throw new Error("'rule' must be a string or function");return this.otherwiseFn=predicates_1.isString(rule)?function(){return rule}:rule,this},UrlRouterProvider.prototype.when=function(what,handler){var redirect,_a=this,$urlMatcherFactory=_a.$urlMatcherFactory,$stateParams=_a.$stateParams,handlerIsString=predicates_1.isString(handler);if(predicates_1.isString(what)&&(what=$urlMatcherFactory.compile(what)),!handlerIsString&&!predicates_1.isFunction(handler)&&!predicates_1.isArray(handler))throw new Error("invalid 'handler' in when()");var strategies={matcher:function(_what,_handler){return handlerIsString&&(redirect=$urlMatcherFactory.compile(_handler),_handler=["$match",redirect.format.bind(redirect)]),common_1.extend(function(){return handleIfMatch(coreservices_1.services.$injector,$stateParams,_handler,_what.exec($location.path(),$location.search(),$location.hash()))},{prefix:predicates_1.isString(_what.prefix)?_what.prefix:""})},regex:function(_what,_handler){if(_what.global||_what.sticky)throw new Error("when() RegExp must not be global or sticky");return handlerIsString&&(redirect=_handler,_handler=["$match",function($match){return interpolate(redirect,$match)}]),common_1.extend(function(){return handleIfMatch(coreservices_1.services.$injector,$stateParams,_handler,_what.exec($location.path()))},{prefix:regExpPrefix(_what)})}},check={matcher:$urlMatcherFactory.isMatcher(what),regex:what instanceof RegExp};for(var n in check)if(check[n])return this.rule(strategies[n](what,handler));throw new Error("invalid 'what' in when()")},UrlRouterProvider.prototype.deferIntercept=function(defer){void 0===defer&&(defer=!0),this.interceptDeferred=defer},UrlRouterProvider}();exports.UrlRouterProvider=UrlRouterProvider;var UrlRouter=function(){function UrlRouter(urlRouterProvider){this.urlRouterProvider=urlRouterProvider,common_1.bindFunctions(UrlRouter.prototype,this,this)}return UrlRouter.prototype.sync=function(){update(this.urlRouterProvider.rules,this.urlRouterProvider.otherwiseFn)},UrlRouter.prototype.listen=function(){var _this=this;return this.listener=this.listener||$location.onChange(function(evt){return update(_this.urlRouterProvider.rules,_this.urlRouterProvider.otherwiseFn,evt)})},UrlRouter.prototype.update=function(read){return read?void(this.location=$location.url()):void($location.url()!==this.location&&($location.url(this.location),$location.replace()))},UrlRouter.prototype.push=function(urlMatcher,params,options){$location.url(urlMatcher.format(params||{})),options&&options.replace&&$location.replace()},UrlRouter.prototype.href=function(urlMatcher,params,options){if(!urlMatcher.validates(params))return null;var url=urlMatcher.format(params);options=options||{absolute:!1};var cfg=coreservices_1.services.locationConfig,isHtml5=cfg.html5Mode();if(isHtml5||null===url||(url="#"+cfg.hashPrefix()+url),url=appendBasePath(url,isHtml5,options.absolute),!options.absolute||!url)return url;var slash=!isHtml5&&url?"/":"",port=cfg.port();return port=80===port||443===port?"":":"+port,[cfg.protocol(),"://",cfg.host(),port,slash,url].join("")},UrlRouter}();exports.UrlRouter=UrlRouter},function(module,exports,__webpack_require__){"use strict";var predicates_1=__webpack_require__(4),common_1=__webpack_require__(3),StateProvider=function(){function StateProvider(stateRegistry){this.stateRegistry=stateRegistry,this.invalidCallbacks=[],common_1.bindFunctions(StateProvider.prototype,this,this)}return StateProvider.prototype.decorator=function(name,func){return this.stateRegistry.decorator(name,func)||this},StateProvider.prototype.state=function(name,definition){return predicates_1.isObject(name)?definition=name:definition.name=name,this.stateRegistry.register(definition),this},StateProvider.prototype.onInvalid=function(callback){this.invalidCallbacks.push(callback)},StateProvider}();exports.StateProvider=StateProvider},function(module,exports,__webpack_require__){"use strict";var transition_1=__webpack_require__(11),hookRegistry_1=__webpack_require__(15),resolve_1=__webpack_require__(32),views_1=__webpack_require__(33),url_1=__webpack_require__(34),redirectTo_1=__webpack_require__(35),onEnterExitRetain_1=__webpack_require__(36),hof_1=__webpack_require__(5);exports.defaultTransOpts={location:!0,relative:null,inherit:!1,notify:!0,reload:!1,custom:{},current:function(){return null}};var TransitionService=function(){function TransitionService(_router){this._router=_router,this.$view=_router.viewService,hookRegistry_1.HookRegistry.mixin(new hookRegistry_1.HookRegistry,this),this._deregisterHookFns={},this.registerTransitionHooks()}return TransitionService.prototype.registerTransitionHooks=function(){var fns=this._deregisterHookFns;fns.redirectTo=this.onStart({to:function(state){return!!state.redirectTo}},redirectTo_1.redirectToHook),fns.onExit=this.onExit({exiting:function(state){return!!state.onExit}},onEnterExitRetain_1.onExitHook),fns.onRetain=this.onRetain({retained:function(state){return!!state.onRetain}},onEnterExitRetain_1.onRetainHook),fns.onEnter=this.onEnter({entering:function(state){return!!state.onEnter}},onEnterExitRetain_1.onEnterHook),fns.eagerResolve=this.onStart({},resolve_1.eagerResolvePath,{priority:1e3}),fns.lazyResolve=this.onEnter({entering:hof_1.val(!0)},resolve_1.lazyResolveState,{priority:1e3}),fns.loadViews=this.onStart({},views_1.loadEnteringViews),fns.activateViews=this.onSuccess({},views_1.activateViews),fns.updateUrl=this.onSuccess({},url_1.updateUrl,{priority:9999})},TransitionService.prototype.onBefore=function(matchCriteria,callback,options){throw""},TransitionService.prototype.onStart=function(matchCriteria,callback,options){throw""},TransitionService.prototype.onExit=function(matchCriteria,callback,options){throw""},TransitionService.prototype.onRetain=function(matchCriteria,callback,options){throw""},TransitionService.prototype.onEnter=function(matchCriteria,callback,options){throw""},TransitionService.prototype.onFinish=function(matchCriteria,callback,options){throw""},TransitionService.prototype.onSuccess=function(matchCriteria,callback,options){throw""},TransitionService.prototype.onError=function(matchCriteria,callback,options){throw""},TransitionService.prototype.create=function(fromPath,targetState){return new transition_1.Transition(fromPath,targetState,this._router)},TransitionService}();exports.TransitionService=TransitionService},function(module,exports,__webpack_require__){"use strict";var common_1=__webpack_require__(3),resolveContext_1=__webpack_require__(17);exports.eagerResolvePath=function(trans){return new resolveContext_1.ResolveContext(trans.treeChanges().to).resolvePath("EAGER",trans).then(common_1.noop)},exports.lazyResolveState=function(trans,state){return new resolveContext_1.ResolveContext(trans.treeChanges().to).subContext(state).resolvePath("LAZY",trans).then(common_1.noop)}},function(module,exports,__webpack_require__){"use strict";function loadEnteringViews(transition){var enteringViews=transition.views("entering");if(enteringViews.length)return coreservices_1.services.$q.all(enteringViews.map(function(view){return view.load()})).then(common_1.noop)}function activateViews(transition){var enteringViews=transition.views("entering"),exitingViews=transition.views("exiting");if(enteringViews.length||exitingViews.length){var $view=transition.router.viewService;exitingViews.forEach(function(vc){return $view.deactivateViewConfig(vc)}),enteringViews.forEach(function(vc){return $view.activateViewConfig(vc)}),$view.sync()}}var common_1=__webpack_require__(3),coreservices_1=__webpack_require__(6);exports.loadEnteringViews=loadEnteringViews,exports.activateViews=activateViews},function(module,exports){"use strict";function updateUrl(transition){var options=transition.options(),$state=transition.router.stateService,$urlRouter=transition.router.urlRouter;if(options.location&&$state.$current.navigable){var urlOptions={replace:"replace"===options.location};$urlRouter.push($state.$current.navigable.url,$state.params,urlOptions)}$urlRouter.update(!0)}exports.updateUrl=updateUrl},function(module,exports,__webpack_require__){"use strict";var predicates_1=__webpack_require__(4),coreservices_1=__webpack_require__(6),targetState_1=__webpack_require__(14);exports.redirectToHook=function(trans){function handleResult(result){var $state=trans.router.stateService;return result instanceof targetState_1.TargetState?result:predicates_1.isString(result)?$state.target(result,trans.params(),trans.options()):result.state||result.params?$state.target(result.state||trans.to(),result.params||trans.params(),trans.options()):void 0}var redirect=trans.to().redirectTo;if(redirect)return predicates_1.isFunction(redirect)?coreservices_1.services.$q.when(redirect(trans)).then(handleResult):handleResult(redirect)}},function(module,exports){"use strict";function makeEnterExitRetainHook(hookName){return function(transition,state){return state[hookName](transition,state)}}exports.onExitHook=makeEnterExitRetainHook("onExit"),exports.onRetainHook=makeEnterExitRetainHook("onRetain"),exports.onEnterHook=makeEnterExitRetainHook("onEnter")},function(module,exports,__webpack_require__){"use strict";var common_1=__webpack_require__(3),hof_1=__webpack_require__(5),predicates_1=__webpack_require__(4),trace_1=__webpack_require__(12),ViewService=function(){function ViewService(){var _this=this;this.uiViews=[],this.viewConfigs=[],this._viewConfigFactories={},this.sync=function(){function uiViewDepth(uiView){return uiView.fqn.split(".").length}function viewConfigDepth(config){for(var context=config.viewDecl.$context,count=0;++count&&context.parent;)context=context.parent;return count}var uiViewsByFqn=_this.uiViews.map(function(uiv){return[uiv.fqn,uiv]}).reduce(common_1.applyPairs,{}),matches=function(uiView){return function(viewConfig){if(uiView.$type!==viewConfig.viewDecl.$type)return!1;var vc=viewConfig.viewDecl,vcSegments=vc.$uiViewName.split("."),uivSegments=uiView.fqn.split(".");if(!common_1.equals(vcSegments,uivSegments.slice(0-vcSegments.length)))return!1;var negOffset=1-vcSegments.length||void 0,fqnToFirstSegment=uivSegments.slice(0,negOffset).join("."),uiViewContext=uiViewsByFqn[fqnToFirstSegment].creationContext;return vc.$uiViewContextAnchor===(uiViewContext&&uiViewContext.name)}},depthCompare=hof_1.curry(function(depthFn,posNeg,left,right){return posNeg*(depthFn(left)-depthFn(right))}),matchingConfigPair=function(uiView){var matchingConfigs=_this.viewConfigs.filter(matches(uiView));return matchingConfigs.length>1&&matchingConfigs.sort(depthCompare(viewConfigDepth,-1)),[uiView,matchingConfigs[0]]},configureUIView=function(_a){var uiView=_a[0],viewConfig=_a[1];_this.uiViews.indexOf(uiView)!==-1&&uiView.configUpdated(viewConfig)};_this.uiViews.sort(depthCompare(uiViewDepth,1)).map(matchingConfigPair).forEach(configureUIView)}}return ViewService.prototype.rootContext=function(context){return this._rootContext=context||this._rootContext},ViewService.prototype.viewConfigFactory=function(viewType,factory){this._viewConfigFactories[viewType]=factory},ViewService.prototype.createViewConfig=function(path,decl){var cfgFactory=this._viewConfigFactories[decl.$type];if(!cfgFactory)throw new Error("ViewService: No view config factory registered for type "+decl.$type);var cfgs=cfgFactory(path,decl);return predicates_1.isArray(cfgs)?cfgs:[cfgs]},ViewService.prototype.deactivateViewConfig=function(viewConfig){trace_1.trace.traceViewServiceEvent("<- Removing",viewConfig),common_1.removeFrom(this.viewConfigs,viewConfig)},ViewService.prototype.activateViewConfig=function(viewConfig){trace_1.trace.traceViewServiceEvent("-> Registering",viewConfig),this.viewConfigs.push(viewConfig)},ViewService.prototype.registerUIView=function(uiView){trace_1.trace.traceViewServiceUIViewEvent("-> Registering",uiView);var uiViews=this.uiViews,fqnMatches=function(uiv){return uiv.fqn===uiView.fqn};return uiViews.filter(fqnMatches).length&&trace_1.trace.traceViewServiceUIViewEvent("!!!! duplicate uiView named:",uiView),uiViews.push(uiView),this.sync(),function(){var idx=uiViews.indexOf(uiView);return idx<=0?void trace_1.trace.traceViewServiceUIViewEvent("Tried removing non-registered uiView",uiView):(trace_1.trace.traceViewServiceUIViewEvent("<- Deregistering",uiView),void common_1.removeFrom(uiViews)(uiView))}},ViewService.prototype.available=function(){return this.uiViews.map(hof_1.prop("fqn"))},ViewService.prototype.active=function(){return this.uiViews.filter(hof_1.prop("$config")).map(hof_1.prop("name"))},ViewService.normalizeUIViewTarget=function(context,rawViewName){void 0===rawViewName&&(rawViewName="");var viewAtContext=rawViewName.split("@"),uiViewName=viewAtContext[0]||"$default",uiViewContextAnchor=predicates_1.isString(viewAtContext[1])?viewAtContext[1]:"^",relativeViewNameSugar=/^(\^(?:\.\^)*)\.(.*$)/.exec(uiViewName);relativeViewNameSugar&&(uiViewContextAnchor=relativeViewNameSugar[1],uiViewName=relativeViewNameSugar[2]),"!"===uiViewName.charAt(0)&&(uiViewName=uiViewName.substr(1),uiViewContextAnchor="");var relativeMatch=/^(\^(?:\.\^)*)$/;if(relativeMatch.exec(uiViewContextAnchor)){var anchor=uiViewContextAnchor.split(".").reduce(function(anchor,x){return anchor.parent},context);uiViewContextAnchor=anchor.name}return{uiViewName:uiViewName,uiViewContextAnchor:uiViewContextAnchor}},ViewService}();exports.ViewService=ViewService},function(module,exports,__webpack_require__){"use strict";var stateMatcher_1=__webpack_require__(39),stateBuilder_1=__webpack_require__(40),stateQueueManager_1=__webpack_require__(41),StateRegistry=function(){function StateRegistry(urlMatcherFactory,urlRouterProvider){this.states={},this.matcher=new stateMatcher_1.StateMatcher(this.states),this.builder=new stateBuilder_1.StateBuilder(this.matcher,urlMatcherFactory),this.stateQueue=new stateQueueManager_1.StateQueueManager(this.states,this.builder,urlRouterProvider);var rootStateDef={name:"",url:"^",views:null,params:{"#":{value:null,type:"hash",dynamic:!0}},"abstract":!0},_root=this._root=this.stateQueue.register(rootStateDef);_root.navigable=null}return StateRegistry.prototype.root=function(){return this._root},StateRegistry.prototype.register=function(stateDefinition){return this.stateQueue.register(stateDefinition)},StateRegistry.prototype.get=function(stateOrName,base){var _this=this;if(0===arguments.length)return Object.keys(this.states).map(function(name){return _this.states[name].self});var found=this.matcher.find(stateOrName,base);return found&&found.self||null},StateRegistry.prototype.decorator=function(name,func){return this.builder.builder(name,func)},StateRegistry}();exports.StateRegistry=StateRegistry},function(module,exports,__webpack_require__){"use strict";var predicates_1=__webpack_require__(4),StateMatcher=function(){function StateMatcher(_states){this._states=_states}return StateMatcher.prototype.isRelative=function(stateName){return stateName=stateName||"",0===stateName.indexOf(".")||0===stateName.indexOf("^");
},StateMatcher.prototype.find=function(stateOrName,base){if(stateOrName||""===stateOrName){var isStr=predicates_1.isString(stateOrName),name=isStr?stateOrName:stateOrName.name;this.isRelative(name)&&(name=this.resolvePath(name,base));var state=this._states[name];return!state||!isStr&&(isStr||state!==stateOrName&&state.self!==stateOrName)?void 0:state}},StateMatcher.prototype.resolvePath=function(name,base){if(!base)throw new Error("No reference point given for path '"+name+"'");for(var baseState=this.find(base),splitName=name.split("."),i=0,pathLength=splitName.length,current=baseState;i<pathLength;i++)if(""!==splitName[i]||0!==i){if("^"!==splitName[i])break;if(!current.parent)throw new Error("Path '"+name+"' not valid for state '"+baseState.name+"'");current=current.parent}else current=baseState;var relName=splitName.slice(i).join(".");return current.name+(current.name&&relName?".":"")+relName},StateMatcher}();exports.StateMatcher=StateMatcher},function(module,exports,__webpack_require__){"use strict";function selfBuilder(state){return state.self.$$state=function(){return state},state.self}function dataBuilder(state){return state.parent&&state.parent.data&&(state.data=state.self.data=common_1.inherit(state.parent.data,state.data)),state.data}function paramsBuilder(state){var makeConfigParam=function(config,id){return param_1.Param.fromConfig(id,null,config)},urlParams=state.url&&state.url.parameters({inherit:!1})||[],nonUrlParams=common_1.values(common_1.map(common_1.omit(state.params||{},urlParams.map(hof_1.prop("id"))),makeConfigParam));return urlParams.concat(nonUrlParams).map(function(p){return[p.id,p]}).reduce(common_1.applyPairs,{})}function pathBuilder(state){return state.parent?state.parent.path.concat(state):[state]}function includesBuilder(state){var includes=state.parent?common_1.extend({},state.parent.includes):{};return includes[state.name]=!0,includes}function resolvablesBuilder(state){var obj2Tuples=function(obj){return Object.keys(obj||{}).map(function(token){return{token:token,val:obj[token],deps:void 0}})},annotate=function(fn){return fn.$inject||coreservices_1.services.$injector.annotate(fn,coreservices_1.services.$injector.strictDi)},isResolveLiteral=function(obj){return!(!obj.token||!obj.resolveFn)},isLikeNg2Provider=function(obj){return!(!obj.provide&&!obj.token||!(obj.useValue||obj.useFactory||obj.useExisting||obj.useClass))},isTupleFromObj=function(obj){return!!(obj&&obj.val&&(predicates_1.isString(obj.val)||predicates_1.isArray(obj.val)||predicates_1.isFunction(obj.val)))},token=function(p){return p.provide||p.token},literal2Resolvable=hof_1.pattern([[hof_1.prop("resolveFn"),function(p){return new resolvable_1.Resolvable(token(p),p.resolveFn,p.deps,p.policy)}],[hof_1.prop("useFactory"),function(p){return new resolvable_1.Resolvable(token(p),p.useFactory,p.deps||p.dependencies,p.policy)}],[hof_1.prop("useClass"),function(p){return new resolvable_1.Resolvable(token(p),function(){return new p.useClass},[],p.policy)}],[hof_1.prop("useValue"),function(p){return new resolvable_1.Resolvable(token(p),function(){return p.useValue},[],p.policy,p.useValue)}],[hof_1.prop("useExisting"),function(p){return new resolvable_1.Resolvable(token(p),function(x){return x},[p.useExisting],p.policy)}]]),tuple2Resolvable=hof_1.pattern([[hof_1.pipe(hof_1.prop("val"),predicates_1.isString),function(tuple){return new resolvable_1.Resolvable(tuple.token,function(x){return x},[tuple.val],tuple.policy)}],[hof_1.pipe(hof_1.prop("val"),predicates_1.isArray),function(tuple){return new resolvable_1.Resolvable(tuple.token,common_1.tail(tuple.val),tuple.val.slice(0,-1),tuple.policy)}],[hof_1.pipe(hof_1.prop("val"),predicates_1.isFunction),function(tuple){return new resolvable_1.Resolvable(tuple.token,tuple.val,annotate(tuple.val),tuple.policy)}]]),item2Resolvable=hof_1.pattern([[hof_1.is(resolvable_1.Resolvable),function(r){return r}],[isResolveLiteral,literal2Resolvable],[isLikeNg2Provider,literal2Resolvable],[isTupleFromObj,tuple2Resolvable],[hof_1.val(!0),function(tuple){throw new Error("Invalid resolve value: "+strings_1.stringify(tuple))}]]),decl=state.resolve,items=predicates_1.isArray(decl)?decl:obj2Tuples(decl);return items.map(item2Resolvable)}var common_1=__webpack_require__(3),predicates_1=__webpack_require__(4),strings_1=__webpack_require__(9),hof_1=__webpack_require__(5),param_1=__webpack_require__(22),resolvable_1=__webpack_require__(19),coreservices_1=__webpack_require__(6),parseUrl=function(url){if(!predicates_1.isString(url))return!1;var root="^"===url.charAt(0);return{val:root?url.substring(1):url,root:root}},getUrlBuilder=function($urlMatcherFactoryProvider,root){return function(state){var stateDec=state,parsed=parseUrl(stateDec.url),parent=state.parent,url=parsed?$urlMatcherFactoryProvider.compile(parsed.val,{params:state.params||{},paramMap:function(paramConfig,isSearch){return stateDec.reloadOnSearch===!1&&isSearch&&(paramConfig=common_1.extend(paramConfig||{},{dynamic:!0})),paramConfig}}):stateDec.url;if(!url)return null;if(!$urlMatcherFactoryProvider.isMatcher(url))throw new Error("Invalid url '"+url+"' in state '"+state+"'");return parsed&&parsed.root?url:(parent&&parent.navigable||root()).url.append(url)}},getNavigableBuilder=function(isRoot){return function(state){return!isRoot(state)&&state.url?state:state.parent?state.parent.navigable:null}};exports.resolvablesBuilder=resolvablesBuilder;var StateBuilder=function(){function StateBuilder(matcher,$urlMatcherFactoryProvider){function parentBuilder(state){return isRoot(state)?null:matcher.find(self.parentName(state))||root()}this.matcher=matcher;var self=this,root=function(){return matcher.find("")},isRoot=function(state){return""===state.name};this.builders={self:[selfBuilder],parent:[parentBuilder],data:[dataBuilder],url:[getUrlBuilder($urlMatcherFactoryProvider,root)],navigable:[getNavigableBuilder(isRoot)],params:[paramsBuilder],views:[],path:[pathBuilder],includes:[includesBuilder],resolvables:[resolvablesBuilder]}}return StateBuilder.prototype.builder=function(name,fn){var builders=this.builders,array=builders[name]||[];return predicates_1.isString(name)&&!predicates_1.isDefined(fn)?array.length>1?array:array[0]:predicates_1.isString(name)&&predicates_1.isFunction(fn)?(builders[name]=array,builders[name].push(fn),function(){return builders[name].splice(builders[name].indexOf(fn,1))&&null}):void 0},StateBuilder.prototype.build=function(state){var _a=this,matcher=_a.matcher,builders=_a.builders,parent=this.parentName(state);if(parent&&!matcher.find(parent))return null;for(var key in builders)if(builders.hasOwnProperty(key)){var chain=builders[key].reduce(function(parentFn,step){return function(_state){return step(_state,parentFn)}},common_1.noop);state[key]=chain(state)}return state},StateBuilder.prototype.parentName=function(state){var name=state.name||"";return name.indexOf(".")!==-1?name.substring(0,name.lastIndexOf(".")):state.parent?predicates_1.isString(state.parent)?state.parent:state.parent.name:""},StateBuilder.prototype.name=function(state){var name=state.name;if(name.indexOf(".")!==-1||!state.parent)return name;var parentName=predicates_1.isString(state.parent)?state.parent:state.parent.name;return parentName?parentName+"."+name:name},StateBuilder}();exports.StateBuilder=StateBuilder},function(module,exports,__webpack_require__){"use strict";var common_1=__webpack_require__(3),predicates_1=__webpack_require__(4),stateObject_1=__webpack_require__(42),StateQueueManager=function(){function StateQueueManager(states,builder,$urlRouterProvider){this.states=states,this.builder=builder,this.$urlRouterProvider=$urlRouterProvider,this.queue=[]}return StateQueueManager.prototype.register=function(config){var _a=this,states=_a.states,queue=_a.queue,$state=_a.$state,state=common_1.inherit(new stateObject_1.State,common_1.extend({},config,{self:config,resolve:config.resolve||[],toString:function(){return config.name}}));if(!predicates_1.isString(state.name))throw new Error("State must have a valid name");if(states.hasOwnProperty(state.name)||common_1.pluck(queue,"name").indexOf(state.name)!==-1)throw new Error("State '"+state.name+"' is already defined");return queue.push(state),this.$state&&this.flush($state),state},StateQueueManager.prototype.flush=function($state){for(var result,state,orphanIdx,_a=this,queue=_a.queue,states=_a.states,builder=_a.builder,orphans=[],previousQueueLength={};queue.length>0;)if(state=queue.shift(),result=builder.build(state),orphanIdx=orphans.indexOf(state),result){if(states.hasOwnProperty(state.name))throw new Error("State '"+name+"' is already defined");states[state.name]=state,this.attachRoute($state,state),orphanIdx>=0&&orphans.splice(orphanIdx,1)}else{var prev=previousQueueLength[state.name];if(previousQueueLength[state.name]=queue.length,orphanIdx>=0&&prev===queue.length)return states;orphanIdx<0&&orphans.push(state),queue.push(state)}return states},StateQueueManager.prototype.autoFlush=function($state){this.$state=$state,this.flush($state)},StateQueueManager.prototype.attachRoute=function($state,state){var $urlRouterProvider=this.$urlRouterProvider;!state[common_1.abstractKey]&&state.url&&$urlRouterProvider.when(state.url,["$match","$stateParams",function($match,$stateParams){$state.$current.navigable===state&&common_1.equalForKeys($match,$stateParams)||$state.transitionTo(state,$match,{inherit:!0,location:!1})}])},StateQueueManager}();exports.StateQueueManager=StateQueueManager},function(module,exports,__webpack_require__){"use strict";var common_1=__webpack_require__(3),hof_1=__webpack_require__(5),State=function(){function State(config){common_1.extend(this,config)}return State.prototype.is=function(ref){return this===ref||this.self===ref||this.fqn()===ref},State.prototype.fqn=function(){if(!(this.parent&&this.parent instanceof this.constructor))return this.name;var name=this.parent.fqn();return name?name+"."+this.name:this.name},State.prototype.root=function(){return this.parent&&this.parent.root()||this},State.prototype.parameters=function(opts){opts=common_1.defaults(opts,{inherit:!0});var inherited=opts.inherit&&this.parent&&this.parent.parameters()||[];return inherited.concat(common_1.values(this.params))},State.prototype.parameter=function(id,opts){return void 0===opts&&(opts={}),this.url&&this.url.parameter(id,opts)||common_1.find(common_1.values(this.params),hof_1.propEq("id",id))||opts.inherit&&this.parent&&this.parent.parameter(id)},State.prototype.toString=function(){return this.fqn()},State}();exports.State=State},function(module,exports,__webpack_require__){"use strict";var common_1=__webpack_require__(3),predicates_1=__webpack_require__(4),queue_1=__webpack_require__(8),coreservices_1=__webpack_require__(6),pathFactory_1=__webpack_require__(20),node_1=__webpack_require__(21),transitionService_1=__webpack_require__(31),rejectFactory_1=__webpack_require__(10),targetState_1=__webpack_require__(14),param_1=__webpack_require__(22),glob_1=__webpack_require__(7),common_2=__webpack_require__(3),common_3=__webpack_require__(3),StateService=function(){function StateService(router){this.router=router,this._defaultErrorHandler=function($error$){$error$ instanceof Error&&$error$.stack?console.error($error$.stack):$error$ instanceof rejectFactory_1.Rejection?(console.error($error$),$error$.detail&&$error$.detail.stack&&console.error($error$.detail.stack)):console.error($error$)};var getters=["current","$current","params","transition"],boundFns=Object.keys(StateService.prototype).filter(function(key){return getters.indexOf(key)===-1});common_3.bindFunctions(StateService.prototype,this,this,boundFns)}return Object.defineProperty(StateService.prototype,"transition",{get:function(){return this.router.globals.transition},enumerable:!0,configurable:!0}),Object.defineProperty(StateService.prototype,"params",{get:function(){return this.router.globals.params},enumerable:!0,configurable:!0}),Object.defineProperty(StateService.prototype,"current",{get:function(){return this.router.globals.current},enumerable:!0,configurable:!0}),Object.defineProperty(StateService.prototype,"$current",{get:function(){return this.router.globals.$current},enumerable:!0,configurable:!0}),StateService.prototype._handleInvalidTargetState=function(fromPath,$to$){function invokeNextCallback(){var nextCallback=callbackQueue.dequeue();return void 0===nextCallback?rejectFactory_1.Rejection.invalid($to$.error()).toPromise():invokeCallback(nextCallback).then(checkForRedirect).then(function(result){return result||invokeNextCallback()})}var _this=this,globals=this.router.globals,latestThing=function(){return globals.transitionHistory.peekTail()},latest=latestThing(),$from$=pathFactory_1.PathFactory.makeTargetState(fromPath),callbackQueue=new queue_1.Queue([].concat(this.router.stateProvider.invalidCallbacks)),$q=coreservices_1.services.$q,$injector=coreservices_1.services.$injector,invokeCallback=function(callback){return $q.when($injector.invoke(callback,null,{$to$:$to$,$from$:$from$}))},checkForRedirect=function(result){if(result instanceof targetState_1.TargetState){var target=result;return target=_this.target(target.identifier(),target.params(),target.options()),target.valid()?latestThing()!==latest?rejectFactory_1.Rejection.superseded().toPromise():_this.transitionTo(target.identifier(),target.params(),target.options()):rejectFactory_1.Rejection.invalid(target.error()).toPromise()}};return invokeNextCallback()},StateService.prototype.reload=function(reloadState){return this.transitionTo(this.current,this.params,{reload:!predicates_1.isDefined(reloadState)||reloadState,inherit:!1,notify:!1})},StateService.prototype.go=function(to,params,options){var defautGoOpts={relative:this.$current,inherit:!0},transOpts=common_1.defaults(options,defautGoOpts,transitionService_1.defaultTransOpts);return this.transitionTo(to,params,transOpts)},StateService.prototype.target=function(identifier,params,options){if(void 0===options&&(options={}),predicates_1.isObject(options.reload)&&!options.reload.name)throw new Error("Invalid reload state object");var reg=this.router.stateRegistry;if(options.reloadState=options.reload===!0?reg.root():reg.matcher.find(options.reload,options.relative),options.reload&&!options.reloadState)throw new Error("No such reload state '"+(predicates_1.isString(options.reload)?options.reload:options.reload.name)+"'");var stateDefinition=reg.matcher.find(identifier,options.relative);return new targetState_1.TargetState(identifier,stateDefinition,params,options)},StateService.prototype.transitionTo=function(to,toParams,options){var _this=this;void 0===toParams&&(toParams={}),void 0===options&&(options={});var router=this.router,globals=router.globals,transHistory=globals.transitionHistory;options=common_1.defaults(options,transitionService_1.defaultTransOpts),options=common_1.extend(options,{current:transHistory.peekTail.bind(transHistory)});var ref=this.target(to,toParams,options),latestSuccess=globals.successfulTransitions.peekTail(),rootPath=function(){return[new node_1.PathNode(_this.router.stateRegistry.root())]},currentPath=latestSuccess?latestSuccess.treeChanges().to:rootPath();if(!ref.exists())return this._handleInvalidTargetState(currentPath,ref);if(!ref.valid())return common_1.silentRejection(ref.error());var rejectedTransitionHandler=function(transition){return function(error){if(error instanceof rejectFactory_1.Rejection){if(error.type===rejectFactory_1.RejectType.IGNORED)return router.urlRouter.update(),globals.current;if(error.type===rejectFactory_1.RejectType.SUPERSEDED&&error.redirected&&error.detail instanceof targetState_1.TargetState){var redirect=transition.redirect(error.detail);return redirect.run()["catch"](rejectedTransitionHandler(redirect))}if(error.type===rejectFactory_1.RejectType.ABORTED)return router.urlRouter.update(),coreservices_1.services.$q.reject(error)}var errorHandler=_this.defaultErrorHandler();return errorHandler(error),coreservices_1.services.$q.reject(error)}},transition=this.router.transitionService.create(currentPath,ref),transitionToPromise=transition.run()["catch"](rejectedTransitionHandler(transition));return common_1.silenceUncaughtInPromise(transitionToPromise),common_1.extend(transitionToPromise,{transition:transition})},StateService.prototype.is=function(stateOrName,params,options){options=common_1.defaults(options,{relative:this.$current});var state=this.router.stateRegistry.matcher.find(stateOrName,options.relative);if(predicates_1.isDefined(state))return this.$current===state&&(!predicates_1.isDefined(params)||null===params||param_1.Param.equals(state.parameters(),this.params,params))},StateService.prototype.includes=function(stateOrName,params,options){options=common_1.defaults(options,{relative:this.$current});var glob=predicates_1.isString(stateOrName)&&glob_1.Glob.fromString(stateOrName);if(glob){if(!glob.matches(this.$current.name))return!1;stateOrName=this.$current.name}var state=this.router.stateRegistry.matcher.find(stateOrName,options.relative),include=this.$current.includes;if(predicates_1.isDefined(state))return!!predicates_1.isDefined(include[state.name])&&(!params||common_2.equalForKeys(param_1.Param.values(state.parameters(),params),this.params,Object.keys(params)))},StateService.prototype.href=function(stateOrName,params,options){var defaultHrefOpts={lossy:!0,inherit:!0,absolute:!1,relative:this.$current};options=common_1.defaults(options,defaultHrefOpts);var state=this.router.stateRegistry.matcher.find(stateOrName,options.relative);if(!predicates_1.isDefined(state))return null;options.inherit&&(params=this.params.$inherit(params||{},this.$current,state));var nav=state&&options.lossy?state.navigable:state;return nav&&void 0!==nav.url&&null!==nav.url?this.router.urlRouter.href(nav.url,param_1.Param.values(state.parameters(),params),{absolute:options.absolute}):null},StateService.prototype.defaultErrorHandler=function(handler){return this._defaultErrorHandler=handler||this._defaultErrorHandler},StateService.prototype.get=function(stateOrName,base){var reg=this.router.stateRegistry;return 0===arguments.length?reg.get():reg.get(stateOrName,base||this.$current)},StateService}();exports.StateService=StateService},function(module,exports,__webpack_require__){"use strict";var stateParams_1=__webpack_require__(45),queue_1=__webpack_require__(8),common_1=__webpack_require__(3),Globals=function(){function Globals(transitionService){var _this=this;this.params=new stateParams_1.StateParams,this.transitionHistory=new queue_1.Queue([],1),this.successfulTransitions=new queue_1.Queue([],1);var beforeNewTransition=function($transition$){_this.transition=$transition$,_this.transitionHistory.enqueue($transition$);var updateGlobalState=function(){_this.successfulTransitions.enqueue($transition$),_this.$current=$transition$.$to(),_this.current=_this.$current.self,common_1.copy($transition$.params(),_this.params)};$transition$.onSuccess({},updateGlobalState,{priority:1e4});var clearCurrentTransition=function(){_this.transition===$transition$&&(_this.transition=null)};$transition$.promise.then(clearCurrentTransition,clearCurrentTransition)};transitionService.onBefore({},beforeNewTransition)}return Globals}();exports.Globals=Globals},function(module,exports,__webpack_require__){"use strict";var common_1=__webpack_require__(3),StateParams=function(){function StateParams(params){void 0===params&&(params={}),common_1.extend(this,params)}return StateParams.prototype.$inherit=function(newParams,$current,$to){var parentParams,parents=common_1.ancestors($current,$to),inherited={},inheritList=[];for(var i in parents)if(parents[i]&&parents[i].params&&(parentParams=Object.keys(parents[i].params),parentParams.length))for(var j in parentParams)inheritList.indexOf(parentParams[j])>=0||(inheritList.push(parentParams[j]),inherited[parentParams[j]]=this[parentParams[j]]);return common_1.extend({},inherited,newParams)},StateParams}();exports.StateParams=StateParams},function(module,exports,__webpack_require__){"use strict";function __export(m){for(var p in m)exports.hasOwnProperty(p)||(exports[p]=m[p])}__export(__webpack_require__(22)),__export(__webpack_require__(25)),__export(__webpack_require__(45)),__export(__webpack_require__(24))},function(module,exports,__webpack_require__){"use strict";function __export(m){for(var p in m)exports.hasOwnProperty(p)||(exports[p]=m[p])}__export(__webpack_require__(21)),__export(__webpack_require__(20))},function(module,exports,__webpack_require__){"use strict";function __export(m){for(var p in m)exports.hasOwnProperty(p)||(exports[p]=m[p])}__export(__webpack_require__(18)),__export(__webpack_require__(19)),__export(__webpack_require__(17))},function(module,exports,__webpack_require__){"use strict";function __export(m){for(var p in m)exports.hasOwnProperty(p)||(exports[p]=m[p])}__export(__webpack_require__(30)),__export(__webpack_require__(40)),__export(__webpack_require__(42)),__export(__webpack_require__(39)),__export(__webpack_require__(41)),__export(__webpack_require__(38)),__export(__webpack_require__(43)),__export(__webpack_require__(14))},function(module,exports,__webpack_require__){"use strict";function __export(m){for(var p in m)exports.hasOwnProperty(p)||(exports[p]=m[p])}__export(__webpack_require__(16)),__export(__webpack_require__(15)),__export(__webpack_require__(10)),__export(__webpack_require__(11)),__export(__webpack_require__(13)),__export(__webpack_require__(31))},function(module,exports,__webpack_require__){"use strict";function __export(m){for(var p in m)exports.hasOwnProperty(p)||(exports[p]=m[p])}__export(__webpack_require__(28)),__export(__webpack_require__(23)),__export(__webpack_require__(27)),__export(__webpack_require__(29))},function(module,exports,__webpack_require__){"use strict";function __export(m){for(var p in m)exports.hasOwnProperty(p)||(exports[p]=m[p])}__export(__webpack_require__(37))},function(module,exports,__webpack_require__){"use strict";function annotateController(controllerExpression){var $injector=coreservices_1.services.$injector,$controller=$injector.get("$controller"),oldInstantiate=$injector.instantiate;try{var deps_1;return $injector.instantiate=function(constructorFunction){$injector.instantiate=oldInstantiate,deps_1=$injector.annotate(constructorFunction)},$controller(controllerExpression,{$scope:{}}),deps_1}finally{$injector.instantiate=oldInstantiate}}function runBlock($injector,$q){coreservices_1.services.$injector=$injector,coreservices_1.services.$q=$q}function ng1UIRouter($locationProvider){function $get($location,$browser,$sniffer,$rootScope,$http,$templateCache){return $rootScope.$on("$locationChangeSuccess",function(evt){return urlListeners.forEach(function(fn){return fn(evt)})}),coreservices_1.services.locationConfig.html5Mode=function(){var html5Mode=$locationProvider.html5Mode();return html5Mode=predicates_1.isObject(html5Mode)?html5Mode.enabled:html5Mode,html5Mode&&$sniffer.history},coreservices_1.services.template.get=function(url){return $http.get(url,{cache:$templateCache,headers:{Accept:"text/html"}}).then(hof_1.prop("data"))},common_1.bindFunctions($location,coreservices_1.services.location,$location,["replace","url","path","search","hash"]),common_1.bindFunctions($location,coreservices_1.services.locationConfig,$location,["port","protocol","host"]),common_1.bindFunctions($browser,coreservices_1.services.locationConfig,$browser,["baseHref"]),router}router=new router_1.UIRouter,router.stateRegistry.decorator("views",views_1.ng1ViewsBuilder),router.stateRegistry.decorator("onExit",onEnterExitRetain_1.getStateHookBuilder("onExit")),router.stateRegistry.decorator("onRetain",onEnterExitRetain_1.getStateHookBuilder("onRetain")),router.stateRegistry.decorator("onEnter",onEnterExitRetain_1.getStateHookBuilder("onEnter")),router.viewService.viewConfigFactory("ng1",views_1.ng1ViewConfigFactory),common_1.bindFunctions($locationProvider,coreservices_1.services.locationConfig,$locationProvider,["hashPrefix"]);var urlListeners=[];coreservices_1.services.location.onChange=function(callback){return urlListeners.push(callback),function(){return common_1.removeFrom(urlListeners)(callback)}},this.$get=$get,$get.$inject=["$location","$browser","$sniffer","$rootScope","$http","$templateCache"]}function getUrlRouterProvider(){return router.urlRouterProvider.$get=function(){return router.urlRouter.update(!0),this.interceptDeferred||router.urlRouter.listen(),router.urlRouter},router.urlRouterProvider}function getStateProvider(){return router.stateProvider.$get=function(){return router.stateRegistry.stateQueue.autoFlush(router.stateService),router.stateService},router.stateProvider}function getTransitionsProvider(){return router.transitionService.$get=function(){return router.transitionService},router.transitionService}function watchDigests($rootScope){$rootScope.$watch(function(){trace_1.trace.approximateDigests++})}var router_1=__webpack_require__(26),coreservices_1=__webpack_require__(6),common_1=__webpack_require__(3),hof_1=__webpack_require__(5),predicates_1=__webpack_require__(4),resolveService_1=__webpack_require__(54),trace_1=__webpack_require__(12),views_1=__webpack_require__(55),templateFactory_1=__webpack_require__(56),onEnterExitRetain_1=__webpack_require__(57),app=angular.module("ui.router.angular1",[]);angular.module("ui.router.util",["ng","ui.router.init"]),angular.module("ui.router.router",["ui.router.util"]),angular.module("ui.router.state",["ui.router.router","ui.router.util","ui.router.angular1"]),angular.module("ui.router",["ui.router.init","ui.router.state","ui.router.angular1"]),angular.module("ui.router.compat",["ui.router"]),exports.annotateController=annotateController,runBlock.$inject=["$injector","$q"],app.run(runBlock);var router=null;ng1UIRouter.$inject=["$locationProvider"],angular.module("ui.router.init",[]).provider("ng1UIRouter",ng1UIRouter),angular.module("ui.router.init").run(["ng1UIRouter",function(ng1UIRouter){}]),angular.module("ui.router.util").provider("$urlMatcherFactory",["ng1UIRouterProvider",function(){return router.urlMatcherFactory}]),angular.module("ui.router.util").run(["$urlMatcherFactory",function($urlMatcherFactory){}]),angular.module("ui.router.router").provider("$urlRouter",["ng1UIRouterProvider",getUrlRouterProvider]),angular.module("ui.router.router").run(["$urlRouter",function($urlRouter){}]),angular.module("ui.router.state").provider("$state",["ng1UIRouterProvider",getStateProvider]),angular.module("ui.router.state").run(["$state",function($state){}]),angular.module("ui.router.state").factory("$stateParams",["ng1UIRouter",function(ng1UIRouter){return ng1UIRouter.globals.params}]),angular.module("ui.router.state").provider("$transitions",["ng1UIRouterProvider",getTransitionsProvider]),angular.module("ui.router.util").factory("$templateFactory",["ng1UIRouter",function(){return new templateFactory_1.TemplateFactory}]),angular.module("ui.router").factory("$view",function(){return router.viewService}),angular.module("ui.router").factory("$resolve",resolveService_1.resolveFactory),angular.module("ui.router").service("$trace",function(){return trace_1.trace}),watchDigests.$inject=["$rootScope"],exports.watchDigests=watchDigests,angular.module("ui.router").run(watchDigests),exports.getLocals=function(ctx){var tokens=ctx.getTokens().filter(predicates_1.isString),tuples=tokens.map(function(key){return[key,ctx.getResolvable(key).data]});return tuples.reduce(common_1.applyPairs,{})}},function(module,exports,__webpack_require__){"use strict";var stateObject_1=__webpack_require__(42),node_1=__webpack_require__(21),resolveContext_1=__webpack_require__(17),common_1=__webpack_require__(3),stateBuilder_1=__webpack_require__(40),$resolve={resolve:function(invocables,locals,parent){void 0===locals&&(locals={});var parentNode=new node_1.PathNode(new stateObject_1.State({params:{},resolvables:[]})),node=new node_1.PathNode(new stateObject_1.State({params:{},resolvables:[]})),context=new resolveContext_1.ResolveContext([parentNode,node]);context.addResolvables(stateBuilder_1.resolvablesBuilder({resolve:invocables}),node.state);var resolveData=function(parentLocals){var rewrap=function(_locals){return stateBuilder_1.resolvablesBuilder({resolve:common_1.map(_locals,function(local){return function(){return local}})})};context.addResolvables(rewrap(parentLocals),parentNode.state),context.addResolvables(rewrap(locals),node.state);var tuples2ObjR=function(acc,tuple){return acc[tuple.token]=tuple.value,acc};return context.resolvePath().then(function(results){return results.reduce(tuples2ObjR,{})})};return parent?parent.then(resolveData):resolveData({})}};exports.resolveFactory=function(){return $resolve}},function(module,exports,__webpack_require__){"use strict";function ng1ViewsBuilder(state){var tplKeys=["templateProvider","templateUrl","template","notify","async"],ctrlKeys=["controller","controllerProvider","controllerAs","resolveAs"],compKeys=["component","bindings"],nonCompKeys=tplKeys.concat(ctrlKeys),allKeys=compKeys.concat(nonCompKeys),views={},viewsObject=state.views||{$default:common_1.pick(state,allKeys)};return common_1.forEach(viewsObject,function(config,name){if(name=name||"$default",predicates_1.isString(config)&&(config={component:config}),Object.keys(config).length){if(config.component){if(nonCompKeys.map(function(key){return predicates_1.isDefined(config[key])}).reduce(common_1.anyTrueR,!1))throw new Error("Cannot combine: "+compKeys.join("|")+" with: "+nonCompKeys.join("|")+" in stateview: 'name@"+state.name+"'");config.templateProvider=["$injector",function($injector){var resolveFor=function(key){return config.bindings&&config.bindings[key]||key},prefix=angular.version.minor>=3?"::":"",attributeTpl=function(input){var attrName=strings_1.kebobString(input.name),resolveName=resolveFor(input.name);return"@"===input.type?attrName+"='{{"+prefix+"$resolve."+resolveName+"}}'":attrName+"='"+prefix+"$resolve."+resolveName+"'"},attrs=getComponentInputs($injector,config.component).map(attributeTpl).join(" "),kebobName=strings_1.kebobString(config.component);return"<"+kebobName+" "+attrs+"></"+kebobName+">"}]}config.resolveAs=config.resolveAs||"$resolve",config.$type="ng1",config.$context=state,config.$name=name;var normalized=view_1.ViewService.normalizeUIViewTarget(config.$context,config.$name);config.$uiViewName=normalized.uiViewName,config.$uiViewContextAnchor=normalized.uiViewContextAnchor,views[name]=config}}),views}function getComponentInputs($injector,name){var cmpDefs=$injector.get(name+"Directive");if(!cmpDefs||!cmpDefs.length)throw new Error("Unable to find component named '"+name+"'");return cmpDefs.map(getBindings).reduce(common_1.unnestR,[])}var common_1=__webpack_require__(3),strings_1=__webpack_require__(9),view_1=__webpack_require__(37),predicates_1=__webpack_require__(4),coreservices_1=__webpack_require__(6),trace_1=__webpack_require__(12),templateFactory_1=__webpack_require__(56),resolveContext_1=__webpack_require__(17),resolvable_1=__webpack_require__(19);exports.ng1ViewConfigFactory=function(path,view){return new Ng1ViewConfig(path,view)},exports.ng1ViewsBuilder=ng1ViewsBuilder;var scopeBindings=function(bindingsObj){return Object.keys(bindingsObj||{}).map(function(key){return[key,/^([=<@])[?]?(.*)/.exec(bindingsObj[key])]}).filter(function(tuple){return predicates_1.isDefined(tuple)&&predicates_1.isDefined(tuple[1])}).map(function(tuple){return{name:tuple[1][2]||tuple[0],type:tuple[1][1]}})},getBindings=function(def){return scopeBindings(predicates_1.isObject(def.bindToController)?def.bindToController:def.scope)},id=0,Ng1ViewConfig=function(){function Ng1ViewConfig(path,viewDecl){this.path=path,this.viewDecl=viewDecl,this.$id=id++,this.loaded=!1}return Ng1ViewConfig.prototype.load=function(){var _this=this,$q=coreservices_1.services.$q;if(!this.hasTemplate())throw new Error("No template configuration specified for '"+this.viewDecl.$uiViewName+"@"+this.viewDecl.$uiViewContextAnchor+"'");var context=new resolveContext_1.ResolveContext(this.path),params=this.path.reduce(function(acc,node){
return common_1.extend(acc,node.paramValues)},{}),promises={template:$q.when(this.getTemplate(params,new templateFactory_1.TemplateFactory,context)),controller:$q.when(this.getController(context))};return $q.all(promises).then(function(results){trace_1.trace.traceViewServiceEvent("Loaded",_this),_this.controller=results.controller,_this.template=results.template})},Ng1ViewConfig.prototype.hasTemplate=function(){return!!(this.viewDecl.template||this.viewDecl.templateUrl||this.viewDecl.templateProvider)},Ng1ViewConfig.prototype.getTemplate=function(params,$factory,context){return $factory.fromConfig(this.viewDecl,params,context)},Ng1ViewConfig.prototype.getController=function(context){var provider=this.viewDecl.controllerProvider;if(!predicates_1.isInjectable(provider))return this.viewDecl.controller;var deps=coreservices_1.services.$injector.annotate(provider),providerFn=predicates_1.isArray(provider)?common_1.tail(provider):provider,resolvable=new resolvable_1.Resolvable("",providerFn,deps);return resolvable.get(context)},Ng1ViewConfig}();exports.Ng1ViewConfig=Ng1ViewConfig},function(module,exports,__webpack_require__){"use strict";var predicates_1=__webpack_require__(4),coreservices_1=__webpack_require__(6),common_1=__webpack_require__(3),resolvable_1=__webpack_require__(19),TemplateFactory=function(){function TemplateFactory(){}return TemplateFactory.prototype.fromConfig=function(config,params,context){return predicates_1.isDefined(config.template)?this.fromString(config.template,params):predicates_1.isDefined(config.templateUrl)?this.fromUrl(config.templateUrl,params):predicates_1.isDefined(config.templateProvider)?this.fromProvider(config.templateProvider,params,context):null},TemplateFactory.prototype.fromString=function(template,params){return predicates_1.isFunction(template)?template(params):template},TemplateFactory.prototype.fromUrl=function(url,params){return predicates_1.isFunction(url)&&(url=url(params)),null==url?null:coreservices_1.services.template.get(url)},TemplateFactory.prototype.fromProvider=function(provider,params,context){var deps=coreservices_1.services.$injector.annotate(provider),providerFn=predicates_1.isArray(provider)?common_1.tail(provider):provider,resolvable=new resolvable_1.Resolvable("",providerFn,deps);return resolvable.get(context)},TemplateFactory}();exports.TemplateFactory=TemplateFactory},function(module,exports,__webpack_require__){"use strict";var coreservices_1=__webpack_require__(6),services_1=__webpack_require__(53),resolveContext_1=__webpack_require__(17),common_1=__webpack_require__(3);exports.getStateHookBuilder=function(hookName){return function(state,parentFn){function decoratedNg1Hook(trans,state){var resolveContext=new resolveContext_1.ResolveContext(trans.treeChanges().to);return coreservices_1.services.$injector.invoke(hook,this,common_1.extend({$state$:state},services_1.getLocals(resolveContext)))}var hook=state[hookName];return hook?decoratedNg1Hook:void 0}}},function(module,exports,__webpack_require__){"use strict";function parseStateRef(ref,current){var parsed,preparsed=ref.match(/^\s*({[^}]*})\s*$/);if(preparsed&&(ref=current+"("+preparsed[1]+")"),parsed=ref.replace(/\n/g," ").match(/^([^(]+?)\s*(\((.*)\))?$/),!parsed||4!==parsed.length)throw new Error("Invalid state ref '"+ref+"'");return{state:parsed[1],paramExpr:parsed[3]||null}}function stateContext(el){var $uiView=el.parent().inheritedData("$uiView"),path=hof_1.parse("$cfg.path")($uiView);return path?common_1.tail(path).state.name:void 0}function getTypeInfo(el){var isSvg="[object SVGAnimatedString]"===Object.prototype.toString.call(el.prop("href")),isForm="FORM"===el[0].nodeName;return{attr:isForm?"action":isSvg?"xlink:href":"href",isAnchor:"A"===el.prop("tagName").toUpperCase(),clickable:!isForm}}function clickHook(el,$state,$timeout,type,current){return function(e){var button=e.which||e.button,target=current();if(!(button>1||e.ctrlKey||e.metaKey||e.shiftKey||el.attr("target"))){var transition=$timeout(function(){$state.go(target.state,target.params,target.options)});e.preventDefault();var ignorePreventDefaultCount=type.isAnchor&&!target.href?1:0;e.preventDefault=function(){ignorePreventDefaultCount--<=0&&$timeout.cancel(transition)}}}}function defaultOpts(el,$state){return{relative:stateContext(el)||$state.$current,inherit:!0}}var common_1=__webpack_require__(3),predicates_1=__webpack_require__(4),hof_1=__webpack_require__(5),uiSref=["$state","$timeout",function($state,$timeout){return{restrict:"A",require:["?^uiSrefActive","?^uiSrefActiveEq"],link:function(scope,element,attrs,uiSrefActive){var ref=parseStateRef(attrs.uiSref,$state.current.name),def={state:ref.state,href:null,params:null,options:null},type=getTypeInfo(element),active=uiSrefActive[1]||uiSrefActive[0],unlinkInfoFn=null;def.options=common_1.extend(defaultOpts(element,$state),attrs.uiSrefOpts?scope.$eval(attrs.uiSrefOpts):{});var update=function(val){val&&(def.params=angular.copy(val)),def.href=$state.href(ref.state,def.params,def.options),unlinkInfoFn&&unlinkInfoFn(),active&&(unlinkInfoFn=active.$$addStateInfo(ref.state,def.params)),null!==def.href&&attrs.$set(type.attr,def.href)};ref.paramExpr&&(scope.$watch(ref.paramExpr,function(val){val!==def.params&&update(val)},!0),def.params=angular.copy(scope.$eval(ref.paramExpr))),update(),type.clickable&&element.bind("click",clickHook(element,$state,$timeout,type,function(){return def}))}}}],uiState=["$state","$timeout",function($state,$timeout){return{restrict:"A",require:["?^uiSrefActive","?^uiSrefActiveEq"],link:function(scope,element,attrs,uiSrefActive){function runStateRefLink(group){def.state=group[0],def.params=group[1],def.options=group[2],def.href=$state.href(def.state,def.params,def.options),unlinkInfoFn&&unlinkInfoFn(),active&&(unlinkInfoFn=active.$$addStateInfo(def.state,def.params)),def.href&&attrs.$set(type.attr,def.href)}var type=getTypeInfo(element),active=uiSrefActive[1]||uiSrefActive[0],group=[attrs.uiState,attrs.uiStateParams||null,attrs.uiStateOpts||null],watch="["+group.map(function(val){return val||"null"}).join(", ")+"]",def={state:null,params:null,options:null,href:null},unlinkInfoFn=null;scope.$watch(watch,runStateRefLink,!0),runStateRefLink(scope.$eval(watch)),type.clickable&&element.bind("click",clickHook(element,$state,$timeout,type,function(){return def}))}}}],uiSrefActive=["$state","$stateParams","$interpolate","$transitions",function($state,$stateParams,$interpolate,$transitions){return{restrict:"A",controller:["$scope","$element","$attrs","$timeout",function($scope,$element,$attrs,$timeout){function addState(stateName,stateParams,activeClass){var state=$state.get(stateName,stateContext($element)),stateHash=createStateHash(stateName,stateParams),stateInfo={state:state||{name:stateName},params:stateParams,hash:stateHash};return states.push(stateInfo),activeClasses[stateHash]=activeClass,function(){var idx=states.indexOf(stateInfo);idx!==-1&&states.splice(idx,1)}}function createStateHash(state,params){if(!predicates_1.isString(state))throw new Error("state should be a string");return predicates_1.isObject(params)?state+common_1.toJson(params):(params=$scope.$eval(params),predicates_1.isObject(params)?state+common_1.toJson(params):state)}function update(){for(var i=0;i<states.length;i++)anyMatch(states[i].state,states[i].params)?addClass($element,activeClasses[states[i].hash]):removeClass($element,activeClasses[states[i].hash]),exactMatch(states[i].state,states[i].params)?addClass($element,activeEqClass):removeClass($element,activeEqClass)}function addClass(el,className){$timeout(function(){el.addClass(className)})}function removeClass(el,className){el.removeClass(className)}function anyMatch(state,params){return $state.includes(state.name,params)}function exactMatch(state,params){return $state.is(state.name,params)}var activeEqClass,uiSrefActive,states=[],activeClasses={};activeEqClass=$interpolate($attrs.uiSrefActiveEq||"",!1)($scope);try{uiSrefActive=$scope.$eval($attrs.uiSrefActive)}catch(e){}uiSrefActive=uiSrefActive||$interpolate($attrs.uiSrefActive||"",!1)($scope),predicates_1.isObject(uiSrefActive)&&common_1.forEach(uiSrefActive,function(stateOrName,activeClass){if(predicates_1.isString(stateOrName)){var ref=parseStateRef(stateOrName,$state.current.name);addState(ref.state,$scope.$eval(ref.paramExpr),activeClass)}}),this.$$addStateInfo=function(newState,newParams){if(!(predicates_1.isObject(uiSrefActive)&&states.length>0)){var deregister=addState(newState,newParams,uiSrefActive);return update(),deregister}},$scope.$on("$stateChangeSuccess",update),$scope.$on("$destroy",$transitions.onStart({},function(trans){return trans.promise.then(update)&&null})),update()}]}}];angular.module("ui.router.state").directive("uiSref",uiSref).directive("uiSrefActive",uiSrefActive).directive("uiSrefActiveEq",uiSrefActive).directive("uiState",uiState)},function(module,exports){"use strict";function $IsStateFilter($state){var isFilter=function(state,params,options){return $state.is(state,params,options)};return isFilter.$stateful=!0,isFilter}function $IncludedByStateFilter($state){var includesFilter=function(state,params,options){return $state.includes(state,params,options)};return includesFilter.$stateful=!0,includesFilter}$IsStateFilter.$inject=["$state"],exports.$IsStateFilter=$IsStateFilter,$IncludedByStateFilter.$inject=["$state"],exports.$IncludedByStateFilter=$IncludedByStateFilter,angular.module("ui.router.state").filter("isState",$IsStateFilter).filter("includedByState",$IncludedByStateFilter)},function(module,exports,__webpack_require__){"use strict";function $ViewDirectiveFill($compile,$controller,$transitions,$view,$timeout){var getControllerAs=hof_1.parse("viewDecl.controllerAs"),getResolveAs=hof_1.parse("viewDecl.resolveAs");return{restrict:"ECA",priority:-400,compile:function(tElement){var initial=tElement.html();return function(scope,$element){var data=$element.data("$uiView");if(data){var cfg=data.$cfg||{viewDecl:{}};$element.html(cfg.template||initial),trace_1.trace.traceUIViewFill(data.$uiView,$element.html());var link=$compile($element.contents()),controller=cfg.controller,controllerAs=getControllerAs(cfg),resolveAs=getResolveAs(cfg),resolveCtx=cfg.path&&new resolveContext_1.ResolveContext(cfg.path),locals=resolveCtx&&services_1.getLocals(resolveCtx);if(scope[resolveAs]=locals,controller){var controllerInstance=$controller(controller,common_1.extend({},locals,{$scope:scope,$element:$element}));controllerAs&&(scope[controllerAs]=controllerInstance,scope[controllerAs][resolveAs]=locals),$element.data("$ngControllerController",controllerInstance),$element.children().data("$ngControllerController",controllerInstance),registerControllerCallbacks($transitions,controllerInstance,scope,cfg)}if(predicates_1.isString(cfg.viewDecl.component))var cmp_1=cfg.viewDecl.component,kebobName_1=strings_1.kebobString(cmp_1),getComponentController=function(){var directiveEl=[].slice.call($element[0].children).filter(function(el){return el&&el.tagName&&el.tagName.toLowerCase()===kebobName_1});return directiveEl&&angular.element(directiveEl).data("$"+cmp_1+"Controller")},deregisterWatch_1=scope.$watch(getComponentController,function(ctrlInstance){ctrlInstance&&(registerControllerCallbacks($transitions,ctrlInstance,scope,cfg),deregisterWatch_1())});link(scope)}}}}}function registerControllerCallbacks($transitions,controllerInstance,$scope,cfg){!predicates_1.isFunction(controllerInstance.$onInit)||cfg.viewDecl.component&&hasComponentImpl||controllerInstance.$onInit();var viewState=common_1.tail(cfg.path).state.self,hookOptions={bind:controllerInstance};if(predicates_1.isFunction(controllerInstance.uiOnParamsChanged)){var resolveContext=new resolveContext_1.ResolveContext(cfg.path),viewCreationTrans_1=resolveContext.getResolvable("$transition$").data,paramsUpdated=function($transition$){if($transition$!==viewCreationTrans_1&&$transition$.exiting().indexOf(viewState)===-1){var toParams=$transition$.params("to"),fromParams=$transition$.params("from"),toSchema=$transition$.treeChanges().to.map(function(node){return node.paramSchema}).reduce(common_1.unnestR,[]),fromSchema=$transition$.treeChanges().from.map(function(node){return node.paramSchema}).reduce(common_1.unnestR,[]),changedToParams=toSchema.filter(function(param){var idx=fromSchema.indexOf(param);return idx===-1||!fromSchema[idx].type.equals(toParams[param.id],fromParams[param.id])});if(changedToParams.length){var changedKeys_1=changedToParams.map(function(x){return x.id});controllerInstance.uiOnParamsChanged(common_1.filter(toParams,function(val,key){return changedKeys_1.indexOf(key)!==-1}),$transition$)}}};$scope.$on("$destroy",$transitions.onSuccess({},paramsUpdated,hookOptions))}if(predicates_1.isFunction(controllerInstance.uiCanExit)){var criteria={exiting:viewState.name};$scope.$on("$destroy",$transitions.onBefore(criteria,controllerInstance.uiCanExit,hookOptions))}}var common_1=__webpack_require__(3),predicates_1=__webpack_require__(4),trace_1=__webpack_require__(12),views_1=__webpack_require__(55),hof_1=__webpack_require__(5),resolveContext_1=__webpack_require__(17),strings_1=__webpack_require__(9),services_1=__webpack_require__(53),uiView=["$view","$animate","$uiViewScroll","$interpolate","$q",function($view,$animate,$uiViewScroll,$interpolate,$q){function getRenderer(attrs,scope){return{enter:function(element,target,cb){angular.version.minor>2?$animate.enter(element,null,target).then(cb):$animate.enter(element,null,target,cb)},leave:function(element,cb){angular.version.minor>2?$animate.leave(element).then(cb):$animate.leave(element,cb)}}}function configsEqual(config1,config2){return config1===config2}var rootData={$cfg:{viewDecl:{$context:$view.rootContext()}},$uiView:{}},directive={count:0,restrict:"ECA",terminal:!0,priority:400,transclude:"element",compile:function(tElement,tAttrs,$transclude){return function(scope,$element,attrs){function configUpdatedCallback(config){(!config||config instanceof views_1.Ng1ViewConfig)&&(configsEqual(viewConfig,config)||(trace_1.trace.traceUIViewConfigUpdated(activeUIView,config&&config.viewDecl&&config.viewDecl.$context),viewConfig=config,updateView(config)))}function cleanupLastView(){if(previousEl&&(trace_1.trace.traceUIViewEvent("Removing (previous) el",previousEl.data("$uiView")),previousEl.remove(),previousEl=null),currentScope&&(trace_1.trace.traceUIViewEvent("Destroying scope",activeUIView),currentScope.$destroy(),currentScope=null),currentEl){var _viewData_1=currentEl.data("$uiView");trace_1.trace.traceUIViewEvent("Animate out",_viewData_1),renderer.leave(currentEl,function(){_viewData_1.$$animLeave.resolve(),previousEl=null}),previousEl=currentEl,currentEl=null}}function updateView(config){var newScope=scope.$new();trace_1.trace.traceUIViewScopeCreated(activeUIView,newScope);var animEnter=$q.defer(),animLeave=$q.defer(),$uiViewData={$cfg:config,$uiView:activeUIView,$animEnter:animEnter.promise,$animLeave:animLeave.promise,$$animLeave:animLeave},cloned=$transclude(newScope,function(clone){renderer.enter(clone.data("$uiView",$uiViewData),$element,function(){animEnter.resolve(),currentScope&&currentScope.$emit("$viewContentAnimationEnded"),(predicates_1.isDefined(autoScrollExp)&&!autoScrollExp||scope.$eval(autoScrollExp))&&$uiViewScroll(clone)}),cleanupLastView()});currentEl=cloned,currentScope=newScope,currentScope.$emit("$viewContentLoaded",config||viewConfig),currentScope.$eval(onloadExp)}var previousEl,currentEl,currentScope,unregister,onloadExp=attrs.onload||"",autoScrollExp=attrs.autoscroll,renderer=getRenderer(attrs,scope),viewConfig=void 0,inherited=$element.inheritedData("$uiView")||rootData,name=$interpolate(attrs.uiView||attrs.name||"")(scope)||"$default",activeUIView={$type:"ng1",id:directive.count++,name:name,fqn:inherited.$uiView.fqn?inherited.$uiView.fqn+"."+name:name,config:null,configUpdated:configUpdatedCallback,get creationContext(){return hof_1.parse("$cfg.viewDecl.$context")(inherited)}};trace_1.trace.traceUIViewEvent("Linking",activeUIView),$element.data("$uiView",{$uiView:activeUIView}),updateView(),unregister=$view.registerUIView(activeUIView),scope.$on("$destroy",function(){trace_1.trace.traceUIViewEvent("Destroying/Unregistering",activeUIView),unregister()})}}};return directive}];$ViewDirectiveFill.$inject=["$compile","$controller","$transitions","$view","$timeout"];var hasComponentImpl="function"==typeof angular.module("ui.router").component;angular.module("ui.router.state").directive("uiView",uiView),angular.module("ui.router.state").directive("uiView",$ViewDirectiveFill)},function(module,exports){"use strict";function $ViewScrollProvider(){var useAnchorScroll=!1;this.useAnchorScroll=function(){useAnchorScroll=!0},this.$get=["$anchorScroll","$timeout",function($anchorScroll,$timeout){return useAnchorScroll?$anchorScroll:function($element){return $timeout(function(){$element[0].scrollIntoView()},0,!1)}}]}angular.module("ui.router.state").provider("$uiViewScroll",$ViewScrollProvider)}])})},function(module,exports,__webpack_require__){__webpack_require__(131),module.exports=angular},function(module,exports,__webpack_require__){function hasPort(host){return!!~host.indexOf(":")}var common=exports,url=__webpack_require__(44),extend=__webpack_require__(69)._extend,required=__webpack_require__(150),upgradeHeader=/(^|,)\s*upgrade\s*($|,)/i,isSSL=/^https|wss/,cookieDomainRegex=/(;\s*domain=)([^;]+)/i;common.isSSL=isSSL,common.setupOutgoing=function(outgoing,options,req,forward){outgoing.port=options[forward||"target"].port||(isSSL.test(options[forward||"target"].protocol)?443:80),["host","hostname","socketPath","pfx","key","passphrase","cert","ca","ciphers","secureProtocol"].forEach(function(e){outgoing[e]=options[forward||"target"][e]}),outgoing.method=req.method,outgoing.headers=extend({},req.headers),options.headers&&extend(outgoing.headers,options.headers),options.auth&&(outgoing.auth=options.auth),options.ca&&(outgoing.ca=options.ca),isSSL.test(options[forward||"target"].protocol)&&(outgoing.rejectUnauthorized="undefined"==typeof options.secure||options.secure),outgoing.agent=options.agent||!1,outgoing.localAddress=options.localAddress,outgoing.agent||(outgoing.headers=outgoing.headers||{},"string"==typeof outgoing.headers.connection&&upgradeHeader.test(outgoing.headers.connection)||(outgoing.headers.connection="close"));var target=options[forward||"target"],targetPath=target&&options.prependPath!==!1?target.path||"":"",outgoingPath=options.toProxy?req.url:url.parse(req.url).path||"";return outgoingPath=options.ignorePath?"":outgoingPath,outgoing.path=common.urlJoin(targetPath,outgoingPath),options.changeOrigin&&(outgoing.headers.host=required(outgoing.port,options[forward||"target"].protocol)&&!hasPort(outgoing.host)?outgoing.host+":"+outgoing.port:outgoing.host),outgoing},common.setupSocket=function(socket){return socket.setTimeout(0),socket.setNoDelay(!0),socket.setKeepAlive(!0,0),socket},common.getPort=function(req){var res=req.headers.host?req.headers.host.match(/:(\d+)/):"";return res?res[1]:common.hasEncryptedConnection(req)?"443":"80"},common.hasEncryptedConnection=function(req){return Boolean(req.connection.encrypted||req.connection.pair)},common.urlJoin=function(){var retSegs,args=Array.prototype.slice.call(arguments),lastIndex=args.length-1,last=args[lastIndex],lastSegs=last.split("?");return args[lastIndex]=lastSegs.shift(),retSegs=[args.filter(Boolean).join("/").replace(/\/+/g,"/").replace("http:/","http://").replace("https:/","https://")],retSegs.push.apply(retSegs,lastSegs),retSegs.join("?")},common.rewriteCookieDomain=function rewriteCookieDomain(header,config){return Array.isArray(header)?header.map(function(headerElement){return rewriteCookieDomain(headerElement,config)}):header.replace(cookieDomainRegex,function(match,prefix,previousDomain){var newDomain;if(previousDomain in config)newDomain=config[previousDomain];else{if(!("*"in config))return match;newDomain=config["*"]}return newDomain?prefix+newDomain:""})}},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subject_1=__webpack_require__(6),queue_1=__webpack_require__(89),Subscription_1=__webpack_require__(5),observeOn_1=__webpack_require__(55),ObjectUnsubscribedError_1=__webpack_require__(36),SubjectSubscription_1=__webpack_require__(72),ReplaySubject=function(_super){function ReplaySubject(bufferSize,windowTime,scheduler){void 0===bufferSize&&(bufferSize=Number.POSITIVE_INFINITY),void 0===windowTime&&(windowTime=Number.POSITIVE_INFINITY),_super.call(this),this.scheduler=scheduler,this._events=[],this._bufferSize=bufferSize<1?1:bufferSize,this._windowTime=windowTime<1?1:windowTime}return __extends(ReplaySubject,_super),ReplaySubject.prototype.next=function(value){var now=this._getNow();this._events.push(new ReplayEvent(now,value)),this._trimBufferThenGetEvents(),_super.prototype.next.call(this,value)},ReplaySubject.prototype._subscribe=function(subscriber){var subscription,_events=this._trimBufferThenGetEvents(),scheduler=this.scheduler;if(this.closed)throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError;this.hasError?subscription=Subscription_1.Subscription.EMPTY:this.isStopped?subscription=Subscription_1.Subscription.EMPTY:(this.observers.push(subscriber),subscription=new SubjectSubscription_1.SubjectSubscription(this,subscriber)),scheduler&&subscriber.add(subscriber=new observeOn_1.ObserveOnSubscriber(subscriber,scheduler));for(var len=_events.length,i=0;i<len&&!subscriber.closed;i++)subscriber.next(_events[i].value);return this.hasError?subscriber.error(this.thrownError):this.isStopped&&subscriber.complete(),subscription},ReplaySubject.prototype._getNow=function(){return(this.scheduler||queue_1.queue).now()},ReplaySubject.prototype._trimBufferThenGetEvents=function(){for(var now=this._getNow(),_bufferSize=this._bufferSize,_windowTime=this._windowTime,_events=this._events,eventsCount=_events.length,spliceCount=0;spliceCount<eventsCount&&!(now-_events[spliceCount].time<_windowTime);)spliceCount++;return eventsCount>_bufferSize&&(spliceCount=Math.max(spliceCount,eventsCount-_bufferSize)),spliceCount>0&&_events.splice(0,spliceCount),_events},ReplaySubject}(Subject_1.Subject);exports.ReplaySubject=ReplaySubject;var ReplayEvent=function(){function ReplayEvent(time,value){this.time=time,this.value=value}return ReplayEvent}()},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Observable_1=__webpack_require__(0),ScalarObservable=function(_super){function ScalarObservable(value,scheduler){_super.call(this),this.value=value,this.scheduler=scheduler,this._isScalar=!0,scheduler&&(this._isScalar=!1)}return __extends(ScalarObservable,_super),ScalarObservable.create=function(value,scheduler){return new ScalarObservable(value,scheduler)},ScalarObservable.dispatch=function(state){var done=state.done,value=state.value,subscriber=state.subscriber;return done?void subscriber.complete():(subscriber.next(value),void(subscriber.closed||(state.done=!0,this.schedule(state))))},ScalarObservable.prototype._subscribe=function(subscriber){var value=this.value,scheduler=this.scheduler;return scheduler?scheduler.schedule(ScalarObservable.dispatch,0,{done:!1,value:value,subscriber:subscriber}):(subscriber.next(value),void(subscriber.closed||subscriber.complete()))},ScalarObservable}(Observable_1.Observable);exports.ScalarObservable=ScalarObservable},function(module,exports,__webpack_require__){"use strict";function combineLatest(){for(var observables=[],_i=0;_i<arguments.length;_i++)observables[_i-0]=arguments[_i];var project=null;return"function"==typeof observables[observables.length-1]&&(project=observables.pop()),1===observables.length&&isArray_1.isArray(observables[0])&&(observables=observables[0].slice()),observables.unshift(this),this.lift.call(new ArrayObservable_1.ArrayObservable(observables),new CombineLatestOperator(project))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},ArrayObservable_1=__webpack_require__(13),isArray_1=__webpack_require__(14),OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3),none={};exports.combineLatest=combineLatest;var CombineLatestOperator=function(){function CombineLatestOperator(project){this.project=project}return CombineLatestOperator.prototype.call=function(subscriber,source){return source.subscribe(new CombineLatestSubscriber(subscriber,this.project))},CombineLatestOperator}();exports.CombineLatestOperator=CombineLatestOperator;var CombineLatestSubscriber=function(_super){function CombineLatestSubscriber(destination,project){_super.call(this,destination),this.project=project,this.active=0,this.values=[],this.observables=[]}return __extends(CombineLatestSubscriber,_super),CombineLatestSubscriber.prototype._next=function(observable){this.values.push(none),this.observables.push(observable)},CombineLatestSubscriber.prototype._complete=function(){var observables=this.observables,len=observables.length;if(0===len)this.destination.complete();else{this.active=len,this.toRespond=len;for(var i=0;i<len;i++){var observable=observables[i];this.add(subscribeToResult_1.subscribeToResult(this,observable,observable,i))}}},CombineLatestSubscriber.prototype.notifyComplete=function(unused){0===(this.active-=1)&&this.destination.complete()},CombineLatestSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){var values=this.values,oldVal=values[outerIndex],toRespond=this.toRespond?oldVal===none?--this.toRespond:this.toRespond:0;values[outerIndex]=innerValue,0===toRespond&&(this.project?this._tryProject(values):this.destination.next(values.slice()))},CombineLatestSubscriber.prototype._tryProject=function(values){var result;try{result=this.project.apply(this,values)}catch(err){return void this.destination.error(err)}this.destination.next(result)},CombineLatestSubscriber}(OuterSubscriber_1.OuterSubscriber);exports.CombineLatestSubscriber=CombineLatestSubscriber},function(module,exports,__webpack_require__){"use strict";function concat(){for(var observables=[],_i=0;_i<arguments.length;_i++)observables[_i-0]=arguments[_i];return this.lift.call(concatStatic.apply(void 0,[this].concat(observables)))}function concatStatic(){for(var observables=[],_i=0;_i<arguments.length;_i++)observables[_i-0]=arguments[_i];var scheduler=null,args=observables;return isScheduler_1.isScheduler(args[observables.length-1])&&(scheduler=args.pop()),null===scheduler&&1===observables.length&&observables[0]instanceof Observable_1.Observable?observables[0]:new ArrayObservable_1.ArrayObservable(observables,scheduler).lift(new mergeAll_1.MergeAllOperator(1))}var Observable_1=__webpack_require__(0),isScheduler_1=__webpack_require__(15),ArrayObservable_1=__webpack_require__(13),mergeAll_1=__webpack_require__(31);exports.concat=concat,exports.concatStatic=concatStatic},function(module,exports,__webpack_require__){"use strict";function map(project,thisArg){if("function"!=typeof project)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return this.lift(new MapOperator(project,thisArg))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1);exports.map=map;var MapOperator=function(){function MapOperator(project,thisArg){this.project=project,this.thisArg=thisArg}return MapOperator.prototype.call=function(subscriber,source){return source.subscribe(new MapSubscriber(subscriber,this.project,this.thisArg))},MapOperator}();exports.MapOperator=MapOperator;var MapSubscriber=function(_super){function MapSubscriber(destination,project,thisArg){_super.call(this,destination),this.project=project,this.count=0,this.thisArg=thisArg||this}return __extends(MapSubscriber,_super),MapSubscriber.prototype._next=function(value){var result;try{result=this.project.call(this.thisArg,value,this.count++)}catch(err){return void this.destination.error(err)}this.destination.next(result)},MapSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function observeOn(scheduler,delay){return void 0===delay&&(delay=0),this.lift(new ObserveOnOperator(scheduler,delay))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),Notification_1=__webpack_require__(22);exports.observeOn=observeOn;var ObserveOnOperator=function(){function ObserveOnOperator(scheduler,delay){void 0===delay&&(delay=0),this.scheduler=scheduler,this.delay=delay}return ObserveOnOperator.prototype.call=function(subscriber,source){return source.subscribe(new ObserveOnSubscriber(subscriber,this.scheduler,this.delay))},ObserveOnOperator}();exports.ObserveOnOperator=ObserveOnOperator;var ObserveOnSubscriber=function(_super){function ObserveOnSubscriber(destination,scheduler,delay){void 0===delay&&(delay=0),_super.call(this,destination),this.scheduler=scheduler,this.delay=delay}return __extends(ObserveOnSubscriber,_super),ObserveOnSubscriber.dispatch=function(arg){var notification=arg.notification,destination=arg.destination;notification.observe(destination),this.unsubscribe()},ObserveOnSubscriber.prototype.scheduleMessage=function(notification){this.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch,this.delay,new ObserveOnMessage(notification,this.destination)))},ObserveOnSubscriber.prototype._next=function(value){this.scheduleMessage(Notification_1.Notification.createNext(value))},ObserveOnSubscriber.prototype._error=function(err){this.scheduleMessage(Notification_1.Notification.createError(err))},ObserveOnSubscriber.prototype._complete=function(){this.scheduleMessage(Notification_1.Notification.createComplete())},ObserveOnSubscriber}(Subscriber_1.Subscriber);exports.ObserveOnSubscriber=ObserveOnSubscriber;var ObserveOnMessage=function(){function ObserveOnMessage(notification,destination){this.notification=notification,this.destination=destination}return ObserveOnMessage}();exports.ObserveOnMessage=ObserveOnMessage},function(module,exports,__webpack_require__){"use strict";function reduce(accumulator,seed){var hasSeed=!1;return arguments.length>=2&&(hasSeed=!0),this.lift(new ReduceOperator(accumulator,seed,hasSeed))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1);exports.reduce=reduce;var ReduceOperator=function(){function ReduceOperator(accumulator,seed,hasSeed){void 0===hasSeed&&(hasSeed=!1),this.accumulator=accumulator,this.seed=seed,this.hasSeed=hasSeed}return ReduceOperator.prototype.call=function(subscriber,source){return source.subscribe(new ReduceSubscriber(subscriber,this.accumulator,this.seed,this.hasSeed))},ReduceOperator}();exports.ReduceOperator=ReduceOperator;var ReduceSubscriber=function(_super){function ReduceSubscriber(destination,accumulator,seed,hasSeed){_super.call(this,destination),this.accumulator=accumulator,this.hasSeed=hasSeed,this.index=0,this.hasValue=!1,this.acc=seed,this.hasSeed||this.index++}return __extends(ReduceSubscriber,_super),ReduceSubscriber.prototype._next=function(value){this.hasValue||(this.hasValue=this.hasSeed)?this._tryReduce(value):(this.acc=value,
this.hasValue=!0)},ReduceSubscriber.prototype._tryReduce=function(value){var result;try{result=this.accumulator(this.acc,value,this.index++)}catch(err){return void this.destination.error(err)}this.acc=result},ReduceSubscriber.prototype._complete=function(){(this.hasValue||this.hasSeed)&&this.destination.next(this.acc),this.destination.complete()},ReduceSubscriber}(Subscriber_1.Subscriber);exports.ReduceSubscriber=ReduceSubscriber},function(module,exports,__webpack_require__){"use strict";function zipProto(){for(var observables=[],_i=0;_i<arguments.length;_i++)observables[_i-0]=arguments[_i];return this.lift.call(zipStatic.apply(void 0,[this].concat(observables)))}function zipStatic(){for(var observables=[],_i=0;_i<arguments.length;_i++)observables[_i-0]=arguments[_i];var project=observables[observables.length-1];return"function"==typeof project&&observables.pop(),new ArrayObservable_1.ArrayObservable(observables).lift(new ZipOperator(project))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},ArrayObservable_1=__webpack_require__(13),isArray_1=__webpack_require__(14),Subscriber_1=__webpack_require__(1),OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3),iterator_1=__webpack_require__(25);exports.zipProto=zipProto,exports.zipStatic=zipStatic;var ZipOperator=function(){function ZipOperator(project){this.project=project}return ZipOperator.prototype.call=function(subscriber,source){return source.subscribe(new ZipSubscriber(subscriber,this.project))},ZipOperator}();exports.ZipOperator=ZipOperator;var ZipSubscriber=function(_super){function ZipSubscriber(destination,project,values){void 0===values&&(values=Object.create(null)),_super.call(this,destination),this.iterators=[],this.active=0,this.project="function"==typeof project?project:null,this.values=values}return __extends(ZipSubscriber,_super),ZipSubscriber.prototype._next=function(value){var iterators=this.iterators;isArray_1.isArray(value)?iterators.push(new StaticArrayIterator(value)):"function"==typeof value[iterator_1.$$iterator]?iterators.push(new StaticIterator(value[iterator_1.$$iterator]())):iterators.push(new ZipBufferIterator(this.destination,this,value))},ZipSubscriber.prototype._complete=function(){var iterators=this.iterators,len=iterators.length;this.active=len;for(var i=0;i<len;i++){var iterator=iterators[i];iterator.stillUnsubscribed?this.add(iterator.subscribe(iterator,i)):this.active--}},ZipSubscriber.prototype.notifyInactive=function(){this.active--,0===this.active&&this.destination.complete()},ZipSubscriber.prototype.checkIterators=function(){for(var iterators=this.iterators,len=iterators.length,destination=this.destination,i=0;i<len;i++){var iterator=iterators[i];if("function"==typeof iterator.hasValue&&!iterator.hasValue())return}for(var shouldComplete=!1,args=[],i=0;i<len;i++){var iterator=iterators[i],result=iterator.next();if(iterator.hasCompleted()&&(shouldComplete=!0),result.done)return void destination.complete();args.push(result.value)}this.project?this._tryProject(args):destination.next(args),shouldComplete&&destination.complete()},ZipSubscriber.prototype._tryProject=function(args){var result;try{result=this.project.apply(this,args)}catch(err){return void this.destination.error(err)}this.destination.next(result)},ZipSubscriber}(Subscriber_1.Subscriber);exports.ZipSubscriber=ZipSubscriber;var StaticIterator=function(){function StaticIterator(iterator){this.iterator=iterator,this.nextResult=iterator.next()}return StaticIterator.prototype.hasValue=function(){return!0},StaticIterator.prototype.next=function(){var result=this.nextResult;return this.nextResult=this.iterator.next(),result},StaticIterator.prototype.hasCompleted=function(){var nextResult=this.nextResult;return nextResult&&nextResult.done},StaticIterator}(),StaticArrayIterator=function(){function StaticArrayIterator(array){this.array=array,this.index=0,this.length=0,this.length=array.length}return StaticArrayIterator.prototype[iterator_1.$$iterator]=function(){return this},StaticArrayIterator.prototype.next=function(value){var i=this.index++,array=this.array;return i<this.length?{value:array[i],done:!1}:{value:null,done:!0}},StaticArrayIterator.prototype.hasValue=function(){return this.array.length>this.index},StaticArrayIterator.prototype.hasCompleted=function(){return this.array.length===this.index},StaticArrayIterator}(),ZipBufferIterator=function(_super){function ZipBufferIterator(destination,parent,observable){_super.call(this,destination),this.parent=parent,this.observable=observable,this.stillUnsubscribed=!0,this.buffer=[],this.isComplete=!1}return __extends(ZipBufferIterator,_super),ZipBufferIterator.prototype[iterator_1.$$iterator]=function(){return this},ZipBufferIterator.prototype.next=function(){var buffer=this.buffer;return 0===buffer.length&&this.isComplete?{value:null,done:!0}:{value:buffer.shift(),done:!1}},ZipBufferIterator.prototype.hasValue=function(){return this.buffer.length>0},ZipBufferIterator.prototype.hasCompleted=function(){return 0===this.buffer.length&&this.isComplete},ZipBufferIterator.prototype.notifyComplete=function(){this.buffer.length>0?(this.isComplete=!0,this.parent.notifyInactive()):this.destination.complete()},ZipBufferIterator.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this.buffer.push(innerValue),this.parent.checkIterators()},ZipBufferIterator.prototype.subscribe=function(value,index){return subscribeToResult_1.subscribeToResult(this,this.observable,this,index)},ZipBufferIterator}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){function Transport(opts){this.path=opts.path,this.hostname=opts.hostname,this.port=opts.port,this.secure=opts.secure,this.query=opts.query,this.timestampParam=opts.timestampParam,this.timestampRequests=opts.timestampRequests,this.readyState="",this.agent=opts.agent||!1,this.socket=opts.socket,this.enablesXDR=opts.enablesXDR,this.pfx=opts.pfx,this.key=opts.key,this.passphrase=opts.passphrase,this.cert=opts.cert,this.ca=opts.ca,this.ciphers=opts.ciphers,this.rejectUnauthorized=opts.rejectUnauthorized,this.forceNode=opts.forceNode,this.extraHeaders=opts.extraHeaders,this.localAddress=opts.localAddress}var parser=__webpack_require__(21),Emitter=__webpack_require__(26);module.exports=Transport,Emitter(Transport.prototype),Transport.prototype.onError=function(msg,desc){var err=new Error(msg);return err.type="TransportError",err.description=desc,this.emit("error",err),this},Transport.prototype.open=function(){return"closed"!==this.readyState&&""!==this.readyState||(this.readyState="opening",this.doOpen()),this},Transport.prototype.close=function(){return"opening"!==this.readyState&&"open"!==this.readyState||(this.doClose(),this.onClose()),this},Transport.prototype.send=function(packets){if("open"!==this.readyState)throw new Error("Transport not open");this.write(packets)},Transport.prototype.onOpen=function(){this.readyState="open",this.writable=!0,this.emit("open")},Transport.prototype.onData=function(data){var packet=parser.decodePacket(data,this.socket.binaryType);this.onPacket(packet)},Transport.prototype.onPacket=function(packet){this.emit("packet",packet)},Transport.prototype.onClose=function(){this.readyState="closed",this.emit("close")}},function(module,exports,__webpack_require__){(function(global){var hasCORS=__webpack_require__(441);module.exports=function(opts){var xdomain=opts.xdomain,xscheme=opts.xscheme,enablesXDR=opts.enablesXDR;try{if("undefined"!=typeof XMLHttpRequest&&(!xdomain||hasCORS))return new XMLHttpRequest}catch(e){}try{if("undefined"!=typeof XDomainRequest&&!xscheme&&enablesXDR)return new XDomainRequest}catch(e){}if(!xdomain)try{return new(global[["Active"].concat("Object").join("X")])("Microsoft.XMLHTTP")}catch(e){}}}).call(exports,__webpack_require__(4))},function(module,exports){exports.encode=function(obj){var str="";for(var i in obj)obj.hasOwnProperty(i)&&(str.length&&(str+="&"),str+=encodeURIComponent(i)+"="+encodeURIComponent(obj[i]));return str},exports.decode=function(qs){for(var qry={},pairs=qs.split("&"),i=0,l=pairs.length;i<l;i++){var pair=pairs[i].split("=");qry[decodeURIComponent(pair[0])]=decodeURIComponent(pair[1])}return qry}},function(module,exports,__webpack_require__){function Encoder(){}function encodeAsString(obj){var str="",nsp=!1;return str+=obj.type,exports.BINARY_EVENT!=obj.type&&exports.BINARY_ACK!=obj.type||(str+=obj.attachments,str+="-"),obj.nsp&&"/"!=obj.nsp&&(nsp=!0,str+=obj.nsp),null!=obj.id&&(nsp&&(str+=",",nsp=!1),str+=obj.id),null!=obj.data&&(nsp&&(str+=","),str+=json.stringify(obj.data)),debug("encoded %j as %s",obj,str),str}function encodeAsBinary(obj,callback){function writeEncoding(bloblessData){var deconstruction=binary.deconstructPacket(bloblessData),pack=encodeAsString(deconstruction.packet),buffers=deconstruction.buffers;buffers.unshift(pack),callback(buffers)}binary.removeBlobs(obj,writeEncoding)}function Decoder(){this.reconstructor=null}function decodeString(str){var p={},i=0;if(p.type=Number(str.charAt(0)),null==exports.types[p.type])return error();if(exports.BINARY_EVENT==p.type||exports.BINARY_ACK==p.type){for(var buf="";"-"!=str.charAt(++i)&&(buf+=str.charAt(i),i!=str.length););if(buf!=Number(buf)||"-"!=str.charAt(i))throw new Error("Illegal attachments");p.attachments=Number(buf)}if("/"==str.charAt(i+1))for(p.nsp="";++i;){var c=str.charAt(i);if(","==c)break;if(p.nsp+=c,i==str.length)break}else p.nsp="/";var next=str.charAt(i+1);if(""!==next&&Number(next)==next){for(p.id="";++i;){var c=str.charAt(i);if(null==c||Number(c)!=c){--i;break}if(p.id+=str.charAt(i),i==str.length)break}p.id=Number(p.id)}return str.charAt(++i)&&(p=tryParse(p,str.substr(i))),debug("decoded %s as %j",str,p),p}function tryParse(p,str){try{p.data=json.parse(str)}catch(e){return error()}return p}function BinaryReconstructor(packet){this.reconPack=packet,this.buffers=[]}function error(data){return{type:exports.ERROR,data:"parser error"}}var debug=__webpack_require__(446)("socket.io-parser"),json=__webpack_require__(450),Emitter=__webpack_require__(445),binary=__webpack_require__(444),isBuf=__webpack_require__(109);exports.protocol=4,exports.types=["CONNECT","DISCONNECT","EVENT","ACK","ERROR","BINARY_EVENT","BINARY_ACK"],exports.CONNECT=0,exports.DISCONNECT=1,exports.EVENT=2,exports.ACK=3,exports.ERROR=4,exports.BINARY_EVENT=5,exports.BINARY_ACK=6,exports.Encoder=Encoder,exports.Decoder=Decoder,Encoder.prototype.encode=function(obj,callback){if(debug("encoding packet %j",obj),exports.BINARY_EVENT==obj.type||exports.BINARY_ACK==obj.type)encodeAsBinary(obj,callback);else{var encoding=encodeAsString(obj);callback([encoding])}},Emitter(Decoder.prototype),Decoder.prototype.add=function(obj){var packet;if("string"==typeof obj)packet=decodeString(obj),exports.BINARY_EVENT==packet.type||exports.BINARY_ACK==packet.type?(this.reconstructor=new BinaryReconstructor(packet),0===this.reconstructor.reconPack.attachments&&this.emit("decoded",packet)):this.emit("decoded",packet);else{if(!isBuf(obj)&&!obj.base64)throw new Error("Unknown type: "+obj);if(!this.reconstructor)throw new Error("got binary data when not reconstructing a packet");packet=this.reconstructor.takeBinaryData(obj),packet&&(this.reconstructor=null,this.emit("decoded",packet))}},Decoder.prototype.destroy=function(){this.reconstructor&&this.reconstructor.finishedReconstruction()},BinaryReconstructor.prototype.takeBinaryData=function(binData){if(this.buffers.push(binData),this.buffers.length==this.reconPack.attachments){var packet=binary.reconstructPacket(this.reconPack,this.buffers);return this.finishedReconstruction(),packet}return null},BinaryReconstructor.prototype.finishedReconstruction=function(){this.reconPack=null,this.buffers=[]}},function(module,exports,__webpack_require__){var http=__webpack_require__(43),https=module.exports;for(var key in http)http.hasOwnProperty(key)&&(https[key]=http[key]);https.request=function(params,cb){return params||(params={}),params.scheme="https",params.protocol="https:",http.request.call(this,params,cb)}},function(module,exports,__webpack_require__){"use strict";function TransformState(stream){this.afterTransform=function(er,data){return afterTransform(stream,er,data)},this.needTransform=!1,this.transforming=!1,this.writecb=null,this.writechunk=null,this.writeencoding=null}function afterTransform(stream,er,data){var ts=stream._transformState;ts.transforming=!1;var cb=ts.writecb;if(!cb)return stream.emit("error",new Error("no writecb in Transform class"));ts.writechunk=null,ts.writecb=null,null!==data&&void 0!==data&&stream.push(data),cb(er);var rs=stream._readableState;rs.reading=!1,(rs.needReadable||rs.length<rs.highWaterMark)&&stream._read(rs.highWaterMark)}function Transform(options){if(!(this instanceof Transform))return new Transform(options);Duplex.call(this,options),this._transformState=new TransformState(this);var stream=this;this._readableState.needReadable=!0,this._readableState.sync=!1,options&&("function"==typeof options.transform&&(this._transform=options.transform),"function"==typeof options.flush&&(this._flush=options.flush)),this.once("prefinish",function(){"function"==typeof this._flush?this._flush(function(er,data){done(stream,er,data)}):done(stream)})}function done(stream,er,data){if(er)return stream.emit("error",er);null!==data&&void 0!==data&&stream.push(data);var ws=stream._writableState,ts=stream._transformState;if(ws.length)throw new Error("Calling transform done when ws.length != 0");if(ts.transforming)throw new Error("Calling transform done when still transforming");return stream.push(null)}module.exports=Transform;var Duplex=__webpack_require__(19),util=__webpack_require__(27);util.inherits=__webpack_require__(28),util.inherits(Transform,Duplex),Transform.prototype.push=function(chunk,encoding){return this._transformState.needTransform=!1,Duplex.prototype.push.call(this,chunk,encoding)},Transform.prototype._transform=function(chunk,encoding,cb){throw new Error("_transform() is not implemented")},Transform.prototype._write=function(chunk,encoding,cb){var ts=this._transformState;if(ts.writecb=cb,ts.writechunk=chunk,ts.writeencoding=encoding,!ts.transforming){var rs=this._readableState;(ts.needTransform||rs.needReadable||rs.length<rs.highWaterMark)&&this._read(rs.highWaterMark)}},Transform.prototype._read=function(n){var ts=this._transformState;null!==ts.writechunk&&ts.writecb&&!ts.transforming?(ts.transforming=!0,this._transform(ts.writechunk,ts.writeencoding,ts.afterTransform)):ts.needTransform=!0}},function(module,exports,__webpack_require__){"use strict";(function(process,setImmediate){function CorkedRequest(state){this.next=null,this.entry=null,this.finish=onCorkedFinish.bind(void 0,this,state)}function nop(){}function WriteReq(chunk,encoding,cb){this.chunk=chunk,this.encoding=encoding,this.callback=cb,this.next=null}function WritableState(options,stream){Duplex=Duplex||__webpack_require__(19),options=options||{},this.objectMode=!!options.objectMode,stream instanceof Duplex&&(this.objectMode=this.objectMode||!!options.writableObjectMode);var hwm=options.highWaterMark,defaultHwm=this.objectMode?16:16384;this.highWaterMark=hwm||0===hwm?hwm:defaultHwm,this.highWaterMark=~~this.highWaterMark,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1;var noDecode=options.decodeStrings===!1;this.decodeStrings=!noDecode,this.defaultEncoding=options.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(er){onwrite(stream,er)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new CorkedRequest(this)}function Writable(options){return Duplex=Duplex||__webpack_require__(19),realHasInstance.call(Writable,this)||this instanceof Duplex?(this._writableState=new WritableState(options,this),this.writable=!0,options&&("function"==typeof options.write&&(this._write=options.write),"function"==typeof options.writev&&(this._writev=options.writev)),void Stream.call(this)):new Writable(options)}function writeAfterEnd(stream,cb){var er=new Error("write after end");stream.emit("error",er),processNextTick(cb,er)}function validChunk(stream,state,chunk,cb){var valid=!0,er=!1;return null===chunk?er=new TypeError("May not write null values to stream"):"string"==typeof chunk||void 0===chunk||state.objectMode||(er=new TypeError("Invalid non-string/buffer chunk")),er&&(stream.emit("error",er),processNextTick(cb,er),valid=!1),valid}function decodeChunk(state,chunk,encoding){return state.objectMode||state.decodeStrings===!1||"string"!=typeof chunk||(chunk=bufferShim.from(chunk,encoding)),chunk}function writeOrBuffer(stream,state,isBuf,chunk,encoding,cb){isBuf||(chunk=decodeChunk(state,chunk,encoding),Buffer.isBuffer(chunk)&&(encoding="buffer"));var len=state.objectMode?1:chunk.length;state.length+=len;var ret=state.length<state.highWaterMark;if(ret||(state.needDrain=!0),state.writing||state.corked){var last=state.lastBufferedRequest;state.lastBufferedRequest=new WriteReq(chunk,encoding,cb),last?last.next=state.lastBufferedRequest:state.bufferedRequest=state.lastBufferedRequest,state.bufferedRequestCount+=1}else doWrite(stream,state,!1,len,chunk,encoding,cb);return ret}function doWrite(stream,state,writev,len,chunk,encoding,cb){state.writelen=len,state.writecb=cb,state.writing=!0,state.sync=!0,writev?stream._writev(chunk,state.onwrite):stream._write(chunk,encoding,state.onwrite),state.sync=!1}function onwriteError(stream,state,sync,er,cb){--state.pendingcb,sync?processNextTick(cb,er):cb(er),stream._writableState.errorEmitted=!0,stream.emit("error",er)}function onwriteStateUpdate(state){state.writing=!1,state.writecb=null,state.length-=state.writelen,state.writelen=0}function onwrite(stream,er){var state=stream._writableState,sync=state.sync,cb=state.writecb;if(onwriteStateUpdate(state),er)onwriteError(stream,state,sync,er,cb);else{var finished=needFinish(state);finished||state.corked||state.bufferProcessing||!state.bufferedRequest||clearBuffer(stream,state),sync?asyncWrite(afterWrite,stream,state,finished,cb):afterWrite(stream,state,finished,cb)}}function afterWrite(stream,state,finished,cb){finished||onwriteDrain(stream,state),state.pendingcb--,cb(),finishMaybe(stream,state)}function onwriteDrain(stream,state){0===state.length&&state.needDrain&&(state.needDrain=!1,stream.emit("drain"))}function clearBuffer(stream,state){state.bufferProcessing=!0;var entry=state.bufferedRequest;if(stream._writev&&entry&&entry.next){var l=state.bufferedRequestCount,buffer=new Array(l),holder=state.corkedRequestsFree;holder.entry=entry;for(var count=0;entry;)buffer[count]=entry,entry=entry.next,count+=1;doWrite(stream,state,!0,state.length,buffer,"",holder.finish),state.pendingcb++,state.lastBufferedRequest=null,holder.next?(state.corkedRequestsFree=holder.next,holder.next=null):state.corkedRequestsFree=new CorkedRequest(state)}else{for(;entry;){var chunk=entry.chunk,encoding=entry.encoding,cb=entry.callback,len=state.objectMode?1:chunk.length;if(doWrite(stream,state,!1,len,chunk,encoding,cb),entry=entry.next,state.writing)break}null===entry&&(state.lastBufferedRequest=null)}state.bufferedRequestCount=0,state.bufferedRequest=entry,state.bufferProcessing=!1}function needFinish(state){return state.ending&&0===state.length&&null===state.bufferedRequest&&!state.finished&&!state.writing}function prefinish(stream,state){state.prefinished||(state.prefinished=!0,stream.emit("prefinish"))}function finishMaybe(stream,state){var need=needFinish(state);return need&&(0===state.pendingcb?(prefinish(stream,state),state.finished=!0,stream.emit("finish")):prefinish(stream,state)),need}function endWritable(stream,state,cb){state.ending=!0,finishMaybe(stream,state),cb&&(state.finished?processNextTick(cb):stream.once("finish",cb)),state.ended=!0,stream.writable=!1}function CorkedRequest(state){var _this=this;this.next=null,this.entry=null,this.finish=function(err){var entry=_this.entry;for(_this.entry=null;entry;){var cb=entry.callback;state.pendingcb--,cb(err),entry=entry.next}state.corkedRequestsFree?state.corkedRequestsFree.next=_this:state.corkedRequestsFree=_this}}module.exports=Writable;var Duplex,processNextTick=__webpack_require__(66),asyncWrite=!process.browser&&["v0.10","v0.9."].indexOf(process.version.slice(0,5))>-1?setImmediate:processNextTick;Writable.WritableState=WritableState;var util=__webpack_require__(27);util.inherits=__webpack_require__(28);var Stream,internalUtil={deprecate:__webpack_require__(463)};!function(){try{Stream=__webpack_require__(68)}catch(_){}finally{Stream||(Stream=__webpack_require__(42).EventEmitter)}}();var Buffer=__webpack_require__(12).Buffer,bufferShim=__webpack_require__(65);util.inherits(Writable,Stream),WritableState.prototype.getBuffer=function(){for(var current=this.bufferedRequest,out=[];current;)out.push(current),current=current.next;return out},function(){try{Object.defineProperty(WritableState.prototype,"buffer",{get:internalUtil.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.")})}catch(_){}}();var realHasInstance;"function"==typeof Symbol&&Symbol.hasInstance&&"function"==typeof Function.prototype[Symbol.hasInstance]?(realHasInstance=Function.prototype[Symbol.hasInstance],Object.defineProperty(Writable,Symbol.hasInstance,{value:function(object){return!!realHasInstance.call(this,object)||object&&object._writableState instanceof WritableState}})):realHasInstance=function(object){return object instanceof this},Writable.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},Writable.prototype.write=function(chunk,encoding,cb){var state=this._writableState,ret=!1,isBuf=Buffer.isBuffer(chunk);return"function"==typeof encoding&&(cb=encoding,encoding=null),isBuf?encoding="buffer":encoding||(encoding=state.defaultEncoding),"function"!=typeof cb&&(cb=nop),state.ended?writeAfterEnd(this,cb):(isBuf||validChunk(this,state,chunk,cb))&&(state.pendingcb++,ret=writeOrBuffer(this,state,isBuf,chunk,encoding,cb)),ret},Writable.prototype.cork=function(){var state=this._writableState;state.corked++},Writable.prototype.uncork=function(){var state=this._writableState;state.corked&&(state.corked--,state.writing||state.corked||state.finished||state.bufferProcessing||!state.bufferedRequest||clearBuffer(this,state))},Writable.prototype.setDefaultEncoding=function(encoding){if("string"==typeof encoding&&(encoding=encoding.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((encoding+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+encoding);return this._writableState.defaultEncoding=encoding,this},Writable.prototype._write=function(chunk,encoding,cb){cb(new Error("_write() is not implemented"))},Writable.prototype._writev=null,Writable.prototype.end=function(chunk,encoding,cb){var state=this._writableState;"function"==typeof chunk?(cb=chunk,chunk=null,encoding=null):"function"==typeof encoding&&(cb=encoding,encoding=null),null!==chunk&&void 0!==chunk&&this.write(chunk,encoding),state.corked&&(state.corked=1,this.uncork()),state.ending||state.finished||endWritable(this,state,cb)}}).call(exports,__webpack_require__(16),__webpack_require__(29).setImmediate)},function(module,exports,__webpack_require__){"use strict";(function(global){var buffer=__webpack_require__(12),Buffer=buffer.Buffer,SlowBuffer=buffer.SlowBuffer,MAX_LEN=buffer.kMaxLength||2147483647;exports.alloc=function(size,fill,encoding){if("function"==typeof Buffer.alloc)return Buffer.alloc(size,fill,encoding);if("number"==typeof encoding)throw new TypeError("encoding must not be number");if("number"!=typeof size)throw new TypeError("size must be a number");if(size>MAX_LEN)throw new RangeError("size is too large");var enc=encoding,_fill=fill;void 0===_fill&&(enc=void 0,_fill=0);var buf=new Buffer(size);if("string"==typeof _fill)for(var fillBuf=new Buffer(_fill,enc),flen=fillBuf.length,i=-1;++i<size;)buf[i]=fillBuf[i%flen];else buf.fill(_fill);return buf},exports.allocUnsafe=function(size){if("function"==typeof Buffer.allocUnsafe)return Buffer.allocUnsafe(size);if("number"!=typeof size)throw new TypeError("size must be a number");if(size>MAX_LEN)throw new RangeError("size is too large");return new Buffer(size)},exports.from=function(value,encodingOrOffset,length){if("function"==typeof Buffer.from&&(!global.Uint8Array||Uint8Array.from!==Buffer.from))return Buffer.from(value,encodingOrOffset,length);if("number"==typeof value)throw new TypeError('"value" argument must not be a number');if("string"==typeof value)return new Buffer(value,encodingOrOffset);if("undefined"!=typeof ArrayBuffer&&value instanceof ArrayBuffer){var offset=encodingOrOffset;if(1===arguments.length)return new Buffer(value);"undefined"==typeof offset&&(offset=0);var len=length;if("undefined"==typeof len&&(len=value.byteLength-offset),offset>=value.byteLength)throw new RangeError("'offset' is out of bounds");if(len>value.byteLength-offset)throw new RangeError("'length' is out of bounds");return new Buffer(value.slice(offset,offset+len))}if(Buffer.isBuffer(value)){var out=new Buffer(value.length);return value.copy(out,0,0,value.length),out}if(value){if(Array.isArray(value)||"undefined"!=typeof ArrayBuffer&&value.buffer instanceof ArrayBuffer||"length"in value)return new Buffer(value);if("Buffer"===value.type&&Array.isArray(value.data))return new Buffer(value.data)}throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")},exports.allocUnsafeSlow=function(size){if("function"==typeof Buffer.allocUnsafeSlow)return Buffer.allocUnsafeSlow(size);if("number"!=typeof size)throw new TypeError("size must be a number");if(size>=MAX_LEN)throw new RangeError("size is too large");return new SlowBuffer(size)}}).call(exports,__webpack_require__(4))},function(module,exports,__webpack_require__){"use strict";(function(process){function nextTick(fn,arg1,arg2,arg3){if("function"!=typeof fn)throw new TypeError('"callback" argument must be a function');var args,i,len=arguments.length;switch(len){case 0:case 1:return process.nextTick(fn);case 2:return process.nextTick(function(){fn.call(null,arg1)});case 3:return process.nextTick(function(){fn.call(null,arg1,arg2)});case 4:return process.nextTick(function(){fn.call(null,arg1,arg2,arg3)});default:for(args=new Array(len-1),i=0;i<args.length;)args[i++]=arguments[i];return process.nextTick(function(){fn.apply(null,args)})}}!process.version||0===process.version.indexOf("v0.")||0===process.version.indexOf("v1.")&&0!==process.version.indexOf("v1.8.")?module.exports=nextTick:module.exports=process.nextTick}).call(exports,__webpack_require__(16))},function(module,exports,__webpack_require__){(function(process){var Stream=function(){try{return __webpack_require__(68)}catch(_){}}();exports=module.exports=__webpack_require__(111),exports.Stream=Stream||exports,exports.Readable=exports,exports.Writable=__webpack_require__(64),exports.Duplex=__webpack_require__(19),exports.Transform=__webpack_require__(63),exports.PassThrough=__webpack_require__(110),!process.browser&&"disable"===process.env.READABLE_STREAM&&Stream&&(module.exports=Stream)}).call(exports,__webpack_require__(16))},function(module,exports,__webpack_require__){function Stream(){EE.call(this)}module.exports=Stream;var EE=__webpack_require__(42).EventEmitter,inherits=__webpack_require__(467);inherits(Stream,EE),Stream.Readable=__webpack_require__(67),Stream.Writable=__webpack_require__(466),Stream.Duplex=__webpack_require__(460),Stream.Transform=__webpack_require__(465),Stream.PassThrough=__webpack_require__(464),Stream.Stream=Stream,Stream.prototype.pipe=function(dest,options){function ondata(chunk){dest.writable&&!1===dest.write(chunk)&&source.pause&&source.pause()}function ondrain(){source.readable&&source.resume&&source.resume()}function onend(){didOnEnd||(didOnEnd=!0,dest.end())}function onclose(){didOnEnd||(didOnEnd=!0,"function"==typeof dest.destroy&&dest.destroy())}function onerror(er){if(cleanup(),0===EE.listenerCount(this,"error"))throw er}function cleanup(){source.removeListener("data",ondata),dest.removeListener("drain",ondrain),source.removeListener("end",onend),source.removeListener("close",onclose),source.removeListener("error",onerror),dest.removeListener("error",onerror),source.removeListener("end",cleanup),source.removeListener("close",cleanup),dest.removeListener("close",cleanup)}var source=this;source.on("data",ondata),dest.on("drain",ondrain),dest._isStdio||options&&options.end===!1||(source.on("end",onend),source.on("close",onclose));var didOnEnd=!1;return source.on("error",onerror),dest.on("error",onerror),source.on("end",cleanup),source.on("close",cleanup),dest.on("close",cleanup),dest.emit("pipe",source),dest}},function(module,exports,__webpack_require__){(function(global,process){function inspect(obj,opts){var ctx={seen:[],stylize:stylizeNoColor};return arguments.length>=3&&(ctx.depth=arguments[2]),arguments.length>=4&&(ctx.colors=arguments[3]),isBoolean(opts)?ctx.showHidden=opts:opts&&exports._extend(ctx,opts),isUndefined(ctx.showHidden)&&(ctx.showHidden=!1),isUndefined(ctx.depth)&&(ctx.depth=2),isUndefined(ctx.colors)&&(ctx.colors=!1),isUndefined(ctx.customInspect)&&(ctx.customInspect=!0),ctx.colors&&(ctx.stylize=stylizeWithColor),formatValue(ctx,obj,ctx.depth)}function stylizeWithColor(str,styleType){var style=inspect.styles[styleType];return style?"["+inspect.colors[style][0]+"m"+str+"["+inspect.colors[style][1]+"m":str}function stylizeNoColor(str,styleType){return str}function arrayToHash(array){var hash={};return array.forEach(function(val,idx){hash[val]=!0}),hash}function formatValue(ctx,value,recurseTimes){if(ctx.customInspect&&value&&isFunction(value.inspect)&&value.inspect!==exports.inspect&&(!value.constructor||value.constructor.prototype!==value)){var ret=value.inspect(recurseTimes,ctx);return isString(ret)||(ret=formatValue(ctx,ret,recurseTimes)),ret}var primitive=formatPrimitive(ctx,value);if(primitive)return primitive;var keys=Object.keys(value),visibleKeys=arrayToHash(keys);if(ctx.showHidden&&(keys=Object.getOwnPropertyNames(value)),isError(value)&&(keys.indexOf("message")>=0||keys.indexOf("description")>=0))return formatError(value);if(0===keys.length){if(isFunction(value)){var name=value.name?": "+value.name:"";return ctx.stylize("[Function"+name+"]","special")}if(isRegExp(value))return ctx.stylize(RegExp.prototype.toString.call(value),"regexp");if(isDate(value))return ctx.stylize(Date.prototype.toString.call(value),"date");if(isError(value))return formatError(value)}var base="",array=!1,braces=["{","}"];if(isArray(value)&&(array=!0,braces=["[","]"]),isFunction(value)){var n=value.name?": "+value.name:"";base=" [Function"+n+"]"}if(isRegExp(value)&&(base=" "+RegExp.prototype.toString.call(value)),isDate(value)&&(base=" "+Date.prototype.toUTCString.call(value)),isError(value)&&(base=" "+formatError(value)),0===keys.length&&(!array||0==value.length))return braces[0]+base+braces[1];if(recurseTimes<0)return isRegExp(value)?ctx.stylize(RegExp.prototype.toString.call(value),"regexp"):ctx.stylize("[Object]","special");ctx.seen.push(value);var output;return output=array?formatArray(ctx,value,recurseTimes,visibleKeys,keys):keys.map(function(key){return formatProperty(ctx,value,recurseTimes,visibleKeys,key,array)}),ctx.seen.pop(),reduceToSingleString(output,base,braces)}function formatPrimitive(ctx,value){if(isUndefined(value))return ctx.stylize("undefined","undefined");if(isString(value)){var simple="'"+JSON.stringify(value).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return ctx.stylize(simple,"string")}return isNumber(value)?ctx.stylize(""+value,"number"):isBoolean(value)?ctx.stylize(""+value,"boolean"):isNull(value)?ctx.stylize("null","null"):void 0;
}function formatError(value){return"["+Error.prototype.toString.call(value)+"]"}function formatArray(ctx,value,recurseTimes,visibleKeys,keys){for(var output=[],i=0,l=value.length;i<l;++i)hasOwnProperty(value,String(i))?output.push(formatProperty(ctx,value,recurseTimes,visibleKeys,String(i),!0)):output.push("");return keys.forEach(function(key){key.match(/^\d+$/)||output.push(formatProperty(ctx,value,recurseTimes,visibleKeys,key,!0))}),output}function formatProperty(ctx,value,recurseTimes,visibleKeys,key,array){var name,str,desc;if(desc=Object.getOwnPropertyDescriptor(value,key)||{value:value[key]},desc.get?str=desc.set?ctx.stylize("[Getter/Setter]","special"):ctx.stylize("[Getter]","special"):desc.set&&(str=ctx.stylize("[Setter]","special")),hasOwnProperty(visibleKeys,key)||(name="["+key+"]"),str||(ctx.seen.indexOf(desc.value)<0?(str=isNull(recurseTimes)?formatValue(ctx,desc.value,null):formatValue(ctx,desc.value,recurseTimes-1),str.indexOf("\n")>-1&&(str=array?str.split("\n").map(function(line){return"  "+line}).join("\n").substr(2):"\n"+str.split("\n").map(function(line){return"   "+line}).join("\n"))):str=ctx.stylize("[Circular]","special")),isUndefined(name)){if(array&&key.match(/^\d+$/))return str;name=JSON.stringify(""+key),name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(name=name.substr(1,name.length-2),name=ctx.stylize(name,"name")):(name=name.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),name=ctx.stylize(name,"string"))}return name+": "+str}function reduceToSingleString(output,base,braces){var numLinesEst=0,length=output.reduce(function(prev,cur){return numLinesEst++,cur.indexOf("\n")>=0&&numLinesEst++,prev+cur.replace(/\u001b\[\d\d?m/g,"").length+1},0);return length>60?braces[0]+(""===base?"":base+"\n ")+" "+output.join(",\n  ")+" "+braces[1]:braces[0]+base+" "+output.join(", ")+" "+braces[1]}function isArray(ar){return Array.isArray(ar)}function isBoolean(arg){return"boolean"==typeof arg}function isNull(arg){return null===arg}function isNullOrUndefined(arg){return null==arg}function isNumber(arg){return"number"==typeof arg}function isString(arg){return"string"==typeof arg}function isSymbol(arg){return"symbol"==typeof arg}function isUndefined(arg){return void 0===arg}function isRegExp(re){return isObject(re)&&"[object RegExp]"===objectToString(re)}function isObject(arg){return"object"==typeof arg&&null!==arg}function isDate(d){return isObject(d)&&"[object Date]"===objectToString(d)}function isError(e){return isObject(e)&&("[object Error]"===objectToString(e)||e instanceof Error)}function isFunction(arg){return"function"==typeof arg}function isPrimitive(arg){return null===arg||"boolean"==typeof arg||"number"==typeof arg||"string"==typeof arg||"symbol"==typeof arg||"undefined"==typeof arg}function objectToString(o){return Object.prototype.toString.call(o)}function pad(n){return n<10?"0"+n.toString(10):n.toString(10)}function timestamp(){var d=new Date,time=[pad(d.getHours()),pad(d.getMinutes()),pad(d.getSeconds())].join(":");return[d.getDate(),months[d.getMonth()],time].join(" ")}function hasOwnProperty(obj,prop){return Object.prototype.hasOwnProperty.call(obj,prop)}var formatRegExp=/%[sdj%]/g;exports.format=function(f){if(!isString(f)){for(var objects=[],i=0;i<arguments.length;i++)objects.push(inspect(arguments[i]));return objects.join(" ")}for(var i=1,args=arguments,len=args.length,str=String(f).replace(formatRegExp,function(x){if("%%"===x)return"%";if(i>=len)return x;switch(x){case"%s":return String(args[i++]);case"%d":return Number(args[i++]);case"%j":try{return JSON.stringify(args[i++])}catch(_){return"[Circular]"}default:return x}}),x=args[i];i<len;x=args[++i])str+=isNull(x)||!isObject(x)?" "+x:" "+inspect(x);return str},exports.deprecate=function(fn,msg){function deprecated(){if(!warned){if(process.throwDeprecation)throw new Error(msg);process.traceDeprecation?console.trace(msg):console.error(msg),warned=!0}return fn.apply(this,arguments)}if(isUndefined(global.process))return function(){return exports.deprecate(fn,msg).apply(this,arguments)};if(process.noDeprecation===!0)return fn;var warned=!1;return deprecated};var debugEnviron,debugs={};exports.debuglog=function(set){if(isUndefined(debugEnviron)&&(debugEnviron=process.env.NODE_DEBUG||""),set=set.toUpperCase(),!debugs[set])if(new RegExp("\\b"+set+"\\b","i").test(debugEnviron)){var pid=process.pid;debugs[set]=function(){var msg=exports.format.apply(exports,arguments);console.error("%s %d: %s",set,pid,msg)}}else debugs[set]=function(){};return debugs[set]},exports.inspect=inspect,inspect.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},inspect.styles={special:"cyan",number:"yellow","boolean":"yellow",undefined:"grey","null":"bold",string:"green",date:"magenta",regexp:"red"},exports.isArray=isArray,exports.isBoolean=isBoolean,exports.isNull=isNull,exports.isNullOrUndefined=isNullOrUndefined,exports.isNumber=isNumber,exports.isString=isString,exports.isSymbol=isSymbol,exports.isUndefined=isUndefined,exports.isRegExp=isRegExp,exports.isObject=isObject,exports.isDate=isDate,exports.isError=isError,exports.isFunction=isFunction,exports.isPrimitive=isPrimitive,exports.isBuffer=__webpack_require__(475);var months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];exports.log=function(){console.log("%s - %s",timestamp(),exports.format.apply(exports,arguments))},exports.inherits=__webpack_require__(474),exports._extend=function(origin,add){if(!add||!isObject(add))return origin;for(var keys=Object.keys(add),i=keys.length;i--;)origin[keys[i]]=add[keys[i]];return origin}}).call(exports,__webpack_require__(4),__webpack_require__(16))},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subject_1=__webpack_require__(6),ObjectUnsubscribedError_1=__webpack_require__(36),BehaviorSubject=function(_super){function BehaviorSubject(_value){_super.call(this),this._value=_value}return __extends(BehaviorSubject,_super),Object.defineProperty(BehaviorSubject.prototype,"value",{get:function(){return this.getValue()},enumerable:!0,configurable:!0}),BehaviorSubject.prototype._subscribe=function(subscriber){var subscription=_super.prototype._subscribe.call(this,subscriber);return subscription&&!subscription.closed&&subscriber.next(this._value),subscription},BehaviorSubject.prototype.getValue=function(){if(this.hasError)throw this.thrownError;if(this.closed)throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError;return this._value},BehaviorSubject.prototype.next=function(value){_super.prototype.next.call(this,this._value=value)},BehaviorSubject}(Subject_1.Subject);exports.BehaviorSubject=BehaviorSubject},function(module,exports){"use strict";exports.empty={closed:!0,next:function(value){},error:function(err){throw err},complete:function(){}}},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscription_1=__webpack_require__(5),SubjectSubscription=function(_super){function SubjectSubscription(subject,subscriber){_super.call(this),this.subject=subject,this.subscriber=subscriber,this.closed=!1}return __extends(SubjectSubscription,_super),SubjectSubscription.prototype.unsubscribe=function(){if(!this.closed){this.closed=!0;var subject=this.subject,observers=subject.observers;if(this.subject=null,observers&&0!==observers.length&&!subject.isStopped&&!subject.closed){var subscriberIndex=observers.indexOf(this.subscriber);subscriberIndex!==-1&&observers.splice(subscriberIndex,1)}}},SubjectSubscription}(Subscription_1.Subscription);exports.SubjectSubscription=SubjectSubscription},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subject_1=__webpack_require__(6),Observable_1=__webpack_require__(0),Subscriber_1=__webpack_require__(1),Subscription_1=__webpack_require__(5),ConnectableObservable=function(_super){function ConnectableObservable(source,subjectFactory){_super.call(this),this.source=source,this.subjectFactory=subjectFactory,this._refCount=0}return __extends(ConnectableObservable,_super),ConnectableObservable.prototype._subscribe=function(subscriber){return this.getSubject().subscribe(subscriber)},ConnectableObservable.prototype.getSubject=function(){var subject=this._subject;return subject&&!subject.isStopped||(this._subject=this.subjectFactory()),this._subject},ConnectableObservable.prototype.connect=function(){var connection=this._connection;return connection||(connection=this._connection=new Subscription_1.Subscription,connection.add(this.source.subscribe(new ConnectableSubscriber(this.getSubject(),this))),connection.closed?(this._connection=null,connection=Subscription_1.Subscription.EMPTY):this._connection=connection),connection},ConnectableObservable.prototype.refCount=function(){return this.lift(new RefCountOperator(this))},ConnectableObservable}(Observable_1.Observable);exports.ConnectableObservable=ConnectableObservable,exports.connectableObservableDescriptor={operator:{value:null},_refCount:{value:0,writable:!0},_subscribe:{value:ConnectableObservable.prototype._subscribe},getSubject:{value:ConnectableObservable.prototype.getSubject},connect:{value:ConnectableObservable.prototype.connect},refCount:{value:ConnectableObservable.prototype.refCount}};var ConnectableSubscriber=function(_super){function ConnectableSubscriber(destination,connectable){_super.call(this,destination),this.connectable=connectable}return __extends(ConnectableSubscriber,_super),ConnectableSubscriber.prototype._error=function(err){this._unsubscribe(),_super.prototype._error.call(this,err)},ConnectableSubscriber.prototype._complete=function(){this._unsubscribe(),_super.prototype._complete.call(this)},ConnectableSubscriber.prototype._unsubscribe=function(){var connectable=this.connectable;if(connectable){this.connectable=null;var connection=connectable._connection;connectable._refCount=0,connectable._subject=null,connectable._connection=null,connection&&connection.unsubscribe()}},ConnectableSubscriber}(Subject_1.SubjectSubscriber),RefCountOperator=function(){function RefCountOperator(connectable){this.connectable=connectable}return RefCountOperator.prototype.call=function(subscriber,source){var connectable=this.connectable;connectable._refCount++;var refCounter=new RefCountSubscriber(subscriber,connectable),subscription=source.subscribe(refCounter);return refCounter.closed||(refCounter.connection=connectable.connect()),subscription},RefCountOperator}(),RefCountSubscriber=function(_super){function RefCountSubscriber(destination,connectable){_super.call(this,destination),this.connectable=connectable}return __extends(RefCountSubscriber,_super),RefCountSubscriber.prototype._unsubscribe=function(){var connectable=this.connectable;if(!connectable)return void(this.connection=null);this.connectable=null;var refCount=connectable._refCount;if(refCount<=0)return void(this.connection=null);if(connectable._refCount=refCount-1,refCount>1)return void(this.connection=null);var connection=this.connection,sharedConnection=connectable._connection;this.connection=null,!sharedConnection||connection&&sharedConnection!==connection||sharedConnection.unsubscribe()},RefCountSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},isArray_1=__webpack_require__(14),isArrayLike_1=__webpack_require__(95),isPromise_1=__webpack_require__(97),PromiseObservable_1=__webpack_require__(75),IteratorObservable_1=__webpack_require__(291),ArrayObservable_1=__webpack_require__(13),ArrayLikeObservable_1=__webpack_require__(280),iterator_1=__webpack_require__(25),Observable_1=__webpack_require__(0),observeOn_1=__webpack_require__(55),observable_1=__webpack_require__(32),FromObservable=function(_super){function FromObservable(ish,scheduler){_super.call(this,null),this.ish=ish,this.scheduler=scheduler}return __extends(FromObservable,_super),FromObservable.create=function(ish,scheduler){if(null!=ish){if("function"==typeof ish[observable_1.$$observable])return ish instanceof Observable_1.Observable&&!scheduler?ish:new FromObservable(ish,scheduler);if(isArray_1.isArray(ish))return new ArrayObservable_1.ArrayObservable(ish,scheduler);if(isPromise_1.isPromise(ish))return new PromiseObservable_1.PromiseObservable(ish,scheduler);if("function"==typeof ish[iterator_1.$$iterator]||"string"==typeof ish)return new IteratorObservable_1.IteratorObservable(ish,scheduler);if(isArrayLike_1.isArrayLike(ish))return new ArrayLikeObservable_1.ArrayLikeObservable(ish,scheduler)}throw new TypeError((null!==ish&&typeof ish||ish)+" is not observable")},FromObservable.prototype._subscribe=function(subscriber){var ish=this.ish,scheduler=this.scheduler;return null==scheduler?ish[observable_1.$$observable]().subscribe(subscriber):ish[observable_1.$$observable]().subscribe(new observeOn_1.ObserveOnSubscriber(subscriber,scheduler,0))},FromObservable}(Observable_1.Observable);exports.FromObservable=FromObservable},function(module,exports,__webpack_require__){"use strict";function dispatchNext(arg){var value=arg.value,subscriber=arg.subscriber;subscriber.closed||(subscriber.next(value),subscriber.complete())}function dispatchError(arg){var err=arg.err,subscriber=arg.subscriber;subscriber.closed||subscriber.error(err)}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},root_1=__webpack_require__(8),Observable_1=__webpack_require__(0),PromiseObservable=function(_super){function PromiseObservable(promise,scheduler){_super.call(this),this.promise=promise,this.scheduler=scheduler}return __extends(PromiseObservable,_super),PromiseObservable.create=function(promise,scheduler){return new PromiseObservable(promise,scheduler)},PromiseObservable.prototype._subscribe=function(subscriber){var _this=this,promise=this.promise,scheduler=this.scheduler;if(null==scheduler)this._isScalar?subscriber.closed||(subscriber.next(this.value),subscriber.complete()):promise.then(function(value){_this.value=value,_this._isScalar=!0,subscriber.closed||(subscriber.next(value),subscriber.complete())},function(err){subscriber.closed||subscriber.error(err)}).then(null,function(err){root_1.root.setTimeout(function(){throw err})});else if(this._isScalar){if(!subscriber.closed)return scheduler.schedule(dispatchNext,0,{value:this.value,subscriber:subscriber})}else promise.then(function(value){_this.value=value,_this._isScalar=!0,subscriber.closed||subscriber.add(scheduler.schedule(dispatchNext,0,{value:value,subscriber:subscriber}))},function(err){subscriber.closed||subscriber.add(scheduler.schedule(dispatchError,0,{err:err,subscriber:subscriber}))}).then(null,function(err){root_1.root.setTimeout(function(){throw err})})},PromiseObservable}(Observable_1.Observable);exports.PromiseObservable=PromiseObservable},function(module,exports,__webpack_require__){"use strict";function getCORSRequest(){if(root_1.root.XMLHttpRequest)return new root_1.root.XMLHttpRequest;if(root_1.root.XDomainRequest)return new root_1.root.XDomainRequest;throw new Error("CORS is not supported by your browser")}function getXMLHttpRequest(){if(root_1.root.XMLHttpRequest)return new root_1.root.XMLHttpRequest;var progId=void 0;try{for(var progIds=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"],i=0;i<3;i++)try{if(progId=progIds[i],new root_1.root.ActiveXObject(progId))break}catch(e){}return new root_1.root.ActiveXObject(progId)}catch(e){throw new Error("XMLHttpRequest is not supported by your browser")}}function ajaxGet(url,headers){return void 0===headers&&(headers=null),new AjaxObservable({method:"GET",url:url,headers:headers})}function ajaxPost(url,body,headers){return new AjaxObservable({method:"POST",url:url,body:body,headers:headers})}function ajaxDelete(url,headers){return new AjaxObservable({method:"DELETE",url:url,headers:headers})}function ajaxPut(url,body,headers){return new AjaxObservable({method:"PUT",url:url,body:body,headers:headers})}function ajaxPatch(url,body,headers){return new AjaxObservable({method:"PATCH",url:url,body:body,headers:headers})}function ajaxGetJSON(url,headers){return new AjaxObservable({method:"GET",url:url,responseType:"json",headers:headers}).lift(new map_1.MapOperator(function(x,index){return x.response},null))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},root_1=__webpack_require__(8),tryCatch_1=__webpack_require__(9),errorObject_1=__webpack_require__(7),Observable_1=__webpack_require__(0),Subscriber_1=__webpack_require__(1),map_1=__webpack_require__(54);exports.ajaxGet=ajaxGet,exports.ajaxPost=ajaxPost,exports.ajaxDelete=ajaxDelete,exports.ajaxPut=ajaxPut,exports.ajaxPatch=ajaxPatch,exports.ajaxGetJSON=ajaxGetJSON;var AjaxObservable=function(_super){function AjaxObservable(urlOrRequest){_super.call(this);var request={async:!0,createXHR:function(){return this.crossDomain?getCORSRequest.call(this):getXMLHttpRequest()},crossDomain:!1,withCredentials:!1,headers:{},method:"GET",responseType:"json",timeout:0};if("string"==typeof urlOrRequest)request.url=urlOrRequest;else for(var prop in urlOrRequest)urlOrRequest.hasOwnProperty(prop)&&(request[prop]=urlOrRequest[prop]);this.request=request}return __extends(AjaxObservable,_super),AjaxObservable.prototype._subscribe=function(subscriber){return new AjaxSubscriber(subscriber,this.request)},AjaxObservable.create=function(){var create=function(urlOrRequest){return new AjaxObservable(urlOrRequest)};return create.get=ajaxGet,create.post=ajaxPost,create["delete"]=ajaxDelete,create.put=ajaxPut,create.patch=ajaxPatch,create.getJSON=ajaxGetJSON,create}(),AjaxObservable}(Observable_1.Observable);exports.AjaxObservable=AjaxObservable;var AjaxSubscriber=function(_super){function AjaxSubscriber(destination,request){_super.call(this,destination),this.request=request,this.done=!1;var headers=request.headers=request.headers||{};request.crossDomain||headers["X-Requested-With"]||(headers["X-Requested-With"]="XMLHttpRequest"),"Content-Type"in headers||root_1.root.FormData&&request.body instanceof root_1.root.FormData||"undefined"==typeof request.body||(headers["Content-Type"]="application/x-www-form-urlencoded; charset=UTF-8"),request.body=this.serializeBody(request.body,request.headers["Content-Type"]),this.send()}return __extends(AjaxSubscriber,_super),AjaxSubscriber.prototype.next=function(e){this.done=!0;var _a=this,xhr=_a.xhr,request=_a.request,destination=_a.destination,response=new AjaxResponse(e,xhr,request);destination.next(response)},AjaxSubscriber.prototype.send=function(){var _a=this,request=_a.request,_b=_a.request,user=_b.user,method=_b.method,url=_b.url,async=_b.async,password=_b.password,headers=_b.headers,body=_b.body,createXHR=request.createXHR,xhr=tryCatch_1.tryCatch(createXHR).call(request);if(xhr===errorObject_1.errorObject)this.error(errorObject_1.errorObject.e);else{this.xhr=xhr,this.setupEvents(xhr,request);var result=void 0;if(result=user?tryCatch_1.tryCatch(xhr.open).call(xhr,method,url,async,user,password):tryCatch_1.tryCatch(xhr.open).call(xhr,method,url,async),result===errorObject_1.errorObject)return this.error(errorObject_1.errorObject.e),null;if(xhr.timeout=request.timeout,xhr.responseType=request.responseType,"withCredentials"in xhr&&(xhr.withCredentials=!!request.withCredentials),this.setHeaders(xhr,headers),result=body?tryCatch_1.tryCatch(xhr.send).call(xhr,body):tryCatch_1.tryCatch(xhr.send).call(xhr),result===errorObject_1.errorObject)return this.error(errorObject_1.errorObject.e),null}return xhr},AjaxSubscriber.prototype.serializeBody=function(body,contentType){if(!body||"string"==typeof body)return body;if(root_1.root.FormData&&body instanceof root_1.root.FormData)return body;if(contentType){var splitIndex=contentType.indexOf(";");splitIndex!==-1&&(contentType=contentType.substring(0,splitIndex))}switch(contentType){case"application/x-www-form-urlencoded":return Object.keys(body).map(function(key){return encodeURI(key)+"="+encodeURI(body[key])}).join("&");case"application/json":return JSON.stringify(body);default:return body}},AjaxSubscriber.prototype.setHeaders=function(xhr,headers){for(var key in headers)headers.hasOwnProperty(key)&&xhr.setRequestHeader(key,headers[key])},AjaxSubscriber.prototype.setupEvents=function(xhr,request){function xhrTimeout(e){var _a=xhrTimeout,subscriber=_a.subscriber,progressSubscriber=_a.progressSubscriber,request=_a.request;progressSubscriber&&progressSubscriber.error(e),subscriber.error(new AjaxTimeoutError(this,request))}function xhrReadyStateChange(e){var _a=xhrReadyStateChange,subscriber=_a.subscriber,progressSubscriber=_a.progressSubscriber,request=_a.request;if(4===this.readyState){var status_1=1223===this.status?204:this.status,response="text"===this.responseType?this.response||this.responseText:this.response;0===status_1&&(status_1=response?200:0),200<=status_1&&status_1<300?(progressSubscriber&&progressSubscriber.complete(),subscriber.next(e),subscriber.complete()):(progressSubscriber&&progressSubscriber.error(e),subscriber.error(new AjaxError("ajax error "+status_1,this,request)))}}var progressSubscriber=request.progressSubscriber;if(xhr.ontimeout=xhrTimeout,xhrTimeout.request=request,xhrTimeout.subscriber=this,xhrTimeout.progressSubscriber=progressSubscriber,xhr.upload&&"withCredentials"in xhr){if(progressSubscriber){var xhrProgress_1;xhrProgress_1=function(e){var progressSubscriber=xhrProgress_1.progressSubscriber;progressSubscriber.next(e)},root_1.root.XDomainRequest?xhr.onprogress=xhrProgress_1:xhr.upload.onprogress=xhrProgress_1,xhrProgress_1.progressSubscriber=progressSubscriber}var xhrError_1;xhrError_1=function(e){var _a=xhrError_1,progressSubscriber=_a.progressSubscriber,subscriber=_a.subscriber,request=_a.request;progressSubscriber&&progressSubscriber.error(e),subscriber.error(new AjaxError("ajax error",this,request))},xhr.onerror=xhrError_1,xhrError_1.request=request,xhrError_1.subscriber=this,xhrError_1.progressSubscriber=progressSubscriber}xhr.onreadystatechange=xhrReadyStateChange,xhrReadyStateChange.subscriber=this,xhrReadyStateChange.progressSubscriber=progressSubscriber,xhrReadyStateChange.request=request},AjaxSubscriber.prototype.unsubscribe=function(){var _a=this,done=_a.done,xhr=_a.xhr;!done&&xhr&&4!==xhr.readyState&&"function"==typeof xhr.abort&&xhr.abort(),_super.prototype.unsubscribe.call(this)},AjaxSubscriber}(Subscriber_1.Subscriber);exports.AjaxSubscriber=AjaxSubscriber;var AjaxResponse=function(){function AjaxResponse(originalEvent,xhr,request){switch(this.originalEvent=originalEvent,this.xhr=xhr,this.request=request,this.status=xhr.status,this.responseType=xhr.responseType||request.responseType,this.responseType){case"json":"response"in xhr?this.response=xhr.responseType?xhr.response:JSON.parse(xhr.response||xhr.responseText||"null"):this.response=JSON.parse(xhr.responseText||"null");break;case"xml":this.response=xhr.responseXML;break;case"text":default:this.response="response"in xhr?xhr.response:xhr.responseText}}return AjaxResponse}();exports.AjaxResponse=AjaxResponse;var AjaxError=function(_super){function AjaxError(message,xhr,request){_super.call(this,message),this.message=message,this.xhr=xhr,this.request=request,this.status=xhr.status}return __extends(AjaxError,_super),AjaxError}(Error);exports.AjaxError=AjaxError;var AjaxTimeoutError=function(_super){function AjaxTimeoutError(xhr,request){_super.call(this,"ajax timeout",xhr,request)}return __extends(AjaxTimeoutError,_super),AjaxTimeoutError}(AjaxError);exports.AjaxTimeoutError=AjaxTimeoutError},function(module,exports,__webpack_require__){"use strict";function distinctUntilChanged(compare,keySelector){return this.lift(new DistinctUntilChangedOperator(compare,keySelector))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),tryCatch_1=__webpack_require__(9),errorObject_1=__webpack_require__(7);exports.distinctUntilChanged=distinctUntilChanged;var DistinctUntilChangedOperator=function(){function DistinctUntilChangedOperator(compare,keySelector){this.compare=compare,this.keySelector=keySelector}return DistinctUntilChangedOperator.prototype.call=function(subscriber,source){return source.subscribe(new DistinctUntilChangedSubscriber(subscriber,this.compare,this.keySelector))},DistinctUntilChangedOperator}(),DistinctUntilChangedSubscriber=function(_super){function DistinctUntilChangedSubscriber(destination,compare,keySelector){_super.call(this,destination),this.keySelector=keySelector,this.hasKey=!1,"function"==typeof compare&&(this.compare=compare)}return __extends(DistinctUntilChangedSubscriber,_super),DistinctUntilChangedSubscriber.prototype.compare=function(x,y){return x===y},DistinctUntilChangedSubscriber.prototype._next=function(value){var keySelector=this.keySelector,key=value;if(keySelector&&(key=tryCatch_1.tryCatch(this.keySelector)(value),key===errorObject_1.errorObject))return this.destination.error(errorObject_1.errorObject.e);var result=!1;if(this.hasKey){if(result=tryCatch_1.tryCatch(this.compare)(this.key,key),result===errorObject_1.errorObject)return this.destination.error(errorObject_1.errorObject.e)}else this.hasKey=!0;Boolean(result)===!1&&(this.key=key,this.destination.next(value))},DistinctUntilChangedSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function filter(predicate,thisArg){return this.lift(new FilterOperator(predicate,thisArg))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1);exports.filter=filter;var FilterOperator=function(){function FilterOperator(predicate,thisArg){this.predicate=predicate,this.thisArg=thisArg}return FilterOperator.prototype.call=function(subscriber,source){return source.subscribe(new FilterSubscriber(subscriber,this.predicate,this.thisArg))},FilterOperator}(),FilterSubscriber=function(_super){function FilterSubscriber(destination,predicate,thisArg){_super.call(this,destination),this.predicate=predicate,this.thisArg=thisArg,this.count=0,this.predicate=predicate}return __extends(FilterSubscriber,_super),FilterSubscriber.prototype._next=function(value){var result;try{result=this.predicate.call(this.thisArg,value,this.count++)}catch(err){return void this.destination.error(err)}result&&this.destination.next(value)},FilterSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function find(predicate,thisArg){if("function"!=typeof predicate)throw new TypeError("predicate is not a function");return this.lift(new FindValueOperator(predicate,this,(!1),thisArg))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1);exports.find=find;var FindValueOperator=function(){function FindValueOperator(predicate,source,yieldIndex,thisArg){this.predicate=predicate,this.source=source,this.yieldIndex=yieldIndex,this.thisArg=thisArg}return FindValueOperator.prototype.call=function(observer,source){return source.subscribe(new FindValueSubscriber(observer,this.predicate,this.source,this.yieldIndex,this.thisArg))},FindValueOperator}();exports.FindValueOperator=FindValueOperator;var FindValueSubscriber=function(_super){function FindValueSubscriber(destination,predicate,source,yieldIndex,thisArg){_super.call(this,destination),this.predicate=predicate,this.source=source,this.yieldIndex=yieldIndex,this.thisArg=thisArg,this.index=0}return __extends(FindValueSubscriber,_super),FindValueSubscriber.prototype.notifyComplete=function(value){var destination=this.destination;destination.next(value),destination.complete()},FindValueSubscriber.prototype._next=function(value){var _a=this,predicate=_a.predicate,thisArg=_a.thisArg,index=this.index++;try{var result=predicate.call(thisArg||this,value,index,this.source);result&&this.notifyComplete(this.yieldIndex?index:value)}catch(err){this.destination.error(err)}},FindValueSubscriber.prototype._complete=function(){this.notifyComplete(this.yieldIndex?-1:void 0)},FindValueSubscriber}(Subscriber_1.Subscriber);exports.FindValueSubscriber=FindValueSubscriber},function(module,exports,__webpack_require__){"use strict";function merge(){for(var observables=[],_i=0;_i<arguments.length;_i++)observables[_i-0]=arguments[_i];return this.lift.call(mergeStatic.apply(void 0,[this].concat(observables)))}function mergeStatic(){for(var observables=[],_i=0;_i<arguments.length;_i++)observables[_i-0]=arguments[_i];var concurrent=Number.POSITIVE_INFINITY,scheduler=null,last=observables[observables.length-1];return isScheduler_1.isScheduler(last)?(scheduler=observables.pop(),observables.length>1&&"number"==typeof observables[observables.length-1]&&(concurrent=observables.pop())):"number"==typeof last&&(concurrent=observables.pop()),null===scheduler&&1===observables.length&&observables[0]instanceof Observable_1.Observable?observables[0]:new ArrayObservable_1.ArrayObservable(observables,scheduler).lift(new mergeAll_1.MergeAllOperator(concurrent))}var Observable_1=__webpack_require__(0),ArrayObservable_1=__webpack_require__(13),mergeAll_1=__webpack_require__(31),isScheduler_1=__webpack_require__(15);exports.merge=merge,exports.mergeStatic=mergeStatic},function(module,exports,__webpack_require__){"use strict";function mergeMap(project,resultSelector,concurrent){return void 0===concurrent&&(concurrent=Number.POSITIVE_INFINITY),"number"==typeof resultSelector&&(concurrent=resultSelector,resultSelector=null),this.lift(new MergeMapOperator(project,resultSelector,concurrent))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},subscribeToResult_1=__webpack_require__(3),OuterSubscriber_1=__webpack_require__(2);exports.mergeMap=mergeMap;var MergeMapOperator=function(){function MergeMapOperator(project,resultSelector,concurrent){void 0===concurrent&&(concurrent=Number.POSITIVE_INFINITY),this.project=project,this.resultSelector=resultSelector,this.concurrent=concurrent}return MergeMapOperator.prototype.call=function(observer,source){return source.subscribe(new MergeMapSubscriber(observer,this.project,this.resultSelector,this.concurrent))},MergeMapOperator}();exports.MergeMapOperator=MergeMapOperator;var MergeMapSubscriber=function(_super){function MergeMapSubscriber(destination,project,resultSelector,concurrent){void 0===concurrent&&(concurrent=Number.POSITIVE_INFINITY),_super.call(this,destination),this.project=project,this.resultSelector=resultSelector,this.concurrent=concurrent,this.hasCompleted=!1,this.buffer=[],this.active=0,this.index=0;
}return __extends(MergeMapSubscriber,_super),MergeMapSubscriber.prototype._next=function(value){this.active<this.concurrent?this._tryNext(value):this.buffer.push(value)},MergeMapSubscriber.prototype._tryNext=function(value){var result,index=this.index++;try{result=this.project(value,index)}catch(err){return void this.destination.error(err)}this.active++,this._innerSub(result,value,index)},MergeMapSubscriber.prototype._innerSub=function(ish,value,index){this.add(subscribeToResult_1.subscribeToResult(this,ish,value,index))},MergeMapSubscriber.prototype._complete=function(){this.hasCompleted=!0,0===this.active&&0===this.buffer.length&&this.destination.complete()},MergeMapSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this.resultSelector?this._notifyResultSelector(outerValue,innerValue,outerIndex,innerIndex):this.destination.next(innerValue)},MergeMapSubscriber.prototype._notifyResultSelector=function(outerValue,innerValue,outerIndex,innerIndex){var result;try{result=this.resultSelector(outerValue,innerValue,outerIndex,innerIndex)}catch(err){return void this.destination.error(err)}this.destination.next(result)},MergeMapSubscriber.prototype.notifyComplete=function(innerSub){var buffer=this.buffer;this.remove(innerSub),this.active--,buffer.length>0?this._next(buffer.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()},MergeMapSubscriber}(OuterSubscriber_1.OuterSubscriber);exports.MergeMapSubscriber=MergeMapSubscriber},function(module,exports,__webpack_require__){"use strict";function mergeMapTo(innerObservable,resultSelector,concurrent){return void 0===concurrent&&(concurrent=Number.POSITIVE_INFINITY),"number"==typeof resultSelector&&(concurrent=resultSelector,resultSelector=null),this.lift(new MergeMapToOperator(innerObservable,resultSelector,concurrent))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.mergeMapTo=mergeMapTo;var MergeMapToOperator=function(){function MergeMapToOperator(ish,resultSelector,concurrent){void 0===concurrent&&(concurrent=Number.POSITIVE_INFINITY),this.ish=ish,this.resultSelector=resultSelector,this.concurrent=concurrent}return MergeMapToOperator.prototype.call=function(observer,source){return source.subscribe(new MergeMapToSubscriber(observer,this.ish,this.resultSelector,this.concurrent))},MergeMapToOperator}();exports.MergeMapToOperator=MergeMapToOperator;var MergeMapToSubscriber=function(_super){function MergeMapToSubscriber(destination,ish,resultSelector,concurrent){void 0===concurrent&&(concurrent=Number.POSITIVE_INFINITY),_super.call(this,destination),this.ish=ish,this.resultSelector=resultSelector,this.concurrent=concurrent,this.hasCompleted=!1,this.buffer=[],this.active=0,this.index=0}return __extends(MergeMapToSubscriber,_super),MergeMapToSubscriber.prototype._next=function(value){if(this.active<this.concurrent){var resultSelector=this.resultSelector,index=this.index++,ish=this.ish,destination=this.destination;this.active++,this._innerSub(ish,destination,resultSelector,value,index)}else this.buffer.push(value)},MergeMapToSubscriber.prototype._innerSub=function(ish,destination,resultSelector,value,index){this.add(subscribeToResult_1.subscribeToResult(this,ish,value,index))},MergeMapToSubscriber.prototype._complete=function(){this.hasCompleted=!0,0===this.active&&0===this.buffer.length&&this.destination.complete()},MergeMapToSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){var _a=this,resultSelector=_a.resultSelector,destination=_a.destination;resultSelector?this.trySelectResult(outerValue,innerValue,outerIndex,innerIndex):destination.next(innerValue)},MergeMapToSubscriber.prototype.trySelectResult=function(outerValue,innerValue,outerIndex,innerIndex){var result,_a=this,resultSelector=_a.resultSelector,destination=_a.destination;try{result=resultSelector(outerValue,innerValue,outerIndex,innerIndex)}catch(err){return void destination.error(err)}destination.next(result)},MergeMapToSubscriber.prototype.notifyError=function(err){this.destination.error(err)},MergeMapToSubscriber.prototype.notifyComplete=function(innerSub){var buffer=this.buffer;this.remove(innerSub),this.active--,buffer.length>0?this._next(buffer.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()},MergeMapToSubscriber}(OuterSubscriber_1.OuterSubscriber);exports.MergeMapToSubscriber=MergeMapToSubscriber},function(module,exports,__webpack_require__){"use strict";function onErrorResumeNext(){for(var nextSources=[],_i=0;_i<arguments.length;_i++)nextSources[_i-0]=arguments[_i];return 1===nextSources.length&&isArray_1.isArray(nextSources[0])&&(nextSources=nextSources[0]),this.lift(new OnErrorResumeNextOperator(nextSources))}function onErrorResumeNextStatic(){for(var nextSources=[],_i=0;_i<arguments.length;_i++)nextSources[_i-0]=arguments[_i];var source=null;return 1===nextSources.length&&isArray_1.isArray(nextSources[0])&&(nextSources=nextSources[0]),source=nextSources.shift(),new FromObservable_1.FromObservable(source,null).lift(new OnErrorResumeNextOperator(nextSources))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},FromObservable_1=__webpack_require__(74),isArray_1=__webpack_require__(14),OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.onErrorResumeNext=onErrorResumeNext,exports.onErrorResumeNextStatic=onErrorResumeNextStatic;var OnErrorResumeNextOperator=function(){function OnErrorResumeNextOperator(nextSources){this.nextSources=nextSources}return OnErrorResumeNextOperator.prototype.call=function(subscriber,source){return source.subscribe(new OnErrorResumeNextSubscriber(subscriber,this.nextSources))},OnErrorResumeNextOperator}(),OnErrorResumeNextSubscriber=function(_super){function OnErrorResumeNextSubscriber(destination,nextSources){_super.call(this,destination),this.destination=destination,this.nextSources=nextSources}return __extends(OnErrorResumeNextSubscriber,_super),OnErrorResumeNextSubscriber.prototype.notifyError=function(error,innerSub){this.subscribeToNextSource()},OnErrorResumeNextSubscriber.prototype.notifyComplete=function(innerSub){this.subscribeToNextSource()},OnErrorResumeNextSubscriber.prototype._error=function(err){this.subscribeToNextSource()},OnErrorResumeNextSubscriber.prototype._complete=function(){this.subscribeToNextSource()},OnErrorResumeNextSubscriber.prototype.subscribeToNextSource=function(){var next=this.nextSources.shift();next?this.add(subscribeToResult_1.subscribeToResult(this,next)):this.destination.complete()},OnErrorResumeNextSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function race(){for(var observables=[],_i=0;_i<arguments.length;_i++)observables[_i-0]=arguments[_i];return 1===observables.length&&isArray_1.isArray(observables[0])&&(observables=observables[0]),this.lift.call(raceStatic.apply(void 0,[this].concat(observables)))}function raceStatic(){for(var observables=[],_i=0;_i<arguments.length;_i++)observables[_i-0]=arguments[_i];if(1===observables.length){if(!isArray_1.isArray(observables[0]))return observables[0];observables=observables[0]}return new ArrayObservable_1.ArrayObservable(observables).lift(new RaceOperator)}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},isArray_1=__webpack_require__(14),ArrayObservable_1=__webpack_require__(13),OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.race=race,exports.raceStatic=raceStatic;var RaceOperator=function(){function RaceOperator(){}return RaceOperator.prototype.call=function(subscriber,source){return source.subscribe(new RaceSubscriber(subscriber))},RaceOperator}();exports.RaceOperator=RaceOperator;var RaceSubscriber=function(_super){function RaceSubscriber(destination){_super.call(this,destination),this.hasFirst=!1,this.observables=[],this.subscriptions=[]}return __extends(RaceSubscriber,_super),RaceSubscriber.prototype._next=function(observable){this.observables.push(observable)},RaceSubscriber.prototype._complete=function(){var observables=this.observables,len=observables.length;if(0===len)this.destination.complete();else{for(var i=0;i<len&&!this.hasFirst;i++){var observable=observables[i],subscription=subscribeToResult_1.subscribeToResult(this,observable,observable,i);this.subscriptions&&this.subscriptions.push(subscription),this.add(subscription)}this.observables=null}},RaceSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){if(!this.hasFirst){this.hasFirst=!0;for(var i=0;i<this.subscriptions.length;i++)if(i!==outerIndex){var subscription=this.subscriptions[i];subscription.unsubscribe(),this.remove(subscription)}this.subscriptions=null}this.destination.next(innerValue)},RaceSubscriber}(OuterSubscriber_1.OuterSubscriber);exports.RaceSubscriber=RaceSubscriber},function(module,exports,__webpack_require__){"use strict";function timeInterval(scheduler){return void 0===scheduler&&(scheduler=async_1.async),this.lift(new TimeIntervalOperator(scheduler))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),async_1=__webpack_require__(10);exports.timeInterval=timeInterval;var TimeInterval=function(){function TimeInterval(value,interval){this.value=value,this.interval=interval}return TimeInterval}();exports.TimeInterval=TimeInterval;var TimeIntervalOperator=function(){function TimeIntervalOperator(scheduler){this.scheduler=scheduler}return TimeIntervalOperator.prototype.call=function(observer,source){return source.subscribe(new TimeIntervalSubscriber(observer,this.scheduler))},TimeIntervalOperator}(),TimeIntervalSubscriber=function(_super){function TimeIntervalSubscriber(destination,scheduler){_super.call(this,destination),this.scheduler=scheduler,this.lastTime=0,this.lastTime=scheduler.now()}return __extends(TimeIntervalSubscriber,_super),TimeIntervalSubscriber.prototype._next=function(value){var now=this.scheduler.now(),span=now-this.lastTime;this.lastTime=now,this.destination.next(new TimeInterval(value,span))},TimeIntervalSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function timestamp(scheduler){return void 0===scheduler&&(scheduler=async_1.async),this.lift(new TimestampOperator(scheduler))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),async_1=__webpack_require__(10);exports.timestamp=timestamp;var Timestamp=function(){function Timestamp(value,timestamp){this.value=value,this.timestamp=timestamp}return Timestamp}();exports.Timestamp=Timestamp;var TimestampOperator=function(){function TimestampOperator(scheduler){this.scheduler=scheduler}return TimestampOperator.prototype.call=function(observer,source){return source.subscribe(new TimestampSubscriber(observer,this.scheduler))},TimestampOperator}(),TimestampSubscriber=function(_super){function TimestampSubscriber(destination,scheduler){_super.call(this,destination),this.scheduler=scheduler}return __extends(TimestampSubscriber,_super),TimestampSubscriber.prototype._next=function(value){var now=this.scheduler.now();this.destination.next(new Timestamp(value,now))},TimestampSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},AsyncAction_1=__webpack_require__(23),AsyncScheduler_1=__webpack_require__(24),VirtualTimeScheduler=function(_super){function VirtualTimeScheduler(SchedulerAction,maxFrames){var _this=this;void 0===SchedulerAction&&(SchedulerAction=VirtualAction),void 0===maxFrames&&(maxFrames=Number.POSITIVE_INFINITY),_super.call(this,SchedulerAction,function(){return _this.frame}),this.maxFrames=maxFrames,this.frame=0,this.index=-1}return __extends(VirtualTimeScheduler,_super),VirtualTimeScheduler.prototype.flush=function(){for(var error,action,_a=this,actions=_a.actions,maxFrames=_a.maxFrames;(action=actions.shift())&&(this.frame=action.delay)<=maxFrames&&!(error=action.execute(action.state,action.delay)););if(error){for(;action=actions.shift();)action.unsubscribe();throw error}},VirtualTimeScheduler.frameTimeFactor=10,VirtualTimeScheduler}(AsyncScheduler_1.AsyncScheduler);exports.VirtualTimeScheduler=VirtualTimeScheduler;var VirtualAction=function(_super){function VirtualAction(scheduler,work,index){void 0===index&&(index=scheduler.index+=1),_super.call(this,scheduler,work),this.scheduler=scheduler,this.work=work,this.index=index,this.index=scheduler.index=index}return __extends(VirtualAction,_super),VirtualAction.prototype.schedule=function(state,delay){if(void 0===delay&&(delay=0),!this.id)return _super.prototype.schedule.call(this,state,delay);var action=new VirtualAction(this.scheduler,this.work);return this.add(action),action.schedule(state,delay)},VirtualAction.prototype.requestAsyncId=function(scheduler,id,delay){void 0===delay&&(delay=0),this.delay=scheduler.frame+delay;var actions=scheduler.actions;return actions.push(this),actions.sort(VirtualAction.sortActions),!0},VirtualAction.prototype.recycleAsyncId=function(scheduler,id,delay){void 0===delay&&(delay=0)},VirtualAction.sortActions=function(a,b){return a.delay===b.delay?a.index===b.index?0:a.index>b.index?1:-1:a.delay>b.delay?1:-1},VirtualAction}(AsyncAction_1.AsyncAction);exports.VirtualAction=VirtualAction},function(module,exports,__webpack_require__){"use strict";var AsapAction_1=__webpack_require__(408),AsapScheduler_1=__webpack_require__(409);exports.asap=new AsapScheduler_1.AsapScheduler(AsapAction_1.AsapAction)},function(module,exports,__webpack_require__){"use strict";var QueueAction_1=__webpack_require__(410),QueueScheduler_1=__webpack_require__(411);exports.queue=new QueueScheduler_1.QueueScheduler(QueueAction_1.QueueAction)},function(module,exports){"use strict";var SubscriptionLog=function(){function SubscriptionLog(subscribedFrame,unsubscribedFrame){void 0===unsubscribedFrame&&(unsubscribedFrame=Number.POSITIVE_INFINITY),this.subscribedFrame=subscribedFrame,this.unsubscribedFrame=unsubscribedFrame}return SubscriptionLog}();exports.SubscriptionLog=SubscriptionLog},function(module,exports,__webpack_require__){"use strict";var SubscriptionLog_1=__webpack_require__(90),SubscriptionLoggable=function(){function SubscriptionLoggable(){this.subscriptions=[]}return SubscriptionLoggable.prototype.logSubscribedFrame=function(){return this.subscriptions.push(new SubscriptionLog_1.SubscriptionLog(this.scheduler.now())),this.subscriptions.length-1},SubscriptionLoggable.prototype.logUnsubscribedFrame=function(index){var subscriptionLogs=this.subscriptions,oldSubscriptionLog=subscriptionLogs[index];subscriptionLogs[index]=new SubscriptionLog_1.SubscriptionLog(oldSubscriptionLog.subscribedFrame,this.scheduler.now())},SubscriptionLoggable}();exports.SubscriptionLoggable=SubscriptionLoggable},function(module,exports){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},TimeoutError=function(_super){function TimeoutError(){var err=_super.call(this,"Timeout has occurred");this.name=err.name="TimeoutError",this.stack=err.stack,this.message=err.message}return __extends(TimeoutError,_super),TimeoutError}(Error);exports.TimeoutError=TimeoutError},function(module,exports){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},UnsubscriptionError=function(_super){function UnsubscriptionError(errors){_super.call(this),this.errors=errors;var err=Error.call(this,errors?errors.length+" errors occurred during unsubscription:\n  "+errors.map(function(err,i){return i+1+") "+err.toString()}).join("\n  "):"");this.name=err.name="UnsubscriptionError",this.stack=err.stack,this.message=err.message}return __extends(UnsubscriptionError,_super),UnsubscriptionError}(Error);exports.UnsubscriptionError=UnsubscriptionError},function(module,exports){"use strict";function applyMixins(derivedCtor,baseCtors){for(var i=0,len=baseCtors.length;i<len;i++)for(var baseCtor=baseCtors[i],propertyKeys=Object.getOwnPropertyNames(baseCtor.prototype),j=0,len2=propertyKeys.length;j<len2;j++){var name_1=propertyKeys[j];derivedCtor.prototype[name_1]=baseCtor.prototype[name_1]}}exports.applyMixins=applyMixins},function(module,exports){"use strict";exports.isArrayLike=function(x){return x&&"number"==typeof x.length}},function(module,exports){"use strict";function isObject(x){return null!=x&&"object"==typeof x}exports.isObject=isObject},function(module,exports){"use strict";function isPromise(value){return value&&"function"!=typeof value.subscribe&&"function"==typeof value.then}exports.isPromise=isPromise},function(module,exports){"use strict";function noop(){}exports.noop=noop},function(module,exports,__webpack_require__){function Manager(uri,opts){return this instanceof Manager?(uri&&"object"==typeof uri&&(opts=uri,uri=void 0),opts=opts||{},opts.path=opts.path||"/socket.io",this.nsps={},this.subs=[],this.opts=opts,this.reconnection(opts.reconnection!==!1),this.reconnectionAttempts(opts.reconnectionAttempts||1/0),this.reconnectionDelay(opts.reconnectionDelay||1e3),this.reconnectionDelayMax(opts.reconnectionDelayMax||5e3),this.randomizationFactor(opts.randomizationFactor||.5),this.backoff=new Backoff({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()}),this.timeout(null==opts.timeout?2e4:opts.timeout),this.readyState="closed",this.uri=uri,this.connecting=[],this.lastPing=null,this.encoding=!1,this.packetBuffer=[],this.encoder=new parser.Encoder,this.decoder=new parser.Decoder,this.autoConnect=opts.autoConnect!==!1,void(this.autoConnect&&this.open())):new Manager(uri,opts)}var eio=__webpack_require__(429),Socket=__webpack_require__(101),Emitter=__webpack_require__(26),parser=__webpack_require__(61),on=__webpack_require__(100),bind=__webpack_require__(102),debug=__webpack_require__(18)("socket.io-client:manager"),indexOf=__webpack_require__(107),Backoff=__webpack_require__(426),has=Object.prototype.hasOwnProperty;module.exports=Manager,Manager.prototype.emitAll=function(){this.emit.apply(this,arguments);for(var nsp in this.nsps)has.call(this.nsps,nsp)&&this.nsps[nsp].emit.apply(this.nsps[nsp],arguments)},Manager.prototype.updateSocketIds=function(){for(var nsp in this.nsps)has.call(this.nsps,nsp)&&(this.nsps[nsp].id=this.engine.id)},Emitter(Manager.prototype),Manager.prototype.reconnection=function(v){return arguments.length?(this._reconnection=!!v,this):this._reconnection},Manager.prototype.reconnectionAttempts=function(v){return arguments.length?(this._reconnectionAttempts=v,this):this._reconnectionAttempts},Manager.prototype.reconnectionDelay=function(v){return arguments.length?(this._reconnectionDelay=v,this.backoff&&this.backoff.setMin(v),this):this._reconnectionDelay},Manager.prototype.randomizationFactor=function(v){return arguments.length?(this._randomizationFactor=v,this.backoff&&this.backoff.setJitter(v),this):this._randomizationFactor},Manager.prototype.reconnectionDelayMax=function(v){return arguments.length?(this._reconnectionDelayMax=v,this.backoff&&this.backoff.setMax(v),this):this._reconnectionDelayMax},Manager.prototype.timeout=function(v){return arguments.length?(this._timeout=v,this):this._timeout},Manager.prototype.maybeReconnectOnOpen=function(){!this.reconnecting&&this._reconnection&&0===this.backoff.attempts&&this.reconnect()},Manager.prototype.open=Manager.prototype.connect=function(fn,opts){if(debug("readyState %s",this.readyState),~this.readyState.indexOf("open"))return this;debug("opening %s",this.uri),this.engine=eio(this.uri,this.opts);var socket=this.engine,self=this;this.readyState="opening",this.skipReconnect=!1;var openSub=on(socket,"open",function(){self.onopen(),fn&&fn()}),errorSub=on(socket,"error",function(data){if(debug("connect_error"),self.cleanup(),self.readyState="closed",self.emitAll("connect_error",data),fn){var err=new Error("Connection error");err.data=data,fn(err)}else self.maybeReconnectOnOpen()});if(!1!==this._timeout){var timeout=this._timeout;debug("connect attempt will timeout after %d",timeout);var timer=setTimeout(function(){debug("connect attempt timed out after %d",timeout),openSub.destroy(),socket.close(),socket.emit("error","timeout"),self.emitAll("connect_timeout",timeout)},timeout);this.subs.push({destroy:function(){clearTimeout(timer)}})}return this.subs.push(openSub),this.subs.push(errorSub),this},Manager.prototype.onopen=function(){debug("open"),this.cleanup(),this.readyState="open",this.emit("open");var socket=this.engine;this.subs.push(on(socket,"data",bind(this,"ondata"))),this.subs.push(on(socket,"ping",bind(this,"onping"))),this.subs.push(on(socket,"pong",bind(this,"onpong"))),this.subs.push(on(socket,"error",bind(this,"onerror"))),this.subs.push(on(socket,"close",bind(this,"onclose"))),this.subs.push(on(this.decoder,"decoded",bind(this,"ondecoded")))},Manager.prototype.onping=function(){this.lastPing=new Date,this.emitAll("ping")},Manager.prototype.onpong=function(){this.emitAll("pong",new Date-this.lastPing)},Manager.prototype.ondata=function(data){this.decoder.add(data)},Manager.prototype.ondecoded=function(packet){this.emit("packet",packet)},Manager.prototype.onerror=function(err){debug("error",err),this.emitAll("error",err)},Manager.prototype.socket=function(nsp,opts){function onConnecting(){~indexOf(self.connecting,socket)||self.connecting.push(socket)}var socket=this.nsps[nsp];if(!socket){socket=new Socket(this,nsp,opts),this.nsps[nsp]=socket;var self=this;socket.on("connecting",onConnecting),socket.on("connect",function(){socket.id=self.engine.id}),this.autoConnect&&onConnecting()}return socket},Manager.prototype.destroy=function(socket){var index=indexOf(this.connecting,socket);~index&&this.connecting.splice(index,1),this.connecting.length||this.close()},Manager.prototype.packet=function(packet){debug("writing packet %j",packet);var self=this;packet.query&&0===packet.type&&(packet.nsp+="?"+packet.query),self.encoding?self.packetBuffer.push(packet):(self.encoding=!0,this.encoder.encode(packet,function(encodedPackets){for(var i=0;i<encodedPackets.length;i++)self.engine.write(encodedPackets[i],packet.options);self.encoding=!1,self.processPacketQueue()}))},Manager.prototype.processPacketQueue=function(){if(this.packetBuffer.length>0&&!this.encoding){var pack=this.packetBuffer.shift();this.packet(pack)}},Manager.prototype.cleanup=function(){debug("cleanup");for(var subsLength=this.subs.length,i=0;i<subsLength;i++){var sub=this.subs.shift();sub.destroy()}this.packetBuffer=[],this.encoding=!1,this.lastPing=null,this.decoder.destroy()},Manager.prototype.close=Manager.prototype.disconnect=function(){debug("disconnect"),this.skipReconnect=!0,this.reconnecting=!1,"opening"===this.readyState&&this.cleanup(),this.backoff.reset(),this.readyState="closed",this.engine&&this.engine.close()},Manager.prototype.onclose=function(reason){debug("onclose"),this.cleanup(),this.backoff.reset(),this.readyState="closed",this.emit("close",reason),this._reconnection&&!this.skipReconnect&&this.reconnect()},Manager.prototype.reconnect=function(){if(this.reconnecting||this.skipReconnect)return this;var self=this;if(this.backoff.attempts>=this._reconnectionAttempts)debug("reconnect failed"),this.backoff.reset(),this.emitAll("reconnect_failed"),this.reconnecting=!1;else{var delay=this.backoff.duration();debug("will wait %dms before reconnect attempt",delay),this.reconnecting=!0;var timer=setTimeout(function(){self.skipReconnect||(debug("attempting reconnect"),self.emitAll("reconnect_attempt",self.backoff.attempts),self.emitAll("reconnecting",self.backoff.attempts),self.skipReconnect||self.open(function(err){err?(debug("reconnect attempt error"),self.reconnecting=!1,self.reconnect(),self.emitAll("reconnect_error",err.data)):(debug("reconnect success"),self.onreconnect())}))},delay);this.subs.push({destroy:function(){clearTimeout(timer)}})}},Manager.prototype.onreconnect=function(){var attempt=this.backoff.attempts;this.reconnecting=!1,this.backoff.reset(),this.updateSocketIds(),this.emitAll("reconnect",attempt)}},function(module,exports){function on(obj,ev,fn){return obj.on(ev,fn),{destroy:function(){obj.removeListener(ev,fn)}}}module.exports=on},function(module,exports,__webpack_require__){function Socket(io,nsp,opts){this.io=io,this.nsp=nsp,this.json=this,this.ids=0,this.acks={},this.receiveBuffer=[],this.sendBuffer=[],this.connected=!1,this.disconnected=!0,opts&&opts.query&&(this.query=opts.query),this.io.autoConnect&&this.open()}var parser=__webpack_require__(61),Emitter=__webpack_require__(26),toArray=__webpack_require__(451),on=__webpack_require__(100),bind=__webpack_require__(102),debug=__webpack_require__(18)("socket.io-client:socket"),hasBin=__webpack_require__(106);module.exports=exports=Socket;var events={connect:1,connect_error:1,connect_timeout:1,connecting:1,disconnect:1,error:1,reconnect:1,reconnect_attempt:1,reconnect_failed:1,reconnect_error:1,reconnecting:1,ping:1,pong:1},emit=Emitter.prototype.emit;Emitter(Socket.prototype),Socket.prototype.subEvents=function(){if(!this.subs){var io=this.io;this.subs=[on(io,"open",bind(this,"onopen")),on(io,"packet",bind(this,"onpacket")),on(io,"close",bind(this,"onclose"))]}},Socket.prototype.open=Socket.prototype.connect=function(){return this.connected?this:(this.subEvents(),this.io.open(),"open"===this.io.readyState&&this.onopen(),this.emit("connecting"),this)},Socket.prototype.send=function(){var args=toArray(arguments);return args.unshift("message"),this.emit.apply(this,args),this},Socket.prototype.emit=function(ev){if(events.hasOwnProperty(ev))return emit.apply(this,arguments),this;var args=toArray(arguments),parserType=parser.EVENT;hasBin(args)&&(parserType=parser.BINARY_EVENT);var packet={type:parserType,data:args};return packet.options={},packet.options.compress=!this.flags||!1!==this.flags.compress,"function"==typeof args[args.length-1]&&(debug("emitting packet with ack id %d",this.ids),this.acks[this.ids]=args.pop(),packet.id=this.ids++),this.connected?this.packet(packet):this.sendBuffer.push(packet),delete this.flags,this},Socket.prototype.packet=function(packet){packet.nsp=this.nsp,this.io.packet(packet)},Socket.prototype.onopen=function(){debug("transport is open - connecting"),"/"!==this.nsp&&(this.query?this.packet({type:parser.CONNECT,query:this.query}):this.packet({type:parser.CONNECT}))},Socket.prototype.onclose=function(reason){debug("close (%s)",reason),this.connected=!1,this.disconnected=!0,delete this.id,this.emit("disconnect",reason)},Socket.prototype.onpacket=function(packet){if(packet.nsp===this.nsp)switch(packet.type){case parser.CONNECT:this.onconnect();break;case parser.EVENT:this.onevent(packet);break;case parser.BINARY_EVENT:this.onevent(packet);break;case parser.ACK:this.onack(packet);break;case parser.BINARY_ACK:this.onack(packet);break;case parser.DISCONNECT:this.ondisconnect();break;case parser.ERROR:this.emit("error",packet.data)}},Socket.prototype.onevent=function(packet){var args=packet.data||[];debug("emitting event %j",args),null!=packet.id&&(debug("attaching ack callback to event"),args.push(this.ack(packet.id))),this.connected?emit.apply(this,args):this.receiveBuffer.push(args)},Socket.prototype.ack=function(id){var self=this,sent=!1;return function(){if(!sent){sent=!0;var args=toArray(arguments);debug("sending ack %j",args);var type=hasBin(args)?parser.BINARY_ACK:parser.ACK;self.packet({type:type,id:id,data:args})}}},Socket.prototype.onack=function(packet){var ack=this.acks[packet.id];"function"==typeof ack?(debug("calling ack %s with %j",packet.id,packet.data),ack.apply(this,packet.data),delete this.acks[packet.id]):debug("bad ack %s",packet.id)},Socket.prototype.onconnect=function(){this.connected=!0,this.disconnected=!1,this.emit("connect"),this.emitBuffered()},Socket.prototype.emitBuffered=function(){var i;for(i=0;i<this.receiveBuffer.length;i++)emit.apply(this,this.receiveBuffer[i]);for(this.receiveBuffer=[],i=0;i<this.sendBuffer.length;i++)this.packet(this.sendBuffer[i]);this.sendBuffer=[]},Socket.prototype.ondisconnect=function(){debug("server disconnect (%s)",this.nsp),this.destroy(),this.onclose("io server disconnect")},Socket.prototype.destroy=function(){if(this.subs){for(var i=0;i<this.subs.length;i++)this.subs[i].destroy();this.subs=null}this.io.destroy(this)},Socket.prototype.close=Socket.prototype.disconnect=function(){return this.connected&&(debug("performing disconnect (%s)",this.nsp),this.packet({type:parser.DISCONNECT})),this.destroy(),this.connected&&this.onclose("io client disconnect"),this},Socket.prototype.compress=function(compress){return this.flags=this.flags||{},this.flags.compress=compress,this}},function(module,exports){var slice=[].slice;module.exports=function(obj,fn){if("string"==typeof fn&&(fn=obj[fn]),"function"!=typeof fn)throw new Error("bind() requires a function");var args=slice.call(arguments,2);return function(){return fn.apply(obj,args.concat(slice.call(arguments)))}}},function(module,exports,__webpack_require__){(function(global){function polling(opts){var xhr,xd=!1,xs=!1,jsonp=!1!==opts.jsonp;if(global.location){var isSSL="https:"===location.protocol,port=location.port;port||(port=isSSL?443:80),xd=opts.hostname!==location.hostname||port!==opts.port,xs=opts.secure!==isSSL}if(opts.xdomain=xd,opts.xscheme=xs,xhr=new XMLHttpRequest(opts),"open"in xhr&&!opts.forceJSONP)return new XHR(opts);if(!jsonp)throw new Error("JSONP disabled");return new JSONP(opts)}var XMLHttpRequest=__webpack_require__(59),XHR=__webpack_require__(433),JSONP=__webpack_require__(432),websocket=__webpack_require__(434);exports.polling=polling,exports.websocket=websocket}).call(exports,__webpack_require__(4))},function(module,exports,__webpack_require__){function Polling(opts){var forceBase64=opts&&opts.forceBase64;hasXHR2&&!forceBase64||(this.supportsBinary=!1),Transport.call(this,opts)}var Transport=__webpack_require__(58),parseqs=__webpack_require__(60),parser=__webpack_require__(21),inherit=__webpack_require__(40),yeast=__webpack_require__(105),debug=__webpack_require__(18)("engine.io-client:polling");module.exports=Polling;var hasXHR2=function(){var XMLHttpRequest=__webpack_require__(59),xhr=new XMLHttpRequest({xdomain:!1});return null!=xhr.responseType}();inherit(Polling,Transport),Polling.prototype.name="polling",Polling.prototype.doOpen=function(){this.poll()},Polling.prototype.pause=function(onPause){function pause(){debug("paused"),self.readyState="paused",onPause()}var self=this;if(this.readyState="pausing",this.polling||!this.writable){var total=0;this.polling&&(debug("we are currently polling - waiting to pause"),total++,this.once("pollComplete",function(){debug("pre-pause polling complete"),--total||pause()})),this.writable||(debug("we are currently writing - waiting to pause"),total++,this.once("drain",function(){
debug("pre-pause writing complete"),--total||pause()}))}else pause()},Polling.prototype.poll=function(){debug("polling"),this.polling=!0,this.doPoll(),this.emit("poll")},Polling.prototype.onData=function(data){var self=this;debug("polling got data %s",data);var callback=function(packet,index,total){return"opening"===self.readyState&&self.onOpen(),"close"===packet.type?(self.onClose(),!1):void self.onPacket(packet)};parser.decodePayload(data,this.socket.binaryType,callback),"closed"!==this.readyState&&(this.polling=!1,this.emit("pollComplete"),"open"===this.readyState?this.poll():debug('ignoring poll - transport state "%s"',this.readyState))},Polling.prototype.doClose=function(){function close(){debug("writing close packet"),self.write([{type:"close"}])}var self=this;"open"===this.readyState?(debug("transport open - closing"),close()):(debug("transport not open - deferring close"),this.once("open",close))},Polling.prototype.write=function(packets){var self=this;this.writable=!1;var callbackfn=function(){self.writable=!0,self.emit("drain")};parser.encodePayload(packets,this.supportsBinary,function(data){self.doWrite(data,callbackfn)})},Polling.prototype.uri=function(){var query=this.query||{},schema=this.secure?"https":"http",port="";!1!==this.timestampRequests&&(query[this.timestampParam]=yeast()),this.supportsBinary||query.sid||(query.b64=1),query=parseqs.encode(query),this.port&&("https"===schema&&443!==Number(this.port)||"http"===schema&&80!==Number(this.port))&&(port=":"+this.port),query.length&&(query="?"+query);var ipv6=this.hostname.indexOf(":")!==-1;return schema+"://"+(ipv6?"["+this.hostname+"]":this.hostname)+port+this.path+query}},function(module,exports){"use strict";function encode(num){var encoded="";do encoded=alphabet[num%length]+encoded,num=Math.floor(num/length);while(num>0);return encoded}function decode(str){var decoded=0;for(i=0;i<str.length;i++)decoded=decoded*length+map[str.charAt(i)];return decoded}function yeast(){var now=encode(+new Date);return now!==prev?(seed=0,prev=now):now+"."+encode(seed++)}for(var prev,alphabet="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_".split(""),length=64,map={},seed=0,i=0;i<length;i++)map[alphabet[i]]=i;yeast.encode=encode,yeast.decode=decode,module.exports=yeast},function(module,exports,__webpack_require__){(function(global){function hasBinary(data){function _hasBinary(obj){if(!obj)return!1;if(global.Buffer&&global.Buffer.isBuffer&&global.Buffer.isBuffer(obj)||global.ArrayBuffer&&obj instanceof ArrayBuffer||global.Blob&&obj instanceof Blob||global.File&&obj instanceof File)return!0;if(isArray(obj)){for(var i=0;i<obj.length;i++)if(_hasBinary(obj[i]))return!0}else if(obj&&"object"==typeof obj){obj.toJSON&&"function"==typeof obj.toJSON&&(obj=obj.toJSON());for(var key in obj)if(Object.prototype.hasOwnProperty.call(obj,key)&&_hasBinary(obj[key]))return!0}return!1}return _hasBinary(data)}var isArray=__webpack_require__(443);module.exports=hasBinary}).call(exports,__webpack_require__(4))},function(module,exports){var indexOf=[].indexOf;module.exports=function(arr,obj){if(indexOf)return arr.indexOf(obj);for(var i=0;i<arr.length;++i)if(arr[i]===obj)return i;return-1}},function(module,exports){var re=/^(?:(?![^:@]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,parts=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];module.exports=function(str){var src=str,b=str.indexOf("["),e=str.indexOf("]");b!=-1&&e!=-1&&(str=str.substring(0,b)+str.substring(b,e).replace(/:/g,";")+str.substring(e,str.length));for(var m=re.exec(str||""),uri={},i=14;i--;)uri[parts[i]]=m[i]||"";return b!=-1&&e!=-1&&(uri.source=src,uri.host=uri.host.substring(1,uri.host.length-1).replace(/;/g,":"),uri.authority=uri.authority.replace("[","").replace("]","").replace(/;/g,":"),uri.ipv6uri=!0),uri}},function(module,exports,__webpack_require__){(function(global){function isBuf(obj){return global.Buffer&&global.Buffer.isBuffer(obj)||global.ArrayBuffer&&obj instanceof ArrayBuffer}module.exports=isBuf}).call(exports,__webpack_require__(4))},function(module,exports,__webpack_require__){"use strict";function PassThrough(options){return this instanceof PassThrough?void Transform.call(this,options):new PassThrough(options)}module.exports=PassThrough;var Transform=__webpack_require__(63),util=__webpack_require__(27);util.inherits=__webpack_require__(28),util.inherits(PassThrough,Transform),PassThrough.prototype._transform=function(chunk,encoding,cb){cb(null,chunk)}},function(module,exports,__webpack_require__){"use strict";(function(process){function prependListener(emitter,event,fn){return"function"==typeof emitter.prependListener?emitter.prependListener(event,fn):void(emitter._events&&emitter._events[event]?isArray(emitter._events[event])?emitter._events[event].unshift(fn):emitter._events[event]=[fn,emitter._events[event]]:emitter.on(event,fn))}function ReadableState(options,stream){Duplex=Duplex||__webpack_require__(19),options=options||{},this.objectMode=!!options.objectMode,stream instanceof Duplex&&(this.objectMode=this.objectMode||!!options.readableObjectMode);var hwm=options.highWaterMark,defaultHwm=this.objectMode?16:16384;this.highWaterMark=hwm||0===hwm?hwm:defaultHwm,this.highWaterMark=~~this.highWaterMark,this.buffer=new BufferList,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.defaultEncoding=options.defaultEncoding||"utf8",this.ranOut=!1,this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,options.encoding&&(StringDecoder||(StringDecoder=__webpack_require__(114).StringDecoder),this.decoder=new StringDecoder(options.encoding),this.encoding=options.encoding)}function Readable(options){return Duplex=Duplex||__webpack_require__(19),this instanceof Readable?(this._readableState=new ReadableState(options,this),this.readable=!0,options&&"function"==typeof options.read&&(this._read=options.read),void Stream.call(this)):new Readable(options)}function readableAddChunk(stream,state,chunk,encoding,addToFront){var er=chunkInvalid(state,chunk);if(er)stream.emit("error",er);else if(null===chunk)state.reading=!1,onEofChunk(stream,state);else if(state.objectMode||chunk&&chunk.length>0)if(state.ended&&!addToFront){var e=new Error("stream.push() after EOF");stream.emit("error",e)}else if(state.endEmitted&&addToFront){var _e=new Error("stream.unshift() after end event");stream.emit("error",_e)}else{var skipAdd;!state.decoder||addToFront||encoding||(chunk=state.decoder.write(chunk),skipAdd=!state.objectMode&&0===chunk.length),addToFront||(state.reading=!1),skipAdd||(state.flowing&&0===state.length&&!state.sync?(stream.emit("data",chunk),stream.read(0)):(state.length+=state.objectMode?1:chunk.length,addToFront?state.buffer.unshift(chunk):state.buffer.push(chunk),state.needReadable&&emitReadable(stream))),maybeReadMore(stream,state)}else addToFront||(state.reading=!1);return needMoreData(state)}function needMoreData(state){return!state.ended&&(state.needReadable||state.length<state.highWaterMark||0===state.length)}function computeNewHighWaterMark(n){return n>=MAX_HWM?n=MAX_HWM:(n--,n|=n>>>1,n|=n>>>2,n|=n>>>4,n|=n>>>8,n|=n>>>16,n++),n}function howMuchToRead(n,state){return n<=0||0===state.length&&state.ended?0:state.objectMode?1:n!==n?state.flowing&&state.length?state.buffer.head.data.length:state.length:(n>state.highWaterMark&&(state.highWaterMark=computeNewHighWaterMark(n)),n<=state.length?n:state.ended?state.length:(state.needReadable=!0,0))}function chunkInvalid(state,chunk){var er=null;return Buffer.isBuffer(chunk)||"string"==typeof chunk||null===chunk||void 0===chunk||state.objectMode||(er=new TypeError("Invalid non-string/buffer chunk")),er}function onEofChunk(stream,state){if(!state.ended){if(state.decoder){var chunk=state.decoder.end();chunk&&chunk.length&&(state.buffer.push(chunk),state.length+=state.objectMode?1:chunk.length)}state.ended=!0,emitReadable(stream)}}function emitReadable(stream){var state=stream._readableState;state.needReadable=!1,state.emittedReadable||(debug("emitReadable",state.flowing),state.emittedReadable=!0,state.sync?processNextTick(emitReadable_,stream):emitReadable_(stream))}function emitReadable_(stream){debug("emit readable"),stream.emit("readable"),flow(stream)}function maybeReadMore(stream,state){state.readingMore||(state.readingMore=!0,processNextTick(maybeReadMore_,stream,state))}function maybeReadMore_(stream,state){for(var len=state.length;!state.reading&&!state.flowing&&!state.ended&&state.length<state.highWaterMark&&(debug("maybeReadMore read 0"),stream.read(0),len!==state.length);)len=state.length;state.readingMore=!1}function pipeOnDrain(src){return function(){var state=src._readableState;debug("pipeOnDrain",state.awaitDrain),state.awaitDrain&&state.awaitDrain--,0===state.awaitDrain&&EElistenerCount(src,"data")&&(state.flowing=!0,flow(src))}}function nReadingNextTick(self){debug("readable nexttick read 0"),self.read(0)}function resume(stream,state){state.resumeScheduled||(state.resumeScheduled=!0,processNextTick(resume_,stream,state))}function resume_(stream,state){state.reading||(debug("resume read 0"),stream.read(0)),state.resumeScheduled=!1,state.awaitDrain=0,stream.emit("resume"),flow(stream),state.flowing&&!state.reading&&stream.read(0)}function flow(stream){var state=stream._readableState;for(debug("flow",state.flowing);state.flowing&&null!==stream.read(););}function fromList(n,state){if(0===state.length)return null;var ret;return state.objectMode?ret=state.buffer.shift():!n||n>=state.length?(ret=state.decoder?state.buffer.join(""):1===state.buffer.length?state.buffer.head.data:state.buffer.concat(state.length),state.buffer.clear()):ret=fromListPartial(n,state.buffer,state.decoder),ret}function fromListPartial(n,list,hasStrings){var ret;return n<list.head.data.length?(ret=list.head.data.slice(0,n),list.head.data=list.head.data.slice(n)):ret=n===list.head.data.length?list.shift():hasStrings?copyFromBufferString(n,list):copyFromBuffer(n,list),ret}function copyFromBufferString(n,list){var p=list.head,c=1,ret=p.data;for(n-=ret.length;p=p.next;){var str=p.data,nb=n>str.length?str.length:n;if(ret+=nb===str.length?str:str.slice(0,n),n-=nb,0===n){nb===str.length?(++c,p.next?list.head=p.next:list.head=list.tail=null):(list.head=p,p.data=str.slice(nb));break}++c}return list.length-=c,ret}function copyFromBuffer(n,list){var ret=bufferShim.allocUnsafe(n),p=list.head,c=1;for(p.data.copy(ret),n-=p.data.length;p=p.next;){var buf=p.data,nb=n>buf.length?buf.length:n;if(buf.copy(ret,ret.length-n,0,nb),n-=nb,0===n){nb===buf.length?(++c,p.next?list.head=p.next:list.head=list.tail=null):(list.head=p,p.data=buf.slice(nb));break}++c}return list.length-=c,ret}function endReadable(stream){var state=stream._readableState;if(state.length>0)throw new Error('"endReadable()" called on non-empty stream');state.endEmitted||(state.ended=!0,processNextTick(endReadableNT,state,stream))}function endReadableNT(state,stream){state.endEmitted||0!==state.length||(state.endEmitted=!0,stream.readable=!1,stream.emit("end"))}function forEach(xs,f){for(var i=0,l=xs.length;i<l;i++)f(xs[i],i)}function indexOf(xs,x){for(var i=0,l=xs.length;i<l;i++)if(xs[i]===x)return i;return-1}module.exports=Readable;var Duplex,processNextTick=__webpack_require__(66),isArray=__webpack_require__(462);Readable.ReadableState=ReadableState;var Stream,EElistenerCount=(__webpack_require__(42).EventEmitter,function(emitter,type){return emitter.listeners(type).length});!function(){try{Stream=__webpack_require__(68)}catch(_){}finally{Stream||(Stream=__webpack_require__(42).EventEmitter)}}();var Buffer=__webpack_require__(12).Buffer,bufferShim=__webpack_require__(65),util=__webpack_require__(27);util.inherits=__webpack_require__(28);var debugUtil=__webpack_require__(477),debug=void 0;debug=debugUtil&&debugUtil.debuglog?debugUtil.debuglog("stream"):function(){};var StringDecoder,BufferList=__webpack_require__(461);util.inherits(Readable,Stream),Readable.prototype.push=function(chunk,encoding){var state=this._readableState;return state.objectMode||"string"!=typeof chunk||(encoding=encoding||state.defaultEncoding,encoding!==state.encoding&&(chunk=bufferShim.from(chunk,encoding),encoding="")),readableAddChunk(this,state,chunk,encoding,!1)},Readable.prototype.unshift=function(chunk){var state=this._readableState;return readableAddChunk(this,state,chunk,"",!0)},Readable.prototype.isPaused=function(){return this._readableState.flowing===!1},Readable.prototype.setEncoding=function(enc){return StringDecoder||(StringDecoder=__webpack_require__(114).StringDecoder),this._readableState.decoder=new StringDecoder(enc),this._readableState.encoding=enc,this};var MAX_HWM=8388608;Readable.prototype.read=function(n){debug("read",n),n=parseInt(n,10);var state=this._readableState,nOrig=n;if(0!==n&&(state.emittedReadable=!1),0===n&&state.needReadable&&(state.length>=state.highWaterMark||state.ended))return debug("read: emitReadable",state.length,state.ended),0===state.length&&state.ended?endReadable(this):emitReadable(this),null;if(n=howMuchToRead(n,state),0===n&&state.ended)return 0===state.length&&endReadable(this),null;var doRead=state.needReadable;debug("need readable",doRead),(0===state.length||state.length-n<state.highWaterMark)&&(doRead=!0,debug("length less than watermark",doRead)),state.ended||state.reading?(doRead=!1,debug("reading or ended",doRead)):doRead&&(debug("do read"),state.reading=!0,state.sync=!0,0===state.length&&(state.needReadable=!0),this._read(state.highWaterMark),state.sync=!1,state.reading||(n=howMuchToRead(nOrig,state)));var ret;return ret=n>0?fromList(n,state):null,null===ret?(state.needReadable=!0,n=0):state.length-=n,0===state.length&&(state.ended||(state.needReadable=!0),nOrig!==n&&state.ended&&endReadable(this)),null!==ret&&this.emit("data",ret),ret},Readable.prototype._read=function(n){this.emit("error",new Error("_read() is not implemented"))},Readable.prototype.pipe=function(dest,pipeOpts){function onunpipe(readable){debug("onunpipe"),readable===src&&cleanup()}function onend(){debug("onend"),dest.end()}function cleanup(){debug("cleanup"),dest.removeListener("close",onclose),dest.removeListener("finish",onfinish),dest.removeListener("drain",ondrain),dest.removeListener("error",onerror),dest.removeListener("unpipe",onunpipe),src.removeListener("end",onend),src.removeListener("end",cleanup),src.removeListener("data",ondata),cleanedUp=!0,!state.awaitDrain||dest._writableState&&!dest._writableState.needDrain||ondrain()}function ondata(chunk){debug("ondata"),increasedAwaitDrain=!1;var ret=dest.write(chunk);!1!==ret||increasedAwaitDrain||((1===state.pipesCount&&state.pipes===dest||state.pipesCount>1&&indexOf(state.pipes,dest)!==-1)&&!cleanedUp&&(debug("false write response, pause",src._readableState.awaitDrain),src._readableState.awaitDrain++,increasedAwaitDrain=!0),src.pause())}function onerror(er){debug("onerror",er),unpipe(),dest.removeListener("error",onerror),0===EElistenerCount(dest,"error")&&dest.emit("error",er)}function onclose(){dest.removeListener("finish",onfinish),unpipe()}function onfinish(){debug("onfinish"),dest.removeListener("close",onclose),unpipe()}function unpipe(){debug("unpipe"),src.unpipe(dest)}var src=this,state=this._readableState;switch(state.pipesCount){case 0:state.pipes=dest;break;case 1:state.pipes=[state.pipes,dest];break;default:state.pipes.push(dest)}state.pipesCount+=1,debug("pipe count=%d opts=%j",state.pipesCount,pipeOpts);var doEnd=(!pipeOpts||pipeOpts.end!==!1)&&dest!==process.stdout&&dest!==process.stderr,endFn=doEnd?onend:cleanup;state.endEmitted?processNextTick(endFn):src.once("end",endFn),dest.on("unpipe",onunpipe);var ondrain=pipeOnDrain(src);dest.on("drain",ondrain);var cleanedUp=!1,increasedAwaitDrain=!1;return src.on("data",ondata),prependListener(dest,"error",onerror),dest.once("close",onclose),dest.once("finish",onfinish),dest.emit("pipe",src),state.flowing||(debug("pipe resume"),src.resume()),dest},Readable.prototype.unpipe=function(dest){var state=this._readableState;if(0===state.pipesCount)return this;if(1===state.pipesCount)return dest&&dest!==state.pipes?this:(dest||(dest=state.pipes),state.pipes=null,state.pipesCount=0,state.flowing=!1,dest&&dest.emit("unpipe",this),this);if(!dest){var dests=state.pipes,len=state.pipesCount;state.pipes=null,state.pipesCount=0,state.flowing=!1;for(var i=0;i<len;i++)dests[i].emit("unpipe",this);return this}var index=indexOf(state.pipes,dest);return index===-1?this:(state.pipes.splice(index,1),state.pipesCount-=1,1===state.pipesCount&&(state.pipes=state.pipes[0]),dest.emit("unpipe",this),this)},Readable.prototype.on=function(ev,fn){var res=Stream.prototype.on.call(this,ev,fn);if("data"===ev)this._readableState.flowing!==!1&&this.resume();else if("readable"===ev){var state=this._readableState;state.endEmitted||state.readableListening||(state.readableListening=state.needReadable=!0,state.emittedReadable=!1,state.reading?state.length&&emitReadable(this,state):processNextTick(nReadingNextTick,this))}return res},Readable.prototype.addListener=Readable.prototype.on,Readable.prototype.resume=function(){var state=this._readableState;return state.flowing||(debug("resume"),state.flowing=!0,resume(this,state)),this},Readable.prototype.pause=function(){return debug("call pause flowing=%j",this._readableState.flowing),!1!==this._readableState.flowing&&(debug("pause"),this._readableState.flowing=!1,this.emit("pause")),this},Readable.prototype.wrap=function(stream){var state=this._readableState,paused=!1,self=this;stream.on("end",function(){if(debug("wrapped end"),state.decoder&&!state.ended){var chunk=state.decoder.end();chunk&&chunk.length&&self.push(chunk)}self.push(null)}),stream.on("data",function(chunk){if(debug("wrapped data"),state.decoder&&(chunk=state.decoder.write(chunk)),(!state.objectMode||null!==chunk&&void 0!==chunk)&&(state.objectMode||chunk&&chunk.length)){var ret=self.push(chunk);ret||(paused=!0,stream.pause())}});for(var i in stream)void 0===this[i]&&"function"==typeof stream[i]&&(this[i]=function(method){return function(){return stream[method].apply(stream,arguments)}}(i));var events=["error","close","destroy","pause","resume"];return forEach(events,function(ev){stream.on(ev,self.emit.bind(self,ev))}),self._read=function(n){debug("wrapped _read",n),paused&&(paused=!1,stream.resume())},self},Readable._fromList=fromList}).call(exports,__webpack_require__(16))},function(module,exports,__webpack_require__){(function(global){function getXHR(){if(void 0!==xhr)return xhr;if(global.XMLHttpRequest){xhr=new global.XMLHttpRequest;try{xhr.open("GET",global.XDomainRequest?"/":"https://example.com")}catch(e){xhr=null}}else xhr=null;return xhr}function checkTypeSupport(type){var xhr=getXHR();if(!xhr)return!1;try{return xhr.responseType=type,xhr.responseType===type}catch(e){}return!1}function isFunction(value){return"function"==typeof value}exports.fetch=isFunction(global.fetch)&&isFunction(global.ReadableStream),exports.blobConstructor=!1;try{new Blob([new ArrayBuffer(1)]),exports.blobConstructor=!0}catch(e){}var xhr,haveArrayBuffer="undefined"!=typeof global.ArrayBuffer,haveSlice=haveArrayBuffer&&isFunction(global.ArrayBuffer.prototype.slice);exports.arraybuffer=exports.fetch||haveArrayBuffer&&checkTypeSupport("arraybuffer"),exports.msstream=!exports.fetch&&haveSlice&&checkTypeSupport("ms-stream"),exports.mozchunkedarraybuffer=!exports.fetch&&haveArrayBuffer&&checkTypeSupport("moz-chunked-arraybuffer"),exports.overrideMimeType=exports.fetch||!!getXHR()&&isFunction(getXHR().overrideMimeType),exports.vbArray=isFunction(global.VBArray),xhr=null}).call(exports,__webpack_require__(4))},function(module,exports){"function"==typeof Object.create?module.exports=function(ctor,superCtor){ctor.super_=superCtor,ctor.prototype=Object.create(superCtor.prototype,{constructor:{value:ctor,enumerable:!1,writable:!0,configurable:!0}})}:module.exports=function(ctor,superCtor){ctor.super_=superCtor;var TempCtor=function(){};TempCtor.prototype=superCtor.prototype,ctor.prototype=new TempCtor,ctor.prototype.constructor=ctor}},function(module,exports,__webpack_require__){function assertEncoding(encoding){if(encoding&&!isBufferEncoding(encoding))throw new Error("Unknown encoding: "+encoding)}function passThroughWrite(buffer){return buffer.toString(this.encoding)}function utf16DetectIncompleteChar(buffer){this.charReceived=buffer.length%2,this.charLength=this.charReceived?2:0}function base64DetectIncompleteChar(buffer){this.charReceived=buffer.length%3,this.charLength=this.charReceived?3:0}var Buffer=__webpack_require__(12).Buffer,isBufferEncoding=Buffer.isEncoding||function(encoding){switch(encoding&&encoding.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}},StringDecoder=exports.StringDecoder=function(encoding){switch(this.encoding=(encoding||"utf8").toLowerCase().replace(/[-_]/,""),assertEncoding(encoding),this.encoding){case"utf8":this.surrogateSize=3;break;case"ucs2":case"utf16le":this.surrogateSize=2,this.detectIncompleteChar=utf16DetectIncompleteChar;break;case"base64":this.surrogateSize=3,this.detectIncompleteChar=base64DetectIncompleteChar;break;default:return void(this.write=passThroughWrite)}this.charBuffer=new Buffer(6),this.charReceived=0,this.charLength=0};StringDecoder.prototype.write=function(buffer){for(var charStr="";this.charLength;){var available=buffer.length>=this.charLength-this.charReceived?this.charLength-this.charReceived:buffer.length;if(buffer.copy(this.charBuffer,this.charReceived,0,available),this.charReceived+=available,this.charReceived<this.charLength)return"";buffer=buffer.slice(available,buffer.length),charStr=this.charBuffer.slice(0,this.charLength).toString(this.encoding);var charCode=charStr.charCodeAt(charStr.length-1);if(!(charCode>=55296&&charCode<=56319)){if(this.charReceived=this.charLength=0,0===buffer.length)return charStr;break}this.charLength+=this.surrogateSize,charStr=""}this.detectIncompleteChar(buffer);var end=buffer.length;this.charLength&&(buffer.copy(this.charBuffer,0,buffer.length-this.charReceived,end),end-=this.charReceived),charStr+=buffer.toString(this.encoding,0,end);var end=charStr.length-1,charCode=charStr.charCodeAt(end);if(charCode>=55296&&charCode<=56319){var size=this.surrogateSize;return this.charLength+=size,this.charReceived+=size,this.charBuffer.copy(this.charBuffer,size,0,size),buffer.copy(this.charBuffer,0,0,size),charStr.substring(0,end)}return charStr},StringDecoder.prototype.detectIncompleteChar=function(buffer){for(var i=buffer.length>=3?3:buffer.length;i>0;i--){var c=buffer[buffer.length-i];if(1==i&&c>>5==6){this.charLength=2;break}if(i<=2&&c>>4==14){this.charLength=3;break}if(i<=3&&c>>3==30){this.charLength=4;break}}this.charReceived=i},StringDecoder.prototype.end=function(buffer){var res="";if(buffer&&buffer.length&&(res=this.write(buffer)),this.charReceived){var cr=this.charReceived,buf=this.charBuffer,enc=this.encoding;res+=buf.slice(0,cr).toString(enc)}return res}},function(module,exports,__webpack_require__){__webpack_require__(126),module.exports="ngAnimate"},function(module,exports,__webpack_require__){__webpack_require__(129),module.exports="toastr"},function(module,exports,__webpack_require__){__webpack_require__(130),module.exports="ui.bootstrap"},function(module,exports,__webpack_require__){__webpack_require__(143),__webpack_require__(133),__webpack_require__(134),__webpack_require__(135),__webpack_require__(136),__webpack_require__(137),__webpack_require__(138),__webpack_require__(142),__webpack_require__(139),__webpack_require__(140),__webpack_require__(141),__webpack_require__(132)},function(module,exports,__webpack_require__){/*!
 * Caron dimonio, con occhi di bragia
 * loro accennando, tutte le raccoglie;
 * batte col remo qualunque s’adagia 
 *
 * Charon the demon, with the eyes of glede,
 * Beckoning to them, collects them all together,
 * Beats with his oar whoever lags behind
 *          
 *          Dante - The Divine Comedy (Canto III)
 */
module.exports=__webpack_require__(144)},function(module,exports,__webpack_require__){(function(global,module){var __WEBPACK_AMD_DEFINE_RESULT__;(function(){function addMapEntry(map,pair){return map.set(pair[0],pair[1]),map}function addSetEntry(set,value){return set.add(value),set}function apply(func,thisArg,args){switch(args.length){case 0:return func.call(thisArg);case 1:return func.call(thisArg,args[0]);case 2:return func.call(thisArg,args[0],args[1]);case 3:return func.call(thisArg,args[0],args[1],args[2])}return func.apply(thisArg,args)}function arrayAggregator(array,setter,iteratee,accumulator){for(var index=-1,length=null==array?0:array.length;++index<length;){var value=array[index];setter(accumulator,value,iteratee(value),array)}return accumulator}function arrayEach(array,iteratee){for(var index=-1,length=null==array?0:array.length;++index<length&&iteratee(array[index],index,array)!==!1;);return array}function arrayEachRight(array,iteratee){for(var length=null==array?0:array.length;length--&&iteratee(array[length],length,array)!==!1;);return array}function arrayEvery(array,predicate){for(var index=-1,length=null==array?0:array.length;++index<length;)if(!predicate(array[index],index,array))return!1;return!0}function arrayFilter(array,predicate){for(var index=-1,length=null==array?0:array.length,resIndex=0,result=[];++index<length;){var value=array[index];predicate(value,index,array)&&(result[resIndex++]=value)}return result}function arrayIncludes(array,value){var length=null==array?0:array.length;return!!length&&baseIndexOf(array,value,0)>-1}function arrayIncludesWith(array,value,comparator){for(var index=-1,length=null==array?0:array.length;++index<length;)if(comparator(value,array[index]))return!0;return!1}function arrayMap(array,iteratee){for(var index=-1,length=null==array?0:array.length,result=Array(length);++index<length;)result[index]=iteratee(array[index],index,array);return result}function arrayPush(array,values){for(var index=-1,length=values.length,offset=array.length;++index<length;)array[offset+index]=values[index];return array}function arrayReduce(array,iteratee,accumulator,initAccum){var index=-1,length=null==array?0:array.length;for(initAccum&&length&&(accumulator=array[++index]);++index<length;)accumulator=iteratee(accumulator,array[index],index,array);return accumulator}function arrayReduceRight(array,iteratee,accumulator,initAccum){var length=null==array?0:array.length;for(initAccum&&length&&(accumulator=array[--length]);length--;)accumulator=iteratee(accumulator,array[length],length,array);return accumulator}function arraySome(array,predicate){for(var index=-1,length=null==array?0:array.length;++index<length;)if(predicate(array[index],index,array))return!0;return!1}function asciiToArray(string){return string.split("")}function asciiWords(string){return string.match(reAsciiWord)||[]}function baseFindKey(collection,predicate,eachFunc){var result;return eachFunc(collection,function(value,key,collection){if(predicate(value,key,collection))return result=key,!1}),result}function baseFindIndex(array,predicate,fromIndex,fromRight){for(var length=array.length,index=fromIndex+(fromRight?1:-1);fromRight?index--:++index<length;)if(predicate(array[index],index,array))return index;return-1}function baseIndexOf(array,value,fromIndex){return value===value?strictIndexOf(array,value,fromIndex):baseFindIndex(array,baseIsNaN,fromIndex)}function baseIndexOfWith(array,value,fromIndex,comparator){for(var index=fromIndex-1,length=array.length;++index<length;)if(comparator(array[index],value))return index;return-1}function baseIsNaN(value){return value!==value}function baseMean(array,iteratee){var length=null==array?0:array.length;return length?baseSum(array,iteratee)/length:NAN}function baseProperty(key){return function(object){return null==object?undefined:object[key]}}function basePropertyOf(object){return function(key){return null==object?undefined:object[key]}}function baseReduce(collection,iteratee,accumulator,initAccum,eachFunc){return eachFunc(collection,function(value,index,collection){accumulator=initAccum?(initAccum=!1,value):iteratee(accumulator,value,index,collection)}),accumulator}function baseSortBy(array,comparer){var length=array.length;for(array.sort(comparer);length--;)array[length]=array[length].value;return array}function baseSum(array,iteratee){for(var result,index=-1,length=array.length;++index<length;){var current=iteratee(array[index]);current!==undefined&&(result=result===undefined?current:result+current)}return result}function baseTimes(n,iteratee){for(var index=-1,result=Array(n);++index<n;)result[index]=iteratee(index);return result}function baseToPairs(object,props){return arrayMap(props,function(key){return[key,object[key]]})}function baseUnary(func){return function(value){return func(value)}}function baseValues(object,props){return arrayMap(props,function(key){return object[key]})}function cacheHas(cache,key){return cache.has(key)}function charsStartIndex(strSymbols,chrSymbols){for(var index=-1,length=strSymbols.length;++index<length&&baseIndexOf(chrSymbols,strSymbols[index],0)>-1;);return index}function charsEndIndex(strSymbols,chrSymbols){for(var index=strSymbols.length;index--&&baseIndexOf(chrSymbols,strSymbols[index],0)>-1;);return index}function countHolders(array,placeholder){for(var length=array.length,result=0;length--;)array[length]===placeholder&&++result;return result}function escapeStringChar(chr){return"\\"+stringEscapes[chr]}function getValue(object,key){return null==object?undefined:object[key]}function hasUnicode(string){return reHasUnicode.test(string)}function hasUnicodeWord(string){return reHasUnicodeWord.test(string)}function iteratorToArray(iterator){for(var data,result=[];!(data=iterator.next()).done;)result.push(data.value);return result}function mapToArray(map){var index=-1,result=Array(map.size);return map.forEach(function(value,key){result[++index]=[key,value]}),result}function overArg(func,transform){return function(arg){return func(transform(arg))}}function replaceHolders(array,placeholder){for(var index=-1,length=array.length,resIndex=0,result=[];++index<length;){var value=array[index];value!==placeholder&&value!==PLACEHOLDER||(array[index]=PLACEHOLDER,result[resIndex++]=index)}return result}function setToArray(set){var index=-1,result=Array(set.size);return set.forEach(function(value){result[++index]=value}),result}function setToPairs(set){var index=-1,result=Array(set.size);return set.forEach(function(value){result[++index]=[value,value]}),result}function strictIndexOf(array,value,fromIndex){for(var index=fromIndex-1,length=array.length;++index<length;)if(array[index]===value)return index;return-1}function strictLastIndexOf(array,value,fromIndex){for(var index=fromIndex+1;index--;)if(array[index]===value)return index;return index}function stringSize(string){return hasUnicode(string)?unicodeSize(string):asciiSize(string)}function stringToArray(string){return hasUnicode(string)?unicodeToArray(string):asciiToArray(string)}function unicodeSize(string){for(var result=reUnicode.lastIndex=0;reUnicode.test(string);)++result;return result}function unicodeToArray(string){return string.match(reUnicode)||[]}function unicodeWords(string){return string.match(reUnicodeWord)||[]}var undefined,VERSION="4.17.4",LARGE_ARRAY_SIZE=200,CORE_ERROR_TEXT="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",FUNC_ERROR_TEXT="Expected a function",HASH_UNDEFINED="__lodash_hash_undefined__",MAX_MEMOIZE_SIZE=500,PLACEHOLDER="__lodash_placeholder__",CLONE_DEEP_FLAG=1,CLONE_FLAT_FLAG=2,CLONE_SYMBOLS_FLAG=4,COMPARE_PARTIAL_FLAG=1,COMPARE_UNORDERED_FLAG=2,WRAP_BIND_FLAG=1,WRAP_BIND_KEY_FLAG=2,WRAP_CURRY_BOUND_FLAG=4,WRAP_CURRY_FLAG=8,WRAP_CURRY_RIGHT_FLAG=16,WRAP_PARTIAL_FLAG=32,WRAP_PARTIAL_RIGHT_FLAG=64,WRAP_ARY_FLAG=128,WRAP_REARG_FLAG=256,WRAP_FLIP_FLAG=512,DEFAULT_TRUNC_LENGTH=30,DEFAULT_TRUNC_OMISSION="...",HOT_COUNT=800,HOT_SPAN=16,LAZY_FILTER_FLAG=1,LAZY_MAP_FLAG=2,LAZY_WHILE_FLAG=3,INFINITY=1/0,MAX_SAFE_INTEGER=9007199254740991,MAX_INTEGER=1.7976931348623157e308,NAN=NaN,MAX_ARRAY_LENGTH=4294967295,MAX_ARRAY_INDEX=MAX_ARRAY_LENGTH-1,HALF_MAX_ARRAY_LENGTH=MAX_ARRAY_LENGTH>>>1,wrapFlags=[["ary",WRAP_ARY_FLAG],["bind",WRAP_BIND_FLAG],["bindKey",WRAP_BIND_KEY_FLAG],["curry",WRAP_CURRY_FLAG],["curryRight",WRAP_CURRY_RIGHT_FLAG],["flip",WRAP_FLIP_FLAG],["partial",WRAP_PARTIAL_FLAG],["partialRight",WRAP_PARTIAL_RIGHT_FLAG],["rearg",WRAP_REARG_FLAG]],argsTag="[object Arguments]",arrayTag="[object Array]",asyncTag="[object AsyncFunction]",boolTag="[object Boolean]",dateTag="[object Date]",domExcTag="[object DOMException]",errorTag="[object Error]",funcTag="[object Function]",genTag="[object GeneratorFunction]",mapTag="[object Map]",numberTag="[object Number]",nullTag="[object Null]",objectTag="[object Object]",promiseTag="[object Promise]",proxyTag="[object Proxy]",regexpTag="[object RegExp]",setTag="[object Set]",stringTag="[object String]",symbolTag="[object Symbol]",undefinedTag="[object Undefined]",weakMapTag="[object WeakMap]",weakSetTag="[object WeakSet]",arrayBufferTag="[object ArrayBuffer]",dataViewTag="[object DataView]",float32Tag="[object Float32Array]",float64Tag="[object Float64Array]",int8Tag="[object Int8Array]",int16Tag="[object Int16Array]",int32Tag="[object Int32Array]",uint8Tag="[object Uint8Array]",uint8ClampedTag="[object Uint8ClampedArray]",uint16Tag="[object Uint16Array]",uint32Tag="[object Uint32Array]",reEmptyStringLeading=/\b__p \+= '';/g,reEmptyStringMiddle=/\b(__p \+=) '' \+/g,reEmptyStringTrailing=/(__e\(.*?\)|\b__t\)) \+\n'';/g,reEscapedHtml=/&(?:amp|lt|gt|quot|#39);/g,reUnescapedHtml=/[&<>"']/g,reHasEscapedHtml=RegExp(reEscapedHtml.source),reHasUnescapedHtml=RegExp(reUnescapedHtml.source),reEscape=/<%-([\s\S]+?)%>/g,reEvaluate=/<%([\s\S]+?)%>/g,reInterpolate=/<%=([\s\S]+?)%>/g,reIsDeepProp=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,reIsPlainProp=/^\w*$/,reLeadingDot=/^\./,rePropName=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,reRegExpChar=/[\\^$.*+?()[\]{}|]/g,reHasRegExpChar=RegExp(reRegExpChar.source),reTrim=/^\s+|\s+$/g,reTrimStart=/^\s+/,reTrimEnd=/\s+$/,reWrapComment=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,reWrapDetails=/\{\n\/\* \[wrapped with (.+)\] \*/,reSplitDetails=/,? & /,reAsciiWord=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,reEscapeChar=/\\(\\)?/g,reEsTemplate=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,reFlags=/\w*$/,reIsBadHex=/^[-+]0x[0-9a-f]+$/i,reIsBinary=/^0b[01]+$/i,reIsHostCtor=/^\[object .+?Constructor\]$/,reIsOctal=/^0o[0-7]+$/i,reIsUint=/^(?:0|[1-9]\d*)$/,reLatin=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,reNoMatch=/($^)/,reUnescapedString=/['\n\r\u2028\u2029\\]/g,rsAstralRange="\\ud800-\\udfff",rsComboMarksRange="\\u0300-\\u036f",reComboHalfMarksRange="\\ufe20-\\ufe2f",rsComboSymbolsRange="\\u20d0-\\u20ff",rsComboRange=rsComboMarksRange+reComboHalfMarksRange+rsComboSymbolsRange,rsDingbatRange="\\u2700-\\u27bf",rsLowerRange="a-z\\xdf-\\xf6\\xf8-\\xff",rsMathOpRange="\\xac\\xb1\\xd7\\xf7",rsNonCharRange="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",rsPunctuationRange="\\u2000-\\u206f",rsSpaceRange=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",rsUpperRange="A-Z\\xc0-\\xd6\\xd8-\\xde",rsVarRange="\\ufe0e\\ufe0f",rsBreakRange=rsMathOpRange+rsNonCharRange+rsPunctuationRange+rsSpaceRange,rsApos="['’]",rsAstral="["+rsAstralRange+"]",rsBreak="["+rsBreakRange+"]",rsCombo="["+rsComboRange+"]",rsDigits="\\d+",rsDingbat="["+rsDingbatRange+"]",rsLower="["+rsLowerRange+"]",rsMisc="[^"+rsAstralRange+rsBreakRange+rsDigits+rsDingbatRange+rsLowerRange+rsUpperRange+"]",rsFitz="\\ud83c[\\udffb-\\udfff]",rsModifier="(?:"+rsCombo+"|"+rsFitz+")",rsNonAstral="[^"+rsAstralRange+"]",rsRegional="(?:\\ud83c[\\udde6-\\uddff]){2}",rsSurrPair="[\\ud800-\\udbff][\\udc00-\\udfff]",rsUpper="["+rsUpperRange+"]",rsZWJ="\\u200d",rsMiscLower="(?:"+rsLower+"|"+rsMisc+")",rsMiscUpper="(?:"+rsUpper+"|"+rsMisc+")",rsOptContrLower="(?:"+rsApos+"(?:d|ll|m|re|s|t|ve))?",rsOptContrUpper="(?:"+rsApos+"(?:D|LL|M|RE|S|T|VE))?",reOptMod=rsModifier+"?",rsOptVar="["+rsVarRange+"]?",rsOptJoin="(?:"+rsZWJ+"(?:"+[rsNonAstral,rsRegional,rsSurrPair].join("|")+")"+rsOptVar+reOptMod+")*",rsOrdLower="\\d*(?:(?:1st|2nd|3rd|(?![123])\\dth)\\b)",rsOrdUpper="\\d*(?:(?:1ST|2ND|3RD|(?![123])\\dTH)\\b)",rsSeq=rsOptVar+reOptMod+rsOptJoin,rsEmoji="(?:"+[rsDingbat,rsRegional,rsSurrPair].join("|")+")"+rsSeq,rsSymbol="(?:"+[rsNonAstral+rsCombo+"?",rsCombo,rsRegional,rsSurrPair,rsAstral].join("|")+")",reApos=RegExp(rsApos,"g"),reComboMark=RegExp(rsCombo,"g"),reUnicode=RegExp(rsFitz+"(?="+rsFitz+")|"+rsSymbol+rsSeq,"g"),reUnicodeWord=RegExp([rsUpper+"?"+rsLower+"+"+rsOptContrLower+"(?="+[rsBreak,rsUpper,"$"].join("|")+")",rsMiscUpper+"+"+rsOptContrUpper+"(?="+[rsBreak,rsUpper+rsMiscLower,"$"].join("|")+")",rsUpper+"?"+rsMiscLower+"+"+rsOptContrLower,rsUpper+"+"+rsOptContrUpper,rsOrdUpper,rsOrdLower,rsDigits,rsEmoji].join("|"),"g"),reHasUnicode=RegExp("["+rsZWJ+rsAstralRange+rsComboRange+rsVarRange+"]"),reHasUnicodeWord=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,contextProps=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],templateCounter=-1,typedArrayTags={};typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=typedArrayTags[uint32Tag]=!0,typedArrayTags[argsTag]=typedArrayTags[arrayTag]=typedArrayTags[arrayBufferTag]=typedArrayTags[boolTag]=typedArrayTags[dataViewTag]=typedArrayTags[dateTag]=typedArrayTags[errorTag]=typedArrayTags[funcTag]=typedArrayTags[mapTag]=typedArrayTags[numberTag]=typedArrayTags[objectTag]=typedArrayTags[regexpTag]=typedArrayTags[setTag]=typedArrayTags[stringTag]=typedArrayTags[weakMapTag]=!1;var cloneableTags={};cloneableTags[argsTag]=cloneableTags[arrayTag]=cloneableTags[arrayBufferTag]=cloneableTags[dataViewTag]=cloneableTags[boolTag]=cloneableTags[dateTag]=cloneableTags[float32Tag]=cloneableTags[float64Tag]=cloneableTags[int8Tag]=cloneableTags[int16Tag]=cloneableTags[int32Tag]=cloneableTags[mapTag]=cloneableTags[numberTag]=cloneableTags[objectTag]=cloneableTags[regexpTag]=cloneableTags[setTag]=cloneableTags[stringTag]=cloneableTags[symbolTag]=cloneableTags[uint8Tag]=cloneableTags[uint8ClampedTag]=cloneableTags[uint16Tag]=cloneableTags[uint32Tag]=!0,cloneableTags[errorTag]=cloneableTags[funcTag]=cloneableTags[weakMapTag]=!1;var deburredLetters={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","Ĳ":"IJ","ĳ":"ij","Œ":"Oe","œ":"oe","ŉ":"'n","ſ":"s"},htmlEscapes={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},htmlUnescapes={"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'"},stringEscapes={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},freeParseFloat=parseFloat,freeParseInt=parseInt,freeGlobal="object"==typeof global&&global&&global.Object===Object&&global,freeSelf="object"==typeof self&&self&&self.Object===Object&&self,root=freeGlobal||freeSelf||Function("return this")(),freeExports="object"==typeof exports&&exports&&!exports.nodeType&&exports,freeModule=freeExports&&"object"==typeof module&&module&&!module.nodeType&&module,moduleExports=freeModule&&freeModule.exports===freeExports,freeProcess=moduleExports&&freeGlobal.process,nodeUtil=function(){try{return freeProcess&&freeProcess.binding&&freeProcess.binding("util")}catch(e){}}(),nodeIsArrayBuffer=nodeUtil&&nodeUtil.isArrayBuffer,nodeIsDate=nodeUtil&&nodeUtil.isDate,nodeIsMap=nodeUtil&&nodeUtil.isMap,nodeIsRegExp=nodeUtil&&nodeUtil.isRegExp,nodeIsSet=nodeUtil&&nodeUtil.isSet,nodeIsTypedArray=nodeUtil&&nodeUtil.isTypedArray,asciiSize=baseProperty("length"),deburrLetter=basePropertyOf(deburredLetters),escapeHtmlChar=basePropertyOf(htmlEscapes),unescapeHtmlChar=basePropertyOf(htmlUnescapes),runInContext=function runInContext(context){function lodash(value){if(isObjectLike(value)&&!isArray(value)&&!(value instanceof LazyWrapper)){if(value instanceof LodashWrapper)return value;if(hasOwnProperty.call(value,"__wrapped__"))return wrapperClone(value)}return new LodashWrapper(value)}function baseLodash(){}function LodashWrapper(value,chainAll){this.__wrapped__=value,this.__actions__=[],this.__chain__=!!chainAll,this.__index__=0,this.__values__=undefined}function LazyWrapper(value){this.__wrapped__=value,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=MAX_ARRAY_LENGTH,this.__views__=[]}function lazyClone(){var result=new LazyWrapper(this.__wrapped__);return result.__actions__=copyArray(this.__actions__),result.__dir__=this.__dir__,result.__filtered__=this.__filtered__,result.__iteratees__=copyArray(this.__iteratees__),result.__takeCount__=this.__takeCount__,result.__views__=copyArray(this.__views__),result}function lazyReverse(){if(this.__filtered__){var result=new LazyWrapper(this);result.__dir__=-1,result.__filtered__=!0}else result=this.clone(),result.__dir__*=-1;return result}function lazyValue(){var array=this.__wrapped__.value(),dir=this.__dir__,isArr=isArray(array),isRight=dir<0,arrLength=isArr?array.length:0,view=getView(0,arrLength,this.__views__),start=view.start,end=view.end,length=end-start,index=isRight?end:start-1,iteratees=this.__iteratees__,iterLength=iteratees.length,resIndex=0,takeCount=nativeMin(length,this.__takeCount__);if(!isArr||!isRight&&arrLength==length&&takeCount==length)return baseWrapperValue(array,this.__actions__);var result=[];outer:for(;length--&&resIndex<takeCount;){index+=dir;for(var iterIndex=-1,value=array[index];++iterIndex<iterLength;){var data=iteratees[iterIndex],iteratee=data.iteratee,type=data.type,computed=iteratee(value);if(type==LAZY_MAP_FLAG)value=computed;else if(!computed){if(type==LAZY_FILTER_FLAG)continue outer;break outer}}result[resIndex++]=value}return result}function Hash(entries){var index=-1,length=null==entries?0:entries.length;for(this.clear();++index<length;){var entry=entries[index];this.set(entry[0],entry[1])}}function hashClear(){this.__data__=nativeCreate?nativeCreate(null):{},this.size=0}function hashDelete(key){var result=this.has(key)&&delete this.__data__[key];return this.size-=result?1:0,result}function hashGet(key){var data=this.__data__;if(nativeCreate){var result=data[key];return result===HASH_UNDEFINED?undefined:result}return hasOwnProperty.call(data,key)?data[key]:undefined}function hashHas(key){var data=this.__data__;return nativeCreate?data[key]!==undefined:hasOwnProperty.call(data,key)}function hashSet(key,value){var data=this.__data__;return this.size+=this.has(key)?0:1,data[key]=nativeCreate&&value===undefined?HASH_UNDEFINED:value,this}function ListCache(entries){var index=-1,length=null==entries?0:entries.length;for(this.clear();++index<length;){var entry=entries[index];this.set(entry[0],entry[1])}}function listCacheClear(){this.__data__=[],this.size=0}function listCacheDelete(key){var data=this.__data__,index=assocIndexOf(data,key);if(index<0)return!1;var lastIndex=data.length-1;return index==lastIndex?data.pop():splice.call(data,index,1),--this.size,!0}function listCacheGet(key){var data=this.__data__,index=assocIndexOf(data,key);return index<0?undefined:data[index][1]}function listCacheHas(key){return assocIndexOf(this.__data__,key)>-1}function listCacheSet(key,value){var data=this.__data__,index=assocIndexOf(data,key);return index<0?(++this.size,data.push([key,value])):data[index][1]=value,this}function MapCache(entries){var index=-1,length=null==entries?0:entries.length;for(this.clear();++index<length;){var entry=entries[index];this.set(entry[0],entry[1])}}function mapCacheClear(){this.size=0,this.__data__={hash:new Hash,map:new(Map||ListCache),string:new Hash}}function mapCacheDelete(key){var result=getMapData(this,key)["delete"](key);return this.size-=result?1:0,result}function mapCacheGet(key){return getMapData(this,key).get(key)}function mapCacheHas(key){return getMapData(this,key).has(key)}function mapCacheSet(key,value){var data=getMapData(this,key),size=data.size;return data.set(key,value),this.size+=data.size==size?0:1,this}function SetCache(values){var index=-1,length=null==values?0:values.length;for(this.__data__=new MapCache;++index<length;)this.add(values[index])}function setCacheAdd(value){return this.__data__.set(value,HASH_UNDEFINED),this}function setCacheHas(value){return this.__data__.has(value)}function Stack(entries){var data=this.__data__=new ListCache(entries);this.size=data.size}function stackClear(){this.__data__=new ListCache,this.size=0}function stackDelete(key){var data=this.__data__,result=data["delete"](key);return this.size=data.size,result}function stackGet(key){return this.__data__.get(key)}function stackHas(key){return this.__data__.has(key)}function stackSet(key,value){var data=this.__data__;if(data instanceof ListCache){var pairs=data.__data__;if(!Map||pairs.length<LARGE_ARRAY_SIZE-1)return pairs.push([key,value]),this.size=++data.size,this;data=this.__data__=new MapCache(pairs)}return data.set(key,value),this.size=data.size,this}function arrayLikeKeys(value,inherited){var isArr=isArray(value),isArg=!isArr&&isArguments(value),isBuff=!isArr&&!isArg&&isBuffer(value),isType=!isArr&&!isArg&&!isBuff&&isTypedArray(value),skipIndexes=isArr||isArg||isBuff||isType,result=skipIndexes?baseTimes(value.length,String):[],length=result.length;for(var key in value)!inherited&&!hasOwnProperty.call(value,key)||skipIndexes&&("length"==key||isBuff&&("offset"==key||"parent"==key)||isType&&("buffer"==key||"byteLength"==key||"byteOffset"==key)||isIndex(key,length))||result.push(key);return result}function arraySample(array){var length=array.length;return length?array[baseRandom(0,length-1)]:undefined}function arraySampleSize(array,n){return shuffleSelf(copyArray(array),baseClamp(n,0,array.length))}function arrayShuffle(array){return shuffleSelf(copyArray(array))}function assignMergeValue(object,key,value){(value===undefined||eq(object[key],value))&&(value!==undefined||key in object)||baseAssignValue(object,key,value)}function assignValue(object,key,value){var objValue=object[key];hasOwnProperty.call(object,key)&&eq(objValue,value)&&(value!==undefined||key in object)||baseAssignValue(object,key,value)}function assocIndexOf(array,key){for(var length=array.length;length--;)if(eq(array[length][0],key))return length;return-1}function baseAggregator(collection,setter,iteratee,accumulator){return baseEach(collection,function(value,key,collection){setter(accumulator,value,iteratee(value),collection)}),accumulator}function baseAssign(object,source){return object&&copyObject(source,keys(source),object)}function baseAssignIn(object,source){return object&&copyObject(source,keysIn(source),object)}function baseAssignValue(object,key,value){"__proto__"==key&&defineProperty?defineProperty(object,key,{configurable:!0,enumerable:!0,value:value,writable:!0}):object[key]=value}function baseAt(object,paths){for(var index=-1,length=paths.length,result=Array(length),skip=null==object;++index<length;)result[index]=skip?undefined:get(object,paths[index]);return result}function baseClamp(number,lower,upper){return number===number&&(upper!==undefined&&(number=number<=upper?number:upper),lower!==undefined&&(number=number>=lower?number:lower)),number}function baseClone(value,bitmask,customizer,key,object,stack){var result,isDeep=bitmask&CLONE_DEEP_FLAG,isFlat=bitmask&CLONE_FLAT_FLAG,isFull=bitmask&CLONE_SYMBOLS_FLAG;if(customizer&&(result=object?customizer(value,key,object,stack):customizer(value)),result!==undefined)return result;if(!isObject(value))return value;var isArr=isArray(value);if(isArr){if(result=initCloneArray(value),!isDeep)return copyArray(value,result)}else{var tag=getTag(value),isFunc=tag==funcTag||tag==genTag;if(isBuffer(value))return cloneBuffer(value,isDeep);if(tag==objectTag||tag==argsTag||isFunc&&!object){if(result=isFlat||isFunc?{}:initCloneObject(value),!isDeep)return isFlat?copySymbolsIn(value,baseAssignIn(result,value)):copySymbols(value,baseAssign(result,value))}else{if(!cloneableTags[tag])return object?value:{};result=initCloneByTag(value,tag,baseClone,isDeep)}}stack||(stack=new Stack);var stacked=stack.get(value);if(stacked)return stacked;stack.set(value,result);var keysFunc=isFull?isFlat?getAllKeysIn:getAllKeys:isFlat?keysIn:keys,props=isArr?undefined:keysFunc(value);return arrayEach(props||value,function(subValue,key){props&&(key=subValue,subValue=value[key]),assignValue(result,key,baseClone(subValue,bitmask,customizer,key,value,stack))}),result}function baseConforms(source){var props=keys(source);return function(object){return baseConformsTo(object,source,props)}}function baseConformsTo(object,source,props){var length=props.length;if(null==object)return!length;for(object=Object(object);length--;){var key=props[length],predicate=source[key],value=object[key];if(value===undefined&&!(key in object)||!predicate(value))return!1}return!0}function baseDelay(func,wait,args){if("function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);return setTimeout(function(){func.apply(undefined,args)},wait)}function baseDifference(array,values,iteratee,comparator){var index=-1,includes=arrayIncludes,isCommon=!0,length=array.length,result=[],valuesLength=values.length;if(!length)return result;iteratee&&(values=arrayMap(values,baseUnary(iteratee))),comparator?(includes=arrayIncludesWith,isCommon=!1):values.length>=LARGE_ARRAY_SIZE&&(includes=cacheHas,isCommon=!1,values=new SetCache(values));outer:for(;++index<length;){var value=array[index],computed=null==iteratee?value:iteratee(value);if(value=comparator||0!==value?value:0,isCommon&&computed===computed){for(var valuesIndex=valuesLength;valuesIndex--;)if(values[valuesIndex]===computed)continue outer;result.push(value)}else includes(values,computed,comparator)||result.push(value)}return result}function baseEvery(collection,predicate){var result=!0;return baseEach(collection,function(value,index,collection){return result=!!predicate(value,index,collection)}),result}function baseExtremum(array,iteratee,comparator){for(var index=-1,length=array.length;++index<length;){var value=array[index],current=iteratee(value);if(null!=current&&(computed===undefined?current===current&&!isSymbol(current):comparator(current,computed)))var computed=current,result=value}return result}function baseFill(array,value,start,end){var length=array.length;for(start=toInteger(start),start<0&&(start=-start>length?0:length+start),end=end===undefined||end>length?length:toInteger(end),end<0&&(end+=length),end=start>end?0:toLength(end);start<end;)array[start++]=value;return array}function baseFilter(collection,predicate){var result=[];return baseEach(collection,function(value,index,collection){predicate(value,index,collection)&&result.push(value)}),result}function baseFlatten(array,depth,predicate,isStrict,result){var index=-1,length=array.length;for(predicate||(predicate=isFlattenable),result||(result=[]);++index<length;){var value=array[index];depth>0&&predicate(value)?depth>1?baseFlatten(value,depth-1,predicate,isStrict,result):arrayPush(result,value):isStrict||(result[result.length]=value)}return result}function baseForOwn(object,iteratee){return object&&baseFor(object,iteratee,keys)}function baseForOwnRight(object,iteratee){return object&&baseForRight(object,iteratee,keys)}function baseFunctions(object,props){return arrayFilter(props,function(key){return isFunction(object[key])})}function baseGet(object,path){path=castPath(path,object);for(var index=0,length=path.length;null!=object&&index<length;)object=object[toKey(path[index++])];return index&&index==length?object:undefined}function baseGetAllKeys(object,keysFunc,symbolsFunc){var result=keysFunc(object);return isArray(object)?result:arrayPush(result,symbolsFunc(object))}function baseGetTag(value){return null==value?value===undefined?undefinedTag:nullTag:symToStringTag&&symToStringTag in Object(value)?getRawTag(value):objectToString(value)}function baseGt(value,other){return value>other}function baseHas(object,key){return null!=object&&hasOwnProperty.call(object,key)}function baseHasIn(object,key){return null!=object&&key in Object(object)}function baseInRange(number,start,end){return number>=nativeMin(start,end)&&number<nativeMax(start,end)}function baseIntersection(arrays,iteratee,comparator){for(var includes=comparator?arrayIncludesWith:arrayIncludes,length=arrays[0].length,othLength=arrays.length,othIndex=othLength,caches=Array(othLength),maxLength=1/0,result=[];othIndex--;){var array=arrays[othIndex];othIndex&&iteratee&&(array=arrayMap(array,baseUnary(iteratee))),maxLength=nativeMin(array.length,maxLength),caches[othIndex]=!comparator&&(iteratee||length>=120&&array.length>=120)?new SetCache(othIndex&&array):undefined}array=arrays[0];var index=-1,seen=caches[0];outer:for(;++index<length&&result.length<maxLength;){var value=array[index],computed=iteratee?iteratee(value):value;if(value=comparator||0!==value?value:0,!(seen?cacheHas(seen,computed):includes(result,computed,comparator))){for(othIndex=othLength;--othIndex;){var cache=caches[othIndex];if(!(cache?cacheHas(cache,computed):includes(arrays[othIndex],computed,comparator)))continue outer}seen&&seen.push(computed),result.push(value)}}return result}function baseInverter(object,setter,iteratee,accumulator){return baseForOwn(object,function(value,key,object){setter(accumulator,iteratee(value),key,object)}),accumulator}function baseInvoke(object,path,args){path=castPath(path,object),object=parent(object,path);var func=null==object?object:object[toKey(last(path))];return null==func?undefined:apply(func,object,args)}function baseIsArguments(value){return isObjectLike(value)&&baseGetTag(value)==argsTag}function baseIsArrayBuffer(value){return isObjectLike(value)&&baseGetTag(value)==arrayBufferTag}function baseIsDate(value){return isObjectLike(value)&&baseGetTag(value)==dateTag}function baseIsEqual(value,other,bitmask,customizer,stack){return value===other||(null==value||null==other||!isObjectLike(value)&&!isObjectLike(other)?value!==value&&other!==other:baseIsEqualDeep(value,other,bitmask,customizer,baseIsEqual,stack))}function baseIsEqualDeep(object,other,bitmask,customizer,equalFunc,stack){
var objIsArr=isArray(object),othIsArr=isArray(other),objTag=objIsArr?arrayTag:getTag(object),othTag=othIsArr?arrayTag:getTag(other);objTag=objTag==argsTag?objectTag:objTag,othTag=othTag==argsTag?objectTag:othTag;var objIsObj=objTag==objectTag,othIsObj=othTag==objectTag,isSameTag=objTag==othTag;if(isSameTag&&isBuffer(object)){if(!isBuffer(other))return!1;objIsArr=!0,objIsObj=!1}if(isSameTag&&!objIsObj)return stack||(stack=new Stack),objIsArr||isTypedArray(object)?equalArrays(object,other,bitmask,customizer,equalFunc,stack):equalByTag(object,other,objTag,bitmask,customizer,equalFunc,stack);if(!(bitmask&COMPARE_PARTIAL_FLAG)){var objIsWrapped=objIsObj&&hasOwnProperty.call(object,"__wrapped__"),othIsWrapped=othIsObj&&hasOwnProperty.call(other,"__wrapped__");if(objIsWrapped||othIsWrapped){var objUnwrapped=objIsWrapped?object.value():object,othUnwrapped=othIsWrapped?other.value():other;return stack||(stack=new Stack),equalFunc(objUnwrapped,othUnwrapped,bitmask,customizer,stack)}}return!!isSameTag&&(stack||(stack=new Stack),equalObjects(object,other,bitmask,customizer,equalFunc,stack))}function baseIsMap(value){return isObjectLike(value)&&getTag(value)==mapTag}function baseIsMatch(object,source,matchData,customizer){var index=matchData.length,length=index,noCustomizer=!customizer;if(null==object)return!length;for(object=Object(object);index--;){var data=matchData[index];if(noCustomizer&&data[2]?data[1]!==object[data[0]]:!(data[0]in object))return!1}for(;++index<length;){data=matchData[index];var key=data[0],objValue=object[key],srcValue=data[1];if(noCustomizer&&data[2]){if(objValue===undefined&&!(key in object))return!1}else{var stack=new Stack;if(customizer)var result=customizer(objValue,srcValue,key,object,source,stack);if(!(result===undefined?baseIsEqual(srcValue,objValue,COMPARE_PARTIAL_FLAG|COMPARE_UNORDERED_FLAG,customizer,stack):result))return!1}}return!0}function baseIsNative(value){if(!isObject(value)||isMasked(value))return!1;var pattern=isFunction(value)?reIsNative:reIsHostCtor;return pattern.test(toSource(value))}function baseIsRegExp(value){return isObjectLike(value)&&baseGetTag(value)==regexpTag}function baseIsSet(value){return isObjectLike(value)&&getTag(value)==setTag}function baseIsTypedArray(value){return isObjectLike(value)&&isLength(value.length)&&!!typedArrayTags[baseGetTag(value)]}function baseIteratee(value){return"function"==typeof value?value:null==value?identity:"object"==typeof value?isArray(value)?baseMatchesProperty(value[0],value[1]):baseMatches(value):property(value)}function baseKeys(object){if(!isPrototype(object))return nativeKeys(object);var result=[];for(var key in Object(object))hasOwnProperty.call(object,key)&&"constructor"!=key&&result.push(key);return result}function baseKeysIn(object){if(!isObject(object))return nativeKeysIn(object);var isProto=isPrototype(object),result=[];for(var key in object)("constructor"!=key||!isProto&&hasOwnProperty.call(object,key))&&result.push(key);return result}function baseLt(value,other){return value<other}function baseMap(collection,iteratee){var index=-1,result=isArrayLike(collection)?Array(collection.length):[];return baseEach(collection,function(value,key,collection){result[++index]=iteratee(value,key,collection)}),result}function baseMatches(source){var matchData=getMatchData(source);return 1==matchData.length&&matchData[0][2]?matchesStrictComparable(matchData[0][0],matchData[0][1]):function(object){return object===source||baseIsMatch(object,source,matchData)}}function baseMatchesProperty(path,srcValue){return isKey(path)&&isStrictComparable(srcValue)?matchesStrictComparable(toKey(path),srcValue):function(object){var objValue=get(object,path);return objValue===undefined&&objValue===srcValue?hasIn(object,path):baseIsEqual(srcValue,objValue,COMPARE_PARTIAL_FLAG|COMPARE_UNORDERED_FLAG)}}function baseMerge(object,source,srcIndex,customizer,stack){object!==source&&baseFor(source,function(srcValue,key){if(isObject(srcValue))stack||(stack=new Stack),baseMergeDeep(object,source,key,srcIndex,baseMerge,customizer,stack);else{var newValue=customizer?customizer(object[key],srcValue,key+"",object,source,stack):undefined;newValue===undefined&&(newValue=srcValue),assignMergeValue(object,key,newValue)}},keysIn)}function baseMergeDeep(object,source,key,srcIndex,mergeFunc,customizer,stack){var objValue=object[key],srcValue=source[key],stacked=stack.get(srcValue);if(stacked)return void assignMergeValue(object,key,stacked);var newValue=customizer?customizer(objValue,srcValue,key+"",object,source,stack):undefined,isCommon=newValue===undefined;if(isCommon){var isArr=isArray(srcValue),isBuff=!isArr&&isBuffer(srcValue),isTyped=!isArr&&!isBuff&&isTypedArray(srcValue);newValue=srcValue,isArr||isBuff||isTyped?isArray(objValue)?newValue=objValue:isArrayLikeObject(objValue)?newValue=copyArray(objValue):isBuff?(isCommon=!1,newValue=cloneBuffer(srcValue,!0)):isTyped?(isCommon=!1,newValue=cloneTypedArray(srcValue,!0)):newValue=[]:isPlainObject(srcValue)||isArguments(srcValue)?(newValue=objValue,isArguments(objValue)?newValue=toPlainObject(objValue):(!isObject(objValue)||srcIndex&&isFunction(objValue))&&(newValue=initCloneObject(srcValue))):isCommon=!1}isCommon&&(stack.set(srcValue,newValue),mergeFunc(newValue,srcValue,srcIndex,customizer,stack),stack["delete"](srcValue)),assignMergeValue(object,key,newValue)}function baseNth(array,n){var length=array.length;if(length)return n+=n<0?length:0,isIndex(n,length)?array[n]:undefined}function baseOrderBy(collection,iteratees,orders){var index=-1;iteratees=arrayMap(iteratees.length?iteratees:[identity],baseUnary(getIteratee()));var result=baseMap(collection,function(value,key,collection){var criteria=arrayMap(iteratees,function(iteratee){return iteratee(value)});return{criteria:criteria,index:++index,value:value}});return baseSortBy(result,function(object,other){return compareMultiple(object,other,orders)})}function basePick(object,paths){return basePickBy(object,paths,function(value,path){return hasIn(object,path)})}function basePickBy(object,paths,predicate){for(var index=-1,length=paths.length,result={};++index<length;){var path=paths[index],value=baseGet(object,path);predicate(value,path)&&baseSet(result,castPath(path,object),value)}return result}function basePropertyDeep(path){return function(object){return baseGet(object,path)}}function basePullAll(array,values,iteratee,comparator){var indexOf=comparator?baseIndexOfWith:baseIndexOf,index=-1,length=values.length,seen=array;for(array===values&&(values=copyArray(values)),iteratee&&(seen=arrayMap(array,baseUnary(iteratee)));++index<length;)for(var fromIndex=0,value=values[index],computed=iteratee?iteratee(value):value;(fromIndex=indexOf(seen,computed,fromIndex,comparator))>-1;)seen!==array&&splice.call(seen,fromIndex,1),splice.call(array,fromIndex,1);return array}function basePullAt(array,indexes){for(var length=array?indexes.length:0,lastIndex=length-1;length--;){var index=indexes[length];if(length==lastIndex||index!==previous){var previous=index;isIndex(index)?splice.call(array,index,1):baseUnset(array,index)}}return array}function baseRandom(lower,upper){return lower+nativeFloor(nativeRandom()*(upper-lower+1))}function baseRange(start,end,step,fromRight){for(var index=-1,length=nativeMax(nativeCeil((end-start)/(step||1)),0),result=Array(length);length--;)result[fromRight?length:++index]=start,start+=step;return result}function baseRepeat(string,n){var result="";if(!string||n<1||n>MAX_SAFE_INTEGER)return result;do n%2&&(result+=string),n=nativeFloor(n/2),n&&(string+=string);while(n);return result}function baseRest(func,start){return setToString(overRest(func,start,identity),func+"")}function baseSample(collection){return arraySample(values(collection))}function baseSampleSize(collection,n){var array=values(collection);return shuffleSelf(array,baseClamp(n,0,array.length))}function baseSet(object,path,value,customizer){if(!isObject(object))return object;path=castPath(path,object);for(var index=-1,length=path.length,lastIndex=length-1,nested=object;null!=nested&&++index<length;){var key=toKey(path[index]),newValue=value;if(index!=lastIndex){var objValue=nested[key];newValue=customizer?customizer(objValue,key,nested):undefined,newValue===undefined&&(newValue=isObject(objValue)?objValue:isIndex(path[index+1])?[]:{})}assignValue(nested,key,newValue),nested=nested[key]}return object}function baseShuffle(collection){return shuffleSelf(values(collection))}function baseSlice(array,start,end){var index=-1,length=array.length;start<0&&(start=-start>length?0:length+start),end=end>length?length:end,end<0&&(end+=length),length=start>end?0:end-start>>>0,start>>>=0;for(var result=Array(length);++index<length;)result[index]=array[index+start];return result}function baseSome(collection,predicate){var result;return baseEach(collection,function(value,index,collection){return result=predicate(value,index,collection),!result}),!!result}function baseSortedIndex(array,value,retHighest){var low=0,high=null==array?low:array.length;if("number"==typeof value&&value===value&&high<=HALF_MAX_ARRAY_LENGTH){for(;low<high;){var mid=low+high>>>1,computed=array[mid];null!==computed&&!isSymbol(computed)&&(retHighest?computed<=value:computed<value)?low=mid+1:high=mid}return high}return baseSortedIndexBy(array,value,identity,retHighest)}function baseSortedIndexBy(array,value,iteratee,retHighest){value=iteratee(value);for(var low=0,high=null==array?0:array.length,valIsNaN=value!==value,valIsNull=null===value,valIsSymbol=isSymbol(value),valIsUndefined=value===undefined;low<high;){var mid=nativeFloor((low+high)/2),computed=iteratee(array[mid]),othIsDefined=computed!==undefined,othIsNull=null===computed,othIsReflexive=computed===computed,othIsSymbol=isSymbol(computed);if(valIsNaN)var setLow=retHighest||othIsReflexive;else setLow=valIsUndefined?othIsReflexive&&(retHighest||othIsDefined):valIsNull?othIsReflexive&&othIsDefined&&(retHighest||!othIsNull):valIsSymbol?othIsReflexive&&othIsDefined&&!othIsNull&&(retHighest||!othIsSymbol):!othIsNull&&!othIsSymbol&&(retHighest?computed<=value:computed<value);setLow?low=mid+1:high=mid}return nativeMin(high,MAX_ARRAY_INDEX)}function baseSortedUniq(array,iteratee){for(var index=-1,length=array.length,resIndex=0,result=[];++index<length;){var value=array[index],computed=iteratee?iteratee(value):value;if(!index||!eq(computed,seen)){var seen=computed;result[resIndex++]=0===value?0:value}}return result}function baseToNumber(value){return"number"==typeof value?value:isSymbol(value)?NAN:+value}function baseToString(value){if("string"==typeof value)return value;if(isArray(value))return arrayMap(value,baseToString)+"";if(isSymbol(value))return symbolToString?symbolToString.call(value):"";var result=value+"";return"0"==result&&1/value==-INFINITY?"-0":result}function baseUniq(array,iteratee,comparator){var index=-1,includes=arrayIncludes,length=array.length,isCommon=!0,result=[],seen=result;if(comparator)isCommon=!1,includes=arrayIncludesWith;else if(length>=LARGE_ARRAY_SIZE){var set=iteratee?null:createSet(array);if(set)return setToArray(set);isCommon=!1,includes=cacheHas,seen=new SetCache}else seen=iteratee?[]:result;outer:for(;++index<length;){var value=array[index],computed=iteratee?iteratee(value):value;if(value=comparator||0!==value?value:0,isCommon&&computed===computed){for(var seenIndex=seen.length;seenIndex--;)if(seen[seenIndex]===computed)continue outer;iteratee&&seen.push(computed),result.push(value)}else includes(seen,computed,comparator)||(seen!==result&&seen.push(computed),result.push(value))}return result}function baseUnset(object,path){return path=castPath(path,object),object=parent(object,path),null==object||delete object[toKey(last(path))]}function baseUpdate(object,path,updater,customizer){return baseSet(object,path,updater(baseGet(object,path)),customizer)}function baseWhile(array,predicate,isDrop,fromRight){for(var length=array.length,index=fromRight?length:-1;(fromRight?index--:++index<length)&&predicate(array[index],index,array););return isDrop?baseSlice(array,fromRight?0:index,fromRight?index+1:length):baseSlice(array,fromRight?index+1:0,fromRight?length:index)}function baseWrapperValue(value,actions){var result=value;return result instanceof LazyWrapper&&(result=result.value()),arrayReduce(actions,function(result,action){return action.func.apply(action.thisArg,arrayPush([result],action.args))},result)}function baseXor(arrays,iteratee,comparator){var length=arrays.length;if(length<2)return length?baseUniq(arrays[0]):[];for(var index=-1,result=Array(length);++index<length;)for(var array=arrays[index],othIndex=-1;++othIndex<length;)othIndex!=index&&(result[index]=baseDifference(result[index]||array,arrays[othIndex],iteratee,comparator));return baseUniq(baseFlatten(result,1),iteratee,comparator)}function baseZipObject(props,values,assignFunc){for(var index=-1,length=props.length,valsLength=values.length,result={};++index<length;){var value=index<valsLength?values[index]:undefined;assignFunc(result,props[index],value)}return result}function castArrayLikeObject(value){return isArrayLikeObject(value)?value:[]}function castFunction(value){return"function"==typeof value?value:identity}function castPath(value,object){return isArray(value)?value:isKey(value,object)?[value]:stringToPath(toString(value))}function castSlice(array,start,end){var length=array.length;return end=end===undefined?length:end,!start&&end>=length?array:baseSlice(array,start,end)}function cloneBuffer(buffer,isDeep){if(isDeep)return buffer.slice();var length=buffer.length,result=allocUnsafe?allocUnsafe(length):new buffer.constructor(length);return buffer.copy(result),result}function cloneArrayBuffer(arrayBuffer){var result=new arrayBuffer.constructor(arrayBuffer.byteLength);return new Uint8Array(result).set(new Uint8Array(arrayBuffer)),result}function cloneDataView(dataView,isDeep){var buffer=isDeep?cloneArrayBuffer(dataView.buffer):dataView.buffer;return new dataView.constructor(buffer,dataView.byteOffset,dataView.byteLength)}function cloneMap(map,isDeep,cloneFunc){var array=isDeep?cloneFunc(mapToArray(map),CLONE_DEEP_FLAG):mapToArray(map);return arrayReduce(array,addMapEntry,new map.constructor)}function cloneRegExp(regexp){var result=new regexp.constructor(regexp.source,reFlags.exec(regexp));return result.lastIndex=regexp.lastIndex,result}function cloneSet(set,isDeep,cloneFunc){var array=isDeep?cloneFunc(setToArray(set),CLONE_DEEP_FLAG):setToArray(set);return arrayReduce(array,addSetEntry,new set.constructor)}function cloneSymbol(symbol){return symbolValueOf?Object(symbolValueOf.call(symbol)):{}}function cloneTypedArray(typedArray,isDeep){var buffer=isDeep?cloneArrayBuffer(typedArray.buffer):typedArray.buffer;return new typedArray.constructor(buffer,typedArray.byteOffset,typedArray.length)}function compareAscending(value,other){if(value!==other){var valIsDefined=value!==undefined,valIsNull=null===value,valIsReflexive=value===value,valIsSymbol=isSymbol(value),othIsDefined=other!==undefined,othIsNull=null===other,othIsReflexive=other===other,othIsSymbol=isSymbol(other);if(!othIsNull&&!othIsSymbol&&!valIsSymbol&&value>other||valIsSymbol&&othIsDefined&&othIsReflexive&&!othIsNull&&!othIsSymbol||valIsNull&&othIsDefined&&othIsReflexive||!valIsDefined&&othIsReflexive||!valIsReflexive)return 1;if(!valIsNull&&!valIsSymbol&&!othIsSymbol&&value<other||othIsSymbol&&valIsDefined&&valIsReflexive&&!valIsNull&&!valIsSymbol||othIsNull&&valIsDefined&&valIsReflexive||!othIsDefined&&valIsReflexive||!othIsReflexive)return-1}return 0}function compareMultiple(object,other,orders){for(var index=-1,objCriteria=object.criteria,othCriteria=other.criteria,length=objCriteria.length,ordersLength=orders.length;++index<length;){var result=compareAscending(objCriteria[index],othCriteria[index]);if(result){if(index>=ordersLength)return result;var order=orders[index];return result*("desc"==order?-1:1)}}return object.index-other.index}function composeArgs(args,partials,holders,isCurried){for(var argsIndex=-1,argsLength=args.length,holdersLength=holders.length,leftIndex=-1,leftLength=partials.length,rangeLength=nativeMax(argsLength-holdersLength,0),result=Array(leftLength+rangeLength),isUncurried=!isCurried;++leftIndex<leftLength;)result[leftIndex]=partials[leftIndex];for(;++argsIndex<holdersLength;)(isUncurried||argsIndex<argsLength)&&(result[holders[argsIndex]]=args[argsIndex]);for(;rangeLength--;)result[leftIndex++]=args[argsIndex++];return result}function composeArgsRight(args,partials,holders,isCurried){for(var argsIndex=-1,argsLength=args.length,holdersIndex=-1,holdersLength=holders.length,rightIndex=-1,rightLength=partials.length,rangeLength=nativeMax(argsLength-holdersLength,0),result=Array(rangeLength+rightLength),isUncurried=!isCurried;++argsIndex<rangeLength;)result[argsIndex]=args[argsIndex];for(var offset=argsIndex;++rightIndex<rightLength;)result[offset+rightIndex]=partials[rightIndex];for(;++holdersIndex<holdersLength;)(isUncurried||argsIndex<argsLength)&&(result[offset+holders[holdersIndex]]=args[argsIndex++]);return result}function copyArray(source,array){var index=-1,length=source.length;for(array||(array=Array(length));++index<length;)array[index]=source[index];return array}function copyObject(source,props,object,customizer){var isNew=!object;object||(object={});for(var index=-1,length=props.length;++index<length;){var key=props[index],newValue=customizer?customizer(object[key],source[key],key,object,source):undefined;newValue===undefined&&(newValue=source[key]),isNew?baseAssignValue(object,key,newValue):assignValue(object,key,newValue)}return object}function copySymbols(source,object){return copyObject(source,getSymbols(source),object)}function copySymbolsIn(source,object){return copyObject(source,getSymbolsIn(source),object)}function createAggregator(setter,initializer){return function(collection,iteratee){var func=isArray(collection)?arrayAggregator:baseAggregator,accumulator=initializer?initializer():{};return func(collection,setter,getIteratee(iteratee,2),accumulator)}}function createAssigner(assigner){return baseRest(function(object,sources){var index=-1,length=sources.length,customizer=length>1?sources[length-1]:undefined,guard=length>2?sources[2]:undefined;for(customizer=assigner.length>3&&"function"==typeof customizer?(length--,customizer):undefined,guard&&isIterateeCall(sources[0],sources[1],guard)&&(customizer=length<3?undefined:customizer,length=1),object=Object(object);++index<length;){var source=sources[index];source&&assigner(object,source,index,customizer)}return object})}function createBaseEach(eachFunc,fromRight){return function(collection,iteratee){if(null==collection)return collection;if(!isArrayLike(collection))return eachFunc(collection,iteratee);for(var length=collection.length,index=fromRight?length:-1,iterable=Object(collection);(fromRight?index--:++index<length)&&iteratee(iterable[index],index,iterable)!==!1;);return collection}}function createBaseFor(fromRight){return function(object,iteratee,keysFunc){for(var index=-1,iterable=Object(object),props=keysFunc(object),length=props.length;length--;){var key=props[fromRight?length:++index];if(iteratee(iterable[key],key,iterable)===!1)break}return object}}function createBind(func,bitmask,thisArg){function wrapper(){var fn=this&&this!==root&&this instanceof wrapper?Ctor:func;return fn.apply(isBind?thisArg:this,arguments)}var isBind=bitmask&WRAP_BIND_FLAG,Ctor=createCtor(func);return wrapper}function createCaseFirst(methodName){return function(string){string=toString(string);var strSymbols=hasUnicode(string)?stringToArray(string):undefined,chr=strSymbols?strSymbols[0]:string.charAt(0),trailing=strSymbols?castSlice(strSymbols,1).join(""):string.slice(1);return chr[methodName]()+trailing}}function createCompounder(callback){return function(string){return arrayReduce(words(deburr(string).replace(reApos,"")),callback,"")}}function createCtor(Ctor){return function(){var args=arguments;switch(args.length){case 0:return new Ctor;case 1:return new Ctor(args[0]);case 2:return new Ctor(args[0],args[1]);case 3:return new Ctor(args[0],args[1],args[2]);case 4:return new Ctor(args[0],args[1],args[2],args[3]);case 5:return new Ctor(args[0],args[1],args[2],args[3],args[4]);case 6:return new Ctor(args[0],args[1],args[2],args[3],args[4],args[5]);case 7:return new Ctor(args[0],args[1],args[2],args[3],args[4],args[5],args[6])}var thisBinding=baseCreate(Ctor.prototype),result=Ctor.apply(thisBinding,args);return isObject(result)?result:thisBinding}}function createCurry(func,bitmask,arity){function wrapper(){for(var length=arguments.length,args=Array(length),index=length,placeholder=getHolder(wrapper);index--;)args[index]=arguments[index];var holders=length<3&&args[0]!==placeholder&&args[length-1]!==placeholder?[]:replaceHolders(args,placeholder);if(length-=holders.length,length<arity)return createRecurry(func,bitmask,createHybrid,wrapper.placeholder,undefined,args,holders,undefined,undefined,arity-length);var fn=this&&this!==root&&this instanceof wrapper?Ctor:func;return apply(fn,this,args)}var Ctor=createCtor(func);return wrapper}function createFind(findIndexFunc){return function(collection,predicate,fromIndex){var iterable=Object(collection);if(!isArrayLike(collection)){var iteratee=getIteratee(predicate,3);collection=keys(collection),predicate=function(key){return iteratee(iterable[key],key,iterable)}}var index=findIndexFunc(collection,predicate,fromIndex);return index>-1?iterable[iteratee?collection[index]:index]:undefined}}function createFlow(fromRight){return flatRest(function(funcs){var length=funcs.length,index=length,prereq=LodashWrapper.prototype.thru;for(fromRight&&funcs.reverse();index--;){var func=funcs[index];if("function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);if(prereq&&!wrapper&&"wrapper"==getFuncName(func))var wrapper=new LodashWrapper([],(!0))}for(index=wrapper?index:length;++index<length;){func=funcs[index];var funcName=getFuncName(func),data="wrapper"==funcName?getData(func):undefined;wrapper=data&&isLaziable(data[0])&&data[1]==(WRAP_ARY_FLAG|WRAP_CURRY_FLAG|WRAP_PARTIAL_FLAG|WRAP_REARG_FLAG)&&!data[4].length&&1==data[9]?wrapper[getFuncName(data[0])].apply(wrapper,data[3]):1==func.length&&isLaziable(func)?wrapper[funcName]():wrapper.thru(func)}return function(){var args=arguments,value=args[0];if(wrapper&&1==args.length&&isArray(value))return wrapper.plant(value).value();for(var index=0,result=length?funcs[index].apply(this,args):value;++index<length;)result=funcs[index].call(this,result);return result}})}function createHybrid(func,bitmask,thisArg,partials,holders,partialsRight,holdersRight,argPos,ary,arity){function wrapper(){for(var length=arguments.length,args=Array(length),index=length;index--;)args[index]=arguments[index];if(isCurried)var placeholder=getHolder(wrapper),holdersCount=countHolders(args,placeholder);if(partials&&(args=composeArgs(args,partials,holders,isCurried)),partialsRight&&(args=composeArgsRight(args,partialsRight,holdersRight,isCurried)),length-=holdersCount,isCurried&&length<arity){var newHolders=replaceHolders(args,placeholder);return createRecurry(func,bitmask,createHybrid,wrapper.placeholder,thisArg,args,newHolders,argPos,ary,arity-length)}var thisBinding=isBind?thisArg:this,fn=isBindKey?thisBinding[func]:func;return length=args.length,argPos?args=reorder(args,argPos):isFlip&&length>1&&args.reverse(),isAry&&ary<length&&(args.length=ary),this&&this!==root&&this instanceof wrapper&&(fn=Ctor||createCtor(fn)),fn.apply(thisBinding,args)}var isAry=bitmask&WRAP_ARY_FLAG,isBind=bitmask&WRAP_BIND_FLAG,isBindKey=bitmask&WRAP_BIND_KEY_FLAG,isCurried=bitmask&(WRAP_CURRY_FLAG|WRAP_CURRY_RIGHT_FLAG),isFlip=bitmask&WRAP_FLIP_FLAG,Ctor=isBindKey?undefined:createCtor(func);return wrapper}function createInverter(setter,toIteratee){return function(object,iteratee){return baseInverter(object,setter,toIteratee(iteratee),{})}}function createMathOperation(operator,defaultValue){return function(value,other){var result;if(value===undefined&&other===undefined)return defaultValue;if(value!==undefined&&(result=value),other!==undefined){if(result===undefined)return other;"string"==typeof value||"string"==typeof other?(value=baseToString(value),other=baseToString(other)):(value=baseToNumber(value),other=baseToNumber(other)),result=operator(value,other)}return result}}function createOver(arrayFunc){return flatRest(function(iteratees){return iteratees=arrayMap(iteratees,baseUnary(getIteratee())),baseRest(function(args){var thisArg=this;return arrayFunc(iteratees,function(iteratee){return apply(iteratee,thisArg,args)})})})}function createPadding(length,chars){chars=chars===undefined?" ":baseToString(chars);var charsLength=chars.length;if(charsLength<2)return charsLength?baseRepeat(chars,length):chars;var result=baseRepeat(chars,nativeCeil(length/stringSize(chars)));return hasUnicode(chars)?castSlice(stringToArray(result),0,length).join(""):result.slice(0,length)}function createPartial(func,bitmask,thisArg,partials){function wrapper(){for(var argsIndex=-1,argsLength=arguments.length,leftIndex=-1,leftLength=partials.length,args=Array(leftLength+argsLength),fn=this&&this!==root&&this instanceof wrapper?Ctor:func;++leftIndex<leftLength;)args[leftIndex]=partials[leftIndex];for(;argsLength--;)args[leftIndex++]=arguments[++argsIndex];return apply(fn,isBind?thisArg:this,args)}var isBind=bitmask&WRAP_BIND_FLAG,Ctor=createCtor(func);return wrapper}function createRange(fromRight){return function(start,end,step){return step&&"number"!=typeof step&&isIterateeCall(start,end,step)&&(end=step=undefined),start=toFinite(start),end===undefined?(end=start,start=0):end=toFinite(end),step=step===undefined?start<end?1:-1:toFinite(step),baseRange(start,end,step,fromRight)}}function createRelationalOperation(operator){return function(value,other){return"string"==typeof value&&"string"==typeof other||(value=toNumber(value),other=toNumber(other)),operator(value,other)}}function createRecurry(func,bitmask,wrapFunc,placeholder,thisArg,partials,holders,argPos,ary,arity){var isCurry=bitmask&WRAP_CURRY_FLAG,newHolders=isCurry?holders:undefined,newHoldersRight=isCurry?undefined:holders,newPartials=isCurry?partials:undefined,newPartialsRight=isCurry?undefined:partials;bitmask|=isCurry?WRAP_PARTIAL_FLAG:WRAP_PARTIAL_RIGHT_FLAG,bitmask&=~(isCurry?WRAP_PARTIAL_RIGHT_FLAG:WRAP_PARTIAL_FLAG),bitmask&WRAP_CURRY_BOUND_FLAG||(bitmask&=~(WRAP_BIND_FLAG|WRAP_BIND_KEY_FLAG));var newData=[func,bitmask,thisArg,newPartials,newHolders,newPartialsRight,newHoldersRight,argPos,ary,arity],result=wrapFunc.apply(undefined,newData);return isLaziable(func)&&setData(result,newData),result.placeholder=placeholder,setWrapToString(result,func,bitmask)}function createRound(methodName){var func=Math[methodName];return function(number,precision){if(number=toNumber(number),precision=null==precision?0:nativeMin(toInteger(precision),292)){var pair=(toString(number)+"e").split("e"),value=func(pair[0]+"e"+(+pair[1]+precision));return pair=(toString(value)+"e").split("e"),+(pair[0]+"e"+(+pair[1]-precision))}return func(number)}}function createToPairs(keysFunc){return function(object){var tag=getTag(object);return tag==mapTag?mapToArray(object):tag==setTag?setToPairs(object):baseToPairs(object,keysFunc(object))}}function createWrap(func,bitmask,thisArg,partials,holders,argPos,ary,arity){var isBindKey=bitmask&WRAP_BIND_KEY_FLAG;if(!isBindKey&&"function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);var length=partials?partials.length:0;if(length||(bitmask&=~(WRAP_PARTIAL_FLAG|WRAP_PARTIAL_RIGHT_FLAG),partials=holders=undefined),ary=ary===undefined?ary:nativeMax(toInteger(ary),0),arity=arity===undefined?arity:toInteger(arity),length-=holders?holders.length:0,bitmask&WRAP_PARTIAL_RIGHT_FLAG){var partialsRight=partials,holdersRight=holders;partials=holders=undefined}var data=isBindKey?undefined:getData(func),newData=[func,bitmask,thisArg,partials,holders,partialsRight,holdersRight,argPos,ary,arity];if(data&&mergeData(newData,data),func=newData[0],bitmask=newData[1],thisArg=newData[2],partials=newData[3],holders=newData[4],arity=newData[9]=newData[9]===undefined?isBindKey?0:func.length:nativeMax(newData[9]-length,0),!arity&&bitmask&(WRAP_CURRY_FLAG|WRAP_CURRY_RIGHT_FLAG)&&(bitmask&=~(WRAP_CURRY_FLAG|WRAP_CURRY_RIGHT_FLAG)),bitmask&&bitmask!=WRAP_BIND_FLAG)result=bitmask==WRAP_CURRY_FLAG||bitmask==WRAP_CURRY_RIGHT_FLAG?createCurry(func,bitmask,arity):bitmask!=WRAP_PARTIAL_FLAG&&bitmask!=(WRAP_BIND_FLAG|WRAP_PARTIAL_FLAG)||holders.length?createHybrid.apply(undefined,newData):createPartial(func,bitmask,thisArg,partials);else var result=createBind(func,bitmask,thisArg);var setter=data?baseSetData:setData;return setWrapToString(setter(result,newData),func,bitmask)}function customDefaultsAssignIn(objValue,srcValue,key,object){return objValue===undefined||eq(objValue,objectProto[key])&&!hasOwnProperty.call(object,key)?srcValue:objValue}function customDefaultsMerge(objValue,srcValue,key,object,source,stack){return isObject(objValue)&&isObject(srcValue)&&(stack.set(srcValue,objValue),baseMerge(objValue,srcValue,undefined,customDefaultsMerge,stack),stack["delete"](srcValue)),objValue}function customOmitClone(value){return isPlainObject(value)?undefined:value}function equalArrays(array,other,bitmask,customizer,equalFunc,stack){var isPartial=bitmask&COMPARE_PARTIAL_FLAG,arrLength=array.length,othLength=other.length;if(arrLength!=othLength&&!(isPartial&&othLength>arrLength))return!1;var stacked=stack.get(array);if(stacked&&stack.get(other))return stacked==other;var index=-1,result=!0,seen=bitmask&COMPARE_UNORDERED_FLAG?new SetCache:undefined;for(stack.set(array,other),stack.set(other,array);++index<arrLength;){var arrValue=array[index],othValue=other[index];if(customizer)var compared=isPartial?customizer(othValue,arrValue,index,other,array,stack):customizer(arrValue,othValue,index,array,other,stack);if(compared!==undefined){if(compared)continue;result=!1;break}if(seen){if(!arraySome(other,function(othValue,othIndex){if(!cacheHas(seen,othIndex)&&(arrValue===othValue||equalFunc(arrValue,othValue,bitmask,customizer,stack)))return seen.push(othIndex)})){result=!1;break}}else if(arrValue!==othValue&&!equalFunc(arrValue,othValue,bitmask,customizer,stack)){result=!1;break}}return stack["delete"](array),stack["delete"](other),result}function equalByTag(object,other,tag,bitmask,customizer,equalFunc,stack){switch(tag){case dataViewTag:if(object.byteLength!=other.byteLength||object.byteOffset!=other.byteOffset)return!1;object=object.buffer,other=other.buffer;case arrayBufferTag:return!(object.byteLength!=other.byteLength||!equalFunc(new Uint8Array(object),new Uint8Array(other)));case boolTag:case dateTag:case numberTag:return eq(+object,+other);case errorTag:return object.name==other.name&&object.message==other.message;case regexpTag:case stringTag:return object==other+"";case mapTag:var convert=mapToArray;case setTag:var isPartial=bitmask&COMPARE_PARTIAL_FLAG;if(convert||(convert=setToArray),object.size!=other.size&&!isPartial)return!1;var stacked=stack.get(object);if(stacked)return stacked==other;bitmask|=COMPARE_UNORDERED_FLAG,stack.set(object,other);var result=equalArrays(convert(object),convert(other),bitmask,customizer,equalFunc,stack);return stack["delete"](object),result;case symbolTag:if(symbolValueOf)return symbolValueOf.call(object)==symbolValueOf.call(other)}return!1}function equalObjects(object,other,bitmask,customizer,equalFunc,stack){var isPartial=bitmask&COMPARE_PARTIAL_FLAG,objProps=getAllKeys(object),objLength=objProps.length,othProps=getAllKeys(other),othLength=othProps.length;if(objLength!=othLength&&!isPartial)return!1;for(var index=objLength;index--;){var key=objProps[index];if(!(isPartial?key in other:hasOwnProperty.call(other,key)))return!1}var stacked=stack.get(object);if(stacked&&stack.get(other))return stacked==other;var result=!0;stack.set(object,other),stack.set(other,object);for(var skipCtor=isPartial;++index<objLength;){key=objProps[index];var objValue=object[key],othValue=other[key];if(customizer)var compared=isPartial?customizer(othValue,objValue,key,other,object,stack):customizer(objValue,othValue,key,object,other,stack);
if(!(compared===undefined?objValue===othValue||equalFunc(objValue,othValue,bitmask,customizer,stack):compared)){result=!1;break}skipCtor||(skipCtor="constructor"==key)}if(result&&!skipCtor){var objCtor=object.constructor,othCtor=other.constructor;objCtor!=othCtor&&"constructor"in object&&"constructor"in other&&!("function"==typeof objCtor&&objCtor instanceof objCtor&&"function"==typeof othCtor&&othCtor instanceof othCtor)&&(result=!1)}return stack["delete"](object),stack["delete"](other),result}function flatRest(func){return setToString(overRest(func,undefined,flatten),func+"")}function getAllKeys(object){return baseGetAllKeys(object,keys,getSymbols)}function getAllKeysIn(object){return baseGetAllKeys(object,keysIn,getSymbolsIn)}function getFuncName(func){for(var result=func.name+"",array=realNames[result],length=hasOwnProperty.call(realNames,result)?array.length:0;length--;){var data=array[length],otherFunc=data.func;if(null==otherFunc||otherFunc==func)return data.name}return result}function getHolder(func){var object=hasOwnProperty.call(lodash,"placeholder")?lodash:func;return object.placeholder}function getIteratee(){var result=lodash.iteratee||iteratee;return result=result===iteratee?baseIteratee:result,arguments.length?result(arguments[0],arguments[1]):result}function getMapData(map,key){var data=map.__data__;return isKeyable(key)?data["string"==typeof key?"string":"hash"]:data.map}function getMatchData(object){for(var result=keys(object),length=result.length;length--;){var key=result[length],value=object[key];result[length]=[key,value,isStrictComparable(value)]}return result}function getNative(object,key){var value=getValue(object,key);return baseIsNative(value)?value:undefined}function getRawTag(value){var isOwn=hasOwnProperty.call(value,symToStringTag),tag=value[symToStringTag];try{value[symToStringTag]=undefined;var unmasked=!0}catch(e){}var result=nativeObjectToString.call(value);return unmasked&&(isOwn?value[symToStringTag]=tag:delete value[symToStringTag]),result}function getView(start,end,transforms){for(var index=-1,length=transforms.length;++index<length;){var data=transforms[index],size=data.size;switch(data.type){case"drop":start+=size;break;case"dropRight":end-=size;break;case"take":end=nativeMin(end,start+size);break;case"takeRight":start=nativeMax(start,end-size)}}return{start:start,end:end}}function getWrapDetails(source){var match=source.match(reWrapDetails);return match?match[1].split(reSplitDetails):[]}function hasPath(object,path,hasFunc){path=castPath(path,object);for(var index=-1,length=path.length,result=!1;++index<length;){var key=toKey(path[index]);if(!(result=null!=object&&hasFunc(object,key)))break;object=object[key]}return result||++index!=length?result:(length=null==object?0:object.length,!!length&&isLength(length)&&isIndex(key,length)&&(isArray(object)||isArguments(object)))}function initCloneArray(array){var length=array.length,result=array.constructor(length);return length&&"string"==typeof array[0]&&hasOwnProperty.call(array,"index")&&(result.index=array.index,result.input=array.input),result}function initCloneObject(object){return"function"!=typeof object.constructor||isPrototype(object)?{}:baseCreate(getPrototype(object))}function initCloneByTag(object,tag,cloneFunc,isDeep){var Ctor=object.constructor;switch(tag){case arrayBufferTag:return cloneArrayBuffer(object);case boolTag:case dateTag:return new Ctor((+object));case dataViewTag:return cloneDataView(object,isDeep);case float32Tag:case float64Tag:case int8Tag:case int16Tag:case int32Tag:case uint8Tag:case uint8ClampedTag:case uint16Tag:case uint32Tag:return cloneTypedArray(object,isDeep);case mapTag:return cloneMap(object,isDeep,cloneFunc);case numberTag:case stringTag:return new Ctor(object);case regexpTag:return cloneRegExp(object);case setTag:return cloneSet(object,isDeep,cloneFunc);case symbolTag:return cloneSymbol(object)}}function insertWrapDetails(source,details){var length=details.length;if(!length)return source;var lastIndex=length-1;return details[lastIndex]=(length>1?"& ":"")+details[lastIndex],details=details.join(length>2?", ":" "),source.replace(reWrapComment,"{\n/* [wrapped with "+details+"] */\n")}function isFlattenable(value){return isArray(value)||isArguments(value)||!!(spreadableSymbol&&value&&value[spreadableSymbol])}function isIndex(value,length){return length=null==length?MAX_SAFE_INTEGER:length,!!length&&("number"==typeof value||reIsUint.test(value))&&value>-1&&value%1==0&&value<length}function isIterateeCall(value,index,object){if(!isObject(object))return!1;var type=typeof index;return!!("number"==type?isArrayLike(object)&&isIndex(index,object.length):"string"==type&&index in object)&&eq(object[index],value)}function isKey(value,object){if(isArray(value))return!1;var type=typeof value;return!("number"!=type&&"symbol"!=type&&"boolean"!=type&&null!=value&&!isSymbol(value))||(reIsPlainProp.test(value)||!reIsDeepProp.test(value)||null!=object&&value in Object(object))}function isKeyable(value){var type=typeof value;return"string"==type||"number"==type||"symbol"==type||"boolean"==type?"__proto__"!==value:null===value}function isLaziable(func){var funcName=getFuncName(func),other=lodash[funcName];if("function"!=typeof other||!(funcName in LazyWrapper.prototype))return!1;if(func===other)return!0;var data=getData(other);return!!data&&func===data[0]}function isMasked(func){return!!maskSrcKey&&maskSrcKey in func}function isPrototype(value){var Ctor=value&&value.constructor,proto="function"==typeof Ctor&&Ctor.prototype||objectProto;return value===proto}function isStrictComparable(value){return value===value&&!isObject(value)}function matchesStrictComparable(key,srcValue){return function(object){return null!=object&&(object[key]===srcValue&&(srcValue!==undefined||key in Object(object)))}}function memoizeCapped(func){var result=memoize(func,function(key){return cache.size===MAX_MEMOIZE_SIZE&&cache.clear(),key}),cache=result.cache;return result}function mergeData(data,source){var bitmask=data[1],srcBitmask=source[1],newBitmask=bitmask|srcBitmask,isCommon=newBitmask<(WRAP_BIND_FLAG|WRAP_BIND_KEY_FLAG|WRAP_ARY_FLAG),isCombo=srcBitmask==WRAP_ARY_FLAG&&bitmask==WRAP_CURRY_FLAG||srcBitmask==WRAP_ARY_FLAG&&bitmask==WRAP_REARG_FLAG&&data[7].length<=source[8]||srcBitmask==(WRAP_ARY_FLAG|WRAP_REARG_FLAG)&&source[7].length<=source[8]&&bitmask==WRAP_CURRY_FLAG;if(!isCommon&&!isCombo)return data;srcBitmask&WRAP_BIND_FLAG&&(data[2]=source[2],newBitmask|=bitmask&WRAP_BIND_FLAG?0:WRAP_CURRY_BOUND_FLAG);var value=source[3];if(value){var partials=data[3];data[3]=partials?composeArgs(partials,value,source[4]):value,data[4]=partials?replaceHolders(data[3],PLACEHOLDER):source[4]}return value=source[5],value&&(partials=data[5],data[5]=partials?composeArgsRight(partials,value,source[6]):value,data[6]=partials?replaceHolders(data[5],PLACEHOLDER):source[6]),value=source[7],value&&(data[7]=value),srcBitmask&WRAP_ARY_FLAG&&(data[8]=null==data[8]?source[8]:nativeMin(data[8],source[8])),null==data[9]&&(data[9]=source[9]),data[0]=source[0],data[1]=newBitmask,data}function nativeKeysIn(object){var result=[];if(null!=object)for(var key in Object(object))result.push(key);return result}function objectToString(value){return nativeObjectToString.call(value)}function overRest(func,start,transform){return start=nativeMax(start===undefined?func.length-1:start,0),function(){for(var args=arguments,index=-1,length=nativeMax(args.length-start,0),array=Array(length);++index<length;)array[index]=args[start+index];index=-1;for(var otherArgs=Array(start+1);++index<start;)otherArgs[index]=args[index];return otherArgs[start]=transform(array),apply(func,this,otherArgs)}}function parent(object,path){return path.length<2?object:baseGet(object,baseSlice(path,0,-1))}function reorder(array,indexes){for(var arrLength=array.length,length=nativeMin(indexes.length,arrLength),oldArray=copyArray(array);length--;){var index=indexes[length];array[length]=isIndex(index,arrLength)?oldArray[index]:undefined}return array}function setWrapToString(wrapper,reference,bitmask){var source=reference+"";return setToString(wrapper,insertWrapDetails(source,updateWrapDetails(getWrapDetails(source),bitmask)))}function shortOut(func){var count=0,lastCalled=0;return function(){var stamp=nativeNow(),remaining=HOT_SPAN-(stamp-lastCalled);if(lastCalled=stamp,remaining>0){if(++count>=HOT_COUNT)return arguments[0]}else count=0;return func.apply(undefined,arguments)}}function shuffleSelf(array,size){var index=-1,length=array.length,lastIndex=length-1;for(size=size===undefined?length:size;++index<size;){var rand=baseRandom(index,lastIndex),value=array[rand];array[rand]=array[index],array[index]=value}return array.length=size,array}function toKey(value){if("string"==typeof value||isSymbol(value))return value;var result=value+"";return"0"==result&&1/value==-INFINITY?"-0":result}function toSource(func){if(null!=func){try{return funcToString.call(func)}catch(e){}try{return func+""}catch(e){}}return""}function updateWrapDetails(details,bitmask){return arrayEach(wrapFlags,function(pair){var value="_."+pair[0];bitmask&pair[1]&&!arrayIncludes(details,value)&&details.push(value)}),details.sort()}function wrapperClone(wrapper){if(wrapper instanceof LazyWrapper)return wrapper.clone();var result=new LodashWrapper(wrapper.__wrapped__,wrapper.__chain__);return result.__actions__=copyArray(wrapper.__actions__),result.__index__=wrapper.__index__,result.__values__=wrapper.__values__,result}function chunk(array,size,guard){size=(guard?isIterateeCall(array,size,guard):size===undefined)?1:nativeMax(toInteger(size),0);var length=null==array?0:array.length;if(!length||size<1)return[];for(var index=0,resIndex=0,result=Array(nativeCeil(length/size));index<length;)result[resIndex++]=baseSlice(array,index,index+=size);return result}function compact(array){for(var index=-1,length=null==array?0:array.length,resIndex=0,result=[];++index<length;){var value=array[index];value&&(result[resIndex++]=value)}return result}function concat(){var length=arguments.length;if(!length)return[];for(var args=Array(length-1),array=arguments[0],index=length;index--;)args[index-1]=arguments[index];return arrayPush(isArray(array)?copyArray(array):[array],baseFlatten(args,1))}function drop(array,n,guard){var length=null==array?0:array.length;return length?(n=guard||n===undefined?1:toInteger(n),baseSlice(array,n<0?0:n,length)):[]}function dropRight(array,n,guard){var length=null==array?0:array.length;return length?(n=guard||n===undefined?1:toInteger(n),n=length-n,baseSlice(array,0,n<0?0:n)):[]}function dropRightWhile(array,predicate){return array&&array.length?baseWhile(array,getIteratee(predicate,3),!0,!0):[]}function dropWhile(array,predicate){return array&&array.length?baseWhile(array,getIteratee(predicate,3),!0):[]}function fill(array,value,start,end){var length=null==array?0:array.length;return length?(start&&"number"!=typeof start&&isIterateeCall(array,value,start)&&(start=0,end=length),baseFill(array,value,start,end)):[]}function findIndex(array,predicate,fromIndex){var length=null==array?0:array.length;if(!length)return-1;var index=null==fromIndex?0:toInteger(fromIndex);return index<0&&(index=nativeMax(length+index,0)),baseFindIndex(array,getIteratee(predicate,3),index)}function findLastIndex(array,predicate,fromIndex){var length=null==array?0:array.length;if(!length)return-1;var index=length-1;return fromIndex!==undefined&&(index=toInteger(fromIndex),index=fromIndex<0?nativeMax(length+index,0):nativeMin(index,length-1)),baseFindIndex(array,getIteratee(predicate,3),index,!0)}function flatten(array){var length=null==array?0:array.length;return length?baseFlatten(array,1):[]}function flattenDeep(array){var length=null==array?0:array.length;return length?baseFlatten(array,INFINITY):[]}function flattenDepth(array,depth){var length=null==array?0:array.length;return length?(depth=depth===undefined?1:toInteger(depth),baseFlatten(array,depth)):[]}function fromPairs(pairs){for(var index=-1,length=null==pairs?0:pairs.length,result={};++index<length;){var pair=pairs[index];result[pair[0]]=pair[1]}return result}function head(array){return array&&array.length?array[0]:undefined}function indexOf(array,value,fromIndex){var length=null==array?0:array.length;if(!length)return-1;var index=null==fromIndex?0:toInteger(fromIndex);return index<0&&(index=nativeMax(length+index,0)),baseIndexOf(array,value,index)}function initial(array){var length=null==array?0:array.length;return length?baseSlice(array,0,-1):[]}function join(array,separator){return null==array?"":nativeJoin.call(array,separator)}function last(array){var length=null==array?0:array.length;return length?array[length-1]:undefined}function lastIndexOf(array,value,fromIndex){var length=null==array?0:array.length;if(!length)return-1;var index=length;return fromIndex!==undefined&&(index=toInteger(fromIndex),index=index<0?nativeMax(length+index,0):nativeMin(index,length-1)),value===value?strictLastIndexOf(array,value,index):baseFindIndex(array,baseIsNaN,index,!0)}function nth(array,n){return array&&array.length?baseNth(array,toInteger(n)):undefined}function pullAll(array,values){return array&&array.length&&values&&values.length?basePullAll(array,values):array}function pullAllBy(array,values,iteratee){return array&&array.length&&values&&values.length?basePullAll(array,values,getIteratee(iteratee,2)):array}function pullAllWith(array,values,comparator){return array&&array.length&&values&&values.length?basePullAll(array,values,undefined,comparator):array}function remove(array,predicate){var result=[];if(!array||!array.length)return result;var index=-1,indexes=[],length=array.length;for(predicate=getIteratee(predicate,3);++index<length;){var value=array[index];predicate(value,index,array)&&(result.push(value),indexes.push(index))}return basePullAt(array,indexes),result}function reverse(array){return null==array?array:nativeReverse.call(array)}function slice(array,start,end){var length=null==array?0:array.length;return length?(end&&"number"!=typeof end&&isIterateeCall(array,start,end)?(start=0,end=length):(start=null==start?0:toInteger(start),end=end===undefined?length:toInteger(end)),baseSlice(array,start,end)):[]}function sortedIndex(array,value){return baseSortedIndex(array,value)}function sortedIndexBy(array,value,iteratee){return baseSortedIndexBy(array,value,getIteratee(iteratee,2))}function sortedIndexOf(array,value){var length=null==array?0:array.length;if(length){var index=baseSortedIndex(array,value);if(index<length&&eq(array[index],value))return index}return-1}function sortedLastIndex(array,value){return baseSortedIndex(array,value,!0)}function sortedLastIndexBy(array,value,iteratee){return baseSortedIndexBy(array,value,getIteratee(iteratee,2),!0)}function sortedLastIndexOf(array,value){var length=null==array?0:array.length;if(length){var index=baseSortedIndex(array,value,!0)-1;if(eq(array[index],value))return index}return-1}function sortedUniq(array){return array&&array.length?baseSortedUniq(array):[]}function sortedUniqBy(array,iteratee){return array&&array.length?baseSortedUniq(array,getIteratee(iteratee,2)):[]}function tail(array){var length=null==array?0:array.length;return length?baseSlice(array,1,length):[]}function take(array,n,guard){return array&&array.length?(n=guard||n===undefined?1:toInteger(n),baseSlice(array,0,n<0?0:n)):[]}function takeRight(array,n,guard){var length=null==array?0:array.length;return length?(n=guard||n===undefined?1:toInteger(n),n=length-n,baseSlice(array,n<0?0:n,length)):[]}function takeRightWhile(array,predicate){return array&&array.length?baseWhile(array,getIteratee(predicate,3),!1,!0):[]}function takeWhile(array,predicate){return array&&array.length?baseWhile(array,getIteratee(predicate,3)):[]}function uniq(array){return array&&array.length?baseUniq(array):[]}function uniqBy(array,iteratee){return array&&array.length?baseUniq(array,getIteratee(iteratee,2)):[]}function uniqWith(array,comparator){return comparator="function"==typeof comparator?comparator:undefined,array&&array.length?baseUniq(array,undefined,comparator):[]}function unzip(array){if(!array||!array.length)return[];var length=0;return array=arrayFilter(array,function(group){if(isArrayLikeObject(group))return length=nativeMax(group.length,length),!0}),baseTimes(length,function(index){return arrayMap(array,baseProperty(index))})}function unzipWith(array,iteratee){if(!array||!array.length)return[];var result=unzip(array);return null==iteratee?result:arrayMap(result,function(group){return apply(iteratee,undefined,group)})}function zipObject(props,values){return baseZipObject(props||[],values||[],assignValue)}function zipObjectDeep(props,values){return baseZipObject(props||[],values||[],baseSet)}function chain(value){var result=lodash(value);return result.__chain__=!0,result}function tap(value,interceptor){return interceptor(value),value}function thru(value,interceptor){return interceptor(value)}function wrapperChain(){return chain(this)}function wrapperCommit(){return new LodashWrapper(this.value(),this.__chain__)}function wrapperNext(){this.__values__===undefined&&(this.__values__=toArray(this.value()));var done=this.__index__>=this.__values__.length,value=done?undefined:this.__values__[this.__index__++];return{done:done,value:value}}function wrapperToIterator(){return this}function wrapperPlant(value){for(var result,parent=this;parent instanceof baseLodash;){var clone=wrapperClone(parent);clone.__index__=0,clone.__values__=undefined,result?previous.__wrapped__=clone:result=clone;var previous=clone;parent=parent.__wrapped__}return previous.__wrapped__=value,result}function wrapperReverse(){var value=this.__wrapped__;if(value instanceof LazyWrapper){var wrapped=value;return this.__actions__.length&&(wrapped=new LazyWrapper(this)),wrapped=wrapped.reverse(),wrapped.__actions__.push({func:thru,args:[reverse],thisArg:undefined}),new LodashWrapper(wrapped,this.__chain__)}return this.thru(reverse)}function wrapperValue(){return baseWrapperValue(this.__wrapped__,this.__actions__)}function every(collection,predicate,guard){var func=isArray(collection)?arrayEvery:baseEvery;return guard&&isIterateeCall(collection,predicate,guard)&&(predicate=undefined),func(collection,getIteratee(predicate,3))}function filter(collection,predicate){var func=isArray(collection)?arrayFilter:baseFilter;return func(collection,getIteratee(predicate,3))}function flatMap(collection,iteratee){return baseFlatten(map(collection,iteratee),1)}function flatMapDeep(collection,iteratee){return baseFlatten(map(collection,iteratee),INFINITY)}function flatMapDepth(collection,iteratee,depth){return depth=depth===undefined?1:toInteger(depth),baseFlatten(map(collection,iteratee),depth)}function forEach(collection,iteratee){var func=isArray(collection)?arrayEach:baseEach;return func(collection,getIteratee(iteratee,3))}function forEachRight(collection,iteratee){var func=isArray(collection)?arrayEachRight:baseEachRight;return func(collection,getIteratee(iteratee,3))}function includes(collection,value,fromIndex,guard){collection=isArrayLike(collection)?collection:values(collection),fromIndex=fromIndex&&!guard?toInteger(fromIndex):0;var length=collection.length;return fromIndex<0&&(fromIndex=nativeMax(length+fromIndex,0)),isString(collection)?fromIndex<=length&&collection.indexOf(value,fromIndex)>-1:!!length&&baseIndexOf(collection,value,fromIndex)>-1}function map(collection,iteratee){var func=isArray(collection)?arrayMap:baseMap;return func(collection,getIteratee(iteratee,3))}function orderBy(collection,iteratees,orders,guard){return null==collection?[]:(isArray(iteratees)||(iteratees=null==iteratees?[]:[iteratees]),orders=guard?undefined:orders,isArray(orders)||(orders=null==orders?[]:[orders]),baseOrderBy(collection,iteratees,orders))}function reduce(collection,iteratee,accumulator){var func=isArray(collection)?arrayReduce:baseReduce,initAccum=arguments.length<3;return func(collection,getIteratee(iteratee,4),accumulator,initAccum,baseEach)}function reduceRight(collection,iteratee,accumulator){var func=isArray(collection)?arrayReduceRight:baseReduce,initAccum=arguments.length<3;return func(collection,getIteratee(iteratee,4),accumulator,initAccum,baseEachRight)}function reject(collection,predicate){var func=isArray(collection)?arrayFilter:baseFilter;return func(collection,negate(getIteratee(predicate,3)))}function sample(collection){var func=isArray(collection)?arraySample:baseSample;return func(collection)}function sampleSize(collection,n,guard){n=(guard?isIterateeCall(collection,n,guard):n===undefined)?1:toInteger(n);var func=isArray(collection)?arraySampleSize:baseSampleSize;return func(collection,n)}function shuffle(collection){var func=isArray(collection)?arrayShuffle:baseShuffle;return func(collection)}function size(collection){if(null==collection)return 0;if(isArrayLike(collection))return isString(collection)?stringSize(collection):collection.length;var tag=getTag(collection);return tag==mapTag||tag==setTag?collection.size:baseKeys(collection).length}function some(collection,predicate,guard){var func=isArray(collection)?arraySome:baseSome;return guard&&isIterateeCall(collection,predicate,guard)&&(predicate=undefined),func(collection,getIteratee(predicate,3))}function after(n,func){if("function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);return n=toInteger(n),function(){if(--n<1)return func.apply(this,arguments)}}function ary(func,n,guard){return n=guard?undefined:n,n=func&&null==n?func.length:n,createWrap(func,WRAP_ARY_FLAG,undefined,undefined,undefined,undefined,n)}function before(n,func){var result;if("function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);return n=toInteger(n),function(){return--n>0&&(result=func.apply(this,arguments)),n<=1&&(func=undefined),result}}function curry(func,arity,guard){arity=guard?undefined:arity;var result=createWrap(func,WRAP_CURRY_FLAG,undefined,undefined,undefined,undefined,undefined,arity);return result.placeholder=curry.placeholder,result}function curryRight(func,arity,guard){arity=guard?undefined:arity;var result=createWrap(func,WRAP_CURRY_RIGHT_FLAG,undefined,undefined,undefined,undefined,undefined,arity);return result.placeholder=curryRight.placeholder,result}function debounce(func,wait,options){function invokeFunc(time){var args=lastArgs,thisArg=lastThis;return lastArgs=lastThis=undefined,lastInvokeTime=time,result=func.apply(thisArg,args)}function leadingEdge(time){return lastInvokeTime=time,timerId=setTimeout(timerExpired,wait),leading?invokeFunc(time):result}function remainingWait(time){var timeSinceLastCall=time-lastCallTime,timeSinceLastInvoke=time-lastInvokeTime,result=wait-timeSinceLastCall;return maxing?nativeMin(result,maxWait-timeSinceLastInvoke):result}function shouldInvoke(time){var timeSinceLastCall=time-lastCallTime,timeSinceLastInvoke=time-lastInvokeTime;return lastCallTime===undefined||timeSinceLastCall>=wait||timeSinceLastCall<0||maxing&&timeSinceLastInvoke>=maxWait}function timerExpired(){var time=now();return shouldInvoke(time)?trailingEdge(time):void(timerId=setTimeout(timerExpired,remainingWait(time)))}function trailingEdge(time){return timerId=undefined,trailing&&lastArgs?invokeFunc(time):(lastArgs=lastThis=undefined,result)}function cancel(){timerId!==undefined&&clearTimeout(timerId),lastInvokeTime=0,lastArgs=lastCallTime=lastThis=timerId=undefined}function flush(){return timerId===undefined?result:trailingEdge(now())}function debounced(){var time=now(),isInvoking=shouldInvoke(time);if(lastArgs=arguments,lastThis=this,lastCallTime=time,isInvoking){if(timerId===undefined)return leadingEdge(lastCallTime);if(maxing)return timerId=setTimeout(timerExpired,wait),invokeFunc(lastCallTime)}return timerId===undefined&&(timerId=setTimeout(timerExpired,wait)),result}var lastArgs,lastThis,maxWait,result,timerId,lastCallTime,lastInvokeTime=0,leading=!1,maxing=!1,trailing=!0;if("function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);return wait=toNumber(wait)||0,isObject(options)&&(leading=!!options.leading,maxing="maxWait"in options,maxWait=maxing?nativeMax(toNumber(options.maxWait)||0,wait):maxWait,trailing="trailing"in options?!!options.trailing:trailing),debounced.cancel=cancel,debounced.flush=flush,debounced}function flip(func){return createWrap(func,WRAP_FLIP_FLAG)}function memoize(func,resolver){if("function"!=typeof func||null!=resolver&&"function"!=typeof resolver)throw new TypeError(FUNC_ERROR_TEXT);var memoized=function(){var args=arguments,key=resolver?resolver.apply(this,args):args[0],cache=memoized.cache;if(cache.has(key))return cache.get(key);var result=func.apply(this,args);return memoized.cache=cache.set(key,result)||cache,result};return memoized.cache=new(memoize.Cache||MapCache),memoized}function negate(predicate){if("function"!=typeof predicate)throw new TypeError(FUNC_ERROR_TEXT);return function(){var args=arguments;switch(args.length){case 0:return!predicate.call(this);case 1:return!predicate.call(this,args[0]);case 2:return!predicate.call(this,args[0],args[1]);case 3:return!predicate.call(this,args[0],args[1],args[2])}return!predicate.apply(this,args)}}function once(func){return before(2,func)}function rest(func,start){if("function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);return start=start===undefined?start:toInteger(start),baseRest(func,start)}function spread(func,start){if("function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);return start=null==start?0:nativeMax(toInteger(start),0),baseRest(function(args){var array=args[start],otherArgs=castSlice(args,0,start);return array&&arrayPush(otherArgs,array),apply(func,this,otherArgs)})}function throttle(func,wait,options){var leading=!0,trailing=!0;if("function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);return isObject(options)&&(leading="leading"in options?!!options.leading:leading,trailing="trailing"in options?!!options.trailing:trailing),debounce(func,wait,{leading:leading,maxWait:wait,trailing:trailing})}function unary(func){return ary(func,1)}function wrap(value,wrapper){return partial(castFunction(wrapper),value)}function castArray(){if(!arguments.length)return[];var value=arguments[0];return isArray(value)?value:[value]}function clone(value){return baseClone(value,CLONE_SYMBOLS_FLAG)}function cloneWith(value,customizer){return customizer="function"==typeof customizer?customizer:undefined,baseClone(value,CLONE_SYMBOLS_FLAG,customizer)}function cloneDeep(value){return baseClone(value,CLONE_DEEP_FLAG|CLONE_SYMBOLS_FLAG)}function cloneDeepWith(value,customizer){return customizer="function"==typeof customizer?customizer:undefined,baseClone(value,CLONE_DEEP_FLAG|CLONE_SYMBOLS_FLAG,customizer)}function conformsTo(object,source){return null==source||baseConformsTo(object,source,keys(source))}function eq(value,other){return value===other||value!==value&&other!==other}function isArrayLike(value){return null!=value&&isLength(value.length)&&!isFunction(value)}function isArrayLikeObject(value){return isObjectLike(value)&&isArrayLike(value)}function isBoolean(value){return value===!0||value===!1||isObjectLike(value)&&baseGetTag(value)==boolTag}function isElement(value){return isObjectLike(value)&&1===value.nodeType&&!isPlainObject(value)}function isEmpty(value){if(null==value)return!0;if(isArrayLike(value)&&(isArray(value)||"string"==typeof value||"function"==typeof value.splice||isBuffer(value)||isTypedArray(value)||isArguments(value)))return!value.length;var tag=getTag(value);if(tag==mapTag||tag==setTag)return!value.size;if(isPrototype(value))return!baseKeys(value).length;for(var key in value)if(hasOwnProperty.call(value,key))return!1;return!0}function isEqual(value,other){return baseIsEqual(value,other)}function isEqualWith(value,other,customizer){customizer="function"==typeof customizer?customizer:undefined;var result=customizer?customizer(value,other):undefined;return result===undefined?baseIsEqual(value,other,undefined,customizer):!!result}function isError(value){if(!isObjectLike(value))return!1;var tag=baseGetTag(value);return tag==errorTag||tag==domExcTag||"string"==typeof value.message&&"string"==typeof value.name&&!isPlainObject(value)}function isFinite(value){return"number"==typeof value&&nativeIsFinite(value)}function isFunction(value){if(!isObject(value))return!1;var tag=baseGetTag(value);return tag==funcTag||tag==genTag||tag==asyncTag||tag==proxyTag}function isInteger(value){return"number"==typeof value&&value==toInteger(value)}function isLength(value){return"number"==typeof value&&value>-1&&value%1==0&&value<=MAX_SAFE_INTEGER}function isObject(value){var type=typeof value;return null!=value&&("object"==type||"function"==type)}function isObjectLike(value){return null!=value&&"object"==typeof value}function isMatch(object,source){return object===source||baseIsMatch(object,source,getMatchData(source))}function isMatchWith(object,source,customizer){return customizer="function"==typeof customizer?customizer:undefined,baseIsMatch(object,source,getMatchData(source),customizer)}function isNaN(value){return isNumber(value)&&value!=+value}function isNative(value){if(isMaskable(value))throw new Error(CORE_ERROR_TEXT);return baseIsNative(value)}function isNull(value){return null===value}function isNil(value){return null==value}function isNumber(value){return"number"==typeof value||isObjectLike(value)&&baseGetTag(value)==numberTag}function isPlainObject(value){if(!isObjectLike(value)||baseGetTag(value)!=objectTag)return!1;var proto=getPrototype(value);if(null===proto)return!0;var Ctor=hasOwnProperty.call(proto,"constructor")&&proto.constructor;return"function"==typeof Ctor&&Ctor instanceof Ctor&&funcToString.call(Ctor)==objectCtorString}function isSafeInteger(value){return isInteger(value)&&value>=-MAX_SAFE_INTEGER&&value<=MAX_SAFE_INTEGER}function isString(value){return"string"==typeof value||!isArray(value)&&isObjectLike(value)&&baseGetTag(value)==stringTag}function isSymbol(value){return"symbol"==typeof value||isObjectLike(value)&&baseGetTag(value)==symbolTag}function isUndefined(value){return value===undefined}function isWeakMap(value){return isObjectLike(value)&&getTag(value)==weakMapTag}function isWeakSet(value){return isObjectLike(value)&&baseGetTag(value)==weakSetTag}function toArray(value){if(!value)return[];if(isArrayLike(value))return isString(value)?stringToArray(value):copyArray(value);if(symIterator&&value[symIterator])return iteratorToArray(value[symIterator]());var tag=getTag(value),func=tag==mapTag?mapToArray:tag==setTag?setToArray:values;return func(value)}function toFinite(value){if(!value)return 0===value?value:0;if(value=toNumber(value),value===INFINITY||value===-INFINITY){var sign=value<0?-1:1;return sign*MAX_INTEGER}return value===value?value:0}function toInteger(value){var result=toFinite(value),remainder=result%1;return result===result?remainder?result-remainder:result:0}function toLength(value){return value?baseClamp(toInteger(value),0,MAX_ARRAY_LENGTH):0}function toNumber(value){if("number"==typeof value)return value;if(isSymbol(value))return NAN;if(isObject(value)){var other="function"==typeof value.valueOf?value.valueOf():value;value=isObject(other)?other+"":other}if("string"!=typeof value)return 0===value?value:+value;value=value.replace(reTrim,"");var isBinary=reIsBinary.test(value);return isBinary||reIsOctal.test(value)?freeParseInt(value.slice(2),isBinary?2:8):reIsBadHex.test(value)?NAN:+value}function toPlainObject(value){return copyObject(value,keysIn(value))}function toSafeInteger(value){return value?baseClamp(toInteger(value),-MAX_SAFE_INTEGER,MAX_SAFE_INTEGER):0===value?value:0}function toString(value){return null==value?"":baseToString(value)}function create(prototype,properties){var result=baseCreate(prototype);return null==properties?result:baseAssign(result,properties)}function findKey(object,predicate){return baseFindKey(object,getIteratee(predicate,3),baseForOwn)}function findLastKey(object,predicate){return baseFindKey(object,getIteratee(predicate,3),baseForOwnRight)}function forIn(object,iteratee){return null==object?object:baseFor(object,getIteratee(iteratee,3),keysIn);
}function forInRight(object,iteratee){return null==object?object:baseForRight(object,getIteratee(iteratee,3),keysIn)}function forOwn(object,iteratee){return object&&baseForOwn(object,getIteratee(iteratee,3))}function forOwnRight(object,iteratee){return object&&baseForOwnRight(object,getIteratee(iteratee,3))}function functions(object){return null==object?[]:baseFunctions(object,keys(object))}function functionsIn(object){return null==object?[]:baseFunctions(object,keysIn(object))}function get(object,path,defaultValue){var result=null==object?undefined:baseGet(object,path);return result===undefined?defaultValue:result}function has(object,path){return null!=object&&hasPath(object,path,baseHas)}function hasIn(object,path){return null!=object&&hasPath(object,path,baseHasIn)}function keys(object){return isArrayLike(object)?arrayLikeKeys(object):baseKeys(object)}function keysIn(object){return isArrayLike(object)?arrayLikeKeys(object,!0):baseKeysIn(object)}function mapKeys(object,iteratee){var result={};return iteratee=getIteratee(iteratee,3),baseForOwn(object,function(value,key,object){baseAssignValue(result,iteratee(value,key,object),value)}),result}function mapValues(object,iteratee){var result={};return iteratee=getIteratee(iteratee,3),baseForOwn(object,function(value,key,object){baseAssignValue(result,key,iteratee(value,key,object))}),result}function omitBy(object,predicate){return pickBy(object,negate(getIteratee(predicate)))}function pickBy(object,predicate){if(null==object)return{};var props=arrayMap(getAllKeysIn(object),function(prop){return[prop]});return predicate=getIteratee(predicate),basePickBy(object,props,function(value,path){return predicate(value,path[0])})}function result(object,path,defaultValue){path=castPath(path,object);var index=-1,length=path.length;for(length||(length=1,object=undefined);++index<length;){var value=null==object?undefined:object[toKey(path[index])];value===undefined&&(index=length,value=defaultValue),object=isFunction(value)?value.call(object):value}return object}function set(object,path,value){return null==object?object:baseSet(object,path,value)}function setWith(object,path,value,customizer){return customizer="function"==typeof customizer?customizer:undefined,null==object?object:baseSet(object,path,value,customizer)}function transform(object,iteratee,accumulator){var isArr=isArray(object),isArrLike=isArr||isBuffer(object)||isTypedArray(object);if(iteratee=getIteratee(iteratee,4),null==accumulator){var Ctor=object&&object.constructor;accumulator=isArrLike?isArr?new Ctor:[]:isObject(object)&&isFunction(Ctor)?baseCreate(getPrototype(object)):{}}return(isArrLike?arrayEach:baseForOwn)(object,function(value,index,object){return iteratee(accumulator,value,index,object)}),accumulator}function unset(object,path){return null==object||baseUnset(object,path)}function update(object,path,updater){return null==object?object:baseUpdate(object,path,castFunction(updater))}function updateWith(object,path,updater,customizer){return customizer="function"==typeof customizer?customizer:undefined,null==object?object:baseUpdate(object,path,castFunction(updater),customizer)}function values(object){return null==object?[]:baseValues(object,keys(object))}function valuesIn(object){return null==object?[]:baseValues(object,keysIn(object))}function clamp(number,lower,upper){return upper===undefined&&(upper=lower,lower=undefined),upper!==undefined&&(upper=toNumber(upper),upper=upper===upper?upper:0),lower!==undefined&&(lower=toNumber(lower),lower=lower===lower?lower:0),baseClamp(toNumber(number),lower,upper)}function inRange(number,start,end){return start=toFinite(start),end===undefined?(end=start,start=0):end=toFinite(end),number=toNumber(number),baseInRange(number,start,end)}function random(lower,upper,floating){if(floating&&"boolean"!=typeof floating&&isIterateeCall(lower,upper,floating)&&(upper=floating=undefined),floating===undefined&&("boolean"==typeof upper?(floating=upper,upper=undefined):"boolean"==typeof lower&&(floating=lower,lower=undefined)),lower===undefined&&upper===undefined?(lower=0,upper=1):(lower=toFinite(lower),upper===undefined?(upper=lower,lower=0):upper=toFinite(upper)),lower>upper){var temp=lower;lower=upper,upper=temp}if(floating||lower%1||upper%1){var rand=nativeRandom();return nativeMin(lower+rand*(upper-lower+freeParseFloat("1e-"+((rand+"").length-1))),upper)}return baseRandom(lower,upper)}function capitalize(string){return upperFirst(toString(string).toLowerCase())}function deburr(string){return string=toString(string),string&&string.replace(reLatin,deburrLetter).replace(reComboMark,"")}function endsWith(string,target,position){string=toString(string),target=baseToString(target);var length=string.length;position=position===undefined?length:baseClamp(toInteger(position),0,length);var end=position;return position-=target.length,position>=0&&string.slice(position,end)==target}function escape(string){return string=toString(string),string&&reHasUnescapedHtml.test(string)?string.replace(reUnescapedHtml,escapeHtmlChar):string}function escapeRegExp(string){return string=toString(string),string&&reHasRegExpChar.test(string)?string.replace(reRegExpChar,"\\$&"):string}function pad(string,length,chars){string=toString(string),length=toInteger(length);var strLength=length?stringSize(string):0;if(!length||strLength>=length)return string;var mid=(length-strLength)/2;return createPadding(nativeFloor(mid),chars)+string+createPadding(nativeCeil(mid),chars)}function padEnd(string,length,chars){string=toString(string),length=toInteger(length);var strLength=length?stringSize(string):0;return length&&strLength<length?string+createPadding(length-strLength,chars):string}function padStart(string,length,chars){string=toString(string),length=toInteger(length);var strLength=length?stringSize(string):0;return length&&strLength<length?createPadding(length-strLength,chars)+string:string}function parseInt(string,radix,guard){return guard||null==radix?radix=0:radix&&(radix=+radix),nativeParseInt(toString(string).replace(reTrimStart,""),radix||0)}function repeat(string,n,guard){return n=(guard?isIterateeCall(string,n,guard):n===undefined)?1:toInteger(n),baseRepeat(toString(string),n)}function replace(){var args=arguments,string=toString(args[0]);return args.length<3?string:string.replace(args[1],args[2])}function split(string,separator,limit){return limit&&"number"!=typeof limit&&isIterateeCall(string,separator,limit)&&(separator=limit=undefined),(limit=limit===undefined?MAX_ARRAY_LENGTH:limit>>>0)?(string=toString(string),string&&("string"==typeof separator||null!=separator&&!isRegExp(separator))&&(separator=baseToString(separator),!separator&&hasUnicode(string))?castSlice(stringToArray(string),0,limit):string.split(separator,limit)):[]}function startsWith(string,target,position){return string=toString(string),position=null==position?0:baseClamp(toInteger(position),0,string.length),target=baseToString(target),string.slice(position,position+target.length)==target}function template(string,options,guard){var settings=lodash.templateSettings;guard&&isIterateeCall(string,options,guard)&&(options=undefined),string=toString(string),options=assignInWith({},options,settings,customDefaultsAssignIn);var isEscaping,isEvaluating,imports=assignInWith({},options.imports,settings.imports,customDefaultsAssignIn),importsKeys=keys(imports),importsValues=baseValues(imports,importsKeys),index=0,interpolate=options.interpolate||reNoMatch,source="__p += '",reDelimiters=RegExp((options.escape||reNoMatch).source+"|"+interpolate.source+"|"+(interpolate===reInterpolate?reEsTemplate:reNoMatch).source+"|"+(options.evaluate||reNoMatch).source+"|$","g"),sourceURL="//# sourceURL="+("sourceURL"in options?options.sourceURL:"lodash.templateSources["+ ++templateCounter+"]")+"\n";string.replace(reDelimiters,function(match,escapeValue,interpolateValue,esTemplateValue,evaluateValue,offset){return interpolateValue||(interpolateValue=esTemplateValue),source+=string.slice(index,offset).replace(reUnescapedString,escapeStringChar),escapeValue&&(isEscaping=!0,source+="' +\n__e("+escapeValue+") +\n'"),evaluateValue&&(isEvaluating=!0,source+="';\n"+evaluateValue+";\n__p += '"),interpolateValue&&(source+="' +\n((__t = ("+interpolateValue+")) == null ? '' : __t) +\n'"),index=offset+match.length,match}),source+="';\n";var variable=options.variable;variable||(source="with (obj) {\n"+source+"\n}\n"),source=(isEvaluating?source.replace(reEmptyStringLeading,""):source).replace(reEmptyStringMiddle,"$1").replace(reEmptyStringTrailing,"$1;"),source="function("+(variable||"obj")+") {\n"+(variable?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(isEscaping?", __e = _.escape":"")+(isEvaluating?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+source+"return __p\n}";var result=attempt(function(){return Function(importsKeys,sourceURL+"return "+source).apply(undefined,importsValues)});if(result.source=source,isError(result))throw result;return result}function toLower(value){return toString(value).toLowerCase()}function toUpper(value){return toString(value).toUpperCase()}function trim(string,chars,guard){if(string=toString(string),string&&(guard||chars===undefined))return string.replace(reTrim,"");if(!string||!(chars=baseToString(chars)))return string;var strSymbols=stringToArray(string),chrSymbols=stringToArray(chars),start=charsStartIndex(strSymbols,chrSymbols),end=charsEndIndex(strSymbols,chrSymbols)+1;return castSlice(strSymbols,start,end).join("")}function trimEnd(string,chars,guard){if(string=toString(string),string&&(guard||chars===undefined))return string.replace(reTrimEnd,"");if(!string||!(chars=baseToString(chars)))return string;var strSymbols=stringToArray(string),end=charsEndIndex(strSymbols,stringToArray(chars))+1;return castSlice(strSymbols,0,end).join("")}function trimStart(string,chars,guard){if(string=toString(string),string&&(guard||chars===undefined))return string.replace(reTrimStart,"");if(!string||!(chars=baseToString(chars)))return string;var strSymbols=stringToArray(string),start=charsStartIndex(strSymbols,stringToArray(chars));return castSlice(strSymbols,start).join("")}function truncate(string,options){var length=DEFAULT_TRUNC_LENGTH,omission=DEFAULT_TRUNC_OMISSION;if(isObject(options)){var separator="separator"in options?options.separator:separator;length="length"in options?toInteger(options.length):length,omission="omission"in options?baseToString(options.omission):omission}string=toString(string);var strLength=string.length;if(hasUnicode(string)){var strSymbols=stringToArray(string);strLength=strSymbols.length}if(length>=strLength)return string;var end=length-stringSize(omission);if(end<1)return omission;var result=strSymbols?castSlice(strSymbols,0,end).join(""):string.slice(0,end);if(separator===undefined)return result+omission;if(strSymbols&&(end+=result.length-end),isRegExp(separator)){if(string.slice(end).search(separator)){var match,substring=result;for(separator.global||(separator=RegExp(separator.source,toString(reFlags.exec(separator))+"g")),separator.lastIndex=0;match=separator.exec(substring);)var newEnd=match.index;result=result.slice(0,newEnd===undefined?end:newEnd)}}else if(string.indexOf(baseToString(separator),end)!=end){var index=result.lastIndexOf(separator);index>-1&&(result=result.slice(0,index))}return result+omission}function unescape(string){return string=toString(string),string&&reHasEscapedHtml.test(string)?string.replace(reEscapedHtml,unescapeHtmlChar):string}function words(string,pattern,guard){return string=toString(string),pattern=guard?undefined:pattern,pattern===undefined?hasUnicodeWord(string)?unicodeWords(string):asciiWords(string):string.match(pattern)||[]}function cond(pairs){var length=null==pairs?0:pairs.length,toIteratee=getIteratee();return pairs=length?arrayMap(pairs,function(pair){if("function"!=typeof pair[1])throw new TypeError(FUNC_ERROR_TEXT);return[toIteratee(pair[0]),pair[1]]}):[],baseRest(function(args){for(var index=-1;++index<length;){var pair=pairs[index];if(apply(pair[0],this,args))return apply(pair[1],this,args)}})}function conforms(source){return baseConforms(baseClone(source,CLONE_DEEP_FLAG))}function constant(value){return function(){return value}}function defaultTo(value,defaultValue){return null==value||value!==value?defaultValue:value}function identity(value){return value}function iteratee(func){return baseIteratee("function"==typeof func?func:baseClone(func,CLONE_DEEP_FLAG))}function matches(source){return baseMatches(baseClone(source,CLONE_DEEP_FLAG))}function matchesProperty(path,srcValue){return baseMatchesProperty(path,baseClone(srcValue,CLONE_DEEP_FLAG))}function mixin(object,source,options){var props=keys(source),methodNames=baseFunctions(source,props);null!=options||isObject(source)&&(methodNames.length||!props.length)||(options=source,source=object,object=this,methodNames=baseFunctions(source,keys(source)));var chain=!(isObject(options)&&"chain"in options&&!options.chain),isFunc=isFunction(object);return arrayEach(methodNames,function(methodName){var func=source[methodName];object[methodName]=func,isFunc&&(object.prototype[methodName]=function(){var chainAll=this.__chain__;if(chain||chainAll){var result=object(this.__wrapped__),actions=result.__actions__=copyArray(this.__actions__);return actions.push({func:func,args:arguments,thisArg:object}),result.__chain__=chainAll,result}return func.apply(object,arrayPush([this.value()],arguments))})}),object}function noConflict(){return root._===this&&(root._=oldDash),this}function noop(){}function nthArg(n){return n=toInteger(n),baseRest(function(args){return baseNth(args,n)})}function property(path){return isKey(path)?baseProperty(toKey(path)):basePropertyDeep(path)}function propertyOf(object){return function(path){return null==object?undefined:baseGet(object,path)}}function stubArray(){return[]}function stubFalse(){return!1}function stubObject(){return{}}function stubString(){return""}function stubTrue(){return!0}function times(n,iteratee){if(n=toInteger(n),n<1||n>MAX_SAFE_INTEGER)return[];var index=MAX_ARRAY_LENGTH,length=nativeMin(n,MAX_ARRAY_LENGTH);iteratee=getIteratee(iteratee),n-=MAX_ARRAY_LENGTH;for(var result=baseTimes(length,iteratee);++index<n;)iteratee(index);return result}function toPath(value){return isArray(value)?arrayMap(value,toKey):isSymbol(value)?[value]:copyArray(stringToPath(toString(value)))}function uniqueId(prefix){var id=++idCounter;return toString(prefix)+id}function max(array){return array&&array.length?baseExtremum(array,identity,baseGt):undefined}function maxBy(array,iteratee){return array&&array.length?baseExtremum(array,getIteratee(iteratee,2),baseGt):undefined}function mean(array){return baseMean(array,identity)}function meanBy(array,iteratee){return baseMean(array,getIteratee(iteratee,2))}function min(array){return array&&array.length?baseExtremum(array,identity,baseLt):undefined}function minBy(array,iteratee){return array&&array.length?baseExtremum(array,getIteratee(iteratee,2),baseLt):undefined}function sum(array){return array&&array.length?baseSum(array,identity):0}function sumBy(array,iteratee){return array&&array.length?baseSum(array,getIteratee(iteratee,2)):0}context=null==context?root:_.defaults(root.Object(),context,_.pick(root,contextProps));var Array=context.Array,Date=context.Date,Error=context.Error,Function=context.Function,Math=context.Math,Object=context.Object,RegExp=context.RegExp,String=context.String,TypeError=context.TypeError,arrayProto=Array.prototype,funcProto=Function.prototype,objectProto=Object.prototype,coreJsData=context["__core-js_shared__"],funcToString=funcProto.toString,hasOwnProperty=objectProto.hasOwnProperty,idCounter=0,maskSrcKey=function(){var uid=/[^.]+$/.exec(coreJsData&&coreJsData.keys&&coreJsData.keys.IE_PROTO||"");return uid?"Symbol(src)_1."+uid:""}(),nativeObjectToString=objectProto.toString,objectCtorString=funcToString.call(Object),oldDash=root._,reIsNative=RegExp("^"+funcToString.call(hasOwnProperty).replace(reRegExpChar,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Buffer=moduleExports?context.Buffer:undefined,Symbol=context.Symbol,Uint8Array=context.Uint8Array,allocUnsafe=Buffer?Buffer.allocUnsafe:undefined,getPrototype=overArg(Object.getPrototypeOf,Object),objectCreate=Object.create,propertyIsEnumerable=objectProto.propertyIsEnumerable,splice=arrayProto.splice,spreadableSymbol=Symbol?Symbol.isConcatSpreadable:undefined,symIterator=Symbol?Symbol.iterator:undefined,symToStringTag=Symbol?Symbol.toStringTag:undefined,defineProperty=function(){try{var func=getNative(Object,"defineProperty");return func({},"",{}),func}catch(e){}}(),ctxClearTimeout=context.clearTimeout!==root.clearTimeout&&context.clearTimeout,ctxNow=Date&&Date.now!==root.Date.now&&Date.now,ctxSetTimeout=context.setTimeout!==root.setTimeout&&context.setTimeout,nativeCeil=Math.ceil,nativeFloor=Math.floor,nativeGetSymbols=Object.getOwnPropertySymbols,nativeIsBuffer=Buffer?Buffer.isBuffer:undefined,nativeIsFinite=context.isFinite,nativeJoin=arrayProto.join,nativeKeys=overArg(Object.keys,Object),nativeMax=Math.max,nativeMin=Math.min,nativeNow=Date.now,nativeParseInt=context.parseInt,nativeRandom=Math.random,nativeReverse=arrayProto.reverse,DataView=getNative(context,"DataView"),Map=getNative(context,"Map"),Promise=getNative(context,"Promise"),Set=getNative(context,"Set"),WeakMap=getNative(context,"WeakMap"),nativeCreate=getNative(Object,"create"),metaMap=WeakMap&&new WeakMap,realNames={},dataViewCtorString=toSource(DataView),mapCtorString=toSource(Map),promiseCtorString=toSource(Promise),setCtorString=toSource(Set),weakMapCtorString=toSource(WeakMap),symbolProto=Symbol?Symbol.prototype:undefined,symbolValueOf=symbolProto?symbolProto.valueOf:undefined,symbolToString=symbolProto?symbolProto.toString:undefined,baseCreate=function(){function object(){}return function(proto){if(!isObject(proto))return{};if(objectCreate)return objectCreate(proto);object.prototype=proto;var result=new object;return object.prototype=undefined,result}}();lodash.templateSettings={escape:reEscape,evaluate:reEvaluate,interpolate:reInterpolate,variable:"",imports:{_:lodash}},lodash.prototype=baseLodash.prototype,lodash.prototype.constructor=lodash,LodashWrapper.prototype=baseCreate(baseLodash.prototype),LodashWrapper.prototype.constructor=LodashWrapper,LazyWrapper.prototype=baseCreate(baseLodash.prototype),LazyWrapper.prototype.constructor=LazyWrapper,Hash.prototype.clear=hashClear,Hash.prototype["delete"]=hashDelete,Hash.prototype.get=hashGet,Hash.prototype.has=hashHas,Hash.prototype.set=hashSet,ListCache.prototype.clear=listCacheClear,ListCache.prototype["delete"]=listCacheDelete,ListCache.prototype.get=listCacheGet,ListCache.prototype.has=listCacheHas,ListCache.prototype.set=listCacheSet,MapCache.prototype.clear=mapCacheClear,MapCache.prototype["delete"]=mapCacheDelete,MapCache.prototype.get=mapCacheGet,MapCache.prototype.has=mapCacheHas,MapCache.prototype.set=mapCacheSet,SetCache.prototype.add=SetCache.prototype.push=setCacheAdd,SetCache.prototype.has=setCacheHas,Stack.prototype.clear=stackClear,Stack.prototype["delete"]=stackDelete,Stack.prototype.get=stackGet,Stack.prototype.has=stackHas,Stack.prototype.set=stackSet;var baseEach=createBaseEach(baseForOwn),baseEachRight=createBaseEach(baseForOwnRight,!0),baseFor=createBaseFor(),baseForRight=createBaseFor(!0),baseSetData=metaMap?function(func,data){return metaMap.set(func,data),func}:identity,baseSetToString=defineProperty?function(func,string){return defineProperty(func,"toString",{configurable:!0,enumerable:!1,value:constant(string),writable:!0})}:identity,castRest=baseRest,clearTimeout=ctxClearTimeout||function(id){return root.clearTimeout(id)},createSet=Set&&1/setToArray(new Set([,-0]))[1]==INFINITY?function(values){return new Set(values)}:noop,getData=metaMap?function(func){return metaMap.get(func)}:noop,getSymbols=nativeGetSymbols?function(object){return null==object?[]:(object=Object(object),arrayFilter(nativeGetSymbols(object),function(symbol){return propertyIsEnumerable.call(object,symbol)}))}:stubArray,getSymbolsIn=nativeGetSymbols?function(object){for(var result=[];object;)arrayPush(result,getSymbols(object)),object=getPrototype(object);return result}:stubArray,getTag=baseGetTag;(DataView&&getTag(new DataView(new ArrayBuffer(1)))!=dataViewTag||Map&&getTag(new Map)!=mapTag||Promise&&getTag(Promise.resolve())!=promiseTag||Set&&getTag(new Set)!=setTag||WeakMap&&getTag(new WeakMap)!=weakMapTag)&&(getTag=function(value){var result=baseGetTag(value),Ctor=result==objectTag?value.constructor:undefined,ctorString=Ctor?toSource(Ctor):"";if(ctorString)switch(ctorString){case dataViewCtorString:return dataViewTag;case mapCtorString:return mapTag;case promiseCtorString:return promiseTag;case setCtorString:return setTag;case weakMapCtorString:return weakMapTag}return result});var isMaskable=coreJsData?isFunction:stubFalse,setData=shortOut(baseSetData),setTimeout=ctxSetTimeout||function(func,wait){return root.setTimeout(func,wait)},setToString=shortOut(baseSetToString),stringToPath=memoizeCapped(function(string){var result=[];return reLeadingDot.test(string)&&result.push(""),string.replace(rePropName,function(match,number,quote,string){result.push(quote?string.replace(reEscapeChar,"$1"):number||match)}),result}),difference=baseRest(function(array,values){return isArrayLikeObject(array)?baseDifference(array,baseFlatten(values,1,isArrayLikeObject,!0)):[]}),differenceBy=baseRest(function(array,values){var iteratee=last(values);return isArrayLikeObject(iteratee)&&(iteratee=undefined),isArrayLikeObject(array)?baseDifference(array,baseFlatten(values,1,isArrayLikeObject,!0),getIteratee(iteratee,2)):[]}),differenceWith=baseRest(function(array,values){var comparator=last(values);return isArrayLikeObject(comparator)&&(comparator=undefined),isArrayLikeObject(array)?baseDifference(array,baseFlatten(values,1,isArrayLikeObject,!0),undefined,comparator):[]}),intersection=baseRest(function(arrays){var mapped=arrayMap(arrays,castArrayLikeObject);return mapped.length&&mapped[0]===arrays[0]?baseIntersection(mapped):[]}),intersectionBy=baseRest(function(arrays){var iteratee=last(arrays),mapped=arrayMap(arrays,castArrayLikeObject);return iteratee===last(mapped)?iteratee=undefined:mapped.pop(),mapped.length&&mapped[0]===arrays[0]?baseIntersection(mapped,getIteratee(iteratee,2)):[]}),intersectionWith=baseRest(function(arrays){var comparator=last(arrays),mapped=arrayMap(arrays,castArrayLikeObject);return comparator="function"==typeof comparator?comparator:undefined,comparator&&mapped.pop(),mapped.length&&mapped[0]===arrays[0]?baseIntersection(mapped,undefined,comparator):[]}),pull=baseRest(pullAll),pullAt=flatRest(function(array,indexes){var length=null==array?0:array.length,result=baseAt(array,indexes);return basePullAt(array,arrayMap(indexes,function(index){return isIndex(index,length)?+index:index}).sort(compareAscending)),result}),union=baseRest(function(arrays){return baseUniq(baseFlatten(arrays,1,isArrayLikeObject,!0))}),unionBy=baseRest(function(arrays){var iteratee=last(arrays);return isArrayLikeObject(iteratee)&&(iteratee=undefined),baseUniq(baseFlatten(arrays,1,isArrayLikeObject,!0),getIteratee(iteratee,2))}),unionWith=baseRest(function(arrays){var comparator=last(arrays);return comparator="function"==typeof comparator?comparator:undefined,baseUniq(baseFlatten(arrays,1,isArrayLikeObject,!0),undefined,comparator)}),without=baseRest(function(array,values){return isArrayLikeObject(array)?baseDifference(array,values):[]}),xor=baseRest(function(arrays){return baseXor(arrayFilter(arrays,isArrayLikeObject))}),xorBy=baseRest(function(arrays){var iteratee=last(arrays);return isArrayLikeObject(iteratee)&&(iteratee=undefined),baseXor(arrayFilter(arrays,isArrayLikeObject),getIteratee(iteratee,2))}),xorWith=baseRest(function(arrays){var comparator=last(arrays);return comparator="function"==typeof comparator?comparator:undefined,baseXor(arrayFilter(arrays,isArrayLikeObject),undefined,comparator)}),zip=baseRest(unzip),zipWith=baseRest(function(arrays){var length=arrays.length,iteratee=length>1?arrays[length-1]:undefined;return iteratee="function"==typeof iteratee?(arrays.pop(),iteratee):undefined,unzipWith(arrays,iteratee)}),wrapperAt=flatRest(function(paths){var length=paths.length,start=length?paths[0]:0,value=this.__wrapped__,interceptor=function(object){return baseAt(object,paths)};return!(length>1||this.__actions__.length)&&value instanceof LazyWrapper&&isIndex(start)?(value=value.slice(start,+start+(length?1:0)),value.__actions__.push({func:thru,args:[interceptor],thisArg:undefined}),new LodashWrapper(value,this.__chain__).thru(function(array){return length&&!array.length&&array.push(undefined),array})):this.thru(interceptor)}),countBy=createAggregator(function(result,value,key){hasOwnProperty.call(result,key)?++result[key]:baseAssignValue(result,key,1)}),find=createFind(findIndex),findLast=createFind(findLastIndex),groupBy=createAggregator(function(result,value,key){hasOwnProperty.call(result,key)?result[key].push(value):baseAssignValue(result,key,[value])}),invokeMap=baseRest(function(collection,path,args){var index=-1,isFunc="function"==typeof path,result=isArrayLike(collection)?Array(collection.length):[];return baseEach(collection,function(value){result[++index]=isFunc?apply(path,value,args):baseInvoke(value,path,args)}),result}),keyBy=createAggregator(function(result,value,key){baseAssignValue(result,key,value)}),partition=createAggregator(function(result,value,key){result[key?0:1].push(value)},function(){return[[],[]]}),sortBy=baseRest(function(collection,iteratees){if(null==collection)return[];var length=iteratees.length;return length>1&&isIterateeCall(collection,iteratees[0],iteratees[1])?iteratees=[]:length>2&&isIterateeCall(iteratees[0],iteratees[1],iteratees[2])&&(iteratees=[iteratees[0]]),baseOrderBy(collection,baseFlatten(iteratees,1),[])}),now=ctxNow||function(){return root.Date.now()},bind=baseRest(function(func,thisArg,partials){var bitmask=WRAP_BIND_FLAG;if(partials.length){var holders=replaceHolders(partials,getHolder(bind));bitmask|=WRAP_PARTIAL_FLAG}return createWrap(func,bitmask,thisArg,partials,holders)}),bindKey=baseRest(function(object,key,partials){var bitmask=WRAP_BIND_FLAG|WRAP_BIND_KEY_FLAG;if(partials.length){var holders=replaceHolders(partials,getHolder(bindKey));bitmask|=WRAP_PARTIAL_FLAG}return createWrap(key,bitmask,object,partials,holders)}),defer=baseRest(function(func,args){return baseDelay(func,1,args)}),delay=baseRest(function(func,wait,args){return baseDelay(func,toNumber(wait)||0,args)});memoize.Cache=MapCache;var overArgs=castRest(function(func,transforms){transforms=1==transforms.length&&isArray(transforms[0])?arrayMap(transforms[0],baseUnary(getIteratee())):arrayMap(baseFlatten(transforms,1),baseUnary(getIteratee()));var funcsLength=transforms.length;return baseRest(function(args){for(var index=-1,length=nativeMin(args.length,funcsLength);++index<length;)args[index]=transforms[index].call(this,args[index]);return apply(func,this,args)})}),partial=baseRest(function(func,partials){var holders=replaceHolders(partials,getHolder(partial));return createWrap(func,WRAP_PARTIAL_FLAG,undefined,partials,holders)}),partialRight=baseRest(function(func,partials){var holders=replaceHolders(partials,getHolder(partialRight));return createWrap(func,WRAP_PARTIAL_RIGHT_FLAG,undefined,partials,holders)}),rearg=flatRest(function(func,indexes){return createWrap(func,WRAP_REARG_FLAG,undefined,undefined,undefined,indexes)}),gt=createRelationalOperation(baseGt),gte=createRelationalOperation(function(value,other){return value>=other}),isArguments=baseIsArguments(function(){return arguments}())?baseIsArguments:function(value){return isObjectLike(value)&&hasOwnProperty.call(value,"callee")&&!propertyIsEnumerable.call(value,"callee")},isArray=Array.isArray,isArrayBuffer=nodeIsArrayBuffer?baseUnary(nodeIsArrayBuffer):baseIsArrayBuffer,isBuffer=nativeIsBuffer||stubFalse,isDate=nodeIsDate?baseUnary(nodeIsDate):baseIsDate,isMap=nodeIsMap?baseUnary(nodeIsMap):baseIsMap,isRegExp=nodeIsRegExp?baseUnary(nodeIsRegExp):baseIsRegExp,isSet=nodeIsSet?baseUnary(nodeIsSet):baseIsSet,isTypedArray=nodeIsTypedArray?baseUnary(nodeIsTypedArray):baseIsTypedArray,lt=createRelationalOperation(baseLt),lte=createRelationalOperation(function(value,other){return value<=other}),assign=createAssigner(function(object,source){if(isPrototype(source)||isArrayLike(source))return void copyObject(source,keys(source),object);for(var key in source)hasOwnProperty.call(source,key)&&assignValue(object,key,source[key])}),assignIn=createAssigner(function(object,source){copyObject(source,keysIn(source),object)}),assignInWith=createAssigner(function(object,source,srcIndex,customizer){copyObject(source,keysIn(source),object,customizer)}),assignWith=createAssigner(function(object,source,srcIndex,customizer){copyObject(source,keys(source),object,customizer)}),at=flatRest(baseAt),defaults=baseRest(function(args){return args.push(undefined,customDefaultsAssignIn),apply(assignInWith,undefined,args)}),defaultsDeep=baseRest(function(args){return args.push(undefined,customDefaultsMerge),apply(mergeWith,undefined,args)}),invert=createInverter(function(result,value,key){result[value]=key},constant(identity)),invertBy=createInverter(function(result,value,key){hasOwnProperty.call(result,value)?result[value].push(key):result[value]=[key]},getIteratee),invoke=baseRest(baseInvoke),merge=createAssigner(function(object,source,srcIndex){baseMerge(object,source,srcIndex)}),mergeWith=createAssigner(function(object,source,srcIndex,customizer){baseMerge(object,source,srcIndex,customizer)}),omit=flatRest(function(object,paths){var result={};if(null==object)return result;var isDeep=!1;paths=arrayMap(paths,function(path){return path=castPath(path,object),isDeep||(isDeep=path.length>1),path}),copyObject(object,getAllKeysIn(object),result),isDeep&&(result=baseClone(result,CLONE_DEEP_FLAG|CLONE_FLAT_FLAG|CLONE_SYMBOLS_FLAG,customOmitClone));for(var length=paths.length;length--;)baseUnset(result,paths[length]);return result}),pick=flatRest(function(object,paths){return null==object?{}:basePick(object,paths)}),toPairs=createToPairs(keys),toPairsIn=createToPairs(keysIn),camelCase=createCompounder(function(result,word,index){return word=word.toLowerCase(),result+(index?capitalize(word):word)}),kebabCase=createCompounder(function(result,word,index){return result+(index?"-":"")+word.toLowerCase()}),lowerCase=createCompounder(function(result,word,index){return result+(index?" ":"")+word.toLowerCase()}),lowerFirst=createCaseFirst("toLowerCase"),snakeCase=createCompounder(function(result,word,index){return result+(index?"_":"")+word.toLowerCase()}),startCase=createCompounder(function(result,word,index){return result+(index?" ":"")+upperFirst(word)}),upperCase=createCompounder(function(result,word,index){return result+(index?" ":"")+word.toUpperCase()}),upperFirst=createCaseFirst("toUpperCase"),attempt=baseRest(function(func,args){try{return apply(func,undefined,args)}catch(e){return isError(e)?e:new Error(e)}}),bindAll=flatRest(function(object,methodNames){return arrayEach(methodNames,function(key){key=toKey(key),baseAssignValue(object,key,bind(object[key],object))}),object}),flow=createFlow(),flowRight=createFlow(!0),method=baseRest(function(path,args){return function(object){return baseInvoke(object,path,args)}}),methodOf=baseRest(function(object,args){return function(path){return baseInvoke(object,path,args)}}),over=createOver(arrayMap),overEvery=createOver(arrayEvery),overSome=createOver(arraySome),range=createRange(),rangeRight=createRange(!0),add=createMathOperation(function(augend,addend){return augend+addend},0),ceil=createRound("ceil"),divide=createMathOperation(function(dividend,divisor){return dividend/divisor},1),floor=createRound("floor"),multiply=createMathOperation(function(multiplier,multiplicand){return multiplier*multiplicand},1),round=createRound("round"),subtract=createMathOperation(function(minuend,subtrahend){
return minuend-subtrahend},0);return lodash.after=after,lodash.ary=ary,lodash.assign=assign,lodash.assignIn=assignIn,lodash.assignInWith=assignInWith,lodash.assignWith=assignWith,lodash.at=at,lodash.before=before,lodash.bind=bind,lodash.bindAll=bindAll,lodash.bindKey=bindKey,lodash.castArray=castArray,lodash.chain=chain,lodash.chunk=chunk,lodash.compact=compact,lodash.concat=concat,lodash.cond=cond,lodash.conforms=conforms,lodash.constant=constant,lodash.countBy=countBy,lodash.create=create,lodash.curry=curry,lodash.curryRight=curryRight,lodash.debounce=debounce,lodash.defaults=defaults,lodash.defaultsDeep=defaultsDeep,lodash.defer=defer,lodash.delay=delay,lodash.difference=difference,lodash.differenceBy=differenceBy,lodash.differenceWith=differenceWith,lodash.drop=drop,lodash.dropRight=dropRight,lodash.dropRightWhile=dropRightWhile,lodash.dropWhile=dropWhile,lodash.fill=fill,lodash.filter=filter,lodash.flatMap=flatMap,lodash.flatMapDeep=flatMapDeep,lodash.flatMapDepth=flatMapDepth,lodash.flatten=flatten,lodash.flattenDeep=flattenDeep,lodash.flattenDepth=flattenDepth,lodash.flip=flip,lodash.flow=flow,lodash.flowRight=flowRight,lodash.fromPairs=fromPairs,lodash.functions=functions,lodash.functionsIn=functionsIn,lodash.groupBy=groupBy,lodash.initial=initial,lodash.intersection=intersection,lodash.intersectionBy=intersectionBy,lodash.intersectionWith=intersectionWith,lodash.invert=invert,lodash.invertBy=invertBy,lodash.invokeMap=invokeMap,lodash.iteratee=iteratee,lodash.keyBy=keyBy,lodash.keys=keys,lodash.keysIn=keysIn,lodash.map=map,lodash.mapKeys=mapKeys,lodash.mapValues=mapValues,lodash.matches=matches,lodash.matchesProperty=matchesProperty,lodash.memoize=memoize,lodash.merge=merge,lodash.mergeWith=mergeWith,lodash.method=method,lodash.methodOf=methodOf,lodash.mixin=mixin,lodash.negate=negate,lodash.nthArg=nthArg,lodash.omit=omit,lodash.omitBy=omitBy,lodash.once=once,lodash.orderBy=orderBy,lodash.over=over,lodash.overArgs=overArgs,lodash.overEvery=overEvery,lodash.overSome=overSome,lodash.partial=partial,lodash.partialRight=partialRight,lodash.partition=partition,lodash.pick=pick,lodash.pickBy=pickBy,lodash.property=property,lodash.propertyOf=propertyOf,lodash.pull=pull,lodash.pullAll=pullAll,lodash.pullAllBy=pullAllBy,lodash.pullAllWith=pullAllWith,lodash.pullAt=pullAt,lodash.range=range,lodash.rangeRight=rangeRight,lodash.rearg=rearg,lodash.reject=reject,lodash.remove=remove,lodash.rest=rest,lodash.reverse=reverse,lodash.sampleSize=sampleSize,lodash.set=set,lodash.setWith=setWith,lodash.shuffle=shuffle,lodash.slice=slice,lodash.sortBy=sortBy,lodash.sortedUniq=sortedUniq,lodash.sortedUniqBy=sortedUniqBy,lodash.split=split,lodash.spread=spread,lodash.tail=tail,lodash.take=take,lodash.takeRight=takeRight,lodash.takeRightWhile=takeRightWhile,lodash.takeWhile=takeWhile,lodash.tap=tap,lodash.throttle=throttle,lodash.thru=thru,lodash.toArray=toArray,lodash.toPairs=toPairs,lodash.toPairsIn=toPairsIn,lodash.toPath=toPath,lodash.toPlainObject=toPlainObject,lodash.transform=transform,lodash.unary=unary,lodash.union=union,lodash.unionBy=unionBy,lodash.unionWith=unionWith,lodash.uniq=uniq,lodash.uniqBy=uniqBy,lodash.uniqWith=uniqWith,lodash.unset=unset,lodash.unzip=unzip,lodash.unzipWith=unzipWith,lodash.update=update,lodash.updateWith=updateWith,lodash.values=values,lodash.valuesIn=valuesIn,lodash.without=without,lodash.words=words,lodash.wrap=wrap,lodash.xor=xor,lodash.xorBy=xorBy,lodash.xorWith=xorWith,lodash.zip=zip,lodash.zipObject=zipObject,lodash.zipObjectDeep=zipObjectDeep,lodash.zipWith=zipWith,lodash.entries=toPairs,lodash.entriesIn=toPairsIn,lodash.extend=assignIn,lodash.extendWith=assignInWith,mixin(lodash,lodash),lodash.add=add,lodash.attempt=attempt,lodash.camelCase=camelCase,lodash.capitalize=capitalize,lodash.ceil=ceil,lodash.clamp=clamp,lodash.clone=clone,lodash.cloneDeep=cloneDeep,lodash.cloneDeepWith=cloneDeepWith,lodash.cloneWith=cloneWith,lodash.conformsTo=conformsTo,lodash.deburr=deburr,lodash.defaultTo=defaultTo,lodash.divide=divide,lodash.endsWith=endsWith,lodash.eq=eq,lodash.escape=escape,lodash.escapeRegExp=escapeRegExp,lodash.every=every,lodash.find=find,lodash.findIndex=findIndex,lodash.findKey=findKey,lodash.findLast=findLast,lodash.findLastIndex=findLastIndex,lodash.findLastKey=findLastKey,lodash.floor=floor,lodash.forEach=forEach,lodash.forEachRight=forEachRight,lodash.forIn=forIn,lodash.forInRight=forInRight,lodash.forOwn=forOwn,lodash.forOwnRight=forOwnRight,lodash.get=get,lodash.gt=gt,lodash.gte=gte,lodash.has=has,lodash.hasIn=hasIn,lodash.head=head,lodash.identity=identity,lodash.includes=includes,lodash.indexOf=indexOf,lodash.inRange=inRange,lodash.invoke=invoke,lodash.isArguments=isArguments,lodash.isArray=isArray,lodash.isArrayBuffer=isArrayBuffer,lodash.isArrayLike=isArrayLike,lodash.isArrayLikeObject=isArrayLikeObject,lodash.isBoolean=isBoolean,lodash.isBuffer=isBuffer,lodash.isDate=isDate,lodash.isElement=isElement,lodash.isEmpty=isEmpty,lodash.isEqual=isEqual,lodash.isEqualWith=isEqualWith,lodash.isError=isError,lodash.isFinite=isFinite,lodash.isFunction=isFunction,lodash.isInteger=isInteger,lodash.isLength=isLength,lodash.isMap=isMap,lodash.isMatch=isMatch,lodash.isMatchWith=isMatchWith,lodash.isNaN=isNaN,lodash.isNative=isNative,lodash.isNil=isNil,lodash.isNull=isNull,lodash.isNumber=isNumber,lodash.isObject=isObject,lodash.isObjectLike=isObjectLike,lodash.isPlainObject=isPlainObject,lodash.isRegExp=isRegExp,lodash.isSafeInteger=isSafeInteger,lodash.isSet=isSet,lodash.isString=isString,lodash.isSymbol=isSymbol,lodash.isTypedArray=isTypedArray,lodash.isUndefined=isUndefined,lodash.isWeakMap=isWeakMap,lodash.isWeakSet=isWeakSet,lodash.join=join,lodash.kebabCase=kebabCase,lodash.last=last,lodash.lastIndexOf=lastIndexOf,lodash.lowerCase=lowerCase,lodash.lowerFirst=lowerFirst,lodash.lt=lt,lodash.lte=lte,lodash.max=max,lodash.maxBy=maxBy,lodash.mean=mean,lodash.meanBy=meanBy,lodash.min=min,lodash.minBy=minBy,lodash.stubArray=stubArray,lodash.stubFalse=stubFalse,lodash.stubObject=stubObject,lodash.stubString=stubString,lodash.stubTrue=stubTrue,lodash.multiply=multiply,lodash.nth=nth,lodash.noConflict=noConflict,lodash.noop=noop,lodash.now=now,lodash.pad=pad,lodash.padEnd=padEnd,lodash.padStart=padStart,lodash.parseInt=parseInt,lodash.random=random,lodash.reduce=reduce,lodash.reduceRight=reduceRight,lodash.repeat=repeat,lodash.replace=replace,lodash.result=result,lodash.round=round,lodash.runInContext=runInContext,lodash.sample=sample,lodash.size=size,lodash.snakeCase=snakeCase,lodash.some=some,lodash.sortedIndex=sortedIndex,lodash.sortedIndexBy=sortedIndexBy,lodash.sortedIndexOf=sortedIndexOf,lodash.sortedLastIndex=sortedLastIndex,lodash.sortedLastIndexBy=sortedLastIndexBy,lodash.sortedLastIndexOf=sortedLastIndexOf,lodash.startCase=startCase,lodash.startsWith=startsWith,lodash.subtract=subtract,lodash.sum=sum,lodash.sumBy=sumBy,lodash.template=template,lodash.times=times,lodash.toFinite=toFinite,lodash.toInteger=toInteger,lodash.toLength=toLength,lodash.toLower=toLower,lodash.toNumber=toNumber,lodash.toSafeInteger=toSafeInteger,lodash.toString=toString,lodash.toUpper=toUpper,lodash.trim=trim,lodash.trimEnd=trimEnd,lodash.trimStart=trimStart,lodash.truncate=truncate,lodash.unescape=unescape,lodash.uniqueId=uniqueId,lodash.upperCase=upperCase,lodash.upperFirst=upperFirst,lodash.each=forEach,lodash.eachRight=forEachRight,lodash.first=head,mixin(lodash,function(){var source={};return baseForOwn(lodash,function(func,methodName){hasOwnProperty.call(lodash.prototype,methodName)||(source[methodName]=func)}),source}(),{chain:!1}),lodash.VERSION=VERSION,arrayEach(["bind","bindKey","curry","curryRight","partial","partialRight"],function(methodName){lodash[methodName].placeholder=lodash}),arrayEach(["drop","take"],function(methodName,index){LazyWrapper.prototype[methodName]=function(n){n=n===undefined?1:nativeMax(toInteger(n),0);var result=this.__filtered__&&!index?new LazyWrapper(this):this.clone();return result.__filtered__?result.__takeCount__=nativeMin(n,result.__takeCount__):result.__views__.push({size:nativeMin(n,MAX_ARRAY_LENGTH),type:methodName+(result.__dir__<0?"Right":"")}),result},LazyWrapper.prototype[methodName+"Right"]=function(n){return this.reverse()[methodName](n).reverse()}}),arrayEach(["filter","map","takeWhile"],function(methodName,index){var type=index+1,isFilter=type==LAZY_FILTER_FLAG||type==LAZY_WHILE_FLAG;LazyWrapper.prototype[methodName]=function(iteratee){var result=this.clone();return result.__iteratees__.push({iteratee:getIteratee(iteratee,3),type:type}),result.__filtered__=result.__filtered__||isFilter,result}}),arrayEach(["head","last"],function(methodName,index){var takeName="take"+(index?"Right":"");LazyWrapper.prototype[methodName]=function(){return this[takeName](1).value()[0]}}),arrayEach(["initial","tail"],function(methodName,index){var dropName="drop"+(index?"":"Right");LazyWrapper.prototype[methodName]=function(){return this.__filtered__?new LazyWrapper(this):this[dropName](1)}}),LazyWrapper.prototype.compact=function(){return this.filter(identity)},LazyWrapper.prototype.find=function(predicate){return this.filter(predicate).head()},LazyWrapper.prototype.findLast=function(predicate){return this.reverse().find(predicate)},LazyWrapper.prototype.invokeMap=baseRest(function(path,args){return"function"==typeof path?new LazyWrapper(this):this.map(function(value){return baseInvoke(value,path,args)})}),LazyWrapper.prototype.reject=function(predicate){return this.filter(negate(getIteratee(predicate)))},LazyWrapper.prototype.slice=function(start,end){start=toInteger(start);var result=this;return result.__filtered__&&(start>0||end<0)?new LazyWrapper(result):(start<0?result=result.takeRight(-start):start&&(result=result.drop(start)),end!==undefined&&(end=toInteger(end),result=end<0?result.dropRight(-end):result.take(end-start)),result)},LazyWrapper.prototype.takeRightWhile=function(predicate){return this.reverse().takeWhile(predicate).reverse()},LazyWrapper.prototype.toArray=function(){return this.take(MAX_ARRAY_LENGTH)},baseForOwn(LazyWrapper.prototype,function(func,methodName){var checkIteratee=/^(?:filter|find|map|reject)|While$/.test(methodName),isTaker=/^(?:head|last)$/.test(methodName),lodashFunc=lodash[isTaker?"take"+("last"==methodName?"Right":""):methodName],retUnwrapped=isTaker||/^find/.test(methodName);lodashFunc&&(lodash.prototype[methodName]=function(){var value=this.__wrapped__,args=isTaker?[1]:arguments,isLazy=value instanceof LazyWrapper,iteratee=args[0],useLazy=isLazy||isArray(value),interceptor=function(value){var result=lodashFunc.apply(lodash,arrayPush([value],args));return isTaker&&chainAll?result[0]:result};useLazy&&checkIteratee&&"function"==typeof iteratee&&1!=iteratee.length&&(isLazy=useLazy=!1);var chainAll=this.__chain__,isHybrid=!!this.__actions__.length,isUnwrapped=retUnwrapped&&!chainAll,onlyLazy=isLazy&&!isHybrid;if(!retUnwrapped&&useLazy){value=onlyLazy?value:new LazyWrapper(this);var result=func.apply(value,args);return result.__actions__.push({func:thru,args:[interceptor],thisArg:undefined}),new LodashWrapper(result,chainAll)}return isUnwrapped&&onlyLazy?func.apply(this,args):(result=this.thru(interceptor),isUnwrapped?isTaker?result.value()[0]:result.value():result)})}),arrayEach(["pop","push","shift","sort","splice","unshift"],function(methodName){var func=arrayProto[methodName],chainName=/^(?:push|sort|unshift)$/.test(methodName)?"tap":"thru",retUnwrapped=/^(?:pop|shift)$/.test(methodName);lodash.prototype[methodName]=function(){var args=arguments;if(retUnwrapped&&!this.__chain__){var value=this.value();return func.apply(isArray(value)?value:[],args)}return this[chainName](function(value){return func.apply(isArray(value)?value:[],args)})}}),baseForOwn(LazyWrapper.prototype,function(func,methodName){var lodashFunc=lodash[methodName];if(lodashFunc){var key=lodashFunc.name+"",names=realNames[key]||(realNames[key]=[]);names.push({name:methodName,func:lodashFunc})}}),realNames[createHybrid(undefined,WRAP_BIND_KEY_FLAG).name]=[{name:"wrapper",func:undefined}],LazyWrapper.prototype.clone=lazyClone,LazyWrapper.prototype.reverse=lazyReverse,LazyWrapper.prototype.value=lazyValue,lodash.prototype.at=wrapperAt,lodash.prototype.chain=wrapperChain,lodash.prototype.commit=wrapperCommit,lodash.prototype.next=wrapperNext,lodash.prototype.plant=wrapperPlant,lodash.prototype.reverse=wrapperReverse,lodash.prototype.toJSON=lodash.prototype.valueOf=lodash.prototype.value=wrapperValue,lodash.prototype.first=lodash.prototype.head,symIterator&&(lodash.prototype[symIterator]=wrapperToIterator),lodash},_=runInContext();root._=_,__WEBPACK_AMD_DEFINE_RESULT__=function(){return _}.call(exports,__webpack_require__,exports,module),!(__WEBPACK_AMD_DEFINE_RESULT__!==undefined&&(module.exports=__WEBPACK_AMD_DEFINE_RESULT__))}).call(this)}).call(exports,__webpack_require__(4),__webpack_require__(41)(module))},,,function(module,exports,__webpack_require__){!function(root,pluralize){module.exports=pluralize()}(this,function(){function toTitleCase(str){return str.charAt(0).toUpperCase()+str.substr(1).toLowerCase()}function sanitizeRule(rule){return"string"==typeof rule?new RegExp("^"+rule+"$","i"):rule}function restoreCase(word,token){return word===token?token:word===word.toUpperCase()?token.toUpperCase():word[0]===word[0].toUpperCase()?toTitleCase(token):token.toLowerCase()}function interpolate(str,args){return str.replace(/\$(\d{1,2})/g,function(match,index){return args[index]||""})}function sanitizeWord(token,word,collection){if(!token.length||uncountables.hasOwnProperty(token))return word;for(var len=collection.length;len--;){var rule=collection[len];if(rule[0].test(word))return word.replace(rule[0],function(match,index,word){var result=interpolate(rule[1],arguments);return""===match?restoreCase(word[index-1],result):restoreCase(match,result)})}return word}function replaceWord(replaceMap,keepMap,rules){return function(word){var token=word.toLowerCase();return keepMap.hasOwnProperty(token)?restoreCase(word,token):replaceMap.hasOwnProperty(token)?restoreCase(word,replaceMap[token]):sanitizeWord(token,word,rules)}}function pluralize(word,count,inclusive){var pluralized=1===count?pluralize.singular(word):pluralize.plural(word);return(inclusive?count+" ":"")+pluralized}var pluralRules=[],singularRules=[],uncountables={},irregularPlurals={},irregularSingles={};return pluralize.plural=replaceWord(irregularSingles,irregularPlurals,pluralRules),pluralize.singular=replaceWord(irregularPlurals,irregularSingles,singularRules),pluralize.addPluralRule=function(rule,replacement){pluralRules.push([sanitizeRule(rule),replacement])},pluralize.addSingularRule=function(rule,replacement){singularRules.push([sanitizeRule(rule),replacement])},pluralize.addUncountableRule=function(word){return"string"==typeof word?void(uncountables[word.toLowerCase()]=!0):(pluralize.addPluralRule(word,"$0"),void pluralize.addSingularRule(word,"$0"))},pluralize.addIrregularRule=function(single,plural){plural=plural.toLowerCase(),single=single.toLowerCase(),irregularSingles[single]=plural,irregularPlurals[plural]=single},[["I","we"],["me","us"],["he","they"],["she","they"],["them","them"],["myself","ourselves"],["yourself","yourselves"],["itself","themselves"],["herself","themselves"],["himself","themselves"],["themself","themselves"],["is","are"],["was","were"],["has","have"],["this","these"],["that","those"],["echo","echoes"],["dingo","dingoes"],["volcano","volcanoes"],["tornado","tornadoes"],["torpedo","torpedoes"],["genus","genera"],["viscus","viscera"],["stigma","stigmata"],["stoma","stomata"],["dogma","dogmata"],["lemma","lemmata"],["schema","schemata"],["anathema","anathemata"],["ox","oxen"],["axe","axes"],["die","dice"],["yes","yeses"],["foot","feet"],["eave","eaves"],["goose","geese"],["tooth","teeth"],["quiz","quizzes"],["human","humans"],["proof","proofs"],["carve","carves"],["valve","valves"],["looey","looies"],["thief","thieves"],["groove","grooves"],["pickaxe","pickaxes"],["whiskey","whiskies"]].forEach(function(rule){return pluralize.addIrregularRule(rule[0],rule[1])}),[[/s?$/i,"s"],[/([^aeiou]ese)$/i,"$1"],[/(ax|test)is$/i,"$1es"],[/(alias|[^aou]us|tlas|gas|ris)$/i,"$1es"],[/(e[mn]u)s?$/i,"$1s"],[/([^l]ias|[aeiou]las|[emjzr]as|[iu]am)$/i,"$1"],[/(alumn|syllab|octop|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1i"],[/(alumn|alg|vertebr)(?:a|ae)$/i,"$1ae"],[/(seraph|cherub)(?:im)?$/i,"$1im"],[/(her|at|gr)o$/i,"$1oes"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|automat|quor)(?:a|um)$/i,"$1a"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)(?:a|on)$/i,"$1a"],[/sis$/i,"ses"],[/(?:(kni|wi|li)fe|(ar|l|ea|eo|oa|hoo)f)$/i,"$1$2ves"],[/([^aeiouy]|qu)y$/i,"$1ies"],[/([^ch][ieo][ln])ey$/i,"$1ies"],[/(x|ch|ss|sh|zz)$/i,"$1es"],[/(matr|cod|mur|sil|vert|ind|append)(?:ix|ex)$/i,"$1ices"],[/(m|l)(?:ice|ouse)$/i,"$1ice"],[/(pe)(?:rson|ople)$/i,"$1ople"],[/(child)(?:ren)?$/i,"$1ren"],[/eaux$/i,"$0"],[/m[ae]n$/i,"men"],["thou","you"]].forEach(function(rule){return pluralize.addPluralRule(rule[0],rule[1])}),[[/s$/i,""],[/(ss)$/i,"$1"],[/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(?:sis|ses)$/i,"$1sis"],[/(^analy)(?:sis|ses)$/i,"$1sis"],[/(wi|kni|(?:after|half|high|low|mid|non|night|[^\w]|^)li)ves$/i,"$1fe"],[/(ar|(?:wo|[ae])l|[eo][ao])ves$/i,"$1f"],[/ies$/i,"y"],[/\b([pl]|zomb|(?:neck|cross)?t|coll|faer|food|gen|goon|group|lass|talk|goal|cut)ies$/i,"$1ie"],[/\b(mon|smil)ies$/i,"$1ey"],[/(m|l)ice$/i,"$1ouse"],[/(seraph|cherub)im$/i,"$1"],[/(x|ch|ss|sh|zz|tto|go|cho|alias|[^aou]us|tlas|gas|(?:her|at|gr)o|ris)(?:es)?$/i,"$1"],[/(e[mn]u)s?$/i,"$1"],[/(movie|twelve)s$/i,"$1"],[/(cris|test|diagnos)(?:is|es)$/i,"$1is"],[/(alumn|syllab|octop|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1us"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|quor)a$/i,"$1um"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)a$/i,"$1on"],[/(alumn|alg|vertebr)ae$/i,"$1a"],[/(cod|mur|sil|vert|ind)ices$/i,"$1ex"],[/(matr|append)ices$/i,"$1ix"],[/(pe)(rson|ople)$/i,"$1rson"],[/(child)ren$/i,"$1"],[/(eau)x?$/i,"$1"],[/men$/i,"man"]].forEach(function(rule){return pluralize.addSingularRule(rule[0],rule[1])}),["advice","adulthood","agenda","aid","alcohol","ammo","athletics","bison","blood","bream","buffalo","butter","carp","cash","chassis","chess","clothing","commerce","cod","cooperation","corps","digestion","debris","diabetes","energy","equipment","elk","excretion","expertise","flounder","fun","gallows","garbage","graffiti","headquarters","health","herpes","highjinks","homework","housework","information","jeans","justice","kudos","labour","literature","machinery","mackerel","mail","media","mews","moose","music","news","pike","plankton","pliers","pollution","premises","rain","research","rice","salmon","scissors","series","sewage","shambles","shrimp","species","staff","swine","trout","traffic","transporation","tuna","wealth","welfare","whiting","wildebeest","wildlife","you",/pox$/i,/ois$/i,/deer$/i,/fish$/i,/sheep$/i,/measles$/i,/[^aeiou]ese$/i].forEach(pluralize.addUncountableRule),pluralize})},function(module,exports,__webpack_require__){"use strict";var Subject_1=__webpack_require__(6);exports.Subject=Subject_1.Subject,exports.AnonymousSubject=Subject_1.AnonymousSubject;var Observable_1=__webpack_require__(0);exports.Observable=Observable_1.Observable,__webpack_require__(153),__webpack_require__(154),__webpack_require__(155),__webpack_require__(156),__webpack_require__(157),__webpack_require__(160),__webpack_require__(161),__webpack_require__(162),__webpack_require__(163),__webpack_require__(164),__webpack_require__(165),__webpack_require__(166),__webpack_require__(167),__webpack_require__(168),__webpack_require__(169),__webpack_require__(174),__webpack_require__(170),__webpack_require__(171),__webpack_require__(172),__webpack_require__(173),__webpack_require__(175),__webpack_require__(178),__webpack_require__(176),__webpack_require__(177),__webpack_require__(179),__webpack_require__(158),__webpack_require__(159),__webpack_require__(182),__webpack_require__(183),__webpack_require__(184),__webpack_require__(185),__webpack_require__(186),__webpack_require__(187),__webpack_require__(188),__webpack_require__(189),__webpack_require__(190),__webpack_require__(191),__webpack_require__(192),__webpack_require__(193),__webpack_require__(194),__webpack_require__(200),__webpack_require__(195),__webpack_require__(196),__webpack_require__(197),__webpack_require__(198),__webpack_require__(199),__webpack_require__(201),__webpack_require__(202),__webpack_require__(203),__webpack_require__(204),__webpack_require__(207),__webpack_require__(208),__webpack_require__(209),__webpack_require__(205),__webpack_require__(210),__webpack_require__(211),__webpack_require__(212),__webpack_require__(213),__webpack_require__(214),__webpack_require__(215),__webpack_require__(216),__webpack_require__(217),__webpack_require__(180),__webpack_require__(181),__webpack_require__(218),__webpack_require__(219),__webpack_require__(206),__webpack_require__(220),__webpack_require__(221),__webpack_require__(222),__webpack_require__(223),__webpack_require__(224),__webpack_require__(225),__webpack_require__(226),__webpack_require__(227),__webpack_require__(228),__webpack_require__(229),__webpack_require__(230),__webpack_require__(231),__webpack_require__(232),__webpack_require__(233),__webpack_require__(234),__webpack_require__(235),__webpack_require__(236),__webpack_require__(237),__webpack_require__(239),__webpack_require__(238),__webpack_require__(240),__webpack_require__(241),__webpack_require__(242),__webpack_require__(243),__webpack_require__(244),__webpack_require__(245),__webpack_require__(246),__webpack_require__(247),__webpack_require__(248),__webpack_require__(249),__webpack_require__(250),__webpack_require__(251),__webpack_require__(252),__webpack_require__(253),__webpack_require__(254),__webpack_require__(255),__webpack_require__(256),__webpack_require__(257),__webpack_require__(258),__webpack_require__(259),__webpack_require__(260),__webpack_require__(261),__webpack_require__(262),__webpack_require__(263),__webpack_require__(264),__webpack_require__(265),__webpack_require__(266),__webpack_require__(267),__webpack_require__(268),__webpack_require__(269),__webpack_require__(270),__webpack_require__(271),__webpack_require__(272),__webpack_require__(273),__webpack_require__(274),__webpack_require__(275),__webpack_require__(276),__webpack_require__(277),__webpack_require__(278),__webpack_require__(279);var Subscription_1=__webpack_require__(5);exports.Subscription=Subscription_1.Subscription;var Subscriber_1=__webpack_require__(1);exports.Subscriber=Subscriber_1.Subscriber;var AsyncSubject_1=__webpack_require__(30);exports.AsyncSubject=AsyncSubject_1.AsyncSubject;var ReplaySubject_1=__webpack_require__(50);exports.ReplaySubject=ReplaySubject_1.ReplaySubject;var BehaviorSubject_1=__webpack_require__(70);exports.BehaviorSubject=BehaviorSubject_1.BehaviorSubject;var ConnectableObservable_1=__webpack_require__(73);exports.ConnectableObservable=ConnectableObservable_1.ConnectableObservable;var Notification_1=__webpack_require__(22);exports.Notification=Notification_1.Notification;var EmptyError_1=__webpack_require__(35);exports.EmptyError=EmptyError_1.EmptyError;var ArgumentOutOfRangeError_1=__webpack_require__(34);exports.ArgumentOutOfRangeError=ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;var ObjectUnsubscribedError_1=__webpack_require__(36);exports.ObjectUnsubscribedError=ObjectUnsubscribedError_1.ObjectUnsubscribedError;var TimeoutError_1=__webpack_require__(92);exports.TimeoutError=TimeoutError_1.TimeoutError;var UnsubscriptionError_1=__webpack_require__(93);exports.UnsubscriptionError=UnsubscriptionError_1.UnsubscriptionError;var timeInterval_1=__webpack_require__(85);exports.TimeInterval=timeInterval_1.TimeInterval;var timestamp_1=__webpack_require__(86);exports.Timestamp=timestamp_1.Timestamp;var TestScheduler_1=__webpack_require__(415);exports.TestScheduler=TestScheduler_1.TestScheduler;var VirtualTimeScheduler_1=__webpack_require__(87);exports.VirtualTimeScheduler=VirtualTimeScheduler_1.VirtualTimeScheduler;var AjaxObservable_1=__webpack_require__(76);exports.AjaxResponse=AjaxObservable_1.AjaxResponse,exports.AjaxError=AjaxObservable_1.AjaxError,exports.AjaxTimeoutError=AjaxObservable_1.AjaxTimeoutError;var asap_1=__webpack_require__(88),async_1=__webpack_require__(10),queue_1=__webpack_require__(89),animationFrame_1=__webpack_require__(412),rxSubscriber_1=__webpack_require__(33),iterator_1=__webpack_require__(25),observable_1=__webpack_require__(32),Scheduler={asap:asap_1.asap,queue:queue_1.queue,animationFrame:animationFrame_1.animationFrame,async:async_1.async};exports.Scheduler=Scheduler;var Symbol={rxSubscriber:rxSubscriber_1.$$rxSubscriber,observable:observable_1.$$observable,iterator:iterator_1.$$iterator};exports.Symbol=Symbol},function(module,exports,__webpack_require__){function lookup(uri,opts){"object"==typeof uri&&(opts=uri,uri=void 0),opts=opts||{};var io,parsed=url(uri),source=parsed.source,id=parsed.id,path=parsed.path,sameNamespace=cache[id]&&path in cache[id].nsps,newConnection=opts.forceNew||opts["force new connection"]||!1===opts.multiplex||sameNamespace;return newConnection?(debug("ignoring socket cache for %s",source),io=Manager(source,opts)):(cache[id]||(debug("new io instance for %s",source),cache[id]=Manager(source,opts)),io=cache[id]),parsed.query&&!opts.query?opts.query=parsed.query:opts&&"object"==typeof opts.query&&(opts.query=encodeQueryString(opts.query)),io.socket(parsed.path,opts)}function encodeQueryString(obj){var str=[];for(var p in obj)obj.hasOwnProperty(p)&&str.push(encodeURIComponent(p)+"="+encodeURIComponent(obj[p]));return str.join("&")}var url=__webpack_require__(425),parser=__webpack_require__(61),Manager=__webpack_require__(99),debug=__webpack_require__(18)("socket.io-client");module.exports=exports=lookup;var cache=exports.managers={};exports.protocol=parser.protocol,exports.connect=lookup,exports.Manager=__webpack_require__(99),exports.Socket=__webpack_require__(101)},function(module,exports){/**
 * @license AngularJS v1.6.3
 * (c) 2010-2017 Google, Inc. http://angularjs.org
 * License: MIT
 */
!function(window,angular){"use strict";function assertArg(arg,name,reason){if(!arg)throw ngMinErr("areq","Argument '{0}' is {1}",name||"?",reason||"required");return arg}function mergeClasses(a,b){return a||b?a?b?(isArray(a)&&(a=a.join(" ")),isArray(b)&&(b=b.join(" ")),a+" "+b):a:b:""}function packageStyles(options){var styles={};return options&&(options.to||options.from)&&(styles.to=options.to,styles.from=options.from),styles}function pendClasses(classes,fix,isPrefix){var className="";return classes=isArray(classes)?classes:classes&&isString(classes)&&classes.length?classes.split(/\s+/):[],forEach(classes,function(klass,i){klass&&klass.length>0&&(className+=i>0?" ":"",className+=isPrefix?fix+klass:klass+fix)}),className}function removeFromArray(arr,val){var index=arr.indexOf(val);val>=0&&arr.splice(index,1)}function stripCommentsFromElement(element){if(element instanceof jqLite)switch(element.length){case 0:return element;case 1:if(element[0].nodeType===ELEMENT_NODE)return element;break;default:return jqLite(extractElementNode(element))}if(element.nodeType===ELEMENT_NODE)return jqLite(element)}function extractElementNode(element){if(!element[0])return element;for(var i=0;i<element.length;i++){var elm=element[i];if(elm.nodeType===ELEMENT_NODE)return elm}}function $$addClass($$jqLite,element,className){forEach(element,function(elm){$$jqLite.addClass(elm,className)})}function $$removeClass($$jqLite,element,className){forEach(element,function(elm){$$jqLite.removeClass(elm,className)})}function applyAnimationClassesFactory($$jqLite){return function(element,options){options.addClass&&($$addClass($$jqLite,element,options.addClass),options.addClass=null),options.removeClass&&($$removeClass($$jqLite,element,options.removeClass),options.removeClass=null)}}function prepareAnimationOptions(options){if(options=options||{},!options.$$prepared){var domOperation=options.domOperation||noop;options.domOperation=function(){options.$$domOperationFired=!0,domOperation(),domOperation=noop},options.$$prepared=!0}return options}function applyAnimationStyles(element,options){applyAnimationFromStyles(element,options),applyAnimationToStyles(element,options)}function applyAnimationFromStyles(element,options){options.from&&(element.css(options.from),options.from=null)}function applyAnimationToStyles(element,options){options.to&&(element.css(options.to),options.to=null)}function mergeAnimationDetails(element,oldAnimation,newAnimation){var target=oldAnimation.options||{},newOptions=newAnimation.options||{},toAdd=(target.addClass||"")+" "+(newOptions.addClass||""),toRemove=(target.removeClass||"")+" "+(newOptions.removeClass||""),classes=resolveElementClasses(element.attr("class"),toAdd,toRemove);newOptions.preparationClasses&&(target.preparationClasses=concatWithSpace(newOptions.preparationClasses,target.preparationClasses),delete newOptions.preparationClasses);var realDomOperation=target.domOperation!==noop?target.domOperation:null;return extend(target,newOptions),realDomOperation&&(target.domOperation=realDomOperation),classes.addClass?target.addClass=classes.addClass:target.addClass=null,classes.removeClass?target.removeClass=classes.removeClass:target.removeClass=null,oldAnimation.addClass=target.addClass,oldAnimation.removeClass=target.removeClass,target}function resolveElementClasses(existing,toAdd,toRemove){function splitClassesToLookup(classes){isString(classes)&&(classes=classes.split(" "));var obj={};return forEach(classes,function(klass){klass.length&&(obj[klass]=!0)}),obj}var ADD_CLASS=1,REMOVE_CLASS=-1,flags={};existing=splitClassesToLookup(existing),toAdd=splitClassesToLookup(toAdd),forEach(toAdd,function(value,key){flags[key]=ADD_CLASS}),toRemove=splitClassesToLookup(toRemove),forEach(toRemove,function(value,key){flags[key]=flags[key]===ADD_CLASS?null:REMOVE_CLASS});var classes={addClass:"",removeClass:""};return forEach(flags,function(val,klass){var prop,allow;val===ADD_CLASS?(prop="addClass",allow=!existing[klass]||existing[klass+REMOVE_CLASS_SUFFIX]):val===REMOVE_CLASS&&(prop="removeClass",allow=existing[klass]||existing[klass+ADD_CLASS_SUFFIX]),allow&&(classes[prop].length&&(classes[prop]+=" "),classes[prop]+=klass)}),classes}function getDomNode(element){return element instanceof jqLite?element[0]:element}function applyGeneratedPreparationClasses(element,event,options){var classes="";event&&(classes=pendClasses(event,EVENT_CLASS_PREFIX,!0)),options.addClass&&(classes=concatWithSpace(classes,pendClasses(options.addClass,ADD_CLASS_SUFFIX))),options.removeClass&&(classes=concatWithSpace(classes,pendClasses(options.removeClass,REMOVE_CLASS_SUFFIX))),classes.length&&(options.preparationClasses=classes,element.addClass(classes))}function clearGeneratedClasses(element,options){options.preparationClasses&&(element.removeClass(options.preparationClasses),options.preparationClasses=null),options.activeClasses&&(element.removeClass(options.activeClasses),options.activeClasses=null)}function blockTransitions(node,duration){var value=duration?"-"+duration+"s":"";return applyInlineStyle(node,[TRANSITION_DELAY_PROP,value]),[TRANSITION_DELAY_PROP,value]}function blockKeyframeAnimations(node,applyBlock){var value=applyBlock?"paused":"",key=ANIMATION_PROP+ANIMATION_PLAYSTATE_KEY;return applyInlineStyle(node,[key,value]),[key,value]}function applyInlineStyle(node,styleTuple){var prop=styleTuple[0],value=styleTuple[1];node.style[prop]=value}function concatWithSpace(a,b){return a?b?a+" "+b:a:b}function getCssKeyframeDurationStyle(duration){return[ANIMATION_DURATION_PROP,duration+"s"]}function getCssDelayStyle(delay,isKeyframeAnimation){var prop=isKeyframeAnimation?ANIMATION_DELAY_PROP:TRANSITION_DELAY_PROP;return[prop,delay+"s"]}function computeCssStyles($window,element,properties){var styles=Object.create(null),detectedStyles=$window.getComputedStyle(element)||{};return forEach(properties,function(formalStyleName,actualStyleName){var val=detectedStyles[formalStyleName];if(val){var c=val.charAt(0);("-"===c||"+"===c||c>=0)&&(val=parseMaxTime(val)),0===val&&(val=null),styles[actualStyleName]=val}}),styles}function parseMaxTime(str){var maxValue=0,values=str.split(/\s*,\s*/);return forEach(values,function(value){"s"===value.charAt(value.length-1)&&(value=value.substring(0,value.length-1)),value=parseFloat(value)||0,maxValue=maxValue?Math.max(value,maxValue):value}),maxValue}function truthyTimingValue(val){return 0===val||null!=val}function getCssTransitionDurationStyle(duration,applyOnlyDuration){var style=TRANSITION_PROP,value=duration+"s";return applyOnlyDuration?style+=DURATION_KEY:value+=" linear all",[style,value]}function createLocalCacheLookup(){var cache=Object.create(null);return{flush:function(){cache=Object.create(null)},count:function(key){var entry=cache[key];return entry?entry.total:0},get:function(key){var entry=cache[key];return entry&&entry.value},put:function(key,value){cache[key]?cache[key].total++:cache[key]={total:1,value:value}}}}function registerRestorableStyles(backup,node,properties){forEach(properties,function(prop){backup[prop]=isDefined(backup[prop])?backup[prop]:node.style.getPropertyValue(prop)})}var TRANSITION_PROP,TRANSITIONEND_EVENT,ANIMATION_PROP,ANIMATIONEND_EVENT,ELEMENT_NODE=1,ADD_CLASS_SUFFIX="-add",REMOVE_CLASS_SUFFIX="-remove",EVENT_CLASS_PREFIX="ng-",ACTIVE_CLASS_SUFFIX="-active",PREPARE_CLASS_SUFFIX="-prepare",NG_ANIMATE_CLASSNAME="ng-animate",NG_ANIMATE_CHILDREN_DATA="$$ngAnimateChildren",CSS_PREFIX="";void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend?(CSS_PREFIX="-webkit-",TRANSITION_PROP="WebkitTransition",TRANSITIONEND_EVENT="webkitTransitionEnd transitionend"):(TRANSITION_PROP="transition",TRANSITIONEND_EVENT="transitionend"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend?(CSS_PREFIX="-webkit-",ANIMATION_PROP="WebkitAnimation",ANIMATIONEND_EVENT="webkitAnimationEnd animationend"):(ANIMATION_PROP="animation",ANIMATIONEND_EVENT="animationend");var copy,extend,forEach,isArray,isDefined,isElement,isFunction,isObject,isString,isUndefined,jqLite,noop,DURATION_KEY="Duration",PROPERTY_KEY="Property",DELAY_KEY="Delay",TIMING_KEY="TimingFunction",ANIMATION_ITERATION_COUNT_KEY="IterationCount",ANIMATION_PLAYSTATE_KEY="PlayState",SAFE_FAST_FORWARD_DURATION_VALUE=9999,ANIMATION_DELAY_PROP=ANIMATION_PROP+DELAY_KEY,ANIMATION_DURATION_PROP=ANIMATION_PROP+DURATION_KEY,TRANSITION_DELAY_PROP=TRANSITION_PROP+DELAY_KEY,TRANSITION_DURATION_PROP=TRANSITION_PROP+DURATION_KEY,ngMinErr=angular.$$minErr("ng"),$$rAFSchedulerFactory=["$$rAF",function($$rAF){function scheduler(tasks){queue=queue.concat(tasks),nextTick()}function nextTick(){if(queue.length){for(var items=queue.shift(),i=0;i<items.length;i++)items[i]();cancelFn||$$rAF(function(){cancelFn||nextTick()})}}var queue,cancelFn;return queue=scheduler.queue=[],scheduler.waitUntilQuiet=function(fn){cancelFn&&cancelFn(),cancelFn=$$rAF(function(){cancelFn=null,fn(),nextTick()})},scheduler}],$$AnimateChildrenDirective=["$interpolate",function($interpolate){return{link:function(scope,element,attrs){function setData(value){value="on"===value||"true"===value,element.data(NG_ANIMATE_CHILDREN_DATA,value)}var val=attrs.ngAnimateChildren;isString(val)&&0===val.length?element.data(NG_ANIMATE_CHILDREN_DATA,!0):(setData($interpolate(val)(scope)),attrs.$observe("ngAnimateChildren",setData))}}}],ANIMATE_TIMER_KEY="$$animateCss",ONE_SECOND=1e3,ELAPSED_TIME_MAX_DECIMAL_PLACES=3,CLOSING_TIME_BUFFER=1.5,DETECT_CSS_PROPERTIES={transitionDuration:TRANSITION_DURATION_PROP,transitionDelay:TRANSITION_DELAY_PROP,transitionProperty:TRANSITION_PROP+PROPERTY_KEY,animationDuration:ANIMATION_DURATION_PROP,animationDelay:ANIMATION_DELAY_PROP,animationIterationCount:ANIMATION_PROP+ANIMATION_ITERATION_COUNT_KEY},DETECT_STAGGER_CSS_PROPERTIES={transitionDuration:TRANSITION_DURATION_PROP,transitionDelay:TRANSITION_DELAY_PROP,animationDuration:ANIMATION_DURATION_PROP,animationDelay:ANIMATION_DELAY_PROP},$AnimateCssProvider=["$animateProvider",function($animateProvider){var gcsLookup=createLocalCacheLookup(),gcsStaggerLookup=createLocalCacheLookup();this.$get=["$window","$$jqLite","$$AnimateRunner","$timeout","$$forceReflow","$sniffer","$$rAFScheduler","$$animateQueue",function($window,$$jqLite,$$AnimateRunner,$timeout,$$forceReflow,$sniffer,$$rAFScheduler,$$animateQueue){function gcsHashFn(node,extraClasses){var KEY="$$ngAnimateParentKey",parentNode=node.parentNode,parentID=parentNode[KEY]||(parentNode[KEY]=++parentCounter);return parentID+"-"+node.getAttribute("class")+"-"+extraClasses}function computeCachedCssStyles(node,className,cacheKey,properties){var timings=gcsLookup.get(cacheKey);return timings||(timings=computeCssStyles($window,node,properties),"infinite"===timings.animationIterationCount&&(timings.animationIterationCount=1)),gcsLookup.put(cacheKey,timings),timings}function computeCachedCssStaggerStyles(node,className,cacheKey,properties){var stagger;if(gcsLookup.count(cacheKey)>0&&(stagger=gcsStaggerLookup.get(cacheKey),!stagger)){var staggerClassName=pendClasses(className,"-stagger");$$jqLite.addClass(node,staggerClassName),stagger=computeCssStyles($window,node,properties),stagger.animationDuration=Math.max(stagger.animationDuration,0),stagger.transitionDuration=Math.max(stagger.transitionDuration,0),$$jqLite.removeClass(node,staggerClassName),gcsStaggerLookup.put(cacheKey,stagger)}return stagger||{}}function waitUntilQuiet(callback){rafWaitQueue.push(callback),$$rAFScheduler.waitUntilQuiet(function(){gcsLookup.flush(),gcsStaggerLookup.flush();for(var pageWidth=$$forceReflow(),i=0;i<rafWaitQueue.length;i++)rafWaitQueue[i](pageWidth);rafWaitQueue.length=0})}function computeTimings(node,className,cacheKey){var timings=computeCachedCssStyles(node,className,cacheKey,DETECT_CSS_PROPERTIES),aD=timings.animationDelay,tD=timings.transitionDelay;return timings.maxDelay=aD&&tD?Math.max(aD,tD):aD||tD,timings.maxDuration=Math.max(timings.animationDuration*timings.animationIterationCount,timings.transitionDuration),timings}var applyAnimationClasses=applyAnimationClassesFactory($$jqLite),parentCounter=0,rafWaitQueue=[];return function(element,initialOptions){function endFn(){close()}function cancelFn(){close(!0)}function close(rejected){if(!(animationClosed||animationCompleted&&animationPaused)){animationClosed=!0,animationPaused=!1,options.$$skipPreparationClasses||$$jqLite.removeClass(element,preparationClasses),$$jqLite.removeClass(element,activeClasses),blockKeyframeAnimations(node,!1),blockTransitions(node,!1),forEach(temporaryStyles,function(entry){node.style[entry[0]]=""}),applyAnimationClasses(element,options),applyAnimationStyles(element,options),Object.keys(restoreStyles).length&&forEach(restoreStyles,function(value,prop){value?node.style.setProperty(prop,value):node.style.removeProperty(prop)}),options.onDone&&options.onDone(),events&&events.length&&element.off(events.join(" "),onAnimationProgress);var animationTimerData=element.data(ANIMATE_TIMER_KEY);animationTimerData&&($timeout.cancel(animationTimerData[0].timer),element.removeData(ANIMATE_TIMER_KEY)),runner&&runner.complete(!rejected)}}function applyBlocking(duration){flags.blockTransition&&blockTransitions(node,duration),flags.blockKeyframeAnimation&&blockKeyframeAnimations(node,!!duration)}function closeAndReturnNoopAnimator(){return runner=new $$AnimateRunner({end:endFn,cancel:cancelFn}),waitUntilQuiet(noop),close(),{$$willAnimate:!1,start:function(){return runner},end:endFn}}function onAnimationProgress(event){event.stopPropagation();var ev=event.originalEvent||event,timeStamp=ev.$manualTimeStamp||Date.now(),elapsedTime=parseFloat(ev.elapsedTime.toFixed(ELAPSED_TIME_MAX_DECIMAL_PLACES));Math.max(timeStamp-startTime,0)>=maxDelayTime&&elapsedTime>=maxDuration&&(animationCompleted=!0,close())}function start(){function triggerAnimationStart(){if(!animationClosed){if(applyBlocking(!1),forEach(temporaryStyles,function(entry){var key=entry[0],value=entry[1];node.style[key]=value}),applyAnimationClasses(element,options),$$jqLite.addClass(element,activeClasses),flags.recalculateTimingStyles){if(fullClassName=node.getAttribute("class")+" "+preparationClasses,cacheKey=gcsHashFn(node,fullClassName),timings=computeTimings(node,fullClassName,cacheKey),relativeDelay=timings.maxDelay,maxDelay=Math.max(relativeDelay,0),maxDuration=timings.maxDuration,0===maxDuration)return void close();flags.hasTransitions=timings.transitionDuration>0,flags.hasAnimations=timings.animationDuration>0}if(flags.applyAnimationDelay&&(relativeDelay="boolean"!=typeof options.delay&&truthyTimingValue(options.delay)?parseFloat(options.delay):relativeDelay,maxDelay=Math.max(relativeDelay,0),timings.animationDelay=relativeDelay,delayStyle=getCssDelayStyle(relativeDelay,!0),temporaryStyles.push(delayStyle),node.style[delayStyle[0]]=delayStyle[1]),maxDelayTime=maxDelay*ONE_SECOND,maxDurationTime=maxDuration*ONE_SECOND,options.easing){var easeProp,easeVal=options.easing;flags.hasTransitions&&(easeProp=TRANSITION_PROP+TIMING_KEY,temporaryStyles.push([easeProp,easeVal]),node.style[easeProp]=easeVal),flags.hasAnimations&&(easeProp=ANIMATION_PROP+TIMING_KEY,temporaryStyles.push([easeProp,easeVal]),node.style[easeProp]=easeVal)}timings.transitionDuration&&events.push(TRANSITIONEND_EVENT),timings.animationDuration&&events.push(ANIMATIONEND_EVENT),startTime=Date.now();var timerTime=maxDelayTime+CLOSING_TIME_BUFFER*maxDurationTime,endTime=startTime+timerTime,animationsData=element.data(ANIMATE_TIMER_KEY)||[],setupFallbackTimer=!0;if(animationsData.length){var currentTimerData=animationsData[0];setupFallbackTimer=endTime>currentTimerData.expectedEndTime,setupFallbackTimer?$timeout.cancel(currentTimerData.timer):animationsData.push(close)}if(setupFallbackTimer){var timer=$timeout(onAnimationExpired,timerTime,!1);animationsData[0]={timer:timer,expectedEndTime:endTime},animationsData.push(close),element.data(ANIMATE_TIMER_KEY,animationsData)}events.length&&element.on(events.join(" "),onAnimationProgress),options.to&&(options.cleanupStyles&&registerRestorableStyles(restoreStyles,node,Object.keys(options.to)),applyAnimationToStyles(element,options))}}function onAnimationExpired(){var animationsData=element.data(ANIMATE_TIMER_KEY);if(animationsData){for(var i=1;i<animationsData.length;i++)animationsData[i]();element.removeData(ANIMATE_TIMER_KEY)}}if(!animationClosed){if(!node.parentNode)return void close();var playPause=function(playAnimation){if(animationCompleted)animationPaused&&playAnimation&&(animationPaused=!1,close());else if(animationPaused=!playAnimation,timings.animationDuration){var value=blockKeyframeAnimations(node,animationPaused);animationPaused?temporaryStyles.push(value):removeFromArray(temporaryStyles,value)}},maxStagger=itemIndex>0&&(timings.transitionDuration&&0===stagger.transitionDuration||timings.animationDuration&&0===stagger.animationDuration)&&Math.max(stagger.animationDelay,stagger.transitionDelay);maxStagger?$timeout(triggerAnimationStart,Math.floor(maxStagger*itemIndex*ONE_SECOND),!1):triggerAnimationStart(),runnerHost.resume=function(){playPause(!0)},runnerHost.pause=function(){playPause(!1)}}}var options=initialOptions||{};options.$$prepared||(options=prepareAnimationOptions(copy(options)));var restoreStyles={},node=getDomNode(element);if(!node||!node.parentNode||!$$animateQueue.enabled())return closeAndReturnNoopAnimator();var animationClosed,animationPaused,animationCompleted,runner,runnerHost,maxDelay,maxDelayTime,maxDuration,maxDurationTime,startTime,temporaryStyles=[],classes=element.attr("class"),styles=packageStyles(options),events=[];if(0===options.duration||!$sniffer.animations&&!$sniffer.transitions)return closeAndReturnNoopAnimator();var method=options.event&&isArray(options.event)?options.event.join(" "):options.event,isStructural=method&&options.structural,structuralClassName="",addRemoveClassName="";isStructural?structuralClassName=pendClasses(method,EVENT_CLASS_PREFIX,!0):method&&(structuralClassName=method),options.addClass&&(addRemoveClassName+=pendClasses(options.addClass,ADD_CLASS_SUFFIX)),options.removeClass&&(addRemoveClassName.length&&(addRemoveClassName+=" "),addRemoveClassName+=pendClasses(options.removeClass,REMOVE_CLASS_SUFFIX)),options.applyClassesEarly&&addRemoveClassName.length&&applyAnimationClasses(element,options);var preparationClasses=[structuralClassName,addRemoveClassName].join(" ").trim(),fullClassName=classes+" "+preparationClasses,activeClasses=pendClasses(preparationClasses,ACTIVE_CLASS_SUFFIX),hasToStyles=styles.to&&Object.keys(styles.to).length>0,containsKeyframeAnimation=(options.keyframeStyle||"").length>0;if(!containsKeyframeAnimation&&!hasToStyles&&!preparationClasses)return closeAndReturnNoopAnimator();var cacheKey,stagger;if(options.stagger>0){var staggerVal=parseFloat(options.stagger);stagger={transitionDelay:staggerVal,animationDelay:staggerVal,transitionDuration:0,animationDuration:0}}else cacheKey=gcsHashFn(node,fullClassName),stagger=computeCachedCssStaggerStyles(node,preparationClasses,cacheKey,DETECT_STAGGER_CSS_PROPERTIES);options.$$skipPreparationClasses||$$jqLite.addClass(element,preparationClasses);var applyOnlyDuration;if(options.transitionStyle){var transitionStyle=[TRANSITION_PROP,options.transitionStyle];applyInlineStyle(node,transitionStyle),temporaryStyles.push(transitionStyle)}if(options.duration>=0){applyOnlyDuration=node.style[TRANSITION_PROP].length>0;var durationStyle=getCssTransitionDurationStyle(options.duration,applyOnlyDuration);applyInlineStyle(node,durationStyle),temporaryStyles.push(durationStyle)}if(options.keyframeStyle){var keyframeStyle=[ANIMATION_PROP,options.keyframeStyle];applyInlineStyle(node,keyframeStyle),temporaryStyles.push(keyframeStyle)}var itemIndex=stagger?options.staggerIndex>=0?options.staggerIndex:gcsLookup.count(cacheKey):0,isFirst=0===itemIndex;isFirst&&!options.skipBlocking&&blockTransitions(node,SAFE_FAST_FORWARD_DURATION_VALUE);var timings=computeTimings(node,fullClassName,cacheKey),relativeDelay=timings.maxDelay;maxDelay=Math.max(relativeDelay,0),maxDuration=timings.maxDuration;var flags={};if(flags.hasTransitions=timings.transitionDuration>0,flags.hasAnimations=timings.animationDuration>0,flags.hasTransitionAll=flags.hasTransitions&&"all"===timings.transitionProperty,flags.applyTransitionDuration=hasToStyles&&(flags.hasTransitions&&!flags.hasTransitionAll||flags.hasAnimations&&!flags.hasTransitions),flags.applyAnimationDuration=options.duration&&flags.hasAnimations,flags.applyTransitionDelay=truthyTimingValue(options.delay)&&(flags.applyTransitionDuration||flags.hasTransitions),flags.applyAnimationDelay=truthyTimingValue(options.delay)&&flags.hasAnimations,flags.recalculateTimingStyles=addRemoveClassName.length>0,(flags.applyTransitionDuration||flags.applyAnimationDuration)&&(maxDuration=options.duration?parseFloat(options.duration):maxDuration,flags.applyTransitionDuration&&(flags.hasTransitions=!0,timings.transitionDuration=maxDuration,applyOnlyDuration=node.style[TRANSITION_PROP+PROPERTY_KEY].length>0,temporaryStyles.push(getCssTransitionDurationStyle(maxDuration,applyOnlyDuration))),flags.applyAnimationDuration&&(flags.hasAnimations=!0,timings.animationDuration=maxDuration,temporaryStyles.push(getCssKeyframeDurationStyle(maxDuration)))),0===maxDuration&&!flags.recalculateTimingStyles)return closeAndReturnNoopAnimator();if(null!=options.delay){var delayStyle;"boolean"!=typeof options.delay&&(delayStyle=parseFloat(options.delay),maxDelay=Math.max(delayStyle,0)),flags.applyTransitionDelay&&temporaryStyles.push(getCssDelayStyle(delayStyle)),flags.applyAnimationDelay&&temporaryStyles.push(getCssDelayStyle(delayStyle,!0))}return null==options.duration&&timings.transitionDuration>0&&(flags.recalculateTimingStyles=flags.recalculateTimingStyles||isFirst),maxDelayTime=maxDelay*ONE_SECOND,maxDurationTime=maxDuration*ONE_SECOND,options.skipBlocking||(flags.blockTransition=timings.transitionDuration>0,flags.blockKeyframeAnimation=timings.animationDuration>0&&stagger.animationDelay>0&&0===stagger.animationDuration),options.from&&(options.cleanupStyles&&registerRestorableStyles(restoreStyles,node,Object.keys(options.from)),applyAnimationFromStyles(element,options)),flags.blockTransition||flags.blockKeyframeAnimation?applyBlocking(maxDuration):options.skipBlocking||blockTransitions(node,!1),{$$willAnimate:!0,end:endFn,start:function(){if(!animationClosed)return runnerHost={end:endFn,cancel:cancelFn,resume:null,pause:null},runner=new $$AnimateRunner(runnerHost),waitUntilQuiet(start),runner}}}}]}],$$AnimateCssDriverProvider=["$$animationProvider",function($$animationProvider){function isDocumentFragment(node){return node.parentNode&&11===node.parentNode.nodeType}$$animationProvider.drivers.push("$$animateCssDriver");var NG_ANIMATE_SHIM_CLASS_NAME="ng-animate-shim",NG_ANIMATE_ANCHOR_CLASS_NAME="ng-anchor",NG_OUT_ANCHOR_CLASS_NAME="ng-anchor-out",NG_IN_ANCHOR_CLASS_NAME="ng-anchor-in";this.$get=["$animateCss","$rootScope","$$AnimateRunner","$rootElement","$sniffer","$$jqLite","$document",function($animateCss,$rootScope,$$AnimateRunner,$rootElement,$sniffer,$$jqLite,$document){function filterCssClasses(classes){return classes.replace(/\bng-\S+\b/g,"")}function getUniqueValues(a,b){return isString(a)&&(a=a.split(" ")),isString(b)&&(b=b.split(" ")),a.filter(function(val){return b.indexOf(val)===-1}).join(" ")}function prepareAnchoredAnimation(classes,outAnchor,inAnchor){function calculateAnchorStyles(anchor){var styles={},coords=getDomNode(anchor).getBoundingClientRect();return forEach(["width","height","top","left"],function(key){var value=coords[key];switch(key){case"top":value+=bodyNode.scrollTop;break;case"left":value+=bodyNode.scrollLeft}styles[key]=Math.floor(value)+"px"}),styles}function prepareOutAnimation(){var animator=$animateCss(clone,{addClass:NG_OUT_ANCHOR_CLASS_NAME,delay:!0,from:calculateAnchorStyles(outAnchor)});return animator.$$willAnimate?animator:null}function getClassVal(element){return element.attr("class")||""}function prepareInAnimation(){var endingClasses=filterCssClasses(getClassVal(inAnchor)),toAdd=getUniqueValues(endingClasses,startingClasses),toRemove=getUniqueValues(startingClasses,endingClasses),animator=$animateCss(clone,{to:calculateAnchorStyles(inAnchor),addClass:NG_IN_ANCHOR_CLASS_NAME+" "+toAdd,removeClass:NG_OUT_ANCHOR_CLASS_NAME+" "+toRemove,delay:!0});return animator.$$willAnimate?animator:null}function end(){clone.remove(),outAnchor.removeClass(NG_ANIMATE_SHIM_CLASS_NAME),inAnchor.removeClass(NG_ANIMATE_SHIM_CLASS_NAME)}var clone=jqLite(getDomNode(outAnchor).cloneNode(!0)),startingClasses=filterCssClasses(getClassVal(clone));outAnchor.addClass(NG_ANIMATE_SHIM_CLASS_NAME),inAnchor.addClass(NG_ANIMATE_SHIM_CLASS_NAME),clone.addClass(NG_ANIMATE_ANCHOR_CLASS_NAME),rootBodyElement.append(clone);var animatorIn,animatorOut=prepareOutAnimation();if(!animatorOut&&(animatorIn=prepareInAnimation(),!animatorIn))return end();var startingAnimator=animatorOut||animatorIn;return{start:function(){function endFn(){currentAnimation&&currentAnimation.end()}var runner,currentAnimation=startingAnimator.start();return currentAnimation.done(function(){return currentAnimation=null,!animatorIn&&(animatorIn=prepareInAnimation())?(currentAnimation=animatorIn.start(),currentAnimation.done(function(){currentAnimation=null,end(),runner.complete()}),currentAnimation):(end(),void runner.complete())}),runner=new $$AnimateRunner({end:endFn,cancel:endFn})}}}function prepareFromToAnchorAnimation(from,to,classes,anchors){var fromAnimation=prepareRegularAnimation(from,noop),toAnimation=prepareRegularAnimation(to,noop),anchorAnimations=[];if(forEach(anchors,function(anchor){var outElement=anchor.out,inElement=anchor["in"],animator=prepareAnchoredAnimation(classes,outElement,inElement);animator&&anchorAnimations.push(animator)}),fromAnimation||toAnimation||0!==anchorAnimations.length)return{start:function(){function endFn(){forEach(animationRunners,function(runner){runner.end()})}var animationRunners=[];fromAnimation&&animationRunners.push(fromAnimation.start()),toAnimation&&animationRunners.push(toAnimation.start()),forEach(anchorAnimations,function(animation){animationRunners.push(animation.start())});var runner=new $$AnimateRunner({end:endFn,cancel:endFn});return $$AnimateRunner.all(animationRunners,function(status){runner.complete(status)}),runner}}}function prepareRegularAnimation(animationDetails){var element=animationDetails.element,options=animationDetails.options||{};animationDetails.structural&&(options.event=animationDetails.event,options.structural=!0,options.applyClassesEarly=!0,"leave"===animationDetails.event&&(options.onDone=options.domOperation)),options.preparationClasses&&(options.event=concatWithSpace(options.event,options.preparationClasses));var animator=$animateCss(element,options);return animator.$$willAnimate?animator:null}if(!$sniffer.animations&&!$sniffer.transitions)return noop;var bodyNode=$document[0].body,rootNode=getDomNode($rootElement),rootBodyElement=jqLite(isDocumentFragment(rootNode)||bodyNode.contains(rootNode)?rootNode:bodyNode);return function(animationDetails){return animationDetails.from&&animationDetails.to?prepareFromToAnchorAnimation(animationDetails.from,animationDetails.to,animationDetails.classes,animationDetails.anchors):prepareRegularAnimation(animationDetails)}}]}],$$AnimateJsProvider=["$animateProvider",function($animateProvider){this.$get=["$injector","$$AnimateRunner","$$jqLite",function($injector,$$AnimateRunner,$$jqLite){function lookupAnimations(classes){classes=isArray(classes)?classes:classes.split(" ");for(var matches=[],flagMap={},i=0;i<classes.length;i++){var klass=classes[i],animationFactory=$animateProvider.$$registeredAnimations[klass];animationFactory&&!flagMap[klass]&&(matches.push($injector.get(animationFactory)),flagMap[klass]=!0)}return matches}var applyAnimationClasses=applyAnimationClassesFactory($$jqLite);return function(element,event,classes,options){function applyOptions(){options.domOperation(),applyAnimationClasses(element,options)}function close(){animationClosed=!0,applyOptions(),applyAnimationStyles(element,options)}function executeAnimationFn(fn,element,event,options,onDone){var args;switch(event){case"animate":args=[element,options.from,options.to,onDone];break;case"setClass":args=[element,classesToAdd,classesToRemove,onDone];break;case"addClass":args=[element,classesToAdd,onDone];break;case"removeClass":args=[element,classesToRemove,onDone];break;default:args=[element,onDone]}args.push(options);var value=fn.apply(fn,args);if(value)if(isFunction(value.start)&&(value=value.start()),value instanceof $$AnimateRunner)value.done(onDone);else if(isFunction(value))return value;return noop}function groupEventedAnimations(element,event,options,animations,fnName){var operations=[];return forEach(animations,function(ani){var animation=ani[fnName];animation&&operations.push(function(){var runner,endProgressCb,resolved=!1,onAnimationComplete=function(rejected){resolved||(resolved=!0,(endProgressCb||noop)(rejected),runner.complete(!rejected))};return runner=new $$AnimateRunner({end:function(){onAnimationComplete()},cancel:function(){onAnimationComplete(!0)}}),endProgressCb=executeAnimationFn(animation,element,event,options,function(result){var cancelled=result===!1;onAnimationComplete(cancelled)}),runner})}),operations}function packageAnimations(element,event,options,animations,fnName){var operations=groupEventedAnimations(element,event,options,animations,fnName);if(0===operations.length){var a,b;"beforeSetClass"===fnName?(a=groupEventedAnimations(element,"removeClass",options,animations,"beforeRemoveClass"),b=groupEventedAnimations(element,"addClass",options,animations,"beforeAddClass")):"setClass"===fnName&&(a=groupEventedAnimations(element,"removeClass",options,animations,"removeClass"),b=groupEventedAnimations(element,"addClass",options,animations,"addClass")),a&&(operations=operations.concat(a)),b&&(operations=operations.concat(b))}if(0!==operations.length)return function(callback){var runners=[];return operations.length&&forEach(operations,function(animateFn){runners.push(animateFn())}),runners.length?$$AnimateRunner.all(runners,callback):callback(),function(reject){forEach(runners,function(runner){reject?runner.cancel():runner.end()})}}}var animationClosed=!1;3===arguments.length&&isObject(classes)&&(options=classes,classes=null),options=prepareAnimationOptions(options),classes||(classes=element.attr("class")||"",options.addClass&&(classes+=" "+options.addClass),options.removeClass&&(classes+=" "+options.removeClass));var before,after,classesToAdd=options.addClass,classesToRemove=options.removeClass,animations=lookupAnimations(classes);if(animations.length){var afterFn,beforeFn;"leave"===event?(beforeFn="leave",afterFn="afterLeave"):(beforeFn="before"+event.charAt(0).toUpperCase()+event.substr(1),afterFn=event),"enter"!==event&&"move"!==event&&(before=packageAnimations(element,event,options,animations,beforeFn)),after=packageAnimations(element,event,options,animations,afterFn)}if(before||after){var runner;return{$$willAnimate:!0,end:function(){return runner?runner.end():(close(),runner=new $$AnimateRunner,runner.complete(!0)),runner},start:function(){function onComplete(success){close(success),runner.complete(success)}function endAnimations(cancelled){animationClosed||((closeActiveAnimations||noop)(cancelled),onComplete(cancelled))}if(runner)return runner;runner=new $$AnimateRunner;var closeActiveAnimations,chain=[];return before&&chain.push(function(fn){closeActiveAnimations=before(fn)}),chain.length?chain.push(function(fn){applyOptions(),fn(!0)}):applyOptions(),after&&chain.push(function(fn){closeActiveAnimations=after(fn)}),runner.setHost({end:function(){endAnimations()},cancel:function(){endAnimations(!0)}}),$$AnimateRunner.chain(chain,onComplete),runner}}}}}]}],$$AnimateJsDriverProvider=["$$animationProvider",function($$animationProvider){$$animationProvider.drivers.push("$$animateJsDriver"),this.$get=["$$animateJs","$$AnimateRunner",function($$animateJs,$$AnimateRunner){
function prepareAnimation(animationDetails){var element=animationDetails.element,event=animationDetails.event,options=animationDetails.options,classes=animationDetails.classes;return $$animateJs(element,event,classes,options)}return function(animationDetails){if(animationDetails.from&&animationDetails.to){var fromAnimation=prepareAnimation(animationDetails.from),toAnimation=prepareAnimation(animationDetails.to);if(!fromAnimation&&!toAnimation)return;return{start:function(){function endFnFactory(){return function(){forEach(animationRunners,function(runner){runner.end()})}}function done(status){runner.complete(status)}var animationRunners=[];fromAnimation&&animationRunners.push(fromAnimation.start()),toAnimation&&animationRunners.push(toAnimation.start()),$$AnimateRunner.all(animationRunners,done);var runner=new $$AnimateRunner({end:endFnFactory(),cancel:endFnFactory()});return runner}}}return prepareAnimation(animationDetails)}}]}],NG_ANIMATE_ATTR_NAME="data-ng-animate",NG_ANIMATE_PIN_DATA="$ngAnimatePin",$$AnimateQueueProvider=["$animateProvider",function($animateProvider){function makeTruthyCssClassMap(classString){if(!classString)return null;var keys=classString.split(ONE_SPACE),map=Object.create(null);return forEach(keys,function(key){map[key]=!0}),map}function hasMatchingClasses(newClassString,currentClassString){if(newClassString&&currentClassString){var currentClassMap=makeTruthyCssClassMap(currentClassString);return newClassString.split(ONE_SPACE).some(function(className){return currentClassMap[className]})}}function isAllowed(ruleType,currentAnimation,previousAnimation){return rules[ruleType].some(function(fn){return fn(currentAnimation,previousAnimation)})}function hasAnimationClasses(animation,and){var a=(animation.addClass||"").length>0,b=(animation.removeClass||"").length>0;return and?a&&b:a||b}var PRE_DIGEST_STATE=1,RUNNING_STATE=2,ONE_SPACE=" ",rules=this.rules={skip:[],cancel:[],join:[]};rules.join.push(function(newAnimation,currentAnimation){return!newAnimation.structural&&hasAnimationClasses(newAnimation)}),rules.skip.push(function(newAnimation,currentAnimation){return!newAnimation.structural&&!hasAnimationClasses(newAnimation)}),rules.skip.push(function(newAnimation,currentAnimation){return"leave"===currentAnimation.event&&newAnimation.structural}),rules.skip.push(function(newAnimation,currentAnimation){return currentAnimation.structural&&currentAnimation.state===RUNNING_STATE&&!newAnimation.structural}),rules.cancel.push(function(newAnimation,currentAnimation){return currentAnimation.structural&&newAnimation.structural}),rules.cancel.push(function(newAnimation,currentAnimation){return currentAnimation.state===RUNNING_STATE&&newAnimation.structural}),rules.cancel.push(function(newAnimation,currentAnimation){if(currentAnimation.structural)return!1;var nA=newAnimation.addClass,nR=newAnimation.removeClass,cA=currentAnimation.addClass,cR=currentAnimation.removeClass;return!(isUndefined(nA)&&isUndefined(nR)||isUndefined(cA)&&isUndefined(cR))&&(hasMatchingClasses(nA,cR)||hasMatchingClasses(nR,cA))}),this.$get=["$$rAF","$rootScope","$rootElement","$document","$$Map","$$animation","$$AnimateRunner","$templateRequest","$$jqLite","$$forceReflow","$$isDocumentHidden",function($$rAF,$rootScope,$rootElement,$document,$$Map,$$animation,$$AnimateRunner,$templateRequest,$$jqLite,$$forceReflow,$$isDocumentHidden){function postDigestTaskFactory(){var postDigestCalled=!1;return function(fn){postDigestCalled?fn():$rootScope.$$postDigest(function(){postDigestCalled=!0,fn()})}}function normalizeAnimationDetails(element,animation){return mergeAnimationDetails(element,animation,{})}function findCallbacks(targetParentNode,targetNode,event){var matches=[],entries=callbackRegistry[event];return entries&&forEach(entries,function(entry){contains.call(entry.node,targetNode)?matches.push(entry.callback):"leave"===event&&contains.call(entry.node,targetParentNode)&&matches.push(entry.callback)}),matches}function filterFromRegistry(list,matchContainer,matchCallback){var containerNode=extractElementNode(matchContainer);return list.filter(function(entry){var isMatch=entry.node===containerNode&&(!matchCallback||entry.callback===matchCallback);return!isMatch})}function cleanupEventListeners(phase,node){"close"!==phase||node.parentNode||$animate.off(node)}function queueAnimation(originalElement,event,initialOptions){function notifyProgress(runner,event,phase,data){runInNextPostDigestOrNow(function(){var callbacks=findCallbacks(parentNode,node,event);callbacks.length?$$rAF(function(){forEach(callbacks,function(callback){callback(element,phase,data)}),cleanupEventListeners(phase,node)}):cleanupEventListeners(phase,node)}),runner.progress(event,phase,data)}function close(reject){clearGeneratedClasses(element,options),applyAnimationClasses(element,options),applyAnimationStyles(element,options),options.domOperation(),runner.complete(!reject)}var options=copy(initialOptions),element=stripCommentsFromElement(originalElement),node=getDomNode(element),parentNode=node&&node.parentNode;options=prepareAnimationOptions(options);var runner=new $$AnimateRunner,runInNextPostDigestOrNow=postDigestTaskFactory();if(isArray(options.addClass)&&(options.addClass=options.addClass.join(" ")),options.addClass&&!isString(options.addClass)&&(options.addClass=null),isArray(options.removeClass)&&(options.removeClass=options.removeClass.join(" ")),options.removeClass&&!isString(options.removeClass)&&(options.removeClass=null),options.from&&!isObject(options.from)&&(options.from=null),options.to&&!isObject(options.to)&&(options.to=null),!node)return close(),runner;var className=[node.getAttribute("class"),options.addClass,options.removeClass].join(" ");if(!isAnimatableClassName(className))return close(),runner;var isStructural=["enter","move","leave"].indexOf(event)>=0,documentHidden=$$isDocumentHidden(),skipAnimations=!animationsEnabled||documentHidden||disabledElementsLookup.get(node),existingAnimation=!skipAnimations&&activeAnimationsLookup.get(node)||{},hasExistingAnimation=!!existingAnimation.state;if(skipAnimations||hasExistingAnimation&&existingAnimation.state===PRE_DIGEST_STATE||(skipAnimations=!areAnimationsAllowed(node,parentNode,event)),skipAnimations)return documentHidden&&notifyProgress(runner,event,"start"),close(),documentHidden&&notifyProgress(runner,event,"close"),runner;isStructural&&closeChildAnimations(node);var newAnimation={structural:isStructural,element:element,event:event,addClass:options.addClass,removeClass:options.removeClass,close:close,options:options,runner:runner};if(hasExistingAnimation){var skipAnimationFlag=isAllowed("skip",newAnimation,existingAnimation);if(skipAnimationFlag)return existingAnimation.state===RUNNING_STATE?(close(),runner):(mergeAnimationDetails(element,existingAnimation,newAnimation),existingAnimation.runner);var cancelAnimationFlag=isAllowed("cancel",newAnimation,existingAnimation);if(cancelAnimationFlag)if(existingAnimation.state===RUNNING_STATE)existingAnimation.runner.end();else{if(!existingAnimation.structural)return mergeAnimationDetails(element,existingAnimation,newAnimation),existingAnimation.runner;existingAnimation.close()}else{var joinAnimationFlag=isAllowed("join",newAnimation,existingAnimation);if(joinAnimationFlag){if(existingAnimation.state!==RUNNING_STATE)return applyGeneratedPreparationClasses(element,isStructural?event:null,options),event=newAnimation.event=existingAnimation.event,options=mergeAnimationDetails(element,existingAnimation,newAnimation),existingAnimation.runner;normalizeAnimationDetails(element,newAnimation)}}}else normalizeAnimationDetails(element,newAnimation);var isValidAnimation=newAnimation.structural;if(isValidAnimation||(isValidAnimation="animate"===newAnimation.event&&Object.keys(newAnimation.options.to||{}).length>0||hasAnimationClasses(newAnimation)),!isValidAnimation)return close(),clearElementAnimationState(node),runner;var counter=(existingAnimation.counter||0)+1;return newAnimation.counter=counter,markElementAnimationState(node,PRE_DIGEST_STATE,newAnimation),$rootScope.$$postDigest(function(){element=stripCommentsFromElement(originalElement);var animationDetails=activeAnimationsLookup.get(node),animationCancelled=!animationDetails;animationDetails=animationDetails||{};var parentElement=element.parent()||[],isValidAnimation=parentElement.length>0&&("animate"===animationDetails.event||animationDetails.structural||hasAnimationClasses(animationDetails));if(animationCancelled||animationDetails.counter!==counter||!isValidAnimation)return animationCancelled&&(applyAnimationClasses(element,options),applyAnimationStyles(element,options)),(animationCancelled||isStructural&&animationDetails.event!==event)&&(options.domOperation(),runner.end()),void(isValidAnimation||clearElementAnimationState(node));event=!animationDetails.structural&&hasAnimationClasses(animationDetails,!0)?"setClass":animationDetails.event,markElementAnimationState(node,RUNNING_STATE);var realRunner=$$animation(element,event,animationDetails.options);runner.setHost(realRunner),notifyProgress(runner,event,"start",{}),realRunner.done(function(status){close(!status);var animationDetails=activeAnimationsLookup.get(node);animationDetails&&animationDetails.counter===counter&&clearElementAnimationState(node),notifyProgress(runner,event,"close",{})})}),runner}function closeChildAnimations(node){var children=node.querySelectorAll("["+NG_ANIMATE_ATTR_NAME+"]");forEach(children,function(child){var state=parseInt(child.getAttribute(NG_ANIMATE_ATTR_NAME),10),animationDetails=activeAnimationsLookup.get(child);if(animationDetails)switch(state){case RUNNING_STATE:animationDetails.runner.end();case PRE_DIGEST_STATE:activeAnimationsLookup["delete"](child)}})}function clearElementAnimationState(node){node.removeAttribute(NG_ANIMATE_ATTR_NAME),activeAnimationsLookup["delete"](node)}function areAnimationsAllowed(node,parentNode,event){var animateChildren,bodyNode=$document[0].body,rootNode=getDomNode($rootElement),bodyNodeDetected=node===bodyNode||"HTML"===node.nodeName,rootNodeDetected=node===rootNode,parentAnimationDetected=!1,elementDisabled=disabledElementsLookup.get(node),parentHost=jqLite.data(node,NG_ANIMATE_PIN_DATA);for(parentHost&&(parentNode=getDomNode(parentHost));parentNode&&(rootNodeDetected||(rootNodeDetected=parentNode===rootNode),parentNode.nodeType===ELEMENT_NODE);){var details=activeAnimationsLookup.get(parentNode)||{};if(!parentAnimationDetected){var parentNodeDisabled=disabledElementsLookup.get(parentNode);if(parentNodeDisabled===!0&&elementDisabled!==!1){elementDisabled=!0;break}parentNodeDisabled===!1&&(elementDisabled=!1),parentAnimationDetected=details.structural}if(isUndefined(animateChildren)||animateChildren===!0){var value=jqLite.data(parentNode,NG_ANIMATE_CHILDREN_DATA);isDefined(value)&&(animateChildren=value)}if(parentAnimationDetected&&animateChildren===!1)break;if(bodyNodeDetected||(bodyNodeDetected=parentNode===bodyNode),bodyNodeDetected&&rootNodeDetected)break;parentNode=rootNodeDetected||!(parentHost=jqLite.data(parentNode,NG_ANIMATE_PIN_DATA))?parentNode.parentNode:getDomNode(parentHost)}var allowAnimation=(!parentAnimationDetected||animateChildren)&&elementDisabled!==!0;return allowAnimation&&rootNodeDetected&&bodyNodeDetected}function markElementAnimationState(node,state,details){details=details||{},details.state=state,node.setAttribute(NG_ANIMATE_ATTR_NAME,state);var oldValue=activeAnimationsLookup.get(node),newValue=oldValue?extend(oldValue,details):details;activeAnimationsLookup.set(node,newValue)}var activeAnimationsLookup=new $$Map,disabledElementsLookup=new $$Map,animationsEnabled=null,deregisterWatch=$rootScope.$watch(function(){return 0===$templateRequest.totalPendingRequests},function(isEmpty){isEmpty&&(deregisterWatch(),$rootScope.$$postDigest(function(){$rootScope.$$postDigest(function(){null===animationsEnabled&&(animationsEnabled=!0)})}))}),callbackRegistry=Object.create(null),classNameFilter=$animateProvider.classNameFilter(),isAnimatableClassName=classNameFilter?function(className){return classNameFilter.test(className)}:function(){return!0},applyAnimationClasses=applyAnimationClassesFactory($$jqLite),contains=window.Node.prototype.contains||function(arg){return this===arg||!!(16&this.compareDocumentPosition(arg))},$animate={on:function(event,container,callback){var node=extractElementNode(container);callbackRegistry[event]=callbackRegistry[event]||[],callbackRegistry[event].push({node:node,callback:callback}),jqLite(container).on("$destroy",function(){var animationDetails=activeAnimationsLookup.get(node);animationDetails||$animate.off(event,container,callback)})},off:function(event,container,callback){if(1!==arguments.length||isString(arguments[0])){var entries=callbackRegistry[event];entries&&(callbackRegistry[event]=1===arguments.length?null:filterFromRegistry(entries,container,callback))}else{container=arguments[0];for(var eventType in callbackRegistry)callbackRegistry[eventType]=filterFromRegistry(callbackRegistry[eventType],container)}},pin:function(element,parentElement){assertArg(isElement(element),"element","not an element"),assertArg(isElement(parentElement),"parentElement","not an element"),element.data(NG_ANIMATE_PIN_DATA,parentElement)},push:function(element,event,options,domOperation){return options=options||{},options.domOperation=domOperation,queueAnimation(element,event,options)},enabled:function(element,bool){var argCount=arguments.length;if(0===argCount)bool=!!animationsEnabled;else{var hasElement=isElement(element);if(hasElement){var node=getDomNode(element);1===argCount?bool=!disabledElementsLookup.get(node):disabledElementsLookup.set(node,!bool)}else bool=animationsEnabled=!!element}return bool}};return $animate}]}],$$AnimationProvider=["$animateProvider",function($animateProvider){function setRunner(element,runner){element.data(RUNNER_STORAGE_KEY,runner)}function removeRunner(element){element.removeData(RUNNER_STORAGE_KEY)}function getRunner(element){return element.data(RUNNER_STORAGE_KEY)}var NG_ANIMATE_REF_ATTR="ng-animate-ref",drivers=this.drivers=[],RUNNER_STORAGE_KEY="$$animationRunner";this.$get=["$$jqLite","$rootScope","$injector","$$AnimateRunner","$$Map","$$rAFScheduler",function($$jqLite,$rootScope,$injector,$$AnimateRunner,$$Map,$$rAFScheduler){function sortAnimations(animations){function processNode(entry){if(entry.processed)return entry;entry.processed=!0;var elementNode=entry.domNode,parentNode=elementNode.parentNode;lookup.set(elementNode,entry);for(var parentEntry;parentNode;){if(parentEntry=lookup.get(parentNode)){parentEntry.processed||(parentEntry=processNode(parentEntry));break}parentNode=parentNode.parentNode}return(parentEntry||tree).children.push(entry),entry}function flatten(tree){var i,result=[],queue=[];for(i=0;i<tree.children.length;i++)queue.push(tree.children[i]);var remainingLevelEntries=queue.length,nextLevelEntries=0,row=[];for(i=0;i<queue.length;i++){var entry=queue[i];remainingLevelEntries<=0&&(remainingLevelEntries=nextLevelEntries,nextLevelEntries=0,result.push(row),row=[]),row.push(entry.fn),entry.children.forEach(function(childEntry){nextLevelEntries++,queue.push(childEntry)}),remainingLevelEntries--}return row.length&&result.push(row),result}var i,tree={children:[]},lookup=new $$Map;for(i=0;i<animations.length;i++){var animation=animations[i];lookup.set(animation.domNode,animations[i]={domNode:animation.domNode,fn:animation.fn,children:[]})}for(i=0;i<animations.length;i++)processNode(animations[i]);return flatten(tree)}var animationQueue=[],applyAnimationClasses=applyAnimationClassesFactory($$jqLite);return function(element,event,options){function getAnchorNodes(node){var SELECTOR="["+NG_ANIMATE_REF_ATTR+"]",items=node.hasAttribute(NG_ANIMATE_REF_ATTR)?[node]:node.querySelectorAll(SELECTOR),anchors=[];return forEach(items,function(node){var attr=node.getAttribute(NG_ANIMATE_REF_ATTR);attr&&attr.length&&anchors.push(node)}),anchors}function groupAnimations(animations){var preparedAnimations=[],refLookup={};forEach(animations,function(animation,index){var element=animation.element,node=getDomNode(element),event=animation.event,enterOrMove=["enter","move"].indexOf(event)>=0,anchorNodes=animation.structural?getAnchorNodes(node):[];if(anchorNodes.length){var direction=enterOrMove?"to":"from";forEach(anchorNodes,function(anchor){var key=anchor.getAttribute(NG_ANIMATE_REF_ATTR);refLookup[key]=refLookup[key]||{},refLookup[key][direction]={animationID:index,element:jqLite(anchor)}})}else preparedAnimations.push(animation)});var usedIndicesLookup={},anchorGroups={};return forEach(refLookup,function(operations,key){var from=operations.from,to=operations.to;if(!from||!to){var index=from?from.animationID:to.animationID,indexKey=index.toString();return void(usedIndicesLookup[indexKey]||(usedIndicesLookup[indexKey]=!0,preparedAnimations.push(animations[index])))}var fromAnimation=animations[from.animationID],toAnimation=animations[to.animationID],lookupKey=from.animationID.toString();if(!anchorGroups[lookupKey]){var group=anchorGroups[lookupKey]={structural:!0,beforeStart:function(){fromAnimation.beforeStart(),toAnimation.beforeStart()},close:function(){fromAnimation.close(),toAnimation.close()},classes:cssClassesIntersection(fromAnimation.classes,toAnimation.classes),from:fromAnimation,to:toAnimation,anchors:[]};group.classes.length?preparedAnimations.push(group):(preparedAnimations.push(fromAnimation),preparedAnimations.push(toAnimation))}anchorGroups[lookupKey].anchors.push({out:from.element,"in":to.element})}),preparedAnimations}function cssClassesIntersection(a,b){a=a.split(" "),b=b.split(" ");for(var matches=[],i=0;i<a.length;i++){var aa=a[i];if("ng-"!==aa.substring(0,3))for(var j=0;j<b.length;j++)if(aa===b[j]){matches.push(aa);break}}return matches.join(" ")}function invokeFirstDriver(animationDetails){for(var i=drivers.length-1;i>=0;i--){var driverName=drivers[i],factory=$injector.get(driverName),driver=factory(animationDetails);if(driver)return driver}}function beforeStart(){element.addClass(NG_ANIMATE_CLASSNAME),tempClasses&&$$jqLite.addClass(element,tempClasses),prepareClassName&&($$jqLite.removeClass(element,prepareClassName),prepareClassName=null)}function updateAnimationRunners(animation,newRunner){function update(element){var runner=getRunner(element);runner&&runner.setHost(newRunner)}animation.from&&animation.to?(update(animation.from.element),update(animation.to.element)):update(animation.element)}function handleDestroyedElement(){var runner=getRunner(element);!runner||"leave"===event&&options.$$domOperationFired||runner.end()}function close(rejected){element.off("$destroy",handleDestroyedElement),removeRunner(element),applyAnimationClasses(element,options),applyAnimationStyles(element,options),options.domOperation(),tempClasses&&$$jqLite.removeClass(element,tempClasses),element.removeClass(NG_ANIMATE_CLASSNAME),runner.complete(!rejected)}options=prepareAnimationOptions(options);var isStructural=["enter","move","leave"].indexOf(event)>=0,runner=new $$AnimateRunner({end:function(){close()},cancel:function(){close(!0)}});if(!drivers.length)return close(),runner;setRunner(element,runner);var classes=mergeClasses(element.attr("class"),mergeClasses(options.addClass,options.removeClass)),tempClasses=options.tempClasses;tempClasses&&(classes+=" "+tempClasses,options.tempClasses=null);var prepareClassName;return isStructural&&(prepareClassName="ng-"+event+PREPARE_CLASS_SUFFIX,$$jqLite.addClass(element,prepareClassName)),animationQueue.push({element:element,classes:classes,event:event,structural:isStructural,options:options,beforeStart:beforeStart,close:close}),element.on("$destroy",handleDestroyedElement),animationQueue.length>1?runner:($rootScope.$$postDigest(function(){var animations=[];forEach(animationQueue,function(entry){getRunner(entry.element)?animations.push(entry):entry.close()}),animationQueue.length=0;var groupedAnimations=groupAnimations(animations),toBeSortedAnimations=[];forEach(groupedAnimations,function(animationEntry){toBeSortedAnimations.push({domNode:getDomNode(animationEntry.from?animationEntry.from.element:animationEntry.element),fn:function(){animationEntry.beforeStart();var startAnimationFn,closeFn=animationEntry.close,targetElement=animationEntry.anchors?animationEntry.from.element||animationEntry.to.element:animationEntry.element;if(getRunner(targetElement)){var operation=invokeFirstDriver(animationEntry);operation&&(startAnimationFn=operation.start)}if(startAnimationFn){var animationRunner=startAnimationFn();animationRunner.done(function(status){closeFn(!status)}),updateAnimationRunners(animationEntry,animationRunner)}else closeFn()}})}),$$rAFScheduler(sortAnimations(toBeSortedAnimations))}),runner)}}]}],ngAnimateSwapDirective=["$animate","$rootScope",function($animate,$rootScope){return{restrict:"A",transclude:"element",terminal:!0,priority:600,link:function(scope,$element,attrs,ctrl,$transclude){var previousElement,previousScope;scope.$watchCollection(attrs.ngAnimateSwap||attrs["for"],function(value){previousElement&&$animate.leave(previousElement),previousScope&&(previousScope.$destroy(),previousScope=null),(value||0===value)&&(previousScope=scope.$new(),$transclude(previousScope,function(element){previousElement=element,$animate.enter(element,null,$element)}))})}}}];angular.module("ngAnimate",[],function(){noop=angular.noop,copy=angular.copy,extend=angular.extend,jqLite=angular.element,forEach=angular.forEach,isArray=angular.isArray,isString=angular.isString,isObject=angular.isObject,isUndefined=angular.isUndefined,isDefined=angular.isDefined,isFunction=angular.isFunction,isElement=angular.isElement}).info({angularVersion:"1.6.3"}).directive("ngAnimateSwap",ngAnimateSwapDirective).directive("ngAnimateChildren",$$AnimateChildrenDirective).factory("$$rAFScheduler",$$rAFSchedulerFactory).provider("$$animateQueue",$$AnimateQueueProvider).provider("$$animation",$$AnimationProvider).provider("$animateCss",$AnimateCssProvider).provider("$$animateCssDriver",$$AnimateCssDriverProvider).provider("$$animateJs",$$AnimateJsProvider).provider("$$animateJsDriver",$$AnimateJsDriverProvider)}(window,window.angular)},function(module,exports){/**
 * @license AngularJS v1.6.3
 * (c) 2010-2017 Google, Inc. http://angularjs.org
 * License: MIT
 */
!function(window,angular){"use strict";function $$CookieWriter($document,$log,$browser){function buildCookieString(name,value,options){var path,expires;options=options||{},expires=options.expires,path=angular.isDefined(options.path)?options.path:cookiePath,angular.isUndefined(value)&&(expires="Thu, 01 Jan 1970 00:00:00 GMT",value=""),angular.isString(expires)&&(expires=new Date(expires));var str=encodeURIComponent(name)+"="+encodeURIComponent(value);str+=path?";path="+path:"",str+=options.domain?";domain="+options.domain:"",str+=expires?";expires="+expires.toUTCString():"",str+=options.secure?";secure":"";var cookieLength=str.length+1;return cookieLength>4096&&$log.warn("Cookie '"+name+"' possibly not set or overflowed because it was too large ("+cookieLength+" > 4096 bytes)!"),str}var cookiePath=$browser.baseHref(),rawDocument=$document[0];return function(name,value,options){rawDocument.cookie=buildCookieString(name,value,options)}}angular.module("ngCookies",["ng"]).info({angularVersion:"1.6.3"}).provider("$cookies",[function(){function calcOptions(options){return options?angular.extend({},defaults,options):defaults}var defaults=this.defaults={};this.$get=["$$cookieReader","$$cookieWriter",function($$cookieReader,$$cookieWriter){return{get:function(key){return $$cookieReader()[key]},getObject:function(key){var value=this.get(key);return value?angular.fromJson(value):value},getAll:function(){return $$cookieReader()},put:function(key,value,options){$$cookieWriter(key,value,calcOptions(options))},putObject:function(key,value,options){this.put(key,angular.toJson(value),options)},remove:function(key,options){$$cookieWriter(key,void 0,calcOptions(options))}}}]}]),angular.module("ngCookies").factory("$cookieStore",["$cookies",function($cookies){return{get:function(key){return $cookies.getObject(key)},put:function(key,value){$cookies.putObject(key,value)},remove:function(key){$cookies.remove(key)}}}]),$$CookieWriter.$inject=["$document","$log","$browser"],angular.module("ngCookies").provider("$$cookieWriter",function(){this.$get=$$CookieWriter})}(window,window.angular)},function(module,exports){/**
 * @license AngularJS v1.6.3
 * (c) 2010-2017 Google, Inc. http://angularjs.org
 * License: MIT
 */
!function(window,angular){"use strict";function isValidDottedPath(path){return null!=path&&""!==path&&"hasOwnProperty"!==path&&MEMBER_NAME_REGEX.test("."+path)}function lookupDottedPath(obj,path){if(!isValidDottedPath(path))throw $resourceMinErr("badmember",'Dotted member path "@{0}" is invalid.',path);for(var keys=path.split("."),i=0,ii=keys.length;i<ii&&angular.isDefined(obj);i++){var key=keys[i];obj=null!==obj?obj[key]:void 0}return obj}function shallowClearAndCopy(src,dst){dst=dst||{},angular.forEach(dst,function(value,key){delete dst[key]});for(var key in src)!src.hasOwnProperty(key)||"$"===key.charAt(0)&&"$"===key.charAt(1)||(dst[key]=src[key]);return dst}var $resourceMinErr=angular.$$minErr("$resource"),MEMBER_NAME_REGEX=/^(\.[a-zA-Z_$@][0-9a-zA-Z_$@]*)+$/;angular.module("ngResource",["ng"]).info({angularVersion:"1.6.3"}).provider("$resource",function(){var PROTOCOL_AND_IPV6_REGEX=/^https?:\/\/\[[^\]]*][^\/]*/,provider=this;this.defaults={stripTrailingSlashes:!0,cancellable:!1,actions:{get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}}},this.$get=["$http","$log","$q","$timeout",function($http,$log,$q,$timeout){function Route(template,defaults){this.template=template,this.defaults=extend({},provider.defaults,defaults),this.urlParams={}}function resourceFactory(url,paramDefaults,actions,options){function extractParams(data,actionParams){var ids={};return actionParams=extend({},paramDefaults,actionParams),forEach(actionParams,function(value,key){isFunction(value)&&(value=value(data)),ids[key]=value&&value.charAt&&"@"===value.charAt(0)?lookupDottedPath(data,value.substr(1)):value}),ids}function defaultResponseInterceptor(response){return response.resource}function Resource(value){shallowClearAndCopy(value||{},this)}var route=new Route(url,options);return actions=extend({},provider.defaults.actions,actions),Resource.prototype.toJSON=function(){var data=extend({},this);return delete data.$promise,delete data.$resolved,delete data.$cancelRequest,data},forEach(actions,function(action,name){var hasBody=/^(POST|PUT|PATCH)$/i.test(action.method),numericTimeout=action.timeout,cancellable=isDefined(action.cancellable)?action.cancellable:route.defaults.cancellable;numericTimeout&&!isNumber(numericTimeout)&&($log.debug("ngResource:\n  Only numeric values are allowed as `timeout`.\n  Promises are not supported in $resource, because the same value would be used for multiple requests. If you are looking for a way to cancel requests, you should use the `cancellable` option."),delete action.timeout,numericTimeout=null),Resource[name]=function(a1,a2,a3,a4){function cancelRequest(value){promise["catch"](noop),timeoutDeferred.resolve(value)}var data,success,error,params={};switch(arguments.length){case 4:error=a4,success=a3;case 3:case 2:if(!isFunction(a2)){params=a1,data=a2,success=a3;break}if(isFunction(a1)){success=a1,error=a2;break}success=a2,error=a3;case 1:isFunction(a1)?success=a1:hasBody?data=a1:params=a1;break;case 0:break;default:throw $resourceMinErr("badargs","Expected up to 4 arguments [params, data, success, error], got {0} arguments",arguments.length)}var timeoutDeferred,numericTimeoutPromise,isInstanceCall=this instanceof Resource,value=isInstanceCall?data:action.isArray?[]:new Resource(data),httpConfig={},responseInterceptor=action.interceptor&&action.interceptor.response||defaultResponseInterceptor,responseErrorInterceptor=action.interceptor&&action.interceptor.responseError||void 0,hasError=!!error,hasResponseErrorInterceptor=!!responseErrorInterceptor;forEach(action,function(value,key){switch(key){default:httpConfig[key]=copy(value);break;case"params":case"isArray":case"interceptor":case"cancellable":}}),!isInstanceCall&&cancellable&&(timeoutDeferred=$q.defer(),httpConfig.timeout=timeoutDeferred.promise,numericTimeout&&(numericTimeoutPromise=$timeout(timeoutDeferred.resolve,numericTimeout))),hasBody&&(httpConfig.data=data),route.setUrlParams(httpConfig,extend({},extractParams(data,action.params||{}),params),action.url);var promise=$http(httpConfig).then(function(response){var data=response.data;if(data){if(isArray(data)!==!!action.isArray)throw $resourceMinErr("badcfg","Error in resource configuration for action `{0}`. Expected response to contain an {1} but got an {2} (Request: {3} {4})",name,action.isArray?"array":"object",isArray(data)?"array":"object",httpConfig.method,httpConfig.url);if(action.isArray)value.length=0,forEach(data,function(item){"object"==typeof item?value.push(new Resource(item)):value.push(item)});else{var promise=value.$promise;shallowClearAndCopy(data,value),value.$promise=promise}}return response.resource=value,response});return promise=promise["finally"](function(){value.$resolved=!0,!isInstanceCall&&cancellable&&(value.$cancelRequest=noop,$timeout.cancel(numericTimeoutPromise),timeoutDeferred=numericTimeoutPromise=httpConfig.timeout=null)}),promise=promise.then(function(response){var value=responseInterceptor(response);return(success||noop)(value,response.headers,response.status,response.statusText),value},hasError||hasResponseErrorInterceptor?function(response){return hasError&&!hasResponseErrorInterceptor&&promise["catch"](noop),hasError&&error(response),hasResponseErrorInterceptor?responseErrorInterceptor(response):$q.reject(response)}:void 0),isInstanceCall?promise:(value.$promise=promise,value.$resolved=!1,cancellable&&(value.$cancelRequest=cancelRequest),value)},Resource.prototype["$"+name]=function(params,success,error){isFunction(params)&&(error=success,success=params,params={});var result=Resource[name].call(this,params,this,success,error);return result.$promise||result}}),Resource.bind=function(additionalParamDefaults){var extendedParamDefaults=extend({},paramDefaults,additionalParamDefaults);return resourceFactory(url,extendedParamDefaults,actions,options)},Resource}var noop=angular.noop,forEach=angular.forEach,extend=angular.extend,copy=angular.copy,isArray=angular.isArray,isDefined=angular.isDefined,isFunction=angular.isFunction,isNumber=angular.isNumber,encodeUriQuery=angular.$$encodeUriQuery,encodeUriSegment=angular.$$encodeUriSegment;return Route.prototype={setUrlParams:function(config,params,actionUrl){var val,encodedVal,self=this,url=actionUrl||self.template,protocolAndIpv6="",urlParams=self.urlParams=Object.create(null);forEach(url.split(/\W/),function(param){if("hasOwnProperty"===param)throw $resourceMinErr("badname","hasOwnProperty is not a valid parameter name.");!new RegExp("^\\d+$").test(param)&&param&&new RegExp("(^|[^\\\\]):"+param+"(\\W|$)").test(url)&&(urlParams[param]={isQueryParamValue:new RegExp("\\?.*=:"+param+"(?:\\W|$)").test(url)})}),url=url.replace(/\\:/g,":"),url=url.replace(PROTOCOL_AND_IPV6_REGEX,function(match){return protocolAndIpv6=match,""}),params=params||{},forEach(self.urlParams,function(paramInfo,urlParam){val=params.hasOwnProperty(urlParam)?params[urlParam]:self.defaults[urlParam],isDefined(val)&&null!==val?(encodedVal=paramInfo.isQueryParamValue?encodeUriQuery(val,!0):encodeUriSegment(val),url=url.replace(new RegExp(":"+urlParam+"(\\W|$)","g"),function(match,p1){return encodedVal+p1})):url=url.replace(new RegExp("(/?):"+urlParam+"(\\W|$)","g"),function(match,leadingSlashes,tail){return"/"===tail.charAt(0)?tail:leadingSlashes+tail})}),self.defaults.stripTrailingSlashes&&(url=url.replace(/\/+$/,"")||"/"),url=url.replace(/\/\.(?=\w+($|\?))/,"."),config.url=protocolAndIpv6+url.replace(/\/(\\|%5C)\./,"/."),forEach(params,function(value,key){self.urlParams[key]||(config.params=config.params||{},config.params[key]=value)})}},resourceFactory}]})}(window,window.angular)},function(module,exports){!function(){"use strict";function toastr($animate,$injector,$document,$rootScope,$sce,toastrConfig,$q){function active(){return toasts.length}function clear(toast){if(1!==arguments.length||toast)if(toast)remove(toast.toastId);else for(var i=0;i<toasts.length;i++)remove(toasts[i].toastId)}function error(message,title,optionsOverride){var type=_getOptions().iconClasses.error;return _buildNotification(type,message,title,optionsOverride)}function info(message,title,optionsOverride){var type=_getOptions().iconClasses.info;return _buildNotification(type,message,title,optionsOverride)}function success(message,title,optionsOverride){var type=_getOptions().iconClasses.success;return _buildNotification(type,message,title,optionsOverride)}function warning(message,title,optionsOverride){var type=_getOptions().iconClasses.warning;return _buildNotification(type,message,title,optionsOverride)}function refreshTimer(toast,newTime){toast&&toast.isOpened&&toasts.indexOf(toast)>=0&&toast.scope.refreshTimer(newTime)}function remove(toastId,wasClicked){function findToast(toastId){for(var i=0;i<toasts.length;i++)if(toasts[i].toastId===toastId)return toasts[i]}function lastToast(){return!toasts.length}var toast=findToast(toastId);toast&&!toast.deleting&&(toast.deleting=!0,toast.isOpened=!1,$animate.leave(toast.el).then(function(){toast.scope.options.onHidden&&toast.scope.options.onHidden(!!wasClicked,toast),toast.scope.$destroy();var index=toasts.indexOf(toast);delete openToasts[toast.scope.message],toasts.splice(index,1);var maxOpened=toastrConfig.maxOpened;maxOpened&&toasts.length>=maxOpened&&toasts[maxOpened-1].open.resolve(),lastToast()&&(container.remove(),container=null,containerDefer=$q.defer())}))}function _buildNotification(type,message,title,optionsOverride){return angular.isObject(title)&&(optionsOverride=title,title=null),_notify({iconClass:type,message:message,optionsOverride:optionsOverride,title:title})}function _getOptions(){return angular.extend({},toastrConfig)}function _createOrGetContainer(options){if(container)return containerDefer.promise;container=angular.element("<div></div>"),container.attr("id",options.containerId),container.addClass(options.positionClass),container.css({"pointer-events":"auto"});var target=angular.element(document.querySelector(options.target));if(!target||!target.length)throw"Target for toasts doesn't exist";return $animate.enter(container,target).then(function(){containerDefer.resolve()}),containerDefer.promise}function _notify(map){function ifMaxOpenedAndAutoDismiss(){return options.autoDismiss&&options.maxOpened&&toasts.length>options.maxOpened}function createScope(toast,map,options){function generateEvent(event){if(options[event])return function(){options[event](toast)}}options.allowHtml?(toast.scope.allowHtml=!0,toast.scope.title=$sce.trustAsHtml(map.title),toast.scope.message=$sce.trustAsHtml(map.message)):(toast.scope.title=map.title,toast.scope.message=map.message),toast.scope.toastType=toast.iconClass,toast.scope.toastId=toast.toastId,toast.scope.extraData=options.extraData,toast.scope.options={extendedTimeOut:options.extendedTimeOut,messageClass:options.messageClass,onHidden:options.onHidden,onShown:generateEvent("onShown"),onTap:generateEvent("onTap"),progressBar:options.progressBar,tapToDismiss:options.tapToDismiss,timeOut:options.timeOut,titleClass:options.titleClass,toastClass:options.toastClass},options.closeButton&&(toast.scope.options.closeHtml=options.closeHtml)}function createToast(){function cleanOptionsOverride(options){for(var badOptions=["containerId","iconClasses","maxOpened","newestOnTop","positionClass","preventDuplicates","preventOpenDuplicates","templates"],i=0,l=badOptions.length;i<l;i++)delete options[badOptions[i]];return options}var newToast={toastId:index++,isOpened:!1,scope:$rootScope.$new(),open:$q.defer()};return newToast.iconClass=map.iconClass,map.optionsOverride&&(angular.extend(options,cleanOptionsOverride(map.optionsOverride)),newToast.iconClass=map.optionsOverride.iconClass||newToast.iconClass),createScope(newToast,map,options),newToast.el=createToastEl(newToast.scope),newToast}function createToastEl(scope){var angularDomEl=angular.element("<div toast></div>"),$compile=$injector.get("$compile");return $compile(angularDomEl)(scope)}function maxOpenedNotReached(){return options.maxOpened&&toasts.length<=options.maxOpened||!options.maxOpened}function shouldExit(){var isDuplicateOfLast=options.preventDuplicates&&map.message===previousToastMessage,isDuplicateOpen=options.preventOpenDuplicates&&openToasts[map.message];return!(!isDuplicateOfLast&&!isDuplicateOpen)||(previousToastMessage=map.message,openToasts[map.message]=!0,!1)}var options=_getOptions();if(!shouldExit()){var newToast=createToast();if(toasts.push(newToast),ifMaxOpenedAndAutoDismiss())for(var oldToasts=toasts.slice(0,toasts.length-options.maxOpened),i=0,len=oldToasts.length;i<len;i++)remove(oldToasts[i].toastId);return maxOpenedNotReached()&&newToast.open.resolve(),newToast.open.promise.then(function(){_createOrGetContainer(options).then(function(){if(newToast.isOpened=!0,options.newestOnTop)$animate.enter(newToast.el,container).then(function(){newToast.scope.init()});else{var sibling=container[0].lastChild?angular.element(container[0].lastChild):null;$animate.enter(newToast.el,container,sibling).then(function(){newToast.scope.init()})}})}),newToast}}var container,index=0,toasts=[],previousToastMessage="",openToasts={},containerDefer=$q.defer(),toast={active:active,clear:clear,error:error,info:info,remove:remove,success:success,warning:warning,refreshTimer:refreshTimer};return toast}angular.module("toastr",[]).factory("toastr",toastr),toastr.$inject=["$animate","$injector","$document","$rootScope","$sce","toastrConfig","$q"]}(),function(){"use strict";angular.module("toastr").constant("toastrConfig",{allowHtml:!1,autoDismiss:!1,closeButton:!1,closeHtml:"<button>&times;</button>",containerId:"toast-container",extendedTimeOut:1e3,iconClasses:{error:"toast-error",info:"toast-info",success:"toast-success",warning:"toast-warning"},maxOpened:0,messageClass:"toast-message",newestOnTop:!0,onHidden:null,onShown:null,onTap:null,positionClass:"toast-top-right",preventDuplicates:!1,preventOpenDuplicates:!1,progressBar:!1,tapToDismiss:!0,target:"body",templates:{toast:"directives/toast/toast.html",progressbar:"directives/progressbar/progressbar.html"},timeOut:5e3,titleClass:"toast-title",toastClass:"toast"})}(),function(){"use strict";function progressBar(toastrConfig){function linkFunction(scope,element,attrs,toastCtrl){function updateProgress(){var percentage=(hideTime-(new Date).getTime())/currentTimeOut*100;element.css("width",percentage+"%")}var intervalId,currentTimeOut,hideTime;toastCtrl.progressBar=scope,scope.start=function(duration){intervalId&&clearInterval(intervalId),currentTimeOut=parseFloat(duration),hideTime=(new Date).getTime()+currentTimeOut,intervalId=setInterval(updateProgress,10)},scope.stop=function(){intervalId&&clearInterval(intervalId)},scope.$on("$destroy",function(){clearInterval(intervalId)})}return{require:"^toast",templateUrl:function(){return toastrConfig.templates.progressbar},link:linkFunction}}angular.module("toastr").directive("progressBar",progressBar),progressBar.$inject=["toastrConfig"]}(),function(){"use strict";function ToastController(){this.progressBar=null,this.startProgressBar=function(duration){this.progressBar&&this.progressBar.start(duration)},this.stopProgressBar=function(){this.progressBar&&this.progressBar.stop()}}angular.module("toastr").controller("ToastController",ToastController)}(),function(){"use strict";function toast($injector,$interval,toastrConfig,toastr){function toastLinkFunction(scope,element,attrs,toastCtrl){function createTimeout(time){return toastCtrl.startProgressBar(time),$interval(function(){toastCtrl.stopProgressBar(),toastr.remove(scope.toastId)},time,1)}function hideAndStopProgressBar(){scope.progressBar=!1,toastCtrl.stopProgressBar()}function wantsCloseButton(){return scope.options.closeHtml}var timeout;if(scope.toastClass=scope.options.toastClass,scope.titleClass=scope.options.titleClass,scope.messageClass=scope.options.messageClass,scope.progressBar=scope.options.progressBar,wantsCloseButton()){var button=angular.element(scope.options.closeHtml),$compile=$injector.get("$compile");button.addClass("toast-close-button"),button.attr("ng-click","close(true, $event)"),$compile(button)(scope),element.children().prepend(button)}scope.init=function(){scope.options.timeOut&&(timeout=createTimeout(scope.options.timeOut)),scope.options.onShown&&scope.options.onShown()},element.on("mouseenter",function(){hideAndStopProgressBar(),timeout&&$interval.cancel(timeout)}),scope.tapToast=function(){angular.isFunction(scope.options.onTap)&&scope.options.onTap(),scope.options.tapToDismiss&&scope.close(!0)},scope.close=function(wasClicked,$event){$event&&angular.isFunction($event.stopPropagation)&&$event.stopPropagation(),toastr.remove(scope.toastId,wasClicked)},scope.refreshTimer=function(newTime){timeout&&($interval.cancel(timeout),timeout=createTimeout(newTime||scope.options.timeOut))},element.on("mouseleave",function(){0===scope.options.timeOut&&0===scope.options.extendedTimeOut||(scope.$apply(function(){scope.progressBar=scope.options.progressBar}),timeout=createTimeout(scope.options.extendedTimeOut))})}return{templateUrl:function(){return toastrConfig.templates.toast},controller:"ToastController",link:toastLinkFunction}}angular.module("toastr").directive("toast",toast),toast.$inject=["$injector","$interval","toastrConfig","toastr"]}(),angular.module("toastr").run(["$templateCache",function($templateCache){$templateCache.put("directives/progressbar/progressbar.html",'<div class="toast-progress"></div>\n'),$templateCache.put("directives/toast/toast.html",'<div class="{{toastClass}} {{toastType}}" ng-click="tapToast()">\n  <div ng-switch on="allowHtml">\n    <div ng-switch-default ng-if="title" class="{{titleClass}}" aria-label="{{title}}">{{title}}</div>\n    <div ng-switch-default class="{{messageClass}}" aria-label="{{message}}">{{message}}</div>\n    <div ng-switch-when="true" ng-if="title" class="{{titleClass}}" ng-bind-html="title"></div>\n    <div ng-switch-when="true" class="{{messageClass}}" ng-bind-html="message"></div>\n  </div>\n  <progress-bar ng-if="progressBar"></progress-bar>\n</div>\n')}])},function(module,exports){angular.module("ui.bootstrap",["ui.bootstrap.tpls","ui.bootstrap.collapse","ui.bootstrap.tabindex","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.dateparser","ui.bootstrap.isClass","ui.bootstrap.datepicker","ui.bootstrap.position","ui.bootstrap.datepickerPopup","ui.bootstrap.debounce","ui.bootstrap.multiMap","ui.bootstrap.dropdown","ui.bootstrap.stackedMap","ui.bootstrap.modal","ui.bootstrap.paging","ui.bootstrap.pager","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]),angular.module("ui.bootstrap.tpls",["uib/template/accordion/accordion-group.html","uib/template/accordion/accordion.html","uib/template/alert/alert.html","uib/template/carousel/carousel.html","uib/template/carousel/slide.html","uib/template/datepicker/datepicker.html","uib/template/datepicker/day.html","uib/template/datepicker/month.html","uib/template/datepicker/year.html","uib/template/datepickerPopup/popup.html","uib/template/modal/window.html","uib/template/pager/pager.html","uib/template/pagination/pagination.html","uib/template/tooltip/tooltip-html-popup.html","uib/template/tooltip/tooltip-popup.html","uib/template/tooltip/tooltip-template-popup.html","uib/template/popover/popover-html.html","uib/template/popover/popover-template.html","uib/template/popover/popover.html","uib/template/progressbar/bar.html","uib/template/progressbar/progress.html","uib/template/progressbar/progressbar.html","uib/template/rating/rating.html","uib/template/tabs/tab.html","uib/template/tabs/tabset.html","uib/template/timepicker/timepicker.html","uib/template/typeahead/typeahead-match.html","uib/template/typeahead/typeahead-popup.html"]),angular.module("ui.bootstrap.collapse",[]).directive("uibCollapse",["$animate","$q","$parse","$injector",function($animate,$q,$parse,$injector){var $animateCss=$injector.has("$animateCss")?$injector.get("$animateCss"):null;return{link:function(scope,element,attrs){function init(){horizontal=!!("horizontal"in attrs),horizontal?(css={width:""},cssTo={width:"0"}):(css={height:""},cssTo={height:"0"}),scope.$eval(attrs.uibCollapse)||element.addClass("in").addClass("collapse").attr("aria-expanded",!0).attr("aria-hidden",!1).css(css)}function getScrollFromElement(element){return horizontal?{width:element.scrollWidth+"px"}:{height:element.scrollHeight+"px"}}function expand(){element.hasClass("collapse")&&element.hasClass("in")||$q.resolve(expandingExpr(scope)).then(function(){element.removeClass("collapse").addClass("collapsing").attr("aria-expanded",!0).attr("aria-hidden",!1),$animateCss?$animateCss(element,{addClass:"in",easing:"ease",css:{overflow:"hidden"},to:getScrollFromElement(element[0])}).start()["finally"](expandDone):$animate.addClass(element,"in",{css:{overflow:"hidden"},to:getScrollFromElement(element[0])}).then(expandDone)},angular.noop)}function expandDone(){element.removeClass("collapsing").addClass("collapse").css(css),expandedExpr(scope)}function collapse(){return element.hasClass("collapse")||element.hasClass("in")?void $q.resolve(collapsingExpr(scope)).then(function(){element.css(getScrollFromElement(element[0])).removeClass("collapse").addClass("collapsing").attr("aria-expanded",!1).attr("aria-hidden",!0),$animateCss?$animateCss(element,{removeClass:"in",to:cssTo}).start()["finally"](collapseDone):$animate.removeClass(element,"in",{to:cssTo}).then(collapseDone)},angular.noop):collapseDone()}function collapseDone(){element.css(cssTo),element.removeClass("collapsing").addClass("collapse"),collapsedExpr(scope)}var expandingExpr=$parse(attrs.expanding),expandedExpr=$parse(attrs.expanded),collapsingExpr=$parse(attrs.collapsing),collapsedExpr=$parse(attrs.collapsed),horizontal=!1,css={},cssTo={};init(),scope.$watch(attrs.uibCollapse,function(shouldCollapse){shouldCollapse?collapse():expand()})}}}]),angular.module("ui.bootstrap.tabindex",[]).directive("uibTabindexToggle",function(){return{restrict:"A",link:function(scope,elem,attrs){attrs.$observe("disabled",function(disabled){attrs.$set("tabindex",disabled?-1:null)})}}}),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse","ui.bootstrap.tabindex"]).constant("uibAccordionConfig",{closeOthers:!0}).controller("UibAccordionController",["$scope","$attrs","uibAccordionConfig",function($scope,$attrs,accordionConfig){this.groups=[],this.closeOthers=function(openGroup){var closeOthers=angular.isDefined($attrs.closeOthers)?$scope.$eval($attrs.closeOthers):accordionConfig.closeOthers;closeOthers&&angular.forEach(this.groups,function(group){group!==openGroup&&(group.isOpen=!1)})},this.addGroup=function(groupScope){var that=this;this.groups.push(groupScope),groupScope.$on("$destroy",function(event){that.removeGroup(groupScope)})},this.removeGroup=function(group){var index=this.groups.indexOf(group);index!==-1&&this.groups.splice(index,1)}}]).directive("uibAccordion",function(){return{controller:"UibAccordionController",controllerAs:"accordion",transclude:!0,templateUrl:function(element,attrs){return attrs.templateUrl||"uib/template/accordion/accordion.html"}}}).directive("uibAccordionGroup",function(){return{require:"^uibAccordion",transclude:!0,restrict:"A",templateUrl:function(element,attrs){return attrs.templateUrl||"uib/template/accordion/accordion-group.html"},scope:{heading:"@",panelClass:"@?",isOpen:"=?",isDisabled:"=?"},controller:function(){this.setHeading=function(element){this.heading=element}},link:function(scope,element,attrs,accordionCtrl){element.addClass("panel"),accordionCtrl.addGroup(scope),scope.openClass=attrs.openClass||"panel-open",scope.panelClass=attrs.panelClass||"panel-default",scope.$watch("isOpen",function(value){element.toggleClass(scope.openClass,!!value),value&&accordionCtrl.closeOthers(scope)}),scope.toggleOpen=function($event){scope.isDisabled||$event&&32!==$event.which||(scope.isOpen=!scope.isOpen)};var id="accordiongroup-"+scope.$id+"-"+Math.floor(1e4*Math.random());scope.headingId=id+"-tab",scope.panelId=id+"-panel"}}}).directive("uibAccordionHeading",function(){return{transclude:!0,template:"",replace:!0,require:"^uibAccordionGroup",link:function(scope,element,attrs,accordionGroupCtrl,transclude){accordionGroupCtrl.setHeading(transclude(scope,angular.noop))}}}).directive("uibAccordionTransclude",function(){function getHeaderSelectors(){return"uib-accordion-header,data-uib-accordion-header,x-uib-accordion-header,uib\\:accordion-header,[uib-accordion-header],[data-uib-accordion-header],[x-uib-accordion-header]"}return{require:"^uibAccordionGroup",link:function(scope,element,attrs,controller){scope.$watch(function(){return controller[attrs.uibAccordionTransclude]},function(heading){if(heading){var elem=angular.element(element[0].querySelector(getHeaderSelectors()));elem.html(""),elem.append(heading)}})}}}),angular.module("ui.bootstrap.alert",[]).controller("UibAlertController",["$scope","$element","$attrs","$interpolate","$timeout",function($scope,$element,$attrs,$interpolate,$timeout){$scope.closeable=!!$attrs.close,$element.addClass("alert"),$attrs.$set("role","alert"),$scope.closeable&&$element.addClass("alert-dismissible");var dismissOnTimeout=angular.isDefined($attrs.dismissOnTimeout)?$interpolate($attrs.dismissOnTimeout)($scope.$parent):null;dismissOnTimeout&&$timeout(function(){$scope.close()},parseInt(dismissOnTimeout,10))}]).directive("uibAlert",function(){return{controller:"UibAlertController",controllerAs:"alert",restrict:"A",templateUrl:function(element,attrs){return attrs.templateUrl||"uib/template/alert/alert.html"},transclude:!0,scope:{close:"&"}}}),angular.module("ui.bootstrap.buttons",[]).constant("uibButtonConfig",{activeClass:"active",toggleEvent:"click"}).controller("UibButtonsController",["uibButtonConfig",function(buttonConfig){this.activeClass=buttonConfig.activeClass||"active",this.toggleEvent=buttonConfig.toggleEvent||"click"}]).directive("uibBtnRadio",["$parse",function($parse){return{require:["uibBtnRadio","ngModel"],controller:"UibButtonsController",controllerAs:"buttons",link:function(scope,element,attrs,ctrls){var buttonsCtrl=ctrls[0],ngModelCtrl=ctrls[1],uncheckableExpr=$parse(attrs.uibUncheckable);element.find("input").css({display:"none"}),ngModelCtrl.$render=function(){element.toggleClass(buttonsCtrl.activeClass,angular.equals(ngModelCtrl.$modelValue,scope.$eval(attrs.uibBtnRadio)))},element.on(buttonsCtrl.toggleEvent,function(){if(!attrs.disabled){var isActive=element.hasClass(buttonsCtrl.activeClass);isActive&&!angular.isDefined(attrs.uncheckable)||scope.$apply(function(){ngModelCtrl.$setViewValue(isActive?null:scope.$eval(attrs.uibBtnRadio)),ngModelCtrl.$render()})}}),attrs.uibUncheckable&&scope.$watch(uncheckableExpr,function(uncheckable){attrs.$set("uncheckable",uncheckable?"":void 0)})}}}]).directive("uibBtnCheckbox",function(){return{require:["uibBtnCheckbox","ngModel"],controller:"UibButtonsController",controllerAs:"button",link:function(scope,element,attrs,ctrls){function getTrueValue(){return getCheckboxValue(attrs.btnCheckboxTrue,!0)}function getFalseValue(){return getCheckboxValue(attrs.btnCheckboxFalse,!1)}function getCheckboxValue(attribute,defaultValue){return angular.isDefined(attribute)?scope.$eval(attribute):defaultValue}var buttonsCtrl=ctrls[0],ngModelCtrl=ctrls[1];element.find("input").css({display:"none"}),ngModelCtrl.$render=function(){element.toggleClass(buttonsCtrl.activeClass,angular.equals(ngModelCtrl.$modelValue,getTrueValue()))},element.on(buttonsCtrl.toggleEvent,function(){attrs.disabled||scope.$apply(function(){ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass)?getFalseValue():getTrueValue()),ngModelCtrl.$render()})})}}}),angular.module("ui.bootstrap.carousel",[]).controller("UibCarouselController",["$scope","$element","$interval","$timeout","$animate",function($scope,$element,$interval,$timeout,$animate){function setActive(index){for(var i=0;i<slides.length;i++)slides[i].slide.active=i===index}function goNext(slide,index,direction){if(!destroyed){if(angular.extend(slide,{direction:direction}),angular.extend(slides[currentIndex].slide||{},{direction:direction}),$animate.enabled($element)&&!$scope.$currentTransition&&slides[index].element&&self.slides.length>1){slides[index].element.data(SLIDE_DIRECTION,slide.direction);var currentIdx=self.getCurrentIndex();angular.isNumber(currentIdx)&&slides[currentIdx].element&&slides[currentIdx].element.data(SLIDE_DIRECTION,slide.direction),$scope.$currentTransition=!0,$animate.on("addClass",slides[index].element,function(element,phase){"close"===phase&&($scope.$currentTransition=null,$animate.off("addClass",element))})}$scope.active=slide.index,currentIndex=slide.index,setActive(index),restartTimer()}}function findSlideIndex(slide){for(var i=0;i<slides.length;i++)if(slides[i].slide===slide)return i}function resetTimer(){currentInterval&&($interval.cancel(currentInterval),currentInterval=null)}function resetTransition(slides){slides.length||($scope.$currentTransition=null)}function restartTimer(){resetTimer();var interval=+$scope.interval;!isNaN(interval)&&interval>0&&(currentInterval=$interval(timerFn,interval))}function timerFn(){var interval=+$scope.interval;isPlaying&&!isNaN(interval)&&interval>0&&slides.length?$scope.next():$scope.pause()}var currentInterval,isPlaying,self=this,slides=self.slides=$scope.slides=[],SLIDE_DIRECTION="uib-slideDirection",currentIndex=$scope.active,destroyed=!1;$element.addClass("carousel"),self.addSlide=function(slide,element){slides.push({slide:slide,element:element}),slides.sort(function(a,b){return+a.slide.index-+b.slide.index}),(slide.index===$scope.active||1===slides.length&&!angular.isNumber($scope.active))&&($scope.$currentTransition&&($scope.$currentTransition=null),currentIndex=slide.index,$scope.active=slide.index,setActive(currentIndex),self.select(slides[findSlideIndex(slide)]),1===slides.length&&$scope.play())},self.getCurrentIndex=function(){for(var i=0;i<slides.length;i++)if(slides[i].slide.index===currentIndex)return i},self.next=$scope.next=function(){var newIndex=(self.getCurrentIndex()+1)%slides.length;return 0===newIndex&&$scope.noWrap()?void $scope.pause():self.select(slides[newIndex],"next")},self.prev=$scope.prev=function(){var newIndex=self.getCurrentIndex()-1<0?slides.length-1:self.getCurrentIndex()-1;return $scope.noWrap()&&newIndex===slides.length-1?void $scope.pause():self.select(slides[newIndex],"prev")},self.removeSlide=function(slide){var index=findSlideIndex(slide);slides.splice(index,1),slides.length>0&&currentIndex===index?index>=slides.length?(currentIndex=slides.length-1,$scope.active=currentIndex,setActive(currentIndex),self.select(slides[slides.length-1])):(currentIndex=index,$scope.active=currentIndex,setActive(currentIndex),self.select(slides[index])):currentIndex>index&&(currentIndex--,$scope.active=currentIndex),0===slides.length&&(currentIndex=null,$scope.active=null)},self.select=$scope.select=function(nextSlide,direction){var nextIndex=findSlideIndex(nextSlide.slide);void 0===direction&&(direction=nextIndex>self.getCurrentIndex()?"next":"prev"),nextSlide.slide.index===currentIndex||$scope.$currentTransition||goNext(nextSlide.slide,nextIndex,direction)},$scope.indexOfSlide=function(slide){return+slide.slide.index},$scope.isActive=function(slide){return $scope.active===slide.slide.index},$scope.isPrevDisabled=function(){return 0===$scope.active&&$scope.noWrap()},$scope.isNextDisabled=function(){return $scope.active===slides.length-1&&$scope.noWrap()},$scope.pause=function(){$scope.noPause||(isPlaying=!1,resetTimer())},$scope.play=function(){isPlaying||(isPlaying=!0,restartTimer())},$element.on("mouseenter",$scope.pause),$element.on("mouseleave",$scope.play),$scope.$on("$destroy",function(){destroyed=!0,resetTimer()}),$scope.$watch("noTransition",function(noTransition){$animate.enabled($element,!noTransition);
}),$scope.$watch("interval",restartTimer),$scope.$watchCollection("slides",resetTransition),$scope.$watch("active",function(index){if(angular.isNumber(index)&&currentIndex!==index){for(var i=0;i<slides.length;i++)if(slides[i].slide.index===index){index=i;break}var slide=slides[index];slide&&(setActive(index),self.select(slides[index]),currentIndex=index)}})}]).directive("uibCarousel",function(){return{transclude:!0,controller:"UibCarouselController",controllerAs:"carousel",restrict:"A",templateUrl:function(element,attrs){return attrs.templateUrl||"uib/template/carousel/carousel.html"},scope:{active:"=",interval:"=",noTransition:"=",noPause:"=",noWrap:"&"}}}).directive("uibSlide",["$animate",function($animate){return{require:"^uibCarousel",restrict:"A",transclude:!0,templateUrl:function(element,attrs){return attrs.templateUrl||"uib/template/carousel/slide.html"},scope:{actual:"=?",index:"=?"},link:function(scope,element,attrs,carouselCtrl){element.addClass("item"),carouselCtrl.addSlide(scope,element),scope.$on("$destroy",function(){carouselCtrl.removeSlide(scope)}),scope.$watch("active",function(active){$animate[active?"addClass":"removeClass"](element,"active")})}}}]).animation(".item",["$animateCss",function($animateCss){function removeClass(element,className,callback){element.removeClass(className),callback&&callback()}var SLIDE_DIRECTION="uib-slideDirection";return{beforeAddClass:function(element,className,done){if("active"===className){var stopped=!1,direction=element.data(SLIDE_DIRECTION),directionClass="next"===direction?"left":"right",removeClassFn=removeClass.bind(this,element,directionClass+" "+direction,done);return element.addClass(direction),$animateCss(element,{addClass:directionClass}).start().done(removeClassFn),function(){stopped=!0}}done()},beforeRemoveClass:function(element,className,done){if("active"===className){var stopped=!1,direction=element.data(SLIDE_DIRECTION),directionClass="next"===direction?"left":"right",removeClassFn=removeClass.bind(this,element,directionClass,done);return $animateCss(element,{addClass:directionClass}).start().done(removeClassFn),function(){stopped=!0}}done()}}}]),angular.module("ui.bootstrap.dateparser",[]).service("uibDateParser",["$log","$locale","dateFilter","orderByFilter","filterFilter",function($log,$locale,dateFilter,orderByFilter,filterFilter){function getFormatCodeToRegex(key){return filterFilter(formatCodeToRegex,{key:key},!0)[0]}function createParser(format){var map=[],regex=format.split(""),quoteIndex=format.indexOf("'");if(quoteIndex>-1){var inLiteral=!1;format=format.split("");for(var i=quoteIndex;i<format.length;i++)inLiteral?("'"===format[i]&&(i+1<format.length&&"'"===format[i+1]?(format[i+1]="$",regex[i+1]=""):(regex[i]="",inLiteral=!1)),format[i]="$"):"'"===format[i]&&(format[i]="$",regex[i]="",inLiteral=!0);format=format.join("")}return angular.forEach(formatCodeToRegex,function(data){var index=format.indexOf(data.key);if(index>-1){format=format.split(""),regex[index]="("+data.regex+")",format[index]="$";for(var i=index+1,n=index+data.key.length;i<n;i++)regex[i]="",format[i]="$";format=format.join(""),map.push({index:index,key:data.key,apply:data.apply,matcher:data.regex})}}),{regex:new RegExp("^"+regex.join("")+"$"),map:orderByFilter(map,"index")}}function createFormatter(format){for(var formatter,literalIdx,formatters=[],i=0;i<format.length;)if(angular.isNumber(literalIdx)){if("'"===format.charAt(i))(i+1>=format.length||"'"!==format.charAt(i+1))&&(formatters.push(constructLiteralFormatter(format,literalIdx,i)),literalIdx=null);else if(i===format.length)for(;literalIdx<format.length;)formatter=constructFormatterFromIdx(format,literalIdx),formatters.push(formatter),literalIdx=formatter.endIdx;i++}else"'"!==format.charAt(i)?(formatter=constructFormatterFromIdx(format,i),formatters.push(formatter.parser),i=formatter.endIdx):(literalIdx=i,i++);return formatters}function constructLiteralFormatter(format,literalIdx,endIdx){return function(){return format.substr(literalIdx+1,endIdx-literalIdx-1)}}function constructFormatterFromIdx(format,i){for(var currentPosStr=format.substr(i),j=0;j<formatCodeToRegex.length;j++)if(new RegExp("^"+formatCodeToRegex[j].key).test(currentPosStr)){var data=formatCodeToRegex[j];return{endIdx:i+data.key.length,parser:data.formatter}}return{endIdx:i+1,parser:function(){return currentPosStr.charAt(0)}}}function isValid(year,month,date){return!(date<1)&&(1===month&&date>28?29===date&&(year%4===0&&year%100!==0||year%400===0):3!==month&&5!==month&&8!==month&&10!==month||date<31)}function toInt(str){return parseInt(str,10)}function toTimezone(date,timezone){return date&&timezone?convertTimezoneToLocal(date,timezone):date}function fromTimezone(date,timezone){return date&&timezone?convertTimezoneToLocal(date,timezone,!0):date}function timezoneToOffset(timezone,fallback){timezone=timezone.replace(/:/g,"");var requestedTimezoneOffset=Date.parse("Jan 01, 1970 00:00:00 "+timezone)/6e4;return isNaN(requestedTimezoneOffset)?fallback:requestedTimezoneOffset}function addDateMinutes(date,minutes){return date=new Date(date.getTime()),date.setMinutes(date.getMinutes()+minutes),date}function convertTimezoneToLocal(date,timezone,reverse){reverse=reverse?-1:1;var dateTimezoneOffset=date.getTimezoneOffset(),timezoneOffset=timezoneToOffset(timezone,dateTimezoneOffset);return addDateMinutes(date,reverse*(timezoneOffset-dateTimezoneOffset))}var localeId,formatCodeToRegex,SPECIAL_CHARACTERS_REGEXP=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;this.init=function(){localeId=$locale.id,this.parsers={},this.formatters={},formatCodeToRegex=[{key:"yyyy",regex:"\\d{4}",apply:function(value){this.year=+value},formatter:function(date){var _date=new Date;return _date.setFullYear(Math.abs(date.getFullYear())),dateFilter(_date,"yyyy")}},{key:"yy",regex:"\\d{2}",apply:function(value){value=+value,this.year=value<69?value+2e3:value+1900},formatter:function(date){var _date=new Date;return _date.setFullYear(Math.abs(date.getFullYear())),dateFilter(_date,"yy")}},{key:"y",regex:"\\d{1,4}",apply:function(value){this.year=+value},formatter:function(date){var _date=new Date;return _date.setFullYear(Math.abs(date.getFullYear())),dateFilter(_date,"y")}},{key:"M!",regex:"0?[1-9]|1[0-2]",apply:function(value){this.month=value-1},formatter:function(date){var value=date.getMonth();return/^[0-9]$/.test(value)?dateFilter(date,"MM"):dateFilter(date,"M")}},{key:"MMMM",regex:$locale.DATETIME_FORMATS.MONTH.join("|"),apply:function(value){this.month=$locale.DATETIME_FORMATS.MONTH.indexOf(value)},formatter:function(date){return dateFilter(date,"MMMM")}},{key:"MMM",regex:$locale.DATETIME_FORMATS.SHORTMONTH.join("|"),apply:function(value){this.month=$locale.DATETIME_FORMATS.SHORTMONTH.indexOf(value)},formatter:function(date){return dateFilter(date,"MMM")}},{key:"MM",regex:"0[1-9]|1[0-2]",apply:function(value){this.month=value-1},formatter:function(date){return dateFilter(date,"MM")}},{key:"M",regex:"[1-9]|1[0-2]",apply:function(value){this.month=value-1},formatter:function(date){return dateFilter(date,"M")}},{key:"d!",regex:"[0-2]?[0-9]{1}|3[0-1]{1}",apply:function(value){this.date=+value},formatter:function(date){var value=date.getDate();return/^[1-9]$/.test(value)?dateFilter(date,"dd"):dateFilter(date,"d")}},{key:"dd",regex:"[0-2][0-9]{1}|3[0-1]{1}",apply:function(value){this.date=+value},formatter:function(date){return dateFilter(date,"dd")}},{key:"d",regex:"[1-2]?[0-9]{1}|3[0-1]{1}",apply:function(value){this.date=+value},formatter:function(date){return dateFilter(date,"d")}},{key:"EEEE",regex:$locale.DATETIME_FORMATS.DAY.join("|"),formatter:function(date){return dateFilter(date,"EEEE")}},{key:"EEE",regex:$locale.DATETIME_FORMATS.SHORTDAY.join("|"),formatter:function(date){return dateFilter(date,"EEE")}},{key:"HH",regex:"(?:0|1)[0-9]|2[0-3]",apply:function(value){this.hours=+value},formatter:function(date){return dateFilter(date,"HH")}},{key:"hh",regex:"0[0-9]|1[0-2]",apply:function(value){this.hours=+value},formatter:function(date){return dateFilter(date,"hh")}},{key:"H",regex:"1?[0-9]|2[0-3]",apply:function(value){this.hours=+value},formatter:function(date){return dateFilter(date,"H")}},{key:"h",regex:"[0-9]|1[0-2]",apply:function(value){this.hours=+value},formatter:function(date){return dateFilter(date,"h")}},{key:"mm",regex:"[0-5][0-9]",apply:function(value){this.minutes=+value},formatter:function(date){return dateFilter(date,"mm")}},{key:"m",regex:"[0-9]|[1-5][0-9]",apply:function(value){this.minutes=+value},formatter:function(date){return dateFilter(date,"m")}},{key:"sss",regex:"[0-9][0-9][0-9]",apply:function(value){this.milliseconds=+value},formatter:function(date){return dateFilter(date,"sss")}},{key:"ss",regex:"[0-5][0-9]",apply:function(value){this.seconds=+value},formatter:function(date){return dateFilter(date,"ss")}},{key:"s",regex:"[0-9]|[1-5][0-9]",apply:function(value){this.seconds=+value},formatter:function(date){return dateFilter(date,"s")}},{key:"a",regex:$locale.DATETIME_FORMATS.AMPMS.join("|"),apply:function(value){12===this.hours&&(this.hours=0),"PM"===value&&(this.hours+=12)},formatter:function(date){return dateFilter(date,"a")}},{key:"Z",regex:"[+-]\\d{4}",apply:function(value){var matches=value.match(/([+-])(\d{2})(\d{2})/),sign=matches[1],hours=matches[2],minutes=matches[3];this.hours+=toInt(sign+hours),this.minutes+=toInt(sign+minutes)},formatter:function(date){return dateFilter(date,"Z")}},{key:"ww",regex:"[0-4][0-9]|5[0-3]",formatter:function(date){return dateFilter(date,"ww")}},{key:"w",regex:"[0-9]|[1-4][0-9]|5[0-3]",formatter:function(date){return dateFilter(date,"w")}},{key:"GGGG",regex:$locale.DATETIME_FORMATS.ERANAMES.join("|").replace(/\s/g,"\\s"),formatter:function(date){return dateFilter(date,"GGGG")}},{key:"GGG",regex:$locale.DATETIME_FORMATS.ERAS.join("|"),formatter:function(date){return dateFilter(date,"GGG")}},{key:"GG",regex:$locale.DATETIME_FORMATS.ERAS.join("|"),formatter:function(date){return dateFilter(date,"GG")}},{key:"G",regex:$locale.DATETIME_FORMATS.ERAS.join("|"),formatter:function(date){return dateFilter(date,"G")}}],angular.version.major>=1&&angular.version.minor>4&&formatCodeToRegex.push({key:"LLLL",regex:$locale.DATETIME_FORMATS.STANDALONEMONTH.join("|"),apply:function(value){this.month=$locale.DATETIME_FORMATS.STANDALONEMONTH.indexOf(value)},formatter:function(date){return dateFilter(date,"LLLL")}})},this.init(),this.getParser=function(key){var f=getFormatCodeToRegex(key);return f&&f.apply||null},this.overrideParser=function(key,parser){var f=getFormatCodeToRegex(key);f&&angular.isFunction(parser)&&(this.parsers={},f.apply=parser)}.bind(this),this.filter=function(date,format){if(!angular.isDate(date)||isNaN(date)||!format)return"";format=$locale.DATETIME_FORMATS[format]||format,$locale.id!==localeId&&this.init(),this.formatters[format]||(this.formatters[format]=createFormatter(format));var formatters=this.formatters[format];return formatters.reduce(function(str,formatter){return str+formatter(date)},"")},this.parse=function(input,format,baseDate){if(!angular.isString(input)||!format)return input;format=$locale.DATETIME_FORMATS[format]||format,format=format.replace(SPECIAL_CHARACTERS_REGEXP,"\\$&"),$locale.id!==localeId&&this.init(),this.parsers[format]||(this.parsers[format]=createParser(format,"apply"));var parser=this.parsers[format],regex=parser.regex,map=parser.map,results=input.match(regex),tzOffset=!1;if(results&&results.length){var fields,dt;angular.isDate(baseDate)&&!isNaN(baseDate.getTime())?fields={year:baseDate.getFullYear(),month:baseDate.getMonth(),date:baseDate.getDate(),hours:baseDate.getHours(),minutes:baseDate.getMinutes(),seconds:baseDate.getSeconds(),milliseconds:baseDate.getMilliseconds()}:(baseDate&&$log.warn("dateparser:","baseDate is not a valid date"),fields={year:1900,month:0,date:1,hours:0,minutes:0,seconds:0,milliseconds:0});for(var i=1,n=results.length;i<n;i++){var mapper=map[i-1];"Z"===mapper.matcher&&(tzOffset=!0),mapper.apply&&mapper.apply.call(fields,results[i])}var datesetter=tzOffset?Date.prototype.setUTCFullYear:Date.prototype.setFullYear,timesetter=tzOffset?Date.prototype.setUTCHours:Date.prototype.setHours;return isValid(fields.year,fields.month,fields.date)&&(!angular.isDate(baseDate)||isNaN(baseDate.getTime())||tzOffset?(dt=new Date(0),datesetter.call(dt,fields.year,fields.month,fields.date),timesetter.call(dt,fields.hours||0,fields.minutes||0,fields.seconds||0,fields.milliseconds||0)):(dt=new Date(baseDate),datesetter.call(dt,fields.year,fields.month,fields.date),timesetter.call(dt,fields.hours,fields.minutes,fields.seconds,fields.milliseconds))),dt}},this.toTimezone=toTimezone,this.fromTimezone=fromTimezone,this.timezoneToOffset=timezoneToOffset,this.addDateMinutes=addDateMinutes,this.convertTimezoneToLocal=convertTimezoneToLocal}]),angular.module("ui.bootstrap.isClass",[]).directive("uibIsClass",["$animate",function($animate){var ON_REGEXP=/^\s*([\s\S]+?)\s+on\s+([\s\S]+?)\s*$/,IS_REGEXP=/^\s*([\s\S]+?)\s+for\s+([\s\S]+?)\s*$/;return{restrict:"A",compile:function(tElement,tAttrs){function linkFn(scope,element,attrs){linkedScopes.push(scope),instances.push({scope:scope,element:element}),exps.forEach(function(exp,k){addForExp(exp,scope)}),scope.$on("$destroy",removeScope)}function addForExp(exp,scope){var matches=exp.match(IS_REGEXP),clazz=scope.$eval(matches[1]),compareWithExp=matches[2],data=expToData[exp];if(!data){var watchFn=function(compareWithVal){var newActivated=null;instances.some(function(instance){var thisVal=instance.scope.$eval(onExp);if(thisVal===compareWithVal)return newActivated=instance,!0}),data.lastActivated!==newActivated&&(data.lastActivated&&$animate.removeClass(data.lastActivated.element,clazz),newActivated&&$animate.addClass(newActivated.element,clazz),data.lastActivated=newActivated)};expToData[exp]=data={lastActivated:null,scope:scope,watchFn:watchFn,compareWithExp:compareWithExp,watcher:scope.$watch(compareWithExp,watchFn)}}data.watchFn(scope.$eval(compareWithExp))}function removeScope(e){var removedScope=e.targetScope,index=linkedScopes.indexOf(removedScope);if(linkedScopes.splice(index,1),instances.splice(index,1),linkedScopes.length){var newWatchScope=linkedScopes[0];angular.forEach(expToData,function(data){data.scope===removedScope&&(data.watcher=newWatchScope.$watch(data.compareWithExp,data.watchFn),data.scope=newWatchScope)})}else expToData={}}var linkedScopes=[],instances=[],expToData={},onExpMatches=tAttrs.uibIsClass.match(ON_REGEXP),onExp=onExpMatches[2],expsStr=onExpMatches[1],exps=expsStr.split(",");return linkFn}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.dateparser","ui.bootstrap.isClass"]).value("$datepickerSuppressError",!1).value("$datepickerLiteralWarning",!0).constant("uibDatepickerConfig",{datepickerMode:"day",formatDay:"dd",formatMonth:"MMMM",formatYear:"yyyy",formatDayHeader:"EEE",formatDayTitle:"MMMM yyyy",formatMonthTitle:"yyyy",maxDate:null,maxMode:"year",minDate:null,minMode:"day",monthColumns:3,ngModelOptions:{},shortcutPropagation:!1,showWeeks:!0,yearColumns:5,yearRows:4}).controller("UibDatepickerController",["$scope","$element","$attrs","$parse","$interpolate","$locale","$log","dateFilter","uibDatepickerConfig","$datepickerLiteralWarning","$datepickerSuppressError","uibDateParser",function($scope,$element,$attrs,$parse,$interpolate,$locale,$log,dateFilter,datepickerConfig,$datepickerLiteralWarning,$datepickerSuppressError,dateParser){function setMode(mode){$scope.datepickerMode=mode,$scope.datepickerOptions.datepickerMode=mode}function extractOptions(ngModelCtrl){var ngModelOptions;if(angular.version.minor<6)ngModelOptions=ngModelCtrl.$options||$scope.datepickerOptions.ngModelOptions||datepickerConfig.ngModelOptions||{},ngModelOptions.getOption=function(key){return ngModelOptions[key]};else{var timezone=ngModelCtrl.$options.getOption("timezone")||($scope.datepickerOptions.ngModelOptions?$scope.datepickerOptions.ngModelOptions.timezone:null)||(datepickerConfig.ngModelOptions?datepickerConfig.ngModelOptions.timezone:null);ngModelOptions=ngModelCtrl.$options.createChild(datepickerConfig.ngModelOptions).createChild($scope.datepickerOptions.ngModelOptions).createChild(ngModelCtrl.$options).createChild({timezone:timezone})}return ngModelOptions}var self=this,ngModelCtrl={$setViewValue:angular.noop},ngModelOptions={},watchListeners=[];$element.addClass("uib-datepicker"),$attrs.$set("role","application"),$scope.datepickerOptions||($scope.datepickerOptions={}),this.modes=["day","month","year"],["customClass","dateDisabled","datepickerMode","formatDay","formatDayHeader","formatDayTitle","formatMonth","formatMonthTitle","formatYear","maxDate","maxMode","minDate","minMode","monthColumns","showWeeks","shortcutPropagation","startingDay","yearColumns","yearRows"].forEach(function(key){switch(key){case"customClass":case"dateDisabled":$scope[key]=$scope.datepickerOptions[key]||angular.noop;break;case"datepickerMode":$scope.datepickerMode=angular.isDefined($scope.datepickerOptions.datepickerMode)?$scope.datepickerOptions.datepickerMode:datepickerConfig.datepickerMode;break;case"formatDay":case"formatDayHeader":case"formatDayTitle":case"formatMonth":case"formatMonthTitle":case"formatYear":self[key]=angular.isDefined($scope.datepickerOptions[key])?$interpolate($scope.datepickerOptions[key])($scope.$parent):datepickerConfig[key];break;case"monthColumns":case"showWeeks":case"shortcutPropagation":case"yearColumns":case"yearRows":self[key]=angular.isDefined($scope.datepickerOptions[key])?$scope.datepickerOptions[key]:datepickerConfig[key];break;case"startingDay":angular.isDefined($scope.datepickerOptions.startingDay)?self.startingDay=$scope.datepickerOptions.startingDay:angular.isNumber(datepickerConfig.startingDay)?self.startingDay=datepickerConfig.startingDay:self.startingDay=($locale.DATETIME_FORMATS.FIRSTDAYOFWEEK+8)%7;break;case"maxDate":case"minDate":$scope.$watch("datepickerOptions."+key,function(value){value?angular.isDate(value)?self[key]=dateParser.fromTimezone(new Date(value),ngModelOptions.getOption("timezone")):($datepickerLiteralWarning&&$log.warn("Literal date support has been deprecated, please switch to date object usage"),self[key]=new Date(dateFilter(value,"medium"))):self[key]=datepickerConfig[key]?dateParser.fromTimezone(new Date(datepickerConfig[key]),ngModelOptions.getOption("timezone")):null,self.refreshView()});break;case"maxMode":case"minMode":$scope.datepickerOptions[key]?$scope.$watch(function(){return $scope.datepickerOptions[key]},function(value){self[key]=$scope[key]=angular.isDefined(value)?value:$scope.datepickerOptions[key],("minMode"===key&&self.modes.indexOf($scope.datepickerOptions.datepickerMode)<self.modes.indexOf(self[key])||"maxMode"===key&&self.modes.indexOf($scope.datepickerOptions.datepickerMode)>self.modes.indexOf(self[key]))&&($scope.datepickerMode=self[key],$scope.datepickerOptions.datepickerMode=self[key])}):self[key]=$scope[key]=datepickerConfig[key]||null}}),$scope.uniqueId="datepicker-"+$scope.$id+"-"+Math.floor(1e4*Math.random()),$scope.disabled=angular.isDefined($attrs.disabled)||!1,angular.isDefined($attrs.ngDisabled)&&watchListeners.push($scope.$parent.$watch($attrs.ngDisabled,function(disabled){$scope.disabled=disabled,self.refreshView()})),$scope.isActive=function(dateObject){return 0===self.compare(dateObject.date,self.activeDate)&&($scope.activeDateId=dateObject.uid,!0)},this.init=function(ngModelCtrl_){ngModelCtrl=ngModelCtrl_,ngModelOptions=extractOptions(ngModelCtrl),$scope.datepickerOptions.initDate?(self.activeDate=dateParser.fromTimezone($scope.datepickerOptions.initDate,ngModelOptions.getOption("timezone"))||new Date,$scope.$watch("datepickerOptions.initDate",function(initDate){initDate&&(ngModelCtrl.$isEmpty(ngModelCtrl.$modelValue)||ngModelCtrl.$invalid)&&(self.activeDate=dateParser.fromTimezone(initDate,ngModelOptions.getOption("timezone")),self.refreshView())})):self.activeDate=new Date;var date=ngModelCtrl.$modelValue?new Date(ngModelCtrl.$modelValue):new Date;this.activeDate=isNaN(date)?dateParser.fromTimezone(new Date,ngModelOptions.getOption("timezone")):dateParser.fromTimezone(date,ngModelOptions.getOption("timezone")),ngModelCtrl.$render=function(){self.render()}},this.render=function(){if(ngModelCtrl.$viewValue){var date=new Date(ngModelCtrl.$viewValue),isValid=!isNaN(date);isValid?this.activeDate=dateParser.fromTimezone(date,ngModelOptions.getOption("timezone")):$datepickerSuppressError||$log.error('Datepicker directive: "ng-model" value must be a Date object')}this.refreshView()},this.refreshView=function(){if(this.element){$scope.selectedDt=null,this._refreshView(),$scope.activeDt&&($scope.activeDateId=$scope.activeDt.uid);var date=ngModelCtrl.$viewValue?new Date(ngModelCtrl.$viewValue):null;date=dateParser.fromTimezone(date,ngModelOptions.getOption("timezone")),ngModelCtrl.$setValidity("dateDisabled",!date||this.element&&!this.isDisabled(date))}},this.createDateObject=function(date,format){var model=ngModelCtrl.$viewValue?new Date(ngModelCtrl.$viewValue):null;model=dateParser.fromTimezone(model,ngModelOptions.getOption("timezone"));var today=new Date;today=dateParser.fromTimezone(today,ngModelOptions.getOption("timezone"));var time=this.compare(date,today),dt={date:date,label:dateParser.filter(date,format),selected:model&&0===this.compare(date,model),disabled:this.isDisabled(date),past:time<0,current:0===time,future:time>0,customClass:this.customClass(date)||null};return model&&0===this.compare(date,model)&&($scope.selectedDt=dt),self.activeDate&&0===this.compare(dt.date,self.activeDate)&&($scope.activeDt=dt),dt},this.isDisabled=function(date){return $scope.disabled||this.minDate&&this.compare(date,this.minDate)<0||this.maxDate&&this.compare(date,this.maxDate)>0||$scope.dateDisabled&&$scope.dateDisabled({date:date,mode:$scope.datepickerMode})},this.customClass=function(date){return $scope.customClass({date:date,mode:$scope.datepickerMode})},this.split=function(arr,size){for(var arrays=[];arr.length>0;)arrays.push(arr.splice(0,size));return arrays},$scope.select=function(date){if($scope.datepickerMode===self.minMode){var dt=ngModelCtrl.$viewValue?dateParser.fromTimezone(new Date(ngModelCtrl.$viewValue),ngModelOptions.getOption("timezone")):new Date(0,0,0,0,0,0,0);dt.setFullYear(date.getFullYear(),date.getMonth(),date.getDate()),dt=dateParser.toTimezone(dt,ngModelOptions.getOption("timezone")),ngModelCtrl.$setViewValue(dt),ngModelCtrl.$render()}else self.activeDate=date,setMode(self.modes[self.modes.indexOf($scope.datepickerMode)-1]),$scope.$emit("uib:datepicker.mode");$scope.$broadcast("uib:datepicker.focus")},$scope.move=function(direction){var year=self.activeDate.getFullYear()+direction*(self.step.years||0),month=self.activeDate.getMonth()+direction*(self.step.months||0);self.activeDate.setFullYear(year,month,1),self.refreshView()},$scope.toggleMode=function(direction){direction=direction||1,$scope.datepickerMode===self.maxMode&&1===direction||$scope.datepickerMode===self.minMode&&direction===-1||(setMode(self.modes[self.modes.indexOf($scope.datepickerMode)+direction]),$scope.$emit("uib:datepicker.mode"))},$scope.keys={13:"enter",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down"};var focusElement=function(){self.element[0].focus()};$scope.$on("uib:datepicker.focus",focusElement),$scope.keydown=function(evt){var key=$scope.keys[evt.which];if(key&&!evt.shiftKey&&!evt.altKey&&!$scope.disabled)if(evt.preventDefault(),self.shortcutPropagation||evt.stopPropagation(),"enter"===key||"space"===key){if(self.isDisabled(self.activeDate))return;$scope.select(self.activeDate)}else!evt.ctrlKey||"up"!==key&&"down"!==key?(self.handleKeyDown(key,evt),self.refreshView()):$scope.toggleMode("up"===key?1:-1)},$element.on("keydown",function(evt){$scope.$apply(function(){$scope.keydown(evt)})}),$scope.$on("$destroy",function(){for(;watchListeners.length;)watchListeners.shift()()})}]).controller("UibDaypickerController",["$scope","$element","dateFilter",function(scope,$element,dateFilter){function getDaysInMonth(year,month){return 1!==month||year%4!==0||year%100===0&&year%400!==0?DAYS_IN_MONTH[month]:29}function getISO8601WeekNumber(date){var checkDate=new Date(date);checkDate.setDate(checkDate.getDate()+4-(checkDate.getDay()||7));var time=checkDate.getTime();return checkDate.setMonth(0),checkDate.setDate(1),Math.floor(Math.round((time-checkDate)/864e5)/7)+1}var DAYS_IN_MONTH=[31,28,31,30,31,30,31,31,30,31,30,31];this.step={months:1},this.element=$element,this.init=function(ctrl){angular.extend(ctrl,this),scope.showWeeks=ctrl.showWeeks,ctrl.refreshView()},this.getDates=function(startDate,n){for(var date,dates=new Array(n),current=new Date(startDate),i=0;i<n;)date=new Date(current),dates[i++]=date,current.setDate(current.getDate()+1);return dates},this._refreshView=function(){var year=this.activeDate.getFullYear(),month=this.activeDate.getMonth(),firstDayOfMonth=new Date(this.activeDate);firstDayOfMonth.setFullYear(year,month,1);var difference=this.startingDay-firstDayOfMonth.getDay(),numDisplayedFromPreviousMonth=difference>0?7-difference:-difference,firstDate=new Date(firstDayOfMonth);numDisplayedFromPreviousMonth>0&&firstDate.setDate(-numDisplayedFromPreviousMonth+1);for(var days=this.getDates(firstDate,42),i=0;i<42;i++)days[i]=angular.extend(this.createDateObject(days[i],this.formatDay),{secondary:days[i].getMonth()!==month,uid:scope.uniqueId+"-"+i});scope.labels=new Array(7);for(var j=0;j<7;j++)scope.labels[j]={abbr:dateFilter(days[j].date,this.formatDayHeader),full:dateFilter(days[j].date,"EEEE")};if(scope.title=dateFilter(this.activeDate,this.formatDayTitle),scope.rows=this.split(days,7),scope.showWeeks){scope.weekNumbers=[];for(var thursdayIndex=(11-this.startingDay)%7,numWeeks=scope.rows.length,curWeek=0;curWeek<numWeeks;curWeek++)scope.weekNumbers.push(getISO8601WeekNumber(scope.rows[curWeek][thursdayIndex].date))}},this.compare=function(date1,date2){var _date1=new Date(date1.getFullYear(),date1.getMonth(),date1.getDate()),_date2=new Date(date2.getFullYear(),date2.getMonth(),date2.getDate());return _date1.setFullYear(date1.getFullYear()),_date2.setFullYear(date2.getFullYear()),_date1-_date2},this.handleKeyDown=function(key,evt){var date=this.activeDate.getDate();if("left"===key)date-=1;else if("up"===key)date-=7;else if("right"===key)date+=1;else if("down"===key)date+=7;else if("pageup"===key||"pagedown"===key){var month=this.activeDate.getMonth()+("pageup"===key?-1:1);this.activeDate.setMonth(month,1),date=Math.min(getDaysInMonth(this.activeDate.getFullYear(),this.activeDate.getMonth()),date)}else"home"===key?date=1:"end"===key&&(date=getDaysInMonth(this.activeDate.getFullYear(),this.activeDate.getMonth()));this.activeDate.setDate(date)}}]).controller("UibMonthpickerController",["$scope","$element","dateFilter",function(scope,$element,dateFilter){this.step={years:1},this.element=$element,this.init=function(ctrl){angular.extend(ctrl,this),ctrl.refreshView()},this._refreshView=function(){for(var date,months=new Array(12),year=this.activeDate.getFullYear(),i=0;i<12;i++)date=new Date(this.activeDate),date.setFullYear(year,i,1),months[i]=angular.extend(this.createDateObject(date,this.formatMonth),{uid:scope.uniqueId+"-"+i});scope.title=dateFilter(this.activeDate,this.formatMonthTitle),scope.rows=this.split(months,this.monthColumns),scope.yearHeaderColspan=this.monthColumns>3?this.monthColumns-2:1},this.compare=function(date1,date2){var _date1=new Date(date1.getFullYear(),date1.getMonth()),_date2=new Date(date2.getFullYear(),date2.getMonth());return _date1.setFullYear(date1.getFullYear()),_date2.setFullYear(date2.getFullYear()),_date1-_date2},this.handleKeyDown=function(key,evt){var date=this.activeDate.getMonth();if("left"===key)date-=1;else if("up"===key)date-=this.monthColumns;else if("right"===key)date+=1;else if("down"===key)date+=this.monthColumns;else if("pageup"===key||"pagedown"===key){var year=this.activeDate.getFullYear()+("pageup"===key?-1:1);this.activeDate.setFullYear(year)}else"home"===key?date=0:"end"===key&&(date=11);this.activeDate.setMonth(date)}}]).controller("UibYearpickerController",["$scope","$element","dateFilter",function(scope,$element,dateFilter){function getStartingYear(year){return parseInt((year-1)/range,10)*range+1}var columns,range;this.element=$element,this.yearpickerInit=function(){columns=this.yearColumns,range=this.yearRows*columns,this.step={years:range}},this._refreshView=function(){for(var date,years=new Array(range),i=0,start=getStartingYear(this.activeDate.getFullYear());i<range;i++)date=new Date(this.activeDate),date.setFullYear(start+i,0,1),years[i]=angular.extend(this.createDateObject(date,this.formatYear),{uid:scope.uniqueId+"-"+i});scope.title=[years[0].label,years[range-1].label].join(" - "),scope.rows=this.split(years,columns),scope.columns=columns},this.compare=function(date1,date2){return date1.getFullYear()-date2.getFullYear()},this.handleKeyDown=function(key,evt){var date=this.activeDate.getFullYear();"left"===key?date-=1:"up"===key?date-=columns:"right"===key?date+=1:"down"===key?date+=columns:"pageup"===key||"pagedown"===key?date+=("pageup"===key?-1:1)*range:"home"===key?date=getStartingYear(this.activeDate.getFullYear()):"end"===key&&(date=getStartingYear(this.activeDate.getFullYear())+range-1),this.activeDate.setFullYear(date)}}]).directive("uibDatepicker",function(){return{templateUrl:function(element,attrs){return attrs.templateUrl||"uib/template/datepicker/datepicker.html"},scope:{datepickerOptions:"=?"},require:["uibDatepicker","^ngModel"],restrict:"A",controller:"UibDatepickerController",controllerAs:"datepicker",link:function(scope,element,attrs,ctrls){var datepickerCtrl=ctrls[0],ngModelCtrl=ctrls[1];datepickerCtrl.init(ngModelCtrl)}}}).directive("uibDaypicker",function(){return{templateUrl:function(element,attrs){return attrs.templateUrl||"uib/template/datepicker/day.html"},require:["^uibDatepicker","uibDaypicker"],restrict:"A",controller:"UibDaypickerController",link:function(scope,element,attrs,ctrls){var datepickerCtrl=ctrls[0],daypickerCtrl=ctrls[1];daypickerCtrl.init(datepickerCtrl)}}}).directive("uibMonthpicker",function(){return{templateUrl:function(element,attrs){return attrs.templateUrl||"uib/template/datepicker/month.html"},require:["^uibDatepicker","uibMonthpicker"],restrict:"A",controller:"UibMonthpickerController",link:function(scope,element,attrs,ctrls){var datepickerCtrl=ctrls[0],monthpickerCtrl=ctrls[1];monthpickerCtrl.init(datepickerCtrl)}}}).directive("uibYearpicker",function(){return{templateUrl:function(element,attrs){return attrs.templateUrl||"uib/template/datepicker/year.html"},require:["^uibDatepicker","uibYearpicker"],restrict:"A",controller:"UibYearpickerController",link:function(scope,element,attrs,ctrls){var ctrl=ctrls[0];angular.extend(ctrl,ctrls[1]),ctrl.yearpickerInit(),ctrl.refreshView()}}}),angular.module("ui.bootstrap.position",[]).factory("$uibPosition",["$document","$window",function($document,$window){var SCROLLBAR_WIDTH,BODY_SCROLLBAR_WIDTH,OVERFLOW_REGEX={normal:/(auto|scroll)/,hidden:/(auto|scroll|hidden)/},PLACEMENT_REGEX={auto:/\s?auto?\s?/i,primary:/^(top|bottom|left|right)$/,secondary:/^(top|bottom|left|right|center)$/,vertical:/^(top|bottom)$/},BODY_REGEX=/(HTML|BODY)/;return{getRawNode:function(elem){return elem.nodeName?elem:elem[0]||elem},parseStyle:function(value){return value=parseFloat(value),isFinite(value)?value:0},offsetParent:function(elem){function isStaticPositioned(el){return"static"===($window.getComputedStyle(el).position||"static")}elem=this.getRawNode(elem);for(var offsetParent=elem.offsetParent||$document[0].documentElement;offsetParent&&offsetParent!==$document[0].documentElement&&isStaticPositioned(offsetParent);)offsetParent=offsetParent.offsetParent;return offsetParent||$document[0].documentElement},scrollbarWidth:function(isBody){if(isBody){if(angular.isUndefined(BODY_SCROLLBAR_WIDTH)){var bodyElem=$document.find("body");bodyElem.addClass("uib-position-body-scrollbar-measure"),BODY_SCROLLBAR_WIDTH=$window.innerWidth-bodyElem[0].clientWidth,
BODY_SCROLLBAR_WIDTH=isFinite(BODY_SCROLLBAR_WIDTH)?BODY_SCROLLBAR_WIDTH:0,bodyElem.removeClass("uib-position-body-scrollbar-measure")}return BODY_SCROLLBAR_WIDTH}if(angular.isUndefined(SCROLLBAR_WIDTH)){var scrollElem=angular.element('<div class="uib-position-scrollbar-measure"></div>');$document.find("body").append(scrollElem),SCROLLBAR_WIDTH=scrollElem[0].offsetWidth-scrollElem[0].clientWidth,SCROLLBAR_WIDTH=isFinite(SCROLLBAR_WIDTH)?SCROLLBAR_WIDTH:0,scrollElem.remove()}return SCROLLBAR_WIDTH},scrollbarPadding:function(elem){elem=this.getRawNode(elem);var elemStyle=$window.getComputedStyle(elem),paddingRight=this.parseStyle(elemStyle.paddingRight),paddingBottom=this.parseStyle(elemStyle.paddingBottom),scrollParent=this.scrollParent(elem,!1,!0),scrollbarWidth=this.scrollbarWidth(BODY_REGEX.test(scrollParent.tagName));return{scrollbarWidth:scrollbarWidth,widthOverflow:scrollParent.scrollWidth>scrollParent.clientWidth,right:paddingRight+scrollbarWidth,originalRight:paddingRight,heightOverflow:scrollParent.scrollHeight>scrollParent.clientHeight,bottom:paddingBottom+scrollbarWidth,originalBottom:paddingBottom}},isScrollable:function(elem,includeHidden){elem=this.getRawNode(elem);var overflowRegex=includeHidden?OVERFLOW_REGEX.hidden:OVERFLOW_REGEX.normal,elemStyle=$window.getComputedStyle(elem);return overflowRegex.test(elemStyle.overflow+elemStyle.overflowY+elemStyle.overflowX)},scrollParent:function(elem,includeHidden,includeSelf){elem=this.getRawNode(elem);var overflowRegex=includeHidden?OVERFLOW_REGEX.hidden:OVERFLOW_REGEX.normal,documentEl=$document[0].documentElement,elemStyle=$window.getComputedStyle(elem);if(includeSelf&&overflowRegex.test(elemStyle.overflow+elemStyle.overflowY+elemStyle.overflowX))return elem;var excludeStatic="absolute"===elemStyle.position,scrollParent=elem.parentElement||documentEl;if(scrollParent===documentEl||"fixed"===elemStyle.position)return documentEl;for(;scrollParent.parentElement&&scrollParent!==documentEl;){var spStyle=$window.getComputedStyle(scrollParent);if(excludeStatic&&"static"!==spStyle.position&&(excludeStatic=!1),!excludeStatic&&overflowRegex.test(spStyle.overflow+spStyle.overflowY+spStyle.overflowX))break;scrollParent=scrollParent.parentElement}return scrollParent},position:function(elem,includeMagins){elem=this.getRawNode(elem);var elemOffset=this.offset(elem);if(includeMagins){var elemStyle=$window.getComputedStyle(elem);elemOffset.top-=this.parseStyle(elemStyle.marginTop),elemOffset.left-=this.parseStyle(elemStyle.marginLeft)}var parent=this.offsetParent(elem),parentOffset={top:0,left:0};return parent!==$document[0].documentElement&&(parentOffset=this.offset(parent),parentOffset.top+=parent.clientTop-parent.scrollTop,parentOffset.left+=parent.clientLeft-parent.scrollLeft),{width:Math.round(angular.isNumber(elemOffset.width)?elemOffset.width:elem.offsetWidth),height:Math.round(angular.isNumber(elemOffset.height)?elemOffset.height:elem.offsetHeight),top:Math.round(elemOffset.top-parentOffset.top),left:Math.round(elemOffset.left-parentOffset.left)}},offset:function(elem){elem=this.getRawNode(elem);var elemBCR=elem.getBoundingClientRect();return{width:Math.round(angular.isNumber(elemBCR.width)?elemBCR.width:elem.offsetWidth),height:Math.round(angular.isNumber(elemBCR.height)?elemBCR.height:elem.offsetHeight),top:Math.round(elemBCR.top+($window.pageYOffset||$document[0].documentElement.scrollTop)),left:Math.round(elemBCR.left+($window.pageXOffset||$document[0].documentElement.scrollLeft))}},viewportOffset:function(elem,useDocument,includePadding){elem=this.getRawNode(elem),includePadding=includePadding!==!1;var elemBCR=elem.getBoundingClientRect(),offsetBCR={top:0,left:0,bottom:0,right:0},offsetParent=useDocument?$document[0].documentElement:this.scrollParent(elem),offsetParentBCR=offsetParent.getBoundingClientRect();if(offsetBCR.top=offsetParentBCR.top+offsetParent.clientTop,offsetBCR.left=offsetParentBCR.left+offsetParent.clientLeft,offsetParent===$document[0].documentElement&&(offsetBCR.top+=$window.pageYOffset,offsetBCR.left+=$window.pageXOffset),offsetBCR.bottom=offsetBCR.top+offsetParent.clientHeight,offsetBCR.right=offsetBCR.left+offsetParent.clientWidth,includePadding){var offsetParentStyle=$window.getComputedStyle(offsetParent);offsetBCR.top+=this.parseStyle(offsetParentStyle.paddingTop),offsetBCR.bottom-=this.parseStyle(offsetParentStyle.paddingBottom),offsetBCR.left+=this.parseStyle(offsetParentStyle.paddingLeft),offsetBCR.right-=this.parseStyle(offsetParentStyle.paddingRight)}return{top:Math.round(elemBCR.top-offsetBCR.top),bottom:Math.round(offsetBCR.bottom-elemBCR.bottom),left:Math.round(elemBCR.left-offsetBCR.left),right:Math.round(offsetBCR.right-elemBCR.right)}},parsePlacement:function(placement){var autoPlace=PLACEMENT_REGEX.auto.test(placement);return autoPlace&&(placement=placement.replace(PLACEMENT_REGEX.auto,"")),placement=placement.split("-"),placement[0]=placement[0]||"top",PLACEMENT_REGEX.primary.test(placement[0])||(placement[0]="top"),placement[1]=placement[1]||"center",PLACEMENT_REGEX.secondary.test(placement[1])||(placement[1]="center"),autoPlace?placement[2]=!0:placement[2]=!1,placement},positionElements:function(hostElem,targetElem,placement,appendToBody){hostElem=this.getRawNode(hostElem),targetElem=this.getRawNode(targetElem);var targetWidth=angular.isDefined(targetElem.offsetWidth)?targetElem.offsetWidth:targetElem.prop("offsetWidth"),targetHeight=angular.isDefined(targetElem.offsetHeight)?targetElem.offsetHeight:targetElem.prop("offsetHeight");placement=this.parsePlacement(placement);var hostElemPos=appendToBody?this.offset(hostElem):this.position(hostElem),targetElemPos={top:0,left:0,placement:""};if(placement[2]){var viewportOffset=this.viewportOffset(hostElem,appendToBody),targetElemStyle=$window.getComputedStyle(targetElem),adjustedSize={width:targetWidth+Math.round(Math.abs(this.parseStyle(targetElemStyle.marginLeft)+this.parseStyle(targetElemStyle.marginRight))),height:targetHeight+Math.round(Math.abs(this.parseStyle(targetElemStyle.marginTop)+this.parseStyle(targetElemStyle.marginBottom)))};if(placement[0]="top"===placement[0]&&adjustedSize.height>viewportOffset.top&&adjustedSize.height<=viewportOffset.bottom?"bottom":"bottom"===placement[0]&&adjustedSize.height>viewportOffset.bottom&&adjustedSize.height<=viewportOffset.top?"top":"left"===placement[0]&&adjustedSize.width>viewportOffset.left&&adjustedSize.width<=viewportOffset.right?"right":"right"===placement[0]&&adjustedSize.width>viewportOffset.right&&adjustedSize.width<=viewportOffset.left?"left":placement[0],placement[1]="top"===placement[1]&&adjustedSize.height-hostElemPos.height>viewportOffset.bottom&&adjustedSize.height-hostElemPos.height<=viewportOffset.top?"bottom":"bottom"===placement[1]&&adjustedSize.height-hostElemPos.height>viewportOffset.top&&adjustedSize.height-hostElemPos.height<=viewportOffset.bottom?"top":"left"===placement[1]&&adjustedSize.width-hostElemPos.width>viewportOffset.right&&adjustedSize.width-hostElemPos.width<=viewportOffset.left?"right":"right"===placement[1]&&adjustedSize.width-hostElemPos.width>viewportOffset.left&&adjustedSize.width-hostElemPos.width<=viewportOffset.right?"left":placement[1],"center"===placement[1])if(PLACEMENT_REGEX.vertical.test(placement[0])){var xOverflow=hostElemPos.width/2-targetWidth/2;viewportOffset.left+xOverflow<0&&adjustedSize.width-hostElemPos.width<=viewportOffset.right?placement[1]="left":viewportOffset.right+xOverflow<0&&adjustedSize.width-hostElemPos.width<=viewportOffset.left&&(placement[1]="right")}else{var yOverflow=hostElemPos.height/2-adjustedSize.height/2;viewportOffset.top+yOverflow<0&&adjustedSize.height-hostElemPos.height<=viewportOffset.bottom?placement[1]="top":viewportOffset.bottom+yOverflow<0&&adjustedSize.height-hostElemPos.height<=viewportOffset.top&&(placement[1]="bottom")}}switch(placement[0]){case"top":targetElemPos.top=hostElemPos.top-targetHeight;break;case"bottom":targetElemPos.top=hostElemPos.top+hostElemPos.height;break;case"left":targetElemPos.left=hostElemPos.left-targetWidth;break;case"right":targetElemPos.left=hostElemPos.left+hostElemPos.width}switch(placement[1]){case"top":targetElemPos.top=hostElemPos.top;break;case"bottom":targetElemPos.top=hostElemPos.top+hostElemPos.height-targetHeight;break;case"left":targetElemPos.left=hostElemPos.left;break;case"right":targetElemPos.left=hostElemPos.left+hostElemPos.width-targetWidth;break;case"center":PLACEMENT_REGEX.vertical.test(placement[0])?targetElemPos.left=hostElemPos.left+hostElemPos.width/2-targetWidth/2:targetElemPos.top=hostElemPos.top+hostElemPos.height/2-targetHeight/2}return targetElemPos.top=Math.round(targetElemPos.top),targetElemPos.left=Math.round(targetElemPos.left),targetElemPos.placement="center"===placement[1]?placement[0]:placement[0]+"-"+placement[1],targetElemPos},adjustTop:function(placementClasses,containerPosition,initialHeight,currentHeight){if(placementClasses.indexOf("top")!==-1&&initialHeight!==currentHeight)return{top:containerPosition.top-currentHeight+"px"}},positionArrow:function(elem,placement){elem=this.getRawNode(elem);var innerElem=elem.querySelector(".tooltip-inner, .popover-inner");if(innerElem){var isTooltip=angular.element(innerElem).hasClass("tooltip-inner"),arrowElem=isTooltip?elem.querySelector(".tooltip-arrow"):elem.querySelector(".arrow");if(arrowElem){var arrowCss={top:"",bottom:"",left:"",right:""};if(placement=this.parsePlacement(placement),"center"===placement[1])return void angular.element(arrowElem).css(arrowCss);var borderProp="border-"+placement[0]+"-width",borderWidth=$window.getComputedStyle(arrowElem)[borderProp],borderRadiusProp="border-";borderRadiusProp+=PLACEMENT_REGEX.vertical.test(placement[0])?placement[0]+"-"+placement[1]:placement[1]+"-"+placement[0],borderRadiusProp+="-radius";var borderRadius=$window.getComputedStyle(isTooltip?innerElem:elem)[borderRadiusProp];switch(placement[0]){case"top":arrowCss.bottom=isTooltip?"0":"-"+borderWidth;break;case"bottom":arrowCss.top=isTooltip?"0":"-"+borderWidth;break;case"left":arrowCss.right=isTooltip?"0":"-"+borderWidth;break;case"right":arrowCss.left=isTooltip?"0":"-"+borderWidth}arrowCss[placement[1]]=borderRadius,angular.element(arrowElem).css(arrowCss)}}}}}]),angular.module("ui.bootstrap.datepickerPopup",["ui.bootstrap.datepicker","ui.bootstrap.position"]).value("$datepickerPopupLiteralWarning",!0).constant("uibDatepickerPopupConfig",{altInputFormats:[],appendToBody:!1,clearText:"Clear",closeOnDateSelection:!0,closeText:"Done",currentText:"Today",datepickerPopup:"yyyy-MM-dd",datepickerPopupTemplateUrl:"uib/template/datepickerPopup/popup.html",datepickerTemplateUrl:"uib/template/datepicker/datepicker.html",html5Types:{date:"yyyy-MM-dd","datetime-local":"yyyy-MM-ddTHH:mm:ss.sss",month:"yyyy-MM"},onOpenFocus:!0,showButtonBar:!0,placement:"auto bottom-left"}).controller("UibDatepickerPopupController",["$scope","$element","$attrs","$compile","$log","$parse","$window","$document","$rootScope","$uibPosition","dateFilter","uibDateParser","uibDatepickerPopupConfig","$timeout","uibDatepickerConfig","$datepickerPopupLiteralWarning",function($scope,$element,$attrs,$compile,$log,$parse,$window,$document,$rootScope,$position,dateFilter,dateParser,datepickerPopupConfig,$timeout,datepickerConfig,$datepickerPopupLiteralWarning){function parseDateString(viewValue){var date=dateParser.parse(viewValue,dateFormat,$scope.date);if(isNaN(date))for(var i=0;i<altInputFormats.length;i++)if(date=dateParser.parse(viewValue,altInputFormats[i],$scope.date),!isNaN(date))return date;return date}function parseDate(viewValue){if(angular.isNumber(viewValue)&&(viewValue=new Date(viewValue)),!viewValue)return null;if(angular.isDate(viewValue)&&!isNaN(viewValue))return viewValue;if(angular.isString(viewValue)){var date=parseDateString(viewValue);if(!isNaN(date))return dateParser.toTimezone(date,ngModelOptions.getOption("timezone"))}return ngModelOptions.getOption("allowInvalid")?viewValue:void 0}function validator(modelValue,viewValue){var value=modelValue||viewValue;return!$attrs.ngRequired&&!value||(angular.isNumber(value)&&(value=new Date(value)),!value||(!(!angular.isDate(value)||isNaN(value))||!!angular.isString(value)&&!isNaN(parseDateString(value))))}function documentClickBind(event){if($scope.isOpen||!$scope.disabled){var popup=$popup[0],dpContainsTarget=$element[0].contains(event.target),popupContainsTarget=void 0!==popup.contains&&popup.contains(event.target);!$scope.isOpen||dpContainsTarget||popupContainsTarget||$scope.$apply(function(){$scope.isOpen=!1})}}function inputKeydownBind(evt){27===evt.which&&$scope.isOpen?(evt.preventDefault(),evt.stopPropagation(),$scope.$apply(function(){$scope.isOpen=!1}),$element[0].focus()):40!==evt.which||$scope.isOpen||(evt.preventDefault(),evt.stopPropagation(),$scope.$apply(function(){$scope.isOpen=!0}))}function positionPopup(){if($scope.isOpen){var dpElement=angular.element($popup[0].querySelector(".uib-datepicker-popup")),placement=$attrs.popupPlacement?$attrs.popupPlacement:datepickerPopupConfig.placement,position=$position.positionElements($element,dpElement,placement,appendToBody);dpElement.css({top:position.top+"px",left:position.left+"px"}),dpElement.hasClass("uib-position-measure")&&dpElement.removeClass("uib-position-measure")}}function extractOptions(ngModelCtrl){var ngModelOptions;return angular.version.minor<6?(ngModelOptions=angular.isObject(ngModelCtrl.$options)?ngModelCtrl.$options:{timezone:null},ngModelOptions.getOption=function(key){return ngModelOptions[key]}):ngModelOptions=ngModelCtrl.$options,ngModelOptions}var dateFormat,closeOnDateSelection,appendToBody,onOpenFocus,datepickerPopupTemplateUrl,datepickerTemplateUrl,popupEl,datepickerEl,scrollParentEl,ngModel,ngModelOptions,$popup,altInputFormats,isHtml5DateInput=!1,watchListeners=[];this.init=function(_ngModel_){if(ngModel=_ngModel_,ngModelOptions=extractOptions(ngModel),closeOnDateSelection=angular.isDefined($attrs.closeOnDateSelection)?$scope.$parent.$eval($attrs.closeOnDateSelection):datepickerPopupConfig.closeOnDateSelection,appendToBody=angular.isDefined($attrs.datepickerAppendToBody)?$scope.$parent.$eval($attrs.datepickerAppendToBody):datepickerPopupConfig.appendToBody,onOpenFocus=angular.isDefined($attrs.onOpenFocus)?$scope.$parent.$eval($attrs.onOpenFocus):datepickerPopupConfig.onOpenFocus,datepickerPopupTemplateUrl=angular.isDefined($attrs.datepickerPopupTemplateUrl)?$attrs.datepickerPopupTemplateUrl:datepickerPopupConfig.datepickerPopupTemplateUrl,datepickerTemplateUrl=angular.isDefined($attrs.datepickerTemplateUrl)?$attrs.datepickerTemplateUrl:datepickerPopupConfig.datepickerTemplateUrl,altInputFormats=angular.isDefined($attrs.altInputFormats)?$scope.$parent.$eval($attrs.altInputFormats):datepickerPopupConfig.altInputFormats,$scope.showButtonBar=angular.isDefined($attrs.showButtonBar)?$scope.$parent.$eval($attrs.showButtonBar):datepickerPopupConfig.showButtonBar,datepickerPopupConfig.html5Types[$attrs.type]?(dateFormat=datepickerPopupConfig.html5Types[$attrs.type],isHtml5DateInput=!0):(dateFormat=$attrs.uibDatepickerPopup||datepickerPopupConfig.datepickerPopup,$attrs.$observe("uibDatepickerPopup",function(value,oldValue){var newDateFormat=value||datepickerPopupConfig.datepickerPopup;if(newDateFormat!==dateFormat&&(dateFormat=newDateFormat,ngModel.$modelValue=null,!dateFormat))throw new Error("uibDatepickerPopup must have a date format specified.")})),!dateFormat)throw new Error("uibDatepickerPopup must have a date format specified.");if(isHtml5DateInput&&$attrs.uibDatepickerPopup)throw new Error("HTML5 date input types do not support custom formats.");popupEl=angular.element("<div uib-datepicker-popup-wrap><div uib-datepicker></div></div>"),popupEl.attr({"ng-model":"date","ng-change":"dateSelection(date)","template-url":datepickerPopupTemplateUrl}),datepickerEl=angular.element(popupEl.children()[0]),datepickerEl.attr("template-url",datepickerTemplateUrl),$scope.datepickerOptions||($scope.datepickerOptions={}),isHtml5DateInput&&"month"===$attrs.type&&($scope.datepickerOptions.datepickerMode="month",$scope.datepickerOptions.minMode="month"),datepickerEl.attr("datepicker-options","datepickerOptions"),isHtml5DateInput?ngModel.$formatters.push(function(value){return $scope.date=dateParser.fromTimezone(value,ngModelOptions.getOption("timezone")),value}):(ngModel.$$parserName="date",ngModel.$validators.date=validator,ngModel.$parsers.unshift(parseDate),ngModel.$formatters.push(function(value){return ngModel.$isEmpty(value)?($scope.date=value,value):(angular.isNumber(value)&&(value=new Date(value)),$scope.date=dateParser.fromTimezone(value,ngModelOptions.getOption("timezone")),dateParser.filter($scope.date,dateFormat))})),ngModel.$viewChangeListeners.push(function(){$scope.date=parseDateString(ngModel.$viewValue)}),$element.on("keydown",inputKeydownBind),$popup=$compile(popupEl)($scope),popupEl.remove(),appendToBody?$document.find("body").append($popup):$element.after($popup),$scope.$on("$destroy",function(){for($scope.isOpen===!0&&($rootScope.$$phase||$scope.$apply(function(){$scope.isOpen=!1})),$popup.remove(),$element.off("keydown",inputKeydownBind),$document.off("click",documentClickBind),scrollParentEl&&scrollParentEl.off("scroll",positionPopup),angular.element($window).off("resize",positionPopup);watchListeners.length;)watchListeners.shift()()})},$scope.getText=function(key){return $scope[key+"Text"]||datepickerPopupConfig[key+"Text"]},$scope.isDisabled=function(date){"today"===date&&(date=dateParser.fromTimezone(new Date,ngModelOptions.getOption("timezone")));var dates={};return angular.forEach(["minDate","maxDate"],function(key){$scope.datepickerOptions[key]?angular.isDate($scope.datepickerOptions[key])?dates[key]=new Date($scope.datepickerOptions[key]):($datepickerPopupLiteralWarning&&$log.warn("Literal date support has been deprecated, please switch to date object usage"),dates[key]=new Date(dateFilter($scope.datepickerOptions[key],"medium"))):dates[key]=null}),$scope.datepickerOptions&&dates.minDate&&$scope.compare(date,dates.minDate)<0||dates.maxDate&&$scope.compare(date,dates.maxDate)>0},$scope.compare=function(date1,date2){return new Date(date1.getFullYear(),date1.getMonth(),date1.getDate())-new Date(date2.getFullYear(),date2.getMonth(),date2.getDate())},$scope.dateSelection=function(dt){$scope.date=dt;var date=$scope.date?dateParser.filter($scope.date,dateFormat):null;$element.val(date),ngModel.$setViewValue(date),closeOnDateSelection&&($scope.isOpen=!1,$element[0].focus())},$scope.keydown=function(evt){27===evt.which&&(evt.stopPropagation(),$scope.isOpen=!1,$element[0].focus())},$scope.select=function(date,evt){if(evt.stopPropagation(),"today"===date){var today=new Date;angular.isDate($scope.date)?(date=new Date($scope.date),date.setFullYear(today.getFullYear(),today.getMonth(),today.getDate())):(date=dateParser.fromTimezone(today,ngModelOptions.getOption("timezone")),date.setHours(0,0,0,0))}$scope.dateSelection(date)},$scope.close=function(evt){evt.stopPropagation(),$scope.isOpen=!1,$element[0].focus()},$scope.disabled=angular.isDefined($attrs.disabled)||!1,$attrs.ngDisabled&&watchListeners.push($scope.$parent.$watch($parse($attrs.ngDisabled),function(disabled){$scope.disabled=disabled})),$scope.$watch("isOpen",function(value){value?$scope.disabled?$scope.isOpen=!1:$timeout(function(){positionPopup(),onOpenFocus&&$scope.$broadcast("uib:datepicker.focus"),$document.on("click",documentClickBind);var placement=$attrs.popupPlacement?$attrs.popupPlacement:datepickerPopupConfig.placement;appendToBody||$position.parsePlacement(placement)[2]?(scrollParentEl=scrollParentEl||angular.element($position.scrollParent($element)),scrollParentEl&&scrollParentEl.on("scroll",positionPopup)):scrollParentEl=null,angular.element($window).on("resize",positionPopup)},0,!1):($document.off("click",documentClickBind),scrollParentEl&&scrollParentEl.off("scroll",positionPopup),angular.element($window).off("resize",positionPopup))}),$scope.$on("uib:datepicker.mode",function(){$timeout(positionPopup,0,!1)})}]).directive("uibDatepickerPopup",function(){return{require:["ngModel","uibDatepickerPopup"],controller:"UibDatepickerPopupController",scope:{datepickerOptions:"=?",isOpen:"=?",currentText:"@",clearText:"@",closeText:"@"},link:function(scope,element,attrs,ctrls){var ngModel=ctrls[0],ctrl=ctrls[1];ctrl.init(ngModel)}}}).directive("uibDatepickerPopupWrap",function(){return{restrict:"A",transclude:!0,templateUrl:function(element,attrs){return attrs.templateUrl||"uib/template/datepickerPopup/popup.html"}}}),angular.module("ui.bootstrap.debounce",[]).factory("$$debounce",["$timeout",function($timeout){return function(callback,debounceTime){var timeoutPromise;return function(){var self=this,args=Array.prototype.slice.call(arguments);timeoutPromise&&$timeout.cancel(timeoutPromise),timeoutPromise=$timeout(function(){callback.apply(self,args)},debounceTime)}}}]),angular.module("ui.bootstrap.multiMap",[]).factory("$$multiMap",function(){return{createNew:function(){var map={};return{entries:function(){return Object.keys(map).map(function(key){return{key:key,value:map[key]}})},get:function(key){return map[key]},hasKey:function(key){return!!map[key]},keys:function(){return Object.keys(map)},put:function(key,value){map[key]||(map[key]=[]),map[key].push(value)},remove:function(key,value){var values=map[key];if(values){var idx=values.indexOf(value);idx!==-1&&values.splice(idx,1),values.length||delete map[key]}}}}}}),angular.module("ui.bootstrap.dropdown",["ui.bootstrap.multiMap","ui.bootstrap.position"]).constant("uibDropdownConfig",{appendToOpenClass:"uib-dropdown-open",openClass:"open"}).service("uibDropdownService",["$document","$rootScope","$$multiMap",function($document,$rootScope,$$multiMap){var openScope=null,openedContainers=$$multiMap.createNew();this.isOnlyOpen=function(dropdownScope,appendTo){var openedDropdowns=openedContainers.get(appendTo);if(openedDropdowns){var openDropdown=openedDropdowns.reduce(function(toClose,dropdown){return dropdown.scope===dropdownScope?dropdown:toClose},{});if(openDropdown)return 1===openedDropdowns.length}return!1},this.open=function(dropdownScope,element,appendTo){if(openScope||$document.on("click",closeDropdown),openScope&&openScope!==dropdownScope&&(openScope.isOpen=!1),openScope=dropdownScope,appendTo){var openedDropdowns=openedContainers.get(appendTo);if(openedDropdowns){var openedScopes=openedDropdowns.map(function(dropdown){return dropdown.scope});openedScopes.indexOf(dropdownScope)===-1&&openedContainers.put(appendTo,{scope:dropdownScope})}else openedContainers.put(appendTo,{scope:dropdownScope})}},this.close=function(dropdownScope,element,appendTo){if(openScope===dropdownScope&&($document.off("click",closeDropdown),$document.off("keydown",this.keybindFilter),openScope=null),appendTo){var openedDropdowns=openedContainers.get(appendTo);if(openedDropdowns){var dropdownToClose=openedDropdowns.reduce(function(toClose,dropdown){return dropdown.scope===dropdownScope?dropdown:toClose},{});dropdownToClose&&openedContainers.remove(appendTo,dropdownToClose)}}};var closeDropdown=function(evt){if(openScope&&openScope.isOpen&&!(evt&&"disabled"===openScope.getAutoClose()||evt&&3===evt.which)){var toggleElement=openScope.getToggleElement();if(!(evt&&toggleElement&&toggleElement[0].contains(evt.target))){var dropdownElement=openScope.getDropdownElement();evt&&"outsideClick"===openScope.getAutoClose()&&dropdownElement&&dropdownElement[0].contains(evt.target)||(openScope.focusToggleElement(),openScope.isOpen=!1,$rootScope.$$phase||openScope.$apply())}}};this.keybindFilter=function(evt){if(openScope){var dropdownElement=openScope.getDropdownElement(),toggleElement=openScope.getToggleElement(),dropdownElementTargeted=dropdownElement&&dropdownElement[0].contains(evt.target),toggleElementTargeted=toggleElement&&toggleElement[0].contains(evt.target);27===evt.which?(evt.stopPropagation(),openScope.focusToggleElement(),closeDropdown()):openScope.isKeynavEnabled()&&[38,40].indexOf(evt.which)!==-1&&openScope.isOpen&&(dropdownElementTargeted||toggleElementTargeted)&&(evt.preventDefault(),evt.stopPropagation(),openScope.focusDropdownEntry(evt.which))}}}]).controller("UibDropdownController",["$scope","$element","$attrs","$parse","uibDropdownConfig","uibDropdownService","$animate","$uibPosition","$document","$compile","$templateRequest",function($scope,$element,$attrs,$parse,dropdownConfig,uibDropdownService,$animate,$position,$document,$compile,$templateRequest){function removeDropdownMenu(){$element.append(self.dropdownMenu)}var templateScope,getIsOpen,self=this,scope=$scope.$new(),appendToOpenClass=dropdownConfig.appendToOpenClass,openClass=dropdownConfig.openClass,setIsOpen=angular.noop,toggleInvoker=$attrs.onToggle?$parse($attrs.onToggle):angular.noop,keynavEnabled=!1,body=$document.find("body");$element.addClass("dropdown"),this.init=function(){$attrs.isOpen&&(getIsOpen=$parse($attrs.isOpen),setIsOpen=getIsOpen.assign,$scope.$watch(getIsOpen,function(value){scope.isOpen=!!value})),keynavEnabled=angular.isDefined($attrs.keyboardNav)},this.toggle=function(open){return scope.isOpen=arguments.length?!!open:!scope.isOpen,angular.isFunction(setIsOpen)&&setIsOpen(scope,scope.isOpen),scope.isOpen},this.isOpen=function(){return scope.isOpen},scope.getToggleElement=function(){return self.toggleElement},scope.getAutoClose=function(){return $attrs.autoClose||"always"},scope.getElement=function(){return $element},scope.isKeynavEnabled=function(){return keynavEnabled},scope.focusDropdownEntry=function(keyCode){var elems=self.dropdownMenu?angular.element(self.dropdownMenu).find("a"):$element.find("ul").eq(0).find("a");switch(keyCode){case 40:angular.isNumber(self.selectedOption)?self.selectedOption=self.selectedOption===elems.length-1?self.selectedOption:self.selectedOption+1:self.selectedOption=0;break;case 38:angular.isNumber(self.selectedOption)?self.selectedOption=0===self.selectedOption?0:self.selectedOption-1:self.selectedOption=elems.length-1}elems[self.selectedOption].focus()},scope.getDropdownElement=function(){return self.dropdownMenu},scope.focusToggleElement=function(){self.toggleElement&&self.toggleElement[0].focus()},scope.$watch("isOpen",function(isOpen,wasOpen){var appendTo=null,appendToBody=!1;if(angular.isDefined($attrs.dropdownAppendTo)){var appendToEl=$parse($attrs.dropdownAppendTo)(scope);appendToEl&&(appendTo=angular.element(appendToEl))}if(angular.isDefined($attrs.dropdownAppendToBody)){var appendToBodyValue=$parse($attrs.dropdownAppendToBody)(scope);appendToBodyValue!==!1&&(appendToBody=!0)}if(appendToBody&&!appendTo&&(appendTo=body),appendTo&&self.dropdownMenu&&(isOpen?(appendTo.append(self.dropdownMenu),$element.on("$destroy",removeDropdownMenu)):($element.off("$destroy",removeDropdownMenu),removeDropdownMenu())),appendTo&&self.dropdownMenu){var css,rightalign,scrollbarPadding,pos=$position.positionElements($element,self.dropdownMenu,"bottom-left",!0),scrollbarWidth=0;if(css={top:pos.top+"px",display:isOpen?"block":"none"},rightalign=self.dropdownMenu.hasClass("dropdown-menu-right"),rightalign?(css.left="auto",scrollbarPadding=$position.scrollbarPadding(appendTo),scrollbarPadding.heightOverflow&&scrollbarPadding.scrollbarWidth&&(scrollbarWidth=scrollbarPadding.scrollbarWidth),css.right=window.innerWidth-scrollbarWidth-(pos.left+$element.prop("offsetWidth"))+"px"):(css.left=pos.left+"px",css.right="auto"),!appendToBody){var appendOffset=$position.offset(appendTo);css.top=pos.top-appendOffset.top+"px",rightalign?css.right=window.innerWidth-(pos.left-appendOffset.left+$element.prop("offsetWidth"))+"px":css.left=pos.left-appendOffset.left+"px"}self.dropdownMenu.css(css)}var openContainer=appendTo?appendTo:$element,dropdownOpenClass=appendTo?appendToOpenClass:openClass,hasOpenClass=openContainer.hasClass(dropdownOpenClass),isOnlyOpen=uibDropdownService.isOnlyOpen($scope,appendTo);if(hasOpenClass===!isOpen){var toggleClass;toggleClass=appendTo?isOnlyOpen?"removeClass":"addClass":isOpen?"addClass":"removeClass",$animate[toggleClass](openContainer,dropdownOpenClass).then(function(){angular.isDefined(isOpen)&&isOpen!==wasOpen&&toggleInvoker($scope,{open:!!isOpen})})}if(isOpen)self.dropdownMenuTemplateUrl?$templateRequest(self.dropdownMenuTemplateUrl).then(function(tplContent){templateScope=scope.$new(),$compile(tplContent.trim())(templateScope,function(dropdownElement){var newEl=dropdownElement;self.dropdownMenu.replaceWith(newEl),self.dropdownMenu=newEl,$document.on("keydown",uibDropdownService.keybindFilter)})}):$document.on("keydown",uibDropdownService.keybindFilter),scope.focusToggleElement(),uibDropdownService.open(scope,$element,appendTo);else{if(uibDropdownService.close(scope,$element,appendTo),self.dropdownMenuTemplateUrl){templateScope&&templateScope.$destroy();var newEl=angular.element('<ul class="dropdown-menu"></ul>');self.dropdownMenu.replaceWith(newEl),self.dropdownMenu=newEl}self.selectedOption=null}angular.isFunction(setIsOpen)&&setIsOpen($scope,isOpen)})}]).directive("uibDropdown",function(){return{controller:"UibDropdownController",link:function(scope,element,attrs,dropdownCtrl){dropdownCtrl.init()}}}).directive("uibDropdownMenu",function(){return{restrict:"A",require:"?^uibDropdown",link:function(scope,element,attrs,dropdownCtrl){if(dropdownCtrl&&!angular.isDefined(attrs.dropdownNested)){element.addClass("dropdown-menu");var tplUrl=attrs.templateUrl;tplUrl&&(dropdownCtrl.dropdownMenuTemplateUrl=tplUrl),dropdownCtrl.dropdownMenu||(dropdownCtrl.dropdownMenu=element)}}}}).directive("uibDropdownToggle",function(){return{require:"?^uibDropdown",link:function(scope,element,attrs,dropdownCtrl){if(dropdownCtrl){element.addClass("dropdown-toggle"),dropdownCtrl.toggleElement=element;var toggleDropdown=function(event){event.preventDefault(),element.hasClass("disabled")||attrs.disabled||scope.$apply(function(){dropdownCtrl.toggle()})};element.on("click",toggleDropdown),element.attr({"aria-haspopup":!0,"aria-expanded":!1}),scope.$watch(dropdownCtrl.isOpen,function(isOpen){element.attr("aria-expanded",!!isOpen)}),scope.$on("$destroy",function(){element.off("click",toggleDropdown)})}}}}),angular.module("ui.bootstrap.stackedMap",[]).factory("$$stackedMap",function(){return{createNew:function(){var stack=[];return{add:function(key,value){stack.push({key:key,value:value})},get:function(key){for(var i=0;i<stack.length;i++)if(key===stack[i].key)return stack[i]},keys:function(){for(var keys=[],i=0;i<stack.length;i++)keys.push(stack[i].key);return keys},top:function(){return stack[stack.length-1]},remove:function(key){for(var idx=-1,i=0;i<stack.length;i++)if(key===stack[i].key){idx=i;break}return stack.splice(idx,1)[0]},removeTop:function(){return stack.pop()},length:function(){return stack.length}}}}}),angular.module("ui.bootstrap.modal",["ui.bootstrap.multiMap","ui.bootstrap.stackedMap","ui.bootstrap.position"]).provider("$uibResolve",function(){var resolve=this;this.resolver=null,this.setResolver=function(resolver){this.resolver=resolver},this.$get=["$injector","$q",function($injector,$q){var resolver=resolve.resolver?$injector.get(resolve.resolver):null;return{resolve:function(invocables,locals,parent,self){if(resolver)return resolver.resolve(invocables,locals,parent,self);var promises=[];return angular.forEach(invocables,function(value){angular.isFunction(value)||angular.isArray(value)?promises.push($q.resolve($injector.invoke(value))):angular.isString(value)?promises.push($q.resolve($injector.get(value))):promises.push($q.resolve(value))}),$q.all(promises).then(function(resolves){var resolveObj={},resolveIter=0;return angular.forEach(invocables,function(value,key){resolveObj[key]=resolves[resolveIter++]}),resolveObj})}}}]}).directive("uibModalBackdrop",["$animate","$injector","$uibModalStack",function($animate,$injector,$modalStack){function linkFn(scope,element,attrs){attrs.modalInClass&&($animate.addClass(element,attrs.modalInClass),scope.$on($modalStack.NOW_CLOSING_EVENT,function(e,setIsAsync){var done=setIsAsync();
scope.modalOptions.animation?$animate.removeClass(element,attrs.modalInClass).then(done):done()}))}return{restrict:"A",compile:function(tElement,tAttrs){return tElement.addClass(tAttrs.backdropClass),linkFn}}}]).directive("uibModalWindow",["$uibModalStack","$q","$animateCss","$document",function($modalStack,$q,$animateCss,$document){return{scope:{index:"@"},restrict:"A",transclude:!0,templateUrl:function(tElement,tAttrs){return tAttrs.templateUrl||"uib/template/modal/window.html"},link:function(scope,element,attrs){element.addClass(attrs.windowTopClass||""),scope.size=attrs.size,scope.close=function(evt){var modal=$modalStack.getTop();modal&&modal.value.backdrop&&"static"!==modal.value.backdrop&&evt.target===evt.currentTarget&&(evt.preventDefault(),evt.stopPropagation(),$modalStack.dismiss(modal.key,"backdrop click"))},element.on("click",scope.close),scope.$isRendered=!0;var modalRenderDeferObj=$q.defer();scope.$$postDigest(function(){modalRenderDeferObj.resolve()}),modalRenderDeferObj.promise.then(function(){var animationPromise=null;attrs.modalInClass&&(animationPromise=$animateCss(element,{addClass:attrs.modalInClass}).start(),scope.$on($modalStack.NOW_CLOSING_EVENT,function(e,setIsAsync){var done=setIsAsync();$animateCss(element,{removeClass:attrs.modalInClass}).start().then(done)})),$q.when(animationPromise).then(function(){var modal=$modalStack.getTop();if(modal&&$modalStack.modalRendered(modal.key),!$document[0].activeElement||!element[0].contains($document[0].activeElement)){var inputWithAutofocus=element[0].querySelector("[autofocus]");inputWithAutofocus?inputWithAutofocus.focus():element[0].focus()}})})}}}]).directive("uibModalAnimationClass",function(){return{compile:function(tElement,tAttrs){tAttrs.modalAnimation&&tElement.addClass(tAttrs.uibModalAnimationClass)}}}).directive("uibModalTransclude",["$animate",function($animate){return{link:function(scope,element,attrs,controller,transclude){transclude(scope.$parent,function(clone){element.empty(),$animate.enter(clone,element)})}}}]).factory("$uibModalStack",["$animate","$animateCss","$document","$compile","$rootScope","$q","$$multiMap","$$stackedMap","$uibPosition",function($animate,$animateCss,$document,$compile,$rootScope,$q,$$multiMap,$$stackedMap,$uibPosition){function snake_case(name){var separator="-";return name.replace(SNAKE_CASE_REGEXP,function(letter,pos){return(pos?separator:"")+letter.toLowerCase()})}function isVisible(element){return!!(element.offsetWidth||element.offsetHeight||element.getClientRects().length)}function backdropIndex(){for(var topBackdropIndex=-1,opened=openedWindows.keys(),i=0;i<opened.length;i++)openedWindows.get(opened[i]).value.backdrop&&(topBackdropIndex=i);return topBackdropIndex>-1&&topBackdropIndex<topModalIndex&&(topBackdropIndex=topModalIndex),topBackdropIndex}function removeModalWindow(modalInstance,elementToReceiveFocus){var modalWindow=openedWindows.get(modalInstance).value,appendToElement=modalWindow.appendTo;openedWindows.remove(modalInstance),previousTopOpenedModal=openedWindows.top(),previousTopOpenedModal&&(topModalIndex=parseInt(previousTopOpenedModal.value.modalDomEl.attr("index"),10)),removeAfterAnimate(modalWindow.modalDomEl,modalWindow.modalScope,function(){var modalBodyClass=modalWindow.openedClass||OPENED_MODAL_CLASS;openedClasses.remove(modalBodyClass,modalInstance);var areAnyOpen=openedClasses.hasKey(modalBodyClass);appendToElement.toggleClass(modalBodyClass,areAnyOpen),!areAnyOpen&&scrollbarPadding&&scrollbarPadding.heightOverflow&&scrollbarPadding.scrollbarWidth&&(scrollbarPadding.originalRight?appendToElement.css({paddingRight:scrollbarPadding.originalRight+"px"}):appendToElement.css({paddingRight:""}),scrollbarPadding=null),toggleTopWindowClass(!0)},modalWindow.closedDeferred),checkRemoveBackdrop(),elementToReceiveFocus&&elementToReceiveFocus.focus?elementToReceiveFocus.focus():appendToElement.focus&&appendToElement.focus()}function toggleTopWindowClass(toggleSwitch){var modalWindow;openedWindows.length()>0&&(modalWindow=openedWindows.top().value,modalWindow.modalDomEl.toggleClass(modalWindow.windowTopClass||"",toggleSwitch))}function checkRemoveBackdrop(){if(backdropDomEl&&backdropIndex()===-1){var backdropScopeRef=backdropScope;removeAfterAnimate(backdropDomEl,backdropScope,function(){backdropScopeRef=null}),backdropDomEl=void 0,backdropScope=void 0}}function removeAfterAnimate(domEl,scope,done,closedDeferred){function afterAnimating(){afterAnimating.done||(afterAnimating.done=!0,$animate.leave(domEl).then(function(){done&&done(),domEl.remove(),closedDeferred&&closedDeferred.resolve()}),scope.$destroy())}var asyncDeferred,asyncPromise=null,setIsAsync=function(){return asyncDeferred||(asyncDeferred=$q.defer(),asyncPromise=asyncDeferred.promise),function(){asyncDeferred.resolve()}};return scope.$broadcast($modalStack.NOW_CLOSING_EVENT,setIsAsync),$q.when(asyncPromise).then(afterAnimating)}function keydownListener(evt){if(evt.isDefaultPrevented())return evt;var modal=openedWindows.top();if(modal)switch(evt.which){case 27:modal.value.keyboard&&(evt.preventDefault(),$rootScope.$apply(function(){$modalStack.dismiss(modal.key,"escape key press")}));break;case 9:var list=$modalStack.loadFocusElementList(modal),focusChanged=!1;evt.shiftKey?($modalStack.isFocusInFirstItem(evt,list)||$modalStack.isModalFocused(evt,modal))&&(focusChanged=$modalStack.focusLastFocusableElement(list)):$modalStack.isFocusInLastItem(evt,list)&&(focusChanged=$modalStack.focusFirstFocusableElement(list)),focusChanged&&(evt.preventDefault(),evt.stopPropagation())}}function broadcastClosing(modalWindow,resultOrReason,closing){return!modalWindow.value.modalScope.$broadcast("modal.closing",resultOrReason,closing).defaultPrevented}function unhideBackgroundElements(){Array.prototype.forEach.call(document.querySelectorAll("["+ARIA_HIDDEN_ATTRIBUTE_NAME+"]"),function(hiddenEl){var ariaHiddenCount=parseInt(hiddenEl.getAttribute(ARIA_HIDDEN_ATTRIBUTE_NAME),10),newHiddenCount=ariaHiddenCount-1;hiddenEl.setAttribute(ARIA_HIDDEN_ATTRIBUTE_NAME,newHiddenCount),newHiddenCount||(hiddenEl.removeAttribute(ARIA_HIDDEN_ATTRIBUTE_NAME),hiddenEl.removeAttribute("aria-hidden"))})}var backdropDomEl,backdropScope,scrollbarPadding,OPENED_MODAL_CLASS="modal-open",openedWindows=$$stackedMap.createNew(),openedClasses=$$multiMap.createNew(),$modalStack={NOW_CLOSING_EVENT:"modal.stack.now-closing"},topModalIndex=0,previousTopOpenedModal=null,ARIA_HIDDEN_ATTRIBUTE_NAME="data-bootstrap-modal-aria-hidden-count",tabbableSelector="a[href], area[href], input:not([disabled]):not([tabindex='-1']), button:not([disabled]):not([tabindex='-1']),select:not([disabled]):not([tabindex='-1']), textarea:not([disabled]):not([tabindex='-1']), iframe, object, embed, *[tabindex]:not([tabindex='-1']), *[contenteditable=true]",SNAKE_CASE_REGEXP=/[A-Z]/g;return $rootScope.$watch(backdropIndex,function(newBackdropIndex){backdropScope&&(backdropScope.index=newBackdropIndex)}),$document.on("keydown",keydownListener),$rootScope.$on("$destroy",function(){$document.off("keydown",keydownListener)}),$modalStack.open=function(modalInstance,modal){function applyAriaHidden(el){function getSiblings(el){var children=el.parent()?el.parent().children():[];return Array.prototype.filter.call(children,function(child){return child!==el[0]})}if(el&&"BODY"!==el[0].tagName)return getSiblings(el).forEach(function(sibling){var elemIsAlreadyHidden="true"===sibling.getAttribute("aria-hidden"),ariaHiddenCount=parseInt(sibling.getAttribute(ARIA_HIDDEN_ATTRIBUTE_NAME),10);ariaHiddenCount||(ariaHiddenCount=elemIsAlreadyHidden?1:0),sibling.setAttribute(ARIA_HIDDEN_ATTRIBUTE_NAME,ariaHiddenCount+1),sibling.setAttribute("aria-hidden","true")}),applyAriaHidden(el.parent())}var modalOpener=$document[0].activeElement,modalBodyClass=modal.openedClass||OPENED_MODAL_CLASS;toggleTopWindowClass(!1),previousTopOpenedModal=openedWindows.top(),openedWindows.add(modalInstance,{deferred:modal.deferred,renderDeferred:modal.renderDeferred,closedDeferred:modal.closedDeferred,modalScope:modal.scope,backdrop:modal.backdrop,keyboard:modal.keyboard,openedClass:modal.openedClass,windowTopClass:modal.windowTopClass,animation:modal.animation,appendTo:modal.appendTo}),openedClasses.put(modalBodyClass,modalInstance);var appendToElement=modal.appendTo,currBackdropIndex=backdropIndex();currBackdropIndex>=0&&!backdropDomEl&&(backdropScope=$rootScope.$new(!0),backdropScope.modalOptions=modal,backdropScope.index=currBackdropIndex,backdropDomEl=angular.element('<div uib-modal-backdrop="modal-backdrop"></div>'),backdropDomEl.attr({"class":"modal-backdrop","ng-style":"{'z-index': 1040 + (index && 1 || 0) + index*10}","uib-modal-animation-class":"fade","modal-in-class":"in"}),modal.backdropClass&&backdropDomEl.addClass(modal.backdropClass),modal.animation&&backdropDomEl.attr("modal-animation","true"),$compile(backdropDomEl)(backdropScope),$animate.enter(backdropDomEl,appendToElement),$uibPosition.isScrollable(appendToElement)&&(scrollbarPadding=$uibPosition.scrollbarPadding(appendToElement),scrollbarPadding.heightOverflow&&scrollbarPadding.scrollbarWidth&&appendToElement.css({paddingRight:scrollbarPadding.right+"px"})));var content;modal.component?(content=document.createElement(snake_case(modal.component.name)),content=angular.element(content),content.attr({resolve:"$resolve","modal-instance":"$uibModalInstance",close:"$close($value)",dismiss:"$dismiss($value)"})):content=modal.content,topModalIndex=previousTopOpenedModal?parseInt(previousTopOpenedModal.value.modalDomEl.attr("index"),10)+1:0;var angularDomEl=angular.element('<div uib-modal-window="modal-window"></div>');angularDomEl.attr({"class":"modal","template-url":modal.windowTemplateUrl,"window-top-class":modal.windowTopClass,role:"dialog","aria-labelledby":modal.ariaLabelledBy,"aria-describedby":modal.ariaDescribedBy,size:modal.size,index:topModalIndex,animate:"animate","ng-style":"{'z-index': 1050 + $$topModalIndex*10, display: 'block'}",tabindex:-1,"uib-modal-animation-class":"fade","modal-in-class":"in"}).append(content),modal.windowClass&&angularDomEl.addClass(modal.windowClass),modal.animation&&angularDomEl.attr("modal-animation","true"),appendToElement.addClass(modalBodyClass),modal.scope&&(modal.scope.$$topModalIndex=topModalIndex),$animate.enter($compile(angularDomEl)(modal.scope),appendToElement),openedWindows.top().value.modalDomEl=angularDomEl,openedWindows.top().value.modalOpener=modalOpener,applyAriaHidden(angularDomEl)},$modalStack.close=function(modalInstance,result){var modalWindow=openedWindows.get(modalInstance);return unhideBackgroundElements(),modalWindow&&broadcastClosing(modalWindow,result,!0)?(modalWindow.value.modalScope.$$uibDestructionScheduled=!0,modalWindow.value.deferred.resolve(result),removeModalWindow(modalInstance,modalWindow.value.modalOpener),!0):!modalWindow},$modalStack.dismiss=function(modalInstance,reason){var modalWindow=openedWindows.get(modalInstance);return unhideBackgroundElements(),modalWindow&&broadcastClosing(modalWindow,reason,!1)?(modalWindow.value.modalScope.$$uibDestructionScheduled=!0,modalWindow.value.deferred.reject(reason),removeModalWindow(modalInstance,modalWindow.value.modalOpener),!0):!modalWindow},$modalStack.dismissAll=function(reason){for(var topModal=this.getTop();topModal&&this.dismiss(topModal.key,reason);)topModal=this.getTop()},$modalStack.getTop=function(){return openedWindows.top()},$modalStack.modalRendered=function(modalInstance){var modalWindow=openedWindows.get(modalInstance);modalWindow&&modalWindow.value.renderDeferred.resolve()},$modalStack.focusFirstFocusableElement=function(list){return list.length>0&&(list[0].focus(),!0)},$modalStack.focusLastFocusableElement=function(list){return list.length>0&&(list[list.length-1].focus(),!0)},$modalStack.isModalFocused=function(evt,modalWindow){if(evt&&modalWindow){var modalDomEl=modalWindow.value.modalDomEl;if(modalDomEl&&modalDomEl.length)return(evt.target||evt.srcElement)===modalDomEl[0]}return!1},$modalStack.isFocusInFirstItem=function(evt,list){return list.length>0&&(evt.target||evt.srcElement)===list[0]},$modalStack.isFocusInLastItem=function(evt,list){return list.length>0&&(evt.target||evt.srcElement)===list[list.length-1]},$modalStack.loadFocusElementList=function(modalWindow){if(modalWindow){var modalDomE1=modalWindow.value.modalDomEl;if(modalDomE1&&modalDomE1.length){var elements=modalDomE1[0].querySelectorAll(tabbableSelector);return elements?Array.prototype.filter.call(elements,function(element){return isVisible(element)}):elements}}},$modalStack}]).provider("$uibModal",function(){var $modalProvider={options:{animation:!0,backdrop:!0,keyboard:!0},$get:["$rootScope","$q","$document","$templateRequest","$controller","$uibResolve","$uibModalStack",function($rootScope,$q,$document,$templateRequest,$controller,$uibResolve,$modalStack){function getTemplatePromise(options){return options.template?$q.when(options.template):$templateRequest(angular.isFunction(options.templateUrl)?options.templateUrl():options.templateUrl)}var $modal={},promiseChain=null;return $modal.getPromiseChain=function(){return promiseChain},$modal.open=function(modalOptions){function resolveWithTemplate(){return templateAndResolvePromise}var modalResultDeferred=$q.defer(),modalOpenedDeferred=$q.defer(),modalClosedDeferred=$q.defer(),modalRenderDeferred=$q.defer(),modalInstance={result:modalResultDeferred.promise,opened:modalOpenedDeferred.promise,closed:modalClosedDeferred.promise,rendered:modalRenderDeferred.promise,close:function(result){return $modalStack.close(modalInstance,result)},dismiss:function(reason){return $modalStack.dismiss(modalInstance,reason)}};if(modalOptions=angular.extend({},$modalProvider.options,modalOptions),modalOptions.resolve=modalOptions.resolve||{},modalOptions.appendTo=modalOptions.appendTo||$document.find("body").eq(0),!modalOptions.appendTo.length)throw new Error("appendTo element not found. Make sure that the element passed is in DOM.");if(!modalOptions.component&&!modalOptions.template&&!modalOptions.templateUrl)throw new Error("One of component or template or templateUrl options is required.");var templateAndResolvePromise;templateAndResolvePromise=modalOptions.component?$q.when($uibResolve.resolve(modalOptions.resolve,{},null,null)):$q.all([getTemplatePromise(modalOptions),$uibResolve.resolve(modalOptions.resolve,{},null,null)]);var samePromise;return samePromise=promiseChain=$q.all([promiseChain]).then(resolveWithTemplate,resolveWithTemplate).then(function(tplAndVars){function constructLocals(obj,template,instanceOnScope,injectable){obj.$scope=modalScope,obj.$scope.$resolve={},instanceOnScope?obj.$scope.$uibModalInstance=modalInstance:obj.$uibModalInstance=modalInstance;var resolves=template?tplAndVars[1]:tplAndVars;angular.forEach(resolves,function(value,key){injectable&&(obj[key]=value),obj.$scope.$resolve[key]=value})}var providedScope=modalOptions.scope||$rootScope,modalScope=providedScope.$new();modalScope.$close=modalInstance.close,modalScope.$dismiss=modalInstance.dismiss,modalScope.$on("$destroy",function(){modalScope.$$uibDestructionScheduled||modalScope.$dismiss("$uibUnscheduledDestruction")});var ctrlInstance,ctrlInstantiate,modal={scope:modalScope,deferred:modalResultDeferred,renderDeferred:modalRenderDeferred,closedDeferred:modalClosedDeferred,animation:modalOptions.animation,backdrop:modalOptions.backdrop,keyboard:modalOptions.keyboard,backdropClass:modalOptions.backdropClass,windowTopClass:modalOptions.windowTopClass,windowClass:modalOptions.windowClass,windowTemplateUrl:modalOptions.windowTemplateUrl,ariaLabelledBy:modalOptions.ariaLabelledBy,ariaDescribedBy:modalOptions.ariaDescribedBy,size:modalOptions.size,openedClass:modalOptions.openedClass,appendTo:modalOptions.appendTo},component={},ctrlLocals={};modalOptions.component?(constructLocals(component,!1,!0,!1),component.name=modalOptions.component,modal.component=component):modalOptions.controller&&(constructLocals(ctrlLocals,!0,!1,!0),ctrlInstantiate=$controller(modalOptions.controller,ctrlLocals,!0,modalOptions.controllerAs),modalOptions.controllerAs&&modalOptions.bindToController&&(ctrlInstance=ctrlInstantiate.instance,ctrlInstance.$close=modalScope.$close,ctrlInstance.$dismiss=modalScope.$dismiss,angular.extend(ctrlInstance,{$resolve:ctrlLocals.$scope.$resolve},providedScope)),ctrlInstance=ctrlInstantiate(),angular.isFunction(ctrlInstance.$onInit)&&ctrlInstance.$onInit()),modalOptions.component||(modal.content=tplAndVars[0]),$modalStack.open(modalInstance,modal),modalOpenedDeferred.resolve(!0)},function(reason){modalOpenedDeferred.reject(reason),modalResultDeferred.reject(reason)})["finally"](function(){promiseChain===samePromise&&(promiseChain=null)}),modalInstance},$modal}]};return $modalProvider}),angular.module("ui.bootstrap.paging",[]).factory("uibPaging",["$parse",function($parse){return{create:function(ctrl,$scope,$attrs){ctrl.setNumPages=$attrs.numPages?$parse($attrs.numPages).assign:angular.noop,ctrl.ngModelCtrl={$setViewValue:angular.noop},ctrl._watchers=[],ctrl.init=function(ngModelCtrl,config){ctrl.ngModelCtrl=ngModelCtrl,ctrl.config=config,ngModelCtrl.$render=function(){ctrl.render()},$attrs.itemsPerPage?ctrl._watchers.push($scope.$parent.$watch($attrs.itemsPerPage,function(value){ctrl.itemsPerPage=parseInt(value,10),$scope.totalPages=ctrl.calculateTotalPages(),ctrl.updatePage()})):ctrl.itemsPerPage=config.itemsPerPage,$scope.$watch("totalItems",function(newTotal,oldTotal){(angular.isDefined(newTotal)||newTotal!==oldTotal)&&($scope.totalPages=ctrl.calculateTotalPages(),ctrl.updatePage())})},ctrl.calculateTotalPages=function(){var totalPages=ctrl.itemsPerPage<1?1:Math.ceil($scope.totalItems/ctrl.itemsPerPage);return Math.max(totalPages||0,1)},ctrl.render=function(){$scope.page=parseInt(ctrl.ngModelCtrl.$viewValue,10)||1},$scope.selectPage=function(page,evt){evt&&evt.preventDefault();var clickAllowed=!$scope.ngDisabled||!evt;clickAllowed&&$scope.page!==page&&page>0&&page<=$scope.totalPages&&(evt&&evt.target&&evt.target.blur(),ctrl.ngModelCtrl.$setViewValue(page),ctrl.ngModelCtrl.$render())},$scope.getText=function(key){return $scope[key+"Text"]||ctrl.config[key+"Text"]},$scope.noPrevious=function(){return 1===$scope.page},$scope.noNext=function(){return $scope.page===$scope.totalPages},ctrl.updatePage=function(){ctrl.setNumPages($scope.$parent,$scope.totalPages),$scope.page>$scope.totalPages?$scope.selectPage($scope.totalPages):ctrl.ngModelCtrl.$render()},$scope.$on("$destroy",function(){for(;ctrl._watchers.length;)ctrl._watchers.shift()()})}}}]),angular.module("ui.bootstrap.pager",["ui.bootstrap.paging","ui.bootstrap.tabindex"]).controller("UibPagerController",["$scope","$attrs","uibPaging","uibPagerConfig",function($scope,$attrs,uibPaging,uibPagerConfig){$scope.align=angular.isDefined($attrs.align)?$scope.$parent.$eval($attrs.align):uibPagerConfig.align,uibPaging.create(this,$scope,$attrs)}]).constant("uibPagerConfig",{itemsPerPage:10,previousText:"« Previous",nextText:"Next »",align:!0}).directive("uibPager",["uibPagerConfig",function(uibPagerConfig){return{scope:{totalItems:"=",previousText:"@",nextText:"@",ngDisabled:"="},require:["uibPager","?ngModel"],restrict:"A",controller:"UibPagerController",controllerAs:"pager",templateUrl:function(element,attrs){return attrs.templateUrl||"uib/template/pager/pager.html"},link:function(scope,element,attrs,ctrls){element.addClass("pager");var paginationCtrl=ctrls[0],ngModelCtrl=ctrls[1];ngModelCtrl&&paginationCtrl.init(ngModelCtrl,uibPagerConfig)}}}]),angular.module("ui.bootstrap.pagination",["ui.bootstrap.paging","ui.bootstrap.tabindex"]).controller("UibPaginationController",["$scope","$attrs","$parse","uibPaging","uibPaginationConfig",function($scope,$attrs,$parse,uibPaging,uibPaginationConfig){function makePage(number,text,isActive){return{number:number,text:text,active:isActive}}function getPages(currentPage,totalPages){var pages=[],startPage=1,endPage=totalPages,isMaxSized=angular.isDefined(maxSize)&&maxSize<totalPages;isMaxSized&&(rotate?(startPage=Math.max(currentPage-Math.floor(maxSize/2),1),endPage=startPage+maxSize-1,endPage>totalPages&&(endPage=totalPages,startPage=endPage-maxSize+1)):(startPage=(Math.ceil(currentPage/maxSize)-1)*maxSize+1,endPage=Math.min(startPage+maxSize-1,totalPages)));for(var number=startPage;number<=endPage;number++){var page=makePage(number,pageLabel(number),number===currentPage);pages.push(page)}if(isMaxSized&&maxSize>0&&(!rotate||forceEllipses||boundaryLinkNumbers)){if(startPage>1){if(!boundaryLinkNumbers||startPage>3){var previousPageSet=makePage(startPage-1,"...",!1);pages.unshift(previousPageSet)}if(boundaryLinkNumbers){if(3===startPage){var secondPageLink=makePage(2,"2",!1);pages.unshift(secondPageLink)}var firstPageLink=makePage(1,"1",!1);pages.unshift(firstPageLink)}}if(endPage<totalPages){if(!boundaryLinkNumbers||endPage<totalPages-2){var nextPageSet=makePage(endPage+1,"...",!1);pages.push(nextPageSet)}if(boundaryLinkNumbers){if(endPage===totalPages-2){var secondToLastPageLink=makePage(totalPages-1,totalPages-1,!1);pages.push(secondToLastPageLink)}var lastPageLink=makePage(totalPages,totalPages,!1);pages.push(lastPageLink)}}}return pages}var ctrl=this,maxSize=angular.isDefined($attrs.maxSize)?$scope.$parent.$eval($attrs.maxSize):uibPaginationConfig.maxSize,rotate=angular.isDefined($attrs.rotate)?$scope.$parent.$eval($attrs.rotate):uibPaginationConfig.rotate,forceEllipses=angular.isDefined($attrs.forceEllipses)?$scope.$parent.$eval($attrs.forceEllipses):uibPaginationConfig.forceEllipses,boundaryLinkNumbers=angular.isDefined($attrs.boundaryLinkNumbers)?$scope.$parent.$eval($attrs.boundaryLinkNumbers):uibPaginationConfig.boundaryLinkNumbers,pageLabel=angular.isDefined($attrs.pageLabel)?function(idx){return $scope.$parent.$eval($attrs.pageLabel,{$page:idx})}:angular.identity;$scope.boundaryLinks=angular.isDefined($attrs.boundaryLinks)?$scope.$parent.$eval($attrs.boundaryLinks):uibPaginationConfig.boundaryLinks,$scope.directionLinks=angular.isDefined($attrs.directionLinks)?$scope.$parent.$eval($attrs.directionLinks):uibPaginationConfig.directionLinks,$attrs.$set("role","menu"),uibPaging.create(this,$scope,$attrs),$attrs.maxSize&&ctrl._watchers.push($scope.$parent.$watch($parse($attrs.maxSize),function(value){maxSize=parseInt(value,10),ctrl.render()}));var originalRender=this.render;this.render=function(){originalRender(),$scope.page>0&&$scope.page<=$scope.totalPages&&($scope.pages=getPages($scope.page,$scope.totalPages))}}]).constant("uibPaginationConfig",{itemsPerPage:10,boundaryLinks:!1,boundaryLinkNumbers:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0,forceEllipses:!1}).directive("uibPagination",["$parse","uibPaginationConfig",function($parse,uibPaginationConfig){return{scope:{totalItems:"=",firstText:"@",previousText:"@",nextText:"@",lastText:"@",ngDisabled:"="},require:["uibPagination","?ngModel"],restrict:"A",controller:"UibPaginationController",controllerAs:"pagination",templateUrl:function(element,attrs){return attrs.templateUrl||"uib/template/pagination/pagination.html"},link:function(scope,element,attrs,ctrls){element.addClass("pagination");var paginationCtrl=ctrls[0],ngModelCtrl=ctrls[1];ngModelCtrl&&paginationCtrl.init(ngModelCtrl,uibPaginationConfig)}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.stackedMap"]).provider("$uibTooltip",function(){function snake_case(name){var regexp=/[A-Z]/g,separator="-";return name.replace(regexp,function(letter,pos){return(pos?separator:"")+letter.toLowerCase()})}var defaultOptions={placement:"top",placementClassPrefix:"",animation:!0,popupDelay:0,popupCloseDelay:0,useContentExp:!1},triggerMap={mouseenter:"mouseleave",click:"click",outsideClick:"outsideClick",focus:"blur",none:""},globalOptions={};this.options=function(value){angular.extend(globalOptions,value)},this.setTriggers=function(triggers){angular.extend(triggerMap,triggers)},this.$get=["$window","$compile","$timeout","$document","$uibPosition","$interpolate","$rootScope","$parse","$$stackedMap",function($window,$compile,$timeout,$document,$position,$interpolate,$rootScope,$parse,$$stackedMap){function keypressListener(e){if(27===e.which){var last=openedTooltips.top();last&&(last.value.close(),last=null)}}var openedTooltips=$$stackedMap.createNew();return $document.on("keyup",keypressListener),$rootScope.$on("$destroy",function(){$document.off("keyup",keypressListener)}),function(ttType,prefix,defaultTriggerShow,options){function getTriggers(trigger){var show=(trigger||options.trigger||defaultTriggerShow).split(" "),hide=show.map(function(trigger){return triggerMap[trigger]||trigger});return{show:show,hide:hide}}options=angular.extend({},defaultOptions,globalOptions,options);var directiveName=snake_case(ttType),startSym=$interpolate.startSymbol(),endSym=$interpolate.endSymbol(),template="<div "+directiveName+'-popup uib-title="'+startSym+"title"+endSym+'" '+(options.useContentExp?'content-exp="contentExp()" ':'content="'+startSym+"content"+endSym+'" ')+'origin-scope="origScope" class="uib-position-measure '+prefix+'" tooltip-animation-class="fade"uib-tooltip-classes ng-class="{ in: isOpen }" ></div>';return{compile:function(tElem,tAttrs){var tooltipLinker=$compile(template);return function(scope,element,attrs,tooltipCtrl){function toggleTooltipBind(){ttScope.isOpen?hideTooltipBind():showTooltipBind()}function showTooltipBind(){hasEnableExp&&!scope.$eval(attrs[prefix+"Enable"])||(cancelHide(),prepareTooltip(),ttScope.popupDelay?showTimeout||(showTimeout=$timeout(show,ttScope.popupDelay,!1)):show())}function hideTooltipBind(){cancelShow(),ttScope.popupCloseDelay?hideTimeout||(hideTimeout=$timeout(hide,ttScope.popupCloseDelay,!1)):hide()}function show(){return cancelShow(),cancelHide(),ttScope.content?(createTooltip(),void ttScope.$evalAsync(function(){ttScope.isOpen=!0,assignIsOpen(!0),positionTooltip()})):angular.noop}function cancelShow(){showTimeout&&($timeout.cancel(showTimeout),showTimeout=null),positionTimeout&&($timeout.cancel(positionTimeout),positionTimeout=null)}function hide(){ttScope&&ttScope.$evalAsync(function(){ttScope&&(ttScope.isOpen=!1,assignIsOpen(!1),ttScope.animation?transitionTimeout||(transitionTimeout=$timeout(removeTooltip,150,!1)):removeTooltip())})}function cancelHide(){hideTimeout&&($timeout.cancel(hideTimeout),hideTimeout=null),transitionTimeout&&($timeout.cancel(transitionTimeout),transitionTimeout=null)}function createTooltip(){tooltip||(tooltipLinkedScope=ttScope.$new(),tooltip=tooltipLinker(tooltipLinkedScope,function(tooltip){appendToBody?$document.find("body").append(tooltip):element.after(tooltip)}),openedTooltips.add(ttScope,{close:hide}),prepObservers())}function removeTooltip(){cancelShow(),cancelHide(),unregisterObservers(),tooltip&&(tooltip.remove(),tooltip=null,adjustmentTimeout&&$timeout.cancel(adjustmentTimeout)),openedTooltips.remove(ttScope),tooltipLinkedScope&&(tooltipLinkedScope.$destroy(),tooltipLinkedScope=null)}function prepareTooltip(){ttScope.title=attrs[prefix+"Title"],contentParse?ttScope.content=contentParse(scope):ttScope.content=attrs[ttType],ttScope.popupClass=attrs[prefix+"Class"],ttScope.placement=angular.isDefined(attrs[prefix+"Placement"])?attrs[prefix+"Placement"]:options.placement;var placement=$position.parsePlacement(ttScope.placement);lastPlacement=placement[1]?placement[0]+"-"+placement[1]:placement[0];var delay=parseInt(attrs[prefix+"PopupDelay"],10),closeDelay=parseInt(attrs[prefix+"PopupCloseDelay"],10);ttScope.popupDelay=isNaN(delay)?options.popupDelay:delay,ttScope.popupCloseDelay=isNaN(closeDelay)?options.popupCloseDelay:closeDelay}function assignIsOpen(isOpen){isOpenParse&&angular.isFunction(isOpenParse.assign)&&isOpenParse.assign(scope,isOpen)}function prepObservers(){observers.length=0,contentParse?(observers.push(scope.$watch(contentParse,function(val){ttScope.content=val,!val&&ttScope.isOpen&&hide()})),observers.push(tooltipLinkedScope.$watch(function(){repositionScheduled||(repositionScheduled=!0,tooltipLinkedScope.$$postDigest(function(){repositionScheduled=!1,ttScope&&ttScope.isOpen&&positionTooltip()}))}))):observers.push(attrs.$observe(ttType,function(val){ttScope.content=val,!val&&ttScope.isOpen?hide():positionTooltip()})),observers.push(attrs.$observe(prefix+"Title",function(val){ttScope.title=val,ttScope.isOpen&&positionTooltip()})),observers.push(attrs.$observe(prefix+"Placement",function(val){ttScope.placement=val?val:options.placement,ttScope.isOpen&&positionTooltip()}))}function unregisterObservers(){observers.length&&(angular.forEach(observers,function(observer){observer()}),observers.length=0)}function bodyHideTooltipBind(e){ttScope&&ttScope.isOpen&&tooltip&&(element[0].contains(e.target)||tooltip[0].contains(e.target)||hideTooltipBind())}function hideOnEscapeKey(e){27===e.which&&hideTooltipBind()}function prepTriggers(){var showTriggers=[],hideTriggers=[],val=scope.$eval(attrs[prefix+"Trigger"]);unregisterTriggers(),angular.isObject(val)?(Object.keys(val).forEach(function(key){showTriggers.push(key),hideTriggers.push(val[key])}),triggers={show:showTriggers,hide:hideTriggers}):triggers=getTriggers(val),"none"!==triggers.show&&triggers.show.forEach(function(trigger,idx){"outsideClick"===trigger?(element.on("click",toggleTooltipBind),$document.on("click",bodyHideTooltipBind)):trigger===triggers.hide[idx]?element.on(trigger,toggleTooltipBind):trigger&&(element.on(trigger,showTooltipBind),element.on(triggers.hide[idx],hideTooltipBind)),element.on("keypress",hideOnEscapeKey)})}var tooltip,tooltipLinkedScope,transitionTimeout,showTimeout,hideTimeout,positionTimeout,adjustmentTimeout,lastPlacement,appendToBody=!!angular.isDefined(options.appendToBody)&&options.appendToBody,triggers=getTriggers(void 0),hasEnableExp=angular.isDefined(attrs[prefix+"Enable"]),ttScope=scope.$new(!0),repositionScheduled=!1,isOpenParse=!!angular.isDefined(attrs[prefix+"IsOpen"])&&$parse(attrs[prefix+"IsOpen"]),contentParse=!!options.useContentExp&&$parse(attrs[ttType]),observers=[],positionTooltip=function(){tooltip&&tooltip.html()&&(positionTimeout||(positionTimeout=$timeout(function(){var ttPosition=$position.positionElements(element,tooltip,ttScope.placement,appendToBody),initialHeight=angular.isDefined(tooltip.offsetHeight)?tooltip.offsetHeight:tooltip.prop("offsetHeight"),elementPos=appendToBody?$position.offset(element):$position.position(element);tooltip.css({top:ttPosition.top+"px",left:ttPosition.left+"px"});var placementClasses=ttPosition.placement.split("-");tooltip.hasClass(placementClasses[0])||(tooltip.removeClass(lastPlacement.split("-")[0]),tooltip.addClass(placementClasses[0])),tooltip.hasClass(options.placementClassPrefix+ttPosition.placement)||(tooltip.removeClass(options.placementClassPrefix+lastPlacement),tooltip.addClass(options.placementClassPrefix+ttPosition.placement)),adjustmentTimeout=$timeout(function(){var currentHeight=angular.isDefined(tooltip.offsetHeight)?tooltip.offsetHeight:tooltip.prop("offsetHeight"),adjustment=$position.adjustTop(placementClasses,elementPos,initialHeight,currentHeight);adjustment&&tooltip.css(adjustment),adjustmentTimeout=null},0,!1),tooltip.hasClass("uib-position-measure")?($position.positionArrow(tooltip,ttPosition.placement),tooltip.removeClass("uib-position-measure")):lastPlacement!==ttPosition.placement&&$position.positionArrow(tooltip,ttPosition.placement),lastPlacement=ttPosition.placement,positionTimeout=null},0,!1)))};ttScope.origScope=scope,ttScope.isOpen=!1,ttScope.contentExp=function(){return ttScope.content},attrs.$observe("disabled",function(val){val&&cancelShow(),val&&ttScope.isOpen&&hide()}),isOpenParse&&scope.$watch(isOpenParse,function(val){ttScope&&!val===ttScope.isOpen&&toggleTooltipBind()});var unregisterTriggers=function(){triggers.show.forEach(function(trigger){"outsideClick"===trigger?element.off("click",toggleTooltipBind):(element.off(trigger,showTooltipBind),element.off(trigger,toggleTooltipBind)),element.off("keypress",hideOnEscapeKey);
}),triggers.hide.forEach(function(trigger){"outsideClick"===trigger?$document.off("click",bodyHideTooltipBind):element.off(trigger,hideTooltipBind)})};prepTriggers();var animation=scope.$eval(attrs[prefix+"Animation"]);ttScope.animation=angular.isDefined(animation)?!!animation:options.animation;var appendToBodyVal,appendKey=prefix+"AppendToBody";appendToBodyVal=appendKey in attrs&&void 0===attrs[appendKey]||scope.$eval(attrs[appendKey]),appendToBody=angular.isDefined(appendToBodyVal)?appendToBodyVal:appendToBody,scope.$on("$destroy",function(){unregisterTriggers(),removeTooltip(),ttScope=null})}}}}}]}).directive("uibTooltipTemplateTransclude",["$animate","$sce","$compile","$templateRequest",function($animate,$sce,$compile,$templateRequest){return{link:function(scope,elem,attrs){var currentScope,previousElement,currentElement,origScope=scope.$eval(attrs.tooltipTemplateTranscludeScope),changeCounter=0,cleanupLastIncludeContent=function(){previousElement&&(previousElement.remove(),previousElement=null),currentScope&&(currentScope.$destroy(),currentScope=null),currentElement&&($animate.leave(currentElement).then(function(){previousElement=null}),previousElement=currentElement,currentElement=null)};scope.$watch($sce.parseAsResourceUrl(attrs.uibTooltipTemplateTransclude),function(src){var thisChangeId=++changeCounter;src?($templateRequest(src,!0).then(function(response){if(thisChangeId===changeCounter){var newScope=origScope.$new(),template=response,clone=$compile(template)(newScope,function(clone){cleanupLastIncludeContent(),$animate.enter(clone,elem)});currentScope=newScope,currentElement=clone,currentScope.$emit("$includeContentLoaded",src)}},function(){thisChangeId===changeCounter&&(cleanupLastIncludeContent(),scope.$emit("$includeContentError",src))}),scope.$emit("$includeContentRequested",src)):cleanupLastIncludeContent()}),scope.$on("$destroy",cleanupLastIncludeContent)}}}]).directive("uibTooltipClasses",["$uibPosition",function($uibPosition){return{restrict:"A",link:function(scope,element,attrs){if(scope.placement){var position=$uibPosition.parsePlacement(scope.placement);element.addClass(position[0])}scope.popupClass&&element.addClass(scope.popupClass),scope.animation&&element.addClass(attrs.tooltipAnimationClass)}}}]).directive("uibTooltipPopup",function(){return{restrict:"A",scope:{content:"@"},templateUrl:"uib/template/tooltip/tooltip-popup.html"}}).directive("uibTooltip",["$uibTooltip",function($uibTooltip){return $uibTooltip("uibTooltip","tooltip","mouseenter")}]).directive("uibTooltipTemplatePopup",function(){return{restrict:"A",scope:{contentExp:"&",originScope:"&"},templateUrl:"uib/template/tooltip/tooltip-template-popup.html"}}).directive("uibTooltipTemplate",["$uibTooltip",function($uibTooltip){return $uibTooltip("uibTooltipTemplate","tooltip","mouseenter",{useContentExp:!0})}]).directive("uibTooltipHtmlPopup",function(){return{restrict:"A",scope:{contentExp:"&"},templateUrl:"uib/template/tooltip/tooltip-html-popup.html"}}).directive("uibTooltipHtml",["$uibTooltip",function($uibTooltip){return $uibTooltip("uibTooltipHtml","tooltip","mouseenter",{useContentExp:!0})}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("uibPopoverTemplatePopup",function(){return{restrict:"A",scope:{uibTitle:"@",contentExp:"&",originScope:"&"},templateUrl:"uib/template/popover/popover-template.html"}}).directive("uibPopoverTemplate",["$uibTooltip",function($uibTooltip){return $uibTooltip("uibPopoverTemplate","popover","click",{useContentExp:!0})}]).directive("uibPopoverHtmlPopup",function(){return{restrict:"A",scope:{contentExp:"&",uibTitle:"@"},templateUrl:"uib/template/popover/popover-html.html"}}).directive("uibPopoverHtml",["$uibTooltip",function($uibTooltip){return $uibTooltip("uibPopoverHtml","popover","click",{useContentExp:!0})}]).directive("uibPopoverPopup",function(){return{restrict:"A",scope:{uibTitle:"@",content:"@"},templateUrl:"uib/template/popover/popover.html"}}).directive("uibPopover",["$uibTooltip",function($uibTooltip){return $uibTooltip("uibPopover","popover","click")}]),angular.module("ui.bootstrap.progressbar",[]).constant("uibProgressConfig",{animate:!0,max:100}).controller("UibProgressController",["$scope","$attrs","uibProgressConfig",function($scope,$attrs,progressConfig){function getMaxOrDefault(){return angular.isDefined($scope.maxParam)?$scope.maxParam:progressConfig.max}var self=this,animate=angular.isDefined($attrs.animate)?$scope.$parent.$eval($attrs.animate):progressConfig.animate;this.bars=[],$scope.max=getMaxOrDefault(),this.addBar=function(bar,element,attrs){animate||element.css({transition:"none"}),this.bars.push(bar),bar.max=getMaxOrDefault(),bar.title=attrs&&angular.isDefined(attrs.title)?attrs.title:"progressbar",bar.$watch("value",function(value){bar.recalculatePercentage()}),bar.recalculatePercentage=function(){var totalPercentage=self.bars.reduce(function(total,bar){return bar.percent=+(100*bar.value/bar.max).toFixed(2),total+bar.percent},0);totalPercentage>100&&(bar.percent-=totalPercentage-100)},bar.$on("$destroy",function(){element=null,self.removeBar(bar)})},this.removeBar=function(bar){this.bars.splice(this.bars.indexOf(bar),1),this.bars.forEach(function(bar){bar.recalculatePercentage()})},$scope.$watch("maxParam",function(maxParam){self.bars.forEach(function(bar){bar.max=getMaxOrDefault(),bar.recalculatePercentage()})})}]).directive("uibProgress",function(){return{replace:!0,transclude:!0,controller:"UibProgressController",require:"uibProgress",scope:{maxParam:"=?max"},templateUrl:"uib/template/progressbar/progress.html"}}).directive("uibBar",function(){return{replace:!0,transclude:!0,require:"^uibProgress",scope:{value:"=",type:"@"},templateUrl:"uib/template/progressbar/bar.html",link:function(scope,element,attrs,progressCtrl){progressCtrl.addBar(scope,element,attrs)}}}).directive("uibProgressbar",function(){return{replace:!0,transclude:!0,controller:"UibProgressController",scope:{value:"=",maxParam:"=?max",type:"@"},templateUrl:"uib/template/progressbar/progressbar.html",link:function(scope,element,attrs,progressCtrl){progressCtrl.addBar(scope,angular.element(element.children()[0]),{title:attrs.title})}}}),angular.module("ui.bootstrap.rating",[]).constant("uibRatingConfig",{max:5,stateOn:null,stateOff:null,enableReset:!0,titles:["one","two","three","four","five"]}).controller("UibRatingController",["$scope","$attrs","uibRatingConfig",function($scope,$attrs,ratingConfig){var ngModelCtrl={$setViewValue:angular.noop},self=this;this.init=function(ngModelCtrl_){ngModelCtrl=ngModelCtrl_,ngModelCtrl.$render=this.render,ngModelCtrl.$formatters.push(function(value){return angular.isNumber(value)&&value<<0!==value&&(value=Math.round(value)),value}),this.stateOn=angular.isDefined($attrs.stateOn)?$scope.$parent.$eval($attrs.stateOn):ratingConfig.stateOn,this.stateOff=angular.isDefined($attrs.stateOff)?$scope.$parent.$eval($attrs.stateOff):ratingConfig.stateOff,this.enableReset=angular.isDefined($attrs.enableReset)?$scope.$parent.$eval($attrs.enableReset):ratingConfig.enableReset;var tmpTitles=angular.isDefined($attrs.titles)?$scope.$parent.$eval($attrs.titles):ratingConfig.titles;this.titles=angular.isArray(tmpTitles)&&tmpTitles.length>0?tmpTitles:ratingConfig.titles;var ratingStates=angular.isDefined($attrs.ratingStates)?$scope.$parent.$eval($attrs.ratingStates):new Array(angular.isDefined($attrs.max)?$scope.$parent.$eval($attrs.max):ratingConfig.max);$scope.range=this.buildTemplateObjects(ratingStates)},this.buildTemplateObjects=function(states){for(var i=0,n=states.length;i<n;i++)states[i]=angular.extend({index:i},{stateOn:this.stateOn,stateOff:this.stateOff,title:this.getTitle(i)},states[i]);return states},this.getTitle=function(index){return index>=this.titles.length?index+1:this.titles[index]},$scope.rate=function(value){if(!$scope.readonly&&value>=0&&value<=$scope.range.length){var newViewValue=self.enableReset&&ngModelCtrl.$viewValue===value?0:value;ngModelCtrl.$setViewValue(newViewValue),ngModelCtrl.$render()}},$scope.enter=function(value){$scope.readonly||($scope.value=value),$scope.onHover({value:value})},$scope.reset=function(){$scope.value=ngModelCtrl.$viewValue,$scope.onLeave()},$scope.onKeydown=function(evt){/(37|38|39|40)/.test(evt.which)&&(evt.preventDefault(),evt.stopPropagation(),$scope.rate($scope.value+(38===evt.which||39===evt.which?1:-1)))},this.render=function(){$scope.value=ngModelCtrl.$viewValue,$scope.title=self.getTitle($scope.value-1)}}]).directive("uibRating",function(){return{require:["uibRating","ngModel"],restrict:"A",scope:{readonly:"=?readOnly",onHover:"&",onLeave:"&"},controller:"UibRatingController",templateUrl:"uib/template/rating/rating.html",link:function(scope,element,attrs,ctrls){var ratingCtrl=ctrls[0],ngModelCtrl=ctrls[1];ratingCtrl.init(ngModelCtrl)}}}),angular.module("ui.bootstrap.tabs",[]).controller("UibTabsetController",["$scope",function($scope){function findTabIndex(index){for(var i=0;i<ctrl.tabs.length;i++)if(ctrl.tabs[i].index===index)return i}var oldIndex,ctrl=this;ctrl.tabs=[],ctrl.select=function(index,evt){if(!destroyed){var previousIndex=findTabIndex(oldIndex),previousSelected=ctrl.tabs[previousIndex];if(previousSelected){if(previousSelected.tab.onDeselect({$event:evt,$selectedIndex:index}),evt&&evt.isDefaultPrevented())return;previousSelected.tab.active=!1}var selected=ctrl.tabs[index];selected?(selected.tab.onSelect({$event:evt}),selected.tab.active=!0,ctrl.active=selected.index,oldIndex=selected.index):!selected&&angular.isDefined(oldIndex)&&(ctrl.active=null,oldIndex=null)}},ctrl.addTab=function(tab){if(ctrl.tabs.push({tab:tab,index:tab.index}),ctrl.tabs.sort(function(t1,t2){return t1.index>t2.index?1:t1.index<t2.index?-1:0}),tab.index===ctrl.active||!angular.isDefined(ctrl.active)&&1===ctrl.tabs.length){var newActiveIndex=findTabIndex(tab.index);ctrl.select(newActiveIndex)}},ctrl.removeTab=function(tab){for(var index,i=0;i<ctrl.tabs.length;i++)if(ctrl.tabs[i].tab===tab){index=i;break}if(ctrl.tabs[index].index===ctrl.active){var newActiveTabIndex=index===ctrl.tabs.length-1?index-1:index+1%ctrl.tabs.length;ctrl.select(newActiveTabIndex)}ctrl.tabs.splice(index,1)},$scope.$watch("tabset.active",function(val){angular.isDefined(val)&&val!==oldIndex&&ctrl.select(findTabIndex(val))});var destroyed;$scope.$on("$destroy",function(){destroyed=!0})}]).directive("uibTabset",function(){return{transclude:!0,replace:!0,scope:{},bindToController:{active:"=?",type:"@"},controller:"UibTabsetController",controllerAs:"tabset",templateUrl:function(element,attrs){return attrs.templateUrl||"uib/template/tabs/tabset.html"},link:function(scope,element,attrs){scope.vertical=!!angular.isDefined(attrs.vertical)&&scope.$parent.$eval(attrs.vertical),scope.justified=!!angular.isDefined(attrs.justified)&&scope.$parent.$eval(attrs.justified)}}}).directive("uibTab",["$parse",function($parse){return{require:"^uibTabset",replace:!0,templateUrl:function(element,attrs){return attrs.templateUrl||"uib/template/tabs/tab.html"},transclude:!0,scope:{heading:"@",index:"=?",classes:"@?",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},controllerAs:"tab",link:function(scope,elm,attrs,tabsetCtrl,transclude){scope.disabled=!1,attrs.disable&&scope.$parent.$watch($parse(attrs.disable),function(value){scope.disabled=!!value}),angular.isUndefined(attrs.index)&&(tabsetCtrl.tabs&&tabsetCtrl.tabs.length?scope.index=Math.max.apply(null,tabsetCtrl.tabs.map(function(t){return t.index}))+1:scope.index=0),angular.isUndefined(attrs.classes)&&(scope.classes=""),scope.select=function(evt){if(!scope.disabled){for(var index,i=0;i<tabsetCtrl.tabs.length;i++)if(tabsetCtrl.tabs[i].tab===scope){index=i;break}tabsetCtrl.select(index,evt)}},tabsetCtrl.addTab(scope),scope.$on("$destroy",function(){tabsetCtrl.removeTab(scope)}),scope.$transcludeFn=transclude}}}]).directive("uibTabHeadingTransclude",function(){return{restrict:"A",require:"^uibTab",link:function(scope,elm){scope.$watch("headingElement",function(heading){heading&&(elm.html(""),elm.append(heading))})}}}).directive("uibTabContentTransclude",function(){function isTabHeading(node){return node.tagName&&(node.hasAttribute("uib-tab-heading")||node.hasAttribute("data-uib-tab-heading")||node.hasAttribute("x-uib-tab-heading")||"uib-tab-heading"===node.tagName.toLowerCase()||"data-uib-tab-heading"===node.tagName.toLowerCase()||"x-uib-tab-heading"===node.tagName.toLowerCase()||"uib:tab-heading"===node.tagName.toLowerCase())}return{restrict:"A",require:"^uibTabset",link:function(scope,elm,attrs){var tab=scope.$eval(attrs.uibTabContentTransclude).tab;tab.$transcludeFn(tab.$parent,function(contents){angular.forEach(contents,function(node){isTabHeading(node)?tab.headingElement=node:elm.append(node)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("uibTimepickerConfig",{hourStep:1,minuteStep:1,secondStep:1,showMeridian:!0,showSeconds:!1,meridians:null,readonlyInput:!1,mousewheel:!0,arrowkeys:!0,showSpinners:!0,templateUrl:"uib/template/timepicker/timepicker.html"}).controller("UibTimepickerController",["$scope","$element","$attrs","$parse","$log","$locale","uibTimepickerConfig",function($scope,$element,$attrs,$parse,$log,$locale,timepickerConfig){function getHoursFromTemplate(){var hours=+$scope.hours,valid=$scope.showMeridian?hours>0&&hours<13:hours>=0&&hours<24;if(valid&&""!==$scope.hours)return $scope.showMeridian&&(12===hours&&(hours=0),$scope.meridian===meridians[1]&&(hours+=12)),hours}function getMinutesFromTemplate(){var minutes=+$scope.minutes,valid=minutes>=0&&minutes<60;if(valid&&""!==$scope.minutes)return minutes}function getSecondsFromTemplate(){var seconds=+$scope.seconds;return seconds>=0&&seconds<60?seconds:void 0}function pad(value,noPad){return null===value?"":angular.isDefined(value)&&value.toString().length<2&&!noPad?"0"+value:value.toString()}function refresh(keyboardChange){makeValid(),ngModelCtrl.$setViewValue(new Date(selected)),updateTemplate(keyboardChange)}function makeValid(){hoursModelCtrl&&hoursModelCtrl.$setValidity("hours",!0),minutesModelCtrl&&minutesModelCtrl.$setValidity("minutes",!0),secondsModelCtrl&&secondsModelCtrl.$setValidity("seconds",!0),ngModelCtrl.$setValidity("time",!0),$scope.invalidHours=!1,$scope.invalidMinutes=!1,$scope.invalidSeconds=!1}function updateTemplate(keyboardChange){if(ngModelCtrl.$modelValue){var hours=selected.getHours(),minutes=selected.getMinutes(),seconds=selected.getSeconds();$scope.showMeridian&&(hours=0===hours||12===hours?12:hours%12),$scope.hours="h"===keyboardChange?hours:pad(hours,!padHours),"m"!==keyboardChange&&($scope.minutes=pad(minutes)),$scope.meridian=selected.getHours()<12?meridians[0]:meridians[1],"s"!==keyboardChange&&($scope.seconds=pad(seconds)),$scope.meridian=selected.getHours()<12?meridians[0]:meridians[1]}else $scope.hours=null,$scope.minutes=null,$scope.seconds=null,$scope.meridian=meridians[0]}function addSecondsToSelected(seconds){selected=addSeconds(selected,seconds),refresh()}function addMinutes(selected,minutes){return addSeconds(selected,60*minutes)}function addSeconds(date,seconds){var dt=new Date(date.getTime()+1e3*seconds),newDate=new Date(date);return newDate.setHours(dt.getHours(),dt.getMinutes(),dt.getSeconds()),newDate}function modelIsEmpty(){return(null===$scope.hours||""===$scope.hours)&&(null===$scope.minutes||""===$scope.minutes)&&(!$scope.showSeconds||$scope.showSeconds&&(null===$scope.seconds||""===$scope.seconds))}var hoursModelCtrl,minutesModelCtrl,secondsModelCtrl,selected=new Date,watchers=[],ngModelCtrl={$setViewValue:angular.noop},meridians=angular.isDefined($attrs.meridians)?$scope.$parent.$eval($attrs.meridians):timepickerConfig.meridians||$locale.DATETIME_FORMATS.AMPMS,padHours=!angular.isDefined($attrs.padHours)||$scope.$parent.$eval($attrs.padHours);$scope.tabindex=angular.isDefined($attrs.tabindex)?$attrs.tabindex:0,$element.removeAttr("tabindex"),this.init=function(ngModelCtrl_,inputs){ngModelCtrl=ngModelCtrl_,ngModelCtrl.$render=this.render,ngModelCtrl.$formatters.unshift(function(modelValue){return modelValue?new Date(modelValue):null});var hoursInputEl=inputs.eq(0),minutesInputEl=inputs.eq(1),secondsInputEl=inputs.eq(2);hoursModelCtrl=hoursInputEl.controller("ngModel"),minutesModelCtrl=minutesInputEl.controller("ngModel"),secondsModelCtrl=secondsInputEl.controller("ngModel");var mousewheel=angular.isDefined($attrs.mousewheel)?$scope.$parent.$eval($attrs.mousewheel):timepickerConfig.mousewheel;mousewheel&&this.setupMousewheelEvents(hoursInputEl,minutesInputEl,secondsInputEl);var arrowkeys=angular.isDefined($attrs.arrowkeys)?$scope.$parent.$eval($attrs.arrowkeys):timepickerConfig.arrowkeys;arrowkeys&&this.setupArrowkeyEvents(hoursInputEl,minutesInputEl,secondsInputEl),$scope.readonlyInput=angular.isDefined($attrs.readonlyInput)?$scope.$parent.$eval($attrs.readonlyInput):timepickerConfig.readonlyInput,this.setupInputEvents(hoursInputEl,minutesInputEl,secondsInputEl)};var hourStep=timepickerConfig.hourStep;$attrs.hourStep&&watchers.push($scope.$parent.$watch($parse($attrs.hourStep),function(value){hourStep=+value}));var minuteStep=timepickerConfig.minuteStep;$attrs.minuteStep&&watchers.push($scope.$parent.$watch($parse($attrs.minuteStep),function(value){minuteStep=+value}));var min;watchers.push($scope.$parent.$watch($parse($attrs.min),function(value){var dt=new Date(value);min=isNaN(dt)?void 0:dt}));var max;watchers.push($scope.$parent.$watch($parse($attrs.max),function(value){var dt=new Date(value);max=isNaN(dt)?void 0:dt}));var disabled=!1;$attrs.ngDisabled&&watchers.push($scope.$parent.$watch($parse($attrs.ngDisabled),function(value){disabled=value})),$scope.noIncrementHours=function(){var incrementedSelected=addMinutes(selected,60*hourStep);return disabled||incrementedSelected>max||incrementedSelected<selected&&incrementedSelected<min},$scope.noDecrementHours=function(){var decrementedSelected=addMinutes(selected,60*-hourStep);return disabled||decrementedSelected<min||decrementedSelected>selected&&decrementedSelected>max},$scope.noIncrementMinutes=function(){var incrementedSelected=addMinutes(selected,minuteStep);return disabled||incrementedSelected>max||incrementedSelected<selected&&incrementedSelected<min},$scope.noDecrementMinutes=function(){var decrementedSelected=addMinutes(selected,-minuteStep);return disabled||decrementedSelected<min||decrementedSelected>selected&&decrementedSelected>max},$scope.noIncrementSeconds=function(){var incrementedSelected=addSeconds(selected,secondStep);return disabled||incrementedSelected>max||incrementedSelected<selected&&incrementedSelected<min},$scope.noDecrementSeconds=function(){var decrementedSelected=addSeconds(selected,-secondStep);return disabled||decrementedSelected<min||decrementedSelected>selected&&decrementedSelected>max},$scope.noToggleMeridian=function(){return selected.getHours()<12?disabled||addMinutes(selected,720)>max:disabled||addMinutes(selected,-720)<min};var secondStep=timepickerConfig.secondStep;$attrs.secondStep&&watchers.push($scope.$parent.$watch($parse($attrs.secondStep),function(value){secondStep=+value})),$scope.showSeconds=timepickerConfig.showSeconds,$attrs.showSeconds&&watchers.push($scope.$parent.$watch($parse($attrs.showSeconds),function(value){$scope.showSeconds=!!value})),$scope.showMeridian=timepickerConfig.showMeridian,$attrs.showMeridian&&watchers.push($scope.$parent.$watch($parse($attrs.showMeridian),function(value){if($scope.showMeridian=!!value,ngModelCtrl.$error.time){var hours=getHoursFromTemplate(),minutes=getMinutesFromTemplate();angular.isDefined(hours)&&angular.isDefined(minutes)&&(selected.setHours(hours),refresh())}else updateTemplate()})),this.setupMousewheelEvents=function(hoursInputEl,minutesInputEl,secondsInputEl){var isScrollingUp=function(e){e.originalEvent&&(e=e.originalEvent);var delta=e.wheelDelta?e.wheelDelta:-e.deltaY;return e.detail||delta>0};hoursInputEl.on("mousewheel wheel",function(e){disabled||$scope.$apply(isScrollingUp(e)?$scope.incrementHours():$scope.decrementHours()),e.preventDefault()}),minutesInputEl.on("mousewheel wheel",function(e){disabled||$scope.$apply(isScrollingUp(e)?$scope.incrementMinutes():$scope.decrementMinutes()),e.preventDefault()}),secondsInputEl.on("mousewheel wheel",function(e){disabled||$scope.$apply(isScrollingUp(e)?$scope.incrementSeconds():$scope.decrementSeconds()),e.preventDefault()})},this.setupArrowkeyEvents=function(hoursInputEl,minutesInputEl,secondsInputEl){hoursInputEl.on("keydown",function(e){disabled||(38===e.which?(e.preventDefault(),$scope.incrementHours(),$scope.$apply()):40===e.which&&(e.preventDefault(),$scope.decrementHours(),$scope.$apply()))}),minutesInputEl.on("keydown",function(e){disabled||(38===e.which?(e.preventDefault(),$scope.incrementMinutes(),$scope.$apply()):40===e.which&&(e.preventDefault(),$scope.decrementMinutes(),$scope.$apply()))}),secondsInputEl.on("keydown",function(e){disabled||(38===e.which?(e.preventDefault(),$scope.incrementSeconds(),$scope.$apply()):40===e.which&&(e.preventDefault(),$scope.decrementSeconds(),$scope.$apply()))})},this.setupInputEvents=function(hoursInputEl,minutesInputEl,secondsInputEl){if($scope.readonlyInput)return $scope.updateHours=angular.noop,$scope.updateMinutes=angular.noop,void($scope.updateSeconds=angular.noop);var invalidate=function(invalidHours,invalidMinutes,invalidSeconds){ngModelCtrl.$setViewValue(null),ngModelCtrl.$setValidity("time",!1),angular.isDefined(invalidHours)&&($scope.invalidHours=invalidHours,hoursModelCtrl&&hoursModelCtrl.$setValidity("hours",!1)),angular.isDefined(invalidMinutes)&&($scope.invalidMinutes=invalidMinutes,minutesModelCtrl&&minutesModelCtrl.$setValidity("minutes",!1)),angular.isDefined(invalidSeconds)&&($scope.invalidSeconds=invalidSeconds,secondsModelCtrl&&secondsModelCtrl.$setValidity("seconds",!1))};$scope.updateHours=function(){var hours=getHoursFromTemplate(),minutes=getMinutesFromTemplate();ngModelCtrl.$setDirty(),angular.isDefined(hours)&&angular.isDefined(minutes)?(selected.setHours(hours),selected.setMinutes(minutes),selected<min||selected>max?invalidate(!0):refresh("h")):invalidate(!0)},hoursInputEl.on("blur",function(e){ngModelCtrl.$setTouched(),modelIsEmpty()?makeValid():null===$scope.hours||""===$scope.hours?invalidate(!0):!$scope.invalidHours&&$scope.hours<10&&$scope.$apply(function(){$scope.hours=pad($scope.hours,!padHours)})}),$scope.updateMinutes=function(){var minutes=getMinutesFromTemplate(),hours=getHoursFromTemplate();ngModelCtrl.$setDirty(),angular.isDefined(minutes)&&angular.isDefined(hours)?(selected.setHours(hours),selected.setMinutes(minutes),selected<min||selected>max?invalidate(void 0,!0):refresh("m")):invalidate(void 0,!0)},minutesInputEl.on("blur",function(e){ngModelCtrl.$setTouched(),modelIsEmpty()?makeValid():null===$scope.minutes?invalidate(void 0,!0):!$scope.invalidMinutes&&$scope.minutes<10&&$scope.$apply(function(){$scope.minutes=pad($scope.minutes)})}),$scope.updateSeconds=function(){var seconds=getSecondsFromTemplate();ngModelCtrl.$setDirty(),angular.isDefined(seconds)?(selected.setSeconds(seconds),refresh("s")):invalidate(void 0,void 0,!0)},secondsInputEl.on("blur",function(e){modelIsEmpty()?makeValid():!$scope.invalidSeconds&&$scope.seconds<10&&$scope.$apply(function(){$scope.seconds=pad($scope.seconds)})})},this.render=function(){var date=ngModelCtrl.$viewValue;isNaN(date)?(ngModelCtrl.$setValidity("time",!1),$log.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(date&&(selected=date),selected<min||selected>max?(ngModelCtrl.$setValidity("time",!1),$scope.invalidHours=!0,$scope.invalidMinutes=!0):makeValid(),updateTemplate())},$scope.showSpinners=angular.isDefined($attrs.showSpinners)?$scope.$parent.$eval($attrs.showSpinners):timepickerConfig.showSpinners,$scope.incrementHours=function(){$scope.noIncrementHours()||addSecondsToSelected(60*hourStep*60)},$scope.decrementHours=function(){$scope.noDecrementHours()||addSecondsToSelected(60*-hourStep*60)},$scope.incrementMinutes=function(){$scope.noIncrementMinutes()||addSecondsToSelected(60*minuteStep)},$scope.decrementMinutes=function(){$scope.noDecrementMinutes()||addSecondsToSelected(60*-minuteStep)},$scope.incrementSeconds=function(){$scope.noIncrementSeconds()||addSecondsToSelected(secondStep)},$scope.decrementSeconds=function(){$scope.noDecrementSeconds()||addSecondsToSelected(-secondStep)},$scope.toggleMeridian=function(){var minutes=getMinutesFromTemplate(),hours=getHoursFromTemplate();$scope.noToggleMeridian()||(angular.isDefined(minutes)&&angular.isDefined(hours)?addSecondsToSelected(720*(selected.getHours()<12?60:-60)):$scope.meridian=$scope.meridian===meridians[0]?meridians[1]:meridians[0])},$scope.blur=function(){ngModelCtrl.$setTouched()},$scope.$on("$destroy",function(){for(;watchers.length;)watchers.shift()()})}]).directive("uibTimepicker",["uibTimepickerConfig",function(uibTimepickerConfig){return{require:["uibTimepicker","?^ngModel"],restrict:"A",controller:"UibTimepickerController",controllerAs:"timepicker",scope:{},templateUrl:function(element,attrs){return attrs.templateUrl||uibTimepickerConfig.templateUrl},link:function(scope,element,attrs,ctrls){var timepickerCtrl=ctrls[0],ngModelCtrl=ctrls[1];ngModelCtrl&&timepickerCtrl.init(ngModelCtrl,element.find("input"))}}}]),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.debounce","ui.bootstrap.position"]).factory("uibTypeaheadParser",["$parse",function($parse){var TYPEAHEAD_REGEXP=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+([\s\S]+?)$/;return{parse:function(input){var match=input.match(TYPEAHEAD_REGEXP);if(!match)throw new Error('Expected typeahead specification in form of "_modelValue_ (as _label_)? for _item_ in _collection_" but got "'+input+'".');return{itemName:match[3],source:$parse(match[4]),viewMapper:$parse(match[2]||match[1]),modelMapper:$parse(match[1])}}}}]).controller("UibTypeaheadController",["$scope","$element","$attrs","$compile","$parse","$q","$timeout","$document","$window","$rootScope","$$debounce","$uibPosition","uibTypeaheadParser",function(originalScope,element,attrs,$compile,$parse,$q,$timeout,$document,$window,$rootScope,$$debounce,$position,typeaheadParser){function fireRecalculating(){scope.moveInProgress||(scope.moveInProgress=!0,scope.$digest()),debouncedRecalculate()}function recalculatePosition(){scope.position=appendToBody?$position.offset(element):$position.position(element),scope.position.top+=element.prop("offsetHeight")}function extractOptions(ngModelCtrl){var ngModelOptions;return angular.version.minor<6?(ngModelOptions=ngModelCtrl.$options||{},ngModelOptions.getOption=function(key){return ngModelOptions[key]}):ngModelOptions=ngModelCtrl.$options,ngModelOptions}var modelCtrl,ngModelOptions,HOT_KEYS=[9,13,27,38,40],eventDebounceTime=200,minLength=originalScope.$eval(attrs.typeaheadMinLength);minLength||0===minLength||(minLength=1),originalScope.$watch(attrs.typeaheadMinLength,function(newVal){minLength=newVal||0===newVal?newVal:1});var waitTime=originalScope.$eval(attrs.typeaheadWaitMs)||0,isEditable=originalScope.$eval(attrs.typeaheadEditable)!==!1;originalScope.$watch(attrs.typeaheadEditable,function(newVal){isEditable=newVal!==!1});var hasFocus,selected,isLoadingSetter=$parse(attrs.typeaheadLoading).assign||angular.noop,isSelectEvent=attrs.typeaheadShouldSelect?$parse(attrs.typeaheadShouldSelect):function(scope,vals){var evt=vals.$event;return 13===evt.which||9===evt.which},onSelectCallback=$parse(attrs.typeaheadOnSelect),isSelectOnBlur=!!angular.isDefined(attrs.typeaheadSelectOnBlur)&&originalScope.$eval(attrs.typeaheadSelectOnBlur),isNoResultsSetter=$parse(attrs.typeaheadNoResults).assign||angular.noop,inputFormatter=attrs.typeaheadInputFormatter?$parse(attrs.typeaheadInputFormatter):void 0,appendToBody=!!attrs.typeaheadAppendToBody&&originalScope.$eval(attrs.typeaheadAppendToBody),appendTo=attrs.typeaheadAppendTo?originalScope.$eval(attrs.typeaheadAppendTo):null,focusFirst=originalScope.$eval(attrs.typeaheadFocusFirst)!==!1,selectOnExact=!!attrs.typeaheadSelectOnExact&&originalScope.$eval(attrs.typeaheadSelectOnExact),isOpenSetter=$parse(attrs.typeaheadIsOpen).assign||angular.noop,showHint=originalScope.$eval(attrs.typeaheadShowHint)||!1,parsedModel=$parse(attrs.ngModel),invokeModelSetter=$parse(attrs.ngModel+"($$$p)"),$setModelValue=function(scope,newValue){return angular.isFunction(parsedModel(originalScope))&&ngModelOptions.getOption("getterSetter")?invokeModelSetter(scope,{$$$p:newValue}):parsedModel.assign(scope,newValue)},parserResult=typeaheadParser.parse(attrs.uibTypeahead),scope=originalScope.$new(),offDestroy=originalScope.$on("$destroy",function(){scope.$destroy()});scope.$on("$destroy",offDestroy);var popupId="typeahead-"+scope.$id+"-"+Math.floor(1e4*Math.random());element.attr({"aria-autocomplete":"list","aria-expanded":!1,"aria-owns":popupId});var inputsContainer,hintInputElem;showHint&&(inputsContainer=angular.element("<div></div>"),inputsContainer.css("position","relative"),element.after(inputsContainer),hintInputElem=element.clone(),hintInputElem.attr("placeholder",""),hintInputElem.attr("tabindex","-1"),hintInputElem.val(""),hintInputElem.css({position:"absolute",top:"0px",left:"0px","border-color":"transparent","box-shadow":"none",opacity:1,background:"none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255)",color:"#999"}),element.css({position:"relative","vertical-align":"top","background-color":"transparent"}),hintInputElem.attr("id")&&hintInputElem.removeAttr("id"),inputsContainer.append(hintInputElem),hintInputElem.after(element));var popUpEl=angular.element("<div uib-typeahead-popup></div>");popUpEl.attr({id:popupId,matches:"matches",active:"activeIdx",select:"select(activeIdx, evt)","move-in-progress":"moveInProgress",query:"query",position:"position","assign-is-open":"assignIsOpen(isOpen)",debounce:"debounceUpdate"}),angular.isDefined(attrs.typeaheadTemplateUrl)&&popUpEl.attr("template-url",attrs.typeaheadTemplateUrl),angular.isDefined(attrs.typeaheadPopupTemplateUrl)&&popUpEl.attr("popup-template-url",attrs.typeaheadPopupTemplateUrl);var resetHint=function(){showHint&&hintInputElem.val("")},resetMatches=function(){scope.matches=[],scope.activeIdx=-1,element.attr("aria-expanded",!1),resetHint()},getMatchId=function(index){return popupId+"-option-"+index};scope.$watch("activeIdx",function(index){index<0?element.removeAttr("aria-activedescendant"):element.attr("aria-activedescendant",getMatchId(index))});var inputIsExactMatch=function(inputValue,index){return!!(scope.matches.length>index&&inputValue)&&inputValue.toUpperCase()===scope.matches[index].label.toUpperCase()},getMatchesAsync=function(inputValue,evt){var locals={$viewValue:inputValue};isLoadingSetter(originalScope,!0),isNoResultsSetter(originalScope,!1),$q.when(parserResult.source(originalScope,locals)).then(function(matches){var onCurrentRequest=inputValue===modelCtrl.$viewValue;if(onCurrentRequest&&hasFocus)if(matches&&matches.length>0){scope.activeIdx=focusFirst?0:-1,isNoResultsSetter(originalScope,!1),scope.matches.length=0;for(var i=0;i<matches.length;i++)locals[parserResult.itemName]=matches[i],scope.matches.push({id:getMatchId(i),label:parserResult.viewMapper(scope,locals),model:matches[i]});if(scope.query=inputValue,recalculatePosition(),element.attr("aria-expanded",!0),selectOnExact&&1===scope.matches.length&&inputIsExactMatch(inputValue,0)&&(angular.isNumber(scope.debounceUpdate)||angular.isObject(scope.debounceUpdate)?$$debounce(function(){scope.select(0,evt)},angular.isNumber(scope.debounceUpdate)?scope.debounceUpdate:scope.debounceUpdate["default"]):scope.select(0,evt)),showHint){var firstLabel=scope.matches[0].label;angular.isString(inputValue)&&inputValue.length>0&&firstLabel.slice(0,inputValue.length).toUpperCase()===inputValue.toUpperCase()?hintInputElem.val(inputValue+firstLabel.slice(inputValue.length)):hintInputElem.val("")}}else resetMatches(),isNoResultsSetter(originalScope,!0);
onCurrentRequest&&isLoadingSetter(originalScope,!1)},function(){resetMatches(),isLoadingSetter(originalScope,!1),isNoResultsSetter(originalScope,!0)})};appendToBody&&(angular.element($window).on("resize",fireRecalculating),$document.find("body").on("scroll",fireRecalculating));var debouncedRecalculate=$$debounce(function(){scope.matches.length&&recalculatePosition(),scope.moveInProgress=!1},eventDebounceTime);scope.moveInProgress=!1,scope.query=void 0;var timeoutPromise,scheduleSearchWithTimeout=function(inputValue){timeoutPromise=$timeout(function(){getMatchesAsync(inputValue)},waitTime)},cancelPreviousTimeout=function(){timeoutPromise&&$timeout.cancel(timeoutPromise)};resetMatches(),scope.assignIsOpen=function(isOpen){isOpenSetter(originalScope,isOpen)},scope.select=function(activeIdx,evt){var model,item,locals={};selected=!0,locals[parserResult.itemName]=item=scope.matches[activeIdx].model,model=parserResult.modelMapper(originalScope,locals),$setModelValue(originalScope,model),modelCtrl.$setValidity("editable",!0),modelCtrl.$setValidity("parse",!0),onSelectCallback(originalScope,{$item:item,$model:model,$label:parserResult.viewMapper(originalScope,locals),$event:evt}),resetMatches(),scope.$eval(attrs.typeaheadFocusOnSelect)!==!1&&$timeout(function(){element[0].focus()},0,!1)},element.on("keydown",function(evt){if(0!==scope.matches.length&&HOT_KEYS.indexOf(evt.which)!==-1){var shouldSelect=isSelectEvent(originalScope,{$event:evt});if(scope.activeIdx===-1&&shouldSelect||9===evt.which&&evt.shiftKey)return resetMatches(),void scope.$digest();evt.preventDefault();var target;switch(evt.which){case 27:evt.stopPropagation(),resetMatches(),originalScope.$digest();break;case 38:scope.activeIdx=(scope.activeIdx>0?scope.activeIdx:scope.matches.length)-1,scope.$digest(),target=popUpEl[0].querySelectorAll(".uib-typeahead-match")[scope.activeIdx],target.parentNode.scrollTop=target.offsetTop;break;case 40:scope.activeIdx=(scope.activeIdx+1)%scope.matches.length,scope.$digest(),target=popUpEl[0].querySelectorAll(".uib-typeahead-match")[scope.activeIdx],target.parentNode.scrollTop=target.offsetTop;break;default:shouldSelect&&scope.$apply(function(){angular.isNumber(scope.debounceUpdate)||angular.isObject(scope.debounceUpdate)?$$debounce(function(){scope.select(scope.activeIdx,evt)},angular.isNumber(scope.debounceUpdate)?scope.debounceUpdate:scope.debounceUpdate["default"]):scope.select(scope.activeIdx,evt)})}}}),element.on("focus",function(evt){hasFocus=!0,0!==minLength||modelCtrl.$viewValue||$timeout(function(){getMatchesAsync(modelCtrl.$viewValue,evt)},0)}),element.on("blur",function(evt){isSelectOnBlur&&scope.matches.length&&scope.activeIdx!==-1&&!selected&&(selected=!0,scope.$apply(function(){angular.isObject(scope.debounceUpdate)&&angular.isNumber(scope.debounceUpdate.blur)?$$debounce(function(){scope.select(scope.activeIdx,evt)},scope.debounceUpdate.blur):scope.select(scope.activeIdx,evt)})),!isEditable&&modelCtrl.$error.editable&&(modelCtrl.$setViewValue(),scope.$apply(function(){modelCtrl.$setValidity("editable",!0),modelCtrl.$setValidity("parse",!0)}),element.val("")),hasFocus=!1,selected=!1});var dismissClickHandler=function(evt){element[0]!==evt.target&&3!==evt.which&&0!==scope.matches.length&&(resetMatches(),$rootScope.$$phase||originalScope.$digest())};$document.on("click",dismissClickHandler),originalScope.$on("$destroy",function(){$document.off("click",dismissClickHandler),(appendToBody||appendTo)&&$popup.remove(),appendToBody&&(angular.element($window).off("resize",fireRecalculating),$document.find("body").off("scroll",fireRecalculating)),popUpEl.remove(),showHint&&inputsContainer.remove()});var $popup=$compile(popUpEl)(scope);appendToBody?$document.find("body").append($popup):appendTo?angular.element(appendTo).eq(0).append($popup):element.after($popup),this.init=function(_modelCtrl){modelCtrl=_modelCtrl,ngModelOptions=extractOptions(modelCtrl),scope.debounceUpdate=$parse(ngModelOptions.getOption("debounce"))(originalScope),modelCtrl.$parsers.unshift(function(inputValue){return hasFocus=!0,0===minLength||inputValue&&inputValue.length>=minLength?waitTime>0?(cancelPreviousTimeout(),scheduleSearchWithTimeout(inputValue)):getMatchesAsync(inputValue):(isLoadingSetter(originalScope,!1),cancelPreviousTimeout(),resetMatches()),isEditable?inputValue:inputValue?void modelCtrl.$setValidity("editable",!1):(modelCtrl.$setValidity("editable",!0),null)}),modelCtrl.$formatters.push(function(modelValue){var candidateViewValue,emptyViewValue,locals={};return isEditable||modelCtrl.$setValidity("editable",!0),inputFormatter?(locals.$model=modelValue,inputFormatter(originalScope,locals)):(locals[parserResult.itemName]=modelValue,candidateViewValue=parserResult.viewMapper(originalScope,locals),locals[parserResult.itemName]=void 0,emptyViewValue=parserResult.viewMapper(originalScope,locals),candidateViewValue!==emptyViewValue?candidateViewValue:modelValue)})}}]).directive("uibTypeahead",function(){return{controller:"UibTypeaheadController",require:["ngModel","uibTypeahead"],link:function(originalScope,element,attrs,ctrls){ctrls[1].init(ctrls[0])}}}).directive("uibTypeaheadPopup",["$$debounce",function($$debounce){return{scope:{matches:"=",query:"=",active:"=",position:"&",moveInProgress:"=",select:"&",assignIsOpen:"&",debounce:"&"},replace:!0,templateUrl:function(element,attrs){return attrs.popupTemplateUrl||"uib/template/typeahead/typeahead-popup.html"},link:function(scope,element,attrs){scope.templateUrl=attrs.templateUrl,scope.isOpen=function(){var isDropdownOpen=scope.matches.length>0;return scope.assignIsOpen({isOpen:isDropdownOpen}),isDropdownOpen},scope.isActive=function(matchIdx){return scope.active===matchIdx},scope.selectActive=function(matchIdx){scope.active=matchIdx},scope.selectMatch=function(activeIdx,evt){var debounce=scope.debounce();angular.isNumber(debounce)||angular.isObject(debounce)?$$debounce(function(){scope.select({activeIdx:activeIdx,evt:evt})},angular.isNumber(debounce)?debounce:debounce["default"]):scope.select({activeIdx:activeIdx,evt:evt})}}}}]).directive("uibTypeaheadMatch",["$templateRequest","$compile","$parse",function($templateRequest,$compile,$parse){return{scope:{index:"=",match:"=",query:"="},link:function(scope,element,attrs){var tplUrl=$parse(attrs.templateUrl)(scope.$parent)||"uib/template/typeahead/typeahead-match.html";$templateRequest(tplUrl).then(function(tplContent){var tplEl=angular.element(tplContent.trim());element.replaceWith(tplEl),$compile(tplEl)(scope)})}}}]).filter("uibTypeaheadHighlight",["$sce","$injector","$log",function($sce,$injector,$log){function escapeRegexp(queryToEscape){return queryToEscape.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}function containsHtml(matchItem){return/<.*>/g.test(matchItem)}var isSanitizePresent;return isSanitizePresent=$injector.has("$sanitize"),function(matchItem,query){return!isSanitizePresent&&containsHtml(matchItem)&&$log.warn("Unsafe use of typeahead please use ngSanitize"),matchItem=query?(""+matchItem).replace(new RegExp(escapeRegexp(query),"gi"),"<strong>$&</strong>"):matchItem,isSanitizePresent||(matchItem=$sce.trustAsHtml(matchItem)),matchItem}}]),angular.module("uib/template/accordion/accordion-group.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/accordion/accordion-group.html",'<div role="tab" id="{{::headingId}}" aria-selected="{{isOpen}}" class="panel-heading" ng-keypress="toggleOpen($event)">\n  <h4 class="panel-title">\n    <a role="button" data-toggle="collapse" href aria-expanded="{{isOpen}}" aria-controls="{{::panelId}}" tabindex="0" class="accordion-toggle" ng-click="toggleOpen()" uib-accordion-transclude="heading" ng-disabled="isDisabled" uib-tabindex-toggle><span uib-accordion-header ng-class="{\'text-muted\': isDisabled}">{{heading}}</span></a>\n  </h4>\n</div>\n<div id="{{::panelId}}" aria-labelledby="{{::headingId}}" aria-hidden="{{!isOpen}}" role="tabpanel" class="panel-collapse collapse" uib-collapse="!isOpen">\n  <div class="panel-body" ng-transclude></div>\n</div>\n')}]),angular.module("uib/template/accordion/accordion.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/accordion/accordion.html",'<div role="tablist" class="panel-group" ng-transclude></div>')}]),angular.module("uib/template/alert/alert.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/alert/alert.html",'<button ng-show="closeable" type="button" class="close" ng-click="close({$event: $event})">\n  <span aria-hidden="true">&times;</span>\n  <span class="sr-only">Close</span>\n</button>\n<div ng-transclude></div>\n')}]),angular.module("uib/template/carousel/carousel.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/carousel/carousel.html",'<div class="carousel-inner" ng-transclude></div>\n<a role="button" href class="left carousel-control" ng-click="prev()" ng-class="{ disabled: isPrevDisabled() }" ng-show="slides.length > 1">\n  <span aria-hidden="true" class="glyphicon glyphicon-chevron-left"></span>\n  <span class="sr-only">previous</span>\n</a>\n<a role="button" href class="right carousel-control" ng-click="next()" ng-class="{ disabled: isNextDisabled() }" ng-show="slides.length > 1">\n  <span aria-hidden="true" class="glyphicon glyphicon-chevron-right"></span>\n  <span class="sr-only">next</span>\n</a>\n<ol class="carousel-indicators" ng-show="slides.length > 1">\n  <li ng-repeat="slide in slides | orderBy:indexOfSlide track by $index" ng-class="{ active: isActive(slide) }" ng-click="select(slide)">\n    <span class="sr-only">slide {{ $index + 1 }} of {{ slides.length }}<span ng-if="isActive(slide)">, currently active</span></span>\n  </li>\n</ol>\n')}]),angular.module("uib/template/carousel/slide.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/carousel/slide.html",'<div class="text-center" ng-transclude></div>\n')}]),angular.module("uib/template/datepicker/datepicker.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/datepicker/datepicker.html",'<div ng-switch="datepickerMode">\n  <div uib-daypicker ng-switch-when="day" tabindex="0" class="uib-daypicker"></div>\n  <div uib-monthpicker ng-switch-when="month" tabindex="0" class="uib-monthpicker"></div>\n  <div uib-yearpicker ng-switch-when="year" tabindex="0" class="uib-yearpicker"></div>\n</div>\n')}]),angular.module("uib/template/datepicker/day.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/datepicker/day.html",'<table role="grid" aria-labelledby="{{::uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n  <thead>\n    <tr>\n      <th><button type="button" class="btn btn-default btn-sm pull-left uib-left" ng-click="move(-1)" tabindex="-1"><i aria-hidden="true" class="glyphicon glyphicon-chevron-left"></i><span class="sr-only">previous</span></button></th>\n      <th colspan="{{::5 + showWeeks}}"><button id="{{::uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm uib-title" ng-click="toggleMode()" ng-disabled="datepickerMode === maxMode" tabindex="-1"><strong>{{title}}</strong></button></th>\n      <th><button type="button" class="btn btn-default btn-sm pull-right uib-right" ng-click="move(1)" tabindex="-1"><i aria-hidden="true" class="glyphicon glyphicon-chevron-right"></i><span class="sr-only">next</span></button></th>\n    </tr>\n    <tr>\n      <th ng-if="showWeeks" class="text-center"></th>\n      <th ng-repeat="label in ::labels track by $index" class="text-center"><small aria-label="{{::label.full}}">{{::label.abbr}}</small></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr class="uib-weeks" ng-repeat="row in rows track by $index" role="row">\n      <td ng-if="showWeeks" class="text-center h6"><em>{{ weekNumbers[$index] }}</em></td>\n      <td ng-repeat="dt in row" class="uib-day text-center" role="gridcell"\n        id="{{::dt.uid}}"\n        ng-class="::dt.customClass">\n        <button type="button" class="btn btn-default btn-sm"\n          uib-is-class="\n            \'btn-info\' for selectedDt,\n            \'active\' for activeDt\n            on dt"\n          ng-click="select(dt.date)"\n          ng-disabled="::dt.disabled"\n          tabindex="-1"><span ng-class="::{\'text-muted\': dt.secondary, \'text-info\': dt.current}">{{::dt.label}}</span></button>\n      </td>\n    </tr>\n  </tbody>\n</table>\n')}]),angular.module("uib/template/datepicker/month.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/datepicker/month.html",'<table role="grid" aria-labelledby="{{::uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n  <thead>\n    <tr>\n      <th><button type="button" class="btn btn-default btn-sm pull-left uib-left" ng-click="move(-1)" tabindex="-1"><i aria-hidden="true" class="glyphicon glyphicon-chevron-left"></i><span class="sr-only">previous</span></button></th>\n      <th colspan="{{::yearHeaderColspan}}"><button id="{{::uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm uib-title" ng-click="toggleMode()" ng-disabled="datepickerMode === maxMode" tabindex="-1"><strong>{{title}}</strong></button></th>\n      <th><button type="button" class="btn btn-default btn-sm pull-right uib-right" ng-click="move(1)" tabindex="-1"><i aria-hidden="true" class="glyphicon glyphicon-chevron-right"></i><span class="sr-only">next</span></i></button></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr class="uib-months" ng-repeat="row in rows track by $index" role="row">\n      <td ng-repeat="dt in row" class="uib-month text-center" role="gridcell"\n        id="{{::dt.uid}}"\n        ng-class="::dt.customClass">\n        <button type="button" class="btn btn-default"\n          uib-is-class="\n            \'btn-info\' for selectedDt,\n            \'active\' for activeDt\n            on dt"\n          ng-click="select(dt.date)"\n          ng-disabled="::dt.disabled"\n          tabindex="-1"><span ng-class="::{\'text-info\': dt.current}">{{::dt.label}}</span></button>\n      </td>\n    </tr>\n  </tbody>\n</table>\n')}]),angular.module("uib/template/datepicker/year.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/datepicker/year.html",'<table role="grid" aria-labelledby="{{::uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n  <thead>\n    <tr>\n      <th><button type="button" class="btn btn-default btn-sm pull-left uib-left" ng-click="move(-1)" tabindex="-1"><i aria-hidden="true" class="glyphicon glyphicon-chevron-left"></i><span class="sr-only">previous</span></button></th>\n      <th colspan="{{::columns - 2}}"><button id="{{::uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm uib-title" ng-click="toggleMode()" ng-disabled="datepickerMode === maxMode" tabindex="-1"><strong>{{title}}</strong></button></th>\n      <th><button type="button" class="btn btn-default btn-sm pull-right uib-right" ng-click="move(1)" tabindex="-1"><i aria-hidden="true" class="glyphicon glyphicon-chevron-right"></i><span class="sr-only">next</span></button></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr class="uib-years" ng-repeat="row in rows track by $index" role="row">\n      <td ng-repeat="dt in row" class="uib-year text-center" role="gridcell"\n        id="{{::dt.uid}}"\n        ng-class="::dt.customClass">\n        <button type="button" class="btn btn-default"\n          uib-is-class="\n            \'btn-info\' for selectedDt,\n            \'active\' for activeDt\n            on dt"\n          ng-click="select(dt.date)"\n          ng-disabled="::dt.disabled"\n          tabindex="-1"><span ng-class="::{\'text-info\': dt.current}">{{::dt.label}}</span></button>\n      </td>\n    </tr>\n  </tbody>\n</table>\n')}]),angular.module("uib/template/datepickerPopup/popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/datepickerPopup/popup.html",'<ul role="presentation" class="uib-datepicker-popup dropdown-menu uib-position-measure" dropdown-nested ng-if="isOpen" ng-keydown="keydown($event)" ng-click="$event.stopPropagation()">\n  <li ng-transclude></li>\n  <li ng-if="showButtonBar" class="uib-button-bar">\n    <span class="btn-group pull-left">\n      <button type="button" class="btn btn-sm btn-info uib-datepicker-current" ng-click="select(\'today\', $event)" ng-disabled="isDisabled(\'today\')">{{ getText(\'current\') }}</button>\n      <button type="button" class="btn btn-sm btn-danger uib-clear" ng-click="select(null, $event)">{{ getText(\'clear\') }}</button>\n    </span>\n    <button type="button" class="btn btn-sm btn-success pull-right uib-close" ng-click="close($event)">{{ getText(\'close\') }}</button>\n  </li>\n</ul>\n')}]),angular.module("uib/template/modal/window.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/modal/window.html","<div class=\"modal-dialog {{size ? 'modal-' + size : ''}}\"><div class=\"modal-content\" uib-modal-transclude></div></div>\n")}]),angular.module("uib/template/pager/pager.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/pager/pager.html",'<li ng-class="{disabled: noPrevious()||ngDisabled, previous: align}"><a href ng-click="selectPage(page - 1, $event)" ng-disabled="noPrevious()||ngDisabled" uib-tabindex-toggle>{{::getText(\'previous\')}}</a></li>\n<li ng-class="{disabled: noNext()||ngDisabled, next: align}"><a href ng-click="selectPage(page + 1, $event)" ng-disabled="noNext()||ngDisabled" uib-tabindex-toggle>{{::getText(\'next\')}}</a></li>\n')}]),angular.module("uib/template/pagination/pagination.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/pagination/pagination.html",'<li role="menuitem" ng-if="::boundaryLinks" ng-class="{disabled: noPrevious()||ngDisabled}" class="pagination-first"><a href ng-click="selectPage(1, $event)" ng-disabled="noPrevious()||ngDisabled" uib-tabindex-toggle>{{::getText(\'first\')}}</a></li>\n<li role="menuitem" ng-if="::directionLinks" ng-class="{disabled: noPrevious()||ngDisabled}" class="pagination-prev"><a href ng-click="selectPage(page - 1, $event)" ng-disabled="noPrevious()||ngDisabled" uib-tabindex-toggle>{{::getText(\'previous\')}}</a></li>\n<li role="menuitem" ng-repeat="page in pages track by $index" ng-class="{active: page.active,disabled: ngDisabled&&!page.active}" class="pagination-page"><a href ng-click="selectPage(page.number, $event)" ng-disabled="ngDisabled&&!page.active" uib-tabindex-toggle>{{page.text}}</a></li>\n<li role="menuitem" ng-if="::directionLinks" ng-class="{disabled: noNext()||ngDisabled}" class="pagination-next"><a href ng-click="selectPage(page + 1, $event)" ng-disabled="noNext()||ngDisabled" uib-tabindex-toggle>{{::getText(\'next\')}}</a></li>\n<li role="menuitem" ng-if="::boundaryLinks" ng-class="{disabled: noNext()||ngDisabled}" class="pagination-last"><a href ng-click="selectPage(totalPages, $event)" ng-disabled="noNext()||ngDisabled" uib-tabindex-toggle>{{::getText(\'last\')}}</a></li>\n')}]),angular.module("uib/template/tooltip/tooltip-html-popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/tooltip/tooltip-html-popup.html",'<div class="tooltip-arrow"></div>\n<div class="tooltip-inner" ng-bind-html="contentExp()"></div>\n')}]),angular.module("uib/template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/tooltip/tooltip-popup.html",'<div class="tooltip-arrow"></div>\n<div class="tooltip-inner" ng-bind="content"></div>\n')}]),angular.module("uib/template/tooltip/tooltip-template-popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/tooltip/tooltip-template-popup.html",'<div class="tooltip-arrow"></div>\n<div class="tooltip-inner"\n  uib-tooltip-template-transclude="contentExp()"\n  tooltip-template-transclude-scope="originScope()"></div>\n')}]),angular.module("uib/template/popover/popover-html.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/popover/popover-html.html",'<div class="arrow"></div>\n\n<div class="popover-inner">\n    <h3 class="popover-title" ng-bind="uibTitle" ng-if="uibTitle"></h3>\n    <div class="popover-content" ng-bind-html="contentExp()"></div>\n</div>\n')}]),angular.module("uib/template/popover/popover-template.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/popover/popover-template.html",'<div class="arrow"></div>\n\n<div class="popover-inner">\n    <h3 class="popover-title" ng-bind="uibTitle" ng-if="uibTitle"></h3>\n    <div class="popover-content"\n      uib-tooltip-template-transclude="contentExp()"\n      tooltip-template-transclude-scope="originScope()"></div>\n</div>\n')}]),angular.module("uib/template/popover/popover.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/popover/popover.html",'<div class="arrow"></div>\n\n<div class="popover-inner">\n    <h3 class="popover-title" ng-bind="uibTitle" ng-if="uibTitle"></h3>\n    <div class="popover-content" ng-bind="content"></div>\n</div>\n')}]),angular.module("uib/template/progressbar/bar.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/progressbar/bar.html",'<div class="progress-bar" ng-class="type && \'progress-bar-\' + type" role="progressbar" aria-valuenow="{{value}}" aria-valuemin="0" aria-valuemax="{{max}}" ng-style="{width: (percent < 100 ? percent : 100) + \'%\'}" aria-valuetext="{{percent | number:0}}%" aria-labelledby="{{::title}}" ng-transclude></div>\n')}]),angular.module("uib/template/progressbar/progress.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/progressbar/progress.html",'<div class="progress" ng-transclude aria-labelledby="{{::title}}"></div>')}]),angular.module("uib/template/progressbar/progressbar.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/progressbar/progressbar.html",'<div class="progress">\n  <div class="progress-bar" ng-class="type && \'progress-bar-\' + type" role="progressbar" aria-valuenow="{{value}}" aria-valuemin="0" aria-valuemax="{{max}}" ng-style="{width: (percent < 100 ? percent : 100) + \'%\'}" aria-valuetext="{{percent | number:0}}%" aria-labelledby="{{::title}}" ng-transclude></div>\n</div>\n')}]),angular.module("uib/template/rating/rating.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/rating/rating.html",'<span ng-mouseleave="reset()" ng-keydown="onKeydown($event)" tabindex="0" role="slider" aria-valuemin="0" aria-valuemax="{{range.length}}" aria-valuenow="{{value}}" aria-valuetext="{{title}}">\n    <span ng-repeat-start="r in range track by $index" class="sr-only">({{ $index < value ? \'*\' : \' \' }})</span>\n    <i ng-repeat-end ng-mouseenter="enter($index + 1)" ng-click="rate($index + 1)" class="glyphicon" ng-class="$index < value && (r.stateOn || \'glyphicon-star\') || (r.stateOff || \'glyphicon-star-empty\')" ng-attr-title="{{r.title}}"></i>\n</span>\n')}]),angular.module("uib/template/tabs/tab.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/tabs/tab.html",'<li ng-class="[{active: active, disabled: disabled}, classes]" class="uib-tab nav-item">\n  <a href ng-click="select($event)" class="nav-link" uib-tab-heading-transclude>{{heading}}</a>\n</li>\n')}]),angular.module("uib/template/tabs/tabset.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/tabs/tabset.html",'<div>\n  <ul class="nav nav-{{tabset.type || \'tabs\'}}" ng-class="{\'nav-stacked\': vertical, \'nav-justified\': justified}" ng-transclude></ul>\n  <div class="tab-content">\n    <div class="tab-pane"\n         ng-repeat="tab in tabset.tabs"\n         ng-class="{active: tabset.active === tab.index}"\n         uib-tab-content-transclude="tab">\n    </div>\n  </div>\n</div>\n')}]),angular.module("uib/template/timepicker/timepicker.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/timepicker/timepicker.html",'<table class="uib-timepicker">\n  <tbody>\n    <tr class="text-center" ng-show="::showSpinners">\n      <td class="uib-increment hours"><a ng-click="incrementHours()" ng-class="{disabled: noIncrementHours()}" class="btn btn-link" ng-disabled="noIncrementHours()" tabindex="-1"><span class="glyphicon glyphicon-chevron-up"></span></a></td>\n      <td>&nbsp;</td>\n      <td class="uib-increment minutes"><a ng-click="incrementMinutes()" ng-class="{disabled: noIncrementMinutes()}" class="btn btn-link" ng-disabled="noIncrementMinutes()" tabindex="-1"><span class="glyphicon glyphicon-chevron-up"></span></a></td>\n      <td ng-show="showSeconds">&nbsp;</td>\n      <td ng-show="showSeconds" class="uib-increment seconds"><a ng-click="incrementSeconds()" ng-class="{disabled: noIncrementSeconds()}" class="btn btn-link" ng-disabled="noIncrementSeconds()" tabindex="-1"><span class="glyphicon glyphicon-chevron-up"></span></a></td>\n      <td ng-show="showMeridian"></td>\n    </tr>\n    <tr>\n      <td class="form-group uib-time hours" ng-class="{\'has-error\': invalidHours}">\n        <input type="text" placeholder="HH" ng-model="hours" ng-change="updateHours()" class="form-control text-center" ng-readonly="::readonlyInput" maxlength="2" tabindex="{{::tabindex}}" ng-disabled="noIncrementHours()" ng-blur="blur()">\n      </td>\n      <td class="uib-separator">:</td>\n      <td class="form-group uib-time minutes" ng-class="{\'has-error\': invalidMinutes}">\n        <input type="text" placeholder="MM" ng-model="minutes" ng-change="updateMinutes()" class="form-control text-center" ng-readonly="::readonlyInput" maxlength="2" tabindex="{{::tabindex}}" ng-disabled="noIncrementMinutes()" ng-blur="blur()">\n      </td>\n      <td ng-show="showSeconds" class="uib-separator">:</td>\n      <td class="form-group uib-time seconds" ng-class="{\'has-error\': invalidSeconds}" ng-show="showSeconds">\n        <input type="text" placeholder="SS" ng-model="seconds" ng-change="updateSeconds()" class="form-control text-center" ng-readonly="readonlyInput" maxlength="2" tabindex="{{::tabindex}}" ng-disabled="noIncrementSeconds()" ng-blur="blur()">\n      </td>\n      <td ng-show="showMeridian" class="uib-time am-pm"><button type="button" ng-class="{disabled: noToggleMeridian()}" class="btn btn-default text-center" ng-click="toggleMeridian()" ng-disabled="noToggleMeridian()" tabindex="{{::tabindex}}">{{meridian}}</button></td>\n    </tr>\n    <tr class="text-center" ng-show="::showSpinners">\n      <td class="uib-decrement hours"><a ng-click="decrementHours()" ng-class="{disabled: noDecrementHours()}" class="btn btn-link" ng-disabled="noDecrementHours()" tabindex="-1"><span class="glyphicon glyphicon-chevron-down"></span></a></td>\n      <td>&nbsp;</td>\n      <td class="uib-decrement minutes"><a ng-click="decrementMinutes()" ng-class="{disabled: noDecrementMinutes()}" class="btn btn-link" ng-disabled="noDecrementMinutes()" tabindex="-1"><span class="glyphicon glyphicon-chevron-down"></span></a></td>\n      <td ng-show="showSeconds">&nbsp;</td>\n      <td ng-show="showSeconds" class="uib-decrement seconds"><a ng-click="decrementSeconds()" ng-class="{disabled: noDecrementSeconds()}" class="btn btn-link" ng-disabled="noDecrementSeconds()" tabindex="-1"><span class="glyphicon glyphicon-chevron-down"></span></a></td>\n      <td ng-show="showMeridian"></td>\n    </tr>\n  </tbody>\n</table>\n')}]),angular.module("uib/template/typeahead/typeahead-match.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/typeahead/typeahead-match.html",'<a href\n   tabindex="-1"\n   ng-bind-html="match.label | uibTypeaheadHighlight:query"\n   ng-attr-title="{{match.label}}"></a>\n')}]),angular.module("uib/template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("uib/template/typeahead/typeahead-popup.html",'<ul class="dropdown-menu" ng-show="isOpen() && !moveInProgress" ng-style="{top: position().top+\'px\', left: position().left+\'px\'}" role="listbox" aria-hidden="{{!isOpen()}}">\n    <li class="uib-typeahead-match" ng-repeat="match in matches track by $index" ng-class="{active: isActive($index) }" ng-mouseenter="selectActive($index)" ng-click="selectMatch($index, $event)" role="option" id="{{::match.id}}">\n        <div uib-typeahead-match index="$index" match="match" query="query" template-url="templateUrl"></div>\n    </li>\n</ul>\n')}]),angular.module("ui.bootstrap.carousel").run(function(){!angular.$$csp().noInlineStyle&&!angular.$$uibCarouselCss&&angular.element(document).find("head").prepend('<style type="text/css">.ng-animate.item:not(.left):not(.right){-webkit-transition:0s ease-in-out left;transition:0s ease-in-out left}</style>'),angular.$$uibCarouselCss=!0}),angular.module("ui.bootstrap.datepicker").run(function(){!angular.$$csp().noInlineStyle&&!angular.$$uibDatepickerCss&&angular.element(document).find("head").prepend('<style type="text/css">.uib-datepicker .uib-title{width:100%;}.uib-day button,.uib-month button,.uib-year button{min-width:100%;}.uib-left,.uib-right{width:100%}</style>'),angular.$$uibDatepickerCss=!0}),angular.module("ui.bootstrap.position").run(function(){!angular.$$csp().noInlineStyle&&!angular.$$uibPositionCss&&angular.element(document).find("head").prepend('<style type="text/css">.uib-position-measure{display:block !important;visibility:hidden !important;position:absolute !important;top:-9999px !important;left:-9999px !important;}.uib-position-scrollbar-measure{position:absolute !important;top:-9999px !important;width:50px !important;height:50px !important;overflow:scroll !important;}.uib-position-body-scrollbar-measure{overflow:scroll !important;}</style>'),angular.$$uibPositionCss=!0}),angular.module("ui.bootstrap.datepickerPopup").run(function(){!angular.$$csp().noInlineStyle&&!angular.$$uibDatepickerpopupCss&&angular.element(document).find("head").prepend('<style type="text/css">.uib-datepicker-popup.dropdown-menu{display:block;float:none;margin:0;}.uib-button-bar{padding:10px 9px 2px;}</style>'),angular.$$uibDatepickerpopupCss=!0}),angular.module("ui.bootstrap.tooltip").run(function(){!angular.$$csp().noInlineStyle&&!angular.$$uibTooltipCss&&angular.element(document).find("head").prepend('<style type="text/css">[uib-tooltip-popup].tooltip.top-left > .tooltip-arrow,[uib-tooltip-popup].tooltip.top-right > .tooltip-arrow,[uib-tooltip-popup].tooltip.bottom-left > .tooltip-arrow,[uib-tooltip-popup].tooltip.bottom-right > .tooltip-arrow,[uib-tooltip-popup].tooltip.left-top > .tooltip-arrow,[uib-tooltip-popup].tooltip.left-bottom > .tooltip-arrow,[uib-tooltip-popup].tooltip.right-top > .tooltip-arrow,[uib-tooltip-popup].tooltip.right-bottom > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.top-left > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.top-right > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.bottom-left > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.bottom-right > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.left-top > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.left-bottom > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.right-top > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.right-bottom > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.top-left > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.top-right > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.bottom-left > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.bottom-right > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.left-top > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.left-bottom > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.right-top > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.right-bottom > .tooltip-arrow,[uib-popover-popup].popover.top-left > .arrow,[uib-popover-popup].popover.top-right > .arrow,[uib-popover-popup].popover.bottom-left > .arrow,[uib-popover-popup].popover.bottom-right > .arrow,[uib-popover-popup].popover.left-top > .arrow,[uib-popover-popup].popover.left-bottom > .arrow,[uib-popover-popup].popover.right-top > .arrow,[uib-popover-popup].popover.right-bottom > .arrow,[uib-popover-html-popup].popover.top-left > .arrow,[uib-popover-html-popup].popover.top-right > .arrow,[uib-popover-html-popup].popover.bottom-left > .arrow,[uib-popover-html-popup].popover.bottom-right > .arrow,[uib-popover-html-popup].popover.left-top > .arrow,[uib-popover-html-popup].popover.left-bottom > .arrow,[uib-popover-html-popup].popover.right-top > .arrow,[uib-popover-html-popup].popover.right-bottom > .arrow,[uib-popover-template-popup].popover.top-left > .arrow,[uib-popover-template-popup].popover.top-right > .arrow,[uib-popover-template-popup].popover.bottom-left > .arrow,[uib-popover-template-popup].popover.bottom-right > .arrow,[uib-popover-template-popup].popover.left-top > .arrow,[uib-popover-template-popup].popover.left-bottom > .arrow,[uib-popover-template-popup].popover.right-top > .arrow,[uib-popover-template-popup].popover.right-bottom > .arrow{top:auto;bottom:auto;left:auto;right:auto;margin:0;}[uib-popover-popup].popover,[uib-popover-html-popup].popover,[uib-popover-template-popup].popover{display:block !important;}</style>'),
angular.$$uibTooltipCss=!0}),angular.module("ui.bootstrap.timepicker").run(function(){!angular.$$csp().noInlineStyle&&!angular.$$uibTimepickerCss&&angular.element(document).find("head").prepend('<style type="text/css">.uib-time input{width:50px;}</style>'),angular.$$uibTimepickerCss=!0}),angular.module("ui.bootstrap.typeahead").run(function(){!angular.$$csp().noInlineStyle&&!angular.$$uibTypeaheadCss&&angular.element(document).find("head").prepend('<style type="text/css">[uib-typeahead-popup].dropdown-menu{display:block;}</style>'),angular.$$uibTypeaheadCss=!0})},function(module,exports){/**
 * @license AngularJS v1.6.3
 * (c) 2010-2017 Google, Inc. http://angularjs.org
 * License: MIT
 */
!function(window){"use strict";function minErr(module,ErrorConstructor){return ErrorConstructor=ErrorConstructor||Error,function(){var paramPrefix,i,code=arguments[0],template=arguments[1],message="["+(module?module+":":"")+code+"] ",templateArgs=sliceArgs(arguments,2).map(function(arg){return toDebugString(arg,minErrConfig.objectMaxDepth)});for(message+=template.replace(/\{\d+\}/g,function(match){var index=+match.slice(1,-1);return index<templateArgs.length?templateArgs[index]:match}),message+="\nhttp://errors.angularjs.org/1.6.3/"+(module?module+"/":"")+code,i=0,paramPrefix="?";i<templateArgs.length;i++,paramPrefix="&")message+=paramPrefix+"p"+i+"="+encodeURIComponent(templateArgs[i]);return new ErrorConstructor(message)}}function errorHandlingConfig(config){return isObject(config)?void(isDefined(config.objectMaxDepth)&&(minErrConfig.objectMaxDepth=isValidObjectMaxDepth(config.objectMaxDepth)?config.objectMaxDepth:NaN)):minErrConfig}function isValidObjectMaxDepth(maxDepth){return isNumber(maxDepth)&&maxDepth>0}function isArrayLike(obj){if(null==obj||isWindow(obj))return!1;if(isArray(obj)||isString(obj)||jqLite&&obj instanceof jqLite)return!0;var length="length"in Object(obj)&&obj.length;return isNumber(length)&&(length>=0&&(length-1 in obj||obj instanceof Array)||"function"==typeof obj.item)}function forEach(obj,iterator,context){var key,length;if(obj)if(isFunction(obj))for(key in obj)"prototype"!==key&&"length"!==key&&"name"!==key&&obj.hasOwnProperty(key)&&iterator.call(context,obj[key],key,obj);else if(isArray(obj)||isArrayLike(obj)){var isPrimitive="object"!=typeof obj;for(key=0,length=obj.length;key<length;key++)(isPrimitive||key in obj)&&iterator.call(context,obj[key],key,obj)}else if(obj.forEach&&obj.forEach!==forEach)obj.forEach(iterator,context,obj);else if(isBlankObject(obj))for(key in obj)iterator.call(context,obj[key],key,obj);else if("function"==typeof obj.hasOwnProperty)for(key in obj)obj.hasOwnProperty(key)&&iterator.call(context,obj[key],key,obj);else for(key in obj)hasOwnProperty.call(obj,key)&&iterator.call(context,obj[key],key,obj);return obj}function forEachSorted(obj,iterator,context){for(var keys=Object.keys(obj).sort(),i=0;i<keys.length;i++)iterator.call(context,obj[keys[i]],keys[i]);return keys}function reverseParams(iteratorFn){return function(value,key){iteratorFn(key,value)}}function nextUid(){return++uid}function setHashKey(obj,h){h?obj.$$hashKey=h:delete obj.$$hashKey}function baseExtend(dst,objs,deep){for(var h=dst.$$hashKey,i=0,ii=objs.length;i<ii;++i){var obj=objs[i];if(isObject(obj)||isFunction(obj))for(var keys=Object.keys(obj),j=0,jj=keys.length;j<jj;j++){var key=keys[j],src=obj[key];deep&&isObject(src)?isDate(src)?dst[key]=new Date(src.valueOf()):isRegExp(src)?dst[key]=new RegExp(src):src.nodeName?dst[key]=src.cloneNode(!0):isElement(src)?dst[key]=src.clone():(isObject(dst[key])||(dst[key]=isArray(src)?[]:{}),baseExtend(dst[key],[src],!0)):dst[key]=src}}return setHashKey(dst,h),dst}function extend(dst){return baseExtend(dst,slice.call(arguments,1),!1)}function merge(dst){return baseExtend(dst,slice.call(arguments,1),!0)}function toInt(str){return parseInt(str,10)}function inherit(parent,extra){return extend(Object.create(parent),extra)}function noop(){}function identity($){return $}function valueFn(value){return function(){return value}}function hasCustomToString(obj){return isFunction(obj.toString)&&obj.toString!==toString}function isUndefined(value){return"undefined"==typeof value}function isDefined(value){return"undefined"!=typeof value}function isObject(value){return null!==value&&"object"==typeof value}function isBlankObject(value){return null!==value&&"object"==typeof value&&!getPrototypeOf(value)}function isString(value){return"string"==typeof value}function isNumber(value){return"number"==typeof value}function isDate(value){return"[object Date]"===toString.call(value)}function isFunction(value){return"function"==typeof value}function isRegExp(value){return"[object RegExp]"===toString.call(value)}function isWindow(obj){return obj&&obj.window===obj}function isScope(obj){return obj&&obj.$evalAsync&&obj.$watch}function isFile(obj){return"[object File]"===toString.call(obj)}function isFormData(obj){return"[object FormData]"===toString.call(obj)}function isBlob(obj){return"[object Blob]"===toString.call(obj)}function isBoolean(value){return"boolean"==typeof value}function isPromiseLike(obj){return obj&&isFunction(obj.then)}function isTypedArray(value){return value&&isNumber(value.length)&&TYPED_ARRAY_REGEXP.test(toString.call(value))}function isArrayBuffer(obj){return"[object ArrayBuffer]"===toString.call(obj)}function isElement(node){return!(!node||!(node.nodeName||node.prop&&node.attr&&node.find))}function makeMap(str){var i,obj={},items=str.split(",");for(i=0;i<items.length;i++)obj[items[i]]=!0;return obj}function nodeName_(element){return lowercase(element.nodeName||element[0]&&element[0].nodeName)}function includes(array,obj){return Array.prototype.indexOf.call(array,obj)!==-1}function arrayRemove(array,value){var index=array.indexOf(value);return index>=0&&array.splice(index,1),index}function copy(source,destination,maxDepth){function copyRecurse(source,destination,maxDepth){if(maxDepth--,maxDepth<0)return"...";var key,h=destination.$$hashKey;if(isArray(source))for(var i=0,ii=source.length;i<ii;i++)destination.push(copyElement(source[i],maxDepth));else if(isBlankObject(source))for(key in source)destination[key]=copyElement(source[key],maxDepth);else if(source&&"function"==typeof source.hasOwnProperty)for(key in source)source.hasOwnProperty(key)&&(destination[key]=copyElement(source[key],maxDepth));else for(key in source)hasOwnProperty.call(source,key)&&(destination[key]=copyElement(source[key],maxDepth));return setHashKey(destination,h),destination}function copyElement(source,maxDepth){if(!isObject(source))return source;var index=stackSource.indexOf(source);if(index!==-1)return stackDest[index];if(isWindow(source)||isScope(source))throw ngMinErr("cpws","Can't copy! Making copies of Window or Scope instances is not supported.");var needsRecurse=!1,destination=copyType(source);return void 0===destination&&(destination=isArray(source)?[]:Object.create(getPrototypeOf(source)),needsRecurse=!0),stackSource.push(source),stackDest.push(destination),needsRecurse?copyRecurse(source,destination,maxDepth):destination}function copyType(source){switch(toString.call(source)){case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Float32Array]":case"[object Float64Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return new source.constructor(copyElement(source.buffer),source.byteOffset,source.length);case"[object ArrayBuffer]":if(!source.slice){var copied=new ArrayBuffer(source.byteLength);return new Uint8Array(copied).set(new Uint8Array(source)),copied}return source.slice(0);case"[object Boolean]":case"[object Number]":case"[object String]":case"[object Date]":return new source.constructor(source.valueOf());case"[object RegExp]":var re=new RegExp(source.source,source.toString().match(/[^\/]*$/)[0]);return re.lastIndex=source.lastIndex,re;case"[object Blob]":return new source.constructor([source],{type:source.type})}if(isFunction(source.cloneNode))return source.cloneNode(!0)}var stackSource=[],stackDest=[];if(maxDepth=isValidObjectMaxDepth(maxDepth)?maxDepth:NaN,destination){if(isTypedArray(destination)||isArrayBuffer(destination))throw ngMinErr("cpta","Can't copy! TypedArray destination cannot be mutated.");if(source===destination)throw ngMinErr("cpi","Can't copy! Source and destination are identical.");return isArray(destination)?destination.length=0:forEach(destination,function(value,key){"$$hashKey"!==key&&delete destination[key]}),stackSource.push(source),stackDest.push(destination),copyRecurse(source,destination,maxDepth)}return copyElement(source,maxDepth)}function equals(o1,o2){if(o1===o2)return!0;if(null===o1||null===o2)return!1;if(o1!==o1&&o2!==o2)return!0;var length,key,keySet,t1=typeof o1,t2=typeof o2;if(t1===t2&&"object"===t1){if(!isArray(o1)){if(isDate(o1))return!!isDate(o2)&&equals(o1.getTime(),o2.getTime());if(isRegExp(o1))return!!isRegExp(o2)&&o1.toString()===o2.toString();if(isScope(o1)||isScope(o2)||isWindow(o1)||isWindow(o2)||isArray(o2)||isDate(o2)||isRegExp(o2))return!1;keySet=createMap();for(key in o1)if("$"!==key.charAt(0)&&!isFunction(o1[key])){if(!equals(o1[key],o2[key]))return!1;keySet[key]=!0}for(key in o2)if(!(key in keySet)&&"$"!==key.charAt(0)&&isDefined(o2[key])&&!isFunction(o2[key]))return!1;return!0}if(!isArray(o2))return!1;if((length=o1.length)===o2.length){for(key=0;key<length;key++)if(!equals(o1[key],o2[key]))return!1;return!0}}return!1}function concat(array1,array2,index){return array1.concat(slice.call(array2,index))}function sliceArgs(args,startIndex){return slice.call(args,startIndex||0)}function bind(self,fn){var curryArgs=arguments.length>2?sliceArgs(arguments,2):[];return!isFunction(fn)||fn instanceof RegExp?fn:curryArgs.length?function(){return arguments.length?fn.apply(self,concat(curryArgs,arguments,0)):fn.apply(self,curryArgs)}:function(){return arguments.length?fn.apply(self,arguments):fn.call(self)}}function toJsonReplacer(key,value){var val=value;return"string"==typeof key&&"$"===key.charAt(0)&&"$"===key.charAt(1)?val=void 0:isWindow(value)?val="$WINDOW":value&&window.document===value?val="$DOCUMENT":isScope(value)&&(val="$SCOPE"),val}function toJson(obj,pretty){if(!isUndefined(obj))return isNumber(pretty)||(pretty=pretty?2:null),JSON.stringify(obj,toJsonReplacer,pretty)}function fromJson(json){return isString(json)?JSON.parse(json):json}function timezoneToOffset(timezone,fallback){timezone=timezone.replace(ALL_COLONS,"");var requestedTimezoneOffset=Date.parse("Jan 01, 1970 00:00:00 "+timezone)/6e4;return isNumberNaN(requestedTimezoneOffset)?fallback:requestedTimezoneOffset}function addDateMinutes(date,minutes){return date=new Date(date.getTime()),date.setMinutes(date.getMinutes()+minutes),date}function convertTimezoneToLocal(date,timezone,reverse){reverse=reverse?-1:1;var dateTimezoneOffset=date.getTimezoneOffset(),timezoneOffset=timezoneToOffset(timezone,dateTimezoneOffset);return addDateMinutes(date,reverse*(timezoneOffset-dateTimezoneOffset))}function startingTag(element){element=jqLite(element).clone();try{element.empty()}catch(e){}var elemHtml=jqLite("<div>").append(element).html();try{return element[0].nodeType===NODE_TYPE_TEXT?lowercase(elemHtml):elemHtml.match(/^(<[^>]+>)/)[1].replace(/^<([\w-]+)/,function(match,nodeName){return"<"+lowercase(nodeName)})}catch(e){return lowercase(elemHtml)}}function tryDecodeURIComponent(value){try{return decodeURIComponent(value)}catch(e){}}function parseKeyValue(keyValue){var obj={};return forEach((keyValue||"").split("&"),function(keyValue){var splitPoint,key,val;keyValue&&(key=keyValue=keyValue.replace(/\+/g,"%20"),splitPoint=keyValue.indexOf("="),splitPoint!==-1&&(key=keyValue.substring(0,splitPoint),val=keyValue.substring(splitPoint+1)),key=tryDecodeURIComponent(key),isDefined(key)&&(val=!isDefined(val)||tryDecodeURIComponent(val),hasOwnProperty.call(obj,key)?isArray(obj[key])?obj[key].push(val):obj[key]=[obj[key],val]:obj[key]=val))}),obj}function toKeyValue(obj){var parts=[];return forEach(obj,function(value,key){isArray(value)?forEach(value,function(arrayValue){parts.push(encodeUriQuery(key,!0)+(arrayValue===!0?"":"="+encodeUriQuery(arrayValue,!0)))}):parts.push(encodeUriQuery(key,!0)+(value===!0?"":"="+encodeUriQuery(value,!0)))}),parts.length?parts.join("&"):""}function encodeUriSegment(val){return encodeUriQuery(val,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function encodeUriQuery(val,pctEncodeSpaces){return encodeURIComponent(val).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,pctEncodeSpaces?"%20":"+")}function getNgAttribute(element,ngAttr){var attr,i,ii=ngAttrPrefixes.length;for(i=0;i<ii;++i)if(attr=ngAttrPrefixes[i]+ngAttr,isString(attr=element.getAttribute(attr)))return attr;return null}function allowAutoBootstrap(document){var script=document.currentScript;if(!script)return!0;if(!(script instanceof window.HTMLScriptElement||script instanceof window.SVGScriptElement))return!1;var attributes=script.attributes,srcs=[attributes.getNamedItem("src"),attributes.getNamedItem("href"),attributes.getNamedItem("xlink:href")];return srcs.every(function(src){if(!src)return!0;if(!src.value)return!1;var link=document.createElement("a");if(link.href=src.value,document.location.origin===link.origin)return!0;switch(link.protocol){case"http:":case"https:":case"ftp:":case"blob:":case"file:":case"data:":return!0;default:return!1}})}function angularInit(element,bootstrap){var appElement,module,config={};if(forEach(ngAttrPrefixes,function(prefix){var name=prefix+"app";!appElement&&element.hasAttribute&&element.hasAttribute(name)&&(appElement=element,module=element.getAttribute(name))}),forEach(ngAttrPrefixes,function(prefix){var candidate,name=prefix+"app";!appElement&&(candidate=element.querySelector("["+name.replace(":","\\:")+"]"))&&(appElement=candidate,module=candidate.getAttribute(name))}),appElement){if(!isAutoBootstrapAllowed)return void window.console.error("Angular: disabling automatic bootstrap. <script> protocol indicates an extension, document.location.href does not match.");config.strictDi=null!==getNgAttribute(appElement,"strict-di"),bootstrap(appElement,module?[module]:[],config)}}function bootstrap(element,modules,config){isObject(config)||(config={});var defaultConfig={strictDi:!1};config=extend(defaultConfig,config);var doBootstrap=function(){if(element=jqLite(element),element.injector()){var tag=element[0]===window.document?"document":startingTag(element);throw ngMinErr("btstrpd","App already bootstrapped with this element '{0}'",tag.replace(/</,"&lt;").replace(/>/,"&gt;"))}modules=modules||[],modules.unshift(["$provide",function($provide){$provide.value("$rootElement",element)}]),config.debugInfoEnabled&&modules.push(["$compileProvider",function($compileProvider){$compileProvider.debugInfoEnabled(!0)}]),modules.unshift("ng");var injector=createInjector(modules,config.strictDi);return injector.invoke(["$rootScope","$rootElement","$compile","$injector",function(scope,element,compile,injector){scope.$apply(function(){element.data("$injector",injector),compile(element)(scope)})}]),injector},NG_ENABLE_DEBUG_INFO=/^NG_ENABLE_DEBUG_INFO!/,NG_DEFER_BOOTSTRAP=/^NG_DEFER_BOOTSTRAP!/;return window&&NG_ENABLE_DEBUG_INFO.test(window.name)&&(config.debugInfoEnabled=!0,window.name=window.name.replace(NG_ENABLE_DEBUG_INFO,"")),window&&!NG_DEFER_BOOTSTRAP.test(window.name)?doBootstrap():(window.name=window.name.replace(NG_DEFER_BOOTSTRAP,""),angular.resumeBootstrap=function(extraModules){return forEach(extraModules,function(module){modules.push(module)}),doBootstrap()},void(isFunction(angular.resumeDeferredBootstrap)&&angular.resumeDeferredBootstrap()))}function reloadWithDebugInfo(){window.name="NG_ENABLE_DEBUG_INFO!"+window.name,window.location.reload()}function getTestability(rootElement){var injector=angular.element(rootElement).injector();if(!injector)throw ngMinErr("test","no injector found for element argument to getTestability");return injector.get("$$testability")}function snake_case(name,separator){return separator=separator||"_",name.replace(SNAKE_CASE_REGEXP,function(letter,pos){return(pos?separator:"")+letter.toLowerCase()})}function bindJQuery(){var originalCleanData;if(!bindJQueryFired){var jqName=jq();jQuery=isUndefined(jqName)?window.jQuery:jqName?window[jqName]:void 0,jQuery&&jQuery.fn.on?(jqLite=jQuery,extend(jQuery.fn,{scope:JQLitePrototype.scope,isolateScope:JQLitePrototype.isolateScope,controller:JQLitePrototype.controller,injector:JQLitePrototype.injector,inheritedData:JQLitePrototype.inheritedData}),originalCleanData=jQuery.cleanData,jQuery.cleanData=function(elems){for(var events,elem,i=0;null!=(elem=elems[i]);i++)events=jQuery._data(elem,"events"),events&&events.$destroy&&jQuery(elem).triggerHandler("$destroy");originalCleanData(elems)}):jqLite=JQLite,angular.element=jqLite,bindJQueryFired=!0}}function assertArg(arg,name,reason){if(!arg)throw ngMinErr("areq","Argument '{0}' is {1}",name||"?",reason||"required");return arg}function assertArgFn(arg,name,acceptArrayAnnotation){return acceptArrayAnnotation&&isArray(arg)&&(arg=arg[arg.length-1]),assertArg(isFunction(arg),name,"not a function, got "+(arg&&"object"==typeof arg?arg.constructor.name||"Object":typeof arg)),arg}function assertNotHasOwnProperty(name,context){if("hasOwnProperty"===name)throw ngMinErr("badname","hasOwnProperty is not a valid {0} name",context)}function getter(obj,path,bindFnToScope){if(!path)return obj;for(var key,keys=path.split("."),lastInstance=obj,len=keys.length,i=0;i<len;i++)key=keys[i],obj&&(obj=(lastInstance=obj)[key]);return!bindFnToScope&&isFunction(obj)?bind(lastInstance,obj):obj}function getBlockNodes(nodes){for(var blockNodes,node=nodes[0],endNode=nodes[nodes.length-1],i=1;node!==endNode&&(node=node.nextSibling);i++)(blockNodes||nodes[i]!==node)&&(blockNodes||(blockNodes=jqLite(slice.call(nodes,0,i))),blockNodes.push(node));return blockNodes||nodes}function createMap(){return Object.create(null)}function stringify(value){if(null==value)return"";switch(typeof value){case"string":break;case"number":value=""+value;break;default:value=!hasCustomToString(value)||isArray(value)||isDate(value)?toJson(value):value.toString()}return value}function setupModuleLoader(window){function ensure(obj,name,factory){return obj[name]||(obj[name]=factory())}var $injectorMinErr=minErr("$injector"),ngMinErr=minErr("ng"),angular=ensure(window,"angular",Object);return angular.$$minErr=angular.$$minErr||minErr,ensure(angular,"module",function(){var modules={};return function(name,requires,configFn){var info={},assertNotHasOwnProperty=function(name,context){if("hasOwnProperty"===name)throw ngMinErr("badname","hasOwnProperty is not a valid {0} name",context)};return assertNotHasOwnProperty(name,"module"),requires&&modules.hasOwnProperty(name)&&(modules[name]=null),ensure(modules,name,function(){function invokeLater(provider,method,insertMethod,queue){return queue||(queue=invokeQueue),function(){return queue[insertMethod||"push"]([provider,method,arguments]),moduleInstance}}function invokeLaterAndSetModuleName(provider,method,queue){return queue||(queue=invokeQueue),function(recipeName,factoryFunction){return factoryFunction&&isFunction(factoryFunction)&&(factoryFunction.$$moduleName=name),queue.push([provider,method,arguments]),moduleInstance}}if(!requires)throw $injectorMinErr("nomod","Module '{0}' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.",name);var invokeQueue=[],configBlocks=[],runBlocks=[],config=invokeLater("$injector","invoke","push",configBlocks),moduleInstance={_invokeQueue:invokeQueue,_configBlocks:configBlocks,_runBlocks:runBlocks,info:function(value){if(isDefined(value)){if(!isObject(value))throw ngMinErr("aobj","Argument '{0}' must be an object","value");return info=value,this}return info},requires:requires,name:name,provider:invokeLaterAndSetModuleName("$provide","provider"),factory:invokeLaterAndSetModuleName("$provide","factory"),service:invokeLaterAndSetModuleName("$provide","service"),value:invokeLater("$provide","value"),constant:invokeLater("$provide","constant","unshift"),decorator:invokeLaterAndSetModuleName("$provide","decorator",configBlocks),animation:invokeLaterAndSetModuleName("$animateProvider","register"),filter:invokeLaterAndSetModuleName("$filterProvider","register"),controller:invokeLaterAndSetModuleName("$controllerProvider","register"),directive:invokeLaterAndSetModuleName("$compileProvider","directive"),component:invokeLaterAndSetModuleName("$compileProvider","component"),config:config,run:function(block){return runBlocks.push(block),this}};return configFn&&config(configFn),moduleInstance})}})}function shallowCopy(src,dst){if(isArray(src)){dst=dst||[];for(var i=0,ii=src.length;i<ii;i++)dst[i]=src[i]}else if(isObject(src)){dst=dst||{};for(var key in src)"$"===key.charAt(0)&&"$"===key.charAt(1)||(dst[key]=src[key])}return dst||src}function serializeObject(obj,maxDepth){var seen=[];return isValidObjectMaxDepth(maxDepth)&&(obj=copy(obj,null,maxDepth)),JSON.stringify(obj,function(key,val){if(val=toJsonReplacer(key,val),isObject(val)){if(seen.indexOf(val)>=0)return"...";seen.push(val)}return val})}function toDebugString(obj,maxDepth){return"function"==typeof obj?obj.toString().replace(/ \{[\s\S]*$/,""):isUndefined(obj)?"undefined":"string"!=typeof obj?serializeObject(obj,maxDepth):obj}function publishExternalAPI(angular){extend(angular,{errorHandlingConfig:errorHandlingConfig,bootstrap:bootstrap,copy:copy,extend:extend,merge:merge,equals:equals,element:jqLite,forEach:forEach,injector:createInjector,noop:noop,bind:bind,toJson:toJson,fromJson:fromJson,identity:identity,isUndefined:isUndefined,isDefined:isDefined,isString:isString,isFunction:isFunction,isObject:isObject,isNumber:isNumber,isElement:isElement,isArray:isArray,version:version,isDate:isDate,lowercase:lowercase,uppercase:uppercase,callbacks:{$$counter:0},getTestability:getTestability,reloadWithDebugInfo:reloadWithDebugInfo,$$minErr:minErr,$$csp:csp,$$encodeUriSegment:encodeUriSegment,$$encodeUriQuery:encodeUriQuery,$$stringify:stringify}),angularModule=setupModuleLoader(window),angularModule("ng",["ngLocale"],["$provide",function($provide){$provide.provider({$$sanitizeUri:$$SanitizeUriProvider}),$provide.provider("$compile",$CompileProvider).directive({a:htmlAnchorDirective,input:inputDirective,textarea:inputDirective,form:formDirective,script:scriptDirective,select:selectDirective,option:optionDirective,ngBind:ngBindDirective,ngBindHtml:ngBindHtmlDirective,ngBindTemplate:ngBindTemplateDirective,ngClass:ngClassDirective,ngClassEven:ngClassEvenDirective,ngClassOdd:ngClassOddDirective,ngCloak:ngCloakDirective,ngController:ngControllerDirective,ngForm:ngFormDirective,ngHide:ngHideDirective,ngIf:ngIfDirective,ngInclude:ngIncludeDirective,ngInit:ngInitDirective,ngNonBindable:ngNonBindableDirective,ngPluralize:ngPluralizeDirective,ngRepeat:ngRepeatDirective,ngShow:ngShowDirective,ngStyle:ngStyleDirective,ngSwitch:ngSwitchDirective,ngSwitchWhen:ngSwitchWhenDirective,ngSwitchDefault:ngSwitchDefaultDirective,ngOptions:ngOptionsDirective,ngTransclude:ngTranscludeDirective,ngModel:ngModelDirective,ngList:ngListDirective,ngChange:ngChangeDirective,pattern:patternDirective,ngPattern:patternDirective,required:requiredDirective,ngRequired:requiredDirective,minlength:minlengthDirective,ngMinlength:minlengthDirective,maxlength:maxlengthDirective,ngMaxlength:maxlengthDirective,ngValue:ngValueDirective,ngModelOptions:ngModelOptionsDirective}).directive({ngInclude:ngIncludeFillContentDirective}).directive(ngAttributeAliasDirectives).directive(ngEventDirectives),$provide.provider({$anchorScroll:$AnchorScrollProvider,$animate:$AnimateProvider,$animateCss:$CoreAnimateCssProvider,$$animateJs:$$CoreAnimateJsProvider,$$animateQueue:$$CoreAnimateQueueProvider,$$AnimateRunner:$$AnimateRunnerFactoryProvider,$$animateAsyncRun:$$AnimateAsyncRunFactoryProvider,$browser:$BrowserProvider,$cacheFactory:$CacheFactoryProvider,$controller:$ControllerProvider,$document:$DocumentProvider,$$isDocumentHidden:$$IsDocumentHiddenProvider,$exceptionHandler:$ExceptionHandlerProvider,$filter:$FilterProvider,$$forceReflow:$$ForceReflowProvider,$interpolate:$InterpolateProvider,$interval:$IntervalProvider,$http:$HttpProvider,$httpParamSerializer:$HttpParamSerializerProvider,$httpParamSerializerJQLike:$HttpParamSerializerJQLikeProvider,$httpBackend:$HttpBackendProvider,$xhrFactory:$xhrFactoryProvider,$jsonpCallbacks:$jsonpCallbacksProvider,$location:$LocationProvider,$log:$LogProvider,$parse:$ParseProvider,$rootScope:$RootScopeProvider,$q:$QProvider,$$q:$$QProvider,$sce:$SceProvider,$sceDelegate:$SceDelegateProvider,$sniffer:$SnifferProvider,$templateCache:$TemplateCacheProvider,$templateRequest:$TemplateRequestProvider,$$testability:$$TestabilityProvider,$timeout:$TimeoutProvider,$window:$WindowProvider,$$rAF:$$RAFProvider,$$jqLite:$$jqLiteProvider,$$Map:$$MapProvider,$$cookieReader:$$CookieReaderProvider})}]).info({angularVersion:"1.6.3"})}function jqNextId(){return++jqId}function cssKebabToCamel(name){return kebabToCamel(name.replace(MS_HACK_REGEXP,"ms-"))}function fnCamelCaseReplace(all,letter){return letter.toUpperCase()}function kebabToCamel(name){return name.replace(DASH_LOWERCASE_REGEXP,fnCamelCaseReplace)}function jqLiteIsTextNode(html){return!HTML_REGEXP.test(html)}function jqLiteAcceptsData(node){var nodeType=node.nodeType;return nodeType===NODE_TYPE_ELEMENT||!nodeType||nodeType===NODE_TYPE_DOCUMENT}function jqLiteHasData(node){for(var key in jqCache[node.ng339])return!0;return!1}function jqLiteCleanData(nodes){for(var i=0,ii=nodes.length;i<ii;i++)jqLiteRemoveData(nodes[i])}function jqLiteBuildFragment(html,context){var tmp,tag,wrap,i,fragment=context.createDocumentFragment(),nodes=[];if(jqLiteIsTextNode(html))nodes.push(context.createTextNode(html));else{for(tmp=fragment.appendChild(context.createElement("div")),tag=(TAG_NAME_REGEXP.exec(html)||["",""])[1].toLowerCase(),wrap=wrapMap[tag]||wrapMap._default,tmp.innerHTML=wrap[1]+html.replace(XHTML_TAG_REGEXP,"<$1></$2>")+wrap[2],i=wrap[0];i--;)tmp=tmp.lastChild;nodes=concat(nodes,tmp.childNodes),tmp=fragment.firstChild,tmp.textContent=""}return fragment.textContent="",fragment.innerHTML="",forEach(nodes,function(node){fragment.appendChild(node)}),fragment}function jqLiteParseHTML(html,context){context=context||window.document;var parsed;return(parsed=SINGLE_TAG_REGEXP.exec(html))?[context.createElement(parsed[1])]:(parsed=jqLiteBuildFragment(html,context))?parsed.childNodes:[]}function jqLiteWrapNode(node,wrapper){var parent=node.parentNode;parent&&parent.replaceChild(wrapper,node),wrapper.appendChild(node)}function JQLite(element){if(element instanceof JQLite)return element;var argIsString;if(isString(element)&&(element=trim(element),argIsString=!0),!(this instanceof JQLite)){if(argIsString&&"<"!==element.charAt(0))throw jqLiteMinErr("nosel","Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element");return new JQLite(element)}argIsString?jqLiteAddNodes(this,jqLiteParseHTML(element)):isFunction(element)?jqLiteReady(element):jqLiteAddNodes(this,element)}function jqLiteClone(element){return element.cloneNode(!0)}function jqLiteDealoc(element,onlyDescendants){if(onlyDescendants||jqLiteRemoveData(element),element.querySelectorAll)for(var descendants=element.querySelectorAll("*"),i=0,l=descendants.length;i<l;i++)jqLiteRemoveData(descendants[i])}function jqLiteOff(element,type,fn,unsupported){if(isDefined(unsupported))throw jqLiteMinErr("offargs","jqLite#off() does not support the `selector` argument");var expandoStore=jqLiteExpandoStore(element),events=expandoStore&&expandoStore.events,handle=expandoStore&&expandoStore.handle;if(handle)if(type){var removeHandler=function(type){var listenerFns=events[type];isDefined(fn)&&arrayRemove(listenerFns||[],fn),isDefined(fn)&&listenerFns&&listenerFns.length>0||(element.removeEventListener(type,handle),delete events[type])};forEach(type.split(" "),function(type){removeHandler(type),MOUSE_EVENT_MAP[type]&&removeHandler(MOUSE_EVENT_MAP[type])})}else for(type in events)"$destroy"!==type&&element.removeEventListener(type,handle),delete events[type]}function jqLiteRemoveData(element,name){var expandoId=element.ng339,expandoStore=expandoId&&jqCache[expandoId];if(expandoStore){if(name)return void delete expandoStore.data[name];expandoStore.handle&&(expandoStore.events.$destroy&&expandoStore.handle({},"$destroy"),jqLiteOff(element)),delete jqCache[expandoId],element.ng339=void 0}}function jqLiteExpandoStore(element,createIfNecessary){var expandoId=element.ng339,expandoStore=expandoId&&jqCache[expandoId];return createIfNecessary&&!expandoStore&&(element.ng339=expandoId=jqNextId(),expandoStore=jqCache[expandoId]={events:{},data:{},handle:void 0}),expandoStore}function jqLiteData(element,key,value){if(jqLiteAcceptsData(element)){var prop,isSimpleSetter=isDefined(value),isSimpleGetter=!isSimpleSetter&&key&&!isObject(key),massGetter=!key,expandoStore=jqLiteExpandoStore(element,!isSimpleGetter),data=expandoStore&&expandoStore.data;if(isSimpleSetter)data[kebabToCamel(key)]=value;else{if(massGetter)return data;if(isSimpleGetter)return data&&data[kebabToCamel(key)];for(prop in key)data[kebabToCamel(prop)]=key[prop]}}}function jqLiteHasClass(element,selector){return!!element.getAttribute&&(" "+(element.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+selector+" ")>-1}function jqLiteRemoveClass(element,cssClasses){cssClasses&&element.setAttribute&&forEach(cssClasses.split(" "),function(cssClass){element.setAttribute("class",trim((" "+(element.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+trim(cssClass)+" "," ")))})}function jqLiteAddClass(element,cssClasses){if(cssClasses&&element.setAttribute){var existingClasses=(" "+(element.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");forEach(cssClasses.split(" "),function(cssClass){cssClass=trim(cssClass),existingClasses.indexOf(" "+cssClass+" ")===-1&&(existingClasses+=cssClass+" ")}),element.setAttribute("class",trim(existingClasses))}}function jqLiteAddNodes(root,elements){if(elements)if(elements.nodeType)root[root.length++]=elements;else{var length=elements.length;if("number"==typeof length&&elements.window!==elements){if(length)for(var i=0;i<length;i++)root[root.length++]=elements[i]}else root[root.length++]=elements}}function jqLiteController(element,name){return jqLiteInheritedData(element,"$"+(name||"ngController")+"Controller")}function jqLiteInheritedData(element,name,value){element.nodeType===NODE_TYPE_DOCUMENT&&(element=element.documentElement);for(var names=isArray(name)?name:[name];element;){for(var i=0,ii=names.length;i<ii;i++)if(isDefined(value=jqLite.data(element,names[i])))return value;element=element.parentNode||element.nodeType===NODE_TYPE_DOCUMENT_FRAGMENT&&element.host}}function jqLiteEmpty(element){for(jqLiteDealoc(element,!0);element.firstChild;)element.removeChild(element.firstChild)}function jqLiteRemove(element,keepData){keepData||jqLiteDealoc(element);var parent=element.parentNode;parent&&parent.removeChild(element)}function jqLiteDocumentLoaded(action,win){win=win||window,"complete"===win.document.readyState?win.setTimeout(action):jqLite(win).on("load",action)}function jqLiteReady(fn){function trigger(){window.document.removeEventListener("DOMContentLoaded",trigger),window.removeEventListener("load",trigger),fn()}"complete"===window.document.readyState?window.setTimeout(fn):(window.document.addEventListener("DOMContentLoaded",trigger),window.addEventListener("load",trigger))}function getBooleanAttrName(element,name){var booleanAttr=BOOLEAN_ATTR[name.toLowerCase()];return booleanAttr&&BOOLEAN_ELEMENTS[nodeName_(element)]&&booleanAttr}function getAliasedAttrName(name){return ALIASED_ATTR[name]}function createEventHandler(element,events){var eventHandler=function(event,type){event.isDefaultPrevented=function(){return event.defaultPrevented};var eventFns=events[type||event.type],eventFnsLength=eventFns?eventFns.length:0;if(eventFnsLength){if(isUndefined(event.immediatePropagationStopped)){var originalStopImmediatePropagation=event.stopImmediatePropagation;event.stopImmediatePropagation=function(){event.immediatePropagationStopped=!0,event.stopPropagation&&event.stopPropagation(),originalStopImmediatePropagation&&originalStopImmediatePropagation.call(event)}}event.isImmediatePropagationStopped=function(){return event.immediatePropagationStopped===!0};var handlerWrapper=eventFns.specialHandlerWrapper||defaultHandlerWrapper;
eventFnsLength>1&&(eventFns=shallowCopy(eventFns));for(var i=0;i<eventFnsLength;i++)event.isImmediatePropagationStopped()||handlerWrapper(element,event,eventFns[i])}};return eventHandler.elem=element,eventHandler}function defaultHandlerWrapper(element,event,handler){handler.call(element,event)}function specialMouseHandlerWrapper(target,event,handler){var related=event.relatedTarget;related&&(related===target||jqLiteContains.call(target,related))||handler.call(target,event)}function $$jqLiteProvider(){this.$get=function(){return extend(JQLite,{hasClass:function(node,classes){return node.attr&&(node=node[0]),jqLiteHasClass(node,classes)},addClass:function(node,classes){return node.attr&&(node=node[0]),jqLiteAddClass(node,classes)},removeClass:function(node,classes){return node.attr&&(node=node[0]),jqLiteRemoveClass(node,classes)}})}}function hashKey(obj,nextUidFn){var key=obj&&obj.$$hashKey;if(key)return"function"==typeof key&&(key=obj.$$hashKey()),key;var objType=typeof obj;return key="function"===objType||"object"===objType&&null!==obj?obj.$$hashKey=objType+":"+(nextUidFn||nextUid)():objType+":"+obj}function NgMapShim(){this._keys=[],this._values=[],this._lastKey=NaN,this._lastIndex=-1}function stringifyFn(fn){return Function.prototype.toString.call(fn)}function extractArgs(fn){var fnText=stringifyFn(fn).replace(STRIP_COMMENTS,""),args=fnText.match(ARROW_ARG)||fnText.match(FN_ARGS);return args}function anonFn(fn){var args=extractArgs(fn);return args?"function("+(args[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function annotate(fn,strictDi,name){var $inject,argDecl,last;if("function"==typeof fn){if(!($inject=fn.$inject)){if($inject=[],fn.length){if(strictDi)throw isString(name)&&name||(name=fn.name||anonFn(fn)),$injectorMinErr("strictdi","{0} is not using explicit annotation and cannot be invoked in strict mode",name);argDecl=extractArgs(fn),forEach(argDecl[1].split(FN_ARG_SPLIT),function(arg){arg.replace(FN_ARG,function(all,underscore,name){$inject.push(name)})})}fn.$inject=$inject}}else isArray(fn)?(last=fn.length-1,assertArgFn(fn[last],"fn"),$inject=fn.slice(0,last)):assertArgFn(fn,"fn",!0);return $inject}function createInjector(modulesToLoad,strictDi){function supportObject(delegate){return function(key,value){return isObject(key)?void forEach(key,reverseParams(delegate)):delegate(key,value)}}function provider(name,provider_){if(assertNotHasOwnProperty(name,"service"),(isFunction(provider_)||isArray(provider_))&&(provider_=providerInjector.instantiate(provider_)),!provider_.$get)throw $injectorMinErr("pget","Provider '{0}' must define $get factory method.",name);return providerCache[name+providerSuffix]=provider_}function enforceReturnValue(name,factory){return function(){var result=instanceInjector.invoke(factory,this);if(isUndefined(result))throw $injectorMinErr("undef","Provider '{0}' must return a value from $get factory method.",name);return result}}function factory(name,factoryFn,enforce){return provider(name,{$get:enforce!==!1?enforceReturnValue(name,factoryFn):factoryFn})}function service(name,constructor){return factory(name,["$injector",function($injector){return $injector.instantiate(constructor)}])}function value(name,val){return factory(name,valueFn(val),!1)}function constant(name,value){assertNotHasOwnProperty(name,"constant"),providerCache[name]=value,instanceCache[name]=value}function decorator(serviceName,decorFn){var origProvider=providerInjector.get(serviceName+providerSuffix),orig$get=origProvider.$get;origProvider.$get=function(){var origInstance=instanceInjector.invoke(orig$get,origProvider);return instanceInjector.invoke(decorFn,null,{$delegate:origInstance})}}function loadModules(modulesToLoad){assertArg(isUndefined(modulesToLoad)||isArray(modulesToLoad),"modulesToLoad","not an array");var moduleFn,runBlocks=[];return forEach(modulesToLoad,function(module){function runInvokeQueue(queue){var i,ii;for(i=0,ii=queue.length;i<ii;i++){var invokeArgs=queue[i],provider=providerInjector.get(invokeArgs[0]);provider[invokeArgs[1]].apply(provider,invokeArgs[2])}}if(!loadedModules.get(module)){loadedModules.set(module,!0);try{isString(module)?(moduleFn=angularModule(module),instanceInjector.modules[module]=moduleFn,runBlocks=runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks),runInvokeQueue(moduleFn._invokeQueue),runInvokeQueue(moduleFn._configBlocks)):isFunction(module)?runBlocks.push(providerInjector.invoke(module)):isArray(module)?runBlocks.push(providerInjector.invoke(module)):assertArgFn(module,"module")}catch(e){throw isArray(module)&&(module=module[module.length-1]),e.message&&e.stack&&e.stack.indexOf(e.message)===-1&&(e=e.message+"\n"+e.stack),$injectorMinErr("modulerr","Failed to instantiate module {0} due to:\n{1}",module,e.stack||e.message||e)}}}),runBlocks}function createInternalInjector(cache,factory){function getService(serviceName,caller){if(cache.hasOwnProperty(serviceName)){if(cache[serviceName]===INSTANTIATING)throw $injectorMinErr("cdep","Circular dependency found: {0}",serviceName+" <- "+path.join(" <- "));return cache[serviceName]}try{return path.unshift(serviceName),cache[serviceName]=INSTANTIATING,cache[serviceName]=factory(serviceName,caller),cache[serviceName]}catch(err){throw cache[serviceName]===INSTANTIATING&&delete cache[serviceName],err}finally{path.shift()}}function injectionArgs(fn,locals,serviceName){for(var args=[],$inject=createInjector.$$annotate(fn,strictDi,serviceName),i=0,length=$inject.length;i<length;i++){var key=$inject[i];if("string"!=typeof key)throw $injectorMinErr("itkn","Incorrect injection token! Expected service name as string, got {0}",key);args.push(locals&&locals.hasOwnProperty(key)?locals[key]:getService(key,serviceName))}return args}function isClass(func){if(msie||"function"!=typeof func)return!1;var result=func.$$ngIsClass;return isBoolean(result)||(result=func.$$ngIsClass=/^(?:class\b|constructor\()/.test(stringifyFn(func))),result}function invoke(fn,self,locals,serviceName){"string"==typeof locals&&(serviceName=locals,locals=null);var args=injectionArgs(fn,locals,serviceName);return isArray(fn)&&(fn=fn[fn.length-1]),isClass(fn)?(args.unshift(null),new(Function.prototype.bind.apply(fn,args))):fn.apply(self,args)}function instantiate(Type,locals,serviceName){var ctor=isArray(Type)?Type[Type.length-1]:Type,args=injectionArgs(Type,locals,serviceName);return args.unshift(null),new(Function.prototype.bind.apply(ctor,args))}return{invoke:invoke,instantiate:instantiate,get:getService,annotate:createInjector.$$annotate,has:function(name){return providerCache.hasOwnProperty(name+providerSuffix)||cache.hasOwnProperty(name)}}}strictDi=strictDi===!0;var INSTANTIATING={},providerSuffix="Provider",path=[],loadedModules=new NgMap,providerCache={$provide:{provider:supportObject(provider),factory:supportObject(factory),service:supportObject(service),value:supportObject(value),constant:supportObject(constant),decorator:decorator}},providerInjector=providerCache.$injector=createInternalInjector(providerCache,function(serviceName,caller){throw angular.isString(caller)&&path.push(caller),$injectorMinErr("unpr","Unknown provider: {0}",path.join(" <- "))}),instanceCache={},protoInstanceInjector=createInternalInjector(instanceCache,function(serviceName,caller){var provider=providerInjector.get(serviceName+providerSuffix,caller);return instanceInjector.invoke(provider.$get,provider,void 0,serviceName)}),instanceInjector=protoInstanceInjector;providerCache["$injector"+providerSuffix]={$get:valueFn(protoInstanceInjector)},instanceInjector.modules=providerInjector.modules=createMap();var runBlocks=loadModules(modulesToLoad);return instanceInjector=protoInstanceInjector.get("$injector"),instanceInjector.strictDi=strictDi,forEach(runBlocks,function(fn){fn&&instanceInjector.invoke(fn)}),instanceInjector}function $AnchorScrollProvider(){var autoScrollingEnabled=!0;this.disableAutoScrolling=function(){autoScrollingEnabled=!1},this.$get=["$window","$location","$rootScope",function($window,$location,$rootScope){function getFirstAnchor(list){var result=null;return Array.prototype.some.call(list,function(element){if("a"===nodeName_(element))return result=element,!0}),result}function getYOffset(){var offset=scroll.yOffset;if(isFunction(offset))offset=offset();else if(isElement(offset)){var elem=offset[0],style=$window.getComputedStyle(elem);offset="fixed"!==style.position?0:elem.getBoundingClientRect().bottom}else isNumber(offset)||(offset=0);return offset}function scrollTo(elem){if(elem){elem.scrollIntoView();var offset=getYOffset();if(offset){var elemTop=elem.getBoundingClientRect().top;$window.scrollBy(0,elemTop-offset)}}else $window.scrollTo(0,0)}function scroll(hash){hash=isString(hash)?hash:isNumber(hash)?hash.toString():$location.hash();var elm;hash?(elm=document.getElementById(hash))?scrollTo(elm):(elm=getFirstAnchor(document.getElementsByName(hash)))?scrollTo(elm):"top"===hash&&scrollTo(null):scrollTo(null)}var document=$window.document;return autoScrollingEnabled&&$rootScope.$watch(function(){return $location.hash()},function(newVal,oldVal){newVal===oldVal&&""===newVal||jqLiteDocumentLoaded(function(){$rootScope.$evalAsync(scroll)})}),scroll}]}function mergeClasses(a,b){return a||b?a?b?(isArray(a)&&(a=a.join(" ")),isArray(b)&&(b=b.join(" ")),a+" "+b):a:b:""}function extractElementNode(element){for(var i=0;i<element.length;i++){var elm=element[i];if(elm.nodeType===ELEMENT_NODE)return elm}}function splitClasses(classes){isString(classes)&&(classes=classes.split(" "));var obj=createMap();return forEach(classes,function(klass){klass.length&&(obj[klass]=!0)}),obj}function prepareAnimateOptions(options){return isObject(options)?options:{}}function Browser(window,document,$log,$sniffer){function completeOutstandingRequest(fn){try{fn.apply(null,sliceArgs(arguments,1))}finally{if(outstandingRequestCount--,0===outstandingRequestCount)for(;outstandingRequestCallbacks.length;)try{outstandingRequestCallbacks.pop()()}catch(e){$log.error(e)}}}function getHash(url){var index=url.indexOf("#");return index===-1?"":url.substr(index)}function cacheStateAndFireUrlChange(){pendingLocation=null,fireStateOrUrlChange()}function cacheState(){cachedState=getCurrentState(),cachedState=isUndefined(cachedState)?null:cachedState,equals(cachedState,lastCachedState)&&(cachedState=lastCachedState),lastCachedState=cachedState,lastHistoryState=cachedState}function fireStateOrUrlChange(){var prevLastHistoryState=lastHistoryState;cacheState(),lastBrowserUrl===self.url()&&prevLastHistoryState===cachedState||(lastBrowserUrl=self.url(),lastHistoryState=cachedState,forEach(urlChangeListeners,function(listener){listener(self.url(),cachedState)}))}var self=this,location=window.location,history=window.history,setTimeout=window.setTimeout,clearTimeout=window.clearTimeout,pendingDeferIds={};self.isMock=!1;var outstandingRequestCount=0,outstandingRequestCallbacks=[];self.$$completeOutstandingRequest=completeOutstandingRequest,self.$$incOutstandingRequestCount=function(){outstandingRequestCount++},self.notifyWhenNoOutstandingRequests=function(callback){0===outstandingRequestCount?callback():outstandingRequestCallbacks.push(callback)};var cachedState,lastHistoryState,lastBrowserUrl=location.href,baseElement=document.find("base"),pendingLocation=null,getCurrentState=$sniffer.history?function(){try{return history.state}catch(e){}}:noop;cacheState(),self.url=function(url,replace,state){if(isUndefined(state)&&(state=null),location!==window.location&&(location=window.location),history!==window.history&&(history=window.history),url){var sameState=lastHistoryState===state;if(lastBrowserUrl===url&&(!$sniffer.history||sameState))return self;var sameBase=lastBrowserUrl&&stripHash(lastBrowserUrl)===stripHash(url);return lastBrowserUrl=url,lastHistoryState=state,!$sniffer.history||sameBase&&sameState?(sameBase||(pendingLocation=url),replace?location.replace(url):sameBase?location.hash=getHash(url):location.href=url,location.href!==url&&(pendingLocation=url)):(history[replace?"replaceState":"pushState"](state,"",url),cacheState()),pendingLocation&&(pendingLocation=url),self}return pendingLocation||location.href.replace(/%27/g,"'")},self.state=function(){return cachedState};var urlChangeListeners=[],urlChangeInit=!1,lastCachedState=null;self.onUrlChange=function(callback){return urlChangeInit||($sniffer.history&&jqLite(window).on("popstate",cacheStateAndFireUrlChange),jqLite(window).on("hashchange",cacheStateAndFireUrlChange),urlChangeInit=!0),urlChangeListeners.push(callback),callback},self.$$applicationDestroyed=function(){jqLite(window).off("hashchange popstate",cacheStateAndFireUrlChange)},self.$$checkUrlChange=fireStateOrUrlChange,self.baseHref=function(){var href=baseElement.attr("href");return href?href.replace(/^(https?:)?\/\/[^\/]*/,""):""},self.defer=function(fn,delay){var timeoutId;return outstandingRequestCount++,timeoutId=setTimeout(function(){delete pendingDeferIds[timeoutId],completeOutstandingRequest(fn)},delay||0),pendingDeferIds[timeoutId]=!0,timeoutId},self.defer.cancel=function(deferId){return!!pendingDeferIds[deferId]&&(delete pendingDeferIds[deferId],clearTimeout(deferId),completeOutstandingRequest(noop),!0)}}function $BrowserProvider(){this.$get=["$window","$log","$sniffer","$document",function($window,$log,$sniffer,$document){return new Browser($window,$document,$log,$sniffer)}]}function $CacheFactoryProvider(){this.$get=function(){function cacheFactory(cacheId,options){function refresh(entry){entry!==freshEnd&&(staleEnd?staleEnd===entry&&(staleEnd=entry.n):staleEnd=entry,link(entry.n,entry.p),link(entry,freshEnd),freshEnd=entry,freshEnd.n=null)}function link(nextEntry,prevEntry){nextEntry!==prevEntry&&(nextEntry&&(nextEntry.p=prevEntry),prevEntry&&(prevEntry.n=nextEntry))}if(cacheId in caches)throw minErr("$cacheFactory")("iid","CacheId '{0}' is already taken!",cacheId);var size=0,stats=extend({},options,{id:cacheId}),data=createMap(),capacity=options&&options.capacity||Number.MAX_VALUE,lruHash=createMap(),freshEnd=null,staleEnd=null;return caches[cacheId]={put:function(key,value){if(!isUndefined(value)){if(capacity<Number.MAX_VALUE){var lruEntry=lruHash[key]||(lruHash[key]={key:key});refresh(lruEntry)}return key in data||size++,data[key]=value,size>capacity&&this.remove(staleEnd.key),value}},get:function(key){if(capacity<Number.MAX_VALUE){var lruEntry=lruHash[key];if(!lruEntry)return;refresh(lruEntry)}return data[key]},remove:function(key){if(capacity<Number.MAX_VALUE){var lruEntry=lruHash[key];if(!lruEntry)return;lruEntry===freshEnd&&(freshEnd=lruEntry.p),lruEntry===staleEnd&&(staleEnd=lruEntry.n),link(lruEntry.n,lruEntry.p),delete lruHash[key]}key in data&&(delete data[key],size--)},removeAll:function(){data=createMap(),size=0,lruHash=createMap(),freshEnd=staleEnd=null},destroy:function(){data=null,stats=null,lruHash=null,delete caches[cacheId]},info:function(){return extend({},stats,{size:size})}}}var caches={};return cacheFactory.info=function(){var info={};return forEach(caches,function(cache,cacheId){info[cacheId]=cache.info()}),info},cacheFactory.get=function(cacheId){return caches[cacheId]},cacheFactory}}function $TemplateCacheProvider(){this.$get=["$cacheFactory",function($cacheFactory){return $cacheFactory("templates")}]}function UNINITIALIZED_VALUE(){}function $CompileProvider($provide,$$sanitizeUriProvider){function parseIsolateBindings(scope,directiveName,isController){var LOCAL_REGEXP=/^\s*([@&<]|=(\*?))(\??)\s*([\w$]*)\s*$/,bindings=createMap();return forEach(scope,function(definition,scopeName){if(definition in bindingCache)return void(bindings[scopeName]=bindingCache[definition]);var match=definition.match(LOCAL_REGEXP);if(!match)throw $compileMinErr("iscp","Invalid {3} for directive '{0}'. Definition: {... {1}: '{2}' ...}",directiveName,scopeName,definition,isController?"controller bindings definition":"isolate scope definition");bindings[scopeName]={mode:match[1][0],collection:"*"===match[2],optional:"?"===match[3],attrName:match[4]||scopeName},match[4]&&(bindingCache[definition]=bindings[scopeName])}),bindings}function parseDirectiveBindings(directive,directiveName){var bindings={isolateScope:null,bindToController:null};if(isObject(directive.scope)&&(directive.bindToController===!0?(bindings.bindToController=parseIsolateBindings(directive.scope,directiveName,!0),bindings.isolateScope={}):bindings.isolateScope=parseIsolateBindings(directive.scope,directiveName,!1)),isObject(directive.bindToController)&&(bindings.bindToController=parseIsolateBindings(directive.bindToController,directiveName,!0)),bindings.bindToController&&!directive.controller)throw $compileMinErr("noctrl","Cannot bind to controller without directive '{0}'s controller.",directiveName);return bindings}function assertValidDirectiveName(name){var letter=name.charAt(0);if(!letter||letter!==lowercase(letter))throw $compileMinErr("baddir","Directive/Component name '{0}' is invalid. The first character must be a lowercase letter",name);if(name!==name.trim())throw $compileMinErr("baddir","Directive/Component name '{0}' is invalid. The name should not contain leading or trailing whitespaces",name)}function getDirectiveRequire(directive){var require=directive.require||directive.controller&&directive.name;return!isArray(require)&&isObject(require)&&forEach(require,function(value,key){var match=value.match(REQUIRE_PREFIX_REGEXP),name=value.substring(match[0].length);name||(require[key]=match[0]+key)}),require}function getDirectiveRestrict(restrict,name){if(restrict&&(!isString(restrict)||!/[EACM]/.test(restrict)))throw $compileMinErr("badrestrict","Restrict property '{0}' of directive '{1}' is invalid",restrict,name);return restrict||"EA"}var hasDirectives={},Suffix="Directive",COMMENT_DIRECTIVE_REGEXP=/^\s*directive:\s*([\w-]+)\s+(.*)$/,CLASS_DIRECTIVE_REGEXP=/(([\w-]+)(?::([^;]+))?;?)/,ALL_OR_NOTHING_ATTRS=makeMap("ngSrc,ngSrcset,src,srcset"),REQUIRE_PREFIX_REGEXP=/^(?:(\^\^?)?(\?)?(\^\^?)?)?/,EVENT_HANDLER_ATTR_REGEXP=/^(on[a-z]+|formaction)$/,bindingCache=createMap();this.directive=function registerDirective(name,directiveFactory){return assertArg(name,"name"),assertNotHasOwnProperty(name,"directive"),isString(name)?(assertValidDirectiveName(name),assertArg(directiveFactory,"directiveFactory"),hasDirectives.hasOwnProperty(name)||(hasDirectives[name]=[],$provide.factory(name+Suffix,["$injector","$exceptionHandler",function($injector,$exceptionHandler){var directives=[];return forEach(hasDirectives[name],function(directiveFactory,index){try{var directive=$injector.invoke(directiveFactory);isFunction(directive)?directive={compile:valueFn(directive)}:!directive.compile&&directive.link&&(directive.compile=valueFn(directive.link)),directive.priority=directive.priority||0,directive.index=index,directive.name=directive.name||name,directive.require=getDirectiveRequire(directive),directive.restrict=getDirectiveRestrict(directive.restrict,name),directive.$$moduleName=directiveFactory.$$moduleName,directives.push(directive)}catch(e){$exceptionHandler(e)}}),directives}])),hasDirectives[name].push(directiveFactory)):forEach(name,reverseParams(registerDirective)),this},this.component=function(name,options){function factory($injector){function makeInjectable(fn){return isFunction(fn)||isArray(fn)?function(tElement,tAttrs){return $injector.invoke(fn,this,{$element:tElement,$attrs:tAttrs})}:fn}var template=options.template||options.templateUrl?options.template:"",ddo={controller:controller,controllerAs:identifierForController(options.controller)||options.controllerAs||"$ctrl",template:makeInjectable(template),templateUrl:makeInjectable(options.templateUrl),transclude:options.transclude,scope:{},bindToController:options.bindings||{},restrict:"E",require:options.require};return forEach(options,function(val,key){"$"===key.charAt(0)&&(ddo[key]=val)}),ddo}var controller=options.controller||function(){};return forEach(options,function(val,key){"$"===key.charAt(0)&&(factory[key]=val,isFunction(controller)&&(controller[key]=val))}),factory.$inject=["$injector"],this.directive(name,factory)},this.aHrefSanitizationWhitelist=function(regexp){return isDefined(regexp)?($$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp),this):$$sanitizeUriProvider.aHrefSanitizationWhitelist()},this.imgSrcSanitizationWhitelist=function(regexp){return isDefined(regexp)?($$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp),this):$$sanitizeUriProvider.imgSrcSanitizationWhitelist()};var debugInfoEnabled=!0;this.debugInfoEnabled=function(enabled){return isDefined(enabled)?(debugInfoEnabled=enabled,this):debugInfoEnabled};var preAssignBindingsEnabled=!1;this.preAssignBindingsEnabled=function(enabled){return isDefined(enabled)?(preAssignBindingsEnabled=enabled,this):preAssignBindingsEnabled};var TTL=10;this.onChangesTtl=function(value){return arguments.length?(TTL=value,this):TTL};var commentDirectivesEnabledConfig=!0;this.commentDirectivesEnabled=function(value){return arguments.length?(commentDirectivesEnabledConfig=value,this):commentDirectivesEnabledConfig};var cssClassDirectivesEnabledConfig=!0;this.cssClassDirectivesEnabled=function(value){return arguments.length?(cssClassDirectivesEnabledConfig=value,this):cssClassDirectivesEnabledConfig},this.$get=["$injector","$interpolate","$exceptionHandler","$templateRequest","$parse","$controller","$rootScope","$sce","$animate","$$sanitizeUri",function($injector,$interpolate,$exceptionHandler,$templateRequest,$parse,$controller,$rootScope,$sce,$animate,$$sanitizeUri){function flushOnChangesQueue(){try{if(!--onChangesTtl)throw onChangesQueue=void 0,$compileMinErr("infchng","{0} $onChanges() iterations reached. Aborting!\n",TTL);$rootScope.$apply(function(){for(var errors=[],i=0,ii=onChangesQueue.length;i<ii;++i)try{onChangesQueue[i]()}catch(e){errors.push(e)}if(onChangesQueue=void 0,errors.length)throw errors})}finally{onChangesTtl++}}function Attributes(element,attributesToCopy){if(attributesToCopy){var i,l,key,keys=Object.keys(attributesToCopy);for(i=0,l=keys.length;i<l;i++)key=keys[i],this[key]=attributesToCopy[key]}else this.$attr={};this.$$element=element}function setSpecialAttr(element,attrName,value){specialAttrHolder.innerHTML="<span "+attrName+">";var attributes=specialAttrHolder.firstChild.attributes,attribute=attributes[0];attributes.removeNamedItem(attribute.name),attribute.value=value,element.attributes.setNamedItem(attribute)}function safeAddClass($element,className){try{$element.addClass(className)}catch(e){}}function compile($compileNodes,transcludeFn,maxPriority,ignoreDirective,previousCompileContext){$compileNodes instanceof jqLite||($compileNodes=jqLite($compileNodes));var compositeLinkFn=compileNodes($compileNodes,transcludeFn,$compileNodes,maxPriority,ignoreDirective,previousCompileContext);compile.$$addScopeClass($compileNodes);var namespace=null;return function(scope,cloneConnectFn,options){if(!$compileNodes)throw $compileMinErr("multilink","This element has already been linked.");assertArg(scope,"scope"),previousCompileContext&&previousCompileContext.needsNewScope&&(scope=scope.$parent.$new()),options=options||{};var parentBoundTranscludeFn=options.parentBoundTranscludeFn,transcludeControllers=options.transcludeControllers,futureParentElement=options.futureParentElement;parentBoundTranscludeFn&&parentBoundTranscludeFn.$$boundTransclude&&(parentBoundTranscludeFn=parentBoundTranscludeFn.$$boundTransclude),namespace||(namespace=detectNamespaceForChildElements(futureParentElement));var $linkNode;if($linkNode="html"!==namespace?jqLite(wrapTemplate(namespace,jqLite("<div>").append($compileNodes).html())):cloneConnectFn?JQLitePrototype.clone.call($compileNodes):$compileNodes,transcludeControllers)for(var controllerName in transcludeControllers)$linkNode.data("$"+controllerName+"Controller",transcludeControllers[controllerName].instance);return compile.$$addScopeInfo($linkNode,scope),cloneConnectFn&&cloneConnectFn($linkNode,scope),compositeLinkFn&&compositeLinkFn(scope,$linkNode,$linkNode,parentBoundTranscludeFn),cloneConnectFn||($compileNodes=compositeLinkFn=null),$linkNode}}function detectNamespaceForChildElements(parentElement){var node=parentElement&&parentElement[0];return node&&"foreignobject"!==nodeName_(node)&&toString.call(node).match(/SVG/)?"svg":"html"}function compileNodes(nodeList,transcludeFn,$rootElement,maxPriority,ignoreDirective,previousCompileContext){function compositeLinkFn(scope,nodeList,$rootElement,parentBoundTranscludeFn){var nodeLinkFn,childLinkFn,node,childScope,i,ii,idx,childBoundTranscludeFn,stableNodeList;if(nodeLinkFnFound){var nodeListLength=nodeList.length;for(stableNodeList=new Array(nodeListLength),i=0;i<linkFns.length;i+=3)idx=linkFns[i],stableNodeList[idx]=nodeList[idx]}else stableNodeList=nodeList;for(i=0,ii=linkFns.length;i<ii;)node=stableNodeList[linkFns[i++]],nodeLinkFn=linkFns[i++],childLinkFn=linkFns[i++],nodeLinkFn?(nodeLinkFn.scope?(childScope=scope.$new(),compile.$$addScopeInfo(jqLite(node),childScope)):childScope=scope,childBoundTranscludeFn=nodeLinkFn.transcludeOnThisElement?createBoundTranscludeFn(scope,nodeLinkFn.transclude,parentBoundTranscludeFn):!nodeLinkFn.templateOnThisElement&&parentBoundTranscludeFn?parentBoundTranscludeFn:!parentBoundTranscludeFn&&transcludeFn?createBoundTranscludeFn(scope,transcludeFn):null,nodeLinkFn(childLinkFn,childScope,node,$rootElement,childBoundTranscludeFn)):childLinkFn&&childLinkFn(scope,node.childNodes,void 0,parentBoundTranscludeFn)}for(var attrs,directives,nodeLinkFn,childNodes,childLinkFn,linkFnFound,nodeLinkFnFound,linkFns=[],notLiveList=isArray(nodeList)||nodeList instanceof jqLite,i=0;i<nodeList.length;i++)attrs=new Attributes,11===msie&&mergeConsecutiveTextNodes(nodeList,i,notLiveList),directives=collectDirectives(nodeList[i],[],attrs,0===i?maxPriority:void 0,ignoreDirective),nodeLinkFn=directives.length?applyDirectivesToNode(directives,nodeList[i],attrs,transcludeFn,$rootElement,null,[],[],previousCompileContext):null,nodeLinkFn&&nodeLinkFn.scope&&compile.$$addScopeClass(attrs.$$element),childLinkFn=nodeLinkFn&&nodeLinkFn.terminal||!(childNodes=nodeList[i].childNodes)||!childNodes.length?null:compileNodes(childNodes,nodeLinkFn?(nodeLinkFn.transcludeOnThisElement||!nodeLinkFn.templateOnThisElement)&&nodeLinkFn.transclude:transcludeFn),(nodeLinkFn||childLinkFn)&&(linkFns.push(i,nodeLinkFn,childLinkFn),linkFnFound=!0,nodeLinkFnFound=nodeLinkFnFound||nodeLinkFn),previousCompileContext=null;return linkFnFound?compositeLinkFn:null}function mergeConsecutiveTextNodes(nodeList,idx,notLiveList){var sibling,node=nodeList[idx],parent=node.parentNode;if(node.nodeType===NODE_TYPE_TEXT)for(;;){if(sibling=parent?node.nextSibling:nodeList[idx+1],!sibling||sibling.nodeType!==NODE_TYPE_TEXT)break;node.nodeValue=node.nodeValue+sibling.nodeValue,sibling.parentNode&&sibling.parentNode.removeChild(sibling),notLiveList&&sibling===nodeList[idx+1]&&nodeList.splice(idx+1,1)}}function createBoundTranscludeFn(scope,transcludeFn,previousBoundTranscludeFn){function boundTranscludeFn(transcludedScope,cloneFn,controllers,futureParentElement,containingScope){return transcludedScope||(transcludedScope=scope.$new(!1,containingScope),transcludedScope.$$transcluded=!0),transcludeFn(transcludedScope,cloneFn,{parentBoundTranscludeFn:previousBoundTranscludeFn,transcludeControllers:controllers,futureParentElement:futureParentElement})}var boundSlots=boundTranscludeFn.$$slots=createMap();for(var slotName in transcludeFn.$$slots)transcludeFn.$$slots[slotName]?boundSlots[slotName]=createBoundTranscludeFn(scope,transcludeFn.$$slots[slotName],previousBoundTranscludeFn):boundSlots[slotName]=null;return boundTranscludeFn}function collectDirectives(node,directives,attrs,maxPriority,ignoreDirective){var match,nodeName,className,nodeType=node.nodeType,attrsMap=attrs.$attr;switch(nodeType){case NODE_TYPE_ELEMENT:nodeName=nodeName_(node),addDirective(directives,directiveNormalize(nodeName),"E",maxPriority,ignoreDirective);for(var attr,name,nName,ngAttrName,value,isNgAttr,nAttrs=node.attributes,j=0,jj=nAttrs&&nAttrs.length;j<jj;j++){var attrStartName=!1,attrEndName=!1;attr=nAttrs[j],name=attr.name,value=attr.value,ngAttrName=directiveNormalize(name),isNgAttr=NG_ATTR_BINDING.test(ngAttrName),isNgAttr&&(name=name.replace(PREFIX_REGEXP,"").substr(8).replace(/_(.)/g,function(match,letter){return letter.toUpperCase()}));var multiElementMatch=ngAttrName.match(MULTI_ELEMENT_DIR_RE);multiElementMatch&&directiveIsMultiElement(multiElementMatch[1])&&(attrStartName=name,attrEndName=name.substr(0,name.length-5)+"end",name=name.substr(0,name.length-6)),nName=directiveNormalize(name.toLowerCase()),attrsMap[nName]=name,!isNgAttr&&attrs.hasOwnProperty(nName)||(attrs[nName]=value,getBooleanAttrName(node,nName)&&(attrs[nName]=!0)),addAttrInterpolateDirective(node,directives,value,nName,isNgAttr),addDirective(directives,nName,"A",maxPriority,ignoreDirective,attrStartName,attrEndName)}if("input"===nodeName&&"hidden"===node.getAttribute("type")&&node.setAttribute("autocomplete","off"),!cssClassDirectivesEnabled)break;if(className=node.className,isObject(className)&&(className=className.animVal),isString(className)&&""!==className)for(;match=CLASS_DIRECTIVE_REGEXP.exec(className);)nName=directiveNormalize(match[2]),addDirective(directives,nName,"C",maxPriority,ignoreDirective)&&(attrs[nName]=trim(match[3])),className=className.substr(match.index+match[0].length);break;case NODE_TYPE_TEXT:addTextInterpolateDirective(directives,node.nodeValue);break;case NODE_TYPE_COMMENT:if(!commentDirectivesEnabled)break;collectCommentDirectives(node,directives,attrs,maxPriority,ignoreDirective)}return directives.sort(byPriority),directives}function collectCommentDirectives(node,directives,attrs,maxPriority,ignoreDirective){try{var match=COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue);if(match){var nName=directiveNormalize(match[1]);addDirective(directives,nName,"M",maxPriority,ignoreDirective)&&(attrs[nName]=trim(match[2]))}}catch(e){}}function groupScan(node,attrStart,attrEnd){var nodes=[],depth=0;if(attrStart&&node.hasAttribute&&node.hasAttribute(attrStart)){do{if(!node)throw $compileMinErr("uterdir","Unterminated attribute, found '{0}' but no matching '{1}' found.",attrStart,attrEnd);node.nodeType===NODE_TYPE_ELEMENT&&(node.hasAttribute(attrStart)&&depth++,node.hasAttribute(attrEnd)&&depth--),nodes.push(node),node=node.nextSibling}while(depth>0)}else nodes.push(node);return jqLite(nodes)}function groupElementsLinkFnWrapper(linkFn,attrStart,attrEnd){return function(scope,element,attrs,controllers,transcludeFn){return element=groupScan(element[0],attrStart,attrEnd),linkFn(scope,element,attrs,controllers,transcludeFn)}}function compilationGenerator(eager,$compileNodes,transcludeFn,maxPriority,ignoreDirective,previousCompileContext){var compiled;return eager?compile($compileNodes,transcludeFn,maxPriority,ignoreDirective,previousCompileContext):function(){return compiled||(compiled=compile($compileNodes,transcludeFn,maxPriority,ignoreDirective,previousCompileContext),$compileNodes=transcludeFn=previousCompileContext=null),compiled.apply(this,arguments)}}function applyDirectivesToNode(directives,compileNode,templateAttrs,transcludeFn,jqCollection,originalReplaceDirective,preLinkFns,postLinkFns,previousCompileContext){function addLinkFns(pre,post,attrStart,attrEnd){pre&&(attrStart&&(pre=groupElementsLinkFnWrapper(pre,attrStart,attrEnd)),pre.require=directive.require,pre.directiveName=directiveName,(newIsolateScopeDirective===directive||directive.$$isolateScope)&&(pre=cloneAndAnnotateFn(pre,{isolateScope:!0})),preLinkFns.push(pre)),post&&(attrStart&&(post=groupElementsLinkFnWrapper(post,attrStart,attrEnd)),post.require=directive.require,post.directiveName=directiveName,(newIsolateScopeDirective===directive||directive.$$isolateScope)&&(post=cloneAndAnnotateFn(post,{isolateScope:!0})),postLinkFns.push(post))}function nodeLinkFn(childLinkFn,scope,linkNode,$rootElement,boundTranscludeFn){function controllersBoundTransclude(scope,cloneAttachFn,futureParentElement,slotName){
var transcludeControllers;if(isScope(scope)||(slotName=futureParentElement,futureParentElement=cloneAttachFn,cloneAttachFn=scope,scope=void 0),hasElementTranscludeDirective&&(transcludeControllers=elementControllers),futureParentElement||(futureParentElement=hasElementTranscludeDirective?$element.parent():$element),!slotName)return boundTranscludeFn(scope,cloneAttachFn,transcludeControllers,futureParentElement,scopeToChild);var slotTranscludeFn=boundTranscludeFn.$$slots[slotName];if(slotTranscludeFn)return slotTranscludeFn(scope,cloneAttachFn,transcludeControllers,futureParentElement,scopeToChild);if(isUndefined(slotTranscludeFn))throw $compileMinErr("noslot",'No parent directive that requires a transclusion with slot name "{0}". Element: {1}',slotName,startingTag($element))}var i,ii,linkFn,isolateScope,controllerScope,elementControllers,transcludeFn,$element,attrs,scopeBindingInfo;compileNode===linkNode?(attrs=templateAttrs,$element=templateAttrs.$$element):($element=jqLite(linkNode),attrs=new Attributes($element,templateAttrs)),controllerScope=scope,newIsolateScopeDirective?isolateScope=scope.$new(!0):newScopeDirective&&(controllerScope=scope.$parent),boundTranscludeFn&&(transcludeFn=controllersBoundTransclude,transcludeFn.$$boundTransclude=boundTranscludeFn,transcludeFn.isSlotFilled=function(slotName){return!!boundTranscludeFn.$$slots[slotName]}),controllerDirectives&&(elementControllers=setupControllers($element,attrs,transcludeFn,controllerDirectives,isolateScope,scope,newIsolateScopeDirective)),newIsolateScopeDirective&&(compile.$$addScopeInfo($element,isolateScope,!0,!(templateDirective&&(templateDirective===newIsolateScopeDirective||templateDirective===newIsolateScopeDirective.$$originalDirective))),compile.$$addScopeClass($element,!0),isolateScope.$$isolateBindings=newIsolateScopeDirective.$$isolateBindings,scopeBindingInfo=initializeDirectiveBindings(scope,attrs,isolateScope,isolateScope.$$isolateBindings,newIsolateScopeDirective),scopeBindingInfo.removeWatches&&isolateScope.$on("$destroy",scopeBindingInfo.removeWatches));for(var name in elementControllers){var controllerDirective=controllerDirectives[name],controller=elementControllers[name],bindings=controllerDirective.$$bindings.bindToController;if(preAssignBindingsEnabled){bindings?controller.bindingInfo=initializeDirectiveBindings(controllerScope,attrs,controller.instance,bindings,controllerDirective):controller.bindingInfo={};var controllerResult=controller();controllerResult!==controller.instance&&(controller.instance=controllerResult,$element.data("$"+controllerDirective.name+"Controller",controllerResult),controller.bindingInfo.removeWatches&&controller.bindingInfo.removeWatches(),controller.bindingInfo=initializeDirectiveBindings(controllerScope,attrs,controller.instance,bindings,controllerDirective))}else controller.instance=controller(),$element.data("$"+controllerDirective.name+"Controller",controller.instance),controller.bindingInfo=initializeDirectiveBindings(controllerScope,attrs,controller.instance,bindings,controllerDirective)}for(forEach(controllerDirectives,function(controllerDirective,name){var require=controllerDirective.require;controllerDirective.bindToController&&!isArray(require)&&isObject(require)&&extend(elementControllers[name].instance,getControllers(name,require,$element,elementControllers))}),forEach(elementControllers,function(controller){var controllerInstance=controller.instance;if(isFunction(controllerInstance.$onChanges))try{controllerInstance.$onChanges(controller.bindingInfo.initialChanges)}catch(e){$exceptionHandler(e)}if(isFunction(controllerInstance.$onInit))try{controllerInstance.$onInit()}catch(e){$exceptionHandler(e)}isFunction(controllerInstance.$doCheck)&&(controllerScope.$watch(function(){controllerInstance.$doCheck()}),controllerInstance.$doCheck()),isFunction(controllerInstance.$onDestroy)&&controllerScope.$on("$destroy",function(){controllerInstance.$onDestroy()})}),i=0,ii=preLinkFns.length;i<ii;i++)linkFn=preLinkFns[i],invokeLinkFn(linkFn,linkFn.isolateScope?isolateScope:scope,$element,attrs,linkFn.require&&getControllers(linkFn.directiveName,linkFn.require,$element,elementControllers),transcludeFn);var scopeToChild=scope;for(newIsolateScopeDirective&&(newIsolateScopeDirective.template||null===newIsolateScopeDirective.templateUrl)&&(scopeToChild=isolateScope),childLinkFn&&childLinkFn(scopeToChild,linkNode.childNodes,void 0,boundTranscludeFn),i=postLinkFns.length-1;i>=0;i--)linkFn=postLinkFns[i],invokeLinkFn(linkFn,linkFn.isolateScope?isolateScope:scope,$element,attrs,linkFn.require&&getControllers(linkFn.directiveName,linkFn.require,$element,elementControllers),transcludeFn);forEach(elementControllers,function(controller){var controllerInstance=controller.instance;isFunction(controllerInstance.$postLink)&&controllerInstance.$postLink()})}previousCompileContext=previousCompileContext||{};for(var directive,directiveName,$template,linkFn,directiveValue,terminalPriority=-Number.MAX_VALUE,newScopeDirective=previousCompileContext.newScopeDirective,controllerDirectives=previousCompileContext.controllerDirectives,newIsolateScopeDirective=previousCompileContext.newIsolateScopeDirective,templateDirective=previousCompileContext.templateDirective,nonTlbTranscludeDirective=previousCompileContext.nonTlbTranscludeDirective,hasTranscludeDirective=!1,hasTemplate=!1,hasElementTranscludeDirective=previousCompileContext.hasElementTranscludeDirective,$compileNode=templateAttrs.$$element=jqLite(compileNode),replaceDirective=originalReplaceDirective,childTranscludeFn=transcludeFn,didScanForMultipleTransclusion=!1,mightHaveMultipleTransclusionError=!1,i=0,ii=directives.length;i<ii;i++){directive=directives[i];var attrStart=directive.$$start,attrEnd=directive.$$end;if(attrStart&&($compileNode=groupScan(compileNode,attrStart,attrEnd)),$template=void 0,terminalPriority>directive.priority)break;if(directiveValue=directive.scope,directiveValue&&(directive.templateUrl||(isObject(directiveValue)?(assertNoDuplicate("new/isolated scope",newIsolateScopeDirective||newScopeDirective,directive,$compileNode),newIsolateScopeDirective=directive):assertNoDuplicate("new/isolated scope",newIsolateScopeDirective,directive,$compileNode)),newScopeDirective=newScopeDirective||directive),directiveName=directive.name,!didScanForMultipleTransclusion&&(directive.replace&&(directive.templateUrl||directive.template)||directive.transclude&&!directive.$$tlb)){for(var candidateDirective,scanningIndex=i+1;candidateDirective=directives[scanningIndex++];)if(candidateDirective.transclude&&!candidateDirective.$$tlb||candidateDirective.replace&&(candidateDirective.templateUrl||candidateDirective.template)){mightHaveMultipleTransclusionError=!0;break}didScanForMultipleTransclusion=!0}if(!directive.templateUrl&&directive.controller&&(controllerDirectives=controllerDirectives||createMap(),assertNoDuplicate("'"+directiveName+"' controller",controllerDirectives[directiveName],directive,$compileNode),controllerDirectives[directiveName]=directive),directiveValue=directive.transclude)if(hasTranscludeDirective=!0,directive.$$tlb||(assertNoDuplicate("transclusion",nonTlbTranscludeDirective,directive,$compileNode),nonTlbTranscludeDirective=directive),"element"===directiveValue)hasElementTranscludeDirective=!0,terminalPriority=directive.priority,$template=$compileNode,$compileNode=templateAttrs.$$element=jqLite(compile.$$createComment(directiveName,templateAttrs[directiveName])),compileNode=$compileNode[0],replaceWith(jqCollection,sliceArgs($template),compileNode),$template[0].$$parentNode=$template[0].parentNode,childTranscludeFn=compilationGenerator(mightHaveMultipleTransclusionError,$template,transcludeFn,terminalPriority,replaceDirective&&replaceDirective.name,{nonTlbTranscludeDirective:nonTlbTranscludeDirective});else{var slots=createMap();if(isObject(directiveValue)){$template=[];var slotMap=createMap(),filledSlots=createMap();forEach(directiveValue,function(elementSelector,slotName){var optional="?"===elementSelector.charAt(0);elementSelector=optional?elementSelector.substring(1):elementSelector,slotMap[elementSelector]=slotName,slots[slotName]=null,filledSlots[slotName]=optional}),forEach($compileNode.contents(),function(node){var slotName=slotMap[directiveNormalize(nodeName_(node))];slotName?(filledSlots[slotName]=!0,slots[slotName]=slots[slotName]||[],slots[slotName].push(node)):$template.push(node)}),forEach(filledSlots,function(filled,slotName){if(!filled)throw $compileMinErr("reqslot","Required transclusion slot `{0}` was not filled.",slotName)});for(var slotName in slots)slots[slotName]&&(slots[slotName]=compilationGenerator(mightHaveMultipleTransclusionError,slots[slotName],transcludeFn))}else $template=jqLite(jqLiteClone(compileNode)).contents();$compileNode.empty(),childTranscludeFn=compilationGenerator(mightHaveMultipleTransclusionError,$template,transcludeFn,void 0,void 0,{needsNewScope:directive.$$isolateScope||directive.$$newScope}),childTranscludeFn.$$slots=slots}if(directive.template)if(hasTemplate=!0,assertNoDuplicate("template",templateDirective,directive,$compileNode),templateDirective=directive,directiveValue=isFunction(directive.template)?directive.template($compileNode,templateAttrs):directive.template,directiveValue=denormalizeTemplate(directiveValue),directive.replace){if(replaceDirective=directive,$template=jqLiteIsTextNode(directiveValue)?[]:removeComments(wrapTemplate(directive.templateNamespace,trim(directiveValue))),compileNode=$template[0],1!==$template.length||compileNode.nodeType!==NODE_TYPE_ELEMENT)throw $compileMinErr("tplrt","Template for directive '{0}' must have exactly one root element. {1}",directiveName,"");replaceWith(jqCollection,$compileNode,compileNode);var newTemplateAttrs={$attr:{}},templateDirectives=collectDirectives(compileNode,[],newTemplateAttrs),unprocessedDirectives=directives.splice(i+1,directives.length-(i+1));(newIsolateScopeDirective||newScopeDirective)&&markDirectiveScope(templateDirectives,newIsolateScopeDirective,newScopeDirective),directives=directives.concat(templateDirectives).concat(unprocessedDirectives),mergeTemplateAttributes(templateAttrs,newTemplateAttrs),ii=directives.length}else $compileNode.html(directiveValue);if(directive.templateUrl)hasTemplate=!0,assertNoDuplicate("template",templateDirective,directive,$compileNode),templateDirective=directive,directive.replace&&(replaceDirective=directive),nodeLinkFn=compileTemplateUrl(directives.splice(i,directives.length-i),$compileNode,templateAttrs,jqCollection,hasTranscludeDirective&&childTranscludeFn,preLinkFns,postLinkFns,{controllerDirectives:controllerDirectives,newScopeDirective:newScopeDirective!==directive&&newScopeDirective,newIsolateScopeDirective:newIsolateScopeDirective,templateDirective:templateDirective,nonTlbTranscludeDirective:nonTlbTranscludeDirective}),ii=directives.length;else if(directive.compile)try{linkFn=directive.compile($compileNode,templateAttrs,childTranscludeFn);var context=directive.$$originalDirective||directive;isFunction(linkFn)?addLinkFns(null,bind(context,linkFn),attrStart,attrEnd):linkFn&&addLinkFns(bind(context,linkFn.pre),bind(context,linkFn.post),attrStart,attrEnd)}catch(e){$exceptionHandler(e,startingTag($compileNode))}directive.terminal&&(nodeLinkFn.terminal=!0,terminalPriority=Math.max(terminalPriority,directive.priority))}return nodeLinkFn.scope=newScopeDirective&&newScopeDirective.scope===!0,nodeLinkFn.transcludeOnThisElement=hasTranscludeDirective,nodeLinkFn.templateOnThisElement=hasTemplate,nodeLinkFn.transclude=childTranscludeFn,previousCompileContext.hasElementTranscludeDirective=hasElementTranscludeDirective,nodeLinkFn}function getControllers(directiveName,require,$element,elementControllers){var value;if(isString(require)){var match=require.match(REQUIRE_PREFIX_REGEXP),name=require.substring(match[0].length),inheritType=match[1]||match[3],optional="?"===match[2];if("^^"===inheritType?$element=$element.parent():(value=elementControllers&&elementControllers[name],value=value&&value.instance),!value){var dataName="$"+name+"Controller";value=inheritType?$element.inheritedData(dataName):$element.data(dataName)}if(!value&&!optional)throw $compileMinErr("ctreq","Controller '{0}', required by directive '{1}', can't be found!",name,directiveName)}else if(isArray(require)){value=[];for(var i=0,ii=require.length;i<ii;i++)value[i]=getControllers(directiveName,require[i],$element,elementControllers)}else isObject(require)&&(value={},forEach(require,function(controller,property){value[property]=getControllers(directiveName,controller,$element,elementControllers)}));return value||null}function setupControllers($element,attrs,transcludeFn,controllerDirectives,isolateScope,scope,newIsolateScopeDirective){var elementControllers=createMap();for(var controllerKey in controllerDirectives){var directive=controllerDirectives[controllerKey],locals={$scope:directive===newIsolateScopeDirective||directive.$$isolateScope?isolateScope:scope,$element:$element,$attrs:attrs,$transclude:transcludeFn},controller=directive.controller;"@"===controller&&(controller=attrs[directive.name]);var controllerInstance=$controller(controller,locals,!0,directive.controllerAs);elementControllers[directive.name]=controllerInstance,$element.data("$"+directive.name+"Controller",controllerInstance.instance)}return elementControllers}function markDirectiveScope(directives,isolateScope,newScope){for(var j=0,jj=directives.length;j<jj;j++)directives[j]=inherit(directives[j],{$$isolateScope:isolateScope,$$newScope:newScope})}function addDirective(tDirectives,name,location,maxPriority,ignoreDirective,startAttrName,endAttrName){if(name===ignoreDirective)return null;var match=null;if(hasDirectives.hasOwnProperty(name))for(var directive,directives=$injector.get(name+Suffix),i=0,ii=directives.length;i<ii;i++)if(directive=directives[i],(isUndefined(maxPriority)||maxPriority>directive.priority)&&directive.restrict.indexOf(location)!==-1){if(startAttrName&&(directive=inherit(directive,{$$start:startAttrName,$$end:endAttrName})),!directive.$$bindings){var bindings=directive.$$bindings=parseDirectiveBindings(directive,directive.name);isObject(bindings.isolateScope)&&(directive.$$isolateBindings=bindings.isolateScope)}tDirectives.push(directive),match=directive}return match}function directiveIsMultiElement(name){if(hasDirectives.hasOwnProperty(name))for(var directive,directives=$injector.get(name+Suffix),i=0,ii=directives.length;i<ii;i++)if(directive=directives[i],directive.multiElement)return!0;return!1}function mergeTemplateAttributes(dst,src){var srcAttr=src.$attr,dstAttr=dst.$attr;forEach(dst,function(value,key){"$"!==key.charAt(0)&&(src[key]&&src[key]!==value&&(value.length?value+=("style"===key?";":" ")+src[key]:value=src[key]),dst.$set(key,value,!0,srcAttr[key]))}),forEach(src,function(value,key){dst.hasOwnProperty(key)||"$"===key.charAt(0)||(dst[key]=value,"class"!==key&&"style"!==key&&(dstAttr[key]=srcAttr[key]))})}function compileTemplateUrl(directives,$compileNode,tAttrs,$rootElement,childTranscludeFn,preLinkFns,postLinkFns,previousCompileContext){var afterTemplateNodeLinkFn,afterTemplateChildLinkFn,linkQueue=[],beforeTemplateCompileNode=$compileNode[0],origAsyncDirective=directives.shift(),derivedSyncDirective=inherit(origAsyncDirective,{templateUrl:null,transclude:null,replace:null,$$originalDirective:origAsyncDirective}),templateUrl=isFunction(origAsyncDirective.templateUrl)?origAsyncDirective.templateUrl($compileNode,tAttrs):origAsyncDirective.templateUrl,templateNamespace=origAsyncDirective.templateNamespace;return $compileNode.empty(),$templateRequest(templateUrl).then(function(content){var compileNode,tempTemplateAttrs,$template,childBoundTranscludeFn;if(content=denormalizeTemplate(content),origAsyncDirective.replace){if($template=jqLiteIsTextNode(content)?[]:removeComments(wrapTemplate(templateNamespace,trim(content))),compileNode=$template[0],1!==$template.length||compileNode.nodeType!==NODE_TYPE_ELEMENT)throw $compileMinErr("tplrt","Template for directive '{0}' must have exactly one root element. {1}",origAsyncDirective.name,templateUrl);tempTemplateAttrs={$attr:{}},replaceWith($rootElement,$compileNode,compileNode);var templateDirectives=collectDirectives(compileNode,[],tempTemplateAttrs);isObject(origAsyncDirective.scope)&&markDirectiveScope(templateDirectives,!0),directives=templateDirectives.concat(directives),mergeTemplateAttributes(tAttrs,tempTemplateAttrs)}else compileNode=beforeTemplateCompileNode,$compileNode.html(content);for(directives.unshift(derivedSyncDirective),afterTemplateNodeLinkFn=applyDirectivesToNode(directives,compileNode,tAttrs,childTranscludeFn,$compileNode,origAsyncDirective,preLinkFns,postLinkFns,previousCompileContext),forEach($rootElement,function(node,i){node===compileNode&&($rootElement[i]=$compileNode[0])}),afterTemplateChildLinkFn=compileNodes($compileNode[0].childNodes,childTranscludeFn);linkQueue.length;){var scope=linkQueue.shift(),beforeTemplateLinkNode=linkQueue.shift(),linkRootElement=linkQueue.shift(),boundTranscludeFn=linkQueue.shift(),linkNode=$compileNode[0];if(!scope.$$destroyed){if(beforeTemplateLinkNode!==beforeTemplateCompileNode){var oldClasses=beforeTemplateLinkNode.className;previousCompileContext.hasElementTranscludeDirective&&origAsyncDirective.replace||(linkNode=jqLiteClone(compileNode)),replaceWith(linkRootElement,jqLite(beforeTemplateLinkNode),linkNode),safeAddClass(jqLite(linkNode),oldClasses)}childBoundTranscludeFn=afterTemplateNodeLinkFn.transcludeOnThisElement?createBoundTranscludeFn(scope,afterTemplateNodeLinkFn.transclude,boundTranscludeFn):boundTranscludeFn,afterTemplateNodeLinkFn(afterTemplateChildLinkFn,scope,linkNode,$rootElement,childBoundTranscludeFn)}}linkQueue=null})["catch"](function(error){error instanceof Error&&$exceptionHandler(error)}),function(ignoreChildLinkFn,scope,node,rootElement,boundTranscludeFn){var childBoundTranscludeFn=boundTranscludeFn;scope.$$destroyed||(linkQueue?linkQueue.push(scope,node,rootElement,childBoundTranscludeFn):(afterTemplateNodeLinkFn.transcludeOnThisElement&&(childBoundTranscludeFn=createBoundTranscludeFn(scope,afterTemplateNodeLinkFn.transclude,boundTranscludeFn)),afterTemplateNodeLinkFn(afterTemplateChildLinkFn,scope,node,rootElement,childBoundTranscludeFn)))}}function byPriority(a,b){var diff=b.priority-a.priority;return 0!==diff?diff:a.name!==b.name?a.name<b.name?-1:1:a.index-b.index}function assertNoDuplicate(what,previousDirective,directive,element){function wrapModuleNameIfDefined(moduleName){return moduleName?" (module: "+moduleName+")":""}if(previousDirective)throw $compileMinErr("multidir","Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}",previousDirective.name,wrapModuleNameIfDefined(previousDirective.$$moduleName),directive.name,wrapModuleNameIfDefined(directive.$$moduleName),what,startingTag(element))}function addTextInterpolateDirective(directives,text){var interpolateFn=$interpolate(text,!0);interpolateFn&&directives.push({priority:0,compile:function(templateNode){var templateNodeParent=templateNode.parent(),hasCompileParent=!!templateNodeParent.length;return hasCompileParent&&compile.$$addBindingClass(templateNodeParent),function(scope,node){var parent=node.parent();hasCompileParent||compile.$$addBindingClass(parent),compile.$$addBindingInfo(parent,interpolateFn.expressions),scope.$watch(interpolateFn,function(value){node[0].nodeValue=value})}}})}function wrapTemplate(type,template){switch(type=lowercase(type||"html")){case"svg":case"math":var wrapper=window.document.createElement("div");return wrapper.innerHTML="<"+type+">"+template+"</"+type+">",wrapper.childNodes[0].childNodes;default:return template}}function getTrustedContext(node,attrNormalizedName){if("srcdoc"===attrNormalizedName)return $sce.HTML;var tag=nodeName_(node);if("src"===attrNormalizedName||"ngSrc"===attrNormalizedName){if(["img","video","audio","source","track"].indexOf(tag)===-1)return $sce.RESOURCE_URL}else if("xlinkHref"===attrNormalizedName||"form"===tag&&"action"===attrNormalizedName||"link"===tag&&"href"===attrNormalizedName)return $sce.RESOURCE_URL}function addAttrInterpolateDirective(node,directives,value,name,isNgAttr){var trustedContext=getTrustedContext(node,name),mustHaveExpression=!isNgAttr,allOrNothing=ALL_OR_NOTHING_ATTRS[name]||isNgAttr,interpolateFn=$interpolate(value,mustHaveExpression,trustedContext,allOrNothing);if(interpolateFn){if("multiple"===name&&"select"===nodeName_(node))throw $compileMinErr("selmulti","Binding to the 'multiple' attribute is not supported. Element: {0}",startingTag(node));if(EVENT_HANDLER_ATTR_REGEXP.test(name))throw $compileMinErr("nodomevents","Interpolations for HTML DOM event attributes are disallowed.  Please use the ng- versions (such as ng-click instead of onclick) instead.");directives.push({priority:100,compile:function(){return{pre:function(scope,element,attr){var $$observers=attr.$$observers||(attr.$$observers=createMap()),newValue=attr[name];newValue!==value&&(interpolateFn=newValue&&$interpolate(newValue,!0,trustedContext,allOrNothing),value=newValue),interpolateFn&&(attr[name]=interpolateFn(scope),($$observers[name]||($$observers[name]=[])).$$inter=!0,(attr.$$observers&&attr.$$observers[name].$$scope||scope).$watch(interpolateFn,function(newValue,oldValue){"class"===name&&newValue!==oldValue?attr.$updateClass(newValue,oldValue):attr.$set(name,newValue)}))}}}})}}function replaceWith($rootElement,elementsToRemove,newNode){var i,ii,firstElementToRemove=elementsToRemove[0],removeCount=elementsToRemove.length,parent=firstElementToRemove.parentNode;if($rootElement)for(i=0,ii=$rootElement.length;i<ii;i++)if($rootElement[i]===firstElementToRemove){$rootElement[i++]=newNode;for(var j=i,j2=j+removeCount-1,jj=$rootElement.length;j<jj;j++,j2++)j2<jj?$rootElement[j]=$rootElement[j2]:delete $rootElement[j];$rootElement.length-=removeCount-1,$rootElement.context===firstElementToRemove&&($rootElement.context=newNode);break}parent&&parent.replaceChild(newNode,firstElementToRemove);var fragment=window.document.createDocumentFragment();for(i=0;i<removeCount;i++)fragment.appendChild(elementsToRemove[i]);for(jqLite.hasData(firstElementToRemove)&&(jqLite.data(newNode,jqLite.data(firstElementToRemove)),jqLite(firstElementToRemove).off("$destroy")),jqLite.cleanData(fragment.querySelectorAll("*")),i=1;i<removeCount;i++)delete elementsToRemove[i];elementsToRemove[0]=newNode,elementsToRemove.length=1}function cloneAndAnnotateFn(fn,annotation){return extend(function(){return fn.apply(null,arguments)},fn,annotation)}function invokeLinkFn(linkFn,scope,$element,attrs,controllers,transcludeFn){try{linkFn(scope,$element,attrs,controllers,transcludeFn)}catch(e){$exceptionHandler(e,startingTag($element))}}function initializeDirectiveBindings(scope,attrs,destination,bindings,directive){function recordChanges(key,currentValue,previousValue){!isFunction(destination.$onChanges)||currentValue===previousValue||currentValue!==currentValue&&previousValue!==previousValue||(onChangesQueue||(scope.$$postDigest(flushOnChangesQueue),onChangesQueue=[]),changes||(changes={},onChangesQueue.push(triggerOnChangesHook)),changes[key]&&(previousValue=changes[key].previousValue),changes[key]=new SimpleChange(previousValue,currentValue))}function triggerOnChangesHook(){destination.$onChanges(changes),changes=void 0}var changes,removeWatchCollection=[],initialChanges={};return forEach(bindings,function(definition,scopeName){var lastValue,parentGet,parentSet,compare,removeWatch,attrName=definition.attrName,optional=definition.optional,mode=definition.mode;switch(mode){case"@":optional||hasOwnProperty.call(attrs,attrName)||(destination[scopeName]=attrs[attrName]=void 0),removeWatch=attrs.$observe(attrName,function(value){if(isString(value)||isBoolean(value)){var oldValue=destination[scopeName];recordChanges(scopeName,value,oldValue),destination[scopeName]=value}}),attrs.$$observers[attrName].$$scope=scope,lastValue=attrs[attrName],isString(lastValue)?destination[scopeName]=$interpolate(lastValue)(scope):isBoolean(lastValue)&&(destination[scopeName]=lastValue),initialChanges[scopeName]=new SimpleChange(_UNINITIALIZED_VALUE,destination[scopeName]),removeWatchCollection.push(removeWatch);break;case"=":if(!hasOwnProperty.call(attrs,attrName)){if(optional)break;attrs[attrName]=void 0}if(optional&&!attrs[attrName])break;parentGet=$parse(attrs[attrName]),compare=parentGet.literal?equals:function(a,b){return a===b||a!==a&&b!==b},parentSet=parentGet.assign||function(){throw lastValue=destination[scopeName]=parentGet(scope),$compileMinErr("nonassign","Expression '{0}' in attribute '{1}' used with directive '{2}' is non-assignable!",attrs[attrName],attrName,directive.name)},lastValue=destination[scopeName]=parentGet(scope);var parentValueWatch=function(parentValue){return compare(parentValue,destination[scopeName])||(compare(parentValue,lastValue)?parentSet(scope,parentValue=destination[scopeName]):destination[scopeName]=parentValue),lastValue=parentValue};parentValueWatch.$stateful=!0,removeWatch=definition.collection?scope.$watchCollection(attrs[attrName],parentValueWatch):scope.$watch($parse(attrs[attrName],parentValueWatch),null,parentGet.literal),removeWatchCollection.push(removeWatch);break;case"<":if(!hasOwnProperty.call(attrs,attrName)){if(optional)break;attrs[attrName]=void 0}if(optional&&!attrs[attrName])break;parentGet=$parse(attrs[attrName]);var deepWatch=parentGet.literal,initialValue=destination[scopeName]=parentGet(scope);initialChanges[scopeName]=new SimpleChange(_UNINITIALIZED_VALUE,destination[scopeName]),removeWatch=scope.$watch(parentGet,function(newValue,oldValue){if(oldValue===newValue){if(oldValue===initialValue||deepWatch&&equals(oldValue,initialValue))return;oldValue=initialValue}recordChanges(scopeName,newValue,oldValue),destination[scopeName]=newValue},deepWatch),removeWatchCollection.push(removeWatch);break;case"&":if(parentGet=attrs.hasOwnProperty(attrName)?$parse(attrs[attrName]):noop,parentGet===noop&&optional)break;destination[scopeName]=function(locals){return parentGet(scope,locals)}}}),{initialChanges:initialChanges,removeWatches:removeWatchCollection.length&&function(){for(var i=0,ii=removeWatchCollection.length;i<ii;++i)removeWatchCollection[i]()}}}var onChangesQueue,SIMPLE_ATTR_NAME=/^\w/,specialAttrHolder=window.document.createElement("div"),commentDirectivesEnabled=commentDirectivesEnabledConfig,cssClassDirectivesEnabled=cssClassDirectivesEnabledConfig,onChangesTtl=TTL;Attributes.prototype={$normalize:directiveNormalize,$addClass:function(classVal){classVal&&classVal.length>0&&$animate.addClass(this.$$element,classVal)},$removeClass:function(classVal){classVal&&classVal.length>0&&$animate.removeClass(this.$$element,classVal)},$updateClass:function(newClasses,oldClasses){var toAdd=tokenDifference(newClasses,oldClasses);toAdd&&toAdd.length&&$animate.addClass(this.$$element,toAdd);var toRemove=tokenDifference(oldClasses,newClasses);toRemove&&toRemove.length&&$animate.removeClass(this.$$element,toRemove)},$set:function(key,value,writeAttr,attrName){var nodeName,node=this.$$element[0],booleanKey=getBooleanAttrName(node,key),aliasedKey=getAliasedAttrName(key),observer=key;if(booleanKey?(this.$$element.prop(key,value),attrName=booleanKey):aliasedKey&&(this[aliasedKey]=value,observer=aliasedKey),this[key]=value,attrName?this.$attr[key]=attrName:(attrName=this.$attr[key],attrName||(this.$attr[key]=attrName=snake_case(key,"-"))),nodeName=nodeName_(this.$$element),"a"===nodeName&&("href"===key||"xlinkHref"===key)||"img"===nodeName&&"src"===key)this[key]=value=$$sanitizeUri(value,"src"===key);else if("img"===nodeName&&"srcset"===key&&isDefined(value)){for(var result="",trimmedSrcset=trim(value),srcPattern=/(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/,pattern=/\s/.test(trimmedSrcset)?srcPattern:/(,)/,rawUris=trimmedSrcset.split(pattern),nbrUrisWith2parts=Math.floor(rawUris.length/2),i=0;i<nbrUrisWith2parts;i++){var innerIdx=2*i;result+=$$sanitizeUri(trim(rawUris[innerIdx]),!0),result+=" "+trim(rawUris[innerIdx+1])}var lastTuple=trim(rawUris[2*i]).split(/\s/);result+=$$sanitizeUri(trim(lastTuple[0]),!0),2===lastTuple.length&&(result+=" "+trim(lastTuple[1])),this[key]=value=result}writeAttr!==!1&&(null===value||isUndefined(value)?this.$$element.removeAttr(attrName):SIMPLE_ATTR_NAME.test(attrName)?this.$$element.attr(attrName,value):setSpecialAttr(this.$$element[0],attrName,value));var $$observers=this.$$observers;$$observers&&forEach($$observers[observer],function(fn){try{fn(value)}catch(e){$exceptionHandler(e)}})},$observe:function(key,fn){var attrs=this,$$observers=attrs.$$observers||(attrs.$$observers=createMap()),listeners=$$observers[key]||($$observers[key]=[]);return listeners.push(fn),$rootScope.$evalAsync(function(){listeners.$$inter||!attrs.hasOwnProperty(key)||isUndefined(attrs[key])||fn(attrs[key])}),function(){arrayRemove(listeners,fn)}}};var startSymbol=$interpolate.startSymbol(),endSymbol=$interpolate.endSymbol(),denormalizeTemplate="{{"===startSymbol&&"}}"===endSymbol?identity:function(template){return template.replace(/\{\{/g,startSymbol).replace(/}}/g,endSymbol)},NG_ATTR_BINDING=/^ngAttr[A-Z]/,MULTI_ELEMENT_DIR_RE=/^(.+)Start$/;return compile.$$addBindingInfo=debugInfoEnabled?function($element,binding){var bindings=$element.data("$binding")||[];isArray(binding)?bindings=bindings.concat(binding):bindings.push(binding),$element.data("$binding",bindings)}:noop,compile.$$addBindingClass=debugInfoEnabled?function($element){safeAddClass($element,"ng-binding")}:noop,compile.$$addScopeInfo=debugInfoEnabled?function($element,scope,isolated,noTemplate){var dataName=isolated?noTemplate?"$isolateScopeNoTemplate":"$isolateScope":"$scope";$element.data(dataName,scope)}:noop,compile.$$addScopeClass=debugInfoEnabled?function($element,isolated){safeAddClass($element,isolated?"ng-isolate-scope":"ng-scope")}:noop,compile.$$createComment=function(directiveName,comment){var content="";return debugInfoEnabled&&(content=" "+(directiveName||"")+": ",comment&&(content+=comment+" ")),window.document.createComment(content)},compile}]}function SimpleChange(previous,current){this.previousValue=previous,this.currentValue=current}function directiveNormalize(name){return name.replace(PREFIX_REGEXP,"").replace(SPECIAL_CHARS_REGEXP,fnCamelCaseReplace)}function tokenDifference(str1,str2){var values="",tokens1=str1.split(/\s+/),tokens2=str2.split(/\s+/);outer:for(var i=0;i<tokens1.length;i++){for(var token=tokens1[i],j=0;j<tokens2.length;j++)if(token===tokens2[j])continue outer;values+=(values.length>0?" ":"")+token}return values}function removeComments(jqNodes){jqNodes=jqLite(jqNodes);var i=jqNodes.length;if(i<=1)return jqNodes;for(;i--;){var node=jqNodes[i];(node.nodeType===NODE_TYPE_COMMENT||node.nodeType===NODE_TYPE_TEXT&&""===node.nodeValue.trim())&&splice.call(jqNodes,i,1)}return jqNodes}function identifierForController(controller,ident){if(ident&&isString(ident))return ident;if(isString(controller)){var match=CNTRL_REG.exec(controller);if(match)return match[3]}}function $ControllerProvider(){var controllers={},globals=!1;this.has=function(name){return controllers.hasOwnProperty(name)},this.register=function(name,constructor){assertNotHasOwnProperty(name,"controller"),isObject(name)?extend(controllers,name):controllers[name]=constructor},this.allowGlobals=function(){globals=!0},this.$get=["$injector","$window",function($injector,$window){function addIdentifier(locals,identifier,instance,name){if(!locals||!isObject(locals.$scope))throw minErr("$controller")("noscp","Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.",name,identifier);locals.$scope[identifier]=instance}return function(expression,locals,later,ident){var instance,match,constructor,identifier;if(later=later===!0,ident&&isString(ident)&&(identifier=ident),isString(expression)){if(match=expression.match(CNTRL_REG),!match)throw $controllerMinErr("ctrlfmt","Badly formed controller string '{0}'. Must match `__name__ as __id__` or `__name__`.",expression);
if(constructor=match[1],identifier=identifier||match[3],expression=controllers.hasOwnProperty(constructor)?controllers[constructor]:getter(locals.$scope,constructor,!0)||(globals?getter($window,constructor,!0):void 0),!expression)throw $controllerMinErr("ctrlreg","The controller with the name '{0}' is not registered.",constructor);assertArgFn(expression,constructor,!0)}if(later){var controllerPrototype=(isArray(expression)?expression[expression.length-1]:expression).prototype;return instance=Object.create(controllerPrototype||null),identifier&&addIdentifier(locals,identifier,instance,constructor||expression.name),extend(function(){var result=$injector.invoke(expression,instance,locals,constructor);return result!==instance&&(isObject(result)||isFunction(result))&&(instance=result,identifier&&addIdentifier(locals,identifier,instance,constructor||expression.name)),instance},{instance:instance,identifier:identifier})}return instance=$injector.instantiate(expression,locals,constructor),identifier&&addIdentifier(locals,identifier,instance,constructor||expression.name),instance}}]}function $DocumentProvider(){this.$get=["$window",function(window){return jqLite(window.document)}]}function $$IsDocumentHiddenProvider(){this.$get=["$document","$rootScope",function($document,$rootScope){function changeListener(){hidden=doc.hidden}var doc=$document[0],hidden=doc&&doc.hidden;return $document.on("visibilitychange",changeListener),$rootScope.$on("$destroy",function(){$document.off("visibilitychange",changeListener)}),function(){return hidden}}]}function $ExceptionHandlerProvider(){this.$get=["$log",function($log){return function(exception,cause){$log.error.apply($log,arguments)}}]}function serializeValue(v){return isObject(v)?isDate(v)?v.toISOString():toJson(v):v}function $HttpParamSerializerProvider(){this.$get=function(){return function(params){if(!params)return"";var parts=[];return forEachSorted(params,function(value,key){null===value||isUndefined(value)||(isArray(value)?forEach(value,function(v){parts.push(encodeUriQuery(key)+"="+encodeUriQuery(serializeValue(v)))}):parts.push(encodeUriQuery(key)+"="+encodeUriQuery(serializeValue(value))))}),parts.join("&")}}}function $HttpParamSerializerJQLikeProvider(){this.$get=function(){return function(params){function serialize(toSerialize,prefix,topLevel){null===toSerialize||isUndefined(toSerialize)||(isArray(toSerialize)?forEach(toSerialize,function(value,index){serialize(value,prefix+"["+(isObject(value)?index:"")+"]")}):isObject(toSerialize)&&!isDate(toSerialize)?forEachSorted(toSerialize,function(value,key){serialize(value,prefix+(topLevel?"":"[")+key+(topLevel?"":"]"))}):parts.push(encodeUriQuery(prefix)+"="+encodeUriQuery(serializeValue(toSerialize))))}if(!params)return"";var parts=[];return serialize(params,"",!0),parts.join("&")}}}function defaultHttpResponseTransform(data,headers){if(isString(data)){var tempData=data.replace(JSON_PROTECTION_PREFIX,"").trim();if(tempData){var contentType=headers("Content-Type");(contentType&&0===contentType.indexOf(APPLICATION_JSON)||isJsonLike(tempData))&&(data=fromJson(tempData))}}return data}function isJsonLike(str){var jsonStart=str.match(JSON_START);return jsonStart&&JSON_ENDS[jsonStart[0]].test(str)}function parseHeaders(headers){function fillInParsed(key,val){key&&(parsed[key]=parsed[key]?parsed[key]+", "+val:val)}var i,parsed=createMap();return isString(headers)?forEach(headers.split("\n"),function(line){i=line.indexOf(":"),fillInParsed(lowercase(trim(line.substr(0,i))),trim(line.substr(i+1)))}):isObject(headers)&&forEach(headers,function(headerVal,headerKey){fillInParsed(lowercase(headerKey),trim(headerVal))}),parsed}function headersGetter(headers){var headersObj;return function(name){if(headersObj||(headersObj=parseHeaders(headers)),name){var value=headersObj[lowercase(name)];return void 0===value&&(value=null),value}return headersObj}}function transformData(data,headers,status,fns){return isFunction(fns)?fns(data,headers,status):(forEach(fns,function(fn){data=fn(data,headers,status)}),data)}function isSuccess(status){return 200<=status&&status<300}function $HttpProvider(){var defaults=this.defaults={transformResponse:[defaultHttpResponseTransform],transformRequest:[function(d){return!isObject(d)||isFile(d)||isBlob(d)||isFormData(d)?d:toJson(d)}],headers:{common:{Accept:"application/json, text/plain, */*"},post:shallowCopy(CONTENT_TYPE_APPLICATION_JSON),put:shallowCopy(CONTENT_TYPE_APPLICATION_JSON),patch:shallowCopy(CONTENT_TYPE_APPLICATION_JSON)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer",jsonpCallbackParam:"callback"},useApplyAsync=!1;this.useApplyAsync=function(value){return isDefined(value)?(useApplyAsync=!!value,this):useApplyAsync};var interceptorFactories=this.interceptors=[];this.$get=["$browser","$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector","$sce",function($browser,$httpBackend,$$cookieReader,$cacheFactory,$rootScope,$q,$injector,$sce){function $http(requestConfig){function chainInterceptors(promise,interceptors){for(var i=0,ii=interceptors.length;i<ii;){var thenFn=interceptors[i++],rejectFn=interceptors[i++];promise=promise.then(thenFn,rejectFn)}return interceptors.length=0,promise}function completeOutstandingRequest(){$browser.$$completeOutstandingRequest(noop)}function executeHeaderFns(headers,config){var headerContent,processedHeaders={};return forEach(headers,function(headerFn,header){isFunction(headerFn)?(headerContent=headerFn(config),null!=headerContent&&(processedHeaders[header]=headerContent)):processedHeaders[header]=headerFn}),processedHeaders}function mergeHeaders(config){var defHeaderName,lowercaseDefHeaderName,reqHeaderName,defHeaders=defaults.headers,reqHeaders=extend({},config.headers);defHeaders=extend({},defHeaders.common,defHeaders[lowercase(config.method)]);defaultHeadersIteration:for(defHeaderName in defHeaders){lowercaseDefHeaderName=lowercase(defHeaderName);for(reqHeaderName in reqHeaders)if(lowercase(reqHeaderName)===lowercaseDefHeaderName)continue defaultHeadersIteration;reqHeaders[defHeaderName]=defHeaders[defHeaderName]}return executeHeaderFns(reqHeaders,shallowCopy(config))}function serverRequest(config){var headers=config.headers,reqData=transformData(config.data,headersGetter(headers),void 0,config.transformRequest);return isUndefined(reqData)&&forEach(headers,function(value,header){"content-type"===lowercase(header)&&delete headers[header]}),isUndefined(config.withCredentials)&&!isUndefined(defaults.withCredentials)&&(config.withCredentials=defaults.withCredentials),sendReq(config,reqData).then(transformResponse,transformResponse)}function transformResponse(response){var resp=extend({},response);return resp.data=transformData(response.data,response.headers,response.status,config.transformResponse),isSuccess(response.status)?resp:$q.reject(resp)}if(!isObject(requestConfig))throw minErr("$http")("badreq","Http request configuration must be an object.  Received: {0}",requestConfig);if(!isString($sce.valueOf(requestConfig.url)))throw minErr("$http")("badreq","Http request configuration url must be a string or a $sce trusted object.  Received: {0}",requestConfig.url);var config=extend({method:"get",transformRequest:defaults.transformRequest,transformResponse:defaults.transformResponse,paramSerializer:defaults.paramSerializer,jsonpCallbackParam:defaults.jsonpCallbackParam},requestConfig);config.headers=mergeHeaders(requestConfig),config.method=uppercase(config.method),config.paramSerializer=isString(config.paramSerializer)?$injector.get(config.paramSerializer):config.paramSerializer,$browser.$$incOutstandingRequestCount();var requestInterceptors=[],responseInterceptors=[],promise=$q.resolve(config);return forEach(reversedInterceptors,function(interceptor){(interceptor.request||interceptor.requestError)&&requestInterceptors.unshift(interceptor.request,interceptor.requestError),(interceptor.response||interceptor.responseError)&&responseInterceptors.push(interceptor.response,interceptor.responseError)}),promise=chainInterceptors(promise,requestInterceptors),promise=promise.then(serverRequest),promise=chainInterceptors(promise,responseInterceptors),promise=promise["finally"](completeOutstandingRequest)}function createShortMethods(names){forEach(arguments,function(name){$http[name]=function(url,config){return $http(extend({},config||{},{method:name,url:url}))}})}function createShortMethodsWithData(name){forEach(arguments,function(name){$http[name]=function(url,data,config){return $http(extend({},config||{},{method:name,url:url,data:data}))}})}function sendReq(config,reqData){function createApplyHandlers(eventHandlers){if(eventHandlers){var applyHandlers={};return forEach(eventHandlers,function(eventHandler,key){applyHandlers[key]=function(event){function callEventHandler(){eventHandler(event)}useApplyAsync?$rootScope.$applyAsync(callEventHandler):$rootScope.$$phase?callEventHandler():$rootScope.$apply(callEventHandler)}}),applyHandlers}}function done(status,response,headersString,statusText){function resolveHttpPromise(){resolvePromise(response,status,headersString,statusText)}cache&&(isSuccess(status)?cache.put(url,[status,response,parseHeaders(headersString),statusText]):cache.remove(url)),useApplyAsync?$rootScope.$applyAsync(resolveHttpPromise):(resolveHttpPromise(),$rootScope.$$phase||$rootScope.$apply())}function resolvePromise(response,status,headers,statusText){status=status>=-1?status:0,(isSuccess(status)?deferred.resolve:deferred.reject)({data:response,status:status,headers:headersGetter(headers),config:config,statusText:statusText})}function resolvePromiseWithResult(result){resolvePromise(result.data,result.status,shallowCopy(result.headers()),result.statusText)}function removePendingReq(){var idx=$http.pendingRequests.indexOf(config);idx!==-1&&$http.pendingRequests.splice(idx,1)}var cache,cachedResp,deferred=$q.defer(),promise=deferred.promise,reqHeaders=config.headers,isJsonp="jsonp"===lowercase(config.method),url=config.url;if(isJsonp?url=$sce.getTrustedResourceUrl(url):isString(url)||(url=$sce.valueOf(url)),url=buildUrl(url,config.paramSerializer(config.params)),isJsonp&&(url=sanitizeJsonpCallbackParam(url,config.jsonpCallbackParam)),$http.pendingRequests.push(config),promise.then(removePendingReq,removePendingReq),!config.cache&&!defaults.cache||config.cache===!1||"GET"!==config.method&&"JSONP"!==config.method||(cache=isObject(config.cache)?config.cache:isObject(defaults.cache)?defaults.cache:defaultCache),cache&&(cachedResp=cache.get(url),isDefined(cachedResp)?isPromiseLike(cachedResp)?cachedResp.then(resolvePromiseWithResult,resolvePromiseWithResult):isArray(cachedResp)?resolvePromise(cachedResp[1],cachedResp[0],shallowCopy(cachedResp[2]),cachedResp[3]):resolvePromise(cachedResp,200,{},"OK"):cache.put(url,promise)),isUndefined(cachedResp)){var xsrfValue=urlIsSameOrigin(config.url)?$$cookieReader()[config.xsrfCookieName||defaults.xsrfCookieName]:void 0;xsrfValue&&(reqHeaders[config.xsrfHeaderName||defaults.xsrfHeaderName]=xsrfValue),$httpBackend(config.method,url,reqData,done,reqHeaders,config.timeout,config.withCredentials,config.responseType,createApplyHandlers(config.eventHandlers),createApplyHandlers(config.uploadEventHandlers))}return promise}function buildUrl(url,serializedParams){return serializedParams.length>0&&(url+=(url.indexOf("?")===-1?"?":"&")+serializedParams),url}function sanitizeJsonpCallbackParam(url,key){if(/[&?][^=]+=JSON_CALLBACK/.test(url))throw $httpMinErr("badjsonp",'Illegal use of JSON_CALLBACK in url, "{0}"',url);var callbackParamRegex=new RegExp("[&?]"+key+"=");if(callbackParamRegex.test(url))throw $httpMinErr("badjsonp",'Illegal use of callback param, "{0}", in url, "{1}"',key,url);return url+=(url.indexOf("?")===-1?"?":"&")+key+"=JSON_CALLBACK"}var defaultCache=$cacheFactory("$http");defaults.paramSerializer=isString(defaults.paramSerializer)?$injector.get(defaults.paramSerializer):defaults.paramSerializer;var reversedInterceptors=[];return forEach(interceptorFactories,function(interceptorFactory){reversedInterceptors.unshift(isString(interceptorFactory)?$injector.get(interceptorFactory):$injector.invoke(interceptorFactory))}),$http.pendingRequests=[],createShortMethods("get","delete","head","jsonp"),createShortMethodsWithData("post","put","patch"),$http.defaults=defaults,$http}]}function $xhrFactoryProvider(){this.$get=function(){return function(){return new window.XMLHttpRequest}}}function $HttpBackendProvider(){this.$get=["$browser","$jsonpCallbacks","$document","$xhrFactory",function($browser,$jsonpCallbacks,$document,$xhrFactory){return createHttpBackend($browser,$xhrFactory,$browser.defer,$jsonpCallbacks,$document[0])}]}function createHttpBackend($browser,createXhr,$browserDefer,callbacks,rawDocument){function jsonpReq(url,callbackPath,done){url=url.replace("JSON_CALLBACK",callbackPath);var script=rawDocument.createElement("script"),callback=null;return script.type="text/javascript",script.src=url,script.async=!0,callback=function(event){script.removeEventListener("load",callback),script.removeEventListener("error",callback),rawDocument.body.removeChild(script),script=null;var status=-1,text="unknown";event&&("load"!==event.type||callbacks.wasCalled(callbackPath)||(event={type:"error"}),text=event.type,status="error"===event.type?404:200),done&&done(status,text)},script.addEventListener("load",callback),script.addEventListener("error",callback),rawDocument.body.appendChild(script),callback}return function(method,url,post,callback,headers,timeout,withCredentials,responseType,eventHandlers,uploadEventHandlers){function timeoutRequest(){jsonpDone&&jsonpDone(),xhr&&xhr.abort()}function completeRequest(callback,status,response,headersString,statusText){isDefined(timeoutId)&&$browserDefer.cancel(timeoutId),jsonpDone=xhr=null,callback(status,response,headersString,statusText)}if(url=url||$browser.url(),"jsonp"===lowercase(method))var callbackPath=callbacks.createCallback(url),jsonpDone=jsonpReq(url,callbackPath,function(status,text){var response=200===status&&callbacks.getResponse(callbackPath);completeRequest(callback,status,response,"",text),callbacks.removeCallback(callbackPath)});else{var xhr=createXhr(method,url);xhr.open(method,url,!0),forEach(headers,function(value,key){isDefined(value)&&xhr.setRequestHeader(key,value)}),xhr.onload=function(){var statusText=xhr.statusText||"",response="response"in xhr?xhr.response:xhr.responseText,status=1223===xhr.status?204:xhr.status;0===status&&(status=response?200:"file"===urlResolve(url).protocol?404:0),completeRequest(callback,status,response,xhr.getAllResponseHeaders(),statusText)};var requestError=function(){completeRequest(callback,-1,null,null,"")};if(xhr.onerror=requestError,xhr.onabort=requestError,xhr.ontimeout=requestError,forEach(eventHandlers,function(value,key){xhr.addEventListener(key,value)}),forEach(uploadEventHandlers,function(value,key){xhr.upload.addEventListener(key,value)}),withCredentials&&(xhr.withCredentials=!0),responseType)try{xhr.responseType=responseType}catch(e){if("json"!==responseType)throw e}xhr.send(isUndefined(post)?null:post)}if(timeout>0)var timeoutId=$browserDefer(timeoutRequest,timeout);else isPromiseLike(timeout)&&timeout.then(timeoutRequest)}}function $InterpolateProvider(){var startSymbol="{{",endSymbol="}}";this.startSymbol=function(value){return value?(startSymbol=value,this):startSymbol},this.endSymbol=function(value){return value?(endSymbol=value,this):endSymbol},this.$get=["$parse","$exceptionHandler","$sce",function($parse,$exceptionHandler,$sce){function escape(ch){return"\\\\\\"+ch}function unescapeText(text){return text.replace(escapedStartRegexp,startSymbol).replace(escapedEndRegexp,endSymbol)}function constantWatchDelegate(scope,listener,objectEquality,constantInterp){var unwatch=scope.$watch(function(scope){return unwatch(),constantInterp(scope)},listener,objectEquality);return unwatch}function $interpolate(text,mustHaveExpression,trustedContext,allOrNothing){function parseStringifyInterceptor(value){try{return value=getValue(value),allOrNothing&&!isDefined(value)?value:stringify(value)}catch(err){$exceptionHandler($interpolateMinErr.interr(text,err))}}if(!text.length||text.indexOf(startSymbol)===-1){var constantInterp;if(!mustHaveExpression){var unescapedText=unescapeText(text);constantInterp=valueFn(unescapedText),constantInterp.exp=text,constantInterp.expressions=[],constantInterp.$$watchDelegate=constantWatchDelegate}return constantInterp}allOrNothing=!!allOrNothing;for(var startIndex,endIndex,exp,index=0,expressions=[],parseFns=[],textLength=text.length,concat=[],expressionPositions=[];index<textLength;){if((startIndex=text.indexOf(startSymbol,index))===-1||(endIndex=text.indexOf(endSymbol,startIndex+startSymbolLength))===-1){index!==textLength&&concat.push(unescapeText(text.substring(index)));break}index!==startIndex&&concat.push(unescapeText(text.substring(index,startIndex))),exp=text.substring(startIndex+startSymbolLength,endIndex),expressions.push(exp),parseFns.push($parse(exp,parseStringifyInterceptor)),index=endIndex+endSymbolLength,expressionPositions.push(concat.length),concat.push("")}if(trustedContext&&concat.length>1&&$interpolateMinErr.throwNoconcat(text),!mustHaveExpression||expressions.length){var compute=function(values){for(var i=0,ii=expressions.length;i<ii;i++){if(allOrNothing&&isUndefined(values[i]))return;concat[expressionPositions[i]]=values[i]}return concat.join("")},getValue=function(value){return trustedContext?$sce.getTrusted(trustedContext,value):$sce.valueOf(value)};return extend(function(context){var i=0,ii=expressions.length,values=new Array(ii);try{for(;i<ii;i++)values[i]=parseFns[i](context);return compute(values)}catch(err){$exceptionHandler($interpolateMinErr.interr(text,err))}},{exp:text,expressions:expressions,$$watchDelegate:function(scope,listener){var lastValue;return scope.$watchGroup(parseFns,function(values,oldValues){var currValue=compute(values);isFunction(listener)&&listener.call(this,currValue,values!==oldValues?lastValue:currValue,scope),lastValue=currValue})}})}}var startSymbolLength=startSymbol.length,endSymbolLength=endSymbol.length,escapedStartRegexp=new RegExp(startSymbol.replace(/./g,escape),"g"),escapedEndRegexp=new RegExp(endSymbol.replace(/./g,escape),"g");return $interpolate.startSymbol=function(){return startSymbol},$interpolate.endSymbol=function(){return endSymbol},$interpolate}]}function $IntervalProvider(){this.$get=["$rootScope","$window","$q","$$q","$browser",function($rootScope,$window,$q,$$q,$browser){function interval(fn,delay,count,invokeApply){function callback(){hasParams?fn.apply(null,args):fn(iteration)}var hasParams=arguments.length>4,args=hasParams?sliceArgs(arguments,4):[],setInterval=$window.setInterval,clearInterval=$window.clearInterval,iteration=0,skipApply=isDefined(invokeApply)&&!invokeApply,deferred=(skipApply?$$q:$q).defer(),promise=deferred.promise;return count=isDefined(count)?count:0,promise.$$intervalId=setInterval(function(){skipApply?$browser.defer(callback):$rootScope.$evalAsync(callback),deferred.notify(iteration++),count>0&&iteration>=count&&(deferred.resolve(iteration),clearInterval(promise.$$intervalId),delete intervals[promise.$$intervalId]),skipApply||$rootScope.$apply()},delay),intervals[promise.$$intervalId]=deferred,promise}var intervals={};return interval.cancel=function(promise){return!!(promise&&promise.$$intervalId in intervals)&&(intervals[promise.$$intervalId].promise["catch"](noop),intervals[promise.$$intervalId].reject("canceled"),$window.clearInterval(promise.$$intervalId),delete intervals[promise.$$intervalId],!0)},interval}]}function encodePath(path){for(var segments=path.split("/"),i=segments.length;i--;)segments[i]=encodeUriSegment(segments[i]);return segments.join("/")}function parseAbsoluteUrl(absoluteUrl,locationObj){var parsedUrl=urlResolve(absoluteUrl);locationObj.$$protocol=parsedUrl.protocol,locationObj.$$host=parsedUrl.hostname,locationObj.$$port=toInt(parsedUrl.port)||DEFAULT_PORTS[parsedUrl.protocol]||null}function parseAppUrl(url,locationObj){if(DOUBLE_SLASH_REGEX.test(url))throw $locationMinErr("badpath",'Invalid url "{0}".',url);var prefixed="/"!==url.charAt(0);prefixed&&(url="/"+url);var match=urlResolve(url);locationObj.$$path=decodeURIComponent(prefixed&&"/"===match.pathname.charAt(0)?match.pathname.substring(1):match.pathname),locationObj.$$search=parseKeyValue(match.search),locationObj.$$hash=decodeURIComponent(match.hash),locationObj.$$path&&"/"!==locationObj.$$path.charAt(0)&&(locationObj.$$path="/"+locationObj.$$path)}function startsWith(str,search){return str.slice(0,search.length)===search}function stripBaseUrl(base,url){if(startsWith(url,base))return url.substr(base.length)}function stripHash(url){var index=url.indexOf("#");return index===-1?url:url.substr(0,index)}function trimEmptyHash(url){return url.replace(/(#.+)|#$/,"$1")}function stripFile(url){return url.substr(0,stripHash(url).lastIndexOf("/")+1)}function serverBase(url){return url.substring(0,url.indexOf("/",url.indexOf("//")+2))}function LocationHtml5Url(appBase,appBaseNoFile,basePrefix){this.$$html5=!0,basePrefix=basePrefix||"",parseAbsoluteUrl(appBase,this),this.$$parse=function(url){var pathUrl=stripBaseUrl(appBaseNoFile,url);if(!isString(pathUrl))throw $locationMinErr("ipthprfx",'Invalid url "{0}", missing path prefix "{1}".',url,appBaseNoFile);parseAppUrl(pathUrl,this),this.$$path||(this.$$path="/"),this.$$compose()},this.$$compose=function(){var search=toKeyValue(this.$$search),hash=this.$$hash?"#"+encodeUriSegment(this.$$hash):"";this.$$url=encodePath(this.$$path)+(search?"?"+search:"")+hash,this.$$absUrl=appBaseNoFile+this.$$url.substr(1),this.$$urlUpdatedByLocation=!0},this.$$parseLinkUrl=function(url,relHref){if(relHref&&"#"===relHref[0])return this.hash(relHref.slice(1)),!0;var appUrl,prevAppUrl,rewrittenUrl;return isDefined(appUrl=stripBaseUrl(appBase,url))?(prevAppUrl=appUrl,rewrittenUrl=basePrefix&&isDefined(appUrl=stripBaseUrl(basePrefix,appUrl))?appBaseNoFile+(stripBaseUrl("/",appUrl)||appUrl):appBase+prevAppUrl):isDefined(appUrl=stripBaseUrl(appBaseNoFile,url))?rewrittenUrl=appBaseNoFile+appUrl:appBaseNoFile===url+"/"&&(rewrittenUrl=appBaseNoFile),rewrittenUrl&&this.$$parse(rewrittenUrl),!!rewrittenUrl}}function LocationHashbangUrl(appBase,appBaseNoFile,hashPrefix){parseAbsoluteUrl(appBase,this),this.$$parse=function(url){function removeWindowsDriveName(path,url,base){var firstPathSegmentMatch,windowsFilePathExp=/^\/[A-Z]:(\/.*)/;return startsWith(url,base)&&(url=url.replace(base,"")),windowsFilePathExp.exec(url)?path:(firstPathSegmentMatch=windowsFilePathExp.exec(path),firstPathSegmentMatch?firstPathSegmentMatch[1]:path)}var withoutHashUrl,withoutBaseUrl=stripBaseUrl(appBase,url)||stripBaseUrl(appBaseNoFile,url);isUndefined(withoutBaseUrl)||"#"!==withoutBaseUrl.charAt(0)?this.$$html5?withoutHashUrl=withoutBaseUrl:(withoutHashUrl="",isUndefined(withoutBaseUrl)&&(appBase=url,this.replace())):(withoutHashUrl=stripBaseUrl(hashPrefix,withoutBaseUrl),isUndefined(withoutHashUrl)&&(withoutHashUrl=withoutBaseUrl)),parseAppUrl(withoutHashUrl,this),this.$$path=removeWindowsDriveName(this.$$path,withoutHashUrl,appBase),this.$$compose()},this.$$compose=function(){var search=toKeyValue(this.$$search),hash=this.$$hash?"#"+encodeUriSegment(this.$$hash):"";this.$$url=encodePath(this.$$path)+(search?"?"+search:"")+hash,this.$$absUrl=appBase+(this.$$url?hashPrefix+this.$$url:""),this.$$urlUpdatedByLocation=!0},this.$$parseLinkUrl=function(url,relHref){return stripHash(appBase)===stripHash(url)&&(this.$$parse(url),!0)}}function LocationHashbangInHtml5Url(appBase,appBaseNoFile,hashPrefix){this.$$html5=!0,LocationHashbangUrl.apply(this,arguments),this.$$parseLinkUrl=function(url,relHref){if(relHref&&"#"===relHref[0])return this.hash(relHref.slice(1)),!0;var rewrittenUrl,appUrl;return appBase===stripHash(url)?rewrittenUrl=url:(appUrl=stripBaseUrl(appBaseNoFile,url))?rewrittenUrl=appBase+hashPrefix+appUrl:appBaseNoFile===url+"/"&&(rewrittenUrl=appBaseNoFile),rewrittenUrl&&this.$$parse(rewrittenUrl),!!rewrittenUrl},this.$$compose=function(){var search=toKeyValue(this.$$search),hash=this.$$hash?"#"+encodeUriSegment(this.$$hash):"";this.$$url=encodePath(this.$$path)+(search?"?"+search:"")+hash,this.$$absUrl=appBase+hashPrefix+this.$$url,this.$$urlUpdatedByLocation=!0}}function locationGetter(property){return function(){return this[property]}}function locationGetterSetter(property,preprocess){return function(value){return isUndefined(value)?this[property]:(this[property]=preprocess(value),this.$$compose(),this)}}function $LocationProvider(){var hashPrefix="!",html5Mode={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(prefix){return isDefined(prefix)?(hashPrefix=prefix,this):hashPrefix},this.html5Mode=function(mode){return isBoolean(mode)?(html5Mode.enabled=mode,this):isObject(mode)?(isBoolean(mode.enabled)&&(html5Mode.enabled=mode.enabled),isBoolean(mode.requireBase)&&(html5Mode.requireBase=mode.requireBase),(isBoolean(mode.rewriteLinks)||isString(mode.rewriteLinks))&&(html5Mode.rewriteLinks=mode.rewriteLinks),this):html5Mode},this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function($rootScope,$browser,$sniffer,$rootElement,$window){function setBrowserUrlWithFallback(url,replace,state){var oldUrl=$location.url(),oldState=$location.$$state;try{$browser.url(url,replace,state),$location.$$state=$browser.state()}catch(e){throw $location.url(oldUrl),$location.$$state=oldState,e}}function afterLocationChange(oldUrl,oldState){$rootScope.$broadcast("$locationChangeSuccess",$location.absUrl(),oldUrl,$location.$$state,oldState)}var $location,LocationMode,appBase,baseHref=$browser.baseHref(),initialUrl=$browser.url();if(html5Mode.enabled){if(!baseHref&&html5Mode.requireBase)throw $locationMinErr("nobase","$location in HTML5 mode requires a <base> tag to be present!");appBase=serverBase(initialUrl)+(baseHref||"/"),LocationMode=$sniffer.history?LocationHtml5Url:LocationHashbangInHtml5Url}else appBase=stripHash(initialUrl),LocationMode=LocationHashbangUrl;var appBaseNoFile=stripFile(appBase);$location=new LocationMode(appBase,appBaseNoFile,"#"+hashPrefix),$location.$$parseLinkUrl(initialUrl,initialUrl),$location.$$state=$browser.state();var IGNORE_URI_REGEXP=/^\s*(javascript|mailto):/i;$rootElement.on("click",function(event){var rewriteLinks=html5Mode.rewriteLinks;if(rewriteLinks&&!event.ctrlKey&&!event.metaKey&&!event.shiftKey&&2!==event.which&&2!==event.button){for(var elm=jqLite(event.target);"a"!==nodeName_(elm[0]);)if(elm[0]===$rootElement[0]||!(elm=elm.parent())[0])return;if(!isString(rewriteLinks)||!isUndefined(elm.attr(rewriteLinks))){var absHref=elm.prop("href"),relHref=elm.attr("href")||elm.attr("xlink:href");isObject(absHref)&&"[object SVGAnimatedString]"===absHref.toString()&&(absHref=urlResolve(absHref.animVal).href),IGNORE_URI_REGEXP.test(absHref)||!absHref||elm.attr("target")||event.isDefaultPrevented()||$location.$$parseLinkUrl(absHref,relHref)&&(event.preventDefault(),$location.absUrl()!==$browser.url()&&($rootScope.$apply(),$window.angular["ff-684208-preventDefault"]=!0))}}}),trimEmptyHash($location.absUrl())!==trimEmptyHash(initialUrl)&&$browser.url($location.absUrl(),!0);var initializing=!0;return $browser.onUrlChange(function(newUrl,newState){return startsWith(newUrl,appBaseNoFile)?($rootScope.$evalAsync(function(){var defaultPrevented,oldUrl=$location.absUrl(),oldState=$location.$$state;newUrl=trimEmptyHash(newUrl),$location.$$parse(newUrl),$location.$$state=newState,defaultPrevented=$rootScope.$broadcast("$locationChangeStart",newUrl,oldUrl,newState,oldState).defaultPrevented,$location.absUrl()===newUrl&&(defaultPrevented?($location.$$parse(oldUrl),$location.$$state=oldState,setBrowserUrlWithFallback(oldUrl,!1,oldState)):(initializing=!1,afterLocationChange(oldUrl,oldState)))}),void($rootScope.$$phase||$rootScope.$digest())):void($window.location.href=newUrl)}),$rootScope.$watch(function(){if(initializing||$location.$$urlUpdatedByLocation){$location.$$urlUpdatedByLocation=!1;var oldUrl=trimEmptyHash($browser.url()),newUrl=trimEmptyHash($location.absUrl()),oldState=$browser.state(),currentReplace=$location.$$replace,urlOrStateChanged=oldUrl!==newUrl||$location.$$html5&&$sniffer.history&&oldState!==$location.$$state;(initializing||urlOrStateChanged)&&(initializing=!1,$rootScope.$evalAsync(function(){var newUrl=$location.absUrl(),defaultPrevented=$rootScope.$broadcast("$locationChangeStart",newUrl,oldUrl,$location.$$state,oldState).defaultPrevented;$location.absUrl()===newUrl&&(defaultPrevented?($location.$$parse(oldUrl),$location.$$state=oldState):(urlOrStateChanged&&setBrowserUrlWithFallback(newUrl,currentReplace,oldState===$location.$$state?null:$location.$$state),afterLocationChange(oldUrl,oldState)))}))}$location.$$replace=!1}),$location}]}function $LogProvider(){var debug=!0,self=this;this.debugEnabled=function(flag){return isDefined(flag)?(debug=flag,this):debug},this.$get=["$window",function($window){function formatError(arg){return arg instanceof Error&&(arg.stack&&formatStackTrace?arg=arg.message&&arg.stack.indexOf(arg.message)===-1?"Error: "+arg.message+"\n"+arg.stack:arg.stack:arg.sourceURL&&(arg=arg.message+"\n"+arg.sourceURL+":"+arg.line)),arg}function consoleLog(type){var console=$window.console||{},logFn=console[type]||console.log||noop,hasApply=!1;try{hasApply=!!logFn.apply}catch(e){}return hasApply?function(){var args=[];return forEach(arguments,function(arg){args.push(formatError(arg))}),logFn.apply(console,args)}:function(arg1,arg2){logFn(arg1,null==arg2?"":arg2)}}var formatStackTrace=msie||/\bEdge\//.test($window.navigator&&$window.navigator.userAgent);return{log:consoleLog("log"),info:consoleLog("info"),warn:consoleLog("warn"),error:consoleLog("error"),debug:function(){var fn=consoleLog("debug");return function(){debug&&fn.apply(self,arguments)}}()}}]}function getStringValue(name){return name+""}function ifDefined(v,d){return"undefined"!=typeof v?v:d}function plusFn(l,r){return"undefined"==typeof l?r:"undefined"==typeof r?l:l+r}function isStateless($filter,filterName){var fn=$filter(filterName);return!fn.$stateful}function findConstantAndWatchExpressions(ast,$filter){var allConstants,argsToWatch,isStatelessFilter;switch(ast.type){case AST.Program:allConstants=!0,forEach(ast.body,function(expr){findConstantAndWatchExpressions(expr.expression,$filter),allConstants=allConstants&&expr.expression.constant}),ast.constant=allConstants;break;case AST.Literal:ast.constant=!0,ast.toWatch=[];break;case AST.UnaryExpression:findConstantAndWatchExpressions(ast.argument,$filter),ast.constant=ast.argument.constant,ast.toWatch=ast.argument.toWatch;break;case AST.BinaryExpression:findConstantAndWatchExpressions(ast.left,$filter),findConstantAndWatchExpressions(ast.right,$filter),ast.constant=ast.left.constant&&ast.right.constant,ast.toWatch=ast.left.toWatch.concat(ast.right.toWatch);break;case AST.LogicalExpression:findConstantAndWatchExpressions(ast.left,$filter),findConstantAndWatchExpressions(ast.right,$filter),ast.constant=ast.left.constant&&ast.right.constant,ast.toWatch=ast.constant?[]:[ast];break;case AST.ConditionalExpression:findConstantAndWatchExpressions(ast.test,$filter),findConstantAndWatchExpressions(ast.alternate,$filter),findConstantAndWatchExpressions(ast.consequent,$filter),ast.constant=ast.test.constant&&ast.alternate.constant&&ast.consequent.constant,ast.toWatch=ast.constant?[]:[ast];break;case AST.Identifier:ast.constant=!1,ast.toWatch=[ast];break;case AST.MemberExpression:findConstantAndWatchExpressions(ast.object,$filter),ast.computed&&findConstantAndWatchExpressions(ast.property,$filter),ast.constant=ast.object.constant&&(!ast.computed||ast.property.constant),ast.toWatch=[ast];break;case AST.CallExpression:isStatelessFilter=!!ast.filter&&isStateless($filter,ast.callee.name),allConstants=isStatelessFilter,argsToWatch=[],forEach(ast.arguments,function(expr){findConstantAndWatchExpressions(expr,$filter),
allConstants=allConstants&&expr.constant,expr.constant||argsToWatch.push.apply(argsToWatch,expr.toWatch)}),ast.constant=allConstants,ast.toWatch=isStatelessFilter?argsToWatch:[ast];break;case AST.AssignmentExpression:findConstantAndWatchExpressions(ast.left,$filter),findConstantAndWatchExpressions(ast.right,$filter),ast.constant=ast.left.constant&&ast.right.constant,ast.toWatch=[ast];break;case AST.ArrayExpression:allConstants=!0,argsToWatch=[],forEach(ast.elements,function(expr){findConstantAndWatchExpressions(expr,$filter),allConstants=allConstants&&expr.constant,expr.constant||argsToWatch.push.apply(argsToWatch,expr.toWatch)}),ast.constant=allConstants,ast.toWatch=argsToWatch;break;case AST.ObjectExpression:allConstants=!0,argsToWatch=[],forEach(ast.properties,function(property){findConstantAndWatchExpressions(property.value,$filter),allConstants=allConstants&&property.value.constant&&!property.computed,property.value.constant||argsToWatch.push.apply(argsToWatch,property.value.toWatch),property.computed&&(findConstantAndWatchExpressions(property.key,$filter),property.key.constant||argsToWatch.push.apply(argsToWatch,property.key.toWatch))}),ast.constant=allConstants,ast.toWatch=argsToWatch;break;case AST.ThisExpression:ast.constant=!1,ast.toWatch=[];break;case AST.LocalsExpression:ast.constant=!1,ast.toWatch=[]}}function getInputs(body){if(1===body.length){var lastExpression=body[0].expression,candidate=lastExpression.toWatch;return 1!==candidate.length?candidate:candidate[0]!==lastExpression?candidate:void 0}}function isAssignable(ast){return ast.type===AST.Identifier||ast.type===AST.MemberExpression}function assignableAST(ast){if(1===ast.body.length&&isAssignable(ast.body[0].expression))return{type:AST.AssignmentExpression,left:ast.body[0].expression,right:{type:AST.NGValueParameter},operator:"="}}function isLiteral(ast){return 0===ast.body.length||1===ast.body.length&&(ast.body[0].expression.type===AST.Literal||ast.body[0].expression.type===AST.ArrayExpression||ast.body[0].expression.type===AST.ObjectExpression)}function isConstant(ast){return ast.constant}function ASTCompiler(astBuilder,$filter){this.astBuilder=astBuilder,this.$filter=$filter}function ASTInterpreter(astBuilder,$filter){this.astBuilder=astBuilder,this.$filter=$filter}function getValueOf(value){return isFunction(value.valueOf)?value.valueOf():objectValueOf.call(value)}function $ParseProvider(){var identStart,identContinue,cache=createMap(),literals={"true":!0,"false":!1,"null":null,undefined:void 0};this.addLiteral=function(literalName,literalValue){literals[literalName]=literalValue},this.setIdentifierFns=function(identifierStart,identifierContinue){return identStart=identifierStart,identContinue=identifierContinue,this},this.$get=["$filter",function($filter){function $parse(exp,interceptorFn){var parsedExpression,oneTime,cacheKey;switch(typeof exp){case"string":if(exp=exp.trim(),cacheKey=exp,parsedExpression=cache[cacheKey],!parsedExpression){":"===exp.charAt(0)&&":"===exp.charAt(1)&&(oneTime=!0,exp=exp.substring(2));var lexer=new Lexer($parseOptions),parser=new Parser(lexer,$filter,$parseOptions);parsedExpression=parser.parse(exp),parsedExpression.constant?parsedExpression.$$watchDelegate=constantWatchDelegate:oneTime?parsedExpression.$$watchDelegate=parsedExpression.literal?oneTimeLiteralWatchDelegate:oneTimeWatchDelegate:parsedExpression.inputs&&(parsedExpression.$$watchDelegate=inputsWatchDelegate),cache[cacheKey]=parsedExpression}return addInterceptor(parsedExpression,interceptorFn);case"function":return addInterceptor(exp,interceptorFn);default:return addInterceptor(noop,interceptorFn)}}function expressionInputDirtyCheck(newValue,oldValueOfValue,compareObjectIdentity){return null==newValue||null==oldValueOfValue?newValue===oldValueOfValue:!("object"==typeof newValue&&!compareObjectIdentity&&(newValue=getValueOf(newValue),"object"==typeof newValue))&&(newValue===oldValueOfValue||newValue!==newValue&&oldValueOfValue!==oldValueOfValue)}function inputsWatchDelegate(scope,listener,objectEquality,parsedExpression,prettyPrintExpression){var lastResult,inputExpressions=parsedExpression.inputs;if(1===inputExpressions.length){var oldInputValueOf=expressionInputDirtyCheck;return inputExpressions=inputExpressions[0],scope.$watch(function(scope){var newInputValue=inputExpressions(scope);return expressionInputDirtyCheck(newInputValue,oldInputValueOf,parsedExpression.literal)||(lastResult=parsedExpression(scope,void 0,void 0,[newInputValue]),oldInputValueOf=newInputValue&&getValueOf(newInputValue)),lastResult},listener,objectEquality,prettyPrintExpression)}for(var oldInputValueOfValues=[],oldInputValues=[],i=0,ii=inputExpressions.length;i<ii;i++)oldInputValueOfValues[i]=expressionInputDirtyCheck,oldInputValues[i]=null;return scope.$watch(function(scope){for(var changed=!1,i=0,ii=inputExpressions.length;i<ii;i++){var newInputValue=inputExpressions[i](scope);(changed||(changed=!expressionInputDirtyCheck(newInputValue,oldInputValueOfValues[i],parsedExpression.literal)))&&(oldInputValues[i]=newInputValue,oldInputValueOfValues[i]=newInputValue&&getValueOf(newInputValue))}return changed&&(lastResult=parsedExpression(scope,void 0,void 0,oldInputValues)),lastResult},listener,objectEquality,prettyPrintExpression)}function oneTimeWatchDelegate(scope,listener,objectEquality,parsedExpression,prettyPrintExpression){function oneTimeWatch(scope){return parsedExpression(scope)}function oneTimeListener(value,old,scope){lastValue=value,isFunction(listener)&&listener(value,old,scope),isDefined(value)&&scope.$$postDigest(function(){isDefined(lastValue)&&unwatch()})}var unwatch,lastValue;return unwatch=parsedExpression.inputs?inputsWatchDelegate(scope,oneTimeListener,objectEquality,parsedExpression,prettyPrintExpression):scope.$watch(oneTimeWatch,oneTimeListener,objectEquality)}function oneTimeLiteralWatchDelegate(scope,listener,objectEquality,parsedExpression){function isAllDefined(value){var allDefined=!0;return forEach(value,function(val){isDefined(val)||(allDefined=!1)}),allDefined}var unwatch,lastValue;return unwatch=scope.$watch(function(scope){return parsedExpression(scope)},function(value,old,scope){lastValue=value,isFunction(listener)&&listener(value,old,scope),isAllDefined(value)&&scope.$$postDigest(function(){isAllDefined(lastValue)&&unwatch()})},objectEquality)}function constantWatchDelegate(scope,listener,objectEquality,parsedExpression){var unwatch=scope.$watch(function(scope){return unwatch(),parsedExpression(scope)},listener,objectEquality);return unwatch}function addInterceptor(parsedExpression,interceptorFn){if(!interceptorFn)return parsedExpression;var watchDelegate=parsedExpression.$$watchDelegate,useInputs=!1,regularWatch=watchDelegate!==oneTimeLiteralWatchDelegate&&watchDelegate!==oneTimeWatchDelegate,fn=regularWatch?function(scope,locals,assign,inputs){var value=useInputs&&inputs?inputs[0]:parsedExpression(scope,locals,assign,inputs);return interceptorFn(value,scope,locals)}:function(scope,locals,assign,inputs){var value=parsedExpression(scope,locals,assign,inputs),result=interceptorFn(value,scope,locals);return isDefined(value)?result:value};return useInputs=!parsedExpression.inputs,parsedExpression.$$watchDelegate&&parsedExpression.$$watchDelegate!==inputsWatchDelegate?(fn.$$watchDelegate=parsedExpression.$$watchDelegate,fn.inputs=parsedExpression.inputs):interceptorFn.$stateful||(fn.$$watchDelegate=inputsWatchDelegate,fn.inputs=parsedExpression.inputs?parsedExpression.inputs:[parsedExpression]),fn}var noUnsafeEval=csp().noUnsafeEval,$parseOptions={csp:noUnsafeEval,literals:copy(literals),isIdentifierStart:isFunction(identStart)&&identStart,isIdentifierContinue:isFunction(identContinue)&&identContinue};return $parse}]}function $QProvider(){var errorOnUnhandledRejections=!0;this.$get=["$rootScope","$exceptionHandler",function($rootScope,$exceptionHandler){return qFactory(function(callback){$rootScope.$evalAsync(callback)},$exceptionHandler,errorOnUnhandledRejections)}],this.errorOnUnhandledRejections=function(value){return isDefined(value)?(errorOnUnhandledRejections=value,this):errorOnUnhandledRejections}}function $$QProvider(){var errorOnUnhandledRejections=!0;this.$get=["$browser","$exceptionHandler",function($browser,$exceptionHandler){return qFactory(function(callback){$browser.defer(callback)},$exceptionHandler,errorOnUnhandledRejections)}],this.errorOnUnhandledRejections=function(value){return isDefined(value)?(errorOnUnhandledRejections=value,this):errorOnUnhandledRejections}}function qFactory(nextTick,exceptionHandler,errorOnUnhandledRejections){function defer(){return new Deferred}function Deferred(){var promise=this.promise=new Promise;this.resolve=function(val){resolvePromise(promise,val)},this.reject=function(reason){rejectPromise(promise,reason)},this.notify=function(progress){notifyPromise(promise,progress)}}function Promise(){this.$$state={status:0}}function processQueue(state){var fn,promise,pending;pending=state.pending,state.processScheduled=!1,state.pending=void 0;try{for(var i=0,ii=pending.length;i<ii;++i){state.pur=!0,promise=pending[i][0],fn=pending[i][state.status];try{isFunction(fn)?resolvePromise(promise,fn(state.value)):1===state.status?resolvePromise(promise,state.value):rejectPromise(promise,state.value)}catch(e){rejectPromise(promise,e)}}}finally{--queueSize,errorOnUnhandledRejections&&0===queueSize&&nextTick(processChecks)}}function processChecks(){for(;!queueSize&&checkQueue.length;){var toCheck=checkQueue.shift();if(!toCheck.pur){toCheck.pur=!0;var errorMessage="Possibly unhandled rejection: "+toDebugString(toCheck.value);toCheck.value instanceof Error?exceptionHandler(toCheck.value,errorMessage):exceptionHandler(errorMessage)}}}function scheduleProcessQueue(state){!errorOnUnhandledRejections||state.pending||2!==state.status||state.pur||(0===queueSize&&0===checkQueue.length&&nextTick(processChecks),checkQueue.push(state)),!state.processScheduled&&state.pending&&(state.processScheduled=!0,++queueSize,nextTick(function(){processQueue(state)}))}function resolvePromise(promise,val){promise.$$state.status||(val===promise?$$reject(promise,$qMinErr("qcycle","Expected promise to be resolved with value other than itself '{0}'",val)):$$resolve(promise,val))}function $$resolve(promise,val){function doResolve(val){done||(done=!0,$$resolve(promise,val))}function doReject(val){done||(done=!0,$$reject(promise,val))}function doNotify(progress){notifyPromise(promise,progress)}var then,done=!1;try{(isObject(val)||isFunction(val))&&(then=val.then),isFunction(then)?(promise.$$state.status=-1,then.call(val,doResolve,doReject,doNotify)):(promise.$$state.value=val,promise.$$state.status=1,scheduleProcessQueue(promise.$$state))}catch(e){doReject(e)}}function rejectPromise(promise,reason){promise.$$state.status||$$reject(promise,reason)}function $$reject(promise,reason){promise.$$state.value=reason,promise.$$state.status=2,scheduleProcessQueue(promise.$$state)}function notifyPromise(promise,progress){var callbacks=promise.$$state.pending;promise.$$state.status<=0&&callbacks&&callbacks.length&&nextTick(function(){for(var callback,result,i=0,ii=callbacks.length;i<ii;i++){result=callbacks[i][0],callback=callbacks[i][3];try{notifyPromise(result,isFunction(callback)?callback(progress):progress)}catch(e){exceptionHandler(e)}}})}function reject(reason){var result=new Promise;return rejectPromise(result,reason),result}function handleCallback(value,resolver,callback){var callbackOutput=null;try{isFunction(callback)&&(callbackOutput=callback())}catch(e){return reject(e)}return isPromiseLike(callbackOutput)?callbackOutput.then(function(){return resolver(value)},reject):resolver(value)}function when(value,callback,errback,progressBack){var result=new Promise;return resolvePromise(result,value),result.then(callback,errback,progressBack)}function all(promises){var result=new Promise,counter=0,results=isArray(promises)?[]:{};return forEach(promises,function(promise,key){counter++,when(promise).then(function(value){results[key]=value,--counter||resolvePromise(result,results)},function(reason){rejectPromise(result,reason)})}),0===counter&&resolvePromise(result,results),result}function race(promises){var deferred=defer();return forEach(promises,function(promise){when(promise).then(deferred.resolve,deferred.reject)}),deferred.promise}function $Q(resolver){function resolveFn(value){resolvePromise(promise,value)}function rejectFn(reason){rejectPromise(promise,reason)}if(!isFunction(resolver))throw $qMinErr("norslvr","Expected resolverFn, got '{0}'",resolver);var promise=new Promise;return resolver(resolveFn,rejectFn),promise}var $qMinErr=minErr("$q",TypeError),queueSize=0,checkQueue=[];extend(Promise.prototype,{then:function(onFulfilled,onRejected,progressBack){if(isUndefined(onFulfilled)&&isUndefined(onRejected)&&isUndefined(progressBack))return this;var result=new Promise;return this.$$state.pending=this.$$state.pending||[],this.$$state.pending.push([result,onFulfilled,onRejected,progressBack]),this.$$state.status>0&&scheduleProcessQueue(this.$$state),result},"catch":function(callback){return this.then(null,callback)},"finally":function(callback,progressBack){return this.then(function(value){return handleCallback(value,resolve,callback)},function(error){return handleCallback(error,reject,callback)},progressBack)}});var resolve=when;return $Q.prototype=Promise.prototype,$Q.defer=defer,$Q.reject=reject,$Q.when=when,$Q.resolve=resolve,$Q.all=all,$Q.race=race,$Q}function $$RAFProvider(){this.$get=["$window","$timeout",function($window,$timeout){var requestAnimationFrame=$window.requestAnimationFrame||$window.webkitRequestAnimationFrame,cancelAnimationFrame=$window.cancelAnimationFrame||$window.webkitCancelAnimationFrame||$window.webkitCancelRequestAnimationFrame,rafSupported=!!requestAnimationFrame,raf=rafSupported?function(fn){var id=requestAnimationFrame(fn);return function(){cancelAnimationFrame(id)}}:function(fn){var timer=$timeout(fn,16.66,!1);return function(){$timeout.cancel(timer)}};return raf.supported=rafSupported,raf}]}function $RootScopeProvider(){function createChildScopeClass(parent){function ChildScope(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null,this.$$listeners={},this.$$listenerCount={},this.$$watchersCount=0,this.$id=nextUid(),this.$$ChildScope=null}return ChildScope.prototype=parent,ChildScope}var TTL=10,$rootScopeMinErr=minErr("$rootScope"),lastDirtyWatch=null,applyAsyncId=null;this.digestTtl=function(value){return arguments.length&&(TTL=value),TTL},this.$get=["$exceptionHandler","$parse","$browser",function($exceptionHandler,$parse,$browser){function destroyChildScope($event){$event.currentScope.$$destroyed=!0}function cleanUpScope($scope){9===msie&&($scope.$$childHead&&cleanUpScope($scope.$$childHead),$scope.$$nextSibling&&cleanUpScope($scope.$$nextSibling)),$scope.$parent=$scope.$$nextSibling=$scope.$$prevSibling=$scope.$$childHead=$scope.$$childTail=$scope.$root=$scope.$$watchers=null}function Scope(){this.$id=nextUid(),this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null,this.$root=this,this.$$destroyed=!1,this.$$listeners={},this.$$listenerCount={},this.$$watchersCount=0,this.$$isolateBindings=null}function beginPhase(phase){if($rootScope.$$phase)throw $rootScopeMinErr("inprog","{0} already in progress",$rootScope.$$phase);$rootScope.$$phase=phase}function clearPhase(){$rootScope.$$phase=null}function incrementWatchersCount(current,count){do current.$$watchersCount+=count;while(current=current.$parent)}function decrementListenerCount(current,count,name){do current.$$listenerCount[name]-=count,0===current.$$listenerCount[name]&&delete current.$$listenerCount[name];while(current=current.$parent)}function initWatchVal(){}function flushApplyAsync(){for(;applyAsyncQueue.length;)try{applyAsyncQueue.shift()()}catch(e){$exceptionHandler(e)}applyAsyncId=null}function scheduleApplyAsync(){null===applyAsyncId&&(applyAsyncId=$browser.defer(function(){$rootScope.$apply(flushApplyAsync)}))}Scope.prototype={constructor:Scope,$new:function(isolate,parent){var child;return parent=parent||this,isolate?(child=new Scope,child.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=createChildScopeClass(this)),child=new this.$$ChildScope),child.$parent=parent,child.$$prevSibling=parent.$$childTail,parent.$$childHead?(parent.$$childTail.$$nextSibling=child,parent.$$childTail=child):parent.$$childHead=parent.$$childTail=child,(isolate||parent!==this)&&child.$on("$destroy",destroyChildScope),child},$watch:function(watchExp,listener,objectEquality,prettyPrintExpression){var get=$parse(watchExp);if(get.$$watchDelegate)return get.$$watchDelegate(this,listener,objectEquality,get,watchExp);var scope=this,array=scope.$$watchers,watcher={fn:listener,last:initWatchVal,get:get,exp:prettyPrintExpression||watchExp,eq:!!objectEquality};return lastDirtyWatch=null,isFunction(listener)||(watcher.fn=noop),array||(array=scope.$$watchers=[],array.$$digestWatchIndex=-1),array.unshift(watcher),array.$$digestWatchIndex++,incrementWatchersCount(this,1),function(){var index=arrayRemove(array,watcher);index>=0&&(incrementWatchersCount(scope,-1),index<array.$$digestWatchIndex&&array.$$digestWatchIndex--),lastDirtyWatch=null}},$watchGroup:function(watchExpressions,listener){function watchGroupAction(){changeReactionScheduled=!1,firstRun?(firstRun=!1,listener(newValues,newValues,self)):listener(newValues,oldValues,self)}var oldValues=new Array(watchExpressions.length),newValues=new Array(watchExpressions.length),deregisterFns=[],self=this,changeReactionScheduled=!1,firstRun=!0;if(!watchExpressions.length){var shouldCall=!0;return self.$evalAsync(function(){shouldCall&&listener(newValues,newValues,self)}),function(){shouldCall=!1}}return 1===watchExpressions.length?this.$watch(watchExpressions[0],function(value,oldValue,scope){newValues[0]=value,oldValues[0]=oldValue,listener(newValues,value===oldValue?newValues:oldValues,scope)}):(forEach(watchExpressions,function(expr,i){var unwatchFn=self.$watch(expr,function(value,oldValue){newValues[i]=value,oldValues[i]=oldValue,changeReactionScheduled||(changeReactionScheduled=!0,self.$evalAsync(watchGroupAction))});deregisterFns.push(unwatchFn)}),function(){for(;deregisterFns.length;)deregisterFns.shift()()})},$watchCollection:function(obj,listener){function $watchCollectionInterceptor(_value){newValue=_value;var newLength,key,bothNaN,newItem,oldItem;if(!isUndefined(newValue)){if(isObject(newValue))if(isArrayLike(newValue)){oldValue!==internalArray&&(oldValue=internalArray,oldLength=oldValue.length=0,changeDetected++),newLength=newValue.length,oldLength!==newLength&&(changeDetected++,oldValue.length=oldLength=newLength);for(var i=0;i<newLength;i++)oldItem=oldValue[i],newItem=newValue[i],bothNaN=oldItem!==oldItem&&newItem!==newItem,bothNaN||oldItem===newItem||(changeDetected++,oldValue[i]=newItem)}else{oldValue!==internalObject&&(oldValue=internalObject={},oldLength=0,changeDetected++),newLength=0;for(key in newValue)hasOwnProperty.call(newValue,key)&&(newLength++,newItem=newValue[key],oldItem=oldValue[key],key in oldValue?(bothNaN=oldItem!==oldItem&&newItem!==newItem,bothNaN||oldItem===newItem||(changeDetected++,oldValue[key]=newItem)):(oldLength++,oldValue[key]=newItem,changeDetected++));if(oldLength>newLength){changeDetected++;for(key in oldValue)hasOwnProperty.call(newValue,key)||(oldLength--,delete oldValue[key])}}else oldValue!==newValue&&(oldValue=newValue,changeDetected++);return changeDetected}}function $watchCollectionAction(){if(initRun?(initRun=!1,listener(newValue,newValue,self)):listener(newValue,veryOldValue,self),trackVeryOldValue)if(isObject(newValue))if(isArrayLike(newValue)){veryOldValue=new Array(newValue.length);for(var i=0;i<newValue.length;i++)veryOldValue[i]=newValue[i]}else{veryOldValue={};for(var key in newValue)hasOwnProperty.call(newValue,key)&&(veryOldValue[key]=newValue[key])}else veryOldValue=newValue}$watchCollectionInterceptor.$stateful=!0;var newValue,oldValue,veryOldValue,self=this,trackVeryOldValue=listener.length>1,changeDetected=0,changeDetector=$parse(obj,$watchCollectionInterceptor),internalArray=[],internalObject={},initRun=!0,oldLength=0;return this.$watch(changeDetector,$watchCollectionAction)},$digest:function(){var watch,value,last,fn,get,watchers,dirty,next,current,logIdx,asyncTask,ttl=TTL,target=this,watchLog=[];beginPhase("$digest"),$browser.$$checkUrlChange(),this===$rootScope&&null!==applyAsyncId&&($browser.defer.cancel(applyAsyncId),flushApplyAsync()),lastDirtyWatch=null;do{dirty=!1,current=target;for(var asyncQueuePosition=0;asyncQueuePosition<asyncQueue.length;asyncQueuePosition++){try{asyncTask=asyncQueue[asyncQueuePosition],fn=asyncTask.fn,fn(asyncTask.scope,asyncTask.locals)}catch(e){$exceptionHandler(e)}lastDirtyWatch=null}asyncQueue.length=0;traverseScopesLoop:do{if(watchers=current.$$watchers)for(watchers.$$digestWatchIndex=watchers.length;watchers.$$digestWatchIndex--;)try{if(watch=watchers[watchers.$$digestWatchIndex])if(get=watch.get,(value=get(current))===(last=watch.last)||(watch.eq?equals(value,last):isNumberNaN(value)&&isNumberNaN(last))){if(watch===lastDirtyWatch){dirty=!1;break traverseScopesLoop}}else dirty=!0,lastDirtyWatch=watch,watch.last=watch.eq?copy(value,null):value,fn=watch.fn,fn(value,last===initWatchVal?value:last,current),ttl<5&&(logIdx=4-ttl,watchLog[logIdx]||(watchLog[logIdx]=[]),watchLog[logIdx].push({msg:isFunction(watch.exp)?"fn: "+(watch.exp.name||watch.exp.toString()):watch.exp,newVal:value,oldVal:last}))}catch(e){$exceptionHandler(e)}if(!(next=current.$$watchersCount&&current.$$childHead||current!==target&&current.$$nextSibling))for(;current!==target&&!(next=current.$$nextSibling);)current=current.$parent}while(current=next);if((dirty||asyncQueue.length)&&!ttl--)throw clearPhase(),$rootScopeMinErr("infdig","{0} $digest() iterations reached. Aborting!\nWatchers fired in the last 5 iterations: {1}",TTL,watchLog)}while(dirty||asyncQueue.length);for(clearPhase();postDigestQueuePosition<postDigestQueue.length;)try{postDigestQueue[postDigestQueuePosition++]()}catch(e){$exceptionHandler(e)}postDigestQueue.length=postDigestQueuePosition=0,$browser.$$checkUrlChange()},$destroy:function(){if(!this.$$destroyed){var parent=this.$parent;this.$broadcast("$destroy"),this.$$destroyed=!0,this===$rootScope&&$browser.$$applicationDestroyed(),incrementWatchersCount(this,-this.$$watchersCount);for(var eventName in this.$$listenerCount)decrementListenerCount(this,this.$$listenerCount[eventName],eventName);parent&&parent.$$childHead===this&&(parent.$$childHead=this.$$nextSibling),parent&&parent.$$childTail===this&&(parent.$$childTail=this.$$prevSibling),this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling),this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling),this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=noop,this.$on=this.$watch=this.$watchGroup=function(){return noop},this.$$listeners={},this.$$nextSibling=null,cleanUpScope(this)}},$eval:function(expr,locals){return $parse(expr)(this,locals)},$evalAsync:function(expr,locals){$rootScope.$$phase||asyncQueue.length||$browser.defer(function(){asyncQueue.length&&$rootScope.$digest()}),asyncQueue.push({scope:this,fn:$parse(expr),locals:locals})},$$postDigest:function(fn){postDigestQueue.push(fn)},$apply:function(expr){try{beginPhase("$apply");try{return this.$eval(expr)}finally{clearPhase()}}catch(e){$exceptionHandler(e)}finally{try{$rootScope.$digest()}catch(e){throw $exceptionHandler(e),e}}},$applyAsync:function(expr){function $applyAsyncExpression(){scope.$eval(expr)}var scope=this;expr&&applyAsyncQueue.push($applyAsyncExpression),expr=$parse(expr),scheduleApplyAsync()},$on:function(name,listener){var namedListeners=this.$$listeners[name];namedListeners||(this.$$listeners[name]=namedListeners=[]),namedListeners.push(listener);var current=this;do current.$$listenerCount[name]||(current.$$listenerCount[name]=0),current.$$listenerCount[name]++;while(current=current.$parent);var self=this;return function(){var indexOfListener=namedListeners.indexOf(listener);indexOfListener!==-1&&(namedListeners[indexOfListener]=null,decrementListenerCount(self,1,name))}},$emit:function(name,args){var namedListeners,i,length,empty=[],scope=this,stopPropagation=!1,event={name:name,targetScope:scope,stopPropagation:function(){stopPropagation=!0},preventDefault:function(){event.defaultPrevented=!0},defaultPrevented:!1},listenerArgs=concat([event],arguments,1);do{for(namedListeners=scope.$$listeners[name]||empty,event.currentScope=scope,i=0,length=namedListeners.length;i<length;i++)if(namedListeners[i])try{namedListeners[i].apply(null,listenerArgs)}catch(e){$exceptionHandler(e)}else namedListeners.splice(i,1),i--,length--;if(stopPropagation)return event.currentScope=null,event;scope=scope.$parent}while(scope);return event.currentScope=null,event},$broadcast:function(name,args){var target=this,current=target,next=target,event={name:name,targetScope:target,preventDefault:function(){event.defaultPrevented=!0},defaultPrevented:!1};if(!target.$$listenerCount[name])return event;for(var listeners,i,length,listenerArgs=concat([event],arguments,1);current=next;){for(event.currentScope=current,listeners=current.$$listeners[name]||[],i=0,length=listeners.length;i<length;i++)if(listeners[i])try{listeners[i].apply(null,listenerArgs)}catch(e){$exceptionHandler(e)}else listeners.splice(i,1),i--,length--;if(!(next=current.$$listenerCount[name]&&current.$$childHead||current!==target&&current.$$nextSibling))for(;current!==target&&!(next=current.$$nextSibling);)current=current.$parent}return event.currentScope=null,event}};var $rootScope=new Scope,asyncQueue=$rootScope.$$asyncQueue=[],postDigestQueue=$rootScope.$$postDigestQueue=[],applyAsyncQueue=$rootScope.$$applyAsyncQueue=[],postDigestQueuePosition=0;return $rootScope}]}function $$SanitizeUriProvider(){var aHrefSanitizationWhitelist=/^\s*(https?|ftp|mailto|tel|file):/,imgSrcSanitizationWhitelist=/^\s*((https?|ftp|file|blob):|data:image\/)/;this.aHrefSanitizationWhitelist=function(regexp){return isDefined(regexp)?(aHrefSanitizationWhitelist=regexp,this):aHrefSanitizationWhitelist},this.imgSrcSanitizationWhitelist=function(regexp){return isDefined(regexp)?(imgSrcSanitizationWhitelist=regexp,this):imgSrcSanitizationWhitelist},this.$get=function(){return function(uri,isImage){var normalizedVal,regex=isImage?imgSrcSanitizationWhitelist:aHrefSanitizationWhitelist;return normalizedVal=urlResolve(uri).href,""===normalizedVal||normalizedVal.match(regex)?uri:"unsafe:"+normalizedVal}}}function snakeToCamel(name){return name.replace(UNDERSCORE_LOWERCASE_REGEXP,fnCamelCaseReplace)}function adjustMatcher(matcher){if("self"===matcher)return matcher;if(isString(matcher)){if(matcher.indexOf("***")>-1)throw $sceMinErr("iwcard","Illegal sequence *** in string matcher.  String: {0}",matcher);return matcher=escapeForRegexp(matcher).replace(/\\\*\\\*/g,".*").replace(/\\\*/g,"[^:/.?&;]*"),new RegExp("^"+matcher+"$")}if(isRegExp(matcher))return new RegExp("^"+matcher.source+"$");throw $sceMinErr("imatcher",'Matchers may only be "self", string patterns or RegExp objects')}function adjustMatchers(matchers){var adjustedMatchers=[];return isDefined(matchers)&&forEach(matchers,function(matcher){adjustedMatchers.push(adjustMatcher(matcher))}),adjustedMatchers}function $SceDelegateProvider(){this.SCE_CONTEXTS=SCE_CONTEXTS;var resourceUrlWhitelist=["self"],resourceUrlBlacklist=[];this.resourceUrlWhitelist=function(value){return arguments.length&&(resourceUrlWhitelist=adjustMatchers(value)),resourceUrlWhitelist},this.resourceUrlBlacklist=function(value){return arguments.length&&(resourceUrlBlacklist=adjustMatchers(value)),resourceUrlBlacklist},this.$get=["$injector",function($injector){function matchUrl(matcher,parsedUrl){return"self"===matcher?urlIsSameOrigin(parsedUrl):!!matcher.exec(parsedUrl.href)}function isResourceUrlAllowedByPolicy(url){var i,n,parsedUrl=urlResolve(url.toString()),allowed=!1;for(i=0,n=resourceUrlWhitelist.length;i<n;i++)if(matchUrl(resourceUrlWhitelist[i],parsedUrl)){allowed=!0;break}if(allowed)for(i=0,n=resourceUrlBlacklist.length;i<n;i++)if(matchUrl(resourceUrlBlacklist[i],parsedUrl)){allowed=!1;break}return allowed}function generateHolderType(Base){var holderType=function(trustedValue){this.$$unwrapTrustedValue=function(){return trustedValue}};return Base&&(holderType.prototype=new Base),holderType.prototype.valueOf=function(){return this.$$unwrapTrustedValue()},holderType.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()},holderType}function trustAs(type,trustedValue){var Constructor=byType.hasOwnProperty(type)?byType[type]:null;if(!Constructor)throw $sceMinErr("icontext","Attempted to trust a value in invalid context. Context: {0}; Value: {1}",type,trustedValue);if(null===trustedValue||isUndefined(trustedValue)||""===trustedValue)return trustedValue;if("string"!=typeof trustedValue)throw $sceMinErr("itype","Attempted to trust a non-string value in a content requiring a string: Context: {0}",type);return new Constructor(trustedValue)}function valueOf(maybeTrusted){return maybeTrusted instanceof trustedValueHolderBase?maybeTrusted.$$unwrapTrustedValue():maybeTrusted}function getTrusted(type,maybeTrusted){if(null===maybeTrusted||isUndefined(maybeTrusted)||""===maybeTrusted)return maybeTrusted;var constructor=byType.hasOwnProperty(type)?byType[type]:null;if(constructor&&maybeTrusted instanceof constructor)return maybeTrusted.$$unwrapTrustedValue();if(type===SCE_CONTEXTS.RESOURCE_URL){if(isResourceUrlAllowedByPolicy(maybeTrusted))return maybeTrusted;throw $sceMinErr("insecurl","Blocked loading resource from url not allowed by $sceDelegate policy.  URL: {0}",maybeTrusted.toString())}if(type===SCE_CONTEXTS.HTML)return htmlSanitizer(maybeTrusted);throw $sceMinErr("unsafe","Attempting to use an unsafe value in a safe context.")}var htmlSanitizer=function(html){throw $sceMinErr("unsafe","Attempting to use an unsafe value in a safe context.")};$injector.has("$sanitize")&&(htmlSanitizer=$injector.get("$sanitize"));var trustedValueHolderBase=generateHolderType(),byType={};return byType[SCE_CONTEXTS.HTML]=generateHolderType(trustedValueHolderBase),byType[SCE_CONTEXTS.CSS]=generateHolderType(trustedValueHolderBase),byType[SCE_CONTEXTS.URL]=generateHolderType(trustedValueHolderBase),byType[SCE_CONTEXTS.JS]=generateHolderType(trustedValueHolderBase),byType[SCE_CONTEXTS.RESOURCE_URL]=generateHolderType(byType[SCE_CONTEXTS.URL]),{trustAs:trustAs,getTrusted:getTrusted,valueOf:valueOf}}]}function $SceProvider(){var enabled=!0;this.enabled=function(value){return arguments.length&&(enabled=!!value),enabled},this.$get=["$parse","$sceDelegate",function($parse,$sceDelegate){if(enabled&&msie<8)throw $sceMinErr("iequirks","Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks mode.  You can fix this by adding the text <!doctype html> to the top of your HTML document.  See http://docs.angularjs.org/api/ng.$sce for more information.");var sce=shallowCopy(SCE_CONTEXTS);sce.isEnabled=function(){return enabled},sce.trustAs=$sceDelegate.trustAs,sce.getTrusted=$sceDelegate.getTrusted,sce.valueOf=$sceDelegate.valueOf,enabled||(sce.trustAs=sce.getTrusted=function(type,value){return value},sce.valueOf=identity),sce.parseAs=function(type,expr){var parsed=$parse(expr);return parsed.literal&&parsed.constant?parsed:$parse(expr,function(value){return sce.getTrusted(type,value)})};var parse=sce.parseAs,getTrusted=sce.getTrusted,trustAs=sce.trustAs;return forEach(SCE_CONTEXTS,function(enumValue,name){var lName=lowercase(name);sce[snakeToCamel("parse_as_"+lName)]=function(expr){return parse(enumValue,expr)},sce[snakeToCamel("get_trusted_"+lName)]=function(value){return getTrusted(enumValue,value)},sce[snakeToCamel("trust_as_"+lName)]=function(value){return trustAs(enumValue,value)}}),sce}]}function $SnifferProvider(){this.$get=["$window","$document",function($window,$document){
var eventSupport={},isNw=$window.nw&&$window.nw.process,isChromePackagedApp=!isNw&&$window.chrome&&($window.chrome.app&&$window.chrome.app.runtime||!$window.chrome.app&&$window.chrome.runtime&&$window.chrome.runtime.id),hasHistoryPushState=!isChromePackagedApp&&$window.history&&$window.history.pushState,android=toInt((/android (\d+)/.exec(lowercase(($window.navigator||{}).userAgent))||[])[1]),boxee=/Boxee/i.test(($window.navigator||{}).userAgent),document=$document[0]||{},bodyStyle=document.body&&document.body.style,transitions=!1,animations=!1;return bodyStyle&&(transitions=!!("transition"in bodyStyle||"webkitTransition"in bodyStyle),animations=!!("animation"in bodyStyle||"webkitAnimation"in bodyStyle)),{history:!(!hasHistoryPushState||android<4||boxee),hasEvent:function(event){if("input"===event&&msie)return!1;if(isUndefined(eventSupport[event])){var divElm=document.createElement("div");eventSupport[event]="on"+event in divElm}return eventSupport[event]},csp:csp(),transitions:transitions,animations:animations,android:android}}]}function $TemplateRequestProvider(){var httpOptions;this.httpOptions=function(val){return val?(httpOptions=val,this):httpOptions},this.$get=["$exceptionHandler","$templateCache","$http","$q","$sce",function($exceptionHandler,$templateCache,$http,$q,$sce){function handleRequestFn(tpl,ignoreRequestError){function handleError(resp){return ignoreRequestError||(resp=$templateRequestMinErr("tpload","Failed to load template: {0} (HTTP status: {1} {2})",tpl,resp.status,resp.statusText),$exceptionHandler(resp)),$q.reject(resp)}handleRequestFn.totalPendingRequests++,isString(tpl)&&!isUndefined($templateCache.get(tpl))||(tpl=$sce.getTrustedResourceUrl(tpl));var transformResponse=$http.defaults&&$http.defaults.transformResponse;return isArray(transformResponse)?transformResponse=transformResponse.filter(function(transformer){return transformer!==defaultHttpResponseTransform}):transformResponse===defaultHttpResponseTransform&&(transformResponse=null),$http.get(tpl,extend({cache:$templateCache,transformResponse:transformResponse},httpOptions))["finally"](function(){handleRequestFn.totalPendingRequests--}).then(function(response){return $templateCache.put(tpl,response.data),response.data},handleError)}return handleRequestFn.totalPendingRequests=0,handleRequestFn}]}function $$TestabilityProvider(){this.$get=["$rootScope","$browser","$location",function($rootScope,$browser,$location){var testability={};return testability.findBindings=function(element,expression,opt_exactMatch){var bindings=element.getElementsByClassName("ng-binding"),matches=[];return forEach(bindings,function(binding){var dataBinding=angular.element(binding).data("$binding");dataBinding&&forEach(dataBinding,function(bindingName){if(opt_exactMatch){var matcher=new RegExp("(^|\\s)"+escapeForRegexp(expression)+"(\\s|\\||$)");matcher.test(bindingName)&&matches.push(binding)}else bindingName.indexOf(expression)!==-1&&matches.push(binding)})}),matches},testability.findModels=function(element,expression,opt_exactMatch){for(var prefixes=["ng-","data-ng-","ng\\:"],p=0;p<prefixes.length;++p){var attributeEquals=opt_exactMatch?"=":"*=",selector="["+prefixes[p]+"model"+attributeEquals+'"'+expression+'"]',elements=element.querySelectorAll(selector);if(elements.length)return elements}},testability.getLocation=function(){return $location.url()},testability.setLocation=function(url){url!==$location.url()&&($location.url(url),$rootScope.$digest())},testability.whenStable=function(callback){$browser.notifyWhenNoOutstandingRequests(callback)},testability}]}function $TimeoutProvider(){this.$get=["$rootScope","$browser","$q","$$q","$exceptionHandler",function($rootScope,$browser,$q,$$q,$exceptionHandler){function timeout(fn,delay,invokeApply){isFunction(fn)||(invokeApply=delay,delay=fn,fn=noop);var timeoutId,args=sliceArgs(arguments,3),skipApply=isDefined(invokeApply)&&!invokeApply,deferred=(skipApply?$$q:$q).defer(),promise=deferred.promise;return timeoutId=$browser.defer(function(){try{deferred.resolve(fn.apply(null,args))}catch(e){deferred.reject(e),$exceptionHandler(e)}finally{delete deferreds[promise.$$timeoutId]}skipApply||$rootScope.$apply()},delay),promise.$$timeoutId=timeoutId,deferreds[timeoutId]=deferred,promise}var deferreds={};return timeout.cancel=function(promise){return!!(promise&&promise.$$timeoutId in deferreds)&&(deferreds[promise.$$timeoutId].promise["catch"](noop),deferreds[promise.$$timeoutId].reject("canceled"),delete deferreds[promise.$$timeoutId],$browser.defer.cancel(promise.$$timeoutId))},timeout}]}function urlResolve(url){var href=url;return msie&&(urlParsingNode.setAttribute("href",href),href=urlParsingNode.href),urlParsingNode.setAttribute("href",href),{href:urlParsingNode.href,protocol:urlParsingNode.protocol?urlParsingNode.protocol.replace(/:$/,""):"",host:urlParsingNode.host,search:urlParsingNode.search?urlParsingNode.search.replace(/^\?/,""):"",hash:urlParsingNode.hash?urlParsingNode.hash.replace(/^#/,""):"",hostname:urlParsingNode.hostname,port:urlParsingNode.port,pathname:"/"===urlParsingNode.pathname.charAt(0)?urlParsingNode.pathname:"/"+urlParsingNode.pathname}}function urlIsSameOrigin(requestUrl){var parsed=isString(requestUrl)?urlResolve(requestUrl):requestUrl;return parsed.protocol===originUrl.protocol&&parsed.host===originUrl.host}function $WindowProvider(){this.$get=valueFn(window)}function $$CookieReader($document){function safeGetCookie(rawDocument){try{return rawDocument.cookie||""}catch(e){return""}}function safeDecodeURIComponent(str){try{return decodeURIComponent(str)}catch(e){return str}}var rawDocument=$document[0]||{},lastCookies={},lastCookieString="";return function(){var cookieArray,cookie,i,index,name,currentCookieString=safeGetCookie(rawDocument);if(currentCookieString!==lastCookieString)for(lastCookieString=currentCookieString,cookieArray=lastCookieString.split("; "),lastCookies={},i=0;i<cookieArray.length;i++)cookie=cookieArray[i],index=cookie.indexOf("="),index>0&&(name=safeDecodeURIComponent(cookie.substring(0,index)),isUndefined(lastCookies[name])&&(lastCookies[name]=safeDecodeURIComponent(cookie.substring(index+1))));return lastCookies}}function $$CookieReaderProvider(){this.$get=$$CookieReader}function $FilterProvider($provide){function register(name,factory){if(isObject(name)){var filters={};return forEach(name,function(filter,key){filters[key]=register(key,filter)}),filters}return $provide.factory(name+suffix,factory)}var suffix="Filter";this.register=register,this.$get=["$injector",function($injector){return function(name){return $injector.get(name+suffix)}}],register("currency",currencyFilter),register("date",dateFilter),register("filter",filterFilter),register("json",jsonFilter),register("limitTo",limitToFilter),register("lowercase",lowercaseFilter),register("number",numberFilter),register("orderBy",orderByFilter),register("uppercase",uppercaseFilter)}function filterFilter(){return function(array,expression,comparator,anyPropertyKey){if(!isArrayLike(array)){if(null==array)return array;throw minErr("filter")("notarray","Expected array but received: {0}",array)}anyPropertyKey=anyPropertyKey||"$";var predicateFn,matchAgainstAnyProp,expressionType=getTypeForFilter(expression);switch(expressionType){case"function":predicateFn=expression;break;case"boolean":case"null":case"number":case"string":matchAgainstAnyProp=!0;case"object":predicateFn=createPredicateFn(expression,comparator,anyPropertyKey,matchAgainstAnyProp);break;default:return array}return Array.prototype.filter.call(array,predicateFn)}}function createPredicateFn(expression,comparator,anyPropertyKey,matchAgainstAnyProp){var predicateFn,shouldMatchPrimitives=isObject(expression)&&anyPropertyKey in expression;return comparator===!0?comparator=equals:isFunction(comparator)||(comparator=function(actual,expected){return!isUndefined(actual)&&(null===actual||null===expected?actual===expected:!(isObject(expected)||isObject(actual)&&!hasCustomToString(actual))&&(actual=lowercase(""+actual),expected=lowercase(""+expected),actual.indexOf(expected)!==-1))}),predicateFn=function(item){return shouldMatchPrimitives&&!isObject(item)?deepCompare(item,expression[anyPropertyKey],comparator,anyPropertyKey,!1):deepCompare(item,expression,comparator,anyPropertyKey,matchAgainstAnyProp)}}function deepCompare(actual,expected,comparator,anyPropertyKey,matchAgainstAnyProp,dontMatchWholeObject){var actualType=getTypeForFilter(actual),expectedType=getTypeForFilter(expected);if("string"===expectedType&&"!"===expected.charAt(0))return!deepCompare(actual,expected.substring(1),comparator,anyPropertyKey,matchAgainstAnyProp);if(isArray(actual))return actual.some(function(item){return deepCompare(item,expected,comparator,anyPropertyKey,matchAgainstAnyProp)});switch(actualType){case"object":var key;if(matchAgainstAnyProp){for(key in actual)if(key.charAt&&"$"!==key.charAt(0)&&deepCompare(actual[key],expected,comparator,anyPropertyKey,!0))return!0;return!dontMatchWholeObject&&deepCompare(actual,expected,comparator,anyPropertyKey,!1)}if("object"===expectedType){for(key in expected){var expectedVal=expected[key];if(!isFunction(expectedVal)&&!isUndefined(expectedVal)){var matchAnyProperty=key===anyPropertyKey,actualVal=matchAnyProperty?actual:actual[key];if(!deepCompare(actualVal,expectedVal,comparator,anyPropertyKey,matchAnyProperty,matchAnyProperty))return!1}}return!0}return comparator(actual,expected);case"function":return!1;default:return comparator(actual,expected)}}function getTypeForFilter(val){return null===val?"null":typeof val}function currencyFilter($locale){var formats=$locale.NUMBER_FORMATS;return function(amount,currencySymbol,fractionSize){return isUndefined(currencySymbol)&&(currencySymbol=formats.CURRENCY_SYM),isUndefined(fractionSize)&&(fractionSize=formats.PATTERNS[1].maxFrac),null==amount?amount:formatNumber(amount,formats.PATTERNS[1],formats.GROUP_SEP,formats.DECIMAL_SEP,fractionSize).replace(/\u00A4/g,currencySymbol)}}function numberFilter($locale){var formats=$locale.NUMBER_FORMATS;return function(number,fractionSize){return null==number?number:formatNumber(number,formats.PATTERNS[0],formats.GROUP_SEP,formats.DECIMAL_SEP,fractionSize)}}function parse(numStr){var digits,numberOfIntegerDigits,i,j,zeros,exponent=0;for((numberOfIntegerDigits=numStr.indexOf(DECIMAL_SEP))>-1&&(numStr=numStr.replace(DECIMAL_SEP,"")),(i=numStr.search(/e/i))>0?(numberOfIntegerDigits<0&&(numberOfIntegerDigits=i),numberOfIntegerDigits+=+numStr.slice(i+1),numStr=numStr.substring(0,i)):numberOfIntegerDigits<0&&(numberOfIntegerDigits=numStr.length),i=0;numStr.charAt(i)===ZERO_CHAR;i++);if(i===(zeros=numStr.length))digits=[0],numberOfIntegerDigits=1;else{for(zeros--;numStr.charAt(zeros)===ZERO_CHAR;)zeros--;for(numberOfIntegerDigits-=i,digits=[],j=0;i<=zeros;i++,j++)digits[j]=+numStr.charAt(i)}return numberOfIntegerDigits>MAX_DIGITS&&(digits=digits.splice(0,MAX_DIGITS-1),exponent=numberOfIntegerDigits-1,numberOfIntegerDigits=1),{d:digits,e:exponent,i:numberOfIntegerDigits}}function roundNumber(parsedNumber,fractionSize,minFrac,maxFrac){var digits=parsedNumber.d,fractionLen=digits.length-parsedNumber.i;fractionSize=isUndefined(fractionSize)?Math.min(Math.max(minFrac,fractionLen),maxFrac):+fractionSize;var roundAt=fractionSize+parsedNumber.i,digit=digits[roundAt];if(roundAt>0){digits.splice(Math.max(parsedNumber.i,roundAt));for(var j=roundAt;j<digits.length;j++)digits[j]=0}else{fractionLen=Math.max(0,fractionLen),parsedNumber.i=1,digits.length=Math.max(1,roundAt=fractionSize+1),digits[0]=0;for(var i=1;i<roundAt;i++)digits[i]=0}if(digit>=5)if(roundAt-1<0){for(var k=0;k>roundAt;k--)digits.unshift(0),parsedNumber.i++;digits.unshift(1),parsedNumber.i++}else digits[roundAt-1]++;for(;fractionLen<Math.max(0,fractionSize);fractionLen++)digits.push(0);var carry=digits.reduceRight(function(carry,d,i,digits){return d+=carry,digits[i]=d%10,Math.floor(d/10)},0);carry&&(digits.unshift(carry),parsedNumber.i++)}function formatNumber(number,pattern,groupSep,decimalSep,fractionSize){if(!isString(number)&&!isNumber(number)||isNaN(number))return"";var parsedNumber,isInfinity=!isFinite(number),isZero=!1,numStr=Math.abs(number)+"",formattedText="";if(isInfinity)formattedText="∞";else{parsedNumber=parse(numStr),roundNumber(parsedNumber,fractionSize,pattern.minFrac,pattern.maxFrac);var digits=parsedNumber.d,integerLen=parsedNumber.i,exponent=parsedNumber.e,decimals=[];for(isZero=digits.reduce(function(isZero,d){return isZero&&!d},!0);integerLen<0;)digits.unshift(0),integerLen++;integerLen>0?decimals=digits.splice(integerLen,digits.length):(decimals=digits,digits=[0]);var groups=[];for(digits.length>=pattern.lgSize&&groups.unshift(digits.splice(-pattern.lgSize,digits.length).join(""));digits.length>pattern.gSize;)groups.unshift(digits.splice(-pattern.gSize,digits.length).join(""));digits.length&&groups.unshift(digits.join("")),formattedText=groups.join(groupSep),decimals.length&&(formattedText+=decimalSep+decimals.join("")),exponent&&(formattedText+="e+"+exponent)}return number<0&&!isZero?pattern.negPre+formattedText+pattern.negSuf:pattern.posPre+formattedText+pattern.posSuf}function padNumber(num,digits,trim,negWrap){var neg="";for((num<0||negWrap&&num<=0)&&(negWrap?num=-num+1:(num=-num,neg="-")),num=""+num;num.length<digits;)num=ZERO_CHAR+num;return trim&&(num=num.substr(num.length-digits)),neg+num}function dateGetter(name,size,offset,trim,negWrap){return offset=offset||0,function(date){var value=date["get"+name]();return(offset>0||value>-offset)&&(value+=offset),0===value&&offset===-12&&(value=12),padNumber(value,size,trim,negWrap)}}function dateStrGetter(name,shortForm,standAlone){return function(date,formats){var value=date["get"+name](),propPrefix=(standAlone?"STANDALONE":"")+(shortForm?"SHORT":""),get=uppercase(propPrefix+name);return formats[get][value]}}function timeZoneGetter(date,formats,offset){var zone=-1*offset,paddedZone=zone>=0?"+":"";return paddedZone+=padNumber(Math[zone>0?"floor":"ceil"](zone/60),2)+padNumber(Math.abs(zone%60),2)}function getFirstThursdayOfYear(year){var dayOfWeekOnFirst=new Date(year,0,1).getDay();return new Date(year,0,(dayOfWeekOnFirst<=4?5:12)-dayOfWeekOnFirst)}function getThursdayThisWeek(datetime){return new Date(datetime.getFullYear(),datetime.getMonth(),datetime.getDate()+(4-datetime.getDay()))}function weekGetter(size){return function(date){var firstThurs=getFirstThursdayOfYear(date.getFullYear()),thisThurs=getThursdayThisWeek(date),diff=+thisThurs-+firstThurs,result=1+Math.round(diff/6048e5);return padNumber(result,size)}}function ampmGetter(date,formats){return date.getHours()<12?formats.AMPMS[0]:formats.AMPMS[1]}function eraGetter(date,formats){return date.getFullYear()<=0?formats.ERAS[0]:formats.ERAS[1]}function longEraGetter(date,formats){return date.getFullYear()<=0?formats.ERANAMES[0]:formats.ERANAMES[1]}function dateFilter($locale){function jsonStringToDate(string){var match;if(match=string.match(R_ISO8601_STR)){var date=new Date(0),tzHour=0,tzMin=0,dateSetter=match[8]?date.setUTCFullYear:date.setFullYear,timeSetter=match[8]?date.setUTCHours:date.setHours;match[9]&&(tzHour=toInt(match[9]+match[10]),tzMin=toInt(match[9]+match[11])),dateSetter.call(date,toInt(match[1]),toInt(match[2])-1,toInt(match[3]));var h=toInt(match[4]||0)-tzHour,m=toInt(match[5]||0)-tzMin,s=toInt(match[6]||0),ms=Math.round(1e3*parseFloat("0."+(match[7]||0)));return timeSetter.call(date,h,m,s,ms),date}return string}var R_ISO8601_STR=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(date,format,timezone){var fn,match,text="",parts=[];if(format=format||"mediumDate",format=$locale.DATETIME_FORMATS[format]||format,isString(date)&&(date=NUMBER_STRING.test(date)?toInt(date):jsonStringToDate(date)),isNumber(date)&&(date=new Date(date)),!isDate(date)||!isFinite(date.getTime()))return date;for(;format;)match=DATE_FORMATS_SPLIT.exec(format),match?(parts=concat(parts,match,1),format=parts.pop()):(parts.push(format),format=null);var dateTimezoneOffset=date.getTimezoneOffset();return timezone&&(dateTimezoneOffset=timezoneToOffset(timezone,dateTimezoneOffset),date=convertTimezoneToLocal(date,timezone,!0)),forEach(parts,function(value){fn=DATE_FORMATS[value],text+=fn?fn(date,$locale.DATETIME_FORMATS,dateTimezoneOffset):"''"===value?"'":value.replace(/(^'|'$)/g,"").replace(/''/g,"'")}),text}}function jsonFilter(){return function(object,spacing){return isUndefined(spacing)&&(spacing=2),toJson(object,spacing)}}function limitToFilter(){return function(input,limit,begin){return limit=Math.abs(Number(limit))===1/0?Number(limit):toInt(limit),isNumberNaN(limit)?input:(isNumber(input)&&(input=input.toString()),isArrayLike(input)?(begin=!begin||isNaN(begin)?0:toInt(begin),begin=begin<0?Math.max(0,input.length+begin):begin,limit>=0?sliceFn(input,begin,begin+limit):0===begin?sliceFn(input,limit,input.length):sliceFn(input,Math.max(0,begin+limit),begin)):input)}}function sliceFn(input,begin,end){return isString(input)?input.slice(begin,end):slice.call(input,begin,end)}function orderByFilter($parse){function processPredicates(sortPredicates){return sortPredicates.map(function(predicate){var descending=1,get=identity;if(isFunction(predicate))get=predicate;else if(isString(predicate)&&("+"!==predicate.charAt(0)&&"-"!==predicate.charAt(0)||(descending="-"===predicate.charAt(0)?-1:1,predicate=predicate.substring(1)),""!==predicate&&(get=$parse(predicate),get.constant))){var key=get();get=function(value){return value[key]}}return{get:get,descending:descending}})}function isPrimitive(value){switch(typeof value){case"number":case"boolean":case"string":return!0;default:return!1}}function objectValue(value){return isFunction(value.valueOf)&&(value=value.valueOf(),isPrimitive(value))?value:hasCustomToString(value)&&(value=value.toString(),isPrimitive(value))?value:value}function getPredicateValue(value,index){var type=typeof value;return null===value?(type="string",value="null"):"object"===type&&(value=objectValue(value)),{value:value,type:type,index:index}}function defaultCompare(v1,v2){var result=0,type1=v1.type,type2=v2.type;if(type1===type2){var value1=v1.value,value2=v2.value;"string"===type1?(value1=value1.toLowerCase(),value2=value2.toLowerCase()):"object"===type1&&(isObject(value1)&&(value1=v1.index),isObject(value2)&&(value2=v2.index)),value1!==value2&&(result=value1<value2?-1:1)}else result=type1<type2?-1:1;return result}return function(array,sortPredicate,reverseOrder,compareFn){function getComparisonObject(value,index){return{value:value,tieBreaker:{value:index,type:"number",index:index},predicateValues:predicates.map(function(predicate){return getPredicateValue(predicate.get(value),index)})}}function doComparison(v1,v2){for(var i=0,ii=predicates.length;i<ii;i++){var result=compare(v1.predicateValues[i],v2.predicateValues[i]);if(result)return result*predicates[i].descending*descending}return compare(v1.tieBreaker,v2.tieBreaker)*descending}if(null==array)return array;if(!isArrayLike(array))throw minErr("orderBy")("notarray","Expected array but received: {0}",array);isArray(sortPredicate)||(sortPredicate=[sortPredicate]),0===sortPredicate.length&&(sortPredicate=["+"]);var predicates=processPredicates(sortPredicate),descending=reverseOrder?-1:1,compare=isFunction(compareFn)?compareFn:defaultCompare,compareValues=Array.prototype.map.call(array,getComparisonObject);return compareValues.sort(doComparison),array=compareValues.map(function(item){return item.value})}}function ngDirective(directive){return isFunction(directive)&&(directive={link:directive}),directive.restrict=directive.restrict||"AC",valueFn(directive)}function nullFormRenameControl(control,name){control.$name=name}function FormController($element,$attrs,$scope,$animate,$interpolate){this.$$controls=[],this.$error={},this.$$success={},this.$pending=void 0,this.$name=$interpolate($attrs.name||$attrs.ngForm||"")($scope),this.$dirty=!1,this.$pristine=!0,this.$valid=!0,this.$invalid=!1,this.$submitted=!1,this.$$parentForm=nullFormCtrl,this.$$element=$element,this.$$animate=$animate,setupValidity(this)}function setupValidity(instance){instance.$$classCache={},instance.$$classCache[INVALID_CLASS]=!(instance.$$classCache[VALID_CLASS]=instance.$$element.hasClass(VALID_CLASS))}function addSetValidityMethod(context){function createAndSet(ctrl,name,value,controller){ctrl[name]||(ctrl[name]={}),set(ctrl[name],value,controller)}function unsetAndCleanup(ctrl,name,value,controller){ctrl[name]&&unset(ctrl[name],value,controller),isObjectEmpty(ctrl[name])&&(ctrl[name]=void 0)}function cachedToggleClass(ctrl,className,switchValue){switchValue&&!ctrl.$$classCache[className]?(ctrl.$$animate.addClass(ctrl.$$element,className),ctrl.$$classCache[className]=!0):!switchValue&&ctrl.$$classCache[className]&&(ctrl.$$animate.removeClass(ctrl.$$element,className),ctrl.$$classCache[className]=!1)}function toggleValidationCss(ctrl,validationErrorKey,isValid){validationErrorKey=validationErrorKey?"-"+snake_case(validationErrorKey,"-"):"",cachedToggleClass(ctrl,VALID_CLASS+validationErrorKey,isValid===!0),cachedToggleClass(ctrl,INVALID_CLASS+validationErrorKey,isValid===!1)}var clazz=context.clazz,set=context.set,unset=context.unset;clazz.prototype.$setValidity=function(validationErrorKey,state,controller){isUndefined(state)?createAndSet(this,"$pending",validationErrorKey,controller):unsetAndCleanup(this,"$pending",validationErrorKey,controller),isBoolean(state)?state?(unset(this.$error,validationErrorKey,controller),set(this.$$success,validationErrorKey,controller)):(set(this.$error,validationErrorKey,controller),unset(this.$$success,validationErrorKey,controller)):(unset(this.$error,validationErrorKey,controller),unset(this.$$success,validationErrorKey,controller)),this.$pending?(cachedToggleClass(this,PENDING_CLASS,!0),this.$valid=this.$invalid=void 0,toggleValidationCss(this,"",null)):(cachedToggleClass(this,PENDING_CLASS,!1),this.$valid=isObjectEmpty(this.$error),this.$invalid=!this.$valid,toggleValidationCss(this,"",this.$valid));var combinedState;combinedState=this.$pending&&this.$pending[validationErrorKey]?void 0:!this.$error[validationErrorKey]&&(!!this.$$success[validationErrorKey]||null),toggleValidationCss(this,validationErrorKey,combinedState),this.$$parentForm.$setValidity(validationErrorKey,combinedState,this)}}function isObjectEmpty(obj){if(obj)for(var prop in obj)if(obj.hasOwnProperty(prop))return!1;return!0}function stringBasedInputType(ctrl){ctrl.$formatters.push(function(value){return ctrl.$isEmpty(value)?value:value.toString()})}function textInputType(scope,element,attr,ctrl,$sniffer,$browser){baseInputType(scope,element,attr,ctrl,$sniffer,$browser),stringBasedInputType(ctrl)}function baseInputType(scope,element,attr,ctrl,$sniffer,$browser){var type=lowercase(element[0].type);if(!$sniffer.android){var composing=!1;element.on("compositionstart",function(){composing=!0}),element.on("compositionend",function(){composing=!1,listener()})}var timeout,listener=function(ev){if(timeout&&($browser.defer.cancel(timeout),timeout=null),!composing){var value=element.val(),event=ev&&ev.type;"password"===type||attr.ngTrim&&"false"===attr.ngTrim||(value=trim(value)),(ctrl.$viewValue!==value||""===value&&ctrl.$$hasNativeValidators)&&ctrl.$setViewValue(value,event)}};if($sniffer.hasEvent("input"))element.on("input",listener);else{var deferListener=function(ev,input,origValue){timeout||(timeout=$browser.defer(function(){timeout=null,input&&input.value===origValue||listener(ev)}))};element.on("keydown",function(event){var key=event.keyCode;91===key||15<key&&key<19||37<=key&&key<=40||deferListener(event,this,this.value)}),$sniffer.hasEvent("paste")&&element.on("paste cut",deferListener)}element.on("change",listener),PARTIAL_VALIDATION_TYPES[type]&&ctrl.$$hasNativeValidators&&type===attr.type&&element.on(PARTIAL_VALIDATION_EVENTS,function(ev){if(!timeout){var validity=this[VALIDITY_STATE_PROPERTY],origBadInput=validity.badInput,origTypeMismatch=validity.typeMismatch;timeout=$browser.defer(function(){timeout=null,validity.badInput===origBadInput&&validity.typeMismatch===origTypeMismatch||listener(ev)})}}),ctrl.$render=function(){var value=ctrl.$isEmpty(ctrl.$viewValue)?"":ctrl.$viewValue;element.val()!==value&&element.val(value)}}function weekParser(isoWeek,existingDate){if(isDate(isoWeek))return isoWeek;if(isString(isoWeek)){WEEK_REGEXP.lastIndex=0;var parts=WEEK_REGEXP.exec(isoWeek);if(parts){var year=+parts[1],week=+parts[2],hours=0,minutes=0,seconds=0,milliseconds=0,firstThurs=getFirstThursdayOfYear(year),addDays=7*(week-1);return existingDate&&(hours=existingDate.getHours(),minutes=existingDate.getMinutes(),seconds=existingDate.getSeconds(),milliseconds=existingDate.getMilliseconds()),new Date(year,0,firstThurs.getDate()+addDays,hours,minutes,seconds,milliseconds)}}return NaN}function createDateParser(regexp,mapping){return function(iso,date){var parts,map;if(isDate(iso))return iso;if(isString(iso)){if('"'===iso.charAt(0)&&'"'===iso.charAt(iso.length-1)&&(iso=iso.substring(1,iso.length-1)),ISO_DATE_REGEXP.test(iso))return new Date(iso);if(regexp.lastIndex=0,parts=regexp.exec(iso))return parts.shift(),map=date?{yyyy:date.getFullYear(),MM:date.getMonth()+1,dd:date.getDate(),HH:date.getHours(),mm:date.getMinutes(),ss:date.getSeconds(),sss:date.getMilliseconds()/1e3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},forEach(parts,function(part,index){index<mapping.length&&(map[mapping[index]]=+part)}),new Date(map.yyyy,map.MM-1,map.dd,map.HH,map.mm,map.ss||0,1e3*map.sss||0)}return NaN}}function createDateInputType(type,regexp,parseDate,format){return function(scope,element,attr,ctrl,$sniffer,$browser,$filter){function isValidDate(value){return value&&!(value.getTime&&value.getTime()!==value.getTime())}function parseObservedDateValue(val){return isDefined(val)&&!isDate(val)?parseDate(val)||void 0:val}badInputChecker(scope,element,attr,ctrl),baseInputType(scope,element,attr,ctrl,$sniffer,$browser);var previousDate,timezone=ctrl&&ctrl.$options.getOption("timezone");if(ctrl.$$parserName=type,ctrl.$parsers.push(function(value){if(ctrl.$isEmpty(value))return null;if(regexp.test(value)){var parsedDate=parseDate(value,previousDate);return timezone&&(parsedDate=convertTimezoneToLocal(parsedDate,timezone)),parsedDate}}),ctrl.$formatters.push(function(value){if(value&&!isDate(value))throw ngModelMinErr("datefmt","Expected `{0}` to be a date",value);return isValidDate(value)?(previousDate=value,previousDate&&timezone&&(previousDate=convertTimezoneToLocal(previousDate,timezone,!0)),$filter("date")(value,format,timezone)):(previousDate=null,"")}),isDefined(attr.min)||attr.ngMin){var minVal;ctrl.$validators.min=function(value){return!isValidDate(value)||isUndefined(minVal)||parseDate(value)>=minVal},attr.$observe("min",function(val){minVal=parseObservedDateValue(val),ctrl.$validate()})}if(isDefined(attr.max)||attr.ngMax){var maxVal;ctrl.$validators.max=function(value){return!isValidDate(value)||isUndefined(maxVal)||parseDate(value)<=maxVal},attr.$observe("max",function(val){maxVal=parseObservedDateValue(val),ctrl.$validate()})}}}function badInputChecker(scope,element,attr,ctrl){var node=element[0],nativeValidation=ctrl.$$hasNativeValidators=isObject(node.validity);nativeValidation&&ctrl.$parsers.push(function(value){var validity=element.prop(VALIDITY_STATE_PROPERTY)||{};return validity.badInput||validity.typeMismatch?void 0:value})}function numberFormatterParser(ctrl){ctrl.$$parserName="number",ctrl.$parsers.push(function(value){return ctrl.$isEmpty(value)?null:NUMBER_REGEXP.test(value)?parseFloat(value):void 0}),ctrl.$formatters.push(function(value){if(!ctrl.$isEmpty(value)){if(!isNumber(value))throw ngModelMinErr("numfmt","Expected `{0}` to be a number",value);value=value.toString()}return value})}function parseNumberAttrVal(val){return isDefined(val)&&!isNumber(val)&&(val=parseFloat(val)),isNumberNaN(val)?void 0:val}function isNumberInteger(num){return(0|num)===num}function countDecimals(num){var numString=num.toString(),decimalSymbolIndex=numString.indexOf(".");if(decimalSymbolIndex===-1){if(-1<num&&num<1){var match=/e-(\d+)$/.exec(numString);if(match)return Number(match[1])}return 0}return numString.length-decimalSymbolIndex-1}function isValidForStep(viewValue,stepBase,step){var value=Number(viewValue),isNonIntegerValue=!isNumberInteger(value),isNonIntegerStepBase=!isNumberInteger(stepBase),isNonIntegerStep=!isNumberInteger(step);if(isNonIntegerValue||isNonIntegerStepBase||isNonIntegerStep){var valueDecimals=isNonIntegerValue?countDecimals(value):0,stepBaseDecimals=isNonIntegerStepBase?countDecimals(stepBase):0,stepDecimals=isNonIntegerStep?countDecimals(step):0,decimalCount=Math.max(valueDecimals,stepBaseDecimals,stepDecimals),multiplier=Math.pow(10,decimalCount);value*=multiplier,stepBase*=multiplier,step*=multiplier,isNonIntegerValue&&(value=Math.round(value)),isNonIntegerStepBase&&(stepBase=Math.round(stepBase)),isNonIntegerStep&&(step=Math.round(step))}return(value-stepBase)%step===0}function numberInputType(scope,element,attr,ctrl,$sniffer,$browser){badInputChecker(scope,element,attr,ctrl),numberFormatterParser(ctrl),baseInputType(scope,element,attr,ctrl,$sniffer,$browser);var minVal,maxVal;if((isDefined(attr.min)||attr.ngMin)&&(ctrl.$validators.min=function(value){return ctrl.$isEmpty(value)||isUndefined(minVal)||value>=minVal},attr.$observe("min",function(val){minVal=parseNumberAttrVal(val),ctrl.$validate()})),(isDefined(attr.max)||attr.ngMax)&&(ctrl.$validators.max=function(value){return ctrl.$isEmpty(value)||isUndefined(maxVal)||value<=maxVal},attr.$observe("max",function(val){maxVal=parseNumberAttrVal(val),ctrl.$validate()})),isDefined(attr.step)||attr.ngStep){var stepVal;ctrl.$validators.step=function(modelValue,viewValue){return ctrl.$isEmpty(viewValue)||isUndefined(stepVal)||isValidForStep(viewValue,minVal||0,stepVal)},attr.$observe("step",function(val){stepVal=parseNumberAttrVal(val),ctrl.$validate()})}}function rangeInputType(scope,element,attr,ctrl,$sniffer,$browser){function setInitialValueAndObserver(htmlAttrName,changeFn){element.attr(htmlAttrName,attr[htmlAttrName]),attr.$observe(htmlAttrName,changeFn)}function minChange(val){if(minVal=parseNumberAttrVal(val),!isNumberNaN(ctrl.$modelValue))if(supportsRange){var elVal=element.val();minVal>elVal&&(elVal=minVal,element.val(elVal)),ctrl.$setViewValue(elVal)}else ctrl.$validate()}function maxChange(val){if(maxVal=parseNumberAttrVal(val),!isNumberNaN(ctrl.$modelValue))if(supportsRange){var elVal=element.val();maxVal<elVal&&(element.val(maxVal),elVal=maxVal<minVal?minVal:maxVal),ctrl.$setViewValue(elVal)}else ctrl.$validate()}function stepChange(val){stepVal=parseNumberAttrVal(val),isNumberNaN(ctrl.$modelValue)||(supportsRange&&ctrl.$viewValue!==element.val()?ctrl.$setViewValue(element.val()):ctrl.$validate())}badInputChecker(scope,element,attr,ctrl),numberFormatterParser(ctrl),baseInputType(scope,element,attr,ctrl,$sniffer,$browser);var supportsRange=ctrl.$$hasNativeValidators&&"range"===element[0].type,minVal=supportsRange?0:void 0,maxVal=supportsRange?100:void 0,stepVal=supportsRange?1:void 0,validity=element[0].validity,hasMinAttr=isDefined(attr.min),hasMaxAttr=isDefined(attr.max),hasStepAttr=isDefined(attr.step),originalRender=ctrl.$render;ctrl.$render=supportsRange&&isDefined(validity.rangeUnderflow)&&isDefined(validity.rangeOverflow)?function(){originalRender(),ctrl.$setViewValue(element.val())}:originalRender,hasMinAttr&&(ctrl.$validators.min=supportsRange?function(){return!0}:function(modelValue,viewValue){return ctrl.$isEmpty(viewValue)||isUndefined(minVal)||viewValue>=minVal},setInitialValueAndObserver("min",minChange)),hasMaxAttr&&(ctrl.$validators.max=supportsRange?function(){return!0}:function(modelValue,viewValue){return ctrl.$isEmpty(viewValue)||isUndefined(maxVal)||viewValue<=maxVal},setInitialValueAndObserver("max",maxChange)),hasStepAttr&&(ctrl.$validators.step=supportsRange?function(){return!validity.stepMismatch}:function(modelValue,viewValue){
return ctrl.$isEmpty(viewValue)||isUndefined(stepVal)||isValidForStep(viewValue,minVal||0,stepVal)},setInitialValueAndObserver("step",stepChange))}function urlInputType(scope,element,attr,ctrl,$sniffer,$browser){baseInputType(scope,element,attr,ctrl,$sniffer,$browser),stringBasedInputType(ctrl),ctrl.$$parserName="url",ctrl.$validators.url=function(modelValue,viewValue){var value=modelValue||viewValue;return ctrl.$isEmpty(value)||URL_REGEXP.test(value)}}function emailInputType(scope,element,attr,ctrl,$sniffer,$browser){baseInputType(scope,element,attr,ctrl,$sniffer,$browser),stringBasedInputType(ctrl),ctrl.$$parserName="email",ctrl.$validators.email=function(modelValue,viewValue){var value=modelValue||viewValue;return ctrl.$isEmpty(value)||EMAIL_REGEXP.test(value)}}function radioInputType(scope,element,attr,ctrl){var doTrim=!attr.ngTrim||"false"!==trim(attr.ngTrim);isUndefined(attr.name)&&element.attr("name",nextUid());var listener=function(ev){var value;element[0].checked&&(value=attr.value,doTrim&&(value=trim(value)),ctrl.$setViewValue(value,ev&&ev.type))};element.on("click",listener),ctrl.$render=function(){var value=attr.value;doTrim&&(value=trim(value)),element[0].checked=value===ctrl.$viewValue},attr.$observe("value",ctrl.$render)}function parseConstantExpr($parse,context,name,expression,fallback){var parseFn;if(isDefined(expression)){if(parseFn=$parse(expression),!parseFn.constant)throw ngModelMinErr("constexpr","Expected constant expression for `{0}`, but saw `{1}`.",name,expression);return parseFn(context)}return fallback}function checkboxInputType(scope,element,attr,ctrl,$sniffer,$browser,$filter,$parse){var trueValue=parseConstantExpr($parse,scope,"ngTrueValue",attr.ngTrueValue,!0),falseValue=parseConstantExpr($parse,scope,"ngFalseValue",attr.ngFalseValue,!1),listener=function(ev){ctrl.$setViewValue(element[0].checked,ev&&ev.type)};element.on("click",listener),ctrl.$render=function(){element[0].checked=ctrl.$viewValue},ctrl.$isEmpty=function(value){return value===!1},ctrl.$formatters.push(function(value){return equals(value,trueValue)}),ctrl.$parsers.push(function(value){return value?trueValue:falseValue})}function classDirective(name,selector){function arrayDifference(tokens1,tokens2){if(!tokens1||!tokens1.length)return[];if(!tokens2||!tokens2.length)return tokens1;var values=[];outer:for(var i=0;i<tokens1.length;i++){for(var token=tokens1[i],j=0;j<tokens2.length;j++)if(token===tokens2[j])continue outer;values.push(token)}return values}function split(classString){return classString&&classString.split(" ")}function toClassString(classValue){var classString=classValue;return isArray(classValue)?classString=classValue.map(toClassString).join(" "):isObject(classValue)&&(classString=Object.keys(classValue).filter(function(key){return classValue[key]}).join(" ")),classString}function toFlatValue(classValue){var flatValue=classValue;if(isArray(classValue))flatValue=classValue.map(toFlatValue);else if(isObject(classValue)){var hasUndefined=!1;flatValue=Object.keys(classValue).filter(function(key){var value=classValue[key];return!hasUndefined&&isUndefined(value)&&(hasUndefined=!0),value}),hasUndefined&&flatValue.push(void 0)}return flatValue}name="ngClass"+name;var indexWatchExpression;return["$parse",function($parse){return{restrict:"AC",link:function(scope,element,attr){function addClasses(classString){classString=digestClassCounts(split(classString),1),attr.$addClass(classString)}function removeClasses(classString){classString=digestClassCounts(split(classString),-1),attr.$removeClass(classString)}function updateClasses(oldClassString,newClassString){var oldClassArray=split(oldClassString),newClassArray=split(newClassString),toRemoveArray=arrayDifference(oldClassArray,newClassArray),toAddArray=arrayDifference(newClassArray,oldClassArray),toRemoveString=digestClassCounts(toRemoveArray,-1),toAddString=digestClassCounts(toAddArray,1);attr.$addClass(toAddString),attr.$removeClass(toRemoveString)}function digestClassCounts(classArray,count){var classesToUpdate=[];return forEach(classArray,function(className){(count>0||classCounts[className])&&(classCounts[className]=(classCounts[className]||0)+count,classCounts[className]===+(count>0)&&classesToUpdate.push(className))}),classesToUpdate.join(" ")}function ngClassIndexWatchAction(newModulo){newModulo===selector?addClasses(oldClassString):removeClasses(oldClassString),oldModulo=newModulo}function ngClassOneTimeWatchAction(newClassValue){var newClassString=toClassString(newClassValue);newClassString!==oldClassString&&ngClassWatchAction(newClassString)}function ngClassWatchAction(newClassString){oldModulo===selector&&updateClasses(oldClassString,newClassString),oldClassString=newClassString}var oldClassString,expression=attr[name].trim(),isOneTime=":"===expression.charAt(0)&&":"===expression.charAt(1),watchInterceptor=isOneTime?toFlatValue:toClassString,watchExpression=$parse(expression,watchInterceptor),watchAction=isOneTime?ngClassOneTimeWatchAction:ngClassWatchAction,classCounts=element.data("$classCounts"),oldModulo=!0;classCounts||(classCounts=createMap(),element.data("$classCounts",classCounts)),"ngClass"!==name&&(indexWatchExpression||(indexWatchExpression=$parse("$index",function($index){return 1&$index})),scope.$watch(indexWatchExpression,ngClassIndexWatchAction)),scope.$watch(watchExpression,watchAction,isOneTime)}}}]}function NgModelController($scope,$exceptionHandler,$attr,$element,$parse,$animate,$timeout,$q,$interpolate){this.$viewValue=Number.NaN,this.$modelValue=Number.NaN,this.$$rawModelValue=void 0,this.$validators={},this.$asyncValidators={},this.$parsers=[],this.$formatters=[],this.$viewChangeListeners=[],this.$untouched=!0,this.$touched=!1,this.$pristine=!0,this.$dirty=!1,this.$valid=!0,this.$invalid=!1,this.$error={},this.$$success={},this.$pending=void 0,this.$name=$interpolate($attr.name||"",!1)($scope),this.$$parentForm=nullFormCtrl,this.$options=defaultModelOptions,this.$$parsedNgModel=$parse($attr.ngModel),this.$$parsedNgModelAssign=this.$$parsedNgModel.assign,this.$$ngModelGet=this.$$parsedNgModel,this.$$ngModelSet=this.$$parsedNgModelAssign,this.$$pendingDebounce=null,this.$$parserValid=void 0,this.$$currentValidationRunId=0,this.$$scope=$scope,this.$$attr=$attr,this.$$element=$element,this.$$animate=$animate,this.$$timeout=$timeout,this.$$parse=$parse,this.$$q=$q,this.$$exceptionHandler=$exceptionHandler,setupValidity(this),setupModelWatcher(this)}function setupModelWatcher(ctrl){ctrl.$$scope.$watch(function(){var modelValue=ctrl.$$ngModelGet(ctrl.$$scope);if(modelValue!==ctrl.$modelValue&&(ctrl.$modelValue===ctrl.$modelValue||modelValue===modelValue)){ctrl.$modelValue=ctrl.$$rawModelValue=modelValue,ctrl.$$parserValid=void 0;for(var formatters=ctrl.$formatters,idx=formatters.length,viewValue=modelValue;idx--;)viewValue=formatters[idx](viewValue);ctrl.$viewValue!==viewValue&&(ctrl.$$updateEmptyClasses(viewValue),ctrl.$viewValue=ctrl.$$lastCommittedViewValue=viewValue,ctrl.$render(),ctrl.$$runValidators(ctrl.$modelValue,ctrl.$viewValue,noop))}return modelValue})}function ModelOptions(options){this.$$options=options}function defaults(dst,src){forEach(src,function(value,key){isDefined(dst[key])||(dst[key]=value)})}function setOptionSelectedStatus(optionEl,value){optionEl.prop("selected",value),optionEl.attr("selected",value)}var REGEX_STRING_REGEXP=/^\/(.+)\/([a-z]*)$/,VALIDITY_STATE_PROPERTY="validity",hasOwnProperty=Object.prototype.hasOwnProperty,minErrConfig={objectMaxDepth:5},lowercase=function(string){return isString(string)?string.toLowerCase():string},uppercase=function(string){return isString(string)?string.toUpperCase():string},manualLowercase=function(s){return isString(s)?s.replace(/[A-Z]/g,function(ch){return String.fromCharCode(32|ch.charCodeAt(0))}):s},manualUppercase=function(s){return isString(s)?s.replace(/[a-z]/g,function(ch){return String.fromCharCode(ch.charCodeAt(0)&-33)}):s};"i"!=="I".toLowerCase()&&(lowercase=manualLowercase,uppercase=manualUppercase);var msie,jqLite,jQuery,angularModule,slice=[].slice,splice=[].splice,push=[].push,toString=Object.prototype.toString,getPrototypeOf=Object.getPrototypeOf,ngMinErr=minErr("ng"),angular=window.angular||(window.angular={}),uid=0;msie=window.document.documentMode;var isNumberNaN=Number.isNaN||function(num){return num!==num};noop.$inject=[],identity.$inject=[];var isArray=Array.isArray,TYPED_ARRAY_REGEXP=/^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array]$/,trim=function(value){return isString(value)?value.trim():value},escapeForRegexp=function(s){return s.replace(/([-()[\]{}+?*.$^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08")},csp=function(){function noUnsafeEval(){try{return new Function(""),!1}catch(e){return!0}}if(!isDefined(csp.rules)){var ngCspElement=window.document.querySelector("[ng-csp]")||window.document.querySelector("[data-ng-csp]");if(ngCspElement){var ngCspAttribute=ngCspElement.getAttribute("ng-csp")||ngCspElement.getAttribute("data-ng-csp");csp.rules={noUnsafeEval:!ngCspAttribute||ngCspAttribute.indexOf("no-unsafe-eval")!==-1,noInlineStyle:!ngCspAttribute||ngCspAttribute.indexOf("no-inline-style")!==-1}}else csp.rules={noUnsafeEval:noUnsafeEval(),noInlineStyle:!1}}return csp.rules},jq=function(){if(isDefined(jq.name_))return jq.name_;var el,i,prefix,name,ii=ngAttrPrefixes.length;for(i=0;i<ii;++i)if(prefix=ngAttrPrefixes[i],el=window.document.querySelector("["+prefix.replace(":","\\:")+"jq]")){name=el.getAttribute(prefix+"jq");break}return jq.name_=name},ALL_COLONS=/:/g,ngAttrPrefixes=["ng-","data-ng-","ng:","x-ng-"],isAutoBootstrapAllowed=allowAutoBootstrap(window.document),SNAKE_CASE_REGEXP=/[A-Z]/g,bindJQueryFired=!1,NODE_TYPE_ELEMENT=1,NODE_TYPE_ATTRIBUTE=2,NODE_TYPE_TEXT=3,NODE_TYPE_COMMENT=8,NODE_TYPE_DOCUMENT=9,NODE_TYPE_DOCUMENT_FRAGMENT=11,version={full:"1.6.3",major:1,minor:6,dot:3,codeName:"scriptalicious-bootstrapping"};JQLite.expando="ng339";var jqCache=JQLite.cache={},jqId=1;JQLite._data=function(node){return this.cache[node[this.expando]]||{}};var DASH_LOWERCASE_REGEXP=/-([a-z])/g,MS_HACK_REGEXP=/^-ms-/,MOUSE_EVENT_MAP={mouseleave:"mouseout",mouseenter:"mouseover"},jqLiteMinErr=minErr("jqLite"),SINGLE_TAG_REGEXP=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,HTML_REGEXP=/<|&#?\w+;/,TAG_NAME_REGEXP=/<([\w:-]+)/,XHTML_TAG_REGEXP=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wrapMap={option:[1,'<select multiple="multiple">',"</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};wrapMap.optgroup=wrapMap.option,wrapMap.tbody=wrapMap.tfoot=wrapMap.colgroup=wrapMap.caption=wrapMap.thead,wrapMap.th=wrapMap.td;var jqLiteContains=window.Node.prototype.contains||function(arg){return!!(16&this.compareDocumentPosition(arg))},JQLitePrototype=JQLite.prototype={ready:jqLiteReady,toString:function(){var value=[];return forEach(this,function(e){value.push(""+e)}),"["+value.join(", ")+"]"},eq:function(index){return jqLite(index>=0?this[index]:this[this.length+index])},length:0,push:push,sort:[].sort,splice:[].splice},BOOLEAN_ATTR={};forEach("multiple,selected,checked,disabled,readOnly,required,open".split(","),function(value){BOOLEAN_ATTR[lowercase(value)]=value});var BOOLEAN_ELEMENTS={};forEach("input,select,option,textarea,button,form,details".split(","),function(value){BOOLEAN_ELEMENTS[value]=!0});var ALIASED_ATTR={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern",ngStep:"step"};forEach({data:jqLiteData,removeData:jqLiteRemoveData,hasData:jqLiteHasData,cleanData:jqLiteCleanData},function(fn,name){JQLite[name]=fn}),forEach({data:jqLiteData,inheritedData:jqLiteInheritedData,scope:function(element){return jqLite.data(element,"$scope")||jqLiteInheritedData(element.parentNode||element,["$isolateScope","$scope"])},isolateScope:function(element){return jqLite.data(element,"$isolateScope")||jqLite.data(element,"$isolateScopeNoTemplate")},controller:jqLiteController,injector:function(element){return jqLiteInheritedData(element,"$injector")},removeAttr:function(element,name){element.removeAttribute(name)},hasClass:jqLiteHasClass,css:function(element,name,value){return name=cssKebabToCamel(name),isDefined(value)?void(element.style[name]=value):element.style[name]},attr:function(element,name,value){var ret,nodeType=element.nodeType;if(nodeType!==NODE_TYPE_TEXT&&nodeType!==NODE_TYPE_ATTRIBUTE&&nodeType!==NODE_TYPE_COMMENT&&element.getAttribute){var lowercasedName=lowercase(name),isBooleanAttr=BOOLEAN_ATTR[lowercasedName];return isDefined(value)?void(null===value||value===!1&&isBooleanAttr?element.removeAttribute(name):element.setAttribute(name,isBooleanAttr?lowercasedName:value)):(ret=element.getAttribute(name),isBooleanAttr&&null!==ret&&(ret=lowercasedName),null===ret?void 0:ret)}},prop:function(element,name,value){return isDefined(value)?void(element[name]=value):element[name]},text:function(){function getText(element,value){if(isUndefined(value)){var nodeType=element.nodeType;return nodeType===NODE_TYPE_ELEMENT||nodeType===NODE_TYPE_TEXT?element.textContent:""}element.textContent=value}return getText.$dv="",getText}(),val:function(element,value){if(isUndefined(value)){if(element.multiple&&"select"===nodeName_(element)){var result=[];return forEach(element.options,function(option){option.selected&&result.push(option.value||option.text)}),result}return element.value}element.value=value},html:function(element,value){return isUndefined(value)?element.innerHTML:(jqLiteDealoc(element,!0),void(element.innerHTML=value))},empty:jqLiteEmpty},function(fn,name){JQLite.prototype[name]=function(arg1,arg2){var i,key,nodeCount=this.length;if(fn!==jqLiteEmpty&&isUndefined(2===fn.length&&fn!==jqLiteHasClass&&fn!==jqLiteController?arg1:arg2)){if(isObject(arg1)){for(i=0;i<nodeCount;i++)if(fn===jqLiteData)fn(this[i],arg1);else for(key in arg1)fn(this[i],key,arg1[key]);return this}for(var value=fn.$dv,jj=isUndefined(value)?Math.min(nodeCount,1):nodeCount,j=0;j<jj;j++){var nodeValue=fn(this[j],arg1,arg2);value=value?value+nodeValue:nodeValue}return value}for(i=0;i<nodeCount;i++)fn(this[i],arg1,arg2);return this}}),forEach({removeData:jqLiteRemoveData,on:function(element,type,fn,unsupported){if(isDefined(unsupported))throw jqLiteMinErr("onargs","jqLite#on() does not support the `selector` or `eventData` parameters");if(jqLiteAcceptsData(element)){var expandoStore=jqLiteExpandoStore(element,!0),events=expandoStore.events,handle=expandoStore.handle;handle||(handle=expandoStore.handle=createEventHandler(element,events));for(var types=type.indexOf(" ")>=0?type.split(" "):[type],i=types.length,addHandler=function(type,specialHandlerWrapper,noEventListener){var eventFns=events[type];eventFns||(eventFns=events[type]=[],eventFns.specialHandlerWrapper=specialHandlerWrapper,"$destroy"===type||noEventListener||element.addEventListener(type,handle)),eventFns.push(fn)};i--;)type=types[i],MOUSE_EVENT_MAP[type]?(addHandler(MOUSE_EVENT_MAP[type],specialMouseHandlerWrapper),addHandler(type,void 0,!0)):addHandler(type)}},off:jqLiteOff,one:function(element,type,fn){element=jqLite(element),element.on(type,function onFn(){element.off(type,fn),element.off(type,onFn)}),element.on(type,fn)},replaceWith:function(element,replaceNode){var index,parent=element.parentNode;jqLiteDealoc(element),forEach(new JQLite(replaceNode),function(node){index?parent.insertBefore(node,index.nextSibling):parent.replaceChild(node,element),index=node})},children:function(element){var children=[];return forEach(element.childNodes,function(element){element.nodeType===NODE_TYPE_ELEMENT&&children.push(element)}),children},contents:function(element){return element.contentDocument||element.childNodes||[]},append:function(element,node){var nodeType=element.nodeType;if(nodeType===NODE_TYPE_ELEMENT||nodeType===NODE_TYPE_DOCUMENT_FRAGMENT){node=new JQLite(node);for(var i=0,ii=node.length;i<ii;i++){var child=node[i];element.appendChild(child)}}},prepend:function(element,node){if(element.nodeType===NODE_TYPE_ELEMENT){var index=element.firstChild;forEach(new JQLite(node),function(child){element.insertBefore(child,index)})}},wrap:function(element,wrapNode){jqLiteWrapNode(element,jqLite(wrapNode).eq(0).clone()[0])},remove:jqLiteRemove,detach:function(element){jqLiteRemove(element,!0)},after:function(element,newElement){var index=element,parent=element.parentNode;if(parent){newElement=new JQLite(newElement);for(var i=0,ii=newElement.length;i<ii;i++){var node=newElement[i];parent.insertBefore(node,index.nextSibling),index=node}}},addClass:jqLiteAddClass,removeClass:jqLiteRemoveClass,toggleClass:function(element,selector,condition){selector&&forEach(selector.split(" "),function(className){var classCondition=condition;isUndefined(classCondition)&&(classCondition=!jqLiteHasClass(element,className)),(classCondition?jqLiteAddClass:jqLiteRemoveClass)(element,className)})},parent:function(element){var parent=element.parentNode;return parent&&parent.nodeType!==NODE_TYPE_DOCUMENT_FRAGMENT?parent:null},next:function(element){return element.nextElementSibling},find:function(element,selector){return element.getElementsByTagName?element.getElementsByTagName(selector):[]},clone:jqLiteClone,triggerHandler:function(element,event,extraParameters){var dummyEvent,eventFnsCopy,handlerArgs,eventName=event.type||event,expandoStore=jqLiteExpandoStore(element),events=expandoStore&&expandoStore.events,eventFns=events&&events[eventName];eventFns&&(dummyEvent={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return this.defaultPrevented===!0},stopImmediatePropagation:function(){this.immediatePropagationStopped=!0},isImmediatePropagationStopped:function(){return this.immediatePropagationStopped===!0},stopPropagation:noop,type:eventName,target:element},event.type&&(dummyEvent=extend(dummyEvent,event)),eventFnsCopy=shallowCopy(eventFns),handlerArgs=extraParameters?[dummyEvent].concat(extraParameters):[dummyEvent],forEach(eventFnsCopy,function(fn){dummyEvent.isImmediatePropagationStopped()||fn.apply(element,handlerArgs)}))}},function(fn,name){JQLite.prototype[name]=function(arg1,arg2,arg3){for(var value,i=0,ii=this.length;i<ii;i++)isUndefined(value)?(value=fn(this[i],arg1,arg2,arg3),isDefined(value)&&(value=jqLite(value))):jqLiteAddNodes(value,fn(this[i],arg1,arg2,arg3));return isDefined(value)?value:this}}),JQLite.prototype.bind=JQLite.prototype.on,JQLite.prototype.unbind=JQLite.prototype.off;var nanKey=Object.create(null);NgMapShim.prototype={_idx:function(key){return key===this._lastKey?this._lastIndex:(this._lastKey=key,this._lastIndex=this._keys.indexOf(key),this._lastIndex)},_transformKey:function(key){return isNumberNaN(key)?nanKey:key},get:function(key){key=this._transformKey(key);var idx=this._idx(key);if(idx!==-1)return this._values[idx]},set:function(key,value){key=this._transformKey(key);var idx=this._idx(key);idx===-1&&(idx=this._lastIndex=this._keys.length),this._keys[idx]=key,this._values[idx]=value},"delete":function(key){key=this._transformKey(key);var idx=this._idx(key);return idx!==-1&&(this._keys.splice(idx,1),this._values.splice(idx,1),this._lastKey=NaN,this._lastIndex=-1,!0)}};var NgMap=NgMapShim,$$MapProvider=[function(){this.$get=[function(){return NgMap}]}],ARROW_ARG=/^([^(]+?)=>/,FN_ARGS=/^[^(]*\(\s*([^)]*)\)/m,FN_ARG_SPLIT=/,/,FN_ARG=/^\s*(_?)(\S+?)\1\s*$/,STRIP_COMMENTS=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,$injectorMinErr=minErr("$injector");createInjector.$$annotate=annotate;var $animateMinErr=minErr("$animate"),ELEMENT_NODE=1,NG_ANIMATE_CLASSNAME="ng-animate",$$CoreAnimateJsProvider=function(){this.$get=noop},$$CoreAnimateQueueProvider=function(){var postDigestQueue=new NgMap,postDigestElements=[];this.$get=["$$AnimateRunner","$rootScope",function($$AnimateRunner,$rootScope){function updateData(data,classes,value){var changed=!1;return classes&&(classes=isString(classes)?classes.split(" "):isArray(classes)?classes:[],forEach(classes,function(className){className&&(changed=!0,data[className]=value)})),changed}function handleCSSClassChanges(){forEach(postDigestElements,function(element){var data=postDigestQueue.get(element);if(data){var existing=splitClasses(element.attr("class")),toAdd="",toRemove="";forEach(data,function(status,className){var hasClass=!!existing[className];status!==hasClass&&(status?toAdd+=(toAdd.length?" ":"")+className:toRemove+=(toRemove.length?" ":"")+className)}),forEach(element,function(elm){toAdd&&jqLiteAddClass(elm,toAdd),toRemove&&jqLiteRemoveClass(elm,toRemove)}),postDigestQueue["delete"](element)}}),postDigestElements.length=0}function addRemoveClassesPostDigest(element,add,remove){var data=postDigestQueue.get(element)||{},classesAdded=updateData(data,add,!0),classesRemoved=updateData(data,remove,!1);(classesAdded||classesRemoved)&&(postDigestQueue.set(element,data),postDigestElements.push(element),1===postDigestElements.length&&$rootScope.$$postDigest(handleCSSClassChanges))}return{enabled:noop,on:noop,off:noop,pin:noop,push:function(element,event,options,domOperation){domOperation&&domOperation(),options=options||{},options.from&&element.css(options.from),options.to&&element.css(options.to),(options.addClass||options.removeClass)&&addRemoveClassesPostDigest(element,options.addClass,options.removeClass);var runner=new $$AnimateRunner;return runner.complete(),runner}}}]},$AnimateProvider=["$provide",function($provide){var provider=this,classNameFilter=null;this.$$registeredAnimations=Object.create(null),this.register=function(name,factory){if(name&&"."!==name.charAt(0))throw $animateMinErr("notcsel","Expecting class selector starting with '.' got '{0}'.",name);var key=name+"-animation";provider.$$registeredAnimations[name.substr(1)]=key,$provide.factory(key,factory)},this.classNameFilter=function(expression){if(1===arguments.length&&(classNameFilter=expression instanceof RegExp?expression:null)){var reservedRegex=new RegExp("[(\\s|\\/)]"+NG_ANIMATE_CLASSNAME+"[(\\s|\\/)]");if(reservedRegex.test(classNameFilter.toString()))throw classNameFilter=null,$animateMinErr("nongcls",'$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the "{0}" CSS class.',NG_ANIMATE_CLASSNAME)}return classNameFilter},this.$get=["$$animateQueue",function($$animateQueue){function domInsert(element,parentElement,afterElement){if(afterElement){var afterNode=extractElementNode(afterElement);!afterNode||afterNode.parentNode||afterNode.previousElementSibling||(afterElement=null)}afterElement?afterElement.after(element):parentElement.prepend(element)}return{on:$$animateQueue.on,off:$$animateQueue.off,pin:$$animateQueue.pin,enabled:$$animateQueue.enabled,cancel:function(runner){runner.end&&runner.end()},enter:function(element,parent,after,options){return parent=parent&&jqLite(parent),after=after&&jqLite(after),parent=parent||after.parent(),domInsert(element,parent,after),$$animateQueue.push(element,"enter",prepareAnimateOptions(options))},move:function(element,parent,after,options){return parent=parent&&jqLite(parent),after=after&&jqLite(after),parent=parent||after.parent(),domInsert(element,parent,after),$$animateQueue.push(element,"move",prepareAnimateOptions(options))},leave:function(element,options){return $$animateQueue.push(element,"leave",prepareAnimateOptions(options),function(){element.remove()})},addClass:function(element,className,options){return options=prepareAnimateOptions(options),options.addClass=mergeClasses(options.addclass,className),$$animateQueue.push(element,"addClass",options)},removeClass:function(element,className,options){return options=prepareAnimateOptions(options),options.removeClass=mergeClasses(options.removeClass,className),$$animateQueue.push(element,"removeClass",options)},setClass:function(element,add,remove,options){return options=prepareAnimateOptions(options),options.addClass=mergeClasses(options.addClass,add),options.removeClass=mergeClasses(options.removeClass,remove),$$animateQueue.push(element,"setClass",options)},animate:function(element,from,to,className,options){return options=prepareAnimateOptions(options),options.from=options.from?extend(options.from,from):from,options.to=options.to?extend(options.to,to):to,className=className||"ng-inline-animate",options.tempClasses=mergeClasses(options.tempClasses,className),$$animateQueue.push(element,"animate",options)}}}]}],$$AnimateAsyncRunFactoryProvider=function(){this.$get=["$$rAF",function($$rAF){function waitForTick(fn){waitQueue.push(fn),waitQueue.length>1||$$rAF(function(){for(var i=0;i<waitQueue.length;i++)waitQueue[i]();waitQueue=[]})}var waitQueue=[];return function(){var passed=!1;return waitForTick(function(){passed=!0}),function(callback){passed?callback():waitForTick(callback)}}}]},$$AnimateRunnerFactoryProvider=function(){this.$get=["$q","$sniffer","$$animateAsyncRun","$$isDocumentHidden","$timeout",function($q,$sniffer,$$animateAsyncRun,$$isDocumentHidden,$timeout){function AnimateRunner(host){this.setHost(host);var rafTick=$$animateAsyncRun(),timeoutTick=function(fn){$timeout(fn,0,!1)};this._doneCallbacks=[],this._tick=function(fn){$$isDocumentHidden()?timeoutTick(fn):rafTick(fn)},this._state=0}var INITIAL_STATE=0,DONE_PENDING_STATE=1,DONE_COMPLETE_STATE=2;return AnimateRunner.chain=function(chain,callback){function next(){return index===chain.length?void callback(!0):void chain[index](function(response){return response===!1?void callback(!1):(index++,void next())})}var index=0;next()},AnimateRunner.all=function(runners,callback){function onProgress(response){status=status&&response,++count===runners.length&&callback(status)}var count=0,status=!0;forEach(runners,function(runner){runner.done(onProgress)})},AnimateRunner.prototype={setHost:function(host){this.host=host||{}},done:function(fn){this._state===DONE_COMPLETE_STATE?fn():this._doneCallbacks.push(fn)},progress:noop,getPromise:function(){if(!this.promise){var self=this;this.promise=$q(function(resolve,reject){self.done(function(status){status===!1?reject():resolve()})})}return this.promise},then:function(resolveHandler,rejectHandler){return this.getPromise().then(resolveHandler,rejectHandler)},"catch":function(handler){return this.getPromise()["catch"](handler)},"finally":function(handler){return this.getPromise()["finally"](handler)},pause:function(){this.host.pause&&this.host.pause()},resume:function(){this.host.resume&&this.host.resume()},end:function(){this.host.end&&this.host.end(),this._resolve(!0)},cancel:function(){this.host.cancel&&this.host.cancel(),this._resolve(!1)},complete:function(response){var self=this;self._state===INITIAL_STATE&&(self._state=DONE_PENDING_STATE,self._tick(function(){self._resolve(response)}))},_resolve:function(response){this._state!==DONE_COMPLETE_STATE&&(forEach(this._doneCallbacks,function(fn){fn(response)}),this._doneCallbacks.length=0,this._state=DONE_COMPLETE_STATE)}},AnimateRunner}]},$CoreAnimateCssProvider=function(){this.$get=["$$rAF","$q","$$AnimateRunner",function($$rAF,$q,$$AnimateRunner){return function(element,initialOptions){function run(){return $$rAF(function(){applyAnimationContents(),closed||runner.complete(),closed=!0}),runner}function applyAnimationContents(){options.addClass&&(element.addClass(options.addClass),options.addClass=null),options.removeClass&&(element.removeClass(options.removeClass),options.removeClass=null),options.to&&(element.css(options.to),options.to=null)}var options=initialOptions||{};options.$$prepared||(options=copy(options)),options.cleanupStyles&&(options.from=options.to=null),options.from&&(element.css(options.from),options.from=null);var closed,runner=new $$AnimateRunner;return{start:run,end:run}}}]},$compileMinErr=minErr("$compile"),_UNINITIALIZED_VALUE=new UNINITIALIZED_VALUE;$CompileProvider.$inject=["$provide","$$sanitizeUriProvider"],SimpleChange.prototype.isFirstChange=function(){return this.previousValue===_UNINITIALIZED_VALUE};var PREFIX_REGEXP=/^((?:x|data)[:\-_])/i,SPECIAL_CHARS_REGEXP=/[:\-_]+(.)/g,$controllerMinErr=minErr("$controller"),CNTRL_REG=/^(\S+)(\s+as\s+([\w$]+))?$/,$$ForceReflowProvider=function(){this.$get=["$document",function($document){return function(domNode){return domNode?!domNode.nodeType&&domNode instanceof jqLite&&(domNode=domNode[0]):domNode=$document[0].body,domNode.offsetWidth+1}}]},APPLICATION_JSON="application/json",CONTENT_TYPE_APPLICATION_JSON={"Content-Type":APPLICATION_JSON+";charset=utf-8"},JSON_START=/^\[|^\{(?!\{)/,JSON_ENDS={"[":/]$/,"{":/}$/},JSON_PROTECTION_PREFIX=/^\)]\}',?\n/,$httpMinErr=minErr("$http"),$interpolateMinErr=angular.$interpolateMinErr=minErr("$interpolate");$interpolateMinErr.throwNoconcat=function(text){throw $interpolateMinErr("noconcat","Error while interpolating: {0}\nStrict Contextual Escaping disallows interpolations that concatenate multiple expressions when a trusted value is required.  See http://docs.angularjs.org/api/ng.$sce",text)},$interpolateMinErr.interr=function(text,err){return $interpolateMinErr("interr","Can't interpolate: {0}\n{1}",text,err.toString())};var $jsonpCallbacksProvider=function(){this.$get=function(){function createCallback(callbackId){var callback=function(data){callback.data=data,callback.called=!0};return callback.id=callbackId,callback}var callbacks=angular.callbacks,callbackMap={};return{createCallback:function(url){var callbackId="_"+(callbacks.$$counter++).toString(36),callbackPath="angular.callbacks."+callbackId,callback=createCallback(callbackId);return callbackMap[callbackPath]=callbacks[callbackId]=callback,callbackPath},wasCalled:function(callbackPath){return callbackMap[callbackPath].called},getResponse:function(callbackPath){return callbackMap[callbackPath].data},removeCallback:function(callbackPath){var callback=callbackMap[callbackPath];delete callbacks[callback.id],delete callbackMap[callbackPath]}}}},PATH_MATCH=/^([^?#]*)(\?([^#]*))?(#(.*))?$/,DEFAULT_PORTS={http:80,https:443,ftp:21},$locationMinErr=minErr("$location"),DOUBLE_SLASH_REGEX=/^\s*[\\/]{2,}/,locationPrototype={$$absUrl:"",$$html5:!1,$$replace:!1,absUrl:locationGetter("$$absUrl"),url:function(url){if(isUndefined(url))return this.$$url;var match=PATH_MATCH.exec(url);return(match[1]||""===url)&&this.path(decodeURIComponent(match[1])),(match[2]||match[1]||""===url)&&this.search(match[3]||""),this.hash(match[5]||""),this},protocol:locationGetter("$$protocol"),host:locationGetter("$$host"),port:locationGetter("$$port"),path:locationGetterSetter("$$path",function(path){return path=null!==path?path.toString():"","/"===path.charAt(0)?path:"/"+path}),search:function(search,paramValue){switch(arguments.length){case 0:return this.$$search;case 1:if(isString(search)||isNumber(search))search=search.toString(),this.$$search=parseKeyValue(search);else{if(!isObject(search))throw $locationMinErr("isrcharg","The first argument of the `$location#search()` call must be a string or an object.");search=copy(search,{}),forEach(search,function(value,key){null==value&&delete search[key]}),this.$$search=search}break;default:isUndefined(paramValue)||null===paramValue?delete this.$$search[search]:this.$$search[search]=paramValue}return this.$$compose(),this},hash:locationGetterSetter("$$hash",function(hash){return null!==hash?hash.toString():""}),replace:function(){return this.$$replace=!0,this}};forEach([LocationHashbangInHtml5Url,LocationHashbangUrl,LocationHtml5Url],function(Location){Location.prototype=Object.create(locationPrototype),Location.prototype.state=function(state){if(!arguments.length)return this.$$state;if(Location!==LocationHtml5Url||!this.$$html5)throw $locationMinErr("nostate","History API state support is available only in HTML5 mode and only in browsers supporting HTML5 History API");return this.$$state=isUndefined(state)?null:state,this.$$urlUpdatedByLocation=!0,this}});var $parseMinErr=minErr("$parse"),objectValueOf={}.constructor.prototype.valueOf,OPERATORS=createMap();forEach("+ - * / % === !== == != < > <= >= && || ! = |".split(" "),function(operator){
OPERATORS[operator]=!0});var ESCAPE={n:"\n",f:"\f",r:"\r",t:"\t",v:"\x0B","'":"'",'"':'"'},Lexer=function(options){this.options=options};Lexer.prototype={constructor:Lexer,lex:function(text){for(this.text=text,this.index=0,this.tokens=[];this.index<this.text.length;){var ch=this.text.charAt(this.index);if('"'===ch||"'"===ch)this.readString(ch);else if(this.isNumber(ch)||"."===ch&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdentifierStart(this.peekMultichar()))this.readIdent();else if(this.is(ch,"(){}[].,;:?"))this.tokens.push({index:this.index,text:ch}),this.index++;else if(this.isWhitespace(ch))this.index++;else{var ch2=ch+this.peek(),ch3=ch2+this.peek(2),op1=OPERATORS[ch],op2=OPERATORS[ch2],op3=OPERATORS[ch3];if(op1||op2||op3){var token=op3?ch3:op2?ch2:ch;this.tokens.push({index:this.index,text:token,operator:!0}),this.index+=token.length}else this.throwError("Unexpected next character ",this.index,this.index+1)}}return this.tokens},is:function(ch,chars){return chars.indexOf(ch)!==-1},peek:function(i){var num=i||1;return this.index+num<this.text.length&&this.text.charAt(this.index+num)},isNumber:function(ch){return"0"<=ch&&ch<="9"&&"string"==typeof ch},isWhitespace:function(ch){return" "===ch||"\r"===ch||"\t"===ch||"\n"===ch||"\x0B"===ch||" "===ch},isIdentifierStart:function(ch){return this.options.isIdentifierStart?this.options.isIdentifierStart(ch,this.codePointAt(ch)):this.isValidIdentifierStart(ch)},isValidIdentifierStart:function(ch){return"a"<=ch&&ch<="z"||"A"<=ch&&ch<="Z"||"_"===ch||"$"===ch},isIdentifierContinue:function(ch){return this.options.isIdentifierContinue?this.options.isIdentifierContinue(ch,this.codePointAt(ch)):this.isValidIdentifierContinue(ch)},isValidIdentifierContinue:function(ch,cp){return this.isValidIdentifierStart(ch,cp)||this.isNumber(ch)},codePointAt:function(ch){return 1===ch.length?ch.charCodeAt(0):(ch.charCodeAt(0)<<10)+ch.charCodeAt(1)-56613888},peekMultichar:function(){var ch=this.text.charAt(this.index),peek=this.peek();if(!peek)return ch;var cp1=ch.charCodeAt(0),cp2=peek.charCodeAt(0);return cp1>=55296&&cp1<=56319&&cp2>=56320&&cp2<=57343?ch+peek:ch},isExpOperator:function(ch){return"-"===ch||"+"===ch||this.isNumber(ch)},throwError:function(error,start,end){end=end||this.index;var colStr=isDefined(start)?"s "+start+"-"+this.index+" ["+this.text.substring(start,end)+"]":" "+end;throw $parseMinErr("lexerr","Lexer Error: {0} at column{1} in expression [{2}].",error,colStr,this.text)},readNumber:function(){for(var number="",start=this.index;this.index<this.text.length;){var ch=lowercase(this.text.charAt(this.index));if("."===ch||this.isNumber(ch))number+=ch;else{var peekCh=this.peek();if("e"===ch&&this.isExpOperator(peekCh))number+=ch;else if(this.isExpOperator(ch)&&peekCh&&this.isNumber(peekCh)&&"e"===number.charAt(number.length-1))number+=ch;else{if(!this.isExpOperator(ch)||peekCh&&this.isNumber(peekCh)||"e"!==number.charAt(number.length-1))break;this.throwError("Invalid exponent")}}this.index++}this.tokens.push({index:start,text:number,constant:!0,value:Number(number)})},readIdent:function(){var start=this.index;for(this.index+=this.peekMultichar().length;this.index<this.text.length;){var ch=this.peekMultichar();if(!this.isIdentifierContinue(ch))break;this.index+=ch.length}this.tokens.push({index:start,text:this.text.slice(start,this.index),identifier:!0})},readString:function(quote){var start=this.index;this.index++;for(var string="",rawString=quote,escape=!1;this.index<this.text.length;){var ch=this.text.charAt(this.index);if(rawString+=ch,escape){if("u"===ch){var hex=this.text.substring(this.index+1,this.index+5);hex.match(/[\da-f]{4}/i)||this.throwError("Invalid unicode escape [\\u"+hex+"]"),this.index+=4,string+=String.fromCharCode(parseInt(hex,16))}else{var rep=ESCAPE[ch];string+=rep||ch}escape=!1}else if("\\"===ch)escape=!0;else{if(ch===quote)return this.index++,void this.tokens.push({index:start,text:rawString,constant:!0,value:string});string+=ch}this.index++}this.throwError("Unterminated quote",start)}};var AST=function(lexer,options){this.lexer=lexer,this.options=options};AST.Program="Program",AST.ExpressionStatement="ExpressionStatement",AST.AssignmentExpression="AssignmentExpression",AST.ConditionalExpression="ConditionalExpression",AST.LogicalExpression="LogicalExpression",AST.BinaryExpression="BinaryExpression",AST.UnaryExpression="UnaryExpression",AST.CallExpression="CallExpression",AST.MemberExpression="MemberExpression",AST.Identifier="Identifier",AST.Literal="Literal",AST.ArrayExpression="ArrayExpression",AST.Property="Property",AST.ObjectExpression="ObjectExpression",AST.ThisExpression="ThisExpression",AST.LocalsExpression="LocalsExpression",AST.NGValueParameter="NGValueParameter",AST.prototype={ast:function(text){this.text=text,this.tokens=this.lexer.lex(text);var value=this.program();return 0!==this.tokens.length&&this.throwError("is an unexpected token",this.tokens[0]),value},program:function(){for(var body=[];;)if(this.tokens.length>0&&!this.peek("}",")",";","]")&&body.push(this.expressionStatement()),!this.expect(";"))return{type:AST.Program,body:body}},expressionStatement:function(){return{type:AST.ExpressionStatement,expression:this.filterChain()}},filterChain:function(){for(var left=this.expression();this.expect("|");)left=this.filter(left);return left},expression:function(){return this.assignment()},assignment:function(){var result=this.ternary();if(this.expect("=")){if(!isAssignable(result))throw $parseMinErr("lval","Trying to assign a value to a non l-value");result={type:AST.AssignmentExpression,left:result,right:this.assignment(),operator:"="}}return result},ternary:function(){var alternate,consequent,test=this.logicalOR();return this.expect("?")&&(alternate=this.expression(),this.consume(":"))?(consequent=this.expression(),{type:AST.ConditionalExpression,test:test,alternate:alternate,consequent:consequent}):test},logicalOR:function(){for(var left=this.logicalAND();this.expect("||");)left={type:AST.LogicalExpression,operator:"||",left:left,right:this.logicalAND()};return left},logicalAND:function(){for(var left=this.equality();this.expect("&&");)left={type:AST.LogicalExpression,operator:"&&",left:left,right:this.equality()};return left},equality:function(){for(var token,left=this.relational();token=this.expect("==","!=","===","!==");)left={type:AST.BinaryExpression,operator:token.text,left:left,right:this.relational()};return left},relational:function(){for(var token,left=this.additive();token=this.expect("<",">","<=",">=");)left={type:AST.BinaryExpression,operator:token.text,left:left,right:this.additive()};return left},additive:function(){for(var token,left=this.multiplicative();token=this.expect("+","-");)left={type:AST.BinaryExpression,operator:token.text,left:left,right:this.multiplicative()};return left},multiplicative:function(){for(var token,left=this.unary();token=this.expect("*","/","%");)left={type:AST.BinaryExpression,operator:token.text,left:left,right:this.unary()};return left},unary:function(){var token;return(token=this.expect("+","-","!"))?{type:AST.UnaryExpression,operator:token.text,prefix:!0,argument:this.unary()}:this.primary()},primary:function(){var primary;this.expect("(")?(primary=this.filterChain(),this.consume(")")):this.expect("[")?primary=this.arrayDeclaration():this.expect("{")?primary=this.object():this.selfReferential.hasOwnProperty(this.peek().text)?primary=copy(this.selfReferential[this.consume().text]):this.options.literals.hasOwnProperty(this.peek().text)?primary={type:AST.Literal,value:this.options.literals[this.consume().text]}:this.peek().identifier?primary=this.identifier():this.peek().constant?primary=this.constant():this.throwError("not a primary expression",this.peek());for(var next;next=this.expect("(","[",".");)"("===next.text?(primary={type:AST.CallExpression,callee:primary,arguments:this.parseArguments()},this.consume(")")):"["===next.text?(primary={type:AST.MemberExpression,object:primary,property:this.expression(),computed:!0},this.consume("]")):"."===next.text?primary={type:AST.MemberExpression,object:primary,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return primary},filter:function(baseExpression){for(var args=[baseExpression],result={type:AST.CallExpression,callee:this.identifier(),arguments:args,filter:!0};this.expect(":");)args.push(this.expression());return result},parseArguments:function(){var args=[];if(")"!==this.peekToken().text)do args.push(this.filterChain());while(this.expect(","));return args},identifier:function(){var token=this.consume();return token.identifier||this.throwError("is not a valid identifier",token),{type:AST.Identifier,name:token.text}},constant:function(){return{type:AST.Literal,value:this.consume().value}},arrayDeclaration:function(){var elements=[];if("]"!==this.peekToken().text)do{if(this.peek("]"))break;elements.push(this.expression())}while(this.expect(","));return this.consume("]"),{type:AST.ArrayExpression,elements:elements}},object:function(){var property,properties=[];if("}"!==this.peekToken().text)do{if(this.peek("}"))break;property={type:AST.Property,kind:"init"},this.peek().constant?(property.key=this.constant(),property.computed=!1,this.consume(":"),property.value=this.expression()):this.peek().identifier?(property.key=this.identifier(),property.computed=!1,this.peek(":")?(this.consume(":"),property.value=this.expression()):property.value=property.key):this.peek("[")?(this.consume("["),property.key=this.expression(),this.consume("]"),property.computed=!0,this.consume(":"),property.value=this.expression()):this.throwError("invalid key",this.peek()),properties.push(property)}while(this.expect(","));return this.consume("}"),{type:AST.ObjectExpression,properties:properties}},throwError:function(msg,token){throw $parseMinErr("syntax","Syntax Error: Token '{0}' {1} at column {2} of the expression [{3}] starting at [{4}].",token.text,msg,token.index+1,this.text,this.text.substring(token.index))},consume:function(e1){if(0===this.tokens.length)throw $parseMinErr("ueoe","Unexpected end of expression: {0}",this.text);var token=this.expect(e1);return token||this.throwError("is unexpected, expecting ["+e1+"]",this.peek()),token},peekToken:function(){if(0===this.tokens.length)throw $parseMinErr("ueoe","Unexpected end of expression: {0}",this.text);return this.tokens[0]},peek:function(e1,e2,e3,e4){return this.peekAhead(0,e1,e2,e3,e4)},peekAhead:function(i,e1,e2,e3,e4){if(this.tokens.length>i){var token=this.tokens[i],t=token.text;if(t===e1||t===e2||t===e3||t===e4||!e1&&!e2&&!e3&&!e4)return token}return!1},expect:function(e1,e2,e3,e4){var token=this.peek(e1,e2,e3,e4);return!!token&&(this.tokens.shift(),token)},selfReferential:{"this":{type:AST.ThisExpression},$locals:{type:AST.LocalsExpression}}},ASTCompiler.prototype={compile:function(expression){var self=this,ast=this.astBuilder.ast(expression);this.state={nextId:0,filters:{},fn:{vars:[],body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]},findConstantAndWatchExpressions(ast,self.$filter);var assignable,extra="";if(this.stage="assign",assignable=assignableAST(ast)){this.state.computing="assign";var result=this.nextId();this.recurse(assignable,result),this.return_(result),extra="fn.assign="+this.generateFunction("assign","s,v,l")}var toWatch=getInputs(ast.body);self.stage="inputs",forEach(toWatch,function(watch,key){var fnKey="fn"+key;self.state[fnKey]={vars:[],body:[],own:{}},self.state.computing=fnKey;var intoId=self.nextId();self.recurse(watch,intoId),self.return_(intoId),self.state.inputs.push(fnKey),watch.watchId=key}),this.state.computing="fn",this.stage="main",this.recurse(ast);var fnString='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+extra+this.watchFns()+"return fn;",fn=new Function("$filter","getStringValue","ifDefined","plus",fnString)(this.$filter,getStringValue,ifDefined,plusFn);return this.state=this.stage=void 0,fn.literal=isLiteral(ast),fn.constant=isConstant(ast),fn},USE:"use",STRICT:"strict",watchFns:function(){var result=[],fns=this.state.inputs,self=this;return forEach(fns,function(name){result.push("var "+name+"="+self.generateFunction(name,"s"))}),fns.length&&result.push("fn.inputs=["+fns.join(",")+"];"),result.join("")},generateFunction:function(name,params){return"function("+params+"){"+this.varsPrefix(name)+this.body(name)+"};"},filterPrefix:function(){var parts=[],self=this;return forEach(this.state.filters,function(id,filter){parts.push(id+"=$filter("+self.escape(filter)+")")}),parts.length?"var "+parts.join(",")+";":""},varsPrefix:function(section){return this.state[section].vars.length?"var "+this.state[section].vars.join(",")+";":""},body:function(section){return this.state[section].body.join("")},recurse:function(ast,intoId,nameId,recursionFn,create,skipWatchIdCheck){var left,right,args,expression,computed,self=this;if(recursionFn=recursionFn||noop,!skipWatchIdCheck&&isDefined(ast.watchId))return intoId=intoId||this.nextId(),void this.if_("i",this.lazyAssign(intoId,this.computedMember("i",ast.watchId)),this.lazyRecurse(ast,intoId,nameId,recursionFn,create,!0));switch(ast.type){case AST.Program:forEach(ast.body,function(expression,pos){self.recurse(expression.expression,void 0,void 0,function(expr){right=expr}),pos!==ast.body.length-1?self.current().body.push(right,";"):self.return_(right)});break;case AST.Literal:expression=this.escape(ast.value),this.assign(intoId,expression),recursionFn(intoId||expression);break;case AST.UnaryExpression:this.recurse(ast.argument,void 0,void 0,function(expr){right=expr}),expression=ast.operator+"("+this.ifDefined(right,0)+")",this.assign(intoId,expression),recursionFn(expression);break;case AST.BinaryExpression:this.recurse(ast.left,void 0,void 0,function(expr){left=expr}),this.recurse(ast.right,void 0,void 0,function(expr){right=expr}),expression="+"===ast.operator?this.plus(left,right):"-"===ast.operator?this.ifDefined(left,0)+ast.operator+this.ifDefined(right,0):"("+left+")"+ast.operator+"("+right+")",this.assign(intoId,expression),recursionFn(expression);break;case AST.LogicalExpression:intoId=intoId||this.nextId(),self.recurse(ast.left,intoId),self.if_("&&"===ast.operator?intoId:self.not(intoId),self.lazyRecurse(ast.right,intoId)),recursionFn(intoId);break;case AST.ConditionalExpression:intoId=intoId||this.nextId(),self.recurse(ast.test,intoId),self.if_(intoId,self.lazyRecurse(ast.alternate,intoId),self.lazyRecurse(ast.consequent,intoId)),recursionFn(intoId);break;case AST.Identifier:intoId=intoId||this.nextId(),nameId&&(nameId.context="inputs"===self.stage?"s":this.assign(this.nextId(),this.getHasOwnProperty("l",ast.name)+"?l:s"),nameId.computed=!1,nameId.name=ast.name),self.if_("inputs"===self.stage||self.not(self.getHasOwnProperty("l",ast.name)),function(){self.if_("inputs"===self.stage||"s",function(){create&&1!==create&&self.if_(self.isNull(self.nonComputedMember("s",ast.name)),self.lazyAssign(self.nonComputedMember("s",ast.name),"{}")),self.assign(intoId,self.nonComputedMember("s",ast.name))})},intoId&&self.lazyAssign(intoId,self.nonComputedMember("l",ast.name))),recursionFn(intoId);break;case AST.MemberExpression:left=nameId&&(nameId.context=this.nextId())||this.nextId(),intoId=intoId||this.nextId(),self.recurse(ast.object,left,void 0,function(){self.if_(self.notNull(left),function(){ast.computed?(right=self.nextId(),self.recurse(ast.property,right),self.getStringValue(right),create&&1!==create&&self.if_(self.not(self.computedMember(left,right)),self.lazyAssign(self.computedMember(left,right),"{}")),expression=self.computedMember(left,right),self.assign(intoId,expression),nameId&&(nameId.computed=!0,nameId.name=right)):(create&&1!==create&&self.if_(self.isNull(self.nonComputedMember(left,ast.property.name)),self.lazyAssign(self.nonComputedMember(left,ast.property.name),"{}")),expression=self.nonComputedMember(left,ast.property.name),self.assign(intoId,expression),nameId&&(nameId.computed=!1,nameId.name=ast.property.name))},function(){self.assign(intoId,"undefined")}),recursionFn(intoId)},!!create);break;case AST.CallExpression:intoId=intoId||this.nextId(),ast.filter?(right=self.filter(ast.callee.name),args=[],forEach(ast.arguments,function(expr){var argument=self.nextId();self.recurse(expr,argument),args.push(argument)}),expression=right+"("+args.join(",")+")",self.assign(intoId,expression),recursionFn(intoId)):(right=self.nextId(),left={},args=[],self.recurse(ast.callee,right,left,function(){self.if_(self.notNull(right),function(){forEach(ast.arguments,function(expr){self.recurse(expr,ast.constant?void 0:self.nextId(),void 0,function(argument){args.push(argument)})}),expression=left.name?self.member(left.context,left.name,left.computed)+"("+args.join(",")+")":right+"("+args.join(",")+")",self.assign(intoId,expression)},function(){self.assign(intoId,"undefined")}),recursionFn(intoId)}));break;case AST.AssignmentExpression:right=this.nextId(),left={},this.recurse(ast.left,void 0,left,function(){self.if_(self.notNull(left.context),function(){self.recurse(ast.right,right),expression=self.member(left.context,left.name,left.computed)+ast.operator+right,self.assign(intoId,expression),recursionFn(intoId||expression)})},1);break;case AST.ArrayExpression:args=[],forEach(ast.elements,function(expr){self.recurse(expr,ast.constant?void 0:self.nextId(),void 0,function(argument){args.push(argument)})}),expression="["+args.join(",")+"]",this.assign(intoId,expression),recursionFn(intoId||expression);break;case AST.ObjectExpression:args=[],computed=!1,forEach(ast.properties,function(property){property.computed&&(computed=!0)}),computed?(intoId=intoId||this.nextId(),this.assign(intoId,"{}"),forEach(ast.properties,function(property){property.computed?(left=self.nextId(),self.recurse(property.key,left)):left=property.key.type===AST.Identifier?property.key.name:""+property.key.value,right=self.nextId(),self.recurse(property.value,right),self.assign(self.member(intoId,left,property.computed),right)})):(forEach(ast.properties,function(property){self.recurse(property.value,ast.constant?void 0:self.nextId(),void 0,function(expr){args.push(self.escape(property.key.type===AST.Identifier?property.key.name:""+property.key.value)+":"+expr)})}),expression="{"+args.join(",")+"}",this.assign(intoId,expression)),recursionFn(intoId||expression);break;case AST.ThisExpression:this.assign(intoId,"s"),recursionFn(intoId||"s");break;case AST.LocalsExpression:this.assign(intoId,"l"),recursionFn(intoId||"l");break;case AST.NGValueParameter:this.assign(intoId,"v"),recursionFn(intoId||"v")}},getHasOwnProperty:function(element,property){var key=element+"."+property,own=this.current().own;return own.hasOwnProperty(key)||(own[key]=this.nextId(!1,element+"&&("+this.escape(property)+" in "+element+")")),own[key]},assign:function(id,value){if(id)return this.current().body.push(id,"=",value,";"),id},filter:function(filterName){return this.state.filters.hasOwnProperty(filterName)||(this.state.filters[filterName]=this.nextId(!0)),this.state.filters[filterName]},ifDefined:function(id,defaultValue){return"ifDefined("+id+","+this.escape(defaultValue)+")"},plus:function(left,right){return"plus("+left+","+right+")"},return_:function(id){this.current().body.push("return ",id,";")},if_:function(test,alternate,consequent){if(test===!0)alternate();else{var body=this.current().body;body.push("if(",test,"){"),alternate(),body.push("}"),consequent&&(body.push("else{"),consequent(),body.push("}"))}},not:function(expression){return"!("+expression+")"},isNull:function(expression){return expression+"==null"},notNull:function(expression){return expression+"!=null"},nonComputedMember:function(left,right){var SAFE_IDENTIFIER=/^[$_a-zA-Z][$_a-zA-Z0-9]*$/,UNSAFE_CHARACTERS=/[^$_a-zA-Z0-9]/g;return SAFE_IDENTIFIER.test(right)?left+"."+right:left+'["'+right.replace(UNSAFE_CHARACTERS,this.stringEscapeFn)+'"]'},computedMember:function(left,right){return left+"["+right+"]"},member:function(left,right,computed){return computed?this.computedMember(left,right):this.nonComputedMember(left,right)},getStringValue:function(item){this.assign(item,"getStringValue("+item+")")},lazyRecurse:function(ast,intoId,nameId,recursionFn,create,skipWatchIdCheck){var self=this;return function(){self.recurse(ast,intoId,nameId,recursionFn,create,skipWatchIdCheck)}},lazyAssign:function(id,value){var self=this;return function(){self.assign(id,value)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(c){return"\\u"+("0000"+c.charCodeAt(0).toString(16)).slice(-4)},escape:function(value){if(isString(value))return"'"+value.replace(this.stringEscapeRegex,this.stringEscapeFn)+"'";if(isNumber(value))return value.toString();if(value===!0)return"true";if(value===!1)return"false";if(null===value)return"null";if("undefined"==typeof value)return"undefined";throw $parseMinErr("esc","IMPOSSIBLE")},nextId:function(skip,init){var id="v"+this.state.nextId++;return skip||this.current().vars.push(id+(init?"="+init:"")),id},current:function(){return this.state[this.state.computing]}},ASTInterpreter.prototype={compile:function(expression){var self=this,ast=this.astBuilder.ast(expression);findConstantAndWatchExpressions(ast,self.$filter);var assignable,assign;(assignable=assignableAST(ast))&&(assign=this.recurse(assignable));var inputs,toWatch=getInputs(ast.body);toWatch&&(inputs=[],forEach(toWatch,function(watch,key){var input=self.recurse(watch);watch.input=input,inputs.push(input),watch.watchId=key}));var expressions=[];forEach(ast.body,function(expression){expressions.push(self.recurse(expression.expression))});var fn=0===ast.body.length?noop:1===ast.body.length?expressions[0]:function(scope,locals){var lastValue;return forEach(expressions,function(exp){lastValue=exp(scope,locals)}),lastValue};return assign&&(fn.assign=function(scope,value,locals){return assign(scope,locals,value)}),inputs&&(fn.inputs=inputs),fn.literal=isLiteral(ast),fn.constant=isConstant(ast),fn},recurse:function(ast,context,create){var left,right,args,self=this;if(ast.input)return this.inputs(ast.input,ast.watchId);switch(ast.type){case AST.Literal:return this.value(ast.value,context);case AST.UnaryExpression:return right=this.recurse(ast.argument),this["unary"+ast.operator](right,context);case AST.BinaryExpression:return left=this.recurse(ast.left),right=this.recurse(ast.right),this["binary"+ast.operator](left,right,context);case AST.LogicalExpression:return left=this.recurse(ast.left),right=this.recurse(ast.right),this["binary"+ast.operator](left,right,context);case AST.ConditionalExpression:return this["ternary?:"](this.recurse(ast.test),this.recurse(ast.alternate),this.recurse(ast.consequent),context);case AST.Identifier:return self.identifier(ast.name,context,create);case AST.MemberExpression:return left=this.recurse(ast.object,!1,!!create),ast.computed||(right=ast.property.name),ast.computed&&(right=this.recurse(ast.property)),ast.computed?this.computedMember(left,right,context,create):this.nonComputedMember(left,right,context,create);case AST.CallExpression:return args=[],forEach(ast.arguments,function(expr){args.push(self.recurse(expr))}),ast.filter&&(right=this.$filter(ast.callee.name)),ast.filter||(right=this.recurse(ast.callee,!0)),ast.filter?function(scope,locals,assign,inputs){for(var values=[],i=0;i<args.length;++i)values.push(args[i](scope,locals,assign,inputs));var value=right.apply(void 0,values,inputs);return context?{context:void 0,name:void 0,value:value}:value}:function(scope,locals,assign,inputs){var value,rhs=right(scope,locals,assign,inputs);if(null!=rhs.value){for(var values=[],i=0;i<args.length;++i)values.push(args[i](scope,locals,assign,inputs));value=rhs.value.apply(rhs.context,values)}return context?{value:value}:value};case AST.AssignmentExpression:return left=this.recurse(ast.left,!0,1),right=this.recurse(ast.right),function(scope,locals,assign,inputs){var lhs=left(scope,locals,assign,inputs),rhs=right(scope,locals,assign,inputs);return lhs.context[lhs.name]=rhs,context?{value:rhs}:rhs};case AST.ArrayExpression:return args=[],forEach(ast.elements,function(expr){args.push(self.recurse(expr))}),function(scope,locals,assign,inputs){for(var value=[],i=0;i<args.length;++i)value.push(args[i](scope,locals,assign,inputs));return context?{value:value}:value};case AST.ObjectExpression:return args=[],forEach(ast.properties,function(property){property.computed?args.push({key:self.recurse(property.key),computed:!0,value:self.recurse(property.value)}):args.push({key:property.key.type===AST.Identifier?property.key.name:""+property.key.value,computed:!1,value:self.recurse(property.value)})}),function(scope,locals,assign,inputs){for(var value={},i=0;i<args.length;++i)args[i].computed?value[args[i].key(scope,locals,assign,inputs)]=args[i].value(scope,locals,assign,inputs):value[args[i].key]=args[i].value(scope,locals,assign,inputs);return context?{value:value}:value};case AST.ThisExpression:return function(scope){return context?{value:scope}:scope};case AST.LocalsExpression:return function(scope,locals){return context?{value:locals}:locals};case AST.NGValueParameter:return function(scope,locals,assign){return context?{value:assign}:assign}}},"unary+":function(argument,context){return function(scope,locals,assign,inputs){var arg=argument(scope,locals,assign,inputs);return arg=isDefined(arg)?+arg:0,context?{value:arg}:arg}},"unary-":function(argument,context){return function(scope,locals,assign,inputs){var arg=argument(scope,locals,assign,inputs);return arg=isDefined(arg)?-arg:-0,context?{value:arg}:arg}},"unary!":function(argument,context){return function(scope,locals,assign,inputs){var arg=!argument(scope,locals,assign,inputs);return context?{value:arg}:arg}},"binary+":function(left,right,context){return function(scope,locals,assign,inputs){var lhs=left(scope,locals,assign,inputs),rhs=right(scope,locals,assign,inputs),arg=plusFn(lhs,rhs);return context?{value:arg}:arg}},"binary-":function(left,right,context){return function(scope,locals,assign,inputs){var lhs=left(scope,locals,assign,inputs),rhs=right(scope,locals,assign,inputs),arg=(isDefined(lhs)?lhs:0)-(isDefined(rhs)?rhs:0);return context?{value:arg}:arg}},"binary*":function(left,right,context){return function(scope,locals,assign,inputs){var arg=left(scope,locals,assign,inputs)*right(scope,locals,assign,inputs);return context?{value:arg}:arg}},"binary/":function(left,right,context){return function(scope,locals,assign,inputs){var arg=left(scope,locals,assign,inputs)/right(scope,locals,assign,inputs);return context?{value:arg}:arg}},"binary%":function(left,right,context){return function(scope,locals,assign,inputs){var arg=left(scope,locals,assign,inputs)%right(scope,locals,assign,inputs);return context?{value:arg}:arg}},"binary===":function(left,right,context){return function(scope,locals,assign,inputs){var arg=left(scope,locals,assign,inputs)===right(scope,locals,assign,inputs);return context?{value:arg}:arg}},"binary!==":function(left,right,context){return function(scope,locals,assign,inputs){var arg=left(scope,locals,assign,inputs)!==right(scope,locals,assign,inputs);return context?{value:arg}:arg}},"binary==":function(left,right,context){return function(scope,locals,assign,inputs){var arg=left(scope,locals,assign,inputs)==right(scope,locals,assign,inputs);return context?{value:arg}:arg}},"binary!=":function(left,right,context){return function(scope,locals,assign,inputs){var arg=left(scope,locals,assign,inputs)!=right(scope,locals,assign,inputs);return context?{value:arg}:arg}},"binary<":function(left,right,context){return function(scope,locals,assign,inputs){var arg=left(scope,locals,assign,inputs)<right(scope,locals,assign,inputs);return context?{value:arg}:arg}},"binary>":function(left,right,context){return function(scope,locals,assign,inputs){var arg=left(scope,locals,assign,inputs)>right(scope,locals,assign,inputs);return context?{value:arg}:arg}},"binary<=":function(left,right,context){return function(scope,locals,assign,inputs){var arg=left(scope,locals,assign,inputs)<=right(scope,locals,assign,inputs);return context?{value:arg}:arg}},"binary>=":function(left,right,context){return function(scope,locals,assign,inputs){var arg=left(scope,locals,assign,inputs)>=right(scope,locals,assign,inputs);return context?{value:arg}:arg}},"binary&&":function(left,right,context){return function(scope,locals,assign,inputs){var arg=left(scope,locals,assign,inputs)&&right(scope,locals,assign,inputs);return context?{value:arg}:arg}},"binary||":function(left,right,context){return function(scope,locals,assign,inputs){var arg=left(scope,locals,assign,inputs)||right(scope,locals,assign,inputs);return context?{value:arg}:arg}},"ternary?:":function(test,alternate,consequent,context){return function(scope,locals,assign,inputs){var arg=test(scope,locals,assign,inputs)?alternate(scope,locals,assign,inputs):consequent(scope,locals,assign,inputs);return context?{value:arg}:arg}},value:function(value,context){return function(){return context?{context:void 0,name:void 0,value:value}:value}},identifier:function(name,context,create){return function(scope,locals,assign,inputs){var base=locals&&name in locals?locals:scope;create&&1!==create&&base&&null==base[name]&&(base[name]={});var value=base?base[name]:void 0;return context?{context:base,name:name,value:value}:value}},computedMember:function(left,right,context,create){return function(scope,locals,assign,inputs){var rhs,value,lhs=left(scope,locals,assign,inputs);return null!=lhs&&(rhs=right(scope,locals,assign,inputs),rhs=getStringValue(rhs),create&&1!==create&&lhs&&!lhs[rhs]&&(lhs[rhs]={}),value=lhs[rhs]),context?{context:lhs,name:rhs,value:value}:value}},nonComputedMember:function(left,right,context,create){return function(scope,locals,assign,inputs){var lhs=left(scope,locals,assign,inputs);create&&1!==create&&lhs&&null==lhs[right]&&(lhs[right]={});var value=null!=lhs?lhs[right]:void 0;return context?{context:lhs,name:right,value:value}:value}},inputs:function(input,watchId){return function(scope,value,locals,inputs){return inputs?inputs[watchId]:input(scope,value,locals)}}};var Parser=function(lexer,$filter,options){this.lexer=lexer,this.$filter=$filter,this.options=options,this.ast=new AST(lexer,options),this.astCompiler=options.csp?new ASTInterpreter(this.ast,$filter):new ASTCompiler(this.ast,$filter)};Parser.prototype={constructor:Parser,parse:function(text){return this.astCompiler.compile(text)}};var $sceMinErr=minErr("$sce"),SCE_CONTEXTS={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},UNDERSCORE_LOWERCASE_REGEXP=/_([a-z])/g,$templateRequestMinErr=minErr("$compile"),urlParsingNode=window.document.createElement("a"),originUrl=urlResolve(window.location.href);$$CookieReader.$inject=["$document"],$FilterProvider.$inject=["$provide"];var MAX_DIGITS=22,DECIMAL_SEP=".",ZERO_CHAR="0";currencyFilter.$inject=["$locale"],numberFilter.$inject=["$locale"];var DATE_FORMATS={yyyy:dateGetter("FullYear",4,0,!1,!0),yy:dateGetter("FullYear",2,0,!0,!0),y:dateGetter("FullYear",1,0,!1,!0),MMMM:dateStrGetter("Month"),MMM:dateStrGetter("Month",!0),MM:dateGetter("Month",2,1),M:dateGetter("Month",1,1),LLLL:dateStrGetter("Month",!1,!0),dd:dateGetter("Date",2),d:dateGetter("Date",1),HH:dateGetter("Hours",2),H:dateGetter("Hours",1),hh:dateGetter("Hours",2,-12),h:dateGetter("Hours",1,-12),mm:dateGetter("Minutes",2),m:dateGetter("Minutes",1),ss:dateGetter("Seconds",2),s:dateGetter("Seconds",1),sss:dateGetter("Milliseconds",3),EEEE:dateStrGetter("Day"),EEE:dateStrGetter("Day",!0),a:ampmGetter,Z:timeZoneGetter,ww:weekGetter(2),w:weekGetter(1),G:eraGetter,GG:eraGetter,GGG:eraGetter,GGGG:longEraGetter},DATE_FORMATS_SPLIT=/((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,NUMBER_STRING=/^-?\d+$/;dateFilter.$inject=["$locale"];var lowercaseFilter=valueFn(lowercase),uppercaseFilter=valueFn(uppercase);orderByFilter.$inject=["$parse"];var htmlAnchorDirective=valueFn({restrict:"E",compile:function(element,attr){if(!attr.href&&!attr.xlinkHref)return function(scope,element){
if("a"===element[0].nodeName.toLowerCase()){var href="[object SVGAnimatedString]"===toString.call(element.prop("href"))?"xlink:href":"href";element.on("click",function(event){element.attr(href)||event.preventDefault()})}}}}),ngAttributeAliasDirectives={};forEach(BOOLEAN_ATTR,function(propName,attrName){function defaultLinkFn(scope,element,attr){scope.$watch(attr[normalized],function(value){attr.$set(attrName,!!value)})}if("multiple"!==propName){var normalized=directiveNormalize("ng-"+attrName),linkFn=defaultLinkFn;"checked"===propName&&(linkFn=function(scope,element,attr){attr.ngModel!==attr[normalized]&&defaultLinkFn(scope,element,attr)}),ngAttributeAliasDirectives[normalized]=function(){return{restrict:"A",priority:100,link:linkFn}}}}),forEach(ALIASED_ATTR,function(htmlAttr,ngAttr){ngAttributeAliasDirectives[ngAttr]=function(){return{priority:100,link:function(scope,element,attr){if("ngPattern"===ngAttr&&"/"===attr.ngPattern.charAt(0)){var match=attr.ngPattern.match(REGEX_STRING_REGEXP);if(match)return void attr.$set("ngPattern",new RegExp(match[1],match[2]))}scope.$watch(attr[ngAttr],function(value){attr.$set(ngAttr,value)})}}}}),forEach(["src","srcset","href"],function(attrName){var normalized=directiveNormalize("ng-"+attrName);ngAttributeAliasDirectives[normalized]=function(){return{priority:99,link:function(scope,element,attr){var propName=attrName,name=attrName;"href"===attrName&&"[object SVGAnimatedString]"===toString.call(element.prop("href"))&&(name="xlinkHref",attr.$attr[name]="xlink:href",propName=null),attr.$observe(normalized,function(value){return value?(attr.$set(name,value),void(msie&&propName&&element.prop(propName,attr[name]))):void("href"===attrName&&attr.$set(name,null))})}}}});var nullFormCtrl={$addControl:noop,$$renameControl:nullFormRenameControl,$removeControl:noop,$setValidity:noop,$setDirty:noop,$setPristine:noop,$setSubmitted:noop},PENDING_CLASS="ng-pending",SUBMITTED_CLASS="ng-submitted";FormController.$inject=["$element","$attrs","$scope","$animate","$interpolate"],FormController.prototype={$rollbackViewValue:function(){forEach(this.$$controls,function(control){control.$rollbackViewValue()})},$commitViewValue:function(){forEach(this.$$controls,function(control){control.$commitViewValue()})},$addControl:function(control){assertNotHasOwnProperty(control.$name,"input"),this.$$controls.push(control),control.$name&&(this[control.$name]=control),control.$$parentForm=this},$$renameControl:function(control,newName){var oldName=control.$name;this[oldName]===control&&delete this[oldName],this[newName]=control,control.$name=newName},$removeControl:function(control){control.$name&&this[control.$name]===control&&delete this[control.$name],forEach(this.$pending,function(value,name){this.$setValidity(name,null,control)},this),forEach(this.$error,function(value,name){this.$setValidity(name,null,control)},this),forEach(this.$$success,function(value,name){this.$setValidity(name,null,control)},this),arrayRemove(this.$$controls,control),control.$$parentForm=nullFormCtrl},$setDirty:function(){this.$$animate.removeClass(this.$$element,PRISTINE_CLASS),this.$$animate.addClass(this.$$element,DIRTY_CLASS),this.$dirty=!0,this.$pristine=!1,this.$$parentForm.$setDirty()},$setPristine:function(){this.$$animate.setClass(this.$$element,PRISTINE_CLASS,DIRTY_CLASS+" "+SUBMITTED_CLASS),this.$dirty=!1,this.$pristine=!0,this.$submitted=!1,forEach(this.$$controls,function(control){control.$setPristine()})},$setUntouched:function(){forEach(this.$$controls,function(control){control.$setUntouched()})},$setSubmitted:function(){this.$$animate.addClass(this.$$element,SUBMITTED_CLASS),this.$submitted=!0,this.$$parentForm.$setSubmitted()}},addSetValidityMethod({clazz:FormController,set:function(object,property,controller){var list=object[property];if(list){var index=list.indexOf(controller);index===-1&&list.push(controller)}else object[property]=[controller]},unset:function(object,property,controller){var list=object[property];list&&(arrayRemove(list,controller),0===list.length&&delete object[property])}});var formDirectiveFactory=function(isNgForm){return["$timeout","$parse",function($timeout,$parse){function getSetter(expression){return""===expression?$parse('this[""]').assign:$parse(expression).assign||noop}var formDirective={name:"form",restrict:isNgForm?"EAC":"E",require:["form","^^?form"],controller:FormController,compile:function(formElement,attr){formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS);var nameAttr=attr.name?"name":!(!isNgForm||!attr.ngForm)&&"ngForm";return{pre:function(scope,formElement,attr,ctrls){var controller=ctrls[0];if(!("action"in attr)){var handleFormSubmission=function(event){scope.$apply(function(){controller.$commitViewValue(),controller.$setSubmitted()}),event.preventDefault()};formElement[0].addEventListener("submit",handleFormSubmission),formElement.on("$destroy",function(){$timeout(function(){formElement[0].removeEventListener("submit",handleFormSubmission)},0,!1)})}var parentFormCtrl=ctrls[1]||controller.$$parentForm;parentFormCtrl.$addControl(controller);var setter=nameAttr?getSetter(controller.$name):noop;nameAttr&&(setter(scope,controller),attr.$observe(nameAttr,function(newValue){controller.$name!==newValue&&(setter(scope,void 0),controller.$$parentForm.$$renameControl(controller,newValue),(setter=getSetter(controller.$name))(scope,controller))})),formElement.on("$destroy",function(){controller.$$parentForm.$removeControl(controller),setter(scope,void 0),extend(controller,nullFormCtrl)})}}}};return formDirective}]},formDirective=formDirectiveFactory(),ngFormDirective=formDirectiveFactory(!0),ISO_DATE_REGEXP=/^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/,URL_REGEXP=/^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:\/?#]+|\[[a-f\d:]+])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i,EMAIL_REGEXP=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/,NUMBER_REGEXP=/^\s*(-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,DATE_REGEXP=/^(\d{4,})-(\d{2})-(\d{2})$/,DATETIMELOCAL_REGEXP=/^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,WEEK_REGEXP=/^(\d{4,})-W(\d\d)$/,MONTH_REGEXP=/^(\d{4,})-(\d\d)$/,TIME_REGEXP=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,PARTIAL_VALIDATION_EVENTS="keydown wheel mousedown",PARTIAL_VALIDATION_TYPES=createMap();forEach("date,datetime-local,month,time,week".split(","),function(type){PARTIAL_VALIDATION_TYPES[type]=!0});var inputType={text:textInputType,date:createDateInputType("date",DATE_REGEXP,createDateParser(DATE_REGEXP,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":createDateInputType("datetimelocal",DATETIMELOCAL_REGEXP,createDateParser(DATETIMELOCAL_REGEXP,["yyyy","MM","dd","HH","mm","ss","sss"]),"yyyy-MM-ddTHH:mm:ss.sss"),time:createDateInputType("time",TIME_REGEXP,createDateParser(TIME_REGEXP,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:createDateInputType("week",WEEK_REGEXP,weekParser,"yyyy-Www"),month:createDateInputType("month",MONTH_REGEXP,createDateParser(MONTH_REGEXP,["yyyy","MM"]),"yyyy-MM"),number:numberInputType,url:urlInputType,email:emailInputType,radio:radioInputType,range:rangeInputType,checkbox:checkboxInputType,hidden:noop,button:noop,submit:noop,reset:noop,file:noop},inputDirective=["$browser","$sniffer","$filter","$parse",function($browser,$sniffer,$filter,$parse){return{restrict:"E",require:["?ngModel"],link:{pre:function(scope,element,attr,ctrls){ctrls[0]&&(inputType[lowercase(attr.type)]||inputType.text)(scope,element,attr,ctrls[0],$sniffer,$browser,$filter,$parse)}}}}],CONSTANT_VALUE_REGEXP=/^(true|false|\d+)$/,ngValueDirective=function(){function updateElementValue(element,attr,value){var propValue=isDefined(value)?value:9===msie?"":null;element.prop("value",propValue),attr.$set("value",value)}return{restrict:"A",priority:100,compile:function(tpl,tplAttr){return CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)?function(scope,elm,attr){var value=scope.$eval(attr.ngValue);updateElementValue(elm,attr,value)}:function(scope,elm,attr){scope.$watch(attr.ngValue,function(value){updateElementValue(elm,attr,value)})}}}},ngBindDirective=["$compile",function($compile){return{restrict:"AC",compile:function(templateElement){return $compile.$$addBindingClass(templateElement),function(scope,element,attr){$compile.$$addBindingInfo(element,attr.ngBind),element=element[0],scope.$watch(attr.ngBind,function(value){element.textContent=stringify(value)})}}}}],ngBindTemplateDirective=["$interpolate","$compile",function($interpolate,$compile){return{compile:function(templateElement){return $compile.$$addBindingClass(templateElement),function(scope,element,attr){var interpolateFn=$interpolate(element.attr(attr.$attr.ngBindTemplate));$compile.$$addBindingInfo(element,interpolateFn.expressions),element=element[0],attr.$observe("ngBindTemplate",function(value){element.textContent=isUndefined(value)?"":value})}}}}],ngBindHtmlDirective=["$sce","$parse","$compile",function($sce,$parse,$compile){return{restrict:"A",compile:function(tElement,tAttrs){var ngBindHtmlGetter=$parse(tAttrs.ngBindHtml),ngBindHtmlWatch=$parse(tAttrs.ngBindHtml,function(val){return $sce.valueOf(val)});return $compile.$$addBindingClass(tElement),function(scope,element,attr){$compile.$$addBindingInfo(element,attr.ngBindHtml),scope.$watch(ngBindHtmlWatch,function(){var value=ngBindHtmlGetter(scope);element.html($sce.getTrustedHtml(value)||"")})}}}}],ngChangeDirective=valueFn({restrict:"A",require:"ngModel",link:function(scope,element,attr,ctrl){ctrl.$viewChangeListeners.push(function(){scope.$eval(attr.ngChange)})}}),ngClassDirective=classDirective("",!0),ngClassOddDirective=classDirective("Odd",0),ngClassEvenDirective=classDirective("Even",1),ngCloakDirective=ngDirective({compile:function(element,attr){attr.$set("ngCloak",void 0),element.removeClass("ng-cloak")}}),ngControllerDirective=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],ngEventDirectives={},forceAsyncEvents={blur:!0,focus:!0};forEach("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(eventName){var directiveName=directiveNormalize("ng-"+eventName);ngEventDirectives[directiveName]=["$parse","$rootScope",function($parse,$rootScope){return{restrict:"A",compile:function($element,attr){var fn=$parse(attr[directiveName]);return function(scope,element){element.on(eventName,function(event){var callback=function(){fn(scope,{$event:event})};forceAsyncEvents[eventName]&&$rootScope.$$phase?scope.$evalAsync(callback):scope.$apply(callback)})}}}}]});var ngIfDirective=["$animate","$compile",function($animate,$compile){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function($scope,$element,$attr,ctrl,$transclude){var block,childScope,previousElements;$scope.$watch($attr.ngIf,function(value){value?childScope||$transclude(function(clone,newScope){childScope=newScope,clone[clone.length++]=$compile.$$createComment("end ngIf",$attr.ngIf),block={clone:clone},$animate.enter(clone,$element.parent(),$element)}):(previousElements&&(previousElements.remove(),previousElements=null),childScope&&(childScope.$destroy(),childScope=null),block&&(previousElements=getBlockNodes(block.clone),$animate.leave(previousElements).done(function(response){response!==!1&&(previousElements=null)}),block=null))})}}}],ngIncludeDirective=["$templateRequest","$anchorScroll","$animate",function($templateRequest,$anchorScroll,$animate){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:angular.noop,compile:function(element,attr){var srcExp=attr.ngInclude||attr.src,onloadExp=attr.onload||"",autoScrollExp=attr.autoscroll;return function(scope,$element,$attr,ctrl,$transclude){var currentScope,previousElement,currentElement,changeCounter=0,cleanupLastIncludeContent=function(){previousElement&&(previousElement.remove(),previousElement=null),currentScope&&(currentScope.$destroy(),currentScope=null),currentElement&&($animate.leave(currentElement).done(function(response){response!==!1&&(previousElement=null)}),previousElement=currentElement,currentElement=null)};scope.$watch(srcExp,function(src){var afterAnimation=function(response){response===!1||!isDefined(autoScrollExp)||autoScrollExp&&!scope.$eval(autoScrollExp)||$anchorScroll()},thisChangeId=++changeCounter;src?($templateRequest(src,!0).then(function(response){if(!scope.$$destroyed&&thisChangeId===changeCounter){var newScope=scope.$new();ctrl.template=response;var clone=$transclude(newScope,function(clone){cleanupLastIncludeContent(),$animate.enter(clone,null,$element).done(afterAnimation)});currentScope=newScope,currentElement=clone,currentScope.$emit("$includeContentLoaded",src),scope.$eval(onloadExp)}},function(){scope.$$destroyed||thisChangeId===changeCounter&&(cleanupLastIncludeContent(),scope.$emit("$includeContentError",src))}),scope.$emit("$includeContentRequested",src)):(cleanupLastIncludeContent(),ctrl.template=null)})}}}}],ngIncludeFillContentDirective=["$compile",function($compile){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(scope,$element,$attr,ctrl){return toString.call($element[0]).match(/SVG/)?($element.empty(),void $compile(jqLiteBuildFragment(ctrl.template,window.document).childNodes)(scope,function(clone){$element.append(clone)},{futureParentElement:$element})):($element.html(ctrl.template),void $compile($element.contents())(scope))}}}],ngInitDirective=ngDirective({priority:450,compile:function(){return{pre:function(scope,element,attrs){scope.$eval(attrs.ngInit)}}}}),ngListDirective=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(scope,element,attr,ctrl){var ngList=attr.ngList||", ",trimValues="false"!==attr.ngTrim,separator=trimValues?trim(ngList):ngList,parse=function(viewValue){if(!isUndefined(viewValue)){var list=[];return viewValue&&forEach(viewValue.split(separator),function(value){value&&list.push(trimValues?trim(value):value)}),list}};ctrl.$parsers.push(parse),ctrl.$formatters.push(function(value){if(isArray(value))return value.join(ngList)}),ctrl.$isEmpty=function(value){return!value||!value.length}}}},VALID_CLASS="ng-valid",INVALID_CLASS="ng-invalid",PRISTINE_CLASS="ng-pristine",DIRTY_CLASS="ng-dirty",UNTOUCHED_CLASS="ng-untouched",TOUCHED_CLASS="ng-touched",EMPTY_CLASS="ng-empty",NOT_EMPTY_CLASS="ng-not-empty",ngModelMinErr=minErr("ngModel");NgModelController.$inject=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$q","$interpolate"],NgModelController.prototype={$$initGetterSetters:function(){if(this.$options.getOption("getterSetter")){var invokeModelGetter=this.$$parse(this.$$attr.ngModel+"()"),invokeModelSetter=this.$$parse(this.$$attr.ngModel+"($$$p)");this.$$ngModelGet=function($scope){var modelValue=this.$$parsedNgModel($scope);return isFunction(modelValue)&&(modelValue=invokeModelGetter($scope)),modelValue},this.$$ngModelSet=function($scope,newValue){isFunction(this.$$parsedNgModel($scope))?invokeModelSetter($scope,{$$$p:newValue}):this.$$parsedNgModelAssign($scope,newValue)}}else if(!this.$$parsedNgModel.assign)throw ngModelMinErr("nonassign","Expression '{0}' is non-assignable. Element: {1}",this.$$attr.ngModel,startingTag(this.$$element))},$render:noop,$isEmpty:function(value){return isUndefined(value)||""===value||null===value||value!==value},$$updateEmptyClasses:function(value){this.$isEmpty(value)?(this.$$animate.removeClass(this.$$element,NOT_EMPTY_CLASS),this.$$animate.addClass(this.$$element,EMPTY_CLASS)):(this.$$animate.removeClass(this.$$element,EMPTY_CLASS),this.$$animate.addClass(this.$$element,NOT_EMPTY_CLASS))},$setPristine:function(){this.$dirty=!1,this.$pristine=!0,this.$$animate.removeClass(this.$$element,DIRTY_CLASS),this.$$animate.addClass(this.$$element,PRISTINE_CLASS)},$setDirty:function(){this.$dirty=!0,this.$pristine=!1,this.$$animate.removeClass(this.$$element,PRISTINE_CLASS),this.$$animate.addClass(this.$$element,DIRTY_CLASS),this.$$parentForm.$setDirty()},$setUntouched:function(){this.$touched=!1,this.$untouched=!0,this.$$animate.setClass(this.$$element,UNTOUCHED_CLASS,TOUCHED_CLASS)},$setTouched:function(){this.$touched=!0,this.$untouched=!1,this.$$animate.setClass(this.$$element,TOUCHED_CLASS,UNTOUCHED_CLASS)},$rollbackViewValue:function(){this.$$timeout.cancel(this.$$pendingDebounce),this.$viewValue=this.$$lastCommittedViewValue,this.$render()},$validate:function(){if(!isNumberNaN(this.$modelValue)){var viewValue=this.$$lastCommittedViewValue,modelValue=this.$$rawModelValue,prevValid=this.$valid,prevModelValue=this.$modelValue,allowInvalid=this.$options.getOption("allowInvalid"),that=this;this.$$runValidators(modelValue,viewValue,function(allValid){allowInvalid||prevValid===allValid||(that.$modelValue=allValid?modelValue:void 0,that.$modelValue!==prevModelValue&&that.$$writeModelToScope())})}},$$runValidators:function(modelValue,viewValue,doneCallback){function processParseErrors(){var errorKey=that.$$parserName||"parse";return isUndefined(that.$$parserValid)?(setValidity(errorKey,null),!0):(that.$$parserValid||(forEach(that.$validators,function(v,name){setValidity(name,null)}),forEach(that.$asyncValidators,function(v,name){setValidity(name,null)})),setValidity(errorKey,that.$$parserValid),that.$$parserValid)}function processSyncValidators(){var syncValidatorsValid=!0;return forEach(that.$validators,function(validator,name){var result=Boolean(validator(modelValue,viewValue));syncValidatorsValid=syncValidatorsValid&&result,setValidity(name,result)}),!!syncValidatorsValid||(forEach(that.$asyncValidators,function(v,name){setValidity(name,null)}),!1)}function processAsyncValidators(){var validatorPromises=[],allValid=!0;forEach(that.$asyncValidators,function(validator,name){var promise=validator(modelValue,viewValue);if(!isPromiseLike(promise))throw ngModelMinErr("nopromise","Expected asynchronous validator to return a promise but got '{0}' instead.",promise);setValidity(name,void 0),validatorPromises.push(promise.then(function(){setValidity(name,!0)},function(){allValid=!1,setValidity(name,!1)}))}),validatorPromises.length?that.$$q.all(validatorPromises).then(function(){validationDone(allValid)},noop):validationDone(!0)}function setValidity(name,isValid){localValidationRunId===that.$$currentValidationRunId&&that.$setValidity(name,isValid)}function validationDone(allValid){localValidationRunId===that.$$currentValidationRunId&&doneCallback(allValid)}this.$$currentValidationRunId++;var localValidationRunId=this.$$currentValidationRunId,that=this;return processParseErrors()&&processSyncValidators()?void processAsyncValidators():void validationDone(!1)},$commitViewValue:function(){var viewValue=this.$viewValue;this.$$timeout.cancel(this.$$pendingDebounce),(this.$$lastCommittedViewValue!==viewValue||""===viewValue&&this.$$hasNativeValidators)&&(this.$$updateEmptyClasses(viewValue),this.$$lastCommittedViewValue=viewValue,this.$pristine&&this.$setDirty(),this.$$parseAndValidate())},$$parseAndValidate:function(){function writeToModelIfNeeded(){that.$modelValue!==prevModelValue&&that.$$writeModelToScope()}var viewValue=this.$$lastCommittedViewValue,modelValue=viewValue,that=this;if(this.$$parserValid=!isUndefined(modelValue)||void 0,this.$$parserValid)for(var i=0;i<this.$parsers.length;i++)if(modelValue=this.$parsers[i](modelValue),isUndefined(modelValue)){this.$$parserValid=!1;break}isNumberNaN(this.$modelValue)&&(this.$modelValue=this.$$ngModelGet(this.$$scope));var prevModelValue=this.$modelValue,allowInvalid=this.$options.getOption("allowInvalid");this.$$rawModelValue=modelValue,allowInvalid&&(this.$modelValue=modelValue,writeToModelIfNeeded()),this.$$runValidators(modelValue,this.$$lastCommittedViewValue,function(allValid){allowInvalid||(that.$modelValue=allValid?modelValue:void 0,writeToModelIfNeeded())})},$$writeModelToScope:function(){this.$$ngModelSet(this.$$scope,this.$modelValue),forEach(this.$viewChangeListeners,function(listener){try{listener()}catch(e){this.$$exceptionHandler(e)}},this)},$setViewValue:function(value,trigger){this.$viewValue=value,this.$options.getOption("updateOnDefault")&&this.$$debounceViewValueCommit(trigger)},$$debounceViewValueCommit:function(trigger){var debounceDelay=this.$options.getOption("debounce");isNumber(debounceDelay[trigger])?debounceDelay=debounceDelay[trigger]:isNumber(debounceDelay["default"])&&(debounceDelay=debounceDelay["default"]),this.$$timeout.cancel(this.$$pendingDebounce);var that=this;debounceDelay>0?this.$$pendingDebounce=this.$$timeout(function(){that.$commitViewValue()},debounceDelay):this.$$scope.$root.$$phase?this.$commitViewValue():this.$$scope.$apply(function(){that.$commitViewValue()})},$overrideModelOptions:function(options){this.$options=this.$options.createChild(options)}},addSetValidityMethod({clazz:NgModelController,set:function(object,property){object[property]=!0},unset:function(object,property){delete object[property]}});var defaultModelOptions,ngModelDirective=["$rootScope",function($rootScope){return{restrict:"A",require:["ngModel","^?form","^?ngModelOptions"],controller:NgModelController,priority:1,compile:function(element){return element.addClass(PRISTINE_CLASS).addClass(UNTOUCHED_CLASS).addClass(VALID_CLASS),{pre:function(scope,element,attr,ctrls){var modelCtrl=ctrls[0],formCtrl=ctrls[1]||modelCtrl.$$parentForm,optionsCtrl=ctrls[2];optionsCtrl&&(modelCtrl.$options=optionsCtrl.$options),modelCtrl.$$initGetterSetters(),formCtrl.$addControl(modelCtrl),attr.$observe("name",function(newValue){modelCtrl.$name!==newValue&&modelCtrl.$$parentForm.$$renameControl(modelCtrl,newValue)}),scope.$on("$destroy",function(){modelCtrl.$$parentForm.$removeControl(modelCtrl)})},post:function(scope,element,attr,ctrls){function setTouched(){modelCtrl.$setTouched()}var modelCtrl=ctrls[0];modelCtrl.$options.getOption("updateOn")&&element.on(modelCtrl.$options.getOption("updateOn"),function(ev){modelCtrl.$$debounceViewValueCommit(ev&&ev.type)}),element.on("blur",function(){modelCtrl.$touched||($rootScope.$$phase?scope.$evalAsync(setTouched):scope.$apply(setTouched))})}}}}}],DEFAULT_REGEXP=/(\s+|^)default(\s+|$)/;ModelOptions.prototype={getOption:function(name){return this.$$options[name]},createChild:function(options){var inheritAll=!1;return options=extend({},options),forEach(options,function(option,key){"$inherit"===option?"*"===key?inheritAll=!0:(options[key]=this.$$options[key],"updateOn"===key&&(options.updateOnDefault=this.$$options.updateOnDefault)):"updateOn"===key&&(options.updateOnDefault=!1,options[key]=trim(option.replace(DEFAULT_REGEXP,function(){return options.updateOnDefault=!0," "})))},this),inheritAll&&(delete options["*"],defaults(options,this.$$options)),defaults(options,defaultModelOptions.$$options),new ModelOptions(options)}},defaultModelOptions=new ModelOptions({updateOn:"",updateOnDefault:!0,debounce:0,getterSetter:!1,allowInvalid:!1,timezone:null});var ngModelOptionsDirective=function(){function NgModelOptionsController($attrs,$scope){this.$$attrs=$attrs,this.$$scope=$scope}return NgModelOptionsController.$inject=["$attrs","$scope"],NgModelOptionsController.prototype={$onInit:function(){var parentOptions=this.parentCtrl?this.parentCtrl.$options:defaultModelOptions,modelOptionsDefinition=this.$$scope.$eval(this.$$attrs.ngModelOptions);this.$options=parentOptions.createChild(modelOptionsDefinition)}},{restrict:"A",priority:10,require:{parentCtrl:"?^^ngModelOptions"},bindToController:!0,controller:NgModelOptionsController}},ngNonBindableDirective=ngDirective({terminal:!0,priority:1e3}),ngOptionsMinErr=minErr("ngOptions"),NG_OPTIONS_REGEXP=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?(?:\s+disable\s+when\s+([\s\S]+?))?\s+for\s+(?:([$\w][$\w]*)|(?:\(\s*([$\w][$\w]*)\s*,\s*([$\w][$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,ngOptionsDirective=["$compile","$document","$parse",function($compile,$document,$parse){function parseOptionsExpression(optionsExp,selectElement,scope){function Option(selectValue,viewValue,label,group,disabled){this.selectValue=selectValue,this.viewValue=viewValue,this.label=label,this.group=group,this.disabled=disabled}function getOptionValuesKeys(optionValues){var optionValuesKeys;if(!keyName&&isArrayLike(optionValues))optionValuesKeys=optionValues;else{optionValuesKeys=[];for(var itemKey in optionValues)optionValues.hasOwnProperty(itemKey)&&"$"!==itemKey.charAt(0)&&optionValuesKeys.push(itemKey)}return optionValuesKeys}var match=optionsExp.match(NG_OPTIONS_REGEXP);if(!match)throw ngOptionsMinErr("iexp","Expected expression in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_' but got '{0}'. Element: {1}",optionsExp,startingTag(selectElement));var valueName=match[5]||match[7],keyName=match[6],selectAs=/ as /.test(match[0])&&match[1],trackBy=match[9],valueFn=$parse(match[2]?match[1]:valueName),selectAsFn=selectAs&&$parse(selectAs),viewValueFn=selectAsFn||valueFn,trackByFn=trackBy&&$parse(trackBy),getTrackByValueFn=trackBy?function(value,locals){return trackByFn(scope,locals)}:function(value){return hashKey(value)},getTrackByValue=function(value,key){return getTrackByValueFn(value,getLocals(value,key))},displayFn=$parse(match[2]||match[1]),groupByFn=$parse(match[3]||""),disableWhenFn=$parse(match[4]||""),valuesFn=$parse(match[8]),locals={},getLocals=keyName?function(value,key){return locals[keyName]=key,locals[valueName]=value,locals}:function(value){return locals[valueName]=value,locals};return{trackBy:trackBy,getTrackByValue:getTrackByValue,getWatchables:$parse(valuesFn,function(optionValues){var watchedArray=[];optionValues=optionValues||[];for(var optionValuesKeys=getOptionValuesKeys(optionValues),optionValuesLength=optionValuesKeys.length,index=0;index<optionValuesLength;index++){var key=optionValues===optionValuesKeys?index:optionValuesKeys[index],value=optionValues[key],locals=getLocals(value,key),selectValue=getTrackByValueFn(value,locals);if(watchedArray.push(selectValue),match[2]||match[1]){var label=displayFn(scope,locals);watchedArray.push(label)}if(match[4]){var disableWhen=disableWhenFn(scope,locals);watchedArray.push(disableWhen)}}return watchedArray}),getOptions:function(){for(var optionItems=[],selectValueMap={},optionValues=valuesFn(scope)||[],optionValuesKeys=getOptionValuesKeys(optionValues),optionValuesLength=optionValuesKeys.length,index=0;index<optionValuesLength;index++){var key=optionValues===optionValuesKeys?index:optionValuesKeys[index],value=optionValues[key],locals=getLocals(value,key),viewValue=viewValueFn(scope,locals),selectValue=getTrackByValueFn(viewValue,locals),label=displayFn(scope,locals),group=groupByFn(scope,locals),disabled=disableWhenFn(scope,locals),optionItem=new Option(selectValue,viewValue,label,group,disabled);optionItems.push(optionItem),selectValueMap[selectValue]=optionItem}return{items:optionItems,selectValueMap:selectValueMap,getOptionFromViewValue:function(value){return selectValueMap[getTrackByValue(value)]},getViewValueFromOption:function(option){return trackBy?copy(option.viewValue):option.viewValue}}}}}function ngOptionsPostLink(scope,selectElement,attr,ctrls){function addOptionElement(option,parent){var optionElement=optionTemplate.cloneNode(!1);parent.appendChild(optionElement),updateOptionElement(option,optionElement)}function getAndUpdateSelectedOption(viewValue){var option=options.getOptionFromViewValue(viewValue),element=option&&option.element;return element&&!element.selected&&(element.selected=!0),option}function updateOptionElement(option,element){option.element=element,element.disabled=option.disabled,option.label!==element.label&&(element.label=option.label,element.textContent=option.label),element.value=option.selectValue}function updateOptions(){var previousValue=options&&selectCtrl.readValue();if(options)for(var i=options.items.length-1;i>=0;i--){var option=options.items[i];jqLiteRemove(isDefined(option.group)?option.element.parentNode:option.element)}options=ngOptions.getOptions();var groupElementMap={};if(providedEmptyOption&&selectElement.prepend(selectCtrl.emptyOption),options.items.forEach(function(option){var groupElement;isDefined(option.group)?(groupElement=groupElementMap[option.group],groupElement||(groupElement=optGroupTemplate.cloneNode(!1),listFragment.appendChild(groupElement),groupElement.label=null===option.group?"null":option.group,groupElementMap[option.group]=groupElement),addOptionElement(option,groupElement)):addOptionElement(option,listFragment)}),selectElement[0].appendChild(listFragment),ngModelCtrl.$render(),!ngModelCtrl.$isEmpty(previousValue)){var nextValue=selectCtrl.readValue(),isNotPrimitive=ngOptions.trackBy||multiple;(isNotPrimitive?equals(previousValue,nextValue):previousValue===nextValue)||(ngModelCtrl.$setViewValue(nextValue),ngModelCtrl.$render())}}for(var selectCtrl=ctrls[0],ngModelCtrl=ctrls[1],multiple=attr.multiple,i=0,children=selectElement.children(),ii=children.length;i<ii;i++)if(""===children[i].value){selectCtrl.hasEmptyOption=!0,selectCtrl.emptyOption=children.eq(i);break}var providedEmptyOption=!!selectCtrl.emptyOption,unknownOption=jqLite(optionTemplate.cloneNode(!1));unknownOption.val("?");var options,ngOptions=parseOptionsExpression(attr.ngOptions,selectElement,scope),listFragment=$document[0].createDocumentFragment();selectCtrl.generateUnknownOptionValue=function(val){return"?"},multiple?(selectCtrl.writeValue=function(values){var selectedOptions=values&&values.map(getAndUpdateSelectedOption)||[];options.items.forEach(function(option){option.element.selected&&!includes(selectedOptions,option)&&(option.element.selected=!1)})},selectCtrl.readValue=function(){var selectedValues=selectElement.val()||[],selections=[];return forEach(selectedValues,function(value){var option=options.selectValueMap[value];option&&!option.disabled&&selections.push(options.getViewValueFromOption(option))}),selections},ngOptions.trackBy&&scope.$watchCollection(function(){if(isArray(ngModelCtrl.$viewValue))return ngModelCtrl.$viewValue.map(function(value){return ngOptions.getTrackByValue(value)})},function(){ngModelCtrl.$render()})):(selectCtrl.writeValue=function(value){var selectedOption=options.selectValueMap[selectElement.val()],option=options.getOptionFromViewValue(value);selectedOption&&selectedOption.element.removeAttribute("selected"),option?(selectElement[0].value!==option.selectValue&&(selectCtrl.removeUnknownOption(),selectCtrl.unselectEmptyOption(),selectElement[0].value=option.selectValue,option.element.selected=!0),option.element.setAttribute("selected","selected")):providedEmptyOption?selectCtrl.selectEmptyOption():selectCtrl.unknownOption.parent().length?selectCtrl.updateUnknownOption(value):selectCtrl.renderUnknownOption(value)},selectCtrl.readValue=function(){var selectedOption=options.selectValueMap[selectElement.val()];return selectedOption&&!selectedOption.disabled?(selectCtrl.unselectEmptyOption(),selectCtrl.removeUnknownOption(),options.getViewValueFromOption(selectedOption)):null},ngOptions.trackBy&&scope.$watch(function(){return ngOptions.getTrackByValue(ngModelCtrl.$viewValue)},function(){ngModelCtrl.$render()})),providedEmptyOption&&(selectCtrl.emptyOption.remove(),$compile(selectCtrl.emptyOption)(scope),selectCtrl.emptyOption[0].nodeType===NODE_TYPE_COMMENT?(selectCtrl.hasEmptyOption=!1,selectCtrl.registerOption=function(optionScope,optionEl){""===optionEl.val()&&(selectCtrl.hasEmptyOption=!0,selectCtrl.emptyOption=optionEl,selectCtrl.emptyOption.removeClass("ng-scope"),ngModelCtrl.$render(),optionEl.on("$destroy",function(){selectCtrl.hasEmptyOption=!1,selectCtrl.emptyOption=void 0}))}):selectCtrl.emptyOption.removeClass("ng-scope")),selectElement.empty(),updateOptions(),scope.$watchCollection(ngOptions.getWatchables,updateOptions)}var optionTemplate=window.document.createElement("option"),optGroupTemplate=window.document.createElement("optgroup");
return{restrict:"A",terminal:!0,require:["select","ngModel"],link:{pre:function(scope,selectElement,attr,ctrls){ctrls[0].registerOption=noop},post:ngOptionsPostLink}}}],ngPluralizeDirective=["$locale","$interpolate","$log",function($locale,$interpolate,$log){var BRACE=/{}/g,IS_WHEN=/^when(Minus)?(.+)$/;return{link:function(scope,element,attr){function updateElementText(newText){element.text(newText||"")}var lastCount,numberExp=attr.count,whenExp=attr.$attr.when&&element.attr(attr.$attr.when),offset=attr.offset||0,whens=scope.$eval(whenExp)||{},whensExpFns={},startSymbol=$interpolate.startSymbol(),endSymbol=$interpolate.endSymbol(),braceReplacement=startSymbol+numberExp+"-"+offset+endSymbol,watchRemover=angular.noop;forEach(attr,function(expression,attributeName){var tmpMatch=IS_WHEN.exec(attributeName);if(tmpMatch){var whenKey=(tmpMatch[1]?"-":"")+lowercase(tmpMatch[2]);whens[whenKey]=element.attr(attr.$attr[attributeName])}}),forEach(whens,function(expression,key){whensExpFns[key]=$interpolate(expression.replace(BRACE,braceReplacement))}),scope.$watch(numberExp,function(newVal){var count=parseFloat(newVal),countIsNaN=isNumberNaN(count);if(countIsNaN||count in whens||(count=$locale.pluralCat(count-offset)),!(count===lastCount||countIsNaN&&isNumberNaN(lastCount))){watchRemover();var whenExpFn=whensExpFns[count];isUndefined(whenExpFn)?(null!=newVal&&$log.debug("ngPluralize: no rule defined for '"+count+"' in "+whenExp),watchRemover=noop,updateElementText()):watchRemover=scope.$watch(whenExpFn,updateElementText),lastCount=count}})}}}],ngRepeatDirective=["$parse","$animate","$compile",function($parse,$animate,$compile){var NG_REMOVED="$$NG_REMOVED",ngRepeatMinErr=minErr("ngRepeat"),updateScope=function(scope,index,valueIdentifier,value,keyIdentifier,key,arrayLength){scope[valueIdentifier]=value,keyIdentifier&&(scope[keyIdentifier]=key),scope.$index=index,scope.$first=0===index,scope.$last=index===arrayLength-1,scope.$middle=!(scope.$first||scope.$last),scope.$odd=!(scope.$even=0===(1&index))},getBlockStart=function(block){return block.clone[0]},getBlockEnd=function(block){return block.clone[block.clone.length-1]};return{restrict:"A",multiElement:!0,transclude:"element",priority:1e3,terminal:!0,$$tlb:!0,compile:function($element,$attr){var expression=$attr.ngRepeat,ngRepeatEndComment=$compile.$$createComment("end ngRepeat",expression),match=expression.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);if(!match)throw ngRepeatMinErr("iexp","Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.",expression);var lhs=match[1],rhs=match[2],aliasAs=match[3],trackByExp=match[4];if(match=lhs.match(/^(?:(\s*[$\w]+)|\(\s*([$\w]+)\s*,\s*([$\w]+)\s*\))$/),!match)throw ngRepeatMinErr("iidexp","'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.",lhs);var valueIdentifier=match[3]||match[1],keyIdentifier=match[2];if(aliasAs&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(aliasAs)||/^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent|\$root|\$id)$/.test(aliasAs)))throw ngRepeatMinErr("badident","alias '{0}' is invalid --- must be a valid JS identifier which is not a reserved name.",aliasAs);var trackByExpGetter,trackByIdExpFn,trackByIdArrayFn,trackByIdObjFn,hashFnLocals={$id:hashKey};return trackByExp?trackByExpGetter=$parse(trackByExp):(trackByIdArrayFn=function(key,value){return hashKey(value)},trackByIdObjFn=function(key){return key}),function($scope,$element,$attr,ctrl,$transclude){trackByExpGetter&&(trackByIdExpFn=function(key,value,index){return keyIdentifier&&(hashFnLocals[keyIdentifier]=key),hashFnLocals[valueIdentifier]=value,hashFnLocals.$index=index,trackByExpGetter($scope,hashFnLocals)});var lastBlockMap=createMap();$scope.$watchCollection(rhs,function(collection){var index,length,nextNode,collectionLength,key,value,trackById,trackByIdFn,collectionKeys,block,nextBlockOrder,elementsToRemove,previousNode=$element[0],nextBlockMap=createMap();if(aliasAs&&($scope[aliasAs]=collection),isArrayLike(collection))collectionKeys=collection,trackByIdFn=trackByIdExpFn||trackByIdArrayFn;else{trackByIdFn=trackByIdExpFn||trackByIdObjFn,collectionKeys=[];for(var itemKey in collection)hasOwnProperty.call(collection,itemKey)&&"$"!==itemKey.charAt(0)&&collectionKeys.push(itemKey)}for(collectionLength=collectionKeys.length,nextBlockOrder=new Array(collectionLength),index=0;index<collectionLength;index++)if(key=collection===collectionKeys?index:collectionKeys[index],value=collection[key],trackById=trackByIdFn(key,value,index),lastBlockMap[trackById])block=lastBlockMap[trackById],delete lastBlockMap[trackById],nextBlockMap[trackById]=block,nextBlockOrder[index]=block;else{if(nextBlockMap[trackById])throw forEach(nextBlockOrder,function(block){block&&block.scope&&(lastBlockMap[block.id]=block)}),ngRepeatMinErr("dupes","Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}",expression,trackById,value);nextBlockOrder[index]={id:trackById,scope:void 0,clone:void 0},nextBlockMap[trackById]=!0}for(var blockKey in lastBlockMap){if(block=lastBlockMap[blockKey],elementsToRemove=getBlockNodes(block.clone),$animate.leave(elementsToRemove),elementsToRemove[0].parentNode)for(index=0,length=elementsToRemove.length;index<length;index++)elementsToRemove[index][NG_REMOVED]=!0;block.scope.$destroy()}for(index=0;index<collectionLength;index++)if(key=collection===collectionKeys?index:collectionKeys[index],value=collection[key],block=nextBlockOrder[index],block.scope){nextNode=previousNode;do nextNode=nextNode.nextSibling;while(nextNode&&nextNode[NG_REMOVED]);getBlockStart(block)!==nextNode&&$animate.move(getBlockNodes(block.clone),null,previousNode),previousNode=getBlockEnd(block),updateScope(block.scope,index,valueIdentifier,value,keyIdentifier,key,collectionLength)}else $transclude(function(clone,scope){block.scope=scope;var endNode=ngRepeatEndComment.cloneNode(!1);clone[clone.length++]=endNode,$animate.enter(clone,null,previousNode),previousNode=endNode,block.clone=clone,nextBlockMap[block.id]=block,updateScope(block.scope,index,valueIdentifier,value,keyIdentifier,key,collectionLength)});lastBlockMap=nextBlockMap})}}}}],NG_HIDE_CLASS="ng-hide",NG_HIDE_IN_PROGRESS_CLASS="ng-hide-animate",ngShowDirective=["$animate",function($animate){return{restrict:"A",multiElement:!0,link:function(scope,element,attr){scope.$watch(attr.ngShow,function(value){$animate[value?"removeClass":"addClass"](element,NG_HIDE_CLASS,{tempClasses:NG_HIDE_IN_PROGRESS_CLASS})})}}}],ngHideDirective=["$animate",function($animate){return{restrict:"A",multiElement:!0,link:function(scope,element,attr){scope.$watch(attr.ngHide,function(value){$animate[value?"addClass":"removeClass"](element,NG_HIDE_CLASS,{tempClasses:NG_HIDE_IN_PROGRESS_CLASS})})}}}],ngStyleDirective=ngDirective(function(scope,element,attr){scope.$watch(attr.ngStyle,function(newStyles,oldStyles){oldStyles&&newStyles!==oldStyles&&forEach(oldStyles,function(val,style){element.css(style,"")}),newStyles&&element.css(newStyles)},!0)}),ngSwitchDirective=["$animate","$compile",function($animate,$compile){return{require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(scope,element,attr,ngSwitchController){var watchExpr=attr.ngSwitch||attr.on,selectedTranscludes=[],selectedElements=[],previousLeaveAnimations=[],selectedScopes=[],spliceFactory=function(array,index){return function(response){response!==!1&&array.splice(index,1)}};scope.$watch(watchExpr,function(value){for(var i,ii;previousLeaveAnimations.length;)$animate.cancel(previousLeaveAnimations.pop());for(i=0,ii=selectedScopes.length;i<ii;++i){var selected=getBlockNodes(selectedElements[i].clone);selectedScopes[i].$destroy();var runner=previousLeaveAnimations[i]=$animate.leave(selected);runner.done(spliceFactory(previousLeaveAnimations,i))}selectedElements.length=0,selectedScopes.length=0,(selectedTranscludes=ngSwitchController.cases["!"+value]||ngSwitchController.cases["?"])&&forEach(selectedTranscludes,function(selectedTransclude){selectedTransclude.transclude(function(caseElement,selectedScope){selectedScopes.push(selectedScope);var anchor=selectedTransclude.element;caseElement[caseElement.length++]=$compile.$$createComment("end ngSwitchWhen");var block={clone:caseElement};selectedElements.push(block),$animate.enter(caseElement,anchor.parent(),anchor)})})})}}}],ngSwitchWhenDirective=ngDirective({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(scope,element,attrs,ctrl,$transclude){var cases=attrs.ngSwitchWhen.split(attrs.ngSwitchWhenSeparator).sort().filter(function(element,index,array){return array[index-1]!==element});forEach(cases,function(whenCase){ctrl.cases["!"+whenCase]=ctrl.cases["!"+whenCase]||[],ctrl.cases["!"+whenCase].push({transclude:$transclude,element:element})})}}),ngSwitchDefaultDirective=ngDirective({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(scope,element,attr,ctrl,$transclude){ctrl.cases["?"]=ctrl.cases["?"]||[],ctrl.cases["?"].push({transclude:$transclude,element:element})}}),ngTranscludeMinErr=minErr("ngTransclude"),ngTranscludeDirective=["$compile",function($compile){return{restrict:"EAC",terminal:!0,compile:function(tElement){var fallbackLinkFn=$compile(tElement.contents());return tElement.empty(),function($scope,$element,$attrs,controller,$transclude){function ngTranscludeCloneAttachFn(clone,transcludedScope){clone.length&&notWhitespace(clone)?$element.append(clone):(useFallbackContent(),transcludedScope.$destroy())}function useFallbackContent(){fallbackLinkFn($scope,function(clone){$element.append(clone)})}function notWhitespace(nodes){for(var i=0,ii=nodes.length;i<ii;i++){var node=nodes[i];if(node.nodeType!==NODE_TYPE_TEXT||node.nodeValue.trim())return!0}}if(!$transclude)throw ngTranscludeMinErr("orphan","Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element: {0}",startingTag($element));$attrs.ngTransclude===$attrs.$attr.ngTransclude&&($attrs.ngTransclude="");var slotName=$attrs.ngTransclude||$attrs.ngTranscludeSlot;$transclude(ngTranscludeCloneAttachFn,null,slotName),slotName&&!$transclude.isSlotFilled(slotName)&&useFallbackContent()}}}}],scriptDirective=["$templateCache",function($templateCache){return{restrict:"E",terminal:!0,compile:function(element,attr){if("text/ng-template"===attr.type){var templateUrl=attr.id,text=element[0].text;$templateCache.put(templateUrl,text)}}}}],noopNgModelController={$setViewValue:noop,$render:noop},SelectController=["$element","$scope",function($element,$scope){function scheduleRender(){renderScheduled||(renderScheduled=!0,$scope.$$postDigest(function(){renderScheduled=!1,self.ngModelCtrl.$render()}))}function scheduleViewValueUpdate(renderAfter){updateScheduled||(updateScheduled=!0,$scope.$$postDigest(function(){$scope.$$destroyed||(updateScheduled=!1,self.ngModelCtrl.$setViewValue(self.readValue()),renderAfter&&self.ngModelCtrl.$render())}))}var self=this,optionsMap=new NgMap;self.selectValueMap={},self.ngModelCtrl=noopNgModelController,self.multiple=!1,self.unknownOption=jqLite(window.document.createElement("option")),self.hasEmptyOption=!1,self.emptyOption=void 0,self.renderUnknownOption=function(val){var unknownVal=self.generateUnknownOptionValue(val);self.unknownOption.val(unknownVal),$element.prepend(self.unknownOption),setOptionSelectedStatus(self.unknownOption,!0),$element.val(unknownVal)},self.updateUnknownOption=function(val){var unknownVal=self.generateUnknownOptionValue(val);self.unknownOption.val(unknownVal),setOptionSelectedStatus(self.unknownOption,!0),$element.val(unknownVal)},self.generateUnknownOptionValue=function(val){return"? "+hashKey(val)+" ?"},self.removeUnknownOption=function(){self.unknownOption.parent()&&self.unknownOption.remove()},self.selectEmptyOption=function(){self.emptyOption&&($element.val(""),setOptionSelectedStatus(self.emptyOption,!0))},self.unselectEmptyOption=function(){self.hasEmptyOption&&self.emptyOption.removeAttr("selected")},$scope.$on("$destroy",function(){self.renderUnknownOption=noop}),self.readValue=function(){var val=$element.val(),realVal=val in self.selectValueMap?self.selectValueMap[val]:val;return self.hasOption(realVal)?realVal:null},self.writeValue=function(value){var currentlySelectedOption=$element[0].options[$element[0].selectedIndex];if(currentlySelectedOption&&setOptionSelectedStatus(jqLite(currentlySelectedOption),!1),self.hasOption(value)){self.removeUnknownOption();var hashedVal=hashKey(value);$element.val(hashedVal in self.selectValueMap?hashedVal:value);var selectedOption=$element[0].options[$element[0].selectedIndex];setOptionSelectedStatus(jqLite(selectedOption),!0)}else null==value&&self.emptyOption?(self.removeUnknownOption(),self.selectEmptyOption()):self.unknownOption.parent().length?self.updateUnknownOption(value):self.renderUnknownOption(value)},self.addOption=function(value,element){if(element[0].nodeType!==NODE_TYPE_COMMENT){assertNotHasOwnProperty(value,'"option value"'),""===value&&(self.hasEmptyOption=!0,self.emptyOption=element);var count=optionsMap.get(value)||0;optionsMap.set(value,count+1),scheduleRender()}},self.removeOption=function(value){var count=optionsMap.get(value);count&&(1===count?(optionsMap["delete"](value),""===value&&(self.hasEmptyOption=!1,self.emptyOption=void 0)):optionsMap.set(value,count-1))},self.hasOption=function(value){return!!optionsMap.get(value)};var renderScheduled=!1,updateScheduled=!1;self.registerOption=function(optionScope,optionElement,optionAttrs,interpolateValueFn,interpolateTextFn){if(optionAttrs.$attr.ngValue){var oldVal,hashedVal=NaN;optionAttrs.$observe("value",function(newVal){var removal,previouslySelected=optionElement.prop("selected");isDefined(hashedVal)&&(self.removeOption(oldVal),delete self.selectValueMap[hashedVal],removal=!0),hashedVal=hashKey(newVal),oldVal=newVal,self.selectValueMap[hashedVal]=newVal,self.addOption(newVal,optionElement),optionElement.attr("value",hashedVal),removal&&previouslySelected&&scheduleViewValueUpdate()})}else interpolateValueFn?optionAttrs.$observe("value",function(newVal){self.readValue();var removal,previouslySelected=optionElement.prop("selected");isDefined(oldVal)&&(self.removeOption(oldVal),removal=!0),oldVal=newVal,self.addOption(newVal,optionElement),removal&&previouslySelected&&scheduleViewValueUpdate()}):interpolateTextFn?optionScope.$watch(interpolateTextFn,function(newVal,oldVal){optionAttrs.$set("value",newVal);var previouslySelected=optionElement.prop("selected");oldVal!==newVal&&self.removeOption(oldVal),self.addOption(newVal,optionElement),oldVal&&previouslySelected&&scheduleViewValueUpdate()}):self.addOption(optionAttrs.value,optionElement);optionAttrs.$observe("disabled",function(newVal){("true"===newVal||newVal&&optionElement.prop("selected"))&&(self.multiple?scheduleViewValueUpdate(!0):(self.ngModelCtrl.$setViewValue(null),self.ngModelCtrl.$render()))}),optionElement.on("$destroy",function(){var currentValue=self.readValue(),removeValue=optionAttrs.value;self.removeOption(removeValue),scheduleRender(),(self.multiple&&currentValue&&currentValue.indexOf(removeValue)!==-1||currentValue===removeValue)&&scheduleViewValueUpdate(!0)})}}],selectDirective=function(){function selectPreLink(scope,element,attr,ctrls){var selectCtrl=ctrls[0],ngModelCtrl=ctrls[1];if(!ngModelCtrl)return void(selectCtrl.registerOption=noop);if(selectCtrl.ngModelCtrl=ngModelCtrl,element.on("change",function(){selectCtrl.removeUnknownOption(),scope.$apply(function(){ngModelCtrl.$setViewValue(selectCtrl.readValue())})}),attr.multiple){selectCtrl.multiple=!0,selectCtrl.readValue=function(){var array=[];return forEach(element.find("option"),function(option){if(option.selected&&!option.disabled){var val=option.value;array.push(val in selectCtrl.selectValueMap?selectCtrl.selectValueMap[val]:val)}}),array},selectCtrl.writeValue=function(value){forEach(element.find("option"),function(option){var shouldBeSelected=!!value&&(includes(value,option.value)||includes(value,selectCtrl.selectValueMap[option.value])),currentlySelected=option.selected;shouldBeSelected!==currentlySelected&&setOptionSelectedStatus(jqLite(option),shouldBeSelected)})};var lastView,lastViewRef=NaN;scope.$watch(function(){lastViewRef!==ngModelCtrl.$viewValue||equals(lastView,ngModelCtrl.$viewValue)||(lastView=shallowCopy(ngModelCtrl.$viewValue),ngModelCtrl.$render()),lastViewRef=ngModelCtrl.$viewValue}),ngModelCtrl.$isEmpty=function(value){return!value||0===value.length}}}function selectPostLink(scope,element,attrs,ctrls){var ngModelCtrl=ctrls[1];if(ngModelCtrl){var selectCtrl=ctrls[0];ngModelCtrl.$render=function(){selectCtrl.writeValue(ngModelCtrl.$viewValue)}}}return{restrict:"E",require:["select","?ngModel"],controller:SelectController,priority:1,link:{pre:selectPreLink,post:selectPostLink}}},optionDirective=["$interpolate",function($interpolate){return{restrict:"E",priority:100,compile:function(element,attr){var interpolateValueFn,interpolateTextFn;return isDefined(attr.ngValue)||(isDefined(attr.value)?interpolateValueFn=$interpolate(attr.value,!0):(interpolateTextFn=$interpolate(element.text(),!0),interpolateTextFn||attr.$set("value",element.text()))),function(scope,element,attr){var selectCtrlName="$selectController",parent=element.parent(),selectCtrl=parent.data(selectCtrlName)||parent.parent().data(selectCtrlName);selectCtrl&&selectCtrl.registerOption(scope,element,attr,interpolateValueFn,interpolateTextFn)}}}}],requiredDirective=function(){return{restrict:"A",require:"?ngModel",link:function(scope,elm,attr,ctrl){ctrl&&(attr.required=!0,ctrl.$validators.required=function(modelValue,viewValue){return!attr.required||!ctrl.$isEmpty(viewValue)},attr.$observe("required",function(){ctrl.$validate()}))}}},patternDirective=function(){return{restrict:"A",require:"?ngModel",link:function(scope,elm,attr,ctrl){if(ctrl){var regexp,patternExp=attr.ngPattern||attr.pattern;attr.$observe("pattern",function(regex){if(isString(regex)&&regex.length>0&&(regex=new RegExp("^"+regex+"$")),regex&&!regex.test)throw minErr("ngPattern")("noregexp","Expected {0} to be a RegExp but was {1}. Element: {2}",patternExp,regex,startingTag(elm));regexp=regex||void 0,ctrl.$validate()}),ctrl.$validators.pattern=function(modelValue,viewValue){return ctrl.$isEmpty(viewValue)||isUndefined(regexp)||regexp.test(viewValue)}}}}},maxlengthDirective=function(){return{restrict:"A",require:"?ngModel",link:function(scope,elm,attr,ctrl){if(ctrl){var maxlength=-1;attr.$observe("maxlength",function(value){var intVal=toInt(value);maxlength=isNumberNaN(intVal)?-1:intVal,ctrl.$validate()}),ctrl.$validators.maxlength=function(modelValue,viewValue){return maxlength<0||ctrl.$isEmpty(viewValue)||viewValue.length<=maxlength}}}}},minlengthDirective=function(){return{restrict:"A",require:"?ngModel",link:function(scope,elm,attr,ctrl){if(ctrl){var minlength=0;attr.$observe("minlength",function(value){minlength=toInt(value)||0,ctrl.$validate()}),ctrl.$validators.minlength=function(modelValue,viewValue){return ctrl.$isEmpty(viewValue)||viewValue.length>=minlength}}}}};return window.angular.bootstrap?void(window.console&&console.log("WARNING: Tried to load angular more than once.")):(bindJQuery(),publishExternalAPI(angular),angular.module("ngLocale",[],["$provide",function($provide){function getDecimals(n){n+="";var i=n.indexOf(".");return i==-1?0:n.length-i-1}function getVF(n,opt_precision){var v=opt_precision;void 0===v&&(v=Math.min(getDecimals(n),3));var base=Math.pow(10,v),f=(n*base|0)%base;return{v:v,f:f}}var PLURAL_CATEGORY={ZERO:"zero",ONE:"one",TWO:"two",FEW:"few",MANY:"many",OTHER:"other"};$provide.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:["January","February","March","April","May","June","July","August","September","October","November","December"],SHORTDAY:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],SHORTMONTH:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],STANDALONEMONTH:["January","February","March","April","May","June","July","August","September","October","November","December"],WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a",mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:"-¤",negSuf:"",posPre:"¤",posSuf:""}]},id:"en-us",localeID:"en_US",pluralCat:function(n,opt_precision){var i=0|n,vf=getVF(n,opt_precision);return 1==i&&0==vf.v?PLURAL_CATEGORY.ONE:PLURAL_CATEGORY.OTHER}})}]),void jqLite(function(){angularInit(window.document,bootstrap)}))}(window),!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}</style>')},function(module,exports,__webpack_require__){(function(jQuery){+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.affix"),options="object"==typeof option&&option;data||$this.data("bs.affix",data=new Affix(this,options)),"string"==typeof option&&data[option]()})}var Affix=function(element,options){this.options=$.extend({},Affix.DEFAULTS,options),this.$target=$(this.options.target).on("scroll.bs.affix.data-api",$.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",$.proxy(this.checkPositionWithEventLoop,this)),this.$element=$(element),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};Affix.VERSION="3.3.7",Affix.RESET="affix affix-top affix-bottom",Affix.DEFAULTS={offset:0,target:window},Affix.prototype.getState=function(scrollHeight,height,offsetTop,offsetBottom){var scrollTop=this.$target.scrollTop(),position=this.$element.offset(),targetHeight=this.$target.height();if(null!=offsetTop&&"top"==this.affixed)return scrollTop<offsetTop&&"top";if("bottom"==this.affixed)return null!=offsetTop?!(scrollTop+this.unpin<=position.top)&&"bottom":!(scrollTop+targetHeight<=scrollHeight-offsetBottom)&&"bottom";var initializing=null==this.affixed,colliderTop=initializing?scrollTop:position.top,colliderHeight=initializing?targetHeight:height;return null!=offsetTop&&scrollTop<=offsetTop?"top":null!=offsetBottom&&colliderTop+colliderHeight>=scrollHeight-offsetBottom&&"bottom"},Affix.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(Affix.RESET).addClass("affix");var scrollTop=this.$target.scrollTop(),position=this.$element.offset();return this.pinnedOffset=position.top-scrollTop},Affix.prototype.checkPositionWithEventLoop=function(){setTimeout($.proxy(this.checkPosition,this),1)},Affix.prototype.checkPosition=function(){if(this.$element.is(":visible")){var height=this.$element.height(),offset=this.options.offset,offsetTop=offset.top,offsetBottom=offset.bottom,scrollHeight=Math.max($(document).height(),$(document.body).height());"object"!=typeof offset&&(offsetBottom=offsetTop=offset),"function"==typeof offsetTop&&(offsetTop=offset.top(this.$element)),"function"==typeof offsetBottom&&(offsetBottom=offset.bottom(this.$element));var affix=this.getState(scrollHeight,height,offsetTop,offsetBottom);if(this.affixed!=affix){null!=this.unpin&&this.$element.css("top","");var affixType="affix"+(affix?"-"+affix:""),e=$.Event(affixType+".bs.affix");if(this.$element.trigger(e),e.isDefaultPrevented())return;this.affixed=affix,this.unpin="bottom"==affix?this.getPinnedOffset():null,this.$element.removeClass(Affix.RESET).addClass(affixType).trigger(affixType.replace("affix","affixed")+".bs.affix")}"bottom"==affix&&this.$element.offset({top:scrollHeight-height-offsetBottom})}};var old=$.fn.affix;$.fn.affix=Plugin,$.fn.affix.Constructor=Affix,$.fn.affix.noConflict=function(){return $.fn.affix=old,this},$(window).on("load",function(){$('[data-spy="affix"]').each(function(){var $spy=$(this),data=$spy.data();data.offset=data.offset||{},null!=data.offsetBottom&&(data.offset.bottom=data.offsetBottom),null!=data.offsetTop&&(data.offset.top=data.offsetTop),Plugin.call($spy,data)})})}(jQuery)}).call(exports,__webpack_require__(11))},function(module,exports,__webpack_require__){(function(jQuery){+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.alert");data||$this.data("bs.alert",data=new Alert(this)),"string"==typeof option&&data[option].call($this)})}var dismiss='[data-dismiss="alert"]',Alert=function(el){$(el).on("click",dismiss,this.close)};Alert.VERSION="3.3.7",Alert.TRANSITION_DURATION=150,Alert.prototype.close=function(e){function removeElement(){$parent.detach().trigger("closed.bs.alert").remove()}var $this=$(this),selector=$this.attr("data-target");selector||(selector=$this.attr("href"),selector=selector&&selector.replace(/.*(?=#[^\s]*$)/,""));var $parent=$("#"===selector?[]:selector);e&&e.preventDefault(),$parent.length||($parent=$this.closest(".alert")),$parent.trigger(e=$.Event("close.bs.alert")),e.isDefaultPrevented()||($parent.removeClass("in"),$.support.transition&&$parent.hasClass("fade")?$parent.one("bsTransitionEnd",removeElement).emulateTransitionEnd(Alert.TRANSITION_DURATION):removeElement())};var old=$.fn.alert;$.fn.alert=Plugin,$.fn.alert.Constructor=Alert,$.fn.alert.noConflict=function(){return $.fn.alert=old,this},$(document).on("click.bs.alert.data-api",dismiss,Alert.prototype.close)}(jQuery)}).call(exports,__webpack_require__(11))},function(module,exports,__webpack_require__){(function(jQuery){+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.button"),options="object"==typeof option&&option;data||$this.data("bs.button",data=new Button(this,options)),"toggle"==option?data.toggle():option&&data.setState(option)})}var Button=function(element,options){this.$element=$(element),this.options=$.extend({},Button.DEFAULTS,options),this.isLoading=!1};Button.VERSION="3.3.7",Button.DEFAULTS={loadingText:"loading..."},Button.prototype.setState=function(state){var d="disabled",$el=this.$element,val=$el.is("input")?"val":"html",data=$el.data();state+="Text",null==data.resetText&&$el.data("resetText",$el[val]()),setTimeout($.proxy(function(){$el[val](null==data[state]?this.options[state]:data[state]),"loadingText"==state?(this.isLoading=!0,$el.addClass(d).attr(d,d).prop(d,!0)):this.isLoading&&(this.isLoading=!1,$el.removeClass(d).removeAttr(d).prop(d,!1))},this),0)},Button.prototype.toggle=function(){var changed=!0,$parent=this.$element.closest('[data-toggle="buttons"]');if($parent.length){var $input=this.$element.find("input");"radio"==$input.prop("type")?($input.prop("checked")&&(changed=!1),$parent.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==$input.prop("type")&&($input.prop("checked")!==this.$element.hasClass("active")&&(changed=!1),this.$element.toggleClass("active")),$input.prop("checked",this.$element.hasClass("active")),changed&&$input.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var old=$.fn.button;$.fn.button=Plugin,$.fn.button.Constructor=Button,$.fn.button.noConflict=function(){return $.fn.button=old,this},$(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(e){var $btn=$(e.target).closest(".btn");Plugin.call($btn,"toggle"),$(e.target).is('input[type="radio"], input[type="checkbox"]')||(e.preventDefault(),$btn.is("input,button")?$btn.trigger("focus"):$btn.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(e){$(e.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(e.type))})}(jQuery)}).call(exports,__webpack_require__(11))},function(module,exports,__webpack_require__){(function(jQuery){+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.carousel"),options=$.extend({},Carousel.DEFAULTS,$this.data(),"object"==typeof option&&option),action="string"==typeof option?option:options.slide;data||$this.data("bs.carousel",data=new Carousel(this,options)),"number"==typeof option?data.to(option):action?data[action]():options.interval&&data.pause().cycle()})}var Carousel=function(element,options){this.$element=$(element),this.$indicators=this.$element.find(".carousel-indicators"),this.options=options,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",$.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",$.proxy(this.pause,this)).on("mouseleave.bs.carousel",$.proxy(this.cycle,this))};Carousel.VERSION="3.3.7",Carousel.TRANSITION_DURATION=600,Carousel.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},Carousel.prototype.keydown=function(e){if(!/input|textarea/i.test(e.target.tagName)){switch(e.which){case 37:this.prev();break;case 39:this.next();break;default:return}e.preventDefault()}},Carousel.prototype.cycle=function(e){return e||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval($.proxy(this.next,this),this.options.interval)),this},Carousel.prototype.getItemIndex=function(item){return this.$items=item.parent().children(".item"),this.$items.index(item||this.$active)},Carousel.prototype.getItemForDirection=function(direction,active){var activeIndex=this.getItemIndex(active),willWrap="prev"==direction&&0===activeIndex||"next"==direction&&activeIndex==this.$items.length-1;if(willWrap&&!this.options.wrap)return active;var delta="prev"==direction?-1:1,itemIndex=(activeIndex+delta)%this.$items.length;return this.$items.eq(itemIndex)},Carousel.prototype.to=function(pos){var that=this,activeIndex=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(pos>this.$items.length-1||pos<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){that.to(pos)}):activeIndex==pos?this.pause().cycle():this.slide(pos>activeIndex?"next":"prev",this.$items.eq(pos))},Carousel.prototype.pause=function(e){return e||(this.paused=!0),this.$element.find(".next, .prev").length&&$.support.transition&&(this.$element.trigger($.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},Carousel.prototype.next=function(){if(!this.sliding)return this.slide("next")},Carousel.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},Carousel.prototype.slide=function(type,next){var $active=this.$element.find(".item.active"),$next=next||this.getItemForDirection(type,$active),isCycling=this.interval,direction="next"==type?"left":"right",that=this;if($next.hasClass("active"))return this.sliding=!1;var relatedTarget=$next[0],slideEvent=$.Event("slide.bs.carousel",{relatedTarget:relatedTarget,direction:direction});if(this.$element.trigger(slideEvent),!slideEvent.isDefaultPrevented()){if(this.sliding=!0,isCycling&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var $nextIndicator=$(this.$indicators.children()[this.getItemIndex($next)]);$nextIndicator&&$nextIndicator.addClass("active")}var slidEvent=$.Event("slid.bs.carousel",{
relatedTarget:relatedTarget,direction:direction});return $.support.transition&&this.$element.hasClass("slide")?($next.addClass(type),$next[0].offsetWidth,$active.addClass(direction),$next.addClass(direction),$active.one("bsTransitionEnd",function(){$next.removeClass([type,direction].join(" ")).addClass("active"),$active.removeClass(["active",direction].join(" ")),that.sliding=!1,setTimeout(function(){that.$element.trigger(slidEvent)},0)}).emulateTransitionEnd(Carousel.TRANSITION_DURATION)):($active.removeClass("active"),$next.addClass("active"),this.sliding=!1,this.$element.trigger(slidEvent)),isCycling&&this.cycle(),this}};var old=$.fn.carousel;$.fn.carousel=Plugin,$.fn.carousel.Constructor=Carousel,$.fn.carousel.noConflict=function(){return $.fn.carousel=old,this};var clickHandler=function(e){var href,$this=$(this),$target=$($this.attr("data-target")||(href=$this.attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,""));if($target.hasClass("carousel")){var options=$.extend({},$target.data(),$this.data()),slideIndex=$this.attr("data-slide-to");slideIndex&&(options.interval=!1),Plugin.call($target,options),slideIndex&&$target.data("bs.carousel").to(slideIndex),e.preventDefault()}};$(document).on("click.bs.carousel.data-api","[data-slide]",clickHandler).on("click.bs.carousel.data-api","[data-slide-to]",clickHandler),$(window).on("load",function(){$('[data-ride="carousel"]').each(function(){var $carousel=$(this);Plugin.call($carousel,$carousel.data())})})}(jQuery)}).call(exports,__webpack_require__(11))},function(module,exports,__webpack_require__){(function(jQuery){+function($){"use strict";function getTargetFromTrigger($trigger){var href,target=$trigger.attr("data-target")||(href=$trigger.attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,"");return $(target)}function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.collapse"),options=$.extend({},Collapse.DEFAULTS,$this.data(),"object"==typeof option&&option);!data&&options.toggle&&/show|hide/.test(option)&&(options.toggle=!1),data||$this.data("bs.collapse",data=new Collapse(this,options)),"string"==typeof option&&data[option]()})}var Collapse=function(element,options){this.$element=$(element),this.options=$.extend({},Collapse.DEFAULTS,options),this.$trigger=$('[data-toggle="collapse"][href="#'+element.id+'"],[data-toggle="collapse"][data-target="#'+element.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};Collapse.VERSION="3.3.7",Collapse.TRANSITION_DURATION=350,Collapse.DEFAULTS={toggle:!0},Collapse.prototype.dimension=function(){var hasWidth=this.$element.hasClass("width");return hasWidth?"width":"height"},Collapse.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var activesData,actives=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(actives&&actives.length&&(activesData=actives.data("bs.collapse"),activesData&&activesData.transitioning))){var startEvent=$.Event("show.bs.collapse");if(this.$element.trigger(startEvent),!startEvent.isDefaultPrevented()){actives&&actives.length&&(Plugin.call(actives,"hide"),activesData||actives.data("bs.collapse",null));var dimension=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[dimension](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var complete=function(){this.$element.removeClass("collapsing").addClass("collapse in")[dimension](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!$.support.transition)return complete.call(this);var scrollSize=$.camelCase(["scroll",dimension].join("-"));this.$element.one("bsTransitionEnd",$.proxy(complete,this)).emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])}}}},Collapse.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var startEvent=$.Event("hide.bs.collapse");if(this.$element.trigger(startEvent),!startEvent.isDefaultPrevented()){var dimension=this.dimension();this.$element[dimension](this.$element[dimension]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var complete=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return $.support.transition?void this.$element[dimension](0).one("bsTransitionEnd",$.proxy(complete,this)).emulateTransitionEnd(Collapse.TRANSITION_DURATION):complete.call(this)}}},Collapse.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},Collapse.prototype.getParent=function(){return $(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each($.proxy(function(i,element){var $element=$(element);this.addAriaAndCollapsedClass(getTargetFromTrigger($element),$element)},this)).end()},Collapse.prototype.addAriaAndCollapsedClass=function($element,$trigger){var isOpen=$element.hasClass("in");$element.attr("aria-expanded",isOpen),$trigger.toggleClass("collapsed",!isOpen).attr("aria-expanded",isOpen)};var old=$.fn.collapse;$.fn.collapse=Plugin,$.fn.collapse.Constructor=Collapse,$.fn.collapse.noConflict=function(){return $.fn.collapse=old,this},$(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(e){var $this=$(this);$this.attr("data-target")||e.preventDefault();var $target=getTargetFromTrigger($this),data=$target.data("bs.collapse"),option=data?"toggle":$this.data();Plugin.call($target,option)})}(jQuery)}).call(exports,__webpack_require__(11))},function(module,exports,__webpack_require__){(function(jQuery){+function($){"use strict";function getParent($this){var selector=$this.attr("data-target");selector||(selector=$this.attr("href"),selector=selector&&/#[A-Za-z]/.test(selector)&&selector.replace(/.*(?=#[^\s]*$)/,""));var $parent=selector&&$(selector);return $parent&&$parent.length?$parent:$this.parent()}function clearMenus(e){e&&3===e.which||($(backdrop).remove(),$(toggle).each(function(){var $this=$(this),$parent=getParent($this),relatedTarget={relatedTarget:this};$parent.hasClass("open")&&(e&&"click"==e.type&&/input|textarea/i.test(e.target.tagName)&&$.contains($parent[0],e.target)||($parent.trigger(e=$.Event("hide.bs.dropdown",relatedTarget)),e.isDefaultPrevented()||($this.attr("aria-expanded","false"),$parent.removeClass("open").trigger($.Event("hidden.bs.dropdown",relatedTarget)))))}))}function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.dropdown");data||$this.data("bs.dropdown",data=new Dropdown(this)),"string"==typeof option&&data[option].call($this)})}var backdrop=".dropdown-backdrop",toggle='[data-toggle="dropdown"]',Dropdown=function(element){$(element).on("click.bs.dropdown",this.toggle)};Dropdown.VERSION="3.3.7",Dropdown.prototype.toggle=function(e){var $this=$(this);if(!$this.is(".disabled, :disabled")){var $parent=getParent($this),isActive=$parent.hasClass("open");if(clearMenus(),!isActive){"ontouchstart"in document.documentElement&&!$parent.closest(".navbar-nav").length&&$(document.createElement("div")).addClass("dropdown-backdrop").insertAfter($(this)).on("click",clearMenus);var relatedTarget={relatedTarget:this};if($parent.trigger(e=$.Event("show.bs.dropdown",relatedTarget)),e.isDefaultPrevented())return;$this.trigger("focus").attr("aria-expanded","true"),$parent.toggleClass("open").trigger($.Event("shown.bs.dropdown",relatedTarget))}return!1}},Dropdown.prototype.keydown=function(e){if(/(38|40|27|32)/.test(e.which)&&!/input|textarea/i.test(e.target.tagName)){var $this=$(this);if(e.preventDefault(),e.stopPropagation(),!$this.is(".disabled, :disabled")){var $parent=getParent($this),isActive=$parent.hasClass("open");if(!isActive&&27!=e.which||isActive&&27==e.which)return 27==e.which&&$parent.find(toggle).trigger("focus"),$this.trigger("click");var desc=" li:not(.disabled):visible a",$items=$parent.find(".dropdown-menu"+desc);if($items.length){var index=$items.index(e.target);38==e.which&&index>0&&index--,40==e.which&&index<$items.length-1&&index++,~index||(index=0),$items.eq(index).trigger("focus")}}}};var old=$.fn.dropdown;$.fn.dropdown=Plugin,$.fn.dropdown.Constructor=Dropdown,$.fn.dropdown.noConflict=function(){return $.fn.dropdown=old,this},$(document).on("click.bs.dropdown.data-api",clearMenus).on("click.bs.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("click.bs.dropdown.data-api",toggle,Dropdown.prototype.toggle).on("keydown.bs.dropdown.data-api",toggle,Dropdown.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",Dropdown.prototype.keydown)}(jQuery)}).call(exports,__webpack_require__(11))},function(module,exports,__webpack_require__){(function(jQuery){+function($){"use strict";function Plugin(option,_relatedTarget){return this.each(function(){var $this=$(this),data=$this.data("bs.modal"),options=$.extend({},Modal.DEFAULTS,$this.data(),"object"==typeof option&&option);data||$this.data("bs.modal",data=new Modal(this,options)),"string"==typeof option?data[option](_relatedTarget):options.show&&data.show(_relatedTarget)})}var Modal=function(element,options){this.options=options,this.$body=$(document.body),this.$element=$(element),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,$.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};Modal.VERSION="3.3.7",Modal.TRANSITION_DURATION=300,Modal.BACKDROP_TRANSITION_DURATION=150,Modal.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},Modal.prototype.toggle=function(_relatedTarget){return this.isShown?this.hide():this.show(_relatedTarget)},Modal.prototype.show=function(_relatedTarget){var that=this,e=$.Event("show.bs.modal",{relatedTarget:_relatedTarget});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',$.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){that.$element.one("mouseup.dismiss.bs.modal",function(e){$(e.target).is(that.$element)&&(that.ignoreBackdropClick=!0)})}),this.backdrop(function(){var transition=$.support.transition&&that.$element.hasClass("fade");that.$element.parent().length||that.$element.appendTo(that.$body),that.$element.show().scrollTop(0),that.adjustDialog(),transition&&that.$element[0].offsetWidth,that.$element.addClass("in"),that.enforceFocus();var e=$.Event("shown.bs.modal",{relatedTarget:_relatedTarget});transition?that.$dialog.one("bsTransitionEnd",function(){that.$element.trigger("focus").trigger(e)}).emulateTransitionEnd(Modal.TRANSITION_DURATION):that.$element.trigger("focus").trigger(e)}))},Modal.prototype.hide=function(e){e&&e.preventDefault(),e=$.Event("hide.bs.modal"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),$(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),$.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",$.proxy(this.hideModal,this)).emulateTransitionEnd(Modal.TRANSITION_DURATION):this.hideModal())},Modal.prototype.enforceFocus=function(){$(document).off("focusin.bs.modal").on("focusin.bs.modal",$.proxy(function(e){document===e.target||this.$element[0]===e.target||this.$element.has(e.target).length||this.$element.trigger("focus")},this))},Modal.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",$.proxy(function(e){27==e.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},Modal.prototype.resize=function(){this.isShown?$(window).on("resize.bs.modal",$.proxy(this.handleUpdate,this)):$(window).off("resize.bs.modal")},Modal.prototype.hideModal=function(){var that=this;this.$element.hide(),this.backdrop(function(){that.$body.removeClass("modal-open"),that.resetAdjustments(),that.resetScrollbar(),that.$element.trigger("hidden.bs.modal")})},Modal.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},Modal.prototype.backdrop=function(callback){var that=this,animate=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var doAnimate=$.support.transition&&animate;if(this.$backdrop=$(document.createElement("div")).addClass("modal-backdrop "+animate).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",$.proxy(function(e){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(e.target===e.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),doAnimate&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!callback)return;doAnimate?this.$backdrop.one("bsTransitionEnd",callback).emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION):callback()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var callbackRemove=function(){that.removeBackdrop(),callback&&callback()};$.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",callbackRemove).emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION):callbackRemove()}else callback&&callback()},Modal.prototype.handleUpdate=function(){this.adjustDialog()},Modal.prototype.adjustDialog=function(){var modalIsOverflowing=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&modalIsOverflowing?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!modalIsOverflowing?this.scrollbarWidth:""})},Modal.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},Modal.prototype.checkScrollbar=function(){var fullWindowWidth=window.innerWidth;if(!fullWindowWidth){var documentElementRect=document.documentElement.getBoundingClientRect();fullWindowWidth=documentElementRect.right-Math.abs(documentElementRect.left)}this.bodyIsOverflowing=document.body.clientWidth<fullWindowWidth,this.scrollbarWidth=this.measureScrollbar()},Modal.prototype.setScrollbar=function(){var bodyPad=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",bodyPad+this.scrollbarWidth)},Modal.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},Modal.prototype.measureScrollbar=function(){var scrollDiv=document.createElement("div");scrollDiv.className="modal-scrollbar-measure",this.$body.append(scrollDiv);var scrollbarWidth=scrollDiv.offsetWidth-scrollDiv.clientWidth;return this.$body[0].removeChild(scrollDiv),scrollbarWidth};var old=$.fn.modal;$.fn.modal=Plugin,$.fn.modal.Constructor=Modal,$.fn.modal.noConflict=function(){return $.fn.modal=old,this},$(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(e){var $this=$(this),href=$this.attr("href"),$target=$($this.attr("data-target")||href&&href.replace(/.*(?=#[^\s]+$)/,"")),option=$target.data("bs.modal")?"toggle":$.extend({remote:!/#/.test(href)&&href},$target.data(),$this.data());$this.is("a")&&e.preventDefault(),$target.one("show.bs.modal",function(showEvent){showEvent.isDefaultPrevented()||$target.one("hidden.bs.modal",function(){$this.is(":visible")&&$this.trigger("focus")})}),Plugin.call($target,option,this)})}(jQuery)}).call(exports,__webpack_require__(11))},function(module,exports,__webpack_require__){(function(jQuery){+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.popover"),options="object"==typeof option&&option;!data&&/destroy|hide/.test(option)||(data||$this.data("bs.popover",data=new Popover(this,options)),"string"==typeof option&&data[option]())})}var Popover=function(element,options){this.init("popover",element,options)};if(!$.fn.tooltip)throw new Error("Popover requires tooltip.js");Popover.VERSION="3.3.7",Popover.DEFAULTS=$.extend({},$.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),Popover.prototype=$.extend({},$.fn.tooltip.Constructor.prototype),Popover.prototype.constructor=Popover,Popover.prototype.getDefaults=function(){return Popover.DEFAULTS},Popover.prototype.setContent=function(){var $tip=this.tip(),title=this.getTitle(),content=this.getContent();$tip.find(".popover-title")[this.options.html?"html":"text"](title),$tip.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof content?"html":"append":"text"](content),$tip.removeClass("fade top bottom left right in"),$tip.find(".popover-title").html()||$tip.find(".popover-title").hide()},Popover.prototype.hasContent=function(){return this.getTitle()||this.getContent()},Popover.prototype.getContent=function(){var $e=this.$element,o=this.options;return $e.attr("data-content")||("function"==typeof o.content?o.content.call($e[0]):o.content)},Popover.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var old=$.fn.popover;$.fn.popover=Plugin,$.fn.popover.Constructor=Popover,$.fn.popover.noConflict=function(){return $.fn.popover=old,this}}(jQuery)}).call(exports,__webpack_require__(11))},function(module,exports,__webpack_require__){(function(jQuery){+function($){"use strict";function ScrollSpy(element,options){this.$body=$(document.body),this.$scrollElement=$($(element).is(document.body)?window:element),this.options=$.extend({},ScrollSpy.DEFAULTS,options),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",$.proxy(this.process,this)),this.refresh(),this.process()}function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.scrollspy"),options="object"==typeof option&&option;data||$this.data("bs.scrollspy",data=new ScrollSpy(this,options)),"string"==typeof option&&data[option]()})}ScrollSpy.VERSION="3.3.7",ScrollSpy.DEFAULTS={offset:10},ScrollSpy.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},ScrollSpy.prototype.refresh=function(){var that=this,offsetMethod="offset",offsetBase=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),$.isWindow(this.$scrollElement[0])||(offsetMethod="position",offsetBase=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var $el=$(this),href=$el.data("target")||$el.attr("href"),$href=/^#./.test(href)&&$(href);return $href&&$href.length&&$href.is(":visible")&&[[$href[offsetMethod]().top+offsetBase,href]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){that.offsets.push(this[0]),that.targets.push(this[1])})},ScrollSpy.prototype.process=function(){var i,scrollTop=this.$scrollElement.scrollTop()+this.options.offset,scrollHeight=this.getScrollHeight(),maxScroll=this.options.offset+scrollHeight-this.$scrollElement.height(),offsets=this.offsets,targets=this.targets,activeTarget=this.activeTarget;if(this.scrollHeight!=scrollHeight&&this.refresh(),scrollTop>=maxScroll)return activeTarget!=(i=targets[targets.length-1])&&this.activate(i);if(activeTarget&&scrollTop<offsets[0])return this.activeTarget=null,this.clear();for(i=offsets.length;i--;)activeTarget!=targets[i]&&scrollTop>=offsets[i]&&(void 0===offsets[i+1]||scrollTop<offsets[i+1])&&this.activate(targets[i])},ScrollSpy.prototype.activate=function(target){this.activeTarget=target,this.clear();var selector=this.selector+'[data-target="'+target+'"],'+this.selector+'[href="'+target+'"]',active=$(selector).parents("li").addClass("active");active.parent(".dropdown-menu").length&&(active=active.closest("li.dropdown").addClass("active")),active.trigger("activate.bs.scrollspy")},ScrollSpy.prototype.clear=function(){$(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var old=$.fn.scrollspy;$.fn.scrollspy=Plugin,$.fn.scrollspy.Constructor=ScrollSpy,$.fn.scrollspy.noConflict=function(){return $.fn.scrollspy=old,this},$(window).on("load.bs.scrollspy.data-api",function(){$('[data-spy="scroll"]').each(function(){var $spy=$(this);Plugin.call($spy,$spy.data())})})}(jQuery)}).call(exports,__webpack_require__(11))},function(module,exports,__webpack_require__){(function(jQuery){+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.tab");data||$this.data("bs.tab",data=new Tab(this)),"string"==typeof option&&data[option]()})}var Tab=function(element){this.element=$(element)};Tab.VERSION="3.3.7",Tab.TRANSITION_DURATION=150,Tab.prototype.show=function(){var $this=this.element,$ul=$this.closest("ul:not(.dropdown-menu)"),selector=$this.data("target");if(selector||(selector=$this.attr("href"),selector=selector&&selector.replace(/.*(?=#[^\s]*$)/,"")),!$this.parent("li").hasClass("active")){var $previous=$ul.find(".active:last a"),hideEvent=$.Event("hide.bs.tab",{relatedTarget:$this[0]}),showEvent=$.Event("show.bs.tab",{relatedTarget:$previous[0]});if($previous.trigger(hideEvent),$this.trigger(showEvent),!showEvent.isDefaultPrevented()&&!hideEvent.isDefaultPrevented()){var $target=$(selector);this.activate($this.closest("li"),$ul),this.activate($target,$target.parent(),function(){$previous.trigger({type:"hidden.bs.tab",relatedTarget:$this[0]}),$this.trigger({type:"shown.bs.tab",relatedTarget:$previous[0]})})}}},Tab.prototype.activate=function(element,container,callback){function next(){$active.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),element.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),transition?(element[0].offsetWidth,element.addClass("in")):element.removeClass("fade"),element.parent(".dropdown-menu").length&&element.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),callback&&callback()}var $active=container.find("> .active"),transition=callback&&$.support.transition&&($active.length&&$active.hasClass("fade")||!!container.find("> .fade").length);$active.length&&transition?$active.one("bsTransitionEnd",next).emulateTransitionEnd(Tab.TRANSITION_DURATION):next(),$active.removeClass("in")};var old=$.fn.tab;$.fn.tab=Plugin,$.fn.tab.Constructor=Tab,$.fn.tab.noConflict=function(){return $.fn.tab=old,this};var clickHandler=function(e){e.preventDefault(),Plugin.call($(this),"show")};$(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',clickHandler).on("click.bs.tab.data-api",'[data-toggle="pill"]',clickHandler)}(jQuery)}).call(exports,__webpack_require__(11))},function(module,exports,__webpack_require__){(function(jQuery){+function($){"use strict";function Plugin(option){return this.each(function(){var $this=$(this),data=$this.data("bs.tooltip"),options="object"==typeof option&&option;!data&&/destroy|hide/.test(option)||(data||$this.data("bs.tooltip",data=new Tooltip(this,options)),"string"==typeof option&&data[option]())})}var Tooltip=function(element,options){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",element,options)};Tooltip.VERSION="3.3.7",Tooltip.TRANSITION_DURATION=150,Tooltip.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},Tooltip.prototype.init=function(type,element,options){if(this.enabled=!0,this.type=type,this.$element=$(element),this.options=this.getOptions(options),this.$viewport=this.options.viewport&&$($.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var triggers=this.options.trigger.split(" "),i=triggers.length;i--;){var trigger=triggers[i];if("click"==trigger)this.$element.on("click."+this.type,this.options.selector,$.proxy(this.toggle,this));else if("manual"!=trigger){var eventIn="hover"==trigger?"mouseenter":"focusin",eventOut="hover"==trigger?"mouseleave":"focusout";this.$element.on(eventIn+"."+this.type,this.options.selector,$.proxy(this.enter,this)),this.$element.on(eventOut+"."+this.type,this.options.selector,$.proxy(this.leave,this))}}this.options.selector?this._options=$.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},Tooltip.prototype.getDefaults=function(){return Tooltip.DEFAULTS},Tooltip.prototype.getOptions=function(options){return options=$.extend({},this.getDefaults(),this.$element.data(),options),options.delay&&"number"==typeof options.delay&&(options.delay={show:options.delay,hide:options.delay}),options},Tooltip.prototype.getDelegateOptions=function(){var options={},defaults=this.getDefaults();return this._options&&$.each(this._options,function(key,value){defaults[key]!=value&&(options[key]=value)}),options},Tooltip.prototype.enter=function(obj){var self=obj instanceof this.constructor?obj:$(obj.currentTarget).data("bs."+this.type);return self||(self=new this.constructor(obj.currentTarget,this.getDelegateOptions()),$(obj.currentTarget).data("bs."+this.type,self)),obj instanceof $.Event&&(self.inState["focusin"==obj.type?"focus":"hover"]=!0),self.tip().hasClass("in")||"in"==self.hoverState?void(self.hoverState="in"):(clearTimeout(self.timeout),self.hoverState="in",self.options.delay&&self.options.delay.show?void(self.timeout=setTimeout(function(){"in"==self.hoverState&&self.show()},self.options.delay.show)):self.show())},Tooltip.prototype.isInStateTrue=function(){for(var key in this.inState)if(this.inState[key])return!0;return!1},Tooltip.prototype.leave=function(obj){var self=obj instanceof this.constructor?obj:$(obj.currentTarget).data("bs."+this.type);if(self||(self=new this.constructor(obj.currentTarget,this.getDelegateOptions()),$(obj.currentTarget).data("bs."+this.type,self)),obj instanceof $.Event&&(self.inState["focusout"==obj.type?"focus":"hover"]=!1),!self.isInStateTrue())return clearTimeout(self.timeout),self.hoverState="out",self.options.delay&&self.options.delay.hide?void(self.timeout=setTimeout(function(){"out"==self.hoverState&&self.hide()},self.options.delay.hide)):self.hide()},Tooltip.prototype.show=function(){var e=$.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(e);var inDom=$.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(e.isDefaultPrevented()||!inDom)return;var that=this,$tip=this.tip(),tipId=this.getUID(this.type);this.setContent(),$tip.attr("id",tipId),this.$element.attr("aria-describedby",tipId),this.options.animation&&$tip.addClass("fade");var placement="function"==typeof this.options.placement?this.options.placement.call(this,$tip[0],this.$element[0]):this.options.placement,autoToken=/\s?auto?\s?/i,autoPlace=autoToken.test(placement);autoPlace&&(placement=placement.replace(autoToken,"")||"top"),$tip.detach().css({top:0,left:0,display:"block"}).addClass(placement).data("bs."+this.type,this),this.options.container?$tip.appendTo(this.options.container):$tip.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var pos=this.getPosition(),actualWidth=$tip[0].offsetWidth,actualHeight=$tip[0].offsetHeight;if(autoPlace){var orgPlacement=placement,viewportDim=this.getPosition(this.$viewport);placement="bottom"==placement&&pos.bottom+actualHeight>viewportDim.bottom?"top":"top"==placement&&pos.top-actualHeight<viewportDim.top?"bottom":"right"==placement&&pos.right+actualWidth>viewportDim.width?"left":"left"==placement&&pos.left-actualWidth<viewportDim.left?"right":placement,$tip.removeClass(orgPlacement).addClass(placement)}var calculatedOffset=this.getCalculatedOffset(placement,pos,actualWidth,actualHeight);this.applyPlacement(calculatedOffset,placement);var complete=function(){var prevHoverState=that.hoverState;that.$element.trigger("shown.bs."+that.type),that.hoverState=null,"out"==prevHoverState&&that.leave(that)};$.support.transition&&this.$tip.hasClass("fade")?$tip.one("bsTransitionEnd",complete).emulateTransitionEnd(Tooltip.TRANSITION_DURATION):complete()}},Tooltip.prototype.applyPlacement=function(offset,placement){var $tip=this.tip(),width=$tip[0].offsetWidth,height=$tip[0].offsetHeight,marginTop=parseInt($tip.css("margin-top"),10),marginLeft=parseInt($tip.css("margin-left"),10);isNaN(marginTop)&&(marginTop=0),isNaN(marginLeft)&&(marginLeft=0),offset.top+=marginTop,offset.left+=marginLeft,$.offset.setOffset($tip[0],$.extend({using:function(props){$tip.css({top:Math.round(props.top),left:Math.round(props.left)})}},offset),0),$tip.addClass("in");var actualWidth=$tip[0].offsetWidth,actualHeight=$tip[0].offsetHeight;"top"==placement&&actualHeight!=height&&(offset.top=offset.top+height-actualHeight);var delta=this.getViewportAdjustedDelta(placement,offset,actualWidth,actualHeight);delta.left?offset.left+=delta.left:offset.top+=delta.top;var isVertical=/top|bottom/.test(placement),arrowDelta=isVertical?2*delta.left-width+actualWidth:2*delta.top-height+actualHeight,arrowOffsetPosition=isVertical?"offsetWidth":"offsetHeight";$tip.offset(offset),this.replaceArrow(arrowDelta,$tip[0][arrowOffsetPosition],isVertical)},Tooltip.prototype.replaceArrow=function(delta,dimension,isVertical){this.arrow().css(isVertical?"left":"top",50*(1-delta/dimension)+"%").css(isVertical?"top":"left","")},Tooltip.prototype.setContent=function(){var $tip=this.tip(),title=this.getTitle();$tip.find(".tooltip-inner")[this.options.html?"html":"text"](title),$tip.removeClass("fade in top bottom left right")},Tooltip.prototype.hide=function(callback){function complete(){"in"!=that.hoverState&&$tip.detach(),that.$element&&that.$element.removeAttr("aria-describedby").trigger("hidden.bs."+that.type),callback&&callback()}var that=this,$tip=$(this.$tip),e=$.Event("hide.bs."+this.type);if(this.$element.trigger(e),!e.isDefaultPrevented())return $tip.removeClass("in"),$.support.transition&&$tip.hasClass("fade")?$tip.one("bsTransitionEnd",complete).emulateTransitionEnd(Tooltip.TRANSITION_DURATION):complete(),this.hoverState=null,this},Tooltip.prototype.fixTitle=function(){var $e=this.$element;($e.attr("title")||"string"!=typeof $e.attr("data-original-title"))&&$e.attr("data-original-title",$e.attr("title")||"").attr("title","")},Tooltip.prototype.hasContent=function(){return this.getTitle()},Tooltip.prototype.getPosition=function($element){$element=$element||this.$element;var el=$element[0],isBody="BODY"==el.tagName,elRect=el.getBoundingClientRect();null==elRect.width&&(elRect=$.extend({},elRect,{width:elRect.right-elRect.left,height:elRect.bottom-elRect.top}));var isSvg=window.SVGElement&&el instanceof window.SVGElement,elOffset=isBody?{top:0,left:0}:isSvg?null:$element.offset(),scroll={scroll:isBody?document.documentElement.scrollTop||document.body.scrollTop:$element.scrollTop()},outerDims=isBody?{width:$(window).width(),height:$(window).height()}:null;return $.extend({},elRect,scroll,outerDims,elOffset);
},Tooltip.prototype.getCalculatedOffset=function(placement,pos,actualWidth,actualHeight){return"bottom"==placement?{top:pos.top+pos.height,left:pos.left+pos.width/2-actualWidth/2}:"top"==placement?{top:pos.top-actualHeight,left:pos.left+pos.width/2-actualWidth/2}:"left"==placement?{top:pos.top+pos.height/2-actualHeight/2,left:pos.left-actualWidth}:{top:pos.top+pos.height/2-actualHeight/2,left:pos.left+pos.width}},Tooltip.prototype.getViewportAdjustedDelta=function(placement,pos,actualWidth,actualHeight){var delta={top:0,left:0};if(!this.$viewport)return delta;var viewportPadding=this.options.viewport&&this.options.viewport.padding||0,viewportDimensions=this.getPosition(this.$viewport);if(/right|left/.test(placement)){var topEdgeOffset=pos.top-viewportPadding-viewportDimensions.scroll,bottomEdgeOffset=pos.top+viewportPadding-viewportDimensions.scroll+actualHeight;topEdgeOffset<viewportDimensions.top?delta.top=viewportDimensions.top-topEdgeOffset:bottomEdgeOffset>viewportDimensions.top+viewportDimensions.height&&(delta.top=viewportDimensions.top+viewportDimensions.height-bottomEdgeOffset)}else{var leftEdgeOffset=pos.left-viewportPadding,rightEdgeOffset=pos.left+viewportPadding+actualWidth;leftEdgeOffset<viewportDimensions.left?delta.left=viewportDimensions.left-leftEdgeOffset:rightEdgeOffset>viewportDimensions.right&&(delta.left=viewportDimensions.left+viewportDimensions.width-rightEdgeOffset)}return delta},Tooltip.prototype.getTitle=function(){var title,$e=this.$element,o=this.options;return title=$e.attr("data-original-title")||("function"==typeof o.title?o.title.call($e[0]):o.title)},Tooltip.prototype.getUID=function(prefix){do prefix+=~~(1e6*Math.random());while(document.getElementById(prefix));return prefix},Tooltip.prototype.tip=function(){if(!this.$tip&&(this.$tip=$(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},Tooltip.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},Tooltip.prototype.enable=function(){this.enabled=!0},Tooltip.prototype.disable=function(){this.enabled=!1},Tooltip.prototype.toggleEnabled=function(){this.enabled=!this.enabled},Tooltip.prototype.toggle=function(e){var self=this;e&&(self=$(e.currentTarget).data("bs."+this.type),self||(self=new this.constructor(e.currentTarget,this.getDelegateOptions()),$(e.currentTarget).data("bs."+this.type,self))),e?(self.inState.click=!self.inState.click,self.isInStateTrue()?self.enter(self):self.leave(self)):self.tip().hasClass("in")?self.leave(self):self.enter(self)},Tooltip.prototype.destroy=function(){var that=this;clearTimeout(this.timeout),this.hide(function(){that.$element.off("."+that.type).removeData("bs."+that.type),that.$tip&&that.$tip.detach(),that.$tip=null,that.$arrow=null,that.$viewport=null,that.$element=null})};var old=$.fn.tooltip;$.fn.tooltip=Plugin,$.fn.tooltip.Constructor=Tooltip,$.fn.tooltip.noConflict=function(){return $.fn.tooltip=old,this}}(jQuery)}).call(exports,__webpack_require__(11))},function(module,exports,__webpack_require__){(function(jQuery){+function($){"use strict";function transitionEnd(){var el=document.createElement("bootstrap"),transEndEventNames={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var name in transEndEventNames)if(void 0!==el.style[name])return{end:transEndEventNames[name]};return!1}$.fn.emulateTransitionEnd=function(duration){var called=!1,$el=this;$(this).one("bsTransitionEnd",function(){called=!0});var callback=function(){called||$($el).trigger($.support.transition.end)};return setTimeout(callback,duration),this},$(function(){$.support.transition=transitionEnd(),$.support.transition&&($.event.special.bsTransitionEnd={bindType:$.support.transition.end,delegateType:$.support.transition.end,handle:function(e){if($(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}})})}(jQuery)}).call(exports,__webpack_require__(11))},function(module,exports,__webpack_require__){function createProxyServer(options){return new ProxyServer(options)}var ProxyServer=__webpack_require__(145).Server;ProxyServer.createProxyServer=createProxyServer,ProxyServer.createServer=createProxyServer,ProxyServer.createProxy=createProxyServer,module.exports=ProxyServer},function(module,exports,__webpack_require__){(function(Buffer){function createRightProxy(type){return function(options){return function(req,res){var head,cbl,passes="ws"===type?this.wsPasses:this.webPasses,args=[].slice.call(arguments),cntr=args.length-1;if("function"==typeof args[cntr]&&(cbl=args[cntr],cntr--),args[cntr]instanceof Buffer||args[cntr]===res||(options=extend({},options),extend(options,args[cntr]),cntr--),args[cntr]instanceof Buffer&&(head=args[cntr]),["target","forward"].forEach(function(e){"string"==typeof options[e]&&(options[e]=parse_url(options[e]))}),!options.target&&!options.forward)return this.emit("error",new Error("Must provide a proper URL as target"));for(var i=0;i<passes.length&&!passes[i](req,res,options,head,this,cbl);i++);}}}function ProxyServer(options){EE3.call(this),options=options||{},options.prependPath=options.prependPath!==!1,this.web=this.proxyRequest=createRightProxy("web")(options),this.ws=this.proxyWebsocketRequest=createRightProxy("ws")(options),this.options=options,this.webPasses=Object.keys(web).map(function(pass){return web[pass]}),this.wsPasses=Object.keys(ws).map(function(pass){return ws[pass]}),this.on("error",this.onError,this)}var httpProxy=module.exports,extend=__webpack_require__(69)._extend,parse_url=__webpack_require__(44).parse,EE3=__webpack_require__(149),http=__webpack_require__(43),https=__webpack_require__(62),web=__webpack_require__(146),ws=__webpack_require__(148);httpProxy.Server=ProxyServer,httpProxy.createRightProxy=createRightProxy,__webpack_require__(69).inherits(ProxyServer,EE3),ProxyServer.prototype.onError=function(err){if(1===this.listeners("error").length)throw err},ProxyServer.prototype.listen=function(port,hostname){var self=this,closure=function(req,res){self.web(req,res)};return this._server=this.options.ssl?https.createServer(this.options.ssl,closure):http.createServer(closure),this.options.ws&&this._server.on("upgrade",function(req,socket,head){self.ws(req,socket,head)}),this._server.listen(port,hostname),this},ProxyServer.prototype.close=function(callback){function done(){self._server=null,callback&&callback.apply(null,arguments)}var self=this;this._server&&this._server.close(done)},ProxyServer.prototype.before=function(type,passName,callback){if("ws"!==type&&"web"!==type)throw new Error("type must be `web` or `ws`");var passes="ws"===type?this.wsPasses:this.webPasses,i=!1;if(passes.forEach(function(v,idx){v.name===passName&&(i=idx)}),i===!1)throw new Error("No such pass");passes.splice(i,0,callback)},ProxyServer.prototype.after=function(type,passName,callback){if("ws"!==type&&"web"!==type)throw new Error("type must be `web` or `ws`");var passes="ws"===type?this.wsPasses:this.webPasses,i=!1;if(passes.forEach(function(v,idx){v.name===passName&&(i=idx)}),i===!1)throw new Error("No such pass");passes.splice(i++,0,callback)}}).call(exports,__webpack_require__(12).Buffer)},function(module,exports,__webpack_require__){var http=__webpack_require__(43),https=__webpack_require__(62),web_o=__webpack_require__(147),common=__webpack_require__(49);web_o=Object.keys(web_o).map(function(pass){return web_o[pass]}),/*!
 * Array of passes.
 *
 * A `pass` is just a function that is executed on `req, res, options`
 * so that you can easily add new checks while still keeping the base
 * flexible.
 */
module.exports={deleteLength:function(req,res,options){"DELETE"!==req.method&&"OPTIONS"!==req.method||req.headers["content-length"]||(req.headers["content-length"]="0",delete req.headers["transfer-encoding"])},timeout:function(req,res,options){options.timeout&&req.socket.setTimeout(options.timeout)},XHeaders:function(req,res,options){if(options.xfwd){var encrypted=req.isSpdy||common.hasEncryptedConnection(req),values={"for":req.connection.remoteAddress||req.socket.remoteAddress,port:common.getPort(req),proto:encrypted?"https":"http"};["for","port","proto"].forEach(function(header){req.headers["x-forwarded-"+header]=(req.headers["x-forwarded-"+header]||"")+(req.headers["x-forwarded-"+header]?",":"")+values[header]}),req.headers["x-forwarded-host"]=req.headers.host||""}},stream:function(req,res,options,_,server,clb){function createErrorHandler(proxyReq,url){return function(err){return req.socket.destroyed&&"ECONNRESET"===err.code?(server.emit("econnreset",err,req,res,url),proxyReq.abort()):void(clb?clb(err,req,res,url):server.emit("error",err,req,res,url))}}if(server.emit("start",req,res,options.target||options.forward),options.forward){var forwardReq=("https:"===options.forward.protocol?https:http).request(common.setupOutgoing(options.ssl||{},options,req,"forward")),forwardError=createErrorHandler(forwardReq,options.forward);if(req.on("error",forwardError),forwardReq.on("error",forwardError),(options.buffer||req).pipe(forwardReq),!options.target)return res.end()}var proxyReq=("https:"===options.target.protocol?https:http).request(common.setupOutgoing(options.ssl||{},options,req));proxyReq.on("socket",function(socket){server&&server.emit("proxyReq",proxyReq,req,res,options)}),options.proxyTimeout&&proxyReq.setTimeout(options.proxyTimeout,function(){proxyReq.abort()}),req.on("aborted",function(){proxyReq.abort()});var proxyError=createErrorHandler(proxyReq,options.target);req.on("error",proxyError),proxyReq.on("error",proxyError),(options.buffer||req).pipe(proxyReq),proxyReq.on("response",function(proxyRes){server&&server.emit("proxyRes",proxyRes,req,res);for(var i=0;i<web_o.length&&!web_o[i](req,res,proxyRes,options);i++);proxyRes.on("end",function(){server.emit("end",req,res,proxyRes)}),proxyRes.pipe(res)})}}},function(module,exports,__webpack_require__){var url=__webpack_require__(44),common=__webpack_require__(49),redirectRegex=/^201|30(1|2|7|8)$/;/*!
 * Array of passes.
 *
 * A `pass` is just a function that is executed on `req, res, options`
 * so that you can easily add new checks while still keeping the base
 * flexible.
 */
module.exports={removeChunked:function(req,res,proxyRes){"1.0"===req.httpVersion&&delete proxyRes.headers["transfer-encoding"]},setConnection:function(req,res,proxyRes){"1.0"===req.httpVersion?proxyRes.headers.connection=req.headers.connection||"close":"2.0"===req.httpVersion||proxyRes.headers.connection||(proxyRes.headers.connection=req.headers.connection||"keep-alive")},setRedirectHostRewrite:function(req,res,proxyRes,options){if((options.hostRewrite||options.autoRewrite||options.protocolRewrite)&&proxyRes.headers.location&&redirectRegex.test(proxyRes.statusCode)){var target=url.parse(options.target),u=url.parse(proxyRes.headers.location);if(target.host!=u.host)return;options.hostRewrite?u.host=options.hostRewrite:options.autoRewrite&&(u.host=req.headers.host),options.protocolRewrite&&(u.protocol=options.protocolRewrite),proxyRes.headers.location=u.format()}},writeHeaders:function(req,res,proxyRes,options){var rawHeaderKeyMap,rewriteCookieDomainConfig=options.cookieDomainRewrite,preserveHeaderKeyCase=options.preserveHeaderKeyCase,setHeader=function(key,header){void 0!=header&&(rewriteCookieDomainConfig&&"set-cookie"===key.toLowerCase()&&(header=common.rewriteCookieDomain(header,rewriteCookieDomainConfig)),res.setHeader(String(key).trim(),header))};if("string"==typeof rewriteCookieDomainConfig&&(rewriteCookieDomainConfig={"*":rewriteCookieDomainConfig}),preserveHeaderKeyCase&&void 0!=proxyRes.rawHeaders){rawHeaderKeyMap={};for(var i=0;i<proxyRes.rawHeaders.length;i+=2){var key=proxyRes.rawHeaders[i];rawHeaderKeyMap[key.toLowerCase()]=key}}Object.keys(proxyRes.headers).forEach(function(key){var header=proxyRes.headers[key];preserveHeaderKeyCase&&rawHeaderKeyMap&&(key=rawHeaderKeyMap[key]||key),setHeader(key,header)})},writeStatusCode:function(req,res,proxyRes){proxyRes.statusMessage?res.writeHead(proxyRes.statusCode,proxyRes.statusMessage):res.writeHead(proxyRes.statusCode)}}},function(module,exports,__webpack_require__){var http=__webpack_require__(43),https=__webpack_require__(62),common=__webpack_require__(49);/*!
 * Array of passes.
 *
 * A `pass` is just a function that is executed on `req, socket, options`
 * so that you can easily add new checks while still keeping the base
 * flexible.
 */
module.exports={checkMethodAndHeader:function(req,socket){return"GET"===req.method&&req.headers.upgrade?"websocket"!==req.headers.upgrade.toLowerCase()?(socket.destroy(),!0):void 0:(socket.destroy(),!0)},XHeaders:function(req,socket,options){if(options.xfwd){var values={"for":req.connection.remoteAddress||req.socket.remoteAddress,port:common.getPort(req),proto:common.hasEncryptedConnection(req)?"wss":"ws"};["for","port","proto"].forEach(function(header){req.headers["x-forwarded-"+header]=(req.headers["x-forwarded-"+header]||"")+(req.headers["x-forwarded-"+header]?",":"")+values[header]})}},stream:function(req,socket,options,head,server,clb){function onOutgoingError(err){clb?clb(err,req,socket):server.emit("error",err,req,socket),socket.end()}common.setupSocket(socket),head&&head.length&&socket.unshift(head);var proxyReq=(common.isSSL.test(options.target.protocol)?https:http).request(common.setupOutgoing(options.ssl||{},options,req));return server&&server.emit("proxyReqWs",proxyReq,req,socket,options,head),proxyReq.on("error",onOutgoingError),proxyReq.on("response",function(res){res.upgrade||socket.end()}),proxyReq.on("upgrade",function(proxyRes,proxySocket,proxyHead){proxySocket.on("error",onOutgoingError),proxySocket.on("end",function(){server.emit("close",proxyRes,proxySocket,proxyHead)}),socket.on("error",function(){proxySocket.end()}),common.setupSocket(proxySocket),proxyHead&&proxyHead.length&&proxySocket.unshift(proxyHead),socket.write(Object.keys(proxyRes.headers).reduce(function(head,key){var value=proxyRes.headers[key];if(!Array.isArray(value))return head.push(key+": "+value),head;for(var i=0;i<value.length;i++)head.push(key+": "+value[i]);return head},["HTTP/1.1 101 Switching Protocols"]).join("\r\n")+"\r\n\r\n"),proxySocket.pipe(socket).pipe(proxySocket),server.emit("open",proxySocket),server.emit("proxySocket",proxySocket)}),proxyReq.end()}}},function(module,exports,__webpack_require__){"use strict";function EE(fn,context,once){this.fn=fn,this.context=context,this.once=once||!1}function EventEmitter(){}var has=Object.prototype.hasOwnProperty,prefix="function"!=typeof Object.create&&"~";EventEmitter.prototype._events=void 0,EventEmitter.prototype.eventNames=function(){var name,events=this._events,names=[];if(!events)return names;for(name in events)has.call(events,name)&&names.push(prefix?name.slice(1):name);return Object.getOwnPropertySymbols?names.concat(Object.getOwnPropertySymbols(events)):names},EventEmitter.prototype.listeners=function(event,exists){var evt=prefix?prefix+event:event,available=this._events&&this._events[evt];if(exists)return!!available;if(!available)return[];if(available.fn)return[available.fn];for(var i=0,l=available.length,ee=new Array(l);i<l;i++)ee[i]=available[i].fn;return ee},EventEmitter.prototype.emit=function(event,a1,a2,a3,a4,a5){var evt=prefix?prefix+event:event;if(!this._events||!this._events[evt])return!1;var args,i,listeners=this._events[evt],len=arguments.length;if("function"==typeof listeners.fn){switch(listeners.once&&this.removeListener(event,listeners.fn,void 0,!0),len){case 1:return listeners.fn.call(listeners.context),!0;case 2:return listeners.fn.call(listeners.context,a1),!0;case 3:return listeners.fn.call(listeners.context,a1,a2),!0;case 4:return listeners.fn.call(listeners.context,a1,a2,a3),!0;case 5:return listeners.fn.call(listeners.context,a1,a2,a3,a4),!0;case 6:return listeners.fn.call(listeners.context,a1,a2,a3,a4,a5),!0}for(i=1,args=new Array(len-1);i<len;i++)args[i-1]=arguments[i];listeners.fn.apply(listeners.context,args)}else{var j,length=listeners.length;for(i=0;i<length;i++)switch(listeners[i].once&&this.removeListener(event,listeners[i].fn,void 0,!0),len){case 1:listeners[i].fn.call(listeners[i].context);break;case 2:listeners[i].fn.call(listeners[i].context,a1);break;case 3:listeners[i].fn.call(listeners[i].context,a1,a2);break;default:if(!args)for(j=1,args=new Array(len-1);j<len;j++)args[j-1]=arguments[j];listeners[i].fn.apply(listeners[i].context,args)}}return!0},EventEmitter.prototype.on=function(event,fn,context){var listener=new EE(fn,context||this),evt=prefix?prefix+event:event;return this._events||(this._events=prefix?{}:Object.create(null)),this._events[evt]?this._events[evt].fn?this._events[evt]=[this._events[evt],listener]:this._events[evt].push(listener):this._events[evt]=listener,this},EventEmitter.prototype.once=function(event,fn,context){var listener=new EE(fn,context||this,(!0)),evt=prefix?prefix+event:event;return this._events||(this._events=prefix?{}:Object.create(null)),this._events[evt]?this._events[evt].fn?this._events[evt]=[this._events[evt],listener]:this._events[evt].push(listener):this._events[evt]=listener,this},EventEmitter.prototype.removeListener=function(event,fn,context,once){var evt=prefix?prefix+event:event;if(!this._events||!this._events[evt])return this;var listeners=this._events[evt],events=[];if(fn)if(listeners.fn)(listeners.fn!==fn||once&&!listeners.once||context&&listeners.context!==context)&&events.push(listeners);else for(var i=0,length=listeners.length;i<length;i++)(listeners[i].fn!==fn||once&&!listeners[i].once||context&&listeners[i].context!==context)&&events.push(listeners[i]);return events.length?this._events[evt]=1===events.length?events[0]:events:delete this._events[evt],this},EventEmitter.prototype.removeAllListeners=function(event){return this._events?(event?delete this._events[prefix?prefix+event:event]:this._events=prefix?{}:Object.create(null),this):this},EventEmitter.prototype.off=EventEmitter.prototype.removeListener,EventEmitter.prototype.addListener=EventEmitter.prototype.on,EventEmitter.prototype.setMaxListeners=function(){return this},EventEmitter.prefixed=prefix,module.exports=EventEmitter},function(module,exports){"use strict";module.exports=function(port,protocol){if(protocol=protocol.split(":")[0],port=+port,!port)return!1;switch(protocol){case"http":case"ws":return 80!==port;case"https":case"wss":return 443!==port;case"ftp":return 21!==port;case"gopher":return 70!==port;case"file":return!1}return 0!==port}},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),InnerSubscriber=function(_super){function InnerSubscriber(parent,outerValue,outerIndex){_super.call(this),this.parent=parent,this.outerValue=outerValue,this.outerIndex=outerIndex,this.index=0}return __extends(InnerSubscriber,_super),InnerSubscriber.prototype._next=function(value){this.parent.notifyNext(this.outerValue,value,this.outerIndex,this.index++,this)},InnerSubscriber.prototype._error=function(error){this.parent.notifyError(error,this),this.unsubscribe()},InnerSubscriber.prototype._complete=function(){this.parent.notifyComplete(this),this.unsubscribe()},InnerSubscriber}(Subscriber_1.Subscriber);exports.InnerSubscriber=InnerSubscriber},function(module,exports){"use strict";var Scheduler=function(){function Scheduler(SchedulerAction,now){void 0===now&&(now=Scheduler.now),this.SchedulerAction=SchedulerAction,this.now=now}return Scheduler.prototype.schedule=function(work,delay,state){return void 0===delay&&(delay=0),new this.SchedulerAction(this,work).schedule(state,delay)},Scheduler.now=Date.now?Date.now:function(){return+new Date},Scheduler}();exports.Scheduler=Scheduler},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),bindCallback_1=__webpack_require__(298);Observable_1.Observable.bindCallback=bindCallback_1.bindCallback},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),bindNodeCallback_1=__webpack_require__(299);Observable_1.Observable.bindNodeCallback=bindNodeCallback_1.bindNodeCallback},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),combineLatest_1=__webpack_require__(300);Observable_1.Observable.combineLatest=combineLatest_1.combineLatest},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),concat_1=__webpack_require__(301);Observable_1.Observable.concat=concat_1.concat},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),defer_1=__webpack_require__(302);Observable_1.Observable.defer=defer_1.defer},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),ajax_1=__webpack_require__(304);Observable_1.Observable.ajax=ajax_1.ajax},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),webSocket_1=__webpack_require__(305);Observable_1.Observable.webSocket=webSocket_1.webSocket},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),empty_1=__webpack_require__(306);Observable_1.Observable.empty=empty_1.empty},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),forkJoin_1=__webpack_require__(307);Observable_1.Observable.forkJoin=forkJoin_1.forkJoin},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),from_1=__webpack_require__(308);Observable_1.Observable.from=from_1.from},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),fromEvent_1=__webpack_require__(309);Observable_1.Observable.fromEvent=fromEvent_1.fromEvent},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),fromEventPattern_1=__webpack_require__(310);Observable_1.Observable.fromEventPattern=fromEventPattern_1.fromEventPattern},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),fromPromise_1=__webpack_require__(311);Observable_1.Observable.fromPromise=fromPromise_1.fromPromise},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),GenerateObservable_1=__webpack_require__(288);Observable_1.Observable.generate=GenerateObservable_1.GenerateObservable.create},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),if_1=__webpack_require__(312);Observable_1.Observable["if"]=if_1._if},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),interval_1=__webpack_require__(313);Observable_1.Observable.interval=interval_1.interval},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),merge_1=__webpack_require__(314);Observable_1.Observable.merge=merge_1.merge},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),never_1=__webpack_require__(315);Observable_1.Observable.never=never_1.never},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),of_1=__webpack_require__(316);Observable_1.Observable.of=of_1.of},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),onErrorResumeNext_1=__webpack_require__(83);Observable_1.Observable.onErrorResumeNext=onErrorResumeNext_1.onErrorResumeNextStatic},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),pairs_1=__webpack_require__(317);Observable_1.Observable.pairs=pairs_1.pairs},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),race_1=__webpack_require__(84);Observable_1.Observable.race=race_1.raceStatic},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),range_1=__webpack_require__(318);Observable_1.Observable.range=range_1.range},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),throw_1=__webpack_require__(319);Observable_1.Observable["throw"]=throw_1._throw},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),timer_1=__webpack_require__(320);Observable_1.Observable.timer=timer_1.timer},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),using_1=__webpack_require__(321);Observable_1.Observable.using=using_1.using},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),zip_1=__webpack_require__(322);Observable_1.Observable.zip=zip_1.zip},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),audit_1=__webpack_require__(323);Observable_1.Observable.prototype.audit=audit_1.audit},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),auditTime_1=__webpack_require__(324);Observable_1.Observable.prototype.auditTime=auditTime_1.auditTime},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),buffer_1=__webpack_require__(325);Observable_1.Observable.prototype.buffer=buffer_1.buffer},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),bufferCount_1=__webpack_require__(326);Observable_1.Observable.prototype.bufferCount=bufferCount_1.bufferCount},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),bufferTime_1=__webpack_require__(327);Observable_1.Observable.prototype.bufferTime=bufferTime_1.bufferTime},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),bufferToggle_1=__webpack_require__(328);Observable_1.Observable.prototype.bufferToggle=bufferToggle_1.bufferToggle},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),bufferWhen_1=__webpack_require__(329);Observable_1.Observable.prototype.bufferWhen=bufferWhen_1.bufferWhen},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),catch_1=__webpack_require__(330);Observable_1.Observable.prototype["catch"]=catch_1._catch,Observable_1.Observable.prototype._catch=catch_1._catch},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),combineAll_1=__webpack_require__(331);Observable_1.Observable.prototype.combineAll=combineAll_1.combineAll},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),combineLatest_1=__webpack_require__(52);Observable_1.Observable.prototype.combineLatest=combineLatest_1.combineLatest},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),concat_1=__webpack_require__(53);Observable_1.Observable.prototype.concat=concat_1.concat},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),concatAll_1=__webpack_require__(332);Observable_1.Observable.prototype.concatAll=concatAll_1.concatAll},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),concatMap_1=__webpack_require__(333);Observable_1.Observable.prototype.concatMap=concatMap_1.concatMap},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),concatMapTo_1=__webpack_require__(334);Observable_1.Observable.prototype.concatMapTo=concatMapTo_1.concatMapTo},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),count_1=__webpack_require__(335);Observable_1.Observable.prototype.count=count_1.count},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),debounce_1=__webpack_require__(336);Observable_1.Observable.prototype.debounce=debounce_1.debounce},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),debounceTime_1=__webpack_require__(337);Observable_1.Observable.prototype.debounceTime=debounceTime_1.debounceTime},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),defaultIfEmpty_1=__webpack_require__(338);Observable_1.Observable.prototype.defaultIfEmpty=defaultIfEmpty_1.defaultIfEmpty},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),delay_1=__webpack_require__(339);Observable_1.Observable.prototype.delay=delay_1.delay},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),delayWhen_1=__webpack_require__(340);Observable_1.Observable.prototype.delayWhen=delayWhen_1.delayWhen},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),dematerialize_1=__webpack_require__(341);Observable_1.Observable.prototype.dematerialize=dematerialize_1.dematerialize},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),distinct_1=__webpack_require__(342);Observable_1.Observable.prototype.distinct=distinct_1.distinct},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),distinctUntilChanged_1=__webpack_require__(77);Observable_1.Observable.prototype.distinctUntilChanged=distinctUntilChanged_1.distinctUntilChanged},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),distinctUntilKeyChanged_1=__webpack_require__(343);Observable_1.Observable.prototype.distinctUntilKeyChanged=distinctUntilKeyChanged_1.distinctUntilKeyChanged},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),do_1=__webpack_require__(344);Observable_1.Observable.prototype["do"]=do_1._do,Observable_1.Observable.prototype._do=do_1._do},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),elementAt_1=__webpack_require__(345);Observable_1.Observable.prototype.elementAt=elementAt_1.elementAt},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),every_1=__webpack_require__(346);Observable_1.Observable.prototype.every=every_1.every},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),exhaust_1=__webpack_require__(347);Observable_1.Observable.prototype.exhaust=exhaust_1.exhaust},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),exhaustMap_1=__webpack_require__(348);Observable_1.Observable.prototype.exhaustMap=exhaustMap_1.exhaustMap},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),expand_1=__webpack_require__(349);Observable_1.Observable.prototype.expand=expand_1.expand},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),filter_1=__webpack_require__(78);Observable_1.Observable.prototype.filter=filter_1.filter},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),finally_1=__webpack_require__(350);Observable_1.Observable.prototype["finally"]=finally_1._finally,Observable_1.Observable.prototype._finally=finally_1._finally},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),find_1=__webpack_require__(79);Observable_1.Observable.prototype.find=find_1.find},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),findIndex_1=__webpack_require__(351);Observable_1.Observable.prototype.findIndex=findIndex_1.findIndex},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),first_1=__webpack_require__(352);Observable_1.Observable.prototype.first=first_1.first},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),groupBy_1=__webpack_require__(353);Observable_1.Observable.prototype.groupBy=groupBy_1.groupBy},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),ignoreElements_1=__webpack_require__(354);Observable_1.Observable.prototype.ignoreElements=ignoreElements_1.ignoreElements},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),isEmpty_1=__webpack_require__(355);Observable_1.Observable.prototype.isEmpty=isEmpty_1.isEmpty},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),last_1=__webpack_require__(356);Observable_1.Observable.prototype.last=last_1.last},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),let_1=__webpack_require__(357);Observable_1.Observable.prototype["let"]=let_1.letProto,Observable_1.Observable.prototype.letBind=let_1.letProto},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),map_1=__webpack_require__(54);Observable_1.Observable.prototype.map=map_1.map},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),mapTo_1=__webpack_require__(358);Observable_1.Observable.prototype.mapTo=mapTo_1.mapTo},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),materialize_1=__webpack_require__(359);Observable_1.Observable.prototype.materialize=materialize_1.materialize},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),max_1=__webpack_require__(360);Observable_1.Observable.prototype.max=max_1.max},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),merge_1=__webpack_require__(80);Observable_1.Observable.prototype.merge=merge_1.merge},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),mergeAll_1=__webpack_require__(31);Observable_1.Observable.prototype.mergeAll=mergeAll_1.mergeAll},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),mergeMap_1=__webpack_require__(81);Observable_1.Observable.prototype.mergeMap=mergeMap_1.mergeMap,Observable_1.Observable.prototype.flatMap=mergeMap_1.mergeMap},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),mergeMapTo_1=__webpack_require__(82);Observable_1.Observable.prototype.flatMapTo=mergeMapTo_1.mergeMapTo,Observable_1.Observable.prototype.mergeMapTo=mergeMapTo_1.mergeMapTo},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),mergeScan_1=__webpack_require__(361);Observable_1.Observable.prototype.mergeScan=mergeScan_1.mergeScan},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),min_1=__webpack_require__(362);Observable_1.Observable.prototype.min=min_1.min},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),multicast_1=__webpack_require__(20);Observable_1.Observable.prototype.multicast=multicast_1.multicast},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),observeOn_1=__webpack_require__(55);Observable_1.Observable.prototype.observeOn=observeOn_1.observeOn},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),onErrorResumeNext_1=__webpack_require__(83);Observable_1.Observable.prototype.onErrorResumeNext=onErrorResumeNext_1.onErrorResumeNext},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),pairwise_1=__webpack_require__(363);Observable_1.Observable.prototype.pairwise=pairwise_1.pairwise},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),partition_1=__webpack_require__(364);Observable_1.Observable.prototype.partition=partition_1.partition},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),pluck_1=__webpack_require__(365);Observable_1.Observable.prototype.pluck=pluck_1.pluck},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),publish_1=__webpack_require__(366);Observable_1.Observable.prototype.publish=publish_1.publish},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),publishBehavior_1=__webpack_require__(367);Observable_1.Observable.prototype.publishBehavior=publishBehavior_1.publishBehavior},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),publishLast_1=__webpack_require__(368);Observable_1.Observable.prototype.publishLast=publishLast_1.publishLast},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),publishReplay_1=__webpack_require__(369);Observable_1.Observable.prototype.publishReplay=publishReplay_1.publishReplay},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),race_1=__webpack_require__(84);Observable_1.Observable.prototype.race=race_1.race},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),reduce_1=__webpack_require__(56);Observable_1.Observable.prototype.reduce=reduce_1.reduce},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),repeat_1=__webpack_require__(370);Observable_1.Observable.prototype.repeat=repeat_1.repeat},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),repeatWhen_1=__webpack_require__(371);Observable_1.Observable.prototype.repeatWhen=repeatWhen_1.repeatWhen},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),retry_1=__webpack_require__(372);Observable_1.Observable.prototype.retry=retry_1.retry},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),retryWhen_1=__webpack_require__(373);Observable_1.Observable.prototype.retryWhen=retryWhen_1.retryWhen},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),sample_1=__webpack_require__(374);Observable_1.Observable.prototype.sample=sample_1.sample},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),sampleTime_1=__webpack_require__(375);Observable_1.Observable.prototype.sampleTime=sampleTime_1.sampleTime},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),scan_1=__webpack_require__(376);Observable_1.Observable.prototype.scan=scan_1.scan},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),sequenceEqual_1=__webpack_require__(377);Observable_1.Observable.prototype.sequenceEqual=sequenceEqual_1.sequenceEqual},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),share_1=__webpack_require__(378);Observable_1.Observable.prototype.share=share_1.share},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),single_1=__webpack_require__(379);Observable_1.Observable.prototype.single=single_1.single},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),skip_1=__webpack_require__(380);Observable_1.Observable.prototype.skip=skip_1.skip},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),skipUntil_1=__webpack_require__(381);Observable_1.Observable.prototype.skipUntil=skipUntil_1.skipUntil},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),skipWhile_1=__webpack_require__(382);Observable_1.Observable.prototype.skipWhile=skipWhile_1.skipWhile},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),startWith_1=__webpack_require__(383);Observable_1.Observable.prototype.startWith=startWith_1.startWith},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),subscribeOn_1=__webpack_require__(384);Observable_1.Observable.prototype.subscribeOn=subscribeOn_1.subscribeOn},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),switch_1=__webpack_require__(385);Observable_1.Observable.prototype["switch"]=switch_1._switch,Observable_1.Observable.prototype._switch=switch_1._switch},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),switchMap_1=__webpack_require__(386);Observable_1.Observable.prototype.switchMap=switchMap_1.switchMap},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),switchMapTo_1=__webpack_require__(387);Observable_1.Observable.prototype.switchMapTo=switchMapTo_1.switchMapTo},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),take_1=__webpack_require__(388);Observable_1.Observable.prototype.take=take_1.take},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),takeLast_1=__webpack_require__(389);Observable_1.Observable.prototype.takeLast=takeLast_1.takeLast},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),takeUntil_1=__webpack_require__(390);Observable_1.Observable.prototype.takeUntil=takeUntil_1.takeUntil},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),takeWhile_1=__webpack_require__(391);Observable_1.Observable.prototype.takeWhile=takeWhile_1.takeWhile},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),throttle_1=__webpack_require__(392);Observable_1.Observable.prototype.throttle=throttle_1.throttle},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),throttleTime_1=__webpack_require__(393);Observable_1.Observable.prototype.throttleTime=throttleTime_1.throttleTime},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),timeInterval_1=__webpack_require__(85);Observable_1.Observable.prototype.timeInterval=timeInterval_1.timeInterval},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),timeout_1=__webpack_require__(394);Observable_1.Observable.prototype.timeout=timeout_1.timeout},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),timeoutWith_1=__webpack_require__(395);Observable_1.Observable.prototype.timeoutWith=timeoutWith_1.timeoutWith},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),timestamp_1=__webpack_require__(86);Observable_1.Observable.prototype.timestamp=timestamp_1.timestamp},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),toArray_1=__webpack_require__(396);Observable_1.Observable.prototype.toArray=toArray_1.toArray},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),toPromise_1=__webpack_require__(397);Observable_1.Observable.prototype.toPromise=toPromise_1.toPromise},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),window_1=__webpack_require__(398);Observable_1.Observable.prototype.window=window_1.window},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),windowCount_1=__webpack_require__(399);Observable_1.Observable.prototype.windowCount=windowCount_1.windowCount},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),windowTime_1=__webpack_require__(400);Observable_1.Observable.prototype.windowTime=windowTime_1.windowTime},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),windowToggle_1=__webpack_require__(401);
Observable_1.Observable.prototype.windowToggle=windowToggle_1.windowToggle},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),windowWhen_1=__webpack_require__(402);Observable_1.Observable.prototype.windowWhen=windowWhen_1.windowWhen},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),withLatestFrom_1=__webpack_require__(403);Observable_1.Observable.prototype.withLatestFrom=withLatestFrom_1.withLatestFrom},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),zip_1=__webpack_require__(57);Observable_1.Observable.prototype.zip=zip_1.zipProto},function(module,exports,__webpack_require__){"use strict";var Observable_1=__webpack_require__(0),zipAll_1=__webpack_require__(404);Observable_1.Observable.prototype.zipAll=zipAll_1.zipAll},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Observable_1=__webpack_require__(0),ScalarObservable_1=__webpack_require__(51),EmptyObservable_1=__webpack_require__(17),ArrayLikeObservable=function(_super){function ArrayLikeObservable(arrayLike,scheduler){_super.call(this),this.arrayLike=arrayLike,this.scheduler=scheduler,scheduler||1!==arrayLike.length||(this._isScalar=!0,this.value=arrayLike[0])}return __extends(ArrayLikeObservable,_super),ArrayLikeObservable.create=function(arrayLike,scheduler){var length=arrayLike.length;return 0===length?new EmptyObservable_1.EmptyObservable:1===length?new ScalarObservable_1.ScalarObservable(arrayLike[0],scheduler):new ArrayLikeObservable(arrayLike,scheduler)},ArrayLikeObservable.dispatch=function(state){var arrayLike=state.arrayLike,index=state.index,length=state.length,subscriber=state.subscriber;if(!subscriber.closed){if(index>=length)return void subscriber.complete();subscriber.next(arrayLike[index]),state.index=index+1,this.schedule(state)}},ArrayLikeObservable.prototype._subscribe=function(subscriber){var index=0,_a=this,arrayLike=_a.arrayLike,scheduler=_a.scheduler,length=arrayLike.length;if(scheduler)return scheduler.schedule(ArrayLikeObservable.dispatch,0,{arrayLike:arrayLike,index:index,length:length,subscriber:subscriber});for(var i=0;i<length&&!subscriber.closed;i++)subscriber.next(arrayLike[i]);subscriber.complete()},ArrayLikeObservable}(Observable_1.Observable);exports.ArrayLikeObservable=ArrayLikeObservable},function(module,exports,__webpack_require__){"use strict";function dispatchNext(arg){var value=arg.value,subject=arg.subject;subject.next(value),subject.complete()}function dispatchError(arg){var err=arg.err,subject=arg.subject;subject.error(err)}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Observable_1=__webpack_require__(0),tryCatch_1=__webpack_require__(9),errorObject_1=__webpack_require__(7),AsyncSubject_1=__webpack_require__(30),BoundCallbackObservable=function(_super){function BoundCallbackObservable(callbackFunc,selector,args,context,scheduler){_super.call(this),this.callbackFunc=callbackFunc,this.selector=selector,this.args=args,this.context=context,this.scheduler=scheduler}return __extends(BoundCallbackObservable,_super),BoundCallbackObservable.create=function(func,selector,scheduler){return void 0===selector&&(selector=void 0),function(){for(var args=[],_i=0;_i<arguments.length;_i++)args[_i-0]=arguments[_i];return new BoundCallbackObservable(func,selector,args,this,scheduler)}},BoundCallbackObservable.prototype._subscribe=function(subscriber){var callbackFunc=this.callbackFunc,args=this.args,scheduler=this.scheduler,subject=this.subject;if(scheduler)return scheduler.schedule(BoundCallbackObservable.dispatch,0,{source:this,subscriber:subscriber,context:this.context});if(!subject){subject=this.subject=new AsyncSubject_1.AsyncSubject;var handler=function handlerFn(){for(var innerArgs=[],_i=0;_i<arguments.length;_i++)innerArgs[_i-0]=arguments[_i];var source=handlerFn.source,selector=source.selector,subject=source.subject;if(selector){var result_1=tryCatch_1.tryCatch(selector).apply(this,innerArgs);result_1===errorObject_1.errorObject?subject.error(errorObject_1.errorObject.e):(subject.next(result_1),subject.complete())}else subject.next(innerArgs.length<=1?innerArgs[0]:innerArgs),subject.complete()};handler.source=this;var result=tryCatch_1.tryCatch(callbackFunc).apply(this.context,args.concat(handler));result===errorObject_1.errorObject&&subject.error(errorObject_1.errorObject.e)}return subject.subscribe(subscriber)},BoundCallbackObservable.dispatch=function(state){var self=this,source=state.source,subscriber=state.subscriber,context=state.context,callbackFunc=source.callbackFunc,args=source.args,scheduler=source.scheduler,subject=source.subject;if(!subject){subject=source.subject=new AsyncSubject_1.AsyncSubject;var handler=function handlerFn(){for(var innerArgs=[],_i=0;_i<arguments.length;_i++)innerArgs[_i-0]=arguments[_i];var source=handlerFn.source,selector=source.selector,subject=source.subject;if(selector){var result_2=tryCatch_1.tryCatch(selector).apply(this,innerArgs);result_2===errorObject_1.errorObject?self.add(scheduler.schedule(dispatchError,0,{err:errorObject_1.errorObject.e,subject:subject})):self.add(scheduler.schedule(dispatchNext,0,{value:result_2,subject:subject}))}else{var value=innerArgs.length<=1?innerArgs[0]:innerArgs;self.add(scheduler.schedule(dispatchNext,0,{value:value,subject:subject}))}};handler.source=source;var result=tryCatch_1.tryCatch(callbackFunc).apply(context,args.concat(handler));result===errorObject_1.errorObject&&subject.error(errorObject_1.errorObject.e)}self.add(subject.subscribe(subscriber))},BoundCallbackObservable}(Observable_1.Observable);exports.BoundCallbackObservable=BoundCallbackObservable},function(module,exports,__webpack_require__){"use strict";function dispatch(state){var self=this,source=state.source,subscriber=state.subscriber,context=state.context,_a=source,callbackFunc=_a.callbackFunc,args=_a.args,scheduler=_a.scheduler,subject=source.subject;if(!subject){subject=source.subject=new AsyncSubject_1.AsyncSubject;var handler=function handlerFn(){for(var innerArgs=[],_i=0;_i<arguments.length;_i++)innerArgs[_i-0]=arguments[_i];var source=handlerFn.source,selector=source.selector,subject=source.subject,err=innerArgs.shift();if(err)self.add(scheduler.schedule(dispatchError,0,{err:err,subject:subject}));else if(selector){var result_2=tryCatch_1.tryCatch(selector).apply(this,innerArgs);result_2===errorObject_1.errorObject?self.add(scheduler.schedule(dispatchError,0,{err:errorObject_1.errorObject.e,subject:subject})):self.add(scheduler.schedule(dispatchNext,0,{value:result_2,subject:subject}))}else{var value=innerArgs.length<=1?innerArgs[0]:innerArgs;self.add(scheduler.schedule(dispatchNext,0,{value:value,subject:subject}))}};handler.source=source;var result=tryCatch_1.tryCatch(callbackFunc).apply(context,args.concat(handler));result===errorObject_1.errorObject&&self.add(scheduler.schedule(dispatchError,0,{err:errorObject_1.errorObject.e,subject:subject}))}self.add(subject.subscribe(subscriber))}function dispatchNext(arg){var value=arg.value,subject=arg.subject;subject.next(value),subject.complete()}function dispatchError(arg){var err=arg.err,subject=arg.subject;subject.error(err)}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Observable_1=__webpack_require__(0),tryCatch_1=__webpack_require__(9),errorObject_1=__webpack_require__(7),AsyncSubject_1=__webpack_require__(30),BoundNodeCallbackObservable=function(_super){function BoundNodeCallbackObservable(callbackFunc,selector,args,context,scheduler){_super.call(this),this.callbackFunc=callbackFunc,this.selector=selector,this.args=args,this.context=context,this.scheduler=scheduler}return __extends(BoundNodeCallbackObservable,_super),BoundNodeCallbackObservable.create=function(func,selector,scheduler){return void 0===selector&&(selector=void 0),function(){for(var args=[],_i=0;_i<arguments.length;_i++)args[_i-0]=arguments[_i];return new BoundNodeCallbackObservable(func,selector,args,this,scheduler)}},BoundNodeCallbackObservable.prototype._subscribe=function(subscriber){var callbackFunc=this.callbackFunc,args=this.args,scheduler=this.scheduler,subject=this.subject;if(scheduler)return scheduler.schedule(dispatch,0,{source:this,subscriber:subscriber,context:this.context});if(!subject){subject=this.subject=new AsyncSubject_1.AsyncSubject;var handler=function handlerFn(){for(var innerArgs=[],_i=0;_i<arguments.length;_i++)innerArgs[_i-0]=arguments[_i];var source=handlerFn.source,selector=source.selector,subject=source.subject,err=innerArgs.shift();if(err)subject.error(err);else if(selector){var result_1=tryCatch_1.tryCatch(selector).apply(this,innerArgs);result_1===errorObject_1.errorObject?subject.error(errorObject_1.errorObject.e):(subject.next(result_1),subject.complete())}else subject.next(innerArgs.length<=1?innerArgs[0]:innerArgs),subject.complete()};handler.source=this;var result=tryCatch_1.tryCatch(callbackFunc).apply(this.context,args.concat(handler));result===errorObject_1.errorObject&&subject.error(errorObject_1.errorObject.e)}return subject.subscribe(subscriber)},BoundNodeCallbackObservable}(Observable_1.Observable);exports.BoundNodeCallbackObservable=BoundNodeCallbackObservable},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Observable_1=__webpack_require__(0),subscribeToResult_1=__webpack_require__(3),OuterSubscriber_1=__webpack_require__(2),DeferObservable=function(_super){function DeferObservable(observableFactory){_super.call(this),this.observableFactory=observableFactory}return __extends(DeferObservable,_super),DeferObservable.create=function(observableFactory){return new DeferObservable(observableFactory)},DeferObservable.prototype._subscribe=function(subscriber){return new DeferSubscriber(subscriber,this.observableFactory)},DeferObservable}(Observable_1.Observable);exports.DeferObservable=DeferObservable;var DeferSubscriber=function(_super){function DeferSubscriber(destination,factory){_super.call(this,destination),this.factory=factory,this.tryDefer()}return __extends(DeferSubscriber,_super),DeferSubscriber.prototype.tryDefer=function(){try{this._callFactory()}catch(err){this._error(err)}},DeferSubscriber.prototype._callFactory=function(){var result=this.factory();result&&this.add(subscribeToResult_1.subscribeToResult(this,result))},DeferSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Observable_1=__webpack_require__(0),ErrorObservable=function(_super){function ErrorObservable(error,scheduler){_super.call(this),this.error=error,this.scheduler=scheduler}return __extends(ErrorObservable,_super),ErrorObservable.create=function(error,scheduler){return new ErrorObservable(error,scheduler)},ErrorObservable.dispatch=function(arg){var error=arg.error,subscriber=arg.subscriber;subscriber.error(error)},ErrorObservable.prototype._subscribe=function(subscriber){var error=this.error,scheduler=this.scheduler;return scheduler?scheduler.schedule(ErrorObservable.dispatch,0,{error:error,subscriber:subscriber}):void subscriber.error(error)},ErrorObservable}(Observable_1.Observable);exports.ErrorObservable=ErrorObservable},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Observable_1=__webpack_require__(0),EmptyObservable_1=__webpack_require__(17),isArray_1=__webpack_require__(14),subscribeToResult_1=__webpack_require__(3),OuterSubscriber_1=__webpack_require__(2),ForkJoinObservable=function(_super){function ForkJoinObservable(sources,resultSelector){_super.call(this),this.sources=sources,this.resultSelector=resultSelector}return __extends(ForkJoinObservable,_super),ForkJoinObservable.create=function(){for(var sources=[],_i=0;_i<arguments.length;_i++)sources[_i-0]=arguments[_i];if(null===sources||0===arguments.length)return new EmptyObservable_1.EmptyObservable;var resultSelector=null;return"function"==typeof sources[sources.length-1]&&(resultSelector=sources.pop()),1===sources.length&&isArray_1.isArray(sources[0])&&(sources=sources[0]),0===sources.length?new EmptyObservable_1.EmptyObservable:new ForkJoinObservable(sources,resultSelector)},ForkJoinObservable.prototype._subscribe=function(subscriber){return new ForkJoinSubscriber(subscriber,this.sources,this.resultSelector)},ForkJoinObservable}(Observable_1.Observable);exports.ForkJoinObservable=ForkJoinObservable;var ForkJoinSubscriber=function(_super){function ForkJoinSubscriber(destination,sources,resultSelector){_super.call(this,destination),this.sources=sources,this.resultSelector=resultSelector,this.completed=0,this.haveValues=0;var len=sources.length;this.total=len,this.values=new Array(len);for(var i=0;i<len;i++){var source=sources[i],innerSubscription=subscribeToResult_1.subscribeToResult(this,source,null,i);innerSubscription&&(innerSubscription.outerIndex=i,this.add(innerSubscription))}}return __extends(ForkJoinSubscriber,_super),ForkJoinSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this.values[outerIndex]=innerValue,innerSub._hasValue||(innerSub._hasValue=!0,this.haveValues++)},ForkJoinSubscriber.prototype.notifyComplete=function(innerSub){var destination=this.destination,_a=this,haveValues=_a.haveValues,resultSelector=_a.resultSelector,values=_a.values,len=values.length;if(!innerSub._hasValue)return void destination.complete();if(this.completed++,this.completed===len){if(haveValues===len){var value=resultSelector?resultSelector.apply(this,values):values;destination.next(value)}destination.complete()}},ForkJoinSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function isNodeStyleEventEmitter(sourceObj){return!!sourceObj&&"function"==typeof sourceObj.addListener&&"function"==typeof sourceObj.removeListener}function isJQueryStyleEventEmitter(sourceObj){return!!sourceObj&&"function"==typeof sourceObj.on&&"function"==typeof sourceObj.off}function isNodeList(sourceObj){return!!sourceObj&&"[object NodeList]"===toString.call(sourceObj)}function isHTMLCollection(sourceObj){return!!sourceObj&&"[object HTMLCollection]"===toString.call(sourceObj)}function isEventTarget(sourceObj){return!!sourceObj&&"function"==typeof sourceObj.addEventListener&&"function"==typeof sourceObj.removeEventListener}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Observable_1=__webpack_require__(0),tryCatch_1=__webpack_require__(9),isFunction_1=__webpack_require__(38),errorObject_1=__webpack_require__(7),Subscription_1=__webpack_require__(5),toString=Object.prototype.toString,FromEventObservable=function(_super){function FromEventObservable(sourceObj,eventName,selector,options){_super.call(this),this.sourceObj=sourceObj,this.eventName=eventName,this.selector=selector,this.options=options}return __extends(FromEventObservable,_super),FromEventObservable.create=function(target,eventName,options,selector){return isFunction_1.isFunction(options)&&(selector=options,options=void 0),new FromEventObservable(target,eventName,selector,options)},FromEventObservable.setupSubscription=function(sourceObj,eventName,handler,subscriber,options){var unsubscribe;if(isNodeList(sourceObj)||isHTMLCollection(sourceObj))for(var i=0,len=sourceObj.length;i<len;i++)FromEventObservable.setupSubscription(sourceObj[i],eventName,handler,subscriber,options);else if(isEventTarget(sourceObj)){var source_1=sourceObj;sourceObj.addEventListener(eventName,handler,options),unsubscribe=function(){return source_1.removeEventListener(eventName,handler)}}else if(isJQueryStyleEventEmitter(sourceObj)){var source_2=sourceObj;sourceObj.on(eventName,handler),unsubscribe=function(){return source_2.off(eventName,handler)}}else{if(!isNodeStyleEventEmitter(sourceObj))throw new TypeError("Invalid event target");var source_3=sourceObj;sourceObj.addListener(eventName,handler),unsubscribe=function(){return source_3.removeListener(eventName,handler)}}subscriber.add(new Subscription_1.Subscription(unsubscribe))},FromEventObservable.prototype._subscribe=function(subscriber){var sourceObj=this.sourceObj,eventName=this.eventName,options=this.options,selector=this.selector,handler=selector?function(){for(var args=[],_i=0;_i<arguments.length;_i++)args[_i-0]=arguments[_i];var result=tryCatch_1.tryCatch(selector).apply(void 0,args);result===errorObject_1.errorObject?subscriber.error(errorObject_1.errorObject.e):subscriber.next(result)}:function(e){return subscriber.next(e)};FromEventObservable.setupSubscription(sourceObj,eventName,handler,subscriber,options)},FromEventObservable}(Observable_1.Observable);exports.FromEventObservable=FromEventObservable},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},isFunction_1=__webpack_require__(38),Observable_1=__webpack_require__(0),Subscription_1=__webpack_require__(5),FromEventPatternObservable=function(_super){function FromEventPatternObservable(addHandler,removeHandler,selector){_super.call(this),this.addHandler=addHandler,this.removeHandler=removeHandler,this.selector=selector}return __extends(FromEventPatternObservable,_super),FromEventPatternObservable.create=function(addHandler,removeHandler,selector){return new FromEventPatternObservable(addHandler,removeHandler,selector)},FromEventPatternObservable.prototype._subscribe=function(subscriber){var _this=this,removeHandler=this.removeHandler,handler=this.selector?function(){for(var args=[],_i=0;_i<arguments.length;_i++)args[_i-0]=arguments[_i];_this._callSelector(subscriber,args)}:function(e){subscriber.next(e)},retValue=this._callAddHandler(handler,subscriber);isFunction_1.isFunction(removeHandler)&&subscriber.add(new Subscription_1.Subscription(function(){removeHandler(handler,retValue)}))},FromEventPatternObservable.prototype._callSelector=function(subscriber,args){try{var result=this.selector.apply(this,args);subscriber.next(result)}catch(e){subscriber.error(e)}},FromEventPatternObservable.prototype._callAddHandler=function(handler,errorSubscriber){try{return this.addHandler(handler)||null}catch(e){errorSubscriber.error(e)}},FromEventPatternObservable}(Observable_1.Observable);exports.FromEventPatternObservable=FromEventPatternObservable},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Observable_1=__webpack_require__(0),isScheduler_1=__webpack_require__(15),selfSelector=function(value){return value},GenerateObservable=function(_super){function GenerateObservable(initialState,condition,iterate,resultSelector,scheduler){_super.call(this),this.initialState=initialState,this.condition=condition,this.iterate=iterate,this.resultSelector=resultSelector,this.scheduler=scheduler}return __extends(GenerateObservable,_super),GenerateObservable.create=function(initialStateOrOptions,condition,iterate,resultSelectorOrObservable,scheduler){return 1==arguments.length?new GenerateObservable(initialStateOrOptions.initialState,initialStateOrOptions.condition,initialStateOrOptions.iterate,initialStateOrOptions.resultSelector||selfSelector,initialStateOrOptions.scheduler):void 0===resultSelectorOrObservable||isScheduler_1.isScheduler(resultSelectorOrObservable)?new GenerateObservable(initialStateOrOptions,condition,iterate,selfSelector,resultSelectorOrObservable):new GenerateObservable(initialStateOrOptions,condition,iterate,resultSelectorOrObservable,scheduler)},GenerateObservable.prototype._subscribe=function(subscriber){var state=this.initialState;if(this.scheduler)return this.scheduler.schedule(GenerateObservable.dispatch,0,{subscriber:subscriber,iterate:this.iterate,condition:this.condition,resultSelector:this.resultSelector,state:state});for(var _a=this,condition=_a.condition,resultSelector=_a.resultSelector,iterate=_a.iterate;;){if(condition){var conditionResult=void 0;try{conditionResult=condition(state)}catch(err){return void subscriber.error(err)}if(!conditionResult){subscriber.complete();break}}var value=void 0;try{value=resultSelector(state)}catch(err){return void subscriber.error(err)}if(subscriber.next(value),subscriber.closed)break;try{state=iterate(state)}catch(err){return void subscriber.error(err)}}},GenerateObservable.dispatch=function(state){var subscriber=state.subscriber,condition=state.condition;if(!subscriber.closed){if(state.needIterate)try{state.state=state.iterate(state.state)}catch(err){return void subscriber.error(err)}else state.needIterate=!0;if(condition){var conditionResult=void 0;try{conditionResult=condition(state.state)}catch(err){return void subscriber.error(err)}if(!conditionResult)return void subscriber.complete();if(subscriber.closed)return}var value;try{value=state.resultSelector(state.state)}catch(err){return void subscriber.error(err)}if(!subscriber.closed&&(subscriber.next(value),!subscriber.closed))return this.schedule(state)}},GenerateObservable}(Observable_1.Observable);exports.GenerateObservable=GenerateObservable},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Observable_1=__webpack_require__(0),subscribeToResult_1=__webpack_require__(3),OuterSubscriber_1=__webpack_require__(2),IfObservable=function(_super){function IfObservable(condition,thenSource,elseSource){_super.call(this),this.condition=condition,this.thenSource=thenSource,this.elseSource=elseSource}return __extends(IfObservable,_super),IfObservable.create=function(condition,thenSource,elseSource){return new IfObservable(condition,thenSource,elseSource)},IfObservable.prototype._subscribe=function(subscriber){var _a=this,condition=_a.condition,thenSource=_a.thenSource,elseSource=_a.elseSource;return new IfSubscriber(subscriber,condition,thenSource,elseSource)},IfObservable}(Observable_1.Observable);exports.IfObservable=IfObservable;var IfSubscriber=function(_super){function IfSubscriber(destination,condition,thenSource,elseSource){_super.call(this,destination),this.condition=condition,this.thenSource=thenSource,this.elseSource=elseSource,this.tryIf()}return __extends(IfSubscriber,_super),IfSubscriber.prototype.tryIf=function(){var result,_a=this,condition=_a.condition,thenSource=_a.thenSource,elseSource=_a.elseSource;try{result=condition();var source=result?thenSource:elseSource;source?this.add(subscribeToResult_1.subscribeToResult(this,source)):this._complete()}catch(err){this._error(err)}},IfSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},isNumeric_1=__webpack_require__(39),Observable_1=__webpack_require__(0),async_1=__webpack_require__(10),IntervalObservable=function(_super){function IntervalObservable(period,scheduler){void 0===period&&(period=0),void 0===scheduler&&(scheduler=async_1.async),_super.call(this),this.period=period,this.scheduler=scheduler,(!isNumeric_1.isNumeric(period)||period<0)&&(this.period=0),scheduler&&"function"==typeof scheduler.schedule||(this.scheduler=async_1.async)}return __extends(IntervalObservable,_super),IntervalObservable.create=function(period,scheduler){return void 0===period&&(period=0),void 0===scheduler&&(scheduler=async_1.async),new IntervalObservable(period,scheduler)},IntervalObservable.dispatch=function(state){var index=state.index,subscriber=state.subscriber,period=state.period;subscriber.next(index),subscriber.closed||(state.index+=1,this.schedule(state,period))},IntervalObservable.prototype._subscribe=function(subscriber){var index=0,period=this.period,scheduler=this.scheduler;subscriber.add(scheduler.schedule(IntervalObservable.dispatch,period,{index:index,subscriber:subscriber,period:period}))},IntervalObservable}(Observable_1.Observable);exports.IntervalObservable=IntervalObservable},function(module,exports,__webpack_require__){"use strict";function getIterator(obj){var i=obj[iterator_1.$$iterator];if(!i&&"string"==typeof obj)return new StringIterator(obj);if(!i&&void 0!==obj.length)return new ArrayIterator(obj);if(!i)throw new TypeError("object is not iterable");return obj[iterator_1.$$iterator]()}function toLength(o){var len=+o.length;return isNaN(len)?0:0!==len&&numberIsFinite(len)?(len=sign(len)*Math.floor(Math.abs(len)),len<=0?0:len>maxSafeInteger?maxSafeInteger:len):len}function numberIsFinite(value){return"number"==typeof value&&root_1.root.isFinite(value)}function sign(value){var valueAsNumber=+value;return 0===valueAsNumber?valueAsNumber:isNaN(valueAsNumber)?valueAsNumber:valueAsNumber<0?-1:1}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},root_1=__webpack_require__(8),Observable_1=__webpack_require__(0),iterator_1=__webpack_require__(25),IteratorObservable=function(_super){function IteratorObservable(iterator,scheduler){if(_super.call(this),this.scheduler=scheduler,null==iterator)throw new Error("iterator cannot be null.");this.iterator=getIterator(iterator)}return __extends(IteratorObservable,_super),IteratorObservable.create=function(iterator,scheduler){return new IteratorObservable(iterator,scheduler)},IteratorObservable.dispatch=function(state){var index=state.index,hasError=state.hasError,iterator=state.iterator,subscriber=state.subscriber;if(hasError)return void subscriber.error(state.error);var result=iterator.next();return result.done?void subscriber.complete():(subscriber.next(result.value),state.index=index+1,subscriber.closed?void("function"==typeof iterator["return"]&&iterator["return"]()):void this.schedule(state))},IteratorObservable.prototype._subscribe=function(subscriber){var index=0,_a=this,iterator=_a.iterator,scheduler=_a.scheduler;if(scheduler)return scheduler.schedule(IteratorObservable.dispatch,0,{index:index,iterator:iterator,subscriber:subscriber});for(;;){var result=iterator.next();if(result.done){subscriber.complete();break}if(subscriber.next(result.value),subscriber.closed){"function"==typeof iterator["return"]&&iterator["return"]();break}}},IteratorObservable}(Observable_1.Observable);exports.IteratorObservable=IteratorObservable;var StringIterator=function(){function StringIterator(str,idx,len){void 0===idx&&(idx=0),void 0===len&&(len=str.length),this.str=str,this.idx=idx,this.len=len}return StringIterator.prototype[iterator_1.$$iterator]=function(){return this},StringIterator.prototype.next=function(){return this.idx<this.len?{done:!1,value:this.str.charAt(this.idx++)}:{done:!0,value:void 0}},StringIterator}(),ArrayIterator=function(){function ArrayIterator(arr,idx,len){void 0===idx&&(idx=0),void 0===len&&(len=toLength(arr)),this.arr=arr,this.idx=idx,this.len=len}return ArrayIterator.prototype[iterator_1.$$iterator]=function(){return this},ArrayIterator.prototype.next=function(){return this.idx<this.len?{done:!1,value:this.arr[this.idx++]}:{done:!0,value:void 0}},ArrayIterator}(),maxSafeInteger=Math.pow(2,53)-1},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Observable_1=__webpack_require__(0),noop_1=__webpack_require__(98),NeverObservable=function(_super){function NeverObservable(){_super.call(this)}return __extends(NeverObservable,_super),NeverObservable.create=function(){return new NeverObservable},NeverObservable.prototype._subscribe=function(subscriber){noop_1.noop()},NeverObservable}(Observable_1.Observable);exports.NeverObservable=NeverObservable},function(module,exports,__webpack_require__){"use strict";function dispatch(state){var obj=state.obj,keys=state.keys,length=state.length,index=state.index,subscriber=state.subscriber;if(index===length)return void subscriber.complete();var key=keys[index];subscriber.next([key,obj[key]]),state.index=index+1,this.schedule(state)}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Observable_1=__webpack_require__(0),PairsObservable=function(_super){function PairsObservable(obj,scheduler){_super.call(this),this.obj=obj,this.scheduler=scheduler,this.keys=Object.keys(obj)}return __extends(PairsObservable,_super),PairsObservable.create=function(obj,scheduler){return new PairsObservable(obj,scheduler)},PairsObservable.prototype._subscribe=function(subscriber){var _a=this,keys=_a.keys,scheduler=_a.scheduler,length=keys.length;if(scheduler)return scheduler.schedule(dispatch,0,{obj:this.obj,keys:keys,length:length,index:0,subscriber:subscriber});for(var idx=0;idx<length;idx++){var key=keys[idx];subscriber.next([key,this.obj[key]])}subscriber.complete()},PairsObservable}(Observable_1.Observable);exports.PairsObservable=PairsObservable},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Observable_1=__webpack_require__(0),RangeObservable=function(_super){function RangeObservable(start,count,scheduler){_super.call(this),this.start=start,this._count=count,this.scheduler=scheduler}return __extends(RangeObservable,_super),RangeObservable.create=function(start,count,scheduler){return void 0===start&&(start=0),void 0===count&&(count=0),new RangeObservable(start,count,scheduler)},RangeObservable.dispatch=function(state){var start=state.start,index=state.index,count=state.count,subscriber=state.subscriber;return index>=count?void subscriber.complete():(subscriber.next(start),void(subscriber.closed||(state.index=index+1,state.start=start+1,this.schedule(state))))},RangeObservable.prototype._subscribe=function(subscriber){var index=0,start=this.start,count=this._count,scheduler=this.scheduler;if(scheduler)return scheduler.schedule(RangeObservable.dispatch,0,{index:index,count:count,start:start,subscriber:subscriber});for(;;){if(index++>=count){subscriber.complete();break}if(subscriber.next(start++),subscriber.closed)break}},RangeObservable}(Observable_1.Observable);
exports.RangeObservable=RangeObservable},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Observable_1=__webpack_require__(0),asap_1=__webpack_require__(88),isNumeric_1=__webpack_require__(39),SubscribeOnObservable=function(_super){function SubscribeOnObservable(source,delayTime,scheduler){void 0===delayTime&&(delayTime=0),void 0===scheduler&&(scheduler=asap_1.asap),_super.call(this),this.source=source,this.delayTime=delayTime,this.scheduler=scheduler,(!isNumeric_1.isNumeric(delayTime)||delayTime<0)&&(this.delayTime=0),scheduler&&"function"==typeof scheduler.schedule||(this.scheduler=asap_1.asap)}return __extends(SubscribeOnObservable,_super),SubscribeOnObservable.create=function(source,delay,scheduler){return void 0===delay&&(delay=0),void 0===scheduler&&(scheduler=asap_1.asap),new SubscribeOnObservable(source,delay,scheduler)},SubscribeOnObservable.dispatch=function(arg){var source=arg.source,subscriber=arg.subscriber;return this.add(source.subscribe(subscriber))},SubscribeOnObservable.prototype._subscribe=function(subscriber){var delay=this.delayTime,source=this.source,scheduler=this.scheduler;return scheduler.schedule(SubscribeOnObservable.dispatch,delay,{source:source,subscriber:subscriber})},SubscribeOnObservable}(Observable_1.Observable);exports.SubscribeOnObservable=SubscribeOnObservable},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},isNumeric_1=__webpack_require__(39),Observable_1=__webpack_require__(0),async_1=__webpack_require__(10),isScheduler_1=__webpack_require__(15),isDate_1=__webpack_require__(37),TimerObservable=function(_super){function TimerObservable(dueTime,period,scheduler){void 0===dueTime&&(dueTime=0),_super.call(this),this.period=-1,this.dueTime=0,isNumeric_1.isNumeric(period)?this.period=Number(period)<1&&1||Number(period):isScheduler_1.isScheduler(period)&&(scheduler=period),isScheduler_1.isScheduler(scheduler)||(scheduler=async_1.async),this.scheduler=scheduler,this.dueTime=isDate_1.isDate(dueTime)?+dueTime-this.scheduler.now():dueTime}return __extends(TimerObservable,_super),TimerObservable.create=function(initialDelay,period,scheduler){return void 0===initialDelay&&(initialDelay=0),new TimerObservable(initialDelay,period,scheduler)},TimerObservable.dispatch=function(state){var index=state.index,period=state.period,subscriber=state.subscriber,action=this;if(subscriber.next(index),!subscriber.closed){if(period===-1)return subscriber.complete();state.index=index+1,action.schedule(state,period)}},TimerObservable.prototype._subscribe=function(subscriber){var index=0,_a=this,period=_a.period,dueTime=_a.dueTime,scheduler=_a.scheduler;return scheduler.schedule(TimerObservable.dispatch,dueTime,{index:index,period:period,subscriber:subscriber})},TimerObservable}(Observable_1.Observable);exports.TimerObservable=TimerObservable},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Observable_1=__webpack_require__(0),subscribeToResult_1=__webpack_require__(3),OuterSubscriber_1=__webpack_require__(2),UsingObservable=function(_super){function UsingObservable(resourceFactory,observableFactory){_super.call(this),this.resourceFactory=resourceFactory,this.observableFactory=observableFactory}return __extends(UsingObservable,_super),UsingObservable.create=function(resourceFactory,observableFactory){return new UsingObservable(resourceFactory,observableFactory)},UsingObservable.prototype._subscribe=function(subscriber){var resource,_a=this,resourceFactory=_a.resourceFactory,observableFactory=_a.observableFactory;try{return resource=resourceFactory(),new UsingSubscriber(subscriber,resource,observableFactory)}catch(err){subscriber.error(err)}},UsingObservable}(Observable_1.Observable);exports.UsingObservable=UsingObservable;var UsingSubscriber=function(_super){function UsingSubscriber(destination,resource,observableFactory){_super.call(this,destination),this.resource=resource,this.observableFactory=observableFactory,destination.add(resource),this.tryUse()}return __extends(UsingSubscriber,_super),UsingSubscriber.prototype.tryUse=function(){try{var source=this.observableFactory.call(this,this.resource);source&&this.add(subscribeToResult_1.subscribeToResult(this,source))}catch(err){this._error(err)}},UsingSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";var BoundCallbackObservable_1=__webpack_require__(281);exports.bindCallback=BoundCallbackObservable_1.BoundCallbackObservable.create},function(module,exports,__webpack_require__){"use strict";var BoundNodeCallbackObservable_1=__webpack_require__(282);exports.bindNodeCallback=BoundNodeCallbackObservable_1.BoundNodeCallbackObservable.create},function(module,exports,__webpack_require__){"use strict";function combineLatest(){for(var observables=[],_i=0;_i<arguments.length;_i++)observables[_i-0]=arguments[_i];var project=null,scheduler=null;return isScheduler_1.isScheduler(observables[observables.length-1])&&(scheduler=observables.pop()),"function"==typeof observables[observables.length-1]&&(project=observables.pop()),1===observables.length&&isArray_1.isArray(observables[0])&&(observables=observables[0]),new ArrayObservable_1.ArrayObservable(observables,scheduler).lift(new combineLatest_1.CombineLatestOperator(project))}var isScheduler_1=__webpack_require__(15),isArray_1=__webpack_require__(14),ArrayObservable_1=__webpack_require__(13),combineLatest_1=__webpack_require__(52);exports.combineLatest=combineLatest},function(module,exports,__webpack_require__){"use strict";var concat_1=__webpack_require__(53);exports.concat=concat_1.concatStatic},function(module,exports,__webpack_require__){"use strict";var DeferObservable_1=__webpack_require__(283);exports.defer=DeferObservable_1.DeferObservable.create},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subject_1=__webpack_require__(6),Subscriber_1=__webpack_require__(1),Observable_1=__webpack_require__(0),Subscription_1=__webpack_require__(5),root_1=__webpack_require__(8),ReplaySubject_1=__webpack_require__(50),tryCatch_1=__webpack_require__(9),errorObject_1=__webpack_require__(7),assign_1=__webpack_require__(422),WebSocketSubject=function(_super){function WebSocketSubject(urlConfigOrSource,destination){if(urlConfigOrSource instanceof Observable_1.Observable)_super.call(this,destination,urlConfigOrSource);else{if(_super.call(this),this.WebSocketCtor=root_1.root.WebSocket,this._output=new Subject_1.Subject,"string"==typeof urlConfigOrSource?this.url=urlConfigOrSource:assign_1.assign(this,urlConfigOrSource),!this.WebSocketCtor)throw new Error("no WebSocket constructor can be found");this.destination=new ReplaySubject_1.ReplaySubject}}return __extends(WebSocketSubject,_super),WebSocketSubject.prototype.resultSelector=function(e){return JSON.parse(e.data)},WebSocketSubject.create=function(urlConfigOrSource){return new WebSocketSubject(urlConfigOrSource)},WebSocketSubject.prototype.lift=function(operator){var sock=new WebSocketSubject(this,this.destination);return sock.operator=operator,sock},WebSocketSubject.prototype._resetState=function(){this.socket=null,this.source||(this.destination=new ReplaySubject_1.ReplaySubject),this._output=new Subject_1.Subject},WebSocketSubject.prototype.multiplex=function(subMsg,unsubMsg,messageFilter){var self=this;return new Observable_1.Observable(function(observer){var result=tryCatch_1.tryCatch(subMsg)();result===errorObject_1.errorObject?observer.error(errorObject_1.errorObject.e):self.next(result);var subscription=self.subscribe(function(x){var result=tryCatch_1.tryCatch(messageFilter)(x);result===errorObject_1.errorObject?observer.error(errorObject_1.errorObject.e):result&&observer.next(x)},function(err){return observer.error(err)},function(){return observer.complete()});return function(){var result=tryCatch_1.tryCatch(unsubMsg)();result===errorObject_1.errorObject?observer.error(errorObject_1.errorObject.e):self.next(result),subscription.unsubscribe()}})},WebSocketSubject.prototype._connectSocket=function(){var _this=this,WebSocketCtor=this.WebSocketCtor,observer=this._output,socket=null;try{socket=this.protocol?new WebSocketCtor(this.url,this.protocol):new WebSocketCtor(this.url),this.socket=socket,this.binaryType&&(this.socket.binaryType=this.binaryType)}catch(e){return void observer.error(e)}var subscription=new Subscription_1.Subscription(function(){_this.socket=null,socket&&1===socket.readyState&&socket.close()});socket.onopen=function(e){var openObserver=_this.openObserver;openObserver&&openObserver.next(e);var queue=_this.destination;_this.destination=Subscriber_1.Subscriber.create(function(x){return 1===socket.readyState&&socket.send(x)},function(e){var closingObserver=_this.closingObserver;closingObserver&&closingObserver.next(void 0),e&&e.code?socket.close(e.code,e.reason):observer.error(new TypeError("WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }")),_this._resetState()},function(){var closingObserver=_this.closingObserver;closingObserver&&closingObserver.next(void 0),socket.close(),_this._resetState()}),queue&&queue instanceof ReplaySubject_1.ReplaySubject&&subscription.add(queue.subscribe(_this.destination))},socket.onerror=function(e){_this._resetState(),observer.error(e)},socket.onclose=function(e){_this._resetState();var closeObserver=_this.closeObserver;closeObserver&&closeObserver.next(e),e.wasClean?observer.complete():observer.error(e)},socket.onmessage=function(e){var result=tryCatch_1.tryCatch(_this.resultSelector)(e);result===errorObject_1.errorObject?observer.error(errorObject_1.errorObject.e):observer.next(result)}},WebSocketSubject.prototype._subscribe=function(subscriber){var _this=this,source=this.source;if(source)return source.subscribe(subscriber);this.socket||this._connectSocket();var subscription=new Subscription_1.Subscription;return subscription.add(this._output.subscribe(subscriber)),subscription.add(function(){var socket=_this.socket;0===_this._output.observers.length&&(socket&&1===socket.readyState&&socket.close(),_this._resetState())}),subscription},WebSocketSubject.prototype.unsubscribe=function(){var _a=this,source=_a.source,socket=_a.socket;socket&&1===socket.readyState&&(socket.close(),this._resetState()),_super.prototype.unsubscribe.call(this),source||(this.destination=new ReplaySubject_1.ReplaySubject)},WebSocketSubject}(Subject_1.AnonymousSubject);exports.WebSocketSubject=WebSocketSubject},function(module,exports,__webpack_require__){"use strict";var AjaxObservable_1=__webpack_require__(76);exports.ajax=AjaxObservable_1.AjaxObservable.create},function(module,exports,__webpack_require__){"use strict";var WebSocketSubject_1=__webpack_require__(303);exports.webSocket=WebSocketSubject_1.WebSocketSubject.create},function(module,exports,__webpack_require__){"use strict";var EmptyObservable_1=__webpack_require__(17);exports.empty=EmptyObservable_1.EmptyObservable.create},function(module,exports,__webpack_require__){"use strict";var ForkJoinObservable_1=__webpack_require__(285);exports.forkJoin=ForkJoinObservable_1.ForkJoinObservable.create},function(module,exports,__webpack_require__){"use strict";var FromObservable_1=__webpack_require__(74);exports.from=FromObservable_1.FromObservable.create},function(module,exports,__webpack_require__){"use strict";var FromEventObservable_1=__webpack_require__(286);exports.fromEvent=FromEventObservable_1.FromEventObservable.create},function(module,exports,__webpack_require__){"use strict";var FromEventPatternObservable_1=__webpack_require__(287);exports.fromEventPattern=FromEventPatternObservable_1.FromEventPatternObservable.create},function(module,exports,__webpack_require__){"use strict";var PromiseObservable_1=__webpack_require__(75);exports.fromPromise=PromiseObservable_1.PromiseObservable.create},function(module,exports,__webpack_require__){"use strict";var IfObservable_1=__webpack_require__(289);exports._if=IfObservable_1.IfObservable.create},function(module,exports,__webpack_require__){"use strict";var IntervalObservable_1=__webpack_require__(290);exports.interval=IntervalObservable_1.IntervalObservable.create},function(module,exports,__webpack_require__){"use strict";var merge_1=__webpack_require__(80);exports.merge=merge_1.mergeStatic},function(module,exports,__webpack_require__){"use strict";var NeverObservable_1=__webpack_require__(292);exports.never=NeverObservable_1.NeverObservable.create},function(module,exports,__webpack_require__){"use strict";var ArrayObservable_1=__webpack_require__(13);exports.of=ArrayObservable_1.ArrayObservable.of},function(module,exports,__webpack_require__){"use strict";var PairsObservable_1=__webpack_require__(293);exports.pairs=PairsObservable_1.PairsObservable.create},function(module,exports,__webpack_require__){"use strict";var RangeObservable_1=__webpack_require__(294);exports.range=RangeObservable_1.RangeObservable.create},function(module,exports,__webpack_require__){"use strict";var ErrorObservable_1=__webpack_require__(284);exports._throw=ErrorObservable_1.ErrorObservable.create},function(module,exports,__webpack_require__){"use strict";var TimerObservable_1=__webpack_require__(296);exports.timer=TimerObservable_1.TimerObservable.create},function(module,exports,__webpack_require__){"use strict";var UsingObservable_1=__webpack_require__(297);exports.using=UsingObservable_1.UsingObservable.create},function(module,exports,__webpack_require__){"use strict";var zip_1=__webpack_require__(57);exports.zip=zip_1.zipStatic},function(module,exports,__webpack_require__){"use strict";function audit(durationSelector){return this.lift(new AuditOperator(durationSelector))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},tryCatch_1=__webpack_require__(9),errorObject_1=__webpack_require__(7),OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.audit=audit;var AuditOperator=function(){function AuditOperator(durationSelector){this.durationSelector=durationSelector}return AuditOperator.prototype.call=function(subscriber,source){return source.subscribe(new AuditSubscriber(subscriber,this.durationSelector))},AuditOperator}(),AuditSubscriber=function(_super){function AuditSubscriber(destination,durationSelector){_super.call(this,destination),this.durationSelector=durationSelector,this.hasValue=!1}return __extends(AuditSubscriber,_super),AuditSubscriber.prototype._next=function(value){if(this.value=value,this.hasValue=!0,!this.throttled){var duration=tryCatch_1.tryCatch(this.durationSelector)(value);duration===errorObject_1.errorObject?this.destination.error(errorObject_1.errorObject.e):this.add(this.throttled=subscribeToResult_1.subscribeToResult(this,duration))}},AuditSubscriber.prototype.clearThrottle=function(){var _a=this,value=_a.value,hasValue=_a.hasValue,throttled=_a.throttled;throttled&&(this.remove(throttled),this.throttled=null,throttled.unsubscribe()),hasValue&&(this.value=null,this.hasValue=!1,this.destination.next(value))},AuditSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex){this.clearThrottle()},AuditSubscriber.prototype.notifyComplete=function(){this.clearThrottle()},AuditSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function auditTime(duration,scheduler){return void 0===scheduler&&(scheduler=async_1.async),this.lift(new AuditTimeOperator(duration,scheduler))}function dispatchNext(subscriber){subscriber.clearThrottle()}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},async_1=__webpack_require__(10),Subscriber_1=__webpack_require__(1);exports.auditTime=auditTime;var AuditTimeOperator=function(){function AuditTimeOperator(duration,scheduler){this.duration=duration,this.scheduler=scheduler}return AuditTimeOperator.prototype.call=function(subscriber,source){return source.subscribe(new AuditTimeSubscriber(subscriber,this.duration,this.scheduler))},AuditTimeOperator}(),AuditTimeSubscriber=function(_super){function AuditTimeSubscriber(destination,duration,scheduler){_super.call(this,destination),this.duration=duration,this.scheduler=scheduler,this.hasValue=!1}return __extends(AuditTimeSubscriber,_super),AuditTimeSubscriber.prototype._next=function(value){this.value=value,this.hasValue=!0,this.throttled||this.add(this.throttled=this.scheduler.schedule(dispatchNext,this.duration,this))},AuditTimeSubscriber.prototype.clearThrottle=function(){var _a=this,value=_a.value,hasValue=_a.hasValue,throttled=_a.throttled;throttled&&(this.remove(throttled),this.throttled=null,throttled.unsubscribe()),hasValue&&(this.value=null,this.hasValue=!1,this.destination.next(value))},AuditTimeSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function buffer(closingNotifier){return this.lift(new BufferOperator(closingNotifier))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.buffer=buffer;var BufferOperator=function(){function BufferOperator(closingNotifier){this.closingNotifier=closingNotifier}return BufferOperator.prototype.call=function(subscriber,source){return source.subscribe(new BufferSubscriber(subscriber,this.closingNotifier))},BufferOperator}(),BufferSubscriber=function(_super){function BufferSubscriber(destination,closingNotifier){_super.call(this,destination),this.buffer=[],this.add(subscribeToResult_1.subscribeToResult(this,closingNotifier))}return __extends(BufferSubscriber,_super),BufferSubscriber.prototype._next=function(value){this.buffer.push(value)},BufferSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){var buffer=this.buffer;this.buffer=[],this.destination.next(buffer)},BufferSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function bufferCount(bufferSize,startBufferEvery){return void 0===startBufferEvery&&(startBufferEvery=null),this.lift(new BufferCountOperator(bufferSize,startBufferEvery))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1);exports.bufferCount=bufferCount;var BufferCountOperator=function(){function BufferCountOperator(bufferSize,startBufferEvery){this.bufferSize=bufferSize,this.startBufferEvery=startBufferEvery}return BufferCountOperator.prototype.call=function(subscriber,source){return source.subscribe(new BufferCountSubscriber(subscriber,this.bufferSize,this.startBufferEvery))},BufferCountOperator}(),BufferCountSubscriber=function(_super){function BufferCountSubscriber(destination,bufferSize,startBufferEvery){_super.call(this,destination),this.bufferSize=bufferSize,this.startBufferEvery=startBufferEvery,this.buffers=[],this.count=0}return __extends(BufferCountSubscriber,_super),BufferCountSubscriber.prototype._next=function(value){var count=this.count++,_a=this,destination=_a.destination,bufferSize=_a.bufferSize,startBufferEvery=_a.startBufferEvery,buffers=_a.buffers,startOn=null==startBufferEvery?bufferSize:startBufferEvery;count%startOn===0&&buffers.push([]);for(var i=buffers.length;i--;){var buffer=buffers[i];buffer.push(value),buffer.length===bufferSize&&(buffers.splice(i,1),destination.next(buffer))}},BufferCountSubscriber.prototype._complete=function(){for(var destination=this.destination,buffers=this.buffers;buffers.length>0;){var buffer=buffers.shift();buffer.length>0&&destination.next(buffer)}_super.prototype._complete.call(this)},BufferCountSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function bufferTime(bufferTimeSpan){var length=arguments.length,scheduler=async_1.async;isScheduler_1.isScheduler(arguments[arguments.length-1])&&(scheduler=arguments[arguments.length-1],length--);var bufferCreationInterval=null;length>=2&&(bufferCreationInterval=arguments[1]);var maxBufferSize=Number.POSITIVE_INFINITY;return length>=3&&(maxBufferSize=arguments[2]),this.lift(new BufferTimeOperator(bufferTimeSpan,bufferCreationInterval,maxBufferSize,scheduler))}function dispatchBufferTimeSpanOnly(state){var subscriber=state.subscriber,prevContext=state.context;prevContext&&subscriber.closeContext(prevContext),subscriber.closed||(state.context=subscriber.openContext(),state.context.closeAction=this.schedule(state,state.bufferTimeSpan))}function dispatchBufferCreation(state){var bufferCreationInterval=state.bufferCreationInterval,bufferTimeSpan=state.bufferTimeSpan,subscriber=state.subscriber,scheduler=state.scheduler,context=subscriber.openContext(),action=this;subscriber.closed||(subscriber.add(context.closeAction=scheduler.schedule(dispatchBufferClose,bufferTimeSpan,{subscriber:subscriber,context:context})),action.schedule(state,bufferCreationInterval))}function dispatchBufferClose(arg){var subscriber=arg.subscriber,context=arg.context;subscriber.closeContext(context)}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},async_1=__webpack_require__(10),Subscriber_1=__webpack_require__(1),isScheduler_1=__webpack_require__(15);exports.bufferTime=bufferTime;var BufferTimeOperator=function(){function BufferTimeOperator(bufferTimeSpan,bufferCreationInterval,maxBufferSize,scheduler){this.bufferTimeSpan=bufferTimeSpan,this.bufferCreationInterval=bufferCreationInterval,this.maxBufferSize=maxBufferSize,this.scheduler=scheduler}return BufferTimeOperator.prototype.call=function(subscriber,source){return source.subscribe(new BufferTimeSubscriber(subscriber,this.bufferTimeSpan,this.bufferCreationInterval,this.maxBufferSize,this.scheduler))},BufferTimeOperator}(),Context=function(){function Context(){this.buffer=[]}return Context}(),BufferTimeSubscriber=function(_super){function BufferTimeSubscriber(destination,bufferTimeSpan,bufferCreationInterval,maxBufferSize,scheduler){_super.call(this,destination),this.bufferTimeSpan=bufferTimeSpan,this.bufferCreationInterval=bufferCreationInterval,this.maxBufferSize=maxBufferSize,this.scheduler=scheduler,this.contexts=[];var context=this.openContext();if(this.timespanOnly=null==bufferCreationInterval||bufferCreationInterval<0,this.timespanOnly){var timeSpanOnlyState={subscriber:this,context:context,bufferTimeSpan:bufferTimeSpan};this.add(context.closeAction=scheduler.schedule(dispatchBufferTimeSpanOnly,bufferTimeSpan,timeSpanOnlyState))}else{var closeState={subscriber:this,context:context},creationState={bufferTimeSpan:bufferTimeSpan,bufferCreationInterval:bufferCreationInterval,subscriber:this,scheduler:scheduler};this.add(context.closeAction=scheduler.schedule(dispatchBufferClose,bufferTimeSpan,closeState)),this.add(scheduler.schedule(dispatchBufferCreation,bufferCreationInterval,creationState))}}return __extends(BufferTimeSubscriber,_super),BufferTimeSubscriber.prototype._next=function(value){for(var filledBufferContext,contexts=this.contexts,len=contexts.length,i=0;i<len;i++){var context=contexts[i],buffer=context.buffer;buffer.push(value),buffer.length==this.maxBufferSize&&(filledBufferContext=context)}filledBufferContext&&this.onBufferFull(filledBufferContext)},BufferTimeSubscriber.prototype._error=function(err){this.contexts.length=0,_super.prototype._error.call(this,err)},BufferTimeSubscriber.prototype._complete=function(){for(var _a=this,contexts=_a.contexts,destination=_a.destination;contexts.length>0;){var context=contexts.shift();destination.next(context.buffer)}_super.prototype._complete.call(this)},BufferTimeSubscriber.prototype._unsubscribe=function(){this.contexts=null},BufferTimeSubscriber.prototype.onBufferFull=function(context){this.closeContext(context);var closeAction=context.closeAction;if(closeAction.unsubscribe(),this.remove(closeAction),!this.closed&&this.timespanOnly){context=this.openContext();var bufferTimeSpan=this.bufferTimeSpan,timeSpanOnlyState={subscriber:this,context:context,bufferTimeSpan:bufferTimeSpan};this.add(context.closeAction=this.scheduler.schedule(dispatchBufferTimeSpanOnly,bufferTimeSpan,timeSpanOnlyState))}},BufferTimeSubscriber.prototype.openContext=function(){var context=new Context;return this.contexts.push(context),context},BufferTimeSubscriber.prototype.closeContext=function(context){this.destination.next(context.buffer);var contexts=this.contexts,spliceIndex=contexts?contexts.indexOf(context):-1;spliceIndex>=0&&contexts.splice(contexts.indexOf(context),1)},BufferTimeSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function bufferToggle(openings,closingSelector){return this.lift(new BufferToggleOperator(openings,closingSelector))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscription_1=__webpack_require__(5),subscribeToResult_1=__webpack_require__(3),OuterSubscriber_1=__webpack_require__(2);exports.bufferToggle=bufferToggle;var BufferToggleOperator=function(){function BufferToggleOperator(openings,closingSelector){this.openings=openings,this.closingSelector=closingSelector}return BufferToggleOperator.prototype.call=function(subscriber,source){return source.subscribe(new BufferToggleSubscriber(subscriber,this.openings,this.closingSelector))},BufferToggleOperator}(),BufferToggleSubscriber=function(_super){function BufferToggleSubscriber(destination,openings,closingSelector){_super.call(this,destination),this.openings=openings,this.closingSelector=closingSelector,this.contexts=[],this.add(subscribeToResult_1.subscribeToResult(this,openings))}return __extends(BufferToggleSubscriber,_super),BufferToggleSubscriber.prototype._next=function(value){for(var contexts=this.contexts,len=contexts.length,i=0;i<len;i++)contexts[i].buffer.push(value)},BufferToggleSubscriber.prototype._error=function(err){for(var contexts=this.contexts;contexts.length>0;){var context=contexts.shift();context.subscription.unsubscribe(),context.buffer=null,context.subscription=null}this.contexts=null,_super.prototype._error.call(this,err)},BufferToggleSubscriber.prototype._complete=function(){for(var contexts=this.contexts;contexts.length>0;){var context=contexts.shift();this.destination.next(context.buffer),context.subscription.unsubscribe(),context.buffer=null,context.subscription=null}this.contexts=null,_super.prototype._complete.call(this)},BufferToggleSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){outerValue?this.closeBuffer(outerValue):this.openBuffer(innerValue)},BufferToggleSubscriber.prototype.notifyComplete=function(innerSub){this.closeBuffer(innerSub.context)},BufferToggleSubscriber.prototype.openBuffer=function(value){try{var closingSelector=this.closingSelector,closingNotifier=closingSelector.call(this,value);closingNotifier&&this.trySubscribe(closingNotifier)}catch(err){this._error(err)}},BufferToggleSubscriber.prototype.closeBuffer=function(context){var contexts=this.contexts;if(contexts&&context){var buffer=context.buffer,subscription=context.subscription;this.destination.next(buffer),contexts.splice(contexts.indexOf(context),1),this.remove(subscription),subscription.unsubscribe()}},BufferToggleSubscriber.prototype.trySubscribe=function(closingNotifier){var contexts=this.contexts,buffer=[],subscription=new Subscription_1.Subscription,context={buffer:buffer,subscription:subscription};contexts.push(context);var innerSubscription=subscribeToResult_1.subscribeToResult(this,closingNotifier,context);!innerSubscription||innerSubscription.closed?this.closeBuffer(context):(innerSubscription.context=context,this.add(innerSubscription),subscription.add(innerSubscription))},BufferToggleSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function bufferWhen(closingSelector){return this.lift(new BufferWhenOperator(closingSelector))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscription_1=__webpack_require__(5),tryCatch_1=__webpack_require__(9),errorObject_1=__webpack_require__(7),OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.bufferWhen=bufferWhen;var BufferWhenOperator=function(){function BufferWhenOperator(closingSelector){this.closingSelector=closingSelector}return BufferWhenOperator.prototype.call=function(subscriber,source){return source.subscribe(new BufferWhenSubscriber(subscriber,this.closingSelector))},BufferWhenOperator}(),BufferWhenSubscriber=function(_super){function BufferWhenSubscriber(destination,closingSelector){_super.call(this,destination),this.closingSelector=closingSelector,this.subscribing=!1,this.openBuffer()}return __extends(BufferWhenSubscriber,_super),BufferWhenSubscriber.prototype._next=function(value){this.buffer.push(value)},BufferWhenSubscriber.prototype._complete=function(){var buffer=this.buffer;buffer&&this.destination.next(buffer),_super.prototype._complete.call(this)},BufferWhenSubscriber.prototype._unsubscribe=function(){this.buffer=null,this.subscribing=!1},BufferWhenSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this.openBuffer()},BufferWhenSubscriber.prototype.notifyComplete=function(){this.subscribing?this.complete():this.openBuffer()},BufferWhenSubscriber.prototype.openBuffer=function(){var closingSubscription=this.closingSubscription;closingSubscription&&(this.remove(closingSubscription),closingSubscription.unsubscribe());var buffer=this.buffer;this.buffer&&this.destination.next(buffer),this.buffer=[];var closingNotifier=tryCatch_1.tryCatch(this.closingSelector)();closingNotifier===errorObject_1.errorObject?this.error(errorObject_1.errorObject.e):(closingSubscription=new Subscription_1.Subscription,this.closingSubscription=closingSubscription,this.add(closingSubscription),this.subscribing=!0,closingSubscription.add(subscribeToResult_1.subscribeToResult(this,closingNotifier)),this.subscribing=!1)},BufferWhenSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function _catch(selector){var operator=new CatchOperator(selector),caught=this.lift(operator);return operator.caught=caught}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __);
},OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports._catch=_catch;var CatchOperator=function(){function CatchOperator(selector){this.selector=selector}return CatchOperator.prototype.call=function(subscriber,source){return source.subscribe(new CatchSubscriber(subscriber,this.selector,this.caught))},CatchOperator}(),CatchSubscriber=function(_super){function CatchSubscriber(destination,selector,caught){_super.call(this,destination),this.selector=selector,this.caught=caught}return __extends(CatchSubscriber,_super),CatchSubscriber.prototype.error=function(err){if(!this.isStopped){var result=void 0;try{result=this.selector(err,this.caught)}catch(err2){return void _super.prototype.error.call(this,err2)}this._unsubscribeAndRecycle(),this.add(subscribeToResult_1.subscribeToResult(this,result))}},CatchSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function combineAll(project){return this.lift(new combineLatest_1.CombineLatestOperator(project))}var combineLatest_1=__webpack_require__(52);exports.combineAll=combineAll},function(module,exports,__webpack_require__){"use strict";function concatAll(){return this.lift(new mergeAll_1.MergeAllOperator(1))}var mergeAll_1=__webpack_require__(31);exports.concatAll=concatAll},function(module,exports,__webpack_require__){"use strict";function concatMap(project,resultSelector){return this.lift(new mergeMap_1.MergeMapOperator(project,resultSelector,1))}var mergeMap_1=__webpack_require__(81);exports.concatMap=concatMap},function(module,exports,__webpack_require__){"use strict";function concatMapTo(innerObservable,resultSelector){return this.lift(new mergeMapTo_1.MergeMapToOperator(innerObservable,resultSelector,1))}var mergeMapTo_1=__webpack_require__(82);exports.concatMapTo=concatMapTo},function(module,exports,__webpack_require__){"use strict";function count(predicate){return this.lift(new CountOperator(predicate,this))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1);exports.count=count;var CountOperator=function(){function CountOperator(predicate,source){this.predicate=predicate,this.source=source}return CountOperator.prototype.call=function(subscriber,source){return source.subscribe(new CountSubscriber(subscriber,this.predicate,this.source))},CountOperator}(),CountSubscriber=function(_super){function CountSubscriber(destination,predicate,source){_super.call(this,destination),this.predicate=predicate,this.source=source,this.count=0,this.index=0}return __extends(CountSubscriber,_super),CountSubscriber.prototype._next=function(value){this.predicate?this._tryPredicate(value):this.count++},CountSubscriber.prototype._tryPredicate=function(value){var result;try{result=this.predicate(value,this.index++,this.source)}catch(err){return void this.destination.error(err)}result&&this.count++},CountSubscriber.prototype._complete=function(){this.destination.next(this.count),this.destination.complete()},CountSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function debounce(durationSelector){return this.lift(new DebounceOperator(durationSelector))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.debounce=debounce;var DebounceOperator=function(){function DebounceOperator(durationSelector){this.durationSelector=durationSelector}return DebounceOperator.prototype.call=function(subscriber,source){return source.subscribe(new DebounceSubscriber(subscriber,this.durationSelector))},DebounceOperator}(),DebounceSubscriber=function(_super){function DebounceSubscriber(destination,durationSelector){_super.call(this,destination),this.durationSelector=durationSelector,this.hasValue=!1,this.durationSubscription=null}return __extends(DebounceSubscriber,_super),DebounceSubscriber.prototype._next=function(value){try{var result=this.durationSelector.call(this,value);result&&this._tryNext(value,result)}catch(err){this.destination.error(err)}},DebounceSubscriber.prototype._complete=function(){this.emitValue(),this.destination.complete()},DebounceSubscriber.prototype._tryNext=function(value,duration){var subscription=this.durationSubscription;this.value=value,this.hasValue=!0,subscription&&(subscription.unsubscribe(),this.remove(subscription)),subscription=subscribeToResult_1.subscribeToResult(this,duration),subscription.closed||this.add(this.durationSubscription=subscription)},DebounceSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this.emitValue()},DebounceSubscriber.prototype.notifyComplete=function(){this.emitValue()},DebounceSubscriber.prototype.emitValue=function(){if(this.hasValue){var value=this.value,subscription=this.durationSubscription;subscription&&(this.durationSubscription=null,subscription.unsubscribe(),this.remove(subscription)),this.value=null,this.hasValue=!1,_super.prototype._next.call(this,value)}},DebounceSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function debounceTime(dueTime,scheduler){return void 0===scheduler&&(scheduler=async_1.async),this.lift(new DebounceTimeOperator(dueTime,scheduler))}function dispatchNext(subscriber){subscriber.debouncedNext()}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),async_1=__webpack_require__(10);exports.debounceTime=debounceTime;var DebounceTimeOperator=function(){function DebounceTimeOperator(dueTime,scheduler){this.dueTime=dueTime,this.scheduler=scheduler}return DebounceTimeOperator.prototype.call=function(subscriber,source){return source.subscribe(new DebounceTimeSubscriber(subscriber,this.dueTime,this.scheduler))},DebounceTimeOperator}(),DebounceTimeSubscriber=function(_super){function DebounceTimeSubscriber(destination,dueTime,scheduler){_super.call(this,destination),this.dueTime=dueTime,this.scheduler=scheduler,this.debouncedSubscription=null,this.lastValue=null,this.hasValue=!1}return __extends(DebounceTimeSubscriber,_super),DebounceTimeSubscriber.prototype._next=function(value){this.clearDebounce(),this.lastValue=value,this.hasValue=!0,this.add(this.debouncedSubscription=this.scheduler.schedule(dispatchNext,this.dueTime,this))},DebounceTimeSubscriber.prototype._complete=function(){this.debouncedNext(),this.destination.complete()},DebounceTimeSubscriber.prototype.debouncedNext=function(){this.clearDebounce(),this.hasValue&&(this.destination.next(this.lastValue),this.lastValue=null,this.hasValue=!1)},DebounceTimeSubscriber.prototype.clearDebounce=function(){var debouncedSubscription=this.debouncedSubscription;null!==debouncedSubscription&&(this.remove(debouncedSubscription),debouncedSubscription.unsubscribe(),this.debouncedSubscription=null)},DebounceTimeSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function defaultIfEmpty(defaultValue){return void 0===defaultValue&&(defaultValue=null),this.lift(new DefaultIfEmptyOperator(defaultValue))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1);exports.defaultIfEmpty=defaultIfEmpty;var DefaultIfEmptyOperator=function(){function DefaultIfEmptyOperator(defaultValue){this.defaultValue=defaultValue}return DefaultIfEmptyOperator.prototype.call=function(subscriber,source){return source.subscribe(new DefaultIfEmptySubscriber(subscriber,this.defaultValue))},DefaultIfEmptyOperator}(),DefaultIfEmptySubscriber=function(_super){function DefaultIfEmptySubscriber(destination,defaultValue){_super.call(this,destination),this.defaultValue=defaultValue,this.isEmpty=!0}return __extends(DefaultIfEmptySubscriber,_super),DefaultIfEmptySubscriber.prototype._next=function(value){this.isEmpty=!1,this.destination.next(value)},DefaultIfEmptySubscriber.prototype._complete=function(){this.isEmpty&&this.destination.next(this.defaultValue),this.destination.complete()},DefaultIfEmptySubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function delay(delay,scheduler){void 0===scheduler&&(scheduler=async_1.async);var absoluteDelay=isDate_1.isDate(delay),delayFor=absoluteDelay?+delay-scheduler.now():Math.abs(delay);return this.lift(new DelayOperator(delayFor,scheduler))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},async_1=__webpack_require__(10),isDate_1=__webpack_require__(37),Subscriber_1=__webpack_require__(1),Notification_1=__webpack_require__(22);exports.delay=delay;var DelayOperator=function(){function DelayOperator(delay,scheduler){this.delay=delay,this.scheduler=scheduler}return DelayOperator.prototype.call=function(subscriber,source){return source.subscribe(new DelaySubscriber(subscriber,this.delay,this.scheduler))},DelayOperator}(),DelaySubscriber=function(_super){function DelaySubscriber(destination,delay,scheduler){_super.call(this,destination),this.delay=delay,this.scheduler=scheduler,this.queue=[],this.active=!1,this.errored=!1}return __extends(DelaySubscriber,_super),DelaySubscriber.dispatch=function(state){for(var source=state.source,queue=source.queue,scheduler=state.scheduler,destination=state.destination;queue.length>0&&queue[0].time-scheduler.now()<=0;)queue.shift().notification.observe(destination);if(queue.length>0){var delay_1=Math.max(0,queue[0].time-scheduler.now());this.schedule(state,delay_1)}else source.active=!1},DelaySubscriber.prototype._schedule=function(scheduler){this.active=!0,this.add(scheduler.schedule(DelaySubscriber.dispatch,this.delay,{source:this,destination:this.destination,scheduler:scheduler}))},DelaySubscriber.prototype.scheduleNotification=function(notification){if(this.errored!==!0){var scheduler=this.scheduler,message=new DelayMessage(scheduler.now()+this.delay,notification);this.queue.push(message),this.active===!1&&this._schedule(scheduler)}},DelaySubscriber.prototype._next=function(value){this.scheduleNotification(Notification_1.Notification.createNext(value))},DelaySubscriber.prototype._error=function(err){this.errored=!0,this.queue=[],this.destination.error(err)},DelaySubscriber.prototype._complete=function(){this.scheduleNotification(Notification_1.Notification.createComplete())},DelaySubscriber}(Subscriber_1.Subscriber),DelayMessage=function(){function DelayMessage(time,notification){this.time=time,this.notification=notification}return DelayMessage}()},function(module,exports,__webpack_require__){"use strict";function delayWhen(delayDurationSelector,subscriptionDelay){return subscriptionDelay?new SubscriptionDelayObservable(this,subscriptionDelay).lift(new DelayWhenOperator(delayDurationSelector)):this.lift(new DelayWhenOperator(delayDurationSelector))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),Observable_1=__webpack_require__(0),OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.delayWhen=delayWhen;var DelayWhenOperator=function(){function DelayWhenOperator(delayDurationSelector){this.delayDurationSelector=delayDurationSelector}return DelayWhenOperator.prototype.call=function(subscriber,source){return source.subscribe(new DelayWhenSubscriber(subscriber,this.delayDurationSelector))},DelayWhenOperator}(),DelayWhenSubscriber=function(_super){function DelayWhenSubscriber(destination,delayDurationSelector){_super.call(this,destination),this.delayDurationSelector=delayDurationSelector,this.completed=!1,this.delayNotifierSubscriptions=[],this.values=[]}return __extends(DelayWhenSubscriber,_super),DelayWhenSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this.destination.next(outerValue),this.removeSubscription(innerSub),this.tryComplete()},DelayWhenSubscriber.prototype.notifyError=function(error,innerSub){this._error(error)},DelayWhenSubscriber.prototype.notifyComplete=function(innerSub){var value=this.removeSubscription(innerSub);value&&this.destination.next(value),this.tryComplete()},DelayWhenSubscriber.prototype._next=function(value){try{var delayNotifier=this.delayDurationSelector(value);delayNotifier&&this.tryDelay(delayNotifier,value)}catch(err){this.destination.error(err)}},DelayWhenSubscriber.prototype._complete=function(){this.completed=!0,this.tryComplete()},DelayWhenSubscriber.prototype.removeSubscription=function(subscription){subscription.unsubscribe();var subscriptionIdx=this.delayNotifierSubscriptions.indexOf(subscription),value=null;return subscriptionIdx!==-1&&(value=this.values[subscriptionIdx],this.delayNotifierSubscriptions.splice(subscriptionIdx,1),this.values.splice(subscriptionIdx,1)),value},DelayWhenSubscriber.prototype.tryDelay=function(delayNotifier,value){var notifierSubscription=subscribeToResult_1.subscribeToResult(this,delayNotifier,value);this.add(notifierSubscription),this.delayNotifierSubscriptions.push(notifierSubscription),this.values.push(value)},DelayWhenSubscriber.prototype.tryComplete=function(){this.completed&&0===this.delayNotifierSubscriptions.length&&this.destination.complete()},DelayWhenSubscriber}(OuterSubscriber_1.OuterSubscriber),SubscriptionDelayObservable=function(_super){function SubscriptionDelayObservable(source,subscriptionDelay){_super.call(this),this.source=source,this.subscriptionDelay=subscriptionDelay}return __extends(SubscriptionDelayObservable,_super),SubscriptionDelayObservable.prototype._subscribe=function(subscriber){this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber,this.source))},SubscriptionDelayObservable}(Observable_1.Observable),SubscriptionDelaySubscriber=function(_super){function SubscriptionDelaySubscriber(parent,source){_super.call(this),this.parent=parent,this.source=source,this.sourceSubscribed=!1}return __extends(SubscriptionDelaySubscriber,_super),SubscriptionDelaySubscriber.prototype._next=function(unused){this.subscribeToSource()},SubscriptionDelaySubscriber.prototype._error=function(err){this.unsubscribe(),this.parent.error(err)},SubscriptionDelaySubscriber.prototype._complete=function(){this.subscribeToSource()},SubscriptionDelaySubscriber.prototype.subscribeToSource=function(){this.sourceSubscribed||(this.sourceSubscribed=!0,this.unsubscribe(),this.source.subscribe(this.parent))},SubscriptionDelaySubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function dematerialize(){return this.lift(new DeMaterializeOperator)}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1);exports.dematerialize=dematerialize;var DeMaterializeOperator=function(){function DeMaterializeOperator(){}return DeMaterializeOperator.prototype.call=function(subscriber,source){return source.subscribe(new DeMaterializeSubscriber(subscriber))},DeMaterializeOperator}(),DeMaterializeSubscriber=function(_super){function DeMaterializeSubscriber(destination){_super.call(this,destination)}return __extends(DeMaterializeSubscriber,_super),DeMaterializeSubscriber.prototype._next=function(value){value.observe(this.destination)},DeMaterializeSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function distinct(keySelector,flushes){return this.lift(new DistinctOperator(keySelector,flushes))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3),Set_1=__webpack_require__(421);exports.distinct=distinct;var DistinctOperator=function(){function DistinctOperator(keySelector,flushes){this.keySelector=keySelector,this.flushes=flushes}return DistinctOperator.prototype.call=function(subscriber,source){return source.subscribe(new DistinctSubscriber(subscriber,this.keySelector,this.flushes))},DistinctOperator}(),DistinctSubscriber=function(_super){function DistinctSubscriber(destination,keySelector,flushes){_super.call(this,destination),this.keySelector=keySelector,this.values=new Set_1.Set,flushes&&this.add(subscribeToResult_1.subscribeToResult(this,flushes))}return __extends(DistinctSubscriber,_super),DistinctSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this.values.clear()},DistinctSubscriber.prototype.notifyError=function(error,innerSub){this._error(error)},DistinctSubscriber.prototype._next=function(value){this.keySelector?this._useKeySelector(value):this._finalizeNext(value,value)},DistinctSubscriber.prototype._useKeySelector=function(value){var key,destination=this.destination;try{key=this.keySelector(value)}catch(err){return void destination.error(err)}this._finalizeNext(key,value)},DistinctSubscriber.prototype._finalizeNext=function(key,value){var values=this.values;values.has(key)||(values.add(key),this.destination.next(value))},DistinctSubscriber}(OuterSubscriber_1.OuterSubscriber);exports.DistinctSubscriber=DistinctSubscriber},function(module,exports,__webpack_require__){"use strict";function distinctUntilKeyChanged(key,compare){return distinctUntilChanged_1.distinctUntilChanged.call(this,function(x,y){return compare?compare(x[key],y[key]):x[key]===y[key]})}var distinctUntilChanged_1=__webpack_require__(77);exports.distinctUntilKeyChanged=distinctUntilKeyChanged},function(module,exports,__webpack_require__){"use strict";function _do(nextOrObserver,error,complete){return this.lift(new DoOperator(nextOrObserver,error,complete))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1);exports._do=_do;var DoOperator=function(){function DoOperator(nextOrObserver,error,complete){this.nextOrObserver=nextOrObserver,this.error=error,this.complete=complete}return DoOperator.prototype.call=function(subscriber,source){return source.subscribe(new DoSubscriber(subscriber,this.nextOrObserver,this.error,this.complete))},DoOperator}(),DoSubscriber=function(_super){function DoSubscriber(destination,nextOrObserver,error,complete){_super.call(this,destination);var safeSubscriber=new Subscriber_1.Subscriber(nextOrObserver,error,complete);safeSubscriber.syncErrorThrowable=!0,this.add(safeSubscriber),this.safeSubscriber=safeSubscriber}return __extends(DoSubscriber,_super),DoSubscriber.prototype._next=function(value){var safeSubscriber=this.safeSubscriber;safeSubscriber.next(value),safeSubscriber.syncErrorThrown?this.destination.error(safeSubscriber.syncErrorValue):this.destination.next(value)},DoSubscriber.prototype._error=function(err){var safeSubscriber=this.safeSubscriber;safeSubscriber.error(err),safeSubscriber.syncErrorThrown?this.destination.error(safeSubscriber.syncErrorValue):this.destination.error(err)},DoSubscriber.prototype._complete=function(){var safeSubscriber=this.safeSubscriber;safeSubscriber.complete(),safeSubscriber.syncErrorThrown?this.destination.error(safeSubscriber.syncErrorValue):this.destination.complete()},DoSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function elementAt(index,defaultValue){return this.lift(new ElementAtOperator(index,defaultValue))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),ArgumentOutOfRangeError_1=__webpack_require__(34);exports.elementAt=elementAt;var ElementAtOperator=function(){function ElementAtOperator(index,defaultValue){if(this.index=index,this.defaultValue=defaultValue,index<0)throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError}return ElementAtOperator.prototype.call=function(subscriber,source){return source.subscribe(new ElementAtSubscriber(subscriber,this.index,this.defaultValue))},ElementAtOperator}(),ElementAtSubscriber=function(_super){function ElementAtSubscriber(destination,index,defaultValue){_super.call(this,destination),this.index=index,this.defaultValue=defaultValue}return __extends(ElementAtSubscriber,_super),ElementAtSubscriber.prototype._next=function(x){0===this.index--&&(this.destination.next(x),this.destination.complete())},ElementAtSubscriber.prototype._complete=function(){var destination=this.destination;this.index>=0&&("undefined"!=typeof this.defaultValue?destination.next(this.defaultValue):destination.error(new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError)),destination.complete()},ElementAtSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function every(predicate,thisArg){return this.lift(new EveryOperator(predicate,thisArg,this))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1);exports.every=every;var EveryOperator=function(){function EveryOperator(predicate,thisArg,source){this.predicate=predicate,this.thisArg=thisArg,this.source=source}return EveryOperator.prototype.call=function(observer,source){return source.subscribe(new EverySubscriber(observer,this.predicate,this.thisArg,this.source))},EveryOperator}(),EverySubscriber=function(_super){function EverySubscriber(destination,predicate,thisArg,source){_super.call(this,destination),this.predicate=predicate,this.thisArg=thisArg,this.source=source,this.index=0,this.thisArg=thisArg||this}return __extends(EverySubscriber,_super),EverySubscriber.prototype.notifyComplete=function(everyValueMatch){this.destination.next(everyValueMatch),this.destination.complete()},EverySubscriber.prototype._next=function(value){var result=!1;try{result=this.predicate.call(this.thisArg,value,this.index++,this.source)}catch(err){return void this.destination.error(err)}result||this.notifyComplete(!1)},EverySubscriber.prototype._complete=function(){this.notifyComplete(!0)},EverySubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function exhaust(){return this.lift(new SwitchFirstOperator)}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.exhaust=exhaust;var SwitchFirstOperator=function(){function SwitchFirstOperator(){}return SwitchFirstOperator.prototype.call=function(subscriber,source){return source.subscribe(new SwitchFirstSubscriber(subscriber))},SwitchFirstOperator}(),SwitchFirstSubscriber=function(_super){function SwitchFirstSubscriber(destination){_super.call(this,destination),this.hasCompleted=!1,this.hasSubscription=!1}return __extends(SwitchFirstSubscriber,_super),SwitchFirstSubscriber.prototype._next=function(value){this.hasSubscription||(this.hasSubscription=!0,this.add(subscribeToResult_1.subscribeToResult(this,value)))},SwitchFirstSubscriber.prototype._complete=function(){this.hasCompleted=!0,this.hasSubscription||this.destination.complete()},SwitchFirstSubscriber.prototype.notifyComplete=function(innerSub){this.remove(innerSub),this.hasSubscription=!1,this.hasCompleted&&this.destination.complete()},SwitchFirstSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function exhaustMap(project,resultSelector){return this.lift(new SwitchFirstMapOperator(project,resultSelector))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.exhaustMap=exhaustMap;var SwitchFirstMapOperator=function(){function SwitchFirstMapOperator(project,resultSelector){this.project=project,this.resultSelector=resultSelector}return SwitchFirstMapOperator.prototype.call=function(subscriber,source){return source.subscribe(new SwitchFirstMapSubscriber(subscriber,this.project,this.resultSelector))},SwitchFirstMapOperator}(),SwitchFirstMapSubscriber=function(_super){function SwitchFirstMapSubscriber(destination,project,resultSelector){_super.call(this,destination),this.project=project,this.resultSelector=resultSelector,this.hasSubscription=!1,this.hasCompleted=!1,this.index=0}return __extends(SwitchFirstMapSubscriber,_super),SwitchFirstMapSubscriber.prototype._next=function(value){this.hasSubscription||this.tryNext(value)},SwitchFirstMapSubscriber.prototype.tryNext=function(value){var index=this.index++,destination=this.destination;try{var result=this.project(value,index);this.hasSubscription=!0,this.add(subscribeToResult_1.subscribeToResult(this,result,value,index))}catch(err){destination.error(err)}},SwitchFirstMapSubscriber.prototype._complete=function(){this.hasCompleted=!0,this.hasSubscription||this.destination.complete()},SwitchFirstMapSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){var _a=this,resultSelector=_a.resultSelector,destination=_a.destination;resultSelector?this.trySelectResult(outerValue,innerValue,outerIndex,innerIndex):destination.next(innerValue)},SwitchFirstMapSubscriber.prototype.trySelectResult=function(outerValue,innerValue,outerIndex,innerIndex){var _a=this,resultSelector=_a.resultSelector,destination=_a.destination;try{var result=resultSelector(outerValue,innerValue,outerIndex,innerIndex);destination.next(result)}catch(err){destination.error(err)}},SwitchFirstMapSubscriber.prototype.notifyError=function(err){this.destination.error(err)},SwitchFirstMapSubscriber.prototype.notifyComplete=function(innerSub){this.remove(innerSub),this.hasSubscription=!1,this.hasCompleted&&this.destination.complete()},SwitchFirstMapSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function expand(project,concurrent,scheduler){return void 0===concurrent&&(concurrent=Number.POSITIVE_INFINITY),void 0===scheduler&&(scheduler=void 0),concurrent=(concurrent||0)<1?Number.POSITIVE_INFINITY:concurrent,this.lift(new ExpandOperator(project,concurrent,scheduler))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},tryCatch_1=__webpack_require__(9),errorObject_1=__webpack_require__(7),OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.expand=expand;var ExpandOperator=function(){function ExpandOperator(project,concurrent,scheduler){this.project=project,this.concurrent=concurrent,this.scheduler=scheduler}return ExpandOperator.prototype.call=function(subscriber,source){return source.subscribe(new ExpandSubscriber(subscriber,this.project,this.concurrent,this.scheduler))},ExpandOperator}();exports.ExpandOperator=ExpandOperator;var ExpandSubscriber=function(_super){function ExpandSubscriber(destination,project,concurrent,scheduler){_super.call(this,destination),this.project=project,this.concurrent=concurrent,this.scheduler=scheduler,this.index=0,this.active=0,this.hasCompleted=!1,concurrent<Number.POSITIVE_INFINITY&&(this.buffer=[])}return __extends(ExpandSubscriber,_super),ExpandSubscriber.dispatch=function(arg){var subscriber=arg.subscriber,result=arg.result,value=arg.value,index=arg.index;subscriber.subscribeToProjection(result,value,index)},ExpandSubscriber.prototype._next=function(value){var destination=this.destination;if(destination.closed)return void this._complete();var index=this.index++;if(this.active<this.concurrent){destination.next(value);var result=tryCatch_1.tryCatch(this.project)(value,index);if(result===errorObject_1.errorObject)destination.error(errorObject_1.errorObject.e);else if(this.scheduler){var state={subscriber:this,result:result,value:value,index:index};this.add(this.scheduler.schedule(ExpandSubscriber.dispatch,0,state))}else this.subscribeToProjection(result,value,index)}else this.buffer.push(value)},ExpandSubscriber.prototype.subscribeToProjection=function(result,value,index){this.active++,this.add(subscribeToResult_1.subscribeToResult(this,result,value,index))},ExpandSubscriber.prototype._complete=function(){this.hasCompleted=!0,this.hasCompleted&&0===this.active&&this.destination.complete()},ExpandSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this._next(innerValue)},ExpandSubscriber.prototype.notifyComplete=function(innerSub){var buffer=this.buffer;this.remove(innerSub),this.active--,buffer&&buffer.length>0&&this._next(buffer.shift()),this.hasCompleted&&0===this.active&&this.destination.complete()},ExpandSubscriber}(OuterSubscriber_1.OuterSubscriber);exports.ExpandSubscriber=ExpandSubscriber},function(module,exports,__webpack_require__){"use strict";function _finally(callback){return this.lift(new FinallyOperator(callback))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),Subscription_1=__webpack_require__(5);exports._finally=_finally;var FinallyOperator=function(){function FinallyOperator(callback){this.callback=callback}return FinallyOperator.prototype.call=function(subscriber,source){return source.subscribe(new FinallySubscriber(subscriber,this.callback))},FinallyOperator}(),FinallySubscriber=function(_super){function FinallySubscriber(destination,callback){_super.call(this,destination),this.add(new Subscription_1.Subscription(callback))}return __extends(FinallySubscriber,_super),FinallySubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function findIndex(predicate,thisArg){return this.lift(new find_1.FindValueOperator(predicate,this,(!0),thisArg))}var find_1=__webpack_require__(79);exports.findIndex=findIndex},function(module,exports,__webpack_require__){"use strict";function first(predicate,resultSelector,defaultValue){return this.lift(new FirstOperator(predicate,resultSelector,defaultValue,this))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),EmptyError_1=__webpack_require__(35);exports.first=first;var FirstOperator=function(){function FirstOperator(predicate,resultSelector,defaultValue,source){this.predicate=predicate,this.resultSelector=resultSelector,this.defaultValue=defaultValue,this.source=source}return FirstOperator.prototype.call=function(observer,source){
return source.subscribe(new FirstSubscriber(observer,this.predicate,this.resultSelector,this.defaultValue,this.source))},FirstOperator}(),FirstSubscriber=function(_super){function FirstSubscriber(destination,predicate,resultSelector,defaultValue,source){_super.call(this,destination),this.predicate=predicate,this.resultSelector=resultSelector,this.defaultValue=defaultValue,this.source=source,this.index=0,this.hasCompleted=!1,this._emitted=!1}return __extends(FirstSubscriber,_super),FirstSubscriber.prototype._next=function(value){var index=this.index++;this.predicate?this._tryPredicate(value,index):this._emit(value,index)},FirstSubscriber.prototype._tryPredicate=function(value,index){var result;try{result=this.predicate(value,index,this.source)}catch(err){return void this.destination.error(err)}result&&this._emit(value,index)},FirstSubscriber.prototype._emit=function(value,index){return this.resultSelector?void this._tryResultSelector(value,index):void this._emitFinal(value)},FirstSubscriber.prototype._tryResultSelector=function(value,index){var result;try{result=this.resultSelector(value,index)}catch(err){return void this.destination.error(err)}this._emitFinal(result)},FirstSubscriber.prototype._emitFinal=function(value){var destination=this.destination;this._emitted||(this._emitted=!0,destination.next(value),destination.complete(),this.hasCompleted=!0)},FirstSubscriber.prototype._complete=function(){var destination=this.destination;this.hasCompleted||"undefined"==typeof this.defaultValue?this.hasCompleted||destination.error(new EmptyError_1.EmptyError):(destination.next(this.defaultValue),destination.complete())},FirstSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function groupBy(keySelector,elementSelector,durationSelector,subjectSelector){return this.lift(new GroupByOperator(keySelector,elementSelector,durationSelector,subjectSelector))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),Subscription_1=__webpack_require__(5),Observable_1=__webpack_require__(0),Subject_1=__webpack_require__(6),Map_1=__webpack_require__(419),FastMap_1=__webpack_require__(417);exports.groupBy=groupBy;var GroupByOperator=function(){function GroupByOperator(keySelector,elementSelector,durationSelector,subjectSelector){this.keySelector=keySelector,this.elementSelector=elementSelector,this.durationSelector=durationSelector,this.subjectSelector=subjectSelector}return GroupByOperator.prototype.call=function(subscriber,source){return source.subscribe(new GroupBySubscriber(subscriber,this.keySelector,this.elementSelector,this.durationSelector,this.subjectSelector))},GroupByOperator}(),GroupBySubscriber=function(_super){function GroupBySubscriber(destination,keySelector,elementSelector,durationSelector,subjectSelector){_super.call(this,destination),this.keySelector=keySelector,this.elementSelector=elementSelector,this.durationSelector=durationSelector,this.subjectSelector=subjectSelector,this.groups=null,this.attemptedToUnsubscribe=!1,this.count=0}return __extends(GroupBySubscriber,_super),GroupBySubscriber.prototype._next=function(value){var key;try{key=this.keySelector(value)}catch(err){return void this.error(err)}this._group(value,key)},GroupBySubscriber.prototype._group=function(value,key){var groups=this.groups;groups||(groups=this.groups="string"==typeof key?new FastMap_1.FastMap:new Map_1.Map);var element,group=groups.get(key);if(this.elementSelector)try{element=this.elementSelector(value)}catch(err){this.error(err)}else element=value;if(!group){group=this.subjectSelector?this.subjectSelector():new Subject_1.Subject,groups.set(key,group);var groupedObservable=new GroupedObservable(key,group,this);if(this.destination.next(groupedObservable),this.durationSelector){var duration=void 0;try{duration=this.durationSelector(new GroupedObservable(key,group))}catch(err){return void this.error(err)}this.add(duration.subscribe(new GroupDurationSubscriber(key,group,this)))}}group.closed||group.next(element)},GroupBySubscriber.prototype._error=function(err){var groups=this.groups;groups&&(groups.forEach(function(group,key){group.error(err)}),groups.clear()),this.destination.error(err)},GroupBySubscriber.prototype._complete=function(){var groups=this.groups;groups&&(groups.forEach(function(group,key){group.complete()}),groups.clear()),this.destination.complete()},GroupBySubscriber.prototype.removeGroup=function(key){this.groups["delete"](key)},GroupBySubscriber.prototype.unsubscribe=function(){this.closed||(this.attemptedToUnsubscribe=!0,0===this.count&&_super.prototype.unsubscribe.call(this))},GroupBySubscriber}(Subscriber_1.Subscriber),GroupDurationSubscriber=function(_super){function GroupDurationSubscriber(key,group,parent){_super.call(this),this.key=key,this.group=group,this.parent=parent}return __extends(GroupDurationSubscriber,_super),GroupDurationSubscriber.prototype._next=function(value){this._complete()},GroupDurationSubscriber.prototype._error=function(err){var group=this.group;group.closed||group.error(err),this.parent.removeGroup(this.key)},GroupDurationSubscriber.prototype._complete=function(){var group=this.group;group.closed||group.complete(),this.parent.removeGroup(this.key)},GroupDurationSubscriber}(Subscriber_1.Subscriber),GroupedObservable=function(_super){function GroupedObservable(key,groupSubject,refCountSubscription){_super.call(this),this.key=key,this.groupSubject=groupSubject,this.refCountSubscription=refCountSubscription}return __extends(GroupedObservable,_super),GroupedObservable.prototype._subscribe=function(subscriber){var subscription=new Subscription_1.Subscription,_a=this,refCountSubscription=_a.refCountSubscription,groupSubject=_a.groupSubject;return refCountSubscription&&!refCountSubscription.closed&&subscription.add(new InnerRefCountSubscription(refCountSubscription)),subscription.add(groupSubject.subscribe(subscriber)),subscription},GroupedObservable}(Observable_1.Observable);exports.GroupedObservable=GroupedObservable;var InnerRefCountSubscription=function(_super){function InnerRefCountSubscription(parent){_super.call(this),this.parent=parent,parent.count++}return __extends(InnerRefCountSubscription,_super),InnerRefCountSubscription.prototype.unsubscribe=function(){var parent=this.parent;parent.closed||this.closed||(_super.prototype.unsubscribe.call(this),parent.count-=1,0===parent.count&&parent.attemptedToUnsubscribe&&parent.unsubscribe())},InnerRefCountSubscription}(Subscription_1.Subscription)},function(module,exports,__webpack_require__){"use strict";function ignoreElements(){return this.lift(new IgnoreElementsOperator)}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),noop_1=__webpack_require__(98);exports.ignoreElements=ignoreElements;var IgnoreElementsOperator=function(){function IgnoreElementsOperator(){}return IgnoreElementsOperator.prototype.call=function(subscriber,source){return source.subscribe(new IgnoreElementsSubscriber(subscriber))},IgnoreElementsOperator}(),IgnoreElementsSubscriber=function(_super){function IgnoreElementsSubscriber(){_super.apply(this,arguments)}return __extends(IgnoreElementsSubscriber,_super),IgnoreElementsSubscriber.prototype._next=function(unused){noop_1.noop()},IgnoreElementsSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function isEmpty(){return this.lift(new IsEmptyOperator)}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1);exports.isEmpty=isEmpty;var IsEmptyOperator=function(){function IsEmptyOperator(){}return IsEmptyOperator.prototype.call=function(observer,source){return source.subscribe(new IsEmptySubscriber(observer))},IsEmptyOperator}(),IsEmptySubscriber=function(_super){function IsEmptySubscriber(destination){_super.call(this,destination)}return __extends(IsEmptySubscriber,_super),IsEmptySubscriber.prototype.notifyComplete=function(isEmpty){var destination=this.destination;destination.next(isEmpty),destination.complete()},IsEmptySubscriber.prototype._next=function(value){this.notifyComplete(!1)},IsEmptySubscriber.prototype._complete=function(){this.notifyComplete(!0)},IsEmptySubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function last(predicate,resultSelector,defaultValue){return this.lift(new LastOperator(predicate,resultSelector,defaultValue,this))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),EmptyError_1=__webpack_require__(35);exports.last=last;var LastOperator=function(){function LastOperator(predicate,resultSelector,defaultValue,source){this.predicate=predicate,this.resultSelector=resultSelector,this.defaultValue=defaultValue,this.source=source}return LastOperator.prototype.call=function(observer,source){return source.subscribe(new LastSubscriber(observer,this.predicate,this.resultSelector,this.defaultValue,this.source))},LastOperator}(),LastSubscriber=function(_super){function LastSubscriber(destination,predicate,resultSelector,defaultValue,source){_super.call(this,destination),this.predicate=predicate,this.resultSelector=resultSelector,this.defaultValue=defaultValue,this.source=source,this.hasValue=!1,this.index=0,"undefined"!=typeof defaultValue&&(this.lastValue=defaultValue,this.hasValue=!0)}return __extends(LastSubscriber,_super),LastSubscriber.prototype._next=function(value){var index=this.index++;if(this.predicate)this._tryPredicate(value,index);else{if(this.resultSelector)return void this._tryResultSelector(value,index);this.lastValue=value,this.hasValue=!0}},LastSubscriber.prototype._tryPredicate=function(value,index){var result;try{result=this.predicate(value,index,this.source)}catch(err){return void this.destination.error(err)}if(result){if(this.resultSelector)return void this._tryResultSelector(value,index);this.lastValue=value,this.hasValue=!0}},LastSubscriber.prototype._tryResultSelector=function(value,index){var result;try{result=this.resultSelector(value,index)}catch(err){return void this.destination.error(err)}this.lastValue=result,this.hasValue=!0},LastSubscriber.prototype._complete=function(){var destination=this.destination;this.hasValue?(destination.next(this.lastValue),destination.complete()):destination.error(new EmptyError_1.EmptyError)},LastSubscriber}(Subscriber_1.Subscriber)},function(module,exports){"use strict";function letProto(func){return func(this)}exports.letProto=letProto},function(module,exports,__webpack_require__){"use strict";function mapTo(value){return this.lift(new MapToOperator(value))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1);exports.mapTo=mapTo;var MapToOperator=function(){function MapToOperator(value){this.value=value}return MapToOperator.prototype.call=function(subscriber,source){return source.subscribe(new MapToSubscriber(subscriber,this.value))},MapToOperator}(),MapToSubscriber=function(_super){function MapToSubscriber(destination,value){_super.call(this,destination),this.value=value}return __extends(MapToSubscriber,_super),MapToSubscriber.prototype._next=function(x){this.destination.next(this.value)},MapToSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function materialize(){return this.lift(new MaterializeOperator)}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),Notification_1=__webpack_require__(22);exports.materialize=materialize;var MaterializeOperator=function(){function MaterializeOperator(){}return MaterializeOperator.prototype.call=function(subscriber,source){return source.subscribe(new MaterializeSubscriber(subscriber))},MaterializeOperator}(),MaterializeSubscriber=function(_super){function MaterializeSubscriber(destination){_super.call(this,destination)}return __extends(MaterializeSubscriber,_super),MaterializeSubscriber.prototype._next=function(value){this.destination.next(Notification_1.Notification.createNext(value))},MaterializeSubscriber.prototype._error=function(err){var destination=this.destination;destination.next(Notification_1.Notification.createError(err)),destination.complete()},MaterializeSubscriber.prototype._complete=function(){var destination=this.destination;destination.next(Notification_1.Notification.createComplete()),destination.complete()},MaterializeSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function max(comparer){var max="function"==typeof comparer?function(x,y){return comparer(x,y)>0?x:y}:function(x,y){return x>y?x:y};return this.lift(new reduce_1.ReduceOperator(max))}var reduce_1=__webpack_require__(56);exports.max=max},function(module,exports,__webpack_require__){"use strict";function mergeScan(accumulator,seed,concurrent){return void 0===concurrent&&(concurrent=Number.POSITIVE_INFINITY),this.lift(new MergeScanOperator(accumulator,seed,concurrent))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},tryCatch_1=__webpack_require__(9),errorObject_1=__webpack_require__(7),subscribeToResult_1=__webpack_require__(3),OuterSubscriber_1=__webpack_require__(2);exports.mergeScan=mergeScan;var MergeScanOperator=function(){function MergeScanOperator(accumulator,seed,concurrent){this.accumulator=accumulator,this.seed=seed,this.concurrent=concurrent}return MergeScanOperator.prototype.call=function(subscriber,source){return source.subscribe(new MergeScanSubscriber(subscriber,this.accumulator,this.seed,this.concurrent))},MergeScanOperator}();exports.MergeScanOperator=MergeScanOperator;var MergeScanSubscriber=function(_super){function MergeScanSubscriber(destination,accumulator,acc,concurrent){_super.call(this,destination),this.accumulator=accumulator,this.acc=acc,this.concurrent=concurrent,this.hasValue=!1,this.hasCompleted=!1,this.buffer=[],this.active=0,this.index=0}return __extends(MergeScanSubscriber,_super),MergeScanSubscriber.prototype._next=function(value){if(this.active<this.concurrent){var index=this.index++,ish=tryCatch_1.tryCatch(this.accumulator)(this.acc,value),destination=this.destination;ish===errorObject_1.errorObject?destination.error(errorObject_1.errorObject.e):(this.active++,this._innerSub(ish,value,index))}else this.buffer.push(value)},MergeScanSubscriber.prototype._innerSub=function(ish,value,index){this.add(subscribeToResult_1.subscribeToResult(this,ish,value,index))},MergeScanSubscriber.prototype._complete=function(){this.hasCompleted=!0,0===this.active&&0===this.buffer.length&&(this.hasValue===!1&&this.destination.next(this.acc),this.destination.complete())},MergeScanSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){var destination=this.destination;this.acc=innerValue,this.hasValue=!0,destination.next(innerValue)},MergeScanSubscriber.prototype.notifyComplete=function(innerSub){var buffer=this.buffer;this.remove(innerSub),this.active--,buffer.length>0?this._next(buffer.shift()):0===this.active&&this.hasCompleted&&(this.hasValue===!1&&this.destination.next(this.acc),this.destination.complete())},MergeScanSubscriber}(OuterSubscriber_1.OuterSubscriber);exports.MergeScanSubscriber=MergeScanSubscriber},function(module,exports,__webpack_require__){"use strict";function min(comparer){var min="function"==typeof comparer?function(x,y){return comparer(x,y)<0?x:y}:function(x,y){return x<y?x:y};return this.lift(new reduce_1.ReduceOperator(min))}var reduce_1=__webpack_require__(56);exports.min=min},function(module,exports,__webpack_require__){"use strict";function pairwise(){return this.lift(new PairwiseOperator)}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1);exports.pairwise=pairwise;var PairwiseOperator=function(){function PairwiseOperator(){}return PairwiseOperator.prototype.call=function(subscriber,source){return source.subscribe(new PairwiseSubscriber(subscriber))},PairwiseOperator}(),PairwiseSubscriber=function(_super){function PairwiseSubscriber(destination){_super.call(this,destination),this.hasPrev=!1}return __extends(PairwiseSubscriber,_super),PairwiseSubscriber.prototype._next=function(value){this.hasPrev?this.destination.next([this.prev,value]):this.hasPrev=!0,this.prev=value},PairwiseSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function partition(predicate,thisArg){return[filter_1.filter.call(this,predicate,thisArg),filter_1.filter.call(this,not_1.not(predicate,thisArg))]}var not_1=__webpack_require__(423),filter_1=__webpack_require__(78);exports.partition=partition},function(module,exports,__webpack_require__){"use strict";function pluck(){for(var properties=[],_i=0;_i<arguments.length;_i++)properties[_i-0]=arguments[_i];var length=properties.length;if(0===length)throw new Error("list of properties cannot be empty.");return map_1.map.call(this,plucker(properties,length))}function plucker(props,length){var mapper=function(x){for(var currentProp=x,i=0;i<length;i++){var p=currentProp[props[i]];if("undefined"==typeof p)return;currentProp=p}return currentProp};return mapper}var map_1=__webpack_require__(54);exports.pluck=pluck},function(module,exports,__webpack_require__){"use strict";function publish(selector){return selector?multicast_1.multicast.call(this,function(){return new Subject_1.Subject},selector):multicast_1.multicast.call(this,new Subject_1.Subject)}var Subject_1=__webpack_require__(6),multicast_1=__webpack_require__(20);exports.publish=publish},function(module,exports,__webpack_require__){"use strict";function publishBehavior(value){return multicast_1.multicast.call(this,new BehaviorSubject_1.BehaviorSubject(value))}var BehaviorSubject_1=__webpack_require__(70),multicast_1=__webpack_require__(20);exports.publishBehavior=publishBehavior},function(module,exports,__webpack_require__){"use strict";function publishLast(){return multicast_1.multicast.call(this,new AsyncSubject_1.AsyncSubject)}var AsyncSubject_1=__webpack_require__(30),multicast_1=__webpack_require__(20);exports.publishLast=publishLast},function(module,exports,__webpack_require__){"use strict";function publishReplay(bufferSize,windowTime,scheduler){return void 0===bufferSize&&(bufferSize=Number.POSITIVE_INFINITY),void 0===windowTime&&(windowTime=Number.POSITIVE_INFINITY),multicast_1.multicast.call(this,new ReplaySubject_1.ReplaySubject(bufferSize,windowTime,scheduler))}var ReplaySubject_1=__webpack_require__(50),multicast_1=__webpack_require__(20);exports.publishReplay=publishReplay},function(module,exports,__webpack_require__){"use strict";function repeat(count){return void 0===count&&(count=-1),0===count?new EmptyObservable_1.EmptyObservable:count<0?this.lift(new RepeatOperator((-1),this)):this.lift(new RepeatOperator(count-1,this))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),EmptyObservable_1=__webpack_require__(17);exports.repeat=repeat;var RepeatOperator=function(){function RepeatOperator(count,source){this.count=count,this.source=source}return RepeatOperator.prototype.call=function(subscriber,source){return source.subscribe(new RepeatSubscriber(subscriber,this.count,this.source))},RepeatOperator}(),RepeatSubscriber=function(_super){function RepeatSubscriber(destination,count,source){_super.call(this,destination),this.count=count,this.source=source}return __extends(RepeatSubscriber,_super),RepeatSubscriber.prototype.complete=function(){if(!this.isStopped){var _a=this,source=_a.source,count=_a.count;if(0===count)return _super.prototype.complete.call(this);count>-1&&(this.count=count-1),source.subscribe(this._unsubscribeAndRecycle())}},RepeatSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function repeatWhen(notifier){return this.lift(new RepeatWhenOperator(notifier))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subject_1=__webpack_require__(6),tryCatch_1=__webpack_require__(9),errorObject_1=__webpack_require__(7),OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.repeatWhen=repeatWhen;var RepeatWhenOperator=function(){function RepeatWhenOperator(notifier){this.notifier=notifier}return RepeatWhenOperator.prototype.call=function(subscriber,source){return source.subscribe(new RepeatWhenSubscriber(subscriber,this.notifier,source))},RepeatWhenOperator}(),RepeatWhenSubscriber=function(_super){function RepeatWhenSubscriber(destination,notifier,source){_super.call(this,destination),this.notifier=notifier,this.source=source,this.sourceIsBeingSubscribedTo=!0}return __extends(RepeatWhenSubscriber,_super),RepeatWhenSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this.sourceIsBeingSubscribedTo=!0,this.source.subscribe(this)},RepeatWhenSubscriber.prototype.notifyComplete=function(innerSub){if(this.sourceIsBeingSubscribedTo===!1)return _super.prototype.complete.call(this)},RepeatWhenSubscriber.prototype.complete=function(){if(this.sourceIsBeingSubscribedTo=!1,!this.isStopped){if(this.retries){if(this.retriesSubscription.closed)return _super.prototype.complete.call(this)}else this.subscribeToRetries();this._unsubscribeAndRecycle(),this.notifications.next()}},RepeatWhenSubscriber.prototype._unsubscribe=function(){var _a=this,notifications=_a.notifications,retriesSubscription=_a.retriesSubscription;notifications&&(notifications.unsubscribe(),this.notifications=null),retriesSubscription&&(retriesSubscription.unsubscribe(),this.retriesSubscription=null),this.retries=null},RepeatWhenSubscriber.prototype._unsubscribeAndRecycle=function(){var _a=this,notifications=_a.notifications,retries=_a.retries,retriesSubscription=_a.retriesSubscription;return this.notifications=null,this.retries=null,this.retriesSubscription=null,_super.prototype._unsubscribeAndRecycle.call(this),this.notifications=notifications,this.retries=retries,this.retriesSubscription=retriesSubscription,this},RepeatWhenSubscriber.prototype.subscribeToRetries=function(){this.notifications=new Subject_1.Subject;var retries=tryCatch_1.tryCatch(this.notifier)(this.notifications);return retries===errorObject_1.errorObject?_super.prototype.complete.call(this):(this.retries=retries,void(this.retriesSubscription=subscribeToResult_1.subscribeToResult(this,retries)))},RepeatWhenSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function retry(count){return void 0===count&&(count=-1),this.lift(new RetryOperator(count,this))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1);exports.retry=retry;var RetryOperator=function(){function RetryOperator(count,source){this.count=count,this.source=source}return RetryOperator.prototype.call=function(subscriber,source){return source.subscribe(new RetrySubscriber(subscriber,this.count,this.source))},RetryOperator}(),RetrySubscriber=function(_super){function RetrySubscriber(destination,count,source){_super.call(this,destination),this.count=count,this.source=source}return __extends(RetrySubscriber,_super),RetrySubscriber.prototype.error=function(err){if(!this.isStopped){var _a=this,source=_a.source,count=_a.count;if(0===count)return _super.prototype.error.call(this,err);count>-1&&(this.count=count-1),source.subscribe(this._unsubscribeAndRecycle())}},RetrySubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function retryWhen(notifier){return this.lift(new RetryWhenOperator(notifier,this))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subject_1=__webpack_require__(6),tryCatch_1=__webpack_require__(9),errorObject_1=__webpack_require__(7),OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.retryWhen=retryWhen;var RetryWhenOperator=function(){function RetryWhenOperator(notifier,source){this.notifier=notifier,this.source=source}return RetryWhenOperator.prototype.call=function(subscriber,source){return source.subscribe(new RetryWhenSubscriber(subscriber,this.notifier,this.source))},RetryWhenOperator}(),RetryWhenSubscriber=function(_super){function RetryWhenSubscriber(destination,notifier,source){_super.call(this,destination),this.notifier=notifier,this.source=source}return __extends(RetryWhenSubscriber,_super),RetryWhenSubscriber.prototype.error=function(err){if(!this.isStopped){var errors=this.errors,retries=this.retries,retriesSubscription=this.retriesSubscription;if(retries)this.errors=null,this.retriesSubscription=null;else{if(errors=new Subject_1.Subject,retries=tryCatch_1.tryCatch(this.notifier)(errors),retries===errorObject_1.errorObject)return _super.prototype.error.call(this,errorObject_1.errorObject.e);retriesSubscription=subscribeToResult_1.subscribeToResult(this,retries)}this._unsubscribeAndRecycle(),this.errors=errors,this.retries=retries,this.retriesSubscription=retriesSubscription,errors.next(err)}},RetryWhenSubscriber.prototype._unsubscribe=function(){var _a=this,errors=_a.errors,retriesSubscription=_a.retriesSubscription;errors&&(errors.unsubscribe(),this.errors=null),retriesSubscription&&(retriesSubscription.unsubscribe(),this.retriesSubscription=null),this.retries=null},RetryWhenSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){var _a=this,errors=_a.errors,retries=_a.retries,retriesSubscription=_a.retriesSubscription;this.errors=null,this.retries=null,this.retriesSubscription=null,this._unsubscribeAndRecycle(),this.errors=errors,this.retries=retries,this.retriesSubscription=retriesSubscription,this.source.subscribe(this)},RetryWhenSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function sample(notifier){return this.lift(new SampleOperator(notifier))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.sample=sample;var SampleOperator=function(){function SampleOperator(notifier){this.notifier=notifier}return SampleOperator.prototype.call=function(subscriber,source){var sampleSubscriber=new SampleSubscriber(subscriber),subscription=source.subscribe(sampleSubscriber);return subscription.add(subscribeToResult_1.subscribeToResult(sampleSubscriber,this.notifier)),subscription},SampleOperator}(),SampleSubscriber=function(_super){function SampleSubscriber(){_super.apply(this,arguments),this.hasValue=!1}return __extends(SampleSubscriber,_super),SampleSubscriber.prototype._next=function(value){this.value=value,this.hasValue=!0},SampleSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this.emitValue()},SampleSubscriber.prototype.notifyComplete=function(){this.emitValue()},SampleSubscriber.prototype.emitValue=function(){this.hasValue&&(this.hasValue=!1,this.destination.next(this.value))},SampleSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function sampleTime(period,scheduler){return void 0===scheduler&&(scheduler=async_1.async),this.lift(new SampleTimeOperator(period,scheduler))}function dispatchNotification(state){var subscriber=state.subscriber,period=state.period;subscriber.notifyNext(),this.schedule(state,period)}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),async_1=__webpack_require__(10);exports.sampleTime=sampleTime;var SampleTimeOperator=function(){function SampleTimeOperator(period,scheduler){this.period=period,this.scheduler=scheduler}return SampleTimeOperator.prototype.call=function(subscriber,source){return source.subscribe(new SampleTimeSubscriber(subscriber,this.period,this.scheduler))},SampleTimeOperator}(),SampleTimeSubscriber=function(_super){function SampleTimeSubscriber(destination,period,scheduler){_super.call(this,destination),this.period=period,this.scheduler=scheduler,this.hasValue=!1,this.add(scheduler.schedule(dispatchNotification,period,{subscriber:this,period:period}))}return __extends(SampleTimeSubscriber,_super),SampleTimeSubscriber.prototype._next=function(value){this.lastValue=value,this.hasValue=!0},SampleTimeSubscriber.prototype.notifyNext=function(){this.hasValue&&(this.hasValue=!1,this.destination.next(this.lastValue))},SampleTimeSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function scan(accumulator,seed){var hasSeed=!1;return arguments.length>=2&&(hasSeed=!0),this.lift(new ScanOperator(accumulator,seed,hasSeed))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1);exports.scan=scan;var ScanOperator=function(){function ScanOperator(accumulator,seed,hasSeed){void 0===hasSeed&&(hasSeed=!1),this.accumulator=accumulator,this.seed=seed,this.hasSeed=hasSeed}return ScanOperator.prototype.call=function(subscriber,source){return source.subscribe(new ScanSubscriber(subscriber,this.accumulator,this.seed,this.hasSeed))},ScanOperator}(),ScanSubscriber=function(_super){function ScanSubscriber(destination,accumulator,_seed,hasSeed){_super.call(this,destination),this.accumulator=accumulator,this._seed=_seed,this.hasSeed=hasSeed,this.index=0}return __extends(ScanSubscriber,_super),Object.defineProperty(ScanSubscriber.prototype,"seed",{get:function(){return this._seed},set:function(value){this.hasSeed=!0,this._seed=value},enumerable:!0,configurable:!0}),ScanSubscriber.prototype._next=function(value){return this.hasSeed?this._tryNext(value):(this.seed=value,void this.destination.next(value))},ScanSubscriber.prototype._tryNext=function(value){var result,index=this.index++;try{result=this.accumulator(this.seed,value,index)}catch(err){this.destination.error(err)}this.seed=result,this.destination.next(result)},ScanSubscriber}(Subscriber_1.Subscriber);
},function(module,exports,__webpack_require__){"use strict";function sequenceEqual(compareTo,comparor){return this.lift(new SequenceEqualOperator(compareTo,comparor))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),tryCatch_1=__webpack_require__(9),errorObject_1=__webpack_require__(7);exports.sequenceEqual=sequenceEqual;var SequenceEqualOperator=function(){function SequenceEqualOperator(compareTo,comparor){this.compareTo=compareTo,this.comparor=comparor}return SequenceEqualOperator.prototype.call=function(subscriber,source){return source.subscribe(new SequenceEqualSubscriber(subscriber,this.compareTo,this.comparor))},SequenceEqualOperator}();exports.SequenceEqualOperator=SequenceEqualOperator;var SequenceEqualSubscriber=function(_super){function SequenceEqualSubscriber(destination,compareTo,comparor){_super.call(this,destination),this.compareTo=compareTo,this.comparor=comparor,this._a=[],this._b=[],this._oneComplete=!1,this.add(compareTo.subscribe(new SequenceEqualCompareToSubscriber(destination,this)))}return __extends(SequenceEqualSubscriber,_super),SequenceEqualSubscriber.prototype._next=function(value){this._oneComplete&&0===this._b.length?this.emit(!1):(this._a.push(value),this.checkValues())},SequenceEqualSubscriber.prototype._complete=function(){this._oneComplete?this.emit(0===this._a.length&&0===this._b.length):this._oneComplete=!0},SequenceEqualSubscriber.prototype.checkValues=function(){for(var _c=this,_a=_c._a,_b=_c._b,comparor=_c.comparor;_a.length>0&&_b.length>0;){var a=_a.shift(),b=_b.shift(),areEqual=!1;comparor?(areEqual=tryCatch_1.tryCatch(comparor)(a,b),areEqual===errorObject_1.errorObject&&this.destination.error(errorObject_1.errorObject.e)):areEqual=a===b,areEqual||this.emit(!1)}},SequenceEqualSubscriber.prototype.emit=function(value){var destination=this.destination;destination.next(value),destination.complete()},SequenceEqualSubscriber.prototype.nextB=function(value){this._oneComplete&&0===this._a.length?this.emit(!1):(this._b.push(value),this.checkValues())},SequenceEqualSubscriber}(Subscriber_1.Subscriber);exports.SequenceEqualSubscriber=SequenceEqualSubscriber;var SequenceEqualCompareToSubscriber=function(_super){function SequenceEqualCompareToSubscriber(destination,parent){_super.call(this,destination),this.parent=parent}return __extends(SequenceEqualCompareToSubscriber,_super),SequenceEqualCompareToSubscriber.prototype._next=function(value){this.parent.nextB(value)},SequenceEqualCompareToSubscriber.prototype._error=function(err){this.parent.error(err)},SequenceEqualCompareToSubscriber.prototype._complete=function(){this.parent._complete()},SequenceEqualCompareToSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function shareSubjectFactory(){return new Subject_1.Subject}function share(){return multicast_1.multicast.call(this,shareSubjectFactory).refCount()}var multicast_1=__webpack_require__(20),Subject_1=__webpack_require__(6);exports.share=share},function(module,exports,__webpack_require__){"use strict";function single(predicate){return this.lift(new SingleOperator(predicate,this))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),EmptyError_1=__webpack_require__(35);exports.single=single;var SingleOperator=function(){function SingleOperator(predicate,source){this.predicate=predicate,this.source=source}return SingleOperator.prototype.call=function(subscriber,source){return source.subscribe(new SingleSubscriber(subscriber,this.predicate,this.source))},SingleOperator}(),SingleSubscriber=function(_super){function SingleSubscriber(destination,predicate,source){_super.call(this,destination),this.predicate=predicate,this.source=source,this.seenValue=!1,this.index=0}return __extends(SingleSubscriber,_super),SingleSubscriber.prototype.applySingleValue=function(value){this.seenValue?this.destination.error("Sequence contains more than one element"):(this.seenValue=!0,this.singleValue=value)},SingleSubscriber.prototype._next=function(value){var index=this.index++;this.predicate?this.tryNext(value,index):this.applySingleValue(value)},SingleSubscriber.prototype.tryNext=function(value,index){try{this.predicate(value,index,this.source)&&this.applySingleValue(value)}catch(err){this.destination.error(err)}},SingleSubscriber.prototype._complete=function(){var destination=this.destination;this.index>0?(destination.next(this.seenValue?this.singleValue:void 0),destination.complete()):destination.error(new EmptyError_1.EmptyError)},SingleSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function skip(count){return this.lift(new SkipOperator(count))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1);exports.skip=skip;var SkipOperator=function(){function SkipOperator(total){this.total=total}return SkipOperator.prototype.call=function(subscriber,source){return source.subscribe(new SkipSubscriber(subscriber,this.total))},SkipOperator}(),SkipSubscriber=function(_super){function SkipSubscriber(destination,total){_super.call(this,destination),this.total=total,this.count=0}return __extends(SkipSubscriber,_super),SkipSubscriber.prototype._next=function(x){++this.count>this.total&&this.destination.next(x)},SkipSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function skipUntil(notifier){return this.lift(new SkipUntilOperator(notifier))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.skipUntil=skipUntil;var SkipUntilOperator=function(){function SkipUntilOperator(notifier){this.notifier=notifier}return SkipUntilOperator.prototype.call=function(subscriber,source){return source.subscribe(new SkipUntilSubscriber(subscriber,this.notifier))},SkipUntilOperator}(),SkipUntilSubscriber=function(_super){function SkipUntilSubscriber(destination,notifier){_super.call(this,destination),this.hasValue=!1,this.isInnerStopped=!1,this.add(subscribeToResult_1.subscribeToResult(this,notifier))}return __extends(SkipUntilSubscriber,_super),SkipUntilSubscriber.prototype._next=function(value){this.hasValue&&_super.prototype._next.call(this,value)},SkipUntilSubscriber.prototype._complete=function(){this.isInnerStopped?_super.prototype._complete.call(this):this.unsubscribe()},SkipUntilSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this.hasValue=!0},SkipUntilSubscriber.prototype.notifyComplete=function(){this.isInnerStopped=!0,this.isStopped&&_super.prototype._complete.call(this)},SkipUntilSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function skipWhile(predicate){return this.lift(new SkipWhileOperator(predicate))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1);exports.skipWhile=skipWhile;var SkipWhileOperator=function(){function SkipWhileOperator(predicate){this.predicate=predicate}return SkipWhileOperator.prototype.call=function(subscriber,source){return source.subscribe(new SkipWhileSubscriber(subscriber,this.predicate))},SkipWhileOperator}(),SkipWhileSubscriber=function(_super){function SkipWhileSubscriber(destination,predicate){_super.call(this,destination),this.predicate=predicate,this.skipping=!0,this.index=0}return __extends(SkipWhileSubscriber,_super),SkipWhileSubscriber.prototype._next=function(value){var destination=this.destination;this.skipping&&this.tryCallPredicate(value),this.skipping||destination.next(value)},SkipWhileSubscriber.prototype.tryCallPredicate=function(value){try{var result=this.predicate(value,this.index++);this.skipping=Boolean(result)}catch(err){this.destination.error(err)}},SkipWhileSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function startWith(){for(var array=[],_i=0;_i<arguments.length;_i++)array[_i-0]=arguments[_i];var scheduler=array[array.length-1];isScheduler_1.isScheduler(scheduler)?array.pop():scheduler=null;var len=array.length;return 1===len?concat_1.concatStatic(new ScalarObservable_1.ScalarObservable(array[0],scheduler),this):len>1?concat_1.concatStatic(new ArrayObservable_1.ArrayObservable(array,scheduler),this):concat_1.concatStatic(new EmptyObservable_1.EmptyObservable(scheduler),this)}var ArrayObservable_1=__webpack_require__(13),ScalarObservable_1=__webpack_require__(51),EmptyObservable_1=__webpack_require__(17),concat_1=__webpack_require__(53),isScheduler_1=__webpack_require__(15);exports.startWith=startWith},function(module,exports,__webpack_require__){"use strict";function subscribeOn(scheduler,delay){return void 0===delay&&(delay=0),this.lift(new SubscribeOnOperator(scheduler,delay))}var SubscribeOnObservable_1=__webpack_require__(295);exports.subscribeOn=subscribeOn;var SubscribeOnOperator=function(){function SubscribeOnOperator(scheduler,delay){this.scheduler=scheduler,this.delay=delay}return SubscribeOnOperator.prototype.call=function(subscriber,source){return new SubscribeOnObservable_1.SubscribeOnObservable(source,this.delay,this.scheduler).subscribe(subscriber)},SubscribeOnOperator}()},function(module,exports,__webpack_require__){"use strict";function _switch(){return this.lift(new SwitchOperator)}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports._switch=_switch;var SwitchOperator=function(){function SwitchOperator(){}return SwitchOperator.prototype.call=function(subscriber,source){return source.subscribe(new SwitchSubscriber(subscriber))},SwitchOperator}(),SwitchSubscriber=function(_super){function SwitchSubscriber(destination){_super.call(this,destination),this.active=0,this.hasCompleted=!1}return __extends(SwitchSubscriber,_super),SwitchSubscriber.prototype._next=function(value){this.unsubscribeInner(),this.active++,this.add(this.innerSubscription=subscribeToResult_1.subscribeToResult(this,value))},SwitchSubscriber.prototype._complete=function(){this.hasCompleted=!0,0===this.active&&this.destination.complete()},SwitchSubscriber.prototype.unsubscribeInner=function(){this.active=this.active>0?this.active-1:0;var innerSubscription=this.innerSubscription;innerSubscription&&(innerSubscription.unsubscribe(),this.remove(innerSubscription))},SwitchSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this.destination.next(innerValue)},SwitchSubscriber.prototype.notifyError=function(err){this.destination.error(err)},SwitchSubscriber.prototype.notifyComplete=function(){this.unsubscribeInner(),this.hasCompleted&&0===this.active&&this.destination.complete()},SwitchSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function switchMap(project,resultSelector){return this.lift(new SwitchMapOperator(project,resultSelector))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.switchMap=switchMap;var SwitchMapOperator=function(){function SwitchMapOperator(project,resultSelector){this.project=project,this.resultSelector=resultSelector}return SwitchMapOperator.prototype.call=function(subscriber,source){return source.subscribe(new SwitchMapSubscriber(subscriber,this.project,this.resultSelector))},SwitchMapOperator}(),SwitchMapSubscriber=function(_super){function SwitchMapSubscriber(destination,project,resultSelector){_super.call(this,destination),this.project=project,this.resultSelector=resultSelector,this.index=0}return __extends(SwitchMapSubscriber,_super),SwitchMapSubscriber.prototype._next=function(value){var result,index=this.index++;try{result=this.project(value,index)}catch(error){return void this.destination.error(error)}this._innerSub(result,value,index)},SwitchMapSubscriber.prototype._innerSub=function(result,value,index){var innerSubscription=this.innerSubscription;innerSubscription&&innerSubscription.unsubscribe(),this.add(this.innerSubscription=subscribeToResult_1.subscribeToResult(this,result,value,index))},SwitchMapSubscriber.prototype._complete=function(){var innerSubscription=this.innerSubscription;innerSubscription&&!innerSubscription.closed||_super.prototype._complete.call(this)},SwitchMapSubscriber.prototype._unsubscribe=function(){this.innerSubscription=null},SwitchMapSubscriber.prototype.notifyComplete=function(innerSub){this.remove(innerSub),this.innerSubscription=null,this.isStopped&&_super.prototype._complete.call(this)},SwitchMapSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this.resultSelector?this._tryNotifyNext(outerValue,innerValue,outerIndex,innerIndex):this.destination.next(innerValue)},SwitchMapSubscriber.prototype._tryNotifyNext=function(outerValue,innerValue,outerIndex,innerIndex){var result;try{result=this.resultSelector(outerValue,innerValue,outerIndex,innerIndex)}catch(err){return void this.destination.error(err)}this.destination.next(result)},SwitchMapSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function switchMapTo(innerObservable,resultSelector){return this.lift(new SwitchMapToOperator(innerObservable,resultSelector))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.switchMapTo=switchMapTo;var SwitchMapToOperator=function(){function SwitchMapToOperator(observable,resultSelector){this.observable=observable,this.resultSelector=resultSelector}return SwitchMapToOperator.prototype.call=function(subscriber,source){return source.subscribe(new SwitchMapToSubscriber(subscriber,this.observable,this.resultSelector))},SwitchMapToOperator}(),SwitchMapToSubscriber=function(_super){function SwitchMapToSubscriber(destination,inner,resultSelector){_super.call(this,destination),this.inner=inner,this.resultSelector=resultSelector,this.index=0}return __extends(SwitchMapToSubscriber,_super),SwitchMapToSubscriber.prototype._next=function(value){var innerSubscription=this.innerSubscription;innerSubscription&&innerSubscription.unsubscribe(),this.add(this.innerSubscription=subscribeToResult_1.subscribeToResult(this,this.inner,value,this.index++))},SwitchMapToSubscriber.prototype._complete=function(){var innerSubscription=this.innerSubscription;innerSubscription&&!innerSubscription.closed||_super.prototype._complete.call(this)},SwitchMapToSubscriber.prototype._unsubscribe=function(){this.innerSubscription=null},SwitchMapToSubscriber.prototype.notifyComplete=function(innerSub){this.remove(innerSub),this.innerSubscription=null,this.isStopped&&_super.prototype._complete.call(this)},SwitchMapToSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){var _a=this,resultSelector=_a.resultSelector,destination=_a.destination;resultSelector?this.tryResultSelector(outerValue,innerValue,outerIndex,innerIndex):destination.next(innerValue)},SwitchMapToSubscriber.prototype.tryResultSelector=function(outerValue,innerValue,outerIndex,innerIndex){var result,_a=this,resultSelector=_a.resultSelector,destination=_a.destination;try{result=resultSelector(outerValue,innerValue,outerIndex,innerIndex)}catch(err){return void destination.error(err)}destination.next(result)},SwitchMapToSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function take(count){return 0===count?new EmptyObservable_1.EmptyObservable:this.lift(new TakeOperator(count))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),ArgumentOutOfRangeError_1=__webpack_require__(34),EmptyObservable_1=__webpack_require__(17);exports.take=take;var TakeOperator=function(){function TakeOperator(total){if(this.total=total,this.total<0)throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError}return TakeOperator.prototype.call=function(subscriber,source){return source.subscribe(new TakeSubscriber(subscriber,this.total))},TakeOperator}(),TakeSubscriber=function(_super){function TakeSubscriber(destination,total){_super.call(this,destination),this.total=total,this.count=0}return __extends(TakeSubscriber,_super),TakeSubscriber.prototype._next=function(value){var total=this.total,count=++this.count;count<=total&&(this.destination.next(value),count===total&&(this.destination.complete(),this.unsubscribe()))},TakeSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function takeLast(count){return 0===count?new EmptyObservable_1.EmptyObservable:this.lift(new TakeLastOperator(count))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),ArgumentOutOfRangeError_1=__webpack_require__(34),EmptyObservable_1=__webpack_require__(17);exports.takeLast=takeLast;var TakeLastOperator=function(){function TakeLastOperator(total){if(this.total=total,this.total<0)throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError}return TakeLastOperator.prototype.call=function(subscriber,source){return source.subscribe(new TakeLastSubscriber(subscriber,this.total))},TakeLastOperator}(),TakeLastSubscriber=function(_super){function TakeLastSubscriber(destination,total){_super.call(this,destination),this.total=total,this.ring=new Array,this.count=0}return __extends(TakeLastSubscriber,_super),TakeLastSubscriber.prototype._next=function(value){var ring=this.ring,total=this.total,count=this.count++;if(ring.length<total)ring.push(value);else{var index=count%total;ring[index]=value}},TakeLastSubscriber.prototype._complete=function(){var destination=this.destination,count=this.count;if(count>0)for(var total=this.count>=this.total?this.total:this.count,ring=this.ring,i=0;i<total;i++){var idx=count++%total;destination.next(ring[idx])}destination.complete()},TakeLastSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function takeUntil(notifier){return this.lift(new TakeUntilOperator(notifier))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.takeUntil=takeUntil;var TakeUntilOperator=function(){function TakeUntilOperator(notifier){this.notifier=notifier}return TakeUntilOperator.prototype.call=function(subscriber,source){return source.subscribe(new TakeUntilSubscriber(subscriber,this.notifier))},TakeUntilOperator}(),TakeUntilSubscriber=function(_super){function TakeUntilSubscriber(destination,notifier){_super.call(this,destination),this.notifier=notifier,this.add(subscribeToResult_1.subscribeToResult(this,notifier))}return __extends(TakeUntilSubscriber,_super),TakeUntilSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this.complete()},TakeUntilSubscriber.prototype.notifyComplete=function(){},TakeUntilSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function takeWhile(predicate){return this.lift(new TakeWhileOperator(predicate))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1);exports.takeWhile=takeWhile;var TakeWhileOperator=function(){function TakeWhileOperator(predicate){this.predicate=predicate}return TakeWhileOperator.prototype.call=function(subscriber,source){return source.subscribe(new TakeWhileSubscriber(subscriber,this.predicate))},TakeWhileOperator}(),TakeWhileSubscriber=function(_super){function TakeWhileSubscriber(destination,predicate){_super.call(this,destination),this.predicate=predicate,this.index=0}return __extends(TakeWhileSubscriber,_super),TakeWhileSubscriber.prototype._next=function(value){var result,destination=this.destination;try{result=this.predicate(value,this.index++)}catch(err){return void destination.error(err)}this.nextOrComplete(value,result)},TakeWhileSubscriber.prototype.nextOrComplete=function(value,predicateResult){var destination=this.destination;Boolean(predicateResult)?destination.next(value):destination.complete()},TakeWhileSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function throttle(durationSelector){return this.lift(new ThrottleOperator(durationSelector))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.throttle=throttle;var ThrottleOperator=function(){function ThrottleOperator(durationSelector){this.durationSelector=durationSelector}return ThrottleOperator.prototype.call=function(subscriber,source){return source.subscribe(new ThrottleSubscriber(subscriber,this.durationSelector))},ThrottleOperator}(),ThrottleSubscriber=function(_super){function ThrottleSubscriber(destination,durationSelector){_super.call(this,destination),this.destination=destination,this.durationSelector=durationSelector}return __extends(ThrottleSubscriber,_super),ThrottleSubscriber.prototype._next=function(value){this.throttled||this.tryDurationSelector(value)},ThrottleSubscriber.prototype.tryDurationSelector=function(value){var duration=null;try{duration=this.durationSelector(value)}catch(err){return void this.destination.error(err)}this.emitAndThrottle(value,duration)},ThrottleSubscriber.prototype.emitAndThrottle=function(value,duration){this.add(this.throttled=subscribeToResult_1.subscribeToResult(this,duration)),this.destination.next(value)},ThrottleSubscriber.prototype._unsubscribe=function(){var throttled=this.throttled;throttled&&(this.remove(throttled),this.throttled=null,throttled.unsubscribe())},ThrottleSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this._unsubscribe()},ThrottleSubscriber.prototype.notifyComplete=function(){this._unsubscribe()},ThrottleSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function throttleTime(duration,scheduler){return void 0===scheduler&&(scheduler=async_1.async),this.lift(new ThrottleTimeOperator(duration,scheduler))}function dispatchNext(arg){var subscriber=arg.subscriber;subscriber.clearThrottle()}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),async_1=__webpack_require__(10);exports.throttleTime=throttleTime;var ThrottleTimeOperator=function(){function ThrottleTimeOperator(duration,scheduler){this.duration=duration,this.scheduler=scheduler}return ThrottleTimeOperator.prototype.call=function(subscriber,source){return source.subscribe(new ThrottleTimeSubscriber(subscriber,this.duration,this.scheduler))},ThrottleTimeOperator}(),ThrottleTimeSubscriber=function(_super){function ThrottleTimeSubscriber(destination,duration,scheduler){_super.call(this,destination),this.duration=duration,this.scheduler=scheduler}return __extends(ThrottleTimeSubscriber,_super),ThrottleTimeSubscriber.prototype._next=function(value){this.throttled||(this.add(this.throttled=this.scheduler.schedule(dispatchNext,this.duration,{subscriber:this})),this.destination.next(value))},ThrottleTimeSubscriber.prototype.clearThrottle=function(){var throttled=this.throttled;throttled&&(throttled.unsubscribe(),this.remove(throttled),this.throttled=null)},ThrottleTimeSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function timeout(due,scheduler){void 0===scheduler&&(scheduler=async_1.async);var absoluteTimeout=isDate_1.isDate(due),waitFor=absoluteTimeout?+due-scheduler.now():Math.abs(due);return this.lift(new TimeoutOperator(waitFor,absoluteTimeout,scheduler,new TimeoutError_1.TimeoutError))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},async_1=__webpack_require__(10),isDate_1=__webpack_require__(37),Subscriber_1=__webpack_require__(1),TimeoutError_1=__webpack_require__(92);exports.timeout=timeout;var TimeoutOperator=function(){function TimeoutOperator(waitFor,absoluteTimeout,scheduler,errorInstance){this.waitFor=waitFor,this.absoluteTimeout=absoluteTimeout,this.scheduler=scheduler,this.errorInstance=errorInstance}return TimeoutOperator.prototype.call=function(subscriber,source){return source.subscribe(new TimeoutSubscriber(subscriber,this.absoluteTimeout,this.waitFor,this.scheduler,this.errorInstance))},TimeoutOperator}(),TimeoutSubscriber=function(_super){function TimeoutSubscriber(destination,absoluteTimeout,waitFor,scheduler,errorInstance){_super.call(this,destination),this.absoluteTimeout=absoluteTimeout,this.waitFor=waitFor,this.scheduler=scheduler,this.errorInstance=errorInstance,this.index=0,this._previousIndex=0,this._hasCompleted=!1,this.scheduleTimeout()}return __extends(TimeoutSubscriber,_super),Object.defineProperty(TimeoutSubscriber.prototype,"previousIndex",{get:function(){return this._previousIndex},enumerable:!0,configurable:!0}),Object.defineProperty(TimeoutSubscriber.prototype,"hasCompleted",{get:function(){return this._hasCompleted},enumerable:!0,configurable:!0}),TimeoutSubscriber.dispatchTimeout=function(state){var source=state.subscriber,currentIndex=state.index;source.hasCompleted||source.previousIndex!==currentIndex||source.notifyTimeout()},TimeoutSubscriber.prototype.scheduleTimeout=function(){var currentIndex=this.index;this.scheduler.schedule(TimeoutSubscriber.dispatchTimeout,this.waitFor,{subscriber:this,index:currentIndex}),this.index++,this._previousIndex=currentIndex},TimeoutSubscriber.prototype._next=function(value){this.destination.next(value),this.absoluteTimeout||this.scheduleTimeout()},TimeoutSubscriber.prototype._error=function(err){this.destination.error(err),this._hasCompleted=!0},TimeoutSubscriber.prototype._complete=function(){this.destination.complete(),this._hasCompleted=!0},TimeoutSubscriber.prototype.notifyTimeout=function(){this.error(this.errorInstance)},TimeoutSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function timeoutWith(due,withObservable,scheduler){void 0===scheduler&&(scheduler=async_1.async);var absoluteTimeout=isDate_1.isDate(due),waitFor=absoluteTimeout?+due-scheduler.now():Math.abs(due);return this.lift(new TimeoutWithOperator(waitFor,absoluteTimeout,withObservable,scheduler))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},async_1=__webpack_require__(10),isDate_1=__webpack_require__(37),OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.timeoutWith=timeoutWith;var TimeoutWithOperator=function(){function TimeoutWithOperator(waitFor,absoluteTimeout,withObservable,scheduler){this.waitFor=waitFor,this.absoluteTimeout=absoluteTimeout,this.withObservable=withObservable,this.scheduler=scheduler}return TimeoutWithOperator.prototype.call=function(subscriber,source){return source.subscribe(new TimeoutWithSubscriber(subscriber,this.absoluteTimeout,this.waitFor,this.withObservable,this.scheduler))},TimeoutWithOperator}(),TimeoutWithSubscriber=function(_super){function TimeoutWithSubscriber(destination,absoluteTimeout,waitFor,withObservable,scheduler){_super.call(this),this.destination=destination,this.absoluteTimeout=absoluteTimeout,this.waitFor=waitFor,this.withObservable=withObservable,this.scheduler=scheduler,this.timeoutSubscription=void 0,this.index=0,this._previousIndex=0,this._hasCompleted=!1,destination.add(this),this.scheduleTimeout()}return __extends(TimeoutWithSubscriber,_super),Object.defineProperty(TimeoutWithSubscriber.prototype,"previousIndex",{get:function(){return this._previousIndex},enumerable:!0,configurable:!0}),Object.defineProperty(TimeoutWithSubscriber.prototype,"hasCompleted",{get:function(){return this._hasCompleted},enumerable:!0,configurable:!0}),TimeoutWithSubscriber.dispatchTimeout=function(state){var source=state.subscriber,currentIndex=state.index;source.hasCompleted||source.previousIndex!==currentIndex||source.handleTimeout()},TimeoutWithSubscriber.prototype.scheduleTimeout=function(){var currentIndex=this.index,timeoutState={subscriber:this,index:currentIndex};this.scheduler.schedule(TimeoutWithSubscriber.dispatchTimeout,this.waitFor,timeoutState),this.index++,this._previousIndex=currentIndex},TimeoutWithSubscriber.prototype._next=function(value){this.destination.next(value),this.absoluteTimeout||this.scheduleTimeout()},TimeoutWithSubscriber.prototype._error=function(err){this.destination.error(err),this._hasCompleted=!0},TimeoutWithSubscriber.prototype._complete=function(){this.destination.complete(),this._hasCompleted=!0},TimeoutWithSubscriber.prototype.handleTimeout=function(){if(!this.closed){var withObservable=this.withObservable;this.unsubscribe(),this.destination.add(this.timeoutSubscription=subscribeToResult_1.subscribeToResult(this,withObservable))}},TimeoutWithSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function toArray(){return this.lift(new ToArrayOperator)}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1);exports.toArray=toArray;var ToArrayOperator=function(){function ToArrayOperator(){}return ToArrayOperator.prototype.call=function(subscriber,source){return source.subscribe(new ToArraySubscriber(subscriber))},ToArrayOperator}(),ToArraySubscriber=function(_super){function ToArraySubscriber(destination){_super.call(this,destination),this.array=[]}return __extends(ToArraySubscriber,_super),ToArraySubscriber.prototype._next=function(x){
this.array.push(x)},ToArraySubscriber.prototype._complete=function(){this.destination.next(this.array),this.destination.complete()},ToArraySubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function toPromise(PromiseCtor){var _this=this;if(PromiseCtor||(root_1.root.Rx&&root_1.root.Rx.config&&root_1.root.Rx.config.Promise?PromiseCtor=root_1.root.Rx.config.Promise:root_1.root.Promise&&(PromiseCtor=root_1.root.Promise)),!PromiseCtor)throw new Error("no Promise impl found");return new PromiseCtor(function(resolve,reject){var value;_this.subscribe(function(x){return value=x},function(err){return reject(err)},function(){return resolve(value)})})}var root_1=__webpack_require__(8);exports.toPromise=toPromise},function(module,exports,__webpack_require__){"use strict";function window(windowBoundaries){return this.lift(new WindowOperator(windowBoundaries))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subject_1=__webpack_require__(6),OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.window=window;var WindowOperator=function(){function WindowOperator(windowBoundaries){this.windowBoundaries=windowBoundaries}return WindowOperator.prototype.call=function(subscriber,source){var windowSubscriber=new WindowSubscriber(subscriber),sourceSubscription=source.subscribe(windowSubscriber);return sourceSubscription.closed||windowSubscriber.add(subscribeToResult_1.subscribeToResult(windowSubscriber,this.windowBoundaries)),sourceSubscription},WindowOperator}(),WindowSubscriber=function(_super){function WindowSubscriber(destination){_super.call(this,destination),this.window=new Subject_1.Subject,destination.next(this.window)}return __extends(WindowSubscriber,_super),WindowSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this.openWindow()},WindowSubscriber.prototype.notifyError=function(error,innerSub){this._error(error)},WindowSubscriber.prototype.notifyComplete=function(innerSub){this._complete()},WindowSubscriber.prototype._next=function(value){this.window.next(value)},WindowSubscriber.prototype._error=function(err){this.window.error(err),this.destination.error(err)},WindowSubscriber.prototype._complete=function(){this.window.complete(),this.destination.complete()},WindowSubscriber.prototype._unsubscribe=function(){this.window=null},WindowSubscriber.prototype.openWindow=function(){var prevWindow=this.window;prevWindow&&prevWindow.complete();var destination=this.destination,newWindow=this.window=new Subject_1.Subject;destination.next(newWindow)},WindowSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function windowCount(windowSize,startWindowEvery){return void 0===startWindowEvery&&(startWindowEvery=0),this.lift(new WindowCountOperator(windowSize,startWindowEvery))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscriber_1=__webpack_require__(1),Subject_1=__webpack_require__(6);exports.windowCount=windowCount;var WindowCountOperator=function(){function WindowCountOperator(windowSize,startWindowEvery){this.windowSize=windowSize,this.startWindowEvery=startWindowEvery}return WindowCountOperator.prototype.call=function(subscriber,source){return source.subscribe(new WindowCountSubscriber(subscriber,this.windowSize,this.startWindowEvery))},WindowCountOperator}(),WindowCountSubscriber=function(_super){function WindowCountSubscriber(destination,windowSize,startWindowEvery){_super.call(this,destination),this.destination=destination,this.windowSize=windowSize,this.startWindowEvery=startWindowEvery,this.windows=[new Subject_1.Subject],this.count=0,destination.next(this.windows[0])}return __extends(WindowCountSubscriber,_super),WindowCountSubscriber.prototype._next=function(value){for(var startWindowEvery=this.startWindowEvery>0?this.startWindowEvery:this.windowSize,destination=this.destination,windowSize=this.windowSize,windows=this.windows,len=windows.length,i=0;i<len&&!this.closed;i++)windows[i].next(value);var c=this.count-windowSize+1;if(c>=0&&c%startWindowEvery===0&&!this.closed&&windows.shift().complete(),++this.count%startWindowEvery===0&&!this.closed){var window_1=new Subject_1.Subject;windows.push(window_1),destination.next(window_1)}},WindowCountSubscriber.prototype._error=function(err){var windows=this.windows;if(windows)for(;windows.length>0&&!this.closed;)windows.shift().error(err);this.destination.error(err)},WindowCountSubscriber.prototype._complete=function(){var windows=this.windows;if(windows)for(;windows.length>0&&!this.closed;)windows.shift().complete();this.destination.complete()},WindowCountSubscriber.prototype._unsubscribe=function(){this.count=0,this.windows=null},WindowCountSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function windowTime(windowTimeSpan){var scheduler=async_1.async,windowCreationInterval=null,maxWindowSize=Number.POSITIVE_INFINITY;return isScheduler_1.isScheduler(arguments[3])&&(scheduler=arguments[3]),isScheduler_1.isScheduler(arguments[2])?scheduler=arguments[2]:isNumeric_1.isNumeric(arguments[2])&&(maxWindowSize=arguments[2]),isScheduler_1.isScheduler(arguments[1])?scheduler=arguments[1]:isNumeric_1.isNumeric(arguments[1])&&(windowCreationInterval=arguments[1]),this.lift(new WindowTimeOperator(windowTimeSpan,windowCreationInterval,maxWindowSize,scheduler))}function dispatchWindowTimeSpanOnly(state){var subscriber=state.subscriber,windowTimeSpan=state.windowTimeSpan,window=state.window;window&&subscriber.closeWindow(window),state.window=subscriber.openWindow(),this.schedule(state,windowTimeSpan)}function dispatchWindowCreation(state){var windowTimeSpan=state.windowTimeSpan,subscriber=state.subscriber,scheduler=state.scheduler,windowCreationInterval=state.windowCreationInterval,window=subscriber.openWindow(),action=this,context={action:action,subscription:null},timeSpanState={subscriber:subscriber,window:window,context:context};context.subscription=scheduler.schedule(dispatchWindowClose,windowTimeSpan,timeSpanState),action.add(context.subscription),action.schedule(state,windowCreationInterval)}function dispatchWindowClose(state){var subscriber=state.subscriber,window=state.window,context=state.context;context&&context.action&&context.subscription&&context.action.remove(context.subscription),subscriber.closeWindow(window)}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subject_1=__webpack_require__(6),async_1=__webpack_require__(10),Subscriber_1=__webpack_require__(1),isNumeric_1=__webpack_require__(39),isScheduler_1=__webpack_require__(15);exports.windowTime=windowTime;var WindowTimeOperator=function(){function WindowTimeOperator(windowTimeSpan,windowCreationInterval,maxWindowSize,scheduler){this.windowTimeSpan=windowTimeSpan,this.windowCreationInterval=windowCreationInterval,this.maxWindowSize=maxWindowSize,this.scheduler=scheduler}return WindowTimeOperator.prototype.call=function(subscriber,source){return source.subscribe(new WindowTimeSubscriber(subscriber,this.windowTimeSpan,this.windowCreationInterval,this.maxWindowSize,this.scheduler))},WindowTimeOperator}(),CountedSubject=function(_super){function CountedSubject(){_super.apply(this,arguments),this._numberOfNextedValues=0}return __extends(CountedSubject,_super),CountedSubject.prototype.next=function(value){this._numberOfNextedValues++,_super.prototype.next.call(this,value)},Object.defineProperty(CountedSubject.prototype,"numberOfNextedValues",{get:function(){return this._numberOfNextedValues},enumerable:!0,configurable:!0}),CountedSubject}(Subject_1.Subject),WindowTimeSubscriber=function(_super){function WindowTimeSubscriber(destination,windowTimeSpan,windowCreationInterval,maxWindowSize,scheduler){_super.call(this,destination),this.destination=destination,this.windowTimeSpan=windowTimeSpan,this.windowCreationInterval=windowCreationInterval,this.maxWindowSize=maxWindowSize,this.scheduler=scheduler,this.windows=[];var window=this.openWindow();if(null!==windowCreationInterval&&windowCreationInterval>=0){var closeState={subscriber:this,window:window,context:null},creationState={windowTimeSpan:windowTimeSpan,windowCreationInterval:windowCreationInterval,subscriber:this,scheduler:scheduler};this.add(scheduler.schedule(dispatchWindowClose,windowTimeSpan,closeState)),this.add(scheduler.schedule(dispatchWindowCreation,windowCreationInterval,creationState))}else{var timeSpanOnlyState={subscriber:this,window:window,windowTimeSpan:windowTimeSpan};this.add(scheduler.schedule(dispatchWindowTimeSpanOnly,windowTimeSpan,timeSpanOnlyState))}}return __extends(WindowTimeSubscriber,_super),WindowTimeSubscriber.prototype._next=function(value){for(var windows=this.windows,len=windows.length,i=0;i<len;i++){var window_1=windows[i];window_1.closed||(window_1.next(value),window_1.numberOfNextedValues>=this.maxWindowSize&&this.closeWindow(window_1))}},WindowTimeSubscriber.prototype._error=function(err){for(var windows=this.windows;windows.length>0;)windows.shift().error(err);this.destination.error(err)},WindowTimeSubscriber.prototype._complete=function(){for(var windows=this.windows;windows.length>0;){var window_2=windows.shift();window_2.closed||window_2.complete()}this.destination.complete()},WindowTimeSubscriber.prototype.openWindow=function(){var window=new CountedSubject;this.windows.push(window);var destination=this.destination;return destination.next(window),window},WindowTimeSubscriber.prototype.closeWindow=function(window){window.complete();var windows=this.windows;windows.splice(windows.indexOf(window),1)},WindowTimeSubscriber}(Subscriber_1.Subscriber)},function(module,exports,__webpack_require__){"use strict";function windowToggle(openings,closingSelector){return this.lift(new WindowToggleOperator(openings,closingSelector))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subject_1=__webpack_require__(6),Subscription_1=__webpack_require__(5),tryCatch_1=__webpack_require__(9),errorObject_1=__webpack_require__(7),OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.windowToggle=windowToggle;var WindowToggleOperator=function(){function WindowToggleOperator(openings,closingSelector){this.openings=openings,this.closingSelector=closingSelector}return WindowToggleOperator.prototype.call=function(subscriber,source){return source.subscribe(new WindowToggleSubscriber(subscriber,this.openings,this.closingSelector))},WindowToggleOperator}(),WindowToggleSubscriber=function(_super){function WindowToggleSubscriber(destination,openings,closingSelector){_super.call(this,destination),this.openings=openings,this.closingSelector=closingSelector,this.contexts=[],this.add(this.openSubscription=subscribeToResult_1.subscribeToResult(this,openings,openings))}return __extends(WindowToggleSubscriber,_super),WindowToggleSubscriber.prototype._next=function(value){var contexts=this.contexts;if(contexts)for(var len=contexts.length,i=0;i<len;i++)contexts[i].window.next(value)},WindowToggleSubscriber.prototype._error=function(err){var contexts=this.contexts;if(this.contexts=null,contexts)for(var len=contexts.length,index=-1;++index<len;){var context=contexts[index];context.window.error(err),context.subscription.unsubscribe()}_super.prototype._error.call(this,err)},WindowToggleSubscriber.prototype._complete=function(){var contexts=this.contexts;if(this.contexts=null,contexts)for(var len=contexts.length,index=-1;++index<len;){var context=contexts[index];context.window.complete(),context.subscription.unsubscribe()}_super.prototype._complete.call(this)},WindowToggleSubscriber.prototype._unsubscribe=function(){var contexts=this.contexts;if(this.contexts=null,contexts)for(var len=contexts.length,index=-1;++index<len;){var context=contexts[index];context.window.unsubscribe(),context.subscription.unsubscribe()}},WindowToggleSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){if(outerValue===this.openings){var closingSelector=this.closingSelector,closingNotifier=tryCatch_1.tryCatch(closingSelector)(innerValue);if(closingNotifier===errorObject_1.errorObject)return this.error(errorObject_1.errorObject.e);var window_1=new Subject_1.Subject,subscription=new Subscription_1.Subscription,context={window:window_1,subscription:subscription};this.contexts.push(context);var innerSubscription=subscribeToResult_1.subscribeToResult(this,closingNotifier,context);innerSubscription.closed?this.closeWindow(this.contexts.length-1):(innerSubscription.context=context,subscription.add(innerSubscription)),this.destination.next(window_1)}else this.closeWindow(this.contexts.indexOf(outerValue))},WindowToggleSubscriber.prototype.notifyError=function(err){this.error(err)},WindowToggleSubscriber.prototype.notifyComplete=function(inner){inner!==this.openSubscription&&this.closeWindow(this.contexts.indexOf(inner.context))},WindowToggleSubscriber.prototype.closeWindow=function(index){if(index!==-1){var contexts=this.contexts,context=contexts[index],window=context.window,subscription=context.subscription;contexts.splice(index,1),window.complete(),subscription.unsubscribe()}},WindowToggleSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function windowWhen(closingSelector){return this.lift(new WindowOperator(closingSelector))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subject_1=__webpack_require__(6),tryCatch_1=__webpack_require__(9),errorObject_1=__webpack_require__(7),OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.windowWhen=windowWhen;var WindowOperator=function(){function WindowOperator(closingSelector){this.closingSelector=closingSelector}return WindowOperator.prototype.call=function(subscriber,source){return source.subscribe(new WindowSubscriber(subscriber,this.closingSelector))},WindowOperator}(),WindowSubscriber=function(_super){function WindowSubscriber(destination,closingSelector){_super.call(this,destination),this.destination=destination,this.closingSelector=closingSelector,this.openWindow()}return __extends(WindowSubscriber,_super),WindowSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this.openWindow(innerSub)},WindowSubscriber.prototype.notifyError=function(error,innerSub){this._error(error)},WindowSubscriber.prototype.notifyComplete=function(innerSub){this.openWindow(innerSub)},WindowSubscriber.prototype._next=function(value){this.window.next(value)},WindowSubscriber.prototype._error=function(err){this.window.error(err),this.destination.error(err),this.unsubscribeClosingNotification()},WindowSubscriber.prototype._complete=function(){this.window.complete(),this.destination.complete(),this.unsubscribeClosingNotification()},WindowSubscriber.prototype.unsubscribeClosingNotification=function(){this.closingNotification&&this.closingNotification.unsubscribe()},WindowSubscriber.prototype.openWindow=function(innerSub){void 0===innerSub&&(innerSub=null),innerSub&&(this.remove(innerSub),innerSub.unsubscribe());var prevWindow=this.window;prevWindow&&prevWindow.complete();var window=this.window=new Subject_1.Subject;this.destination.next(window);var closingNotifier=tryCatch_1.tryCatch(this.closingSelector)();if(closingNotifier===errorObject_1.errorObject){var err=errorObject_1.errorObject.e;this.destination.error(err),this.window.error(err)}else this.add(this.closingNotification=subscribeToResult_1.subscribeToResult(this,closingNotifier))},WindowSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function withLatestFrom(){for(var args=[],_i=0;_i<arguments.length;_i++)args[_i-0]=arguments[_i];var project;"function"==typeof args[args.length-1]&&(project=args.pop());var observables=args;return this.lift(new WithLatestFromOperator(observables,project))}var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},OuterSubscriber_1=__webpack_require__(2),subscribeToResult_1=__webpack_require__(3);exports.withLatestFrom=withLatestFrom;var WithLatestFromOperator=function(){function WithLatestFromOperator(observables,project){this.observables=observables,this.project=project}return WithLatestFromOperator.prototype.call=function(subscriber,source){return source.subscribe(new WithLatestFromSubscriber(subscriber,this.observables,this.project))},WithLatestFromOperator}(),WithLatestFromSubscriber=function(_super){function WithLatestFromSubscriber(destination,observables,project){_super.call(this,destination),this.observables=observables,this.project=project,this.toRespond=[];var len=observables.length;this.values=new Array(len);for(var i=0;i<len;i++)this.toRespond.push(i);for(var i=0;i<len;i++){var observable=observables[i];this.add(subscribeToResult_1.subscribeToResult(this,observable,observable,i))}}return __extends(WithLatestFromSubscriber,_super),WithLatestFromSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this.values[outerIndex]=innerValue;var toRespond=this.toRespond;if(toRespond.length>0){var found=toRespond.indexOf(outerIndex);found!==-1&&toRespond.splice(found,1)}},WithLatestFromSubscriber.prototype.notifyComplete=function(){},WithLatestFromSubscriber.prototype._next=function(value){if(0===this.toRespond.length){var args=[value].concat(this.values);this.project?this._tryProject(args):this.destination.next(args)}},WithLatestFromSubscriber.prototype._tryProject=function(args){var result;try{result=this.project.apply(this,args)}catch(err){return void this.destination.error(err)}this.destination.next(result)},WithLatestFromSubscriber}(OuterSubscriber_1.OuterSubscriber)},function(module,exports,__webpack_require__){"use strict";function zipAll(project){return this.lift(new zip_1.ZipOperator(project))}var zip_1=__webpack_require__(57);exports.zipAll=zipAll},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subscription_1=__webpack_require__(5),Action=function(_super){function Action(scheduler,work){_super.call(this)}return __extends(Action,_super),Action.prototype.schedule=function(state,delay){return void 0===delay&&(delay=0),this},Action}(Subscription_1.Subscription);exports.Action=Action},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},AsyncAction_1=__webpack_require__(23),AnimationFrame_1=__webpack_require__(416),AnimationFrameAction=function(_super){function AnimationFrameAction(scheduler,work){_super.call(this,scheduler,work),this.scheduler=scheduler,this.work=work}return __extends(AnimationFrameAction,_super),AnimationFrameAction.prototype.requestAsyncId=function(scheduler,id,delay){return void 0===delay&&(delay=0),null!==delay&&delay>0?_super.prototype.requestAsyncId.call(this,scheduler,id,delay):(scheduler.actions.push(this),scheduler.scheduled||(scheduler.scheduled=AnimationFrame_1.AnimationFrame.requestAnimationFrame(scheduler.flush.bind(scheduler,null))))},AnimationFrameAction.prototype.recycleAsyncId=function(scheduler,id,delay){return void 0===delay&&(delay=0),null!==delay&&delay>0||null===delay&&this.delay>0?_super.prototype.recycleAsyncId.call(this,scheduler,id,delay):void(0===scheduler.actions.length&&(AnimationFrame_1.AnimationFrame.cancelAnimationFrame(id),scheduler.scheduled=void 0))},AnimationFrameAction}(AsyncAction_1.AsyncAction);exports.AnimationFrameAction=AnimationFrameAction},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},AsyncScheduler_1=__webpack_require__(24),AnimationFrameScheduler=function(_super){function AnimationFrameScheduler(){_super.apply(this,arguments)}return __extends(AnimationFrameScheduler,_super),AnimationFrameScheduler.prototype.flush=function(action){this.active=!0,this.scheduled=void 0;var error,actions=this.actions,index=-1,count=actions.length;action=action||actions.shift();do if(error=action.execute(action.state,action.delay))break;while(++index<count&&(action=actions.shift()));if(this.active=!1,error){for(;++index<count&&(action=actions.shift());)action.unsubscribe();throw error}},AnimationFrameScheduler}(AsyncScheduler_1.AsyncScheduler);exports.AnimationFrameScheduler=AnimationFrameScheduler},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Immediate_1=__webpack_require__(418),AsyncAction_1=__webpack_require__(23),AsapAction=function(_super){function AsapAction(scheduler,work){_super.call(this,scheduler,work),this.scheduler=scheduler,this.work=work}return __extends(AsapAction,_super),AsapAction.prototype.requestAsyncId=function(scheduler,id,delay){return void 0===delay&&(delay=0),null!==delay&&delay>0?_super.prototype.requestAsyncId.call(this,scheduler,id,delay):(scheduler.actions.push(this),scheduler.scheduled||(scheduler.scheduled=Immediate_1.Immediate.setImmediate(scheduler.flush.bind(scheduler,null))))},AsapAction.prototype.recycleAsyncId=function(scheduler,id,delay){return void 0===delay&&(delay=0),null!==delay&&delay>0||null===delay&&this.delay>0?_super.prototype.recycleAsyncId.call(this,scheduler,id,delay):void(0===scheduler.actions.length&&(Immediate_1.Immediate.clearImmediate(id),scheduler.scheduled=void 0))},AsapAction}(AsyncAction_1.AsyncAction);exports.AsapAction=AsapAction},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},AsyncScheduler_1=__webpack_require__(24),AsapScheduler=function(_super){function AsapScheduler(){_super.apply(this,arguments)}return __extends(AsapScheduler,_super),AsapScheduler.prototype.flush=function(action){this.active=!0,this.scheduled=void 0;var error,actions=this.actions,index=-1,count=actions.length;action=action||actions.shift();do if(error=action.execute(action.state,action.delay))break;while(++index<count&&(action=actions.shift()));if(this.active=!1,error){for(;++index<count&&(action=actions.shift());)action.unsubscribe();throw error}},AsapScheduler}(AsyncScheduler_1.AsyncScheduler);exports.AsapScheduler=AsapScheduler},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},AsyncAction_1=__webpack_require__(23),QueueAction=function(_super){function QueueAction(scheduler,work){_super.call(this,scheduler,work),this.scheduler=scheduler,this.work=work}return __extends(QueueAction,_super),QueueAction.prototype.schedule=function(state,delay){return void 0===delay&&(delay=0),delay>0?_super.prototype.schedule.call(this,state,delay):(this.delay=delay,this.state=state,this.scheduler.flush(this),this)},QueueAction.prototype.execute=function(state,delay){return delay>0||this.closed?_super.prototype.execute.call(this,state,delay):this._execute(state,delay)},QueueAction.prototype.requestAsyncId=function(scheduler,id,delay){return void 0===delay&&(delay=0),null!==delay&&delay>0||null===delay&&this.delay>0?_super.prototype.requestAsyncId.call(this,scheduler,id,delay):scheduler.flush(this)},QueueAction}(AsyncAction_1.AsyncAction);exports.QueueAction=QueueAction},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},AsyncScheduler_1=__webpack_require__(24),QueueScheduler=function(_super){function QueueScheduler(){_super.apply(this,arguments)}return __extends(QueueScheduler,_super),QueueScheduler}(AsyncScheduler_1.AsyncScheduler);exports.QueueScheduler=QueueScheduler},function(module,exports,__webpack_require__){"use strict";var AnimationFrameAction_1=__webpack_require__(406),AnimationFrameScheduler_1=__webpack_require__(407);exports.animationFrame=new AnimationFrameScheduler_1.AnimationFrameScheduler(AnimationFrameAction_1.AnimationFrameAction)},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Observable_1=__webpack_require__(0),Subscription_1=__webpack_require__(5),SubscriptionLoggable_1=__webpack_require__(91),applyMixins_1=__webpack_require__(94),ColdObservable=function(_super){function ColdObservable(messages,scheduler){_super.call(this,function(subscriber){var observable=this,index=observable.logSubscribedFrame();return subscriber.add(new Subscription_1.Subscription(function(){observable.logUnsubscribedFrame(index)})),observable.scheduleMessages(subscriber),subscriber}),this.messages=messages,this.subscriptions=[],this.scheduler=scheduler}return __extends(ColdObservable,_super),ColdObservable.prototype.scheduleMessages=function(subscriber){for(var messagesLength=this.messages.length,i=0;i<messagesLength;i++){var message=this.messages[i];subscriber.add(this.scheduler.schedule(function(_a){var message=_a.message,subscriber=_a.subscriber;message.notification.observe(subscriber)},message.frame,{message:message,subscriber:subscriber}))}},ColdObservable}(Observable_1.Observable);exports.ColdObservable=ColdObservable,applyMixins_1.applyMixins(ColdObservable,[SubscriptionLoggable_1.SubscriptionLoggable])},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Subject_1=__webpack_require__(6),Subscription_1=__webpack_require__(5),SubscriptionLoggable_1=__webpack_require__(91),applyMixins_1=__webpack_require__(94),HotObservable=function(_super){function HotObservable(messages,scheduler){_super.call(this),this.messages=messages,this.subscriptions=[],this.scheduler=scheduler}return __extends(HotObservable,_super),HotObservable.prototype._subscribe=function(subscriber){var subject=this,index=subject.logSubscribedFrame();return subscriber.add(new Subscription_1.Subscription(function(){subject.logUnsubscribedFrame(index)})),_super.prototype._subscribe.call(this,subscriber)},HotObservable.prototype.setup=function(){for(var subject=this,messagesLength=subject.messages.length,i=0;i<messagesLength;i++)!function(){var message=subject.messages[i];subject.scheduler.schedule(function(){message.notification.observe(subject)},message.frame)}()},HotObservable}(Subject_1.Subject);exports.HotObservable=HotObservable,applyMixins_1.applyMixins(HotObservable,[SubscriptionLoggable_1.SubscriptionLoggable])},function(module,exports,__webpack_require__){"use strict";var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Observable_1=__webpack_require__(0),Notification_1=__webpack_require__(22),ColdObservable_1=__webpack_require__(413),HotObservable_1=__webpack_require__(414),SubscriptionLog_1=__webpack_require__(90),VirtualTimeScheduler_1=__webpack_require__(87),defaultMaxFrame=750,TestScheduler=function(_super){function TestScheduler(assertDeepEqual){_super.call(this,VirtualTimeScheduler_1.VirtualAction,defaultMaxFrame),this.assertDeepEqual=assertDeepEqual,this.hotObservables=[],this.coldObservables=[],this.flushTests=[]}return __extends(TestScheduler,_super),TestScheduler.prototype.createTime=function(marbles){var indexOf=marbles.indexOf("|");if(indexOf===-1)throw new Error('marble diagram for time should have a completion marker "|"');return indexOf*TestScheduler.frameTimeFactor},TestScheduler.prototype.createColdObservable=function(marbles,values,error){if(marbles.indexOf("^")!==-1)throw new Error('cold observable cannot have subscription offset "^"');if(marbles.indexOf("!")!==-1)throw new Error('cold observable cannot have unsubscription marker "!"');var messages=TestScheduler.parseMarbles(marbles,values,error),cold=new ColdObservable_1.ColdObservable(messages,this);return this.coldObservables.push(cold),cold},TestScheduler.prototype.createHotObservable=function(marbles,values,error){if(marbles.indexOf("!")!==-1)throw new Error('hot observable cannot have unsubscription marker "!"');var messages=TestScheduler.parseMarbles(marbles,values,error),subject=new HotObservable_1.HotObservable(messages,this);return this.hotObservables.push(subject),subject},TestScheduler.prototype.materializeInnerObservable=function(observable,outerFrame){var _this=this,messages=[];return observable.subscribe(function(value){messages.push({frame:_this.frame-outerFrame,notification:Notification_1.Notification.createNext(value)})},function(err){messages.push({frame:_this.frame-outerFrame,notification:Notification_1.Notification.createError(err)})},function(){messages.push({frame:_this.frame-outerFrame,notification:Notification_1.Notification.createComplete()})}),messages},TestScheduler.prototype.expectObservable=function(observable,unsubscriptionMarbles){var _this=this;void 0===unsubscriptionMarbles&&(unsubscriptionMarbles=null);var subscription,actual=[],flushTest={actual:actual,ready:!1},unsubscriptionFrame=TestScheduler.parseMarblesAsSubscriptions(unsubscriptionMarbles).unsubscribedFrame;return this.schedule(function(){subscription=observable.subscribe(function(x){var value=x;x instanceof Observable_1.Observable&&(value=_this.materializeInnerObservable(value,_this.frame)),actual.push({frame:_this.frame,notification:Notification_1.Notification.createNext(value)})},function(err){actual.push({frame:_this.frame,notification:Notification_1.Notification.createError(err)})},function(){actual.push({frame:_this.frame,notification:Notification_1.Notification.createComplete()})})},0),unsubscriptionFrame!==Number.POSITIVE_INFINITY&&this.schedule(function(){return subscription.unsubscribe()},unsubscriptionFrame),this.flushTests.push(flushTest),{toBe:function(marbles,values,errorValue){flushTest.ready=!0,flushTest.expected=TestScheduler.parseMarbles(marbles,values,errorValue,!0)}}},TestScheduler.prototype.expectSubscriptions=function(actualSubscriptionLogs){var flushTest={actual:actualSubscriptionLogs,ready:!1};return this.flushTests.push(flushTest),
{toBe:function(marbles){var marblesArray="string"==typeof marbles?[marbles]:marbles;flushTest.ready=!0,flushTest.expected=marblesArray.map(function(marbles){return TestScheduler.parseMarblesAsSubscriptions(marbles)})}}},TestScheduler.prototype.flush=function(){for(var hotObservables=this.hotObservables;hotObservables.length>0;)hotObservables.shift().setup();_super.prototype.flush.call(this);for(var readyFlushTests=this.flushTests.filter(function(test){return test.ready});readyFlushTests.length>0;){var test=readyFlushTests.shift();this.assertDeepEqual(test.actual,test.expected)}},TestScheduler.parseMarblesAsSubscriptions=function(marbles){if("string"!=typeof marbles)return new SubscriptionLog_1.SubscriptionLog(Number.POSITIVE_INFINITY);for(var len=marbles.length,groupStart=-1,subscriptionFrame=Number.POSITIVE_INFINITY,unsubscriptionFrame=Number.POSITIVE_INFINITY,i=0;i<len;i++){var frame=i*this.frameTimeFactor,c=marbles[i];switch(c){case"-":case" ":break;case"(":groupStart=frame;break;case")":groupStart=-1;break;case"^":if(subscriptionFrame!==Number.POSITIVE_INFINITY)throw new Error("found a second subscription point '^' in a subscription marble diagram. There can only be one.");subscriptionFrame=groupStart>-1?groupStart:frame;break;case"!":if(unsubscriptionFrame!==Number.POSITIVE_INFINITY)throw new Error("found a second subscription point '^' in a subscription marble diagram. There can only be one.");unsubscriptionFrame=groupStart>-1?groupStart:frame;break;default:throw new Error("there can only be '^' and '!' markers in a subscription marble diagram. Found instead '"+c+"'.")}}return unsubscriptionFrame<0?new SubscriptionLog_1.SubscriptionLog(subscriptionFrame):new SubscriptionLog_1.SubscriptionLog(subscriptionFrame,unsubscriptionFrame)},TestScheduler.parseMarbles=function(marbles,values,errorValue,materializeInnerObservables){if(void 0===materializeInnerObservables&&(materializeInnerObservables=!1),marbles.indexOf("!")!==-1)throw new Error('conventional marble diagrams cannot have the unsubscription marker "!"');for(var len=marbles.length,testMessages=[],subIndex=marbles.indexOf("^"),frameOffset=subIndex===-1?0:subIndex*-this.frameTimeFactor,getValue="object"!=typeof values?function(x){return x}:function(x){return materializeInnerObservables&&values[x]instanceof ColdObservable_1.ColdObservable?values[x].messages:values[x]},groupStart=-1,i=0;i<len;i++){var frame=i*this.frameTimeFactor+frameOffset,notification=void 0,c=marbles[i];switch(c){case"-":case" ":break;case"(":groupStart=frame;break;case")":groupStart=-1;break;case"|":notification=Notification_1.Notification.createComplete();break;case"^":break;case"#":notification=Notification_1.Notification.createError(errorValue||"error");break;default:notification=Notification_1.Notification.createNext(getValue(c))}notification&&testMessages.push({frame:groupStart>-1?groupStart:frame,notification:notification})}return testMessages},TestScheduler}(VirtualTimeScheduler_1.VirtualTimeScheduler);exports.TestScheduler=TestScheduler},function(module,exports,__webpack_require__){"use strict";var root_1=__webpack_require__(8),RequestAnimationFrameDefinition=function(){function RequestAnimationFrameDefinition(root){root.requestAnimationFrame?(this.cancelAnimationFrame=root.cancelAnimationFrame.bind(root),this.requestAnimationFrame=root.requestAnimationFrame.bind(root)):root.mozRequestAnimationFrame?(this.cancelAnimationFrame=root.mozCancelAnimationFrame.bind(root),this.requestAnimationFrame=root.mozRequestAnimationFrame.bind(root)):root.webkitRequestAnimationFrame?(this.cancelAnimationFrame=root.webkitCancelAnimationFrame.bind(root),this.requestAnimationFrame=root.webkitRequestAnimationFrame.bind(root)):root.msRequestAnimationFrame?(this.cancelAnimationFrame=root.msCancelAnimationFrame.bind(root),this.requestAnimationFrame=root.msRequestAnimationFrame.bind(root)):root.oRequestAnimationFrame?(this.cancelAnimationFrame=root.oCancelAnimationFrame.bind(root),this.requestAnimationFrame=root.oRequestAnimationFrame.bind(root)):(this.cancelAnimationFrame=root.clearTimeout.bind(root),this.requestAnimationFrame=function(cb){return root.setTimeout(cb,1e3/60)})}return RequestAnimationFrameDefinition}();exports.RequestAnimationFrameDefinition=RequestAnimationFrameDefinition,exports.AnimationFrame=new RequestAnimationFrameDefinition(root_1.root)},function(module,exports){"use strict";var FastMap=function(){function FastMap(){this.values={}}return FastMap.prototype["delete"]=function(key){return this.values[key]=null,!0},FastMap.prototype.set=function(key,value){return this.values[key]=value,this},FastMap.prototype.get=function(key){return this.values[key]},FastMap.prototype.forEach=function(cb,thisArg){var values=this.values;for(var key in values)values.hasOwnProperty(key)&&null!==values[key]&&cb.call(thisArg,values[key],key)},FastMap.prototype.clear=function(){this.values={}},FastMap}();exports.FastMap=FastMap},function(module,exports,__webpack_require__){"use strict";(function(clearImmediate,setImmediate){var root_1=__webpack_require__(8),ImmediateDefinition=function(){function ImmediateDefinition(root){if(this.root=root,root.setImmediate&&"function"==typeof root.setImmediate)this.setImmediate=root.setImmediate.bind(root),this.clearImmediate=root.clearImmediate.bind(root);else{this.nextHandle=1,this.tasksByHandle={},this.currentlyRunningATask=!1,this.canUseProcessNextTick()?this.setImmediate=this.createProcessNextTickSetImmediate():this.canUsePostMessage()?this.setImmediate=this.createPostMessageSetImmediate():this.canUseMessageChannel()?this.setImmediate=this.createMessageChannelSetImmediate():this.canUseReadyStateChange()?this.setImmediate=this.createReadyStateChangeSetImmediate():this.setImmediate=this.createSetTimeoutSetImmediate();var ci=function clearImmediate(handle){delete clearImmediate.instance.tasksByHandle[handle]};ci.instance=this,this.clearImmediate=ci}}return ImmediateDefinition.prototype.identify=function(o){return this.root.Object.prototype.toString.call(o)},ImmediateDefinition.prototype.canUseProcessNextTick=function(){return"[object process]"===this.identify(this.root.process)},ImmediateDefinition.prototype.canUseMessageChannel=function(){return Boolean(this.root.MessageChannel)},ImmediateDefinition.prototype.canUseReadyStateChange=function(){var document=this.root.document;return Boolean(document&&"onreadystatechange"in document.createElement("script"))},ImmediateDefinition.prototype.canUsePostMessage=function(){var root=this.root;if(root.postMessage&&!root.importScripts){var postMessageIsAsynchronous_1=!0,oldOnMessage=root.onmessage;return root.onmessage=function(){postMessageIsAsynchronous_1=!1},root.postMessage("","*"),root.onmessage=oldOnMessage,postMessageIsAsynchronous_1}return!1},ImmediateDefinition.prototype.partiallyApplied=function(handler){for(var args=[],_i=1;_i<arguments.length;_i++)args[_i-1]=arguments[_i];var fn=function result(){var _a=result,handler=_a.handler,args=_a.args;"function"==typeof handler?handler.apply(void 0,args):new Function(""+handler)()};return fn.handler=handler,fn.args=args,fn},ImmediateDefinition.prototype.addFromSetImmediateArguments=function(args){return this.tasksByHandle[this.nextHandle]=this.partiallyApplied.apply(void 0,args),this.nextHandle++},ImmediateDefinition.prototype.createProcessNextTickSetImmediate=function(){var fn=function setImmediate(){var instance=setImmediate.instance,handle=instance.addFromSetImmediateArguments(arguments);return instance.root.process.nextTick(instance.partiallyApplied(instance.runIfPresent,handle)),handle};return fn.instance=this,fn},ImmediateDefinition.prototype.createPostMessageSetImmediate=function(){var root=this.root,messagePrefix="setImmediate$"+root.Math.random()+"$",onGlobalMessage=function globalMessageHandler(event){var instance=globalMessageHandler.instance;event.source===root&&"string"==typeof event.data&&0===event.data.indexOf(messagePrefix)&&instance.runIfPresent(+event.data.slice(messagePrefix.length))};onGlobalMessage.instance=this,root.addEventListener("message",onGlobalMessage,!1);var fn=function setImmediate(){var _a=setImmediate,messagePrefix=_a.messagePrefix,instance=_a.instance,handle=instance.addFromSetImmediateArguments(arguments);return instance.root.postMessage(messagePrefix+handle,"*"),handle};return fn.instance=this,fn.messagePrefix=messagePrefix,fn},ImmediateDefinition.prototype.runIfPresent=function(handle){if(this.currentlyRunningATask)this.root.setTimeout(this.partiallyApplied(this.runIfPresent,handle),0);else{var task=this.tasksByHandle[handle];if(task){this.currentlyRunningATask=!0;try{task()}finally{this.clearImmediate(handle),this.currentlyRunningATask=!1}}}},ImmediateDefinition.prototype.createMessageChannelSetImmediate=function(){var _this=this,channel=new this.root.MessageChannel;channel.port1.onmessage=function(event){var handle=event.data;_this.runIfPresent(handle)};var fn=function setImmediate(){var _a=setImmediate,channel=_a.channel,instance=_a.instance,handle=instance.addFromSetImmediateArguments(arguments);return channel.port2.postMessage(handle),handle};return fn.channel=channel,fn.instance=this,fn},ImmediateDefinition.prototype.createReadyStateChangeSetImmediate=function(){var fn=function setImmediate(){var instance=setImmediate.instance,root=instance.root,doc=root.document,html=doc.documentElement,handle=instance.addFromSetImmediateArguments(arguments),script=doc.createElement("script");return script.onreadystatechange=function(){instance.runIfPresent(handle),script.onreadystatechange=null,html.removeChild(script),script=null},html.appendChild(script),handle};return fn.instance=this,fn},ImmediateDefinition.prototype.createSetTimeoutSetImmediate=function(){var fn=function setImmediate(){var instance=setImmediate.instance,handle=instance.addFromSetImmediateArguments(arguments);return instance.root.setTimeout(instance.partiallyApplied(instance.runIfPresent,handle),0),handle};return fn.instance=this,fn},ImmediateDefinition}();exports.ImmediateDefinition=ImmediateDefinition,exports.Immediate=new ImmediateDefinition(root_1.root)}).call(exports,__webpack_require__(29).clearImmediate,__webpack_require__(29).setImmediate)},function(module,exports,__webpack_require__){"use strict";var root_1=__webpack_require__(8),MapPolyfill_1=__webpack_require__(420);exports.Map=root_1.root.Map||function(){return MapPolyfill_1.MapPolyfill}()},function(module,exports){"use strict";var MapPolyfill=function(){function MapPolyfill(){this.size=0,this._values=[],this._keys=[]}return MapPolyfill.prototype.get=function(key){var i=this._keys.indexOf(key);return i===-1?void 0:this._values[i]},MapPolyfill.prototype.set=function(key,value){var i=this._keys.indexOf(key);return i===-1?(this._keys.push(key),this._values.push(value),this.size++):this._values[i]=value,this},MapPolyfill.prototype["delete"]=function(key){var i=this._keys.indexOf(key);return i!==-1&&(this._values.splice(i,1),this._keys.splice(i,1),this.size--,!0)},MapPolyfill.prototype.clear=function(){this._keys.length=0,this._values.length=0,this.size=0},MapPolyfill.prototype.forEach=function(cb,thisArg){for(var i=0;i<this.size;i++)cb.call(thisArg,this._values[i],this._keys[i])},MapPolyfill}();exports.MapPolyfill=MapPolyfill},function(module,exports,__webpack_require__){"use strict";function minimalSetImpl(){return function(){function MinimalSet(){this._values=[]}return MinimalSet.prototype.add=function(value){this.has(value)||this._values.push(value)},MinimalSet.prototype.has=function(value){return this._values.indexOf(value)!==-1},Object.defineProperty(MinimalSet.prototype,"size",{get:function(){return this._values.length},enumerable:!0,configurable:!0}),MinimalSet.prototype.clear=function(){this._values.length=0},MinimalSet}()}var root_1=__webpack_require__(8);exports.minimalSetImpl=minimalSetImpl,exports.Set=root_1.root.Set||minimalSetImpl()},function(module,exports,__webpack_require__){"use strict";function assignImpl(target){for(var sources=[],_i=1;_i<arguments.length;_i++)sources[_i-1]=arguments[_i];for(var len=sources.length,i=0;i<len;i++){var source=sources[i];for(var k in source)source.hasOwnProperty(k)&&(target[k]=source[k])}return target}function getAssign(root){return root.Object.assign||assignImpl}var root_1=__webpack_require__(8);exports.assignImpl=assignImpl,exports.getAssign=getAssign,exports.assign=getAssign(root_1.root)},function(module,exports){"use strict";function not(pred,thisArg){function notPred(){return!notPred.pred.apply(notPred.thisArg,arguments)}return notPred.pred=pred,notPred.thisArg=thisArg,notPred}exports.not=not},function(module,exports,__webpack_require__){"use strict";function toSubscriber(nextOrObserver,error,complete){if(nextOrObserver){if(nextOrObserver instanceof Subscriber_1.Subscriber)return nextOrObserver;if(nextOrObserver[rxSubscriber_1.$$rxSubscriber])return nextOrObserver[rxSubscriber_1.$$rxSubscriber]()}return nextOrObserver||error||complete?new Subscriber_1.Subscriber(nextOrObserver,error,complete):new Subscriber_1.Subscriber(Observer_1.empty)}var Subscriber_1=__webpack_require__(1),rxSubscriber_1=__webpack_require__(33),Observer_1=__webpack_require__(71);exports.toSubscriber=toSubscriber},function(module,exports,__webpack_require__){(function(global){function url(uri,loc){var obj=uri;loc=loc||global.location,null==uri&&(uri=loc.protocol+"//"+loc.host),"string"==typeof uri&&("/"===uri.charAt(0)&&(uri="/"===uri.charAt(1)?loc.protocol+uri:loc.host+uri),/^(https?|wss?):\/\//.test(uri)||(debug("protocol-less url %s",uri),uri="undefined"!=typeof loc?loc.protocol+"//"+uri:"https://"+uri),debug("parse %s",uri),obj=parseuri(uri)),obj.port||(/^(http|ws)$/.test(obj.protocol)?obj.port="80":/^(http|ws)s$/.test(obj.protocol)&&(obj.port="443")),obj.path=obj.path||"/";var ipv6=obj.host.indexOf(":")!==-1,host=ipv6?"["+obj.host+"]":obj.host;return obj.id=obj.protocol+"://"+host+":"+obj.port,obj.href=obj.protocol+"://"+host+(loc&&loc.port===obj.port?"":":"+obj.port),obj}var parseuri=__webpack_require__(108),debug=__webpack_require__(18)("socket.io-client:url");module.exports=url}).call(exports,__webpack_require__(4))},function(module,exports){function Backoff(opts){opts=opts||{},this.ms=opts.min||100,this.max=opts.max||1e4,this.factor=opts.factor||2,this.jitter=opts.jitter>0&&opts.jitter<=1?opts.jitter:0,this.attempts=0}module.exports=Backoff,Backoff.prototype.duration=function(){var ms=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var rand=Math.random(),deviation=Math.floor(rand*this.jitter*ms);ms=0==(1&Math.floor(10*rand))?ms-deviation:ms+deviation}return 0|Math.min(ms,this.max)},Backoff.prototype.reset=function(){this.attempts=0},Backoff.prototype.setMin=function(min){this.ms=min},Backoff.prototype.setMax=function(max){this.max=max},Backoff.prototype.setJitter=function(jitter){this.jitter=jitter}},function(module,exports,__webpack_require__){function selectColor(){return exports.colors[prevColor++%exports.colors.length]}function debug(namespace){function disabled(){}function enabled(){var self=enabled,curr=+new Date,ms=curr-(prevTime||curr);self.diff=ms,self.prev=prevTime,self.curr=curr,prevTime=curr,null==self.useColors&&(self.useColors=exports.useColors()),null==self.color&&self.useColors&&(self.color=selectColor());for(var args=new Array(arguments.length),i=0;i<args.length;i++)args[i]=arguments[i];args[0]=exports.coerce(args[0]),"string"!=typeof args[0]&&(args=["%o"].concat(args));var index=0;args[0]=args[0].replace(/%([a-z%])/g,function(match,format){if("%%"===match)return match;index++;var formatter=exports.formatters[format];if("function"==typeof formatter){var val=args[index];match=formatter.call(self,val),args.splice(index,1),index--}return match}),args=exports.formatArgs.apply(self,args);var logFn=enabled.log||exports.log||console.log.bind(console);logFn.apply(self,args)}disabled.enabled=!1,enabled.enabled=!0;var fn=exports.enabled(namespace)?enabled:disabled;return fn.namespace=namespace,fn}function enable(namespaces){exports.save(namespaces);for(var split=(namespaces||"").split(/[\s,]+/),len=split.length,i=0;i<len;i++)split[i]&&(namespaces=split[i].replace(/[\\^$+?.()|[\]{}]/g,"\\$&").replace(/\*/g,".*?"),"-"===namespaces[0]?exports.skips.push(new RegExp("^"+namespaces.substr(1)+"$")):exports.names.push(new RegExp("^"+namespaces+"$")))}function disable(){exports.enable("")}function enabled(name){var i,len;for(i=0,len=exports.skips.length;i<len;i++)if(exports.skips[i].test(name))return!1;for(i=0,len=exports.names.length;i<len;i++)if(exports.names[i].test(name))return!0;return!1}function coerce(val){return val instanceof Error?val.stack||val.message:val}exports=module.exports=debug.debug=debug,exports.coerce=coerce,exports.disable=disable,exports.enable=enable,exports.enabled=enabled,exports.humanize=__webpack_require__(428),exports.names=[],exports.skips=[],exports.formatters={};var prevTime,prevColor=0},function(module,exports){function parse(str){if(str=String(str),!(str.length>1e4)){var match=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str);if(match){var n=parseFloat(match[1]),type=(match[2]||"ms").toLowerCase();switch(type){case"years":case"year":case"yrs":case"yr":case"y":return n*y;case"days":case"day":case"d":return n*d;case"hours":case"hour":case"hrs":case"hr":case"h":return n*h;case"minutes":case"minute":case"mins":case"min":case"m":return n*m;case"seconds":case"second":case"secs":case"sec":case"s":return n*s;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n;default:return}}}}function fmtShort(ms){return ms>=d?Math.round(ms/d)+"d":ms>=h?Math.round(ms/h)+"h":ms>=m?Math.round(ms/m)+"m":ms>=s?Math.round(ms/s)+"s":ms+"ms"}function fmtLong(ms){return plural(ms,d,"day")||plural(ms,h,"hour")||plural(ms,m,"minute")||plural(ms,s,"second")||ms+" ms"}function plural(ms,n,name){if(!(ms<n))return ms<1.5*n?Math.floor(ms/n)+" "+name:Math.ceil(ms/n)+" "+name+"s"}var s=1e3,m=60*s,h=60*m,d=24*h,y=365.25*d;module.exports=function(val,options){options=options||{};var type=typeof val;if("string"===type&&val.length>0)return parse(val);if("number"===type&&isNaN(val)===!1)return options["long"]?fmtLong(val):fmtShort(val);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(val))}},function(module,exports,__webpack_require__){module.exports=__webpack_require__(430)},function(module,exports,__webpack_require__){module.exports=__webpack_require__(431),module.exports.parser=__webpack_require__(21)},function(module,exports,__webpack_require__){(function(global){function Socket(uri,opts){if(!(this instanceof Socket))return new Socket(uri,opts);opts=opts||{},uri&&"object"==typeof uri&&(opts=uri,uri=null),uri?(uri=parseuri(uri),opts.hostname=uri.host,opts.secure="https"===uri.protocol||"wss"===uri.protocol,opts.port=uri.port,uri.query&&(opts.query=uri.query)):opts.host&&(opts.hostname=parseuri(opts.host).host),this.secure=null!=opts.secure?opts.secure:global.location&&"https:"===location.protocol,opts.hostname&&!opts.port&&(opts.port=this.secure?"443":"80"),this.agent=opts.agent||!1,this.hostname=opts.hostname||(global.location?location.hostname:"localhost"),this.port=opts.port||(global.location&&location.port?location.port:this.secure?443:80),this.query=opts.query||{},"string"==typeof this.query&&(this.query=parseqs.decode(this.query)),this.upgrade=!1!==opts.upgrade,this.path=(opts.path||"/engine.io").replace(/\/$/,"")+"/",this.forceJSONP=!!opts.forceJSONP,this.jsonp=!1!==opts.jsonp,this.forceBase64=!!opts.forceBase64,this.enablesXDR=!!opts.enablesXDR,this.timestampParam=opts.timestampParam||"t",this.timestampRequests=opts.timestampRequests,this.transports=opts.transports||["polling","websocket"],this.readyState="",this.writeBuffer=[],this.prevBufferLen=0,this.policyPort=opts.policyPort||843,this.rememberUpgrade=opts.rememberUpgrade||!1,this.binaryType=null,this.onlyBinaryUpgrades=opts.onlyBinaryUpgrades,this.perMessageDeflate=!1!==opts.perMessageDeflate&&(opts.perMessageDeflate||{}),!0===this.perMessageDeflate&&(this.perMessageDeflate={}),this.perMessageDeflate&&null==this.perMessageDeflate.threshold&&(this.perMessageDeflate.threshold=1024),this.pfx=opts.pfx||null,this.key=opts.key||null,this.passphrase=opts.passphrase||null,this.cert=opts.cert||null,this.ca=opts.ca||null,this.ciphers=opts.ciphers||null,this.rejectUnauthorized=void 0===opts.rejectUnauthorized?null:opts.rejectUnauthorized,this.forceNode=!!opts.forceNode;var freeGlobal="object"==typeof global&&global;freeGlobal.global===freeGlobal&&(opts.extraHeaders&&Object.keys(opts.extraHeaders).length>0&&(this.extraHeaders=opts.extraHeaders),opts.localAddress&&(this.localAddress=opts.localAddress)),this.id=null,this.upgrades=null,this.pingInterval=null,this.pingTimeout=null,this.pingIntervalTimer=null,this.pingTimeoutTimer=null,this.open()}function clone(obj){var o={};for(var i in obj)obj.hasOwnProperty(i)&&(o[i]=obj[i]);return o}var transports=__webpack_require__(103),Emitter=__webpack_require__(26),debug=__webpack_require__(18)("engine.io-client:socket"),index=__webpack_require__(107),parser=__webpack_require__(21),parseuri=__webpack_require__(108),parsejson=__webpack_require__(442),parseqs=__webpack_require__(60);module.exports=Socket,Socket.priorWebsocketSuccess=!1,Emitter(Socket.prototype),Socket.protocol=parser.protocol,Socket.Socket=Socket,Socket.Transport=__webpack_require__(58),Socket.transports=__webpack_require__(103),Socket.parser=__webpack_require__(21),Socket.prototype.createTransport=function(name){debug('creating transport "%s"',name);var query=clone(this.query);query.EIO=parser.protocol,query.transport=name,this.id&&(query.sid=this.id);var transport=new transports[name]({agent:this.agent,hostname:this.hostname,port:this.port,secure:this.secure,path:this.path,query:query,forceJSONP:this.forceJSONP,jsonp:this.jsonp,forceBase64:this.forceBase64,enablesXDR:this.enablesXDR,timestampRequests:this.timestampRequests,timestampParam:this.timestampParam,policyPort:this.policyPort,socket:this,pfx:this.pfx,key:this.key,passphrase:this.passphrase,cert:this.cert,ca:this.ca,ciphers:this.ciphers,rejectUnauthorized:this.rejectUnauthorized,perMessageDeflate:this.perMessageDeflate,extraHeaders:this.extraHeaders,forceNode:this.forceNode,localAddress:this.localAddress});return transport},Socket.prototype.open=function(){var transport;if(this.rememberUpgrade&&Socket.priorWebsocketSuccess&&this.transports.indexOf("websocket")!==-1)transport="websocket";else{if(0===this.transports.length){var self=this;return void setTimeout(function(){self.emit("error","No transports available")},0)}transport=this.transports[0]}this.readyState="opening";try{transport=this.createTransport(transport)}catch(e){return this.transports.shift(),void this.open()}transport.open(),this.setTransport(transport)},Socket.prototype.setTransport=function(transport){debug("setting transport %s",transport.name);var self=this;this.transport&&(debug("clearing existing transport %s",this.transport.name),this.transport.removeAllListeners()),this.transport=transport,transport.on("drain",function(){self.onDrain()}).on("packet",function(packet){self.onPacket(packet)}).on("error",function(e){self.onError(e)}).on("close",function(){self.onClose("transport close")})},Socket.prototype.probe=function(name){function onTransportOpen(){if(self.onlyBinaryUpgrades){var upgradeLosesBinary=!this.supportsBinary&&self.transport.supportsBinary;failed=failed||upgradeLosesBinary}failed||(debug('probe transport "%s" opened',name),transport.send([{type:"ping",data:"probe"}]),transport.once("packet",function(msg){if(!failed)if("pong"===msg.type&&"probe"===msg.data){if(debug('probe transport "%s" pong',name),self.upgrading=!0,self.emit("upgrading",transport),!transport)return;Socket.priorWebsocketSuccess="websocket"===transport.name,debug('pausing current transport "%s"',self.transport.name),self.transport.pause(function(){failed||"closed"!==self.readyState&&(debug("changing transport and sending upgrade packet"),cleanup(),self.setTransport(transport),transport.send([{type:"upgrade"}]),self.emit("upgrade",transport),transport=null,self.upgrading=!1,self.flush())})}else{debug('probe transport "%s" failed',name);var err=new Error("probe error");err.transport=transport.name,self.emit("upgradeError",err)}}))}function freezeTransport(){failed||(failed=!0,cleanup(),transport.close(),transport=null)}function onerror(err){var error=new Error("probe error: "+err);error.transport=transport.name,freezeTransport(),debug('probe transport "%s" failed because of error: %s',name,err),self.emit("upgradeError",error)}function onTransportClose(){onerror("transport closed")}function onclose(){onerror("socket closed")}function onupgrade(to){transport&&to.name!==transport.name&&(debug('"%s" works - aborting "%s"',to.name,transport.name),freezeTransport())}function cleanup(){transport.removeListener("open",onTransportOpen),transport.removeListener("error",onerror),transport.removeListener("close",onTransportClose),self.removeListener("close",onclose),self.removeListener("upgrading",onupgrade)}debug('probing transport "%s"',name);var transport=this.createTransport(name,{probe:1}),failed=!1,self=this;Socket.priorWebsocketSuccess=!1,transport.once("open",onTransportOpen),transport.once("error",onerror),transport.once("close",onTransportClose),this.once("close",onclose),this.once("upgrading",onupgrade),transport.open()},Socket.prototype.onOpen=function(){if(debug("socket open"),this.readyState="open",Socket.priorWebsocketSuccess="websocket"===this.transport.name,this.emit("open"),this.flush(),"open"===this.readyState&&this.upgrade&&this.transport.pause){debug("starting upgrade probes");for(var i=0,l=this.upgrades.length;i<l;i++)this.probe(this.upgrades[i])}},Socket.prototype.onPacket=function(packet){if("opening"===this.readyState||"open"===this.readyState||"closing"===this.readyState)switch(debug('socket receive: type "%s", data "%s"',packet.type,packet.data),this.emit("packet",packet),this.emit("heartbeat"),packet.type){case"open":this.onHandshake(parsejson(packet.data));break;case"pong":this.setPing(),this.emit("pong");break;case"error":var err=new Error("server error");err.code=packet.data,this.onError(err);break;case"message":this.emit("data",packet.data),this.emit("message",packet.data)}else debug('packet received with socket readyState "%s"',this.readyState)},Socket.prototype.onHandshake=function(data){this.emit("handshake",data),this.id=data.sid,this.transport.query.sid=data.sid,this.upgrades=this.filterUpgrades(data.upgrades),this.pingInterval=data.pingInterval,this.pingTimeout=data.pingTimeout,this.onOpen(),"closed"!==this.readyState&&(this.setPing(),this.removeListener("heartbeat",this.onHeartbeat),this.on("heartbeat",this.onHeartbeat))},Socket.prototype.onHeartbeat=function(timeout){clearTimeout(this.pingTimeoutTimer);var self=this;self.pingTimeoutTimer=setTimeout(function(){"closed"!==self.readyState&&self.onClose("ping timeout")},timeout||self.pingInterval+self.pingTimeout)},Socket.prototype.setPing=function(){var self=this;clearTimeout(self.pingIntervalTimer),self.pingIntervalTimer=setTimeout(function(){debug("writing ping packet - expecting pong within %sms",self.pingTimeout),self.ping(),self.onHeartbeat(self.pingTimeout)},self.pingInterval)},Socket.prototype.ping=function(){var self=this;this.sendPacket("ping",function(){self.emit("ping")})},Socket.prototype.onDrain=function(){this.writeBuffer.splice(0,this.prevBufferLen),this.prevBufferLen=0,0===this.writeBuffer.length?this.emit("drain"):this.flush()},Socket.prototype.flush=function(){"closed"!==this.readyState&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length&&(debug("flushing %d packets in socket",this.writeBuffer.length),this.transport.send(this.writeBuffer),this.prevBufferLen=this.writeBuffer.length,this.emit("flush"))},Socket.prototype.write=Socket.prototype.send=function(msg,options,fn){return this.sendPacket("message",msg,options,fn),this},Socket.prototype.sendPacket=function(type,data,options,fn){if("function"==typeof data&&(fn=data,data=void 0),"function"==typeof options&&(fn=options,options=null),"closing"!==this.readyState&&"closed"!==this.readyState){options=options||{},options.compress=!1!==options.compress;var packet={type:type,data:data,options:options};this.emit("packetCreate",packet),this.writeBuffer.push(packet),fn&&this.once("flush",fn),this.flush()}},Socket.prototype.close=function(){function close(){self.onClose("forced close"),debug("socket closing - telling transport to close"),self.transport.close()}function cleanupAndClose(){self.removeListener("upgrade",cleanupAndClose),self.removeListener("upgradeError",cleanupAndClose),close()}function waitForUpgrade(){self.once("upgrade",cleanupAndClose),self.once("upgradeError",cleanupAndClose)}if("opening"===this.readyState||"open"===this.readyState){this.readyState="closing";var self=this;this.writeBuffer.length?this.once("drain",function(){this.upgrading?waitForUpgrade():close()}):this.upgrading?waitForUpgrade():close()}return this},Socket.prototype.onError=function(err){debug("socket error %j",err),Socket.priorWebsocketSuccess=!1,this.emit("error",err),this.onClose("transport error",err)},Socket.prototype.onClose=function(reason,desc){if("opening"===this.readyState||"open"===this.readyState||"closing"===this.readyState){debug('socket close with reason: "%s"',reason);var self=this;clearTimeout(this.pingIntervalTimer),clearTimeout(this.pingTimeoutTimer),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),this.readyState="closed",this.id=null,this.emit("close",reason,desc),self.writeBuffer=[],self.prevBufferLen=0}},Socket.prototype.filterUpgrades=function(upgrades){for(var filteredUpgrades=[],i=0,j=upgrades.length;i<j;i++)~index(this.transports,upgrades[i])&&filteredUpgrades.push(upgrades[i]);return filteredUpgrades}}).call(exports,__webpack_require__(4))},function(module,exports,__webpack_require__){(function(global){function empty(){}function JSONPPolling(opts){Polling.call(this,opts),this.query=this.query||{},callbacks||(global.___eio||(global.___eio=[]),callbacks=global.___eio),this.index=callbacks.length;var self=this;callbacks.push(function(msg){self.onData(msg)}),this.query.j=this.index,global.document&&global.addEventListener&&global.addEventListener("beforeunload",function(){self.script&&(self.script.onerror=empty)},!1)}var Polling=__webpack_require__(104),inherit=__webpack_require__(40);module.exports=JSONPPolling;var callbacks,rNewline=/\n/g,rEscapedNewline=/\\n/g;inherit(JSONPPolling,Polling),JSONPPolling.prototype.supportsBinary=!1,JSONPPolling.prototype.doClose=function(){this.script&&(this.script.parentNode.removeChild(this.script),this.script=null),this.form&&(this.form.parentNode.removeChild(this.form),this.form=null,this.iframe=null),Polling.prototype.doClose.call(this)},JSONPPolling.prototype.doPoll=function(){var self=this,script=document.createElement("script");this.script&&(this.script.parentNode.removeChild(this.script),this.script=null),script.async=!0,script.src=this.uri(),script.onerror=function(e){self.onError("jsonp poll error",e)};var insertAt=document.getElementsByTagName("script")[0];insertAt?insertAt.parentNode.insertBefore(script,insertAt):(document.head||document.body).appendChild(script),this.script=script;var isUAgecko="undefined"!=typeof navigator&&/gecko/i.test(navigator.userAgent);isUAgecko&&setTimeout(function(){var iframe=document.createElement("iframe");document.body.appendChild(iframe),document.body.removeChild(iframe)},100)},JSONPPolling.prototype.doWrite=function(data,fn){function complete(){initIframe(),fn()}function initIframe(){if(self.iframe)try{self.form.removeChild(self.iframe)}catch(e){self.onError("jsonp polling iframe removal error",e)}try{var html='<iframe src="javascript:0" name="'+self.iframeId+'">';iframe=document.createElement(html)}catch(e){iframe=document.createElement("iframe"),iframe.name=self.iframeId,
iframe.src="javascript:0"}iframe.id=self.iframeId,self.form.appendChild(iframe),self.iframe=iframe}var self=this;if(!this.form){var iframe,form=document.createElement("form"),area=document.createElement("textarea"),id=this.iframeId="eio_iframe_"+this.index;form.className="socketio",form.style.position="absolute",form.style.top="-1000px",form.style.left="-1000px",form.target=id,form.method="POST",form.setAttribute("accept-charset","utf-8"),area.name="d",form.appendChild(area),document.body.appendChild(form),this.form=form,this.area=area}this.form.action=this.uri(),initIframe(),data=data.replace(rEscapedNewline,"\\\n"),this.area.value=data.replace(rNewline,"\\n");try{this.form.submit()}catch(e){}this.iframe.attachEvent?this.iframe.onreadystatechange=function(){"complete"===self.iframe.readyState&&complete()}:this.iframe.onload=complete}}).call(exports,__webpack_require__(4))},function(module,exports,__webpack_require__){(function(global){function empty(){}function XHR(opts){if(Polling.call(this,opts),this.requestTimeout=opts.requestTimeout,global.location){var isSSL="https:"===location.protocol,port=location.port;port||(port=isSSL?443:80),this.xd=opts.hostname!==global.location.hostname||port!==opts.port,this.xs=opts.secure!==isSSL}else this.extraHeaders=opts.extraHeaders}function Request(opts){this.method=opts.method||"GET",this.uri=opts.uri,this.xd=!!opts.xd,this.xs=!!opts.xs,this.async=!1!==opts.async,this.data=void 0!==opts.data?opts.data:null,this.agent=opts.agent,this.isBinary=opts.isBinary,this.supportsBinary=opts.supportsBinary,this.enablesXDR=opts.enablesXDR,this.requestTimeout=opts.requestTimeout,this.pfx=opts.pfx,this.key=opts.key,this.passphrase=opts.passphrase,this.cert=opts.cert,this.ca=opts.ca,this.ciphers=opts.ciphers,this.rejectUnauthorized=opts.rejectUnauthorized,this.extraHeaders=opts.extraHeaders,this.create()}function unloadHandler(){for(var i in Request.requests)Request.requests.hasOwnProperty(i)&&Request.requests[i].abort()}var XMLHttpRequest=__webpack_require__(59),Polling=__webpack_require__(104),Emitter=__webpack_require__(26),inherit=__webpack_require__(40),debug=__webpack_require__(18)("engine.io-client:polling-xhr");module.exports=XHR,module.exports.Request=Request,inherit(XHR,Polling),XHR.prototype.supportsBinary=!0,XHR.prototype.request=function(opts){return opts=opts||{},opts.uri=this.uri(),opts.xd=this.xd,opts.xs=this.xs,opts.agent=this.agent||!1,opts.supportsBinary=this.supportsBinary,opts.enablesXDR=this.enablesXDR,opts.pfx=this.pfx,opts.key=this.key,opts.passphrase=this.passphrase,opts.cert=this.cert,opts.ca=this.ca,opts.ciphers=this.ciphers,opts.rejectUnauthorized=this.rejectUnauthorized,opts.requestTimeout=this.requestTimeout,opts.extraHeaders=this.extraHeaders,new Request(opts)},XHR.prototype.doWrite=function(data,fn){var isBinary="string"!=typeof data&&void 0!==data,req=this.request({method:"POST",data:data,isBinary:isBinary}),self=this;req.on("success",fn),req.on("error",function(err){self.onError("xhr post error",err)}),this.sendXhr=req},XHR.prototype.doPoll=function(){debug("xhr poll");var req=this.request(),self=this;req.on("data",function(data){self.onData(data)}),req.on("error",function(err){self.onError("xhr poll error",err)}),this.pollXhr=req},Emitter(Request.prototype),Request.prototype.create=function(){var opts={agent:this.agent,xdomain:this.xd,xscheme:this.xs,enablesXDR:this.enablesXDR};opts.pfx=this.pfx,opts.key=this.key,opts.passphrase=this.passphrase,opts.cert=this.cert,opts.ca=this.ca,opts.ciphers=this.ciphers,opts.rejectUnauthorized=this.rejectUnauthorized;var xhr=this.xhr=new XMLHttpRequest(opts),self=this;try{debug("xhr open %s: %s",this.method,this.uri),xhr.open(this.method,this.uri,this.async);try{if(this.extraHeaders){xhr.setDisableHeaderCheck(!0);for(var i in this.extraHeaders)this.extraHeaders.hasOwnProperty(i)&&xhr.setRequestHeader(i,this.extraHeaders[i])}}catch(e){}if(this.supportsBinary&&(xhr.responseType="arraybuffer"),"POST"===this.method)try{this.isBinary?xhr.setRequestHeader("Content-type","application/octet-stream"):xhr.setRequestHeader("Content-type","text/plain;charset=UTF-8")}catch(e){}try{xhr.setRequestHeader("Accept","*/*")}catch(e){}"withCredentials"in xhr&&(xhr.withCredentials=!0),this.requestTimeout&&(xhr.timeout=this.requestTimeout),this.hasXDR()?(xhr.onload=function(){self.onLoad()},xhr.onerror=function(){self.onError(xhr.responseText)}):xhr.onreadystatechange=function(){4===xhr.readyState&&(200===xhr.status||1223===xhr.status?self.onLoad():setTimeout(function(){self.onError(xhr.status)},0))},debug("xhr data %s",this.data),xhr.send(this.data)}catch(e){return void setTimeout(function(){self.onError(e)},0)}global.document&&(this.index=Request.requestsCount++,Request.requests[this.index]=this)},Request.prototype.onSuccess=function(){this.emit("success"),this.cleanup()},Request.prototype.onData=function(data){this.emit("data",data),this.onSuccess()},Request.prototype.onError=function(err){this.emit("error",err),this.cleanup(!0)},Request.prototype.cleanup=function(fromError){if("undefined"!=typeof this.xhr&&null!==this.xhr){if(this.hasXDR()?this.xhr.onload=this.xhr.onerror=empty:this.xhr.onreadystatechange=empty,fromError)try{this.xhr.abort()}catch(e){}global.document&&delete Request.requests[this.index],this.xhr=null}},Request.prototype.onLoad=function(){var data;try{var contentType;try{contentType=this.xhr.getResponseHeader("Content-Type").split(";")[0]}catch(e){}if("application/octet-stream"===contentType)data=this.xhr.response||this.xhr.responseText;else if(this.supportsBinary)try{data=String.fromCharCode.apply(null,new Uint8Array(this.xhr.response))}catch(e){for(var ui8Arr=new Uint8Array(this.xhr.response),dataArray=[],idx=0,length=ui8Arr.length;idx<length;idx++)dataArray.push(ui8Arr[idx]);data=String.fromCharCode.apply(null,dataArray)}else data=this.xhr.responseText}catch(e){this.onError(e)}null!=data&&this.onData(data)},Request.prototype.hasXDR=function(){return"undefined"!=typeof global.XDomainRequest&&!this.xs&&this.enablesXDR},Request.prototype.abort=function(){this.cleanup()},Request.requestsCount=0,Request.requests={},global.document&&(global.attachEvent?global.attachEvent("onunload",unloadHandler):global.addEventListener&&global.addEventListener("beforeunload",unloadHandler,!1))}).call(exports,__webpack_require__(4))},function(module,exports,__webpack_require__){(function(global){function WS(opts){var forceBase64=opts&&opts.forceBase64;forceBase64&&(this.supportsBinary=!1),this.perMessageDeflate=opts.perMessageDeflate,this.usingBrowserWebSocket=BrowserWebSocket&&!opts.forceNode,this.usingBrowserWebSocket||(WebSocket=NodeWebSocket),Transport.call(this,opts)}var NodeWebSocket,Transport=__webpack_require__(58),parser=__webpack_require__(21),parseqs=__webpack_require__(60),inherit=__webpack_require__(40),yeast=__webpack_require__(105),debug=__webpack_require__(18)("engine.io-client:websocket"),BrowserWebSocket=global.WebSocket||global.MozWebSocket;if("undefined"==typeof window)try{NodeWebSocket=__webpack_require__(476)}catch(e){}var WebSocket=BrowserWebSocket;WebSocket||"undefined"!=typeof window||(WebSocket=NodeWebSocket),module.exports=WS,inherit(WS,Transport),WS.prototype.name="websocket",WS.prototype.supportsBinary=!0,WS.prototype.doOpen=function(){if(this.check()){var uri=this.uri(),protocols=void 0,opts={agent:this.agent,perMessageDeflate:this.perMessageDeflate};opts.pfx=this.pfx,opts.key=this.key,opts.passphrase=this.passphrase,opts.cert=this.cert,opts.ca=this.ca,opts.ciphers=this.ciphers,opts.rejectUnauthorized=this.rejectUnauthorized,this.extraHeaders&&(opts.headers=this.extraHeaders),this.localAddress&&(opts.localAddress=this.localAddress);try{this.ws=this.usingBrowserWebSocket?new WebSocket(uri):new WebSocket(uri,protocols,opts)}catch(err){return this.emit("error",err)}void 0===this.ws.binaryType&&(this.supportsBinary=!1),this.ws.supports&&this.ws.supports.binary?(this.supportsBinary=!0,this.ws.binaryType="nodebuffer"):this.ws.binaryType="arraybuffer",this.addEventListeners()}},WS.prototype.addEventListeners=function(){var self=this;this.ws.onopen=function(){self.onOpen()},this.ws.onclose=function(){self.onClose()},this.ws.onmessage=function(ev){self.onData(ev.data)},this.ws.onerror=function(e){self.onError("websocket error",e)}},WS.prototype.write=function(packets){function done(){self.emit("flush"),setTimeout(function(){self.writable=!0,self.emit("drain")},0)}var self=this;this.writable=!1;for(var total=packets.length,i=0,l=total;i<l;i++)!function(packet){parser.encodePacket(packet,self.supportsBinary,function(data){if(!self.usingBrowserWebSocket){var opts={};if(packet.options&&(opts.compress=packet.options.compress),self.perMessageDeflate){var len="string"==typeof data?global.Buffer.byteLength(data):data.length;len<self.perMessageDeflate.threshold&&(opts.compress=!1)}}try{self.usingBrowserWebSocket?self.ws.send(data):self.ws.send(data,opts)}catch(e){debug("websocket closed before onclose event")}--total||done()})}(packets[i])},WS.prototype.onClose=function(){Transport.prototype.onClose.call(this)},WS.prototype.doClose=function(){"undefined"!=typeof this.ws&&this.ws.close()},WS.prototype.uri=function(){var query=this.query||{},schema=this.secure?"wss":"ws",port="";this.port&&("wss"===schema&&443!==Number(this.port)||"ws"===schema&&80!==Number(this.port))&&(port=":"+this.port),this.timestampRequests&&(query[this.timestampParam]=yeast()),this.supportsBinary||(query.b64=1),query=parseqs.encode(query),query.length&&(query="?"+query);var ipv6=this.hostname.indexOf(":")!==-1;return schema+"://"+(ipv6?"["+this.hostname+"]":this.hostname)+port+this.path+query},WS.prototype.check=function(){return!(!WebSocket||"__initialize"in WebSocket&&this.name===WS.prototype.name)}}).call(exports,__webpack_require__(4))},function(module,exports){module.exports=Object.keys||function(obj){var arr=[],has=Object.prototype.hasOwnProperty;for(var i in obj)has.call(obj,i)&&arr.push(i);return arr}},function(module,exports){function after(count,callback,err_cb){function proxy(err,result){if(proxy.count<=0)throw new Error("after called too many times");--proxy.count,err?(bail=!0,callback(err),callback=err_cb):0!==proxy.count||bail||callback(null,result)}var bail=!1;return err_cb=err_cb||noop,proxy.count=count,0===count?callback():proxy}function noop(){}module.exports=after},function(module,exports){module.exports=function(arraybuffer,start,end){var bytes=arraybuffer.byteLength;if(start=start||0,end=end||bytes,arraybuffer.slice)return arraybuffer.slice(start,end);if(start<0&&(start+=bytes),end<0&&(end+=bytes),end>bytes&&(end=bytes),start>=bytes||start>=end||0===bytes)return new ArrayBuffer(0);for(var abv=new Uint8Array(arraybuffer),result=new Uint8Array(end-start),i=start,ii=0;i<end;i++,ii++)result[ii]=abv[i];return result.buffer}},function(module,exports){!function(){"use strict";for(var chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",lookup=new Uint8Array(256),i=0;i<chars.length;i++)lookup[chars.charCodeAt(i)]=i;exports.encode=function(arraybuffer){var i,bytes=new Uint8Array(arraybuffer),len=bytes.length,base64="";for(i=0;i<len;i+=3)base64+=chars[bytes[i]>>2],base64+=chars[(3&bytes[i])<<4|bytes[i+1]>>4],base64+=chars[(15&bytes[i+1])<<2|bytes[i+2]>>6],base64+=chars[63&bytes[i+2]];return len%3===2?base64=base64.substring(0,base64.length-1)+"=":len%3===1&&(base64=base64.substring(0,base64.length-2)+"=="),base64},exports.decode=function(base64){var i,encoded1,encoded2,encoded3,encoded4,bufferLength=.75*base64.length,len=base64.length,p=0;"="===base64[base64.length-1]&&(bufferLength--,"="===base64[base64.length-2]&&bufferLength--);var arraybuffer=new ArrayBuffer(bufferLength),bytes=new Uint8Array(arraybuffer);for(i=0;i<len;i+=4)encoded1=lookup[base64.charCodeAt(i)],encoded2=lookup[base64.charCodeAt(i+1)],encoded3=lookup[base64.charCodeAt(i+2)],encoded4=lookup[base64.charCodeAt(i+3)],bytes[p++]=encoded1<<2|encoded2>>4,bytes[p++]=(15&encoded2)<<4|encoded3>>2,bytes[p++]=(3&encoded3)<<6|63&encoded4;return arraybuffer}}()},function(module,exports,__webpack_require__){(function(global){function mapArrayBufferViews(ary){for(var i=0;i<ary.length;i++){var chunk=ary[i];if(chunk.buffer instanceof ArrayBuffer){var buf=chunk.buffer;if(chunk.byteLength!==buf.byteLength){var copy=new Uint8Array(chunk.byteLength);copy.set(new Uint8Array(buf,chunk.byteOffset,chunk.byteLength)),buf=copy.buffer}ary[i]=buf}}}function BlobBuilderConstructor(ary,options){options=options||{};var bb=new BlobBuilder;mapArrayBufferViews(ary);for(var i=0;i<ary.length;i++)bb.append(ary[i]);return options.type?bb.getBlob(options.type):bb.getBlob()}function BlobConstructor(ary,options){return mapArrayBufferViews(ary),new Blob(ary,options||{})}var BlobBuilder=global.BlobBuilder||global.WebKitBlobBuilder||global.MSBlobBuilder||global.MozBlobBuilder,blobSupported=function(){try{var a=new Blob(["hi"]);return 2===a.size}catch(e){return!1}}(),blobSupportsArrayBufferView=blobSupported&&function(){try{var b=new Blob([new Uint8Array([1,2])]);return 2===b.size}catch(e){return!1}}(),blobBuilderSupported=BlobBuilder&&BlobBuilder.prototype.append&&BlobBuilder.prototype.getBlob;module.exports=function(){return blobSupported?blobSupportsArrayBufferView?global.Blob:BlobConstructor:blobBuilderSupported?BlobBuilderConstructor:void 0}()}).call(exports,__webpack_require__(4))},function(module,exports,__webpack_require__){(function(module,global){var __WEBPACK_AMD_DEFINE_RESULT__;!function(root){function ucs2decode(string){for(var value,extra,output=[],counter=0,length=string.length;counter<length;)value=string.charCodeAt(counter++),value>=55296&&value<=56319&&counter<length?(extra=string.charCodeAt(counter++),56320==(64512&extra)?output.push(((1023&value)<<10)+(1023&extra)+65536):(output.push(value),counter--)):output.push(value);return output}function ucs2encode(array){for(var value,length=array.length,index=-1,output="";++index<length;)value=array[index],value>65535&&(value-=65536,output+=stringFromCharCode(value>>>10&1023|55296),value=56320|1023&value),output+=stringFromCharCode(value);return output}function createByte(codePoint,shift){return stringFromCharCode(codePoint>>shift&63|128)}function encodeCodePoint(codePoint){if(0==(4294967168&codePoint))return stringFromCharCode(codePoint);var symbol="";return 0==(4294965248&codePoint)?symbol=stringFromCharCode(codePoint>>6&31|192):0==(4294901760&codePoint)?(symbol=stringFromCharCode(codePoint>>12&15|224),symbol+=createByte(codePoint,6)):0==(4292870144&codePoint)&&(symbol=stringFromCharCode(codePoint>>18&7|240),symbol+=createByte(codePoint,12),symbol+=createByte(codePoint,6)),symbol+=stringFromCharCode(63&codePoint|128)}function wtf8encode(string){for(var codePoint,codePoints=ucs2decode(string),length=codePoints.length,index=-1,byteString="";++index<length;)codePoint=codePoints[index],byteString+=encodeCodePoint(codePoint);return byteString}function readContinuationByte(){if(byteIndex>=byteCount)throw Error("Invalid byte index");var continuationByte=255&byteArray[byteIndex];if(byteIndex++,128==(192&continuationByte))return 63&continuationByte;throw Error("Invalid continuation byte")}function decodeSymbol(){var byte1,byte2,byte3,byte4,codePoint;if(byteIndex>byteCount)throw Error("Invalid byte index");if(byteIndex==byteCount)return!1;if(byte1=255&byteArray[byteIndex],byteIndex++,0==(128&byte1))return byte1;if(192==(224&byte1)){var byte2=readContinuationByte();if(codePoint=(31&byte1)<<6|byte2,codePoint>=128)return codePoint;throw Error("Invalid continuation byte")}if(224==(240&byte1)){if(byte2=readContinuationByte(),byte3=readContinuationByte(),codePoint=(15&byte1)<<12|byte2<<6|byte3,codePoint>=2048)return codePoint;throw Error("Invalid continuation byte")}if(240==(248&byte1)&&(byte2=readContinuationByte(),byte3=readContinuationByte(),byte4=readContinuationByte(),codePoint=(15&byte1)<<18|byte2<<12|byte3<<6|byte4,codePoint>=65536&&codePoint<=1114111))return codePoint;throw Error("Invalid WTF-8 detected")}function wtf8decode(byteString){byteArray=ucs2decode(byteString),byteCount=byteArray.length,byteIndex=0;for(var tmp,codePoints=[];(tmp=decodeSymbol())!==!1;)codePoints.push(tmp);return ucs2encode(codePoints)}var freeExports="object"==typeof exports&&exports,freeGlobal=("object"==typeof module&&module&&module.exports==freeExports&&module,"object"==typeof global&&global);freeGlobal.global!==freeGlobal&&freeGlobal.window!==freeGlobal||(root=freeGlobal);var byteArray,byteCount,byteIndex,stringFromCharCode=String.fromCharCode,wtf8={version:"1.0.0",encode:wtf8encode,decode:wtf8decode};__WEBPACK_AMD_DEFINE_RESULT__=function(){return wtf8}.call(exports,__webpack_require__,exports,module),!(void 0!==__WEBPACK_AMD_DEFINE_RESULT__&&(module.exports=__WEBPACK_AMD_DEFINE_RESULT__))}(this)}).call(exports,__webpack_require__(41)(module),__webpack_require__(4))},function(module,exports){try{module.exports="undefined"!=typeof XMLHttpRequest&&"withCredentials"in new XMLHttpRequest}catch(err){module.exports=!1}},function(module,exports,__webpack_require__){(function(global){var rvalidchars=/^[\],:{}\s]*$/,rvalidescape=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,rvalidtokens=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,rvalidbraces=/(?:^|:|,)(?:\s*\[)+/g,rtrimLeft=/^\s+/,rtrimRight=/\s+$/;module.exports=function(data){return"string"==typeof data&&data?(data=data.replace(rtrimLeft,"").replace(rtrimRight,""),global.JSON&&JSON.parse?JSON.parse(data):rvalidchars.test(data.replace(rvalidescape,"@").replace(rvalidtokens,"]").replace(rvalidbraces,""))?new Function("return "+data)():void 0):null}}).call(exports,__webpack_require__(4))},function(module,exports){module.exports=Array.isArray||function(arr){return"[object Array]"==Object.prototype.toString.call(arr)}},function(module,exports,__webpack_require__){(function(global){var isArray=__webpack_require__(449),isBuf=__webpack_require__(109);exports.deconstructPacket=function(packet){function _deconstructPacket(data){if(!data)return data;if(isBuf(data)){var placeholder={_placeholder:!0,num:buffers.length};return buffers.push(data),placeholder}if(isArray(data)){for(var newData=new Array(data.length),i=0;i<data.length;i++)newData[i]=_deconstructPacket(data[i]);return newData}if("object"==typeof data&&!(data instanceof Date)){var newData={};for(var key in data)newData[key]=_deconstructPacket(data[key]);return newData}return data}var buffers=[],packetData=packet.data,pack=packet;return pack.data=_deconstructPacket(packetData),pack.attachments=buffers.length,{packet:pack,buffers:buffers}},exports.reconstructPacket=function(packet,buffers){function _reconstructPacket(data){if(data&&data._placeholder){var buf=buffers[data.num];return buf}if(isArray(data)){for(var i=0;i<data.length;i++)data[i]=_reconstructPacket(data[i]);return data}if(data&&"object"==typeof data){for(var key in data)data[key]=_reconstructPacket(data[key]);return data}return data}return packet.data=_reconstructPacket(packet.data),packet.attachments=void 0,packet},exports.removeBlobs=function(data,callback){function _removeBlobs(obj,curKey,containingObject){if(!obj)return obj;if(global.Blob&&obj instanceof Blob||global.File&&obj instanceof File){pendingBlobs++;var fileReader=new FileReader;fileReader.onload=function(){containingObject?containingObject[curKey]=this.result:bloblessData=this.result,--pendingBlobs||callback(bloblessData)},fileReader.readAsArrayBuffer(obj)}else if(isArray(obj))for(var i=0;i<obj.length;i++)_removeBlobs(obj[i],i,obj);else if(obj&&"object"==typeof obj&&!isBuf(obj))for(var key in obj)_removeBlobs(obj[key],key,obj)}var pendingBlobs=0,bloblessData=data;_removeBlobs(bloblessData),pendingBlobs||callback(bloblessData)}}).call(exports,__webpack_require__(4))},function(module,exports){function Emitter(obj){if(obj)return mixin(obj)}function mixin(obj){for(var key in Emitter.prototype)obj[key]=Emitter.prototype[key];return obj}module.exports=Emitter,Emitter.prototype.on=Emitter.prototype.addEventListener=function(event,fn){return this._callbacks=this._callbacks||{},(this._callbacks[event]=this._callbacks[event]||[]).push(fn),this},Emitter.prototype.once=function(event,fn){function on(){self.off(event,on),fn.apply(this,arguments)}var self=this;return this._callbacks=this._callbacks||{},on.fn=fn,this.on(event,on),this},Emitter.prototype.off=Emitter.prototype.removeListener=Emitter.prototype.removeAllListeners=Emitter.prototype.removeEventListener=function(event,fn){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var callbacks=this._callbacks[event];if(!callbacks)return this;if(1==arguments.length)return delete this._callbacks[event],this;for(var cb,i=0;i<callbacks.length;i++)if(cb=callbacks[i],cb===fn||cb.fn===fn){callbacks.splice(i,1);break}return this},Emitter.prototype.emit=function(event){this._callbacks=this._callbacks||{};var args=[].slice.call(arguments,1),callbacks=this._callbacks[event];if(callbacks){callbacks=callbacks.slice(0);for(var i=0,len=callbacks.length;i<len;++i)callbacks[i].apply(this,args)}return this},Emitter.prototype.listeners=function(event){return this._callbacks=this._callbacks||{},this._callbacks[event]||[]},Emitter.prototype.hasListeners=function(event){return!!this.listeners(event).length}},function(module,exports,__webpack_require__){function useColors(){return"WebkitAppearance"in document.documentElement.style||window.console&&(console.firebug||console.exception&&console.table)||navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31}function formatArgs(){var args=arguments,useColors=this.useColors;if(args[0]=(useColors?"%c":"")+this.namespace+(useColors?" %c":" ")+args[0]+(useColors?"%c ":" ")+"+"+exports.humanize(this.diff),!useColors)return args;var c="color: "+this.color;args=[args[0],c,"color: inherit"].concat(Array.prototype.slice.call(args,1));var index=0,lastC=0;return args[0].replace(/%[a-z%]/g,function(match){"%%"!==match&&(index++,"%c"===match&&(lastC=index))}),args.splice(lastC,0,c),args}function log(){return"object"==typeof console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}function save(namespaces){try{null==namespaces?exports.storage.removeItem("debug"):exports.storage.debug=namespaces}catch(e){}}function load(){var r;try{r=exports.storage.debug}catch(e){}return r}function localstorage(){try{return window.localStorage}catch(e){}}exports=module.exports=__webpack_require__(447),exports.log=log,exports.formatArgs=formatArgs,exports.save=save,exports.load=load,exports.useColors=useColors,exports.storage="undefined"!=typeof chrome&&"undefined"!=typeof chrome.storage?chrome.storage.local:localstorage(),exports.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],exports.formatters.j=function(v){return JSON.stringify(v)},exports.enable(load())},function(module,exports,__webpack_require__){function selectColor(){return exports.colors[prevColor++%exports.colors.length]}function debug(namespace){function disabled(){}function enabled(){var self=enabled,curr=+new Date,ms=curr-(prevTime||curr);self.diff=ms,self.prev=prevTime,self.curr=curr,prevTime=curr,null==self.useColors&&(self.useColors=exports.useColors()),null==self.color&&self.useColors&&(self.color=selectColor());var args=Array.prototype.slice.call(arguments);args[0]=exports.coerce(args[0]),"string"!=typeof args[0]&&(args=["%o"].concat(args));var index=0;args[0]=args[0].replace(/%([a-z%])/g,function(match,format){if("%%"===match)return match;index++;var formatter=exports.formatters[format];if("function"==typeof formatter){var val=args[index];match=formatter.call(self,val),args.splice(index,1),index--}return match}),"function"==typeof exports.formatArgs&&(args=exports.formatArgs.apply(self,args));var logFn=enabled.log||exports.log||console.log.bind(console);logFn.apply(self,args)}disabled.enabled=!1,enabled.enabled=!0;var fn=exports.enabled(namespace)?enabled:disabled;return fn.namespace=namespace,fn}function enable(namespaces){exports.save(namespaces);for(var split=(namespaces||"").split(/[\s,]+/),len=split.length,i=0;i<len;i++)split[i]&&(namespaces=split[i].replace(/\*/g,".*?"),"-"===namespaces[0]?exports.skips.push(new RegExp("^"+namespaces.substr(1)+"$")):exports.names.push(new RegExp("^"+namespaces+"$")))}function disable(){exports.enable("")}function enabled(name){var i,len;for(i=0,len=exports.skips.length;i<len;i++)if(exports.skips[i].test(name))return!1;for(i=0,len=exports.names.length;i<len;i++)if(exports.names[i].test(name))return!0;return!1}function coerce(val){return val instanceof Error?val.stack||val.message:val}exports=module.exports=debug,exports.coerce=coerce,exports.disable=disable,exports.enable=enable,exports.enabled=enabled,exports.humanize=__webpack_require__(448),exports.names=[],exports.skips=[],exports.formatters={};var prevTime,prevColor=0},function(module,exports){function parse(str){if(str=""+str,!(str.length>1e4)){var match=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str);if(match){var n=parseFloat(match[1]),type=(match[2]||"ms").toLowerCase();switch(type){case"years":case"year":case"yrs":case"yr":case"y":return n*y;case"days":case"day":case"d":return n*d;case"hours":case"hour":case"hrs":case"hr":case"h":return n*h;case"minutes":case"minute":case"mins":case"min":case"m":return n*m;case"seconds":case"second":case"secs":case"sec":case"s":return n*s;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n}}}}function short(ms){return ms>=d?Math.round(ms/d)+"d":ms>=h?Math.round(ms/h)+"h":ms>=m?Math.round(ms/m)+"m":ms>=s?Math.round(ms/s)+"s":ms+"ms"}function long(ms){return plural(ms,d,"day")||plural(ms,h,"hour")||plural(ms,m,"minute")||plural(ms,s,"second")||ms+" ms"}function plural(ms,n,name){if(!(ms<n))return ms<1.5*n?Math.floor(ms/n)+" "+name:Math.ceil(ms/n)+" "+name+"s"}var s=1e3,m=60*s,h=60*m,d=24*h,y=365.25*d;module.exports=function(val,options){return options=options||{},"string"==typeof val?parse(val):options["long"]?long(val):short(val)}},function(module,exports){module.exports=Array.isArray||function(arr){return"[object Array]"==Object.prototype.toString.call(arr)}},function(module,exports,__webpack_require__){(function(module,global){var __WEBPACK_AMD_DEFINE_RESULT__;(function(){function runInContext(context,exports){function has(name){if(has[name]!==undef)return has[name];var isSupported;if("bug-string-char-index"==name)isSupported="a"!="a"[0];else if("json"==name)isSupported=has("json-stringify")&&has("json-parse");else{var value,serialized='{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';if("json-stringify"==name){var stringify=exports.stringify,stringifySupported="function"==typeof stringify&&isExtended;if(stringifySupported){(value=function(){return 1}).toJSON=value;try{stringifySupported="0"===stringify(0)&&"0"===stringify(new Number)&&'""'==stringify(new String)&&stringify(getClass)===undef&&stringify(undef)===undef&&stringify()===undef&&"1"===stringify(value)&&"[1]"==stringify([value])&&"[null]"==stringify([undef])&&"null"==stringify(null)&&"[null,null,null]"==stringify([undef,getClass,null])&&stringify({a:[value,!0,!1,null,"\0\b\n\f\r\t"]})==serialized&&"1"===stringify(null,value)&&"[\n 1,\n 2\n]"==stringify([1,2],null,1)&&'"-271821-04-20T00:00:00.000Z"'==stringify(new Date((-864e13)))&&'"+275760-09-13T00:00:00.000Z"'==stringify(new Date(864e13))&&'"-000001-01-01T00:00:00.000Z"'==stringify(new Date((-621987552e5)))&&'"1969-12-31T23:59:59.999Z"'==stringify(new Date((-1)))}catch(exception){stringifySupported=!1}}isSupported=stringifySupported}if("json-parse"==name){var parse=exports.parse;if("function"==typeof parse)try{if(0===parse("0")&&!parse(!1)){value=parse(serialized);var parseSupported=5==value.a.length&&1===value.a[0];if(parseSupported){try{parseSupported=!parse('"\t"')}catch(exception){}if(parseSupported)try{parseSupported=1!==parse("01")}catch(exception){}if(parseSupported)try{parseSupported=1!==parse("1.")}catch(exception){}}}}catch(exception){parseSupported=!1}isSupported=parseSupported}}return has[name]=!!isSupported}context||(context=root.Object()),exports||(exports=root.Object());var Number=context.Number||root.Number,String=context.String||root.String,Object=context.Object||root.Object,Date=context.Date||root.Date,SyntaxError=context.SyntaxError||root.SyntaxError,TypeError=context.TypeError||root.TypeError,Math=context.Math||root.Math,nativeJSON=context.JSON||root.JSON;"object"==typeof nativeJSON&&nativeJSON&&(exports.stringify=nativeJSON.stringify,exports.parse=nativeJSON.parse);var isProperty,forEach,undef,objectProto=Object.prototype,getClass=objectProto.toString,isExtended=new Date((-0xc782b5b800cec));try{isExtended=isExtended.getUTCFullYear()==-109252&&0===isExtended.getUTCMonth()&&1===isExtended.getUTCDate()&&10==isExtended.getUTCHours()&&37==isExtended.getUTCMinutes()&&6==isExtended.getUTCSeconds()&&708==isExtended.getUTCMilliseconds()}catch(exception){}if(!has("json")){var functionClass="[object Function]",dateClass="[object Date]",numberClass="[object Number]",stringClass="[object String]",arrayClass="[object Array]",booleanClass="[object Boolean]",charIndexBuggy=has("bug-string-char-index");if(!isExtended)var floor=Math.floor,Months=[0,31,59,90,120,151,181,212,243,273,304,334],getDay=function(year,month){return Months[month]+365*(year-1970)+floor((year-1969+(month=+(month>1)))/4)-floor((year-1901+month)/100)+floor((year-1601+month)/400)};if((isProperty=objectProto.hasOwnProperty)||(isProperty=function(property){var constructor,members={};return(members.__proto__=null,members.__proto__={toString:1},members).toString!=getClass?isProperty=function(property){var original=this.__proto__,result=property in(this.__proto__=null,this);return this.__proto__=original,result}:(constructor=members.constructor,isProperty=function(property){var parent=(this.constructor||constructor).prototype;return property in this&&!(property in parent&&this[property]===parent[property])}),members=null,isProperty.call(this,property)}),forEach=function(object,callback){var Properties,members,property,size=0;(Properties=function(){this.valueOf=0}).prototype.valueOf=0,members=new Properties;for(property in members)isProperty.call(members,property)&&size++;return Properties=members=null,size?forEach=2==size?function(object,callback){var property,members={},isFunction=getClass.call(object)==functionClass;for(property in object)isFunction&&"prototype"==property||isProperty.call(members,property)||!(members[property]=1)||!isProperty.call(object,property)||callback(property)}:function(object,callback){var property,isConstructor,isFunction=getClass.call(object)==functionClass;for(property in object)isFunction&&"prototype"==property||!isProperty.call(object,property)||(isConstructor="constructor"===property)||callback(property);(isConstructor||isProperty.call(object,property="constructor"))&&callback(property)}:(members=["valueOf","toString","toLocaleString","propertyIsEnumerable","isPrototypeOf","hasOwnProperty","constructor"],forEach=function(object,callback){var property,length,isFunction=getClass.call(object)==functionClass,hasProperty=!isFunction&&"function"!=typeof object.constructor&&objectTypes[typeof object.hasOwnProperty]&&object.hasOwnProperty||isProperty;for(property in object)isFunction&&"prototype"==property||!hasProperty.call(object,property)||callback(property);for(length=members.length;property=members[--length];hasProperty.call(object,property)&&callback(property));}),forEach(object,callback)},!has("json-stringify")){var Escapes={92:"\\\\",34:'\\"',8:"\\b",12:"\\f",10:"\\n",13:"\\r",9:"\\t"},leadingZeroes="000000",toPaddedString=function(width,value){return(leadingZeroes+(value||0)).slice(-width)},unicodePrefix="\\u00",quote=function(value){for(var result='"',index=0,length=value.length,useCharIndex=!charIndexBuggy||length>10,symbols=useCharIndex&&(charIndexBuggy?value.split(""):value);index<length;index++){var charCode=value.charCodeAt(index);
switch(charCode){case 8:case 9:case 10:case 12:case 13:case 34:case 92:result+=Escapes[charCode];break;default:if(charCode<32){result+=unicodePrefix+toPaddedString(2,charCode.toString(16));break}result+=useCharIndex?symbols[index]:value.charAt(index)}}return result+'"'},serialize=function(property,object,callback,properties,whitespace,indentation,stack){var value,className,year,month,date,time,hours,minutes,seconds,milliseconds,results,element,index,length,prefix,result;try{value=object[property]}catch(exception){}if("object"==typeof value&&value)if(className=getClass.call(value),className!=dateClass||isProperty.call(value,"toJSON"))"function"==typeof value.toJSON&&(className!=numberClass&&className!=stringClass&&className!=arrayClass||isProperty.call(value,"toJSON"))&&(value=value.toJSON(property));else if(value>-1/0&&value<1/0){if(getDay){for(date=floor(value/864e5),year=floor(date/365.2425)+1970-1;getDay(year+1,0)<=date;year++);for(month=floor((date-getDay(year,0))/30.42);getDay(year,month+1)<=date;month++);date=1+date-getDay(year,month),time=(value%864e5+864e5)%864e5,hours=floor(time/36e5)%24,minutes=floor(time/6e4)%60,seconds=floor(time/1e3)%60,milliseconds=time%1e3}else year=value.getUTCFullYear(),month=value.getUTCMonth(),date=value.getUTCDate(),hours=value.getUTCHours(),minutes=value.getUTCMinutes(),seconds=value.getUTCSeconds(),milliseconds=value.getUTCMilliseconds();value=(year<=0||year>=1e4?(year<0?"-":"+")+toPaddedString(6,year<0?-year:year):toPaddedString(4,year))+"-"+toPaddedString(2,month+1)+"-"+toPaddedString(2,date)+"T"+toPaddedString(2,hours)+":"+toPaddedString(2,minutes)+":"+toPaddedString(2,seconds)+"."+toPaddedString(3,milliseconds)+"Z"}else value=null;if(callback&&(value=callback.call(object,property,value)),null===value)return"null";if(className=getClass.call(value),className==booleanClass)return""+value;if(className==numberClass)return value>-1/0&&value<1/0?""+value:"null";if(className==stringClass)return quote(""+value);if("object"==typeof value){for(length=stack.length;length--;)if(stack[length]===value)throw TypeError();if(stack.push(value),results=[],prefix=indentation,indentation+=whitespace,className==arrayClass){for(index=0,length=value.length;index<length;index++)element=serialize(index,value,callback,properties,whitespace,indentation,stack),results.push(element===undef?"null":element);result=results.length?whitespace?"[\n"+indentation+results.join(",\n"+indentation)+"\n"+prefix+"]":"["+results.join(",")+"]":"[]"}else forEach(properties||value,function(property){var element=serialize(property,value,callback,properties,whitespace,indentation,stack);element!==undef&&results.push(quote(property)+":"+(whitespace?" ":"")+element)}),result=results.length?whitespace?"{\n"+indentation+results.join(",\n"+indentation)+"\n"+prefix+"}":"{"+results.join(",")+"}":"{}";return stack.pop(),result}};exports.stringify=function(source,filter,width){var whitespace,callback,properties,className;if(objectTypes[typeof filter]&&filter)if((className=getClass.call(filter))==functionClass)callback=filter;else if(className==arrayClass){properties={};for(var value,index=0,length=filter.length;index<length;value=filter[index++],className=getClass.call(value),(className==stringClass||className==numberClass)&&(properties[value]=1));}if(width)if((className=getClass.call(width))==numberClass){if((width-=width%1)>0)for(whitespace="",width>10&&(width=10);whitespace.length<width;whitespace+=" ");}else className==stringClass&&(whitespace=width.length<=10?width:width.slice(0,10));return serialize("",(value={},value[""]=source,value),callback,properties,whitespace,"",[])}}if(!has("json-parse")){var Index,Source,fromCharCode=String.fromCharCode,Unescapes={92:"\\",34:'"',47:"/",98:"\b",116:"\t",110:"\n",102:"\f",114:"\r"},abort=function(){throw Index=Source=null,SyntaxError()},lex=function(){for(var value,begin,position,isSigned,charCode,source=Source,length=source.length;Index<length;)switch(charCode=source.charCodeAt(Index)){case 9:case 10:case 13:case 32:Index++;break;case 123:case 125:case 91:case 93:case 58:case 44:return value=charIndexBuggy?source.charAt(Index):source[Index],Index++,value;case 34:for(value="@",Index++;Index<length;)if(charCode=source.charCodeAt(Index),charCode<32)abort();else if(92==charCode)switch(charCode=source.charCodeAt(++Index)){case 92:case 34:case 47:case 98:case 116:case 110:case 102:case 114:value+=Unescapes[charCode],Index++;break;case 117:for(begin=++Index,position=Index+4;Index<position;Index++)charCode=source.charCodeAt(Index),charCode>=48&&charCode<=57||charCode>=97&&charCode<=102||charCode>=65&&charCode<=70||abort();value+=fromCharCode("0x"+source.slice(begin,Index));break;default:abort()}else{if(34==charCode)break;for(charCode=source.charCodeAt(Index),begin=Index;charCode>=32&&92!=charCode&&34!=charCode;)charCode=source.charCodeAt(++Index);value+=source.slice(begin,Index)}if(34==source.charCodeAt(Index))return Index++,value;abort();default:if(begin=Index,45==charCode&&(isSigned=!0,charCode=source.charCodeAt(++Index)),charCode>=48&&charCode<=57){for(48==charCode&&(charCode=source.charCodeAt(Index+1),charCode>=48&&charCode<=57)&&abort(),isSigned=!1;Index<length&&(charCode=source.charCodeAt(Index),charCode>=48&&charCode<=57);Index++);if(46==source.charCodeAt(Index)){for(position=++Index;position<length&&(charCode=source.charCodeAt(position),charCode>=48&&charCode<=57);position++);position==Index&&abort(),Index=position}if(charCode=source.charCodeAt(Index),101==charCode||69==charCode){for(charCode=source.charCodeAt(++Index),43!=charCode&&45!=charCode||Index++,position=Index;position<length&&(charCode=source.charCodeAt(position),charCode>=48&&charCode<=57);position++);position==Index&&abort(),Index=position}return+source.slice(begin,Index)}if(isSigned&&abort(),"true"==source.slice(Index,Index+4))return Index+=4,!0;if("false"==source.slice(Index,Index+5))return Index+=5,!1;if("null"==source.slice(Index,Index+4))return Index+=4,null;abort()}return"$"},get=function(value){var results,hasMembers;if("$"==value&&abort(),"string"==typeof value){if("@"==(charIndexBuggy?value.charAt(0):value[0]))return value.slice(1);if("["==value){for(results=[];value=lex(),"]"!=value;hasMembers||(hasMembers=!0))hasMembers&&(","==value?(value=lex(),"]"==value&&abort()):abort()),","==value&&abort(),results.push(get(value));return results}if("{"==value){for(results={};value=lex(),"}"!=value;hasMembers||(hasMembers=!0))hasMembers&&(","==value?(value=lex(),"}"==value&&abort()):abort()),","!=value&&"string"==typeof value&&"@"==(charIndexBuggy?value.charAt(0):value[0])&&":"==lex()||abort(),results[value.slice(1)]=get(lex());return results}abort()}return value},update=function(source,property,callback){var element=walk(source,property,callback);element===undef?delete source[property]:source[property]=element},walk=function(source,property,callback){var length,value=source[property];if("object"==typeof value&&value)if(getClass.call(value)==arrayClass)for(length=value.length;length--;)update(value,length,callback);else forEach(value,function(property){update(value,property,callback)});return callback.call(source,property,value)};exports.parse=function(source,callback){var result,value;return Index=0,Source=""+source,result=get(lex()),"$"!=lex()&&abort(),Index=Source=null,callback&&getClass.call(callback)==functionClass?walk((value={},value[""]=result,value),"",callback):result}}}return exports.runInContext=runInContext,exports}var isLoader=__webpack_require__(452),objectTypes={"function":!0,object:!0},freeExports=objectTypes[typeof exports]&&exports&&!exports.nodeType&&exports,root=objectTypes[typeof window]&&window||this,freeGlobal=freeExports&&objectTypes[typeof module]&&module&&!module.nodeType&&"object"==typeof global&&global;if(!freeGlobal||freeGlobal.global!==freeGlobal&&freeGlobal.window!==freeGlobal&&freeGlobal.self!==freeGlobal||(root=freeGlobal),freeExports&&!isLoader)runInContext(root,freeExports);else{var nativeJSON=root.JSON,previousJSON=root.JSON3,isRestored=!1,JSON3=runInContext(root,root.JSON3={noConflict:function(){return isRestored||(isRestored=!0,root.JSON=nativeJSON,root.JSON3=previousJSON,nativeJSON=previousJSON=null),JSON3}});root.JSON={parse:JSON3.parse,stringify:JSON3.stringify}}isLoader&&(__WEBPACK_AMD_DEFINE_RESULT__=function(){return JSON3}.call(exports,__webpack_require__,exports,module),!(void 0!==__WEBPACK_AMD_DEFINE_RESULT__&&(module.exports=__WEBPACK_AMD_DEFINE_RESULT__)))}).call(this)}).call(exports,__webpack_require__(41)(module),__webpack_require__(4))},function(module,exports){function toArray(list,index){var array=[];index=index||0;for(var i=index||0;i<list.length;i++)array[i-index]=list[i];return array}module.exports=toArray},function(module,exports){(function(__webpack_amd_options__){module.exports=__webpack_amd_options__}).call(exports,{})},function(module,exports){"use strict";function placeHoldersCount(b64){var len=b64.length;if(len%4>0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===b64[len-2]?2:"="===b64[len-1]?1:0}function byteLength(b64){return 3*b64.length/4-placeHoldersCount(b64)}function toByteArray(b64){var i,j,l,tmp,placeHolders,arr,len=b64.length;placeHolders=placeHoldersCount(b64),arr=new Arr(3*len/4-placeHolders),l=placeHolders>0?len-4:len;var L=0;for(i=0,j=0;i<l;i+=4,j+=3)tmp=revLookup[b64.charCodeAt(i)]<<18|revLookup[b64.charCodeAt(i+1)]<<12|revLookup[b64.charCodeAt(i+2)]<<6|revLookup[b64.charCodeAt(i+3)],arr[L++]=tmp>>16&255,arr[L++]=tmp>>8&255,arr[L++]=255&tmp;return 2===placeHolders?(tmp=revLookup[b64.charCodeAt(i)]<<2|revLookup[b64.charCodeAt(i+1)]>>4,arr[L++]=255&tmp):1===placeHolders&&(tmp=revLookup[b64.charCodeAt(i)]<<10|revLookup[b64.charCodeAt(i+1)]<<4|revLookup[b64.charCodeAt(i+2)]>>2,arr[L++]=tmp>>8&255,arr[L++]=255&tmp),arr}function tripletToBase64(num){return lookup[num>>18&63]+lookup[num>>12&63]+lookup[num>>6&63]+lookup[63&num]}function encodeChunk(uint8,start,end){for(var tmp,output=[],i=start;i<end;i+=3)tmp=(uint8[i]<<16)+(uint8[i+1]<<8)+uint8[i+2],output.push(tripletToBase64(tmp));return output.join("")}function fromByteArray(uint8){for(var tmp,len=uint8.length,extraBytes=len%3,output="",parts=[],maxChunkLength=16383,i=0,len2=len-extraBytes;i<len2;i+=maxChunkLength)parts.push(encodeChunk(uint8,i,i+maxChunkLength>len2?len2:i+maxChunkLength));return 1===extraBytes?(tmp=uint8[len-1],output+=lookup[tmp>>2],output+=lookup[tmp<<4&63],output+="=="):2===extraBytes&&(tmp=(uint8[len-2]<<8)+uint8[len-1],output+=lookup[tmp>>10],output+=lookup[tmp>>4&63],output+=lookup[tmp<<2&63],output+="="),parts.push(output),parts.join("")}exports.byteLength=byteLength,exports.toByteArray=toByteArray,exports.fromByteArray=fromByteArray;for(var lookup=[],revLookup=[],Arr="undefined"!=typeof Uint8Array?Uint8Array:Array,code="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i=0,len=code.length;i<len;++i)lookup[i]=code[i],revLookup[code.charCodeAt(i)]=i;revLookup["-".charCodeAt(0)]=62,revLookup["_".charCodeAt(0)]=63},function(module,exports){exports.read=function(buffer,offset,isLE,mLen,nBytes){var e,m,eLen=8*nBytes-mLen-1,eMax=(1<<eLen)-1,eBias=eMax>>1,nBits=-7,i=isLE?nBytes-1:0,d=isLE?-1:1,s=buffer[offset+i];for(i+=d,e=s&(1<<-nBits)-1,s>>=-nBits,nBits+=eLen;nBits>0;e=256*e+buffer[offset+i],i+=d,nBits-=8);for(m=e&(1<<-nBits)-1,e>>=-nBits,nBits+=mLen;nBits>0;m=256*m+buffer[offset+i],i+=d,nBits-=8);if(0===e)e=1-eBias;else{if(e===eMax)return m?NaN:(s?-1:1)*(1/0);m+=Math.pow(2,mLen),e-=eBias}return(s?-1:1)*m*Math.pow(2,e-mLen)},exports.write=function(buffer,value,offset,isLE,mLen,nBytes){var e,m,c,eLen=8*nBytes-mLen-1,eMax=(1<<eLen)-1,eBias=eMax>>1,rt=23===mLen?Math.pow(2,-24)-Math.pow(2,-77):0,i=isLE?0:nBytes-1,d=isLE?1:-1,s=value<0||0===value&&1/value<0?1:0;for(value=Math.abs(value),isNaN(value)||value===1/0?(m=isNaN(value)?1:0,e=eMax):(e=Math.floor(Math.log(value)/Math.LN2),value*(c=Math.pow(2,-e))<1&&(e--,c*=2),value+=e+eBias>=1?rt/c:rt*Math.pow(2,1-eBias),value*c>=2&&(e++,c/=2),e+eBias>=eMax?(m=0,e=eMax):e+eBias>=1?(m=(value*c-1)*Math.pow(2,mLen),e+=eBias):(m=value*Math.pow(2,eBias-1)*Math.pow(2,mLen),e=0));mLen>=8;buffer[offset+i]=255&m,i+=d,m/=256,mLen-=8);for(e=e<<mLen|m,eLen+=mLen;eLen>0;buffer[offset+i]=255&e,i+=d,e/=256,eLen-=8);buffer[offset+i-d]|=128*s}},function(module,exports){var toString={}.toString;module.exports=Array.isArray||function(arr){return"[object Array]"==toString.call(arr)}},function(module,exports,__webpack_require__){(function(module,global){var __WEBPACK_AMD_DEFINE_RESULT__;!function(root){function error(type){throw new RangeError(errors[type])}function map(array,fn){for(var length=array.length,result=[];length--;)result[length]=fn(array[length]);return result}function mapDomain(string,fn){var parts=string.split("@"),result="";parts.length>1&&(result=parts[0]+"@",string=parts[1]),string=string.replace(regexSeparators,".");var labels=string.split("."),encoded=map(labels,fn).join(".");return result+encoded}function ucs2decode(string){for(var value,extra,output=[],counter=0,length=string.length;counter<length;)value=string.charCodeAt(counter++),value>=55296&&value<=56319&&counter<length?(extra=string.charCodeAt(counter++),56320==(64512&extra)?output.push(((1023&value)<<10)+(1023&extra)+65536):(output.push(value),counter--)):output.push(value);return output}function ucs2encode(array){return map(array,function(value){var output="";return value>65535&&(value-=65536,output+=stringFromCharCode(value>>>10&1023|55296),value=56320|1023&value),output+=stringFromCharCode(value)}).join("")}function basicToDigit(codePoint){return codePoint-48<10?codePoint-22:codePoint-65<26?codePoint-65:codePoint-97<26?codePoint-97:base}function digitToBasic(digit,flag){return digit+22+75*(digit<26)-((0!=flag)<<5)}function adapt(delta,numPoints,firstTime){var k=0;for(delta=firstTime?floor(delta/damp):delta>>1,delta+=floor(delta/numPoints);delta>baseMinusTMin*tMax>>1;k+=base)delta=floor(delta/baseMinusTMin);return floor(k+(baseMinusTMin+1)*delta/(delta+skew))}function decode(input){var out,basic,j,index,oldi,w,k,digit,t,baseMinusT,output=[],inputLength=input.length,i=0,n=initialN,bias=initialBias;for(basic=input.lastIndexOf(delimiter),basic<0&&(basic=0),j=0;j<basic;++j)input.charCodeAt(j)>=128&&error("not-basic"),output.push(input.charCodeAt(j));for(index=basic>0?basic+1:0;index<inputLength;){for(oldi=i,w=1,k=base;index>=inputLength&&error("invalid-input"),digit=basicToDigit(input.charCodeAt(index++)),(digit>=base||digit>floor((maxInt-i)/w))&&error("overflow"),i+=digit*w,t=k<=bias?tMin:k>=bias+tMax?tMax:k-bias,!(digit<t);k+=base)baseMinusT=base-t,w>floor(maxInt/baseMinusT)&&error("overflow"),w*=baseMinusT;out=output.length+1,bias=adapt(i-oldi,out,0==oldi),floor(i/out)>maxInt-n&&error("overflow"),n+=floor(i/out),i%=out,output.splice(i++,0,n)}return ucs2encode(output)}function encode(input){var n,delta,handledCPCount,basicLength,bias,j,m,q,k,t,currentValue,inputLength,handledCPCountPlusOne,baseMinusT,qMinusT,output=[];for(input=ucs2decode(input),inputLength=input.length,n=initialN,delta=0,bias=initialBias,j=0;j<inputLength;++j)currentValue=input[j],currentValue<128&&output.push(stringFromCharCode(currentValue));for(handledCPCount=basicLength=output.length,basicLength&&output.push(delimiter);handledCPCount<inputLength;){for(m=maxInt,j=0;j<inputLength;++j)currentValue=input[j],currentValue>=n&&currentValue<m&&(m=currentValue);for(handledCPCountPlusOne=handledCPCount+1,m-n>floor((maxInt-delta)/handledCPCountPlusOne)&&error("overflow"),delta+=(m-n)*handledCPCountPlusOne,n=m,j=0;j<inputLength;++j)if(currentValue=input[j],currentValue<n&&++delta>maxInt&&error("overflow"),currentValue==n){for(q=delta,k=base;t=k<=bias?tMin:k>=bias+tMax?tMax:k-bias,!(q<t);k+=base)qMinusT=q-t,baseMinusT=base-t,output.push(stringFromCharCode(digitToBasic(t+qMinusT%baseMinusT,0))),q=floor(qMinusT/baseMinusT);output.push(stringFromCharCode(digitToBasic(q,0))),bias=adapt(delta,handledCPCountPlusOne,handledCPCount==basicLength),delta=0,++handledCPCount}++delta,++n}return output.join("")}function toUnicode(input){return mapDomain(input,function(string){return regexPunycode.test(string)?decode(string.slice(4).toLowerCase()):string})}function toASCII(input){return mapDomain(input,function(string){return regexNonASCII.test(string)?"xn--"+encode(string):string})}var freeGlobal=("object"==typeof exports&&exports&&!exports.nodeType&&exports,"object"==typeof module&&module&&!module.nodeType&&module,"object"==typeof global&&global);freeGlobal.global!==freeGlobal&&freeGlobal.window!==freeGlobal&&freeGlobal.self!==freeGlobal||(root=freeGlobal);var punycode,maxInt=2147483647,base=36,tMin=1,tMax=26,skew=38,damp=700,initialBias=72,initialN=128,delimiter="-",regexPunycode=/^xn--/,regexNonASCII=/[^\x20-\x7E]/,regexSeparators=/[\x2E\u3002\uFF0E\uFF61]/g,errors={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},baseMinusTMin=base-tMin,floor=Math.floor,stringFromCharCode=String.fromCharCode;punycode={version:"1.4.1",ucs2:{decode:ucs2decode,encode:ucs2encode},decode:decode,encode:encode,toASCII:toASCII,toUnicode:toUnicode},__WEBPACK_AMD_DEFINE_RESULT__=function(){return punycode}.call(exports,__webpack_require__,exports,module),!(void 0!==__WEBPACK_AMD_DEFINE_RESULT__&&(module.exports=__WEBPACK_AMD_DEFINE_RESULT__))}(this)}).call(exports,__webpack_require__(41)(module),__webpack_require__(4))},function(module,exports){"use strict";function hasOwnProperty(obj,prop){return Object.prototype.hasOwnProperty.call(obj,prop)}module.exports=function(qs,sep,eq,options){sep=sep||"&",eq=eq||"=";var obj={};if("string"!=typeof qs||0===qs.length)return obj;var regexp=/\+/g;qs=qs.split(sep);var maxKeys=1e3;options&&"number"==typeof options.maxKeys&&(maxKeys=options.maxKeys);var len=qs.length;maxKeys>0&&len>maxKeys&&(len=maxKeys);for(var i=0;i<len;++i){var kstr,vstr,k,v,x=qs[i].replace(regexp,"%20"),idx=x.indexOf(eq);idx>=0?(kstr=x.substr(0,idx),vstr=x.substr(idx+1)):(kstr=x,vstr=""),k=decodeURIComponent(kstr),v=decodeURIComponent(vstr),hasOwnProperty(obj,k)?isArray(obj[k])?obj[k].push(v):obj[k]=[obj[k],v]:obj[k]=v}return obj};var isArray=Array.isArray||function(xs){return"[object Array]"===Object.prototype.toString.call(xs)}},function(module,exports){"use strict";function map(xs,f){if(xs.map)return xs.map(f);for(var res=[],i=0;i<xs.length;i++)res.push(f(xs[i],i));return res}var stringifyPrimitive=function(v){switch(typeof v){case"string":return v;case"boolean":return v?"true":"false";case"number":return isFinite(v)?v:"";default:return""}};module.exports=function(obj,sep,eq,name){return sep=sep||"&",eq=eq||"=",null===obj&&(obj=void 0),"object"==typeof obj?map(objectKeys(obj),function(k){var ks=encodeURIComponent(stringifyPrimitive(k))+eq;return isArray(obj[k])?map(obj[k],function(v){return ks+encodeURIComponent(stringifyPrimitive(v))}).join(sep):ks+encodeURIComponent(stringifyPrimitive(obj[k]))}).join(sep):name?encodeURIComponent(stringifyPrimitive(name))+eq+encodeURIComponent(stringifyPrimitive(obj)):""};var isArray=Array.isArray||function(xs){return"[object Array]"===Object.prototype.toString.call(xs)},objectKeys=Object.keys||function(obj){var res=[];for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&res.push(key);return res}},function(module,exports,__webpack_require__){"use strict";exports.decode=exports.parse=__webpack_require__(457),exports.encode=exports.stringify=__webpack_require__(458)},function(module,exports,__webpack_require__){module.exports=__webpack_require__(19)},function(module,exports,__webpack_require__){"use strict";function BufferList(){this.head=null,this.tail=null,this.length=0}var bufferShim=(__webpack_require__(12).Buffer,__webpack_require__(65));module.exports=BufferList,BufferList.prototype.push=function(v){var entry={data:v,next:null};this.length>0?this.tail.next=entry:this.head=entry,this.tail=entry,++this.length},BufferList.prototype.unshift=function(v){var entry={data:v,next:this.head};0===this.length&&(this.tail=entry),this.head=entry,++this.length},BufferList.prototype.shift=function(){if(0!==this.length){var ret=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,ret}},BufferList.prototype.clear=function(){this.head=this.tail=null,this.length=0},BufferList.prototype.join=function(s){if(0===this.length)return"";for(var p=this.head,ret=""+p.data;p=p.next;)ret+=s+p.data;return ret},BufferList.prototype.concat=function(n){if(0===this.length)return bufferShim.alloc(0);if(1===this.length)return this.head.data;for(var ret=bufferShim.allocUnsafe(n>>>0),p=this.head,i=0;p;)p.data.copy(ret,i),i+=p.data.length,p=p.next;return ret}},function(module,exports){var toString={}.toString;module.exports=Array.isArray||function(arr){return"[object Array]"==toString.call(arr)}},function(module,exports,__webpack_require__){(function(global){function deprecate(fn,msg){function deprecated(){if(!warned){if(config("throwDeprecation"))throw new Error(msg);config("traceDeprecation")?console.trace(msg):console.warn(msg),warned=!0}return fn.apply(this,arguments)}if(config("noDeprecation"))return fn;var warned=!1;return deprecated}function config(name){try{if(!global.localStorage)return!1}catch(_){return!1}var val=global.localStorage[name];return null!=val&&"true"===String(val).toLowerCase()}module.exports=deprecate}).call(exports,__webpack_require__(4))},function(module,exports,__webpack_require__){module.exports=__webpack_require__(110)},function(module,exports,__webpack_require__){module.exports=__webpack_require__(63)},function(module,exports,__webpack_require__){module.exports=__webpack_require__(64)},function(module,exports){"function"==typeof Object.create?module.exports=function(ctor,superCtor){ctor.super_=superCtor,ctor.prototype=Object.create(superCtor.prototype,{constructor:{value:ctor,enumerable:!1,writable:!0,configurable:!0}})}:module.exports=function(ctor,superCtor){ctor.super_=superCtor;var TempCtor=function(){};TempCtor.prototype=superCtor.prototype,ctor.prototype=new TempCtor,ctor.prototype.constructor=ctor}},function(module,exports,__webpack_require__){(function(Buffer,global,process){function decideMode(preferBinary,useFetch){return capability.fetch&&useFetch?"fetch":capability.mozchunkedarraybuffer?"moz-chunked-arraybuffer":capability.msstream?"ms-stream":capability.arraybuffer&&preferBinary?"arraybuffer":capability.vbArray&&preferBinary?"text:vbarray":"text"}function statusValid(xhr){try{var status=xhr.status;return null!==status&&0!==status}catch(e){return!1}}var capability=__webpack_require__(112),inherits=__webpack_require__(113),response=__webpack_require__(469),stream=__webpack_require__(67),toArrayBuffer=__webpack_require__(471),IncomingMessage=response.IncomingMessage,rStates=response.readyStates,ClientRequest=module.exports=function(opts){var self=this;stream.Writable.call(self),self._opts=opts,self._body=[],self._headers={},opts.auth&&self.setHeader("Authorization","Basic "+new Buffer(opts.auth).toString("base64")),Object.keys(opts.headers).forEach(function(name){self.setHeader(name,opts.headers[name])});var preferBinary,useFetch=!0;if("disable-fetch"===opts.mode||"timeout"in opts)useFetch=!1,preferBinary=!0;else if("prefer-streaming"===opts.mode)preferBinary=!1;else if("allow-wrong-content-type"===opts.mode)preferBinary=!capability.overrideMimeType;else{if(opts.mode&&"default"!==opts.mode&&"prefer-fast"!==opts.mode)throw new Error("Invalid value for opts.mode");preferBinary=!0}self._mode=decideMode(preferBinary,useFetch),self.on("finish",function(){self._onFinish()})};inherits(ClientRequest,stream.Writable),ClientRequest.prototype.setHeader=function(name,value){var self=this,lowerName=name.toLowerCase();unsafeHeaders.indexOf(lowerName)===-1&&(self._headers[lowerName]={name:name,value:value})},ClientRequest.prototype.getHeader=function(name){var self=this;return self._headers[name.toLowerCase()].value},ClientRequest.prototype.removeHeader=function(name){var self=this;delete self._headers[name.toLowerCase()]},ClientRequest.prototype._onFinish=function(){var self=this;if(!self._destroyed){var opts=self._opts,headersObj=self._headers,body=null;if("POST"!==opts.method&&"PUT"!==opts.method&&"PATCH"!==opts.method&&"MERGE"!==opts.method||(body=capability.blobConstructor?new global.Blob(self._body.map(function(buffer){return toArrayBuffer(buffer)}),{type:(headersObj["content-type"]||{}).value||""}):Buffer.concat(self._body).toString()),"fetch"===self._mode){var headers=Object.keys(headersObj).map(function(name){return[headersObj[name].name,headersObj[name].value]});global.fetch(self._opts.url,{method:self._opts.method,headers:headers,body:body||void 0,mode:"cors",credentials:opts.withCredentials?"include":"same-origin"}).then(function(response){self._fetchResponse=response,self._connect()},function(reason){self.emit("error",reason)})}else{var xhr=self._xhr=new global.XMLHttpRequest;try{xhr.open(self._opts.method,self._opts.url,!0)}catch(err){return void process.nextTick(function(){self.emit("error",err)})}"responseType"in xhr&&(xhr.responseType=self._mode.split(":")[0]),"withCredentials"in xhr&&(xhr.withCredentials=!!opts.withCredentials),"text"===self._mode&&"overrideMimeType"in xhr&&xhr.overrideMimeType("text/plain; charset=x-user-defined"),"timeout"in opts&&(xhr.timeout=opts.timeout,xhr.ontimeout=function(){self.emit("timeout")}),Object.keys(headersObj).forEach(function(name){xhr.setRequestHeader(headersObj[name].name,headersObj[name].value)}),self._response=null,xhr.onreadystatechange=function(){switch(xhr.readyState){case rStates.LOADING:case rStates.DONE:self._onXHRProgress()}},"moz-chunked-arraybuffer"===self._mode&&(xhr.onprogress=function(){self._onXHRProgress()}),xhr.onerror=function(){self._destroyed||self.emit("error",new Error("XHR error"))};try{xhr.send(body)}catch(err){return void process.nextTick(function(){self.emit("error",err)})}}}},ClientRequest.prototype._onXHRProgress=function(){var self=this;statusValid(self._xhr)&&!self._destroyed&&(self._response||self._connect(),self._response._onXHRProgress())},ClientRequest.prototype._connect=function(){var self=this;self._destroyed||(self._response=new IncomingMessage(self._xhr,self._fetchResponse,self._mode),self._response.on("error",function(err){self.emit("error",err)}),self.emit("response",self._response))},ClientRequest.prototype._write=function(chunk,encoding,cb){var self=this;self._body.push(chunk),cb()},ClientRequest.prototype.abort=ClientRequest.prototype.destroy=function(){var self=this;self._destroyed=!0,self._response&&(self._response._destroyed=!0),self._xhr&&self._xhr.abort()},ClientRequest.prototype.end=function(data,encoding,cb){var self=this;"function"==typeof data&&(cb=data,data=void 0),stream.Writable.prototype.end.call(self,data,encoding,cb)},ClientRequest.prototype.flushHeaders=function(){},ClientRequest.prototype.setTimeout=function(){},ClientRequest.prototype.setNoDelay=function(){},ClientRequest.prototype.setSocketKeepAlive=function(){};var unsafeHeaders=["accept-charset","accept-encoding","access-control-request-headers","access-control-request-method","connection","content-length","cookie","cookie2","date","dnt","expect","host","keep-alive","origin","referer","te","trailer","transfer-encoding","upgrade","user-agent","via"]}).call(exports,__webpack_require__(12).Buffer,__webpack_require__(4),__webpack_require__(16))},function(module,exports,__webpack_require__){(function(process,Buffer,global){var capability=__webpack_require__(112),inherits=__webpack_require__(113),stream=__webpack_require__(67),rStates=exports.readyStates={UNSENT:0,OPENED:1,HEADERS_RECEIVED:2,LOADING:3,DONE:4},IncomingMessage=exports.IncomingMessage=function(xhr,response,mode){function read(){reader.read().then(function(result){if(!self._destroyed){if(result.done)return void self.push(null);self.push(new Buffer(result.value)),read()}})["catch"](function(err){self.emit("error",err)})}var self=this;if(stream.Readable.call(self),self._mode=mode,self.headers={},self.rawHeaders=[],self.trailers={},self.rawTrailers=[],self.on("end",function(){process.nextTick(function(){self.emit("close")})}),"fetch"===mode){self._fetchResponse=response,self.url=response.url,self.statusCode=response.status,self.statusMessage=response.statusText,response.headers.forEach(function(header,key){self.headers[key.toLowerCase()]=header,self.rawHeaders.push(key,header)});var reader=response.body.getReader();read()}else{self._xhr=xhr,self._pos=0,self.url=xhr.responseURL,self.statusCode=xhr.status,self.statusMessage=xhr.statusText;var headers=xhr.getAllResponseHeaders().split(/\r?\n/);if(headers.forEach(function(header){var matches=header.match(/^([^:]+):\s*(.*)/);if(matches){var key=matches[1].toLowerCase();"set-cookie"===key?(void 0===self.headers[key]&&(self.headers[key]=[]),self.headers[key].push(matches[2])):void 0!==self.headers[key]?self.headers[key]+=", "+matches[2]:self.headers[key]=matches[2],self.rawHeaders.push(matches[1],matches[2])}}),self._charset="x-user-defined",!capability.overrideMimeType){var mimeType=self.rawHeaders["mime-type"];if(mimeType){var charsetMatch=mimeType.match(/;\s*charset=([^;])(;|$)/);charsetMatch&&(self._charset=charsetMatch[1].toLowerCase())}self._charset||(self._charset="utf-8")}}};inherits(IncomingMessage,stream.Readable),IncomingMessage.prototype._read=function(){},IncomingMessage.prototype._onXHRProgress=function(){var self=this,xhr=self._xhr,response=null;switch(self._mode){case"text:vbarray":if(xhr.readyState!==rStates.DONE)break;try{response=new global.VBArray(xhr.responseBody).toArray()}catch(e){}if(null!==response){self.push(new Buffer(response));break}case"text":try{response=xhr.responseText}catch(e){self._mode="text:vbarray";break}if(response.length>self._pos){var newData=response.substr(self._pos);if("x-user-defined"===self._charset){for(var buffer=new Buffer(newData.length),i=0;i<newData.length;i++)buffer[i]=255&newData.charCodeAt(i);self.push(buffer)}else self.push(newData,self._charset);self._pos=response.length}break;case"arraybuffer":if(xhr.readyState!==rStates.DONE||!xhr.response)break;response=xhr.response,self.push(new Buffer(new Uint8Array(response)));break;case"moz-chunked-arraybuffer":if(response=xhr.response,xhr.readyState!==rStates.LOADING||!response)break;self.push(new Buffer(new Uint8Array(response)));break;case"ms-stream":if(response=xhr.response,xhr.readyState!==rStates.LOADING)break;var reader=new global.MSStreamReader;reader.onprogress=function(){reader.result.byteLength>self._pos&&(self.push(new Buffer(new Uint8Array(reader.result.slice(self._pos)))),self._pos=reader.result.byteLength)},reader.onload=function(){self.push(null)},reader.readAsArrayBuffer(response)}self._xhr.readyState===rStates.DONE&&"ms-stream"!==self._mode&&self.push(null)}}).call(exports,__webpack_require__(16),__webpack_require__(12).Buffer,__webpack_require__(4))},function(module,exports){module.exports={100:"Continue",101:"Switching Protocols",102:"Processing",200:"OK",201:"Created",202:"Accepted",203:"Non-Authoritative Information",204:"No Content",205:"Reset Content",206:"Partial Content",207:"Multi-Status",208:"Already Reported",226:"IM Used",300:"Multiple Choices",301:"Moved Permanently",302:"Found",303:"See Other",304:"Not Modified",305:"Use Proxy",307:"Temporary Redirect",308:"Permanent Redirect",400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Payload Too Large",414:"URI Too Long",415:"Unsupported Media Type",416:"Range Not Satisfiable",417:"Expectation Failed",418:"I'm a teapot",421:"Misdirected Request",422:"Unprocessable Entity",423:"Locked",424:"Failed Dependency",425:"Unordered Collection",426:"Upgrade Required",428:"Precondition Required",429:"Too Many Requests",431:"Request Header Fields Too Large",
451:"Unavailable For Legal Reasons",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported",506:"Variant Also Negotiates",507:"Insufficient Storage",508:"Loop Detected",509:"Bandwidth Limit Exceeded",510:"Not Extended",511:"Network Authentication Required"}},function(module,exports,__webpack_require__){var Buffer=__webpack_require__(12).Buffer;module.exports=function(buf){if(buf instanceof Uint8Array){if(0===buf.byteOffset&&buf.byteLength===buf.buffer.byteLength)return buf.buffer;if("function"==typeof buf.buffer.slice)return buf.buffer.slice(buf.byteOffset,buf.byteOffset+buf.byteLength)}if(Buffer.isBuffer(buf)){for(var arrayCopy=new Uint8Array(buf.length),len=buf.length,i=0;i<len;i++)arrayCopy[i]=buf[i];return arrayCopy.buffer}throw new Error("Argument must be a Buffer")}},function(module,exports){function extend(){for(var target={},i=0;i<arguments.length;i++){var source=arguments[i];for(var key in source)hasOwnProperty.call(source,key)&&(target[key]=source[key])}return target}module.exports=extend;var hasOwnProperty=Object.prototype.hasOwnProperty},function(module,exports){"use strict";module.exports={isString:function(arg){return"string"==typeof arg},isObject:function(arg){return"object"==typeof arg&&null!==arg},isNull:function(arg){return null===arg},isNullOrUndefined:function(arg){return null==arg}}},function(module,exports){"function"==typeof Object.create?module.exports=function(ctor,superCtor){ctor.super_=superCtor,ctor.prototype=Object.create(superCtor.prototype,{constructor:{value:ctor,enumerable:!1,writable:!0,configurable:!0}})}:module.exports=function(ctor,superCtor){ctor.super_=superCtor;var TempCtor=function(){};TempCtor.prototype=superCtor.prototype,ctor.prototype=new TempCtor,ctor.prototype.constructor=ctor}},function(module,exports){module.exports=function(arg){return arg&&"object"==typeof arg&&"function"==typeof arg.copy&&"function"==typeof arg.fill&&"function"==typeof arg.readUInt8}},function(module,exports){},function(module,exports){},,function(module,exports,__webpack_require__){__webpack_require__(48),__webpack_require__(115),__webpack_require__(45),__webpack_require__(46),__webpack_require__(116),__webpack_require__(117),__webpack_require__(47),__webpack_require__(118),__webpack_require__(119),__webpack_require__(11),__webpack_require__(120),__webpack_require__(123),__webpack_require__(124),module.exports=__webpack_require__(125)}]);