@asor-studio/asor-core 1.1.7 → 1.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- import*as t from"@angular/core";import{inject as e,Injectable as r,Directive as n,ViewChildren as o,Injector as a,runInInjectionContext as s,ChangeDetectorRef as i,Pipe as l,Input as c,ViewEncapsulation as d,Component as p,ViewChild as g,EventEmitter as h,Output as b,HostListener as u}from"@angular/core";import{ActivatedRoute as f,Router as y,UrlTree as x}from"@angular/router";import*as m from"@angular/common";import{Location as v,CommonModule as w}from"@angular/common";import{ReplaySubject as k,of as C,BehaviorSubject as S,forkJoin as E,throwError as j,from as I,Observable as O,isObservable as T,tap as z}from"rxjs";import{map as N,filter as D,first as M,tap as A,switchMap as L,catchError as U}from"rxjs/operators";import{HttpClient as R,HttpResponse as V,HttpHeaders as P}from"@angular/common/http";import*as B from"crypto-js";import*as H from"@angular/forms";import{FormsModule as F}from"@angular/forms";class ConfigConst{static BaseApi="/api/v1";static SiteBaseUrl="/asor-core";static SiteAssetsUrl="/assets";static _routeBase={NONE:"none",PAGE_UNAUTHORIZED:"unathorized",LOGIN:"login"};static _routeExtensions;static get Route(){return{...this._routeBase,...this._routeExtensions}}static _urlBase={get UNAUTHORIZED(){return ConfigConst.SiteBaseUrl.concat("/unathorized")},get LOGIN(){return ConfigConst.SiteBaseUrl.concat("/login")}};static _urlExtensions;static get Url(){return{UNAUTHORIZED:this._urlBase.UNAUTHORIZED,LOGIN:this._urlBase.LOGIN,...this._urlExtensions}}static _translationUrlBase={DefaultLanguage:"en"};static _translationUrlExtensions;static get TranslationUrl(){return{...this._translationUrlBase,...this._translationUrlExtensions}}static _authCheckBase={PAGE_UNAUTHORIZED:"unathorized"};static _authCheckExtensions;static get AuthCheck(){return{...this._authCheckBase,...this._authCheckExtensions}}static _cacheBase={NONE:""};static _cacheExtensions;static get Cache(){return{...this._cacheBase,...this._cacheExtensions}}static SetConfiguration(t){if(!(t._routeExtensions&&t._urlExtensions&&t._translationUrlExtensions&&t._authCheckExtensions&&t._cacheExtensions))throw new Error("Missing configuration extensions");this.BaseApi=t.BaseApi,this.SiteBaseUrl=t.SiteBaseUrl,this.SiteAssetsUrl=t.SiteAssetsUrl,this._routeExtensions=t._routeExtensions,this._urlExtensions=t._urlExtensions,this._translationUrlExtensions=t._translationUrlExtensions,this._authCheckExtensions=t._authCheckExtensions,this._cacheExtensions=t._cacheExtensions}}class ConfigCache{static globalStateName="default";static _pathsBase=[];static _pathsExtensions;static get Paths(){return[...this._pathsBase,...this._pathsExtensions]}static SetConfiguration(t){if(!t._pathsExtensions)throw new Error("Missing configuration extensions");if(!t.globalStateName)throw new Error("Missing global state name");this.globalStateName=t.globalStateName,this._pathsExtensions=t._pathsExtensions}}class ConsoleLogsConfig{static defaultLevels=[];static silent=!1;static classConfigs=[];static isLevelEnabled(t,e){const r=ConsoleLogsConfig.classConfigs.find(e=>e.className===t),n=r&&r.levels&&r.levels.length>0?r.levels:ConsoleLogsConfig.defaultLevels;return n.includes("ALL")||n.includes(e)}static setClassLevels(t,e){const r=ConsoleLogsConfig.classConfigs.find(e=>e.className===t);r?r.levels=e:ConsoleLogsConfig.classConfigs.push({className:t,levels:e})}static removeClassConfig(t){ConsoleLogsConfig.classConfigs=ConsoleLogsConfig.classConfigs.filter(e=>e.className!==t)}static reset(){ConsoleLogsConfig.defaultLevels=["ALL"],ConsoleLogsConfig.classConfigs=[]}}class MockOrchestratorMapService{static staticRequestMappings=new Map;static registryMethod(t,e){return MockOrchestratorMapService.staticRequestMappings.set(t,e),e}}function MockRequestMapping(t){return function(e,r,n){return t={...t,className:e.constructor.className},MockOrchestratorMapService.registryMethod(t,n)}}var G,q,J,W,K;!function(t){t.GET="GET",t.POST="POST",t.PUT="PUT",t.DELETE="DELETE",t.PATCH="PATCH",t.HEAD="HEAD",t.OPTIONS="OPTIONS",t.CONNECT="CONNECT",t.TRACE="TRACE"}(G||(G={})),function(t){t[t.Continue=100]="Continue",t[t.SwitchingProtocols=101]="SwitchingProtocols",t[t.Processing=102]="Processing",t[t.OK=200]="OK",t[t.Created=201]="Created",t[t.Accepted=202]="Accepted",t[t.NonAuthoritativeInformation=203]="NonAuthoritativeInformation",t[t.NoContent=204]="NoContent",t[t.ResetContent=205]="ResetContent",t[t.PartialContent=206]="PartialContent",t[t.MultipleChoices=300]="MultipleChoices",t[t.MovedPermanently=301]="MovedPermanently",t[t.Found=302]="Found",t[t.SeeOther=303]="SeeOther",t[t.NotModified=304]="NotModified",t[t.UseProxy=305]="UseProxy",t[t.TemporaryRedirect=307]="TemporaryRedirect",t[t.PermanentRedirect=308]="PermanentRedirect",t[t.BadRequest=400]="BadRequest",t[t.Unauthorized=401]="Unauthorized",t[t.PaymentRequired=402]="PaymentRequired",t[t.Forbidden=403]="Forbidden",t[t.NotFound=404]="NotFound",t[t.MethodNotAllowed=405]="MethodNotAllowed",t[t.NotAcceptable=406]="NotAcceptable",t[t.ProxyAuthenticationRequired=407]="ProxyAuthenticationRequired",t[t.RequestTimeout=408]="RequestTimeout",t[t.Conflict=409]="Conflict",t[t.Gone=410]="Gone",t[t.LengthRequired=411]="LengthRequired",t[t.PreconditionFailed=412]="PreconditionFailed",t[t.PayloadTooLarge=413]="PayloadTooLarge",t[t.URITooLong=414]="URITooLong",t[t.UnsupportedMediaType=415]="UnsupportedMediaType",t[t.RangeNotSatisfiable=416]="RangeNotSatisfiable",t[t.ExpectationFailed=417]="ExpectationFailed",t[t.UnprocessableEntity=422]="UnprocessableEntity",t[t.Locked=423]="Locked",t[t.FailedDependency=424]="FailedDependency",t[t.UpgradeRequired=426]="UpgradeRequired",t[t.PreconditionRequired=428]="PreconditionRequired",t[t.TooManyRequests=429]="TooManyRequests",t[t.RequestHeaderFieldsTooLarge=431]="RequestHeaderFieldsTooLarge",t[t.UnavailableForLegalReasons=451]="UnavailableForLegalReasons",t[t.InternalServerError=500]="InternalServerError",t[t.NotImplemented=501]="NotImplemented",t[t.BadGateway=502]="BadGateway",t[t.ServiceUnavailable=503]="ServiceUnavailable",t[t.GatewayTimeout=504]="GatewayTimeout",t[t.HTTPVersionNotSupported=505]="HTTPVersionNotSupported",t[t.VariantAlsoNegotiates=506]="VariantAlsoNegotiates",t[t.InsufficientStorage=507]="InsufficientStorage",t[t.LoopDetected=508]="LoopDetected",t[t.NotExtended=510]="NotExtended",t[t.NetworkAuthenticationRequired=511]="NetworkAuthenticationRequired"}(q||(q={})),function(t){t.Ok="ok",t.Retray="re",t.NotAllow="na",t.Expired="ex"}(J||(J={})),function(t){t.VOLATILE="volatile",t.SESSION="session",t.LOCAL="local"}(W||(W={})),function(t){t.NONE="NONE",t.AUTO="AUTO",t.CUSTOM="CUSTOM"}(K||(K={}));var Z=Object.freeze({__proto__:null,get AuthStatus(){return J},get CacheEncriptType(){return K},get CacheType(){return W},get IHttpMethod(){return G},get IHttpStatusCode(){return q}});class StateConst{static EncryptType={AES:"AES"};static Generate={AUTO:"AUTO",CUSTOM:"CUSTOM"};static StoreType={VOLATILE:"VOLATILE",SESSION:"SESSION",LOCAL:"LOCAL"};static Data={REPLACE:"REPLACE",MERGE:"MERGE"};static Cookie={CACHE:"asor-cache-utility-asdgtr3648w9sd",CACHE_KEY:"asor-cache-key-rtyuiop789012",CACHE_KEY_EXPIRE:365,STATE:"asor-state-utility-qwezxc123456",STATE_KEY:"asor-secure-key-rtyuiop789012",STATE_KEY_EXPIRE:365};static CMPLX12=12;static CMPLX6=6}var Y=Object.freeze({__proto__:null,StateConst});class ConsoleLogsUtility{static logStream$=new k(1e3);static COLORS={INFO:{badge:"background:#0dcaf0;color:#000;border-radius:3px;font-weight:bold",text:"color:#0dcaf0",time:"color:#888"},DEBUG:{badge:"background:#a855f7;color:#fff;border-radius:3px;font-weight:bold",text:"color:#a855f7",time:"color:#888"},WARNING:{badge:"background:#f59e0b;color:#000;border-radius:3px;font-weight:bold",text:"color:#f59e0b",time:"color:#888"},ERROR:{badge:"background:#ef4444;color:#fff;border-radius:3px;font-weight:bold",text:"color:#ef4444;font-weight:bold",time:"color:#888"}};static formatTimestamp(){const t=new Date,pad=(t,e=2)=>String(t).padStart(e,"0");return`${t.getFullYear()}-${pad(t.getMonth()+1)}-${pad(t.getDate())} ${pad(t.getHours())}:${pad(t.getMinutes())}:${pad(t.getSeconds())}.${pad(t.getMilliseconds(),3)}`}static buildLog(t,e,r){const n=e?.className||e?.constructor?.className||e?.constructor?.name||"Unknown";if(!ConsoleLogsConfig.isLevelEnabled(n,t))return;const o=ConsoleLogsUtility.COLORS[t],a=ConsoleLogsUtility.formatTimestamp(),s=r.length>0?r[0]:"",i=r.slice(1);ConsoleLogsUtility.logStream$.next({timestamp:a,level:t,className:n,message:"string"==typeof s?s:JSON.stringify(s),params:i,source:e}),ConsoleLogsConfig.silent||("ERROR"===t?console.error:"WARNING"===t?console.warn:console.log)(`%c ${t} %c %c${a}%c [${n}] ${s}`,o.badge,"",o.time,o.text,...i)}static info(t,...e){ConsoleLogsUtility.buildLog("INFO",t,e)}static debug(t,...e){ConsoleLogsUtility.buildLog("DEBUG",t,e)}static warning(t,...e){ConsoleLogsUtility.buildLog("WARNING",t,e)}static error(t,...e){ConsoleLogsUtility.buildLog("ERROR",t,e)}}class RoutingUtility{static _name="RoutingUtility";route=e(f);router=e(y);location=e(v);constructor(){}getNavParams(t){return this.route.snapshot.queryParams[t]||""}getPathParams(t){return this.route.snapshot.params[t]||""}currentNavPass(t){return-1!=this.router.url.indexOf(t)}navigate(t,e){const r=new URL(`${window.location.origin}${t}`);if(e){const t=new URLSearchParams(e);r.search=t.toString()}this.router.navigateByUrl(r.pathname.concat(r.search||"").replace(ConfigConst.SiteBaseUrl,"")).then(()=>{}).catch(t=>{})}navigateWithStateObj(t,e,r){const n={state:e,queryParams:r};this.router.navigate([t.replace(ConfigConst.SiteBaseUrl,"")],n).then(()=>{}).catch(t=>{ConsoleLogsUtility.error(RoutingUtility._name,t)})}getStateParams(){return this.location.getState()}getBaseRouter(){return this.router}getBaseActivatedRoute(){return this.route}getBaseLocation(){return this.location}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:RoutingUtility,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:RoutingUtility,providedIn:"root"})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:RoutingUtility,decorators:[{type:r,args:[{providedIn:"root"}]}],ctorParameters:()=>[]});class HttpRequestHandler{static className="HttpRequestHandler";baseUrl="";http=e(R);constructor(t){try{if(!t)throw new Error("Missing configuration of HttpRequestHandlerconfig");this.baseUrl=t.baseApiUrl}catch(t){ConsoleLogsUtility.error(HttpRequestHandler.name,t)}}get(t,e){const r=`${this.baseUrl}/${t}`;return ConsoleLogsUtility.debug(this,`GET request to ${r}`,e),this.wrapper(()=>this.http.get(r,{params:e}))}post(t,e,r){const n=`${this.baseUrl}/${t}`;return ConsoleLogsUtility.debug(this,`POST request to ${n}`,e),this.wrapper(()=>this.http.post(n,e,{headers:r}))}put(t,e,r){const n=`${this.baseUrl}/${t}`;return ConsoleLogsUtility.debug(this,`PUT request to ${n}`,e),this.wrapper(()=>this.http.put(n,e,{headers:r}))}delete(t){const e=`${this.baseUrl}/${t}`;return ConsoleLogsUtility.debug(this,`DELETE request to ${e}`),this.wrapper(()=>this.http.delete(e))}wrapper(t){let e,r=t();return{send:t=>(e=r.subscribe({...t,error:r=>{try{t.error&&t.error(r)}finally{e&&e.unsubscribe()}},complete:()=>{try{t.complete&&t.complete()}finally{e&&e.unsubscribe()}}}),e),obs:()=>r}}}class TranslateUtility{translations={};translationSubjects={};loading={};requestHandler=new HttpRequestHandler({baseApiUrl:ConfigConst.SiteAssetsUrl});constructor(){}getTranslation$(t,e,r=ConfigConst.TranslationUrl.DefaultLanguage){const n=[];if(0===e.length)return C(t);for(const o of e){const e=`${o}|${r}|${t}`;let a;this.translationSubjects[e]||(this.translationSubjects[e]=new S(this.translations[o]?.[r]?.[t]||t)),a=this.translations[o]?.[r]?C(null):this.loadTranslations(o,r);const s=a.pipe(N(()=>this.translationSubjects[e].value));n.push(s)}return E(n).pipe(N(e=>e.find(e=>e!==t)||t))}loadTranslations(t,e){this.loading[t]||(this.loading[t]={}),this.loading[t][e]||(this.loading[t][e]=new S(!1));const r=this.loading[t][e];return this.translations[t]?.[e]&&!r.value?C(null):r.value?r.asObservable().pipe(D(t=>!t),M(),N(()=>null)):(r.next(!0),this.requestHandler.get(`i18n${t}/${e}.json`).obs().pipe(A(r=>{this.translations[t]=this.translations[t]||{},this.translations[t][e]=r,Object.entries(r).forEach(([r,n])=>{if("string"==typeof n){const o=`${t}|${e}|${r}`,a=this.translationSubjects[o];a?a.next(n):this.translationSubjects[o]=new S(n)}})}),N(()=>(r.next(!1),null))))}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:TranslateUtility,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:TranslateUtility,providedIn:"root"})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:TranslateUtility,decorators:[{type:r,args:[{providedIn:"root"}]}],ctorParameters:()=>[]});class CachePathUtility{paths=[];_routingUtility=e(RoutingUtility);constructor(t){this.paths=t}config(t){return this.paths.find(e=>-1!==t.indexOf(e.pathValue))}exist(t){const e=this.paths.find(e=>-1!==t.indexOf(e.pathValue));if(e){if(e?.resctrictRoute==ConfigConst.Route.NONE)return!0;if(this._routingUtility.currentNavPass(e?.resctrictRoute||ConfigConst.Route.NONE))return!0}return!1}relationCleanOnConfig(t){return this.paths.find(e=>!!e.clearOn.find(e=>-1!==t.indexOf(e)))}existRelationCleanOn(t){return!!this.paths.find(e=>!!e.clearOn.find(e=>-1!==t.indexOf(e)))}getPaths(){return this.paths}}class CookieUtils{static add(t,e,r){let n="";if(r){const t=new Date;t.setTime(t.getTime()+24*r*60*60*1e3),n="; expires="+t.toUTCString()}document.cookie=t+"="+(e||"")+n+"; path=/"}static read(t){const e=t+"=",r=document.cookie.split(";");for(let t=0;t<r.length;t++){let n=r[t];for(;" "===n.charAt(0);)n=n.substring(1,n.length);if(0===n.indexOf(e))return n.substring(e.length,n.length)}return""}static delete(t){document.cookie=t+"=; Max-Age=-99999999;"}}class ObjectUtils{static isEmpty(t){return null==t||"object"==typeof t&&0===Object.keys(t).length}static isNotEmpty(t){return!ObjectUtils.isEmpty(t)}static isObject(t){return null!==t&&"object"==typeof t&&!Array.isArray(t)}static cloneDeep(t){if(null===t||"object"!=typeof t)return t;if(Array.isArray(t))return t.map(t=>this.cloneDeep(t));const e={};for(const r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=this.cloneDeep(t[r]));return e}}class RandomUtils{static makeid(t){let e="";for(let r=0;r<t;r++)e+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".charAt(Math.floor(62*Math.random()));return e}}let Q=class StringUtils{static isEmpty(t){return null==t||""===t}static isNotEmpty(t){return!StringUtils.isEmpty(t)}static isString(t){return"string"==typeof t}};class CacheUtility{static className="CacheUtility";cache_name=B.MD5(StateConst.Cookie.CACHE).toString();globalStateName="default";cacheApp=new Map;cachePathUtility;constructor(){this.globalStateName=ConfigCache.globalStateName,this.cachePathUtility=new CachePathUtility(ConfigCache.Paths);let t=sessionStorage.getItem(this.cache_name);t&&Object.entries(JSON.parse(t)).forEach(([t,e])=>this.cacheApp.set(t,e));let e=localStorage.getItem(this.cache_name);e&&Object.entries(JSON.parse(e)).forEach(([t,e])=>this.cacheApp.set(t,e)),this.cleanUp()}cleanUp(){const t=new Map;for(const e of Array.from(this.cacheApp.keys()))if(!this.cachePathUtility.config(e)||-1===e.indexOf(`(${this.globalStateName})`)){const r=this.cacheApp.get(e);void 0!==r&&t.set(e,r),this.cacheApp.delete(e)}try{const e=sessionStorage.getItem(this.cache_name);if(e){const r=new Map(Object.entries(JSON.parse(e)));let n=!1;for(const e of Array.from(r.keys())){const o=this.cachePathUtility.config(e);o&&o.persistenceType===W.SESSION&&-1!==e.indexOf(`(${this.globalStateName})`)||(t.set(e,r.get(e)),r.delete(e),n=!0)}n&&(0===r.size?sessionStorage.removeItem(this.cache_name):sessionStorage.setItem(this.cache_name,JSON.stringify(Object.fromEntries(r))))}}catch(t){ConsoleLogsUtility.error(this,"Failed to clean up obsolete items from session storage:",t),sessionStorage.removeItem(this.cache_name)}try{const e=localStorage.getItem(this.cache_name);if(e){const r=new Map(Object.entries(JSON.parse(e)));let n=!1;for(const e of Array.from(r.keys())){const o=this.cachePathUtility.config(e);o&&o.persistenceType===W.LOCAL&&-1!==e.indexOf(`(${this.globalStateName})`)||(t.set(e,r.get(e)),r.delete(e),n=!0)}n&&(0===r.size?localStorage.removeItem(this.cache_name):localStorage.setItem(this.cache_name,JSON.stringify(Object.fromEntries(r))))}}catch(t){ConsoleLogsUtility.error(this,"Failed to clean up obsolete items from local storage:",t),localStorage.removeItem(this.cache_name)}return t}isValidResponse(t,e){const r=e&&!(Array.isArray(e)&&0===e.length);return r||this.cacheApp.delete(t),r}pass(t,e){return this.isValidResponse(t.url,e)&&this.cachePathUtility.exist(t.url)}get(t){let e=`(${this.globalStateName})${t.url}`,r=this.cachePathUtility.config(e);if(r&&r.reqPayloadCache&&t.body){let r=btoa(JSON.stringify(t.body));e=e.concat(`#[${r}]`)}if(this.cachePathUtility.existRelationCleanOn(e)){let t=[],r=this.cachePathUtility.relationCleanOnConfig(e);r&&this.cacheApp.forEach((e,n)=>{-1!=n.indexOf(r.pathValue)&&t.push(n)}),t.forEach(t=>{switch(this.cacheApp.delete(t),r?.persistenceType){case W.SESSION:case W.LOCAL:{let e=r.persistenceType===W.LOCAL?localStorage:sessionStorage,n=e.getItem(this.cache_name),o=n?new Map(Object.entries(JSON.parse(n))):new Map;o.delete(t),e.setItem(this.cache_name,JSON.stringify(Object.fromEntries(o)));break}}})}let n=this.cacheApp.get(e);if(r?.encriptType&&r.encriptType!=K.NONE&&"string"==typeof n&&(n=this.decrypt(r,n)),n instanceof Object)return new V({body:ObjectUtils.cloneDeep(n.body),status:n.status,statusText:n.statusText,url:n.url||"",headers:new P({...n.headers})})}set(t,e){let r=`(${this.globalStateName})${t.url}`,n=e,o=this.cachePathUtility.config(r);if(o?.reqPayloadCache&&t.body){let e=btoa(JSON.stringify(t.body));r=r.concat(`#[${e}]`)}switch(o?.encriptType&&o.encriptType!=K.NONE&&(n=this.encrypt(o,e)),o?.persistenceType){case W.SESSION:case W.LOCAL:try{let t=o.persistenceType===W.LOCAL?localStorage:sessionStorage,e=t.getItem(this.cache_name),a=e?new Map(Object.entries(JSON.parse(e))):new Map;a.set(r,n),t.setItem(this.cache_name,JSON.stringify(Object.fromEntries(a)))}catch(t){ConsoleLogsUtility.error(this,"Failed to persist map cache to storage:",t)}}this.cacheApp.set(r,n)}getCacheKey(t){let e="";switch(t.encriptType){case K.AUTO:{const t=B.MD5(StateConst.Cookie.CACHE_KEY).toString();if(Q.isEmpty(CookieUtils.read(t))){const e=RandomUtils.makeid(StateConst.CMPLX12)+(new Date).getTime(),r=RandomUtils.makeid(StateConst.CMPLX6)+(new Date).getTime(),n=B.AES.encrypt(e,r).toString()+"."+r;CookieUtils.add(t,n,StateConst.Cookie.CACHE_KEY_EXPIRE)}const r=CookieUtils.read(t).split(".");e=B.AES.decrypt(r[0],r[1]).toString(B.enc.Utf8);break}case K.CUSTOM:t.callBackCacheKey&&(e=t.callBackCacheKey())}return e}encrypt(t,e){let r="";return t.encriptType===K.AUTO&&(r=B.AES.encrypt(JSON.stringify(e),this.getCacheKey(t)).toString()),r||e}decrypt(t,e){let r=null;return t.encriptType===K.AUTO&&(r=JSON.parse(B.AES.decrypt(e,this.getCacheKey(t)).toString(B.enc.Utf8))),r||e}getCacheApp(){return this.cacheApp}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:CacheUtility,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:CacheUtility,providedIn:"root"})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:CacheUtility,decorators:[{type:r,args:[{providedIn:"root"}]}],ctorParameters:()=>[]});let X=class CollectionUtils{static isEmpty(t){return null==t||0===t.length}static isNotEmpty(t){return!CollectionUtils.isEmpty(t)}static getFirst(t){if(!CollectionUtils.isEmpty(t))return t[0]}static getLast(t){if(!CollectionUtils.isEmpty(t))return t[t.length-1]}static concat(...t){const e=[];return t.forEach(t=>{CollectionUtils.isNotEmpty(t)&&e.push(...t)}),e}static filter(t,e){return CollectionUtils.isEmpty(t)?[]:t.filter(e)}static map(t,e){return CollectionUtils.isEmpty(t)?[]:t.map(e)}static reduce(t,e,r){return CollectionUtils.isEmpty(t)?r:t.reduce(e,r)}static forEach(t,e){CollectionUtils.isNotEmpty(t)&&t.forEach(e)}static contains(t,e){return!CollectionUtils.isEmpty(t)&&t.includes(e)}static exists(t,e){return!CollectionUtils.isEmpty(t)&&t.some(e)}static removeIf(t,e){if(CollectionUtils.isEmpty(t))return;const r=t.findIndex(e);return-1!==r?t.splice(r,1)[0]:void 0}static shallowCopy(t){return CollectionUtils.isEmpty(t)?[]:[...t]}};class StringUtils{static isEmpty(t){return null==t||0===t.length}static isBlank(t){return null==t||0===t.trim().length}static isNotEmpty(t){return!StringUtils.isEmpty(t)}static isNotBlank(t){return!StringUtils.isBlank(t)}static defaultString(t){return t??""}static defaultIfEmpty(t,e){return StringUtils.isEmpty(t)?e:t}static defaultIfBlank(t,e){return StringUtils.isBlank(t)?e:t}static trim(t){return StringUtils.defaultString(t).trim()}static capitalize(t){if(StringUtils.isBlank(t))return"";const e=t;return e.charAt(0).toUpperCase()+e.slice(1)}static uncapitalize(t){if(StringUtils.isBlank(t))return"";const e=t;return e.charAt(0).toLowerCase()+e.slice(1)}static equals(t,e){return t===e||null!=t&&null!=e&&t===e}static equalsIgnoreCase(t,e){return t===e||null!=t&&null!=e&&t.toLowerCase()===e.toLowerCase()}static contains(t,e){return!StringUtils.isEmpty(t)&&!StringUtils.isEmpty(e)&&t.includes(e)}static startsWith(t,e){return!StringUtils.isEmpty(t)&&!StringUtils.isEmpty(e)&&t.startsWith(e)}static endsWith(t,e){return!StringUtils.isEmpty(t)&&!StringUtils.isEmpty(e)&&t.endsWith(e)}static join(t,e=""){return X.isEmpty(t)?"":t.filter(t=>null!=t).join(e)}static repeat(t,e){return StringUtils.isEmpty(t)||e<1?"":t.repeat(e)}static countOccurrences(t,e){if(StringUtils.isEmpty(t)||StringUtils.isEmpty(e))return 0;const r=t,n=e;if(0===n.length)return r.length+1;let o=0,a=r.indexOf(n);for(;-1!==a;)o++,a=r.indexOf(n,a+n.length);return o}}class AuthUtility{requestHandler=new HttpRequestHandler({baseApiUrl:ConfigConst.BaseApi});constructor(){}getAuthorization(t){return this.requestHandler.get("auth/flow/"+t)}checkAuthAction(t,e){this.getAuthorization(t).send({next:t=>{StringUtils.equals(t.authorized,J.Ok)?e.authorize(t):e.unAuthorize&&e.unAuthorize(t)},error:t=>{e.unAuthorize&&e.unAuthorize(t)}})}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:AuthUtility,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:AuthUtility,providedIn:"root"})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:AuthUtility,decorators:[{type:r,args:[{providedIn:"root"}]}],ctorParameters:()=>[]});class BaseMolecule{static className="BaseMolecule";route=e(f);currentMolecule;I18nPath;constructor(){const t=this.route.snapshot.data,e=t.Molecules?.find(t=>t.Molecule.className===this.constructor.className);this.currentMolecule=e,this.I18nPath=e.I18nPath}baseCompViewEnter(){}baseCompViewLeave(){}baseMoleculeViewWillEnter(){}baseMoleculeViewWillLeave(){}getClassName(){return this.constructor.className}ngOnInit(){this.baseMoleculeViewWillEnter()}ngOnDestroy(){this.baseMoleculeViewWillLeave()}ionViewWillEnter(){this.baseMoleculeViewWillEnter()}ionViewWillLeave(){this.baseMoleculeViewWillLeave()}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:BaseMolecule,deps:[],target:t.ɵɵFactoryTarget.Directive});static ɵdir=t.ɵɵngDeclareDirective({minVersion:"14.0.0",version:"20.3.16",type:BaseMolecule,isStandalone:!0,ngImport:t})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:BaseMolecule,decorators:[{type:n}],ctorParameters:()=>[]});class BaseComponent{static className="BaseComponent";ChildrenRef;route=e(f);I18nPath;constructor(){const t=this.route.snapshot.data;this.I18nPath=t.Components?.find(t=>t.Component.className===this.constructor.className)?.I18nPath||t.I18nPath}ngOnInit(){this.baseCompViewEnter()}ngOnDestroy(){this.baseCompViewLeave()}ionViewWillEnter(){this.baseCompViewEnter()}ionViewWillLeave(){this.baseCompViewLeave()}baseCompViewEnter(){this.ChildrenRef&&this.ChildrenRef.length>0&&this.ChildrenRef.forEach(t=>t.baseCompViewEnter())}baseCompViewLeave(){this.ChildrenRef&&this.ChildrenRef.length>0&&this.ChildrenRef.forEach(t=>t.baseCompViewLeave())}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:BaseComponent,deps:[],target:t.ɵɵFactoryTarget.Directive});static ɵdir=t.ɵɵngDeclareDirective({minVersion:"14.0.0",version:"20.3.16",type:BaseComponent,isStandalone:!0,viewQueries:[{propertyName:"ChildrenRef",predicate:["ChildRef"],descendants:!0}],ngImport:t})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:BaseComponent,decorators:[{type:n}],ctorParameters:()=>[],propDecorators:{ChildrenRef:[{type:o,args:["ChildRef"]}]}});class CollectionUtils{static isEmpty(t){return!t||Array.isArray(t)&&0===t.length}static isNotEmpty(t){return!CollectionUtils.isEmpty(t)}}class StateService{static className="StateService";initialized=!1;containerRoot=[];conf;intervalId;intervalTime=1e3;registryMap=new Map;initialize(t){if(this.initialized)ConsoleLogsUtility.warning(this,"State service already initialized");else{ConsoleLogsUtility.info(this,"Initializing state service with config:",t),this.conf=t||{globalStateName:"default",encryptionType:StateConst.EncryptType.AES,nameType:StateConst.Generate.AUTO,keyType:StateConst.Generate.AUTO,asyncEnabled:!0};const e=sessionStorage.getItem(this.getStateName()),r=localStorage.getItem(this.getStateName());Q.isNotEmpty(e)&&(this.containerRoot.push(...JSON.parse(e)),ConsoleLogsUtility.debug(this,"Loaded session data from storage")),Q.isNotEmpty(r)&&(this.containerRoot.push(...JSON.parse(r)),ConsoleLogsUtility.debug(this,"Loaded persistent data from storage")),this.cleanUp(),this.conf.asyncEnabled&&(this.intervalId=setInterval(()=>{this.updateDataSetToStorage(!1,!1)},this.intervalTime)),this.initialized=!0,ConsoleLogsUtility.info(this,"State service initialized successfully")}}cleanUp(){this.updateDataSetToStorage(!0,!0)}updateDataSetToStorage(t=!1,e=!1){if(t&&CollectionUtils.isNotEmpty(this.containerRoot)){const t=this.containerRoot.length;this.containerRoot=this.containerRoot.filter(t=>t.globalStateName===this.conf.globalStateName),t!==this.containerRoot.length&&ConsoleLogsUtility.error(this,"ASOR State Management: Mismatched global state name clean-up")}const r=this.containerRoot.filter(t=>t.storeType===StateConst.StoreType.SESSION),n=this.containerRoot.filter(t=>t.storeType===StateConst.StoreType.LOCAL);CollectionUtils.isNotEmpty(r)?sessionStorage.setItem(this.getStateName(),JSON.stringify(r)):e&&sessionStorage.removeItem(this.getStateName()),CollectionUtils.isNotEmpty(n)?localStorage.setItem(this.getStateName(),JSON.stringify(n)):e&&localStorage.removeItem(this.getStateName())}async delegateCheckStoreDataSet(){this.conf.asyncEnabled||this.updateDataSetToStorage(!1,!1)}createDataSet(t,e,r){if(!e)return ConsoleLogsUtility.warning(this,`Cannot create dataset "${t}": data is empty`),!1;if(CollectionUtils.isNotEmpty(this.containerRoot)&&Q.isNotEmpty(t)){const e=this.containerRoot.find(e=>e.name===t);if(ObjectUtils.isNotEmpty(e))return ConsoleLogsUtility.warning(this,`Dataset "${t}" already exists. Load current data from storage`),!1}let n=e;r.encrypt&&(n=this.encrypt(e),ConsoleLogsUtility.debug(this,`Dataset "${t}" will be encrypted`));const o={name:t,globalStateName:this.conf.globalStateName,encrypt:!!r.encrypt,storeType:r.storeType||StateConst.StoreType.SESSION,freeze:!!r.freeze,data:n,lastUpdate:(new Date).getTime(),readCount:0,writeCount:0};return r.freeze&&ConsoleLogsUtility.warning(this,`Dataset "${t}" frozen`),this.containerRoot.push(o),this.delegateCheckStoreDataSet(),ConsoleLogsUtility.info(this,`Dataset "${t}" created successfully`,{storeType:o.storeType,encrypted:o.encrypt}),!0}readDataSet(t){let e=t.split("."),r=null;if(CollectionUtils.isNotEmpty(this.containerRoot))try{if(Array.isArray(e)){const n=this.containerRoot.find(t=>t.name===e[0]);if(ObjectUtils.isNotEmpty(n)){r=n.encrypt?this.decrypt(n.data):n.data;for(let t=1;t<e.length;t++)r=r[e[t]];n.readCount++}else ConsoleLogsUtility.warning(this,`Dataset "${e[0]}" not found for path: ${t}`)}}catch(e){ConsoleLogsUtility.error(this,`Error reading dataset at path: ${t}`,e)}return r}updateDataSet(t,e,r){let n=t.split("."),o=!1;try{if(Array.isArray(n)&&CollectionUtils.isNotEmpty(this.containerRoot)&&Q.isNotEmpty(n[0])){const a=this.containerRoot.find(t=>t.name===n[0]);if(ObjectUtils.isNotEmpty(a)){if(a.freeze)return ConsoleLogsUtility.warning(this,`Cannot update frozen dataset at path: ${t}`),!1;let s=a.encrypt?this.decrypt(a.data):a.data;if(s){let i=s,l=!1;for(let t=1;t<n.length-1;t++)i=i[n[t]];if(ObjectUtils.isNotEmpty(r))switch(r.method){case StateConst.Data.REPLACE:i[n[n.length-1]]=e,l=!0,ConsoleLogsUtility.debug(this,`Replace method used for path: ${t}`);break;case StateConst.Data.MERGE:if(ObjectUtils.isObject(i[n[n.length-1]])&&ObjectUtils.isObject(e)){const r={...i[n[n.length-1]],...e};i[n[n.length-1]]=r,l=!0,ConsoleLogsUtility.debug(this,`Merge method used for path: ${t}`)}}l||(i[n[n.length-1]]=e),a.data=a.encrypt?this.encrypt(s):s,o=!0,a.writeCount++,this.delegateCheckStoreDataSet(),this.triggerChange(t)}}else ConsoleLogsUtility.warning(this,`Dataset "${n[0]}" not found for update at path: ${t}`)}}catch(e){ConsoleLogsUtility.error(this,`Error updating dataset at path: ${t}`,e)}return o}triggerChange(t){if(!t)return;let e=t;for(;e;){let r=!1;const n=new Set;if(this.registryMap.forEach((o,a)=>{const s=a.match(/\[([^\]]+)\]<([^>]+)>;(.+)/);if(s){const[,a,i,l]=s;if(-1!==l.indexOf(e)&&(r=!0,!n.has(a))){n.add(a);const e={[t.split(".")[0]]:{[i]:this.readDataSet(l)}};o.propsIsUpdated(e)}}}),r)break;const o=e.lastIndexOf(".");if(-1===o)break;e=e.substring(0,o)}}deleteRootDataSet(t){if(Q.isString(t)&&Q.isNotEmpty(t)&&CollectionUtils.isNotEmpty(this.containerRoot)){const e=this.containerRoot.find(e=>e.name===t);if(e){const r=this.containerRoot.indexOf(e);this.containerRoot.splice(r,1),this.updateDataSetToStorage(!1,!0),ConsoleLogsUtility.info(this,`Dataset "${t}" deleted successfully`)}else ConsoleLogsUtility.warning(this,`Dataset "${t}" not found for deletion`)}}getStateName(){let t="";switch(this.conf.nameType){case StateConst.Generate.AUTO:t=B.MD5(StateConst.Cookie.STATE).toString();break;case StateConst.Generate.CUSTOM:this.conf.callBackStateName&&(t=this.conf.callBackStateName())}return t}getStateKey(){let t="";switch(this.conf.keyType){case StateConst.Generate.AUTO:{const e=B.MD5(StateConst.Cookie.STATE_KEY).toString();if(Q.isEmpty(CookieUtils.read(e))){const t=RandomUtils.makeid(StateConst.CMPLX12)+(new Date).getTime(),r=RandomUtils.makeid(StateConst.CMPLX6)+(new Date).getTime(),n=B.AES.encrypt(t,r).toString()+"."+r;CookieUtils.add(e,n,StateConst.Cookie.STATE_KEY_EXPIRE)}const r=CookieUtils.read(e).split(".");t=B.AES.decrypt(r[0],r[1]).toString(B.enc.Utf8);break}case StateConst.Generate.CUSTOM:this.conf.callBackStateKey&&(t=this.conf.callBackStateKey())}return t}encrypt(t){let e="";return this.conf.encryptionType===StateConst.EncryptType.AES&&(e=B.AES.encrypt(JSON.stringify(t),this.getStateKey()).toString()),e}decrypt(t){let e=null;return this.conf.encryptionType===StateConst.EncryptType.AES&&(e=JSON.parse(B.AES.decrypt(t,this.getStateKey()).toString(B.enc.Utf8))),e}registry(t,e,r){ConsoleLogsUtility.debug(this,`Registering component "${t}" with props:`,e);const n={};return Object.entries(e).forEach(([e,o])=>{let a=`[${t}]<${e}>;${o}`,s=1;for(;this.registryMap.has(a);)a=`[${t}(${s++})]<${e}>;${o}`;this.registryMap.set(a,{propsIsUpdated:r}),n[a]=()=>this.registryMap.delete(a)}),{componentName:t,destroy:()=>{ConsoleLogsUtility.debug(this,`Destroying mapped keys for component "${t}"`),Object.entries(n).forEach(([t,e])=>{e&&e()})}}}resolveProps(t){const e={};Object.entries(t).forEach(([t,r])=>{const n=r.split(".")[0];e[n]||(e[n]=[]),e[n].push({key:t,path:r})});const r={};return Object.entries(e).forEach(([t,e])=>{r[t]={},e.forEach(({key:e,path:n})=>{r[t][e]=this.readDataSet(n)})}),ObjectUtils.cloneDeep(r)}ngOnDestroy(){this.intervalId&&clearInterval(this.intervalId)}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:StateService,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:StateService,providedIn:"root"})}function BaseHandlerMixin(t){return class StorageHandlerMixinClass extends t{propsStore={};stateService=e(StateService);activatedRoute=e(f);registryElement;constructor(...t){super(...t);const e=this.activatedRoute.snapshot.data;e?.CreateDataSet&&this.stateService.createDataSet(e.CreateDataSet.name,e.CreateDataSet.data||{},e.CreateDataSet.option||{});const r=e.Components?.find(t=>t.Component.className===this.constructor.className)?.ConnectDataSet||e.Molecules?.find(t=>t.Molecule.className===this.constructor.className)?.ConnectDataSet||e.ConnectDataSet;if(r){const t=r?.selectors||{};this.registryElement=this.stateService.registry(this.getClassName(),t,t=>{const e=this.copyPropsStore(t),deepMerge=(t,e)=>{for(const r in e)e.hasOwnProperty(r)&&(e[r]&&"object"==typeof e[r]&&!Array.isArray(e[r])?(t[r]&&"object"==typeof t[r]||(t[r]={}),deepMerge(t[r],e[r])):t[r]=e[r])};deepMerge(this.propsStore,e),this.storageHandlerDataChanges&&this.storageHandlerDataChanges({},{})}),this.propsStore=createReactiveProxy(this.stateService.resolveProps(t),(t,e,r)=>{this.onPropsStoreChange(t,e,r)})}}onPropsStoreChange(t,e,r){ConsoleLogsUtility.debug(this,`Property changed: ${t}`,{from:r,to:e}),this.stateService.updateDataSet(t,e)||ConsoleLogsUtility.warning(this,`Failed to update state for path: ${t}`)}getClassName(){return this.constructor.className}copyPropsStore(t){return JSON.parse(JSON.stringify(t))}}}function deepEqual(t,e){if(t===e)return!0;if(null==t||null==e)return!1;if(typeof t!=typeof e)return!1;if("object"!=typeof t)return!1;const r=Array.isArray(t);if(r!==Array.isArray(e))return!1;if(r){if(t.length!==e.length)return!1;for(let r=0;r<t.length;r++)if(!deepEqual(t[r],e[r]))return!1;return!0}const n=Object.keys(t),o=Object.keys(e);if(n.length!==o.length)return!1;for(const r of n){if(!e.hasOwnProperty(r))return!1;if(!deepEqual(t[r],e[r]))return!1}return!0}function createReactiveProxy(t,e,r=""){const n=new Map,o=["push","pop","shift","unshift","splice","sort","reverse","fill","copyWithin"];return new Proxy(t,{get(t,a){const s=t[a];if("symbol"==typeof a)return s;const i=String(a),l=r?`${r}.${i}`:i;if(Array.isArray(t)&&"function"==typeof s&&o.includes(i))return(...o)=>{const a=t.map(t=>t&&"object"==typeof t?{...t}:t),s=Array.prototype[i].apply(t,o);n.clear();const l=[...t];return deepEqual(a,l)||e(r,l,a),s};if(null===s||"object"!=typeof s)return s;const c=n.get(i);if(c&&c.rawValue===s)return c.proxy;const d=createReactiveProxy(s,e,l);return n.set(i,{rawValue:s,proxy:d}),d},set(t,o,a){const s=String(o),i=r?`${r}.${s}`:s,l=t[o];return deepEqual(l,a)||(n.delete(s),t[o]=a,e(i,a,l)),!0},deleteProperty(t,o){if(o in t){const a=String(o),s=r?`${r}.${a}`:a,i=t[o];n.delete(a),delete t[o],e(s,void 0,i)}return!0}})}function createFlattenedReactiveProxy(t){return new Proxy({},{get(e,r){if("symbol"==typeof r)return;const n=String(r);for(const e of Object.keys(t)){const r=t[e];if(r&&"object"==typeof r&&n in r)return r[n]}},set(e,r,n){if("symbol"==typeof r)return!1;const o=String(r);for(const e of Object.keys(t)){const r=t[e];if(r&&"object"==typeof r&&o in r)return r[o]=n,!0}return!1},has(e,r){if("symbol"==typeof r)return!1;const n=String(r);for(const e of Object.keys(t)){const r=t[e];if(r&&"object"==typeof r&&n in r)return!0}return!1},ownKeys(){const e=[];for(const r of Object.keys(t)){const n=t[r];n&&"object"==typeof n&&e.push(...Object.keys(n))}return e},getOwnPropertyDescriptor(e,r){if("symbol"==typeof r)return;const n=String(r);for(const e of Object.keys(t)){const r=t[e];if(r&&"object"==typeof r&&n in r)return{configurable:!0,enumerable:!0,writable:!0,value:r[n]}}},deleteProperty(e,r){if("symbol"==typeof r)return!1;const n=String(r);for(const e of Object.keys(t)){const r=t[e];if(r&&"object"==typeof r&&n in r)return delete r[n],!0}return!1}})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:StateService,decorators:[{type:r,args:[{providedIn:"root"}]}]});class BaseStorageComponent extends(BaseHandlerMixin(BaseComponent)){get props(){return createFlattenedReactiveProxy(this.propsStore)}baseCompViewLeave(){this.registryElement?.destroy(),super.baseCompViewLeave()}constructor(){super()}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:BaseStorageComponent,deps:[],target:t.ɵɵFactoryTarget.Directive});static ɵdir=t.ɵɵngDeclareDirective({minVersion:"14.0.0",version:"20.3.16",type:BaseStorageComponent,isStandalone:!0,usesInheritance:!0,ngImport:t})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:BaseStorageComponent,decorators:[{type:n}],ctorParameters:()=>[]});class BaseStorageMolecule extends(BaseHandlerMixin(BaseMolecule)){get props(){return createFlattenedReactiveProxy(this.propsStore)}baseCompViewLeave(){this.registryElement?.destroy()}baseMoleculeViewWillLeave(){this.registryElement?.destroy()}constructor(){super()}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:BaseStorageMolecule,deps:[],target:t.ɵɵFactoryTarget.Directive});static ɵdir=t.ɵɵngDeclareDirective({minVersion:"14.0.0",version:"20.3.16",type:BaseStorageMolecule,isStandalone:!0,usesInheritance:!0,ngImport:t})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:BaseStorageMolecule,decorators:[{type:n}],ctorParameters:()=>[]});class NotifyErrorService{static className="NotifyErrorService";dataSubject=new S(null);dataSub=this.dataSubject.asObservable();sub=new Map;send(t){ConsoleLogsUtility.debug(this,`Broadcasting error: ${t.status}`,t),this.dataSubject.next(t)}registry(t,e){ConsoleLogsUtility.debug(this,`Registering subscriber: ${t}`);const r=this.sub.get(t);r&&r.unsubscribe();const n=this.dataSub.subscribe(t=>{t&&e(t.status,t.error)});this.sub.set(t,n)}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:NotifyErrorService,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:NotifyErrorService,providedIn:"root"})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:NotifyErrorService,decorators:[{type:r,args:[{providedIn:"root"}]}]});class MockOrchestratorService{get requestMappings(){return MockOrchestratorMapService.staticRequestMappings}intercept(t,e){for(const[r,n]of this.requestMappings)if(StringUtils.equals(t.url,r.path)&&t.method==r.method){const o=n.value.apply(r.controller,[t,e]);return o&&StringUtils.equals(o.name,"HttpErrorResponse")?j(()=>o):o instanceof Promise?I(o):o instanceof O?o:C(o)}return e.handle(t)}registryController(t,e){for(const[r]of this.requestMappings)-1!=t.indexOf(r.className)&&(r.controller=e)}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:MockOrchestratorService,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:MockOrchestratorService,providedIn:"root"})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:MockOrchestratorService,decorators:[{type:r,args:[{providedIn:"root"}]}]});class AuthGuard{static className="AuthGuard";routingUtility=e(RoutingUtility);authUtility=e(AuthUtility);injector=e(a);canActivate(t,r){const n=t.data;return n.ChildGuard?this.executeAuthCheck(n).pipe(L(o=>o?s(this.injector,()=>{const o=e(n.ChildGuard);return this.normalizeGuardResult(o.canActivate(t,r))}):C(!1))):this.executeAuthCheck(n)}executeAuthCheck(t){return ConsoleLogsUtility.info(this,"AuthGuard checking route",t),t.AuthCheck?this.authUtility.getAuthorization(t.AuthCheck).obs().pipe(N(e=>(ConsoleLogsUtility.debug(this,`Auth result for ${t.AuthCheck}`,e),!!StringUtils.equals(e.authorized,J.Ok)||(StringUtils.equals(e.authorized,J.NotAllow)?(ConsoleLogsUtility.info(this,"Redirecting to UNAUTHORIZED due to NotAllow status"),this.routingUtility.navigate(ConfigConst.Url.UNAUTHORIZED,{}),!1):(ConsoleLogsUtility.info(this,"Redirecting to LOGIN due to missing/expired auth"),this.routingUtility.navigate(ConfigConst.Url.LOGIN,{}),!1))))):C(!0)}normalizeGuardResult(t){return"object"==typeof t&&"redirectTo"in t||t instanceof x?C(t):t instanceof Promise?I(t):T(t)?t:C(t)}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:AuthGuard,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:AuthGuard,providedIn:"root"})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:AuthGuard,decorators:[{type:r,args:[{providedIn:"root"}]}]});class ErrorInterceptor{static className="ErrorInterceptor";notifyErrorService=e(NotifyErrorService);intercept(t,e){return e.handle(t).pipe(U(e=>(ConsoleLogsUtility.error(this,`HTTP Error ${e.status} at ${t.urlWithParams}: ${e.message}`,e),this.notifyErrorService.send(e),j(e))))}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:ErrorInterceptor,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:ErrorInterceptor})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:ErrorInterceptor,decorators:[{type:r}]});class CacheInterceptor{static className="CacheInterceptor";cacheUtility=e(CacheUtility);intercept(t,e){const r=this.cacheUtility.get(t);return r?(ConsoleLogsUtility.info(this,`Serving from cache: ${t.urlWithParams}`),C(r)):e.handle(t).pipe(z(e=>{e instanceof V&&this.cacheUtility.pass(t,e)&&(ConsoleLogsUtility.debug(this,`Caching response for ${t.urlWithParams}`),this.cacheUtility.set(t,e))}))}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:CacheInterceptor,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:CacheInterceptor})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:CacheInterceptor,decorators:[{type:r}]});class MockHttpInterceptor{orchestratorService=e(MockOrchestratorService);intercept(t,e){return this.orchestratorService.intercept(t,e)}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:MockHttpInterceptor,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:MockHttpInterceptor})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:MockHttpInterceptor,decorators:[{type:r}]});class TranslatePipe{translateUtility=e(TranslateUtility);changeDetectorRef=e(i);lastKey="";translatedValue="";subscription=null;context;constructor(){}transform(t,e=ConfigConst.TranslationUrl.DefaultLanguage){return t!==this.lastKey&&(this.lastKey=t,this.subscription?.unsubscribe(),this.context=this.changeDetectorRef.context,this.subscription=this.translateUtility.getTranslation$(t,this.context?.I18nPath,e).subscribe(t=>{this.translatedValue=t,this.changeDetectorRef.markForCheck()})),this.decodeHtmlEntities(this.translatedValue)||t}decodeHtmlEntities(t){const e=document.createElement("textarea");e.innerHTML=t;const r=e.value;return e.remove(),r}ngOnDestroy(){this.subscription?.unsubscribe()}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:TranslatePipe,deps:[],target:t.ɵɵFactoryTarget.Pipe});static ɵpipe=t.ɵɵngDeclarePipe({minVersion:"14.0.0",version:"20.3.16",ngImport:t,type:TranslatePipe,isStandalone:!0,name:"translate",pure:!1})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:TranslatePipe,decorators:[{type:l,args:[{name:"translate",standalone:!0,pure:!1}]}],ctorParameters:()=>[]});class JsonViewComponent{data;key=null;level=0;expandDepth=0;expanded=!1;ngOnInit(){this.level<this.expandDepth&&(this.expanded=!0)}togglebox(){this.expanded=!this.expanded}isObject(t){return null!==t&&"object"==typeof t}isArray(t){return Array.isArray(t)}isString(t){return"string"==typeof t}getKeys(t){return t?Object.keys(t):[]}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:JsonViewComponent,deps:[],target:t.ɵɵFactoryTarget.Component});static ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"20.3.16",type:JsonViewComponent,isStandalone:!0,selector:"asor-json-view",inputs:{data:"data",key:"key",level:"level",expandDepth:"expandDepth"},ngImport:t,template:'<div class="json-node" [style.padding-left.px]="level * 10">\r\n\t\x3c!-- Primitive Value or Null --\x3e\r\n\t<ng-container *ngIf="!isObject(data)">\r\n\t\t<span class="json-key" *ngIf="key">{{ key }}: </span>\r\n\t\t<span\r\n\t\t\tclass="json-value"\r\n\t\t\t[ngClass]="{\r\n\t\t\t\tnull: data === null,\r\n\t\t\t\tstring: isString(data),\r\n\t\t\t\tother: !isString(data) && data !== null,\r\n\t\t\t}"\r\n\t\t>\r\n\t\t\t{{ data | json }}\r\n\t\t</span>\r\n\t</ng-container>\r\n\r\n\t\x3c!-- Object or Array --\x3e\r\n\t<ng-container *ngIf="isObject(data)">\r\n\t\t<div class="json-expandable" (click)="togglebox()">\r\n\t\t\t<span class="toggle-icon">{{ expanded ? \'▼\' : \'▶\' }}</span>\r\n\t\t\t<span class="json-key" *ngIf="key">{{ key }}: </span>\r\n\t\t\t<span class="json-preview" *ngIf="!isArray(data)"> Object </span>\r\n\t\t\t<span class="json-preview" *ngIf="isArray(data)"> Array({{ data.length }}) </span>\r\n\t\t</div>\r\n\r\n\t\t<div class="json-children" *ngIf="expanded">\r\n\t\t\t<ng-container *ngIf="!isArray(data)">\r\n\t\t\t\t<div class="json-property" *ngFor="let k of getKeys(data)">\r\n\t\t\t\t\t<asor-json-view\r\n\t\t\t\t\t\t[data]="data[k]"\r\n\t\t\t\t\t\t[key]="k"\r\n\t\t\t\t\t\t[level]="level + 1"\r\n\t\t\t\t\t\t[expandDepth]="expandDepth"\r\n\t\t\t\t\t></asor-json-view>\r\n\t\t\t\t</div>\r\n\t\t\t</ng-container>\r\n\t\t\t<ng-container *ngIf="isArray(data)">\r\n\t\t\t\t<div class="json-property" *ngFor="let item of data; let i = index">\r\n\t\t\t\t\t<asor-json-view\r\n\t\t\t\t\t\t[data]="item"\r\n\t\t\t\t\t\t[key]="\'\' + i"\r\n\t\t\t\t\t\t[level]="level + 1"\r\n\t\t\t\t\t\t[expandDepth]="expandDepth"\r\n\t\t\t\t\t></asor-json-view>\r\n\t\t\t\t</div>\r\n\t\t\t</ng-container>\r\n\t\t</div>\r\n\t</ng-container>\r\n</div>\r\n',styles:[".json-node{font-family:Consolas,Monaco,Courier New,monospace;font-size:13px;line-height:1.5;color:#d4d4d4}.json-key{color:#9cdcfe}.json-value.string{color:#ce9178}.json-value.null{color:#569cd6}.json-value.other{color:#b5cea8}.json-expandable{cursor:pointer;display:flex;align-items:center}.json-expandable:hover{background-color:#ffffff0d}.toggle-icon{font-size:10px;margin-right:5px;color:#858585;width:12px;text-align:center}.json-preview{color:#858585;font-style:italic}\n"],dependencies:[{kind:"component",type:JsonViewComponent,selector:"asor-json-view",inputs:["data","key","level","expandDepth"]},{kind:"ngmodule",type:w},{kind:"directive",type:m.NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:m.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:m.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"pipe",type:m.JsonPipe,name:"json"}],encapsulation:t.ViewEncapsulation.None})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:JsonViewComponent,decorators:[{type:p,args:[{selector:"asor-json-view",standalone:!0,imports:[w,JsonViewComponent],encapsulation:d.None,template:'<div class="json-node" [style.padding-left.px]="level * 10">\r\n\t\x3c!-- Primitive Value or Null --\x3e\r\n\t<ng-container *ngIf="!isObject(data)">\r\n\t\t<span class="json-key" *ngIf="key">{{ key }}: </span>\r\n\t\t<span\r\n\t\t\tclass="json-value"\r\n\t\t\t[ngClass]="{\r\n\t\t\t\tnull: data === null,\r\n\t\t\t\tstring: isString(data),\r\n\t\t\t\tother: !isString(data) && data !== null,\r\n\t\t\t}"\r\n\t\t>\r\n\t\t\t{{ data | json }}\r\n\t\t</span>\r\n\t</ng-container>\r\n\r\n\t\x3c!-- Object or Array --\x3e\r\n\t<ng-container *ngIf="isObject(data)">\r\n\t\t<div class="json-expandable" (click)="togglebox()">\r\n\t\t\t<span class="toggle-icon">{{ expanded ? \'▼\' : \'▶\' }}</span>\r\n\t\t\t<span class="json-key" *ngIf="key">{{ key }}: </span>\r\n\t\t\t<span class="json-preview" *ngIf="!isArray(data)"> Object </span>\r\n\t\t\t<span class="json-preview" *ngIf="isArray(data)"> Array({{ data.length }}) </span>\r\n\t\t</div>\r\n\r\n\t\t<div class="json-children" *ngIf="expanded">\r\n\t\t\t<ng-container *ngIf="!isArray(data)">\r\n\t\t\t\t<div class="json-property" *ngFor="let k of getKeys(data)">\r\n\t\t\t\t\t<asor-json-view\r\n\t\t\t\t\t\t[data]="data[k]"\r\n\t\t\t\t\t\t[key]="k"\r\n\t\t\t\t\t\t[level]="level + 1"\r\n\t\t\t\t\t\t[expandDepth]="expandDepth"\r\n\t\t\t\t\t></asor-json-view>\r\n\t\t\t\t</div>\r\n\t\t\t</ng-container>\r\n\t\t\t<ng-container *ngIf="isArray(data)">\r\n\t\t\t\t<div class="json-property" *ngFor="let item of data; let i = index">\r\n\t\t\t\t\t<asor-json-view\r\n\t\t\t\t\t\t[data]="item"\r\n\t\t\t\t\t\t[key]="\'\' + i"\r\n\t\t\t\t\t\t[level]="level + 1"\r\n\t\t\t\t\t\t[expandDepth]="expandDepth"\r\n\t\t\t\t\t></asor-json-view>\r\n\t\t\t\t</div>\r\n\t\t\t</ng-container>\r\n\t\t</div>\r\n\t</ng-container>\r\n</div>\r\n',styles:[".json-node{font-family:Consolas,Monaco,Courier New,monospace;font-size:13px;line-height:1.5;color:#d4d4d4}.json-key{color:#9cdcfe}.json-value.string{color:#ce9178}.json-value.null{color:#569cd6}.json-value.other{color:#b5cea8}.json-expandable{cursor:pointer;display:flex;align-items:center}.json-expandable:hover{background-color:#ffffff0d}.toggle-icon{font-size:10px;margin-right:5px;color:#858585;width:12px;text-align:center}.json-preview{color:#858585;font-style:italic}\n"]}]}],propDecorators:{data:[{type:c}],key:[{type:c}],level:[{type:c}],expandDepth:[{type:c}]}});class ConsoleTabComponent{cdr;static className="ConsoleTabComponent";logsContainer;shouldScrollToBottom=!0;availableLevels=["ALL","INFO","DEBUG","WARNING","ERROR"];logs=[];logSub;inspectedObject=null;inspectedObjectMethods=[];inspectedLog=null;constructor(t){this.cdr=t}newClassName="";newClassLevels={};openDropdownClass=null;dropdownTop=0;dropdownLeft=0;selectedConfig=null;mobileExpandedSection=null;searchTerm="";selectedLevels=new Set;get filteredLogs(){let t=this.logs;if(this.selectedLevels.size>0&&(t=t.filter(t=>this.selectedLevels.has(t.level))),!this.searchTerm.trim())return t;const e=this.searchTerm.toLowerCase();return t.filter(t=>t.message.toLowerCase().includes(e)||t.className.toLowerCase().includes(e)||t.level.toLowerCase().includes(e)||t.params&&JSON.stringify(t.params).toLowerCase().includes(e))}get logCounts(){const t={};return this.availableLevels.forEach(e=>{"ALL"!==e&&(t[e]=0)}),this.logs.forEach(e=>{void 0!==t[e.level]?t[e.level]++:t[e.level]=(t[e.level]||0)+1}),t}getClassLogCount(t){return this.logs.filter(e=>e.className===t).length}filterByLevel(t){this.selectedLevels.has(t)?this.selectedLevels.delete(t):this.selectedLevels.add(t)}ngOnInit(){this.logSub=ConsoleLogsUtility.logStream$.subscribe(t=>{this.logs.push(t),this.logs.length>500&&this.logs.shift(),this.shouldScrollToBottom&&(this.cdr.detectChanges(),this.scrollToBottom())}),this.mobileExpandedSection="logs"}ngAfterViewInit(){this.shouldScrollToBottom&&this.scrollToBottom()}scrollToBottom(){try{this.logsContainer&&this.logsContainer.nativeElement&&(this.logsContainer.nativeElement.scrollTop=this.logsContainer.nativeElement.scrollHeight)}catch(t){}}onLogScroll(){const t=this.logsContainer.nativeElement;this.shouldScrollToBottom=t.scrollHeight-t.scrollTop<=t.clientHeight+20}ngOnDestroy(){this.logSub&&this.logSub.unsubscribe()}toggleSection(t){this.mobileExpandedSection=this.mobileExpandedSection===t?null:t}get classConfigs(){return ConsoleLogsConfig.classConfigs}get defaultLevels(){return ConsoleLogsConfig.defaultLevels}toggleSlider(){}clearLogs(){this.logs=[]}inspectObject(t,e){this.inspectedObject=t,this.inspectedLog=e||null,this.inspectedObjectMethods=this.getPrototypeMethods(t)}closeInspector(){this.inspectedObject=null,this.inspectedObjectMethods=[],this.inspectedLog=null,this.replResult=null,this.replError=null,this.hasReplResult=!1}executionCode="";replResult=null;replError=null;hasReplResult=!1;appendToRepl(t){const e=`state.${t}()`;this.executionCode.trim()?this.executionCode+="\n"+e:this.executionCode=e}executeSnippet(){if(this.inspectedObject&&this.executionCode.trim()){this.replResult=null,this.replError=null,this.hasReplResult=!1;try{const t=this.safeEvaluate(this.executionCode,this.inspectedObject);this.replResult=t,this.hasReplResult=!0,ConsoleLogsUtility.info(this,"REPL Execution",{code:this.executionCode,result:t})}catch(t){this.replError=t.message||t,ConsoleLogsUtility.error(this,"REPL Error",t)}}}safeEvaluate(t,e){const r=t.split("\n").filter(t=>t.trim());let n;for(const t of r){let r=e,o=t.trim().replace(/^state\.?/,"").replace(/;$/,"");if(!o){n=r;continue}const a=o.split(".");for(const t of a){if(null==r)break;if(t.endsWith("()")){const e=t.slice(0,-2);if("function"!=typeof r[e])throw new Error(`'${e}' is not a function`);r=r[e]()}else r=r[t]}n=r}return n}isObject(t){return null!==t&&"object"==typeof t}getPrototypeMethods(t){if(null===t||"object"!=typeof t)return[];const e=[];let r=t;for(;r&&r!==Object.prototype;)Object.getOwnPropertyNames(r).forEach(t=>{Object.getOwnPropertyDescriptor(r,t),"function"!=typeof r[t]||"constructor"===t||t.startsWith("_")||e.includes(t)||e.push(t)}),r=Object.getPrototypeOf(r);return e.sort()}isLevelEnabled(t,e){return t.levels.includes(e)}updateClassLevel(t,e,r){const n=r.target.checked,o=this.classConfigs.find(e=>e.className===t);if(!o)return;let a=[...o.levels];n?a.includes(e)||a.push(e):a=a.filter(t=>t!==e),ConsoleLogsConfig.setClassLevels(t,a)}removeClass(t){ConsoleLogsConfig.removeClassConfig(t)}toggleDropdown(t,e){e.stopPropagation();const r=t.className;if(this.openDropdownClass===r)return this.openDropdownClass=null,void(this.selectedConfig=null);this.openDropdownClass=r,this.selectedConfig=t;const n=e.currentTarget.getBoundingClientRect();this.dropdownTop=n.bottom+5,this.dropdownLeft=n.left}closeDropdown(){this.openDropdownClass=null,this.selectedConfig=null}getSelectedLevelsLabel(t){return t.levels.length===this.availableLevels.length?"ALL":0===t.levels.length?"None":t.levels.sort((t,e)=>this.availableLevels.indexOf(t)-this.availableLevels.indexOf(e)).join(", ")}toggleNewClassDropdown(t){if(t.stopPropagation(),"__NEW__"===this.openDropdownClass)return void this.closeDropdown();this.openDropdownClass="__NEW__",this.selectedConfig=null;const e=t.currentTarget.getBoundingClientRect();this.dropdownTop=e.bottom+5,this.dropdownLeft=e.left}updateNewClassLevel(t,e){this.newClassLevels[t]=e.target.checked}getNewClassLevelsLabel(){const t=this.availableLevels.filter(t=>this.newClassLevels[t]);return t.length===this.availableLevels.length?"ALL":0===t.length?"None":t.join(", ")}addNewClass(){if(!this.newClassName.trim())return;const t=[];this.availableLevels.forEach(e=>{this.newClassLevels[e]&&t.push(e)}),ConsoleLogsConfig.setClassLevels(this.newClassName.trim(),t),this.newClassName="",this.newClassLevels={}}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:ConsoleTabComponent,deps:[{token:t.ChangeDetectorRef}],target:t.ɵɵFactoryTarget.Component});static ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"20.3.16",type:ConsoleTabComponent,isStandalone:!0,selector:"asor-console-tab",viewQueries:[{propertyName:"logsContainer",first:!0,predicate:["logsContainer"],descendants:!0}],ngImport:t,template:'<div class="console-tab-container">\r\n\t\x3c!-- Transparent backdrop to close dropdowns --\x3e\r\n\t<div class="dropdown-backdrop" *ngIf="openDropdownClass" (click)="closeDropdown()"></div>\r\n\r\n\t\x3c!-- Root Dropdown Menu --\x3e\r\n\t<div\r\n\t\tclass="dropdown-menu fixed-dropdown"\r\n\t\t*ngIf="openDropdownClass && (selectedConfig || openDropdownClass === \'__NEW__\')"\r\n\t\t[style.top.px]="dropdownTop"\r\n\t\t[style.left.px]="dropdownLeft"\r\n\t\t(click)="$event.stopPropagation()"\r\n\t>\r\n\t\t\x3c!-- Existing Class Mode --\x3e\r\n\t\t<ng-container *ngIf="selectedConfig">\r\n\t\t\t<label class="level-check-item" *ngFor="let level of availableLevels">\r\n\t\t\t\t<input\r\n\t\t\t\t\t[checked]="isLevelEnabled(selectedConfig, level)"\r\n\t\t\t\t\t(change)="updateClassLevel(selectedConfig.className, level, $event)"\r\n\t\t\t\t\ttype="checkbox"\r\n\t\t\t\t/>\r\n\t\t\t\t{{ level }}\r\n\t\t\t</label>\r\n\t\t</ng-container>\r\n\r\n\t\t\x3c!-- New Class Mode --\x3e\r\n\t\t<ng-container *ngIf="openDropdownClass === \'__NEW__\'">\r\n\t\t\t<label class="level-check-item" *ngFor="let level of availableLevels">\r\n\t\t\t\t<input\r\n\t\t\t\t\t[checked]="newClassLevels[level]"\r\n\t\t\t\t\t(change)="updateNewClassLevel(level, $event)"\r\n\t\t\t\t\ttype="checkbox"\r\n\t\t\t\t/>\r\n\t\t\t\t{{ level }}\r\n\t\t\t</label>\r\n\t\t</ng-container>\r\n\t</div>\r\n\r\n\t<div class="console-grid">\r\n\t\t\x3c!-- LEFT TILE: Configuration --\x3e\r\n\t\t<div\r\n\t\t\tclass="tile config-tile"\r\n\t\t\t[class.expanded]="mobileExpandedSection === \'config\'"\r\n\t\t\t[class.collapsed]="mobileExpandedSection === \'logs\'"\r\n\t\t>\r\n\t\t\t<div class="tile-header">\r\n\t\t\t\t<div class="header-title-group">\r\n\t\t\t\t\t<button\r\n\t\t\t\t\t\tclass="icon-btn expand-btn"\r\n\t\t\t\t\t\t(click)="toggleSection(\'config\')"\r\n\t\t\t\t\t\ttitle="{{ mobileExpandedSection === \'config\' ? \'Collapse\' : \'Expand\' }}"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ mobileExpandedSection === \'config\' ? \'▼\' : \'►\' }}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<h4>Configuration</h4>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<div class="console-summary" *ngIf="mobileExpandedSection !== \'config\'">\r\n\t\t\t\tDefaults levels logs: {{ defaultLevels.join(\', \') || \'NONE/OFF\' }}\r\n\t\t\t</div>\r\n\r\n\t\t\t<div class="table-container">\r\n\t\t\t\t<table class="config-table">\r\n\t\t\t\t\t<thead>\r\n\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t<th>Class</th>\r\n\t\t\t\t\t\t\t<th>Levels</th>\r\n\t\t\t\t\t\t\t<th class="actions-col"></th>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</thead>\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t<tr *ngFor="let config of classConfigs">\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t{{ config.className }}\r\n\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\tclass="class-count"\r\n\t\t\t\t\t\t\t\t\t*ngIf="getClassLogCount(config.className) > 0"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t({{ getClassLogCount(config.className) }})\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<div class="multiselect-container">\r\n\t\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\t\tclass="dropdown-trigger"\r\n\t\t\t\t\t\t\t\t\t\t(click)="toggleDropdown(config, $event)"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<span class="selected-label">{{\r\n\t\t\t\t\t\t\t\t\t\t\tgetSelectedLevelsLabel(config)\r\n\t\t\t\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t\t\t\t<span class="arrow">▼</span>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td class="actions-col">\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tclass="icon-btn delete"\r\n\t\t\t\t\t\t\t\t\t(click)="removeClass(config.className)"\r\n\t\t\t\t\t\t\t\t\ttitle="Remove"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t✕\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t\t<tfoot>\r\n\t\t\t\t\t\t<tr class="add-row">\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\tclass="input-text-small"\r\n\t\t\t\t\t\t\t\t\t[(ngModel)]="newClassName"\r\n\t\t\t\t\t\t\t\t\ttype="text"\r\n\t\t\t\t\t\t\t\t\tplaceholder="New Class..."\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<div class="multiselect-container">\r\n\t\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\t\tclass="dropdown-trigger"\r\n\t\t\t\t\t\t\t\t\t\t(click)="toggleNewClassDropdown($event)"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<span class="selected-label">{{\r\n\t\t\t\t\t\t\t\t\t\t\tgetNewClassLevelsLabel() || \'Select Levels\'\r\n\t\t\t\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t\t\t\t<span class="arrow">▼</span>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td class="actions-col">\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tclass="icon-btn add"\r\n\t\t\t\t\t\t\t\t\t[disabled]="!newClassName"\r\n\t\t\t\t\t\t\t\t\t(click)="addNewClass()"\r\n\t\t\t\t\t\t\t\t\ttitle="Add"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t+\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</tfoot>\r\n\t\t\t\t</table>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t\x3c!-- RIGHT TILE: Logs --\x3e\r\n\t\t<div\r\n\t\t\tclass="tile logs-tile"\r\n\t\t\t[class.expanded]="mobileExpandedSection === \'logs\'"\r\n\t\t\t[class.collapsed]="mobileExpandedSection === \'config\'"\r\n\t\t>\r\n\t\t\t<div class="tile-header">\r\n\t\t\t\t<div class="header-title-group">\r\n\t\t\t\t\t<button\r\n\t\t\t\t\t\tclass="icon-btn expand-btn"\r\n\t\t\t\t\t\t(click)="toggleSection(\'logs\')"\r\n\t\t\t\t\t\ttitle="{{ mobileExpandedSection === \'logs\' ? \'Collapse\' : \'Expand\' }}"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ mobileExpandedSection === \'logs\' ? \'▼\' : \'►\' }}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<h4>Logs Stream</h4>\r\n\t\t\t\t\t<div class="log-counts">\r\n\t\t\t\t\t\t<ng-container *ngFor="let level of availableLevels">\r\n\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\tclass="count-badge"\r\n\t\t\t\t\t\t\t\t*ngIf="level !== \'ALL\' && logCounts[level]"\r\n\t\t\t\t\t\t\t\t[ngClass]="[\r\n\t\t\t\t\t\t\t\t\tlevel.toLowerCase(),\r\n\t\t\t\t\t\t\t\t\tselectedLevels.has(level) ? \'selected\' : \'\',\r\n\t\t\t\t\t\t\t\t]"\r\n\t\t\t\t\t\t\t\t[title]="\r\n\t\t\t\t\t\t\t\t\tselectedLevels.has(level)\r\n\t\t\t\t\t\t\t\t\t\t? \'Clear filter\'\r\n\t\t\t\t\t\t\t\t\t\t: \'Add filter for \' + level\r\n\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t(click)="filterByLevel(level)"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{{ level }}: <b>{{ logCounts[level] }}</b>\r\n\t\t\t\t\t\t\t\t<span class="clear-filter-icon" *ngIf="selectedLevels.has(level)"\r\n\t\t\t\t\t\t\t\t\t>✕</span\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="header-actions">\r\n\t\t\t\t\t<input\r\n\t\t\t\t\t\tclass="search-input"\r\n\t\t\t\t\t\t[(ngModel)]="searchTerm"\r\n\t\t\t\t\t\ttype="text"\r\n\t\t\t\t\t\tplaceholder="Search logs..."\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<button class="icon-btn clear" (click)="clearLogs()" title="Clear Logs">\r\n\t\t\t\t\t\t✕ Clear\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<div class="logs-container" #logsContainer (scroll)="onLogScroll()">\r\n\t\t\t\t<div\r\n\t\t\t\t\tclass="log-entry"\r\n\t\t\t\t\t*ngFor="let log of filteredLogs"\r\n\t\t\t\t\t[ngClass]="log.level.toLowerCase()"\r\n\t\t\t\t>\r\n\t\t\t\t\t<span class="log-badge">{{ log.level }}</span>\r\n\t\t\t\t\t<span class="log-time">{{ log.timestamp.split(\' \')[1] }}</span>\r\n\t\t\t\t\t<span\r\n\t\t\t\t\t\tclass="log-class"\r\n\t\t\t\t\t\t[class.clickable]="log.source"\r\n\t\t\t\t\t\t[title]="log.source ? \'Inspect \' + log.className : \'\'"\r\n\t\t\t\t\t\t(click)="log.source ? inspectObject(log.source, log) : null"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t[{{ log.className }}]\r\n\t\t\t\t\t</span>\r\n\t\t\t\t\t<span class="log-msg">{{ log.message }}</span>\r\n\r\n\t\t\t\t\t<div class="log-params" *ngIf="log.params.length">\r\n\t\t\t\t\t\t<ng-container *ngFor="let param of log.params">\r\n\t\t\t\t\t\t\t<span class="param-primitive" *ngIf="!isObject(param)">{{\r\n\t\t\t\t\t\t\t\tparam\r\n\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tclass="btn-inspect"\r\n\t\t\t\t\t\t\t\t*ngIf="isObject(param)"\r\n\t\t\t\t\t\t\t\t(click)="inspectObject(param)"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t🔍 Object\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="empty-logs" *ngIf="logs.length === 0">Waiting for logs...</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t\x3c!-- Inspector Modal/Overlay --\x3e\r\n\t<div class="inspector-overlay" *ngIf="inspectedObject" (click)="closeInspector()">\r\n\t\t<div class="inspector-panel" (click)="$event.stopPropagation()">\r\n\t\t\t<div class="inspector-header">\r\n\t\t\t\t<div class="header-content">\r\n\t\t\t\t\t<h4>Object Inspector</h4>\r\n\t\t\t\t\t<div class="inspector-meta" *ngIf="inspectedLog">\r\n\t\t\t\t\t\t<span class="meta-badge" [ngClass]="inspectedLog.level.toLowerCase()">{{\r\n\t\t\t\t\t\t\tinspectedLog.level\r\n\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t<span class="meta-class">[{{ inspectedLog.className }}]</span>\r\n\t\t\t\t\t\t<span class="meta-time">{{ inspectedLog.timestamp.split(\' \')[1] }}</span>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<button class="close-btn" (click)="closeInspector()">✕</button>\r\n\t\t\t</div>\r\n\t\t\t<div class="inspector-content">\r\n\t\t\t\t<div class="inspector-split">\r\n\t\t\t\t\t<div class="inspector-section" *ngIf="inspectedObject">\r\n\t\t\t\t\t\t<h5>State</h5>\r\n\t\t\t\t\t\t<asor-json-view [data]="inspectedObject" [expandDepth]="1"></asor-json-view>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class="inspector-section" *ngIf="inspectedObjectMethods.length > 0">\r\n\t\t\t\t\t\t<h5>Methods</h5>\r\n\t\t\t\t\t\t<div class="methods-list">\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tclass="method-btn"\r\n\t\t\t\t\t\t\t\t*ngFor="let method of inspectedObjectMethods"\r\n\t\t\t\t\t\t\t\t(click)="appendToRepl(method)"\r\n\t\t\t\t\t\t\t\ttitle="Add to REPL"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{{ method }}()\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class="inspector-section" *ngIf="inspectedObject">\r\n\t\t\t\t\t\t<h5>Console REPL</h5>\r\n\t\t\t\t\t\t<div class="repl-container">\r\n\t\t\t\t\t\t\t<textarea\r\n\t\t\t\t\t\t\t\t[(ngModel)]="executionCode"\r\n\t\t\t\t\t\t\t\t(keydown.control.enter)="executeSnippet()"\r\n\t\t\t\t\t\t\t\tplaceholder="Execute code (e.g. state.createDataSet(...))"\r\n\t\t\t\t\t\t\t></textarea>\r\n\t\t\t\t\t\t\t<button class="repl-btn" (click)="executeSnippet()">Execute</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class="inspector-section" *ngIf="hasReplResult">\r\n\t\t\t\t\t\t<h5>Result</h5>\r\n\t\t\t\t\t\t<asor-json-view [data]="replResult" [expandDepth]="1"></asor-json-view>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class="inspector-section error-section" *ngIf="replError">\r\n\t\t\t\t\t\t<h5>Error</h5>\r\n\t\t\t\t\t\t<div class="error-msg">{{ replError }}</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n',styles:[".console-tab-container{height:100%;display:flex;flex-direction:column}.console-grid{display:grid;grid-template-columns:400px 1fr;gap:16px;height:100%}.tile{background-color:#252526;border-radius:6px;border:1px solid #333;display:flex;flex-direction:column;overflow:hidden;height:100%}.tile-header{padding:10px 12px;border-bottom:1px solid #333;display:flex;justify-content:space-between;align-items:center;background-color:#2d2d2d}.tile-header h4{margin:0;font-size:12px;text-transform:uppercase;color:#999;font-weight:600;letter-spacing:.5px}.tile-header .header-actions,.header-title-group{display:flex;align-items:center;gap:8px}.header-title-group .log-counts{display:flex;gap:6px;margin-left:8px}.header-title-group .log-counts .count-badge{font-size:10px;padding:2px 6px;border-radius:10px;font-weight:600;color:#fff;background-color:#555;cursor:pointer;-webkit-user-select:none;user-select:none;transition:opacity .2s}.header-title-group .log-counts .count-badge:hover{opacity:.8}.header-title-group .log-counts .count-badge.info{background-color:#0dcaf033;color:#0dcaf0;border:1px solid rgba(13,202,240,.3)}.header-title-group .log-counts .count-badge.debug{background-color:#a855f733;color:#a855f7;border:1px solid rgba(168,85,247,.3)}.header-title-group .log-counts .count-badge.warning{background-color:#f59e0b33;color:#f59e0b;border:1px solid rgba(245,158,11,.3)}.header-title-group .log-counts .count-badge.selected{opacity:1;border:1px solid #fff;box-shadow:0 0 4px #ffffff80}.header-title-group .log-counts .count-badge.selected.info{background-color:#0dcaf0;color:#000}.header-title-group .log-counts .count-badge.selected.debug{background-color:#a855f7;color:#fff}.header-title-group .log-counts .count-badge.selected.warning{background-color:#f59e0b;color:#000}.header-title-group .log-counts .count-badge.selected.error{background-color:#ef4444;color:#fff}.header-title-group .log-counts .count-badge .clear-filter-icon{margin-left:4px;font-size:8px;font-weight:700}.table-container,.logs-container{flex:1;overflow-y:auto}.table-container::-webkit-scrollbar,.logs-container::-webkit-scrollbar{width:10px;height:10px}.table-container::-webkit-scrollbar-track,.logs-container::-webkit-scrollbar-track{background:#1e1e1e}.table-container::-webkit-scrollbar-thumb,.logs-container::-webkit-scrollbar-thumb{background:#424242;border-radius:5px;border:2px solid #1e1e1e}.table-container::-webkit-scrollbar-thumb:hover,.logs-container::-webkit-scrollbar-thumb:hover{background:#4f4f4f}.config-table{width:100%;border-collapse:collapse;font-size:12px}.config-table th,.config-table td{border-bottom:1px solid #333;padding:8px 12px;text-align:left;vertical-align:middle;color:#ccc}.config-table th{background-color:#2d2d2d;font-weight:600;color:#999;text-transform:uppercase;font-size:11px;position:sticky;top:0;z-index:10}.config-table tfoot{background-color:#2d2d2d;position:sticky;bottom:0;z-index:10}.config-table tfoot td{border-top:1px solid #333}.config-table tr:hover td{background-color:#2a2d2e}.config-table .class-count{color:#888;font-size:11px;margin-left:4px}.input-text-small{background-color:#3c3c3c;border:1px solid #3c3c3c;color:#fff;padding:4px 8px;border-radius:3px;width:100%;font-size:12px}.input-text-small:focus{outline:none;border-color:#007acc;background-color:#444}.input-text-small::placeholder{color:#888}.multiselect-container{position:relative}.dropdown-trigger{cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:4px 8px;background-color:#3c3c3c;border:1px solid #454545;border-radius:4px;min-width:120px;color:#fff;font-size:11px}.dropdown-trigger:hover{background-color:#444;border-color:#007acc}.dropdown-trigger .selected-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:150px}.dropdown-trigger .arrow{font-size:8px;color:#999}.level-checks{display:flex;gap:10px;flex-wrap:wrap}.level-check{display:flex;align-items:center;gap:4px;cursor:pointer;font-size:11px;color:#bbb;-webkit-user-select:none;user-select:none}.level-check:hover{color:#fff}.level-check input{accent-color:#007acc}.icon-btn{background:none;border:none;cursor:pointer;padding:4px;border-radius:4px;transition:all .2s;display:flex;align-items:center;justify-content:center}.icon-btn.delete{color:#f48771}.icon-btn.delete:hover{background-color:#f487711a}.icon-btn.add{color:#89d185;font-size:16px}.icon-btn.add:hover:not(:disabled){background-color:#89d1851a}.icon-btn.add:disabled{color:#555;cursor:not-allowed}.icon-btn.clear{font-size:11px;color:#bbb;border:1px solid #3e3e42;padding:2px 8px}.icon-btn.clear:hover{background-color:#3e3e42;color:#fff}.icon-btn.expand-btn{display:none}@media (max-width: 768px){.icon-btn.expand-btn{display:flex;font-size:10px;color:#999;border:1px solid #3e3e42;width:20px;height:20px;padding:0}.icon-btn.expand-btn:hover{background-color:#3e3e42;color:#fff}}.search-input{background-color:#3c3c3c;border:1px solid #3e3e42;color:#fff;padding:3px 8px;border-radius:4px;font-size:11px;width:150px;transition:all .2s}.search-input:focus{outline:none;border-color:#007acc;background-color:#444;width:180px}.search-input::placeholder{color:#888}.logs-container{background-color:#1e1e1e;color:#d4d4d4;font-family:Consolas,Monaco,Courier New,monospace;font-size:12px;padding:8px 12px}.log-entry{padding:6px 0;border-bottom:1px solid #2d2d2d;display:flex;flex-wrap:wrap;align-items:flex-start;gap:8px;line-height:1.4}.log-entry:last-child{border-bottom:none}.log-entry.info .log-badge{background-color:#0dcaf0;color:#000;border-radius:3px;font-weight:700}.log-entry.info .log-msg,.log-entry.info .log-class{color:#0dcaf0}.log-entry.debug .log-badge{background-color:#a855f7;color:#fff;border-radius:3px;font-weight:700}.log-entry.debug .log-msg,.log-entry.debug .log-class{color:#a855f7}.log-entry.warning .log-badge{background-color:#f59e0b;color:#000;border-radius:3px;font-weight:700}.log-entry.warning .log-msg,.log-entry.warning .log-class{color:#f59e0b}.log-entry.error .log-badge{background-color:#ef4444;color:#fff;border-radius:3px;font-weight:700}.log-entry.error .log-msg,.log-entry.error .log-class{color:#ef4444;font-weight:700}.log-time{color:#6a9955;font-size:11px;min-width:60px}.log-badge{font-weight:700;width:60px;font-size:11px;text-align:center}.log-class{color:#569cd6}.log-class.clickable{cursor:pointer;text-decoration:underline}.log-class.clickable:hover{opacity:.8;color:#9cdcfe}.log-msg{color:#ccc;word-break:break-all}.log-params{display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin-left:8px}.param-primitive{color:#9cdcfe;background:#2a2d2e;padding:0 4px;border-radius:3px}.btn-inspect{background-color:#2d2d2d;border:1px solid #3e3e42;color:#4fc1ff;padding:2px 8px;border-radius:12px;cursor:pointer;font-size:11px;font-family:inherit;transition:all .2s;display:inline-flex;align-items:center;gap:4px}.btn-inspect:hover{background-color:#3e3e42;border-color:#4fc1ff;color:#fff}.empty-logs{color:#666;text-align:center;padding:40px;font-style:italic}.inspector-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#0009;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:10000;display:flex;justify-content:center;align-items:center;padding:40px}.inspector-panel{background-color:#252526;border-radius:8px;width:100%;max-width:700px;height:100%;max-height:600px;display:flex;flex-direction:column;box-shadow:0 20px 50px #000000b3;border:1px solid #454545;animation:zoomIn .25s cubic-bezier(.16,1,.3,1)}@keyframes zoomIn{0%{transform:scale(.95);opacity:0}to{transform:scale(1);opacity:1}}.inspector-header{padding:12px 16px;background-color:#2d2d2d;border-bottom:1px solid #333;border-top-left-radius:8px;border-top-right-radius:8px;display:flex;justify-content:space-between;align-items:center}.inspector-header .header-content{display:flex;flex-direction:column;gap:2px}.inspector-header h4{margin:0;color:#eee;font-size:14px;font-weight:600}.inspector-header .inspector-meta{display:flex;gap:8px;align-items:center;font-size:11px;color:#888;font-family:monospace}.inspector-header .inspector-meta .meta-badge{padding:2px 6px;border-radius:3px;font-weight:700;font-size:10px}.inspector-header .inspector-meta .meta-badge.info,.inspector-header .inspector-meta .meta-badge.all{background-color:#0dcaf0;color:#000}.inspector-header .inspector-meta .meta-badge.debug{background-color:#a855f7;color:#fff}.inspector-header .inspector-meta .meta-badge.warning{background-color:#f59e0b;color:#000}.inspector-header .inspector-meta .meta-badge.error{background-color:#ef4444;color:#fff}.inspector-header .inspector-meta .meta-class{color:#569cd6}.inspector-header .inspector-meta .meta-time{color:#6a9955}.inspector-header .close-btn{background:none;border:none;color:#999;font-size:18px;cursor:pointer;width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:50%}.inspector-header .close-btn:hover{background-color:#3e3e42;color:#fff}.inspector-content{flex:1;overflow-y:auto;padding:20px;background-color:#1e1e1e}.inspector-content::-webkit-scrollbar{width:10px;height:10px}.inspector-content::-webkit-scrollbar-track{background:#1e1e1e}.inspector-content::-webkit-scrollbar-thumb{background:#424242;border-radius:5px;border:2px solid #1e1e1e}.inspector-content::-webkit-scrollbar-thumb:hover{background:#4f4f4f}.inspector-split{display:flex;flex-direction:column;gap:20px}.inspector-section h5{margin:0 0 10px;color:#999;font-size:12px;text-transform:uppercase;border-bottom:1px solid #333;padding-bottom:4px}.methods-list{display:flex;flex-wrap:wrap;gap:8px}.method-btn{background-color:#2d2d2d;border:1px solid #3e3e42;color:#dcdcaa;padding:4px 10px;border-radius:4px;cursor:pointer;font-family:Consolas,monospace;font-size:12px;transition:all .2s}.method-btn:hover{background-color:#3e3e42;border-color:#dcdcaa;color:#fff}.method-btn:active{transform:translateY(1px)}.repl-container{display:flex;flex-direction:column;gap:8px}.repl-container textarea{width:100%;height:80px;background-color:#2d2d2d;border:1px solid #3e3e42;color:#dcdcaa;font-family:Consolas,monospace;padding:8px;resize:vertical;outline:none}.repl-container textarea:focus{border-color:#007fd4}.repl-container textarea::-webkit-scrollbar{width:8px;height:8px}.repl-container textarea::-webkit-scrollbar-track{background:#2d2d2d}.repl-container textarea::-webkit-scrollbar-thumb{background:#424242;border-radius:4px}.repl-container textarea::-webkit-scrollbar-thumb:hover{background:#4f4f4f}.repl-container .repl-btn{align-self:flex-end;background-color:#0e639c;color:#fff;border:none;padding:6px 12px;cursor:pointer;border-radius:2px}.repl-container .repl-btn:hover{background-color:#17b}.error-section .error-msg{color:#f48771;background-color:#3e3e42;padding:8px;border-left:3px solid #f48771;font-family:monospace;white-space:pre-wrap}.dropdown-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;z-index:9999;cursor:default}.dropdown-menu.fixed-dropdown{position:fixed;z-index:10000;background-color:#252526;border:1px solid #454545;box-shadow:0 4px 10px #00000080;border-radius:4px;padding:4px 0;min-width:150px;max-height:200px;overflow-y:auto}.dropdown-menu.fixed-dropdown .level-check-item{display:flex;align-items:center;gap:8px;padding:6px 12px;cursor:pointer;color:#ccc;transition:background-color .1s;-webkit-user-select:none;user-select:none;font-size:11px}.dropdown-menu.fixed-dropdown .level-check-item:hover{background-color:#007acc;color:#fff}.dropdown-menu.fixed-dropdown .level-check-item input{accent-color:#fff}.dropdown-menu.fixed-dropdown::-webkit-scrollbar{width:8px}.dropdown-menu.fixed-dropdown::-webkit-scrollbar-track{background:#252526}.dropdown-menu.fixed-dropdown::-webkit-scrollbar-thumb{background:#444;border-radius:4px}.dropdown-menu.fixed-dropdown::-webkit-scrollbar-thumb:hover{background:#555}@media (max-width: 768px){.console-grid{display:flex;flex-direction:column;gap:10px;height:100%;overflow:hidden}.tile{transition:all .3s cubic-bezier(.25,.8,.25,1);display:flex;flex-direction:column}.tile.collapsed{flex:0 0 auto;max-height:40px!important;overflow:hidden}.tile.collapsed .table-container,.tile.collapsed .logs-container,.tile.collapsed .console-summary{display:none}.tile.expanded{flex:1 1 auto;max-height:100%!important;height:100%}.tile.config-tile{max-height:40vh}.tile.config-tile.expanded{max-height:100%}.inspector-panel{width:100%;height:100%;max-width:none;max-height:none;border-radius:0}.inspector-header{border-radius:0}.tile-header{flex-direction:column;align-items:flex-start;gap:8px}.tile-header .header-actions{width:100%;display:flex;justify-content:space-between}.tile-header .header-actions .search-input{flex-grow:1;margin-right:8px;width:auto}.tile-header .header-actions .search-input:focus{width:auto}}.console-summary{padding:4px;font-size:11px;color:#888}\n"],dependencies:[{kind:"ngmodule",type:w},{kind:"directive",type:m.NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:m.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:m.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"ngmodule",type:F},{kind:"directive",type:H.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:H.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:H.NgModel,selector:"[ngModel]:not([formControlName]):not([formControl])",inputs:["name","disabled","ngModel","ngModelOptions"],outputs:["ngModelChange"],exportAs:["ngModel"]},{kind:"component",type:JsonViewComponent,selector:"asor-json-view",inputs:["data","key","level","expandDepth"]}],encapsulation:t.ViewEncapsulation.None})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:ConsoleTabComponent,decorators:[{type:p,args:[{selector:"asor-console-tab",standalone:!0,imports:[w,F,JsonViewComponent],encapsulation:d.None,template:'<div class="console-tab-container">\r\n\t\x3c!-- Transparent backdrop to close dropdowns --\x3e\r\n\t<div class="dropdown-backdrop" *ngIf="openDropdownClass" (click)="closeDropdown()"></div>\r\n\r\n\t\x3c!-- Root Dropdown Menu --\x3e\r\n\t<div\r\n\t\tclass="dropdown-menu fixed-dropdown"\r\n\t\t*ngIf="openDropdownClass && (selectedConfig || openDropdownClass === \'__NEW__\')"\r\n\t\t[style.top.px]="dropdownTop"\r\n\t\t[style.left.px]="dropdownLeft"\r\n\t\t(click)="$event.stopPropagation()"\r\n\t>\r\n\t\t\x3c!-- Existing Class Mode --\x3e\r\n\t\t<ng-container *ngIf="selectedConfig">\r\n\t\t\t<label class="level-check-item" *ngFor="let level of availableLevels">\r\n\t\t\t\t<input\r\n\t\t\t\t\t[checked]="isLevelEnabled(selectedConfig, level)"\r\n\t\t\t\t\t(change)="updateClassLevel(selectedConfig.className, level, $event)"\r\n\t\t\t\t\ttype="checkbox"\r\n\t\t\t\t/>\r\n\t\t\t\t{{ level }}\r\n\t\t\t</label>\r\n\t\t</ng-container>\r\n\r\n\t\t\x3c!-- New Class Mode --\x3e\r\n\t\t<ng-container *ngIf="openDropdownClass === \'__NEW__\'">\r\n\t\t\t<label class="level-check-item" *ngFor="let level of availableLevels">\r\n\t\t\t\t<input\r\n\t\t\t\t\t[checked]="newClassLevels[level]"\r\n\t\t\t\t\t(change)="updateNewClassLevel(level, $event)"\r\n\t\t\t\t\ttype="checkbox"\r\n\t\t\t\t/>\r\n\t\t\t\t{{ level }}\r\n\t\t\t</label>\r\n\t\t</ng-container>\r\n\t</div>\r\n\r\n\t<div class="console-grid">\r\n\t\t\x3c!-- LEFT TILE: Configuration --\x3e\r\n\t\t<div\r\n\t\t\tclass="tile config-tile"\r\n\t\t\t[class.expanded]="mobileExpandedSection === \'config\'"\r\n\t\t\t[class.collapsed]="mobileExpandedSection === \'logs\'"\r\n\t\t>\r\n\t\t\t<div class="tile-header">\r\n\t\t\t\t<div class="header-title-group">\r\n\t\t\t\t\t<button\r\n\t\t\t\t\t\tclass="icon-btn expand-btn"\r\n\t\t\t\t\t\t(click)="toggleSection(\'config\')"\r\n\t\t\t\t\t\ttitle="{{ mobileExpandedSection === \'config\' ? \'Collapse\' : \'Expand\' }}"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ mobileExpandedSection === \'config\' ? \'▼\' : \'►\' }}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<h4>Configuration</h4>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<div class="console-summary" *ngIf="mobileExpandedSection !== \'config\'">\r\n\t\t\t\tDefaults levels logs: {{ defaultLevels.join(\', \') || \'NONE/OFF\' }}\r\n\t\t\t</div>\r\n\r\n\t\t\t<div class="table-container">\r\n\t\t\t\t<table class="config-table">\r\n\t\t\t\t\t<thead>\r\n\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t<th>Class</th>\r\n\t\t\t\t\t\t\t<th>Levels</th>\r\n\t\t\t\t\t\t\t<th class="actions-col"></th>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</thead>\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t<tr *ngFor="let config of classConfigs">\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t{{ config.className }}\r\n\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\tclass="class-count"\r\n\t\t\t\t\t\t\t\t\t*ngIf="getClassLogCount(config.className) > 0"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t({{ getClassLogCount(config.className) }})\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<div class="multiselect-container">\r\n\t\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\t\tclass="dropdown-trigger"\r\n\t\t\t\t\t\t\t\t\t\t(click)="toggleDropdown(config, $event)"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<span class="selected-label">{{\r\n\t\t\t\t\t\t\t\t\t\t\tgetSelectedLevelsLabel(config)\r\n\t\t\t\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t\t\t\t<span class="arrow">▼</span>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td class="actions-col">\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tclass="icon-btn delete"\r\n\t\t\t\t\t\t\t\t\t(click)="removeClass(config.className)"\r\n\t\t\t\t\t\t\t\t\ttitle="Remove"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t✕\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t\t<tfoot>\r\n\t\t\t\t\t\t<tr class="add-row">\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\tclass="input-text-small"\r\n\t\t\t\t\t\t\t\t\t[(ngModel)]="newClassName"\r\n\t\t\t\t\t\t\t\t\ttype="text"\r\n\t\t\t\t\t\t\t\t\tplaceholder="New Class..."\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<div class="multiselect-container">\r\n\t\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\t\tclass="dropdown-trigger"\r\n\t\t\t\t\t\t\t\t\t\t(click)="toggleNewClassDropdown($event)"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<span class="selected-label">{{\r\n\t\t\t\t\t\t\t\t\t\t\tgetNewClassLevelsLabel() || \'Select Levels\'\r\n\t\t\t\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t\t\t\t<span class="arrow">▼</span>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td class="actions-col">\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tclass="icon-btn add"\r\n\t\t\t\t\t\t\t\t\t[disabled]="!newClassName"\r\n\t\t\t\t\t\t\t\t\t(click)="addNewClass()"\r\n\t\t\t\t\t\t\t\t\ttitle="Add"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t+\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</tfoot>\r\n\t\t\t\t</table>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t\x3c!-- RIGHT TILE: Logs --\x3e\r\n\t\t<div\r\n\t\t\tclass="tile logs-tile"\r\n\t\t\t[class.expanded]="mobileExpandedSection === \'logs\'"\r\n\t\t\t[class.collapsed]="mobileExpandedSection === \'config\'"\r\n\t\t>\r\n\t\t\t<div class="tile-header">\r\n\t\t\t\t<div class="header-title-group">\r\n\t\t\t\t\t<button\r\n\t\t\t\t\t\tclass="icon-btn expand-btn"\r\n\t\t\t\t\t\t(click)="toggleSection(\'logs\')"\r\n\t\t\t\t\t\ttitle="{{ mobileExpandedSection === \'logs\' ? \'Collapse\' : \'Expand\' }}"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ mobileExpandedSection === \'logs\' ? \'▼\' : \'►\' }}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<h4>Logs Stream</h4>\r\n\t\t\t\t\t<div class="log-counts">\r\n\t\t\t\t\t\t<ng-container *ngFor="let level of availableLevels">\r\n\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\tclass="count-badge"\r\n\t\t\t\t\t\t\t\t*ngIf="level !== \'ALL\' && logCounts[level]"\r\n\t\t\t\t\t\t\t\t[ngClass]="[\r\n\t\t\t\t\t\t\t\t\tlevel.toLowerCase(),\r\n\t\t\t\t\t\t\t\t\tselectedLevels.has(level) ? \'selected\' : \'\',\r\n\t\t\t\t\t\t\t\t]"\r\n\t\t\t\t\t\t\t\t[title]="\r\n\t\t\t\t\t\t\t\t\tselectedLevels.has(level)\r\n\t\t\t\t\t\t\t\t\t\t? \'Clear filter\'\r\n\t\t\t\t\t\t\t\t\t\t: \'Add filter for \' + level\r\n\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t(click)="filterByLevel(level)"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{{ level }}: <b>{{ logCounts[level] }}</b>\r\n\t\t\t\t\t\t\t\t<span class="clear-filter-icon" *ngIf="selectedLevels.has(level)"\r\n\t\t\t\t\t\t\t\t\t>✕</span\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="header-actions">\r\n\t\t\t\t\t<input\r\n\t\t\t\t\t\tclass="search-input"\r\n\t\t\t\t\t\t[(ngModel)]="searchTerm"\r\n\t\t\t\t\t\ttype="text"\r\n\t\t\t\t\t\tplaceholder="Search logs..."\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<button class="icon-btn clear" (click)="clearLogs()" title="Clear Logs">\r\n\t\t\t\t\t\t✕ Clear\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<div class="logs-container" #logsContainer (scroll)="onLogScroll()">\r\n\t\t\t\t<div\r\n\t\t\t\t\tclass="log-entry"\r\n\t\t\t\t\t*ngFor="let log of filteredLogs"\r\n\t\t\t\t\t[ngClass]="log.level.toLowerCase()"\r\n\t\t\t\t>\r\n\t\t\t\t\t<span class="log-badge">{{ log.level }}</span>\r\n\t\t\t\t\t<span class="log-time">{{ log.timestamp.split(\' \')[1] }}</span>\r\n\t\t\t\t\t<span\r\n\t\t\t\t\t\tclass="log-class"\r\n\t\t\t\t\t\t[class.clickable]="log.source"\r\n\t\t\t\t\t\t[title]="log.source ? \'Inspect \' + log.className : \'\'"\r\n\t\t\t\t\t\t(click)="log.source ? inspectObject(log.source, log) : null"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t[{{ log.className }}]\r\n\t\t\t\t\t</span>\r\n\t\t\t\t\t<span class="log-msg">{{ log.message }}</span>\r\n\r\n\t\t\t\t\t<div class="log-params" *ngIf="log.params.length">\r\n\t\t\t\t\t\t<ng-container *ngFor="let param of log.params">\r\n\t\t\t\t\t\t\t<span class="param-primitive" *ngIf="!isObject(param)">{{\r\n\t\t\t\t\t\t\t\tparam\r\n\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tclass="btn-inspect"\r\n\t\t\t\t\t\t\t\t*ngIf="isObject(param)"\r\n\t\t\t\t\t\t\t\t(click)="inspectObject(param)"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t🔍 Object\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="empty-logs" *ngIf="logs.length === 0">Waiting for logs...</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t\x3c!-- Inspector Modal/Overlay --\x3e\r\n\t<div class="inspector-overlay" *ngIf="inspectedObject" (click)="closeInspector()">\r\n\t\t<div class="inspector-panel" (click)="$event.stopPropagation()">\r\n\t\t\t<div class="inspector-header">\r\n\t\t\t\t<div class="header-content">\r\n\t\t\t\t\t<h4>Object Inspector</h4>\r\n\t\t\t\t\t<div class="inspector-meta" *ngIf="inspectedLog">\r\n\t\t\t\t\t\t<span class="meta-badge" [ngClass]="inspectedLog.level.toLowerCase()">{{\r\n\t\t\t\t\t\t\tinspectedLog.level\r\n\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t<span class="meta-class">[{{ inspectedLog.className }}]</span>\r\n\t\t\t\t\t\t<span class="meta-time">{{ inspectedLog.timestamp.split(\' \')[1] }}</span>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<button class="close-btn" (click)="closeInspector()">✕</button>\r\n\t\t\t</div>\r\n\t\t\t<div class="inspector-content">\r\n\t\t\t\t<div class="inspector-split">\r\n\t\t\t\t\t<div class="inspector-section" *ngIf="inspectedObject">\r\n\t\t\t\t\t\t<h5>State</h5>\r\n\t\t\t\t\t\t<asor-json-view [data]="inspectedObject" [expandDepth]="1"></asor-json-view>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class="inspector-section" *ngIf="inspectedObjectMethods.length > 0">\r\n\t\t\t\t\t\t<h5>Methods</h5>\r\n\t\t\t\t\t\t<div class="methods-list">\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tclass="method-btn"\r\n\t\t\t\t\t\t\t\t*ngFor="let method of inspectedObjectMethods"\r\n\t\t\t\t\t\t\t\t(click)="appendToRepl(method)"\r\n\t\t\t\t\t\t\t\ttitle="Add to REPL"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{{ method }}()\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class="inspector-section" *ngIf="inspectedObject">\r\n\t\t\t\t\t\t<h5>Console REPL</h5>\r\n\t\t\t\t\t\t<div class="repl-container">\r\n\t\t\t\t\t\t\t<textarea\r\n\t\t\t\t\t\t\t\t[(ngModel)]="executionCode"\r\n\t\t\t\t\t\t\t\t(keydown.control.enter)="executeSnippet()"\r\n\t\t\t\t\t\t\t\tplaceholder="Execute code (e.g. state.createDataSet(...))"\r\n\t\t\t\t\t\t\t></textarea>\r\n\t\t\t\t\t\t\t<button class="repl-btn" (click)="executeSnippet()">Execute</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class="inspector-section" *ngIf="hasReplResult">\r\n\t\t\t\t\t\t<h5>Result</h5>\r\n\t\t\t\t\t\t<asor-json-view [data]="replResult" [expandDepth]="1"></asor-json-view>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class="inspector-section error-section" *ngIf="replError">\r\n\t\t\t\t\t\t<h5>Error</h5>\r\n\t\t\t\t\t\t<div class="error-msg">{{ replError }}</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n',styles:[".console-tab-container{height:100%;display:flex;flex-direction:column}.console-grid{display:grid;grid-template-columns:400px 1fr;gap:16px;height:100%}.tile{background-color:#252526;border-radius:6px;border:1px solid #333;display:flex;flex-direction:column;overflow:hidden;height:100%}.tile-header{padding:10px 12px;border-bottom:1px solid #333;display:flex;justify-content:space-between;align-items:center;background-color:#2d2d2d}.tile-header h4{margin:0;font-size:12px;text-transform:uppercase;color:#999;font-weight:600;letter-spacing:.5px}.tile-header .header-actions,.header-title-group{display:flex;align-items:center;gap:8px}.header-title-group .log-counts{display:flex;gap:6px;margin-left:8px}.header-title-group .log-counts .count-badge{font-size:10px;padding:2px 6px;border-radius:10px;font-weight:600;color:#fff;background-color:#555;cursor:pointer;-webkit-user-select:none;user-select:none;transition:opacity .2s}.header-title-group .log-counts .count-badge:hover{opacity:.8}.header-title-group .log-counts .count-badge.info{background-color:#0dcaf033;color:#0dcaf0;border:1px solid rgba(13,202,240,.3)}.header-title-group .log-counts .count-badge.debug{background-color:#a855f733;color:#a855f7;border:1px solid rgba(168,85,247,.3)}.header-title-group .log-counts .count-badge.warning{background-color:#f59e0b33;color:#f59e0b;border:1px solid rgba(245,158,11,.3)}.header-title-group .log-counts .count-badge.selected{opacity:1;border:1px solid #fff;box-shadow:0 0 4px #ffffff80}.header-title-group .log-counts .count-badge.selected.info{background-color:#0dcaf0;color:#000}.header-title-group .log-counts .count-badge.selected.debug{background-color:#a855f7;color:#fff}.header-title-group .log-counts .count-badge.selected.warning{background-color:#f59e0b;color:#000}.header-title-group .log-counts .count-badge.selected.error{background-color:#ef4444;color:#fff}.header-title-group .log-counts .count-badge .clear-filter-icon{margin-left:4px;font-size:8px;font-weight:700}.table-container,.logs-container{flex:1;overflow-y:auto}.table-container::-webkit-scrollbar,.logs-container::-webkit-scrollbar{width:10px;height:10px}.table-container::-webkit-scrollbar-track,.logs-container::-webkit-scrollbar-track{background:#1e1e1e}.table-container::-webkit-scrollbar-thumb,.logs-container::-webkit-scrollbar-thumb{background:#424242;border-radius:5px;border:2px solid #1e1e1e}.table-container::-webkit-scrollbar-thumb:hover,.logs-container::-webkit-scrollbar-thumb:hover{background:#4f4f4f}.config-table{width:100%;border-collapse:collapse;font-size:12px}.config-table th,.config-table td{border-bottom:1px solid #333;padding:8px 12px;text-align:left;vertical-align:middle;color:#ccc}.config-table th{background-color:#2d2d2d;font-weight:600;color:#999;text-transform:uppercase;font-size:11px;position:sticky;top:0;z-index:10}.config-table tfoot{background-color:#2d2d2d;position:sticky;bottom:0;z-index:10}.config-table tfoot td{border-top:1px solid #333}.config-table tr:hover td{background-color:#2a2d2e}.config-table .class-count{color:#888;font-size:11px;margin-left:4px}.input-text-small{background-color:#3c3c3c;border:1px solid #3c3c3c;color:#fff;padding:4px 8px;border-radius:3px;width:100%;font-size:12px}.input-text-small:focus{outline:none;border-color:#007acc;background-color:#444}.input-text-small::placeholder{color:#888}.multiselect-container{position:relative}.dropdown-trigger{cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:4px 8px;background-color:#3c3c3c;border:1px solid #454545;border-radius:4px;min-width:120px;color:#fff;font-size:11px}.dropdown-trigger:hover{background-color:#444;border-color:#007acc}.dropdown-trigger .selected-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:150px}.dropdown-trigger .arrow{font-size:8px;color:#999}.level-checks{display:flex;gap:10px;flex-wrap:wrap}.level-check{display:flex;align-items:center;gap:4px;cursor:pointer;font-size:11px;color:#bbb;-webkit-user-select:none;user-select:none}.level-check:hover{color:#fff}.level-check input{accent-color:#007acc}.icon-btn{background:none;border:none;cursor:pointer;padding:4px;border-radius:4px;transition:all .2s;display:flex;align-items:center;justify-content:center}.icon-btn.delete{color:#f48771}.icon-btn.delete:hover{background-color:#f487711a}.icon-btn.add{color:#89d185;font-size:16px}.icon-btn.add:hover:not(:disabled){background-color:#89d1851a}.icon-btn.add:disabled{color:#555;cursor:not-allowed}.icon-btn.clear{font-size:11px;color:#bbb;border:1px solid #3e3e42;padding:2px 8px}.icon-btn.clear:hover{background-color:#3e3e42;color:#fff}.icon-btn.expand-btn{display:none}@media (max-width: 768px){.icon-btn.expand-btn{display:flex;font-size:10px;color:#999;border:1px solid #3e3e42;width:20px;height:20px;padding:0}.icon-btn.expand-btn:hover{background-color:#3e3e42;color:#fff}}.search-input{background-color:#3c3c3c;border:1px solid #3e3e42;color:#fff;padding:3px 8px;border-radius:4px;font-size:11px;width:150px;transition:all .2s}.search-input:focus{outline:none;border-color:#007acc;background-color:#444;width:180px}.search-input::placeholder{color:#888}.logs-container{background-color:#1e1e1e;color:#d4d4d4;font-family:Consolas,Monaco,Courier New,monospace;font-size:12px;padding:8px 12px}.log-entry{padding:6px 0;border-bottom:1px solid #2d2d2d;display:flex;flex-wrap:wrap;align-items:flex-start;gap:8px;line-height:1.4}.log-entry:last-child{border-bottom:none}.log-entry.info .log-badge{background-color:#0dcaf0;color:#000;border-radius:3px;font-weight:700}.log-entry.info .log-msg,.log-entry.info .log-class{color:#0dcaf0}.log-entry.debug .log-badge{background-color:#a855f7;color:#fff;border-radius:3px;font-weight:700}.log-entry.debug .log-msg,.log-entry.debug .log-class{color:#a855f7}.log-entry.warning .log-badge{background-color:#f59e0b;color:#000;border-radius:3px;font-weight:700}.log-entry.warning .log-msg,.log-entry.warning .log-class{color:#f59e0b}.log-entry.error .log-badge{background-color:#ef4444;color:#fff;border-radius:3px;font-weight:700}.log-entry.error .log-msg,.log-entry.error .log-class{color:#ef4444;font-weight:700}.log-time{color:#6a9955;font-size:11px;min-width:60px}.log-badge{font-weight:700;width:60px;font-size:11px;text-align:center}.log-class{color:#569cd6}.log-class.clickable{cursor:pointer;text-decoration:underline}.log-class.clickable:hover{opacity:.8;color:#9cdcfe}.log-msg{color:#ccc;word-break:break-all}.log-params{display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin-left:8px}.param-primitive{color:#9cdcfe;background:#2a2d2e;padding:0 4px;border-radius:3px}.btn-inspect{background-color:#2d2d2d;border:1px solid #3e3e42;color:#4fc1ff;padding:2px 8px;border-radius:12px;cursor:pointer;font-size:11px;font-family:inherit;transition:all .2s;display:inline-flex;align-items:center;gap:4px}.btn-inspect:hover{background-color:#3e3e42;border-color:#4fc1ff;color:#fff}.empty-logs{color:#666;text-align:center;padding:40px;font-style:italic}.inspector-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#0009;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:10000;display:flex;justify-content:center;align-items:center;padding:40px}.inspector-panel{background-color:#252526;border-radius:8px;width:100%;max-width:700px;height:100%;max-height:600px;display:flex;flex-direction:column;box-shadow:0 20px 50px #000000b3;border:1px solid #454545;animation:zoomIn .25s cubic-bezier(.16,1,.3,1)}@keyframes zoomIn{0%{transform:scale(.95);opacity:0}to{transform:scale(1);opacity:1}}.inspector-header{padding:12px 16px;background-color:#2d2d2d;border-bottom:1px solid #333;border-top-left-radius:8px;border-top-right-radius:8px;display:flex;justify-content:space-between;align-items:center}.inspector-header .header-content{display:flex;flex-direction:column;gap:2px}.inspector-header h4{margin:0;color:#eee;font-size:14px;font-weight:600}.inspector-header .inspector-meta{display:flex;gap:8px;align-items:center;font-size:11px;color:#888;font-family:monospace}.inspector-header .inspector-meta .meta-badge{padding:2px 6px;border-radius:3px;font-weight:700;font-size:10px}.inspector-header .inspector-meta .meta-badge.info,.inspector-header .inspector-meta .meta-badge.all{background-color:#0dcaf0;color:#000}.inspector-header .inspector-meta .meta-badge.debug{background-color:#a855f7;color:#fff}.inspector-header .inspector-meta .meta-badge.warning{background-color:#f59e0b;color:#000}.inspector-header .inspector-meta .meta-badge.error{background-color:#ef4444;color:#fff}.inspector-header .inspector-meta .meta-class{color:#569cd6}.inspector-header .inspector-meta .meta-time{color:#6a9955}.inspector-header .close-btn{background:none;border:none;color:#999;font-size:18px;cursor:pointer;width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:50%}.inspector-header .close-btn:hover{background-color:#3e3e42;color:#fff}.inspector-content{flex:1;overflow-y:auto;padding:20px;background-color:#1e1e1e}.inspector-content::-webkit-scrollbar{width:10px;height:10px}.inspector-content::-webkit-scrollbar-track{background:#1e1e1e}.inspector-content::-webkit-scrollbar-thumb{background:#424242;border-radius:5px;border:2px solid #1e1e1e}.inspector-content::-webkit-scrollbar-thumb:hover{background:#4f4f4f}.inspector-split{display:flex;flex-direction:column;gap:20px}.inspector-section h5{margin:0 0 10px;color:#999;font-size:12px;text-transform:uppercase;border-bottom:1px solid #333;padding-bottom:4px}.methods-list{display:flex;flex-wrap:wrap;gap:8px}.method-btn{background-color:#2d2d2d;border:1px solid #3e3e42;color:#dcdcaa;padding:4px 10px;border-radius:4px;cursor:pointer;font-family:Consolas,monospace;font-size:12px;transition:all .2s}.method-btn:hover{background-color:#3e3e42;border-color:#dcdcaa;color:#fff}.method-btn:active{transform:translateY(1px)}.repl-container{display:flex;flex-direction:column;gap:8px}.repl-container textarea{width:100%;height:80px;background-color:#2d2d2d;border:1px solid #3e3e42;color:#dcdcaa;font-family:Consolas,monospace;padding:8px;resize:vertical;outline:none}.repl-container textarea:focus{border-color:#007fd4}.repl-container textarea::-webkit-scrollbar{width:8px;height:8px}.repl-container textarea::-webkit-scrollbar-track{background:#2d2d2d}.repl-container textarea::-webkit-scrollbar-thumb{background:#424242;border-radius:4px}.repl-container textarea::-webkit-scrollbar-thumb:hover{background:#4f4f4f}.repl-container .repl-btn{align-self:flex-end;background-color:#0e639c;color:#fff;border:none;padding:6px 12px;cursor:pointer;border-radius:2px}.repl-container .repl-btn:hover{background-color:#17b}.error-section .error-msg{color:#f48771;background-color:#3e3e42;padding:8px;border-left:3px solid #f48771;font-family:monospace;white-space:pre-wrap}.dropdown-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;z-index:9999;cursor:default}.dropdown-menu.fixed-dropdown{position:fixed;z-index:10000;background-color:#252526;border:1px solid #454545;box-shadow:0 4px 10px #00000080;border-radius:4px;padding:4px 0;min-width:150px;max-height:200px;overflow-y:auto}.dropdown-menu.fixed-dropdown .level-check-item{display:flex;align-items:center;gap:8px;padding:6px 12px;cursor:pointer;color:#ccc;transition:background-color .1s;-webkit-user-select:none;user-select:none;font-size:11px}.dropdown-menu.fixed-dropdown .level-check-item:hover{background-color:#007acc;color:#fff}.dropdown-menu.fixed-dropdown .level-check-item input{accent-color:#fff}.dropdown-menu.fixed-dropdown::-webkit-scrollbar{width:8px}.dropdown-menu.fixed-dropdown::-webkit-scrollbar-track{background:#252526}.dropdown-menu.fixed-dropdown::-webkit-scrollbar-thumb{background:#444;border-radius:4px}.dropdown-menu.fixed-dropdown::-webkit-scrollbar-thumb:hover{background:#555}@media (max-width: 768px){.console-grid{display:flex;flex-direction:column;gap:10px;height:100%;overflow:hidden}.tile{transition:all .3s cubic-bezier(.25,.8,.25,1);display:flex;flex-direction:column}.tile.collapsed{flex:0 0 auto;max-height:40px!important;overflow:hidden}.tile.collapsed .table-container,.tile.collapsed .logs-container,.tile.collapsed .console-summary{display:none}.tile.expanded{flex:1 1 auto;max-height:100%!important;height:100%}.tile.config-tile{max-height:40vh}.tile.config-tile.expanded{max-height:100%}.inspector-panel{width:100%;height:100%;max-width:none;max-height:none;border-radius:0}.inspector-header{border-radius:0}.tile-header{flex-direction:column;align-items:flex-start;gap:8px}.tile-header .header-actions{width:100%;display:flex;justify-content:space-between}.tile-header .header-actions .search-input{flex-grow:1;margin-right:8px;width:auto}.tile-header .header-actions .search-input:focus{width:auto}}.console-summary{padding:4px;font-size:11px;color:#888}\n"]}]}],ctorParameters:()=>[{type:t.ChangeDetectorRef}],propDecorators:{logsContainer:[{type:g,args:["logsContainer"]}]}});class JsonEditorComponent{set jsonString(t){this._jsonString!==t&&(this._jsonString=t||"",this.initialJsonString=this._jsonString,this.isDirty=!1,this.updateHighlighting())}get jsonString(){return this._jsonString}_jsonString="";jsonStringChange=new h;highlightedHtml="";lineNumbersHtml="1";isExpanded=!1;isDirty=!1;initialJsonString="";backdropElement;textareaElement;lineNumbersElement;toggleExpand(){this.isExpanded=!this.isExpanded}onTextareaChange(t){this._jsonString=t.target.value,this.isDirty=this._jsonString!==this.initialJsonString,this.jsonStringChange.emit(this._jsonString),this.updateHighlighting()}onScroll(t){const e=t.target;this.backdropElement&&(this.backdropElement.nativeElement.scrollTop=e.scrollTop,this.backdropElement.nativeElement.scrollLeft=e.scrollLeft),this.lineNumbersElement&&(this.lineNumbersElement.nativeElement.scrollTop=e.scrollTop)}updateHighlighting(){this.highlightedHtml=this.syntaxHighlight(this._jsonString),this.updateLineNumbers()}updateLineNumbers(){if(!this._jsonString)return void(this.lineNumbersHtml="1");const t=this._jsonString.split("\n").length;this.lineNumbersHtml=Array.from({length:t},(t,e)=>e+1).join("\n")}syntaxHighlight(t){return t?t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*")(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,(t,e,r,n)=>{let o="json-value-number";if(/^"/.test(t)){if(n)return'<span class="json-key">'+e+"</span>"+n;o="json-value-string"}else/true|false/.test(t)?o="json-value-boolean":/null/.test(t)&&(o="json-value-null");return'<span class="'+o+'">'+t+"</span>"}):""}handleKeyDown(t){if("Tab"===t.key){t.preventDefault();const e=this.textareaElement.nativeElement,r=e.selectionStart,n=e.selectionEnd,o=e.value;e.value=o.substring(0,r)+" "+o.substring(n),e.selectionStart=e.selectionEnd=r+4,this.onTextareaChange({target:e})}}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:JsonEditorComponent,deps:[],target:t.ɵɵFactoryTarget.Component});static ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"20.3.16",type:JsonEditorComponent,isStandalone:!0,selector:"asor-json-editor",inputs:{jsonString:"jsonString"},outputs:{jsonStringChange:"jsonStringChange"},viewQueries:[{propertyName:"backdropElement",first:!0,predicate:["backdrop"],descendants:!0},{propertyName:"textareaElement",first:!0,predicate:["textarea"],descendants:!0},{propertyName:"lineNumbersElement",first:!0,predicate:["lineNumbers"],descendants:!0}],ngImport:t,template:'<div class="json-editor-backdrop" *ngIf="isExpanded" (click)="toggleExpand()"></div>\r\n<div class="json-editor-wrapper" [class.expanded]="isExpanded">\r\n\t<div class="editor-toolbar">\r\n\t\t<div class="toolbar-left">\r\n\t\t\t<span\r\n\t\t\t\tclass="status-dot"\r\n\t\t\t\t[class.dirty]="isDirty"\r\n\t\t\t\t[title]="isDirty ? \'JSON Alterato\' : \'JSON Originale\'"\r\n\t\t\t></span>\r\n\t\t\t<span class="editor-title">JSON Editor</span>\r\n\t\t</div>\r\n\t\t<button\r\n\t\t\tclass="expand-btn"\r\n\t\t\t[title]="isExpanded ? \'Collapse\' : \'Expand\'"\r\n\t\t\t(click)="toggleExpand()"\r\n\t\t>\r\n\t\t\t<svg\r\n\t\t\t\t*ngIf="!isExpanded"\r\n\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\twidth="14"\r\n\t\t\t\theight="14"\r\n\t\t\t\tstroke="currentColor"\r\n\t\t\t\tstroke-width="2"\r\n\t\t\t\tfill="none"\r\n\t\t\t\tstroke-linecap="round"\r\n\t\t\t\tstroke-linejoin="round"\r\n\t\t\t>\r\n\t\t\t\t<path d="M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7"></path>\r\n\t\t\t</svg>\r\n\t\t\t<svg\r\n\t\t\t\t*ngIf="isExpanded"\r\n\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\twidth="14"\r\n\t\t\t\theight="14"\r\n\t\t\t\tstroke="currentColor"\r\n\t\t\t\tstroke-width="2"\r\n\t\t\t\tfill="none"\r\n\t\t\t\tstroke-linecap="round"\r\n\t\t\t\tstroke-linejoin="round"\r\n\t\t\t>\r\n\t\t\t\t<path d="M4 14h6v6M20 10h-6V4M14 10l7-7M10 14l-7 7"></path>\r\n\t\t\t</svg>\r\n\t\t</button>\r\n\t</div>\r\n\t<div class="editor-main-area">\r\n\t\t<div class="editor-line-numbers-container">\r\n\t\t\t<pre class="editor-line-numbers" #lineNumbers>{{ lineNumbersHtml }}</pre>\r\n\t\t</div>\r\n\t\t<div class="json-editor-container">\r\n\t\t\t<pre\r\n\t\t\t\tclass="editor-backdrop"\r\n\t\t\t\t#backdrop\r\n\t\t\t\taria-hidden="true"\r\n\t\t\t><code [innerHTML]="highlightedHtml"></code></pre>\r\n\t\t\t<textarea\r\n\t\t\t\tclass="editor-textarea"\r\n\t\t\t\t#textarea\r\n\t\t\t\t[value]="jsonString"\r\n\t\t\t\t(input)="onTextareaChange($event)"\r\n\t\t\t\t(scroll)="onScroll($event)"\r\n\t\t\t\t(keydown)="handleKeyDown($event)"\r\n\t\t\t\tspellcheck="false"\r\n\t\t\t>\r\n\t\t\t</textarea>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n',styles:["asor-json-editor{display:flex;flex-direction:column;flex:1;width:100%;min-height:200px}.json-editor-backdrop{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:#0009;z-index:99998;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.json-editor-wrapper{position:relative;border:1px solid #3c3c3c;border-radius:4px;background-color:#1e1e1e;flex:1;display:flex;flex-direction:column}.json-editor-wrapper.expanded{position:fixed;top:5vh;left:5vw;width:90vw;height:90vh;z-index:99999;box-shadow:0 10px 40px #00000080;border:1px solid #555}.json-editor-wrapper:focus-within{border-color:#007acc}.json-editor-wrapper .editor-toolbar{display:flex;justify-content:flex-end;align-items:center;background-color:#2d2d2d;border-bottom:1px solid #3c3c3c;padding:2px 6px;min-height:22px}.json-editor-wrapper .toolbar-left{display:flex;align-items:center;margin-right:auto;padding-left:6px;gap:6px}.json-editor-wrapper .status-dot{width:8px;height:8px;border-radius:50%;background-color:#5ea33a;display:inline-block;transition:background-color .2s ease}.json-editor-wrapper .status-dot.dirty{background-color:#d19a66;box-shadow:0 0 4px #d19a6666}.json-editor-wrapper .editor-title{color:#ccc;font-family:inherit;font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.5px}.json-editor-wrapper .expand-btn{background:transparent;border:none;color:#ccc;cursor:pointer;padding:4px;display:flex;align-items:center;justify-content:center;border-radius:3px}.json-editor-wrapper .expand-btn:hover{background-color:#444;color:#fff}.json-editor-wrapper .editor-main-area{flex:1;display:flex;flex-direction:row;overflow:hidden}.json-editor-wrapper .editor-line-numbers-container{position:relative;width:48px;border-right:1px solid #3c3c3c;background-color:#1e1e1e;overflow:hidden;flex-shrink:0}.json-editor-wrapper .editor-line-numbers{margin:0;position:absolute;top:0;left:0;width:100%;height:100%;padding:12px 8px;font-family:Consolas,Monaco,Courier New,monospace;font-size:13px;line-height:1.5;white-space:pre;color:#858585;text-align:right;box-sizing:border-box;overflow:hidden;-webkit-user-select:none;user-select:none}.json-editor-wrapper .json-editor-container{position:relative;flex:1;overflow:hidden}.json-editor-wrapper .editor-backdrop,.json-editor-wrapper .editor-textarea{margin:0;position:absolute;top:0;left:0;width:100%;height:100%;padding:12px;font-family:Consolas,Monaco,Courier New,monospace;font-size:13px;line-height:1.5;white-space:pre;-moz-tab-size:4;-o-tab-size:4;tab-size:4;border:none;box-sizing:border-box;overflow:auto}.json-editor-wrapper .editor-backdrop{z-index:1;pointer-events:none;color:#d4d4d4;-ms-overflow-style:none;scrollbar-width:none}.json-editor-wrapper .editor-backdrop::-webkit-scrollbar{display:none}.json-editor-wrapper .editor-textarea{z-index:2;background-color:transparent;color:transparent;caret-color:#d4d4d4;resize:none;outline:none}.json-editor-wrapper .editor-textarea::selection{background-color:#264f7880;color:transparent}.json-editor-wrapper .editor-textarea::-webkit-scrollbar{width:10px;height:10px}.json-editor-wrapper .editor-textarea::-webkit-scrollbar-track{background:#1e1e1e}.json-editor-wrapper .editor-textarea::-webkit-scrollbar-thumb{background:#424242;border-radius:5px;border:2px solid #1e1e1e}.json-editor-wrapper .editor-textarea::-webkit-scrollbar-thumb:hover{background:#4f4f4f}.json-editor-wrapper .json-key{color:#9cdcfe}.json-editor-wrapper .json-value-string{color:#ce9178}.json-editor-wrapper .json-value-number{color:#b5cea8}.json-editor-wrapper .json-value-boolean,.json-editor-wrapper .json-value-null{color:#569cd6}\n"],dependencies:[{kind:"ngmodule",type:w},{kind:"directive",type:m.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]}],encapsulation:t.ViewEncapsulation.None})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:JsonEditorComponent,decorators:[{type:p,args:[{selector:"asor-json-editor",standalone:!0,imports:[w],encapsulation:d.None,template:'<div class="json-editor-backdrop" *ngIf="isExpanded" (click)="toggleExpand()"></div>\r\n<div class="json-editor-wrapper" [class.expanded]="isExpanded">\r\n\t<div class="editor-toolbar">\r\n\t\t<div class="toolbar-left">\r\n\t\t\t<span\r\n\t\t\t\tclass="status-dot"\r\n\t\t\t\t[class.dirty]="isDirty"\r\n\t\t\t\t[title]="isDirty ? \'JSON Alterato\' : \'JSON Originale\'"\r\n\t\t\t></span>\r\n\t\t\t<span class="editor-title">JSON Editor</span>\r\n\t\t</div>\r\n\t\t<button\r\n\t\t\tclass="expand-btn"\r\n\t\t\t[title]="isExpanded ? \'Collapse\' : \'Expand\'"\r\n\t\t\t(click)="toggleExpand()"\r\n\t\t>\r\n\t\t\t<svg\r\n\t\t\t\t*ngIf="!isExpanded"\r\n\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\twidth="14"\r\n\t\t\t\theight="14"\r\n\t\t\t\tstroke="currentColor"\r\n\t\t\t\tstroke-width="2"\r\n\t\t\t\tfill="none"\r\n\t\t\t\tstroke-linecap="round"\r\n\t\t\t\tstroke-linejoin="round"\r\n\t\t\t>\r\n\t\t\t\t<path d="M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7"></path>\r\n\t\t\t</svg>\r\n\t\t\t<svg\r\n\t\t\t\t*ngIf="isExpanded"\r\n\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\twidth="14"\r\n\t\t\t\theight="14"\r\n\t\t\t\tstroke="currentColor"\r\n\t\t\t\tstroke-width="2"\r\n\t\t\t\tfill="none"\r\n\t\t\t\tstroke-linecap="round"\r\n\t\t\t\tstroke-linejoin="round"\r\n\t\t\t>\r\n\t\t\t\t<path d="M4 14h6v6M20 10h-6V4M14 10l7-7M10 14l-7 7"></path>\r\n\t\t\t</svg>\r\n\t\t</button>\r\n\t</div>\r\n\t<div class="editor-main-area">\r\n\t\t<div class="editor-line-numbers-container">\r\n\t\t\t<pre class="editor-line-numbers" #lineNumbers>{{ lineNumbersHtml }}</pre>\r\n\t\t</div>\r\n\t\t<div class="json-editor-container">\r\n\t\t\t<pre\r\n\t\t\t\tclass="editor-backdrop"\r\n\t\t\t\t#backdrop\r\n\t\t\t\taria-hidden="true"\r\n\t\t\t><code [innerHTML]="highlightedHtml"></code></pre>\r\n\t\t\t<textarea\r\n\t\t\t\tclass="editor-textarea"\r\n\t\t\t\t#textarea\r\n\t\t\t\t[value]="jsonString"\r\n\t\t\t\t(input)="onTextareaChange($event)"\r\n\t\t\t\t(scroll)="onScroll($event)"\r\n\t\t\t\t(keydown)="handleKeyDown($event)"\r\n\t\t\t\tspellcheck="false"\r\n\t\t\t>\r\n\t\t\t</textarea>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n',styles:["asor-json-editor{display:flex;flex-direction:column;flex:1;width:100%;min-height:200px}.json-editor-backdrop{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:#0009;z-index:99998;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.json-editor-wrapper{position:relative;border:1px solid #3c3c3c;border-radius:4px;background-color:#1e1e1e;flex:1;display:flex;flex-direction:column}.json-editor-wrapper.expanded{position:fixed;top:5vh;left:5vw;width:90vw;height:90vh;z-index:99999;box-shadow:0 10px 40px #00000080;border:1px solid #555}.json-editor-wrapper:focus-within{border-color:#007acc}.json-editor-wrapper .editor-toolbar{display:flex;justify-content:flex-end;align-items:center;background-color:#2d2d2d;border-bottom:1px solid #3c3c3c;padding:2px 6px;min-height:22px}.json-editor-wrapper .toolbar-left{display:flex;align-items:center;margin-right:auto;padding-left:6px;gap:6px}.json-editor-wrapper .status-dot{width:8px;height:8px;border-radius:50%;background-color:#5ea33a;display:inline-block;transition:background-color .2s ease}.json-editor-wrapper .status-dot.dirty{background-color:#d19a66;box-shadow:0 0 4px #d19a6666}.json-editor-wrapper .editor-title{color:#ccc;font-family:inherit;font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.5px}.json-editor-wrapper .expand-btn{background:transparent;border:none;color:#ccc;cursor:pointer;padding:4px;display:flex;align-items:center;justify-content:center;border-radius:3px}.json-editor-wrapper .expand-btn:hover{background-color:#444;color:#fff}.json-editor-wrapper .editor-main-area{flex:1;display:flex;flex-direction:row;overflow:hidden}.json-editor-wrapper .editor-line-numbers-container{position:relative;width:48px;border-right:1px solid #3c3c3c;background-color:#1e1e1e;overflow:hidden;flex-shrink:0}.json-editor-wrapper .editor-line-numbers{margin:0;position:absolute;top:0;left:0;width:100%;height:100%;padding:12px 8px;font-family:Consolas,Monaco,Courier New,monospace;font-size:13px;line-height:1.5;white-space:pre;color:#858585;text-align:right;box-sizing:border-box;overflow:hidden;-webkit-user-select:none;user-select:none}.json-editor-wrapper .json-editor-container{position:relative;flex:1;overflow:hidden}.json-editor-wrapper .editor-backdrop,.json-editor-wrapper .editor-textarea{margin:0;position:absolute;top:0;left:0;width:100%;height:100%;padding:12px;font-family:Consolas,Monaco,Courier New,monospace;font-size:13px;line-height:1.5;white-space:pre;-moz-tab-size:4;-o-tab-size:4;tab-size:4;border:none;box-sizing:border-box;overflow:auto}.json-editor-wrapper .editor-backdrop{z-index:1;pointer-events:none;color:#d4d4d4;-ms-overflow-style:none;scrollbar-width:none}.json-editor-wrapper .editor-backdrop::-webkit-scrollbar{display:none}.json-editor-wrapper .editor-textarea{z-index:2;background-color:transparent;color:transparent;caret-color:#d4d4d4;resize:none;outline:none}.json-editor-wrapper .editor-textarea::selection{background-color:#264f7880;color:transparent}.json-editor-wrapper .editor-textarea::-webkit-scrollbar{width:10px;height:10px}.json-editor-wrapper .editor-textarea::-webkit-scrollbar-track{background:#1e1e1e}.json-editor-wrapper .editor-textarea::-webkit-scrollbar-thumb{background:#424242;border-radius:5px;border:2px solid #1e1e1e}.json-editor-wrapper .editor-textarea::-webkit-scrollbar-thumb:hover{background:#4f4f4f}.json-editor-wrapper .json-key{color:#9cdcfe}.json-editor-wrapper .json-value-string{color:#ce9178}.json-editor-wrapper .json-value-number{color:#b5cea8}.json-editor-wrapper .json-value-boolean,.json-editor-wrapper .json-value-null{color:#569cd6}\n"]}]}],propDecorators:{jsonString:[{type:c}],jsonStringChange:[{type:b}],backdropElement:[{type:g,args:["backdrop"]}],textareaElement:[{type:g,args:["textarea"]}],lineNumbersElement:[{type:g,args:["lineNumbers"]}]}});class StateWidgetSpyService extends StateService{stateService;constructor(t){super(),this.stateService=t}initialize(t){this.stateService.initialize(t)}createDataSet(t,e,r){return this.stateService.createDataSet(t,e,r)}readDataSet(t){return this.stateService.readDataSet(t)}updateDataSet(t,e,r){return this.stateService.updateDataSet(t,e,r)}deleteRootDataSet(t){this.stateService.deleteRootDataSet(t)}registry(t,e,r){return this.stateService.registry(t,e,r)}resolveProps(t){return this.stateService.resolveProps(t)}getContainerRoot(){return this.stateService.containerRoot}getRegistryMap(){return this.stateService.registryMap}getConf(){return this.stateService.conf}getInitialized(){return this.stateService.initialized}getIntervalId(){return this.stateService.intervalId}getFisicalStorageTypeByJob(){return!(!this.stateService.conf||!this.stateService.conf.asyncEnabled)}getSecretKey(){return this.stateService.getStateKey()}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:StateWidgetSpyService,deps:[{token:StateService}],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:StateWidgetSpyService,providedIn:"root"})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:StateWidgetSpyService,decorators:[{type:r,args:[{providedIn:"root"}]}],ctorParameters:()=>[{type:StateService}]});class StorageTabComponent{widgetSpyService;autoRefresh=!1;autoRefreshInterval;containerRoot=[];registryRows=[];registryGroups=[];registrySearchTerm="";config;isInitialized=!1;fisicalStorageTypeByJob=!1;viewMode="list";targetElement=null;viewData=null;sectionsCollapsed={status:!1,containers:!1,registry:!1};editJsonString="";editError=null;inputKey="";decryptError=null;pendingAction=null;constructor(t){this.widgetSpyService=t}toggleSection(t){this.sectionsCollapsed[t]=!this.sectionsCollapsed[t]}ngOnInit(){this.refreshState()}ngOnDestroy(){this.stopAutoRefresh()}toggleAutoRefresh(){this.autoRefresh?this.startAutoRefresh():this.stopAutoRefresh()}startAutoRefresh(){this.stopAutoRefresh(),this.autoRefreshInterval=setInterval(()=>{"list"===this.viewMode&&this.refreshState()},2e3)}stopAutoRefresh(){this.autoRefreshInterval&&(clearInterval(this.autoRefreshInterval),this.autoRefreshInterval=null)}refreshState(){this.isInitialized=this.widgetSpyService.getInitialized(),this.config=this.widgetSpyService.getConf(),this.containerRoot=this.widgetSpyService.getContainerRoot(),this.fisicalStorageTypeByJob=this.widgetSpyService.getFisicalStorageTypeByJob(),this.parseRegistry(this.widgetSpyService.getRegistryMap())}get filteredRegistryGroups(){if(!this.registrySearchTerm||""===this.registrySearchTerm.trim())return this.registryGroups;const t=this.registrySearchTerm.toLowerCase();return this.registryGroups.map(e=>{if(e.component.toLowerCase().includes(t))return e;const r=e.entries.filter(e=>e.prop.toLowerCase().includes(t)||e.path.toLowerCase().includes(t));return r.length>0?{...e,entries:r}:null}).filter(t=>null!==t)}openView(t){this.targetElement=t,t.encrypt?(this.pendingAction="view",this.viewMode="decrypt",this.inputKey=this.widgetSpyService.getSecretKey()||"",this.decryptError=null):(this.viewData=t.data,this.viewMode="view")}startDelete(t){this.targetElement=t,this.viewMode="delete"}confirmDelete(){this.targetElement&&(this.widgetSpyService.deleteRootDataSet(this.targetElement.name),this.cancelAction(),this.refreshState())}startEdit(t){this.targetElement=t,t.encrypt?(this.pendingAction="edit",this.viewMode="decrypt",this.inputKey=this.widgetSpyService.getSecretKey()||"",this.decryptError=null):(this.viewMode="edit",this.editJsonString=JSON.stringify(t.data,null,4),this.editError=null)}verifyKey(){if(this.targetElement&&this.inputKey)try{const t=B.AES.decrypt(this.targetElement.data,this.inputKey).toString(B.enc.Utf8);if(!t)throw new Error("Malformed key or data");const e=JSON.parse(t);"view"===this.pendingAction?(this.viewMode="view",this.viewData=e):(this.viewMode="edit",this.editJsonString=JSON.stringify(e,null,4),this.editError=null)}catch(t){this.decryptError="Invalid Key or Corrupted Data"}}saveEdit(){if(this.targetElement)try{const t=JSON.parse(this.editJsonString);let e=!1;Object.keys(t).forEach(r=>{this.widgetSpyService.updateDataSet(`${this.targetElement.name}.${r}`,t[r])||(e=!0)}),e?this.editError="Failed to update some fields. Please check the console/logs.":(this.cancelAction(),this.refreshState())}catch(t){this.editError="Invalid JSON: "+t.message}}cancelAction(){this.viewMode="list",this.targetElement=null,this.viewData=null,this.editJsonString="",this.editError=null,this.inputKey="",this.decryptError=null,this.pendingAction=null}parseRegistry(t){this.registryRows=[],this.registryGroups=[];const e=new Map;t.forEach((t,r)=>{const n=r.match(/\[([^\]]+)\]<([^>]+)>;(.+)/);let o;o=n?{component:n[1],prop:n[2],path:n[3]}:{component:"Unknown",prop:r,path:"Unknown"},this.registryRows.push(o),e.has(o.component)||e.set(o.component,[]),e.get(o.component).push(o)});const r=Array.from(e.keys()).sort((t,e)=>t.localeCompare(e));this.registryGroups=r.map(t=>({component:t,entries:e.get(t).sort((t,e)=>t.prop.localeCompare(e.prop))})),this.registryRows.sort((t,e)=>t.component.localeCompare(e.component))}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:StorageTabComponent,deps:[{token:StateWidgetSpyService}],target:t.ɵɵFactoryTarget.Component});static ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"20.3.16",type:StorageTabComponent,isStandalone:!0,selector:"asor-storage-tab",ngImport:t,template:'<div class="state-dashboard">\r\n\t\x3c!-- Header Stats --\x3e\r\n\t<div class="section-container header-section">\r\n\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.status">\r\n\t\t\t<div class="dashboard-header">\r\n\t\t\t\t<div class="stat-card" [class.active]="isInitialized">\r\n\t\t\t\t\t<div class="label">Initialized</div>\r\n\t\t\t\t\t<div class="value">{{ isInitialized ? \'YES\' : \'NO\' }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Sync Interval</div>\r\n\t\t\t\t\t<div class="value">{{ fisicalStorageTypeByJob ? \'Job\' : \'On Change\' }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card" *ngIf="config">\r\n\t\t\t\t\t<div class="label">Encryption</div>\r\n\t\t\t\t\t<div class="value">{{ config.encryptionType }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Data Elements</div>\r\n\t\t\t\t\t<div class="value">{{ containerRoot.length }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Registry Entries</div>\r\n\t\t\t\t\t<div class="value">{{ registryRows.length }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div class="header-toolbar">\r\n\t\t\t\x3c!-- <div class="auto-refresh-toggle" title="Auto Refresh State (5s)">\r\n\t\t\t\t<input\r\n\t\t\t\t\tid="autoRefresh"\r\n\t\t\t\t\t[(ngModel)]="autoRefresh"\r\n\t\t\t\t\t(change)="toggleAutoRefresh()"\r\n\t\t\t\t\ttype="checkbox"\r\n\t\t\t\t/>\r\n\t\t\t\t<label for="autoRefresh">Auto Refresh</label>\r\n\t\t\t</div> --\x3e\r\n\t\t\t<button\r\n\t\t\t\tclass="circle-c-btn"\r\n\t\t\t\t(click)="refreshState(); $event.stopPropagation()"\r\n\t\t\t\ttitle="Refresh State"\r\n\t\t\t>\r\n\t\t\t\t↻\r\n\t\t\t</button>\r\n\t\t\t<button\r\n\t\t\t\tclass="circle-c-btn"\r\n\t\t\t\t[class.collapsed]="sectionsCollapsed.status"\r\n\t\t\t\t(click)="toggleSection(\'status\')"\r\n\t\t\t\ttitle="Toggle Status"\r\n\t\t\t>\r\n\t\t\t\t▾\r\n\t\t\t</button>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<div class="dashboard-content">\r\n\t\t<div class="split-view">\r\n\t\t\t\x3c!-- Data Elements Section --\x3e\r\n\t\t\t<div class="section-container">\r\n\t\t\t\t<h4 class="section-title" (click)="toggleSection(\'containers\')">\r\n\t\t\t\t\t<span>Data Containers</span>\r\n\t\t\t\t\t<span class="collapse-icon" [class.collapsed]="sectionsCollapsed.containers"\r\n\t\t\t\t\t\t>▾</span\r\n\t\t\t\t\t>\r\n\t\t\t\t</h4>\r\n\t\t\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.containers">\r\n\t\t\t\t\t<ng-container [ngSwitch]="viewMode">\r\n\t\t\t\t\t\t\x3c!-- LIST MODE --\x3e\r\n\t\t\t\t\t\t<ng-container *ngSwitchCase="\'list\'">\r\n\t\t\t\t\t\t\t<div class="data-grid" *ngIf="containerRoot.length > 0; else noData">\r\n\t\t\t\t\t\t\t\t<div class="data-card" *ngFor="let element of containerRoot">\r\n\t\t\t\t\t\t\t\t\t<div class="card-header">\r\n\t\t\t\t\t\t\t\t\t\t<div class="header-left">\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="element-name"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="startEdit(element)"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Click to Edit"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>{{ element.name }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="store-badge"\r\n\t\t\t\t\t\t\t\t\t\t\t\t[ngClass]="element.storeType.toLowerCase()"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>{{ element.storeType }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t<div class="header-actions">\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="action-btn edit"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="startEdit(element)"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Edit"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="action-btn delete"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="startDelete(element)"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Delete"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<polyline points="3 6 5 6 21 6"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2-2v2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="10" y1="11" x2="10" y2="17"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="14" y1="11" x2="14" y2="17"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\t\tclass="card-body"\r\n\t\t\t\t\t\t\t\t\t\t(click)="openView(element)"\r\n\t\t\t\t\t\t\t\t\t\ttitle="Click to View"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<asor-json-view [data]="element.data"></asor-json-view>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<div class="card-footer">\r\n\t\t\t\t\t\t\t\t\t\t<span class="update-time"\r\n\t\t\t\t\t\t\t\t\t\t\t>Updated:\r\n\t\t\t\t\t\t\t\t\t\t\t{{ element.lastUpdate | date: \'mediumTime\' }}</span\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<div class="flags">\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Reads"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstyle="\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmargin-right: 8px;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: inline-flex;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talign-items: center;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tgap: 4px;\r\n\t\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg read"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<circle cx="12" cy="12" r="3"></circle>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{{ element.readCount || 0 }}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Writes"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstyle="\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmargin-right: 8px;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: inline-flex;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talign-items: center;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tgap: 4px;\r\n\t\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg write"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<polyline\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpoints="17 21 17 13 7 13 7 21"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<polyline points="7 3 7 8 15 8"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{{ element.writeCount || 0 }}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\t*ngIf="element.encrypt"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Encrypted"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstyle="display: inline-flex; align-items: center"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg lock"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<rect\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tx="3"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ty="11"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth="18"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\theight="11"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trx="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\try="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></rect>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path d="M7 11V7a5 5 0 0 1 10 0v4"></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\t*ngIf="element.freeze"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Frozen"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstyle="display: inline-flex; align-items: center"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg freeze"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="2" y1="2" x2="22" y2="22"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="12" y1="2" x2="12" y2="22"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="22" y1="2" x2="2" y2="22"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="2" y1="12" x2="22" y2="12"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<ng-template #noData>\r\n\t\t\t\t\t\t\t\t<div class="empty-state">\r\n\t\t\t\t\t\t\t\t\tNo data elements found in StateService.\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t</ng-container>\r\n\r\n\t\t\t\t\t\t\x3c!-- VIEW MODE --\x3e\r\n\t\t\t\t\t\t<div class="inline-view" *ngSwitchCase="\'view\'">\r\n\t\t\t\t\t\t\t<div class="view-header">\r\n\t\t\t\t\t\t\t\t<h3>\r\n\t\t\t\t\t\t\t\t\tView Dataset:\r\n\t\t\t\t\t\t\t\t\t<span class="highlight">{{ targetElement?.name }}</span>\r\n\t\t\t\t\t\t\t\t</h3>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-body data-panel">\r\n\t\t\t\t\t\t\t\t<asor-json-view\r\n\t\t\t\t\t\t\t\t\t[data]="viewData"\r\n\t\t\t\t\t\t\t\t\t[expandDepth]="1"\r\n\t\t\t\t\t\t\t\t></asor-json-view>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-footer">\r\n\t\t\t\t\t\t\t\t<button class="btn-cancel" (click)="cancelAction()">Back</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\x3c!-- EDIT MODE --\x3e\r\n\t\t\t\t\t\t<div class="inline-view" *ngSwitchCase="\'edit\'">\r\n\t\t\t\t\t\t\t<div class="view-header">\r\n\t\t\t\t\t\t\t\t<h3>\r\n\t\t\t\t\t\t\t\t\tEdit Dataset:\r\n\t\t\t\t\t\t\t\t\t<span class="highlight">{{ targetElement?.name }}</span>\r\n\t\t\t\t\t\t\t\t</h3>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-body">\r\n\t\t\t\t\t\t\t\t<asor-json-editor\r\n\t\t\t\t\t\t\t\t\t[(jsonString)]="editJsonString"\r\n\t\t\t\t\t\t\t\t></asor-json-editor>\r\n\t\t\t\t\t\t\t\t<div class="error-msg" *ngIf="editError">{{ editError }}</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-footer">\r\n\t\t\t\t\t\t\t\t<button class="btn-cancel" (click)="cancelAction()">Cancel</button>\r\n\t\t\t\t\t\t\t\t<button class="btn-save" (click)="saveEdit()">Save Changes</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\x3c!-- DECRYPT MODE --\x3e\r\n\t\t\t\t\t\t<div class="inline-view centered" *ngSwitchCase="\'decrypt\'">\r\n\t\t\t\t\t\t\t<div class="view-header">\r\n\t\t\t\t\t\t\t\t<h3>\r\n\t\t\t\t\t\t\t\t\tDecrypt Dataset:\r\n\t\t\t\t\t\t\t\t\t<span class="highlight">{{ targetElement?.name }}</span>\r\n\t\t\t\t\t\t\t\t</h3>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-body">\r\n\t\t\t\t\t\t\t\t<p class="instruction">\r\n\t\t\t\t\t\t\t\t\tThis dataset is encrypted. Please enter the key to unlock it.\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\tclass="key-input"\r\n\t\t\t\t\t\t\t\t\t[(ngModel)]="inputKey"\r\n\t\t\t\t\t\t\t\t\t(keydown.enter)="verifyKey()"\r\n\t\t\t\t\t\t\t\t\ttype="password"\r\n\t\t\t\t\t\t\t\t\tplaceholder="Enter Decryption Key"\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t<div class="error-msg" *ngIf="decryptError">{{ decryptError }}</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-footer">\r\n\t\t\t\t\t\t\t\t<button class="btn-cancel" (click)="cancelAction()">Cancel</button>\r\n\t\t\t\t\t\t\t\t<button class="btn-save" (click)="verifyKey()">Unlock</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\x3c!-- DELETE MODE --\x3e\r\n\t\t\t\t\t\t<div class="inline-view centered" *ngSwitchCase="\'delete\'">\r\n\t\t\t\t\t\t\t<div class="view-header">\r\n\t\t\t\t\t\t\t\t<h3>Delete Dataset</h3>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-body">\r\n\t\t\t\t\t\t\t\t<p class="confirmation-text">\r\n\t\t\t\t\t\t\t\t\tAre you sure you want to delete\r\n\t\t\t\t\t\t\t\t\t<span class="highlight">{{ targetElement?.name }}</span\r\n\t\t\t\t\t\t\t\t\t>?\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t\t<p class="warning-text">This action cannot be undone.</p>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-footer">\r\n\t\t\t\t\t\t\t\t<button class="btn-cancel" (click)="cancelAction()">Cancel</button>\r\n\t\t\t\t\t\t\t\t<button class="btn-delete-confirm" (click)="confirmDelete()">\r\n\t\t\t\t\t\t\t\t\tDelete\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</ng-container>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t\x3c!-- Registry Section --\x3e\r\n\t\t\t<div class="section-container">\r\n\t\t\t\t<h4 class="section-title" (click)="toggleSection(\'registry\')">\r\n\t\t\t\t\t<span>Component Registry</span>\r\n\t\t\t\t\t<span class="collapse-icon" [class.collapsed]="sectionsCollapsed.registry"\r\n\t\t\t\t\t\t>▾</span\r\n\t\t\t\t\t>\r\n\t\t\t\t</h4>\r\n\t\t\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.registry">\r\n\t\t\t\t\t<div class="registry-toolbar">\r\n\t\t\t\t\t\t<div class="search-container">\r\n\t\t\t\t\t\t\t<span class="search-icon">\r\n\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<circle cx="11" cy="11" r="8"></circle>\r\n\t\t\t\t\t\t\t\t\t<line x1="21" y1="21" x2="16.65" y2="16.65"></line>\r\n\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\tclass="registry-search"\r\n\t\t\t\t\t\t\t\t[(ngModel)]="registrySearchTerm"\r\n\t\t\t\t\t\t\t\ttype="text"\r\n\t\t\t\t\t\t\t\tplaceholder="Filter by component, prop or path..."\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tclass="clear-search-btn"\r\n\t\t\t\t\t\t\t\t*ngIf="registrySearchTerm"\r\n\t\t\t\t\t\t\t\t(click)="registrySearchTerm = \'\'"\r\n\t\t\t\t\t\t\t\ttitle="Clear search"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t×\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class="registry-table-container">\r\n\t\t\t\t\t\t<ng-container *ngIf="filteredRegistryGroups.length > 0; else emptyRegistry">\r\n\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\tclass="registry-group"\r\n\t\t\t\t\t\t\t\t*ngFor="let group of filteredRegistryGroups"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<div class="registry-group-header">\r\n\t\t\t\t\t\t\t\t\t<span class="comp-icon">\r\n\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<polygon points="12 2 2 7 12 12 22 7 12 2"></polygon>\r\n\t\t\t\t\t\t\t\t\t\t\t<polyline points="2 17 12 22 22 17"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t<polyline points="2 12 12 17 22 12"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t<span class="comp-name">{{ group.component }}</span>\r\n\t\t\t\t\t\t\t\t\t<span class="comp-count"\r\n\t\t\t\t\t\t\t\t\t\t>{{ group.entries.length }} prop{{\r\n\t\t\t\t\t\t\t\t\t\t\tgroup.entries.length > 1 ? \'s\' : \'\'\r\n\t\t\t\t\t\t\t\t\t\t}}</span\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t<div class="registry-list">\r\n\t\t\t\t\t\t\t\t\t<div class="registry-item" *ngFor="let row of group.entries">\r\n\t\t\t\t\t\t\t\t\t\t<span class="prop-badge">{{ row.prop }}</span>\r\n\t\t\t\t\t\t\t\t\t\t<span class="path-text">{{ row.path }}</span>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</ng-container>\r\n\r\n\t\t\t\t\t\t<ng-template #emptyRegistry>\r\n\t\t\t\t\t\t\t<div class="empty-state">\r\n\t\t\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\t\t\tregistrySearchTerm\r\n\t\t\t\t\t\t\t\t\t\t? \'No components match the filter.\'\r\n\t\t\t\t\t\t\t\t\t\t: \'No registered components.\'\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n',styles:[".state-dashboard{display:flex;flex-direction:column;height:100%;color:#ccc;font-family:Segoe UI,sans-serif;gap:6px}.state-dashboard .dashboard-header{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.state-dashboard .dashboard-header .stat-card{background-color:#252526;border:1px solid #333;border-radius:6px;padding:8px 12px;min-width:100px;display:flex;flex-direction:column;align-items:center}.state-dashboard .dashboard-header .stat-card .label{font-size:10px;color:#888;text-transform:uppercase;letter-spacing:.5px}.state-dashboard .dashboard-header .stat-card .value{font-size:14px;font-weight:600;color:#eee;margin-top:2px}.state-dashboard .dashboard-header .stat-card.active .value{color:#4caf50}.state-dashboard .dashboard-content{flex:1;overflow-y:auto;padding-right:5px}.state-dashboard .dashboard-content .split-view{display:flex;gap:20px;height:100%}.state-dashboard .dashboard-content .section-container{display:flex;flex-direction:column;overflow:hidden;border:1px solid #333;border-radius:6px;margin-bottom:20px;flex:1;min-width:0}@media (max-width: 768px){.state-dashboard .dashboard-content .split-view{flex-direction:column;height:auto}.state-dashboard .dashboard-content .section-container{flex:none}}.state-dashboard .dashboard-content .section-title{margin:4px 8px;font-size:13px;color:#888;font-weight:600;display:flex;justify-content:space-between;align-items:center;cursor:pointer;border-radius:4px}.state-dashboard .dashboard-content .section-title:hover{background-color:#2a2a2a}.state-dashboard .dashboard-content .section-title .collapse-icon{font-size:14px;transition:transform .25s ease}.state-dashboard .dashboard-content .section-title .collapse-icon.collapsed{transform:rotate(-90deg)}.state-dashboard .dashboard-content .section-title.mt-4{margin-top:20px}.state-dashboard .dashboard-content .data-grid{overflow-y:auto;flex:1;padding:5px;display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px;align-content:start}.state-dashboard .dashboard-content .data-card{background-color:#1e1e1e;border:1px solid #333;border-radius:6px;overflow:hidden;display:flex;flex-direction:column;height:max-content;margin:5px}.state-dashboard .dashboard-content .data-card:hover{border-color:#007acc}.state-dashboard .dashboard-content .data-card .card-header{background-color:#252526;padding:8px 12px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #333}.state-dashboard .dashboard-content .data-card .card-header .element-name{font-weight:600;color:#dcdcaa}.state-dashboard .dashboard-content .data-card .card-header .store-badge{font-size:10px;padding:2px 6px;border-radius:4px;font-weight:600}.state-dashboard .dashboard-content .data-card .card-header .store-badge.session{background-color:#0e639c33;color:#4fc1ff}.state-dashboard .dashboard-content .data-card .card-header .store-badge.local{background-color:#60ac3933;color:#b5cea8}.state-dashboard .dashboard-content .data-card .card-body{padding:10px;max-height:200px;overflow-y:auto;font-family:monospace;font-size:12px}.state-dashboard .dashboard-content .data-card .card-footer{padding:6px 12px;background-color:#252526;font-size:11px;color:#666;display:flex;justify-content:space-between;align-items:center;border-top:1px solid #333}.state-dashboard .dashboard-content .data-card .card-footer .flags{display:flex;gap:6px}.state-dashboard .dashboard-content .registry-toolbar{padding:8px 10px;background-color:#252526;border-bottom:1px solid #333;border-radius:4px}.state-dashboard .dashboard-content .registry-toolbar .search-container{position:relative;display:flex;align-items:center;background-color:#1e1e1e;border:1px solid #3c3c3c;border-radius:4px}.state-dashboard .dashboard-content .registry-toolbar .search-container:focus-within{border-color:#007acc}.state-dashboard .dashboard-content .registry-toolbar .search-container .search-icon{padding:0 8px;color:#888;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-toolbar .search-container .registry-search{flex:1;background:transparent;border:none;color:#d4d4d4;padding:6px 0;font-size:13px;font-family:inherit;outline:none}.state-dashboard .dashboard-content .registry-toolbar .search-container .registry-search::placeholder{color:#666}.state-dashboard .dashboard-content .registry-toolbar .search-container .clear-search-btn{background:transparent;border:none;color:#888;padding:0 8px;cursor:pointer;font-size:16px;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-toolbar .search-container .clear-search-btn:hover{color:#ccc}.state-dashboard .dashboard-content .registry-table-container{overflow-y:auto;flex:1;padding:2px 5px 20px}.state-dashboard .dashboard-content .registry-table-container .registry-group{margin-bottom:16px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header{display:flex;align-items:center;gap:8px;padding:6px 12px;background-color:#252526;border-top:1px solid #333;border-bottom:1px solid #333;border-radius:4px;position:sticky;top:0;z-index:10}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-icon{color:#4ec9b0;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-name{color:#4ec9b0;font-weight:600;font-size:13px;flex:1}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-count{font-size:11px;color:#888;background:#ffffff0d;padding:2px 6px;border-radius:10px}.state-dashboard .dashboard-content .registry-table-container .registry-list{display:flex;flex-direction:column}.state-dashboard .dashboard-content .registry-table-container .registry-list .registry-item{display:flex;align-items:flex-start;padding:8px 12px 8px 36px;border-bottom:1px solid #333;font-size:12px}.state-dashboard .dashboard-content .registry-table-container .registry-list .registry-item:last-child{border-bottom:none}.state-dashboard .dashboard-content .registry-table-container .registry-list .registry-item .prop-badge{background-color:#9cdcfe26;color:#9cdcfe;padding:2px 6px;border-radius:4px;font-family:monospace;margin-right:8px;white-space:nowrap;font-weight:600}.state-dashboard .dashboard-content .registry-table-container .registry-list .registry-item .path-text{color:#ce9178;font-family:monospace;word-break:break-all;margin-top:2px}.state-dashboard .dashboard-content .empty-state{padding:20px;text-align:center;color:#666;font-style:italic}.state-dashboard .header-toolbar{display:flex;justify-content:flex-end;gap:6px;padding:4px 8px}.state-dashboard .header-toolbar .circle-c-btn{background:none;border:1px solid #444;color:#ccc;cursor:pointer;width:30px;height:30px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s}.state-dashboard .header-toolbar .circle-c-btn:hover{background-color:#333}.state-dashboard .header-toolbar .circle-c-btn:active{background-color:#444;transform:scale(.95)}.state-dashboard .header-toolbar .circle-c-btn.collapsed{transform:rotate(-90deg)}.state-dashboard .header-toolbar .auto-refresh-toggle{display:flex;align-items:center;gap:6px;background:#ffffff0d;border:1px solid #444;border-radius:15px;padding:2px 10px;height:30px;margin-right:4px;transition:all .2s}.state-dashboard .header-toolbar .auto-refresh-toggle:hover{background-color:#ffffff1a;border-color:#666}.state-dashboard .header-toolbar .auto-refresh-toggle input[type=checkbox]{cursor:pointer;width:14px;height:14px;accent-color:#007acc;margin:0}.state-dashboard .header-toolbar .auto-refresh-toggle label{font-size:11px;color:#888;cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.state-dashboard .header-toolbar .auto-refresh-toggle:has(input:checked){border-color:#007acc;background-color:#007acc1a}.state-dashboard .header-toolbar .auto-refresh-toggle:has(input:checked) label{color:#007acc;font-weight:600}.state-dashboard .header-section{flex-shrink:0;display:flex;flex-direction:row;align-items:flex-start;border-radius:6px;background-color:#1e1e1e;overflow:hidden}.state-dashboard .header-section .section-body{flex:1;min-width:0;padding:5px;transition:opacity .25s ease}.state-dashboard .header-section .section-body.collapsed{padding:0;margin:0;max-height:0;opacity:0}@media (max-width: 768px){.state-dashboard .header-section{display:unset}}.state-dashboard .section-title{display:flex;justify-content:space-between;align-items:center;margin-top:0;margin-bottom:2px}.state-dashboard .section-title .collapse-icon{display:none}.state-dashboard .section-body{padding:5px;flex:1;display:flex;flex-direction:column;overflow:hidden;min-height:0;max-height:2000px;transition:max-height .35s ease,opacity .25s ease;opacity:1}.state-dashboard .section-body.collapsed{padding:0;margin:0;max-height:0;opacity:0}@media (max-width: 768px){.state-dashboard .section-title{cursor:pointer;-webkit-user-select:none;user-select:none;padding:8px 4px;border-radius:4px;transition:background-color .2s}.state-dashboard .section-title:hover{background-color:#2a2a2a}.state-dashboard .section-title .collapse-icon{display:inline-block;font-size:14px;transition:transform .25s ease}.state-dashboard .section-title .collapse-icon.collapsed{transform:rotate(-90deg)}}.state-dashboard .card-header .header-left{display:flex;align-items:center;gap:8px}.state-dashboard .card-header .header-left .element-name{cursor:pointer}.state-dashboard .card-header .header-left .element-name:hover{text-decoration:underline;color:#4fc1ff}.state-dashboard .card-header .header-actions{display:flex;gap:4px}.state-dashboard .card-header .header-actions .action-btn{background:none;border:none;cursor:pointer;font-size:14px;padding:2px 4px;border-radius:4px;transition:background-color .2s}.state-dashboard .card-header .header-actions .action-btn:hover{background-color:#ffffff1a}.state-dashboard .card-header .header-actions .action-btn.delete:hover{background-color:#f4877133}.state-dashboard .card-body{cursor:pointer;transition:background-color .2s}.state-dashboard .card-body:hover{background-color:#252526}.icon-svg{vertical-align:middle}.icon-svg.read{color:#4ec9b0}.icon-svg.write{color:#ce9178}.icon-svg.lock{color:#dcdcaa}.icon-svg.freeze{color:#569cd6}.inline-view{display:flex;flex-direction:column;flex:1;min-height:0;padding:0 16px 16px;background-color:transparent;color:#ccc}.inline-view.centered{align-items:center;justify-content:center;text-align:center}.inline-view .view-header{margin-bottom:16px}.inline-view .view-header h3{margin:0;font-size:1.1rem;color:#d4d4d4}.inline-view .view-header h3 .highlight{color:#4ec9b0;font-family:Consolas,Monaco,monospace}.inline-view .view-body{flex:1;width:100%;display:flex;flex-direction:column;min-height:0;overflow:hidden;margin-bottom:10px}.inline-view .view-body.data-panel{overflow:auto;background-color:#1e1e1e;border:1px solid #3c3c3c;border-radius:4px}.inline-view .view-body .json-editor{flex:1;width:100%;background-color:#1e1e1e;color:#d4d4d4;border:1px solid #3c3c3c;border-radius:4px;padding:12px;font-family:Consolas,Monaco,monospace;font-size:13px;resize:none;outline:none}.inline-view .view-body .json-editor:focus{border-color:#007acc}.inline-view .view-body .instruction{margin-bottom:12px;color:#ccc}.inline-view .view-body .key-input{width:100%;max-width:300px;margin:0 auto;padding:8px 12px;background-color:#252526;border:1px solid #3c3c3c;border-radius:4px;color:#d4d4d4;font-size:14px}.inline-view .view-body .key-input:focus{border-color:#007acc;outline:none}.inline-view .view-body .confirmation-text{font-size:1.1rem;margin-bottom:8px}.inline-view .view-body .confirmation-text .highlight{color:#ce9178;font-weight:700}.inline-view .view-body .warning-text{color:#d16969;font-size:.9rem}.inline-view .view-body .error-msg{color:#f14c4c;margin-top:8px;font-size:.9em}.inline-view .view-footer{display:flex;justify-content:flex-end;gap:12px}.centered .inline-view .view-footer{justify-content:center}.inline-view .view-footer button{padding:6px 16px;border-radius:4px;border:none;cursor:pointer;font-size:13px;transition:background-color .2s}.inline-view .view-footer button.btn-cancel{background-color:#3c3c3c;color:#ccc}.inline-view .view-footer button.btn-cancel:hover{background-color:#4c4c4c}.inline-view .view-footer button.btn-save{background-color:#007acc;color:#fff}.inline-view .view-footer button.btn-save:hover{background-color:#0062a3}.inline-view .view-footer button.btn-delete-confirm{background-color:#ce9178;color:#1e1e1e;font-weight:500}.inline-view .view-footer button.btn-delete-confirm:hover{background-color:#b87b66}:host{display:block;height:100%}:host *::-webkit-scrollbar{width:8px;height:8px}:host *::-webkit-scrollbar-track{background:#1e1e1e;border-radius:4px}:host *::-webkit-scrollbar-thumb{background:#444;border-radius:4px}:host *::-webkit-scrollbar-thumb:hover{background:#555}\n"],dependencies:[{kind:"ngmodule",type:w},{kind:"directive",type:m.NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:m.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:m.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:m.NgSwitch,selector:"[ngSwitch]",inputs:["ngSwitch"]},{kind:"directive",type:m.NgSwitchCase,selector:"[ngSwitchCase]",inputs:["ngSwitchCase"]},{kind:"component",type:JsonViewComponent,selector:"asor-json-view",inputs:["data","key","level","expandDepth"]},{kind:"ngmodule",type:F},{kind:"directive",type:H.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:H.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:H.NgModel,selector:"[ngModel]:not([formControlName]):not([formControl])",inputs:["name","disabled","ngModel","ngModelOptions"],outputs:["ngModelChange"],exportAs:["ngModel"]},{kind:"component",type:JsonEditorComponent,selector:"asor-json-editor",inputs:["jsonString"],outputs:["jsonStringChange"]},{kind:"pipe",type:m.DatePipe,name:"date"}],encapsulation:t.ViewEncapsulation.ShadowDom})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:StorageTabComponent,decorators:[{type:p,args:[{selector:"asor-storage-tab",standalone:!0,imports:[w,JsonViewComponent,F,JsonEditorComponent],encapsulation:d.ShadowDom,template:'<div class="state-dashboard">\r\n\t\x3c!-- Header Stats --\x3e\r\n\t<div class="section-container header-section">\r\n\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.status">\r\n\t\t\t<div class="dashboard-header">\r\n\t\t\t\t<div class="stat-card" [class.active]="isInitialized">\r\n\t\t\t\t\t<div class="label">Initialized</div>\r\n\t\t\t\t\t<div class="value">{{ isInitialized ? \'YES\' : \'NO\' }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Sync Interval</div>\r\n\t\t\t\t\t<div class="value">{{ fisicalStorageTypeByJob ? \'Job\' : \'On Change\' }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card" *ngIf="config">\r\n\t\t\t\t\t<div class="label">Encryption</div>\r\n\t\t\t\t\t<div class="value">{{ config.encryptionType }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Data Elements</div>\r\n\t\t\t\t\t<div class="value">{{ containerRoot.length }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Registry Entries</div>\r\n\t\t\t\t\t<div class="value">{{ registryRows.length }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div class="header-toolbar">\r\n\t\t\t\x3c!-- <div class="auto-refresh-toggle" title="Auto Refresh State (5s)">\r\n\t\t\t\t<input\r\n\t\t\t\t\tid="autoRefresh"\r\n\t\t\t\t\t[(ngModel)]="autoRefresh"\r\n\t\t\t\t\t(change)="toggleAutoRefresh()"\r\n\t\t\t\t\ttype="checkbox"\r\n\t\t\t\t/>\r\n\t\t\t\t<label for="autoRefresh">Auto Refresh</label>\r\n\t\t\t</div> --\x3e\r\n\t\t\t<button\r\n\t\t\t\tclass="circle-c-btn"\r\n\t\t\t\t(click)="refreshState(); $event.stopPropagation()"\r\n\t\t\t\ttitle="Refresh State"\r\n\t\t\t>\r\n\t\t\t\t↻\r\n\t\t\t</button>\r\n\t\t\t<button\r\n\t\t\t\tclass="circle-c-btn"\r\n\t\t\t\t[class.collapsed]="sectionsCollapsed.status"\r\n\t\t\t\t(click)="toggleSection(\'status\')"\r\n\t\t\t\ttitle="Toggle Status"\r\n\t\t\t>\r\n\t\t\t\t▾\r\n\t\t\t</button>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<div class="dashboard-content">\r\n\t\t<div class="split-view">\r\n\t\t\t\x3c!-- Data Elements Section --\x3e\r\n\t\t\t<div class="section-container">\r\n\t\t\t\t<h4 class="section-title" (click)="toggleSection(\'containers\')">\r\n\t\t\t\t\t<span>Data Containers</span>\r\n\t\t\t\t\t<span class="collapse-icon" [class.collapsed]="sectionsCollapsed.containers"\r\n\t\t\t\t\t\t>▾</span\r\n\t\t\t\t\t>\r\n\t\t\t\t</h4>\r\n\t\t\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.containers">\r\n\t\t\t\t\t<ng-container [ngSwitch]="viewMode">\r\n\t\t\t\t\t\t\x3c!-- LIST MODE --\x3e\r\n\t\t\t\t\t\t<ng-container *ngSwitchCase="\'list\'">\r\n\t\t\t\t\t\t\t<div class="data-grid" *ngIf="containerRoot.length > 0; else noData">\r\n\t\t\t\t\t\t\t\t<div class="data-card" *ngFor="let element of containerRoot">\r\n\t\t\t\t\t\t\t\t\t<div class="card-header">\r\n\t\t\t\t\t\t\t\t\t\t<div class="header-left">\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="element-name"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="startEdit(element)"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Click to Edit"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>{{ element.name }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="store-badge"\r\n\t\t\t\t\t\t\t\t\t\t\t\t[ngClass]="element.storeType.toLowerCase()"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>{{ element.storeType }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t<div class="header-actions">\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="action-btn edit"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="startEdit(element)"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Edit"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="action-btn delete"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="startDelete(element)"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Delete"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<polyline points="3 6 5 6 21 6"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2-2v2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="10" y1="11" x2="10" y2="17"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="14" y1="11" x2="14" y2="17"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\t\tclass="card-body"\r\n\t\t\t\t\t\t\t\t\t\t(click)="openView(element)"\r\n\t\t\t\t\t\t\t\t\t\ttitle="Click to View"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<asor-json-view [data]="element.data"></asor-json-view>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<div class="card-footer">\r\n\t\t\t\t\t\t\t\t\t\t<span class="update-time"\r\n\t\t\t\t\t\t\t\t\t\t\t>Updated:\r\n\t\t\t\t\t\t\t\t\t\t\t{{ element.lastUpdate | date: \'mediumTime\' }}</span\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<div class="flags">\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Reads"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstyle="\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmargin-right: 8px;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: inline-flex;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talign-items: center;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tgap: 4px;\r\n\t\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg read"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<circle cx="12" cy="12" r="3"></circle>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{{ element.readCount || 0 }}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Writes"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstyle="\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmargin-right: 8px;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: inline-flex;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talign-items: center;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tgap: 4px;\r\n\t\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg write"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<polyline\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpoints="17 21 17 13 7 13 7 21"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<polyline points="7 3 7 8 15 8"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{{ element.writeCount || 0 }}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\t*ngIf="element.encrypt"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Encrypted"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstyle="display: inline-flex; align-items: center"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg lock"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<rect\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tx="3"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ty="11"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth="18"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\theight="11"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trx="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\try="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></rect>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path d="M7 11V7a5 5 0 0 1 10 0v4"></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\t*ngIf="element.freeze"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Frozen"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstyle="display: inline-flex; align-items: center"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg freeze"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="2" y1="2" x2="22" y2="22"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="12" y1="2" x2="12" y2="22"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="22" y1="2" x2="2" y2="22"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="2" y1="12" x2="22" y2="12"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<ng-template #noData>\r\n\t\t\t\t\t\t\t\t<div class="empty-state">\r\n\t\t\t\t\t\t\t\t\tNo data elements found in StateService.\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t</ng-container>\r\n\r\n\t\t\t\t\t\t\x3c!-- VIEW MODE --\x3e\r\n\t\t\t\t\t\t<div class="inline-view" *ngSwitchCase="\'view\'">\r\n\t\t\t\t\t\t\t<div class="view-header">\r\n\t\t\t\t\t\t\t\t<h3>\r\n\t\t\t\t\t\t\t\t\tView Dataset:\r\n\t\t\t\t\t\t\t\t\t<span class="highlight">{{ targetElement?.name }}</span>\r\n\t\t\t\t\t\t\t\t</h3>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-body data-panel">\r\n\t\t\t\t\t\t\t\t<asor-json-view\r\n\t\t\t\t\t\t\t\t\t[data]="viewData"\r\n\t\t\t\t\t\t\t\t\t[expandDepth]="1"\r\n\t\t\t\t\t\t\t\t></asor-json-view>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-footer">\r\n\t\t\t\t\t\t\t\t<button class="btn-cancel" (click)="cancelAction()">Back</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\x3c!-- EDIT MODE --\x3e\r\n\t\t\t\t\t\t<div class="inline-view" *ngSwitchCase="\'edit\'">\r\n\t\t\t\t\t\t\t<div class="view-header">\r\n\t\t\t\t\t\t\t\t<h3>\r\n\t\t\t\t\t\t\t\t\tEdit Dataset:\r\n\t\t\t\t\t\t\t\t\t<span class="highlight">{{ targetElement?.name }}</span>\r\n\t\t\t\t\t\t\t\t</h3>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-body">\r\n\t\t\t\t\t\t\t\t<asor-json-editor\r\n\t\t\t\t\t\t\t\t\t[(jsonString)]="editJsonString"\r\n\t\t\t\t\t\t\t\t></asor-json-editor>\r\n\t\t\t\t\t\t\t\t<div class="error-msg" *ngIf="editError">{{ editError }}</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-footer">\r\n\t\t\t\t\t\t\t\t<button class="btn-cancel" (click)="cancelAction()">Cancel</button>\r\n\t\t\t\t\t\t\t\t<button class="btn-save" (click)="saveEdit()">Save Changes</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\x3c!-- DECRYPT MODE --\x3e\r\n\t\t\t\t\t\t<div class="inline-view centered" *ngSwitchCase="\'decrypt\'">\r\n\t\t\t\t\t\t\t<div class="view-header">\r\n\t\t\t\t\t\t\t\t<h3>\r\n\t\t\t\t\t\t\t\t\tDecrypt Dataset:\r\n\t\t\t\t\t\t\t\t\t<span class="highlight">{{ targetElement?.name }}</span>\r\n\t\t\t\t\t\t\t\t</h3>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-body">\r\n\t\t\t\t\t\t\t\t<p class="instruction">\r\n\t\t\t\t\t\t\t\t\tThis dataset is encrypted. Please enter the key to unlock it.\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\tclass="key-input"\r\n\t\t\t\t\t\t\t\t\t[(ngModel)]="inputKey"\r\n\t\t\t\t\t\t\t\t\t(keydown.enter)="verifyKey()"\r\n\t\t\t\t\t\t\t\t\ttype="password"\r\n\t\t\t\t\t\t\t\t\tplaceholder="Enter Decryption Key"\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t<div class="error-msg" *ngIf="decryptError">{{ decryptError }}</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-footer">\r\n\t\t\t\t\t\t\t\t<button class="btn-cancel" (click)="cancelAction()">Cancel</button>\r\n\t\t\t\t\t\t\t\t<button class="btn-save" (click)="verifyKey()">Unlock</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\x3c!-- DELETE MODE --\x3e\r\n\t\t\t\t\t\t<div class="inline-view centered" *ngSwitchCase="\'delete\'">\r\n\t\t\t\t\t\t\t<div class="view-header">\r\n\t\t\t\t\t\t\t\t<h3>Delete Dataset</h3>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-body">\r\n\t\t\t\t\t\t\t\t<p class="confirmation-text">\r\n\t\t\t\t\t\t\t\t\tAre you sure you want to delete\r\n\t\t\t\t\t\t\t\t\t<span class="highlight">{{ targetElement?.name }}</span\r\n\t\t\t\t\t\t\t\t\t>?\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t\t<p class="warning-text">This action cannot be undone.</p>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-footer">\r\n\t\t\t\t\t\t\t\t<button class="btn-cancel" (click)="cancelAction()">Cancel</button>\r\n\t\t\t\t\t\t\t\t<button class="btn-delete-confirm" (click)="confirmDelete()">\r\n\t\t\t\t\t\t\t\t\tDelete\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</ng-container>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t\x3c!-- Registry Section --\x3e\r\n\t\t\t<div class="section-container">\r\n\t\t\t\t<h4 class="section-title" (click)="toggleSection(\'registry\')">\r\n\t\t\t\t\t<span>Component Registry</span>\r\n\t\t\t\t\t<span class="collapse-icon" [class.collapsed]="sectionsCollapsed.registry"\r\n\t\t\t\t\t\t>▾</span\r\n\t\t\t\t\t>\r\n\t\t\t\t</h4>\r\n\t\t\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.registry">\r\n\t\t\t\t\t<div class="registry-toolbar">\r\n\t\t\t\t\t\t<div class="search-container">\r\n\t\t\t\t\t\t\t<span class="search-icon">\r\n\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<circle cx="11" cy="11" r="8"></circle>\r\n\t\t\t\t\t\t\t\t\t<line x1="21" y1="21" x2="16.65" y2="16.65"></line>\r\n\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\tclass="registry-search"\r\n\t\t\t\t\t\t\t\t[(ngModel)]="registrySearchTerm"\r\n\t\t\t\t\t\t\t\ttype="text"\r\n\t\t\t\t\t\t\t\tplaceholder="Filter by component, prop or path..."\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tclass="clear-search-btn"\r\n\t\t\t\t\t\t\t\t*ngIf="registrySearchTerm"\r\n\t\t\t\t\t\t\t\t(click)="registrySearchTerm = \'\'"\r\n\t\t\t\t\t\t\t\ttitle="Clear search"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t×\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class="registry-table-container">\r\n\t\t\t\t\t\t<ng-container *ngIf="filteredRegistryGroups.length > 0; else emptyRegistry">\r\n\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\tclass="registry-group"\r\n\t\t\t\t\t\t\t\t*ngFor="let group of filteredRegistryGroups"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<div class="registry-group-header">\r\n\t\t\t\t\t\t\t\t\t<span class="comp-icon">\r\n\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<polygon points="12 2 2 7 12 12 22 7 12 2"></polygon>\r\n\t\t\t\t\t\t\t\t\t\t\t<polyline points="2 17 12 22 22 17"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t<polyline points="2 12 12 17 22 12"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t<span class="comp-name">{{ group.component }}</span>\r\n\t\t\t\t\t\t\t\t\t<span class="comp-count"\r\n\t\t\t\t\t\t\t\t\t\t>{{ group.entries.length }} prop{{\r\n\t\t\t\t\t\t\t\t\t\t\tgroup.entries.length > 1 ? \'s\' : \'\'\r\n\t\t\t\t\t\t\t\t\t\t}}</span\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t<div class="registry-list">\r\n\t\t\t\t\t\t\t\t\t<div class="registry-item" *ngFor="let row of group.entries">\r\n\t\t\t\t\t\t\t\t\t\t<span class="prop-badge">{{ row.prop }}</span>\r\n\t\t\t\t\t\t\t\t\t\t<span class="path-text">{{ row.path }}</span>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</ng-container>\r\n\r\n\t\t\t\t\t\t<ng-template #emptyRegistry>\r\n\t\t\t\t\t\t\t<div class="empty-state">\r\n\t\t\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\t\t\tregistrySearchTerm\r\n\t\t\t\t\t\t\t\t\t\t? \'No components match the filter.\'\r\n\t\t\t\t\t\t\t\t\t\t: \'No registered components.\'\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n',styles:[".state-dashboard{display:flex;flex-direction:column;height:100%;color:#ccc;font-family:Segoe UI,sans-serif;gap:6px}.state-dashboard .dashboard-header{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.state-dashboard .dashboard-header .stat-card{background-color:#252526;border:1px solid #333;border-radius:6px;padding:8px 12px;min-width:100px;display:flex;flex-direction:column;align-items:center}.state-dashboard .dashboard-header .stat-card .label{font-size:10px;color:#888;text-transform:uppercase;letter-spacing:.5px}.state-dashboard .dashboard-header .stat-card .value{font-size:14px;font-weight:600;color:#eee;margin-top:2px}.state-dashboard .dashboard-header .stat-card.active .value{color:#4caf50}.state-dashboard .dashboard-content{flex:1;overflow-y:auto;padding-right:5px}.state-dashboard .dashboard-content .split-view{display:flex;gap:20px;height:100%}.state-dashboard .dashboard-content .section-container{display:flex;flex-direction:column;overflow:hidden;border:1px solid #333;border-radius:6px;margin-bottom:20px;flex:1;min-width:0}@media (max-width: 768px){.state-dashboard .dashboard-content .split-view{flex-direction:column;height:auto}.state-dashboard .dashboard-content .section-container{flex:none}}.state-dashboard .dashboard-content .section-title{margin:4px 8px;font-size:13px;color:#888;font-weight:600;display:flex;justify-content:space-between;align-items:center;cursor:pointer;border-radius:4px}.state-dashboard .dashboard-content .section-title:hover{background-color:#2a2a2a}.state-dashboard .dashboard-content .section-title .collapse-icon{font-size:14px;transition:transform .25s ease}.state-dashboard .dashboard-content .section-title .collapse-icon.collapsed{transform:rotate(-90deg)}.state-dashboard .dashboard-content .section-title.mt-4{margin-top:20px}.state-dashboard .dashboard-content .data-grid{overflow-y:auto;flex:1;padding:5px;display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px;align-content:start}.state-dashboard .dashboard-content .data-card{background-color:#1e1e1e;border:1px solid #333;border-radius:6px;overflow:hidden;display:flex;flex-direction:column;height:max-content;margin:5px}.state-dashboard .dashboard-content .data-card:hover{border-color:#007acc}.state-dashboard .dashboard-content .data-card .card-header{background-color:#252526;padding:8px 12px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #333}.state-dashboard .dashboard-content .data-card .card-header .element-name{font-weight:600;color:#dcdcaa}.state-dashboard .dashboard-content .data-card .card-header .store-badge{font-size:10px;padding:2px 6px;border-radius:4px;font-weight:600}.state-dashboard .dashboard-content .data-card .card-header .store-badge.session{background-color:#0e639c33;color:#4fc1ff}.state-dashboard .dashboard-content .data-card .card-header .store-badge.local{background-color:#60ac3933;color:#b5cea8}.state-dashboard .dashboard-content .data-card .card-body{padding:10px;max-height:200px;overflow-y:auto;font-family:monospace;font-size:12px}.state-dashboard .dashboard-content .data-card .card-footer{padding:6px 12px;background-color:#252526;font-size:11px;color:#666;display:flex;justify-content:space-between;align-items:center;border-top:1px solid #333}.state-dashboard .dashboard-content .data-card .card-footer .flags{display:flex;gap:6px}.state-dashboard .dashboard-content .registry-toolbar{padding:8px 10px;background-color:#252526;border-bottom:1px solid #333;border-radius:4px}.state-dashboard .dashboard-content .registry-toolbar .search-container{position:relative;display:flex;align-items:center;background-color:#1e1e1e;border:1px solid #3c3c3c;border-radius:4px}.state-dashboard .dashboard-content .registry-toolbar .search-container:focus-within{border-color:#007acc}.state-dashboard .dashboard-content .registry-toolbar .search-container .search-icon{padding:0 8px;color:#888;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-toolbar .search-container .registry-search{flex:1;background:transparent;border:none;color:#d4d4d4;padding:6px 0;font-size:13px;font-family:inherit;outline:none}.state-dashboard .dashboard-content .registry-toolbar .search-container .registry-search::placeholder{color:#666}.state-dashboard .dashboard-content .registry-toolbar .search-container .clear-search-btn{background:transparent;border:none;color:#888;padding:0 8px;cursor:pointer;font-size:16px;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-toolbar .search-container .clear-search-btn:hover{color:#ccc}.state-dashboard .dashboard-content .registry-table-container{overflow-y:auto;flex:1;padding:2px 5px 20px}.state-dashboard .dashboard-content .registry-table-container .registry-group{margin-bottom:16px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header{display:flex;align-items:center;gap:8px;padding:6px 12px;background-color:#252526;border-top:1px solid #333;border-bottom:1px solid #333;border-radius:4px;position:sticky;top:0;z-index:10}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-icon{color:#4ec9b0;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-name{color:#4ec9b0;font-weight:600;font-size:13px;flex:1}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-count{font-size:11px;color:#888;background:#ffffff0d;padding:2px 6px;border-radius:10px}.state-dashboard .dashboard-content .registry-table-container .registry-list{display:flex;flex-direction:column}.state-dashboard .dashboard-content .registry-table-container .registry-list .registry-item{display:flex;align-items:flex-start;padding:8px 12px 8px 36px;border-bottom:1px solid #333;font-size:12px}.state-dashboard .dashboard-content .registry-table-container .registry-list .registry-item:last-child{border-bottom:none}.state-dashboard .dashboard-content .registry-table-container .registry-list .registry-item .prop-badge{background-color:#9cdcfe26;color:#9cdcfe;padding:2px 6px;border-radius:4px;font-family:monospace;margin-right:8px;white-space:nowrap;font-weight:600}.state-dashboard .dashboard-content .registry-table-container .registry-list .registry-item .path-text{color:#ce9178;font-family:monospace;word-break:break-all;margin-top:2px}.state-dashboard .dashboard-content .empty-state{padding:20px;text-align:center;color:#666;font-style:italic}.state-dashboard .header-toolbar{display:flex;justify-content:flex-end;gap:6px;padding:4px 8px}.state-dashboard .header-toolbar .circle-c-btn{background:none;border:1px solid #444;color:#ccc;cursor:pointer;width:30px;height:30px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s}.state-dashboard .header-toolbar .circle-c-btn:hover{background-color:#333}.state-dashboard .header-toolbar .circle-c-btn:active{background-color:#444;transform:scale(.95)}.state-dashboard .header-toolbar .circle-c-btn.collapsed{transform:rotate(-90deg)}.state-dashboard .header-toolbar .auto-refresh-toggle{display:flex;align-items:center;gap:6px;background:#ffffff0d;border:1px solid #444;border-radius:15px;padding:2px 10px;height:30px;margin-right:4px;transition:all .2s}.state-dashboard .header-toolbar .auto-refresh-toggle:hover{background-color:#ffffff1a;border-color:#666}.state-dashboard .header-toolbar .auto-refresh-toggle input[type=checkbox]{cursor:pointer;width:14px;height:14px;accent-color:#007acc;margin:0}.state-dashboard .header-toolbar .auto-refresh-toggle label{font-size:11px;color:#888;cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.state-dashboard .header-toolbar .auto-refresh-toggle:has(input:checked){border-color:#007acc;background-color:#007acc1a}.state-dashboard .header-toolbar .auto-refresh-toggle:has(input:checked) label{color:#007acc;font-weight:600}.state-dashboard .header-section{flex-shrink:0;display:flex;flex-direction:row;align-items:flex-start;border-radius:6px;background-color:#1e1e1e;overflow:hidden}.state-dashboard .header-section .section-body{flex:1;min-width:0;padding:5px;transition:opacity .25s ease}.state-dashboard .header-section .section-body.collapsed{padding:0;margin:0;max-height:0;opacity:0}@media (max-width: 768px){.state-dashboard .header-section{display:unset}}.state-dashboard .section-title{display:flex;justify-content:space-between;align-items:center;margin-top:0;margin-bottom:2px}.state-dashboard .section-title .collapse-icon{display:none}.state-dashboard .section-body{padding:5px;flex:1;display:flex;flex-direction:column;overflow:hidden;min-height:0;max-height:2000px;transition:max-height .35s ease,opacity .25s ease;opacity:1}.state-dashboard .section-body.collapsed{padding:0;margin:0;max-height:0;opacity:0}@media (max-width: 768px){.state-dashboard .section-title{cursor:pointer;-webkit-user-select:none;user-select:none;padding:8px 4px;border-radius:4px;transition:background-color .2s}.state-dashboard .section-title:hover{background-color:#2a2a2a}.state-dashboard .section-title .collapse-icon{display:inline-block;font-size:14px;transition:transform .25s ease}.state-dashboard .section-title .collapse-icon.collapsed{transform:rotate(-90deg)}}.state-dashboard .card-header .header-left{display:flex;align-items:center;gap:8px}.state-dashboard .card-header .header-left .element-name{cursor:pointer}.state-dashboard .card-header .header-left .element-name:hover{text-decoration:underline;color:#4fc1ff}.state-dashboard .card-header .header-actions{display:flex;gap:4px}.state-dashboard .card-header .header-actions .action-btn{background:none;border:none;cursor:pointer;font-size:14px;padding:2px 4px;border-radius:4px;transition:background-color .2s}.state-dashboard .card-header .header-actions .action-btn:hover{background-color:#ffffff1a}.state-dashboard .card-header .header-actions .action-btn.delete:hover{background-color:#f4877133}.state-dashboard .card-body{cursor:pointer;transition:background-color .2s}.state-dashboard .card-body:hover{background-color:#252526}.icon-svg{vertical-align:middle}.icon-svg.read{color:#4ec9b0}.icon-svg.write{color:#ce9178}.icon-svg.lock{color:#dcdcaa}.icon-svg.freeze{color:#569cd6}.inline-view{display:flex;flex-direction:column;flex:1;min-height:0;padding:0 16px 16px;background-color:transparent;color:#ccc}.inline-view.centered{align-items:center;justify-content:center;text-align:center}.inline-view .view-header{margin-bottom:16px}.inline-view .view-header h3{margin:0;font-size:1.1rem;color:#d4d4d4}.inline-view .view-header h3 .highlight{color:#4ec9b0;font-family:Consolas,Monaco,monospace}.inline-view .view-body{flex:1;width:100%;display:flex;flex-direction:column;min-height:0;overflow:hidden;margin-bottom:10px}.inline-view .view-body.data-panel{overflow:auto;background-color:#1e1e1e;border:1px solid #3c3c3c;border-radius:4px}.inline-view .view-body .json-editor{flex:1;width:100%;background-color:#1e1e1e;color:#d4d4d4;border:1px solid #3c3c3c;border-radius:4px;padding:12px;font-family:Consolas,Monaco,monospace;font-size:13px;resize:none;outline:none}.inline-view .view-body .json-editor:focus{border-color:#007acc}.inline-view .view-body .instruction{margin-bottom:12px;color:#ccc}.inline-view .view-body .key-input{width:100%;max-width:300px;margin:0 auto;padding:8px 12px;background-color:#252526;border:1px solid #3c3c3c;border-radius:4px;color:#d4d4d4;font-size:14px}.inline-view .view-body .key-input:focus{border-color:#007acc;outline:none}.inline-view .view-body .confirmation-text{font-size:1.1rem;margin-bottom:8px}.inline-view .view-body .confirmation-text .highlight{color:#ce9178;font-weight:700}.inline-view .view-body .warning-text{color:#d16969;font-size:.9rem}.inline-view .view-body .error-msg{color:#f14c4c;margin-top:8px;font-size:.9em}.inline-view .view-footer{display:flex;justify-content:flex-end;gap:12px}.centered .inline-view .view-footer{justify-content:center}.inline-view .view-footer button{padding:6px 16px;border-radius:4px;border:none;cursor:pointer;font-size:13px;transition:background-color .2s}.inline-view .view-footer button.btn-cancel{background-color:#3c3c3c;color:#ccc}.inline-view .view-footer button.btn-cancel:hover{background-color:#4c4c4c}.inline-view .view-footer button.btn-save{background-color:#007acc;color:#fff}.inline-view .view-footer button.btn-save:hover{background-color:#0062a3}.inline-view .view-footer button.btn-delete-confirm{background-color:#ce9178;color:#1e1e1e;font-weight:500}.inline-view .view-footer button.btn-delete-confirm:hover{background-color:#b87b66}:host{display:block;height:100%}:host *::-webkit-scrollbar{width:8px;height:8px}:host *::-webkit-scrollbar-track{background:#1e1e1e;border-radius:4px}:host *::-webkit-scrollbar-thumb{background:#444;border-radius:4px}:host *::-webkit-scrollbar-thumb:hover{background:#555}\n"]}]}],ctorParameters:()=>[{type:StateWidgetSpyService}]});class WidgetCacheUtility extends CacheUtility{cacheUtility;constructor(t){super(),this.cacheUtility=t}getEntries(){const t=[];return this.cacheUtility.getCacheApp().forEach((e,r)=>{const n=this.cachePathUtility.config(r);if(n){let o=!1,a=null,s=r,i=0;try{const t=JSON.stringify(e);t&&(i=new Blob([t]).size)}catch(t){}if(r.includes("#[")){o=!0;const t=r.split("#[")[1].replace("]","");try{a=JSON.parse(atob(t))}catch(t){}}t.push({key:s,rulePath:n.pathValue,persistenceType:n.persistenceType,creationDate:new Date,hasPayload:o,payloadData:a,dataSize:i,encriptType:n.encriptType})}}),t.sort((t,e)=>t.key.localeCompare(e.key))}getEntryContent(t,e){const r=this.cachePathUtility.config(t);let n=this.cacheUtility.getCacheApp().get(t);if(r&&n&&"string"==typeof n&&r.encriptType!==K.NONE){if(!e)return{error:"KeyRequired"};try{const t=B.AES.decrypt(n,e).toString(B.enc.Utf8);if(!t)throw new Error("Decryption Failed");n=JSON.parse(t)}catch(t){return{error:"Invalid decryption key or corrupt data."}}}return n&&void 0!==n.body?n.body:n}getAutoCacheKey(t){const e=this.cachePathUtility.config(t);return e&&e.encriptType===K.AUTO?this.getCacheKey(e):null}cleanUp(){return super.cleanUp()}getRules(){return this.cachePathUtility.getPaths()}deleteEntry(t){this.cacheUtility.getCacheApp().delete(t),this.persistStorage()}clearAllCache(){this.cacheUtility.getCacheApp().clear(),sessionStorage.removeItem(this.cache_name),localStorage.removeItem(this.cache_name)}persistStorage(){let t={},e={};this.cacheUtility.getCacheApp().forEach((r,n)=>{const o=this.cachePathUtility.config(n);o&&(o.persistenceType===W.SESSION?t[n]=r:o.persistenceType===W.LOCAL&&(e[n]=r))}),Object.keys(t).length>0?sessionStorage.setItem(this.cache_name,JSON.stringify(t)):sessionStorage.removeItem(this.cache_name),Object.keys(e).length>0?localStorage.setItem(this.cache_name,JSON.stringify(e)):localStorage.removeItem(this.cache_name)}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:WidgetCacheUtility,deps:[{token:CacheUtility}],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:WidgetCacheUtility,providedIn:"root"})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:WidgetCacheUtility,decorators:[{type:r,args:[{providedIn:"root"}]}],ctorParameters:()=>[{type:CacheUtility}]});class CacheTabComponent{cacheUtility;cacheEntries=[];activeRules=[];ruleGroups=[];cacheGroups=[];rulesSearchTerm="";entriesSearchTerm="";stats={volatile:0,session:0,local:0,total:0};sizes={volatile:0,session:0,local:0,total:0};CacheType=W;sectionsCollapsed={status:!1,rules:!1,entries:!1};expandedPayloadId=null;expandedContentId=null;currentContent=null;customKeys={};decryptErrors={};isCleanupModalOpen=!1;showCleanUpBanner=!1;cleanedEntries=[];cleanedTotalSize=0;isClearAllModalOpen=!1;showClearAllBanner=!1;constructor(t){this.cacheUtility=t}ngOnInit(){this.refreshCache(),this.activeRules=this.cacheUtility.getRules(),this.groupRules()}groupRules(){const t=new Map;this.activeRules.forEach(e=>{const r=e.persistenceType.toString();t.has(r)||t.set(r,[]),t.get(r).push(e)});const e=Array.from(t.keys()).sort((t,e)=>t.localeCompare(e));this.ruleGroups=e.map(e=>({persistenceType:e,rules:t.get(e).sort((t,e)=>t.pathValue.localeCompare(e.pathValue))}))}refreshCache(){this.cacheEntries=this.cacheUtility.getEntries(),this.calculateStats(),this.groupEntries()}groupEntries(){const t=new Map;this.cacheEntries.forEach(e=>{t.has(e.rulePath)||t.set(e.rulePath,[]),t.get(e.rulePath).push(e)});const e=Array.from(t.keys()).sort((t,e)=>t.localeCompare(e));this.cacheGroups=e.map(e=>({rulePath:e,entries:t.get(e).sort((t,e)=>t.key.localeCompare(e.key))}))}deleteEntry(t){this.cacheUtility.deleteEntry(t),this.refreshCache()}clearAll(){this.isClearAllModalOpen=!0}executeClearAll(){this.cacheUtility.clearAllCache(),this.refreshCache(),this.isClearAllModalOpen=!1,this.showClearAllBanner=!0,setTimeout(()=>{this.showClearAllBanner=!1},3e3)}cleanUpCache(){const t=this.cacheUtility.cleanUp();t&&t.size>0?(this.cleanedEntries=[],this.cleanedTotalSize=0,t.forEach((t,e)=>{const r=new Blob(["string"==typeof t?t:JSON.stringify(t)]).size;this.cleanedTotalSize+=r;const n=this.cacheUtility.cachePathUtility.config(e);this.cleanedEntries.push({key:e,dataSize:r,persistenceType:n?n.persistenceType:W.VOLATILE,encriptType:n?n.encriptType:K.NONE})}),this.isCleanupModalOpen=!0):(this.showCleanUpBanner=!0,setTimeout(()=>{this.showCleanUpBanner=!1},3e3)),this.refreshCache()}toggleSection(t){this.sectionsCollapsed[t]=!this.sectionsCollapsed[t]}togglePayload(t){this.expandedPayloadId=this.expandedPayloadId===t?null:t}openContentModal(t,e){this.expandedContentId=t,this.loadContent(t,e)}closeContentModal(){this.expandedContentId&&this.customKeys[this.expandedContentId]&&(this.customKeys[this.expandedContentId]=""),this.expandedContentId=null,this.currentContent=null,this.decryptErrors={}}loadContent(t,e){if((e===K.CUSTOM||e===K.AUTO)&&!this.customKeys[t]){if(this.currentContent={_requiresKey:!0,encriptType:e},!this.customKeys[t]){const e=this.cacheUtility.getAutoCacheKey(t);e&&(this.customKeys[t]=e)}return}const r=this.cacheUtility.getEntryContent(t,this.customKeys[t]);r&&r.error?(this.decryptErrors[t]=r.error,this.currentContent={_requiresKey:!0}):(this.decryptErrors[t]="",this.currentContent=r)}decryptContent(t){this.loadContent(t,this.currentContent?.encriptType||K.CUSTOM)}get filteredRuleGroups(){if(!this.rulesSearchTerm||""===this.rulesSearchTerm.trim())return this.ruleGroups;const t=this.rulesSearchTerm.toLowerCase();return this.ruleGroups.map(e=>{if(e.persistenceType.toLowerCase().includes(t))return e;const r=e.rules.filter(e=>e.pathValue.toLowerCase().includes(t)||e.persistenceType.toString().toLowerCase().includes(t));return r.length>0?{...e,rules:r}:null}).filter(t=>null!==t)}get filteredCacheGroups(){if(!this.entriesSearchTerm||""===this.entriesSearchTerm.trim())return this.cacheGroups;const t=this.entriesSearchTerm.toLowerCase();return this.cacheGroups.map(e=>{if(e.rulePath.toLowerCase().includes(t))return e;const r=e.entries.filter(e=>e.key.toLowerCase().includes(t)||e.persistenceType.toString().toLowerCase().includes(t));return r.length>0?{...e,entries:r}:null}).filter(t=>null!==t)}formatSize(t){if(!t||0===t)return"0 B";const e=Math.floor(Math.log(t)/Math.log(1024));return parseFloat((t/Math.pow(1024,e)).toFixed(2))+" "+["B","KB","MB","GB"][e]}getSizeForType(t){const e=t.toLowerCase();return this.formatSize(this.sizes[e]||0)}getGroupSize(t){const e=t.entries.reduce((t,e)=>t+(e.dataSize||0),0);return this.formatSize(e)}calculateStats(){this.stats={volatile:0,session:0,local:0,total:this.cacheEntries.length},this.sizes={volatile:0,session:0,local:0,total:0},this.cacheEntries.forEach(t=>{const e=t.dataSize||0;this.sizes.total+=e,t.persistenceType===W.VOLATILE?(this.stats.volatile++,this.sizes.volatile+=e):t.persistenceType===W.SESSION?(this.stats.session++,this.sizes.session+=e):t.persistenceType===W.LOCAL&&(this.stats.local++,this.sizes.local+=e)})}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:CacheTabComponent,deps:[{token:WidgetCacheUtility}],target:t.ɵɵFactoryTarget.Component});static ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"20.3.16",type:CacheTabComponent,isStandalone:!0,selector:"asor-cache-tab",ngImport:t,template:'<div class="state-dashboard">\r\n\t\x3c!-- Cleanup Info Banner --\x3e\r\n\t<div class="info-banner" *ngIf="showCleanUpBanner">\r\n\t\t<svg\r\n\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\twidth="16"\r\n\t\t\theight="16"\r\n\t\t\tviewBox="0 0 24 24"\r\n\t\t\tfill="none"\r\n\t\t\tstroke="currentColor"\r\n\t\t\tstroke-width="2"\r\n\t\t\tstroke-linecap="round"\r\n\t\t\tstroke-linejoin="round"\r\n\t\t>\r\n\t\t\t<circle cx="12" cy="12" r="10"></circle>\r\n\t\t\t<line x1="12" y1="16" x2="12" y2="12"></line>\r\n\t\t\t<line x1="12" y1="8" x2="12.01" y2="8"></line>\r\n\t\t</svg>\r\n\t\t<span>No obsolete cache entries found. Everything is clean!</span>\r\n\t</div>\r\n\r\n\t\x3c!-- Clear All Info Banner --\x3e\r\n\t<div class="info-banner" *ngIf="showClearAllBanner">\r\n\t\t<svg\r\n\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\twidth="16"\r\n\t\t\theight="16"\r\n\t\t\tviewBox="0 0 24 24"\r\n\t\t\tfill="none"\r\n\t\t\tstroke="currentColor"\r\n\t\t\tstroke-width="2"\r\n\t\t\tstroke-linecap="round"\r\n\t\t\tstroke-linejoin="round"\r\n\t\t>\r\n\t\t\t<polyline points="20 6 9 17 4 12"></polyline>\r\n\t\t</svg>\r\n\t\t<span>All cache entries have been successfully cleared!</span>\r\n\t</div>\r\n\r\n\t\x3c!-- Header Stats --\x3e\r\n\t<div class="section-container header-section">\r\n\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.status">\r\n\t\t\t<div class="dashboard-header">\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Total Entries</div>\r\n\t\t\t\t\t<div class="value">{{ stats.total }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Total Cache Size</div>\r\n\t\t\t\t\t<div class="value">{{ formatSize(sizes.total) }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Volatile Cache</div>\r\n\t\t\t\t\t<div class="value" [class.active]="stats.volatile > 0">\r\n\t\t\t\t\t\t{{ stats.volatile }}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="label" style="font-size: 9px; margin-top: 2px">\r\n\t\t\t\t\t\t{{ formatSize(sizes.volatile) }}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Session Cache</div>\r\n\t\t\t\t\t<div class="value" [class.active]="stats.session > 0">{{ stats.session }}</div>\r\n\t\t\t\t\t<div class="label" style="font-size: 9px; margin-top: 2px">\r\n\t\t\t\t\t\t{{ formatSize(sizes.session) }}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Local Cache</div>\r\n\t\t\t\t\t<div class="value" [class.active]="stats.local > 0">{{ stats.local }}</div>\r\n\t\t\t\t\t<div class="label" style="font-size: 9px; margin-top: 2px">\r\n\t\t\t\t\t\t{{ formatSize(sizes.local) }}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div class="header-toolbar">\r\n\t\t\t<button class="circle-c-btn" (click)="cleanUpCache()" title="Clean Up Obsolete Cache">\r\n\t\t\t\t<svg\r\n\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\twidth="16"\r\n\t\t\t\t\theight="16"\r\n\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\tfill="none"\r\n\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t>\r\n\t\t\t\t\t<path d="m9.06 11.9 8.07-8.06a2.85 2.85 0 1 1 4.03 4.03l-8.06 8.08"></path>\r\n\t\t\t\t\t<path\r\n\t\t\t\t\t\td="M7.07 14.94c-1.66 0-3 1.35-3 3.02 0 1.33-2.5 1.52-2 2.02 1.08 1.35 2.22 1.45 3.02 1.45 2.26 0 4.14-1.84 4.14-4.11 0-1.66-1.35-3-3.02-3.02z"\r\n\t\t\t\t\t></path>\r\n\t\t\t\t</svg>\r\n\t\t\t</button>\r\n\t\t\t<button\r\n\t\t\t\tclass="circle-c-btn clear-all"\r\n\t\t\t\t(click)="clearAll(); $event.stopPropagation()"\r\n\t\t\t\ttitle="Clear All Cache"\r\n\t\t\t>\r\n\t\t\t\t<svg\r\n\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\twidth="14"\r\n\t\t\t\t\theight="14"\r\n\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\tfill="none"\r\n\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t>\r\n\t\t\t\t\t<polyline points="3 6 5 6 21 6"></polyline>\r\n\t\t\t\t\t<path\r\n\t\t\t\t\t\td="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2-2v2"\r\n\t\t\t\t\t></path>\r\n\t\t\t\t\t<line x1="10" y1="11" x2="10" y2="17"></line>\r\n\t\t\t\t\t<line x1="14" y1="11" x2="14" y2="17"></line>\r\n\t\t\t\t</svg>\r\n\t\t\t</button>\r\n\t\t\t<button\r\n\t\t\t\tclass="circle-c-btn"\r\n\t\t\t\t(click)="refreshCache(); $event.stopPropagation()"\r\n\t\t\t\ttitle="Refresh Cache"\r\n\t\t\t>\r\n\t\t\t\t↻\r\n\t\t\t</button>\r\n\t\t\t<button\r\n\t\t\t\tclass="circle-c-btn"\r\n\t\t\t\t[class.collapsed]="sectionsCollapsed.status"\r\n\t\t\t\t(click)="toggleSection(\'status\')"\r\n\t\t\t\ttitle="Toggle Status"\r\n\t\t\t>\r\n\t\t\t\t▾\r\n\t\t\t</button>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<div class="dashboard-content">\r\n\t\t<div class="split-view">\r\n\t\t\t\x3c!-- Active Rules Section --\x3e\r\n\t\t\t<div class="section-container">\r\n\t\t\t\t<h4 class="section-title" (click)="toggleSection(\'rules\')">\r\n\t\t\t\t\t<span>Active Cache Rules</span>\r\n\t\t\t\t\t<span class="collapse-icon" [class.collapsed]="sectionsCollapsed.rules">▾</span>\r\n\t\t\t\t</h4>\r\n\t\t\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.rules">\r\n\t\t\t\t\t<div class="registry-toolbar">\r\n\t\t\t\t\t\t<div class="search-container">\r\n\t\t\t\t\t\t\t<span class="search-icon">\r\n\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<circle cx="11" cy="11" r="8"></circle>\r\n\t\t\t\t\t\t\t\t\t<line x1="21" y1="21" x2="16.65" y2="16.65"></line>\r\n\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\tclass="registry-search"\r\n\t\t\t\t\t\t\t\t[(ngModel)]="rulesSearchTerm"\r\n\t\t\t\t\t\t\t\ttype="text"\r\n\t\t\t\t\t\t\t\tplaceholder="Filter rules by path or type..."\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tclass="clear-search-btn"\r\n\t\t\t\t\t\t\t\t*ngIf="rulesSearchTerm"\r\n\t\t\t\t\t\t\t\t(click)="rulesSearchTerm = \'\'"\r\n\t\t\t\t\t\t\t\ttitle="Clear search"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t×\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tclass="registry-table-container"\r\n\t\t\t\t\t\t*ngIf="filteredRuleGroups.length > 0; else noRules"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<div class="registry-group" *ngFor="let group of filteredRuleGroups">\r\n\t\t\t\t\t\t\t<div class="registry-group-header">\r\n\t\t\t\t\t\t\t\t<span class="comp-icon">\r\n\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<ellipse cx="12" cy="5" rx="9" ry="3"></ellipse>\r\n\t\t\t\t\t\t\t\t\t\t<path d="M21 12c0 1.66-4 3-9 3s-9-1.34-9-3"></path>\r\n\t\t\t\t\t\t\t\t\t\t<path d="M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5"></path>\r\n\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t<span class="comp-name">{{ group.persistenceType }}</span>\r\n\t\t\t\t\t\t\t\t<span class="comp-count"\r\n\t\t\t\t\t\t\t\t\t>{{ group.rules.length }} rule<ng-container\r\n\t\t\t\t\t\t\t\t\t\t*ngIf="group.rules.length !== 1"\r\n\t\t\t\t\t\t\t\t\t\t>s</ng-container\r\n\t\t\t\t\t\t\t\t\t></span\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<span class="comp-count" style="margin-left: auto">{{\r\n\t\t\t\t\t\t\t\t\tgetSizeForType(group.persistenceType)\r\n\t\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="rules-list" style="padding: 10px">\r\n\t\t\t\t\t\t\t\t<div class="rule-card" *ngFor="let rule of group.rules">\r\n\t\t\t\t\t\t\t\t\t<div class="rule-header">\r\n\t\t\t\t\t\t\t\t\t\t<span class="rule-path">{{ rule.pathValue }}</span>\r\n\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\tclass="store-badge"\r\n\t\t\t\t\t\t\t\t\t\t\t[ngClass]="\r\n\t\t\t\t\t\t\t\t\t\t\t\trule.persistenceType.toString().toLowerCase()\r\n\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t>{{ rule.persistenceType }}</span\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<div class="rule-body">\r\n\t\t\t\t\t\t\t\t\t\t<div class="rule-detail">\r\n\t\t\t\t\t\t\t\t\t\t\t<strong>Payload Cache:</strong>\r\n\t\t\t\t\t\t\t\t\t\t\t{{ rule.reqPayloadCache ? \'Enabled\' : \'Disabled\' }}\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t<div class="rule-detail">\r\n\t\t\t\t\t\t\t\t\t\t\t<strong>Encryption:</strong> {{ rule.encriptType }}\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\t\t\tclass="rule-detail"\r\n\t\t\t\t\t\t\t\t\t\t\t*ngIf="rule.clearOn && rule.clearOn.length > 0"\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<strong>Clear On:</strong>\r\n\t\t\t\t\t\t\t\t\t\t\t<ul class="clear-on-list">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<li *ngFor="let c of rule.clearOn">{{ c }}</li>\r\n\t\t\t\t\t\t\t\t\t\t\t</ul>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<ng-template #noRules>\r\n\t\t\t\t\t\t<div class="empty-state">No cache rules match the filter.</div>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t\x3c!-- Cache Entries Section --\x3e\r\n\t\t\t<div class="section-container">\r\n\t\t\t\t<h4 class="section-title" (click)="toggleSection(\'entries\')">\r\n\t\t\t\t\t<span>Cache Entries</span>\r\n\t\t\t\t\t<span class="collapse-icon" [class.collapsed]="sectionsCollapsed.entries"\r\n\t\t\t\t\t\t>▾</span\r\n\t\t\t\t\t>\r\n\t\t\t\t</h4>\r\n\t\t\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.entries">\r\n\t\t\t\t\t<div class="registry-toolbar">\r\n\t\t\t\t\t\t<div class="search-container">\r\n\t\t\t\t\t\t\t<span class="search-icon">\r\n\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<circle cx="11" cy="11" r="8"></circle>\r\n\t\t\t\t\t\t\t\t\t<line x1="21" y1="21" x2="16.65" y2="16.65"></line>\r\n\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\tclass="registry-search"\r\n\t\t\t\t\t\t\t\t[(ngModel)]="entriesSearchTerm"\r\n\t\t\t\t\t\t\t\ttype="text"\r\n\t\t\t\t\t\t\t\tplaceholder="Filter entries by key or type..."\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tclass="clear-search-btn"\r\n\t\t\t\t\t\t\t\t*ngIf="entriesSearchTerm"\r\n\t\t\t\t\t\t\t\t(click)="entriesSearchTerm = \'\'"\r\n\t\t\t\t\t\t\t\ttitle="Clear search"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t×\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tclass="registry-table-container"\r\n\t\t\t\t\t\t*ngIf="filteredCacheGroups.length > 0; else noData"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<div class="registry-group" *ngFor="let group of filteredCacheGroups">\r\n\t\t\t\t\t\t\t<div class="registry-group-header">\r\n\t\t\t\t\t\t\t\t<span class="comp-icon">\r\n\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<polygon points="12 2 2 7 12 12 22 7 12 2"></polygon>\r\n\t\t\t\t\t\t\t\t\t\t<polyline points="2 17 12 22 22 17"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t<polyline points="2 12 12 17 22 12"></polyline>\r\n\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t<span class="comp-name">{{ group.rulePath }}</span>\r\n\t\t\t\t\t\t\t\t<span class="comp-count"\r\n\t\t\t\t\t\t\t\t\t>{{ group.entries.length }} entry<ng-container\r\n\t\t\t\t\t\t\t\t\t\t*ngIf="group.entries.length !== 1"\r\n\t\t\t\t\t\t\t\t\t\t>s</ng-container\r\n\t\t\t\t\t\t\t\t\t></span\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<span class="comp-count" style="margin-left: auto">{{\r\n\t\t\t\t\t\t\t\t\tgetGroupSize(group)\r\n\t\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="registry-list">\r\n\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\tclass="registry-item-container"\r\n\t\t\t\t\t\t\t\t\t*ngFor="let entry of group.entries"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<div class="registry-item">\r\n\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\tclass="store-badge"\r\n\t\t\t\t\t\t\t\t\t\t\t[ngClass]="\r\n\t\t\t\t\t\t\t\t\t\t\t\tentry.persistenceType.toString().toLowerCase()\r\n\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t>{{ entry.persistenceType }}</span\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<span class="path-text" [title]="entry.key">\r\n\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t*ngIf="entry.encriptType !== \'NONE\'"\r\n\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstyle="\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmargin-right: 4px;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tvertical-align: text-top;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: #dcdcaa;\r\n\t\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<rect\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tx="3"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\ty="11"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="18"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="11"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\trx="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\try="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t></rect>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<path d="M7 11V7a5 5 0 0 1 10 0v4"></path>\r\n\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t{{ entry.key }}\r\n\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t<span class="comp-count" style="margin-right: 8px">{{\r\n\t\t\t\t\t\t\t\t\t\t\tformatSize(entry.dataSize || 0)\r\n\t\t\t\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t\t\t\t<div class="item-actions">\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="action-btn"\r\n\t\t\t\t\t\t\t\t\t\t\t\t[class.active]="expandedContentId === entry.key"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="\r\n\t\t\t\t\t\t\t\t\t\t\t\t\topenContentModal(entry.key, entry.encriptType)\r\n\t\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="View Content"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<circle cx="12" cy="12" r="3"></circle>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="action-btn"\r\n\t\t\t\t\t\t\t\t\t\t\t\t*ngIf="entry.hasPayload"\r\n\t\t\t\t\t\t\t\t\t\t\t\t[class.active]="expandedPayloadId === entry.key"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="togglePayload(entry.key)"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Toggle Payload Request"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<polyline\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpoints="22 12 18 12 15 21 9 3 6 12 2 12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="action-btn delete"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="deleteEntry(entry.key)"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Delete Entry"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<polyline points="3 6 5 6 21 6"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2-2v2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\t\tclass="payload-content"\r\n\t\t\t\t\t\t\t\t\t\t*ngIf="expandedPayloadId === entry.key"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<asor-json-view\r\n\t\t\t\t\t\t\t\t\t\t\t*ngIf="entry.payloadData"\r\n\t\t\t\t\t\t\t\t\t\t\t[data]="entry.payloadData"\r\n\t\t\t\t\t\t\t\t\t\t></asor-json-view>\r\n\t\t\t\t\t\t\t\t\t\t<span class="empty-payload" *ngIf="!entry.payloadData"\r\n\t\t\t\t\t\t\t\t\t\t\t>Unable to parse payload request.</span\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<ng-template #noData>\r\n\t\t\t\t\t\t<div class="empty-state">No items found in cache matching the filter.</div>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n\x3c!-- Modal Overlay for Content Details --\x3e\r\n<div class="modal-overlay" *ngIf="expandedContentId" (click)="closeContentModal()">\r\n\t<div class="modal-content" (click)="$event.stopPropagation()">\r\n\t\t<div class="modal-header">\r\n\t\t\t<h3>Content Details</h3>\r\n\t\t\t<span class="path-text" [title]="expandedContentId">{{ expandedContentId }}</span>\r\n\t\t\t<button class="close-btn" (click)="closeContentModal()" title="Close">×</button>\r\n\t\t</div>\r\n\t\t<div class="modal-body">\r\n\t\t\t<div class="decrypt-prompt" *ngIf="currentContent?._requiresKey">\r\n\t\t\t\t<div class="decrypt-header">\r\n\t\t\t\t\t<svg\r\n\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\twidth="16"\r\n\t\t\t\t\t\theight="16"\r\n\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect>\r\n\t\t\t\t\t\t<path d="M7 11V7a5 5 0 0 1 10 0v4"></path>\r\n\t\t\t\t\t</svg>\r\n\t\t\t\t\t<span>Encrypted Content</span>\r\n\t\t\t\t</div>\r\n\t\t\t\t<p class="decrypt-desc">Enter the decryption key to view this response.</p>\r\n\t\t\t\t<div class="decrypt-input-group">\r\n\t\t\t\t\t<input\r\n\t\t\t\t\t\tclass="registry-search"\r\n\t\t\t\t\t\t[(ngModel)]="customKeys[expandedContentId]"\r\n\t\t\t\t\t\ttype="password"\r\n\t\t\t\t\t\tplaceholder="Enter Secret Key"\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<button class="decrypt-btn" (click)="decryptContent(expandedContentId)">\r\n\t\t\t\t\t\tDecrypt\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="error-msg" *ngIf="decryptErrors[expandedContentId]">\r\n\t\t\t\t\t{{ decryptErrors[expandedContentId] }}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<asor-json-view\r\n\t\t\t\t*ngIf="currentContent && !currentContent._requiresKey"\r\n\t\t\t\t[data]="currentContent"\r\n\t\t\t></asor-json-view>\r\n\t\t\t<span class="empty-payload" *ngIf="!currentContent && currentContent !== null"\r\n\t\t\t\t>Empty content.</span\r\n\t\t\t>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n\x3c!-- Cleanup Results Modal --\x3e\r\n<div class="modal-overlay" *ngIf="isCleanupModalOpen" (click)="isCleanupModalOpen = false">\r\n\t<div class="modal-content" (click)="$event.stopPropagation()">\r\n\t\t<div class="modal-header">\r\n\t\t\t<h3>Cleaned Cache Entries</h3>\r\n\t\t\t<span class="path-text">Total recovered size: {{ formatSize(cleanedTotalSize) }}</span>\r\n\t\t\t<button class="close-btn" (click)="isCleanupModalOpen = false" title="Close">×</button>\r\n\t\t</div>\r\n\t\t<div class="modal-body" style="padding: 0">\r\n\t\t\t<div class="cleanup-table">\r\n\t\t\t\t<div class="cleanup-table-header">\r\n\t\t\t\t\t<span class="col-type">Type</span>\r\n\t\t\t\t\t<span class="col-path">Path</span>\r\n\t\t\t\t\t<span class="col-size" style="text-align: right">Size</span>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="cleanup-table-body">\r\n\t\t\t\t\t<div class="cleanup-table-row" *ngFor="let entry of cleanedEntries">\r\n\t\t\t\t\t\t<span class="col-type">\r\n\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\tclass="store-badge"\r\n\t\t\t\t\t\t\t\t*ngIf="entry.persistenceType"\r\n\t\t\t\t\t\t\t\t[ngClass]="entry.persistenceType.toString().toLowerCase()"\r\n\t\t\t\t\t\t\t\t>{{ entry.persistenceType }}</span\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<span class="col-path" [title]="entry.key">\r\n\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t*ngIf="entry.encriptType && entry.encriptType !== \'NONE\'"\r\n\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\tstyle="margin-right: 6px; flex-shrink: 0; color: #dcdcaa"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect>\r\n\t\t\t\t\t\t\t\t<path d="M7 11V7a5 5 0 0 1 10 0v4"></path>\r\n\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\tstyle="\r\n\t\t\t\t\t\t\t\t\toverflow: hidden;\r\n\t\t\t\t\t\t\t\t\ttext-overflow: ellipsis;\r\n\t\t\t\t\t\t\t\t\twhite-space: nowrap;\r\n\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t>{{ entry.key }}</span\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<span class="col-size">{{ formatSize(entry.dataSize) }}</span>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n\x3c!-- Clear All Confirmation Modal --\x3e\r\n<div class="modal-overlay" *ngIf="isClearAllModalOpen" (click)="isClearAllModalOpen = false">\r\n\t<div class="modal-content" (click)="$event.stopPropagation()" style="max-width: 400px">\r\n\t\t<div class="modal-header">\r\n\t\t\t<h3>Confirm Cache Clear</h3>\r\n\t\t\t<button class="close-btn" (click)="isClearAllModalOpen = false" title="Close">×</button>\r\n\t\t</div>\r\n\t\t<div class="modal-body" style="padding: 20px">\r\n\t\t\t<p style="color: #ccc; margin: 0 0 20px 0; font-size: 14px; line-height: 1.5">\r\n\t\t\t\tAre you sure you want to completely clear the cache? This action cannot be undone.\r\n\t\t\t</p>\r\n\t\t\t<div style="display: flex; justify-content: flex-end; gap: 10px">\r\n\t\t\t\t<button\r\n\t\t\t\t\t(click)="isClearAllModalOpen = false"\r\n\t\t\t\t\tstyle="\r\n\t\t\t\t\t\tpadding: 6px 16px;\r\n\t\t\t\t\t\tbackground: transparent;\r\n\t\t\t\t\t\tborder: 1px solid #444;\r\n\t\t\t\t\t\tcolor: #ccc;\r\n\t\t\t\t\t\tborder-radius: 4px;\r\n\t\t\t\t\t\tcursor: pointer;\r\n\t\t\t\t\t\tfont-size: 13px;\r\n\t\t\t\t\t"\r\n\t\t\t\t>\r\n\t\t\t\t\tCancel\r\n\t\t\t\t</button>\r\n\t\t\t\t<button\r\n\t\t\t\t\t(click)="executeClearAll()"\r\n\t\t\t\t\tstyle="\r\n\t\t\t\t\t\tpadding: 6px 16px;\r\n\t\t\t\t\t\tbackground: rgba(244, 135, 113, 0.2);\r\n\t\t\t\t\t\tborder: 1px solid #f48771;\r\n\t\t\t\t\t\tcolor: #f48771;\r\n\t\t\t\t\t\tborder-radius: 4px;\r\n\t\t\t\t\t\tcursor: pointer;\r\n\t\t\t\t\t\tfont-size: 13px;\r\n\t\t\t\t\t\tfont-weight: 600;\r\n\t\t\t\t\t"\r\n\t\t\t\t>\r\n\t\t\t\t\tClear All\r\n\t\t\t\t</button>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n',styles:[".state-dashboard{display:flex;flex-direction:column;height:100%;color:#ccc;font-family:Segoe UI,sans-serif;gap:6px;overflow-y:auto}.state-dashboard::-webkit-scrollbar,.state-dashboard .registry-table-container::-webkit-scrollbar,.state-dashboard .payload-content::-webkit-scrollbar,.state-dashboard .rules-list::-webkit-scrollbar{width:10px;height:10px}.state-dashboard::-webkit-scrollbar-track,.state-dashboard .registry-table-container::-webkit-scrollbar-track,.state-dashboard .payload-content::-webkit-scrollbar-track,.state-dashboard .rules-list::-webkit-scrollbar-track{background:#1e1e1e}.state-dashboard::-webkit-scrollbar-thumb,.state-dashboard .registry-table-container::-webkit-scrollbar-thumb,.state-dashboard .payload-content::-webkit-scrollbar-thumb,.state-dashboard .rules-list::-webkit-scrollbar-thumb{background:#424242;border-radius:5px;border:2px solid #1e1e1e}.state-dashboard::-webkit-scrollbar-thumb:hover,.state-dashboard .registry-table-container::-webkit-scrollbar-thumb:hover,.state-dashboard .payload-content::-webkit-scrollbar-thumb:hover,.state-dashboard .rules-list::-webkit-scrollbar-thumb:hover{background:#4f4f4f}.state-dashboard .dashboard-header{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.state-dashboard .dashboard-header .stat-card{background-color:#252526;border:1px solid #333;border-radius:6px;padding:8px 12px;min-width:100px;display:flex;flex-direction:column;align-items:center}.state-dashboard .dashboard-header .stat-card .label{font-size:10px;color:#888;text-transform:uppercase;letter-spacing:.5px}.state-dashboard .dashboard-header .stat-card .value{font-size:14px;font-weight:600;color:#eee;margin-top:2px}.state-dashboard .dashboard-header .stat-card .value.active{color:#4caf50}.state-dashboard .header-toolbar{display:flex;justify-content:flex-end;gap:6px;padding:4px 8px}.state-dashboard .header-toolbar .circle-c-btn{background:none;border:1px solid #444;color:#ccc;cursor:pointer;width:30px;height:30px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s}.state-dashboard .header-toolbar .circle-c-btn:hover{background-color:#333}.state-dashboard .header-toolbar .circle-c-btn.clear-all:hover{background-color:#f4877133;color:#f48771}.state-dashboard .header-toolbar .circle-c-btn.collapsed{transform:rotate(-90deg)}.state-dashboard .header-section{flex-shrink:0;display:flex;flex-direction:row;align-items:flex-start;overflow:hidden;border-radius:6px}.state-dashboard .header-section .section-body{flex:1;min-width:0;padding:5px;transition:opacity .25s ease}.state-dashboard .header-section .section-body.collapsed{padding:0;margin:0;max-height:0;opacity:0}@media (max-width: 768px){.state-dashboard .header-section{display:unset}}.state-dashboard .dashboard-content{flex:1;overflow-y:auto;padding-right:5px}.state-dashboard .dashboard-content .split-view{display:flex;gap:20px;height:100%}.state-dashboard .dashboard-content .section-container{display:flex;flex-direction:column;overflow:hidden;border:1px solid #333;border-radius:6px;margin-bottom:20px;flex:1;min-width:0}@media (max-width: 768px){.state-dashboard .dashboard-content .split-view{flex-direction:column;height:auto}.state-dashboard .dashboard-content .section-container{flex:none}}.state-dashboard .dashboard-content .section-title{margin:4px 8px;font-size:13px;color:#888;font-weight:600;display:flex;justify-content:space-between;align-items:center;cursor:pointer;border-radius:4px}.state-dashboard .dashboard-content .section-title:hover{background-color:#2a2a2a}.state-dashboard .dashboard-content .section-title .collapse-icon{font-size:14px;transition:transform .25s ease}.state-dashboard .dashboard-content .section-title .collapse-icon.collapsed{transform:rotate(-90deg)}.state-dashboard .dashboard-content .section-body{padding:5px;max-height:2000px;transition:max-height .35s ease,opacity .25s ease;display:flex;flex-direction:column;flex:1;min-height:0}.state-dashboard .dashboard-content .section-body.collapsed{padding:0;max-height:0;opacity:0;overflow:hidden}.state-dashboard .dashboard-content .registry-toolbar{padding:8px 10px;background-color:#252526;border-bottom:1px solid #333;border-radius:4px}.state-dashboard .dashboard-content .registry-toolbar .search-container{position:relative;display:flex;align-items:center;background-color:#1e1e1e;border:1px solid #3c3c3c;border-radius:4px}.state-dashboard .dashboard-content .registry-toolbar .search-container:focus-within{border-color:#007acc}.state-dashboard .dashboard-content .registry-toolbar .search-container .search-icon{padding:0 8px;color:#888;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-toolbar .search-container .registry-search{flex:1;background:transparent;border:none;color:#d4d4d4;padding:6px 0;font-size:13px;font-family:inherit;outline:none}.state-dashboard .dashboard-content .registry-toolbar .search-container .registry-search::placeholder{color:#666}.state-dashboard .dashboard-content .registry-toolbar .search-container .clear-search-btn{background:transparent;border:none;color:#888;padding:0 8px;cursor:pointer;font-size:16px;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-toolbar .search-container .clear-search-btn:hover{color:#ccc}.state-dashboard .dashboard-content .rules-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px;overflow-y:auto;flex:1;padding:2px 5px 20px}.state-dashboard .dashboard-content .rules-list .rule-card{background-color:#1e1e1e;border:1px solid #333;border-radius:6px;padding:10px}.state-dashboard .dashboard-content .rules-list .rule-card .rule-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.state-dashboard .dashboard-content .rules-list .rule-card .rule-header .rule-path{font-family:monospace;color:#dcdcaa;font-weight:700}.state-dashboard .dashboard-content .rules-list .rule-card .rule-body{font-size:12px;color:#9cdcfe}.state-dashboard .dashboard-content .rules-list .rule-card .rule-body .rule-detail{margin-top:4px}.state-dashboard .dashboard-content .rules-list .rule-card .rule-body .rule-detail strong{color:#888}.state-dashboard .dashboard-content .rules-list .rule-card .rule-body .rule-detail .clear-on-list{margin:4px 0 0 16px;padding:0;color:#ce9178;font-family:monospace}.state-dashboard .dashboard-content .registry-table-container{overflow-y:auto;flex:1;padding:2px 5px 20px}.state-dashboard .dashboard-content .registry-table-container .registry-group{margin-bottom:16px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header{display:flex;align-items:center;gap:8px;padding:6px 12px;background-color:#252526;border-top:1px solid #333;border-bottom:1px solid #333;border-radius:4px;position:sticky;top:0;z-index:10}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-icon{color:#4ec9b0;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-name{color:#4ec9b0;font-weight:600;font-family:monospace;font-size:13px;flex:1;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-count{font-size:11px;color:#888;background:#ffffff0d;padding:2px 6px;border-radius:10px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list{display:flex;flex-direction:column}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container{border-bottom:1px solid #333;display:flex;flex-direction:column}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container:last-child{border-bottom:none}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item{padding:8px 12px 8px 36px;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item:hover{background-color:#2a2a2a}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .store-badge{margin-right:8px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .path-text{color:#ce9178;font-family:monospace;font-size:12px;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:2px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .item-actions{display:flex;gap:6px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .item-actions .action-btn{background:none;border:none;color:#ccc;cursor:pointer;padding:4px;border-radius:4px;display:flex;align-items:center;justify-content:center}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .item-actions .action-btn:hover{background-color:#ffffff1a}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .item-actions .action-btn.delete:hover{background-color:#f4877133;color:#f48771}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .item-actions .action-btn.active{background-color:#2a2a2a;color:#4fc1ff}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .payload-content{border-top:1px solid #333;max-height:300px;overflow-y:auto;padding:10px 12px 10px 36px;background:#1e1e1e;color:#d16969;font-size:12px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt{padding:10px 0}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-header{display:flex;align-items:center;gap:8px;color:#e2c08d;font-weight:600;font-size:13px;margin-bottom:6px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-desc{font-size:12px;color:#888;margin:0 0 10px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-input-group{display:flex;gap:8px;margin-bottom:8px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-input-group .registry-search{background-color:#252526;border:1px solid #3c3c3c;border-radius:4px;color:#d4d4d4;padding:6px 10px;font-size:12px;flex:1;font-family:inherit;outline:none}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-input-group .registry-search:focus{border-color:#007acc}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-input-group .decrypt-btn{background-color:#007acc;color:#fff;border:none;border-radius:4px;padding:6px 12px;font-size:12px;cursor:pointer;transition:background-color .2s}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-input-group .decrypt-btn:hover{background-color:#005999}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .error-msg{color:#f48771;font-size:11px;margin-top:4px}.state-dashboard .empty-state{padding:20px;text-align:center;color:#666;font-style:italic}:host{display:block;height:100%}:host *::-webkit-scrollbar{width:8px;height:8px}:host *::-webkit-scrollbar-track{background:#1e1e1e;border-radius:4px}:host *::-webkit-scrollbar-thumb{background:#444;border-radius:4px}:host *::-webkit-scrollbar-thumb:hover{background:#555}:host .cache-dashboard{padding:20px;color:#d4d4d4}:host .store-badge{font-size:10px;padding:2px 6px;border-radius:4px;font-weight:600}:host .store-badge.session{background-color:#0e639c33;color:#4fc1ff}:host .store-badge.local{background-color:#60ac3933;color:#b5cea8}:host .store-badge.volatile{background-color:#d7ba7d33;color:#d7ba7d}.cleanup-table{display:flex;flex-direction:column;max-height:400px}.cleanup-table .cleanup-table-header{display:grid;grid-template-columns:80px 1fr 80px;gap:16px;padding:10px 16px;background-color:#252526;border-bottom:1px solid #333;font-size:12px;font-weight:600;color:#888;position:sticky;top:0}.cleanup-table .cleanup-table-body{overflow-y:auto;display:flex;flex-direction:column}.cleanup-table .cleanup-table-body .cleanup-table-row{display:grid;grid-template-columns:80px 1fr 80px;gap:16px;align-items:center;padding:8px 16px;border-bottom:1px solid #333}.cleanup-table .cleanup-table-body .cleanup-table-row:last-child{border-bottom:none}.cleanup-table .cleanup-table-body .cleanup-table-row:hover{background-color:#2a2a2a}.cleanup-table .cleanup-table-body .cleanup-table-row .col-type{display:flex;align-items:center}.cleanup-table .cleanup-table-body .cleanup-table-row .col-path{color:#ce9178;font-family:monospace;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center}.cleanup-table .cleanup-table-body .cleanup-table-row .col-size{color:#888;font-size:11px;text-align:right;background:#ffffff0d;padding:2px 6px;border-radius:10px}.modal-overlay{position:absolute;inset:0;width:100%;height:100%;background-color:#0009;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);display:flex;justify-content:center;align-items:center;z-index:1000}.modal-content{background-color:#1e1e1e;border:1px solid #333;border-radius:8px;width:90%;max-width:800px;max-height:90%;display:flex;flex-direction:column;box-shadow:0 10px 30px #00000080}.modal-content .modal-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #333;background-color:#252526;border-top-left-radius:8px;border-top-right-radius:8px;gap:12px}.modal-content .modal-header h3{margin:0;font-size:14px;color:#ccc;font-weight:600}.modal-content .modal-header .path-text{color:#ce9178;font-family:monospace;font-size:12px;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modal-content .modal-header .close-btn{background:none;border:none;color:#888;font-size:20px;cursor:pointer;line-height:1;padding:0 4px}.modal-content .modal-header .close-btn:hover{color:#ccc}.modal-content .modal-body{padding:16px;overflow-y:auto;flex:1}.modal-content .modal-body .decrypt-prompt{padding:10px 0}.modal-content .modal-body .decrypt-prompt .decrypt-header{display:flex;align-items:center;gap:8px;color:#e2c08d;font-weight:600;font-size:14px;margin-bottom:10px}.modal-content .modal-body .decrypt-prompt .decrypt-desc{font-size:13px;color:#888;margin:0 0 12px}.modal-content .modal-body .decrypt-prompt .decrypt-input-group{display:flex;gap:8px;margin-bottom:8px}.modal-content .modal-body .decrypt-prompt .decrypt-input-group .registry-search{background-color:#252526;border:1px solid #3c3c3c;border-radius:4px;color:#d4d4d4;padding:8px 12px;font-size:13px;flex:1;font-family:inherit;outline:none}.modal-content .modal-body .decrypt-prompt .decrypt-input-group .registry-search:focus{border-color:#007acc}.modal-content .modal-body .decrypt-prompt .decrypt-input-group .decrypt-btn{background-color:#007acc;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:13px;font-weight:600;cursor:pointer;transition:background-color .2s}.modal-content .modal-body .decrypt-prompt .decrypt-input-group .decrypt-btn:hover{background-color:#005999}.modal-content .modal-body .decrypt-prompt .error-msg{color:#f48771;font-size:12px;margin-top:6px}.info-banner{position:absolute;top:20px;left:50%;transform:translate(-50%);background-color:#252526;border:1px solid #4ec9b0;color:#4ec9b0;padding:8px 16px;border-radius:6px;box-shadow:0 4px 12px #00000080;z-index:1001;font-size:13px;display:flex;align-items:center;gap:8px;animation:slideDown .3s ease-out}@keyframes slideDown{0%{top:-40px;opacity:0}to{top:20px;opacity:1}}\n"],dependencies:[{kind:"ngmodule",type:w},{kind:"directive",type:m.NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:m.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:m.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"ngmodule",type:F},{kind:"directive",type:H.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:H.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:H.NgModel,selector:"[ngModel]:not([formControlName]):not([formControl])",inputs:["name","disabled","ngModel","ngModelOptions"],outputs:["ngModelChange"],exportAs:["ngModel"]},{kind:"component",type:JsonViewComponent,selector:"asor-json-view",inputs:["data","key","level","expandDepth"]}],encapsulation:t.ViewEncapsulation.ShadowDom})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:CacheTabComponent,decorators:[{type:p,args:[{selector:"asor-cache-tab",standalone:!0,imports:[w,F,JsonViewComponent],encapsulation:d.ShadowDom,template:'<div class="state-dashboard">\r\n\t\x3c!-- Cleanup Info Banner --\x3e\r\n\t<div class="info-banner" *ngIf="showCleanUpBanner">\r\n\t\t<svg\r\n\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\twidth="16"\r\n\t\t\theight="16"\r\n\t\t\tviewBox="0 0 24 24"\r\n\t\t\tfill="none"\r\n\t\t\tstroke="currentColor"\r\n\t\t\tstroke-width="2"\r\n\t\t\tstroke-linecap="round"\r\n\t\t\tstroke-linejoin="round"\r\n\t\t>\r\n\t\t\t<circle cx="12" cy="12" r="10"></circle>\r\n\t\t\t<line x1="12" y1="16" x2="12" y2="12"></line>\r\n\t\t\t<line x1="12" y1="8" x2="12.01" y2="8"></line>\r\n\t\t</svg>\r\n\t\t<span>No obsolete cache entries found. Everything is clean!</span>\r\n\t</div>\r\n\r\n\t\x3c!-- Clear All Info Banner --\x3e\r\n\t<div class="info-banner" *ngIf="showClearAllBanner">\r\n\t\t<svg\r\n\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\twidth="16"\r\n\t\t\theight="16"\r\n\t\t\tviewBox="0 0 24 24"\r\n\t\t\tfill="none"\r\n\t\t\tstroke="currentColor"\r\n\t\t\tstroke-width="2"\r\n\t\t\tstroke-linecap="round"\r\n\t\t\tstroke-linejoin="round"\r\n\t\t>\r\n\t\t\t<polyline points="20 6 9 17 4 12"></polyline>\r\n\t\t</svg>\r\n\t\t<span>All cache entries have been successfully cleared!</span>\r\n\t</div>\r\n\r\n\t\x3c!-- Header Stats --\x3e\r\n\t<div class="section-container header-section">\r\n\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.status">\r\n\t\t\t<div class="dashboard-header">\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Total Entries</div>\r\n\t\t\t\t\t<div class="value">{{ stats.total }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Total Cache Size</div>\r\n\t\t\t\t\t<div class="value">{{ formatSize(sizes.total) }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Volatile Cache</div>\r\n\t\t\t\t\t<div class="value" [class.active]="stats.volatile > 0">\r\n\t\t\t\t\t\t{{ stats.volatile }}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="label" style="font-size: 9px; margin-top: 2px">\r\n\t\t\t\t\t\t{{ formatSize(sizes.volatile) }}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Session Cache</div>\r\n\t\t\t\t\t<div class="value" [class.active]="stats.session > 0">{{ stats.session }}</div>\r\n\t\t\t\t\t<div class="label" style="font-size: 9px; margin-top: 2px">\r\n\t\t\t\t\t\t{{ formatSize(sizes.session) }}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Local Cache</div>\r\n\t\t\t\t\t<div class="value" [class.active]="stats.local > 0">{{ stats.local }}</div>\r\n\t\t\t\t\t<div class="label" style="font-size: 9px; margin-top: 2px">\r\n\t\t\t\t\t\t{{ formatSize(sizes.local) }}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div class="header-toolbar">\r\n\t\t\t<button class="circle-c-btn" (click)="cleanUpCache()" title="Clean Up Obsolete Cache">\r\n\t\t\t\t<svg\r\n\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\twidth="16"\r\n\t\t\t\t\theight="16"\r\n\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\tfill="none"\r\n\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t>\r\n\t\t\t\t\t<path d="m9.06 11.9 8.07-8.06a2.85 2.85 0 1 1 4.03 4.03l-8.06 8.08"></path>\r\n\t\t\t\t\t<path\r\n\t\t\t\t\t\td="M7.07 14.94c-1.66 0-3 1.35-3 3.02 0 1.33-2.5 1.52-2 2.02 1.08 1.35 2.22 1.45 3.02 1.45 2.26 0 4.14-1.84 4.14-4.11 0-1.66-1.35-3-3.02-3.02z"\r\n\t\t\t\t\t></path>\r\n\t\t\t\t</svg>\r\n\t\t\t</button>\r\n\t\t\t<button\r\n\t\t\t\tclass="circle-c-btn clear-all"\r\n\t\t\t\t(click)="clearAll(); $event.stopPropagation()"\r\n\t\t\t\ttitle="Clear All Cache"\r\n\t\t\t>\r\n\t\t\t\t<svg\r\n\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\twidth="14"\r\n\t\t\t\t\theight="14"\r\n\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\tfill="none"\r\n\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t>\r\n\t\t\t\t\t<polyline points="3 6 5 6 21 6"></polyline>\r\n\t\t\t\t\t<path\r\n\t\t\t\t\t\td="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2-2v2"\r\n\t\t\t\t\t></path>\r\n\t\t\t\t\t<line x1="10" y1="11" x2="10" y2="17"></line>\r\n\t\t\t\t\t<line x1="14" y1="11" x2="14" y2="17"></line>\r\n\t\t\t\t</svg>\r\n\t\t\t</button>\r\n\t\t\t<button\r\n\t\t\t\tclass="circle-c-btn"\r\n\t\t\t\t(click)="refreshCache(); $event.stopPropagation()"\r\n\t\t\t\ttitle="Refresh Cache"\r\n\t\t\t>\r\n\t\t\t\t↻\r\n\t\t\t</button>\r\n\t\t\t<button\r\n\t\t\t\tclass="circle-c-btn"\r\n\t\t\t\t[class.collapsed]="sectionsCollapsed.status"\r\n\t\t\t\t(click)="toggleSection(\'status\')"\r\n\t\t\t\ttitle="Toggle Status"\r\n\t\t\t>\r\n\t\t\t\t▾\r\n\t\t\t</button>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<div class="dashboard-content">\r\n\t\t<div class="split-view">\r\n\t\t\t\x3c!-- Active Rules Section --\x3e\r\n\t\t\t<div class="section-container">\r\n\t\t\t\t<h4 class="section-title" (click)="toggleSection(\'rules\')">\r\n\t\t\t\t\t<span>Active Cache Rules</span>\r\n\t\t\t\t\t<span class="collapse-icon" [class.collapsed]="sectionsCollapsed.rules">▾</span>\r\n\t\t\t\t</h4>\r\n\t\t\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.rules">\r\n\t\t\t\t\t<div class="registry-toolbar">\r\n\t\t\t\t\t\t<div class="search-container">\r\n\t\t\t\t\t\t\t<span class="search-icon">\r\n\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<circle cx="11" cy="11" r="8"></circle>\r\n\t\t\t\t\t\t\t\t\t<line x1="21" y1="21" x2="16.65" y2="16.65"></line>\r\n\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\tclass="registry-search"\r\n\t\t\t\t\t\t\t\t[(ngModel)]="rulesSearchTerm"\r\n\t\t\t\t\t\t\t\ttype="text"\r\n\t\t\t\t\t\t\t\tplaceholder="Filter rules by path or type..."\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tclass="clear-search-btn"\r\n\t\t\t\t\t\t\t\t*ngIf="rulesSearchTerm"\r\n\t\t\t\t\t\t\t\t(click)="rulesSearchTerm = \'\'"\r\n\t\t\t\t\t\t\t\ttitle="Clear search"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t×\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tclass="registry-table-container"\r\n\t\t\t\t\t\t*ngIf="filteredRuleGroups.length > 0; else noRules"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<div class="registry-group" *ngFor="let group of filteredRuleGroups">\r\n\t\t\t\t\t\t\t<div class="registry-group-header">\r\n\t\t\t\t\t\t\t\t<span class="comp-icon">\r\n\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<ellipse cx="12" cy="5" rx="9" ry="3"></ellipse>\r\n\t\t\t\t\t\t\t\t\t\t<path d="M21 12c0 1.66-4 3-9 3s-9-1.34-9-3"></path>\r\n\t\t\t\t\t\t\t\t\t\t<path d="M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5"></path>\r\n\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t<span class="comp-name">{{ group.persistenceType }}</span>\r\n\t\t\t\t\t\t\t\t<span class="comp-count"\r\n\t\t\t\t\t\t\t\t\t>{{ group.rules.length }} rule<ng-container\r\n\t\t\t\t\t\t\t\t\t\t*ngIf="group.rules.length !== 1"\r\n\t\t\t\t\t\t\t\t\t\t>s</ng-container\r\n\t\t\t\t\t\t\t\t\t></span\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<span class="comp-count" style="margin-left: auto">{{\r\n\t\t\t\t\t\t\t\t\tgetSizeForType(group.persistenceType)\r\n\t\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="rules-list" style="padding: 10px">\r\n\t\t\t\t\t\t\t\t<div class="rule-card" *ngFor="let rule of group.rules">\r\n\t\t\t\t\t\t\t\t\t<div class="rule-header">\r\n\t\t\t\t\t\t\t\t\t\t<span class="rule-path">{{ rule.pathValue }}</span>\r\n\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\tclass="store-badge"\r\n\t\t\t\t\t\t\t\t\t\t\t[ngClass]="\r\n\t\t\t\t\t\t\t\t\t\t\t\trule.persistenceType.toString().toLowerCase()\r\n\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t>{{ rule.persistenceType }}</span\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<div class="rule-body">\r\n\t\t\t\t\t\t\t\t\t\t<div class="rule-detail">\r\n\t\t\t\t\t\t\t\t\t\t\t<strong>Payload Cache:</strong>\r\n\t\t\t\t\t\t\t\t\t\t\t{{ rule.reqPayloadCache ? \'Enabled\' : \'Disabled\' }}\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t<div class="rule-detail">\r\n\t\t\t\t\t\t\t\t\t\t\t<strong>Encryption:</strong> {{ rule.encriptType }}\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\t\t\tclass="rule-detail"\r\n\t\t\t\t\t\t\t\t\t\t\t*ngIf="rule.clearOn && rule.clearOn.length > 0"\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<strong>Clear On:</strong>\r\n\t\t\t\t\t\t\t\t\t\t\t<ul class="clear-on-list">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<li *ngFor="let c of rule.clearOn">{{ c }}</li>\r\n\t\t\t\t\t\t\t\t\t\t\t</ul>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<ng-template #noRules>\r\n\t\t\t\t\t\t<div class="empty-state">No cache rules match the filter.</div>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t\x3c!-- Cache Entries Section --\x3e\r\n\t\t\t<div class="section-container">\r\n\t\t\t\t<h4 class="section-title" (click)="toggleSection(\'entries\')">\r\n\t\t\t\t\t<span>Cache Entries</span>\r\n\t\t\t\t\t<span class="collapse-icon" [class.collapsed]="sectionsCollapsed.entries"\r\n\t\t\t\t\t\t>▾</span\r\n\t\t\t\t\t>\r\n\t\t\t\t</h4>\r\n\t\t\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.entries">\r\n\t\t\t\t\t<div class="registry-toolbar">\r\n\t\t\t\t\t\t<div class="search-container">\r\n\t\t\t\t\t\t\t<span class="search-icon">\r\n\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<circle cx="11" cy="11" r="8"></circle>\r\n\t\t\t\t\t\t\t\t\t<line x1="21" y1="21" x2="16.65" y2="16.65"></line>\r\n\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\tclass="registry-search"\r\n\t\t\t\t\t\t\t\t[(ngModel)]="entriesSearchTerm"\r\n\t\t\t\t\t\t\t\ttype="text"\r\n\t\t\t\t\t\t\t\tplaceholder="Filter entries by key or type..."\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tclass="clear-search-btn"\r\n\t\t\t\t\t\t\t\t*ngIf="entriesSearchTerm"\r\n\t\t\t\t\t\t\t\t(click)="entriesSearchTerm = \'\'"\r\n\t\t\t\t\t\t\t\ttitle="Clear search"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t×\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tclass="registry-table-container"\r\n\t\t\t\t\t\t*ngIf="filteredCacheGroups.length > 0; else noData"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<div class="registry-group" *ngFor="let group of filteredCacheGroups">\r\n\t\t\t\t\t\t\t<div class="registry-group-header">\r\n\t\t\t\t\t\t\t\t<span class="comp-icon">\r\n\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<polygon points="12 2 2 7 12 12 22 7 12 2"></polygon>\r\n\t\t\t\t\t\t\t\t\t\t<polyline points="2 17 12 22 22 17"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t<polyline points="2 12 12 17 22 12"></polyline>\r\n\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t<span class="comp-name">{{ group.rulePath }}</span>\r\n\t\t\t\t\t\t\t\t<span class="comp-count"\r\n\t\t\t\t\t\t\t\t\t>{{ group.entries.length }} entry<ng-container\r\n\t\t\t\t\t\t\t\t\t\t*ngIf="group.entries.length !== 1"\r\n\t\t\t\t\t\t\t\t\t\t>s</ng-container\r\n\t\t\t\t\t\t\t\t\t></span\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<span class="comp-count" style="margin-left: auto">{{\r\n\t\t\t\t\t\t\t\t\tgetGroupSize(group)\r\n\t\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="registry-list">\r\n\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\tclass="registry-item-container"\r\n\t\t\t\t\t\t\t\t\t*ngFor="let entry of group.entries"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<div class="registry-item">\r\n\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\tclass="store-badge"\r\n\t\t\t\t\t\t\t\t\t\t\t[ngClass]="\r\n\t\t\t\t\t\t\t\t\t\t\t\tentry.persistenceType.toString().toLowerCase()\r\n\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t>{{ entry.persistenceType }}</span\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<span class="path-text" [title]="entry.key">\r\n\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t*ngIf="entry.encriptType !== \'NONE\'"\r\n\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstyle="\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmargin-right: 4px;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tvertical-align: text-top;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: #dcdcaa;\r\n\t\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<rect\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tx="3"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\ty="11"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="18"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="11"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\trx="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\try="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t></rect>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<path d="M7 11V7a5 5 0 0 1 10 0v4"></path>\r\n\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t{{ entry.key }}\r\n\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t<span class="comp-count" style="margin-right: 8px">{{\r\n\t\t\t\t\t\t\t\t\t\t\tformatSize(entry.dataSize || 0)\r\n\t\t\t\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t\t\t\t<div class="item-actions">\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="action-btn"\r\n\t\t\t\t\t\t\t\t\t\t\t\t[class.active]="expandedContentId === entry.key"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="\r\n\t\t\t\t\t\t\t\t\t\t\t\t\topenContentModal(entry.key, entry.encriptType)\r\n\t\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="View Content"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<circle cx="12" cy="12" r="3"></circle>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="action-btn"\r\n\t\t\t\t\t\t\t\t\t\t\t\t*ngIf="entry.hasPayload"\r\n\t\t\t\t\t\t\t\t\t\t\t\t[class.active]="expandedPayloadId === entry.key"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="togglePayload(entry.key)"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Toggle Payload Request"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<polyline\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpoints="22 12 18 12 15 21 9 3 6 12 2 12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="action-btn delete"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="deleteEntry(entry.key)"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Delete Entry"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<polyline points="3 6 5 6 21 6"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2-2v2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\t\tclass="payload-content"\r\n\t\t\t\t\t\t\t\t\t\t*ngIf="expandedPayloadId === entry.key"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<asor-json-view\r\n\t\t\t\t\t\t\t\t\t\t\t*ngIf="entry.payloadData"\r\n\t\t\t\t\t\t\t\t\t\t\t[data]="entry.payloadData"\r\n\t\t\t\t\t\t\t\t\t\t></asor-json-view>\r\n\t\t\t\t\t\t\t\t\t\t<span class="empty-payload" *ngIf="!entry.payloadData"\r\n\t\t\t\t\t\t\t\t\t\t\t>Unable to parse payload request.</span\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<ng-template #noData>\r\n\t\t\t\t\t\t<div class="empty-state">No items found in cache matching the filter.</div>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n\x3c!-- Modal Overlay for Content Details --\x3e\r\n<div class="modal-overlay" *ngIf="expandedContentId" (click)="closeContentModal()">\r\n\t<div class="modal-content" (click)="$event.stopPropagation()">\r\n\t\t<div class="modal-header">\r\n\t\t\t<h3>Content Details</h3>\r\n\t\t\t<span class="path-text" [title]="expandedContentId">{{ expandedContentId }}</span>\r\n\t\t\t<button class="close-btn" (click)="closeContentModal()" title="Close">×</button>\r\n\t\t</div>\r\n\t\t<div class="modal-body">\r\n\t\t\t<div class="decrypt-prompt" *ngIf="currentContent?._requiresKey">\r\n\t\t\t\t<div class="decrypt-header">\r\n\t\t\t\t\t<svg\r\n\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\twidth="16"\r\n\t\t\t\t\t\theight="16"\r\n\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect>\r\n\t\t\t\t\t\t<path d="M7 11V7a5 5 0 0 1 10 0v4"></path>\r\n\t\t\t\t\t</svg>\r\n\t\t\t\t\t<span>Encrypted Content</span>\r\n\t\t\t\t</div>\r\n\t\t\t\t<p class="decrypt-desc">Enter the decryption key to view this response.</p>\r\n\t\t\t\t<div class="decrypt-input-group">\r\n\t\t\t\t\t<input\r\n\t\t\t\t\t\tclass="registry-search"\r\n\t\t\t\t\t\t[(ngModel)]="customKeys[expandedContentId]"\r\n\t\t\t\t\t\ttype="password"\r\n\t\t\t\t\t\tplaceholder="Enter Secret Key"\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<button class="decrypt-btn" (click)="decryptContent(expandedContentId)">\r\n\t\t\t\t\t\tDecrypt\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="error-msg" *ngIf="decryptErrors[expandedContentId]">\r\n\t\t\t\t\t{{ decryptErrors[expandedContentId] }}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<asor-json-view\r\n\t\t\t\t*ngIf="currentContent && !currentContent._requiresKey"\r\n\t\t\t\t[data]="currentContent"\r\n\t\t\t></asor-json-view>\r\n\t\t\t<span class="empty-payload" *ngIf="!currentContent && currentContent !== null"\r\n\t\t\t\t>Empty content.</span\r\n\t\t\t>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n\x3c!-- Cleanup Results Modal --\x3e\r\n<div class="modal-overlay" *ngIf="isCleanupModalOpen" (click)="isCleanupModalOpen = false">\r\n\t<div class="modal-content" (click)="$event.stopPropagation()">\r\n\t\t<div class="modal-header">\r\n\t\t\t<h3>Cleaned Cache Entries</h3>\r\n\t\t\t<span class="path-text">Total recovered size: {{ formatSize(cleanedTotalSize) }}</span>\r\n\t\t\t<button class="close-btn" (click)="isCleanupModalOpen = false" title="Close">×</button>\r\n\t\t</div>\r\n\t\t<div class="modal-body" style="padding: 0">\r\n\t\t\t<div class="cleanup-table">\r\n\t\t\t\t<div class="cleanup-table-header">\r\n\t\t\t\t\t<span class="col-type">Type</span>\r\n\t\t\t\t\t<span class="col-path">Path</span>\r\n\t\t\t\t\t<span class="col-size" style="text-align: right">Size</span>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="cleanup-table-body">\r\n\t\t\t\t\t<div class="cleanup-table-row" *ngFor="let entry of cleanedEntries">\r\n\t\t\t\t\t\t<span class="col-type">\r\n\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\tclass="store-badge"\r\n\t\t\t\t\t\t\t\t*ngIf="entry.persistenceType"\r\n\t\t\t\t\t\t\t\t[ngClass]="entry.persistenceType.toString().toLowerCase()"\r\n\t\t\t\t\t\t\t\t>{{ entry.persistenceType }}</span\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<span class="col-path" [title]="entry.key">\r\n\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t*ngIf="entry.encriptType && entry.encriptType !== \'NONE\'"\r\n\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\tstyle="margin-right: 6px; flex-shrink: 0; color: #dcdcaa"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect>\r\n\t\t\t\t\t\t\t\t<path d="M7 11V7a5 5 0 0 1 10 0v4"></path>\r\n\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\tstyle="\r\n\t\t\t\t\t\t\t\t\toverflow: hidden;\r\n\t\t\t\t\t\t\t\t\ttext-overflow: ellipsis;\r\n\t\t\t\t\t\t\t\t\twhite-space: nowrap;\r\n\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t>{{ entry.key }}</span\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<span class="col-size">{{ formatSize(entry.dataSize) }}</span>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n\x3c!-- Clear All Confirmation Modal --\x3e\r\n<div class="modal-overlay" *ngIf="isClearAllModalOpen" (click)="isClearAllModalOpen = false">\r\n\t<div class="modal-content" (click)="$event.stopPropagation()" style="max-width: 400px">\r\n\t\t<div class="modal-header">\r\n\t\t\t<h3>Confirm Cache Clear</h3>\r\n\t\t\t<button class="close-btn" (click)="isClearAllModalOpen = false" title="Close">×</button>\r\n\t\t</div>\r\n\t\t<div class="modal-body" style="padding: 20px">\r\n\t\t\t<p style="color: #ccc; margin: 0 0 20px 0; font-size: 14px; line-height: 1.5">\r\n\t\t\t\tAre you sure you want to completely clear the cache? This action cannot be undone.\r\n\t\t\t</p>\r\n\t\t\t<div style="display: flex; justify-content: flex-end; gap: 10px">\r\n\t\t\t\t<button\r\n\t\t\t\t\t(click)="isClearAllModalOpen = false"\r\n\t\t\t\t\tstyle="\r\n\t\t\t\t\t\tpadding: 6px 16px;\r\n\t\t\t\t\t\tbackground: transparent;\r\n\t\t\t\t\t\tborder: 1px solid #444;\r\n\t\t\t\t\t\tcolor: #ccc;\r\n\t\t\t\t\t\tborder-radius: 4px;\r\n\t\t\t\t\t\tcursor: pointer;\r\n\t\t\t\t\t\tfont-size: 13px;\r\n\t\t\t\t\t"\r\n\t\t\t\t>\r\n\t\t\t\t\tCancel\r\n\t\t\t\t</button>\r\n\t\t\t\t<button\r\n\t\t\t\t\t(click)="executeClearAll()"\r\n\t\t\t\t\tstyle="\r\n\t\t\t\t\t\tpadding: 6px 16px;\r\n\t\t\t\t\t\tbackground: rgba(244, 135, 113, 0.2);\r\n\t\t\t\t\t\tborder: 1px solid #f48771;\r\n\t\t\t\t\t\tcolor: #f48771;\r\n\t\t\t\t\t\tborder-radius: 4px;\r\n\t\t\t\t\t\tcursor: pointer;\r\n\t\t\t\t\t\tfont-size: 13px;\r\n\t\t\t\t\t\tfont-weight: 600;\r\n\t\t\t\t\t"\r\n\t\t\t\t>\r\n\t\t\t\t\tClear All\r\n\t\t\t\t</button>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n',styles:[".state-dashboard{display:flex;flex-direction:column;height:100%;color:#ccc;font-family:Segoe UI,sans-serif;gap:6px;overflow-y:auto}.state-dashboard::-webkit-scrollbar,.state-dashboard .registry-table-container::-webkit-scrollbar,.state-dashboard .payload-content::-webkit-scrollbar,.state-dashboard .rules-list::-webkit-scrollbar{width:10px;height:10px}.state-dashboard::-webkit-scrollbar-track,.state-dashboard .registry-table-container::-webkit-scrollbar-track,.state-dashboard .payload-content::-webkit-scrollbar-track,.state-dashboard .rules-list::-webkit-scrollbar-track{background:#1e1e1e}.state-dashboard::-webkit-scrollbar-thumb,.state-dashboard .registry-table-container::-webkit-scrollbar-thumb,.state-dashboard .payload-content::-webkit-scrollbar-thumb,.state-dashboard .rules-list::-webkit-scrollbar-thumb{background:#424242;border-radius:5px;border:2px solid #1e1e1e}.state-dashboard::-webkit-scrollbar-thumb:hover,.state-dashboard .registry-table-container::-webkit-scrollbar-thumb:hover,.state-dashboard .payload-content::-webkit-scrollbar-thumb:hover,.state-dashboard .rules-list::-webkit-scrollbar-thumb:hover{background:#4f4f4f}.state-dashboard .dashboard-header{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.state-dashboard .dashboard-header .stat-card{background-color:#252526;border:1px solid #333;border-radius:6px;padding:8px 12px;min-width:100px;display:flex;flex-direction:column;align-items:center}.state-dashboard .dashboard-header .stat-card .label{font-size:10px;color:#888;text-transform:uppercase;letter-spacing:.5px}.state-dashboard .dashboard-header .stat-card .value{font-size:14px;font-weight:600;color:#eee;margin-top:2px}.state-dashboard .dashboard-header .stat-card .value.active{color:#4caf50}.state-dashboard .header-toolbar{display:flex;justify-content:flex-end;gap:6px;padding:4px 8px}.state-dashboard .header-toolbar .circle-c-btn{background:none;border:1px solid #444;color:#ccc;cursor:pointer;width:30px;height:30px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s}.state-dashboard .header-toolbar .circle-c-btn:hover{background-color:#333}.state-dashboard .header-toolbar .circle-c-btn.clear-all:hover{background-color:#f4877133;color:#f48771}.state-dashboard .header-toolbar .circle-c-btn.collapsed{transform:rotate(-90deg)}.state-dashboard .header-section{flex-shrink:0;display:flex;flex-direction:row;align-items:flex-start;overflow:hidden;border-radius:6px}.state-dashboard .header-section .section-body{flex:1;min-width:0;padding:5px;transition:opacity .25s ease}.state-dashboard .header-section .section-body.collapsed{padding:0;margin:0;max-height:0;opacity:0}@media (max-width: 768px){.state-dashboard .header-section{display:unset}}.state-dashboard .dashboard-content{flex:1;overflow-y:auto;padding-right:5px}.state-dashboard .dashboard-content .split-view{display:flex;gap:20px;height:100%}.state-dashboard .dashboard-content .section-container{display:flex;flex-direction:column;overflow:hidden;border:1px solid #333;border-radius:6px;margin-bottom:20px;flex:1;min-width:0}@media (max-width: 768px){.state-dashboard .dashboard-content .split-view{flex-direction:column;height:auto}.state-dashboard .dashboard-content .section-container{flex:none}}.state-dashboard .dashboard-content .section-title{margin:4px 8px;font-size:13px;color:#888;font-weight:600;display:flex;justify-content:space-between;align-items:center;cursor:pointer;border-radius:4px}.state-dashboard .dashboard-content .section-title:hover{background-color:#2a2a2a}.state-dashboard .dashboard-content .section-title .collapse-icon{font-size:14px;transition:transform .25s ease}.state-dashboard .dashboard-content .section-title .collapse-icon.collapsed{transform:rotate(-90deg)}.state-dashboard .dashboard-content .section-body{padding:5px;max-height:2000px;transition:max-height .35s ease,opacity .25s ease;display:flex;flex-direction:column;flex:1;min-height:0}.state-dashboard .dashboard-content .section-body.collapsed{padding:0;max-height:0;opacity:0;overflow:hidden}.state-dashboard .dashboard-content .registry-toolbar{padding:8px 10px;background-color:#252526;border-bottom:1px solid #333;border-radius:4px}.state-dashboard .dashboard-content .registry-toolbar .search-container{position:relative;display:flex;align-items:center;background-color:#1e1e1e;border:1px solid #3c3c3c;border-radius:4px}.state-dashboard .dashboard-content .registry-toolbar .search-container:focus-within{border-color:#007acc}.state-dashboard .dashboard-content .registry-toolbar .search-container .search-icon{padding:0 8px;color:#888;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-toolbar .search-container .registry-search{flex:1;background:transparent;border:none;color:#d4d4d4;padding:6px 0;font-size:13px;font-family:inherit;outline:none}.state-dashboard .dashboard-content .registry-toolbar .search-container .registry-search::placeholder{color:#666}.state-dashboard .dashboard-content .registry-toolbar .search-container .clear-search-btn{background:transparent;border:none;color:#888;padding:0 8px;cursor:pointer;font-size:16px;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-toolbar .search-container .clear-search-btn:hover{color:#ccc}.state-dashboard .dashboard-content .rules-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px;overflow-y:auto;flex:1;padding:2px 5px 20px}.state-dashboard .dashboard-content .rules-list .rule-card{background-color:#1e1e1e;border:1px solid #333;border-radius:6px;padding:10px}.state-dashboard .dashboard-content .rules-list .rule-card .rule-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.state-dashboard .dashboard-content .rules-list .rule-card .rule-header .rule-path{font-family:monospace;color:#dcdcaa;font-weight:700}.state-dashboard .dashboard-content .rules-list .rule-card .rule-body{font-size:12px;color:#9cdcfe}.state-dashboard .dashboard-content .rules-list .rule-card .rule-body .rule-detail{margin-top:4px}.state-dashboard .dashboard-content .rules-list .rule-card .rule-body .rule-detail strong{color:#888}.state-dashboard .dashboard-content .rules-list .rule-card .rule-body .rule-detail .clear-on-list{margin:4px 0 0 16px;padding:0;color:#ce9178;font-family:monospace}.state-dashboard .dashboard-content .registry-table-container{overflow-y:auto;flex:1;padding:2px 5px 20px}.state-dashboard .dashboard-content .registry-table-container .registry-group{margin-bottom:16px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header{display:flex;align-items:center;gap:8px;padding:6px 12px;background-color:#252526;border-top:1px solid #333;border-bottom:1px solid #333;border-radius:4px;position:sticky;top:0;z-index:10}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-icon{color:#4ec9b0;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-name{color:#4ec9b0;font-weight:600;font-family:monospace;font-size:13px;flex:1;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-count{font-size:11px;color:#888;background:#ffffff0d;padding:2px 6px;border-radius:10px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list{display:flex;flex-direction:column}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container{border-bottom:1px solid #333;display:flex;flex-direction:column}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container:last-child{border-bottom:none}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item{padding:8px 12px 8px 36px;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item:hover{background-color:#2a2a2a}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .store-badge{margin-right:8px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .path-text{color:#ce9178;font-family:monospace;font-size:12px;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:2px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .item-actions{display:flex;gap:6px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .item-actions .action-btn{background:none;border:none;color:#ccc;cursor:pointer;padding:4px;border-radius:4px;display:flex;align-items:center;justify-content:center}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .item-actions .action-btn:hover{background-color:#ffffff1a}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .item-actions .action-btn.delete:hover{background-color:#f4877133;color:#f48771}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .item-actions .action-btn.active{background-color:#2a2a2a;color:#4fc1ff}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .payload-content{border-top:1px solid #333;max-height:300px;overflow-y:auto;padding:10px 12px 10px 36px;background:#1e1e1e;color:#d16969;font-size:12px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt{padding:10px 0}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-header{display:flex;align-items:center;gap:8px;color:#e2c08d;font-weight:600;font-size:13px;margin-bottom:6px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-desc{font-size:12px;color:#888;margin:0 0 10px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-input-group{display:flex;gap:8px;margin-bottom:8px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-input-group .registry-search{background-color:#252526;border:1px solid #3c3c3c;border-radius:4px;color:#d4d4d4;padding:6px 10px;font-size:12px;flex:1;font-family:inherit;outline:none}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-input-group .registry-search:focus{border-color:#007acc}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-input-group .decrypt-btn{background-color:#007acc;color:#fff;border:none;border-radius:4px;padding:6px 12px;font-size:12px;cursor:pointer;transition:background-color .2s}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-input-group .decrypt-btn:hover{background-color:#005999}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .error-msg{color:#f48771;font-size:11px;margin-top:4px}.state-dashboard .empty-state{padding:20px;text-align:center;color:#666;font-style:italic}:host{display:block;height:100%}:host *::-webkit-scrollbar{width:8px;height:8px}:host *::-webkit-scrollbar-track{background:#1e1e1e;border-radius:4px}:host *::-webkit-scrollbar-thumb{background:#444;border-radius:4px}:host *::-webkit-scrollbar-thumb:hover{background:#555}:host .cache-dashboard{padding:20px;color:#d4d4d4}:host .store-badge{font-size:10px;padding:2px 6px;border-radius:4px;font-weight:600}:host .store-badge.session{background-color:#0e639c33;color:#4fc1ff}:host .store-badge.local{background-color:#60ac3933;color:#b5cea8}:host .store-badge.volatile{background-color:#d7ba7d33;color:#d7ba7d}.cleanup-table{display:flex;flex-direction:column;max-height:400px}.cleanup-table .cleanup-table-header{display:grid;grid-template-columns:80px 1fr 80px;gap:16px;padding:10px 16px;background-color:#252526;border-bottom:1px solid #333;font-size:12px;font-weight:600;color:#888;position:sticky;top:0}.cleanup-table .cleanup-table-body{overflow-y:auto;display:flex;flex-direction:column}.cleanup-table .cleanup-table-body .cleanup-table-row{display:grid;grid-template-columns:80px 1fr 80px;gap:16px;align-items:center;padding:8px 16px;border-bottom:1px solid #333}.cleanup-table .cleanup-table-body .cleanup-table-row:last-child{border-bottom:none}.cleanup-table .cleanup-table-body .cleanup-table-row:hover{background-color:#2a2a2a}.cleanup-table .cleanup-table-body .cleanup-table-row .col-type{display:flex;align-items:center}.cleanup-table .cleanup-table-body .cleanup-table-row .col-path{color:#ce9178;font-family:monospace;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center}.cleanup-table .cleanup-table-body .cleanup-table-row .col-size{color:#888;font-size:11px;text-align:right;background:#ffffff0d;padding:2px 6px;border-radius:10px}.modal-overlay{position:absolute;inset:0;width:100%;height:100%;background-color:#0009;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);display:flex;justify-content:center;align-items:center;z-index:1000}.modal-content{background-color:#1e1e1e;border:1px solid #333;border-radius:8px;width:90%;max-width:800px;max-height:90%;display:flex;flex-direction:column;box-shadow:0 10px 30px #00000080}.modal-content .modal-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #333;background-color:#252526;border-top-left-radius:8px;border-top-right-radius:8px;gap:12px}.modal-content .modal-header h3{margin:0;font-size:14px;color:#ccc;font-weight:600}.modal-content .modal-header .path-text{color:#ce9178;font-family:monospace;font-size:12px;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modal-content .modal-header .close-btn{background:none;border:none;color:#888;font-size:20px;cursor:pointer;line-height:1;padding:0 4px}.modal-content .modal-header .close-btn:hover{color:#ccc}.modal-content .modal-body{padding:16px;overflow-y:auto;flex:1}.modal-content .modal-body .decrypt-prompt{padding:10px 0}.modal-content .modal-body .decrypt-prompt .decrypt-header{display:flex;align-items:center;gap:8px;color:#e2c08d;font-weight:600;font-size:14px;margin-bottom:10px}.modal-content .modal-body .decrypt-prompt .decrypt-desc{font-size:13px;color:#888;margin:0 0 12px}.modal-content .modal-body .decrypt-prompt .decrypt-input-group{display:flex;gap:8px;margin-bottom:8px}.modal-content .modal-body .decrypt-prompt .decrypt-input-group .registry-search{background-color:#252526;border:1px solid #3c3c3c;border-radius:4px;color:#d4d4d4;padding:8px 12px;font-size:13px;flex:1;font-family:inherit;outline:none}.modal-content .modal-body .decrypt-prompt .decrypt-input-group .registry-search:focus{border-color:#007acc}.modal-content .modal-body .decrypt-prompt .decrypt-input-group .decrypt-btn{background-color:#007acc;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:13px;font-weight:600;cursor:pointer;transition:background-color .2s}.modal-content .modal-body .decrypt-prompt .decrypt-input-group .decrypt-btn:hover{background-color:#005999}.modal-content .modal-body .decrypt-prompt .error-msg{color:#f48771;font-size:12px;margin-top:6px}.info-banner{position:absolute;top:20px;left:50%;transform:translate(-50%);background-color:#252526;border:1px solid #4ec9b0;color:#4ec9b0;padding:8px 16px;border-radius:6px;box-shadow:0 4px 12px #00000080;z-index:1001;font-size:13px;display:flex;align-items:center;gap:8px;animation:slideDown .3s ease-out}@keyframes slideDown{0%{top:-40px;opacity:0}to{top:20px;opacity:1}}\n"]}]}],ctorParameters:()=>[{type:WidgetCacheUtility}]});class AsorWidgetComponent{mode="on";logoSrc="data:image/png;base64,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";isOpen=!1;activeTab="console";widgetHeight=80;spyActivated=!1;get isVisible(){switch(this.mode){case"off":return!1;case"on":return!0;case"spy":return this.spyActivated}}onKeyDown(t){"spy"===this.mode&&t.ctrlKey&&"i"===t.key.toLowerCase()&&(t.preventDefault(),this.spyActivated=!this.spyActivated,this.spyActivated||(this.isOpen=!1))}toggleSlider(){this.isOpen=!this.isOpen}setHeight(t){this.widgetHeight=t}selectTab(t){this.activeTab=t}onTabChange(t){this.selectTab(t.target.value)}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:AsorWidgetComponent,deps:[],target:t.ɵɵFactoryTarget.Component});static ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"20.3.16",type:AsorWidgetComponent,isStandalone:!0,selector:"asor-core-widget",inputs:{mode:"mode"},host:{listeners:{"document:keydown":"onKeyDown($event)"}},ngImport:t,template:'<div class="asor-widget-container" *ngIf="isVisible">\r\n\t<div\r\n\t\tclass="slider"\r\n\t\t[class.open]="isOpen"\r\n\t\t[style.height.%]="widgetHeight"\r\n\t\t[style.bottom.%]="isOpen ? 0 : -widgetHeight"\r\n\t>\r\n\t\t<div class="slider-header">\r\n\t\t\t<div class="header-left">\r\n\t\t\t\t<img class="header-logo" [src]="logoSrc" alt="Asor Logo" />\r\n\t\t\t\t<span class="logo-text">Asor Core</span>\r\n\t\t\t\t<nav class="tabs">\r\n\t\t\t\t\t<button [class.active]="activeTab === \'console\'" (click)="selectTab(\'console\')">\r\n\t\t\t\t\t\tConsole\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<button [class.active]="activeTab === \'storage\'" (click)="selectTab(\'storage\')">\r\n\t\t\t\t\t\tStorage\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<button [class.active]="activeTab === \'cache\'" (click)="selectTab(\'cache\')">\r\n\t\t\t\t\t\tCache\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</nav>\r\n\t\t\t\t<div class="mobile-tabs">\r\n\t\t\t\t\t<select [value]="activeTab" (change)="onTabChange($event)">\r\n\t\t\t\t\t\t<option value="console">Console</option>\r\n\t\t\t\t\t\t<option value="storage">Storage</option>\r\n\t\t\t\t\t\t<option value="cache">Cache</option>\r\n\t\t\t\t\t</select>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<div class="header-right">\r\n\t\t\t\t<button\r\n\t\t\t\t\tclass="resize-btn"\r\n\t\t\t\t\t[class.active]="widgetHeight === 20"\r\n\t\t\t\t\t(click)="setHeight(20)"\r\n\t\t\t\t\ttitle="20%"\r\n\t\t\t\t>\r\n\t\t\t\t\t<svg\r\n\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\twidth="16"\r\n\t\t\t\t\t\theight="16"\r\n\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>\r\n\t\t\t\t\t\t<line x1="3" y1="17" x2="21" y2="17"></line>\r\n\t\t\t\t\t</svg>\r\n\t\t\t\t</button>\r\n\t\t\t\t<button\r\n\t\t\t\t\tclass="resize-btn"\r\n\t\t\t\t\t[class.active]="widgetHeight === 80"\r\n\t\t\t\t\t(click)="setHeight(80)"\r\n\t\t\t\t\ttitle="80%"\r\n\t\t\t\t>\r\n\t\t\t\t\t<svg\r\n\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\twidth="16"\r\n\t\t\t\t\t\theight="16"\r\n\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>\r\n\t\t\t\t\t\t<line x1="3" y1="7" x2="21" y2="7"></line>\r\n\t\t\t\t\t</svg>\r\n\t\t\t\t</button>\r\n\t\t\t\t<button\r\n\t\t\t\t\tclass="resize-btn"\r\n\t\t\t\t\t[class.active]="widgetHeight === 100"\r\n\t\t\t\t\t(click)="setHeight(100)"\r\n\t\t\t\t\ttitle="100%"\r\n\t\t\t\t>\r\n\t\t\t\t\t<svg\r\n\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\twidth="16"\r\n\t\t\t\t\t\theight="16"\r\n\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>\r\n\t\t\t\t\t</svg>\r\n\t\t\t\t</button>\r\n\t\t\t\t<button class="close-btn" (click)="toggleSlider()">×</button>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t<div class="slider-content">\r\n\t\t\t<asor-console-tab class="tab-panel" *ngIf="activeTab === \'console\'"></asor-console-tab>\r\n\t\t\t<asor-storage-tab class="tab-panel" *ngIf="activeTab === \'storage\'"></asor-storage-tab>\r\n\t\t\t<asor-cache-tab class="tab-panel" *ngIf="activeTab === \'cache\'"></asor-cache-tab>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<button class="floating-btn" *ngIf="!isOpen" (click)="toggleSlider()">\r\n\t\t<img [src]="logoSrc" alt="Asor Core Logo" />\r\n\t</button>\r\n</div>\r\n',styles:[":host{display:block}.asor-widget-container{font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif}.asor-widget-container *,.asor-widget-container *:before,.asor-widget-container *:after{box-sizing:border-box}.floating-btn{position:fixed;bottom:20px;right:20px;width:50px;height:50px;border-radius:50%;background-color:#007acc;box-shadow:0 4px 15px #0006;border:none;cursor:pointer;z-index:9999;display:flex;align-items:center;justify-content:center;transition:all .3s cubic-bezier(.25,.8,.25,1)}.floating-btn:hover{transform:scale(1.1);box-shadow:0 6px 20px #00000080}.floating-btn img{width:60%;height:60%;object-fit:contain;filter:brightness(0) invert(1)}.slider{position:fixed;left:0;right:0;background-color:#1e1e1e;color:#ccc;box-shadow:0 -4px 25px #00000080;z-index:9998;transition:bottom .4s cubic-bezier(.25,.8,.25,1),height .4s cubic-bezier(.25,.8,.25,1);border-top-left-radius:12px;border-top-right-radius:12px;display:flex;flex-direction:column;border-top:1px solid #333;overflow-y:auto;overscroll-behavior:none}.slider .slider-header{padding:0 20px;height:50px;border-bottom:1px solid #333;background-color:#252526;display:flex;justify-content:space-between;align-items:center;border-top-left-radius:12px;border-top-right-radius:12px}.slider .slider-header .header-left{display:flex;align-items:center;gap:12px}.slider .slider-header .header-left .header-logo{height:24px;width:auto;vertical-align:middle}.slider .slider-header .logo-text{font-weight:600;color:#fff;font-size:14px;letter-spacing:.5px}.slider .slider-header .tabs{display:flex;gap:10px;height:100%}@media (max-width: 768px){.slider .slider-header .tabs{display:none}}.slider .slider-header .tabs button{background:none;border:none;height:100%;padding:0 10px;font-size:13px;cursor:pointer;color:#999;transition:color .2s,border-bottom .2s;border-bottom:2px solid transparent}.slider .slider-header .tabs button:hover{color:#fff}.slider .slider-header .tabs button.active{color:#fff;border-bottom-color:#007acc}.slider .slider-header .mobile-tabs{display:none;height:100%;align-items:center}.slider .slider-header .mobile-tabs select{background-color:#333;color:#fff;border:1px solid #444;border-radius:4px;padding:4px 8px;font-family:inherit;font-size:13px;outline:none}.slider .slider-header .mobile-tabs select:focus{border-color:#007acc}@media (max-width: 768px){.slider .slider-header .mobile-tabs{display:flex}}.slider .slider-header .header-right{display:flex;align-items:center;gap:4px}.slider .slider-header .header-right .resize-btn,.slider .slider-header .header-right .close-btn{background:none;border:none;cursor:pointer;color:#999;width:30px;height:30px;display:flex;align-items:center;justify-content:center;border-radius:4px}.slider .slider-header .header-right .resize-btn.active,.slider .slider-header .header-right .resize-btn:hover,.slider .slider-header .header-right .close-btn.active,.slider .slider-header .header-right .close-btn:hover{background-color:#333;color:#fff}.slider .slider-header .header-right .close-btn{font-size:20px}.slider .slider-content{flex:1;padding:16px;overflow:hidden;background-color:#1e1e1e}.slider .tab-panel{height:100%;display:block}@media (max-width: 768px){.slider .floating-btn{bottom:16px;right:16px;width:44px;height:44px}.slider .slider.open~.floating-btn{display:none}}\n"],dependencies:[{kind:"ngmodule",type:w},{kind:"directive",type:m.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:ConsoleTabComponent,selector:"asor-console-tab"},{kind:"component",type:StorageTabComponent,selector:"asor-storage-tab"},{kind:"component",type:CacheTabComponent,selector:"asor-cache-tab"}],encapsulation:t.ViewEncapsulation.ShadowDom})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.16",ngImport:t,type:AsorWidgetComponent,decorators:[{type:p,args:[{selector:"asor-core-widget",standalone:!0,imports:[w,ConsoleTabComponent,StorageTabComponent,CacheTabComponent],encapsulation:d.ShadowDom,template:'<div class="asor-widget-container" *ngIf="isVisible">\r\n\t<div\r\n\t\tclass="slider"\r\n\t\t[class.open]="isOpen"\r\n\t\t[style.height.%]="widgetHeight"\r\n\t\t[style.bottom.%]="isOpen ? 0 : -widgetHeight"\r\n\t>\r\n\t\t<div class="slider-header">\r\n\t\t\t<div class="header-left">\r\n\t\t\t\t<img class="header-logo" [src]="logoSrc" alt="Asor Logo" />\r\n\t\t\t\t<span class="logo-text">Asor Core</span>\r\n\t\t\t\t<nav class="tabs">\r\n\t\t\t\t\t<button [class.active]="activeTab === \'console\'" (click)="selectTab(\'console\')">\r\n\t\t\t\t\t\tConsole\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<button [class.active]="activeTab === \'storage\'" (click)="selectTab(\'storage\')">\r\n\t\t\t\t\t\tStorage\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<button [class.active]="activeTab === \'cache\'" (click)="selectTab(\'cache\')">\r\n\t\t\t\t\t\tCache\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</nav>\r\n\t\t\t\t<div class="mobile-tabs">\r\n\t\t\t\t\t<select [value]="activeTab" (change)="onTabChange($event)">\r\n\t\t\t\t\t\t<option value="console">Console</option>\r\n\t\t\t\t\t\t<option value="storage">Storage</option>\r\n\t\t\t\t\t\t<option value="cache">Cache</option>\r\n\t\t\t\t\t</select>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<div class="header-right">\r\n\t\t\t\t<button\r\n\t\t\t\t\tclass="resize-btn"\r\n\t\t\t\t\t[class.active]="widgetHeight === 20"\r\n\t\t\t\t\t(click)="setHeight(20)"\r\n\t\t\t\t\ttitle="20%"\r\n\t\t\t\t>\r\n\t\t\t\t\t<svg\r\n\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\twidth="16"\r\n\t\t\t\t\t\theight="16"\r\n\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>\r\n\t\t\t\t\t\t<line x1="3" y1="17" x2="21" y2="17"></line>\r\n\t\t\t\t\t</svg>\r\n\t\t\t\t</button>\r\n\t\t\t\t<button\r\n\t\t\t\t\tclass="resize-btn"\r\n\t\t\t\t\t[class.active]="widgetHeight === 80"\r\n\t\t\t\t\t(click)="setHeight(80)"\r\n\t\t\t\t\ttitle="80%"\r\n\t\t\t\t>\r\n\t\t\t\t\t<svg\r\n\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\twidth="16"\r\n\t\t\t\t\t\theight="16"\r\n\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>\r\n\t\t\t\t\t\t<line x1="3" y1="7" x2="21" y2="7"></line>\r\n\t\t\t\t\t</svg>\r\n\t\t\t\t</button>\r\n\t\t\t\t<button\r\n\t\t\t\t\tclass="resize-btn"\r\n\t\t\t\t\t[class.active]="widgetHeight === 100"\r\n\t\t\t\t\t(click)="setHeight(100)"\r\n\t\t\t\t\ttitle="100%"\r\n\t\t\t\t>\r\n\t\t\t\t\t<svg\r\n\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\twidth="16"\r\n\t\t\t\t\t\theight="16"\r\n\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>\r\n\t\t\t\t\t</svg>\r\n\t\t\t\t</button>\r\n\t\t\t\t<button class="close-btn" (click)="toggleSlider()">×</button>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t<div class="slider-content">\r\n\t\t\t<asor-console-tab class="tab-panel" *ngIf="activeTab === \'console\'"></asor-console-tab>\r\n\t\t\t<asor-storage-tab class="tab-panel" *ngIf="activeTab === \'storage\'"></asor-storage-tab>\r\n\t\t\t<asor-cache-tab class="tab-panel" *ngIf="activeTab === \'cache\'"></asor-cache-tab>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<button class="floating-btn" *ngIf="!isOpen" (click)="toggleSlider()">\r\n\t\t<img [src]="logoSrc" alt="Asor Core Logo" />\r\n\t</button>\r\n</div>\r\n',styles:[":host{display:block}.asor-widget-container{font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif}.asor-widget-container *,.asor-widget-container *:before,.asor-widget-container *:after{box-sizing:border-box}.floating-btn{position:fixed;bottom:20px;right:20px;width:50px;height:50px;border-radius:50%;background-color:#007acc;box-shadow:0 4px 15px #0006;border:none;cursor:pointer;z-index:9999;display:flex;align-items:center;justify-content:center;transition:all .3s cubic-bezier(.25,.8,.25,1)}.floating-btn:hover{transform:scale(1.1);box-shadow:0 6px 20px #00000080}.floating-btn img{width:60%;height:60%;object-fit:contain;filter:brightness(0) invert(1)}.slider{position:fixed;left:0;right:0;background-color:#1e1e1e;color:#ccc;box-shadow:0 -4px 25px #00000080;z-index:9998;transition:bottom .4s cubic-bezier(.25,.8,.25,1),height .4s cubic-bezier(.25,.8,.25,1);border-top-left-radius:12px;border-top-right-radius:12px;display:flex;flex-direction:column;border-top:1px solid #333;overflow-y:auto;overscroll-behavior:none}.slider .slider-header{padding:0 20px;height:50px;border-bottom:1px solid #333;background-color:#252526;display:flex;justify-content:space-between;align-items:center;border-top-left-radius:12px;border-top-right-radius:12px}.slider .slider-header .header-left{display:flex;align-items:center;gap:12px}.slider .slider-header .header-left .header-logo{height:24px;width:auto;vertical-align:middle}.slider .slider-header .logo-text{font-weight:600;color:#fff;font-size:14px;letter-spacing:.5px}.slider .slider-header .tabs{display:flex;gap:10px;height:100%}@media (max-width: 768px){.slider .slider-header .tabs{display:none}}.slider .slider-header .tabs button{background:none;border:none;height:100%;padding:0 10px;font-size:13px;cursor:pointer;color:#999;transition:color .2s,border-bottom .2s;border-bottom:2px solid transparent}.slider .slider-header .tabs button:hover{color:#fff}.slider .slider-header .tabs button.active{color:#fff;border-bottom-color:#007acc}.slider .slider-header .mobile-tabs{display:none;height:100%;align-items:center}.slider .slider-header .mobile-tabs select{background-color:#333;color:#fff;border:1px solid #444;border-radius:4px;padding:4px 8px;font-family:inherit;font-size:13px;outline:none}.slider .slider-header .mobile-tabs select:focus{border-color:#007acc}@media (max-width: 768px){.slider .slider-header .mobile-tabs{display:flex}}.slider .slider-header .header-right{display:flex;align-items:center;gap:4px}.slider .slider-header .header-right .resize-btn,.slider .slider-header .header-right .close-btn{background:none;border:none;cursor:pointer;color:#999;width:30px;height:30px;display:flex;align-items:center;justify-content:center;border-radius:4px}.slider .slider-header .header-right .resize-btn.active,.slider .slider-header .header-right .resize-btn:hover,.slider .slider-header .header-right .close-btn.active,.slider .slider-header .header-right .close-btn:hover{background-color:#333;color:#fff}.slider .slider-header .header-right .close-btn{font-size:20px}.slider .slider-content{flex:1;padding:16px;overflow:hidden;background-color:#1e1e1e}.slider .tab-panel{height:100%;display:block}@media (max-width: 768px){.slider .floating-btn{bottom:16px;right:16px;width:44px;height:44px}.slider .slider.open~.floating-btn{display:none}}\n"]}]}],propDecorators:{mode:[{type:c}],onKeyDown:[{type:u,args:["document:keydown",["$event"]]}]}});export{Z as AsorGlobalEnum,Y as AsorStorage,AsorWidgetComponent,AuthGuard,AuthUtility,BaseComponent,BaseHandlerMixin,BaseMolecule,BaseStorageComponent,BaseStorageMolecule,CacheInterceptor,CachePathUtility,CacheUtility,CollectionUtils,ConfigCache,ConfigConst,ConsoleLogsConfig,ConsoleLogsUtility,CookieUtils,ErrorInterceptor,HttpRequestHandler,MockHttpInterceptor,MockOrchestratorService,MockRequestMapping,NotifyErrorService,ObjectUtils,RandomUtils,RoutingUtility,StateConst,StateService,Q as StringUtils,TranslatePipe,TranslateUtility,createFlattenedReactiveProxy};
1
+ import*as t from"@angular/core";import{inject as e,Injectable as r,Directive as n,ViewChildren as o,Injector as a,runInInjectionContext as s,ChangeDetectorRef as i,Pipe as l,Input as c,ViewEncapsulation as d,Component as p,ViewChild as g,EventEmitter as h,Output as b,HostListener as u}from"@angular/core";import{ActivatedRoute as f,Router as y,UrlTree as x}from"@angular/router";import*as m from"@angular/common";import{Location as v,CommonModule as w}from"@angular/common";import{ReplaySubject as k,of as C,BehaviorSubject as S,forkJoin as E,throwError as I,from as j,Observable as O,isObservable as T,tap as N}from"rxjs";import{map as z,filter as D,first as M,tap as A,switchMap as L,catchError as U}from"rxjs/operators";import{HttpClient as R,HttpResponse as V,HttpHeaders as B}from"@angular/common/http";import*as P from"crypto-js";import*as H from"@angular/forms";import{FormsModule as F}from"@angular/forms";class ConfigConst{static BaseApi="/api/v1";static SiteBaseUrl="/asor-core";static SiteAssetsUrl="/assets";static _routeBase={NONE:"none",PAGE_UNAUTHORIZED:"unathorized",LOGIN:"login"};static _routeExtensions;static get Route(){return{...this._routeBase,...this._routeExtensions}}static _urlBase={get UNAUTHORIZED(){return ConfigConst.SiteBaseUrl.concat("/unathorized")},get LOGIN(){return ConfigConst.SiteBaseUrl.concat("/login")}};static _urlExtensions;static get Url(){return{UNAUTHORIZED:this._urlBase.UNAUTHORIZED,LOGIN:this._urlBase.LOGIN,...this._urlExtensions}}static _translationUrlBase={DefaultLanguage:"en"};static _translationUrlExtensions;static get TranslationUrl(){return{...this._translationUrlBase,...this._translationUrlExtensions}}static _authCheckBase={PAGE_UNAUTHORIZED:"unathorized"};static _authCheckExtensions;static get AuthCheck(){return{...this._authCheckBase,...this._authCheckExtensions}}static _cacheBase={NONE:""};static _cacheExtensions;static get Cache(){return{...this._cacheBase,...this._cacheExtensions}}static SetConfiguration(t){if(!(t._routeExtensions&&t._urlExtensions&&t._translationUrlExtensions&&t._authCheckExtensions&&t._cacheExtensions))throw new Error("Missing configuration extensions");this.BaseApi=t.BaseApi,this.SiteBaseUrl=t.SiteBaseUrl,this.SiteAssetsUrl=t.SiteAssetsUrl,this._routeExtensions=t._routeExtensions,this._urlExtensions=t._urlExtensions,this._translationUrlExtensions=t._translationUrlExtensions,this._authCheckExtensions=t._authCheckExtensions,this._cacheExtensions=t._cacheExtensions}}class ConfigCache{static globalStateName="default";static _pathsBase=[];static _pathsExtensions;static get Paths(){return[...this._pathsBase,...this._pathsExtensions]}static SetConfiguration(t){if(!t._pathsExtensions)throw new Error("Missing configuration extensions");if(!t.globalStateName)throw new Error("Missing global state name");this.globalStateName=t.globalStateName,this._pathsExtensions=t._pathsExtensions}}class ConsoleLogsConfig{static defaultLevels=[];static silent=!1;static classConfigs=[];static isLevelEnabled(t,e){const r=ConsoleLogsConfig.classConfigs.find(e=>e.className===t),n=r&&r.levels&&r.levels.length>0?r.levels:ConsoleLogsConfig.defaultLevels;return n.includes("ALL")||n.includes(e)}static setClassLevels(t,e){const r=ConsoleLogsConfig.classConfigs.find(e=>e.className===t);r?r.levels=e:ConsoleLogsConfig.classConfigs.push({className:t,levels:e})}static removeClassConfig(t){ConsoleLogsConfig.classConfigs=ConsoleLogsConfig.classConfigs.filter(e=>e.className!==t)}static reset(){ConsoleLogsConfig.defaultLevels=["ALL"],ConsoleLogsConfig.classConfigs=[]}}class MockOrchestratorMapService{static staticRequestMappings=new Map;static registryMethod(t,e){return MockOrchestratorMapService.staticRequestMappings.set(t,e),e}}function MockRequestMapping(t){return function(e,r,n){return t={...t,className:e.constructor.className},MockOrchestratorMapService.registryMethod(t,n)}}var G,W,q,J,K;!function(t){t.GET="GET",t.POST="POST",t.PUT="PUT",t.DELETE="DELETE",t.PATCH="PATCH",t.HEAD="HEAD",t.OPTIONS="OPTIONS",t.CONNECT="CONNECT",t.TRACE="TRACE"}(G||(G={})),function(t){t[t.Continue=100]="Continue",t[t.SwitchingProtocols=101]="SwitchingProtocols",t[t.Processing=102]="Processing",t[t.OK=200]="OK",t[t.Created=201]="Created",t[t.Accepted=202]="Accepted",t[t.NonAuthoritativeInformation=203]="NonAuthoritativeInformation",t[t.NoContent=204]="NoContent",t[t.ResetContent=205]="ResetContent",t[t.PartialContent=206]="PartialContent",t[t.MultipleChoices=300]="MultipleChoices",t[t.MovedPermanently=301]="MovedPermanently",t[t.Found=302]="Found",t[t.SeeOther=303]="SeeOther",t[t.NotModified=304]="NotModified",t[t.UseProxy=305]="UseProxy",t[t.TemporaryRedirect=307]="TemporaryRedirect",t[t.PermanentRedirect=308]="PermanentRedirect",t[t.BadRequest=400]="BadRequest",t[t.Unauthorized=401]="Unauthorized",t[t.PaymentRequired=402]="PaymentRequired",t[t.Forbidden=403]="Forbidden",t[t.NotFound=404]="NotFound",t[t.MethodNotAllowed=405]="MethodNotAllowed",t[t.NotAcceptable=406]="NotAcceptable",t[t.ProxyAuthenticationRequired=407]="ProxyAuthenticationRequired",t[t.RequestTimeout=408]="RequestTimeout",t[t.Conflict=409]="Conflict",t[t.Gone=410]="Gone",t[t.LengthRequired=411]="LengthRequired",t[t.PreconditionFailed=412]="PreconditionFailed",t[t.PayloadTooLarge=413]="PayloadTooLarge",t[t.URITooLong=414]="URITooLong",t[t.UnsupportedMediaType=415]="UnsupportedMediaType",t[t.RangeNotSatisfiable=416]="RangeNotSatisfiable",t[t.ExpectationFailed=417]="ExpectationFailed",t[t.UnprocessableEntity=422]="UnprocessableEntity",t[t.Locked=423]="Locked",t[t.FailedDependency=424]="FailedDependency",t[t.UpgradeRequired=426]="UpgradeRequired",t[t.PreconditionRequired=428]="PreconditionRequired",t[t.TooManyRequests=429]="TooManyRequests",t[t.RequestHeaderFieldsTooLarge=431]="RequestHeaderFieldsTooLarge",t[t.UnavailableForLegalReasons=451]="UnavailableForLegalReasons",t[t.InternalServerError=500]="InternalServerError",t[t.NotImplemented=501]="NotImplemented",t[t.BadGateway=502]="BadGateway",t[t.ServiceUnavailable=503]="ServiceUnavailable",t[t.GatewayTimeout=504]="GatewayTimeout",t[t.HTTPVersionNotSupported=505]="HTTPVersionNotSupported",t[t.VariantAlsoNegotiates=506]="VariantAlsoNegotiates",t[t.InsufficientStorage=507]="InsufficientStorage",t[t.LoopDetected=508]="LoopDetected",t[t.NotExtended=510]="NotExtended",t[t.NetworkAuthenticationRequired=511]="NetworkAuthenticationRequired"}(W||(W={})),function(t){t.Ok="ok",t.Retray="re",t.NotAllow="na",t.Expired="ex"}(q||(q={})),function(t){t.VOLATILE="volatile",t.SESSION="session",t.LOCAL="local"}(J||(J={})),function(t){t.NONE="NONE",t.AUTO="AUTO",t.CUSTOM="CUSTOM"}(K||(K={}));var Z=Object.freeze({__proto__:null,get AuthStatus(){return q},get CacheEncriptType(){return K},get CacheType(){return J},get IHttpMethod(){return G},get IHttpStatusCode(){return W}});class StateConst{static EncryptType={AES:"AES"};static Generate={AUTO:"AUTO",CUSTOM:"CUSTOM"};static StoreType={VOLATILE:"VOLATILE",SESSION:"SESSION",LOCAL:"LOCAL"};static Data={REPLACE:"REPLACE",MERGE:"MERGE"};static Cookie={CACHE:"asor-cache-utility-asdgtr3648w9sd",CACHE_KEY:"asor-cache-key-rtyuiop789012",CACHE_KEY_EXPIRE:365,STATE:"asor-state-utility-qwezxc123456",STATE_KEY:"asor-secure-key-rtyuiop789012",STATE_KEY_EXPIRE:365};static CMPLX12=12;static CMPLX6=6}var Y=Object.freeze({__proto__:null,StateConst});class ConsoleLogsUtility{static logStream$=new k(1e3);static COLORS={INFO:{badge:"background:#0dcaf0;color:#000;border-radius:3px;font-weight:bold",text:"color:#0dcaf0",time:"color:#888"},DEBUG:{badge:"background:#a855f7;color:#fff;border-radius:3px;font-weight:bold",text:"color:#a855f7",time:"color:#888"},WARNING:{badge:"background:#f59e0b;color:#000;border-radius:3px;font-weight:bold",text:"color:#f59e0b",time:"color:#888"},ERROR:{badge:"background:#ef4444;color:#fff;border-radius:3px;font-weight:bold",text:"color:#ef4444;font-weight:bold",time:"color:#888"}};static formatTimestamp(){const t=new Date,pad=(t,e=2)=>String(t).padStart(e,"0");return`${t.getFullYear()}-${pad(t.getMonth()+1)}-${pad(t.getDate())} ${pad(t.getHours())}:${pad(t.getMinutes())}:${pad(t.getSeconds())}.${pad(t.getMilliseconds(),3)}`}static buildLog(t,e,r){const n=e?.className||e?.constructor?.className||e?.constructor?.name||"Unknown";if(!ConsoleLogsConfig.isLevelEnabled(n,t))return;const o=ConsoleLogsUtility.COLORS[t],a=ConsoleLogsUtility.formatTimestamp(),s=r.length>0?r[0]:"",i=r.slice(1);ConsoleLogsUtility.logStream$.next({timestamp:a,level:t,className:n,message:"string"==typeof s?s:JSON.stringify(s),params:i,source:e}),ConsoleLogsConfig.silent||("ERROR"===t?console.error:"WARNING"===t?console.warn:console.log)(`%c ${t} %c %c${a}%c [${n}] ${s}`,o.badge,"",o.time,o.text,...i)}static info(t,...e){ConsoleLogsUtility.buildLog("INFO",t,e)}static debug(t,...e){ConsoleLogsUtility.buildLog("DEBUG",t,e)}static warning(t,...e){ConsoleLogsUtility.buildLog("WARNING",t,e)}static error(t,...e){ConsoleLogsUtility.buildLog("ERROR",t,e)}}class RoutingUtility{static _name="RoutingUtility";route=e(f);router=e(y);location=e(v);constructor(){}getNavParams(t){return this.route.snapshot.queryParams[t]||""}getPathParams(t){return this.route.snapshot.params[t]||""}currentNavPass(t){return-1!=this.router.url.indexOf(t)}navigate(t,e){const r=new URL(`${window.location.origin}${t}`);if(e){const t=new URLSearchParams(e);r.search=t.toString()}this.router.navigateByUrl(r.pathname.concat(r.search||"").replace(ConfigConst.SiteBaseUrl,"")).then(()=>{}).catch(t=>{})}navigateWithStateObj(t,e,r){const n={state:e,queryParams:r};this.router.navigate([t.replace(ConfigConst.SiteBaseUrl,"")],n).then(()=>{}).catch(t=>{ConsoleLogsUtility.error(RoutingUtility._name,t)})}getStateParams(){return this.location.getState()}getBaseRouter(){return this.router}getBaseActivatedRoute(){return this.route}getBaseLocation(){return this.location}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:RoutingUtility,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:RoutingUtility,providedIn:"root"})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:RoutingUtility,decorators:[{type:r,args:[{providedIn:"root"}]}],ctorParameters:()=>[]});class HttpRequestHandler{static className="HttpRequestHandler";baseUrl="";http=e(R);constructor(t){try{if(!t)throw new Error("Missing configuration of HttpRequestHandlerconfig");this.baseUrl=t.baseApiUrl}catch(t){ConsoleLogsUtility.error(HttpRequestHandler.name,t)}}get(t,e){const r=`${this.baseUrl}/${t}`;return ConsoleLogsUtility.debug(this,`GET request to ${r}`,e),this.wrapper(()=>this.http.get(r,{params:e}))}post(t,e,r){const n=`${this.baseUrl}/${t}`;return ConsoleLogsUtility.debug(this,`POST request to ${n}`,e),this.wrapper(()=>this.http.post(n,e,{headers:r}))}put(t,e,r){const n=`${this.baseUrl}/${t}`;return ConsoleLogsUtility.debug(this,`PUT request to ${n}`,e),this.wrapper(()=>this.http.put(n,e,{headers:r}))}delete(t){const e=`${this.baseUrl}/${t}`;return ConsoleLogsUtility.debug(this,`DELETE request to ${e}`),this.wrapper(()=>this.http.delete(e))}wrapper(t){let e,r=t();return{send:t=>(e=r.subscribe({...t,error:r=>{try{t.error&&t.error(r)}finally{e&&e.unsubscribe()}},complete:()=>{try{t.complete&&t.complete()}finally{e&&e.unsubscribe()}}}),e),obs:()=>r}}}class TranslateUtility{translations={};translationSubjects={};loading={};requestHandler=new HttpRequestHandler({baseApiUrl:ConfigConst.SiteAssetsUrl});constructor(){}getTranslation$(t,e,r=ConfigConst.TranslationUrl.DefaultLanguage){const n=[];if(0===e.length)return C(t);for(const o of e){const e=`${o}|${r}|${t}`;let a;this.translationSubjects[e]||(this.translationSubjects[e]=new S(this.translations[o]?.[r]?.[t]||t)),a=this.translations[o]?.[r]?C(null):this.loadTranslations(o,r);const s=a.pipe(z(()=>this.translationSubjects[e].value));n.push(s)}return E(n).pipe(z(e=>e.find(e=>e!==t)||t))}loadTranslations(t,e){this.loading[t]||(this.loading[t]={}),this.loading[t][e]||(this.loading[t][e]=new S(!1));const r=this.loading[t][e];return this.translations[t]?.[e]&&!r.value?C(null):r.value?r.asObservable().pipe(D(t=>!t),M(),z(()=>null)):(r.next(!0),this.requestHandler.get(`i18n${t}/${e}.json`).obs().pipe(A(r=>{this.translations[t]=this.translations[t]||{},this.translations[t][e]=r,Object.entries(r).forEach(([r,n])=>{if("string"==typeof n){const o=`${t}|${e}|${r}`,a=this.translationSubjects[o];a?a.next(n):this.translationSubjects[o]=new S(n)}})}),z(()=>(r.next(!1),null))))}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:TranslateUtility,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:TranslateUtility,providedIn:"root"})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:TranslateUtility,decorators:[{type:r,args:[{providedIn:"root"}]}],ctorParameters:()=>[]});class CachePathUtility{paths=[];_routingUtility=e(RoutingUtility);constructor(t){this.paths=t}config(t){return this.paths.find(e=>-1!==t.indexOf(e.pathValue))}exist(t){const e=this.paths.find(e=>-1!==t.indexOf(e.pathValue));if(e){if(e?.resctrictRoute==ConfigConst.Route.NONE)return!0;if(this._routingUtility.currentNavPass(e?.resctrictRoute||ConfigConst.Route.NONE))return!0}return!1}relationCleanOnConfig(t){return this.paths.find(e=>!!e.clearOn.find(e=>-1!==t.indexOf(e)))}existRelationCleanOn(t){return!!this.paths.find(e=>!!e.clearOn.find(e=>-1!==t.indexOf(e)))}getPaths(){return this.paths}}class CookieUtils{static add(t,e,r){let n="";if(r){const t=new Date;t.setTime(t.getTime()+24*r*60*60*1e3),n="; expires="+t.toUTCString()}document.cookie=t+"="+(e||"")+n+"; path=/"}static read(t){const e=t+"=",r=document.cookie.split(";");for(let t=0;t<r.length;t++){let n=r[t];for(;" "===n.charAt(0);)n=n.substring(1,n.length);if(0===n.indexOf(e))return n.substring(e.length,n.length)}return""}static delete(t){document.cookie=t+"=; Max-Age=-99999999;"}}class ObjectUtils{static isEmpty(t){return null==t||"object"==typeof t&&0===Object.keys(t).length}static isNotEmpty(t){return!ObjectUtils.isEmpty(t)}static isObject(t){return null!==t&&"object"==typeof t&&!Array.isArray(t)}static cloneDeep(t){if(null===t||"object"!=typeof t)return t;if(Array.isArray(t))return t.map(t=>this.cloneDeep(t));const e={};for(const r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=this.cloneDeep(t[r]));return e}}class RandomUtils{static makeid(t){let e="";for(let r=0;r<t;r++)e+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".charAt(Math.floor(62*Math.random()));return e}}let Q=class StringUtils{static isEmpty(t){return null==t||""===t}static isNotEmpty(t){return!StringUtils.isEmpty(t)}static isString(t){return"string"==typeof t}};class CacheUtility{static className="CacheUtility";cache_name=P.MD5(StateConst.Cookie.CACHE).toString();globalStateName="default";cacheApp=new Map;cachePathUtility;constructor(){this.globalStateName=ConfigCache.globalStateName,this.cachePathUtility=new CachePathUtility(ConfigCache.Paths);let t=sessionStorage.getItem(this.cache_name);t&&Object.entries(JSON.parse(t)).forEach(([t,e])=>this.cacheApp.set(t,e));let e=localStorage.getItem(this.cache_name);e&&Object.entries(JSON.parse(e)).forEach(([t,e])=>this.cacheApp.set(t,e)),this.cleanUp()}cleanUp(){const t=new Map;for(const e of Array.from(this.cacheApp.keys()))if(!this.cachePathUtility.config(e)||-1===e.indexOf(`(${this.globalStateName})`)){const r=this.cacheApp.get(e);void 0!==r&&t.set(e,r),this.cacheApp.delete(e)}try{const e=sessionStorage.getItem(this.cache_name);if(e){const r=new Map(Object.entries(JSON.parse(e)));let n=!1;for(const e of Array.from(r.keys())){const o=this.cachePathUtility.config(e);o&&o.persistenceType===J.SESSION&&-1!==e.indexOf(`(${this.globalStateName})`)||(t.set(e,r.get(e)),r.delete(e),n=!0)}n&&(0===r.size?sessionStorage.removeItem(this.cache_name):sessionStorage.setItem(this.cache_name,JSON.stringify(Object.fromEntries(r))))}}catch(t){ConsoleLogsUtility.error(this,"Failed to clean up obsolete items from session storage:",t),sessionStorage.removeItem(this.cache_name)}try{const e=localStorage.getItem(this.cache_name);if(e){const r=new Map(Object.entries(JSON.parse(e)));let n=!1;for(const e of Array.from(r.keys())){const o=this.cachePathUtility.config(e);o&&o.persistenceType===J.LOCAL&&-1!==e.indexOf(`(${this.globalStateName})`)||(t.set(e,r.get(e)),r.delete(e),n=!0)}n&&(0===r.size?localStorage.removeItem(this.cache_name):localStorage.setItem(this.cache_name,JSON.stringify(Object.fromEntries(r))))}}catch(t){ConsoleLogsUtility.error(this,"Failed to clean up obsolete items from local storage:",t),localStorage.removeItem(this.cache_name)}return t}isValidResponse(t,e){const r=e&&!(Array.isArray(e)&&0===e.length);return r||this.cacheApp.delete(t),r}pass(t,e){return this.isValidResponse(t.url,e)&&this.cachePathUtility.exist(t.url)}get(t){let e=`(${this.globalStateName})${t.url}`,r=this.cachePathUtility.config(e);if(r&&r.reqPayloadCache&&t.body){let r=btoa(JSON.stringify(t.body));e=e.concat(`#[${r}]`)}if(this.cachePathUtility.existRelationCleanOn(e)){let t=[],r=this.cachePathUtility.relationCleanOnConfig(e);r&&this.cacheApp.forEach((e,n)=>{-1!=n.indexOf(r.pathValue)&&t.push(n)}),t.forEach(t=>{switch(this.cacheApp.delete(t),r?.persistenceType){case J.SESSION:case J.LOCAL:{let e=r.persistenceType===J.LOCAL?localStorage:sessionStorage,n=e.getItem(this.cache_name),o=n?new Map(Object.entries(JSON.parse(n))):new Map;o.delete(t),e.setItem(this.cache_name,JSON.stringify(Object.fromEntries(o)));break}}})}let n=this.cacheApp.get(e);if(r?.encriptType&&r.encriptType!=K.NONE&&"string"==typeof n&&(n=this.decrypt(r,n)),n instanceof Object)return new V({body:ObjectUtils.cloneDeep(n.body),status:n.status,statusText:n.statusText,url:n.url||"",headers:new B({...n.headers})})}set(t,e){let r=`(${this.globalStateName})${t.url}`,n=e,o=this.cachePathUtility.config(r);if(o?.reqPayloadCache&&t.body){let e=btoa(JSON.stringify(t.body));r=r.concat(`#[${e}]`)}switch(o?.encriptType&&o.encriptType!=K.NONE&&(n=this.encrypt(o,e)),o?.persistenceType){case J.SESSION:case J.LOCAL:try{let t=o.persistenceType===J.LOCAL?localStorage:sessionStorage,e=t.getItem(this.cache_name),a=e?new Map(Object.entries(JSON.parse(e))):new Map;a.set(r,n),t.setItem(this.cache_name,JSON.stringify(Object.fromEntries(a)))}catch(t){ConsoleLogsUtility.error(this,"Failed to persist map cache to storage:",t)}}this.cacheApp.set(r,n)}getCacheKey(t){let e="";switch(t.encriptType){case K.AUTO:{const t=P.MD5(StateConst.Cookie.CACHE_KEY).toString();if(Q.isEmpty(CookieUtils.read(t))){const e=RandomUtils.makeid(StateConst.CMPLX12)+(new Date).getTime(),r=RandomUtils.makeid(StateConst.CMPLX6)+(new Date).getTime(),n=P.AES.encrypt(e,r).toString()+"."+r;CookieUtils.add(t,n,StateConst.Cookie.CACHE_KEY_EXPIRE)}const r=CookieUtils.read(t).split(".");e=P.AES.decrypt(r[0],r[1]).toString(P.enc.Utf8);break}case K.CUSTOM:t.callBackCacheKey&&(e=t.callBackCacheKey())}return e}encrypt(t,e){let r="";return t.encriptType===K.AUTO&&(r=P.AES.encrypt(JSON.stringify(e),this.getCacheKey(t)).toString()),r||e}decrypt(t,e){let r=null;return t.encriptType===K.AUTO&&(r=JSON.parse(P.AES.decrypt(e,this.getCacheKey(t)).toString(P.enc.Utf8))),r||e}getCacheApp(){return this.cacheApp}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:CacheUtility,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:CacheUtility,providedIn:"root"})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:CacheUtility,decorators:[{type:r,args:[{providedIn:"root"}]}],ctorParameters:()=>[]});let X=class CollectionUtils{static isEmpty(t){return null==t||0===t.length}static isNotEmpty(t){return!CollectionUtils.isEmpty(t)}static getFirst(t){if(!CollectionUtils.isEmpty(t))return t[0]}static getLast(t){if(!CollectionUtils.isEmpty(t))return t[t.length-1]}static concat(...t){const e=[];return t.forEach(t=>{CollectionUtils.isNotEmpty(t)&&e.push(...t)}),e}static filter(t,e){return CollectionUtils.isEmpty(t)?[]:t.filter(e)}static map(t,e){return CollectionUtils.isEmpty(t)?[]:t.map(e)}static reduce(t,e,r){return CollectionUtils.isEmpty(t)?r:t.reduce(e,r)}static forEach(t,e){CollectionUtils.isNotEmpty(t)&&t.forEach(e)}static contains(t,e){return!CollectionUtils.isEmpty(t)&&t.includes(e)}static exists(t,e){return!CollectionUtils.isEmpty(t)&&t.some(e)}static removeIf(t,e){if(CollectionUtils.isEmpty(t))return;const r=t.findIndex(e);return-1!==r?t.splice(r,1)[0]:void 0}static shallowCopy(t){return CollectionUtils.isEmpty(t)?[]:[...t]}};class StringUtils{static isEmpty(t){return null==t||0===t.length}static isBlank(t){return null==t||0===t.trim().length}static isNotEmpty(t){return!StringUtils.isEmpty(t)}static isNotBlank(t){return!StringUtils.isBlank(t)}static defaultString(t){return t??""}static defaultIfEmpty(t,e){return StringUtils.isEmpty(t)?e:t}static defaultIfBlank(t,e){return StringUtils.isBlank(t)?e:t}static trim(t){return StringUtils.defaultString(t).trim()}static capitalize(t){if(StringUtils.isBlank(t))return"";const e=t;return e.charAt(0).toUpperCase()+e.slice(1)}static uncapitalize(t){if(StringUtils.isBlank(t))return"";const e=t;return e.charAt(0).toLowerCase()+e.slice(1)}static equals(t,e){return t===e||null!=t&&null!=e&&t===e}static equalsIgnoreCase(t,e){return t===e||null!=t&&null!=e&&t.toLowerCase()===e.toLowerCase()}static contains(t,e){return!StringUtils.isEmpty(t)&&!StringUtils.isEmpty(e)&&t.includes(e)}static startsWith(t,e){return!StringUtils.isEmpty(t)&&!StringUtils.isEmpty(e)&&t.startsWith(e)}static endsWith(t,e){return!StringUtils.isEmpty(t)&&!StringUtils.isEmpty(e)&&t.endsWith(e)}static join(t,e=""){return X.isEmpty(t)?"":t.filter(t=>null!=t).join(e)}static repeat(t,e){return StringUtils.isEmpty(t)||e<1?"":t.repeat(e)}static countOccurrences(t,e){if(StringUtils.isEmpty(t)||StringUtils.isEmpty(e))return 0;const r=t,n=e;if(0===n.length)return r.length+1;let o=0,a=r.indexOf(n);for(;-1!==a;)o++,a=r.indexOf(n,a+n.length);return o}}class AuthUtility{requestHandler=new HttpRequestHandler({baseApiUrl:ConfigConst.BaseApi});constructor(){}getAuthorization(t){return this.requestHandler.get("auth/flow/"+t)}checkAuthAction(t,e){this.getAuthorization(t).send({next:t=>{StringUtils.equals(t.authorized,q.Ok)?e.authorize(t):e.unAuthorize&&e.unAuthorize(t)},error:t=>{e.unAuthorize&&e.unAuthorize(t)}})}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:AuthUtility,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:AuthUtility,providedIn:"root"})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:AuthUtility,decorators:[{type:r,args:[{providedIn:"root"}]}],ctorParameters:()=>[]});class BaseAtom{static className="BaseAtom";route=e(f);currentAtom;I18nPath;constructor(){const t=this.route.snapshot.data,e=t.Atoms?.find(t=>t.Atom.className===this.constructor.className);this.currentAtom=e,this.I18nPath=e.I18nPath}baseCompViewEnter(){}baseCompViewLeave(){}baseAtomViewWillEnter(){}baseAtomViewWillLeave(){}getClassName(){return this.constructor.className}ngOnInit(){this.baseAtomViewWillEnter()}ngOnDestroy(){this.baseAtomViewWillLeave()}ionViewWillEnter(){this.baseAtomViewWillEnter()}ionViewWillLeave(){this.baseAtomViewWillLeave()}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:BaseAtom,deps:[],target:t.ɵɵFactoryTarget.Directive});static ɵdir=t.ɵɵngDeclareDirective({minVersion:"14.0.0",version:"20.3.18",type:BaseAtom,isStandalone:!0,ngImport:t})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:BaseAtom,decorators:[{type:n}],ctorParameters:()=>[]});class BaseMolecule{static className="BaseMolecule";route=e(f);currentMolecule;I18nPath;constructor(){const t=this.route.snapshot.data,e=t.Molecules?.find(t=>t.Molecule.className===this.constructor.className);this.currentMolecule=e,this.I18nPath=e.I18nPath}baseCompViewEnter(){}baseCompViewLeave(){}baseMoleculeViewWillEnter(){}baseMoleculeViewWillLeave(){}getClassName(){return this.constructor.className}ngOnInit(){this.baseMoleculeViewWillEnter()}ngOnDestroy(){this.baseMoleculeViewWillLeave()}ionViewWillEnter(){this.baseMoleculeViewWillEnter()}ionViewWillLeave(){this.baseMoleculeViewWillLeave()}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:BaseMolecule,deps:[],target:t.ɵɵFactoryTarget.Directive});static ɵdir=t.ɵɵngDeclareDirective({minVersion:"14.0.0",version:"20.3.18",type:BaseMolecule,isStandalone:!0,ngImport:t})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:BaseMolecule,decorators:[{type:n}],ctorParameters:()=>[]});class BaseOrganism{static className="BaseOrganism";route=e(f);currentOrganism;I18nPath;constructor(){const t=this.route.snapshot.data,e=t.Organisms?.find(t=>t.Organism.className===this.constructor.className);this.currentOrganism=e,this.I18nPath=e.I18nPath}baseCompViewEnter(){}baseCompViewLeave(){}baseOrganismViewWillEnter(){}baseOrganismViewWillLeave(){}getClassName(){return this.constructor.className}ngOnInit(){this.baseOrganismViewWillEnter()}ngOnDestroy(){this.baseOrganismViewWillLeave()}ionViewWillEnter(){this.baseOrganismViewWillEnter()}ionViewWillLeave(){this.baseOrganismViewWillLeave()}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:BaseOrganism,deps:[],target:t.ɵɵFactoryTarget.Directive});static ɵdir=t.ɵɵngDeclareDirective({minVersion:"14.0.0",version:"20.3.18",type:BaseOrganism,isStandalone:!0,ngImport:t})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:BaseOrganism,decorators:[{type:n}],ctorParameters:()=>[]});class BaseComponent{static className="BaseComponent";ChildrenRef;route=e(f);I18nPath;constructor(){const t=this.route.snapshot.data;this.I18nPath=t.Components?.find(t=>t.Component.className===this.constructor.className)?.I18nPath||t.I18nPath}ngOnInit(){this.baseCompViewEnter()}ngOnDestroy(){this.baseCompViewLeave()}ionViewWillEnter(){this.baseCompViewEnter()}ionViewWillLeave(){this.baseCompViewLeave()}baseCompViewEnter(){this.ChildrenRef&&this.ChildrenRef.length>0&&this.ChildrenRef.forEach(t=>t.baseCompViewEnter())}baseCompViewLeave(){this.ChildrenRef&&this.ChildrenRef.length>0&&this.ChildrenRef.forEach(t=>t.baseCompViewLeave())}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:BaseComponent,deps:[],target:t.ɵɵFactoryTarget.Directive});static ɵdir=t.ɵɵngDeclareDirective({minVersion:"14.0.0",version:"20.3.18",type:BaseComponent,isStandalone:!0,viewQueries:[{propertyName:"ChildrenRef",predicate:["ChildRef"],descendants:!0}],ngImport:t})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:BaseComponent,decorators:[{type:n}],ctorParameters:()=>[],propDecorators:{ChildrenRef:[{type:o,args:["ChildRef"]}]}});class CollectionUtils{static isEmpty(t){return!t||Array.isArray(t)&&0===t.length}static isNotEmpty(t){return!CollectionUtils.isEmpty(t)}}class StateService{static className="StateService";initialized=!1;containerRoot=[];conf;intervalId;intervalTime=1e3;registryMap=new Map;initialize(t){if(this.initialized)ConsoleLogsUtility.warning(this,"State service already initialized");else{ConsoleLogsUtility.info(this,"Initializing state service with config:",t),this.conf=t||{globalStateName:"default",encryptionType:StateConst.EncryptType.AES,nameType:StateConst.Generate.AUTO,keyType:StateConst.Generate.AUTO,asyncEnabled:!0};const e=sessionStorage.getItem(this.getStateName()),r=localStorage.getItem(this.getStateName());Q.isNotEmpty(e)&&(this.containerRoot.push(...JSON.parse(e)),ConsoleLogsUtility.debug(this,"Loaded session data from storage")),Q.isNotEmpty(r)&&(this.containerRoot.push(...JSON.parse(r)),ConsoleLogsUtility.debug(this,"Loaded persistent data from storage")),this.cleanUp(),this.conf.asyncEnabled&&(this.intervalId=setInterval(()=>{this.updateDataSetToStorage(!1,!1)},this.intervalTime)),this.initialized=!0,ConsoleLogsUtility.info(this,"State service initialized successfully")}}cleanUp(){this.updateDataSetToStorage(!0,!0)}updateDataSetToStorage(t=!1,e=!1){if(t&&CollectionUtils.isNotEmpty(this.containerRoot)){const t=this.containerRoot.length;this.containerRoot=this.containerRoot.filter(t=>t.globalStateName===this.conf.globalStateName),t!==this.containerRoot.length&&ConsoleLogsUtility.error(this,"ASOR State Management: Mismatched global state name clean-up")}const r=this.containerRoot.filter(t=>t.storeType===StateConst.StoreType.SESSION),n=this.containerRoot.filter(t=>t.storeType===StateConst.StoreType.LOCAL);CollectionUtils.isNotEmpty(r)?sessionStorage.setItem(this.getStateName(),JSON.stringify(r)):e&&sessionStorage.removeItem(this.getStateName()),CollectionUtils.isNotEmpty(n)?localStorage.setItem(this.getStateName(),JSON.stringify(n)):e&&localStorage.removeItem(this.getStateName())}async delegateCheckStoreDataSet(){this.conf.asyncEnabled||this.updateDataSetToStorage(!1,!1)}createDataSet(t,e,r){if(!e)return ConsoleLogsUtility.warning(this,`Cannot create dataset "${t}": data is empty`),!1;if(CollectionUtils.isNotEmpty(this.containerRoot)&&Q.isNotEmpty(t)){const e=this.containerRoot.find(e=>e.name===t);if(ObjectUtils.isNotEmpty(e))return ConsoleLogsUtility.warning(this,`Dataset "${t}" already exists. Load current data from storage`),!1}let n=e;r.encrypt&&(n=this.encrypt(e),ConsoleLogsUtility.debug(this,`Dataset "${t}" will be encrypted`));const o={name:t,globalStateName:this.conf.globalStateName,encrypt:!!r.encrypt,storeType:r.storeType||StateConst.StoreType.SESSION,freeze:!!r.freeze,data:n,lastUpdate:(new Date).getTime(),readCount:0,writeCount:0};return r.freeze&&ConsoleLogsUtility.warning(this,`Dataset "${t}" frozen`),this.containerRoot.push(o),this.delegateCheckStoreDataSet(),ConsoleLogsUtility.info(this,`Dataset "${t}" created successfully`,{storeType:o.storeType,encrypted:o.encrypt}),!0}readDataSet(t){let e=t.split("."),r=null;if(CollectionUtils.isNotEmpty(this.containerRoot))try{if(Array.isArray(e)){const n=this.containerRoot.find(t=>t.name===e[0]);if(ObjectUtils.isNotEmpty(n)){r=n.encrypt?this.decrypt(n.data):n.data;for(let t=1;t<e.length;t++)r=r[e[t]];n.readCount++}else ConsoleLogsUtility.warning(this,`Dataset "${e[0]}" not found for path: ${t}`)}}catch(e){ConsoleLogsUtility.error(this,`Error reading dataset at path: ${t}`,e)}return r}updateDataSet(t,e,r){let n=t.split("."),o=!1;try{if(Array.isArray(n)&&CollectionUtils.isNotEmpty(this.containerRoot)&&Q.isNotEmpty(n[0])){const a=this.containerRoot.find(t=>t.name===n[0]);if(ObjectUtils.isNotEmpty(a)){if(a.freeze)return ConsoleLogsUtility.warning(this,`Cannot update frozen dataset at path: ${t}`),!1;let s=a.encrypt?this.decrypt(a.data):a.data;if(s){let i=s,l=!1;for(let t=1;t<n.length-1;t++)i=i[n[t]];if(ObjectUtils.isNotEmpty(r))switch(r.method){case StateConst.Data.REPLACE:i[n[n.length-1]]=e,l=!0,ConsoleLogsUtility.debug(this,`Replace method used for path: ${t}`);break;case StateConst.Data.MERGE:if(ObjectUtils.isObject(i[n[n.length-1]])&&ObjectUtils.isObject(e)){const r={...i[n[n.length-1]],...e};i[n[n.length-1]]=r,l=!0,ConsoleLogsUtility.debug(this,`Merge method used for path: ${t}`)}}l||(i[n[n.length-1]]=e),a.data=a.encrypt?this.encrypt(s):s,o=!0,a.writeCount++,this.delegateCheckStoreDataSet(),this.triggerChange(t)}}else ConsoleLogsUtility.warning(this,`Dataset "${n[0]}" not found for update at path: ${t}`)}}catch(e){ConsoleLogsUtility.error(this,`Error updating dataset at path: ${t}`,e)}return o}triggerChange(t){if(!t)return;let e=t;for(;e;){let r=!1;const n=new Set;if(this.registryMap.forEach((o,a)=>{const s=a.match(/\[([^\]]+)\]<([^>]+)>;(.+)/);if(s){const[,a,i,l]=s;if(-1!==l.indexOf(e)&&(r=!0,!n.has(a))){n.add(a);const e={[t.split(".")[0]]:{[i]:this.readDataSet(l)}};o.propsIsUpdated(e)}}}),r)break;const o=e.lastIndexOf(".");if(-1===o)break;e=e.substring(0,o)}}deleteRootDataSet(t){if(Q.isString(t)&&Q.isNotEmpty(t)&&CollectionUtils.isNotEmpty(this.containerRoot)){const e=this.containerRoot.find(e=>e.name===t);if(e){const r=this.containerRoot.indexOf(e);this.containerRoot.splice(r,1),this.updateDataSetToStorage(!1,!0),ConsoleLogsUtility.info(this,`Dataset "${t}" deleted successfully`)}else ConsoleLogsUtility.warning(this,`Dataset "${t}" not found for deletion`)}}getStateName(){let t="";switch(this.conf.nameType){case StateConst.Generate.AUTO:t=P.MD5(StateConst.Cookie.STATE).toString();break;case StateConst.Generate.CUSTOM:this.conf.callBackStateName&&(t=this.conf.callBackStateName())}return t}getStateKey(){let t="";switch(this.conf.keyType){case StateConst.Generate.AUTO:{const e=P.MD5(StateConst.Cookie.STATE_KEY).toString();if(Q.isEmpty(CookieUtils.read(e))){const t=RandomUtils.makeid(StateConst.CMPLX12)+(new Date).getTime(),r=RandomUtils.makeid(StateConst.CMPLX6)+(new Date).getTime(),n=P.AES.encrypt(t,r).toString()+"."+r;CookieUtils.add(e,n,StateConst.Cookie.STATE_KEY_EXPIRE)}const r=CookieUtils.read(e).split(".");t=P.AES.decrypt(r[0],r[1]).toString(P.enc.Utf8);break}case StateConst.Generate.CUSTOM:this.conf.callBackStateKey&&(t=this.conf.callBackStateKey())}return t}encrypt(t){let e="";return this.conf.encryptionType===StateConst.EncryptType.AES&&(e=P.AES.encrypt(JSON.stringify(t),this.getStateKey()).toString()),e}decrypt(t){let e=null;return this.conf.encryptionType===StateConst.EncryptType.AES&&(e=JSON.parse(P.AES.decrypt(t,this.getStateKey()).toString(P.enc.Utf8))),e}registry(t,e,r){ConsoleLogsUtility.debug(this,`Registering component "${t}" with props:`,e);const n={};return Object.entries(e).forEach(([e,o])=>{let a=`[${t}]<${e}>;${o}`,s=1;for(;this.registryMap.has(a);)a=`[${t}(${s++})]<${e}>;${o}`;this.registryMap.set(a,{propsIsUpdated:r}),n[a]=()=>this.registryMap.delete(a)}),{componentName:t,destroy:()=>{ConsoleLogsUtility.debug(this,`Destroying mapped keys for component "${t}"`),Object.entries(n).forEach(([t,e])=>{e&&e()})}}}resolveProps(t){const e={};Object.entries(t).forEach(([t,r])=>{const n=r.split(".")[0];e[n]||(e[n]=[]),e[n].push({key:t,path:r})});const r={};return Object.entries(e).forEach(([t,e])=>{r[t]={},e.forEach(({key:e,path:n})=>{r[t][e]=this.readDataSet(n)})}),ObjectUtils.cloneDeep(r)}ngOnDestroy(){this.intervalId&&clearInterval(this.intervalId)}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:StateService,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:StateService,providedIn:"root"})}function BaseHandlerMixin(t){return class StorageHandlerMixinClass extends t{propsStore={};stateService=e(StateService);activatedRoute=e(f);registryElement;constructor(...t){super(...t);const e=this.activatedRoute.snapshot.data;e?.CreateDataSet&&this.stateService.createDataSet(e.CreateDataSet.name,e.CreateDataSet.data||{},e.CreateDataSet.option||{});const r=e.Components?.find(t=>t.Component.className===this.constructor.className)?.ConnectDataSet||e.Molecules?.find(t=>t.Molecule.className===this.constructor.className)?.ConnectDataSet||e.Atoms?.find(t=>t.Atom.className===this.constructor.className)?.ConnectDataSet||e.Organisms?.find(t=>t.Organism.className===this.constructor.className)?.ConnectDataSet||e.ConnectDataSet;if(r){const t=r?.selectors||{};this.registryElement=this.stateService.registry(this.getClassName(),t,t=>{const e=this.copyPropsStore(t),deepMerge=(t,e)=>{for(const r in e)e.hasOwnProperty(r)&&(e[r]&&"object"==typeof e[r]&&!Array.isArray(e[r])?(t[r]&&"object"==typeof t[r]||(t[r]={}),deepMerge(t[r],e[r])):t[r]=e[r])};deepMerge(this.propsStore,e),this.storageHandlerDataChanges&&this.storageHandlerDataChanges({},{})}),this.propsStore=createReactiveProxy(this.stateService.resolveProps(t),(t,e,r)=>{this.onPropsStoreChange(t,e,r)})}}onPropsStoreChange(t,e,r){ConsoleLogsUtility.debug(this,`Property changed: ${t}`,{from:r,to:e}),this.stateService.updateDataSet(t,e)||ConsoleLogsUtility.warning(this,`Failed to update state for path: ${t}`)}getClassName(){return this.constructor.className}copyPropsStore(t){return JSON.parse(JSON.stringify(t))}}}function deepEqual(t,e){if(t===e)return!0;if(null==t||null==e)return!1;if(typeof t!=typeof e)return!1;if("object"!=typeof t)return!1;const r=Array.isArray(t);if(r!==Array.isArray(e))return!1;if(r){if(t.length!==e.length)return!1;for(let r=0;r<t.length;r++)if(!deepEqual(t[r],e[r]))return!1;return!0}const n=Object.keys(t),o=Object.keys(e);if(n.length!==o.length)return!1;for(const r of n){if(!e.hasOwnProperty(r))return!1;if(!deepEqual(t[r],e[r]))return!1}return!0}function createReactiveProxy(t,e,r=""){const n=new Map,o=["push","pop","shift","unshift","splice","sort","reverse","fill","copyWithin"];return new Proxy(t,{get(t,a){const s=t[a];if("symbol"==typeof a)return s;const i=String(a),l=r?`${r}.${i}`:i;if(Array.isArray(t)&&"function"==typeof s&&o.includes(i))return(...o)=>{const a=t.map(t=>t&&"object"==typeof t?{...t}:t),s=Array.prototype[i].apply(t,o);n.clear();const l=[...t];return deepEqual(a,l)||e(r,l,a),s};if(null===s||"object"!=typeof s)return s;const c=n.get(i);if(c&&c.rawValue===s)return c.proxy;const d=createReactiveProxy(s,e,l);return n.set(i,{rawValue:s,proxy:d}),d},set(t,o,a){const s=String(o),i=r?`${r}.${s}`:s,l=t[o];return deepEqual(l,a)||(n.delete(s),t[o]=a,e(i,a,l)),!0},deleteProperty(t,o){if(o in t){const a=String(o),s=r?`${r}.${a}`:a,i=t[o];n.delete(a),delete t[o],e(s,void 0,i)}return!0}})}function createFlattenedReactiveProxy(t){return new Proxy({},{get(e,r){if("symbol"==typeof r)return;const n=String(r);for(const e of Object.keys(t)){const r=t[e];if(r&&"object"==typeof r&&n in r)return r[n]}},set(e,r,n){if("symbol"==typeof r)return!1;const o=String(r);for(const e of Object.keys(t)){const r=t[e];if(r&&"object"==typeof r&&o in r)return r[o]=n,!0}return!1},has(e,r){if("symbol"==typeof r)return!1;const n=String(r);for(const e of Object.keys(t)){const r=t[e];if(r&&"object"==typeof r&&n in r)return!0}return!1},ownKeys(){const e=[];for(const r of Object.keys(t)){const n=t[r];n&&"object"==typeof n&&e.push(...Object.keys(n))}return e},getOwnPropertyDescriptor(e,r){if("symbol"==typeof r)return;const n=String(r);for(const e of Object.keys(t)){const r=t[e];if(r&&"object"==typeof r&&n in r)return{configurable:!0,enumerable:!0,writable:!0,value:r[n]}}},deleteProperty(e,r){if("symbol"==typeof r)return!1;const n=String(r);for(const e of Object.keys(t)){const r=t[e];if(r&&"object"==typeof r&&n in r)return delete r[n],!0}return!1}})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:StateService,decorators:[{type:r,args:[{providedIn:"root"}]}]});class BaseStorageAtom extends(BaseHandlerMixin(BaseAtom)){get props(){return createFlattenedReactiveProxy(this.propsStore)}baseCompViewLeave(){this.registryElement?.destroy()}baseAtomViewWillLeave(){this.registryElement?.destroy()}constructor(){super()}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:BaseStorageAtom,deps:[],target:t.ɵɵFactoryTarget.Directive});static ɵdir=t.ɵɵngDeclareDirective({minVersion:"14.0.0",version:"20.3.18",type:BaseStorageAtom,isStandalone:!0,usesInheritance:!0,ngImport:t})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:BaseStorageAtom,decorators:[{type:n}],ctorParameters:()=>[]});class BaseStorageMolecule extends(BaseHandlerMixin(BaseMolecule)){get props(){return createFlattenedReactiveProxy(this.propsStore)}baseCompViewLeave(){this.registryElement?.destroy()}baseMoleculeViewWillLeave(){this.registryElement?.destroy()}constructor(){super()}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:BaseStorageMolecule,deps:[],target:t.ɵɵFactoryTarget.Directive});static ɵdir=t.ɵɵngDeclareDirective({minVersion:"14.0.0",version:"20.3.18",type:BaseStorageMolecule,isStandalone:!0,usesInheritance:!0,ngImport:t})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:BaseStorageMolecule,decorators:[{type:n}],ctorParameters:()=>[]});class BaseStorageOrganism extends(BaseHandlerMixin(BaseOrganism)){get props(){return createFlattenedReactiveProxy(this.propsStore)}baseCompViewLeave(){this.registryElement?.destroy()}baseOrganismViewWillLeave(){this.registryElement?.destroy()}constructor(){super()}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:BaseStorageOrganism,deps:[],target:t.ɵɵFactoryTarget.Directive});static ɵdir=t.ɵɵngDeclareDirective({minVersion:"14.0.0",version:"20.3.18",type:BaseStorageOrganism,isStandalone:!0,usesInheritance:!0,ngImport:t})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:BaseStorageOrganism,decorators:[{type:n}],ctorParameters:()=>[]});class BaseStorageComponent extends(BaseHandlerMixin(BaseComponent)){get props(){return createFlattenedReactiveProxy(this.propsStore)}baseCompViewLeave(){this.registryElement?.destroy(),super.baseCompViewLeave()}constructor(){super()}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:BaseStorageComponent,deps:[],target:t.ɵɵFactoryTarget.Directive});static ɵdir=t.ɵɵngDeclareDirective({minVersion:"14.0.0",version:"20.3.18",type:BaseStorageComponent,isStandalone:!0,usesInheritance:!0,ngImport:t})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:BaseStorageComponent,decorators:[{type:n}],ctorParameters:()=>[]});class NotifyErrorService{static className="NotifyErrorService";dataSubject=new S(null);dataSub=this.dataSubject.asObservable();sub=new Map;send(t){ConsoleLogsUtility.debug(this,`Broadcasting error: ${t.status}`,t),this.dataSubject.next(t)}registry(t,e){ConsoleLogsUtility.debug(this,`Registering subscriber: ${t}`);const r=this.sub.get(t);r&&r.unsubscribe();const n=this.dataSub.subscribe(t=>{t&&e(t.status,t.error)});this.sub.set(t,n)}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:NotifyErrorService,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:NotifyErrorService,providedIn:"root"})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:NotifyErrorService,decorators:[{type:r,args:[{providedIn:"root"}]}]});class MockOrchestratorService{get requestMappings(){return MockOrchestratorMapService.staticRequestMappings}intercept(t,e){for(const[r,n]of this.requestMappings)if(StringUtils.equals(t.url,r.path)&&t.method==r.method){const o=n.value.apply(r.controller,[t,e]);return o&&StringUtils.equals(o.name,"HttpErrorResponse")?I(()=>o):o instanceof Promise?j(o):o instanceof O?o:C(o)}return e.handle(t)}registryController(t,e){for(const[r]of this.requestMappings)-1!=t.indexOf(r.className)&&(r.controller=e)}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:MockOrchestratorService,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:MockOrchestratorService,providedIn:"root"})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:MockOrchestratorService,decorators:[{type:r,args:[{providedIn:"root"}]}]});class AuthGuard{static className="AuthGuard";routingUtility=e(RoutingUtility);authUtility=e(AuthUtility);injector=e(a);canActivate(t,r){const n=t.data;return n.ChildGuard?this.executeAuthCheck(n).pipe(L(o=>o?s(this.injector,()=>{const o=e(n.ChildGuard);return this.normalizeGuardResult(o.canActivate(t,r))}):C(!1))):this.executeAuthCheck(n)}executeAuthCheck(t){return ConsoleLogsUtility.info(this,"AuthGuard checking route",t),t.AuthCheck?this.authUtility.getAuthorization(t.AuthCheck).obs().pipe(z(e=>(ConsoleLogsUtility.debug(this,`Auth result for ${t.AuthCheck}`,e),!!StringUtils.equals(e.authorized,q.Ok)||(StringUtils.equals(e.authorized,q.NotAllow)?(ConsoleLogsUtility.info(this,"Redirecting to UNAUTHORIZED due to NotAllow status"),this.routingUtility.navigate(ConfigConst.Url.UNAUTHORIZED,{}),!1):(ConsoleLogsUtility.info(this,"Redirecting to LOGIN due to missing/expired auth"),this.routingUtility.navigate(ConfigConst.Url.LOGIN,{}),!1))))):C(!0)}normalizeGuardResult(t){return"object"==typeof t&&"redirectTo"in t||t instanceof x?C(t):t instanceof Promise?j(t):T(t)?t:C(t)}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:AuthGuard,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:AuthGuard,providedIn:"root"})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:AuthGuard,decorators:[{type:r,args:[{providedIn:"root"}]}]});class ErrorInterceptor{static className="ErrorInterceptor";notifyErrorService=e(NotifyErrorService);intercept(t,e){return e.handle(t).pipe(U(e=>(ConsoleLogsUtility.error(this,`HTTP Error ${e.status} at ${t.urlWithParams}: ${e.message}`,e),this.notifyErrorService.send(e),I(e))))}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:ErrorInterceptor,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:ErrorInterceptor})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:ErrorInterceptor,decorators:[{type:r}]});class CacheInterceptor{static className="CacheInterceptor";cacheUtility=e(CacheUtility);intercept(t,e){const r=this.cacheUtility.get(t);return r?(ConsoleLogsUtility.info(this,`Serving from cache: ${t.urlWithParams}`),C(r)):e.handle(t).pipe(N(e=>{e instanceof V&&this.cacheUtility.pass(t,e)&&(ConsoleLogsUtility.debug(this,`Caching response for ${t.urlWithParams}`),this.cacheUtility.set(t,e))}))}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:CacheInterceptor,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:CacheInterceptor})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:CacheInterceptor,decorators:[{type:r}]});class MockHttpInterceptor{orchestratorService=e(MockOrchestratorService);intercept(t,e){return this.orchestratorService.intercept(t,e)}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:MockHttpInterceptor,deps:[],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:MockHttpInterceptor})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:MockHttpInterceptor,decorators:[{type:r}]});class TranslatePipe{translateUtility=e(TranslateUtility);changeDetectorRef=e(i);lastKey="";translatedValue="";subscription=null;context;constructor(){}transform(t,e=ConfigConst.TranslationUrl.DefaultLanguage){return t!==this.lastKey&&(this.lastKey=t,this.subscription?.unsubscribe(),this.context=this.changeDetectorRef.context,this.subscription=this.translateUtility.getTranslation$(t,this.context?.I18nPath,e).subscribe(t=>{this.translatedValue=t,this.changeDetectorRef.markForCheck()})),this.decodeHtmlEntities(this.translatedValue)||t}decodeHtmlEntities(t){const e=document.createElement("textarea");e.innerHTML=t;const r=e.value;return e.remove(),r}ngOnDestroy(){this.subscription?.unsubscribe()}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:TranslatePipe,deps:[],target:t.ɵɵFactoryTarget.Pipe});static ɵpipe=t.ɵɵngDeclarePipe({minVersion:"14.0.0",version:"20.3.18",ngImport:t,type:TranslatePipe,isStandalone:!0,name:"translate",pure:!1})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:TranslatePipe,decorators:[{type:l,args:[{name:"translate",standalone:!0,pure:!1}]}],ctorParameters:()=>[]});class JsonViewComponent{data;key=null;level=0;expandDepth=0;expanded=!1;ngOnInit(){this.level<this.expandDepth&&(this.expanded=!0)}togglebox(){this.expanded=!this.expanded}isObject(t){return null!==t&&"object"==typeof t}isArray(t){return Array.isArray(t)}isString(t){return"string"==typeof t}getKeys(t){return t?Object.keys(t):[]}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:JsonViewComponent,deps:[],target:t.ɵɵFactoryTarget.Component});static ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"20.3.18",type:JsonViewComponent,isStandalone:!0,selector:"asor-json-view",inputs:{data:"data",key:"key",level:"level",expandDepth:"expandDepth"},ngImport:t,template:'<div class="json-node" [style.padding-left.px]="level * 10">\r\n\t\x3c!-- Primitive Value or Null --\x3e\r\n\t<ng-container *ngIf="!isObject(data)">\r\n\t\t<span class="json-key" *ngIf="key">{{ key }}: </span>\r\n\t\t<span\r\n\t\t\tclass="json-value"\r\n\t\t\t[ngClass]="{\r\n\t\t\t\tnull: data === null,\r\n\t\t\t\tstring: isString(data),\r\n\t\t\t\tother: !isString(data) && data !== null,\r\n\t\t\t}"\r\n\t\t>\r\n\t\t\t{{ data | json }}\r\n\t\t</span>\r\n\t</ng-container>\r\n\r\n\t\x3c!-- Object or Array --\x3e\r\n\t<ng-container *ngIf="isObject(data)">\r\n\t\t<div class="json-expandable" (click)="togglebox()">\r\n\t\t\t<span class="toggle-icon">{{ expanded ? \'▼\' : \'▶\' }}</span>\r\n\t\t\t<span class="json-key" *ngIf="key">{{ key }}: </span>\r\n\t\t\t<span class="json-preview" *ngIf="!isArray(data)"> Object </span>\r\n\t\t\t<span class="json-preview" *ngIf="isArray(data)"> Array({{ data.length }}) </span>\r\n\t\t</div>\r\n\r\n\t\t<div class="json-children" *ngIf="expanded">\r\n\t\t\t<ng-container *ngIf="!isArray(data)">\r\n\t\t\t\t<div class="json-property" *ngFor="let k of getKeys(data)">\r\n\t\t\t\t\t<asor-json-view\r\n\t\t\t\t\t\t[data]="data[k]"\r\n\t\t\t\t\t\t[key]="k"\r\n\t\t\t\t\t\t[level]="level + 1"\r\n\t\t\t\t\t\t[expandDepth]="expandDepth"\r\n\t\t\t\t\t></asor-json-view>\r\n\t\t\t\t</div>\r\n\t\t\t</ng-container>\r\n\t\t\t<ng-container *ngIf="isArray(data)">\r\n\t\t\t\t<div class="json-property" *ngFor="let item of data; let i = index">\r\n\t\t\t\t\t<asor-json-view\r\n\t\t\t\t\t\t[data]="item"\r\n\t\t\t\t\t\t[key]="\'\' + i"\r\n\t\t\t\t\t\t[level]="level + 1"\r\n\t\t\t\t\t\t[expandDepth]="expandDepth"\r\n\t\t\t\t\t></asor-json-view>\r\n\t\t\t\t</div>\r\n\t\t\t</ng-container>\r\n\t\t</div>\r\n\t</ng-container>\r\n</div>\r\n',styles:[".json-node{font-family:Consolas,Monaco,Courier New,monospace;font-size:13px;line-height:1.5;color:#d4d4d4}.json-key{color:#9cdcfe}.json-value.string{color:#ce9178}.json-value.null{color:#569cd6}.json-value.other{color:#b5cea8}.json-expandable{cursor:pointer;display:flex;align-items:center}.json-expandable:hover{background-color:#ffffff0d}.toggle-icon{font-size:10px;margin-right:5px;color:#858585;width:12px;text-align:center}.json-preview{color:#858585;font-style:italic}\n"],dependencies:[{kind:"component",type:JsonViewComponent,selector:"asor-json-view",inputs:["data","key","level","expandDepth"]},{kind:"ngmodule",type:w},{kind:"directive",type:m.NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:m.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:m.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"pipe",type:m.JsonPipe,name:"json"}],encapsulation:t.ViewEncapsulation.None})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:JsonViewComponent,decorators:[{type:p,args:[{selector:"asor-json-view",standalone:!0,imports:[w,JsonViewComponent],encapsulation:d.None,template:'<div class="json-node" [style.padding-left.px]="level * 10">\r\n\t\x3c!-- Primitive Value or Null --\x3e\r\n\t<ng-container *ngIf="!isObject(data)">\r\n\t\t<span class="json-key" *ngIf="key">{{ key }}: </span>\r\n\t\t<span\r\n\t\t\tclass="json-value"\r\n\t\t\t[ngClass]="{\r\n\t\t\t\tnull: data === null,\r\n\t\t\t\tstring: isString(data),\r\n\t\t\t\tother: !isString(data) && data !== null,\r\n\t\t\t}"\r\n\t\t>\r\n\t\t\t{{ data | json }}\r\n\t\t</span>\r\n\t</ng-container>\r\n\r\n\t\x3c!-- Object or Array --\x3e\r\n\t<ng-container *ngIf="isObject(data)">\r\n\t\t<div class="json-expandable" (click)="togglebox()">\r\n\t\t\t<span class="toggle-icon">{{ expanded ? \'▼\' : \'▶\' }}</span>\r\n\t\t\t<span class="json-key" *ngIf="key">{{ key }}: </span>\r\n\t\t\t<span class="json-preview" *ngIf="!isArray(data)"> Object </span>\r\n\t\t\t<span class="json-preview" *ngIf="isArray(data)"> Array({{ data.length }}) </span>\r\n\t\t</div>\r\n\r\n\t\t<div class="json-children" *ngIf="expanded">\r\n\t\t\t<ng-container *ngIf="!isArray(data)">\r\n\t\t\t\t<div class="json-property" *ngFor="let k of getKeys(data)">\r\n\t\t\t\t\t<asor-json-view\r\n\t\t\t\t\t\t[data]="data[k]"\r\n\t\t\t\t\t\t[key]="k"\r\n\t\t\t\t\t\t[level]="level + 1"\r\n\t\t\t\t\t\t[expandDepth]="expandDepth"\r\n\t\t\t\t\t></asor-json-view>\r\n\t\t\t\t</div>\r\n\t\t\t</ng-container>\r\n\t\t\t<ng-container *ngIf="isArray(data)">\r\n\t\t\t\t<div class="json-property" *ngFor="let item of data; let i = index">\r\n\t\t\t\t\t<asor-json-view\r\n\t\t\t\t\t\t[data]="item"\r\n\t\t\t\t\t\t[key]="\'\' + i"\r\n\t\t\t\t\t\t[level]="level + 1"\r\n\t\t\t\t\t\t[expandDepth]="expandDepth"\r\n\t\t\t\t\t></asor-json-view>\r\n\t\t\t\t</div>\r\n\t\t\t</ng-container>\r\n\t\t</div>\r\n\t</ng-container>\r\n</div>\r\n',styles:[".json-node{font-family:Consolas,Monaco,Courier New,monospace;font-size:13px;line-height:1.5;color:#d4d4d4}.json-key{color:#9cdcfe}.json-value.string{color:#ce9178}.json-value.null{color:#569cd6}.json-value.other{color:#b5cea8}.json-expandable{cursor:pointer;display:flex;align-items:center}.json-expandable:hover{background-color:#ffffff0d}.toggle-icon{font-size:10px;margin-right:5px;color:#858585;width:12px;text-align:center}.json-preview{color:#858585;font-style:italic}\n"]}]}],propDecorators:{data:[{type:c}],key:[{type:c}],level:[{type:c}],expandDepth:[{type:c}]}});class ConsoleTabComponent{cdr;static className="ConsoleTabComponent";logsContainer;shouldScrollToBottom=!0;availableLevels=["ALL","INFO","DEBUG","WARNING","ERROR"];logs=[];logSub;inspectedObject=null;inspectedObjectMethods=[];inspectedLog=null;constructor(t){this.cdr=t}newClassName="";newClassLevels={};openDropdownClass=null;dropdownTop=0;dropdownLeft=0;selectedConfig=null;mobileExpandedSection=null;searchTerm="";selectedLevels=new Set;get filteredLogs(){let t=this.logs;if(this.selectedLevels.size>0&&(t=t.filter(t=>this.selectedLevels.has(t.level))),!this.searchTerm.trim())return t;const e=this.searchTerm.toLowerCase();return t.filter(t=>t.message.toLowerCase().includes(e)||t.className.toLowerCase().includes(e)||t.level.toLowerCase().includes(e)||t.params&&JSON.stringify(t.params).toLowerCase().includes(e))}get logCounts(){const t={};return this.availableLevels.forEach(e=>{"ALL"!==e&&(t[e]=0)}),this.logs.forEach(e=>{void 0!==t[e.level]?t[e.level]++:t[e.level]=(t[e.level]||0)+1}),t}getClassLogCount(t){return this.logs.filter(e=>e.className===t).length}filterByLevel(t){this.selectedLevels.has(t)?this.selectedLevels.delete(t):this.selectedLevels.add(t)}ngOnInit(){this.logSub=ConsoleLogsUtility.logStream$.subscribe(t=>{this.logs.push(t),this.logs.length>500&&this.logs.shift(),this.shouldScrollToBottom&&(this.cdr.detectChanges(),this.scrollToBottom())}),this.mobileExpandedSection="logs"}ngAfterViewInit(){this.shouldScrollToBottom&&this.scrollToBottom()}scrollToBottom(){try{this.logsContainer&&this.logsContainer.nativeElement&&(this.logsContainer.nativeElement.scrollTop=this.logsContainer.nativeElement.scrollHeight)}catch(t){}}onLogScroll(){const t=this.logsContainer.nativeElement;this.shouldScrollToBottom=t.scrollHeight-t.scrollTop<=t.clientHeight+20}ngOnDestroy(){this.logSub&&this.logSub.unsubscribe()}toggleSection(t){this.mobileExpandedSection=this.mobileExpandedSection===t?null:t}get classConfigs(){return ConsoleLogsConfig.classConfigs}get defaultLevels(){return ConsoleLogsConfig.defaultLevels}toggleSlider(){}clearLogs(){this.logs=[]}inspectObject(t,e){this.inspectedObject=t,this.inspectedLog=e||null,this.inspectedObjectMethods=this.getPrototypeMethods(t)}closeInspector(){this.inspectedObject=null,this.inspectedObjectMethods=[],this.inspectedLog=null,this.replResult=null,this.replError=null,this.hasReplResult=!1}executionCode="";replResult=null;replError=null;hasReplResult=!1;appendToRepl(t){const e=`state.${t}()`;this.executionCode.trim()?this.executionCode+="\n"+e:this.executionCode=e}executeSnippet(){if(this.inspectedObject&&this.executionCode.trim()){this.replResult=null,this.replError=null,this.hasReplResult=!1;try{const t=this.safeEvaluate(this.executionCode,this.inspectedObject);this.replResult=t,this.hasReplResult=!0,ConsoleLogsUtility.info(this,"REPL Execution",{code:this.executionCode,result:t})}catch(t){this.replError=t.message||t,ConsoleLogsUtility.error(this,"REPL Error",t)}}}safeEvaluate(t,e){const r=t.split("\n").filter(t=>t.trim());let n;for(const t of r){let r=e,o=t.trim().replace(/^state\.?/,"").replace(/;$/,"");if(!o){n=r;continue}const a=o.split(".");for(const t of a){if(null==r)break;if(t.endsWith("()")){const e=t.slice(0,-2);if("function"!=typeof r[e])throw new Error(`'${e}' is not a function`);r=r[e]()}else r=r[t]}n=r}return n}isObject(t){return null!==t&&"object"==typeof t}getPrototypeMethods(t){if(null===t||"object"!=typeof t)return[];const e=[];let r=t;for(;r&&r!==Object.prototype;)Object.getOwnPropertyNames(r).forEach(t=>{Object.getOwnPropertyDescriptor(r,t),"function"!=typeof r[t]||"constructor"===t||t.startsWith("_")||e.includes(t)||e.push(t)}),r=Object.getPrototypeOf(r);return e.sort()}isLevelEnabled(t,e){return t.levels.includes(e)}updateClassLevel(t,e,r){const n=r.target.checked,o=this.classConfigs.find(e=>e.className===t);if(!o)return;let a=[...o.levels];n?a.includes(e)||a.push(e):a=a.filter(t=>t!==e),ConsoleLogsConfig.setClassLevels(t,a)}removeClass(t){ConsoleLogsConfig.removeClassConfig(t)}toggleDropdown(t,e){e.stopPropagation();const r=t.className;if(this.openDropdownClass===r)return this.openDropdownClass=null,void(this.selectedConfig=null);this.openDropdownClass=r,this.selectedConfig=t;const n=e.currentTarget.getBoundingClientRect();this.dropdownTop=n.bottom+5,this.dropdownLeft=n.left}closeDropdown(){this.openDropdownClass=null,this.selectedConfig=null}getSelectedLevelsLabel(t){return t.levels.length===this.availableLevels.length?"ALL":0===t.levels.length?"None":t.levels.sort((t,e)=>this.availableLevels.indexOf(t)-this.availableLevels.indexOf(e)).join(", ")}toggleNewClassDropdown(t){if(t.stopPropagation(),"__NEW__"===this.openDropdownClass)return void this.closeDropdown();this.openDropdownClass="__NEW__",this.selectedConfig=null;const e=t.currentTarget.getBoundingClientRect();this.dropdownTop=e.bottom+5,this.dropdownLeft=e.left}updateNewClassLevel(t,e){this.newClassLevels[t]=e.target.checked}getNewClassLevelsLabel(){const t=this.availableLevels.filter(t=>this.newClassLevels[t]);return t.length===this.availableLevels.length?"ALL":0===t.length?"None":t.join(", ")}addNewClass(){if(!this.newClassName.trim())return;const t=[];this.availableLevels.forEach(e=>{this.newClassLevels[e]&&t.push(e)}),ConsoleLogsConfig.setClassLevels(this.newClassName.trim(),t),this.newClassName="",this.newClassLevels={}}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:ConsoleTabComponent,deps:[{token:t.ChangeDetectorRef}],target:t.ɵɵFactoryTarget.Component});static ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"20.3.18",type:ConsoleTabComponent,isStandalone:!0,selector:"asor-console-tab",viewQueries:[{propertyName:"logsContainer",first:!0,predicate:["logsContainer"],descendants:!0}],ngImport:t,template:'<div class="console-tab-container">\r\n\t\x3c!-- Transparent backdrop to close dropdowns --\x3e\r\n\t<div class="dropdown-backdrop" *ngIf="openDropdownClass" (click)="closeDropdown()"></div>\r\n\r\n\t\x3c!-- Root Dropdown Menu --\x3e\r\n\t<div\r\n\t\tclass="dropdown-menu fixed-dropdown"\r\n\t\t*ngIf="openDropdownClass && (selectedConfig || openDropdownClass === \'__NEW__\')"\r\n\t\t[style.top.px]="dropdownTop"\r\n\t\t[style.left.px]="dropdownLeft"\r\n\t\t(click)="$event.stopPropagation()"\r\n\t>\r\n\t\t\x3c!-- Existing Class Mode --\x3e\r\n\t\t<ng-container *ngIf="selectedConfig">\r\n\t\t\t<label class="level-check-item" *ngFor="let level of availableLevels">\r\n\t\t\t\t<input\r\n\t\t\t\t\t[checked]="isLevelEnabled(selectedConfig, level)"\r\n\t\t\t\t\t(change)="updateClassLevel(selectedConfig.className, level, $event)"\r\n\t\t\t\t\ttype="checkbox"\r\n\t\t\t\t/>\r\n\t\t\t\t{{ level }}\r\n\t\t\t</label>\r\n\t\t</ng-container>\r\n\r\n\t\t\x3c!-- New Class Mode --\x3e\r\n\t\t<ng-container *ngIf="openDropdownClass === \'__NEW__\'">\r\n\t\t\t<label class="level-check-item" *ngFor="let level of availableLevels">\r\n\t\t\t\t<input\r\n\t\t\t\t\t[checked]="newClassLevels[level]"\r\n\t\t\t\t\t(change)="updateNewClassLevel(level, $event)"\r\n\t\t\t\t\ttype="checkbox"\r\n\t\t\t\t/>\r\n\t\t\t\t{{ level }}\r\n\t\t\t</label>\r\n\t\t</ng-container>\r\n\t</div>\r\n\r\n\t<div class="console-grid">\r\n\t\t\x3c!-- LEFT TILE: Configuration --\x3e\r\n\t\t<div\r\n\t\t\tclass="tile config-tile"\r\n\t\t\t[class.expanded]="mobileExpandedSection === \'config\'"\r\n\t\t\t[class.collapsed]="mobileExpandedSection === \'logs\'"\r\n\t\t>\r\n\t\t\t<div class="tile-header">\r\n\t\t\t\t<div class="header-title-group">\r\n\t\t\t\t\t<button\r\n\t\t\t\t\t\tclass="icon-btn expand-btn"\r\n\t\t\t\t\t\t(click)="toggleSection(\'config\')"\r\n\t\t\t\t\t\ttitle="{{ mobileExpandedSection === \'config\' ? \'Collapse\' : \'Expand\' }}"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ mobileExpandedSection === \'config\' ? \'▼\' : \'►\' }}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<h4>Configuration</h4>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<div class="console-summary" *ngIf="mobileExpandedSection !== \'config\'">\r\n\t\t\t\tDefaults levels logs: {{ defaultLevels.join(\', \') || \'NONE/OFF\' }}\r\n\t\t\t</div>\r\n\r\n\t\t\t<div class="table-container">\r\n\t\t\t\t<table class="config-table">\r\n\t\t\t\t\t<thead>\r\n\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t<th>Class</th>\r\n\t\t\t\t\t\t\t<th>Levels</th>\r\n\t\t\t\t\t\t\t<th class="actions-col"></th>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</thead>\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t<tr *ngFor="let config of classConfigs">\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t{{ config.className }}\r\n\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\tclass="class-count"\r\n\t\t\t\t\t\t\t\t\t*ngIf="getClassLogCount(config.className) > 0"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t({{ getClassLogCount(config.className) }})\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<div class="multiselect-container">\r\n\t\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\t\tclass="dropdown-trigger"\r\n\t\t\t\t\t\t\t\t\t\t(click)="toggleDropdown(config, $event)"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<span class="selected-label">{{\r\n\t\t\t\t\t\t\t\t\t\t\tgetSelectedLevelsLabel(config)\r\n\t\t\t\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t\t\t\t<span class="arrow">▼</span>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td class="actions-col">\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tclass="icon-btn delete"\r\n\t\t\t\t\t\t\t\t\t(click)="removeClass(config.className)"\r\n\t\t\t\t\t\t\t\t\ttitle="Remove"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t✕\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t\t<tfoot>\r\n\t\t\t\t\t\t<tr class="add-row">\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\tclass="input-text-small"\r\n\t\t\t\t\t\t\t\t\t[(ngModel)]="newClassName"\r\n\t\t\t\t\t\t\t\t\ttype="text"\r\n\t\t\t\t\t\t\t\t\tplaceholder="New Class..."\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<div class="multiselect-container">\r\n\t\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\t\tclass="dropdown-trigger"\r\n\t\t\t\t\t\t\t\t\t\t(click)="toggleNewClassDropdown($event)"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<span class="selected-label">{{\r\n\t\t\t\t\t\t\t\t\t\t\tgetNewClassLevelsLabel() || \'Select Levels\'\r\n\t\t\t\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t\t\t\t<span class="arrow">▼</span>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td class="actions-col">\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tclass="icon-btn add"\r\n\t\t\t\t\t\t\t\t\t[disabled]="!newClassName"\r\n\t\t\t\t\t\t\t\t\t(click)="addNewClass()"\r\n\t\t\t\t\t\t\t\t\ttitle="Add"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t+\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</tfoot>\r\n\t\t\t\t</table>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t\x3c!-- RIGHT TILE: Logs --\x3e\r\n\t\t<div\r\n\t\t\tclass="tile logs-tile"\r\n\t\t\t[class.expanded]="mobileExpandedSection === \'logs\'"\r\n\t\t\t[class.collapsed]="mobileExpandedSection === \'config\'"\r\n\t\t>\r\n\t\t\t<div class="tile-header">\r\n\t\t\t\t<div class="header-title-group">\r\n\t\t\t\t\t<button\r\n\t\t\t\t\t\tclass="icon-btn expand-btn"\r\n\t\t\t\t\t\t(click)="toggleSection(\'logs\')"\r\n\t\t\t\t\t\ttitle="{{ mobileExpandedSection === \'logs\' ? \'Collapse\' : \'Expand\' }}"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ mobileExpandedSection === \'logs\' ? \'▼\' : \'►\' }}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<h4>Logs Stream</h4>\r\n\t\t\t\t\t<div class="log-counts">\r\n\t\t\t\t\t\t<ng-container *ngFor="let level of availableLevels">\r\n\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\tclass="count-badge"\r\n\t\t\t\t\t\t\t\t*ngIf="level !== \'ALL\' && logCounts[level]"\r\n\t\t\t\t\t\t\t\t[ngClass]="[\r\n\t\t\t\t\t\t\t\t\tlevel.toLowerCase(),\r\n\t\t\t\t\t\t\t\t\tselectedLevels.has(level) ? \'selected\' : \'\',\r\n\t\t\t\t\t\t\t\t]"\r\n\t\t\t\t\t\t\t\t[title]="\r\n\t\t\t\t\t\t\t\t\tselectedLevels.has(level)\r\n\t\t\t\t\t\t\t\t\t\t? \'Clear filter\'\r\n\t\t\t\t\t\t\t\t\t\t: \'Add filter for \' + level\r\n\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t(click)="filterByLevel(level)"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{{ level }}: <b>{{ logCounts[level] }}</b>\r\n\t\t\t\t\t\t\t\t<span class="clear-filter-icon" *ngIf="selectedLevels.has(level)"\r\n\t\t\t\t\t\t\t\t\t>✕</span\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="header-actions">\r\n\t\t\t\t\t<input\r\n\t\t\t\t\t\tclass="search-input"\r\n\t\t\t\t\t\t[(ngModel)]="searchTerm"\r\n\t\t\t\t\t\ttype="text"\r\n\t\t\t\t\t\tplaceholder="Search logs..."\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<button class="icon-btn clear" (click)="clearLogs()" title="Clear Logs">\r\n\t\t\t\t\t\t✕ Clear\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<div class="logs-container" #logsContainer (scroll)="onLogScroll()">\r\n\t\t\t\t<div\r\n\t\t\t\t\tclass="log-entry"\r\n\t\t\t\t\t*ngFor="let log of filteredLogs"\r\n\t\t\t\t\t[ngClass]="log.level.toLowerCase()"\r\n\t\t\t\t>\r\n\t\t\t\t\t<span class="log-badge">{{ log.level }}</span>\r\n\t\t\t\t\t<span class="log-time">{{ log.timestamp.split(\' \')[1] }}</span>\r\n\t\t\t\t\t<span\r\n\t\t\t\t\t\tclass="log-class"\r\n\t\t\t\t\t\t[class.clickable]="log.source"\r\n\t\t\t\t\t\t[title]="log.source ? \'Inspect \' + log.className : \'\'"\r\n\t\t\t\t\t\t(click)="log.source ? inspectObject(log.source, log) : null"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t[{{ log.className }}]\r\n\t\t\t\t\t</span>\r\n\t\t\t\t\t<span class="log-msg">{{ log.message }}</span>\r\n\r\n\t\t\t\t\t<div class="log-params" *ngIf="log.params.length">\r\n\t\t\t\t\t\t<ng-container *ngFor="let param of log.params">\r\n\t\t\t\t\t\t\t<span class="param-primitive" *ngIf="!isObject(param)">{{\r\n\t\t\t\t\t\t\t\tparam\r\n\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tclass="btn-inspect"\r\n\t\t\t\t\t\t\t\t*ngIf="isObject(param)"\r\n\t\t\t\t\t\t\t\t(click)="inspectObject(param)"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t🔍 Object\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="empty-logs" *ngIf="logs.length === 0">Waiting for logs...</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t\x3c!-- Inspector Modal/Overlay --\x3e\r\n\t<div class="inspector-overlay" *ngIf="inspectedObject" (click)="closeInspector()">\r\n\t\t<div class="inspector-panel" (click)="$event.stopPropagation()">\r\n\t\t\t<div class="inspector-header">\r\n\t\t\t\t<div class="header-content">\r\n\t\t\t\t\t<h4>Object Inspector</h4>\r\n\t\t\t\t\t<div class="inspector-meta" *ngIf="inspectedLog">\r\n\t\t\t\t\t\t<span class="meta-badge" [ngClass]="inspectedLog.level.toLowerCase()">{{\r\n\t\t\t\t\t\t\tinspectedLog.level\r\n\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t<span class="meta-class">[{{ inspectedLog.className }}]</span>\r\n\t\t\t\t\t\t<span class="meta-time">{{ inspectedLog.timestamp.split(\' \')[1] }}</span>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<button class="close-btn" (click)="closeInspector()">✕</button>\r\n\t\t\t</div>\r\n\t\t\t<div class="inspector-content">\r\n\t\t\t\t<div class="inspector-split">\r\n\t\t\t\t\t<div class="inspector-section" *ngIf="inspectedObject">\r\n\t\t\t\t\t\t<h5>State</h5>\r\n\t\t\t\t\t\t<asor-json-view [data]="inspectedObject" [expandDepth]="1"></asor-json-view>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class="inspector-section" *ngIf="inspectedObjectMethods.length > 0">\r\n\t\t\t\t\t\t<h5>Methods</h5>\r\n\t\t\t\t\t\t<div class="methods-list">\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tclass="method-btn"\r\n\t\t\t\t\t\t\t\t*ngFor="let method of inspectedObjectMethods"\r\n\t\t\t\t\t\t\t\t(click)="appendToRepl(method)"\r\n\t\t\t\t\t\t\t\ttitle="Add to REPL"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{{ method }}()\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class="inspector-section" *ngIf="inspectedObject">\r\n\t\t\t\t\t\t<h5>Console REPL</h5>\r\n\t\t\t\t\t\t<div class="repl-container">\r\n\t\t\t\t\t\t\t<textarea\r\n\t\t\t\t\t\t\t\t[(ngModel)]="executionCode"\r\n\t\t\t\t\t\t\t\t(keydown.control.enter)="executeSnippet()"\r\n\t\t\t\t\t\t\t\tplaceholder="Execute code (e.g. state.createDataSet(...))"\r\n\t\t\t\t\t\t\t></textarea>\r\n\t\t\t\t\t\t\t<button class="repl-btn" (click)="executeSnippet()">Execute</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class="inspector-section" *ngIf="hasReplResult">\r\n\t\t\t\t\t\t<h5>Result</h5>\r\n\t\t\t\t\t\t<asor-json-view [data]="replResult" [expandDepth]="1"></asor-json-view>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class="inspector-section error-section" *ngIf="replError">\r\n\t\t\t\t\t\t<h5>Error</h5>\r\n\t\t\t\t\t\t<div class="error-msg">{{ replError }}</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n',styles:[".console-tab-container{height:100%;display:flex;flex-direction:column}.console-grid{display:grid;grid-template-columns:400px 1fr;gap:16px;height:100%}.tile{background-color:#252526;border-radius:6px;border:1px solid #333;display:flex;flex-direction:column;overflow:hidden;height:100%}.tile-header{padding:10px 12px;border-bottom:1px solid #333;display:flex;justify-content:space-between;align-items:center;background-color:#2d2d2d}.tile-header h4{margin:0;font-size:12px;text-transform:uppercase;color:#999;font-weight:600;letter-spacing:.5px}.tile-header .header-actions,.header-title-group{display:flex;align-items:center;gap:8px}.header-title-group .log-counts{display:flex;gap:6px;margin-left:8px}.header-title-group .log-counts .count-badge{font-size:10px;padding:2px 6px;border-radius:10px;font-weight:600;color:#fff;background-color:#555;cursor:pointer;-webkit-user-select:none;user-select:none;transition:opacity .2s}.header-title-group .log-counts .count-badge:hover{opacity:.8}.header-title-group .log-counts .count-badge.info{background-color:#0dcaf033;color:#0dcaf0;border:1px solid rgba(13,202,240,.3)}.header-title-group .log-counts .count-badge.debug{background-color:#a855f733;color:#a855f7;border:1px solid rgba(168,85,247,.3)}.header-title-group .log-counts .count-badge.warning{background-color:#f59e0b33;color:#f59e0b;border:1px solid rgba(245,158,11,.3)}.header-title-group .log-counts .count-badge.selected{opacity:1;border:1px solid #fff;box-shadow:0 0 4px #ffffff80}.header-title-group .log-counts .count-badge.selected.info{background-color:#0dcaf0;color:#000}.header-title-group .log-counts .count-badge.selected.debug{background-color:#a855f7;color:#fff}.header-title-group .log-counts .count-badge.selected.warning{background-color:#f59e0b;color:#000}.header-title-group .log-counts .count-badge.selected.error{background-color:#ef4444;color:#fff}.header-title-group .log-counts .count-badge .clear-filter-icon{margin-left:4px;font-size:8px;font-weight:700}.table-container,.logs-container{flex:1;overflow-y:auto}.table-container::-webkit-scrollbar,.logs-container::-webkit-scrollbar{width:10px;height:10px}.table-container::-webkit-scrollbar-track,.logs-container::-webkit-scrollbar-track{background:#1e1e1e}.table-container::-webkit-scrollbar-thumb,.logs-container::-webkit-scrollbar-thumb{background:#424242;border-radius:5px;border:2px solid #1e1e1e}.table-container::-webkit-scrollbar-thumb:hover,.logs-container::-webkit-scrollbar-thumb:hover{background:#4f4f4f}.config-table{width:100%;border-collapse:collapse;font-size:12px}.config-table th,.config-table td{border-bottom:1px solid #333;padding:8px 12px;text-align:left;vertical-align:middle;color:#ccc}.config-table th{background-color:#2d2d2d;font-weight:600;color:#999;text-transform:uppercase;font-size:11px;position:sticky;top:0;z-index:10}.config-table tfoot{background-color:#2d2d2d;position:sticky;bottom:0;z-index:10}.config-table tfoot td{border-top:1px solid #333}.config-table tr:hover td{background-color:#2a2d2e}.config-table .class-count{color:#888;font-size:11px;margin-left:4px}.input-text-small{background-color:#3c3c3c;border:1px solid #3c3c3c;color:#fff;padding:4px 8px;border-radius:3px;width:100%;font-size:12px}.input-text-small:focus{outline:none;border-color:#007acc;background-color:#444}.input-text-small::placeholder{color:#888}.multiselect-container{position:relative}.dropdown-trigger{cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:4px 8px;background-color:#3c3c3c;border:1px solid #454545;border-radius:4px;min-width:120px;color:#fff;font-size:11px}.dropdown-trigger:hover{background-color:#444;border-color:#007acc}.dropdown-trigger .selected-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:150px}.dropdown-trigger .arrow{font-size:8px;color:#999}.level-checks{display:flex;gap:10px;flex-wrap:wrap}.level-check{display:flex;align-items:center;gap:4px;cursor:pointer;font-size:11px;color:#bbb;-webkit-user-select:none;user-select:none}.level-check:hover{color:#fff}.level-check input{accent-color:#007acc}.icon-btn{background:none;border:none;cursor:pointer;padding:4px;border-radius:4px;transition:all .2s;display:flex;align-items:center;justify-content:center}.icon-btn.delete{color:#f48771}.icon-btn.delete:hover{background-color:#f487711a}.icon-btn.add{color:#89d185;font-size:16px}.icon-btn.add:hover:not(:disabled){background-color:#89d1851a}.icon-btn.add:disabled{color:#555;cursor:not-allowed}.icon-btn.clear{font-size:11px;color:#bbb;border:1px solid #3e3e42;padding:2px 8px}.icon-btn.clear:hover{background-color:#3e3e42;color:#fff}.icon-btn.expand-btn{display:none}@media (max-width: 768px){.icon-btn.expand-btn{display:flex;font-size:10px;color:#999;border:1px solid #3e3e42;width:20px;height:20px;padding:0}.icon-btn.expand-btn:hover{background-color:#3e3e42;color:#fff}}.search-input{background-color:#3c3c3c;border:1px solid #3e3e42;color:#fff;padding:3px 8px;border-radius:4px;font-size:11px;width:150px;transition:all .2s}.search-input:focus{outline:none;border-color:#007acc;background-color:#444;width:180px}.search-input::placeholder{color:#888}.logs-container{background-color:#1e1e1e;color:#d4d4d4;font-family:Consolas,Monaco,Courier New,monospace;font-size:12px;padding:8px 12px}.log-entry{padding:6px 0;border-bottom:1px solid #2d2d2d;display:flex;flex-wrap:wrap;align-items:flex-start;gap:8px;line-height:1.4}.log-entry:last-child{border-bottom:none}.log-entry.info .log-badge{background-color:#0dcaf0;color:#000;border-radius:3px;font-weight:700}.log-entry.info .log-msg,.log-entry.info .log-class{color:#0dcaf0}.log-entry.debug .log-badge{background-color:#a855f7;color:#fff;border-radius:3px;font-weight:700}.log-entry.debug .log-msg,.log-entry.debug .log-class{color:#a855f7}.log-entry.warning .log-badge{background-color:#f59e0b;color:#000;border-radius:3px;font-weight:700}.log-entry.warning .log-msg,.log-entry.warning .log-class{color:#f59e0b}.log-entry.error .log-badge{background-color:#ef4444;color:#fff;border-radius:3px;font-weight:700}.log-entry.error .log-msg,.log-entry.error .log-class{color:#ef4444;font-weight:700}.log-time{color:#6a9955;font-size:11px;min-width:60px}.log-badge{font-weight:700;width:60px;font-size:11px;text-align:center}.log-class{color:#569cd6}.log-class.clickable{cursor:pointer;text-decoration:underline}.log-class.clickable:hover{opacity:.8;color:#9cdcfe}.log-msg{color:#ccc;word-break:break-all}.log-params{display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin-left:8px}.param-primitive{color:#9cdcfe;background:#2a2d2e;padding:0 4px;border-radius:3px}.btn-inspect{background-color:#2d2d2d;border:1px solid #3e3e42;color:#4fc1ff;padding:2px 8px;border-radius:12px;cursor:pointer;font-size:11px;font-family:inherit;transition:all .2s;display:inline-flex;align-items:center;gap:4px}.btn-inspect:hover{background-color:#3e3e42;border-color:#4fc1ff;color:#fff}.empty-logs{color:#666;text-align:center;padding:40px;font-style:italic}.inspector-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#0009;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:10000;display:flex;justify-content:center;align-items:center;padding:40px}.inspector-panel{background-color:#252526;border-radius:8px;width:100%;max-width:700px;height:100%;max-height:600px;display:flex;flex-direction:column;box-shadow:0 20px 50px #000000b3;border:1px solid #454545;animation:zoomIn .25s cubic-bezier(.16,1,.3,1)}@keyframes zoomIn{0%{transform:scale(.95);opacity:0}to{transform:scale(1);opacity:1}}.inspector-header{padding:12px 16px;background-color:#2d2d2d;border-bottom:1px solid #333;border-top-left-radius:8px;border-top-right-radius:8px;display:flex;justify-content:space-between;align-items:center}.inspector-header .header-content{display:flex;flex-direction:column;gap:2px}.inspector-header h4{margin:0;color:#eee;font-size:14px;font-weight:600}.inspector-header .inspector-meta{display:flex;gap:8px;align-items:center;font-size:11px;color:#888;font-family:monospace}.inspector-header .inspector-meta .meta-badge{padding:2px 6px;border-radius:3px;font-weight:700;font-size:10px}.inspector-header .inspector-meta .meta-badge.info,.inspector-header .inspector-meta .meta-badge.all{background-color:#0dcaf0;color:#000}.inspector-header .inspector-meta .meta-badge.debug{background-color:#a855f7;color:#fff}.inspector-header .inspector-meta .meta-badge.warning{background-color:#f59e0b;color:#000}.inspector-header .inspector-meta .meta-badge.error{background-color:#ef4444;color:#fff}.inspector-header .inspector-meta .meta-class{color:#569cd6}.inspector-header .inspector-meta .meta-time{color:#6a9955}.inspector-header .close-btn{background:none;border:none;color:#999;font-size:18px;cursor:pointer;width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:50%}.inspector-header .close-btn:hover{background-color:#3e3e42;color:#fff}.inspector-content{flex:1;overflow-y:auto;padding:20px;background-color:#1e1e1e}.inspector-content::-webkit-scrollbar{width:10px;height:10px}.inspector-content::-webkit-scrollbar-track{background:#1e1e1e}.inspector-content::-webkit-scrollbar-thumb{background:#424242;border-radius:5px;border:2px solid #1e1e1e}.inspector-content::-webkit-scrollbar-thumb:hover{background:#4f4f4f}.inspector-split{display:flex;flex-direction:column;gap:20px}.inspector-section h5{margin:0 0 10px;color:#999;font-size:12px;text-transform:uppercase;border-bottom:1px solid #333;padding-bottom:4px}.methods-list{display:flex;flex-wrap:wrap;gap:8px}.method-btn{background-color:#2d2d2d;border:1px solid #3e3e42;color:#dcdcaa;padding:4px 10px;border-radius:4px;cursor:pointer;font-family:Consolas,monospace;font-size:12px;transition:all .2s}.method-btn:hover{background-color:#3e3e42;border-color:#dcdcaa;color:#fff}.method-btn:active{transform:translateY(1px)}.repl-container{display:flex;flex-direction:column;gap:8px}.repl-container textarea{width:100%;height:80px;background-color:#2d2d2d;border:1px solid #3e3e42;color:#dcdcaa;font-family:Consolas,monospace;padding:8px;resize:vertical;outline:none}.repl-container textarea:focus{border-color:#007fd4}.repl-container textarea::-webkit-scrollbar{width:8px;height:8px}.repl-container textarea::-webkit-scrollbar-track{background:#2d2d2d}.repl-container textarea::-webkit-scrollbar-thumb{background:#424242;border-radius:4px}.repl-container textarea::-webkit-scrollbar-thumb:hover{background:#4f4f4f}.repl-container .repl-btn{align-self:flex-end;background-color:#0e639c;color:#fff;border:none;padding:6px 12px;cursor:pointer;border-radius:2px}.repl-container .repl-btn:hover{background-color:#17b}.error-section .error-msg{color:#f48771;background-color:#3e3e42;padding:8px;border-left:3px solid #f48771;font-family:monospace;white-space:pre-wrap}.dropdown-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;z-index:9999;cursor:default}.dropdown-menu.fixed-dropdown{position:fixed;z-index:10000;background-color:#252526;border:1px solid #454545;box-shadow:0 4px 10px #00000080;border-radius:4px;padding:4px 0;min-width:150px;max-height:200px;overflow-y:auto}.dropdown-menu.fixed-dropdown .level-check-item{display:flex;align-items:center;gap:8px;padding:6px 12px;cursor:pointer;color:#ccc;transition:background-color .1s;-webkit-user-select:none;user-select:none;font-size:11px}.dropdown-menu.fixed-dropdown .level-check-item:hover{background-color:#007acc;color:#fff}.dropdown-menu.fixed-dropdown .level-check-item input{accent-color:#fff}.dropdown-menu.fixed-dropdown::-webkit-scrollbar{width:8px}.dropdown-menu.fixed-dropdown::-webkit-scrollbar-track{background:#252526}.dropdown-menu.fixed-dropdown::-webkit-scrollbar-thumb{background:#444;border-radius:4px}.dropdown-menu.fixed-dropdown::-webkit-scrollbar-thumb:hover{background:#555}@media (max-width: 768px){.console-grid{display:flex;flex-direction:column;gap:10px;height:100%;overflow:hidden}.tile{transition:all .3s cubic-bezier(.25,.8,.25,1);display:flex;flex-direction:column}.tile.collapsed{flex:0 0 auto;max-height:40px!important;overflow:hidden}.tile.collapsed .table-container,.tile.collapsed .logs-container,.tile.collapsed .console-summary{display:none}.tile.expanded{flex:1 1 auto;max-height:100%!important;height:100%}.tile.config-tile{max-height:40vh}.tile.config-tile.expanded{max-height:100%}.inspector-panel{width:100%;height:100%;max-width:none;max-height:none;border-radius:0}.inspector-header{border-radius:0}.tile-header{flex-direction:column;align-items:flex-start;gap:8px}.tile-header .header-actions{width:100%;display:flex;justify-content:space-between}.tile-header .header-actions .search-input{flex-grow:1;margin-right:8px;width:auto}.tile-header .header-actions .search-input:focus{width:auto}}.console-summary{padding:4px;font-size:11px;color:#888}\n"],dependencies:[{kind:"ngmodule",type:w},{kind:"directive",type:m.NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:m.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:m.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"ngmodule",type:F},{kind:"directive",type:H.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:H.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:H.NgModel,selector:"[ngModel]:not([formControlName]):not([formControl])",inputs:["name","disabled","ngModel","ngModelOptions"],outputs:["ngModelChange"],exportAs:["ngModel"]},{kind:"component",type:JsonViewComponent,selector:"asor-json-view",inputs:["data","key","level","expandDepth"]}],encapsulation:t.ViewEncapsulation.None})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:ConsoleTabComponent,decorators:[{type:p,args:[{selector:"asor-console-tab",standalone:!0,imports:[w,F,JsonViewComponent],encapsulation:d.None,template:'<div class="console-tab-container">\r\n\t\x3c!-- Transparent backdrop to close dropdowns --\x3e\r\n\t<div class="dropdown-backdrop" *ngIf="openDropdownClass" (click)="closeDropdown()"></div>\r\n\r\n\t\x3c!-- Root Dropdown Menu --\x3e\r\n\t<div\r\n\t\tclass="dropdown-menu fixed-dropdown"\r\n\t\t*ngIf="openDropdownClass && (selectedConfig || openDropdownClass === \'__NEW__\')"\r\n\t\t[style.top.px]="dropdownTop"\r\n\t\t[style.left.px]="dropdownLeft"\r\n\t\t(click)="$event.stopPropagation()"\r\n\t>\r\n\t\t\x3c!-- Existing Class Mode --\x3e\r\n\t\t<ng-container *ngIf="selectedConfig">\r\n\t\t\t<label class="level-check-item" *ngFor="let level of availableLevels">\r\n\t\t\t\t<input\r\n\t\t\t\t\t[checked]="isLevelEnabled(selectedConfig, level)"\r\n\t\t\t\t\t(change)="updateClassLevel(selectedConfig.className, level, $event)"\r\n\t\t\t\t\ttype="checkbox"\r\n\t\t\t\t/>\r\n\t\t\t\t{{ level }}\r\n\t\t\t</label>\r\n\t\t</ng-container>\r\n\r\n\t\t\x3c!-- New Class Mode --\x3e\r\n\t\t<ng-container *ngIf="openDropdownClass === \'__NEW__\'">\r\n\t\t\t<label class="level-check-item" *ngFor="let level of availableLevels">\r\n\t\t\t\t<input\r\n\t\t\t\t\t[checked]="newClassLevels[level]"\r\n\t\t\t\t\t(change)="updateNewClassLevel(level, $event)"\r\n\t\t\t\t\ttype="checkbox"\r\n\t\t\t\t/>\r\n\t\t\t\t{{ level }}\r\n\t\t\t</label>\r\n\t\t</ng-container>\r\n\t</div>\r\n\r\n\t<div class="console-grid">\r\n\t\t\x3c!-- LEFT TILE: Configuration --\x3e\r\n\t\t<div\r\n\t\t\tclass="tile config-tile"\r\n\t\t\t[class.expanded]="mobileExpandedSection === \'config\'"\r\n\t\t\t[class.collapsed]="mobileExpandedSection === \'logs\'"\r\n\t\t>\r\n\t\t\t<div class="tile-header">\r\n\t\t\t\t<div class="header-title-group">\r\n\t\t\t\t\t<button\r\n\t\t\t\t\t\tclass="icon-btn expand-btn"\r\n\t\t\t\t\t\t(click)="toggleSection(\'config\')"\r\n\t\t\t\t\t\ttitle="{{ mobileExpandedSection === \'config\' ? \'Collapse\' : \'Expand\' }}"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ mobileExpandedSection === \'config\' ? \'▼\' : \'►\' }}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<h4>Configuration</h4>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<div class="console-summary" *ngIf="mobileExpandedSection !== \'config\'">\r\n\t\t\t\tDefaults levels logs: {{ defaultLevels.join(\', \') || \'NONE/OFF\' }}\r\n\t\t\t</div>\r\n\r\n\t\t\t<div class="table-container">\r\n\t\t\t\t<table class="config-table">\r\n\t\t\t\t\t<thead>\r\n\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t<th>Class</th>\r\n\t\t\t\t\t\t\t<th>Levels</th>\r\n\t\t\t\t\t\t\t<th class="actions-col"></th>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</thead>\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t<tr *ngFor="let config of classConfigs">\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t{{ config.className }}\r\n\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\tclass="class-count"\r\n\t\t\t\t\t\t\t\t\t*ngIf="getClassLogCount(config.className) > 0"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t({{ getClassLogCount(config.className) }})\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<div class="multiselect-container">\r\n\t\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\t\tclass="dropdown-trigger"\r\n\t\t\t\t\t\t\t\t\t\t(click)="toggleDropdown(config, $event)"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<span class="selected-label">{{\r\n\t\t\t\t\t\t\t\t\t\t\tgetSelectedLevelsLabel(config)\r\n\t\t\t\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t\t\t\t<span class="arrow">▼</span>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td class="actions-col">\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tclass="icon-btn delete"\r\n\t\t\t\t\t\t\t\t\t(click)="removeClass(config.className)"\r\n\t\t\t\t\t\t\t\t\ttitle="Remove"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t✕\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t\t<tfoot>\r\n\t\t\t\t\t\t<tr class="add-row">\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\tclass="input-text-small"\r\n\t\t\t\t\t\t\t\t\t[(ngModel)]="newClassName"\r\n\t\t\t\t\t\t\t\t\ttype="text"\r\n\t\t\t\t\t\t\t\t\tplaceholder="New Class..."\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<div class="multiselect-container">\r\n\t\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\t\tclass="dropdown-trigger"\r\n\t\t\t\t\t\t\t\t\t\t(click)="toggleNewClassDropdown($event)"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<span class="selected-label">{{\r\n\t\t\t\t\t\t\t\t\t\t\tgetNewClassLevelsLabel() || \'Select Levels\'\r\n\t\t\t\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t\t\t\t<span class="arrow">▼</span>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td class="actions-col">\r\n\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\tclass="icon-btn add"\r\n\t\t\t\t\t\t\t\t\t[disabled]="!newClassName"\r\n\t\t\t\t\t\t\t\t\t(click)="addNewClass()"\r\n\t\t\t\t\t\t\t\t\ttitle="Add"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t+\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</tfoot>\r\n\t\t\t\t</table>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t\x3c!-- RIGHT TILE: Logs --\x3e\r\n\t\t<div\r\n\t\t\tclass="tile logs-tile"\r\n\t\t\t[class.expanded]="mobileExpandedSection === \'logs\'"\r\n\t\t\t[class.collapsed]="mobileExpandedSection === \'config\'"\r\n\t\t>\r\n\t\t\t<div class="tile-header">\r\n\t\t\t\t<div class="header-title-group">\r\n\t\t\t\t\t<button\r\n\t\t\t\t\t\tclass="icon-btn expand-btn"\r\n\t\t\t\t\t\t(click)="toggleSection(\'logs\')"\r\n\t\t\t\t\t\ttitle="{{ mobileExpandedSection === \'logs\' ? \'Collapse\' : \'Expand\' }}"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ mobileExpandedSection === \'logs\' ? \'▼\' : \'►\' }}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<h4>Logs Stream</h4>\r\n\t\t\t\t\t<div class="log-counts">\r\n\t\t\t\t\t\t<ng-container *ngFor="let level of availableLevels">\r\n\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\tclass="count-badge"\r\n\t\t\t\t\t\t\t\t*ngIf="level !== \'ALL\' && logCounts[level]"\r\n\t\t\t\t\t\t\t\t[ngClass]="[\r\n\t\t\t\t\t\t\t\t\tlevel.toLowerCase(),\r\n\t\t\t\t\t\t\t\t\tselectedLevels.has(level) ? \'selected\' : \'\',\r\n\t\t\t\t\t\t\t\t]"\r\n\t\t\t\t\t\t\t\t[title]="\r\n\t\t\t\t\t\t\t\t\tselectedLevels.has(level)\r\n\t\t\t\t\t\t\t\t\t\t? \'Clear filter\'\r\n\t\t\t\t\t\t\t\t\t\t: \'Add filter for \' + level\r\n\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t(click)="filterByLevel(level)"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{{ level }}: <b>{{ logCounts[level] }}</b>\r\n\t\t\t\t\t\t\t\t<span class="clear-filter-icon" *ngIf="selectedLevels.has(level)"\r\n\t\t\t\t\t\t\t\t\t>✕</span\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="header-actions">\r\n\t\t\t\t\t<input\r\n\t\t\t\t\t\tclass="search-input"\r\n\t\t\t\t\t\t[(ngModel)]="searchTerm"\r\n\t\t\t\t\t\ttype="text"\r\n\t\t\t\t\t\tplaceholder="Search logs..."\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<button class="icon-btn clear" (click)="clearLogs()" title="Clear Logs">\r\n\t\t\t\t\t\t✕ Clear\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<div class="logs-container" #logsContainer (scroll)="onLogScroll()">\r\n\t\t\t\t<div\r\n\t\t\t\t\tclass="log-entry"\r\n\t\t\t\t\t*ngFor="let log of filteredLogs"\r\n\t\t\t\t\t[ngClass]="log.level.toLowerCase()"\r\n\t\t\t\t>\r\n\t\t\t\t\t<span class="log-badge">{{ log.level }}</span>\r\n\t\t\t\t\t<span class="log-time">{{ log.timestamp.split(\' \')[1] }}</span>\r\n\t\t\t\t\t<span\r\n\t\t\t\t\t\tclass="log-class"\r\n\t\t\t\t\t\t[class.clickable]="log.source"\r\n\t\t\t\t\t\t[title]="log.source ? \'Inspect \' + log.className : \'\'"\r\n\t\t\t\t\t\t(click)="log.source ? inspectObject(log.source, log) : null"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t[{{ log.className }}]\r\n\t\t\t\t\t</span>\r\n\t\t\t\t\t<span class="log-msg">{{ log.message }}</span>\r\n\r\n\t\t\t\t\t<div class="log-params" *ngIf="log.params.length">\r\n\t\t\t\t\t\t<ng-container *ngFor="let param of log.params">\r\n\t\t\t\t\t\t\t<span class="param-primitive" *ngIf="!isObject(param)">{{\r\n\t\t\t\t\t\t\t\tparam\r\n\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tclass="btn-inspect"\r\n\t\t\t\t\t\t\t\t*ngIf="isObject(param)"\r\n\t\t\t\t\t\t\t\t(click)="inspectObject(param)"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t🔍 Object\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="empty-logs" *ngIf="logs.length === 0">Waiting for logs...</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t\x3c!-- Inspector Modal/Overlay --\x3e\r\n\t<div class="inspector-overlay" *ngIf="inspectedObject" (click)="closeInspector()">\r\n\t\t<div class="inspector-panel" (click)="$event.stopPropagation()">\r\n\t\t\t<div class="inspector-header">\r\n\t\t\t\t<div class="header-content">\r\n\t\t\t\t\t<h4>Object Inspector</h4>\r\n\t\t\t\t\t<div class="inspector-meta" *ngIf="inspectedLog">\r\n\t\t\t\t\t\t<span class="meta-badge" [ngClass]="inspectedLog.level.toLowerCase()">{{\r\n\t\t\t\t\t\t\tinspectedLog.level\r\n\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t<span class="meta-class">[{{ inspectedLog.className }}]</span>\r\n\t\t\t\t\t\t<span class="meta-time">{{ inspectedLog.timestamp.split(\' \')[1] }}</span>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<button class="close-btn" (click)="closeInspector()">✕</button>\r\n\t\t\t</div>\r\n\t\t\t<div class="inspector-content">\r\n\t\t\t\t<div class="inspector-split">\r\n\t\t\t\t\t<div class="inspector-section" *ngIf="inspectedObject">\r\n\t\t\t\t\t\t<h5>State</h5>\r\n\t\t\t\t\t\t<asor-json-view [data]="inspectedObject" [expandDepth]="1"></asor-json-view>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class="inspector-section" *ngIf="inspectedObjectMethods.length > 0">\r\n\t\t\t\t\t\t<h5>Methods</h5>\r\n\t\t\t\t\t\t<div class="methods-list">\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tclass="method-btn"\r\n\t\t\t\t\t\t\t\t*ngFor="let method of inspectedObjectMethods"\r\n\t\t\t\t\t\t\t\t(click)="appendToRepl(method)"\r\n\t\t\t\t\t\t\t\ttitle="Add to REPL"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{{ method }}()\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class="inspector-section" *ngIf="inspectedObject">\r\n\t\t\t\t\t\t<h5>Console REPL</h5>\r\n\t\t\t\t\t\t<div class="repl-container">\r\n\t\t\t\t\t\t\t<textarea\r\n\t\t\t\t\t\t\t\t[(ngModel)]="executionCode"\r\n\t\t\t\t\t\t\t\t(keydown.control.enter)="executeSnippet()"\r\n\t\t\t\t\t\t\t\tplaceholder="Execute code (e.g. state.createDataSet(...))"\r\n\t\t\t\t\t\t\t></textarea>\r\n\t\t\t\t\t\t\t<button class="repl-btn" (click)="executeSnippet()">Execute</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class="inspector-section" *ngIf="hasReplResult">\r\n\t\t\t\t\t\t<h5>Result</h5>\r\n\t\t\t\t\t\t<asor-json-view [data]="replResult" [expandDepth]="1"></asor-json-view>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class="inspector-section error-section" *ngIf="replError">\r\n\t\t\t\t\t\t<h5>Error</h5>\r\n\t\t\t\t\t\t<div class="error-msg">{{ replError }}</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n',styles:[".console-tab-container{height:100%;display:flex;flex-direction:column}.console-grid{display:grid;grid-template-columns:400px 1fr;gap:16px;height:100%}.tile{background-color:#252526;border-radius:6px;border:1px solid #333;display:flex;flex-direction:column;overflow:hidden;height:100%}.tile-header{padding:10px 12px;border-bottom:1px solid #333;display:flex;justify-content:space-between;align-items:center;background-color:#2d2d2d}.tile-header h4{margin:0;font-size:12px;text-transform:uppercase;color:#999;font-weight:600;letter-spacing:.5px}.tile-header .header-actions,.header-title-group{display:flex;align-items:center;gap:8px}.header-title-group .log-counts{display:flex;gap:6px;margin-left:8px}.header-title-group .log-counts .count-badge{font-size:10px;padding:2px 6px;border-radius:10px;font-weight:600;color:#fff;background-color:#555;cursor:pointer;-webkit-user-select:none;user-select:none;transition:opacity .2s}.header-title-group .log-counts .count-badge:hover{opacity:.8}.header-title-group .log-counts .count-badge.info{background-color:#0dcaf033;color:#0dcaf0;border:1px solid rgba(13,202,240,.3)}.header-title-group .log-counts .count-badge.debug{background-color:#a855f733;color:#a855f7;border:1px solid rgba(168,85,247,.3)}.header-title-group .log-counts .count-badge.warning{background-color:#f59e0b33;color:#f59e0b;border:1px solid rgba(245,158,11,.3)}.header-title-group .log-counts .count-badge.selected{opacity:1;border:1px solid #fff;box-shadow:0 0 4px #ffffff80}.header-title-group .log-counts .count-badge.selected.info{background-color:#0dcaf0;color:#000}.header-title-group .log-counts .count-badge.selected.debug{background-color:#a855f7;color:#fff}.header-title-group .log-counts .count-badge.selected.warning{background-color:#f59e0b;color:#000}.header-title-group .log-counts .count-badge.selected.error{background-color:#ef4444;color:#fff}.header-title-group .log-counts .count-badge .clear-filter-icon{margin-left:4px;font-size:8px;font-weight:700}.table-container,.logs-container{flex:1;overflow-y:auto}.table-container::-webkit-scrollbar,.logs-container::-webkit-scrollbar{width:10px;height:10px}.table-container::-webkit-scrollbar-track,.logs-container::-webkit-scrollbar-track{background:#1e1e1e}.table-container::-webkit-scrollbar-thumb,.logs-container::-webkit-scrollbar-thumb{background:#424242;border-radius:5px;border:2px solid #1e1e1e}.table-container::-webkit-scrollbar-thumb:hover,.logs-container::-webkit-scrollbar-thumb:hover{background:#4f4f4f}.config-table{width:100%;border-collapse:collapse;font-size:12px}.config-table th,.config-table td{border-bottom:1px solid #333;padding:8px 12px;text-align:left;vertical-align:middle;color:#ccc}.config-table th{background-color:#2d2d2d;font-weight:600;color:#999;text-transform:uppercase;font-size:11px;position:sticky;top:0;z-index:10}.config-table tfoot{background-color:#2d2d2d;position:sticky;bottom:0;z-index:10}.config-table tfoot td{border-top:1px solid #333}.config-table tr:hover td{background-color:#2a2d2e}.config-table .class-count{color:#888;font-size:11px;margin-left:4px}.input-text-small{background-color:#3c3c3c;border:1px solid #3c3c3c;color:#fff;padding:4px 8px;border-radius:3px;width:100%;font-size:12px}.input-text-small:focus{outline:none;border-color:#007acc;background-color:#444}.input-text-small::placeholder{color:#888}.multiselect-container{position:relative}.dropdown-trigger{cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:4px 8px;background-color:#3c3c3c;border:1px solid #454545;border-radius:4px;min-width:120px;color:#fff;font-size:11px}.dropdown-trigger:hover{background-color:#444;border-color:#007acc}.dropdown-trigger .selected-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:150px}.dropdown-trigger .arrow{font-size:8px;color:#999}.level-checks{display:flex;gap:10px;flex-wrap:wrap}.level-check{display:flex;align-items:center;gap:4px;cursor:pointer;font-size:11px;color:#bbb;-webkit-user-select:none;user-select:none}.level-check:hover{color:#fff}.level-check input{accent-color:#007acc}.icon-btn{background:none;border:none;cursor:pointer;padding:4px;border-radius:4px;transition:all .2s;display:flex;align-items:center;justify-content:center}.icon-btn.delete{color:#f48771}.icon-btn.delete:hover{background-color:#f487711a}.icon-btn.add{color:#89d185;font-size:16px}.icon-btn.add:hover:not(:disabled){background-color:#89d1851a}.icon-btn.add:disabled{color:#555;cursor:not-allowed}.icon-btn.clear{font-size:11px;color:#bbb;border:1px solid #3e3e42;padding:2px 8px}.icon-btn.clear:hover{background-color:#3e3e42;color:#fff}.icon-btn.expand-btn{display:none}@media (max-width: 768px){.icon-btn.expand-btn{display:flex;font-size:10px;color:#999;border:1px solid #3e3e42;width:20px;height:20px;padding:0}.icon-btn.expand-btn:hover{background-color:#3e3e42;color:#fff}}.search-input{background-color:#3c3c3c;border:1px solid #3e3e42;color:#fff;padding:3px 8px;border-radius:4px;font-size:11px;width:150px;transition:all .2s}.search-input:focus{outline:none;border-color:#007acc;background-color:#444;width:180px}.search-input::placeholder{color:#888}.logs-container{background-color:#1e1e1e;color:#d4d4d4;font-family:Consolas,Monaco,Courier New,monospace;font-size:12px;padding:8px 12px}.log-entry{padding:6px 0;border-bottom:1px solid #2d2d2d;display:flex;flex-wrap:wrap;align-items:flex-start;gap:8px;line-height:1.4}.log-entry:last-child{border-bottom:none}.log-entry.info .log-badge{background-color:#0dcaf0;color:#000;border-radius:3px;font-weight:700}.log-entry.info .log-msg,.log-entry.info .log-class{color:#0dcaf0}.log-entry.debug .log-badge{background-color:#a855f7;color:#fff;border-radius:3px;font-weight:700}.log-entry.debug .log-msg,.log-entry.debug .log-class{color:#a855f7}.log-entry.warning .log-badge{background-color:#f59e0b;color:#000;border-radius:3px;font-weight:700}.log-entry.warning .log-msg,.log-entry.warning .log-class{color:#f59e0b}.log-entry.error .log-badge{background-color:#ef4444;color:#fff;border-radius:3px;font-weight:700}.log-entry.error .log-msg,.log-entry.error .log-class{color:#ef4444;font-weight:700}.log-time{color:#6a9955;font-size:11px;min-width:60px}.log-badge{font-weight:700;width:60px;font-size:11px;text-align:center}.log-class{color:#569cd6}.log-class.clickable{cursor:pointer;text-decoration:underline}.log-class.clickable:hover{opacity:.8;color:#9cdcfe}.log-msg{color:#ccc;word-break:break-all}.log-params{display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin-left:8px}.param-primitive{color:#9cdcfe;background:#2a2d2e;padding:0 4px;border-radius:3px}.btn-inspect{background-color:#2d2d2d;border:1px solid #3e3e42;color:#4fc1ff;padding:2px 8px;border-radius:12px;cursor:pointer;font-size:11px;font-family:inherit;transition:all .2s;display:inline-flex;align-items:center;gap:4px}.btn-inspect:hover{background-color:#3e3e42;border-color:#4fc1ff;color:#fff}.empty-logs{color:#666;text-align:center;padding:40px;font-style:italic}.inspector-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#0009;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:10000;display:flex;justify-content:center;align-items:center;padding:40px}.inspector-panel{background-color:#252526;border-radius:8px;width:100%;max-width:700px;height:100%;max-height:600px;display:flex;flex-direction:column;box-shadow:0 20px 50px #000000b3;border:1px solid #454545;animation:zoomIn .25s cubic-bezier(.16,1,.3,1)}@keyframes zoomIn{0%{transform:scale(.95);opacity:0}to{transform:scale(1);opacity:1}}.inspector-header{padding:12px 16px;background-color:#2d2d2d;border-bottom:1px solid #333;border-top-left-radius:8px;border-top-right-radius:8px;display:flex;justify-content:space-between;align-items:center}.inspector-header .header-content{display:flex;flex-direction:column;gap:2px}.inspector-header h4{margin:0;color:#eee;font-size:14px;font-weight:600}.inspector-header .inspector-meta{display:flex;gap:8px;align-items:center;font-size:11px;color:#888;font-family:monospace}.inspector-header .inspector-meta .meta-badge{padding:2px 6px;border-radius:3px;font-weight:700;font-size:10px}.inspector-header .inspector-meta .meta-badge.info,.inspector-header .inspector-meta .meta-badge.all{background-color:#0dcaf0;color:#000}.inspector-header .inspector-meta .meta-badge.debug{background-color:#a855f7;color:#fff}.inspector-header .inspector-meta .meta-badge.warning{background-color:#f59e0b;color:#000}.inspector-header .inspector-meta .meta-badge.error{background-color:#ef4444;color:#fff}.inspector-header .inspector-meta .meta-class{color:#569cd6}.inspector-header .inspector-meta .meta-time{color:#6a9955}.inspector-header .close-btn{background:none;border:none;color:#999;font-size:18px;cursor:pointer;width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:50%}.inspector-header .close-btn:hover{background-color:#3e3e42;color:#fff}.inspector-content{flex:1;overflow-y:auto;padding:20px;background-color:#1e1e1e}.inspector-content::-webkit-scrollbar{width:10px;height:10px}.inspector-content::-webkit-scrollbar-track{background:#1e1e1e}.inspector-content::-webkit-scrollbar-thumb{background:#424242;border-radius:5px;border:2px solid #1e1e1e}.inspector-content::-webkit-scrollbar-thumb:hover{background:#4f4f4f}.inspector-split{display:flex;flex-direction:column;gap:20px}.inspector-section h5{margin:0 0 10px;color:#999;font-size:12px;text-transform:uppercase;border-bottom:1px solid #333;padding-bottom:4px}.methods-list{display:flex;flex-wrap:wrap;gap:8px}.method-btn{background-color:#2d2d2d;border:1px solid #3e3e42;color:#dcdcaa;padding:4px 10px;border-radius:4px;cursor:pointer;font-family:Consolas,monospace;font-size:12px;transition:all .2s}.method-btn:hover{background-color:#3e3e42;border-color:#dcdcaa;color:#fff}.method-btn:active{transform:translateY(1px)}.repl-container{display:flex;flex-direction:column;gap:8px}.repl-container textarea{width:100%;height:80px;background-color:#2d2d2d;border:1px solid #3e3e42;color:#dcdcaa;font-family:Consolas,monospace;padding:8px;resize:vertical;outline:none}.repl-container textarea:focus{border-color:#007fd4}.repl-container textarea::-webkit-scrollbar{width:8px;height:8px}.repl-container textarea::-webkit-scrollbar-track{background:#2d2d2d}.repl-container textarea::-webkit-scrollbar-thumb{background:#424242;border-radius:4px}.repl-container textarea::-webkit-scrollbar-thumb:hover{background:#4f4f4f}.repl-container .repl-btn{align-self:flex-end;background-color:#0e639c;color:#fff;border:none;padding:6px 12px;cursor:pointer;border-radius:2px}.repl-container .repl-btn:hover{background-color:#17b}.error-section .error-msg{color:#f48771;background-color:#3e3e42;padding:8px;border-left:3px solid #f48771;font-family:monospace;white-space:pre-wrap}.dropdown-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;z-index:9999;cursor:default}.dropdown-menu.fixed-dropdown{position:fixed;z-index:10000;background-color:#252526;border:1px solid #454545;box-shadow:0 4px 10px #00000080;border-radius:4px;padding:4px 0;min-width:150px;max-height:200px;overflow-y:auto}.dropdown-menu.fixed-dropdown .level-check-item{display:flex;align-items:center;gap:8px;padding:6px 12px;cursor:pointer;color:#ccc;transition:background-color .1s;-webkit-user-select:none;user-select:none;font-size:11px}.dropdown-menu.fixed-dropdown .level-check-item:hover{background-color:#007acc;color:#fff}.dropdown-menu.fixed-dropdown .level-check-item input{accent-color:#fff}.dropdown-menu.fixed-dropdown::-webkit-scrollbar{width:8px}.dropdown-menu.fixed-dropdown::-webkit-scrollbar-track{background:#252526}.dropdown-menu.fixed-dropdown::-webkit-scrollbar-thumb{background:#444;border-radius:4px}.dropdown-menu.fixed-dropdown::-webkit-scrollbar-thumb:hover{background:#555}@media (max-width: 768px){.console-grid{display:flex;flex-direction:column;gap:10px;height:100%;overflow:hidden}.tile{transition:all .3s cubic-bezier(.25,.8,.25,1);display:flex;flex-direction:column}.tile.collapsed{flex:0 0 auto;max-height:40px!important;overflow:hidden}.tile.collapsed .table-container,.tile.collapsed .logs-container,.tile.collapsed .console-summary{display:none}.tile.expanded{flex:1 1 auto;max-height:100%!important;height:100%}.tile.config-tile{max-height:40vh}.tile.config-tile.expanded{max-height:100%}.inspector-panel{width:100%;height:100%;max-width:none;max-height:none;border-radius:0}.inspector-header{border-radius:0}.tile-header{flex-direction:column;align-items:flex-start;gap:8px}.tile-header .header-actions{width:100%;display:flex;justify-content:space-between}.tile-header .header-actions .search-input{flex-grow:1;margin-right:8px;width:auto}.tile-header .header-actions .search-input:focus{width:auto}}.console-summary{padding:4px;font-size:11px;color:#888}\n"]}]}],ctorParameters:()=>[{type:t.ChangeDetectorRef}],propDecorators:{logsContainer:[{type:g,args:["logsContainer"]}]}});class JsonEditorComponent{set jsonString(t){this._jsonString!==t&&(this._jsonString=t||"",this.initialJsonString=this._jsonString,this.isDirty=!1,this.updateHighlighting())}get jsonString(){return this._jsonString}_jsonString="";jsonStringChange=new h;highlightedHtml="";lineNumbersHtml="1";isExpanded=!1;isDirty=!1;initialJsonString="";backdropElement;textareaElement;lineNumbersElement;toggleExpand(){this.isExpanded=!this.isExpanded}onTextareaChange(t){this._jsonString=t.target.value,this.isDirty=this._jsonString!==this.initialJsonString,this.jsonStringChange.emit(this._jsonString),this.updateHighlighting()}onScroll(t){const e=t.target;this.backdropElement&&(this.backdropElement.nativeElement.scrollTop=e.scrollTop,this.backdropElement.nativeElement.scrollLeft=e.scrollLeft),this.lineNumbersElement&&(this.lineNumbersElement.nativeElement.scrollTop=e.scrollTop)}updateHighlighting(){this.highlightedHtml=this.syntaxHighlight(this._jsonString),this.updateLineNumbers()}updateLineNumbers(){if(!this._jsonString)return void(this.lineNumbersHtml="1");const t=this._jsonString.split("\n").length;this.lineNumbersHtml=Array.from({length:t},(t,e)=>e+1).join("\n")}syntaxHighlight(t){return t?t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*")(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,(t,e,r,n)=>{let o="json-value-number";if(/^"/.test(t)){if(n)return'<span class="json-key">'+e+"</span>"+n;o="json-value-string"}else/true|false/.test(t)?o="json-value-boolean":/null/.test(t)&&(o="json-value-null");return'<span class="'+o+'">'+t+"</span>"}):""}handleKeyDown(t){if("Tab"===t.key){t.preventDefault();const e=this.textareaElement.nativeElement,r=e.selectionStart,n=e.selectionEnd,o=e.value;e.value=o.substring(0,r)+" "+o.substring(n),e.selectionStart=e.selectionEnd=r+4,this.onTextareaChange({target:e})}}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:JsonEditorComponent,deps:[],target:t.ɵɵFactoryTarget.Component});static ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"20.3.18",type:JsonEditorComponent,isStandalone:!0,selector:"asor-json-editor",inputs:{jsonString:"jsonString"},outputs:{jsonStringChange:"jsonStringChange"},viewQueries:[{propertyName:"backdropElement",first:!0,predicate:["backdrop"],descendants:!0},{propertyName:"textareaElement",first:!0,predicate:["textarea"],descendants:!0},{propertyName:"lineNumbersElement",first:!0,predicate:["lineNumbers"],descendants:!0}],ngImport:t,template:'<div class="json-editor-backdrop" *ngIf="isExpanded" (click)="toggleExpand()"></div>\r\n<div class="json-editor-wrapper" [class.expanded]="isExpanded">\r\n\t<div class="editor-toolbar">\r\n\t\t<div class="toolbar-left">\r\n\t\t\t<span\r\n\t\t\t\tclass="status-dot"\r\n\t\t\t\t[class.dirty]="isDirty"\r\n\t\t\t\t[title]="isDirty ? \'JSON Alterato\' : \'JSON Originale\'"\r\n\t\t\t></span>\r\n\t\t\t<span class="editor-title">JSON Editor</span>\r\n\t\t</div>\r\n\t\t<button\r\n\t\t\tclass="expand-btn"\r\n\t\t\t[title]="isExpanded ? \'Collapse\' : \'Expand\'"\r\n\t\t\t(click)="toggleExpand()"\r\n\t\t>\r\n\t\t\t<svg\r\n\t\t\t\t*ngIf="!isExpanded"\r\n\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\twidth="14"\r\n\t\t\t\theight="14"\r\n\t\t\t\tstroke="currentColor"\r\n\t\t\t\tstroke-width="2"\r\n\t\t\t\tfill="none"\r\n\t\t\t\tstroke-linecap="round"\r\n\t\t\t\tstroke-linejoin="round"\r\n\t\t\t>\r\n\t\t\t\t<path d="M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7"></path>\r\n\t\t\t</svg>\r\n\t\t\t<svg\r\n\t\t\t\t*ngIf="isExpanded"\r\n\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\twidth="14"\r\n\t\t\t\theight="14"\r\n\t\t\t\tstroke="currentColor"\r\n\t\t\t\tstroke-width="2"\r\n\t\t\t\tfill="none"\r\n\t\t\t\tstroke-linecap="round"\r\n\t\t\t\tstroke-linejoin="round"\r\n\t\t\t>\r\n\t\t\t\t<path d="M4 14h6v6M20 10h-6V4M14 10l7-7M10 14l-7 7"></path>\r\n\t\t\t</svg>\r\n\t\t</button>\r\n\t</div>\r\n\t<div class="editor-main-area">\r\n\t\t<div class="editor-line-numbers-container">\r\n\t\t\t<pre class="editor-line-numbers" #lineNumbers>{{ lineNumbersHtml }}</pre>\r\n\t\t</div>\r\n\t\t<div class="json-editor-container">\r\n\t\t\t<pre\r\n\t\t\t\tclass="editor-backdrop"\r\n\t\t\t\t#backdrop\r\n\t\t\t\taria-hidden="true"\r\n\t\t\t><code [innerHTML]="highlightedHtml"></code></pre>\r\n\t\t\t<textarea\r\n\t\t\t\tclass="editor-textarea"\r\n\t\t\t\t#textarea\r\n\t\t\t\t[value]="jsonString"\r\n\t\t\t\t(input)="onTextareaChange($event)"\r\n\t\t\t\t(scroll)="onScroll($event)"\r\n\t\t\t\t(keydown)="handleKeyDown($event)"\r\n\t\t\t\tspellcheck="false"\r\n\t\t\t>\r\n\t\t\t</textarea>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n',styles:["asor-json-editor{display:flex;flex-direction:column;flex:1;width:100%;min-height:200px}.json-editor-backdrop{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:#0009;z-index:99998;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.json-editor-wrapper{position:relative;border:1px solid #3c3c3c;border-radius:4px;background-color:#1e1e1e;flex:1;display:flex;flex-direction:column}.json-editor-wrapper.expanded{position:fixed;top:5vh;left:5vw;width:90vw;height:90vh;z-index:99999;box-shadow:0 10px 40px #00000080;border:1px solid #555}.json-editor-wrapper:focus-within{border-color:#007acc}.json-editor-wrapper .editor-toolbar{display:flex;justify-content:flex-end;align-items:center;background-color:#2d2d2d;border-bottom:1px solid #3c3c3c;padding:2px 6px;min-height:22px}.json-editor-wrapper .toolbar-left{display:flex;align-items:center;margin-right:auto;padding-left:6px;gap:6px}.json-editor-wrapper .status-dot{width:8px;height:8px;border-radius:50%;background-color:#5ea33a;display:inline-block;transition:background-color .2s ease}.json-editor-wrapper .status-dot.dirty{background-color:#d19a66;box-shadow:0 0 4px #d19a6666}.json-editor-wrapper .editor-title{color:#ccc;font-family:inherit;font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.5px}.json-editor-wrapper .expand-btn{background:transparent;border:none;color:#ccc;cursor:pointer;padding:4px;display:flex;align-items:center;justify-content:center;border-radius:3px}.json-editor-wrapper .expand-btn:hover{background-color:#444;color:#fff}.json-editor-wrapper .editor-main-area{flex:1;display:flex;flex-direction:row;overflow:hidden}.json-editor-wrapper .editor-line-numbers-container{position:relative;width:48px;border-right:1px solid #3c3c3c;background-color:#1e1e1e;overflow:hidden;flex-shrink:0}.json-editor-wrapper .editor-line-numbers{margin:0;position:absolute;top:0;left:0;width:100%;height:100%;padding:12px 8px;font-family:Consolas,Monaco,Courier New,monospace;font-size:13px;line-height:1.5;white-space:pre;color:#858585;text-align:right;box-sizing:border-box;overflow:hidden;-webkit-user-select:none;user-select:none}.json-editor-wrapper .json-editor-container{position:relative;flex:1;overflow:hidden}.json-editor-wrapper .editor-backdrop,.json-editor-wrapper .editor-textarea{margin:0;position:absolute;top:0;left:0;width:100%;height:100%;padding:12px;font-family:Consolas,Monaco,Courier New,monospace;font-size:13px;line-height:1.5;white-space:pre;-moz-tab-size:4;-o-tab-size:4;tab-size:4;border:none;box-sizing:border-box;overflow:auto}.json-editor-wrapper .editor-backdrop{z-index:1;pointer-events:none;color:#d4d4d4;-ms-overflow-style:none;scrollbar-width:none}.json-editor-wrapper .editor-backdrop::-webkit-scrollbar{display:none}.json-editor-wrapper .editor-textarea{z-index:2;background-color:transparent;color:transparent;caret-color:#d4d4d4;resize:none;outline:none}.json-editor-wrapper .editor-textarea::selection{background-color:#264f7880;color:transparent}.json-editor-wrapper .editor-textarea::-webkit-scrollbar{width:10px;height:10px}.json-editor-wrapper .editor-textarea::-webkit-scrollbar-track{background:#1e1e1e}.json-editor-wrapper .editor-textarea::-webkit-scrollbar-thumb{background:#424242;border-radius:5px;border:2px solid #1e1e1e}.json-editor-wrapper .editor-textarea::-webkit-scrollbar-thumb:hover{background:#4f4f4f}.json-editor-wrapper .json-key{color:#9cdcfe}.json-editor-wrapper .json-value-string{color:#ce9178}.json-editor-wrapper .json-value-number{color:#b5cea8}.json-editor-wrapper .json-value-boolean,.json-editor-wrapper .json-value-null{color:#569cd6}\n"],dependencies:[{kind:"ngmodule",type:w},{kind:"directive",type:m.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]}],encapsulation:t.ViewEncapsulation.None})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:JsonEditorComponent,decorators:[{type:p,args:[{selector:"asor-json-editor",standalone:!0,imports:[w],encapsulation:d.None,template:'<div class="json-editor-backdrop" *ngIf="isExpanded" (click)="toggleExpand()"></div>\r\n<div class="json-editor-wrapper" [class.expanded]="isExpanded">\r\n\t<div class="editor-toolbar">\r\n\t\t<div class="toolbar-left">\r\n\t\t\t<span\r\n\t\t\t\tclass="status-dot"\r\n\t\t\t\t[class.dirty]="isDirty"\r\n\t\t\t\t[title]="isDirty ? \'JSON Alterato\' : \'JSON Originale\'"\r\n\t\t\t></span>\r\n\t\t\t<span class="editor-title">JSON Editor</span>\r\n\t\t</div>\r\n\t\t<button\r\n\t\t\tclass="expand-btn"\r\n\t\t\t[title]="isExpanded ? \'Collapse\' : \'Expand\'"\r\n\t\t\t(click)="toggleExpand()"\r\n\t\t>\r\n\t\t\t<svg\r\n\t\t\t\t*ngIf="!isExpanded"\r\n\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\twidth="14"\r\n\t\t\t\theight="14"\r\n\t\t\t\tstroke="currentColor"\r\n\t\t\t\tstroke-width="2"\r\n\t\t\t\tfill="none"\r\n\t\t\t\tstroke-linecap="round"\r\n\t\t\t\tstroke-linejoin="round"\r\n\t\t\t>\r\n\t\t\t\t<path d="M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7"></path>\r\n\t\t\t</svg>\r\n\t\t\t<svg\r\n\t\t\t\t*ngIf="isExpanded"\r\n\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\twidth="14"\r\n\t\t\t\theight="14"\r\n\t\t\t\tstroke="currentColor"\r\n\t\t\t\tstroke-width="2"\r\n\t\t\t\tfill="none"\r\n\t\t\t\tstroke-linecap="round"\r\n\t\t\t\tstroke-linejoin="round"\r\n\t\t\t>\r\n\t\t\t\t<path d="M4 14h6v6M20 10h-6V4M14 10l7-7M10 14l-7 7"></path>\r\n\t\t\t</svg>\r\n\t\t</button>\r\n\t</div>\r\n\t<div class="editor-main-area">\r\n\t\t<div class="editor-line-numbers-container">\r\n\t\t\t<pre class="editor-line-numbers" #lineNumbers>{{ lineNumbersHtml }}</pre>\r\n\t\t</div>\r\n\t\t<div class="json-editor-container">\r\n\t\t\t<pre\r\n\t\t\t\tclass="editor-backdrop"\r\n\t\t\t\t#backdrop\r\n\t\t\t\taria-hidden="true"\r\n\t\t\t><code [innerHTML]="highlightedHtml"></code></pre>\r\n\t\t\t<textarea\r\n\t\t\t\tclass="editor-textarea"\r\n\t\t\t\t#textarea\r\n\t\t\t\t[value]="jsonString"\r\n\t\t\t\t(input)="onTextareaChange($event)"\r\n\t\t\t\t(scroll)="onScroll($event)"\r\n\t\t\t\t(keydown)="handleKeyDown($event)"\r\n\t\t\t\tspellcheck="false"\r\n\t\t\t>\r\n\t\t\t</textarea>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n',styles:["asor-json-editor{display:flex;flex-direction:column;flex:1;width:100%;min-height:200px}.json-editor-backdrop{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:#0009;z-index:99998;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.json-editor-wrapper{position:relative;border:1px solid #3c3c3c;border-radius:4px;background-color:#1e1e1e;flex:1;display:flex;flex-direction:column}.json-editor-wrapper.expanded{position:fixed;top:5vh;left:5vw;width:90vw;height:90vh;z-index:99999;box-shadow:0 10px 40px #00000080;border:1px solid #555}.json-editor-wrapper:focus-within{border-color:#007acc}.json-editor-wrapper .editor-toolbar{display:flex;justify-content:flex-end;align-items:center;background-color:#2d2d2d;border-bottom:1px solid #3c3c3c;padding:2px 6px;min-height:22px}.json-editor-wrapper .toolbar-left{display:flex;align-items:center;margin-right:auto;padding-left:6px;gap:6px}.json-editor-wrapper .status-dot{width:8px;height:8px;border-radius:50%;background-color:#5ea33a;display:inline-block;transition:background-color .2s ease}.json-editor-wrapper .status-dot.dirty{background-color:#d19a66;box-shadow:0 0 4px #d19a6666}.json-editor-wrapper .editor-title{color:#ccc;font-family:inherit;font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.5px}.json-editor-wrapper .expand-btn{background:transparent;border:none;color:#ccc;cursor:pointer;padding:4px;display:flex;align-items:center;justify-content:center;border-radius:3px}.json-editor-wrapper .expand-btn:hover{background-color:#444;color:#fff}.json-editor-wrapper .editor-main-area{flex:1;display:flex;flex-direction:row;overflow:hidden}.json-editor-wrapper .editor-line-numbers-container{position:relative;width:48px;border-right:1px solid #3c3c3c;background-color:#1e1e1e;overflow:hidden;flex-shrink:0}.json-editor-wrapper .editor-line-numbers{margin:0;position:absolute;top:0;left:0;width:100%;height:100%;padding:12px 8px;font-family:Consolas,Monaco,Courier New,monospace;font-size:13px;line-height:1.5;white-space:pre;color:#858585;text-align:right;box-sizing:border-box;overflow:hidden;-webkit-user-select:none;user-select:none}.json-editor-wrapper .json-editor-container{position:relative;flex:1;overflow:hidden}.json-editor-wrapper .editor-backdrop,.json-editor-wrapper .editor-textarea{margin:0;position:absolute;top:0;left:0;width:100%;height:100%;padding:12px;font-family:Consolas,Monaco,Courier New,monospace;font-size:13px;line-height:1.5;white-space:pre;-moz-tab-size:4;-o-tab-size:4;tab-size:4;border:none;box-sizing:border-box;overflow:auto}.json-editor-wrapper .editor-backdrop{z-index:1;pointer-events:none;color:#d4d4d4;-ms-overflow-style:none;scrollbar-width:none}.json-editor-wrapper .editor-backdrop::-webkit-scrollbar{display:none}.json-editor-wrapper .editor-textarea{z-index:2;background-color:transparent;color:transparent;caret-color:#d4d4d4;resize:none;outline:none}.json-editor-wrapper .editor-textarea::selection{background-color:#264f7880;color:transparent}.json-editor-wrapper .editor-textarea::-webkit-scrollbar{width:10px;height:10px}.json-editor-wrapper .editor-textarea::-webkit-scrollbar-track{background:#1e1e1e}.json-editor-wrapper .editor-textarea::-webkit-scrollbar-thumb{background:#424242;border-radius:5px;border:2px solid #1e1e1e}.json-editor-wrapper .editor-textarea::-webkit-scrollbar-thumb:hover{background:#4f4f4f}.json-editor-wrapper .json-key{color:#9cdcfe}.json-editor-wrapper .json-value-string{color:#ce9178}.json-editor-wrapper .json-value-number{color:#b5cea8}.json-editor-wrapper .json-value-boolean,.json-editor-wrapper .json-value-null{color:#569cd6}\n"]}]}],propDecorators:{jsonString:[{type:c}],jsonStringChange:[{type:b}],backdropElement:[{type:g,args:["backdrop"]}],textareaElement:[{type:g,args:["textarea"]}],lineNumbersElement:[{type:g,args:["lineNumbers"]}]}});class StateWidgetSpyService extends StateService{stateService;constructor(t){super(),this.stateService=t}initialize(t){this.stateService.initialize(t)}createDataSet(t,e,r){return this.stateService.createDataSet(t,e,r)}readDataSet(t){return this.stateService.readDataSet(t)}updateDataSet(t,e,r){return this.stateService.updateDataSet(t,e,r)}deleteRootDataSet(t){this.stateService.deleteRootDataSet(t)}registry(t,e,r){return this.stateService.registry(t,e,r)}resolveProps(t){return this.stateService.resolveProps(t)}getContainerRoot(){return this.stateService.containerRoot}getRegistryMap(){return this.stateService.registryMap}getConf(){return this.stateService.conf}getInitialized(){return this.stateService.initialized}getIntervalId(){return this.stateService.intervalId}getFisicalStorageTypeByJob(){return!(!this.stateService.conf||!this.stateService.conf.asyncEnabled)}getSecretKey(){return this.stateService.getStateKey()}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:StateWidgetSpyService,deps:[{token:StateService}],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:StateWidgetSpyService,providedIn:"root"})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:StateWidgetSpyService,decorators:[{type:r,args:[{providedIn:"root"}]}],ctorParameters:()=>[{type:StateService}]});class StorageTabComponent{widgetSpyService;autoRefresh=!1;autoRefreshInterval;containerRoot=[];registryRows=[];registryGroups=[];registrySearchTerm="";config;isInitialized=!1;fisicalStorageTypeByJob=!1;viewMode="list";targetElement=null;viewData=null;sectionsCollapsed={status:!1,containers:!1,registry:!1};editJsonString="";editError=null;inputKey="";decryptError=null;pendingAction=null;constructor(t){this.widgetSpyService=t}toggleSection(t){this.sectionsCollapsed[t]=!this.sectionsCollapsed[t]}ngOnInit(){this.refreshState()}ngOnDestroy(){this.stopAutoRefresh()}toggleAutoRefresh(){this.autoRefresh?this.startAutoRefresh():this.stopAutoRefresh()}startAutoRefresh(){this.stopAutoRefresh(),this.autoRefreshInterval=setInterval(()=>{"list"===this.viewMode&&this.refreshState()},2e3)}stopAutoRefresh(){this.autoRefreshInterval&&(clearInterval(this.autoRefreshInterval),this.autoRefreshInterval=null)}refreshState(){this.isInitialized=this.widgetSpyService.getInitialized(),this.config=this.widgetSpyService.getConf(),this.containerRoot=this.widgetSpyService.getContainerRoot(),this.fisicalStorageTypeByJob=this.widgetSpyService.getFisicalStorageTypeByJob(),this.parseRegistry(this.widgetSpyService.getRegistryMap())}get filteredRegistryGroups(){if(!this.registrySearchTerm||""===this.registrySearchTerm.trim())return this.registryGroups;const t=this.registrySearchTerm.toLowerCase();return this.registryGroups.map(e=>{if(e.component.toLowerCase().includes(t))return e;const r=e.entries.filter(e=>e.prop.toLowerCase().includes(t)||e.path.toLowerCase().includes(t));return r.length>0?{...e,entries:r}:null}).filter(t=>null!==t)}openView(t){this.targetElement=t,t.encrypt?(this.pendingAction="view",this.viewMode="decrypt",this.inputKey=this.widgetSpyService.getSecretKey()||"",this.decryptError=null):(this.viewData=t.data,this.viewMode="view")}startDelete(t){this.targetElement=t,this.viewMode="delete"}confirmDelete(){this.targetElement&&(this.widgetSpyService.deleteRootDataSet(this.targetElement.name),this.cancelAction(),this.refreshState())}startEdit(t){this.targetElement=t,t.encrypt?(this.pendingAction="edit",this.viewMode="decrypt",this.inputKey=this.widgetSpyService.getSecretKey()||"",this.decryptError=null):(this.viewMode="edit",this.editJsonString=JSON.stringify(t.data,null,4),this.editError=null)}verifyKey(){if(this.targetElement&&this.inputKey)try{const t=P.AES.decrypt(this.targetElement.data,this.inputKey).toString(P.enc.Utf8);if(!t)throw new Error("Malformed key or data");const e=JSON.parse(t);"view"===this.pendingAction?(this.viewMode="view",this.viewData=e):(this.viewMode="edit",this.editJsonString=JSON.stringify(e,null,4),this.editError=null)}catch(t){this.decryptError="Invalid Key or Corrupted Data"}}saveEdit(){if(this.targetElement)try{const t=JSON.parse(this.editJsonString);let e=!1;Object.keys(t).forEach(r=>{this.widgetSpyService.updateDataSet(`${this.targetElement.name}.${r}`,t[r])||(e=!0)}),e?this.editError="Failed to update some fields. Please check the console/logs.":(this.cancelAction(),this.refreshState())}catch(t){this.editError="Invalid JSON: "+t.message}}cancelAction(){this.viewMode="list",this.targetElement=null,this.viewData=null,this.editJsonString="",this.editError=null,this.inputKey="",this.decryptError=null,this.pendingAction=null}parseRegistry(t){this.registryRows=[],this.registryGroups=[];const e=new Map;t.forEach((t,r)=>{const n=r.match(/\[([^\]]+)\]<([^>]+)>;(.+)/);let o;o=n?{component:n[1],prop:n[2],path:n[3]}:{component:"Unknown",prop:r,path:"Unknown"},this.registryRows.push(o),e.has(o.component)||e.set(o.component,[]),e.get(o.component).push(o)});const r=Array.from(e.keys()).sort((t,e)=>t.localeCompare(e));this.registryGroups=r.map(t=>({component:t,entries:e.get(t).sort((t,e)=>t.prop.localeCompare(e.prop))})),this.registryRows.sort((t,e)=>t.component.localeCompare(e.component))}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:StorageTabComponent,deps:[{token:StateWidgetSpyService}],target:t.ɵɵFactoryTarget.Component});static ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"20.3.18",type:StorageTabComponent,isStandalone:!0,selector:"asor-storage-tab",ngImport:t,template:'<div class="state-dashboard">\r\n\t\x3c!-- Header Stats --\x3e\r\n\t<div class="section-container header-section">\r\n\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.status">\r\n\t\t\t<div class="dashboard-header">\r\n\t\t\t\t<div class="stat-card" [class.active]="isInitialized">\r\n\t\t\t\t\t<div class="label">Initialized</div>\r\n\t\t\t\t\t<div class="value">{{ isInitialized ? \'YES\' : \'NO\' }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Sync Interval</div>\r\n\t\t\t\t\t<div class="value">{{ fisicalStorageTypeByJob ? \'Job\' : \'On Change\' }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card" *ngIf="config">\r\n\t\t\t\t\t<div class="label">Encryption</div>\r\n\t\t\t\t\t<div class="value">{{ config.encryptionType }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Data Elements</div>\r\n\t\t\t\t\t<div class="value">{{ containerRoot.length }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Registry Entries</div>\r\n\t\t\t\t\t<div class="value">{{ registryRows.length }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div class="header-toolbar">\r\n\t\t\t\x3c!-- <div class="auto-refresh-toggle" title="Auto Refresh State (5s)">\r\n\t\t\t\t<input\r\n\t\t\t\t\tid="autoRefresh"\r\n\t\t\t\t\t[(ngModel)]="autoRefresh"\r\n\t\t\t\t\t(change)="toggleAutoRefresh()"\r\n\t\t\t\t\ttype="checkbox"\r\n\t\t\t\t/>\r\n\t\t\t\t<label for="autoRefresh">Auto Refresh</label>\r\n\t\t\t</div> --\x3e\r\n\t\t\t<button\r\n\t\t\t\tclass="circle-c-btn"\r\n\t\t\t\t(click)="refreshState(); $event.stopPropagation()"\r\n\t\t\t\ttitle="Refresh State"\r\n\t\t\t>\r\n\t\t\t\t↻\r\n\t\t\t</button>\r\n\t\t\t<button\r\n\t\t\t\tclass="circle-c-btn"\r\n\t\t\t\t[class.collapsed]="sectionsCollapsed.status"\r\n\t\t\t\t(click)="toggleSection(\'status\')"\r\n\t\t\t\ttitle="Toggle Status"\r\n\t\t\t>\r\n\t\t\t\t▾\r\n\t\t\t</button>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<div class="dashboard-content">\r\n\t\t<div class="split-view">\r\n\t\t\t\x3c!-- Data Elements Section --\x3e\r\n\t\t\t<div class="section-container">\r\n\t\t\t\t<h4 class="section-title" (click)="toggleSection(\'containers\')">\r\n\t\t\t\t\t<span>Data Containers</span>\r\n\t\t\t\t\t<span class="collapse-icon" [class.collapsed]="sectionsCollapsed.containers"\r\n\t\t\t\t\t\t>▾</span\r\n\t\t\t\t\t>\r\n\t\t\t\t</h4>\r\n\t\t\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.containers">\r\n\t\t\t\t\t<ng-container [ngSwitch]="viewMode">\r\n\t\t\t\t\t\t\x3c!-- LIST MODE --\x3e\r\n\t\t\t\t\t\t<ng-container *ngSwitchCase="\'list\'">\r\n\t\t\t\t\t\t\t<div class="data-grid" *ngIf="containerRoot.length > 0; else noData">\r\n\t\t\t\t\t\t\t\t<div class="data-card" *ngFor="let element of containerRoot">\r\n\t\t\t\t\t\t\t\t\t<div class="card-header">\r\n\t\t\t\t\t\t\t\t\t\t<div class="header-left">\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="element-name"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="startEdit(element)"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Click to Edit"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>{{ element.name }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="store-badge"\r\n\t\t\t\t\t\t\t\t\t\t\t\t[ngClass]="element.storeType.toLowerCase()"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>{{ element.storeType }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t<div class="header-actions">\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="action-btn edit"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="startEdit(element)"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Edit"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="action-btn delete"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="startDelete(element)"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Delete"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<polyline points="3 6 5 6 21 6"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2-2v2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="10" y1="11" x2="10" y2="17"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="14" y1="11" x2="14" y2="17"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\t\tclass="card-body"\r\n\t\t\t\t\t\t\t\t\t\t(click)="openView(element)"\r\n\t\t\t\t\t\t\t\t\t\ttitle="Click to View"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<asor-json-view [data]="element.data"></asor-json-view>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<div class="card-footer">\r\n\t\t\t\t\t\t\t\t\t\t<span class="update-time"\r\n\t\t\t\t\t\t\t\t\t\t\t>Updated:\r\n\t\t\t\t\t\t\t\t\t\t\t{{ element.lastUpdate | date: \'mediumTime\' }}</span\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<div class="flags">\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Reads"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstyle="\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmargin-right: 8px;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: inline-flex;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talign-items: center;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tgap: 4px;\r\n\t\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg read"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<circle cx="12" cy="12" r="3"></circle>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{{ element.readCount || 0 }}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Writes"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstyle="\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmargin-right: 8px;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: inline-flex;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talign-items: center;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tgap: 4px;\r\n\t\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg write"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<polyline\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpoints="17 21 17 13 7 13 7 21"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<polyline points="7 3 7 8 15 8"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{{ element.writeCount || 0 }}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\t*ngIf="element.encrypt"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Encrypted"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstyle="display: inline-flex; align-items: center"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg lock"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<rect\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tx="3"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ty="11"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth="18"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\theight="11"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trx="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\try="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></rect>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path d="M7 11V7a5 5 0 0 1 10 0v4"></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\t*ngIf="element.freeze"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Frozen"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstyle="display: inline-flex; align-items: center"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg freeze"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="2" y1="2" x2="22" y2="22"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="12" y1="2" x2="12" y2="22"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="22" y1="2" x2="2" y2="22"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="2" y1="12" x2="22" y2="12"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<ng-template #noData>\r\n\t\t\t\t\t\t\t\t<div class="empty-state">\r\n\t\t\t\t\t\t\t\t\tNo data elements found in StateService.\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t</ng-container>\r\n\r\n\t\t\t\t\t\t\x3c!-- VIEW MODE --\x3e\r\n\t\t\t\t\t\t<div class="inline-view" *ngSwitchCase="\'view\'">\r\n\t\t\t\t\t\t\t<div class="view-header">\r\n\t\t\t\t\t\t\t\t<h3>\r\n\t\t\t\t\t\t\t\t\tView Dataset:\r\n\t\t\t\t\t\t\t\t\t<span class="highlight">{{ targetElement?.name }}</span>\r\n\t\t\t\t\t\t\t\t</h3>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-body data-panel">\r\n\t\t\t\t\t\t\t\t<asor-json-view\r\n\t\t\t\t\t\t\t\t\t[data]="viewData"\r\n\t\t\t\t\t\t\t\t\t[expandDepth]="1"\r\n\t\t\t\t\t\t\t\t></asor-json-view>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-footer">\r\n\t\t\t\t\t\t\t\t<button class="btn-cancel" (click)="cancelAction()">Back</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\x3c!-- EDIT MODE --\x3e\r\n\t\t\t\t\t\t<div class="inline-view" *ngSwitchCase="\'edit\'">\r\n\t\t\t\t\t\t\t<div class="view-header">\r\n\t\t\t\t\t\t\t\t<h3>\r\n\t\t\t\t\t\t\t\t\tEdit Dataset:\r\n\t\t\t\t\t\t\t\t\t<span class="highlight">{{ targetElement?.name }}</span>\r\n\t\t\t\t\t\t\t\t</h3>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-body">\r\n\t\t\t\t\t\t\t\t<asor-json-editor\r\n\t\t\t\t\t\t\t\t\t[(jsonString)]="editJsonString"\r\n\t\t\t\t\t\t\t\t></asor-json-editor>\r\n\t\t\t\t\t\t\t\t<div class="error-msg" *ngIf="editError">{{ editError }}</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-footer">\r\n\t\t\t\t\t\t\t\t<button class="btn-cancel" (click)="cancelAction()">Cancel</button>\r\n\t\t\t\t\t\t\t\t<button class="btn-save" (click)="saveEdit()">Save Changes</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\x3c!-- DECRYPT MODE --\x3e\r\n\t\t\t\t\t\t<div class="inline-view centered" *ngSwitchCase="\'decrypt\'">\r\n\t\t\t\t\t\t\t<div class="view-header">\r\n\t\t\t\t\t\t\t\t<h3>\r\n\t\t\t\t\t\t\t\t\tDecrypt Dataset:\r\n\t\t\t\t\t\t\t\t\t<span class="highlight">{{ targetElement?.name }}</span>\r\n\t\t\t\t\t\t\t\t</h3>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-body">\r\n\t\t\t\t\t\t\t\t<p class="instruction">\r\n\t\t\t\t\t\t\t\t\tThis dataset is encrypted. Please enter the key to unlock it.\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\tclass="key-input"\r\n\t\t\t\t\t\t\t\t\t[(ngModel)]="inputKey"\r\n\t\t\t\t\t\t\t\t\t(keydown.enter)="verifyKey()"\r\n\t\t\t\t\t\t\t\t\ttype="password"\r\n\t\t\t\t\t\t\t\t\tplaceholder="Enter Decryption Key"\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t<div class="error-msg" *ngIf="decryptError">{{ decryptError }}</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-footer">\r\n\t\t\t\t\t\t\t\t<button class="btn-cancel" (click)="cancelAction()">Cancel</button>\r\n\t\t\t\t\t\t\t\t<button class="btn-save" (click)="verifyKey()">Unlock</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\x3c!-- DELETE MODE --\x3e\r\n\t\t\t\t\t\t<div class="inline-view centered" *ngSwitchCase="\'delete\'">\r\n\t\t\t\t\t\t\t<div class="view-header">\r\n\t\t\t\t\t\t\t\t<h3>Delete Dataset</h3>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-body">\r\n\t\t\t\t\t\t\t\t<p class="confirmation-text">\r\n\t\t\t\t\t\t\t\t\tAre you sure you want to delete\r\n\t\t\t\t\t\t\t\t\t<span class="highlight">{{ targetElement?.name }}</span\r\n\t\t\t\t\t\t\t\t\t>?\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t\t<p class="warning-text">This action cannot be undone.</p>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-footer">\r\n\t\t\t\t\t\t\t\t<button class="btn-cancel" (click)="cancelAction()">Cancel</button>\r\n\t\t\t\t\t\t\t\t<button class="btn-delete-confirm" (click)="confirmDelete()">\r\n\t\t\t\t\t\t\t\t\tDelete\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</ng-container>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t\x3c!-- Registry Section --\x3e\r\n\t\t\t<div class="section-container">\r\n\t\t\t\t<h4 class="section-title" (click)="toggleSection(\'registry\')">\r\n\t\t\t\t\t<span>Component Registry</span>\r\n\t\t\t\t\t<span class="collapse-icon" [class.collapsed]="sectionsCollapsed.registry"\r\n\t\t\t\t\t\t>▾</span\r\n\t\t\t\t\t>\r\n\t\t\t\t</h4>\r\n\t\t\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.registry">\r\n\t\t\t\t\t<div class="registry-toolbar">\r\n\t\t\t\t\t\t<div class="search-container">\r\n\t\t\t\t\t\t\t<span class="search-icon">\r\n\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<circle cx="11" cy="11" r="8"></circle>\r\n\t\t\t\t\t\t\t\t\t<line x1="21" y1="21" x2="16.65" y2="16.65"></line>\r\n\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\tclass="registry-search"\r\n\t\t\t\t\t\t\t\t[(ngModel)]="registrySearchTerm"\r\n\t\t\t\t\t\t\t\ttype="text"\r\n\t\t\t\t\t\t\t\tplaceholder="Filter by component, prop or path..."\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tclass="clear-search-btn"\r\n\t\t\t\t\t\t\t\t*ngIf="registrySearchTerm"\r\n\t\t\t\t\t\t\t\t(click)="registrySearchTerm = \'\'"\r\n\t\t\t\t\t\t\t\ttitle="Clear search"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t×\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class="registry-table-container">\r\n\t\t\t\t\t\t<ng-container *ngIf="filteredRegistryGroups.length > 0; else emptyRegistry">\r\n\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\tclass="registry-group"\r\n\t\t\t\t\t\t\t\t*ngFor="let group of filteredRegistryGroups"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<div class="registry-group-header">\r\n\t\t\t\t\t\t\t\t\t<span class="comp-icon">\r\n\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<polygon points="12 2 2 7 12 12 22 7 12 2"></polygon>\r\n\t\t\t\t\t\t\t\t\t\t\t<polyline points="2 17 12 22 22 17"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t<polyline points="2 12 12 17 22 12"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t<span class="comp-name">{{ group.component }}</span>\r\n\t\t\t\t\t\t\t\t\t<span class="comp-count"\r\n\t\t\t\t\t\t\t\t\t\t>{{ group.entries.length }} prop{{\r\n\t\t\t\t\t\t\t\t\t\t\tgroup.entries.length > 1 ? \'s\' : \'\'\r\n\t\t\t\t\t\t\t\t\t\t}}</span\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t<div class="registry-list">\r\n\t\t\t\t\t\t\t\t\t<div class="registry-item" *ngFor="let row of group.entries">\r\n\t\t\t\t\t\t\t\t\t\t<span class="prop-badge">{{ row.prop }}</span>\r\n\t\t\t\t\t\t\t\t\t\t<span class="path-text">{{ row.path }}</span>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</ng-container>\r\n\r\n\t\t\t\t\t\t<ng-template #emptyRegistry>\r\n\t\t\t\t\t\t\t<div class="empty-state">\r\n\t\t\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\t\t\tregistrySearchTerm\r\n\t\t\t\t\t\t\t\t\t\t? \'No components match the filter.\'\r\n\t\t\t\t\t\t\t\t\t\t: \'No registered components.\'\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n',styles:[".state-dashboard{display:flex;flex-direction:column;height:100%;color:#ccc;font-family:Segoe UI,sans-serif;gap:6px}.state-dashboard .dashboard-header{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.state-dashboard .dashboard-header .stat-card{background-color:#252526;border:1px solid #333;border-radius:6px;padding:8px 12px;min-width:100px;display:flex;flex-direction:column;align-items:center}.state-dashboard .dashboard-header .stat-card .label{font-size:10px;color:#888;text-transform:uppercase;letter-spacing:.5px}.state-dashboard .dashboard-header .stat-card .value{font-size:14px;font-weight:600;color:#eee;margin-top:2px}.state-dashboard .dashboard-header .stat-card.active .value{color:#4caf50}.state-dashboard .dashboard-content{flex:1;overflow-y:auto;padding-right:5px}.state-dashboard .dashboard-content .split-view{display:flex;gap:20px;height:100%}.state-dashboard .dashboard-content .section-container{display:flex;flex-direction:column;overflow:hidden;border:1px solid #333;border-radius:6px;margin-bottom:20px;flex:1;min-width:0}@media (max-width: 768px){.state-dashboard .dashboard-content .split-view{flex-direction:column;height:auto}.state-dashboard .dashboard-content .section-container{flex:none}}.state-dashboard .dashboard-content .section-title{margin:4px 8px;font-size:13px;color:#888;font-weight:600;display:flex;justify-content:space-between;align-items:center;cursor:pointer;border-radius:4px}.state-dashboard .dashboard-content .section-title:hover{background-color:#2a2a2a}.state-dashboard .dashboard-content .section-title .collapse-icon{font-size:14px;transition:transform .25s ease}.state-dashboard .dashboard-content .section-title .collapse-icon.collapsed{transform:rotate(-90deg)}.state-dashboard .dashboard-content .section-title.mt-4{margin-top:20px}.state-dashboard .dashboard-content .data-grid{overflow-y:auto;flex:1;padding:5px;display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px;align-content:start}.state-dashboard .dashboard-content .data-card{background-color:#1e1e1e;border:1px solid #333;border-radius:6px;overflow:hidden;display:flex;flex-direction:column;height:max-content;margin:5px}.state-dashboard .dashboard-content .data-card:hover{border-color:#007acc}.state-dashboard .dashboard-content .data-card .card-header{background-color:#252526;padding:8px 12px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #333}.state-dashboard .dashboard-content .data-card .card-header .element-name{font-weight:600;color:#dcdcaa}.state-dashboard .dashboard-content .data-card .card-header .store-badge{font-size:10px;padding:2px 6px;border-radius:4px;font-weight:600}.state-dashboard .dashboard-content .data-card .card-header .store-badge.session{background-color:#0e639c33;color:#4fc1ff}.state-dashboard .dashboard-content .data-card .card-header .store-badge.local{background-color:#60ac3933;color:#b5cea8}.state-dashboard .dashboard-content .data-card .card-body{padding:10px;max-height:200px;overflow-y:auto;font-family:monospace;font-size:12px}.state-dashboard .dashboard-content .data-card .card-footer{padding:6px 12px;background-color:#252526;font-size:11px;color:#666;display:flex;justify-content:space-between;align-items:center;border-top:1px solid #333}.state-dashboard .dashboard-content .data-card .card-footer .flags{display:flex;gap:6px}.state-dashboard .dashboard-content .registry-toolbar{padding:8px 10px;background-color:#252526;border-bottom:1px solid #333;border-radius:4px}.state-dashboard .dashboard-content .registry-toolbar .search-container{position:relative;display:flex;align-items:center;background-color:#1e1e1e;border:1px solid #3c3c3c;border-radius:4px}.state-dashboard .dashboard-content .registry-toolbar .search-container:focus-within{border-color:#007acc}.state-dashboard .dashboard-content .registry-toolbar .search-container .search-icon{padding:0 8px;color:#888;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-toolbar .search-container .registry-search{flex:1;background:transparent;border:none;color:#d4d4d4;padding:6px 0;font-size:13px;font-family:inherit;outline:none}.state-dashboard .dashboard-content .registry-toolbar .search-container .registry-search::placeholder{color:#666}.state-dashboard .dashboard-content .registry-toolbar .search-container .clear-search-btn{background:transparent;border:none;color:#888;padding:0 8px;cursor:pointer;font-size:16px;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-toolbar .search-container .clear-search-btn:hover{color:#ccc}.state-dashboard .dashboard-content .registry-table-container{overflow-y:auto;flex:1;padding:2px 5px 20px}.state-dashboard .dashboard-content .registry-table-container .registry-group{margin-bottom:16px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header{display:flex;align-items:center;gap:8px;padding:6px 12px;background-color:#252526;border-top:1px solid #333;border-bottom:1px solid #333;border-radius:4px;position:sticky;top:0;z-index:10}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-icon{color:#4ec9b0;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-name{color:#4ec9b0;font-weight:600;font-size:13px;flex:1}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-count{font-size:11px;color:#888;background:#ffffff0d;padding:2px 6px;border-radius:10px}.state-dashboard .dashboard-content .registry-table-container .registry-list{display:flex;flex-direction:column}.state-dashboard .dashboard-content .registry-table-container .registry-list .registry-item{display:flex;align-items:flex-start;padding:8px 12px 8px 36px;border-bottom:1px solid #333;font-size:12px}.state-dashboard .dashboard-content .registry-table-container .registry-list .registry-item:last-child{border-bottom:none}.state-dashboard .dashboard-content .registry-table-container .registry-list .registry-item .prop-badge{background-color:#9cdcfe26;color:#9cdcfe;padding:2px 6px;border-radius:4px;font-family:monospace;margin-right:8px;white-space:nowrap;font-weight:600}.state-dashboard .dashboard-content .registry-table-container .registry-list .registry-item .path-text{color:#ce9178;font-family:monospace;word-break:break-all;margin-top:2px}.state-dashboard .dashboard-content .empty-state{padding:20px;text-align:center;color:#666;font-style:italic}.state-dashboard .header-toolbar{display:flex;justify-content:flex-end;gap:6px;padding:4px 8px}.state-dashboard .header-toolbar .circle-c-btn{background:none;border:1px solid #444;color:#ccc;cursor:pointer;width:30px;height:30px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s}.state-dashboard .header-toolbar .circle-c-btn:hover{background-color:#333}.state-dashboard .header-toolbar .circle-c-btn:active{background-color:#444;transform:scale(.95)}.state-dashboard .header-toolbar .circle-c-btn.collapsed{transform:rotate(-90deg)}.state-dashboard .header-toolbar .auto-refresh-toggle{display:flex;align-items:center;gap:6px;background:#ffffff0d;border:1px solid #444;border-radius:15px;padding:2px 10px;height:30px;margin-right:4px;transition:all .2s}.state-dashboard .header-toolbar .auto-refresh-toggle:hover{background-color:#ffffff1a;border-color:#666}.state-dashboard .header-toolbar .auto-refresh-toggle input[type=checkbox]{cursor:pointer;width:14px;height:14px;accent-color:#007acc;margin:0}.state-dashboard .header-toolbar .auto-refresh-toggle label{font-size:11px;color:#888;cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.state-dashboard .header-toolbar .auto-refresh-toggle:has(input:checked){border-color:#007acc;background-color:#007acc1a}.state-dashboard .header-toolbar .auto-refresh-toggle:has(input:checked) label{color:#007acc;font-weight:600}.state-dashboard .header-section{flex-shrink:0;display:flex;flex-direction:row;align-items:flex-start;border-radius:6px;background-color:#1e1e1e;overflow:hidden}.state-dashboard .header-section .section-body{flex:1;min-width:0;padding:5px;transition:opacity .25s ease}.state-dashboard .header-section .section-body.collapsed{padding:0;margin:0;max-height:0;opacity:0}@media (max-width: 768px){.state-dashboard .header-section{display:unset}}.state-dashboard .section-title{display:flex;justify-content:space-between;align-items:center;margin-top:0;margin-bottom:2px}.state-dashboard .section-title .collapse-icon{display:none}.state-dashboard .section-body{padding:5px;flex:1;display:flex;flex-direction:column;overflow:hidden;min-height:0;max-height:2000px;transition:max-height .35s ease,opacity .25s ease;opacity:1}.state-dashboard .section-body.collapsed{padding:0;margin:0;max-height:0;opacity:0}@media (max-width: 768px){.state-dashboard .section-title{cursor:pointer;-webkit-user-select:none;user-select:none;padding:8px 4px;border-radius:4px;transition:background-color .2s}.state-dashboard .section-title:hover{background-color:#2a2a2a}.state-dashboard .section-title .collapse-icon{display:inline-block;font-size:14px;transition:transform .25s ease}.state-dashboard .section-title .collapse-icon.collapsed{transform:rotate(-90deg)}}.state-dashboard .card-header .header-left{display:flex;align-items:center;gap:8px}.state-dashboard .card-header .header-left .element-name{cursor:pointer}.state-dashboard .card-header .header-left .element-name:hover{text-decoration:underline;color:#4fc1ff}.state-dashboard .card-header .header-actions{display:flex;gap:4px}.state-dashboard .card-header .header-actions .action-btn{background:none;border:none;cursor:pointer;font-size:14px;padding:2px 4px;border-radius:4px;transition:background-color .2s}.state-dashboard .card-header .header-actions .action-btn:hover{background-color:#ffffff1a}.state-dashboard .card-header .header-actions .action-btn.delete:hover{background-color:#f4877133}.state-dashboard .card-body{cursor:pointer;transition:background-color .2s}.state-dashboard .card-body:hover{background-color:#252526}.icon-svg{vertical-align:middle}.icon-svg.read{color:#4ec9b0}.icon-svg.write{color:#ce9178}.icon-svg.lock{color:#dcdcaa}.icon-svg.freeze{color:#569cd6}.inline-view{display:flex;flex-direction:column;flex:1;min-height:0;padding:0 16px 16px;background-color:transparent;color:#ccc}.inline-view.centered{align-items:center;justify-content:center;text-align:center}.inline-view .view-header{margin-bottom:16px}.inline-view .view-header h3{margin:0;font-size:1.1rem;color:#d4d4d4}.inline-view .view-header h3 .highlight{color:#4ec9b0;font-family:Consolas,Monaco,monospace}.inline-view .view-body{flex:1;width:100%;display:flex;flex-direction:column;min-height:0;overflow:hidden;margin-bottom:10px}.inline-view .view-body.data-panel{overflow:auto;background-color:#1e1e1e;border:1px solid #3c3c3c;border-radius:4px}.inline-view .view-body .json-editor{flex:1;width:100%;background-color:#1e1e1e;color:#d4d4d4;border:1px solid #3c3c3c;border-radius:4px;padding:12px;font-family:Consolas,Monaco,monospace;font-size:13px;resize:none;outline:none}.inline-view .view-body .json-editor:focus{border-color:#007acc}.inline-view .view-body .instruction{margin-bottom:12px;color:#ccc}.inline-view .view-body .key-input{width:100%;max-width:300px;margin:0 auto;padding:8px 12px;background-color:#252526;border:1px solid #3c3c3c;border-radius:4px;color:#d4d4d4;font-size:14px}.inline-view .view-body .key-input:focus{border-color:#007acc;outline:none}.inline-view .view-body .confirmation-text{font-size:1.1rem;margin-bottom:8px}.inline-view .view-body .confirmation-text .highlight{color:#ce9178;font-weight:700}.inline-view .view-body .warning-text{color:#d16969;font-size:.9rem}.inline-view .view-body .error-msg{color:#f14c4c;margin-top:8px;font-size:.9em}.inline-view .view-footer{display:flex;justify-content:flex-end;gap:12px}.centered .inline-view .view-footer{justify-content:center}.inline-view .view-footer button{padding:6px 16px;border-radius:4px;border:none;cursor:pointer;font-size:13px;transition:background-color .2s}.inline-view .view-footer button.btn-cancel{background-color:#3c3c3c;color:#ccc}.inline-view .view-footer button.btn-cancel:hover{background-color:#4c4c4c}.inline-view .view-footer button.btn-save{background-color:#007acc;color:#fff}.inline-view .view-footer button.btn-save:hover{background-color:#0062a3}.inline-view .view-footer button.btn-delete-confirm{background-color:#ce9178;color:#1e1e1e;font-weight:500}.inline-view .view-footer button.btn-delete-confirm:hover{background-color:#b87b66}:host{display:block;height:100%}:host *::-webkit-scrollbar{width:8px;height:8px}:host *::-webkit-scrollbar-track{background:#1e1e1e;border-radius:4px}:host *::-webkit-scrollbar-thumb{background:#444;border-radius:4px}:host *::-webkit-scrollbar-thumb:hover{background:#555}\n"],dependencies:[{kind:"ngmodule",type:w},{kind:"directive",type:m.NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:m.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:m.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:m.NgSwitch,selector:"[ngSwitch]",inputs:["ngSwitch"]},{kind:"directive",type:m.NgSwitchCase,selector:"[ngSwitchCase]",inputs:["ngSwitchCase"]},{kind:"component",type:JsonViewComponent,selector:"asor-json-view",inputs:["data","key","level","expandDepth"]},{kind:"ngmodule",type:F},{kind:"directive",type:H.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:H.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:H.NgModel,selector:"[ngModel]:not([formControlName]):not([formControl])",inputs:["name","disabled","ngModel","ngModelOptions"],outputs:["ngModelChange"],exportAs:["ngModel"]},{kind:"component",type:JsonEditorComponent,selector:"asor-json-editor",inputs:["jsonString"],outputs:["jsonStringChange"]},{kind:"pipe",type:m.DatePipe,name:"date"}],encapsulation:t.ViewEncapsulation.ShadowDom})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:StorageTabComponent,decorators:[{type:p,args:[{selector:"asor-storage-tab",standalone:!0,imports:[w,JsonViewComponent,F,JsonEditorComponent],encapsulation:d.ShadowDom,template:'<div class="state-dashboard">\r\n\t\x3c!-- Header Stats --\x3e\r\n\t<div class="section-container header-section">\r\n\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.status">\r\n\t\t\t<div class="dashboard-header">\r\n\t\t\t\t<div class="stat-card" [class.active]="isInitialized">\r\n\t\t\t\t\t<div class="label">Initialized</div>\r\n\t\t\t\t\t<div class="value">{{ isInitialized ? \'YES\' : \'NO\' }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Sync Interval</div>\r\n\t\t\t\t\t<div class="value">{{ fisicalStorageTypeByJob ? \'Job\' : \'On Change\' }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card" *ngIf="config">\r\n\t\t\t\t\t<div class="label">Encryption</div>\r\n\t\t\t\t\t<div class="value">{{ config.encryptionType }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Data Elements</div>\r\n\t\t\t\t\t<div class="value">{{ containerRoot.length }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Registry Entries</div>\r\n\t\t\t\t\t<div class="value">{{ registryRows.length }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div class="header-toolbar">\r\n\t\t\t\x3c!-- <div class="auto-refresh-toggle" title="Auto Refresh State (5s)">\r\n\t\t\t\t<input\r\n\t\t\t\t\tid="autoRefresh"\r\n\t\t\t\t\t[(ngModel)]="autoRefresh"\r\n\t\t\t\t\t(change)="toggleAutoRefresh()"\r\n\t\t\t\t\ttype="checkbox"\r\n\t\t\t\t/>\r\n\t\t\t\t<label for="autoRefresh">Auto Refresh</label>\r\n\t\t\t</div> --\x3e\r\n\t\t\t<button\r\n\t\t\t\tclass="circle-c-btn"\r\n\t\t\t\t(click)="refreshState(); $event.stopPropagation()"\r\n\t\t\t\ttitle="Refresh State"\r\n\t\t\t>\r\n\t\t\t\t↻\r\n\t\t\t</button>\r\n\t\t\t<button\r\n\t\t\t\tclass="circle-c-btn"\r\n\t\t\t\t[class.collapsed]="sectionsCollapsed.status"\r\n\t\t\t\t(click)="toggleSection(\'status\')"\r\n\t\t\t\ttitle="Toggle Status"\r\n\t\t\t>\r\n\t\t\t\t▾\r\n\t\t\t</button>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<div class="dashboard-content">\r\n\t\t<div class="split-view">\r\n\t\t\t\x3c!-- Data Elements Section --\x3e\r\n\t\t\t<div class="section-container">\r\n\t\t\t\t<h4 class="section-title" (click)="toggleSection(\'containers\')">\r\n\t\t\t\t\t<span>Data Containers</span>\r\n\t\t\t\t\t<span class="collapse-icon" [class.collapsed]="sectionsCollapsed.containers"\r\n\t\t\t\t\t\t>▾</span\r\n\t\t\t\t\t>\r\n\t\t\t\t</h4>\r\n\t\t\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.containers">\r\n\t\t\t\t\t<ng-container [ngSwitch]="viewMode">\r\n\t\t\t\t\t\t\x3c!-- LIST MODE --\x3e\r\n\t\t\t\t\t\t<ng-container *ngSwitchCase="\'list\'">\r\n\t\t\t\t\t\t\t<div class="data-grid" *ngIf="containerRoot.length > 0; else noData">\r\n\t\t\t\t\t\t\t\t<div class="data-card" *ngFor="let element of containerRoot">\r\n\t\t\t\t\t\t\t\t\t<div class="card-header">\r\n\t\t\t\t\t\t\t\t\t\t<div class="header-left">\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="element-name"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="startEdit(element)"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Click to Edit"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>{{ element.name }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="store-badge"\r\n\t\t\t\t\t\t\t\t\t\t\t\t[ngClass]="element.storeType.toLowerCase()"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>{{ element.storeType }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t<div class="header-actions">\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="action-btn edit"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="startEdit(element)"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Edit"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="action-btn delete"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="startDelete(element)"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Delete"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<polyline points="3 6 5 6 21 6"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2-2v2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="10" y1="11" x2="10" y2="17"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="14" y1="11" x2="14" y2="17"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\t\tclass="card-body"\r\n\t\t\t\t\t\t\t\t\t\t(click)="openView(element)"\r\n\t\t\t\t\t\t\t\t\t\ttitle="Click to View"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<asor-json-view [data]="element.data"></asor-json-view>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<div class="card-footer">\r\n\t\t\t\t\t\t\t\t\t\t<span class="update-time"\r\n\t\t\t\t\t\t\t\t\t\t\t>Updated:\r\n\t\t\t\t\t\t\t\t\t\t\t{{ element.lastUpdate | date: \'mediumTime\' }}</span\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<div class="flags">\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Reads"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstyle="\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmargin-right: 8px;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: inline-flex;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talign-items: center;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tgap: 4px;\r\n\t\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg read"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<circle cx="12" cy="12" r="3"></circle>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{{ element.readCount || 0 }}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Writes"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstyle="\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmargin-right: 8px;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: inline-flex;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talign-items: center;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tgap: 4px;\r\n\t\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg write"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<polyline\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpoints="17 21 17 13 7 13 7 21"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<polyline points="7 3 7 8 15 8"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{{ element.writeCount || 0 }}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\t*ngIf="element.encrypt"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Encrypted"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstyle="display: inline-flex; align-items: center"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg lock"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<rect\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tx="3"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ty="11"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth="18"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\theight="11"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trx="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\try="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></rect>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path d="M7 11V7a5 5 0 0 1 10 0v4"></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\t\t*ngIf="element.freeze"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Frozen"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstyle="display: inline-flex; align-items: center"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass="icon-svg freeze"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="2" y1="2" x2="22" y2="22"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="12" y1="2" x2="12" y2="22"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="22" y1="2" x2="2" y2="22"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<line x1="2" y1="12" x2="22" y2="12"></line>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<ng-template #noData>\r\n\t\t\t\t\t\t\t\t<div class="empty-state">\r\n\t\t\t\t\t\t\t\t\tNo data elements found in StateService.\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t</ng-container>\r\n\r\n\t\t\t\t\t\t\x3c!-- VIEW MODE --\x3e\r\n\t\t\t\t\t\t<div class="inline-view" *ngSwitchCase="\'view\'">\r\n\t\t\t\t\t\t\t<div class="view-header">\r\n\t\t\t\t\t\t\t\t<h3>\r\n\t\t\t\t\t\t\t\t\tView Dataset:\r\n\t\t\t\t\t\t\t\t\t<span class="highlight">{{ targetElement?.name }}</span>\r\n\t\t\t\t\t\t\t\t</h3>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-body data-panel">\r\n\t\t\t\t\t\t\t\t<asor-json-view\r\n\t\t\t\t\t\t\t\t\t[data]="viewData"\r\n\t\t\t\t\t\t\t\t\t[expandDepth]="1"\r\n\t\t\t\t\t\t\t\t></asor-json-view>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-footer">\r\n\t\t\t\t\t\t\t\t<button class="btn-cancel" (click)="cancelAction()">Back</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\x3c!-- EDIT MODE --\x3e\r\n\t\t\t\t\t\t<div class="inline-view" *ngSwitchCase="\'edit\'">\r\n\t\t\t\t\t\t\t<div class="view-header">\r\n\t\t\t\t\t\t\t\t<h3>\r\n\t\t\t\t\t\t\t\t\tEdit Dataset:\r\n\t\t\t\t\t\t\t\t\t<span class="highlight">{{ targetElement?.name }}</span>\r\n\t\t\t\t\t\t\t\t</h3>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-body">\r\n\t\t\t\t\t\t\t\t<asor-json-editor\r\n\t\t\t\t\t\t\t\t\t[(jsonString)]="editJsonString"\r\n\t\t\t\t\t\t\t\t></asor-json-editor>\r\n\t\t\t\t\t\t\t\t<div class="error-msg" *ngIf="editError">{{ editError }}</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-footer">\r\n\t\t\t\t\t\t\t\t<button class="btn-cancel" (click)="cancelAction()">Cancel</button>\r\n\t\t\t\t\t\t\t\t<button class="btn-save" (click)="saveEdit()">Save Changes</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\x3c!-- DECRYPT MODE --\x3e\r\n\t\t\t\t\t\t<div class="inline-view centered" *ngSwitchCase="\'decrypt\'">\r\n\t\t\t\t\t\t\t<div class="view-header">\r\n\t\t\t\t\t\t\t\t<h3>\r\n\t\t\t\t\t\t\t\t\tDecrypt Dataset:\r\n\t\t\t\t\t\t\t\t\t<span class="highlight">{{ targetElement?.name }}</span>\r\n\t\t\t\t\t\t\t\t</h3>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-body">\r\n\t\t\t\t\t\t\t\t<p class="instruction">\r\n\t\t\t\t\t\t\t\t\tThis dataset is encrypted. Please enter the key to unlock it.\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\tclass="key-input"\r\n\t\t\t\t\t\t\t\t\t[(ngModel)]="inputKey"\r\n\t\t\t\t\t\t\t\t\t(keydown.enter)="verifyKey()"\r\n\t\t\t\t\t\t\t\t\ttype="password"\r\n\t\t\t\t\t\t\t\t\tplaceholder="Enter Decryption Key"\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t<div class="error-msg" *ngIf="decryptError">{{ decryptError }}</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-footer">\r\n\t\t\t\t\t\t\t\t<button class="btn-cancel" (click)="cancelAction()">Cancel</button>\r\n\t\t\t\t\t\t\t\t<button class="btn-save" (click)="verifyKey()">Unlock</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\x3c!-- DELETE MODE --\x3e\r\n\t\t\t\t\t\t<div class="inline-view centered" *ngSwitchCase="\'delete\'">\r\n\t\t\t\t\t\t\t<div class="view-header">\r\n\t\t\t\t\t\t\t\t<h3>Delete Dataset</h3>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-body">\r\n\t\t\t\t\t\t\t\t<p class="confirmation-text">\r\n\t\t\t\t\t\t\t\t\tAre you sure you want to delete\r\n\t\t\t\t\t\t\t\t\t<span class="highlight">{{ targetElement?.name }}</span\r\n\t\t\t\t\t\t\t\t\t>?\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t\t<p class="warning-text">This action cannot be undone.</p>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="view-footer">\r\n\t\t\t\t\t\t\t\t<button class="btn-cancel" (click)="cancelAction()">Cancel</button>\r\n\t\t\t\t\t\t\t\t<button class="btn-delete-confirm" (click)="confirmDelete()">\r\n\t\t\t\t\t\t\t\t\tDelete\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</ng-container>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t\x3c!-- Registry Section --\x3e\r\n\t\t\t<div class="section-container">\r\n\t\t\t\t<h4 class="section-title" (click)="toggleSection(\'registry\')">\r\n\t\t\t\t\t<span>Component Registry</span>\r\n\t\t\t\t\t<span class="collapse-icon" [class.collapsed]="sectionsCollapsed.registry"\r\n\t\t\t\t\t\t>▾</span\r\n\t\t\t\t\t>\r\n\t\t\t\t</h4>\r\n\t\t\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.registry">\r\n\t\t\t\t\t<div class="registry-toolbar">\r\n\t\t\t\t\t\t<div class="search-container">\r\n\t\t\t\t\t\t\t<span class="search-icon">\r\n\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<circle cx="11" cy="11" r="8"></circle>\r\n\t\t\t\t\t\t\t\t\t<line x1="21" y1="21" x2="16.65" y2="16.65"></line>\r\n\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\tclass="registry-search"\r\n\t\t\t\t\t\t\t\t[(ngModel)]="registrySearchTerm"\r\n\t\t\t\t\t\t\t\ttype="text"\r\n\t\t\t\t\t\t\t\tplaceholder="Filter by component, prop or path..."\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tclass="clear-search-btn"\r\n\t\t\t\t\t\t\t\t*ngIf="registrySearchTerm"\r\n\t\t\t\t\t\t\t\t(click)="registrySearchTerm = \'\'"\r\n\t\t\t\t\t\t\t\ttitle="Clear search"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t×\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class="registry-table-container">\r\n\t\t\t\t\t\t<ng-container *ngIf="filteredRegistryGroups.length > 0; else emptyRegistry">\r\n\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\tclass="registry-group"\r\n\t\t\t\t\t\t\t\t*ngFor="let group of filteredRegistryGroups"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<div class="registry-group-header">\r\n\t\t\t\t\t\t\t\t\t<span class="comp-icon">\r\n\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<polygon points="12 2 2 7 12 12 22 7 12 2"></polygon>\r\n\t\t\t\t\t\t\t\t\t\t\t<polyline points="2 17 12 22 22 17"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t<polyline points="2 12 12 17 22 12"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t<span class="comp-name">{{ group.component }}</span>\r\n\t\t\t\t\t\t\t\t\t<span class="comp-count"\r\n\t\t\t\t\t\t\t\t\t\t>{{ group.entries.length }} prop{{\r\n\t\t\t\t\t\t\t\t\t\t\tgroup.entries.length > 1 ? \'s\' : \'\'\r\n\t\t\t\t\t\t\t\t\t\t}}</span\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t<div class="registry-list">\r\n\t\t\t\t\t\t\t\t\t<div class="registry-item" *ngFor="let row of group.entries">\r\n\t\t\t\t\t\t\t\t\t\t<span class="prop-badge">{{ row.prop }}</span>\r\n\t\t\t\t\t\t\t\t\t\t<span class="path-text">{{ row.path }}</span>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</ng-container>\r\n\r\n\t\t\t\t\t\t<ng-template #emptyRegistry>\r\n\t\t\t\t\t\t\t<div class="empty-state">\r\n\t\t\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\t\t\tregistrySearchTerm\r\n\t\t\t\t\t\t\t\t\t\t? \'No components match the filter.\'\r\n\t\t\t\t\t\t\t\t\t\t: \'No registered components.\'\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n',styles:[".state-dashboard{display:flex;flex-direction:column;height:100%;color:#ccc;font-family:Segoe UI,sans-serif;gap:6px}.state-dashboard .dashboard-header{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.state-dashboard .dashboard-header .stat-card{background-color:#252526;border:1px solid #333;border-radius:6px;padding:8px 12px;min-width:100px;display:flex;flex-direction:column;align-items:center}.state-dashboard .dashboard-header .stat-card .label{font-size:10px;color:#888;text-transform:uppercase;letter-spacing:.5px}.state-dashboard .dashboard-header .stat-card .value{font-size:14px;font-weight:600;color:#eee;margin-top:2px}.state-dashboard .dashboard-header .stat-card.active .value{color:#4caf50}.state-dashboard .dashboard-content{flex:1;overflow-y:auto;padding-right:5px}.state-dashboard .dashboard-content .split-view{display:flex;gap:20px;height:100%}.state-dashboard .dashboard-content .section-container{display:flex;flex-direction:column;overflow:hidden;border:1px solid #333;border-radius:6px;margin-bottom:20px;flex:1;min-width:0}@media (max-width: 768px){.state-dashboard .dashboard-content .split-view{flex-direction:column;height:auto}.state-dashboard .dashboard-content .section-container{flex:none}}.state-dashboard .dashboard-content .section-title{margin:4px 8px;font-size:13px;color:#888;font-weight:600;display:flex;justify-content:space-between;align-items:center;cursor:pointer;border-radius:4px}.state-dashboard .dashboard-content .section-title:hover{background-color:#2a2a2a}.state-dashboard .dashboard-content .section-title .collapse-icon{font-size:14px;transition:transform .25s ease}.state-dashboard .dashboard-content .section-title .collapse-icon.collapsed{transform:rotate(-90deg)}.state-dashboard .dashboard-content .section-title.mt-4{margin-top:20px}.state-dashboard .dashboard-content .data-grid{overflow-y:auto;flex:1;padding:5px;display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px;align-content:start}.state-dashboard .dashboard-content .data-card{background-color:#1e1e1e;border:1px solid #333;border-radius:6px;overflow:hidden;display:flex;flex-direction:column;height:max-content;margin:5px}.state-dashboard .dashboard-content .data-card:hover{border-color:#007acc}.state-dashboard .dashboard-content .data-card .card-header{background-color:#252526;padding:8px 12px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #333}.state-dashboard .dashboard-content .data-card .card-header .element-name{font-weight:600;color:#dcdcaa}.state-dashboard .dashboard-content .data-card .card-header .store-badge{font-size:10px;padding:2px 6px;border-radius:4px;font-weight:600}.state-dashboard .dashboard-content .data-card .card-header .store-badge.session{background-color:#0e639c33;color:#4fc1ff}.state-dashboard .dashboard-content .data-card .card-header .store-badge.local{background-color:#60ac3933;color:#b5cea8}.state-dashboard .dashboard-content .data-card .card-body{padding:10px;max-height:200px;overflow-y:auto;font-family:monospace;font-size:12px}.state-dashboard .dashboard-content .data-card .card-footer{padding:6px 12px;background-color:#252526;font-size:11px;color:#666;display:flex;justify-content:space-between;align-items:center;border-top:1px solid #333}.state-dashboard .dashboard-content .data-card .card-footer .flags{display:flex;gap:6px}.state-dashboard .dashboard-content .registry-toolbar{padding:8px 10px;background-color:#252526;border-bottom:1px solid #333;border-radius:4px}.state-dashboard .dashboard-content .registry-toolbar .search-container{position:relative;display:flex;align-items:center;background-color:#1e1e1e;border:1px solid #3c3c3c;border-radius:4px}.state-dashboard .dashboard-content .registry-toolbar .search-container:focus-within{border-color:#007acc}.state-dashboard .dashboard-content .registry-toolbar .search-container .search-icon{padding:0 8px;color:#888;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-toolbar .search-container .registry-search{flex:1;background:transparent;border:none;color:#d4d4d4;padding:6px 0;font-size:13px;font-family:inherit;outline:none}.state-dashboard .dashboard-content .registry-toolbar .search-container .registry-search::placeholder{color:#666}.state-dashboard .dashboard-content .registry-toolbar .search-container .clear-search-btn{background:transparent;border:none;color:#888;padding:0 8px;cursor:pointer;font-size:16px;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-toolbar .search-container .clear-search-btn:hover{color:#ccc}.state-dashboard .dashboard-content .registry-table-container{overflow-y:auto;flex:1;padding:2px 5px 20px}.state-dashboard .dashboard-content .registry-table-container .registry-group{margin-bottom:16px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header{display:flex;align-items:center;gap:8px;padding:6px 12px;background-color:#252526;border-top:1px solid #333;border-bottom:1px solid #333;border-radius:4px;position:sticky;top:0;z-index:10}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-icon{color:#4ec9b0;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-name{color:#4ec9b0;font-weight:600;font-size:13px;flex:1}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-count{font-size:11px;color:#888;background:#ffffff0d;padding:2px 6px;border-radius:10px}.state-dashboard .dashboard-content .registry-table-container .registry-list{display:flex;flex-direction:column}.state-dashboard .dashboard-content .registry-table-container .registry-list .registry-item{display:flex;align-items:flex-start;padding:8px 12px 8px 36px;border-bottom:1px solid #333;font-size:12px}.state-dashboard .dashboard-content .registry-table-container .registry-list .registry-item:last-child{border-bottom:none}.state-dashboard .dashboard-content .registry-table-container .registry-list .registry-item .prop-badge{background-color:#9cdcfe26;color:#9cdcfe;padding:2px 6px;border-radius:4px;font-family:monospace;margin-right:8px;white-space:nowrap;font-weight:600}.state-dashboard .dashboard-content .registry-table-container .registry-list .registry-item .path-text{color:#ce9178;font-family:monospace;word-break:break-all;margin-top:2px}.state-dashboard .dashboard-content .empty-state{padding:20px;text-align:center;color:#666;font-style:italic}.state-dashboard .header-toolbar{display:flex;justify-content:flex-end;gap:6px;padding:4px 8px}.state-dashboard .header-toolbar .circle-c-btn{background:none;border:1px solid #444;color:#ccc;cursor:pointer;width:30px;height:30px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s}.state-dashboard .header-toolbar .circle-c-btn:hover{background-color:#333}.state-dashboard .header-toolbar .circle-c-btn:active{background-color:#444;transform:scale(.95)}.state-dashboard .header-toolbar .circle-c-btn.collapsed{transform:rotate(-90deg)}.state-dashboard .header-toolbar .auto-refresh-toggle{display:flex;align-items:center;gap:6px;background:#ffffff0d;border:1px solid #444;border-radius:15px;padding:2px 10px;height:30px;margin-right:4px;transition:all .2s}.state-dashboard .header-toolbar .auto-refresh-toggle:hover{background-color:#ffffff1a;border-color:#666}.state-dashboard .header-toolbar .auto-refresh-toggle input[type=checkbox]{cursor:pointer;width:14px;height:14px;accent-color:#007acc;margin:0}.state-dashboard .header-toolbar .auto-refresh-toggle label{font-size:11px;color:#888;cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.state-dashboard .header-toolbar .auto-refresh-toggle:has(input:checked){border-color:#007acc;background-color:#007acc1a}.state-dashboard .header-toolbar .auto-refresh-toggle:has(input:checked) label{color:#007acc;font-weight:600}.state-dashboard .header-section{flex-shrink:0;display:flex;flex-direction:row;align-items:flex-start;border-radius:6px;background-color:#1e1e1e;overflow:hidden}.state-dashboard .header-section .section-body{flex:1;min-width:0;padding:5px;transition:opacity .25s ease}.state-dashboard .header-section .section-body.collapsed{padding:0;margin:0;max-height:0;opacity:0}@media (max-width: 768px){.state-dashboard .header-section{display:unset}}.state-dashboard .section-title{display:flex;justify-content:space-between;align-items:center;margin-top:0;margin-bottom:2px}.state-dashboard .section-title .collapse-icon{display:none}.state-dashboard .section-body{padding:5px;flex:1;display:flex;flex-direction:column;overflow:hidden;min-height:0;max-height:2000px;transition:max-height .35s ease,opacity .25s ease;opacity:1}.state-dashboard .section-body.collapsed{padding:0;margin:0;max-height:0;opacity:0}@media (max-width: 768px){.state-dashboard .section-title{cursor:pointer;-webkit-user-select:none;user-select:none;padding:8px 4px;border-radius:4px;transition:background-color .2s}.state-dashboard .section-title:hover{background-color:#2a2a2a}.state-dashboard .section-title .collapse-icon{display:inline-block;font-size:14px;transition:transform .25s ease}.state-dashboard .section-title .collapse-icon.collapsed{transform:rotate(-90deg)}}.state-dashboard .card-header .header-left{display:flex;align-items:center;gap:8px}.state-dashboard .card-header .header-left .element-name{cursor:pointer}.state-dashboard .card-header .header-left .element-name:hover{text-decoration:underline;color:#4fc1ff}.state-dashboard .card-header .header-actions{display:flex;gap:4px}.state-dashboard .card-header .header-actions .action-btn{background:none;border:none;cursor:pointer;font-size:14px;padding:2px 4px;border-radius:4px;transition:background-color .2s}.state-dashboard .card-header .header-actions .action-btn:hover{background-color:#ffffff1a}.state-dashboard .card-header .header-actions .action-btn.delete:hover{background-color:#f4877133}.state-dashboard .card-body{cursor:pointer;transition:background-color .2s}.state-dashboard .card-body:hover{background-color:#252526}.icon-svg{vertical-align:middle}.icon-svg.read{color:#4ec9b0}.icon-svg.write{color:#ce9178}.icon-svg.lock{color:#dcdcaa}.icon-svg.freeze{color:#569cd6}.inline-view{display:flex;flex-direction:column;flex:1;min-height:0;padding:0 16px 16px;background-color:transparent;color:#ccc}.inline-view.centered{align-items:center;justify-content:center;text-align:center}.inline-view .view-header{margin-bottom:16px}.inline-view .view-header h3{margin:0;font-size:1.1rem;color:#d4d4d4}.inline-view .view-header h3 .highlight{color:#4ec9b0;font-family:Consolas,Monaco,monospace}.inline-view .view-body{flex:1;width:100%;display:flex;flex-direction:column;min-height:0;overflow:hidden;margin-bottom:10px}.inline-view .view-body.data-panel{overflow:auto;background-color:#1e1e1e;border:1px solid #3c3c3c;border-radius:4px}.inline-view .view-body .json-editor{flex:1;width:100%;background-color:#1e1e1e;color:#d4d4d4;border:1px solid #3c3c3c;border-radius:4px;padding:12px;font-family:Consolas,Monaco,monospace;font-size:13px;resize:none;outline:none}.inline-view .view-body .json-editor:focus{border-color:#007acc}.inline-view .view-body .instruction{margin-bottom:12px;color:#ccc}.inline-view .view-body .key-input{width:100%;max-width:300px;margin:0 auto;padding:8px 12px;background-color:#252526;border:1px solid #3c3c3c;border-radius:4px;color:#d4d4d4;font-size:14px}.inline-view .view-body .key-input:focus{border-color:#007acc;outline:none}.inline-view .view-body .confirmation-text{font-size:1.1rem;margin-bottom:8px}.inline-view .view-body .confirmation-text .highlight{color:#ce9178;font-weight:700}.inline-view .view-body .warning-text{color:#d16969;font-size:.9rem}.inline-view .view-body .error-msg{color:#f14c4c;margin-top:8px;font-size:.9em}.inline-view .view-footer{display:flex;justify-content:flex-end;gap:12px}.centered .inline-view .view-footer{justify-content:center}.inline-view .view-footer button{padding:6px 16px;border-radius:4px;border:none;cursor:pointer;font-size:13px;transition:background-color .2s}.inline-view .view-footer button.btn-cancel{background-color:#3c3c3c;color:#ccc}.inline-view .view-footer button.btn-cancel:hover{background-color:#4c4c4c}.inline-view .view-footer button.btn-save{background-color:#007acc;color:#fff}.inline-view .view-footer button.btn-save:hover{background-color:#0062a3}.inline-view .view-footer button.btn-delete-confirm{background-color:#ce9178;color:#1e1e1e;font-weight:500}.inline-view .view-footer button.btn-delete-confirm:hover{background-color:#b87b66}:host{display:block;height:100%}:host *::-webkit-scrollbar{width:8px;height:8px}:host *::-webkit-scrollbar-track{background:#1e1e1e;border-radius:4px}:host *::-webkit-scrollbar-thumb{background:#444;border-radius:4px}:host *::-webkit-scrollbar-thumb:hover{background:#555}\n"]}]}],ctorParameters:()=>[{type:StateWidgetSpyService}]});class WidgetCacheUtility extends CacheUtility{cacheUtility;constructor(t){super(),this.cacheUtility=t}getEntries(){const t=[];return this.cacheUtility.getCacheApp().forEach((e,r)=>{const n=this.cachePathUtility.config(r);if(n){let o=!1,a=null,s=r,i=0;try{const t=JSON.stringify(e);t&&(i=new Blob([t]).size)}catch(t){}if(r.includes("#[")){o=!0;const t=r.split("#[")[1].replace("]","");try{a=JSON.parse(atob(t))}catch(t){}}t.push({key:s,rulePath:n.pathValue,persistenceType:n.persistenceType,creationDate:new Date,hasPayload:o,payloadData:a,dataSize:i,encriptType:n.encriptType})}}),t.sort((t,e)=>t.key.localeCompare(e.key))}getEntryContent(t,e){const r=this.cachePathUtility.config(t);let n=this.cacheUtility.getCacheApp().get(t);if(r&&n&&"string"==typeof n&&r.encriptType!==K.NONE){if(!e)return{error:"KeyRequired"};try{const t=P.AES.decrypt(n,e).toString(P.enc.Utf8);if(!t)throw new Error("Decryption Failed");n=JSON.parse(t)}catch(t){return{error:"Invalid decryption key or corrupt data."}}}return n&&void 0!==n.body?n.body:n}getAutoCacheKey(t){const e=this.cachePathUtility.config(t);return e&&e.encriptType===K.AUTO?this.getCacheKey(e):null}cleanUp(){return super.cleanUp()}getRules(){return this.cachePathUtility.getPaths()}deleteEntry(t){this.cacheUtility.getCacheApp().delete(t),this.persistStorage()}clearAllCache(){this.cacheUtility.getCacheApp().clear(),sessionStorage.removeItem(this.cache_name),localStorage.removeItem(this.cache_name)}persistStorage(){let t={},e={};this.cacheUtility.getCacheApp().forEach((r,n)=>{const o=this.cachePathUtility.config(n);o&&(o.persistenceType===J.SESSION?t[n]=r:o.persistenceType===J.LOCAL&&(e[n]=r))}),Object.keys(t).length>0?sessionStorage.setItem(this.cache_name,JSON.stringify(t)):sessionStorage.removeItem(this.cache_name),Object.keys(e).length>0?localStorage.setItem(this.cache_name,JSON.stringify(e)):localStorage.removeItem(this.cache_name)}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:WidgetCacheUtility,deps:[{token:CacheUtility}],target:t.ɵɵFactoryTarget.Injectable});static ɵprov=t.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:WidgetCacheUtility,providedIn:"root"})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:WidgetCacheUtility,decorators:[{type:r,args:[{providedIn:"root"}]}],ctorParameters:()=>[{type:CacheUtility}]});class CacheTabComponent{cacheUtility;cacheEntries=[];activeRules=[];ruleGroups=[];cacheGroups=[];rulesSearchTerm="";entriesSearchTerm="";stats={volatile:0,session:0,local:0,total:0};sizes={volatile:0,session:0,local:0,total:0};CacheType=J;sectionsCollapsed={status:!1,rules:!1,entries:!1};expandedPayloadId=null;expandedContentId=null;currentContent=null;customKeys={};decryptErrors={};isCleanupModalOpen=!1;showCleanUpBanner=!1;cleanedEntries=[];cleanedTotalSize=0;isClearAllModalOpen=!1;showClearAllBanner=!1;constructor(t){this.cacheUtility=t}ngOnInit(){this.refreshCache(),this.activeRules=this.cacheUtility.getRules(),this.groupRules()}groupRules(){const t=new Map;this.activeRules.forEach(e=>{const r=e.persistenceType.toString();t.has(r)||t.set(r,[]),t.get(r).push(e)});const e=Array.from(t.keys()).sort((t,e)=>t.localeCompare(e));this.ruleGroups=e.map(e=>({persistenceType:e,rules:t.get(e).sort((t,e)=>t.pathValue.localeCompare(e.pathValue))}))}refreshCache(){this.cacheEntries=this.cacheUtility.getEntries(),this.calculateStats(),this.groupEntries()}groupEntries(){const t=new Map;this.cacheEntries.forEach(e=>{t.has(e.rulePath)||t.set(e.rulePath,[]),t.get(e.rulePath).push(e)});const e=Array.from(t.keys()).sort((t,e)=>t.localeCompare(e));this.cacheGroups=e.map(e=>({rulePath:e,entries:t.get(e).sort((t,e)=>t.key.localeCompare(e.key))}))}deleteEntry(t){this.cacheUtility.deleteEntry(t),this.refreshCache()}clearAll(){this.isClearAllModalOpen=!0}executeClearAll(){this.cacheUtility.clearAllCache(),this.refreshCache(),this.isClearAllModalOpen=!1,this.showClearAllBanner=!0,setTimeout(()=>{this.showClearAllBanner=!1},3e3)}cleanUpCache(){const t=this.cacheUtility.cleanUp();t&&t.size>0?(this.cleanedEntries=[],this.cleanedTotalSize=0,t.forEach((t,e)=>{const r=new Blob(["string"==typeof t?t:JSON.stringify(t)]).size;this.cleanedTotalSize+=r;const n=this.cacheUtility.cachePathUtility.config(e);this.cleanedEntries.push({key:e,dataSize:r,persistenceType:n?n.persistenceType:J.VOLATILE,encriptType:n?n.encriptType:K.NONE})}),this.isCleanupModalOpen=!0):(this.showCleanUpBanner=!0,setTimeout(()=>{this.showCleanUpBanner=!1},3e3)),this.refreshCache()}toggleSection(t){this.sectionsCollapsed[t]=!this.sectionsCollapsed[t]}togglePayload(t){this.expandedPayloadId=this.expandedPayloadId===t?null:t}openContentModal(t,e){this.expandedContentId=t,this.loadContent(t,e)}closeContentModal(){this.expandedContentId&&this.customKeys[this.expandedContentId]&&(this.customKeys[this.expandedContentId]=""),this.expandedContentId=null,this.currentContent=null,this.decryptErrors={}}loadContent(t,e){if((e===K.CUSTOM||e===K.AUTO)&&!this.customKeys[t]){if(this.currentContent={_requiresKey:!0,encriptType:e},!this.customKeys[t]){const e=this.cacheUtility.getAutoCacheKey(t);e&&(this.customKeys[t]=e)}return}const r=this.cacheUtility.getEntryContent(t,this.customKeys[t]);r&&r.error?(this.decryptErrors[t]=r.error,this.currentContent={_requiresKey:!0}):(this.decryptErrors[t]="",this.currentContent=r)}decryptContent(t){this.loadContent(t,this.currentContent?.encriptType||K.CUSTOM)}get filteredRuleGroups(){if(!this.rulesSearchTerm||""===this.rulesSearchTerm.trim())return this.ruleGroups;const t=this.rulesSearchTerm.toLowerCase();return this.ruleGroups.map(e=>{if(e.persistenceType.toLowerCase().includes(t))return e;const r=e.rules.filter(e=>e.pathValue.toLowerCase().includes(t)||e.persistenceType.toString().toLowerCase().includes(t));return r.length>0?{...e,rules:r}:null}).filter(t=>null!==t)}get filteredCacheGroups(){if(!this.entriesSearchTerm||""===this.entriesSearchTerm.trim())return this.cacheGroups;const t=this.entriesSearchTerm.toLowerCase();return this.cacheGroups.map(e=>{if(e.rulePath.toLowerCase().includes(t))return e;const r=e.entries.filter(e=>e.key.toLowerCase().includes(t)||e.persistenceType.toString().toLowerCase().includes(t));return r.length>0?{...e,entries:r}:null}).filter(t=>null!==t)}formatSize(t){if(!t||0===t)return"0 B";const e=Math.floor(Math.log(t)/Math.log(1024));return parseFloat((t/Math.pow(1024,e)).toFixed(2))+" "+["B","KB","MB","GB"][e]}getSizeForType(t){const e=t.toLowerCase();return this.formatSize(this.sizes[e]||0)}getGroupSize(t){const e=t.entries.reduce((t,e)=>t+(e.dataSize||0),0);return this.formatSize(e)}calculateStats(){this.stats={volatile:0,session:0,local:0,total:this.cacheEntries.length},this.sizes={volatile:0,session:0,local:0,total:0},this.cacheEntries.forEach(t=>{const e=t.dataSize||0;this.sizes.total+=e,t.persistenceType===J.VOLATILE?(this.stats.volatile++,this.sizes.volatile+=e):t.persistenceType===J.SESSION?(this.stats.session++,this.sizes.session+=e):t.persistenceType===J.LOCAL&&(this.stats.local++,this.sizes.local+=e)})}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:CacheTabComponent,deps:[{token:WidgetCacheUtility}],target:t.ɵɵFactoryTarget.Component});static ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"20.3.18",type:CacheTabComponent,isStandalone:!0,selector:"asor-cache-tab",ngImport:t,template:'<div class="state-dashboard">\r\n\t\x3c!-- Cleanup Info Banner --\x3e\r\n\t<div class="info-banner" *ngIf="showCleanUpBanner">\r\n\t\t<svg\r\n\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\twidth="16"\r\n\t\t\theight="16"\r\n\t\t\tviewBox="0 0 24 24"\r\n\t\t\tfill="none"\r\n\t\t\tstroke="currentColor"\r\n\t\t\tstroke-width="2"\r\n\t\t\tstroke-linecap="round"\r\n\t\t\tstroke-linejoin="round"\r\n\t\t>\r\n\t\t\t<circle cx="12" cy="12" r="10"></circle>\r\n\t\t\t<line x1="12" y1="16" x2="12" y2="12"></line>\r\n\t\t\t<line x1="12" y1="8" x2="12.01" y2="8"></line>\r\n\t\t</svg>\r\n\t\t<span>No obsolete cache entries found. Everything is clean!</span>\r\n\t</div>\r\n\r\n\t\x3c!-- Clear All Info Banner --\x3e\r\n\t<div class="info-banner" *ngIf="showClearAllBanner">\r\n\t\t<svg\r\n\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\twidth="16"\r\n\t\t\theight="16"\r\n\t\t\tviewBox="0 0 24 24"\r\n\t\t\tfill="none"\r\n\t\t\tstroke="currentColor"\r\n\t\t\tstroke-width="2"\r\n\t\t\tstroke-linecap="round"\r\n\t\t\tstroke-linejoin="round"\r\n\t\t>\r\n\t\t\t<polyline points="20 6 9 17 4 12"></polyline>\r\n\t\t</svg>\r\n\t\t<span>All cache entries have been successfully cleared!</span>\r\n\t</div>\r\n\r\n\t\x3c!-- Header Stats --\x3e\r\n\t<div class="section-container header-section">\r\n\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.status">\r\n\t\t\t<div class="dashboard-header">\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Total Entries</div>\r\n\t\t\t\t\t<div class="value">{{ stats.total }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Total Cache Size</div>\r\n\t\t\t\t\t<div class="value">{{ formatSize(sizes.total) }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Volatile Cache</div>\r\n\t\t\t\t\t<div class="value" [class.active]="stats.volatile > 0">\r\n\t\t\t\t\t\t{{ stats.volatile }}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="label" style="font-size: 9px; margin-top: 2px">\r\n\t\t\t\t\t\t{{ formatSize(sizes.volatile) }}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Session Cache</div>\r\n\t\t\t\t\t<div class="value" [class.active]="stats.session > 0">{{ stats.session }}</div>\r\n\t\t\t\t\t<div class="label" style="font-size: 9px; margin-top: 2px">\r\n\t\t\t\t\t\t{{ formatSize(sizes.session) }}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Local Cache</div>\r\n\t\t\t\t\t<div class="value" [class.active]="stats.local > 0">{{ stats.local }}</div>\r\n\t\t\t\t\t<div class="label" style="font-size: 9px; margin-top: 2px">\r\n\t\t\t\t\t\t{{ formatSize(sizes.local) }}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div class="header-toolbar">\r\n\t\t\t<button class="circle-c-btn" (click)="cleanUpCache()" title="Clean Up Obsolete Cache">\r\n\t\t\t\t<svg\r\n\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\twidth="16"\r\n\t\t\t\t\theight="16"\r\n\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\tfill="none"\r\n\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t>\r\n\t\t\t\t\t<path d="m9.06 11.9 8.07-8.06a2.85 2.85 0 1 1 4.03 4.03l-8.06 8.08"></path>\r\n\t\t\t\t\t<path\r\n\t\t\t\t\t\td="M7.07 14.94c-1.66 0-3 1.35-3 3.02 0 1.33-2.5 1.52-2 2.02 1.08 1.35 2.22 1.45 3.02 1.45 2.26 0 4.14-1.84 4.14-4.11 0-1.66-1.35-3-3.02-3.02z"\r\n\t\t\t\t\t></path>\r\n\t\t\t\t</svg>\r\n\t\t\t</button>\r\n\t\t\t<button\r\n\t\t\t\tclass="circle-c-btn clear-all"\r\n\t\t\t\t(click)="clearAll(); $event.stopPropagation()"\r\n\t\t\t\ttitle="Clear All Cache"\r\n\t\t\t>\r\n\t\t\t\t<svg\r\n\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\twidth="14"\r\n\t\t\t\t\theight="14"\r\n\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\tfill="none"\r\n\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t>\r\n\t\t\t\t\t<polyline points="3 6 5 6 21 6"></polyline>\r\n\t\t\t\t\t<path\r\n\t\t\t\t\t\td="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2-2v2"\r\n\t\t\t\t\t></path>\r\n\t\t\t\t\t<line x1="10" y1="11" x2="10" y2="17"></line>\r\n\t\t\t\t\t<line x1="14" y1="11" x2="14" y2="17"></line>\r\n\t\t\t\t</svg>\r\n\t\t\t</button>\r\n\t\t\t<button\r\n\t\t\t\tclass="circle-c-btn"\r\n\t\t\t\t(click)="refreshCache(); $event.stopPropagation()"\r\n\t\t\t\ttitle="Refresh Cache"\r\n\t\t\t>\r\n\t\t\t\t↻\r\n\t\t\t</button>\r\n\t\t\t<button\r\n\t\t\t\tclass="circle-c-btn"\r\n\t\t\t\t[class.collapsed]="sectionsCollapsed.status"\r\n\t\t\t\t(click)="toggleSection(\'status\')"\r\n\t\t\t\ttitle="Toggle Status"\r\n\t\t\t>\r\n\t\t\t\t▾\r\n\t\t\t</button>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<div class="dashboard-content">\r\n\t\t<div class="split-view">\r\n\t\t\t\x3c!-- Active Rules Section --\x3e\r\n\t\t\t<div class="section-container">\r\n\t\t\t\t<h4 class="section-title" (click)="toggleSection(\'rules\')">\r\n\t\t\t\t\t<span>Active Cache Rules</span>\r\n\t\t\t\t\t<span class="collapse-icon" [class.collapsed]="sectionsCollapsed.rules">▾</span>\r\n\t\t\t\t</h4>\r\n\t\t\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.rules">\r\n\t\t\t\t\t<div class="registry-toolbar">\r\n\t\t\t\t\t\t<div class="search-container">\r\n\t\t\t\t\t\t\t<span class="search-icon">\r\n\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<circle cx="11" cy="11" r="8"></circle>\r\n\t\t\t\t\t\t\t\t\t<line x1="21" y1="21" x2="16.65" y2="16.65"></line>\r\n\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\tclass="registry-search"\r\n\t\t\t\t\t\t\t\t[(ngModel)]="rulesSearchTerm"\r\n\t\t\t\t\t\t\t\ttype="text"\r\n\t\t\t\t\t\t\t\tplaceholder="Filter rules by path or type..."\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tclass="clear-search-btn"\r\n\t\t\t\t\t\t\t\t*ngIf="rulesSearchTerm"\r\n\t\t\t\t\t\t\t\t(click)="rulesSearchTerm = \'\'"\r\n\t\t\t\t\t\t\t\ttitle="Clear search"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t×\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tclass="registry-table-container"\r\n\t\t\t\t\t\t*ngIf="filteredRuleGroups.length > 0; else noRules"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<div class="registry-group" *ngFor="let group of filteredRuleGroups">\r\n\t\t\t\t\t\t\t<div class="registry-group-header">\r\n\t\t\t\t\t\t\t\t<span class="comp-icon">\r\n\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<ellipse cx="12" cy="5" rx="9" ry="3"></ellipse>\r\n\t\t\t\t\t\t\t\t\t\t<path d="M21 12c0 1.66-4 3-9 3s-9-1.34-9-3"></path>\r\n\t\t\t\t\t\t\t\t\t\t<path d="M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5"></path>\r\n\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t<span class="comp-name">{{ group.persistenceType }}</span>\r\n\t\t\t\t\t\t\t\t<span class="comp-count"\r\n\t\t\t\t\t\t\t\t\t>{{ group.rules.length }} rule<ng-container\r\n\t\t\t\t\t\t\t\t\t\t*ngIf="group.rules.length !== 1"\r\n\t\t\t\t\t\t\t\t\t\t>s</ng-container\r\n\t\t\t\t\t\t\t\t\t></span\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<span class="comp-count" style="margin-left: auto">{{\r\n\t\t\t\t\t\t\t\t\tgetSizeForType(group.persistenceType)\r\n\t\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="rules-list" style="padding: 10px">\r\n\t\t\t\t\t\t\t\t<div class="rule-card" *ngFor="let rule of group.rules">\r\n\t\t\t\t\t\t\t\t\t<div class="rule-header">\r\n\t\t\t\t\t\t\t\t\t\t<span class="rule-path">{{ rule.pathValue }}</span>\r\n\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\tclass="store-badge"\r\n\t\t\t\t\t\t\t\t\t\t\t[ngClass]="\r\n\t\t\t\t\t\t\t\t\t\t\t\trule.persistenceType.toString().toLowerCase()\r\n\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t>{{ rule.persistenceType }}</span\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<div class="rule-body">\r\n\t\t\t\t\t\t\t\t\t\t<div class="rule-detail">\r\n\t\t\t\t\t\t\t\t\t\t\t<strong>Payload Cache:</strong>\r\n\t\t\t\t\t\t\t\t\t\t\t{{ rule.reqPayloadCache ? \'Enabled\' : \'Disabled\' }}\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t<div class="rule-detail">\r\n\t\t\t\t\t\t\t\t\t\t\t<strong>Encryption:</strong> {{ rule.encriptType }}\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\t\t\tclass="rule-detail"\r\n\t\t\t\t\t\t\t\t\t\t\t*ngIf="rule.clearOn && rule.clearOn.length > 0"\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<strong>Clear On:</strong>\r\n\t\t\t\t\t\t\t\t\t\t\t<ul class="clear-on-list">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<li *ngFor="let c of rule.clearOn">{{ c }}</li>\r\n\t\t\t\t\t\t\t\t\t\t\t</ul>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<ng-template #noRules>\r\n\t\t\t\t\t\t<div class="empty-state">No cache rules match the filter.</div>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t\x3c!-- Cache Entries Section --\x3e\r\n\t\t\t<div class="section-container">\r\n\t\t\t\t<h4 class="section-title" (click)="toggleSection(\'entries\')">\r\n\t\t\t\t\t<span>Cache Entries</span>\r\n\t\t\t\t\t<span class="collapse-icon" [class.collapsed]="sectionsCollapsed.entries"\r\n\t\t\t\t\t\t>▾</span\r\n\t\t\t\t\t>\r\n\t\t\t\t</h4>\r\n\t\t\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.entries">\r\n\t\t\t\t\t<div class="registry-toolbar">\r\n\t\t\t\t\t\t<div class="search-container">\r\n\t\t\t\t\t\t\t<span class="search-icon">\r\n\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<circle cx="11" cy="11" r="8"></circle>\r\n\t\t\t\t\t\t\t\t\t<line x1="21" y1="21" x2="16.65" y2="16.65"></line>\r\n\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\tclass="registry-search"\r\n\t\t\t\t\t\t\t\t[(ngModel)]="entriesSearchTerm"\r\n\t\t\t\t\t\t\t\ttype="text"\r\n\t\t\t\t\t\t\t\tplaceholder="Filter entries by key or type..."\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tclass="clear-search-btn"\r\n\t\t\t\t\t\t\t\t*ngIf="entriesSearchTerm"\r\n\t\t\t\t\t\t\t\t(click)="entriesSearchTerm = \'\'"\r\n\t\t\t\t\t\t\t\ttitle="Clear search"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t×\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tclass="registry-table-container"\r\n\t\t\t\t\t\t*ngIf="filteredCacheGroups.length > 0; else noData"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<div class="registry-group" *ngFor="let group of filteredCacheGroups">\r\n\t\t\t\t\t\t\t<div class="registry-group-header">\r\n\t\t\t\t\t\t\t\t<span class="comp-icon">\r\n\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<polygon points="12 2 2 7 12 12 22 7 12 2"></polygon>\r\n\t\t\t\t\t\t\t\t\t\t<polyline points="2 17 12 22 22 17"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t<polyline points="2 12 12 17 22 12"></polyline>\r\n\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t<span class="comp-name">{{ group.rulePath }}</span>\r\n\t\t\t\t\t\t\t\t<span class="comp-count"\r\n\t\t\t\t\t\t\t\t\t>{{ group.entries.length }} entry<ng-container\r\n\t\t\t\t\t\t\t\t\t\t*ngIf="group.entries.length !== 1"\r\n\t\t\t\t\t\t\t\t\t\t>s</ng-container\r\n\t\t\t\t\t\t\t\t\t></span\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<span class="comp-count" style="margin-left: auto">{{\r\n\t\t\t\t\t\t\t\t\tgetGroupSize(group)\r\n\t\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="registry-list">\r\n\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\tclass="registry-item-container"\r\n\t\t\t\t\t\t\t\t\t*ngFor="let entry of group.entries"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<div class="registry-item">\r\n\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\tclass="store-badge"\r\n\t\t\t\t\t\t\t\t\t\t\t[ngClass]="\r\n\t\t\t\t\t\t\t\t\t\t\t\tentry.persistenceType.toString().toLowerCase()\r\n\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t>{{ entry.persistenceType }}</span\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<span class="path-text" [title]="entry.key">\r\n\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t*ngIf="entry.encriptType !== \'NONE\'"\r\n\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstyle="\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmargin-right: 4px;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tvertical-align: text-top;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: #dcdcaa;\r\n\t\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<rect\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tx="3"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\ty="11"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="18"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="11"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\trx="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\try="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t></rect>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<path d="M7 11V7a5 5 0 0 1 10 0v4"></path>\r\n\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t{{ entry.key }}\r\n\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t<span class="comp-count" style="margin-right: 8px">{{\r\n\t\t\t\t\t\t\t\t\t\t\tformatSize(entry.dataSize || 0)\r\n\t\t\t\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t\t\t\t<div class="item-actions">\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="action-btn"\r\n\t\t\t\t\t\t\t\t\t\t\t\t[class.active]="expandedContentId === entry.key"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="\r\n\t\t\t\t\t\t\t\t\t\t\t\t\topenContentModal(entry.key, entry.encriptType)\r\n\t\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="View Content"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<circle cx="12" cy="12" r="3"></circle>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="action-btn"\r\n\t\t\t\t\t\t\t\t\t\t\t\t*ngIf="entry.hasPayload"\r\n\t\t\t\t\t\t\t\t\t\t\t\t[class.active]="expandedPayloadId === entry.key"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="togglePayload(entry.key)"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Toggle Payload Request"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<polyline\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpoints="22 12 18 12 15 21 9 3 6 12 2 12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="action-btn delete"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="deleteEntry(entry.key)"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Delete Entry"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<polyline points="3 6 5 6 21 6"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2-2v2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\t\tclass="payload-content"\r\n\t\t\t\t\t\t\t\t\t\t*ngIf="expandedPayloadId === entry.key"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<asor-json-view\r\n\t\t\t\t\t\t\t\t\t\t\t*ngIf="entry.payloadData"\r\n\t\t\t\t\t\t\t\t\t\t\t[data]="entry.payloadData"\r\n\t\t\t\t\t\t\t\t\t\t></asor-json-view>\r\n\t\t\t\t\t\t\t\t\t\t<span class="empty-payload" *ngIf="!entry.payloadData"\r\n\t\t\t\t\t\t\t\t\t\t\t>Unable to parse payload request.</span\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<ng-template #noData>\r\n\t\t\t\t\t\t<div class="empty-state">No items found in cache matching the filter.</div>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n\x3c!-- Modal Overlay for Content Details --\x3e\r\n<div class="modal-overlay" *ngIf="expandedContentId" (click)="closeContentModal()">\r\n\t<div class="modal-content" (click)="$event.stopPropagation()">\r\n\t\t<div class="modal-header">\r\n\t\t\t<h3>Content Details</h3>\r\n\t\t\t<span class="path-text" [title]="expandedContentId">{{ expandedContentId }}</span>\r\n\t\t\t<button class="close-btn" (click)="closeContentModal()" title="Close">×</button>\r\n\t\t</div>\r\n\t\t<div class="modal-body">\r\n\t\t\t<div class="decrypt-prompt" *ngIf="currentContent?._requiresKey">\r\n\t\t\t\t<div class="decrypt-header">\r\n\t\t\t\t\t<svg\r\n\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\twidth="16"\r\n\t\t\t\t\t\theight="16"\r\n\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect>\r\n\t\t\t\t\t\t<path d="M7 11V7a5 5 0 0 1 10 0v4"></path>\r\n\t\t\t\t\t</svg>\r\n\t\t\t\t\t<span>Encrypted Content</span>\r\n\t\t\t\t</div>\r\n\t\t\t\t<p class="decrypt-desc">Enter the decryption key to view this response.</p>\r\n\t\t\t\t<div class="decrypt-input-group">\r\n\t\t\t\t\t<input\r\n\t\t\t\t\t\tclass="registry-search"\r\n\t\t\t\t\t\t[(ngModel)]="customKeys[expandedContentId]"\r\n\t\t\t\t\t\ttype="password"\r\n\t\t\t\t\t\tplaceholder="Enter Secret Key"\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<button class="decrypt-btn" (click)="decryptContent(expandedContentId)">\r\n\t\t\t\t\t\tDecrypt\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="error-msg" *ngIf="decryptErrors[expandedContentId]">\r\n\t\t\t\t\t{{ decryptErrors[expandedContentId] }}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<asor-json-view\r\n\t\t\t\t*ngIf="currentContent && !currentContent._requiresKey"\r\n\t\t\t\t[data]="currentContent"\r\n\t\t\t></asor-json-view>\r\n\t\t\t<span class="empty-payload" *ngIf="!currentContent && currentContent !== null"\r\n\t\t\t\t>Empty content.</span\r\n\t\t\t>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n\x3c!-- Cleanup Results Modal --\x3e\r\n<div class="modal-overlay" *ngIf="isCleanupModalOpen" (click)="isCleanupModalOpen = false">\r\n\t<div class="modal-content" (click)="$event.stopPropagation()">\r\n\t\t<div class="modal-header">\r\n\t\t\t<h3>Cleaned Cache Entries</h3>\r\n\t\t\t<span class="path-text">Total recovered size: {{ formatSize(cleanedTotalSize) }}</span>\r\n\t\t\t<button class="close-btn" (click)="isCleanupModalOpen = false" title="Close">×</button>\r\n\t\t</div>\r\n\t\t<div class="modal-body" style="padding: 0">\r\n\t\t\t<div class="cleanup-table">\r\n\t\t\t\t<div class="cleanup-table-header">\r\n\t\t\t\t\t<span class="col-type">Type</span>\r\n\t\t\t\t\t<span class="col-path">Path</span>\r\n\t\t\t\t\t<span class="col-size" style="text-align: right">Size</span>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="cleanup-table-body">\r\n\t\t\t\t\t<div class="cleanup-table-row" *ngFor="let entry of cleanedEntries">\r\n\t\t\t\t\t\t<span class="col-type">\r\n\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\tclass="store-badge"\r\n\t\t\t\t\t\t\t\t*ngIf="entry.persistenceType"\r\n\t\t\t\t\t\t\t\t[ngClass]="entry.persistenceType.toString().toLowerCase()"\r\n\t\t\t\t\t\t\t\t>{{ entry.persistenceType }}</span\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<span class="col-path" [title]="entry.key">\r\n\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t*ngIf="entry.encriptType && entry.encriptType !== \'NONE\'"\r\n\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\tstyle="margin-right: 6px; flex-shrink: 0; color: #dcdcaa"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect>\r\n\t\t\t\t\t\t\t\t<path d="M7 11V7a5 5 0 0 1 10 0v4"></path>\r\n\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\tstyle="\r\n\t\t\t\t\t\t\t\t\toverflow: hidden;\r\n\t\t\t\t\t\t\t\t\ttext-overflow: ellipsis;\r\n\t\t\t\t\t\t\t\t\twhite-space: nowrap;\r\n\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t>{{ entry.key }}</span\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<span class="col-size">{{ formatSize(entry.dataSize) }}</span>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n\x3c!-- Clear All Confirmation Modal --\x3e\r\n<div class="modal-overlay" *ngIf="isClearAllModalOpen" (click)="isClearAllModalOpen = false">\r\n\t<div class="modal-content" (click)="$event.stopPropagation()" style="max-width: 400px">\r\n\t\t<div class="modal-header">\r\n\t\t\t<h3>Confirm Cache Clear</h3>\r\n\t\t\t<button class="close-btn" (click)="isClearAllModalOpen = false" title="Close">×</button>\r\n\t\t</div>\r\n\t\t<div class="modal-body" style="padding: 20px">\r\n\t\t\t<p style="color: #ccc; margin: 0 0 20px 0; font-size: 14px; line-height: 1.5">\r\n\t\t\t\tAre you sure you want to completely clear the cache? This action cannot be undone.\r\n\t\t\t</p>\r\n\t\t\t<div style="display: flex; justify-content: flex-end; gap: 10px">\r\n\t\t\t\t<button\r\n\t\t\t\t\t(click)="isClearAllModalOpen = false"\r\n\t\t\t\t\tstyle="\r\n\t\t\t\t\t\tpadding: 6px 16px;\r\n\t\t\t\t\t\tbackground: transparent;\r\n\t\t\t\t\t\tborder: 1px solid #444;\r\n\t\t\t\t\t\tcolor: #ccc;\r\n\t\t\t\t\t\tborder-radius: 4px;\r\n\t\t\t\t\t\tcursor: pointer;\r\n\t\t\t\t\t\tfont-size: 13px;\r\n\t\t\t\t\t"\r\n\t\t\t\t>\r\n\t\t\t\t\tCancel\r\n\t\t\t\t</button>\r\n\t\t\t\t<button\r\n\t\t\t\t\t(click)="executeClearAll()"\r\n\t\t\t\t\tstyle="\r\n\t\t\t\t\t\tpadding: 6px 16px;\r\n\t\t\t\t\t\tbackground: rgba(244, 135, 113, 0.2);\r\n\t\t\t\t\t\tborder: 1px solid #f48771;\r\n\t\t\t\t\t\tcolor: #f48771;\r\n\t\t\t\t\t\tborder-radius: 4px;\r\n\t\t\t\t\t\tcursor: pointer;\r\n\t\t\t\t\t\tfont-size: 13px;\r\n\t\t\t\t\t\tfont-weight: 600;\r\n\t\t\t\t\t"\r\n\t\t\t\t>\r\n\t\t\t\t\tClear All\r\n\t\t\t\t</button>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n',styles:[".state-dashboard{display:flex;flex-direction:column;height:100%;color:#ccc;font-family:Segoe UI,sans-serif;gap:6px;overflow-y:auto}.state-dashboard::-webkit-scrollbar,.state-dashboard .registry-table-container::-webkit-scrollbar,.state-dashboard .payload-content::-webkit-scrollbar,.state-dashboard .rules-list::-webkit-scrollbar{width:10px;height:10px}.state-dashboard::-webkit-scrollbar-track,.state-dashboard .registry-table-container::-webkit-scrollbar-track,.state-dashboard .payload-content::-webkit-scrollbar-track,.state-dashboard .rules-list::-webkit-scrollbar-track{background:#1e1e1e}.state-dashboard::-webkit-scrollbar-thumb,.state-dashboard .registry-table-container::-webkit-scrollbar-thumb,.state-dashboard .payload-content::-webkit-scrollbar-thumb,.state-dashboard .rules-list::-webkit-scrollbar-thumb{background:#424242;border-radius:5px;border:2px solid #1e1e1e}.state-dashboard::-webkit-scrollbar-thumb:hover,.state-dashboard .registry-table-container::-webkit-scrollbar-thumb:hover,.state-dashboard .payload-content::-webkit-scrollbar-thumb:hover,.state-dashboard .rules-list::-webkit-scrollbar-thumb:hover{background:#4f4f4f}.state-dashboard .dashboard-header{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.state-dashboard .dashboard-header .stat-card{background-color:#252526;border:1px solid #333;border-radius:6px;padding:8px 12px;min-width:100px;display:flex;flex-direction:column;align-items:center}.state-dashboard .dashboard-header .stat-card .label{font-size:10px;color:#888;text-transform:uppercase;letter-spacing:.5px}.state-dashboard .dashboard-header .stat-card .value{font-size:14px;font-weight:600;color:#eee;margin-top:2px}.state-dashboard .dashboard-header .stat-card .value.active{color:#4caf50}.state-dashboard .header-toolbar{display:flex;justify-content:flex-end;gap:6px;padding:4px 8px}.state-dashboard .header-toolbar .circle-c-btn{background:none;border:1px solid #444;color:#ccc;cursor:pointer;width:30px;height:30px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s}.state-dashboard .header-toolbar .circle-c-btn:hover{background-color:#333}.state-dashboard .header-toolbar .circle-c-btn.clear-all:hover{background-color:#f4877133;color:#f48771}.state-dashboard .header-toolbar .circle-c-btn.collapsed{transform:rotate(-90deg)}.state-dashboard .header-section{flex-shrink:0;display:flex;flex-direction:row;align-items:flex-start;overflow:hidden;border-radius:6px}.state-dashboard .header-section .section-body{flex:1;min-width:0;padding:5px;transition:opacity .25s ease}.state-dashboard .header-section .section-body.collapsed{padding:0;margin:0;max-height:0;opacity:0}@media (max-width: 768px){.state-dashboard .header-section{display:unset}}.state-dashboard .dashboard-content{flex:1;overflow-y:auto;padding-right:5px}.state-dashboard .dashboard-content .split-view{display:flex;gap:20px;height:100%}.state-dashboard .dashboard-content .section-container{display:flex;flex-direction:column;overflow:hidden;border:1px solid #333;border-radius:6px;margin-bottom:20px;flex:1;min-width:0}@media (max-width: 768px){.state-dashboard .dashboard-content .split-view{flex-direction:column;height:auto}.state-dashboard .dashboard-content .section-container{flex:none}}.state-dashboard .dashboard-content .section-title{margin:4px 8px;font-size:13px;color:#888;font-weight:600;display:flex;justify-content:space-between;align-items:center;cursor:pointer;border-radius:4px}.state-dashboard .dashboard-content .section-title:hover{background-color:#2a2a2a}.state-dashboard .dashboard-content .section-title .collapse-icon{font-size:14px;transition:transform .25s ease}.state-dashboard .dashboard-content .section-title .collapse-icon.collapsed{transform:rotate(-90deg)}.state-dashboard .dashboard-content .section-body{padding:5px;max-height:2000px;transition:max-height .35s ease,opacity .25s ease;display:flex;flex-direction:column;flex:1;min-height:0}.state-dashboard .dashboard-content .section-body.collapsed{padding:0;max-height:0;opacity:0;overflow:hidden}.state-dashboard .dashboard-content .registry-toolbar{padding:8px 10px;background-color:#252526;border-bottom:1px solid #333;border-radius:4px}.state-dashboard .dashboard-content .registry-toolbar .search-container{position:relative;display:flex;align-items:center;background-color:#1e1e1e;border:1px solid #3c3c3c;border-radius:4px}.state-dashboard .dashboard-content .registry-toolbar .search-container:focus-within{border-color:#007acc}.state-dashboard .dashboard-content .registry-toolbar .search-container .search-icon{padding:0 8px;color:#888;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-toolbar .search-container .registry-search{flex:1;background:transparent;border:none;color:#d4d4d4;padding:6px 0;font-size:13px;font-family:inherit;outline:none}.state-dashboard .dashboard-content .registry-toolbar .search-container .registry-search::placeholder{color:#666}.state-dashboard .dashboard-content .registry-toolbar .search-container .clear-search-btn{background:transparent;border:none;color:#888;padding:0 8px;cursor:pointer;font-size:16px;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-toolbar .search-container .clear-search-btn:hover{color:#ccc}.state-dashboard .dashboard-content .rules-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px;overflow-y:auto;flex:1;padding:2px 5px 20px}.state-dashboard .dashboard-content .rules-list .rule-card{background-color:#1e1e1e;border:1px solid #333;border-radius:6px;padding:10px}.state-dashboard .dashboard-content .rules-list .rule-card .rule-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.state-dashboard .dashboard-content .rules-list .rule-card .rule-header .rule-path{font-family:monospace;color:#dcdcaa;font-weight:700}.state-dashboard .dashboard-content .rules-list .rule-card .rule-body{font-size:12px;color:#9cdcfe}.state-dashboard .dashboard-content .rules-list .rule-card .rule-body .rule-detail{margin-top:4px}.state-dashboard .dashboard-content .rules-list .rule-card .rule-body .rule-detail strong{color:#888}.state-dashboard .dashboard-content .rules-list .rule-card .rule-body .rule-detail .clear-on-list{margin:4px 0 0 16px;padding:0;color:#ce9178;font-family:monospace}.state-dashboard .dashboard-content .registry-table-container{overflow-y:auto;flex:1;padding:2px 5px 20px}.state-dashboard .dashboard-content .registry-table-container .registry-group{margin-bottom:16px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header{display:flex;align-items:center;gap:8px;padding:6px 12px;background-color:#252526;border-top:1px solid #333;border-bottom:1px solid #333;border-radius:4px;position:sticky;top:0;z-index:10}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-icon{color:#4ec9b0;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-name{color:#4ec9b0;font-weight:600;font-family:monospace;font-size:13px;flex:1;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-count{font-size:11px;color:#888;background:#ffffff0d;padding:2px 6px;border-radius:10px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list{display:flex;flex-direction:column}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container{border-bottom:1px solid #333;display:flex;flex-direction:column}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container:last-child{border-bottom:none}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item{padding:8px 12px 8px 36px;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item:hover{background-color:#2a2a2a}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .store-badge{margin-right:8px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .path-text{color:#ce9178;font-family:monospace;font-size:12px;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:2px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .item-actions{display:flex;gap:6px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .item-actions .action-btn{background:none;border:none;color:#ccc;cursor:pointer;padding:4px;border-radius:4px;display:flex;align-items:center;justify-content:center}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .item-actions .action-btn:hover{background-color:#ffffff1a}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .item-actions .action-btn.delete:hover{background-color:#f4877133;color:#f48771}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .item-actions .action-btn.active{background-color:#2a2a2a;color:#4fc1ff}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .payload-content{border-top:1px solid #333;max-height:300px;overflow-y:auto;padding:10px 12px 10px 36px;background:#1e1e1e;color:#d16969;font-size:12px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt{padding:10px 0}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-header{display:flex;align-items:center;gap:8px;color:#e2c08d;font-weight:600;font-size:13px;margin-bottom:6px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-desc{font-size:12px;color:#888;margin:0 0 10px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-input-group{display:flex;gap:8px;margin-bottom:8px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-input-group .registry-search{background-color:#252526;border:1px solid #3c3c3c;border-radius:4px;color:#d4d4d4;padding:6px 10px;font-size:12px;flex:1;font-family:inherit;outline:none}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-input-group .registry-search:focus{border-color:#007acc}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-input-group .decrypt-btn{background-color:#007acc;color:#fff;border:none;border-radius:4px;padding:6px 12px;font-size:12px;cursor:pointer;transition:background-color .2s}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-input-group .decrypt-btn:hover{background-color:#005999}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .error-msg{color:#f48771;font-size:11px;margin-top:4px}.state-dashboard .empty-state{padding:20px;text-align:center;color:#666;font-style:italic}:host{display:block;height:100%}:host *::-webkit-scrollbar{width:8px;height:8px}:host *::-webkit-scrollbar-track{background:#1e1e1e;border-radius:4px}:host *::-webkit-scrollbar-thumb{background:#444;border-radius:4px}:host *::-webkit-scrollbar-thumb:hover{background:#555}:host .cache-dashboard{padding:20px;color:#d4d4d4}:host .store-badge{font-size:10px;padding:2px 6px;border-radius:4px;font-weight:600}:host .store-badge.session{background-color:#0e639c33;color:#4fc1ff}:host .store-badge.local{background-color:#60ac3933;color:#b5cea8}:host .store-badge.volatile{background-color:#d7ba7d33;color:#d7ba7d}.cleanup-table{display:flex;flex-direction:column;max-height:400px}.cleanup-table .cleanup-table-header{display:grid;grid-template-columns:80px 1fr 80px;gap:16px;padding:10px 16px;background-color:#252526;border-bottom:1px solid #333;font-size:12px;font-weight:600;color:#888;position:sticky;top:0}.cleanup-table .cleanup-table-body{overflow-y:auto;display:flex;flex-direction:column}.cleanup-table .cleanup-table-body .cleanup-table-row{display:grid;grid-template-columns:80px 1fr 80px;gap:16px;align-items:center;padding:8px 16px;border-bottom:1px solid #333}.cleanup-table .cleanup-table-body .cleanup-table-row:last-child{border-bottom:none}.cleanup-table .cleanup-table-body .cleanup-table-row:hover{background-color:#2a2a2a}.cleanup-table .cleanup-table-body .cleanup-table-row .col-type{display:flex;align-items:center}.cleanup-table .cleanup-table-body .cleanup-table-row .col-path{color:#ce9178;font-family:monospace;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center}.cleanup-table .cleanup-table-body .cleanup-table-row .col-size{color:#888;font-size:11px;text-align:right;background:#ffffff0d;padding:2px 6px;border-radius:10px}.modal-overlay{position:absolute;inset:0;width:100%;height:100%;background-color:#0009;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);display:flex;justify-content:center;align-items:center;z-index:1000}.modal-content{background-color:#1e1e1e;border:1px solid #333;border-radius:8px;width:90%;max-width:800px;max-height:90%;display:flex;flex-direction:column;box-shadow:0 10px 30px #00000080}.modal-content .modal-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #333;background-color:#252526;border-top-left-radius:8px;border-top-right-radius:8px;gap:12px}.modal-content .modal-header h3{margin:0;font-size:14px;color:#ccc;font-weight:600}.modal-content .modal-header .path-text{color:#ce9178;font-family:monospace;font-size:12px;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modal-content .modal-header .close-btn{background:none;border:none;color:#888;font-size:20px;cursor:pointer;line-height:1;padding:0 4px}.modal-content .modal-header .close-btn:hover{color:#ccc}.modal-content .modal-body{padding:16px;overflow-y:auto;flex:1}.modal-content .modal-body .decrypt-prompt{padding:10px 0}.modal-content .modal-body .decrypt-prompt .decrypt-header{display:flex;align-items:center;gap:8px;color:#e2c08d;font-weight:600;font-size:14px;margin-bottom:10px}.modal-content .modal-body .decrypt-prompt .decrypt-desc{font-size:13px;color:#888;margin:0 0 12px}.modal-content .modal-body .decrypt-prompt .decrypt-input-group{display:flex;gap:8px;margin-bottom:8px}.modal-content .modal-body .decrypt-prompt .decrypt-input-group .registry-search{background-color:#252526;border:1px solid #3c3c3c;border-radius:4px;color:#d4d4d4;padding:8px 12px;font-size:13px;flex:1;font-family:inherit;outline:none}.modal-content .modal-body .decrypt-prompt .decrypt-input-group .registry-search:focus{border-color:#007acc}.modal-content .modal-body .decrypt-prompt .decrypt-input-group .decrypt-btn{background-color:#007acc;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:13px;font-weight:600;cursor:pointer;transition:background-color .2s}.modal-content .modal-body .decrypt-prompt .decrypt-input-group .decrypt-btn:hover{background-color:#005999}.modal-content .modal-body .decrypt-prompt .error-msg{color:#f48771;font-size:12px;margin-top:6px}.info-banner{position:absolute;top:20px;left:50%;transform:translate(-50%);background-color:#252526;border:1px solid #4ec9b0;color:#4ec9b0;padding:8px 16px;border-radius:6px;box-shadow:0 4px 12px #00000080;z-index:1001;font-size:13px;display:flex;align-items:center;gap:8px;animation:slideDown .3s ease-out}@keyframes slideDown{0%{top:-40px;opacity:0}to{top:20px;opacity:1}}\n"],dependencies:[{kind:"ngmodule",type:w},{kind:"directive",type:m.NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:m.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:m.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"ngmodule",type:F},{kind:"directive",type:H.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:H.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:H.NgModel,selector:"[ngModel]:not([formControlName]):not([formControl])",inputs:["name","disabled","ngModel","ngModelOptions"],outputs:["ngModelChange"],exportAs:["ngModel"]},{kind:"component",type:JsonViewComponent,selector:"asor-json-view",inputs:["data","key","level","expandDepth"]}],encapsulation:t.ViewEncapsulation.ShadowDom})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:CacheTabComponent,decorators:[{type:p,args:[{selector:"asor-cache-tab",standalone:!0,imports:[w,F,JsonViewComponent],encapsulation:d.ShadowDom,template:'<div class="state-dashboard">\r\n\t\x3c!-- Cleanup Info Banner --\x3e\r\n\t<div class="info-banner" *ngIf="showCleanUpBanner">\r\n\t\t<svg\r\n\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\twidth="16"\r\n\t\t\theight="16"\r\n\t\t\tviewBox="0 0 24 24"\r\n\t\t\tfill="none"\r\n\t\t\tstroke="currentColor"\r\n\t\t\tstroke-width="2"\r\n\t\t\tstroke-linecap="round"\r\n\t\t\tstroke-linejoin="round"\r\n\t\t>\r\n\t\t\t<circle cx="12" cy="12" r="10"></circle>\r\n\t\t\t<line x1="12" y1="16" x2="12" y2="12"></line>\r\n\t\t\t<line x1="12" y1="8" x2="12.01" y2="8"></line>\r\n\t\t</svg>\r\n\t\t<span>No obsolete cache entries found. Everything is clean!</span>\r\n\t</div>\r\n\r\n\t\x3c!-- Clear All Info Banner --\x3e\r\n\t<div class="info-banner" *ngIf="showClearAllBanner">\r\n\t\t<svg\r\n\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\twidth="16"\r\n\t\t\theight="16"\r\n\t\t\tviewBox="0 0 24 24"\r\n\t\t\tfill="none"\r\n\t\t\tstroke="currentColor"\r\n\t\t\tstroke-width="2"\r\n\t\t\tstroke-linecap="round"\r\n\t\t\tstroke-linejoin="round"\r\n\t\t>\r\n\t\t\t<polyline points="20 6 9 17 4 12"></polyline>\r\n\t\t</svg>\r\n\t\t<span>All cache entries have been successfully cleared!</span>\r\n\t</div>\r\n\r\n\t\x3c!-- Header Stats --\x3e\r\n\t<div class="section-container header-section">\r\n\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.status">\r\n\t\t\t<div class="dashboard-header">\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Total Entries</div>\r\n\t\t\t\t\t<div class="value">{{ stats.total }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Total Cache Size</div>\r\n\t\t\t\t\t<div class="value">{{ formatSize(sizes.total) }}</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Volatile Cache</div>\r\n\t\t\t\t\t<div class="value" [class.active]="stats.volatile > 0">\r\n\t\t\t\t\t\t{{ stats.volatile }}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="label" style="font-size: 9px; margin-top: 2px">\r\n\t\t\t\t\t\t{{ formatSize(sizes.volatile) }}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Session Cache</div>\r\n\t\t\t\t\t<div class="value" [class.active]="stats.session > 0">{{ stats.session }}</div>\r\n\t\t\t\t\t<div class="label" style="font-size: 9px; margin-top: 2px">\r\n\t\t\t\t\t\t{{ formatSize(sizes.session) }}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="stat-card">\r\n\t\t\t\t\t<div class="label">Local Cache</div>\r\n\t\t\t\t\t<div class="value" [class.active]="stats.local > 0">{{ stats.local }}</div>\r\n\t\t\t\t\t<div class="label" style="font-size: 9px; margin-top: 2px">\r\n\t\t\t\t\t\t{{ formatSize(sizes.local) }}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div class="header-toolbar">\r\n\t\t\t<button class="circle-c-btn" (click)="cleanUpCache()" title="Clean Up Obsolete Cache">\r\n\t\t\t\t<svg\r\n\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\twidth="16"\r\n\t\t\t\t\theight="16"\r\n\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\tfill="none"\r\n\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t>\r\n\t\t\t\t\t<path d="m9.06 11.9 8.07-8.06a2.85 2.85 0 1 1 4.03 4.03l-8.06 8.08"></path>\r\n\t\t\t\t\t<path\r\n\t\t\t\t\t\td="M7.07 14.94c-1.66 0-3 1.35-3 3.02 0 1.33-2.5 1.52-2 2.02 1.08 1.35 2.22 1.45 3.02 1.45 2.26 0 4.14-1.84 4.14-4.11 0-1.66-1.35-3-3.02-3.02z"\r\n\t\t\t\t\t></path>\r\n\t\t\t\t</svg>\r\n\t\t\t</button>\r\n\t\t\t<button\r\n\t\t\t\tclass="circle-c-btn clear-all"\r\n\t\t\t\t(click)="clearAll(); $event.stopPropagation()"\r\n\t\t\t\ttitle="Clear All Cache"\r\n\t\t\t>\r\n\t\t\t\t<svg\r\n\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\twidth="14"\r\n\t\t\t\t\theight="14"\r\n\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\tfill="none"\r\n\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t>\r\n\t\t\t\t\t<polyline points="3 6 5 6 21 6"></polyline>\r\n\t\t\t\t\t<path\r\n\t\t\t\t\t\td="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2-2v2"\r\n\t\t\t\t\t></path>\r\n\t\t\t\t\t<line x1="10" y1="11" x2="10" y2="17"></line>\r\n\t\t\t\t\t<line x1="14" y1="11" x2="14" y2="17"></line>\r\n\t\t\t\t</svg>\r\n\t\t\t</button>\r\n\t\t\t<button\r\n\t\t\t\tclass="circle-c-btn"\r\n\t\t\t\t(click)="refreshCache(); $event.stopPropagation()"\r\n\t\t\t\ttitle="Refresh Cache"\r\n\t\t\t>\r\n\t\t\t\t↻\r\n\t\t\t</button>\r\n\t\t\t<button\r\n\t\t\t\tclass="circle-c-btn"\r\n\t\t\t\t[class.collapsed]="sectionsCollapsed.status"\r\n\t\t\t\t(click)="toggleSection(\'status\')"\r\n\t\t\t\ttitle="Toggle Status"\r\n\t\t\t>\r\n\t\t\t\t▾\r\n\t\t\t</button>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<div class="dashboard-content">\r\n\t\t<div class="split-view">\r\n\t\t\t\x3c!-- Active Rules Section --\x3e\r\n\t\t\t<div class="section-container">\r\n\t\t\t\t<h4 class="section-title" (click)="toggleSection(\'rules\')">\r\n\t\t\t\t\t<span>Active Cache Rules</span>\r\n\t\t\t\t\t<span class="collapse-icon" [class.collapsed]="sectionsCollapsed.rules">▾</span>\r\n\t\t\t\t</h4>\r\n\t\t\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.rules">\r\n\t\t\t\t\t<div class="registry-toolbar">\r\n\t\t\t\t\t\t<div class="search-container">\r\n\t\t\t\t\t\t\t<span class="search-icon">\r\n\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<circle cx="11" cy="11" r="8"></circle>\r\n\t\t\t\t\t\t\t\t\t<line x1="21" y1="21" x2="16.65" y2="16.65"></line>\r\n\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\tclass="registry-search"\r\n\t\t\t\t\t\t\t\t[(ngModel)]="rulesSearchTerm"\r\n\t\t\t\t\t\t\t\ttype="text"\r\n\t\t\t\t\t\t\t\tplaceholder="Filter rules by path or type..."\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tclass="clear-search-btn"\r\n\t\t\t\t\t\t\t\t*ngIf="rulesSearchTerm"\r\n\t\t\t\t\t\t\t\t(click)="rulesSearchTerm = \'\'"\r\n\t\t\t\t\t\t\t\ttitle="Clear search"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t×\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tclass="registry-table-container"\r\n\t\t\t\t\t\t*ngIf="filteredRuleGroups.length > 0; else noRules"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<div class="registry-group" *ngFor="let group of filteredRuleGroups">\r\n\t\t\t\t\t\t\t<div class="registry-group-header">\r\n\t\t\t\t\t\t\t\t<span class="comp-icon">\r\n\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<ellipse cx="12" cy="5" rx="9" ry="3"></ellipse>\r\n\t\t\t\t\t\t\t\t\t\t<path d="M21 12c0 1.66-4 3-9 3s-9-1.34-9-3"></path>\r\n\t\t\t\t\t\t\t\t\t\t<path d="M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5"></path>\r\n\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t<span class="comp-name">{{ group.persistenceType }}</span>\r\n\t\t\t\t\t\t\t\t<span class="comp-count"\r\n\t\t\t\t\t\t\t\t\t>{{ group.rules.length }} rule<ng-container\r\n\t\t\t\t\t\t\t\t\t\t*ngIf="group.rules.length !== 1"\r\n\t\t\t\t\t\t\t\t\t\t>s</ng-container\r\n\t\t\t\t\t\t\t\t\t></span\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<span class="comp-count" style="margin-left: auto">{{\r\n\t\t\t\t\t\t\t\t\tgetSizeForType(group.persistenceType)\r\n\t\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="rules-list" style="padding: 10px">\r\n\t\t\t\t\t\t\t\t<div class="rule-card" *ngFor="let rule of group.rules">\r\n\t\t\t\t\t\t\t\t\t<div class="rule-header">\r\n\t\t\t\t\t\t\t\t\t\t<span class="rule-path">{{ rule.pathValue }}</span>\r\n\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\tclass="store-badge"\r\n\t\t\t\t\t\t\t\t\t\t\t[ngClass]="\r\n\t\t\t\t\t\t\t\t\t\t\t\trule.persistenceType.toString().toLowerCase()\r\n\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t>{{ rule.persistenceType }}</span\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<div class="rule-body">\r\n\t\t\t\t\t\t\t\t\t\t<div class="rule-detail">\r\n\t\t\t\t\t\t\t\t\t\t\t<strong>Payload Cache:</strong>\r\n\t\t\t\t\t\t\t\t\t\t\t{{ rule.reqPayloadCache ? \'Enabled\' : \'Disabled\' }}\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t<div class="rule-detail">\r\n\t\t\t\t\t\t\t\t\t\t\t<strong>Encryption:</strong> {{ rule.encriptType }}\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\t\t\tclass="rule-detail"\r\n\t\t\t\t\t\t\t\t\t\t\t*ngIf="rule.clearOn && rule.clearOn.length > 0"\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<strong>Clear On:</strong>\r\n\t\t\t\t\t\t\t\t\t\t\t<ul class="clear-on-list">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<li *ngFor="let c of rule.clearOn">{{ c }}</li>\r\n\t\t\t\t\t\t\t\t\t\t\t</ul>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<ng-template #noRules>\r\n\t\t\t\t\t\t<div class="empty-state">No cache rules match the filter.</div>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t\x3c!-- Cache Entries Section --\x3e\r\n\t\t\t<div class="section-container">\r\n\t\t\t\t<h4 class="section-title" (click)="toggleSection(\'entries\')">\r\n\t\t\t\t\t<span>Cache Entries</span>\r\n\t\t\t\t\t<span class="collapse-icon" [class.collapsed]="sectionsCollapsed.entries"\r\n\t\t\t\t\t\t>▾</span\r\n\t\t\t\t\t>\r\n\t\t\t\t</h4>\r\n\t\t\t\t<div class="section-body" [class.collapsed]="sectionsCollapsed.entries">\r\n\t\t\t\t\t<div class="registry-toolbar">\r\n\t\t\t\t\t\t<div class="search-container">\r\n\t\t\t\t\t\t\t<span class="search-icon">\r\n\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<circle cx="11" cy="11" r="8"></circle>\r\n\t\t\t\t\t\t\t\t\t<line x1="21" y1="21" x2="16.65" y2="16.65"></line>\r\n\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\tclass="registry-search"\r\n\t\t\t\t\t\t\t\t[(ngModel)]="entriesSearchTerm"\r\n\t\t\t\t\t\t\t\ttype="text"\r\n\t\t\t\t\t\t\t\tplaceholder="Filter entries by key or type..."\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tclass="clear-search-btn"\r\n\t\t\t\t\t\t\t\t*ngIf="entriesSearchTerm"\r\n\t\t\t\t\t\t\t\t(click)="entriesSearchTerm = \'\'"\r\n\t\t\t\t\t\t\t\ttitle="Clear search"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t×\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tclass="registry-table-container"\r\n\t\t\t\t\t\t*ngIf="filteredCacheGroups.length > 0; else noData"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<div class="registry-group" *ngFor="let group of filteredCacheGroups">\r\n\t\t\t\t\t\t\t<div class="registry-group-header">\r\n\t\t\t\t\t\t\t\t<span class="comp-icon">\r\n\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<polygon points="12 2 2 7 12 12 22 7 12 2"></polygon>\r\n\t\t\t\t\t\t\t\t\t\t<polyline points="2 17 12 22 22 17"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t<polyline points="2 12 12 17 22 12"></polyline>\r\n\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t<span class="comp-name">{{ group.rulePath }}</span>\r\n\t\t\t\t\t\t\t\t<span class="comp-count"\r\n\t\t\t\t\t\t\t\t\t>{{ group.entries.length }} entry<ng-container\r\n\t\t\t\t\t\t\t\t\t\t*ngIf="group.entries.length !== 1"\r\n\t\t\t\t\t\t\t\t\t\t>s</ng-container\r\n\t\t\t\t\t\t\t\t\t></span\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<span class="comp-count" style="margin-left: auto">{{\r\n\t\t\t\t\t\t\t\t\tgetGroupSize(group)\r\n\t\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class="registry-list">\r\n\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\tclass="registry-item-container"\r\n\t\t\t\t\t\t\t\t\t*ngFor="let entry of group.entries"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<div class="registry-item">\r\n\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\tclass="store-badge"\r\n\t\t\t\t\t\t\t\t\t\t\t[ngClass]="\r\n\t\t\t\t\t\t\t\t\t\t\t\tentry.persistenceType.toString().toLowerCase()\r\n\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t>{{ entry.persistenceType }}</span\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<span class="path-text" [title]="entry.key">\r\n\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t*ngIf="entry.encriptType !== \'NONE\'"\r\n\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\tstyle="\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmargin-right: 4px;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tvertical-align: text-top;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: #dcdcaa;\r\n\t\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<rect\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tx="3"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\ty="11"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="18"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="11"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\trx="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\try="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t></rect>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<path d="M7 11V7a5 5 0 0 1 10 0v4"></path>\r\n\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t{{ entry.key }}\r\n\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t<span class="comp-count" style="margin-right: 8px">{{\r\n\t\t\t\t\t\t\t\t\t\t\tformatSize(entry.dataSize || 0)\r\n\t\t\t\t\t\t\t\t\t\t}}</span>\r\n\t\t\t\t\t\t\t\t\t\t<div class="item-actions">\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="action-btn"\r\n\t\t\t\t\t\t\t\t\t\t\t\t[class.active]="expandedContentId === entry.key"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="\r\n\t\t\t\t\t\t\t\t\t\t\t\t\topenContentModal(entry.key, entry.encriptType)\r\n\t\t\t\t\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="View Content"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<circle cx="12" cy="12" r="3"></circle>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="action-btn"\r\n\t\t\t\t\t\t\t\t\t\t\t\t*ngIf="entry.hasPayload"\r\n\t\t\t\t\t\t\t\t\t\t\t\t[class.active]="expandedPayloadId === entry.key"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="togglePayload(entry.key)"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Toggle Payload Request"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<polyline\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpoints="22 12 18 12 15 21 9 3 6 12 2 12"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass="action-btn delete"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)="deleteEntry(entry.key)"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle="Delete Entry"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight="14"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<polyline points="3 6 5 6 21 6"></polyline>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2-2v2"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t></path>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\t\tclass="payload-content"\r\n\t\t\t\t\t\t\t\t\t\t*ngIf="expandedPayloadId === entry.key"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<asor-json-view\r\n\t\t\t\t\t\t\t\t\t\t\t*ngIf="entry.payloadData"\r\n\t\t\t\t\t\t\t\t\t\t\t[data]="entry.payloadData"\r\n\t\t\t\t\t\t\t\t\t\t></asor-json-view>\r\n\t\t\t\t\t\t\t\t\t\t<span class="empty-payload" *ngIf="!entry.payloadData"\r\n\t\t\t\t\t\t\t\t\t\t\t>Unable to parse payload request.</span\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<ng-template #noData>\r\n\t\t\t\t\t\t<div class="empty-state">No items found in cache matching the filter.</div>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n\x3c!-- Modal Overlay for Content Details --\x3e\r\n<div class="modal-overlay" *ngIf="expandedContentId" (click)="closeContentModal()">\r\n\t<div class="modal-content" (click)="$event.stopPropagation()">\r\n\t\t<div class="modal-header">\r\n\t\t\t<h3>Content Details</h3>\r\n\t\t\t<span class="path-text" [title]="expandedContentId">{{ expandedContentId }}</span>\r\n\t\t\t<button class="close-btn" (click)="closeContentModal()" title="Close">×</button>\r\n\t\t</div>\r\n\t\t<div class="modal-body">\r\n\t\t\t<div class="decrypt-prompt" *ngIf="currentContent?._requiresKey">\r\n\t\t\t\t<div class="decrypt-header">\r\n\t\t\t\t\t<svg\r\n\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\twidth="16"\r\n\t\t\t\t\t\theight="16"\r\n\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect>\r\n\t\t\t\t\t\t<path d="M7 11V7a5 5 0 0 1 10 0v4"></path>\r\n\t\t\t\t\t</svg>\r\n\t\t\t\t\t<span>Encrypted Content</span>\r\n\t\t\t\t</div>\r\n\t\t\t\t<p class="decrypt-desc">Enter the decryption key to view this response.</p>\r\n\t\t\t\t<div class="decrypt-input-group">\r\n\t\t\t\t\t<input\r\n\t\t\t\t\t\tclass="registry-search"\r\n\t\t\t\t\t\t[(ngModel)]="customKeys[expandedContentId]"\r\n\t\t\t\t\t\ttype="password"\r\n\t\t\t\t\t\tplaceholder="Enter Secret Key"\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<button class="decrypt-btn" (click)="decryptContent(expandedContentId)">\r\n\t\t\t\t\t\tDecrypt\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="error-msg" *ngIf="decryptErrors[expandedContentId]">\r\n\t\t\t\t\t{{ decryptErrors[expandedContentId] }}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<asor-json-view\r\n\t\t\t\t*ngIf="currentContent && !currentContent._requiresKey"\r\n\t\t\t\t[data]="currentContent"\r\n\t\t\t></asor-json-view>\r\n\t\t\t<span class="empty-payload" *ngIf="!currentContent && currentContent !== null"\r\n\t\t\t\t>Empty content.</span\r\n\t\t\t>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n\x3c!-- Cleanup Results Modal --\x3e\r\n<div class="modal-overlay" *ngIf="isCleanupModalOpen" (click)="isCleanupModalOpen = false">\r\n\t<div class="modal-content" (click)="$event.stopPropagation()">\r\n\t\t<div class="modal-header">\r\n\t\t\t<h3>Cleaned Cache Entries</h3>\r\n\t\t\t<span class="path-text">Total recovered size: {{ formatSize(cleanedTotalSize) }}</span>\r\n\t\t\t<button class="close-btn" (click)="isCleanupModalOpen = false" title="Close">×</button>\r\n\t\t</div>\r\n\t\t<div class="modal-body" style="padding: 0">\r\n\t\t\t<div class="cleanup-table">\r\n\t\t\t\t<div class="cleanup-table-header">\r\n\t\t\t\t\t<span class="col-type">Type</span>\r\n\t\t\t\t\t<span class="col-path">Path</span>\r\n\t\t\t\t\t<span class="col-size" style="text-align: right">Size</span>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="cleanup-table-body">\r\n\t\t\t\t\t<div class="cleanup-table-row" *ngFor="let entry of cleanedEntries">\r\n\t\t\t\t\t\t<span class="col-type">\r\n\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\tclass="store-badge"\r\n\t\t\t\t\t\t\t\t*ngIf="entry.persistenceType"\r\n\t\t\t\t\t\t\t\t[ngClass]="entry.persistenceType.toString().toLowerCase()"\r\n\t\t\t\t\t\t\t\t>{{ entry.persistenceType }}</span\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<span class="col-path" [title]="entry.key">\r\n\t\t\t\t\t\t\t<svg\r\n\t\t\t\t\t\t\t\t*ngIf="entry.encriptType && entry.encriptType !== \'NONE\'"\r\n\t\t\t\t\t\t\t\txmlns="http://www.w3.org/2000/svg"\r\n\t\t\t\t\t\t\t\twidth="12"\r\n\t\t\t\t\t\t\t\theight="12"\r\n\t\t\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t\t\t\tstyle="margin-right: 6px; flex-shrink: 0; color: #dcdcaa"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect>\r\n\t\t\t\t\t\t\t\t<path d="M7 11V7a5 5 0 0 1 10 0v4"></path>\r\n\t\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\tstyle="\r\n\t\t\t\t\t\t\t\t\toverflow: hidden;\r\n\t\t\t\t\t\t\t\t\ttext-overflow: ellipsis;\r\n\t\t\t\t\t\t\t\t\twhite-space: nowrap;\r\n\t\t\t\t\t\t\t\t"\r\n\t\t\t\t\t\t\t\t>{{ entry.key }}</span\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<span class="col-size">{{ formatSize(entry.dataSize) }}</span>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n\x3c!-- Clear All Confirmation Modal --\x3e\r\n<div class="modal-overlay" *ngIf="isClearAllModalOpen" (click)="isClearAllModalOpen = false">\r\n\t<div class="modal-content" (click)="$event.stopPropagation()" style="max-width: 400px">\r\n\t\t<div class="modal-header">\r\n\t\t\t<h3>Confirm Cache Clear</h3>\r\n\t\t\t<button class="close-btn" (click)="isClearAllModalOpen = false" title="Close">×</button>\r\n\t\t</div>\r\n\t\t<div class="modal-body" style="padding: 20px">\r\n\t\t\t<p style="color: #ccc; margin: 0 0 20px 0; font-size: 14px; line-height: 1.5">\r\n\t\t\t\tAre you sure you want to completely clear the cache? This action cannot be undone.\r\n\t\t\t</p>\r\n\t\t\t<div style="display: flex; justify-content: flex-end; gap: 10px">\r\n\t\t\t\t<button\r\n\t\t\t\t\t(click)="isClearAllModalOpen = false"\r\n\t\t\t\t\tstyle="\r\n\t\t\t\t\t\tpadding: 6px 16px;\r\n\t\t\t\t\t\tbackground: transparent;\r\n\t\t\t\t\t\tborder: 1px solid #444;\r\n\t\t\t\t\t\tcolor: #ccc;\r\n\t\t\t\t\t\tborder-radius: 4px;\r\n\t\t\t\t\t\tcursor: pointer;\r\n\t\t\t\t\t\tfont-size: 13px;\r\n\t\t\t\t\t"\r\n\t\t\t\t>\r\n\t\t\t\t\tCancel\r\n\t\t\t\t</button>\r\n\t\t\t\t<button\r\n\t\t\t\t\t(click)="executeClearAll()"\r\n\t\t\t\t\tstyle="\r\n\t\t\t\t\t\tpadding: 6px 16px;\r\n\t\t\t\t\t\tbackground: rgba(244, 135, 113, 0.2);\r\n\t\t\t\t\t\tborder: 1px solid #f48771;\r\n\t\t\t\t\t\tcolor: #f48771;\r\n\t\t\t\t\t\tborder-radius: 4px;\r\n\t\t\t\t\t\tcursor: pointer;\r\n\t\t\t\t\t\tfont-size: 13px;\r\n\t\t\t\t\t\tfont-weight: 600;\r\n\t\t\t\t\t"\r\n\t\t\t\t>\r\n\t\t\t\t\tClear All\r\n\t\t\t\t</button>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n',styles:[".state-dashboard{display:flex;flex-direction:column;height:100%;color:#ccc;font-family:Segoe UI,sans-serif;gap:6px;overflow-y:auto}.state-dashboard::-webkit-scrollbar,.state-dashboard .registry-table-container::-webkit-scrollbar,.state-dashboard .payload-content::-webkit-scrollbar,.state-dashboard .rules-list::-webkit-scrollbar{width:10px;height:10px}.state-dashboard::-webkit-scrollbar-track,.state-dashboard .registry-table-container::-webkit-scrollbar-track,.state-dashboard .payload-content::-webkit-scrollbar-track,.state-dashboard .rules-list::-webkit-scrollbar-track{background:#1e1e1e}.state-dashboard::-webkit-scrollbar-thumb,.state-dashboard .registry-table-container::-webkit-scrollbar-thumb,.state-dashboard .payload-content::-webkit-scrollbar-thumb,.state-dashboard .rules-list::-webkit-scrollbar-thumb{background:#424242;border-radius:5px;border:2px solid #1e1e1e}.state-dashboard::-webkit-scrollbar-thumb:hover,.state-dashboard .registry-table-container::-webkit-scrollbar-thumb:hover,.state-dashboard .payload-content::-webkit-scrollbar-thumb:hover,.state-dashboard .rules-list::-webkit-scrollbar-thumb:hover{background:#4f4f4f}.state-dashboard .dashboard-header{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.state-dashboard .dashboard-header .stat-card{background-color:#252526;border:1px solid #333;border-radius:6px;padding:8px 12px;min-width:100px;display:flex;flex-direction:column;align-items:center}.state-dashboard .dashboard-header .stat-card .label{font-size:10px;color:#888;text-transform:uppercase;letter-spacing:.5px}.state-dashboard .dashboard-header .stat-card .value{font-size:14px;font-weight:600;color:#eee;margin-top:2px}.state-dashboard .dashboard-header .stat-card .value.active{color:#4caf50}.state-dashboard .header-toolbar{display:flex;justify-content:flex-end;gap:6px;padding:4px 8px}.state-dashboard .header-toolbar .circle-c-btn{background:none;border:1px solid #444;color:#ccc;cursor:pointer;width:30px;height:30px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s}.state-dashboard .header-toolbar .circle-c-btn:hover{background-color:#333}.state-dashboard .header-toolbar .circle-c-btn.clear-all:hover{background-color:#f4877133;color:#f48771}.state-dashboard .header-toolbar .circle-c-btn.collapsed{transform:rotate(-90deg)}.state-dashboard .header-section{flex-shrink:0;display:flex;flex-direction:row;align-items:flex-start;overflow:hidden;border-radius:6px}.state-dashboard .header-section .section-body{flex:1;min-width:0;padding:5px;transition:opacity .25s ease}.state-dashboard .header-section .section-body.collapsed{padding:0;margin:0;max-height:0;opacity:0}@media (max-width: 768px){.state-dashboard .header-section{display:unset}}.state-dashboard .dashboard-content{flex:1;overflow-y:auto;padding-right:5px}.state-dashboard .dashboard-content .split-view{display:flex;gap:20px;height:100%}.state-dashboard .dashboard-content .section-container{display:flex;flex-direction:column;overflow:hidden;border:1px solid #333;border-radius:6px;margin-bottom:20px;flex:1;min-width:0}@media (max-width: 768px){.state-dashboard .dashboard-content .split-view{flex-direction:column;height:auto}.state-dashboard .dashboard-content .section-container{flex:none}}.state-dashboard .dashboard-content .section-title{margin:4px 8px;font-size:13px;color:#888;font-weight:600;display:flex;justify-content:space-between;align-items:center;cursor:pointer;border-radius:4px}.state-dashboard .dashboard-content .section-title:hover{background-color:#2a2a2a}.state-dashboard .dashboard-content .section-title .collapse-icon{font-size:14px;transition:transform .25s ease}.state-dashboard .dashboard-content .section-title .collapse-icon.collapsed{transform:rotate(-90deg)}.state-dashboard .dashboard-content .section-body{padding:5px;max-height:2000px;transition:max-height .35s ease,opacity .25s ease;display:flex;flex-direction:column;flex:1;min-height:0}.state-dashboard .dashboard-content .section-body.collapsed{padding:0;max-height:0;opacity:0;overflow:hidden}.state-dashboard .dashboard-content .registry-toolbar{padding:8px 10px;background-color:#252526;border-bottom:1px solid #333;border-radius:4px}.state-dashboard .dashboard-content .registry-toolbar .search-container{position:relative;display:flex;align-items:center;background-color:#1e1e1e;border:1px solid #3c3c3c;border-radius:4px}.state-dashboard .dashboard-content .registry-toolbar .search-container:focus-within{border-color:#007acc}.state-dashboard .dashboard-content .registry-toolbar .search-container .search-icon{padding:0 8px;color:#888;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-toolbar .search-container .registry-search{flex:1;background:transparent;border:none;color:#d4d4d4;padding:6px 0;font-size:13px;font-family:inherit;outline:none}.state-dashboard .dashboard-content .registry-toolbar .search-container .registry-search::placeholder{color:#666}.state-dashboard .dashboard-content .registry-toolbar .search-container .clear-search-btn{background:transparent;border:none;color:#888;padding:0 8px;cursor:pointer;font-size:16px;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-toolbar .search-container .clear-search-btn:hover{color:#ccc}.state-dashboard .dashboard-content .rules-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px;overflow-y:auto;flex:1;padding:2px 5px 20px}.state-dashboard .dashboard-content .rules-list .rule-card{background-color:#1e1e1e;border:1px solid #333;border-radius:6px;padding:10px}.state-dashboard .dashboard-content .rules-list .rule-card .rule-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.state-dashboard .dashboard-content .rules-list .rule-card .rule-header .rule-path{font-family:monospace;color:#dcdcaa;font-weight:700}.state-dashboard .dashboard-content .rules-list .rule-card .rule-body{font-size:12px;color:#9cdcfe}.state-dashboard .dashboard-content .rules-list .rule-card .rule-body .rule-detail{margin-top:4px}.state-dashboard .dashboard-content .rules-list .rule-card .rule-body .rule-detail strong{color:#888}.state-dashboard .dashboard-content .rules-list .rule-card .rule-body .rule-detail .clear-on-list{margin:4px 0 0 16px;padding:0;color:#ce9178;font-family:monospace}.state-dashboard .dashboard-content .registry-table-container{overflow-y:auto;flex:1;padding:2px 5px 20px}.state-dashboard .dashboard-content .registry-table-container .registry-group{margin-bottom:16px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header{display:flex;align-items:center;gap:8px;padding:6px 12px;background-color:#252526;border-top:1px solid #333;border-bottom:1px solid #333;border-radius:4px;position:sticky;top:0;z-index:10}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-icon{color:#4ec9b0;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-name{color:#4ec9b0;font-weight:600;font-family:monospace;font-size:13px;flex:1;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-group-header .comp-count{font-size:11px;color:#888;background:#ffffff0d;padding:2px 6px;border-radius:10px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list{display:flex;flex-direction:column}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container{border-bottom:1px solid #333;display:flex;flex-direction:column}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container:last-child{border-bottom:none}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item{padding:8px 12px 8px 36px;display:flex;align-items:center}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item:hover{background-color:#2a2a2a}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .store-badge{margin-right:8px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .path-text{color:#ce9178;font-family:monospace;font-size:12px;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:2px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .item-actions{display:flex;gap:6px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .item-actions .action-btn{background:none;border:none;color:#ccc;cursor:pointer;padding:4px;border-radius:4px;display:flex;align-items:center;justify-content:center}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .item-actions .action-btn:hover{background-color:#ffffff1a}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .item-actions .action-btn.delete:hover{background-color:#f4877133;color:#f48771}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .registry-item .item-actions .action-btn.active{background-color:#2a2a2a;color:#4fc1ff}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .payload-content{border-top:1px solid #333;max-height:300px;overflow-y:auto;padding:10px 12px 10px 36px;background:#1e1e1e;color:#d16969;font-size:12px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt{padding:10px 0}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-header{display:flex;align-items:center;gap:8px;color:#e2c08d;font-weight:600;font-size:13px;margin-bottom:6px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-desc{font-size:12px;color:#888;margin:0 0 10px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-input-group{display:flex;gap:8px;margin-bottom:8px}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-input-group .registry-search{background-color:#252526;border:1px solid #3c3c3c;border-radius:4px;color:#d4d4d4;padding:6px 10px;font-size:12px;flex:1;font-family:inherit;outline:none}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-input-group .registry-search:focus{border-color:#007acc}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-input-group .decrypt-btn{background-color:#007acc;color:#fff;border:none;border-radius:4px;padding:6px 12px;font-size:12px;cursor:pointer;transition:background-color .2s}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .decrypt-input-group .decrypt-btn:hover{background-color:#005999}.state-dashboard .dashboard-content .registry-table-container .registry-group .registry-list .registry-item-container .decrypt-prompt .error-msg{color:#f48771;font-size:11px;margin-top:4px}.state-dashboard .empty-state{padding:20px;text-align:center;color:#666;font-style:italic}:host{display:block;height:100%}:host *::-webkit-scrollbar{width:8px;height:8px}:host *::-webkit-scrollbar-track{background:#1e1e1e;border-radius:4px}:host *::-webkit-scrollbar-thumb{background:#444;border-radius:4px}:host *::-webkit-scrollbar-thumb:hover{background:#555}:host .cache-dashboard{padding:20px;color:#d4d4d4}:host .store-badge{font-size:10px;padding:2px 6px;border-radius:4px;font-weight:600}:host .store-badge.session{background-color:#0e639c33;color:#4fc1ff}:host .store-badge.local{background-color:#60ac3933;color:#b5cea8}:host .store-badge.volatile{background-color:#d7ba7d33;color:#d7ba7d}.cleanup-table{display:flex;flex-direction:column;max-height:400px}.cleanup-table .cleanup-table-header{display:grid;grid-template-columns:80px 1fr 80px;gap:16px;padding:10px 16px;background-color:#252526;border-bottom:1px solid #333;font-size:12px;font-weight:600;color:#888;position:sticky;top:0}.cleanup-table .cleanup-table-body{overflow-y:auto;display:flex;flex-direction:column}.cleanup-table .cleanup-table-body .cleanup-table-row{display:grid;grid-template-columns:80px 1fr 80px;gap:16px;align-items:center;padding:8px 16px;border-bottom:1px solid #333}.cleanup-table .cleanup-table-body .cleanup-table-row:last-child{border-bottom:none}.cleanup-table .cleanup-table-body .cleanup-table-row:hover{background-color:#2a2a2a}.cleanup-table .cleanup-table-body .cleanup-table-row .col-type{display:flex;align-items:center}.cleanup-table .cleanup-table-body .cleanup-table-row .col-path{color:#ce9178;font-family:monospace;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center}.cleanup-table .cleanup-table-body .cleanup-table-row .col-size{color:#888;font-size:11px;text-align:right;background:#ffffff0d;padding:2px 6px;border-radius:10px}.modal-overlay{position:absolute;inset:0;width:100%;height:100%;background-color:#0009;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);display:flex;justify-content:center;align-items:center;z-index:1000}.modal-content{background-color:#1e1e1e;border:1px solid #333;border-radius:8px;width:90%;max-width:800px;max-height:90%;display:flex;flex-direction:column;box-shadow:0 10px 30px #00000080}.modal-content .modal-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #333;background-color:#252526;border-top-left-radius:8px;border-top-right-radius:8px;gap:12px}.modal-content .modal-header h3{margin:0;font-size:14px;color:#ccc;font-weight:600}.modal-content .modal-header .path-text{color:#ce9178;font-family:monospace;font-size:12px;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modal-content .modal-header .close-btn{background:none;border:none;color:#888;font-size:20px;cursor:pointer;line-height:1;padding:0 4px}.modal-content .modal-header .close-btn:hover{color:#ccc}.modal-content .modal-body{padding:16px;overflow-y:auto;flex:1}.modal-content .modal-body .decrypt-prompt{padding:10px 0}.modal-content .modal-body .decrypt-prompt .decrypt-header{display:flex;align-items:center;gap:8px;color:#e2c08d;font-weight:600;font-size:14px;margin-bottom:10px}.modal-content .modal-body .decrypt-prompt .decrypt-desc{font-size:13px;color:#888;margin:0 0 12px}.modal-content .modal-body .decrypt-prompt .decrypt-input-group{display:flex;gap:8px;margin-bottom:8px}.modal-content .modal-body .decrypt-prompt .decrypt-input-group .registry-search{background-color:#252526;border:1px solid #3c3c3c;border-radius:4px;color:#d4d4d4;padding:8px 12px;font-size:13px;flex:1;font-family:inherit;outline:none}.modal-content .modal-body .decrypt-prompt .decrypt-input-group .registry-search:focus{border-color:#007acc}.modal-content .modal-body .decrypt-prompt .decrypt-input-group .decrypt-btn{background-color:#007acc;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:13px;font-weight:600;cursor:pointer;transition:background-color .2s}.modal-content .modal-body .decrypt-prompt .decrypt-input-group .decrypt-btn:hover{background-color:#005999}.modal-content .modal-body .decrypt-prompt .error-msg{color:#f48771;font-size:12px;margin-top:6px}.info-banner{position:absolute;top:20px;left:50%;transform:translate(-50%);background-color:#252526;border:1px solid #4ec9b0;color:#4ec9b0;padding:8px 16px;border-radius:6px;box-shadow:0 4px 12px #00000080;z-index:1001;font-size:13px;display:flex;align-items:center;gap:8px;animation:slideDown .3s ease-out}@keyframes slideDown{0%{top:-40px;opacity:0}to{top:20px;opacity:1}}\n"]}]}],ctorParameters:()=>[{type:WidgetCacheUtility}]});class AsorWidgetComponent{mode="on";logoSrc="data:image/png;base64,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";isOpen=!1;activeTab="console";widgetHeight=80;spyActivated=!1;get isVisible(){switch(this.mode){case"off":return!1;case"on":return!0;case"spy":return this.spyActivated}}onKeyDown(t){"spy"===this.mode&&t.ctrlKey&&"i"===t.key.toLowerCase()&&(t.preventDefault(),this.spyActivated=!this.spyActivated,this.spyActivated||(this.isOpen=!1))}toggleSlider(){this.isOpen=!this.isOpen}setHeight(t){this.widgetHeight=t}selectTab(t){this.activeTab=t}onTabChange(t){this.selectTab(t.target.value)}static ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:AsorWidgetComponent,deps:[],target:t.ɵɵFactoryTarget.Component});static ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"20.3.18",type:AsorWidgetComponent,isStandalone:!0,selector:"asor-core-widget",inputs:{mode:"mode"},host:{listeners:{"document:keydown":"onKeyDown($event)"}},ngImport:t,template:'<div class="asor-widget-container" *ngIf="isVisible">\r\n\t<div\r\n\t\tclass="slider"\r\n\t\t[class.open]="isOpen"\r\n\t\t[style.height.%]="widgetHeight"\r\n\t\t[style.bottom.%]="isOpen ? 0 : -widgetHeight"\r\n\t>\r\n\t\t<div class="slider-header">\r\n\t\t\t<div class="header-left">\r\n\t\t\t\t<img class="header-logo" [src]="logoSrc" alt="Asor Logo" />\r\n\t\t\t\t<span class="logo-text">Asor Core</span>\r\n\t\t\t\t<nav class="tabs">\r\n\t\t\t\t\t<button [class.active]="activeTab === \'console\'" (click)="selectTab(\'console\')">\r\n\t\t\t\t\t\tConsole\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<button [class.active]="activeTab === \'storage\'" (click)="selectTab(\'storage\')">\r\n\t\t\t\t\t\tStorage\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<button [class.active]="activeTab === \'cache\'" (click)="selectTab(\'cache\')">\r\n\t\t\t\t\t\tCache\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</nav>\r\n\t\t\t\t<div class="mobile-tabs">\r\n\t\t\t\t\t<select [value]="activeTab" (change)="onTabChange($event)">\r\n\t\t\t\t\t\t<option value="console">Console</option>\r\n\t\t\t\t\t\t<option value="storage">Storage</option>\r\n\t\t\t\t\t\t<option value="cache">Cache</option>\r\n\t\t\t\t\t</select>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<div class="header-right">\r\n\t\t\t\t<button\r\n\t\t\t\t\tclass="resize-btn"\r\n\t\t\t\t\t[class.active]="widgetHeight === 20"\r\n\t\t\t\t\t(click)="setHeight(20)"\r\n\t\t\t\t\ttitle="20%"\r\n\t\t\t\t>\r\n\t\t\t\t\t<svg\r\n\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\twidth="16"\r\n\t\t\t\t\t\theight="16"\r\n\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>\r\n\t\t\t\t\t\t<line x1="3" y1="17" x2="21" y2="17"></line>\r\n\t\t\t\t\t</svg>\r\n\t\t\t\t</button>\r\n\t\t\t\t<button\r\n\t\t\t\t\tclass="resize-btn"\r\n\t\t\t\t\t[class.active]="widgetHeight === 80"\r\n\t\t\t\t\t(click)="setHeight(80)"\r\n\t\t\t\t\ttitle="80%"\r\n\t\t\t\t>\r\n\t\t\t\t\t<svg\r\n\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\twidth="16"\r\n\t\t\t\t\t\theight="16"\r\n\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>\r\n\t\t\t\t\t\t<line x1="3" y1="7" x2="21" y2="7"></line>\r\n\t\t\t\t\t</svg>\r\n\t\t\t\t</button>\r\n\t\t\t\t<button\r\n\t\t\t\t\tclass="resize-btn"\r\n\t\t\t\t\t[class.active]="widgetHeight === 100"\r\n\t\t\t\t\t(click)="setHeight(100)"\r\n\t\t\t\t\ttitle="100%"\r\n\t\t\t\t>\r\n\t\t\t\t\t<svg\r\n\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\twidth="16"\r\n\t\t\t\t\t\theight="16"\r\n\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>\r\n\t\t\t\t\t</svg>\r\n\t\t\t\t</button>\r\n\t\t\t\t<button class="close-btn" (click)="toggleSlider()">×</button>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t<div class="slider-content">\r\n\t\t\t<asor-console-tab class="tab-panel" *ngIf="activeTab === \'console\'"></asor-console-tab>\r\n\t\t\t<asor-storage-tab class="tab-panel" *ngIf="activeTab === \'storage\'"></asor-storage-tab>\r\n\t\t\t<asor-cache-tab class="tab-panel" *ngIf="activeTab === \'cache\'"></asor-cache-tab>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<button class="floating-btn" *ngIf="!isOpen" (click)="toggleSlider()">\r\n\t\t<img [src]="logoSrc" alt="Asor Core Logo" />\r\n\t</button>\r\n</div>\r\n',styles:[":host{display:block}.asor-widget-container{font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif}.asor-widget-container *,.asor-widget-container *:before,.asor-widget-container *:after{box-sizing:border-box}.floating-btn{position:fixed;bottom:20px;right:20px;width:50px;height:50px;border-radius:50%;background-color:#007acc;box-shadow:0 4px 15px #0006;border:none;cursor:pointer;z-index:9999;display:flex;align-items:center;justify-content:center;transition:all .3s cubic-bezier(.25,.8,.25,1)}.floating-btn:hover{transform:scale(1.1);box-shadow:0 6px 20px #00000080}.floating-btn img{width:60%;height:60%;object-fit:contain;filter:brightness(0) invert(1)}.slider{position:fixed;left:0;right:0;background-color:#1e1e1e;color:#ccc;box-shadow:0 -4px 25px #00000080;z-index:9998;transition:bottom .4s cubic-bezier(.25,.8,.25,1),height .4s cubic-bezier(.25,.8,.25,1);border-top-left-radius:12px;border-top-right-radius:12px;display:flex;flex-direction:column;border-top:1px solid #333;overflow-y:auto;overscroll-behavior:none}.slider .slider-header{padding:0 20px;height:50px;border-bottom:1px solid #333;background-color:#252526;display:flex;justify-content:space-between;align-items:center;border-top-left-radius:12px;border-top-right-radius:12px}.slider .slider-header .header-left{display:flex;align-items:center;gap:12px}.slider .slider-header .header-left .header-logo{height:24px;width:auto;vertical-align:middle}.slider .slider-header .logo-text{font-weight:600;color:#fff;font-size:14px;letter-spacing:.5px}.slider .slider-header .tabs{display:flex;gap:10px;height:100%}@media (max-width: 768px){.slider .slider-header .tabs{display:none}}.slider .slider-header .tabs button{background:none;border:none;height:100%;padding:0 10px;font-size:13px;cursor:pointer;color:#999;transition:color .2s,border-bottom .2s;border-bottom:2px solid transparent}.slider .slider-header .tabs button:hover{color:#fff}.slider .slider-header .tabs button.active{color:#fff;border-bottom-color:#007acc}.slider .slider-header .mobile-tabs{display:none;height:100%;align-items:center}.slider .slider-header .mobile-tabs select{background-color:#333;color:#fff;border:1px solid #444;border-radius:4px;padding:4px 8px;font-family:inherit;font-size:13px;outline:none}.slider .slider-header .mobile-tabs select:focus{border-color:#007acc}@media (max-width: 768px){.slider .slider-header .mobile-tabs{display:flex}}.slider .slider-header .header-right{display:flex;align-items:center;gap:4px}.slider .slider-header .header-right .resize-btn,.slider .slider-header .header-right .close-btn{background:none;border:none;cursor:pointer;color:#999;width:30px;height:30px;display:flex;align-items:center;justify-content:center;border-radius:4px}.slider .slider-header .header-right .resize-btn.active,.slider .slider-header .header-right .resize-btn:hover,.slider .slider-header .header-right .close-btn.active,.slider .slider-header .header-right .close-btn:hover{background-color:#333;color:#fff}.slider .slider-header .header-right .close-btn{font-size:20px}.slider .slider-content{flex:1;padding:16px;overflow:hidden;background-color:#1e1e1e}.slider .tab-panel{height:100%;display:block}@media (max-width: 768px){.slider .floating-btn{bottom:16px;right:16px;width:44px;height:44px}.slider .slider.open~.floating-btn{display:none}}\n"],dependencies:[{kind:"ngmodule",type:w},{kind:"directive",type:m.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:ConsoleTabComponent,selector:"asor-console-tab"},{kind:"component",type:StorageTabComponent,selector:"asor-storage-tab"},{kind:"component",type:CacheTabComponent,selector:"asor-cache-tab"}],encapsulation:t.ViewEncapsulation.ShadowDom})}t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"20.3.18",ngImport:t,type:AsorWidgetComponent,decorators:[{type:p,args:[{selector:"asor-core-widget",standalone:!0,imports:[w,ConsoleTabComponent,StorageTabComponent,CacheTabComponent],encapsulation:d.ShadowDom,template:'<div class="asor-widget-container" *ngIf="isVisible">\r\n\t<div\r\n\t\tclass="slider"\r\n\t\t[class.open]="isOpen"\r\n\t\t[style.height.%]="widgetHeight"\r\n\t\t[style.bottom.%]="isOpen ? 0 : -widgetHeight"\r\n\t>\r\n\t\t<div class="slider-header">\r\n\t\t\t<div class="header-left">\r\n\t\t\t\t<img class="header-logo" [src]="logoSrc" alt="Asor Logo" />\r\n\t\t\t\t<span class="logo-text">Asor Core</span>\r\n\t\t\t\t<nav class="tabs">\r\n\t\t\t\t\t<button [class.active]="activeTab === \'console\'" (click)="selectTab(\'console\')">\r\n\t\t\t\t\t\tConsole\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<button [class.active]="activeTab === \'storage\'" (click)="selectTab(\'storage\')">\r\n\t\t\t\t\t\tStorage\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<button [class.active]="activeTab === \'cache\'" (click)="selectTab(\'cache\')">\r\n\t\t\t\t\t\tCache\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</nav>\r\n\t\t\t\t<div class="mobile-tabs">\r\n\t\t\t\t\t<select [value]="activeTab" (change)="onTabChange($event)">\r\n\t\t\t\t\t\t<option value="console">Console</option>\r\n\t\t\t\t\t\t<option value="storage">Storage</option>\r\n\t\t\t\t\t\t<option value="cache">Cache</option>\r\n\t\t\t\t\t</select>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<div class="header-right">\r\n\t\t\t\t<button\r\n\t\t\t\t\tclass="resize-btn"\r\n\t\t\t\t\t[class.active]="widgetHeight === 20"\r\n\t\t\t\t\t(click)="setHeight(20)"\r\n\t\t\t\t\ttitle="20%"\r\n\t\t\t\t>\r\n\t\t\t\t\t<svg\r\n\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\twidth="16"\r\n\t\t\t\t\t\theight="16"\r\n\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>\r\n\t\t\t\t\t\t<line x1="3" y1="17" x2="21" y2="17"></line>\r\n\t\t\t\t\t</svg>\r\n\t\t\t\t</button>\r\n\t\t\t\t<button\r\n\t\t\t\t\tclass="resize-btn"\r\n\t\t\t\t\t[class.active]="widgetHeight === 80"\r\n\t\t\t\t\t(click)="setHeight(80)"\r\n\t\t\t\t\ttitle="80%"\r\n\t\t\t\t>\r\n\t\t\t\t\t<svg\r\n\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\twidth="16"\r\n\t\t\t\t\t\theight="16"\r\n\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>\r\n\t\t\t\t\t\t<line x1="3" y1="7" x2="21" y2="7"></line>\r\n\t\t\t\t\t</svg>\r\n\t\t\t\t</button>\r\n\t\t\t\t<button\r\n\t\t\t\t\tclass="resize-btn"\r\n\t\t\t\t\t[class.active]="widgetHeight === 100"\r\n\t\t\t\t\t(click)="setHeight(100)"\r\n\t\t\t\t\ttitle="100%"\r\n\t\t\t\t>\r\n\t\t\t\t\t<svg\r\n\t\t\t\t\t\tviewBox="0 0 24 24"\r\n\t\t\t\t\t\twidth="16"\r\n\t\t\t\t\t\theight="16"\r\n\t\t\t\t\t\tstroke="currentColor"\r\n\t\t\t\t\t\tstroke-width="2"\r\n\t\t\t\t\t\tfill="none"\r\n\t\t\t\t\t\tstroke-linecap="round"\r\n\t\t\t\t\t\tstroke-linejoin="round"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>\r\n\t\t\t\t\t</svg>\r\n\t\t\t\t</button>\r\n\t\t\t\t<button class="close-btn" (click)="toggleSlider()">×</button>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t\t<div class="slider-content">\r\n\t\t\t<asor-console-tab class="tab-panel" *ngIf="activeTab === \'console\'"></asor-console-tab>\r\n\t\t\t<asor-storage-tab class="tab-panel" *ngIf="activeTab === \'storage\'"></asor-storage-tab>\r\n\t\t\t<asor-cache-tab class="tab-panel" *ngIf="activeTab === \'cache\'"></asor-cache-tab>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<button class="floating-btn" *ngIf="!isOpen" (click)="toggleSlider()">\r\n\t\t<img [src]="logoSrc" alt="Asor Core Logo" />\r\n\t</button>\r\n</div>\r\n',styles:[":host{display:block}.asor-widget-container{font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif}.asor-widget-container *,.asor-widget-container *:before,.asor-widget-container *:after{box-sizing:border-box}.floating-btn{position:fixed;bottom:20px;right:20px;width:50px;height:50px;border-radius:50%;background-color:#007acc;box-shadow:0 4px 15px #0006;border:none;cursor:pointer;z-index:9999;display:flex;align-items:center;justify-content:center;transition:all .3s cubic-bezier(.25,.8,.25,1)}.floating-btn:hover{transform:scale(1.1);box-shadow:0 6px 20px #00000080}.floating-btn img{width:60%;height:60%;object-fit:contain;filter:brightness(0) invert(1)}.slider{position:fixed;left:0;right:0;background-color:#1e1e1e;color:#ccc;box-shadow:0 -4px 25px #00000080;z-index:9998;transition:bottom .4s cubic-bezier(.25,.8,.25,1),height .4s cubic-bezier(.25,.8,.25,1);border-top-left-radius:12px;border-top-right-radius:12px;display:flex;flex-direction:column;border-top:1px solid #333;overflow-y:auto;overscroll-behavior:none}.slider .slider-header{padding:0 20px;height:50px;border-bottom:1px solid #333;background-color:#252526;display:flex;justify-content:space-between;align-items:center;border-top-left-radius:12px;border-top-right-radius:12px}.slider .slider-header .header-left{display:flex;align-items:center;gap:12px}.slider .slider-header .header-left .header-logo{height:24px;width:auto;vertical-align:middle}.slider .slider-header .logo-text{font-weight:600;color:#fff;font-size:14px;letter-spacing:.5px}.slider .slider-header .tabs{display:flex;gap:10px;height:100%}@media (max-width: 768px){.slider .slider-header .tabs{display:none}}.slider .slider-header .tabs button{background:none;border:none;height:100%;padding:0 10px;font-size:13px;cursor:pointer;color:#999;transition:color .2s,border-bottom .2s;border-bottom:2px solid transparent}.slider .slider-header .tabs button:hover{color:#fff}.slider .slider-header .tabs button.active{color:#fff;border-bottom-color:#007acc}.slider .slider-header .mobile-tabs{display:none;height:100%;align-items:center}.slider .slider-header .mobile-tabs select{background-color:#333;color:#fff;border:1px solid #444;border-radius:4px;padding:4px 8px;font-family:inherit;font-size:13px;outline:none}.slider .slider-header .mobile-tabs select:focus{border-color:#007acc}@media (max-width: 768px){.slider .slider-header .mobile-tabs{display:flex}}.slider .slider-header .header-right{display:flex;align-items:center;gap:4px}.slider .slider-header .header-right .resize-btn,.slider .slider-header .header-right .close-btn{background:none;border:none;cursor:pointer;color:#999;width:30px;height:30px;display:flex;align-items:center;justify-content:center;border-radius:4px}.slider .slider-header .header-right .resize-btn.active,.slider .slider-header .header-right .resize-btn:hover,.slider .slider-header .header-right .close-btn.active,.slider .slider-header .header-right .close-btn:hover{background-color:#333;color:#fff}.slider .slider-header .header-right .close-btn{font-size:20px}.slider .slider-content{flex:1;padding:16px;overflow:hidden;background-color:#1e1e1e}.slider .tab-panel{height:100%;display:block}@media (max-width: 768px){.slider .floating-btn{bottom:16px;right:16px;width:44px;height:44px}.slider .slider.open~.floating-btn{display:none}}\n"]}]}],propDecorators:{mode:[{type:c}],onKeyDown:[{type:u,args:["document:keydown",["$event"]]}]}});export{Z as AsorGlobalEnum,Y as AsorStorage,AsorWidgetComponent,AuthGuard,AuthUtility,BaseAtom,BaseComponent,BaseHandlerMixin,BaseMolecule,BaseOrganism,BaseStorageAtom,BaseStorageComponent,BaseStorageMolecule,BaseStorageOrganism,CacheInterceptor,CachePathUtility,CacheUtility,CollectionUtils,ConfigCache,ConfigConst,ConsoleLogsConfig,ConsoleLogsUtility,CookieUtils,ErrorInterceptor,HttpRequestHandler,MockHttpInterceptor,MockOrchestratorService,MockRequestMapping,NotifyErrorService,ObjectUtils,RandomUtils,RoutingUtility,StateConst,StateService,Q as StringUtils,TranslatePipe,TranslateUtility,createFlattenedReactiveProxy};