class AggregateContent{constructor(filterContainer,target,text){this.text=text;this.target=target;this.filters=[];this.filterContainer=filterContainer;let entries=this.analyze(text);entries.forEach((value,key)=>{let filter=this.filterContainer.getFilterByNameOrId(key);if(!filter){Logger.err("Filter with id or name "+key+" does not exist.");return}if(this.filters.includes(filter))return;this.filters.push(filter);filter.addContentListener(this)})}analyze(text){let filterIdsExpressions=new Map;var rgx=/(\$F([\w-]+)[\w.\[\]-]*)/gm;let matches=text.match(rgx);if(!matches)return filterIdsExpressions;matches.forEach(match=>{let groups=/(\$F([\w-]+)[\w.\[\]-]*)/gm.exec(match);let filterId=groups[2];let exp=groups[0];if(filterIdsExpressions.has(filterId)){let expressions=filterIdsExpressions.get(filterId);expressions.push(exp)}else{filterIdsExpressions.set(filterId,[exp])}});return filterIdsExpressions}update(){let formatted="??";this.target.innerHTML=formatted}}class BatchStateBuilder{constructor(fireman,requestService){this.fireman=fireman;this.requestService=requestService}init(){const self=this;$(document).on("click","[fireman-state]",function(){let state=$(this).attr("fireman-state");self.build(state)})}build(batch){this.fireman.reset(false);this.requestService.muted(function(){if(batch.isJson()){let batchAsJson=JSON.parse(batch);for(var key of Object.keys(batchAsJson)){let value=batchAsJson[key];let filter=this.fireman.getFilterByNameOrId(key);if(!filter){Logger.warn("filter: is not found with identifier:"+key);return}filter.changeState(value)}}}.bind(this));this.requestService.refresh()}}class Channel{constructor(name,order=0){this.toString=()=>{return`[${this.name} (${this.listeners.length})]`};this.name=name;this.order=order;this.listeners=[]}addListener(listener){if(this.listeners.includes(listener))return false;this.listeners.push(listener)}removeListener(listener){return this.listeners.remove(listener)}notifyStateChanged(filter,onPipelineSuccess=null,onPipelineError=null){if(this.listeners.length===0)Logger.warn("There are no listeners for channel ~",this);let pipeline=new Pipeline(this.listeners,{c:this,f:filter},(l,params,onSuccess,onError)=>{Logger.info("~ notifying listener ~ for filter ~ StateChanged",params.c,l,params.f);return l.filterStateChanged(params.c,params.f,onSuccess,()=>{l.onListenerError(params.c,filter);onError()})});pipeline.proceed=this.proceed;pipeline.begin(onPipelineSuccess,onPipelineError)}notifyReset(filter,onPipelineSuccess=null,onPipelineError=null){if(this.listeners.length===0)Logger.warn("There are no listeners for channel ~",this);let pipeline=new Pipeline(this.listeners,{c:this,f:filter},(l,params,onSuccess,onError)=>{Logger.info("~ notifying listener ~ for filter ~ Reset",params.c,l,params.f);return l.filterReset(params.c,params.f,onSuccess,()=>{l.onListenerError(params.c,filter);onError()})});pipeline.proceed=this.proceed;pipeline.begin(onPipelineSuccess,onPipelineError)}proceed(stageRes,proceed){if(stageRes!==true){proceed()}}dispose(){if(!this.listeners)return;this.listeners.forEach(listener=>{if(listener)listener.dispose()})}}class ChannelListener{constructor(){this.isMuted=false;this.toString=()=>{if(this.isMuted)return`[${this.constructor.name}|MUTED]`;return`[${this.constructor.name}]`};this._channelFilters=new Map}get filters(){let res=[];this._channelFilters.forEach((filterArr,key,map)=>{filterArr.forEach(filter=>{if(!res.includes(filter))res.push(filter)})});this.getAdditionalFilters().forEach(filter=>{if(!res.includes(filter))res.push(filter)});return res}getAdditionalFilters(){return[]}muted(body){let pre=this.isMuted;this.mute();body();this.isMuted=pre}getFiltersBy(channel){return this._channelFilters.get(channel)}getFiltersByChannelName(name){let channel=Array.from(this._channelFilters.keys()).firstOrDefault(x=>x.name===name);return this._channelFilters.get(channel)}mute(){this.isMuted=true}unmute(){this.isMuted=false}filterStateChanged(channel,filter,onSuccess,onError){Logger.info(`~ filterStateChanged ~`,this,filter);if(!this._channelFilters.has(channel))this._channelFilters.set(channel,[filter]);else{let filters=this._channelFilters.get(channel);if(filters.firstOrDefault(x=>x.id==filter.id)===null)filters.push(filter)}if(this.isMuted)return;return this.filterStateChangedHandler(channel,filter,onSuccess,onError)}filterReset(channel,filter,onSuccess,onError){Logger.info(`~ filterReset ~`,this,filter);if(this._channelFilters.has(channel)){let filters=this._channelFilters.get(channel);filters.remove(filter)}if(this.isMuted)return;return this.filterResetHandler(channel,filter,onSuccess,onError)}onListenerError(channel,filter){this.muted(()=>{filter.undo()})}dispose(){this._channelFilters.clear()}}class ContentPipe{}class UpperPipe extends ContentPipe{get identifier(){return"upper"}transform(arg){return arg[0].toUpperCase()+arg.substring(1,arg.length)}}class UPPERPipe extends ContentPipe{get identifier(){return"UPPER"}transform(arg){return arg.toUpperCase()}}class DateFormatterPipe extends ContentPipe{get identifier(){return"dt_to_str"}transform(arg){if(arg==null)return"";if(!(arg instanceof Date))arg=new Date(arg);return arg.toDateString()}}class Filter{constructor(id,name,group,defaultState,listener,filteringEqualityStrategy,role=null){this.toString=()=>{let muted=this.isMuted?"MUTED ":"";return`[${muted}(${this.id}) ${this._name} (${this.getState()}) | adaptors:${this._adaptors.length} | rules:${this.rules.length} | contents:${this._contents.length} ->${this._listener}]`};this._id=id;this._name=name;this.group=group;this.defaultState=defaultState;this._role=role;this._filteringEqualityStrategy=filteringEqualityStrategy;this._filteringEqualityStrategy.setFilter(this);this.history=new Stack;this._listener=listener;this.serializers=new Map;this._adaptors=[];this._contents=[];this._contentListeners=[];this.rules=[];this.isMuted=false;this.sensitivity=new Sensitivity;this.size=1;this.state=null;this._filterBonds=[]}get id(){return this._id}get name(){return this._name}get container(){return this._container}get role(){return this._role}get type(){return new FilterType(this.encoder.identifier)}get adaptors(){return this._adaptors}setEncoder(encoder){this.encoder=encoder;if(!this.defaultState)this.defaultState=this.encoder.getDefault();else this.defaultState=this.encoder.encode(this.defaultState)}addBond(bond){this._filterBonds.push(bond)}encode(value){return this.encoder.encode(value)}decode(value){return this.encoder.decode(value)}getDefaultState(index=null){return this.defaultState}setSensitivity(sensitivity){this.sensitivity=sensitivity}changeStateRequested(adaptor,state,excludeAdaptor=false){this.changeState(state,null,excludeAdaptor?null:adaptor)}changeIndexedStateRequested(adaptor,state,index){this.changeState(state,index,adaptor)}resetRequested(adaptor){this.reset(null,adaptor)}satisfies(item){return this._filteringEqualityStrategy.satisfies(item)}applyRole(data){return this.role.apply(this,data)}hasRole(){return this.role!=null}serialize(id,builder){this.serializers.get(id).serialize(builder)}restore(key,value){this.serializers.get("_url").deserialize(key,value)}identify(key,value){return this.serializers.get("_url").identify(key,value)}commit(){if(this._listener instanceof FiremanMemento)this._listener.commit()}revert(){if(this._listener instanceof FiremanMemento)this._listener.revert()}addRule(rule){if(this.rules.includes(rule))return;this.rules.push(rule);Logger.ok("rule attached to ~",this)}removeRule(rule){this.rules.remove(rule)}executeStateChangedRulesBefore(){this.rules.forEach(rule=>{rule.executeStateChangedBefore(this)})}executeStateChangedRulesAfter(){this.rules.forEach(rule=>{rule.executeStateChangedAfter(this)})}executeResetRulesBefore(){this.rules.forEach(rule=>{rule.executeResetBefore(this)})}executeResetRulesAfter(){this.rules.forEach(rule=>{rule.executeResetAfter(this)})}pack(listener){this._listener=listener}getSerializer(key){return this.serializers.get(key)}addSerializer(key,serializer){if(this.serializers.has(key))return false;serializer.setFilter(this);this.serializers.set(key,serializer);return true}bind(adaptor){if(adaptor==null||this._adaptors.includes(adaptor))return;this._adaptors.push(adaptor);this.adaptorAdded(adaptor);Logger.info("~ binded with adaptor:~",this,adaptor)}adaptorAdded(adaptor){}addContent(content){if(content.id!=null){let existingContent=this._contents.firstOrDefault(x=>x.id!=null&&x.id.toString()===content.id.toString());if(existingContent){if(existingContent.activate(content.target))Logger.info("~ content ~ activated",this,existingContent);else Logger.err("~ content ~ cannot be activated",this,existingContent);return}}this._contents.push(content);Logger.ok("~ content: ~ created",this,content);content.update()}hasContent(id){if(!id)return false;return this._contents.some(x=>x.id&&x.id.toString()===id.toString())}activateContent(id,target){if(id==null||target==null)return false;let content=this._contents.firstOrDefault(x=>x.id!=null&&x.id.toString()==id.toString());return content.activate(target)}removeContent(id){let content=this._contents.firstOrDefault(x=>x.id!=null&&x.id.toString()===id.toString());if(!content)return;content.deactivate();Logger.info("~ content ~ deactivated",this,content)}updateName(name){if(!name||name=="")return;this._name=name;this.updateContent()}getText(contentId){let content=this._contents.firstOrDefault(x=>x.id!=null&&x.id.toString()===contentId.toString());if(content)return content.content;return null}undo(){let state=this.history.pop();if(!state||!state.value)return this.reset(state.index,null,false);return this.changeState(state.value,state.index,null,false)}isGoingToDefaultState(state,index){return state===this.getDefaultState()}changeState(state,index=null,exceptAdaptor=null,record=true){state=this.doEncode(state);let prev=this.cloneState(this.getState(index));if(this.isGoingToDefaultState(state,index)){return this.reset(index,exceptAdaptor,record)}else{if(this.sensitivity.isGreater(state,index)&&this.doChangeState(state,index)){if(record)this.history.push({value:prev,index:index});this.sensitivity.updateOrigin(state,index);this.updateContent();this.notifyBondsOnStateChanged();if(this.isMuted){this.syncTargets(exceptAdaptor);this.executeStateChangedRulesBefore()}else{this.executeStateChangedRulesBefore();this.notifyForStateChanged(index,prev,exceptAdaptor)}return true}}return false}cloneState(state){return state}notifyForStateChanged(index,prev,exceptAdaptor){this._listener.stateChanged(this,index,prev,()=>{this.syncTargets(exceptAdaptor);this.executeStateChangedRulesAfter()},()=>{this.executeStateChangedRulesAfter()})}doEncode(state){return this.encoder.encode(state)}doChangeState(state,index=null){index=index!==null&&index!==void 0?index:0;if(state===this.state)return false;this.state=state;return true}reset(index=null,exceptAdaptor=null,record=true){let prev=this.getState(index);if(this.doReset(index)){if(record)this.history.push({value:prev,index:index});this.notifyBondsOnReset();this.updateContent();if(this.isMuted){this.syncTargets(exceptAdaptor);this.executeResetRulesBefore()}else{this.executeResetRulesBefore();this.notifyForReset(index,prev,exceptAdaptor)}return true}return false}notifyForReset(index,prev,exceptAdaptor){if(this.isReset())this._listener.reset(this,index,prev,()=>{this.syncTargets(exceptAdaptor);this.executeResetRulesAfter()},()=>{this.executeResetRulesAfter()});else this.notifyForStateChanged(index,prev,exceptAdaptor)}doReset(index=null){if(this.isReset(index))return false;this.state=this.defaultState;return true}isReset(index=null){return this.encoder.equals(this.getDefaultState(),this.getState())}syncTargets(except=null){this._adaptors.forEach(adaptor=>{if(adaptor===except)return;let state=this.getState();if(state!=undefined&&state!=null)adaptor.sync(state,this.getDefaultState(null))})}updateFrom(filter){this.updateName(filter.name);this.updateContents(filter._contents)}updateContents(contents){contents.forEach(content=>{if(content.id==null)return;let c=this._contents.firstOrDefault(x=>x.id!=null&&x.id.toString()==content.id.toString());if(c==null)return;c.updateContent(content.getContent())});this.updateContent()}getState(index=null){return this.state}setContainer(container){this._container=container}mute(){this.isMuted=true}unmute(){this.isMuted=false}addContentListener(listener){if(this._contentListeners.includes(listener))return;this._contentListeners.push(listener)}removeContentListener(listener){this._contentListeners.remove(listener)}updateContent(){this._contents.forEach(content=>{content.update()});this._contentListeners.forEach(listener=>{listener.update()})}notifyBondsOnStateChanged(){this._filterBonds.forEach(bond=>{bond.actOnStateChanged(this)})}notifyBondsOnReset(){this._filterBonds.forEach(bond=>{bond.actOnReset(this)})}dispose(){this._adaptors.forEach(adaptor=>{adaptor.dispose()})}}class ArrayFilter extends Filter{get type(){return new FilterType(this.encoder.identifier,this.size,true)}constructor(id,name,group,size,defaultState,listener,filteringEqualityStrategy,role=null){super(id,name,group,defaultState,listener,filteringEqualityStrategy,role);this.state=[];for(let i=0;i{encoded.push(this.encoder.encode(value))});return encoded}return super.doEncode(state)}isReset(index=null){if(index==null)return this.encoder.equals(this.getState(),this.getDefaultState());else return this.encoder.equals(this.getDefaultState(index),this.getState(index))}adaptorAdded(adaptor){if(this.state.length!==adaptor.size()){for(let i=this.state.length;i=0){if(state===this.state[index])return false;this.state[index]=state;return true}else if(Array.isArray(state)){if(state.length!==this.state.length){Logger.err("input state length must be equal to filter's state length.");return false}let updated=false;for(let i=0;i=0)return this.state[index];return this.state}getDefaultState(index){if(index==null)return this.defaultState;return this.defaultState[index]}doReset(index=null){if(this.isReset(index))return false;if(index==null){for(let i=0;i{return`[(${this.id}) ${this._name} [${this._filters.length}]`};this._filters=[];this._id=id;this._name=name;this.req=req;this.order=order;this.filteringStrategy=filteringStrategy}get id(){return this._id}get name(){return this._name}get filters(){return this._filters}filter(data){let filtersWithoutRole=this.filters.filter(x=>!x.isReset()&&x.role==null);return this.filteringStrategy.filter(filtersWithoutRole,data)}add(filter){if(this._filters.some(x=>x._id==filter._id)){Logger.warn("updating filter ~",filter)}else{filter.setContainer(this);this._filters.push(filter)}}getFilter(id){return this._filters.firstOrDefault(x=>x.id.toString()==id.toString()||x.name===id.toString())}updateFrom(container){this._name=container.name;this.order=container.order}reset(refresh=false){this.req.muted(function(){this._filters.forEach(filter=>{filter.reset()})}.bind(this));if(refresh)this.req.refresh()}clear(){this._filters=[]}}class Fireman{constructor(configuration=null,dependencyResolver=null){this.toString=()=>{return`[Fireman]`};this.dependencyResolver=dependencyResolver!==null&&dependencyResolver!==void 0?dependencyResolver:new DependencyResolver;configuration=configuration!==null&&configuration!==void 0?configuration:{};this.containers=[];this.contents=[];this._requestService=this.initRequestService(configuration.dataSource);this.initUrlService(configuration.url);this.initHub();this.initBindings(configuration);if(configuration.watchReset===true){this.watchReset()}this.watchBatchState();this.watchContent();this.builder=new FiremanBuilder(this,this.dependencyResolver,this._hub);this.domBuilder=new FiremanDOMBuilder(this.builder,this.dependencyResolver,this);this.parseAggregateContent();window["fireman"]=this}get requestService(){return this._requestService}parseAggregateContent(){let items=document.querySelectorAll("[fireman-content]");items.forEach(item=>{this.buildAndAddContent(item)})}buildAndAddContent(item){let value=item.getAttribute("fireman-content");if(value==null){value=item.innerHTML;Logger.err("There is no content value for "+item);return}let script=new PreCompiledScript(value,new Interpreter(new Environment(this,null,this.dependencyResolver)));let content=new FilterContent("__",this,script,item);this.addContent(content,false)}initRequestService(dataSource){let clientDS=null;let httpDS=null;let requestService;if(dataSource==null){clientDS=this.dependencyResolver.resolveKeyed(DependencyType.DataSource,"client",{filterer:new DataFilterer(this,true),data:[]});requestService=new RequestService(this,clientDS,null,new UrlBuilder(",","&"))}else{if(dataSource.client){clientDS=this.dependencyResolver.resolveKeyed(DependencyType.DataSource,"client",{filterer:new DataFilterer(this,dataSource.client.withfilterRolesOnly),data:dataSource.client.data})}if(dataSource.http){httpDS=this.dependencyResolver.resolveKeyed(DependencyType.DataSource,"http",{baseUrl:dataSource.http.baseUrl})}if(dataSource.mode==="toggle"){requestService=new ToggleRequestService(this,clientDS,httpDS,new UrlBuilder(",","&"))}else{requestService=new RequestService(this,dataSource.mode=="client"||dataSource.mode==null&&clientDS!=null?clientDS:null,dataSource.mode=="http"||dataSource.mode==null&&httpDS!=null?httpDS:null,new UrlBuilder(",","&"))}}return requestService}rule(name=null){return new RuleBuilder(this,name,this._requestService)}register(service){this.dependencyResolver.register(service)}unregister(type,key){this.dependencyResolver.unregister(type,key)}addContent(content,update=true){if(!this.contents.includes(content)){this.contents.push(content);if(update)content.update()}}watchReset(){const self=this;$(document).on("click","[filter-reset]",function(){let filterId=$(this).attr("filter-id");let filter=self.getFilterById(filterId);if(filter)filter.reset()});Logger.info("~ is watching for reset events",this)}watchBatchState(){let batchStateBuilder=new BatchStateBuilder(this,this._requestService);batchStateBuilder.init();Logger.info("~ is watching for fireman-state events",this)}watchContent(){this.watcher=new Watcher;this.watcher.watch("[fireman-watch]").for("[content-id][filter-id], [content], [fireman-content]").when(function(contentEl){if(contentEl.getAttribute("fireman-content")){this.buildAndAddContent(contentEl);return}let filterId=contentEl.getAttribute("filter-id");let filter=this.getFilterByNameOrId(filterId);if(!filter){Logger.warn("cannot find filter with id: "+filterId);return}let contentId=contentEl.getAttribute("content-id");if(!contentId)contentId=contentEl.id;if(filter.hasContent(contentId)){filter.activateContent(contentId,contentEl);return}let text=contentEl.getAttribute("content");if(filter){let preCompiledScript=new PreCompiledScript(text,new Interpreter(new Environment(this,filter,this.dependencyResolver)));let content=new FilterContent(contentId,this,preCompiledScript,contentEl);filter.addContent(content)}}.bind(this),function(contentEl){let filterId=contentEl.getAttribute("filter-id");let contentId=contentEl.getAttribute("content-id");if(!contentId&&contentEl.id)contentId=contentEl.id;let filter=this.getFilterByNameOrId(filterId);if(filter){if(contentId)filter.removeContent(contentId);else{Logger.warn("dangling content")}}else{}}.bind(this))}initUrlService(conf){this._urlService=new UrlService(new UrlBuilder(",","&"),this._requestService,this)}initHub(){this._hub=new Hub;this._hub.createChannel(Fireman.REQUEST_CHANNEL,0);this._hub.subscribe(Fireman.REQUEST_CHANNEL,this._requestService);this._hub.createChannel(Fireman.URL_CHANNEL,1);this._hub.subscribe(Fireman.URL_CHANNEL,this._urlService)}initBindings(conf){if(conf.reset!=null&&conf.reset.length>0){conf.reset.forEach(entry=>{let target=document.querySelector(entry.target);if(target!=null){target.addEventListener("click",()=>this.reset())}})}}getFilters(){let filters=new Array;this.containers.forEach(container=>{container.filters.forEach(filter=>{filters.push(filter)})});return filters}getFilterById(filterId){if(!filterId)return null;return this.getFilters().firstOrDefault(x=>x.id.toString()===filterId.toString())}getFiltersByGroup(group){if(!group)return null;return this.getFilters().filter(x=>x.group===group)}getFilter(containerId,filterId){if(!containerId||!filterId)return null;let container=this.getContainer(containerId);if(container==null)return null;return container.getFilter(filterId)}getFilterByNameOrId(filterId){let filter=this.getFilterById(filterId);if(filter)return filter;return this.getFilterByName(filterId)}getFilterByName(filterName){if(!filterName)return null;return this.getFilters().single(x=>x.name===filterName)}getFilterByRole(role){switch(role){case Fireman.SORTING_ROLE:return this.getFilters().firstOrDefault(x=>x.role instanceof SortingRole);case Fireman.PAGE_ROLE:return this.getFilters().firstOrDefault(x=>x.role instanceof PageRole);case Fireman.PAGESIZE_ROLE:return this.getFilters().firstOrDefault(x=>x.role instanceof PageSizeRole)}return null}getFiltersWithNoRole(){return this.getFilters().filter(x=>x.role==null)}getContainer(identifier){if(identifier==null)return null;let container=this.containers.firstOrDefault(x=>x.id.toString()===identifier.toString()||x.name===identifier);return container}getContainerById(id){if(id==null)return null;let container=this.containers.firstOrDefault(x=>x.id.toString()===id.toString());return container}createChannel(name){this._hub.createChannel(name)}bind(channelName,containerId,filterId){if(channelName==null||containerId==null||filterId==null)return;let container=this.containers.firstOrDefault(x=>x.id===containerId);if(container==null)return;let filter=container.getFilter(filterId);if(filter==null)return;this.builder.bindFilterToChannel(filter,channelName)}clear(){this.watcher.dispose();this.getFilters().forEach(filter=>{filter.dispose()});this.containers.forEach(container=>{container.clear()});this.containers=[];this._hub.dispose();this.dependencyResolver.clear()}update(data){this.builder.build(data);this.contents.forEach(content=>{content.bindListeners()})}build(scopeElementSelector=null){this.domBuilder.build(scopeElementSelector)}subscribeResultsListener(listener){this._requestService.addListener(listener)}subscribe(name,listener){var _a;if(listener instanceof ChannelListener)this._hub.subscribe(name,listener);else if(listener instanceof RuleListener){let filter=this.getFilters().firstOrDefault(x=>x.rules.some(y=>y.name===name));let rule=(_a=filter===null||filter===void 0?void 0:filter.rules)===null||_a===void 0?void 0:_a.firstOrDefault(x=>x.name===name);rule===null||rule===void 0?void 0:rule.addListener(listener)}}unsubscribe(name,listener){var _a;if(listener instanceof ChannelListener)this._hub.unsubscribe(name,listener);else if(listener instanceof RuleListener){let filter=this.getFilters().firstOrDefault(x=>x.rules.some(y=>y.name===name));let rule=(_a=filter===null||filter===void 0?void 0:filter.rules)===null||_a===void 0?void 0:_a.firstOrDefault(x=>x.name===name);rule===null||rule===void 0?void 0:rule.removeListener(listener)}}onHold(){this.getFilters().forEach(filter=>{filter.pack(new FiremanMemento(this._hub,this._requestService))})}exitOnHold(){this.getFilters().forEach(filter=>{filter.pack(this._hub)})}revert(){this._requestService.muted(function(){this.getFilters().forEach(filter=>{filter.revert()})}.bind(this))}commit(){this._requestService.muted(function(){this.getFilters().forEach(filter=>{filter.commit()})}.bind(this));this._requestService.refresh()}restore(){this._requestService.muted(function(){this._urlService.restore()}.bind(this))}addContainer(container){if(this.containers.some(x=>x.id===container.id)){return}this.containers.push(container)}changeState(containerId,filterId,state){if(containerId==null||filterId==null||state==null){return false}const filter=this.getFilter(containerId,filterId);if(filter==null){return false}return filter.changeState(state)}refresh(){this._requestService.refresh()}reset(refresh=true){this._requestService.muted(function(){this.containers.forEach(container=>{container.reset()})}.bind(this));if(refresh)this.refresh()}}Fireman.URL_CHANNEL="_URL";Fireman.REQUEST_CHANNEL="_REQ";Fireman.SORTING_ROLE="_SORTING";Fireman.PAGE_ROLE="_PAGE";Fireman.PAGESIZE_ROLE="_PAGE_SIZE";class FiremanBuilder{constructor(fireman,dependencyResolver,hub){this.toString=()=>{return`[FiremanBuilder]`};this.fireman=fireman;this.identityService=new IdentityService;this.hub=hub;this.encoderDefinitions=new Array;this.adaptorDefinitions=new Array;this.serializerDefinitions=new Array;this.sensitivitiesDefinitions=new Array;this.dependencyResolver=dependencyResolver}build(items){if(items==null)return;if(!Array.isArray(items))items=[items];items.forEach(item=>{if(this.isFilter(item)){this.upsertFilter(item)}else{let container=this.fireman.getContainerById(item.id);if(container==null){container=this.createContainer(item);item.filters.forEach(filterConf=>{let filter=this.buildFilter(filterConf);container.add(filter)})}else{container.updateFrom(item);Logger.ok("Container ~ updated.",container);item.filters.forEach(filterConf=>{this.upsertFilter(filterConf,container)})}}})}upsertFilter(filterConf,container=null){let filter=this.buildFilter(filterConf);let existing=this.fireman.getFilterById(filter.id);if(existing!=null){existing.updateFrom(filter);Logger.ok("Filter ~ updated.",existing)}else{container=container!==null&&container!==void 0?container:this.createContainer({id:filterConf.id,name:filterConf.name});container.add(filter);Logger.ok("Filter ~ created.",filter)}}isFilter(item){return item.state||item.type||item.url||item.req||item.role||!item.filters}createContainer(data){var _a;data.id=(_a=data.id)!==null&&_a!==void 0?_a:this.identityService.generateId();data.name=data.name;let container=new FilterContainer(data.id,data.name,new OrFilteringStrategy,this.fireman.requestService,data.order);this.fireman.addContainer(container);Logger.ok("Container ~ created.",container);return container}buildFilter(filterConf){var _a,_b;let filter=null;let role=this.buildRole(filterConf.role);let type=this.dependencyResolver.resolve(DependencyType.FilterType,filterConf);let filteringEqualityStrategy=this.dependencyResolver.resolveKeyed(DependencyType.FilteringEqualityStrategy,(_a=filterConf.filtering)===null||_a===void 0?void 0:_a.type,filterConf.filtering);let id=(_b=filterConf.id)!==null&&_b!==void 0?_b:this.identityService.generateId();let name=filterConf.name;let group=filterConf.group;switch(type.isArray){case true:filter=new ArrayFilter(id,name,group,type.size,filterConf.default,this.hub,filteringEqualityStrategy,role);break;case false:filter=new Filter(id,name,group,filterConf.default,this.hub,filteringEqualityStrategy,role);break}this.buildEncoder(filter,type.encoderType);this.buildSensitivity(filter,filterConf.sensitivity);this.buildSerializers(filter,filterConf);this.buildBonds(filter,filterConf);this.bindState(filter,filterConf.state);this.bindReset(filter,filterConf.reset);this.bindContent(filter,filterConf.content);this.bindFilterToChannels(filter,filterConf.channels);return filter}buildEncoder(filter,type){let encoder=null;type=type!==null&&type!==void 0?type:"text";encoder=this.dependencyResolver.resolveKeyed(DependencyType.Encoder,type);filter.setEncoder(encoder)}buildSensitivity(filter,sensitivityConf){if(!sensitivityConf)return;let sensitivity=this.dependencyResolver.resolveKeyed(DependencyType.Sensitivity,sensitivityConf.type!=null||sensitivityConf.type!=undefined?sensitivityConf.type:sensitivityConf,sensitivityConf);filter.setSensitivity(sensitivity)}buildRole(roleConf){let role=null;if(roleConf==null)return null;switch(roleConf.type){case Fireman.SORTING_ROLE:role=new SortingRole(roleConf.precedence,roleConf.rules);break;case Fireman.PAGE_ROLE:role=new PageRole(this.fireman);break;case Fireman.PAGESIZE_ROLE:role=new PageSizeRole;break;default:throw new Error("there is no role "+roleConf.type)}return role}buildSerializers(filter,filterConf){var _a,_b;let urlSerializer=this.dependencyResolver.resolveKeyed(DependencyType.Serializer,filterConf.url?filterConf.url.type:null,(_a=filterConf.url)!==null&&_a!==void 0?_a:{});filter.addSerializer("_url",urlSerializer);let reqSerializer=this.dependencyResolver.resolveKeyed(DependencyType.Serializer,filterConf.req?filterConf.req.type:null,(_b=filterConf.req)!==null&&_b!==void 0?_b:{});filter.addSerializer("_req",reqSerializer)}buildBonds(filter,filterConf){if(filter.group!=null&&filter.group!=""){filter.addBond(new RadioFilterBond(this.fireman,this.fireman.requestService))}}bindState(filter,stateEntries){if(stateEntries==null)return;stateEntries.forEach(entry=>{this.bindStateEntry(filter,entry)})}bindStateEntry(filter,entry){var _a;let adaptor=this.dependencyResolver.resolveKeyed(DependencyType.Adaptor,entry.adaptor,{req:(_a=entry.req)!==null&&_a!==void 0?_a:true,params:entry.params,requestService:this.fireman.requestService,listener:filter,targets:entry.target?[entry.target]:entry.targets});filter.bind(adaptor)}bindContent(filter,contentEntries){if(contentEntries==null)return;contentEntries.forEach(entry=>{let preCompiledScript=new PreCompiledScript(entry.text,new Interpreter(new Environment(this.fireman,filter,this.dependencyResolver)));let content=new FilterContent(entry.id,this.fireman,preCompiledScript,entry.target);filter.addContent(content)})}bindReset(filter,resetEntries){if(resetEntries==null)return;resetEntries.forEach(entry=>{filter.bind(new ButtonResetAdaptor({},filter,[entry.target]))})}getAdaptorEntry(compatibleWith,identifier=null){return this.dependencyResolver.getSpec(DependencyType.Adaptor,identifier)}getSerializerEntry(compatibleWith=null,identifier=null){if(!identifier||identifier===""||identifier==="default")return this.serializerDefinitions[0];return this.serializerDefinitions.firstOrDefault(x=>x.identifier===identifier)}getSensitivityEntry(compatibleWith,identifier=null){if(!identifier||identifier===""||identifier==="default")return this.sensitivitiesDefinitions.firstOrDefault(x=>x.prototype.compatibility().some(y=>y.type===compatibleWith&&y.isDefault));return this.sensitivitiesDefinitions.firstOrDefault(x=>x.prototype.compatibility().some(y=>y.type===compatibleWith)&&x.identifier===identifier)}getEncoderEntry(identifier=null){return this.encoderDefinitions.firstOrDefault(x=>x.identifier===identifier)}bindFilterToChannels(filter,channels){if(channels==null||channels.length===0)return;channels.forEach(channel=>{this.bindFilterToChannel(filter,channel)})}bindFilterToChannel(filter,channelName){let channel=this.hub.getChannel(channelName);if(channel==null)return;this.hub.bind(filter,channel)}}class FiremanDOMBuilder{constructor(builder,dependencyResolver,fireman){this.toString=()=>{return`[FiremanDOMBuilder]`};this.builder=builder;this.dependencyResolver=dependencyResolver;this.fireman=fireman}parseFilter(filter,scope=null){scope=scope!==null&&scope!==void 0?scope:document;let type=this.dependencyResolver.resolve(DependencyType.FilterType,filter);let filterConf={id:filter.getFId(),name:filter.getFName(),group:filter.getFGroup(),type:type,filtering:{},channels:[],url:{},req:{},state:[],content:[],reset:[]};this.parseSerializers(filter,filterConf);this.parseRole(filter,filterConf);this.parseChannels(filter,filterConf.channels);this.parseStateExplicit(filter,filterConf.state);this.parseStateEnclosing(filter,filterConf.state);this.parsePartialState(filter,filterConf.state);this.parseFiltering(filter,filterConf);this.parseSensitivity(filter,filterConf);this.parseContent(filter,filterConf.content);this.parseReset(scope,filter,filterConf.reset);this.parseDefaultValues(filter,filterConf);return filterConf}parseFilterById(id){let filter=this.getFilter(id,document);if(!filter){Logger.err("~ There is no filter with id: "+id+" in the DOM.",this);return null}return this.parseFilter(filter)}parseReset(scope,filter,reset){this.parseExplicitReset(filter,reset);this.parseEnclosingReset(filter,reset);this.parseExternalReset(scope,filter,reset)}parseExplicitReset(filter,reset){let resetConf=this.attrStartsWith(filter,"reset");resetConf.forEach(entry=>{reset.push(JSON.parse(entry["value"]))})}parseEnclosingReset(filter,reset){let resetElements=filter.querySelectorAll("[reset]");resetElements.forEach(element=>{reset.push({target:element})})}parseExternalReset(scope,filter,reset){var resetElements=scope.querySelectorAll(`[filter-id='${filter.getFId()}'][reset]`);resetElements.forEach(element=>{reset.push({target:element})})}parseContent(filter,content){this.parseExplicitContent(filter,content);this.parseEnclosingContent(filter,content);this.parseImplicitContent(filter,content)}parseImplicitContent(filter,content){let items=document.querySelectorAll('[content][filter-id="'+filter.getFId()+'"], [content][filter-id="'+filter.getFName()+'"]');items.forEach(element=>{let text=element.getAttribute("content");this.addContentIfNotExists({target:element,text:text},content)})}parseExplicitContent(filter,content){let contentEntries=this.attrStartsWith(filter,"content");contentEntries.forEach(entry=>{if(entry.isJson()){let c=JSON.parse(entry.value);if(!c.id&&entry.name!=="content")c.id=entry.name.substring("content-".length);this.addContentIfNotExists(c,content)}else{if(entry.name==="content"){Logger.err(`You must provide an id for the content entry content=${entry.value} on filter with id:${filter.getFId()}`);return}this.addContentIfNotExists({id:entry.name.substring("content-".length),text:entry.value},content)}})}parseEnclosingContent(filter,content){filter.querySelectorAll("[content]").forEach(contentEl=>{let contentAttr=contentEl.getAttribute("content");let contentId=contentEl.getAttribute("content-id");this.addContentIfNotExists({target:contentEl,id:contentId,text:contentAttr},content)})}addContentIfNotExists(entry,content){let existing=content.firstOrDefault(x=>x.id&&x.id===entry.id);if(existing){Logger.err(`content with id ${existing.id} already exists.`);return}content.push(entry)}parseSerializers(filter,filterConf){let urlSerializer=filter.getAttribute("url");if(urlSerializer){urlSerializer=JSON.parse(urlSerializer);filterConf.url=urlSerializer}let reqSerializer=filter.getAttribute("req");if(reqSerializer){reqSerializer=JSON.parse(reqSerializer);filterConf.req=reqSerializer}}parseRole(filter,filterConf){let roleAttr=filter.getAttribute("filter-role");if(!roleAttr)return;if(roleAttr.isJson()){let roleObj=JSON.parse(roleAttr);filterConf.role=roleObj}else{filterConf.role={type:roleAttr}}}parseStateExplicit(filter,state){let stateConf=this.attrStartsWith(filter,"state");stateConf.forEach(entry=>{state.push(JSON.parse(entry["value"]))})}parseStateEnclosing(filter,state){let type=this.dependencyResolver.resolve(DependencyType.FilterType,filter);let adaptor=filter.getAttribute("filter-adaptor");let adaptorParams=filter.getAttribute("adaptor-params");if(adaptorParams!=null&&adaptorParams.isJson())adaptorParams=JSON.parse(adaptorParams);let adaptorAsJson=adaptor?adaptor.tryParseJSON():false;let adaptorEntry=this.builder.getAdaptorEntry(type.encoderType,adaptorAsJson?adaptorAsJson.type:adaptor);let entry=adaptorEntry.prototype.resolveTarget(filter);entry.adaptor=adaptorEntry.identifier;entry.params=adaptorParams;if(adaptorAsJson&&adaptorAsJson.req!==undefined&&adaptorAsJson.req===false){entry.req=false}state.push(entry)}parsePartialState(filter,state){let els=document.querySelectorAll('[filter-state][filter-id="'+filter.getFId()+'"]');let type=this.dependencyResolver.resolve(DependencyType.FilterType,filter);els.forEach(element=>{this.parsePartialStateEntry(element,type,state)})}parsePartialStateEntry(element,type,state){let adaptor=element.getAttribute("filter-adaptor");let adaptorParams=element.getAttribute("adaptor-params");if(adaptorParams!=null&&adaptorParams.isJson())adaptorParams=JSON.parse(adaptorParams);let adaptorAsJson=adaptor?adaptor.tryParseJSON():false;let adaptorEntry=this.builder.getAdaptorEntry(type.encoderType,adaptorAsJson?adaptorAsJson.type:adaptor);let entry=adaptorEntry.prototype.resolveTarget(element);entry.adaptor=adaptorEntry.identifier;entry.params=adaptorParams;if(adaptorAsJson&&adaptorAsJson.req!==undefined&&adaptorAsJson.req===false){entry.req=false}state.push(entry)}parseFiltering(filter,conf){let filteringAttr=filter.getAttribute("filtering");if(filteringAttr==null||filteringAttr==undefined)return;if(filteringAttr.isJson()){conf.filtering=JSON.parse(filteringAttr)}else conf.filtering.type=filteringAttr}parseSensitivity(filter,conf){let sensitivityConf=filter.getAttribute("sensitivity");if(!sensitivityConf)return;if(sensitivityConf.isJson())conf.sensitivity=JSON.parse(sensitivityConf);else conf.sensitivity={type:sensitivityConf}}parseDefaultValues(filter,filterConf){let defaultAttr=filter.getAttribute("default");if(!defaultAttr)return;if(defaultAttr.isJson())filterConf.default=JSON.parse(defaultAttr);else filterConf.default=defaultAttr}parseChannels(filter,channels){let channelConf=filter.getAttribute("channels");if(channelConf){for(let channelName of channelConf.split(",").map(c=>{c=c.trim();return c})){channels.push(channelName)}}}build(scopeElementSelector=null){let scope=scopeElementSelector==null?document:document.querySelector(scopeElementSelector);let filters=this.getFilters(scope);let buildFilters=[];filters.forEach(filter=>{if(buildFilters.includes(filter))return;let filterConf=this.parseFilter(filter,scope);let container=this.getContainerOf(filter);if(container){let containerConf={id:container.getCId(),name:container.getCName(),filters:[]};let filters=this.getFilters(container);filters.forEach(filter=>{let filterConf=this.parseFilter(filter,scope);containerConf.filters.push(filterConf);buildFilters.push(filter)});this.builder.build(containerConf)}else this.builder.build(filterConf)})}getContainerOf(filter){return filter.closest("[container]")}attrStartsWith(element,value){return Array.from(element.attributes).filter(x=>x["name"].startsWith(value))}getContainers(scope){return scope.querySelectorAll("[container]")}getFilters(scope){if(scope.hasAttribute("filter"))return[scope];return Array.from(scope.querySelectorAll("[filter]"))}getFilter(id,scope){return scope.querySelector('[filter][filter-id="'+id+'"],[filter][id="'+id+'"]')}}class FiremanMemento{constructor(hub,req){this.toString=()=>{return`[Memento]`};this.req=req;this._hub=hub;this.commands=[]}stateChanged(filter,index,prev,onPipelineSuccess,onPipelineError){Logger.info(`~ captures statechanged for filter: ~ with previous value of: ${prev}`,this,filter);if(!prev)Logger.warn("because filter: ~ previous state is null revert will set to default:"+filter.getDefaultState(index),filter);const self=this;this.commands.push({cmd:()=>this._hub.stateChanged(filter,index,prev,null,null),undo:()=>filter.changeState(self.isNull(prev)?filter.getDefaultState(index):prev,index)});if(onPipelineSuccess)onPipelineSuccess()}reset(filter,index,prev,onPipelineSuccess,onPipelineError){Logger.info(`~ captures reset for filter: ~ with previous value of: ${prev}`,this,filter);if(!prev)Logger.warn("because filter: ~ previous state is null revert will set to default:"+filter.getDefaultState(index),filter);const self=this;this.commands.push({cmd:()=>this._hub.reset(filter,index,prev,null,null),undo:()=>filter.changeState(self.isNull(prev)?filter.getDefaultState(index):prev,index)});if(onPipelineSuccess)onPipelineSuccess()}isNull(value){if(value==null||value==undefined)return true;if(Array.isArray(value)){let allNull=true;value.forEach(x=>{if(x!=null&&x!=undefined)allNull=false});return allNull}else return false}commit(){this.commands.forEach(command=>{command.cmd()});this.commands=[]}revert(){this.commands.reverse().forEach(command=>{command.undo()});this.commands=[]}}class Hub{constructor(){this.toString=()=>{return`[HUB]`};this.filterChannelMap=new Map;this._channels=new Array}getChannel(name){let channel=this._channels.firstOrDefault(x=>x.name===name);if(channel==null)channel=this.createChannel(name);return channel}createChannel(name,order=null){if(this._channels.some(x=>x.name===name))return;let channel=new Channel(name,order==null?this._channels.length:order);this._channels.push(channel);Logger.info(`channel ~ created`,channel);return channel}bind(filter,channel){let channels=this.filterChannelMap.get(filter);if(channels==null){channels=new Array;channels.push(channel);this.filterChannelMap.set(filter,channels)}else{if(!channels.includes(channel))channels.push(channel)}Logger.info(`channel ~ bind ~`,channel,filter)}subscribe(channelName,listener){let channel=this._channels.firstOrDefault(x=>x.name===channelName);if(channel==null)channel=this.createChannel(channelName);channel.addListener(listener);Logger.info(`subscribe to channel ~`,channel)}unsubscribe(channelName,listener){let channel=this._channels.firstOrDefault(x=>x.name===channelName);if(Channel==null)return;channel.removeListener(listener)}stateChanged(filter,index,prev,onPipelineSuccess,onPipelineError){let channels=this.filterChannelMap.get(filter);if(channels==null||channels.length===0){onPipelineSuccess();return}channels=channels.orderBy(x=>x.order);const self=this;let pipeline=new Pipeline(channels,{f:filter},(c,params,onSuccess,onError)=>{Logger.info("~ notifying channel ~ for StateChanged of ~",self,c,params.f);return c.notifyStateChanged(params.f,onSuccess,onError)});pipeline.begin(onPipelineSuccess,onPipelineError)}reset(filter,index,prev,onPipelineSuccess,onPipelineError){let channels=this.filterChannelMap.get(filter);if(channels==null||channels.length===0){onPipelineSuccess();return}channels=channels.orderBy(x=>x.order);const self=this;let pipeline=new Pipeline(channels,{f:filter},(c,params,onSuccess,onError)=>{Logger.info("~ notifying channel ~ for Reset of ~",self,c,params.f);c.notifyReset(params.f,onSuccess,onError)});pipeline.begin(onPipelineSuccess,onPipelineError)}dispose(){this._channels.forEach(channel=>{channel.dispose()});this.filterChannelMap.clear()}}class ResultsListener{constructor(){this.toString=()=>{return`[${this.constructor.name}]`}}onBefore(url){Logger.info("~ onBefore",this);this.onBeforeHandler(url)}resultsReceived(data){Logger.info("~ resultsReceived",this);this.resultsReceivedHandler(data)}onError(err){Logger.err("~ error "+err,this);this.onErrorHandler(err)}onCompleted(){Logger.info("~ completed",this);this.onCompletedHandler()}}class RuleBuilder{constructor(container,name,req){this.container=container;this.name=name;this.req=req}whenStateChangesOfAll(query){return new ThenBuilder({name:this.name,hook:"state",container:this.container,req:this.req,when:query})}whenStateChangesOf(query){return new ThenBuilder({name:this.name,hook:"state",container:this.container,req:this.req,when:q=>[query(this.container)]})}whenResetOfAll(query){return new StrictThenBuilder({name:this.name,hook:"reset",whenTo:null,container:this.container,req:this.req,when:query})}whenResetOf(query){return new StrictThenBuilder({name:this.name,hook:"reset",whenTo:null,container:this.container,req:this.req,when:q=>[query(this.container)]})}}class ThenBuilder{constructor(data){this.data=data}to(whenTo){this.data.whenTo=whenTo;return new StrictThenBuilder(this.data)}thenChangeStateForAll(query){this.data.then=query;this.data.thenMode="state";this.data.whenTo="*";return new ThenToBuilder(this.data)}thenChangeStateFor(query){this.data.then=()=>[query(this.data.container)];this.data.thenMode="state";this.data.whenTo="*";return new ThenToBuilder(this.data)}thenResetForAll(query){this.data.then=query;this.data.thenMode="reset";this.data.whenTo="*";let r=this.data.hook==="state"?new StateChangesRule(this.data):new ResetRule(this.data);r.attach();return r}thenResetFor(query){this.data.then=()=>[query(this.data.container)];this.data.thenMode="reset";this.data.whenTo="*";let r=this.data.hook==="state"?new StateChangesRule(this.data):new ResetRule(this.data);r.attach();return r}}class StrictThenBuilder{constructor(data){this.data=data}thenChangeStateForAll(then){this.data.then=then;this.data.thenMode="state";return new ThenToBuilder(this.data)}thenChangeStateFor(then){this.data.then=()=>[then(this.data.container)];this.data.thenMode="state";return new ThenToBuilder(this.data)}thenResetForAll(then){this.data.then=then;this.data.thenMode="reset";let r=this.data.hook==="state"?new StateChangesRule(this.data):new ResetRule(this.data);r.attach();return r}thenResetFor(then){this.data.then=()=>[then(this.data.container)];this.data.thenMode="reset";let r=this.data.hook==="state"?new StateChangesRule(this.data):new ResetRule(this.data);r.attach();return r}}class ThenToBuilder{constructor(data){this.data=data}to(thenTo){this.data.thenTo=thenTo;let r=this.data.hook==="state"?new StateChangesRule(this.data):new ResetRule(this.data);r.attach();return r}}class RuleListener{}class Rule{constructor(data){this.data=data;this.name=data.name;this.listeners=[]}addListener(listener){if(this.listeners.includes(listener))return;this.listeners.push(listener)}removeListener(listener){this.listeners.remove(listener)}executeStateChangedBefore(filter){this.listeners.forEach(listener=>{listener.onExecuteBeforeStateChange(filter)});this.doExecuteStateChangedBefore(filter)}doExecuteStateChangedBefore(filter){}executeStateChangedAfter(filter){this.listeners.forEach(listener=>{listener.onExecuteAfterStateChange(filter)});this.doExecuteStateChangedAfter(filter)}doExecuteStateChangedAfter(filter){}executeResetBefore(filter){this.listeners.forEach(listener=>{listener.onExecuteBeforeReset(filter)});this.doExecuteResetBefore(filter)}doExecuteResetBefore(filter){}executeResetAfter(filter){this.listeners.forEach(listener=>{listener.onExecuteBeforeReset(filter)});this.doExecuteResetAfter(filter)}doExecuteResetAfter(filter){}actOnFilter(filter){switch(this.data.thenMode){case"state":filter.changeState(this.data.thenTo);break;case"reset":filter.reset();break;default:throw new Error("not known then mode of:"+this.data.thenMode)}}attach(){let then=this.data.then(this.data.container);if(then==null||then.length===0||then[0]==null){Logger.err("then clause does not return any target");return}let q=this.data.container;let whenFilters=this.data.when(q);whenFilters.forEach(f=>{f.addRule(this)})}}class StateChangesRule extends Rule{constructor(data){super(data)}doExecuteStateChangedBefore(filter){let q=this.data.container;let then=this.data.then(q);let to=filter.getState();if(this.data.whenTo!=="*"&&to!==this.data.whenTo)return;if(then!=null&&then.length>0){this.data.req.muted(function(){then.forEach(filter=>{this.actOnFilter(filter)})}.bind(this))}}doExecuteStateChangedAfter(filter){}}class ResetRule extends Rule{constructor(data){super(data)}doExecuteResetBefore(filter){let q=this.data.container;let then=this.data.then(q);if(then!=null&&then.length>0){this.data.req.muted(function(){then.forEach(filter=>{this.actOnFilter(filter)})}.bind(this))}}doExecuteResetAfter(filter){}}class FilterContent{constructor(id,filterContainer,preCompiledScript,target){this.toString=()=>{let id=this.id?`(${this.id})`:"";let targetStr=this.target?this.target.tagName.toLowerCase():this.targetSelector?this.targetSelector:"";targetStr=targetStr?"->"+targetStr:"";return`[${id} '${this.content}'${targetStr} ${this.target==null?"OFF":"ON"}]`};this.id=id;this.filterContainer=filterContainer;if(S.isStr(target)&&!S.isNullOrEmpty(target)){this.targetSelector=target;this.target=document.querySelector(target)}else this.target=target;this.preCompiledScript=preCompiledScript;this.bindListeners()}getContent(){return this.preCompiledScript.content}bindListeners(){var tokens=this.preCompiledScript.analyze();tokens.forEach(token=>{let filter=this.filterContainer.getFilterByNameOrId(token.literal);if(filter!=null)filter.addContentListener(this)});this.update()}get text(){let text=this.preCompiledScript.interpret();return text}updateContent(text){this.preCompiledScript.updateContent(text)}activate(target){this.target=target;this.update();return target!=null}deactivate(){this.target=null}update(){if(this.target==null)return;this.target.textContent=this.text}}class PreCompiledScript{constructor(content,interpreter){this.interpreter=interpreter;this.content=content}parse(){if(this.expr==null){let scanner=new Scanner(this.content);let tokens=scanner.scanTokens();let parser=new Parser(tokens);this.expr=parser.parse()}}updateContent(content){this.content=content;this.expr=null;this.parse()}interpret(){this.parse();return this.interpreter.interpret(this.expr)}analyze(){this.parse();let filterVarExtractor=new FilterVariableExtractor;filterVarExtractor.analyze(this.expr);return filterVarExtractor.tokens}}class FilterType{constructor(encoderType,size=1,isArray=false){this.encoderType=encoderType;this.isArray=isArray;this.size=size}}var FilteringEqualityStrategyMode;(function(FilteringEqualityStrategyMode){FilteringEqualityStrategyMode[FilteringEqualityStrategyMode["FILTER_STATE"]=0]="FILTER_STATE";FilteringEqualityStrategyMode[FilteringEqualityStrategyMode["CONTAINER_FILTERNAME"]=1]="CONTAINER_FILTERNAME"})(FilteringEqualityStrategyMode||(FilteringEqualityStrategyMode={}));class FilteringEqualityStrategy{constructor(params){var _a,_b,_c;this._key=params===null||params===void 0?void 0:params.key;this.nonExistentPropertyResult=(_a=params===null||params===void 0?void 0:params.nonExistentPropertyResult)!==null&&_a!==void 0?_a:true;this.undefinedStateResult=(_b=params===null||params===void 0?void 0:params.undefinedStateResult)!==null&&_b!==void 0?_b:false;this.mode=(_c=params===null||params===void 0?void 0:params.mode)!==null&&_c!==void 0?_c:FilteringEqualityStrategyMode.FILTER_STATE}get key(){if(this._key)return this._key;switch(this.mode){case FilteringEqualityStrategyMode.FILTER_STATE:return this.filter.name;case FilteringEqualityStrategyMode.CONTAINER_FILTERNAME:return this.filter.container.name}}get value(){switch(this.mode){case FilteringEqualityStrategyMode.FILTER_STATE:return this.filter.getState();case FilteringEqualityStrategyMode.CONTAINER_FILTERNAME:return this.filter.name}}encode(value){return this.filter.encode(value)}satisfies(item){if(item[this.key]==undefined||item[this.key]==null){Logger.warn(`There is no property ${this.key} in ${item}`);return this.nonExistentPropertyResult}if(!this.value)return this.undefinedStateResult;if(this.mode==FilteringEqualityStrategyMode.CONTAINER_FILTERNAME&&(this.filter.isReset()||!this.filter.getState()))return false;return this.doSatisfies(item,this.value)}setFilter(filter){this.filter=filter}}class EqualsFilteringEqualityStrategy extends FilteringEqualityStrategy{get identifier(){return"equals"}doSatisfies(item,value){return item[this.key]==value}}class ContainsFilteringEqualityStrategy extends FilteringEqualityStrategy{get identifier(){return"contains"}doSatisfies(item,value){return item[this.key].includes(value)}}class BetweenFilteringEqualityStrategy extends FilteringEqualityStrategy{get identifier(){return"between"}doSatisfies(item,values){let min=values.min();let max=values.max();let itemValue=item[this.key];itemValue=this.encode(itemValue);return min<=itemValue&&itemValue<=max}}class GreaterThanFilteringEqualityStrategy extends FilteringEqualityStrategy{get identifier(){return"greaterthan"}doSatisfies(item,value){return item[this.key]>=value}}class LessThanFilteringEqualityStrategy extends FilteringEqualityStrategy{get identifier(){return"lessthan"}doSatisfies(item,value){return item[this.key]<=value}}class RadioFilterBond{constructor(filterContainer,requestService){this.filterContainer=filterContainer;this.requestService=requestService}actOnStateChanged(context){let filters=this.filterContainer.getFiltersByGroup(context.group).filter(x=>x!=context);if(filters.length==0)return;this.requestService.muted(()=>{filters.forEach(filter=>{filter.reset()})})}actOnReset(context){}}class MutedRequestAdaptorListener{constructor(listener,requestService){this.listener=listener;this.requestService=requestService}changeStateRequested(adaptor,state){this.requestService.muted(function(){this.listener.changeStateRequested(adaptor,state)}.bind(this))}changeIndexedStateRequested(adaptor,state,index){this.requestService.muted(function(){this.listener.changeIndexedStateRequested(adaptor,state,index)}.bind(this))}resetRequested(adaptor){this.requestService.muted(function(){this.listener.resetRequested(adaptor)}.bind(this))}}class FilterAdaptor{constructor(params,filter,targets){this.targetSelectors=[];this.targets=[];if(filter==null||!targets)throw new Error("cannot initialize adaptor. missing parameters..");this.listener=filter;for(let t of targets){if(S.isStr(t)){this.targetSelectors.push(t);this.targets.push(document.querySelector(t))}else{this.targets.push(t);let id=t.getAttribute("id");if(id)this.targetSelectors.push("#"+id)}}this.params=params;this.init();this.bind()}size(){return 1}encoderType(){return"text"}get target(){return this.targets[0]}get targetSelector(){return this.targetSelectors[0]}resolveTarget(element){if(element.hasAttribute("adaptor-target"))return{target:element};let adaptorTargets=element.querySelectorAll("adaptor-target");if(adaptorTargets.length>0){return{targets:adaptorTargets}}let targets=element.getTargets();if(targets&&targets.length>1){return{targets:targets}}if(targets.length==1)return{target:targets[0]}}init(){}dispose(){}}class ResetAdaptor extends FilterAdaptor{constructor(){super(...arguments);this.toString=()=>{return`[(RESET|${this.constructor.name}) -> (${this.targetSelector})]`}}sync(value,defaultValue){}}class StateAdaptor extends FilterAdaptor{constructor(){super(...arguments);this.toString=()=>{return`[(STATE|${this.constructor.name}) -> (${this.targetSelector})]`}}}class DefaultAdaptor extends StateAdaptor{get identifier(){return"default"}size(){if(!this.targets)return null;return this.targets.length}sync(values,defaultValue){let index=0;if(Array.isArray(values)){values.forEach(value=>{let target=this.targets[index];if(target.type&&(target.type==="checkbox"||target.type==="radio")){target.checked=values[index]}else if(value instanceof Date){target.value=`${value.getFullYear()}-${("0"+(value.getMonth()+1)).slice(-2)}-${value.getDate()}`}else{target.value=value}index++})}else{if(this.target.type&&(this.target.type==="checkbox"||this.target.type==="radio")){this.target.checked=values}else if(values instanceof Date){this.target.value=`${values.getFullYear()}-${("0"+(values.getMonth()+1)).slice(-2)}-${values.getDate()}`}else{this.target.value=values}}}bind(){this.targets.forEach(target=>{target.addEventListener("change",this.onChange.bind(this))})}onChange(event){let index=this.targets.indexOf(event.currentTarget);if(event.currentTarget.type&&(event.currentTarget.type==="checkbox"||event.currentTarget.type==="radio")){if(event.currentTarget.checked){this.listener.changeIndexedStateRequested(this,true,index)}else{this.listener.changeIndexedStateRequested(this,false,index)}}else{let value=event.currentTarget.value;this.listener.changeIndexedStateRequested(this,value,index)}}dispose(){this.targets.forEach(target=>{target.removeEventListener("change",this.onChange)})}}class ButtonsAdaptor extends StateAdaptor{get identifier(){return"buttons"}sync(value,defaultValue){const self=this;if(value===defaultValue){this.targets.forEach(target=>{self.inactive(target)})}else{this.targets.forEach(target=>{let v=target.getAttribute("value");if(v===value){self.active(target)}})}}bind(){this.targets.forEach(t=>{t.addEventListener("click",function(event){let value=event.currentTarget.getAttribute("value");this.listener.changeStateRequested(this,value);this.active(event.currentTarget)}.bind(this))})}active(el){this.targets.forEach(target=>{target.classList.remove("active")});el.classList.add("active")}inactive(el){el.classList.remove("active")}}class ButtonResetAdaptor extends ResetAdaptor{get identifier(){return"default-reset"}size(){return 1}bindWithTarget(target){target.addEventListener("click",event=>{this.listener.resetRequested(this)})}bind(){$(document).on("click",this.targetSelector,function(){this.listener.resetRequested(self)}.bind(this))}}class Encoder{encode(value){if(Array.isArray(value)){let arr=[];for(let i=0;ix.value===value);if(!rule)return data;let order=SortingOrder[rule.order];let key=rule.key;return order===SortingOrder.asc?data.orderBy(x=>x[key]):data.orderByDesc(x=>x[key])}}class Sensitivity{get identifier(){return"default"}constructor(){}updateOrigin(value,index){}isGreater(value,index){return true}}class NumberSensitivity extends Sensitivity{constructor(params){var _a;super();this.diff=(_a=params===null||params===void 0?void 0:params.diff)!==null&&_a!==void 0?_a:5;this.origin=new Map}get identifier(){return"number"}encoderType(){return"number"}updateOrigin(value,index){if(!index&&Array.isArray(value)){this.origin.clear();for(let i=0;id}}class Serializer{constructor(params){var _a;if(!params.empty)this.emptyValueStrategy="default";else this.emptyValueStrategy=params.empty;this._filterName=params.name;this.sticky=(_a=params.sticky)!==null&&_a!==void 0?_a:false}setFilter(filter){this.filter=filter}get filterName(){if(S.isNullOrEmpty(this._filterName))return this.filter.name;return this._filterName}get realFilterName(){return this.filter.name}get containerName(){return this.filter.container.name}getState(index=null){let state=this.filter.decode(this.filter.getState(index));if(state!=null&&state!=undefined)return state;if(this.emptyValueStrategy==="default")return this.filter.decode(this.filter.getDefaultState(index));else if(this.emptyValueStrategy=="nothing")return null}}class FilterNameWithState extends Serializer{constructor(params){var _a;super(params);this.infix=(_a=params.infix)!==null&&_a!==void 0?_a:"-"}get identifier(){return"filter-state"}identify(key,value){return key===this.filterName}serialize(builder){let state=this.getState();if(Array.isArray(state)){for(let i=0;i{let count=0;for(let i=0;i{if(containers.firstOrDefault(x=>x.id===filter.container.id)==null)containers.push(filter.container)});return containers}filter(data,filters){if(!data||data.length===0)return[];if(!this.withfilterRolesOnly){let containers=this.extractContainers(filters);containers.forEach(container=>{data=container.filter(data)})}let sortFilter=filters.filter(x=>x.hasRole()&&x.role instanceof SortingRole)[0];if(sortFilter)data=sortFilter.applyRole(data);let pagingFilter=this.filterContainer.getFilters().filter(x=>x.hasRole()&&x.role instanceof PageRole)[0];if(pagingFilter)data=pagingFilter.applyRole(data);return data}}class NoneDataFilterer extends DataFilterer{constructor(){super(null)}filter(data,filters){return data}}class DataSource{addListener(listener){this.listener=listener}add(data){}clear(){}filter(data,filters){return data}}class ClientDataSource extends DataSource{constructor(params){super();this.toString=()=>{if(!this.db)return"[ClientDataSource] ([])";return`[ClientDataSource] (${this.db.length})`};this.db=params.data==null?[]:params.data;this.filterer=params.filterer}onDataReceived(data){this.db=data;Logger.info("~ data refreshed",this);if(this.listener){this.listener.onDataReceived(data)}}add(data){this.db.push(data)}clear(){this.db=[]}get(url,onSuccess,onError,onComplete){Logger.info("~ get",this);setTimeout(function(){Logger.ok("~ OK",this);onSuccess(this.db);onComplete()}.bind(this),50)}filter(data,filters){Logger.info("~ filtering",this);return this.filterer.filter(data,filters)}}class HttpDataSource extends DataSource{constructor(params){super();this.toString=()=>{return`[HttpDataSource] (${this.baseUrl})`};this.baseUrl=params.baseUrl}get(url,onSuccess,onError,onComplete){let reqUrl=[this.baseUrl,url].join("?");Logger.info("~ request url:"+reqUrl,this);const self=this;$.ajax({type:"GET",url:reqUrl,headers:{"Access-Control-Allow-Origin":"*","Content-Type":"application/json"},dataType:"json",data:"",beforeSend:function(data){},complete:function(data,arg){if(onComplete)onComplete()},success:function(data){if(self.listener){self.listener.onDataReceived(data)}onSuccess(data)},error:function(err){if(onError)onError(err)}})}}var DependencyType;(function(DependencyType){DependencyType[DependencyType["FilterType"]=0]="FilterType";DependencyType[DependencyType["Encoder"]=1]="Encoder";DependencyType[DependencyType["Serializer"]=2]="Serializer";DependencyType[DependencyType["Adaptor"]=3]="Adaptor";DependencyType[DependencyType["Sensitivity"]=4]="Sensitivity";DependencyType[DependencyType["FilteringEqualityStrategy"]=5]="FilteringEqualityStrategy";DependencyType[DependencyType["DataSource"]=6]="DataSource";DependencyType[DependencyType["Pipe"]=7]="Pipe"})(DependencyType||(DependencyType={}));class Factory{}class ServiceDefinition{}class DependencyResolver{constructor(){this.toString=()=>{return`[DependencyResolver]`};this.filterTyperesolver=new FilterTypeResolver(this);this.serviceDefinitions=new Array;this.factories=[new AdaptorFactory];this.init()}init(){this.serviceDefinitions.push({serviceType:DependencyType.Adaptor,identifier:"default",prototype:DefaultAdaptor.prototype,buildin:true,default:true});this.serviceDefinitions.push({serviceType:DependencyType.Adaptor,identifier:"default-reset",prototype:ButtonResetAdaptor.prototype,buildin:true,default:false});this.serviceDefinitions.push({serviceType:DependencyType.Adaptor,identifier:"buttons",prototype:ButtonsAdaptor.prototype,buildin:true,default:false});this.serviceDefinitions.push({serviceType:DependencyType.FilteringEqualityStrategy,identifier:"equals",prototype:EqualsFilteringEqualityStrategy.prototype,buildin:true,default:true});this.serviceDefinitions.push({serviceType:DependencyType.FilteringEqualityStrategy,identifier:"contains",prototype:ContainsFilteringEqualityStrategy.prototype,buildin:true,default:false});this.serviceDefinitions.push({serviceType:DependencyType.FilteringEqualityStrategy,identifier:"between",prototype:BetweenFilteringEqualityStrategy.prototype,buildin:true,default:false});this.serviceDefinitions.push({serviceType:DependencyType.FilteringEqualityStrategy,identifier:"greaterthan",prototype:GreaterThanFilteringEqualityStrategy.prototype,buildin:true,default:false});this.serviceDefinitions.push({serviceType:DependencyType.FilteringEqualityStrategy,identifier:"lessthan",prototype:LessThanFilteringEqualityStrategy.prototype,buildin:true,default:false});this.serviceDefinitions.push({serviceType:DependencyType.Encoder,identifier:"text",prototype:StringEncoder.prototype,buildin:true,default:true});this.serviceDefinitions.push({serviceType:DependencyType.Encoder,identifier:"boolean",prototype:BooleanEncoder.prototype,buildin:true,default:false});this.serviceDefinitions.push({serviceType:DependencyType.Encoder,identifier:"number",prototype:NumberEncoder.prototype,buildin:true,default:false});this.serviceDefinitions.push({serviceType:DependencyType.Encoder,identifier:"datetime",prototype:DatetimeEncoder.prototype,buildin:true,default:false});this.serviceDefinitions.push({serviceType:DependencyType.Serializer,identifier:"filter-state",prototype:FilterNameWithState.prototype,buildin:true,default:true});this.serviceDefinitions.push({serviceType:DependencyType.Serializer,identifier:"container-filter",prototype:ContainerNameWithFilterName.prototype,buildin:true,default:false});this.serviceDefinitions.push({serviceType:DependencyType.Serializer,identifier:"split",prototype:SplitFilterNameWithState.prototype,buildin:true,default:false});this.serviceDefinitions.push({serviceType:DependencyType.Sensitivity,identifier:"default",prototype:Sensitivity.prototype,buildin:true,default:true});this.serviceDefinitions.push({serviceType:DependencyType.Sensitivity,identifier:"number",prototype:NumberSensitivity.prototype,buildin:true,default:false});this.serviceDefinitions.push({serviceType:DependencyType.DataSource,identifier:"client",prototype:ClientDataSource.prototype,buildin:true,default:false});this.serviceDefinitions.push({serviceType:DependencyType.DataSource,identifier:"http",prototype:HttpDataSource.prototype,buildin:true,default:false});this.serviceDefinitions.push({serviceType:DependencyType.Pipe,identifier:"upper",prototype:UpperPipe.prototype,buildin:true,default:false});this.serviceDefinitions.push({serviceType:DependencyType.Pipe,identifier:"UPPER",prototype:UPPERPipe.prototype,buildin:true,default:false});this.serviceDefinitions.push({serviceType:DependencyType.Pipe,identifier:"dt_to_str",prototype:DateFormatterPipe.prototype,buildin:true,default:false})}register(service){let serviceType=null;if(service.prototype instanceof StateAdaptor)serviceType=DependencyType.Adaptor;else if(service.prototype instanceof Serializer)serviceType=DependencyType.Serializer;else if(service.prototype instanceof Sensitivity)serviceType=DependencyType.Sensitivity;else if(service.prototype instanceof DataSource)serviceType=DependencyType.DataSource;else if(service.prototype instanceof ContentPipe){serviceType=DependencyType.Pipe}else throw new Error("unsupported service type: "+service);let identifier=service.prototype.identifier();this.serviceDefinitions.push({identifier:service.prototype.identifier(),prototype:service.prototype,serviceType:serviceType,buildin:false,default:false});Logger.info("~ "+serviceType+": "+identifier+" registered.",this)}unregister(type,key){let entry=this.serviceDefinitions.firstOrDefault(x=>x.serviceType==type&&x.identifier==key);if(entry){this.serviceDefinitions.remove(entry);Logger.info(`~ plugin ${type} ${key} removed.`,this)}}clear(){Logger.info("~ removing all no build in plugins",this);this.serviceDefinitions.removeAll(x=>!x.buildin);Logger.ok("~ plugins removed.",this)}resolve(type,params=null){switch(type){case DependencyType.FilterType:return this.filterTyperesolver.resolve(params);default:let specs=this.getSpecs(type);if(!specs||specs.length===0)throw new Error("There are no services of type: "+type);return this.instantiateSpec(specs[0],params)}}resolveKeyed(type,key,params=null){if(!key)return this.resolve(type,params);let spec=this.getSpec(type,key);if(!spec){Logger.err(`~ Service ${type} with identifier:${key} does not exist.`,this);return null}return this.instantiateSpec(spec,params)}instantiateSpec(spec,params){let factory=this.factories.firstOrDefault(x=>x.dependencyType==spec.serviceType);let service=null;if(factory)service=factory.create(spec,params);else service=new spec.prototype.constructor(params);return service}getSpec(type,identifier=null){let spec=this.serviceDefinitions.firstOrDefault(x=>x.serviceType==type&&x.identifier===identifier);if(!spec&&identifier!=null&&identifier!="default")throw new Error(`service:${identifier} is not registered.`);if(!spec)return this.serviceDefinitions.firstOrDefault(x=>x.serviceType==type&&x.identifier==="default");return spec}getSpecs(type){return this.serviceDefinitions.filter(x=>x.serviceType==type)}}class FilterTypeOverrider{constructor(targetType){this.targetType=targetType}from(fromType){var _a,_b,_c;if(this.targetType==null&&fromType==null)return null;if(fromType==null)return this.targetType;if(this.targetType==null)this.targetType=new FilterType("text");this.targetType.encoderType=(_a=fromType.encoderType)!==null&&_a!==void 0?_a:this.targetType.encoderType;this.targetType.isArray=(_b=fromType.isArray)!==null&&_b!==void 0?_b:this.targetType.isArray;this.targetType.size=(_c=fromType.size)!==null&&_c!==void 0?_c:this.targetType.size;return this.targetType}}class AdaptorFactory extends Factory{get dependencyType(){return DependencyType.Adaptor}create(spec,params){if(params.req===false){params.listener=new MutedRequestAdaptorListener(params.listener,params.requestService)}let adaptor=new spec.prototype.constructor(params.params,params.listener,params.targets);return adaptor}}class FilterTypeResolver{constructor(dependencyResolver){this.dependencyResolver=dependencyResolver}resolveFromTypeItself(conf){var _a,_b,_c,_d,_e,_f,_g,_h,_j;if(!conf)return null;if(conf.type instanceof FilterType)return conf.type;else if(((_a=conf.type)===null||_a===void 0?void 0:_a.encoderType)||((_b=conf.type)===null||_b===void 0?void 0:_b.isArray)&&((_c=conf.type)===null||_c===void 0?void 0:_c.size))return new FilterType((_e=(_d=conf.type)===null||_d===void 0?void 0:_d.encoderType)!==null&&_e!==void 0?_e:"text",(_g=(_f=conf.type)===null||_f===void 0?void 0:_f.size)!==null&&_g!==void 0?_g:1,(_j=(_h=conf.type)===null||_h===void 0?void 0:_h.isArray)!==null&&_j!==void 0?_j:false);let isArray=false;let encoderType="text";if(conf.type){if(conf.type.includes("-")){encoderType=conf.type.split("-")[1].trim();isArray=conf.type.split("-")[0].trim()==="array"}else encoderType=conf.type.trim()}return new FilterType(encoderType,1,isArray)}resolveFromStateWithoutExplicitAdaptor(state){if(!state||state.length<=0||state[0].adaptor)return null;let el=state[0].targets&&state[0].targets.length>1?state[0].targets[0]:state[0].target;let target=document.querySelector(el);let encoderType=target.getTargetType();let size=null;let isArray=state[0].targets&&state[0].targets.length>1;if(isArray)size=state[0].targets.length;return new FilterType(encoderType,size,isArray)}resolveFromStateWithAdaptor(state){if(!state||state.length<=0||!state[0].adaptor)return null;return this.extractFilterTypeFromAdaptorType(state[0].adaptor)}override(type){return new FilterTypeOverrider(type)}resolveFromElementWithAdaptor(el){let adaptor=el.getAttribute("filter-adaptor");if(!adaptor)return null;if(adaptor.isJson())adaptor=JSON.parse(adaptor).type;return this.extractFilterTypeFromAdaptorType(adaptor)}extractFilterTypeFromAdaptorType(adaptorType){var _a;let adaptorSpec=this.dependencyResolver.getSpec(DependencyType.Adaptor,adaptorType);if(!adaptorSpec){Logger.err("~ adaptor "+adaptorType+" is not found.",this);return null}if(adaptorSpec.prototype.size()==null||adaptorSpec.prototype.encoderType()==null)return null;let isArray=adaptorSpec.prototype.size()>1;let size=(_a=adaptorSpec.prototype.size())!==null&&_a!==void 0?_a:1;let encoderType=adaptorSpec.prototype.encoderType();return new FilterType(encoderType,size,isArray)}resolve(filterConf){if(filterConf instanceof Element){let type=filterConf.getFType();type=this.override(type).from(this.resolveFromElementWithAdaptor(filterConf));return type}else{let type=this.resolveFromTypeItself(filterConf);type=this.override(type).from(this.resolveFromStateWithoutExplicitAdaptor(filterConf.state));type=this.override(type).from(this.resolveFromStateWithAdaptor(filterConf.state));return type}}}class HttpClient{constructor(db,filterContainer){this.db=db;this.filterContainer=filterContainer}setRequestService(requestService){this.requestService=requestService}get(url,onSuccess,onError){const data=this.filter(this.requestService.filters);setTimeout(()=>{if(onSuccess!=null)onSuccess(data)},500)}extractContainers(filters){let containers=[];filters.forEach(filter=>{if(containers.firstOrDefault(x=>x.id===filter.container.id)==null)containers.push(filter.container)});return containers}filter(filters){if(!this.db||this.db.length===0)return[];let containers=this.extractContainers(filters);let data=this.db;containers.forEach(container=>{data=container.filter(data)});let sortFilter=filters.filter(x=>x.hasRole()&&x.role instanceof SortingRole)[0];if(sortFilter)data=sortFilter.applyRole(data);let pagingFilter=this.filterContainer.getFilters().filter(x=>x.hasRole()&&x.role instanceof PageRole)[0];if(pagingFilter)data=pagingFilter.applyRole(data);return data}}class IdentityService{constructor(){this.namingService=new NamingService}generateId(){if(!this.lastId)this.lastId=0;return this.lastId++}generateName(){if(this.getRandomInt(2)===0)return this.namingService.nextMale();return this.namingService.nextFemale()}getRandomInt(max){return Math.floor(Math.random()*max)}}class NamingService{constructor(){this.females=["Emma","Isabella","Emily","Madison","Ava","Olivia","Sophia","Abigail","Elizabeth","Chloe","Samantha","Addison","Natalie","Mia","Alexis","Alyssa","Hannah","Ashley","Ella","Sarah","Grace","Taylor","Brianna","Lily","Hailey","Anna","Victoria","Kayla","Lillian","Lauren","Kaylee","Allison","Savannah","Nevaeh","Gabriella","Sofia","Makayla","Avery","Riley","Julia","Leah","Aubrey","Jasmine","Audrey","Katherine","Morgan","Brooklyn","Destiny","Sydney","Alexa","Kylie","Brooke","Kaitlyn","Evelyn","Layla","Madeline","Kimberly","Zoe","Jessica","Peyton","Alexandra","Claire","Madelyn","Maria","Mackenzie","Arianna","Jocelyn","Amelia","Angelina","Trinity","Andrea","Maya","Valeria","Sophie","Rachel","Vanessa","Aaliyah","Mariah","Gabrielle","Katelyn","Ariana","Bailey","Camila","Jennifer","Melanie","Gianna","Charlotte","Paige","Autumn","Payton","Faith","Sara","Isabelle","Caroline","Genesis","Isabel","Mary","Zoey","Gracie","Megan","Haley","Mya","Michelle","Molly","Stephanie","Nicole","Jenna","Natalia","Sadie","Jada","Serenity","Lucy","Ruby","Eva","Kennedy","Rylee","Jayla","Naomi","Rebecca","Lydia","Daniela","Bella","Keira","Adriana","Lilly","Hayden","Miley","Katie","Jade","Jordan","Gabriela","Amy","Angela","Melissa","Valerie","Giselle","Diana","Amanda","Kate","Laila","Reagan","Jordyn","Kylee","Danielle","Briana","Marley","Leslie","Kendall","Catherine","Liliana","Mckenzie","Jacqueline","Ashlyn","Reese","Marissa","London","Juliana","Shelby","Cheyenne","Angel","Daisy","Makenzie","Miranda","Erin","Amber","Alana","Ellie","Breanna","Ana","Mikayla","Summer","Piper","Adrianna","Jillian","Sierra","Jayden","Sienna","Alicia","Lila","Margaret","Alivia","Brooklynn","Karen","Violet","Sabrina","Stella","Aniyah","Annabelle","Alexandria","Kathryn","Skylar","Aliyah","Delilah","Julianna","Kelsey","Khloe","Carly","Amaya","Mariana","Christina","Alondra","Tessa","Eliana","Bianca","Jazmin","Clara","Vivian","Josephine","Delaney","Scarlett","Elena","Cadence","Alexia","Maggie","Laura","Nora","Ariel","Elise","Nadia","Mckenna","Chelsea","Lyla","Alaina","Jasmin","Hope","Leila","Caitlyn","Cassidy","Makenna","Allie","Izabella","Eden","Callie","Haylee","Caitlin","Kendra","Karina","Kyra","Kayleigh","Addyson","Kiara","Jazmine","Karla","Camryn","Alina","Lola","Kyla","Kelly","Fatima","Tiffany","Kira","Crystal","Mallory","Esmeralda","Alejandra","Eleanor","Angelica","Jayda","Abby","Kara","Veronica","Carmen","Jamie","Ryleigh","Valentina","Allyson","Dakota","Kamryn","Courtney","Cecilia","Madeleine","Aniya","Alison","Esther","Heaven","Aubree","Lindsey","Leilani","Nina","Melody","Macy","Ashlynn","Joanna","Cassandra","Alayna","Kaydence","Madilyn","Aurora","Heidi","Emerson","Kimora","Madalyn","Erica","Josie","Katelynn","Guadalupe","Harper","Ivy","Lexi","Camille","Savanna","Dulce","Daniella","Lucia","Emely","Joselyn","Kiley","Kailey","Miriam","Cynthia","Rihanna","Georgia","Rylie","Harmony","Kiera","Kyleigh","Monica","Bethany","Kaylie","Cameron","Teagan","Cora","Brynn","Ciara","Genevieve","Alice","Maddison","Eliza","Tatiana","Jaelyn","Erika","Ximena","April","Marely","Julie","Danica","Presley","Brielle","Julissa","Angie","Iris","Brenda","Hazel","Rose","Malia","Shayla","Fiona","Phoebe","Nayeli","Paola","Kaelyn","Selena","Audrina","Rebekah","Carolina","Janiyah","Michaela","Penelope","Janiya","Anastasia","Adeline","Ruth","Sasha","Denise","Holly","Madisyn","Hanna","Tatum","Marlee","Nataly","Helen","Janelle","Lizbeth","Serena","Anya","Jaslene","Kaylin","Jazlyn","Nancy","Lindsay","Desiree","Hayley","Itzel","Imani","Madelynn","Asia","Kadence","Madyson","Talia","Jane","Kayden","Annie","Amari","Bridget","Raegan","Jadyn","Celeste","Jimena","Luna","Yasmin","Emilia","Annika","Estrella","Sarai","Lacey","Ayla","Alessandra","Willow","Nyla","Dayana","Lilah","Lilliana","Natasha","Hadley","Harley","Priscilla","Claudia","Allisson","Baylee","Brenna","Brittany","Skyler","Fernanda","Danna","Melany","Cali","Lia","Macie","Lyric","Logan","Gloria","Lana","Mylee","Cindy","Lilian","Amira","Anahi","Alissa","Anaya","Lena","Ainsley","Sandra","Noelle","Marisol","Meredith","Kailyn","Lesly","Johanna","Diamond","Evangeline","Juliet","Kathleen","Meghan","Paisley","Athena","Hailee","Rosa","Wendy","Emilee","Sage","Alanna","Elaina","Cara","Nia","Paris","Casey","Dana","Emery","Rowan","Aubrie","Kaitlin","Jaden","Kenzie","Kiana","Viviana","Norah","Lauryn","Perla","Amiyah","Alyson","Rachael","Shannon","Aileen","Miracle","Lillie","Danika","Heather","Kassidy","Taryn","Tori","Francesca","Kristen","Amya","Elle","Kristina","Cheyanne","Haylie","Patricia","Anne","Samara","Skye","Kali","America","Lexie","Parker","Halle","Londyn","Abbigail","Linda","Hallie","Saniya","Bryanna","Bailee","Jaylynn","Mckayla","Quinn","Jaelynn","Jaida","Caylee","Jaiden","Melina","Abril","Sidney","Kassandra","Elisabeth","Adalyn","Kaylynn","Mercedes","Yesenia","Elliana","Brylee","Dylan","Isabela","Ryan","Ashlee","Daphne","Kenya","Marina","Christine","Mikaela","Kaitlynn","Justice","Saniyah","Jaliyah","Ingrid","Marie","Natalee","Joy","Juliette","Simone","Adelaide","Krystal","Kennedi","Mila","Tamia","Addisyn","Aylin","Dayanara","Sylvia","Clarissa","Maritza","Virginia","Braelyn","Jolie","Jaidyn","Kinsley","Kirsten","Laney","Marilyn","Whitney","Janessa","Raquel","Anika","Kamila","Aria","Rubi","Adelyn","Amara","Ayanna","Teresa","Zariah","Kaleigh","Amani","Carla","Yareli","Gwendolyn","Paulina","Nathalie","Annabella","Jaylin","Tabitha","Deanna","Madalynn","Journey","Aiyana","Skyla","Yaretzi","Ada","Liana","Karlee","Jenny","Myla","Cristina","Myah","Lisa","Tania","Isis","Jayleen","Jordin","Arely","Azul","Helena","Aryanna","Jaqueline","Lucille","Destinee","Martha","Zoie","Arielle","Liberty","Marlene","Elisa","Isla","Noemi","Raven","Jessie","Aleah","Kailee","Kaliyah","Lilyana","Haven","Tara","Giana","Camilla","Maliyah","Irene","Carley","Maeve","Lea","Macey","Sharon","Alisha","Marisa","Jaylene","Kaya","Scarlet","Siena","Adyson","Maia","Shiloh","Tiana","Jaycee","Gisselle","Yazmin","Eve","Shyanne","Arabella","Sherlyn","Sariah","Amiya","Kiersten","Madilynn","Shania","Aleena","Finley","Kinley","Kaia","Aliya","Taliyah","Pamela","Yoselin","Ellen","Carlie","Monserrat","Jakayla","Reyna","Yaritza","Carolyn","Clare","Lorelei","Paula","Zaria","Gracelyn","Kasey","Regan","Alena","Angelique","Regina","Britney","Emilie","Mariam","Jaylee","Julianne","Greta","Elyse","Lainey","Kallie","Felicity","Zion","Aspen","Carlee","Annalise","Iliana","Larissa","Akira","Sonia","Catalina","Phoenix","Joslyn","Anabelle","Mollie","Susan","Judith","Destiney","Hillary","Janet","Katrina","Mareli","Ansley","Kaylyn","Alexus","Gia","Maci","Elsa","Stacy","Kaylen","Carissa","Haleigh","Lorena","Jazlynn","Milagros","Luz","Leanna","Renee","Shaniya","Charlie","Abbie","Cailyn","Cherish","Elsie","Jazmyn","Elaine","Emmalee","Luciana","Dahlia","Jamya","Belinda","Mariyah","Chaya","Dayami","Rhianna","Yadira","Aryana","Rosemary","Armani","Cecelia","Celia","Barbara","Cristal","Eileen","Rayna","Campbell","Amina","Aisha","Amirah","Ally","Araceli","Averie","Mayra","Sanaa","Patience","Leyla","Selah","Zara","Chanel","Kaiya","Keyla","Miah","Aimee","Giovanna","Amelie","Kelsie","Alisson","Angeline","Dominique","Adrienne","Brisa","Cierra","Paloma","Isabell","Precious","Alma","Charity","Jacquelyn","Janae","Frances","Shyla","Janiah","Kierra","Karlie","Annabel","Jacey","Karissa","Jaylah","Xiomara","Edith","Marianna","Damaris","Deborah","Jaylyn","Evelin","Mara","Olive","Ayana","India","Kendal","Kayley","Tamara","Briley","Charlee","Nylah","Abbey","Moriah","Saige","Savanah","Giada","Hana","Lizeth","Matilda","Ann","Jazlene","Gillian","Beatrice","Ireland","Karly","Mylie","Yasmine","Ashly","Kenna","Maleah","Corinne","Keely","Tanya","Tianna","Adalynn","Ryann","Salma","Areli","Karma","Shyann","Kaley","Theresa","Evie","Gina","Roselyn","Kaila","Jaylen","Natalya","Meadow","Rayne","Aliza","Yuliana","June","Lilianna","Nathaly","Ali","Alisa","Aracely","Belen","Tess","Jocelynn","Litzy","Makena","Abagail","Giuliana","Joyce","Libby","Lillianna","Thalia","Tia","Sarahi","Zaniyah","Kristin","Lorelai","Mattie","Taniya","Jaslyn","Gemma","Valery","Lailah","Mckinley","Micah","Deja","Frida","Brynlee","Jewel","Krista","Mira","Yamilet","Adison","Carina","Karli","Magdalena","Stephany","Charlize","Raelynn","Aliana","Cassie","Mina","Karley","Shirley","Marlie","Alani","Taniyah","Cloe","Sanai","Lina","Nola","Anabella","Dalia","Raina","Mariela","Ariella","Bria","Kamari","Monique","Ashleigh","Reina","Alia","Ashanti","Lara","Lilia","Justine","Leia","Maribel","Abigayle","Tiara","Alannah","Princess","Sydnee","Kamora","Paityn","Payten","Naima","Gretchen","Heidy","Nyasia","Livia","Marin","Shaylee","Maryjane","Laci","Nathalia","Azaria","Anabel","Chasity","Emmy","Izabelle","Denisse","Emelia","Mireya","Shea","Amiah","Dixie","Maren","Averi","Esperanza","Micaela","Selina","Alyvia","Chana","Avah","Donna","Kaylah","Ashtyn","Karsyn","Makaila","Shayna","Essence","Leticia","Miya","Rory","Desirae","Kianna","Laurel","Neveah","Amaris","Hadassah","Dania","Hailie","Jamiya","Kathy","Laylah","Riya","Diya","Carleigh","Iyana","Kenley","Sloane","Elianna"];this.males=["Jacob","Michael","Ethan","Joshua","Daniel","Alexander","Anthony","William","Christopher","Matthew","Jayden","Andrew","Joseph","David","Noah","Aiden","James","Ryan","Logan","John","Nathan","Elijah","Christian","Gabriel","Benjamin","Jonathan","Tyler","Samuel","Nicholas","Gavin","Dylan","Jackson","Brandon","Caleb","Mason","Angel","Isaac","Evan","Jack","Kevin","Jose","Isaiah","Luke","Landon","Justin","Lucas","Zachary","Jordan","Robert","Aaron","Brayden","Thomas","Cameron","Hunter","Austin","Adrian","Connor","Owen","Aidan","Jason","Julian","Wyatt","Charles","Luis","Carter","Juan","Chase","Diego","Jeremiah","Brody","Xavier","Adam","Carlos","Sebastian","Liam","Hayden","Nathaniel","Henry","Jesus","Ian","Tristan","Bryan","Sean","Cole","Alex","Eric","Brian","Jaden","Carson","Blake","Ayden","Cooper","Dominic","Brady","Caden","Josiah","Kyle","Colton","Kaden","Eli","Miguel","Antonio","Parker","Steven","Alejandro","Riley","Richard","Timothy","Devin","Jesse","Victor","Jake","Joel","Colin","Kaleb","Bryce","Levi","Oliver","Oscar","Vincent","Ashton","Cody","Micah","Preston","Marcus","Max","Patrick","Seth","Jeremy","Peyton","Nolan","Ivan","Damian","Maxwell","Alan","Kenneth","Jonah","Jorge","Mark","Giovanni","Eduardo","Grant","Collin","Gage","Omar","Emmanuel","Trevor","Edward","Ricardo","Cristian","Nicolas","Kayden","George","Jaxon","Paul","Braden","Elias","Andres","Derek","Garrett","Tanner","Malachi","Conner","Fernando","Cesar","Javier","Miles","Jaiden","Alexis","Leonardo","Santiago","Francisco","Cayden","Shane","Edwin","Hudson","Travis","Bryson","Erick","Jace","Hector","Josue","Peter","Jaylen","Mario","Manuel","Abraham","Grayson","Damien","Kaiden","Spencer","Stephen","Edgar","Wesley","Shawn","Trenton","Jared","Jeffrey","Landen","Johnathan","Bradley","Braxton","Ryder","Camden","Roman","Asher","Brendan","Maddox","Sergio","Israel","Andy","Lincoln","Erik","Donovan","Raymond","Avery","Rylan","Dalton","Harrison","Andre","Martin","Keegan","Marco","Jude","Sawyer","Dakota","Leo","Calvin","Kai","Drake","Troy","Zion","Clayton","Roberto","Zane","Gregory","Tucker","Rafael","Kingston","Dominick","Ezekiel","Griffin","Devon","Drew","Lukas","Johnny","Ty","Pedro","Tyson","Caiden","Mateo","Braylon","Cash","Aden","Chance","Taylor","Marcos","Maximus","Ruben","Emanuel","Simon","Corbin","Brennan","Dillon","Skyler","Myles","Xander","Jaxson","Dawson","Kameron","Kyler","Axel","Colby","Jonas","Joaquin","Payton","Brock","Frank","Enrique","Quinn","Emilio","Malik","Grady","Angelo","Julio","Derrick","Raul","Fabian","Corey","Gerardo","Dante","Ezra","Armando","Allen","Theodore","Gael","Amir","Zander","Adan","Maximilian","Randy","Easton","Dustin","Luca","Phillip","Julius","Charlie","Ronald","Jakob","Cade","Brett","Trent","Silas","Keith","Emiliano","Trey","Jalen","Darius","Lane","Jerry","Jaime","Scott","Graham","Weston","Braydon","Anderson","Rodrigo","Pablo","Saul","Danny","Donald","Elliot","Brayan","Dallas","Lorenzo","Casey","Mitchell","Alberto","Tristen","Rowan","Jayson","Gustavo","Aaden","Amari","Dean","Braeden","Declan","Chris","Ismael","Dane","Louis","Arturo","Brenden","Felix","Jimmy","Cohen","Tony","Holden","Reid","Abel","Bennett","Zackary","Arthur","Nehemiah","Ricky","Esteban","Cruz","Finn","Mauricio","Dennis","Keaton","Albert","Marvin","Mathew","Larry","Moises","Issac","Philip","Quentin","Curtis","Greyson","Jameson","Everett","Jayce","Darren","Elliott","Uriel","Alfredo","Hugo","Alec","Jamari","Marshall","Walter","Judah","Jay","Lance","Beau","Ali","Landyn","Yahir","Phoenix","Nickolas","Kobe","Bryant","Maurice","Russell","Leland","Colten","Reed","Davis","Joe","Ernesto","Desmond","Kade","Reece","Morgan","Ramon","Rocco","Orlando","Ryker","Brodie","Paxton","Jacoby","Douglas","Kristopher","Gary","Lawrence","Izaiah","Solomon","Nikolas","Mekhi","Justice","Tate","Jaydon","Salvador","Shaun","Alvin","Eddie","Kane","Davion","Zachariah","Dorian","Titus","Kellen","Camron","Isiah","Javon","Nasir","Milo","Johan","Byron","Jasper","Jonathon","Chad","Marc","Kelvin","Chandler","Sam","Cory","Deandre","River","Reese","Roger","Quinton","Talon","Romeo","Franklin","Noel","Alijah","Guillermo","Gunner","Damon","Jadon","Emerson","Micheal","Bruce","Terry","Kolton","Melvin","Beckett","Porter","August","Brycen","Dayton","Jamarion","Leonel","Karson","Zayden","Keagan","Carl","Khalil","Cristopher","Nelson","Braiden","Moses","Isaias","Roy","Triston","Walker","Kale","Jermaine","Leon","Rodney","Kristian","Mohamed","Ronan","Pierce","Trace","Warren","Jeffery","Maverick","Cyrus","Quincy","Nathanael","Skylar","Tommy","Conor","Noe","Ezequiel","Demetrius","Jaylin","Kendrick","Frederick","Terrance","Bobby","Jamison","Jon","Rohan","Jett","Kieran","Tobias","Ari","Colt","Gideon","Felipe","Kenny","Wilson","Orion","Kamari","Gunnar","Jessie","Alonzo","Gianni","Omari","Waylon","Malcolm","Emmett","Abram","Julien","London","Tomas","Allan","Terrell","Matteo","Tristin","Jairo","Reginald","Brent","Ahmad","Yandel","Rene","Willie","Boston","Billy","Marlon","Trevon","Aydan","Jamal","Aldo","Ariel","Cason","Braylen","Javion","Joey","Rogelio","Ahmed","Dominik","Brendon","Toby","Kody","Marquis","Ulises","Armani","Adriel","Alfonso","Branden","Will","Craig","Ibrahim","Osvaldo","Wade","Harley","Steve","Davin","Deshawn","Kason","Damion","Jaylon","Jefferson","Aron","Brooks","Darian","Gerald","Rolando","Terrence","Enzo","Kian","Ryland","Barrett","Jaeden","Ben","Bradyn","Giovani","Blaine","Madden","Jerome","Muhammad","Ronnie","Layne","Kolby","Leonard","Vicente","Cale","Alessandro","Zachery","Gavyn","Aydin","Xzavier","Malakai","Raphael","Cannon","Rudy","Asa","Darrell","Giancarlo","Elisha","Junior","Zackery","Alvaro","Lewis","Valentin","Deacon","Jase","Harry","Kendall","Rashad","Finnegan","Mohammed","Ramiro","Cedric","Brennen","Santino","Stanley","Tyrone","Chace","Francis","Johnathon","Teagan","Zechariah","Alonso","Kaeden","Kamden","Gilberto","Ray","Karter","Luciano","Nico","Kole","Aryan","Draven","Jamie","Misael","Lee","Alexzander","Camren","Giovanny","Amare","Rhett","Rhys","Rodolfo","Nash","Markus","Deven","Mohammad","Moshe","Quintin","Dwayne","Memphis","Atticus","Davian","Eugene","Jax","Antoine","Wayne","Randall","Semaj","Uriah","Clark","Aidyn","Jorden","Maxim","Aditya","Lawson","Messiah","Korbin","Sullivan","Freddy","Demarcus","Neil","Brice","King","Davon","Elvis","Ace","Dexter","Heath","Duncan","Jamar","Sincere","Irvin","Remington","Kadin","Soren","Tyree","Damarion","Talan","Adrien","Gilbert","Keenan","Darnell","Adolfo","Tristian","Derick","Isai","Rylee","Gauge","Harold","Kareem","Deangelo","Agustin","Coleman","Zavier","Lamar","Emery","Jaydin","Devan","Jordyn","Mathias","Prince","Sage","Seamus","Jasiah","Efrain","Darryl","Arjun","Mike","Roland","Conrad","Kamron","Hamza","Santos","Frankie","Dominique","Marley","Vance","Dax","Jamir","Kylan","Todd","Maximo","Jabari","Matthias","Haiden","Luka","Marcelo","Keon","Layton","Tyrell","Kash","Raiden","Cullen","Donte","Jovani","Cordell","Kasen","Rory","Alfred","Darwin","Ernest","Bailey","Gaige","Hassan","Jamarcus","Killian","Augustus","Trevin","Zain","Ellis","Rex","Yusuf","Bruno","Jaidyn","Justus","Ronin","Humberto","Jaquan","Josh","Kasey","Winston","Dashawn","Lucian","Matias","Sidney","Ignacio","Nigel","Van","Elian","Finley","Jaron","Addison","Aedan","Braedon","Jadyn","Konner","Zayne","Franco","Niko","Savion","Cristofer","Deon","Krish","Anton","Brogan","Cael","Coby","Kymani","Marcel","Yair","Dale","Bo","Jordon","Samir","Darien","Zaire","Ross","Vaughn","Devyn","Kenyon","Clay","Dario","Ishaan","Jair","Kael","Adonis","Jovanny","Clinton","Rey","Chaim","German","Harper","Nathen","Rigoberto","Sonny","Glenn","Octavio","Blaze","Keshawn","Ralph","Ean","Nikhil","Rayan","Sterling","Branson","Jadiel","Dillan","Jeramiah","Koen","Konnor","Antwan","Houston","Tyrese","Dereon","Leonidas","Zack","Fisher","Jaydan","Quinten","Nick","Urijah","Darion","Jovan","Salvatore","Beckham","Jarrett","Antony","Eden","Makai","Zaiden","Broderick","Camryn","Malaki","Nikolai","Howard","Immanuel","Demarion","Valentino","Jovanni","Ayaan","Ethen","Leandro","Royce","Yael","Yosef","Jean","Marquise","Alden","Leroy","Gaven","Jovany","Tyshawn","Aarav","Kadyn","Milton","Zaid","Kelton","Tripp","Kamren","Slade","Hezekiah","Jakobe","Nathanial","Rishi","Shamar","Geovanni","Pranav","Roderick","Bentley","Clarence","Lyric","Bernard","Carmelo","Denzel","Maximillian","Reynaldo","Cassius","Gordon","Reuben","Samson","Yadiel","Jayvon","Reilly","Sheldon","Abdullah","Jagger","Thaddeus","Case","Kyson","Lamont","Chaz","Makhi","Jan","Marques","Oswaldo","Donavan","Keyon","Kyan","Simeon","Trystan","Andreas","Dangelo","Landin","Reagan","Turner","Arnav","Brenton","Callum","Jayvion","Bridger","Sammy","Deegan","Jaylan","Lennon","Odin","Abdiel","Jerimiah","Eliezer","Bronson","Cornelius","Pierre","Cortez","Baron","Carlo","Carsen","Fletcher","Izayah","Kolten","Damari","Hugh","Jensen","Yurem"];this.lastMaleIndex=0;this.lastFemaleIndex=0}nextMale(){return this.males[this.lastMaleIndex++].toLowerCase()}nextFemale(){return this.females[this.lastFemaleIndex++].toLowerCase()}}class OrFilteringStrategy{filter(filters,data){if(filters==null||filters.length===0)return data;let filtered=[];data.forEach(item=>{for(let i=0;ix.getSerializer("_req").sticky);return filters}addListener(listener){if(this.listeners.includes(listener))return;this.listeners.push(listener)}filterStateChangedHandler(channel,filter,onSuccess,onError){this.refresh(onSuccess,onError);return true}filterResetHandler(channel,filter,onSuccess,onError){this.refresh(onSuccess,onError);return true}refresh(onSuccess=null,onError=null){let url=this.serializeUrl();this.notifyBefore(url);const self=this;this.dataSource.get(url,data=>{data=self.dataSource.filter(data,self.filters);if(onSuccess)onSuccess();self.notifyResultsReceived(data)},err=>{if(onError)onError();self.notifyOnError(err)},()=>{self.notifyOnCompleted()})}serializeUrl(){this.filters.forEach(filter=>{filter.serialize("_req",this.builder)});let url=this.builder.pop();return url}notifyBefore(url){this.listeners.forEach(listener=>{listener.onBefore(url)})}notifyResultsReceived(data){this.listeners.forEach(listener=>{listener.resultsReceived(data)})}notifyOnError(err){this.listeners.forEach(listener=>{listener.onError(err)})}notifyOnCompleted(){this.listeners.forEach(listener=>{listener.onCompleted()})}}class ToggleRequestService extends RequestService{constructor(filterContainer,clientDataSource,httpDataSource,builder){super(filterContainer,clientDataSource,httpDataSource,builder);httpDataSource.addListener(clientDataSource);clientDataSource.addListener(this)}initDataSource(client,http){return http}onDataReceived(){this.switchToClient()}filterStateChanged(channel,filter,onSuccess,onError){if(!filter.hasRole())this.switchToHttp();super.filterStateChanged(channel,filter,onSuccess,onError)}filterReset(channel,filter,onSuccess,onError){if(!filter.hasRole())this.switchToHttp();super.filterReset(channel,filter,onSuccess,onError)}switchToHttp(){this.dataSource=this.http}switchToClient(){this.dataSource=this.client}}class UrlBuilder{constructor(parameterValueDelimiter,parameterDelimiter){this._params=new Map;this._paramValueDelim=parameterValueDelimiter;this._paramDelim=parameterDelimiter}deconstruct(url){if(url.includes("?"))url=url.split("?")[1];let res=new Map;let params=url.split(this._paramDelim);params.forEach(param=>{let key=param.split("=")[0];let valuesStr=param.split("=")[1];if(S.isNullOrEmpty(valuesStr))return;res.set(key,[]);let values=valuesStr.split(this._paramValueDelim);values.forEach(value=>{var x=res.get(key);x.push(value)})});return res}add(name,value){if(name==null||value==null||value.toString().trim()===""){return}if(this._params.has(name)){let values=this._params.get(name);if(values.includes(value)){return}values.push(value)}else{this._params.set(name,[value])}}remove(name,value=null){if(!this._params.has(name)){return}if(value!=null){let values=this._params.get(name);values.remove(value)}else this._params.delete(name)}pop(){let url=this.peek();this.clear();return url}peek(){return this.constructUrl()}clear(){this._params.clear()}constructUrl(){let params=[];this._params.forEach((values,key)=>{let valuesStr=values.join(this._paramValueDelim);let param=key+"="+valuesStr;params.push(param)});return params.join(this._paramDelim)}}class UrlService extends ChannelListener{constructor(builder,requestService,filterContainer){super();this.builder=builder;this.requestService=requestService;this.filterContainer=filterContainer}restore(){this.muted(function(){let queryString=window.location.search;const urlParams=new URLSearchParams(queryString);let filters=this.filterContainer.getFilters();let restoredFilters=[];urlParams.forEach((values,key,parent)=>{let valueArr=values.split(",");valueArr.forEach(value=>{let filter=filters.firstOrDefault(x=>x.identify(key,value));if(!filter){Logger.warn(`cannot identify filter from parameters key:${key} value:${value}`);return}filter.restore(key,value);restoredFilters.push(filter)})});filters.filter(x=>!restoredFilters.some(y=>y.id===x.id)).forEach(filter=>{filter.reset()})}.bind(this))}filterStateChangedHandler(channel,filter,onSuccess,onError){this.update()}filterResetHandler(channel,filter,onSuccess,onError){this.update()}update(){this.filters.forEach(filter=>{filter.serialize("_url",this.builder)});let queryParams=this.builder.pop();window.history.replaceState({},"","?"+queryParams);Logger.ok("~ OK",this)}}class Expr{}class UnaryException extends Error{}class Ternary extends Expr{constructor(expr,left,right){super();this.expr=expr;this.left=left;this.right=right}accept(visitor){return visitor.visitTernaryExpr(this)}}class Block extends Expr{constructor(expr){super();this.expr=expr}accept(visitor){return visitor.visitBlockExpr(this)}}class Binary extends Expr{constructor(left,right){super();this.left=left;this.right=right}accept(visitor){return visitor.visitTermExpr(this)}}class Unary extends Expr{constructor(operator,right){super();this.operator=operator;this.right=right}accept(visitor){return visitor.visitUnaryExpr(this)}}class FilterExpr extends Expr{constructor(selector,indentifier=null){super();this.selectorToken=selector;this.identifierToken=indentifier}accept(visitor){return visitor.visitFilterExpr(this)}}class PipeExpr extends Expr{constructor(expr,identifier){super();this.expr=expr;this.identifier=identifier}accept(visitor){return visitor.visitPipeExpr(this)}}class Indexer extends Expr{constructor(index,expr){super();this.index=index;this.expr=expr}accept(visitor){return visitor.visitIndexerExpr(this)}}class Literal extends Expr{constructor(value){super();this.value=value}accept(visitor){return visitor.visitLiteralExpr(this)}}class FilterVariableExtractor{constructor(){this.tokens=[]}analyze(expression){this.tokens=[];if(expression==null)return;expression.accept(this)}visitTernaryExpr(expr){expr.expr.accept(this);expr.left.accept(this);if(expr.right!=null)expr.right.accept(this)}visitBlockExpr(expr){expr.expr.accept(this)}visitTermExpr(expr){expr.left.accept(this);expr.right.accept(this)}visitUnaryExpr(expr){expr.right.accept(this)}visitPipeExpr(expr){expr.expr.accept(this)}visitFilterExpr(expr){let token=expr.selectorToken;switch(token.type){case TokenType.G_FILTER_NAME:case TokenType.G_FILTER_STATE:this.tokens.push(expr.identifierToken)}}visitIndexerExpr(expr){expr.expr.accept(this)}visitLiteralExpr(expr){}}class Interpreter{constructor(environment){this.environment=environment}interpret(expression){try{let value=this.evaluate(expression);return value}catch(e){if(e instanceof UnaryException){return""}else if(e instanceof Error){Logger.err(e.message)}}}visitTernaryExpr(expr){let res=this.evaluate(expr.expr);if(res==null||res=="")return this.evaluate(expr.left);else if(expr.right!=null)return this.evaluate(expr.right);else return res}visitBlockExpr(expr){try{let res=this.evaluate(expr.expr);return res}catch(UnaryException){return""}}visitTermExpr(expr){let leftRes=this.evaluate(expr.left);let rightRes=this.evaluate(expr.right);return(leftRes==null?"":leftRes.toString())+(rightRes==null?"":rightRes.toString())}visitUnaryExpr(expr){var value=this.evaluate(expr.right);switch(expr.operator.type){case TokenType.BANG:if(value==null||Array.isArray(value)&&value.every(x=>x===null))throw new UnaryException;break;case TokenType.BANG_BANG:if(value==null||Array.isArray(value)&&value.every(x=>x===null))throw new UnaryException;if(expr.right instanceof FilterExpr){let filter=this.environment.get(expr.right.identifierToken);if(filter.isReset())throw new UnaryException}if(expr.right instanceof Indexer&&expr.right.expr instanceof FilterExpr){let filter=this.environment.get(expr.right.expr.identifierToken);if(filter.isReset(expr.right.index.literal))throw new UnaryException}}return value}visitPipeExpr(expr){let obj=this.evaluate(expr.expr);let pipe=this.environment.getPipe(expr.identifier);obj=obj==null?"":obj.toString();let res=pipe.transform(obj);return res}visitFilterExpr(expr){let token=expr.selectorToken;switch(token.type){case TokenType.FILTER_NAME:case TokenType.G_FILTER_NAME:return this.environment.get(expr.identifierToken).name;case TokenType.FILTER_STATE:case TokenType.G_FILTER_STATE:return this.environment.get(expr.identifierToken).state}}visitIndexerExpr(expr){let arr=this.evaluate(expr.expr);return arr[expr.index.literal]}visitLiteralExpr(expr){return expr.value}evaluate(expr){return expr.accept(this)}}class Environment{constructor(filterContainer,currFilter,dependencyResolver){this.filterContainer=filterContainer;this.currFilter=currFilter;this.dependencyResolver=dependencyResolver}get(token=null){var _a;if(token==null)return this.currFilter;return this.filterContainer.getFilterByNameOrId((_a=token.literal)!==null&&_a!==void 0?_a:token.lexeme)}getPipe(token){var _a;let pipe=this.dependencyResolver.resolveKeyed(DependencyType.Pipe,(_a=token.literal)!==null&&_a!==void 0?_a:token.lexeme);return pipe}}class Parser{constructor(tokens){this.tokens=tokens;this.current=0}parse(){let expr=this.ternary();while(this.match(TokenType.PLUS)){let right=this.ternary();expr=new Binary(expr,right)}return expr}ternary(){let expr=null;if(this.match(TokenType.LEFT_BRACE))expr=this.block();else expr=this.term();let left=null;let right=null;if(this.match(TokenType.QUESTION_MARK)){left=this.parse();if(this.match(TokenType.COLON)){right=this.parse()}return new Ternary(expr,left,right)}else return expr}block(){let expr=this.parse();this.consume(TokenType.RIGHT_BRACE,"Expect '}' after block.");return new Block(expr)}term(){let expr=this.pipe();while(this.match(TokenType.PLUS)){let right=this.ternary();expr=new Binary(expr,right)}return expr}pipe(){let expr=this.unary();while(this.match(TokenType.PIPE)){if(this.consume(TokenType.IDENTIFIER,"expected identifier.")){let identifier=this.previous();expr=new PipeExpr(expr,identifier)}}return expr}unary(){if(this.match(TokenType.BANG,TokenType.BANG_BANG)){let operator=this.previous();let right=this.filter();return new Unary(operator,right)}return this.primary()}primary(){if(this.match(TokenType.NUMBER,TokenType.STRING)){return new Literal(this.previous().literal)}if(this.match(TokenType.IDENTIFIER)){return new Literal(this.previous().lexeme)}let expr=this.filter();if(expr!=null)return expr}filter(){if(this.match(TokenType.FILTER_NAME))return new FilterExpr(this.previous());else if(this.match(TokenType.FILTER_STATE)){let token=this.previous();let expr=new FilterExpr(token);if(this.match(TokenType.LEFT_BRACKET)){return this.indexer(expr)}return expr}else if(this.match(TokenType.G_FILTER_NAME)||this.match(TokenType.G_FILTER_STATE)){let token=this.previous();if(!this.match(TokenType.LEFT_BRACKET)){throw Error("expected '[' after global filter reference.")}if(!this.match(TokenType.STRING,TokenType.NUMBER))throw Error("expected identifier or index number.");let identifier=this.previous();let expr=new FilterExpr(token,identifier);if(!this.match(TokenType.RIGHT_BRACKET))throw Error("expected enclosing ']'.");if(this.match(TokenType.LEFT_BRACKET)){return this.indexer(expr)}return expr}}indexer(exp){if(this.match(TokenType.NUMBER,TokenType.STRING)){let index=this.previous();this.consume(TokenType.RIGHT_BRACKET,"Expected closing ']'.");return new Indexer(index,exp)}}match(...types){for(let type of types){if(this.check(type)){this.advance();return true}}return false}consume(type,message){if(this.check(type))return this.advance();throw Error(this.peek()+" "+message)}advance(){if(!this.isAtEnd())this.current++;return this.previous()}check(type){if(this.isAtEnd())return false;return this.peek().type==type}isAtEnd(){return this.peek().type==TokenType.EOF}peek(){return this.tokens[this.current]}previous(){return this.tokens[this.current-1]}}class Scanner{constructor(source){this.start=0;this.current=0;this.tokens=[];this.source=source;this.keywords=new Map([["$fs",TokenType.FILTER_STATE],["$fn",TokenType.FILTER_NAME],["$FS",TokenType.G_FILTER_STATE],["$FN",TokenType.G_FILTER_NAME]])}scanTokens(){while(!this.isAtEnd()){this.start=this.current;this.scanToken()}this.tokens.push(new Token(TokenType.EOF,"",null));this.fillConcatanation();return this.tokens}scanToken(){let c=this.advance();switch(c){case"(":this.addToken(TokenType.LEFT_PAREN);break;case")":this.addToken(TokenType.RIGHT_PAREN);break;case"{":this.addToken(TokenType.LEFT_BRACE);break;case"}":this.addToken(TokenType.RIGHT_BRACE);break;case"[":this.addToken(TokenType.LEFT_BRACKET);break;case"]":this.addToken(TokenType.RIGHT_BRACKET);break;case".":this.addToken(TokenType.DOT);break;case"+":this.addToken(TokenType.PLUS);break;case":":this.addToken(TokenType.COLON);break;case"|":this.addToken(TokenType.PIPE);break;case"?":this.addToken(TokenType.QUESTION_MARK);break;case"$":this.identifier();break;case"!":this.addToken(this.match("!")?TokenType.BANG_BANG:TokenType.BANG);break;case" ":case"\r":case"\t":break;case"\n":break;case'"':this.string();break;case"'":this.string();break;default:if(this.isDigit(c)){this.number()}else if(this.isAlpha(c)){this.identifier()}else{Logger.err("Unexpected character "+c+" in "+this.source)}}}fillConcatanation(){for(let i=1;i="0"&&c<="9"}number(){while(this.isDigit(this.peek()))this.advance();if(this.peek()=="."&&this.isDigit(this.peekNext())){this.advance();while(this.isDigit(this.peek()))this.advance()}this.addTokenWithLiteral(TokenType.NUMBER,parseFloat(this.source.substring(this.start,this.current)))}peekNext(){if(this.current+1>=this.source.length)return"\0";return this.source.charAt(this.current+1)}identifier(){while(this.isAlpha(this.peek()))this.advance();let text=this.source.substring(this.start,this.current);let type=this.keywords.get(text);if(type==null)type=TokenType.IDENTIFIER;this.fillPreviousWithSpacesIfCurrentIsFilter(type);let pre=this.previous();this.addToken(type);this.fillCurrentIdentifierWithSpacesIfPreviousIsFilterOrBracket(this.previous(),pre)}fillPreviousWithSpacesIfCurrentIsFilter(curr){let pre=this.previous();if(pre==null)return;switch(curr){case TokenType.FILTER_NAME:case TokenType.FILTER_STATE:case TokenType.G_FILTER_NAME:case TokenType.G_FILTER_STATE:case TokenType.IDENTIFIER:if(pre.type==TokenType.IDENTIFIER){for(let i=this.start-1;i>=0;i--){if(this.source[i]==" ")pre.lexeme+=" ";else break}}}}fillCurrentIdentifierWithSpacesIfPreviousIsFilterOrBracket(curr,pre){if(curr.type!=TokenType.IDENTIFIER)return;if(pre==null)return;switch(pre.type){case TokenType.FILTER_NAME:case TokenType.FILTER_STATE:case TokenType.G_FILTER_NAME:case TokenType.G_FILTER_STATE:case TokenType.RIGHT_BRACKET:for(let i=this.start-1;i>=0;i--){if(this.source[i]==" ")curr.lexeme=" "+curr.lexeme;else break}}}isAlpha(c){return c>="a"&&c<="z"||c>="A"&&c<="Z"||c=="_"||c==":"}string(){while(this.peek()!='"'&&this.peek()!="'"&&!this.isAtEnd()){this.advance()}if(this.isAtEnd()){Logger.err("Unterminated string.");return}this.advance();let value=this.source.substring(this.start+1,this.current-1);this.addTokenWithLiteral(TokenType.STRING,value)}peek(){if(this.isAtEnd())return"\0";return this.source.charAt(this.current)}match(expected){if(this.isAtEnd())return false;if(this.source.charAt(this.current)!=expected)return false;this.current++;return true}advance(){return this.source.charAt(this.current++)}addToken(type){this.addTokenWithLiteral(type,null)}addTokenWithLiteral(type,literal){let text=this.source.substring(this.start,this.current);this.tokens.push(new Token(type,text,literal))}isAtEnd(){return this.current>=this.source.length}previous(){return this.tokens.last()}reset(){this.start=0;this.current=0;this.tokens=[]}}class Token{constructor(type,lexeme,literal){this.type=type;this.lexeme=lexeme;this.literal=literal}toString(){return this.type+" "+this.lexeme+" "+this.literal}}var TokenType;(function(TokenType){TokenType[TokenType["LEFT_PAREN"]=0]="LEFT_PAREN";TokenType[TokenType["RIGHT_PAREN"]=1]="RIGHT_PAREN";TokenType[TokenType["LEFT_BRACE"]=2]="LEFT_BRACE";TokenType[TokenType["RIGHT_BRACE"]=3]="RIGHT_BRACE";TokenType[TokenType["LEFT_BRACKET"]=4]="LEFT_BRACKET";TokenType[TokenType["RIGHT_BRACKET"]=5]="RIGHT_BRACKET";TokenType[TokenType["DOT"]=6]="DOT";TokenType[TokenType["PLUS"]=7]="PLUS";TokenType[TokenType["QUESTION_MARK"]=8]="QUESTION_MARK";TokenType[TokenType["COLON"]=9]="COLON";TokenType[TokenType["PIPE"]=10]="PIPE";TokenType[TokenType["BANG"]=11]="BANG";TokenType[TokenType["BANG_BANG"]=12]="BANG_BANG";TokenType[TokenType["EQUAL"]=13]="EQUAL";TokenType[TokenType["EQUAL_EQUAL"]=14]="EQUAL_EQUAL";TokenType[TokenType["GREATER"]=15]="GREATER";TokenType[TokenType["GREATER_EQUAL"]=16]="GREATER_EQUAL";TokenType[TokenType["LESS"]=17]="LESS";TokenType[TokenType["LESS_EQUAL"]=18]="LESS_EQUAL";TokenType[TokenType["FILTER_STATE"]=19]="FILTER_STATE";TokenType[TokenType["FILTER_NAME"]=20]="FILTER_NAME";TokenType[TokenType["G_FILTER_STATE"]=21]="G_FILTER_STATE";TokenType[TokenType["G_FILTER_NAME"]=22]="G_FILTER_NAME";TokenType[TokenType["IDENTIFIER"]=23]="IDENTIFIER";TokenType[TokenType["STRING"]=24]="STRING";TokenType[TokenType["NUMBER"]=25]="NUMBER";TokenType[TokenType["EOF"]=26]="EOF"})(TokenType||(TokenType={}));var fireman;var _$=identifier=>{if(fireman){let filter=fireman.getFilterByNameOrId(identifier);if(filter)return filter;return fireman.getContainer(identifier)}};String.prototype.tryParseJSON=function(){try{var o=JSON.parse(this);if(o&&typeof o==="object"){return o}}catch(e){}return false};Array.prototype.max=function(){var list=Object(this);if(list.includes(null))return null;return Math.max.apply(null,this)};Array.prototype.min=function(){var list=Object(this);if(list.includes(null))return null;return Math.min.apply(null,this)};Array.prototype.orderBy=function(o){var list=Object(this);var thisArg=arguments[1];list=list.sort((a,b)=>o.call(thisArg,a,list)-o.call(thisArg,b,list));return list};Array.prototype.last=function(){var list=Object(this);return list[list.length-1]};Array.prototype.orderByDesc=function(o){var list=Object(this);var thisArg=arguments[1];list=list.sort((a,b)=>o.call(thisArg,b,list)-o.call(thisArg,a,list));return list};Array.prototype.withFirst=function(o){var list=Object(this);let el=list.firstOrDefault(o);list=list.filter(item=>item!==el);list.unshift(el);return list};Array.prototype.firstOrDefault=function(predicate){return this.reduce((accumulator,currentValue)=>{if(!accumulator&&predicate(currentValue))accumulator=currentValue;return accumulator},null)};Array.prototype.single=function(predicate){let list=Object(this);let res=list.filter(predicate);if(res.length>1)throw new Error("there are multiple elements");if(res.length===1)return res[0];return null};Array.prototype.remove=function(o){const index=this.indexOf(o,0);if(index>-1){this.splice(index,1);return true}return false};Array.prototype.removeAll=function(o){var list=Object(this);let toRemove=list.filter(o);for(let i=0;i=2){isArray=true;size=inputs.length}if(inputs==null||inputs==undefined||inputs.length==0)return null;let target=Array.isArray(inputs)?inputs[0].target?inputs[0].target:inputs[0]:inputs.target?inputs.target:inputs;let inputType=(_a=target.getAttribute("type"))!==null&&_a!==void 0?_a:target.tagName.toLowerCase();switch(inputType){case"checkbox":case"radio":return new FilterType("boolean",size,isArray);case"number":return new FilterType("number",size,isArray);case"date":return new FilterType("datetime",size,isArray);case"text":case"select":return new FilterType("text",size,isArray)}return null};Element.prototype.getTargetType=function(){var el=Object(this);let inputType=el.getAttribute("type");switch(inputType){case"checkbox":case"radio":return"boolean";case"date":return"datetime";case"number":return"number";case"text":return"text"}return null};Element.prototype.getTargets=function(){var element=Object(this);if(element.tagName.toLowerCase()==="input"||element.tagName.toLowerCase()==="select"){return[element]}let targets=element.querySelectorAll("[adaptor-target]");if(!targets||targets.length===0)targets=element.querySelectorAll("input");if(!targets||targets.length===0)targets=element.querySelectorAll("select");if(!targets||targets.length===0)targets=element.querySelectorAll("button, a");return Array.prototype.slice.call(targets)};Element.prototype.getCName=function(){var el=Object(this);let value=el.getAttribute("container-name");if(!value)value=el.getAttribute("name");return value};Element.prototype.getCId=function(){var el=Object(this);let value=el.getAttribute("container-id");if(!value)value=el.getAttribute("id");return value};Element.prototype.getFName=function(){var el=Object(this);let value=el.getAttribute("filter-name");if(!value){if(el.type=="radio")value=el.getAttribute("value");else value=el.getAttribute("name")}return value};Element.prototype.getFGroup=function(){var _a;var el=Object(this);let value=el.getAttribute("filter-group");if(!value){value=el.getAttribute("group");if(!value){if(el.type=="radio")value=el.getAttribute("name");else if(((_a=el.querySelector("input"))===null||_a===void 0?void 0:_a.type)=="radio")value=el.querySelector("input").getAttribute("name");else value=null}}return value};Element.prototype.getFId=function(){var el=Object(this);let value=el.getAttribute("filter-id");if(!value)value=el.getAttribute("id");return value};String.prototype.isJson=function(){let attr=Object(this);try{JSON.parse(attr)}catch(e){return false}return true};Attr.prototype.isJson=function(){let attr=Object(this);return attr.value.isJson()};class S{static isNullOrEmpty(o){return o==null||o==undefined||S.isStr(o)&&o.trim()===""}static isStr(o){return o instanceof String||typeof o==="string"}}class Stack{constructor(){this.items=[]}push(item){this.items.push(item)}pop(){let item=this.peek();this.items.remove(item);return item}peek(){return this.length==0?undefined:this.items[this.length-1]}clear(){this.items=[]}get empty(){return this.length===0}get length(){return this.items.length}}class Logger{static colorOf(obj){if(obj instanceof Channel)return"color: #e3dc95";if(obj instanceof Filter)return"color: #256eff";if(obj instanceof Hub)return"color: #7d53de; background: #fff";if(obj instanceof ChannelListener)return"color: #ffa5ab";if(obj instanceof FilterAdaptor)return"color: #f9dc5c";if(obj instanceof FiremanMemento)return"color: #f91fff";if(obj instanceof Fireman)return"color: #02f3bf";if(obj instanceof DataSource)return"color: #faff13";if(obj instanceof FilterContent)return"color: #f7778f";if(obj instanceof ResultsListener)return"color: #f7078f";if(obj instanceof FiremanDOMBuilder)return"color: #cfff40";if(obj instanceof FiremanBuilder)return"color: #cfcf40";if(obj instanceof FilterContainer)return"color: #256eff";return null}static info(message,...args){let res=Logger.buildMessage(message,Logger.infoColor,args);Logger.log(res.message,res.colors)}static warn(message,...args){let res=Logger.buildMessage(message,Logger.warnColor,args);Logger.log(res.message,res.colors)}static err(message,...args){let res=Logger.buildMessage(message,Logger.errColor,args);Logger.log(res.message,res.colors)}static ok(message,...args){let res=Logger.buildMessage(message,Logger.okColor,args);Logger.log(res.message,res.colors)}static buildMessage(message,baseColor,args){message="%c"+message;let colors=[];colors.push(baseColor);if(args!=null&&args.length!==0)args.forEach(arg=>{let color=Logger.colorOf(arg);if(color){message=message.replace(Logger.argSymbol,"%c"+arg.toString()+"%c");colors.push(color);colors.push(baseColor)}else message=message.replace(Logger.argSymbol,arg.toString())});return{message:message,colors:colors}}static log(message,colors){if(!Logger.enabled)return;switch(colors.length){case 1:console.log(message,colors[0]);break;case 2:console.log(message,colors[0],colors[1]);break;case 3:console.log(message,colors[0],colors[1],colors[2]);break;case 4:console.log(message,colors[0],colors[1],colors[2],colors[3]);break;case 5:console.log(message,colors[0],colors[1],colors[2],colors[3],colors[5]);break;case 6:console.log(message,colors[0],colors[1],colors[2],colors[3],colors[4],colors[5]);break;case 7:console.log(message,colors[0],colors[1],colors[2],colors[3],colors[4],colors[5],colors[6]);break;case 8:console.log(message,colors[0],colors[1],colors[2],colors[3],colors[4],colors[5],colors[6],colors[7]);break;case 9:console.log(message,colors[0],colors[1],colors[2],colors[3],colors[4],colors[5],colors[6],colors[7],colors[8]);break;case 10:console.log(message,colors[0],colors[1],colors[2],colors[3],colors[4],colors[5],colors[6],colors[7],colors[8],colors[9]);break}}}Logger.argSymbol="~";Logger.enabled=false;Logger.infoColor="color : #aaaaaa'";Logger.warnColor="color : #f0ad4e";Logger.errColor="color : #bb2124";Logger.okColor="color : #22bb33";class Pipeline{constructor(it,params,stageFunc){this.proceed=()=>{};this.index=0;this.params=params;this.stageItems=it;this.stageFunc=stageFunc}begin(onPipelineSuccess=null,onPipelineError=null){this.onPipelineSuccess=onPipelineSuccess;this.onPipelineError=onPipelineError;this.executeState()}next(){this.executeState()}executeState(){var _a;if(this.isAtEnd()){if(this.onPipelineSuccess)this.onPipelineSuccess();return}let successFunc=this.onSuccess.bind(this);let errorFunc=(_a=this.onError)===null||_a===void 0?void 0:_a.bind(this);let stageRes=this.stageFunc(this.stageItems[this.index],this.params,successFunc,errorFunc);this.proceed(stageRes,successFunc)}isAtEnd(){return this.stageItems.length===0||this.index>=this.stageItems.length}onSuccess(){this.index++;this.next()}onError(){if(this.onPipelineError)this.onPipelineError();return;this.stageItems[this.index].onListenerError();this.index++;this.next()}}class Watcher{watch(containerSelector){let containers=document.querySelectorAll(containerSelector);return new ForWatcher(containers)}dispose(){var _a;(_a=this.forWatcher)===null||_a===void 0?void 0:_a.dispose()}}class ForWatcher{constructor(containers){this.containers=containers}for(forElementSelector){this.builder=new BuildedWatcher(this.containers,forElementSelector);return this.builder}dispose(){var _a;(_a=this.builder)===null||_a===void 0?void 0:_a.dispose()}}class BuildedWatcher{constructor(containers,forElementSelector){this.containers=containers;this.forElementSelector=forElementSelector}when(added,removed){this.observer=new MutationObserver(function(mutations){mutations.forEach(function(mutation){if(mutation.addedNodes&&mutation.addedNodes.length>0){mutation.addedNodes.forEach(function(node){let contentNodes=node.querySelectorAll(this.forElementSelector);if(!contentNodes||contentNodes.length===0)return;contentNodes.forEach(node=>{added(node)})}.bind(this))}else if(mutation.removedNodes&&mutation.removedNodes.length>0){mutation.removedNodes.forEach(function(node){let contentNodes=node.querySelectorAll(this.forElementSelector);if(!contentNodes||contentNodes.length===0)return;contentNodes.forEach(node=>{removed(node)})}.bind(this))}}.bind(this))}.bind(this));var config={attributes:true,childList:true,characterData:true};if(this.containers)this.containers.forEach(container=>{this.observer.observe(container,config)})}dispose(){this.observer.disconnect()}}