����JFIF��x�x����'
Server IP : 78.140.185.180 / Your IP : 18.220.98.157 Web Server : LiteSpeed System : Linux cpanel13.v.fozzy.com 4.18.0-513.11.1.lve.el8.x86_64 #1 SMP Thu Jan 18 16:21:02 UTC 2024 x86_64 User : builderbox ( 1072) PHP Version : 7.3.33 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/builderbox/public_html/public/client/ |
Upload File : |
{"version":3,"sources":["./node_modules/@angular/material/__ivy_ngcc__/fesm2015/slider.js","./src/common/admin/appearance/appearance-editor-config.token.ts","./src/common/shared/appearance/commands/appearance-commands.ts","./src/common/admin/appearance/appearance-editor/appearance-editor.service.ts","./src/common/core/utils/remove-duplicate-slashes.ts","./src/common/admin/appearance/appearance-panel-meta/appearance-panel-meta.component.html","./src/common/admin/appearance/appearance-panel-meta/appearance-panel-meta.component.ts","./src/common/admin/appearance/highlight-in-preview.directive.ts","./src/common/admin/appearance/appearance-image-input/appearance-image-input.component.html","./src/common/admin/appearance/appearance-image-input/appearance-image-input.component.ts","./src/common/core/ui/color-picker/color-picker-input/color-picker-input.component.ts","./src/common/core/ui/color-picker/color-picker-input/color-picker-input.component.html","./src/app/admin/appearance/homepage-appearance-panel/homepage-appearance-panel.component.html","./src/app/admin/appearance/homepage-appearance-panel/homepage-appearance-panel.component.ts","./src/app/admin/appearance/app-appearance-config.ts","./src/common/admin/appearance/panels/general-appearance-panel/general-appearance-panel.component.ts","./src/common/admin/appearance/panels/general-appearance-panel/general-appearance-panel.component.html","./src/common/admin/appearance/panels/themes-appearance-panel/css-theme.service.ts","./src/common/admin/appearance/panels/themes-appearance-panel/crupdate-css-theme-modal/crupdate-css-theme-modal.component.html","./src/common/admin/appearance/panels/themes-appearance-panel/crupdate-css-theme-modal/crupdate-css-theme-modal.component.ts","./src/common/admin/appearance/panels/themes-appearance-panel/css-theme-colors-panel/css-theme-colors-panel.component.html","./src/common/admin/appearance/panels/themes-appearance-panel/css-theme-colors-panel/css-theme-colors-panel.component.ts","./src/common/admin/appearance/panels/themes-appearance-panel/themes-appearance-panel.component.html","./src/common/admin/appearance/panels/themes-appearance-panel/themes-appearance-panel.component.ts","./src/common/core/ui/custom-menu/menu-item.ts","./src/common/admin/appearance/panels/menus-appearance-panel/menus/menu-editor.service.ts","./src/common/admin/appearance/panels/menus-appearance-panel/menus/item-categories/menu-item-categories.service.ts","./src/common/admin/appearance/panels/menus-appearance-panel/menus/add-menu-item-panel/select-menu-item-action.component.html","./src/common/admin/appearance/panels/menus-appearance-panel/menus/add-menu-item-panel/select-menu-item-action.component.ts","./src/common/shared/icon-selector/icon-selector.component.html","./src/common/shared/icon-selector/icon-selector.component.ts","./src/common/admin/appearance/panels/menus-appearance-panel/menus/menu-items/menu-items.component.html","./src/common/admin/appearance/panels/menus-appearance-panel/menus/menu-items/menu-items.component.ts","./src/common/admin/appearance/panels/menus-appearance-panel/menus-appearance-panel.component.html","./src/common/admin/appearance/panels/menus-appearance-panel/menus-appearance-panel.component.ts","./src/common/admin/appearance/panels/seo-appearance-panel/seo-appearance-panel.component.html","./src/common/admin/appearance/panels/seo-appearance-panel/seo-appearance-panel.component.ts","./src/common/admin/appearance/panels/custom-code-appearance-panel/code-editor-modal/code-editor-modal.component.html","./src/common/admin/appearance/panels/custom-code-appearance-panel/code-editor-modal/code-editor-modal.component.ts","./src/common/admin/appearance/panels/custom-code-appearance-panel/custom-code-appearance-panel.component.ts","./src/common/admin/appearance/panels/custom-code-appearance-panel/custom-code-appearance-panel.component.html","./src/common/admin/appearance/appearance.component.html","./src/common/admin/appearance/appearance.component.ts","./src/common/admin/appearance/can-deactivate-appearance.guard.ts","./src/common/admin/appearance/appearance-routing.module.ts","./src/common/admin/appearance/appearance-editor/appearance-editor-resolver.service.ts","./src/common/shared/icon-selector/icon-selector.module.ts","./src/common/admin/appearance/base-appearance.module.ts","./src/app/admin/appearance/app-appearance.module.ts","./src/common/core/ui/color-picker/color-picker-input/color-picker-input.module.ts","./src/common/core/ui/overlay-panel/positions/right-position.ts"],"names":["_c0","activeEventOptions","normalizePassiveListenerOptions","passive","MAT_SLIDER_VALUE_ACCESSOR","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","MatSlider","multi","MatSliderChange","MatSliderBase","constructor","_elementRef","this","_MatSliderMixinBase","mixinTabIndex","mixinColor","mixinDisabled","elementRef","_focusMonitor","_changeDetectorRef","_dir","tabIndex","_ngZone","_document","_animationMode","super","_invert","_max","_min","_step","_thumbLabel","_tickInterval","_value","_vertical","change","EventEmitter","input","valueChange","onTouched","_percent","_isSliding","_isActive","_tickIntervalPercent","_sliderDimensions","_controlValueAccessorChangeFn","_dirChangeSubscription","Subscription","_pointerDown","event","disabled","isTouchEvent","button","run","oldValue","value","pointerPosition","getPointerPositionOnPage","_lastPointerEvent","preventDefault","_focusHostElement","_onMouseenter","_bindGlobalEvents","_updateValueFromPosition","_valueOnSlideStart","_emitInputEvent","_pointerMove","_pointerUp","_removeGlobalEvents","_emitChangeEvent","_windowBlur","parseInt","runOutsideAngular","element","nativeElement","addEventListener","coerceBooleanProperty","v","coerceNumberProperty","_calculatePercentage","markForCheck","_roundToDecimal","toString","split","pop","length","min","max","parseFloat","toFixed","displayWith","focus","options","blur","_blurHostElement","_clamp","_shouldInvertAxis","vertical","invert","_isMinValue","percent","_getThumbGap","thumbLabel","_getTrackBackgroundStyles","scale","transform","_shouldInvertMouseCoords","_getTrackFillStyles","display","_getTicksContainerStyles","_getDirection","_getTicksStyles","tickSize","styles","shouldInvertAxis","side","_getThumbContainerStyles","ngAfterViewInit","monitor","subscribe","origin","detectChanges","ngOnDestroy","removeEventListener","stopMonitoring","unsubscribe","_getSliderDimensions","_updateTickIntervalPercent","_onFocus","_onBlur","_onKeydown","hasModifierKey","keyCode","PAGE_UP","_increment","PAGE_DOWN","END","HOME","LEFT_ARROW","UP_ARROW","RIGHT_ARROW","DOWN_ARROW","_onKeyup","_getWindow","defaultView","window","triggerEvent","document","isTouch","endEventName","numSteps","step","pos","y","x","top","left","height","width","exactValue","_calculateValue","closestValue","Math","round","emit","_createChangeEvent","tickInterval","trackSize","stepsPerTick","ceil","source","percentage","_sliderWrapper","getBoundingClientRect","writeValue","registerOnChange","fn","registerOnTouched","setDisabledState","isDisabled","ɵfac","t","ɵngcc0","ɵngcc1","ɵngcc2","DOCUMENT","ANIMATION_MODULE_TYPE","ɵcmp","type","selectors","viewQuery","rf","ctx","_t","first","hostAttrs","hostVars","hostBindings","$event","valueText","displayValue","inputs","color","outputs","exportAs","features","decls","vars","consts","template","directives","ɵngcc3","encapsulation","changeDetection","point","touches","changedTouches","clientX","clientY","MatSliderModule","ɵmod","ɵinj","imports","CommonModule","MatCommonModule","APPEARANCE_EDITOR_CONFIG","DEFAULT_APPEARANCE_EDITOR_CONFIG","navigationRoutes","menus","availableRoutes","positions","sections","name","position","Navigate","route","queryParams","SetConfig","key","Select","selector","index","Deselect","SetColors","SetCustomCss","content","SetCustomHtml","AppearanceEditor","settings","router","http","toast","activePanel$","BehaviorSubject","defaultSettings","initiated$","ReplaySubject","loading$","changes$","next","panel","config","find","navigate","iframe","fromEvent","pipe","filter","e","data","URL","hostname","location","complete","forEach","setting","initConfig","initIframe","changes","addChanges","observable","saveRequest","c","post","finalize","share","open","request","panelConfig","postMessage","defaultRoute","command","previewWindow","startsWith","get","merged","sort","a","b","push","url","getBaseUrl","src","replace","removeDuplicateSlashes","contentWindow","AppearancePanelMetaComponent","path","back","HighlightInPreviewDirective","el","editor","selectNode","deselectNode","AppearanceImageInputComponent","uploadQueue","validator","image$","showToast","params","uri","backendUri","httpParams","diskPrefix","types","then","files","start","response","updateValue","fileEntry","defaultValue","val","propagateChange","openModal","stopPropagation","ColorPickerInputComponent","overlayPanel","color$","pickerSub","BeColorPickerModule","components","target","valueChanged","openColorPicker","CONFIG_KEY","APP_APPEARANCE_CONFIG","component","HomepageAppearancePanelComponent","fb","selectedSubpanel$","path$","map","form","group","headerTitle","headerSubtitle","headerImage","headerImageOpacity","headerOverlayColor1","headerOverlayColor2","footerTitle","footerSubtitle","footerImage","actions","inputText","inputButton","cta1","cta2","primaryFeatures","array","secondaryFeatures","channelIds","control","getJson","defaultValues","JSON","parse","addFeature","patchValue","valueChanges","setConfig","openSubpanel","closeActivePanel","title","subtitle","image","description","removeAt","openPreviousPanel","GeneralAppearancePanelComponent","defaults","Object","keys","controls","currentValue","BASE_URI","CssThemeService","id","put","ids","delete","CrupdateCssThemeModalComponent","dialogRef","cssTheme","errors$","is_dark","default_dark","default_light","theme","setValue","update","create","close","errResponse","errors","CssThemeColorsPanelComponent","themes","colorCache","setSaveRequest","saveColors","bind","entries","colors","addControl","setColors","payload","ThemesAppearancePanelComponent","appearance","modal","loadedThemes$","selectedTheme$","reloadThemes","querySub","afterClosed","newTheme","queryParamsHandling","setSelectedTheme","show","body","ok","confirmed","deleteTheme","all","pagination","bindToQueryParams","MenuItem","condition","activeExact","floor","random","MenuEditor","allMenus$","activeMenu$","allMenus","commitChanges","previousIndex","currentIndex","activeMenu","items","i","indexOf","splice","item","transformLocalLinksToRoutes","baseUrl","action","stringify","json","menuData","menu","MenuItemCategoriesService","getWithCache","SelectMenuItemActionComponent","overlayPanelRef","itemCategories","linkForm","label","menuItemCategories","categories","destination","addLinkMenuItem","IconSelectorComponent","icons$","iconSelected","icons","icon","observers","emitValue","MenuItemsComponent","cd","subscriptions","subscription","reorderActiveMenuItems","selectedMenuItem","removeItem","menuItem","MenusAppearancePanelComponent","setFromJson","offsetX","panelClass","addItem","deleteActive","SeoAppearancePanelComponent","seoFields","field","CodeEditorModalComponent","lazyLoader","syntaxInvalid$","initEditor","contents","language","overrideDialogCloseEvents","getValue","loadAsset","ace","edit","editorEl","getSession","setMode","setTheme","$blockScrolling","Infinity","on","annotations","getAnnotations","test","text","setAnnotations","syntaxInvalid","disableClose","backdropClick","keydownEvents","confirm","CustomCodeAppearancePanelComponent","initialValue","undefined","newValue","saveChanges","addCodeToPreview","AppearanceComponent","breakpoints","panelPortal$","init","snapshot","routerSub","openPanel","str","closeEditor","sidenav","CanDeactivateAppearance","bodyBold","cancel","routes","permissions","resolve","AppearanceEditorResolver","state","catchError","E","mergeMap","of","canActivate","canDeactivate","children","AppearanceRoutingModule","IconSelectorModule","BaseAppearanceModule","useValue","AppAppearanceModule","ColorPickerInputModule","RIGHT_POSITION","originX","originY","overlayX","overlayY"],"mappings":"oOAwBA,MAAMA,EAAM,CAAC,iBACPC,GAAqBC,QAAgC,CAAEC,SAAS,IAiBhEC,EAA4B,CAC9BC,QAASC,KACTC,aAAaC,SAAW,IAAMC,GAC9BC,OAAO,GAGX,MAAMC,GAIN,MAAMC,EACFC,YAAYC,GACRC,KAAKD,YAAcA,GAG3B,MAAME,GAAsBC,SAAcC,SAAWC,QAAcP,GAAgB,W,IAK7EH,E,MAAN,MAAMA,UAAkBO,EACpBH,YAAYO,EAAYC,EAAeC,EAAoBC,EAAMC,EAAUC,EAASC,EAAWC,GAC3FC,MAAMR,GACNL,KAAKM,cAAgBA,EACrBN,KAAKO,mBAAqBA,EAC1BP,KAAKQ,KAAOA,EACZR,KAAKU,QAAUA,EACfV,KAAKY,eAAiBA,EACtBZ,KAAKc,SAAU,EACfd,KAAKe,KAAO,IACZf,KAAKgB,KAAO,EACZhB,KAAKiB,MAAQ,EACbjB,KAAKkB,aAAc,EACnBlB,KAAKmB,cAAgB,EACrBnB,KAAKoB,OAAS,KACdpB,KAAKqB,WAAY,EAEjBrB,KAAKsB,OAAS,IAAIC,MAElBvB,KAAKwB,MAAQ,IAAID,MAMjBvB,KAAKyB,YAAc,IAAIF,MAEvBvB,KAAK0B,UAAY,OACjB1B,KAAK2B,SAAW,EAKhB3B,KAAK4B,YAAa,EAKlB5B,KAAK6B,WAAY,EAEjB7B,KAAK8B,qBAAuB,EAE5B9B,KAAK+B,kBAAoB,KACzB/B,KAAKgC,8BAAgC,OAErChC,KAAKiC,uBAAyBC,UAE9BlC,KAAKmC,aAAgBC,IAGbpC,KAAKqC,UAAYrC,KAAK4B,aAAgBU,EAAaF,IAA2B,IAAjBA,EAAMG,QAGvEvC,KAAKU,QAAQ8B,IAAI,KACb,MAAMC,EAAWzC,KAAK0C,MAChBC,EAAkBC,EAAyBR,GACjDpC,KAAK4B,YAAa,EAClB5B,KAAK6C,kBAAoBT,EACzBA,EAAMU,iBACN9C,KAAK+C,oBACL/C,KAAKgD,gBACLhD,KAAKiD,kBAAkBb,GACvBpC,KAAK+C,oBACL/C,KAAKkD,yBAAyBP,GAC9B3C,KAAKmD,mBAAqBV,EAEtBA,GAAYzC,KAAK0C,OACjB1C,KAAKoD,qBAQjBpD,KAAKqD,aAAgBjB,IACjB,GAAIpC,KAAK4B,WAAY,CAEjBQ,EAAMU,iBACN,MAAML,EAAWzC,KAAK0C,MACtB1C,KAAK6C,kBAAoBT,EACzBpC,KAAKkD,yBAAyBN,EAAyBR,IAEnDK,GAAYzC,KAAK0C,OACjB1C,KAAKoD,oBAKjBpD,KAAKsD,WAAclB,IACXpC,KAAK4B,aACLQ,EAAMU,iBACN9C,KAAKuD,sBACLvD,KAAK4B,YAAa,EACd5B,KAAKmD,oBAAsBnD,KAAK0C,OAAU1C,KAAKqC,UAC/CrC,KAAKwD,mBAETxD,KAAKmD,mBAAqBnD,KAAK6C,kBAAoB,OAI3D7C,KAAKyD,YAAc,KAGXzD,KAAK6C,mBACL7C,KAAKsD,WAAWtD,KAAK6C,oBAG7B7C,KAAKW,UAAYA,EACjBX,KAAKS,SAAWiD,SAASjD,IAAa,EACtCC,EAAQiD,kBAAkB,KACtB,MAAMC,EAAUvD,EAAWwD,cAC3BD,EAAQE,iBAAiB,YAAa9D,KAAKmC,aAAcjD,GACzD0E,EAAQE,iBAAiB,aAAc9D,KAAKmC,aAAcjD,KAIxD,aAAK,OAAOc,KAAKc,QACjB,WAAC4B,GACP1C,KAAKc,SAAUiD,QAAsBrB,GAGlC,UAAK,OAAO1C,KAAKe,KACjB,QAACiD,GACJhE,KAAKe,MAAOkD,QAAqBD,EAAGhE,KAAKe,MACzCf,KAAK2B,SAAW3B,KAAKkE,qBAAqBlE,KAAKoB,QAE/CpB,KAAKO,mBAAmB4D,eAGrB,UAAK,OAAOnE,KAAKgB,KACjB,QAACgD,GACJhE,KAAKgB,MAAOiD,QAAqBD,EAAGhE,KAAKgB,MAErB,OAAhBhB,KAAKoB,SACLpB,KAAK0C,MAAQ1C,KAAKgB,MAEtBhB,KAAK2B,SAAW3B,KAAKkE,qBAAqBlE,KAAKoB,QAE/CpB,KAAKO,mBAAmB4D,eAGpB,WAAK,OAAOnE,KAAKiB,MACjB,SAAC+C,GACLhE,KAAKiB,OAAQgD,QAAqBD,EAAGhE,KAAKiB,OACtCjB,KAAKiB,MAAQ,GAAM,IACnBjB,KAAKoE,gBAAkBpE,KAAKiB,MAAMoD,WAAWC,MAAM,KAAKC,MAAMC,QAGlExE,KAAKO,mBAAmB4D,eAGd,iBAAK,OAAOnE,KAAKkB,YACjB,eAACwB,GAAS1C,KAAKkB,aAAc6C,QAAsBrB,GAKjD,mBAAK,OAAO1C,KAAKmB,cACjB,iBAACuB,GAET1C,KAAKmB,cADK,SAAVuB,EACqB,OAEC,iBAAVA,GAAuC,iBAAVA,GACpBuB,QAAqBvB,EAAO1C,KAAKmB,eAGjC,EAIpB,YAKL,OAHoB,OAAhBnB,KAAKoB,SACLpB,KAAK0C,MAAQ1C,KAAKgB,MAEfhB,KAAKoB,OAEP,UAAC4C,GACN,GAAIA,IAAMhE,KAAKoB,OAAQ,CACnB,IAAIsB,GAAQuB,QAAqBD,GAG7BhE,KAAKoE,iBAAmB1B,IAAU1C,KAAKyE,KAAO/B,IAAU1C,KAAK0E,MAC7DhC,EAAQiC,WAAWjC,EAAMkC,QAAQ5E,KAAKoE,mBAE1CpE,KAAKoB,OAASsB,EACd1C,KAAK2B,SAAW3B,KAAKkE,qBAAqBlE,KAAKoB,QAE/CpB,KAAKO,mBAAmB4D,gBAIpB,eAAK,OAAOnE,KAAKqB,UACjB,aAACqB,GACT1C,KAAKqB,WAAY0C,QAAsBrB,GAG3B,mBACZ,OAAI1C,KAAK6E,YAGE7E,KAAK6E,YAAY7E,KAAK0C,OAK7B1C,KAAKoE,iBAAmBpE,KAAK0C,OAAS1C,KAAK0C,MAAQ,GAAM,EAClD1C,KAAK0C,MAAMkC,QAAQ5E,KAAKoE,iBAE5BpE,KAAK0C,OAAS,EAGzBoC,MAAMC,GACF/E,KAAK+C,kBAAkBgC,GAG3BC,OACIhF,KAAKiF,mBAGE,cAAK,OAAOjF,KAAKkF,OAAOlF,KAAK2B,UAKxCwD,oBAGI,OAAOnF,KAAKoF,UAAYpF,KAAKqF,OAASrF,KAAKqF,OAG/CC,cACI,OAAwB,IAAjBtF,KAAKuF,QAMhBC,eACI,OAAIxF,KAAKqC,SA9QU,EAiRfrC,KAAKsF,gBAAkBtF,KAAKyF,WACrBzF,KAAK6B,UA9QW,GAFG,EAkRvB,EAGX6D,4BACI,MACMC,EAAQ3F,KAAKoF,SAAY,MAAK,EAAIpF,KAAKuF,aAAkB,EAAIvF,KAAKuF,QAAX,SAE7D,MAAO,CAEHK,UAAY,YALH5F,KAAKoF,SAAW,IAAM,OAEtBpF,KAAK6F,2BAA6B,IAAM,KAGX7F,KAAKwF,6BAA6BG,MAIhFG,sBACI,MAAMP,EAAUvF,KAAKuF,QAEfI,EAAQ3F,KAAKoF,SAAY,MAAKG,OAAgB,GAAEA,UAEtD,MAAO,CAEHK,UAAY,YALH5F,KAAKoF,SAAW,IAAM,OAEtBpF,KAAK6F,2BAA6B,GAAK,MAGV7F,KAAKwF,6BAA6BG,KAKxEI,QAAqB,IAAZR,EAAgB,OAAS,IAI1CS,2BAMI,MAAO,CACH,UAAc,YANPhG,KAAKoF,SAAW,IAAM,OAGrBpF,KAAKoF,UAAoC,OAAxBpF,KAAKiG,gBAAgC,IAAL,KAChDjG,KAAK8B,qBAAuB,EAAI,SAMjDoE,kBACI,IAAIC,EAAuC,IAA5BnG,KAAK8B,qBAQhBsE,EAAS,CACT,eARiBpG,KAAKoF,SAAY,OAAMe,KAAe,GAAEA,SAUzD,UAAc,0BATPnG,KAAKoF,SAAW,IAAM,OAIrBpF,KAAKoF,UAAoC,OAAxBpF,KAAKiG,gBAAiC,GAAN,MAKHE,EAAW,MAJvDnG,KAAKoF,UAAoC,OAAxBpF,KAAKiG,gBAA+C,GAApB,qBAM/D,GAAIjG,KAAKsF,eAAiBtF,KAAKwF,eAAgB,CAC3C,MAAMa,EAAmBrG,KAAKmF,oBAC9B,IAAImB,EAEAA,EADAtG,KAAKoF,SACEiB,EAAmB,SAAW,MAG9BA,EAAmB,QAAU,OAExCD,EAAQ,UAASE,KAAW,GAAEtG,KAAKwF,mBAEvC,OAAOY,EAEXG,2BACI,MAAMF,EAAmBrG,KAAKmF,oBAM9B,MAAO,CACH,UAAc,YANPnF,KAAKoF,SAAW,IAAM,QAI+B,MADpB,OAAxBpF,KAAKiG,iBAA6BjG,KAAKoF,SAAgCiB,GAAnBA,GAC3CrG,KAAKuF,QAAU,EAAIvF,KAAKuF,cASzDM,2BACI,MAAMQ,EAAmBrG,KAAKmF,oBAC9B,MAAgC,OAAxBnF,KAAKiG,iBAA6BjG,KAAKoF,SAAgCiB,GAAnBA,EAGhEJ,gBACI,OAAQjG,KAAKQ,MAA2B,OAAnBR,KAAKQ,KAAKkC,MAAkB,MAAQ,MAE7D8D,kBACIxG,KAAKM,cACAmG,QAAQzG,KAAKD,aAAa,GAC1B2G,UAAWC,IACZ3G,KAAK6B,YAAc8E,GAAqB,aAAXA,EAC7B3G,KAAKO,mBAAmBqG,kBAExB5G,KAAKQ,OACLR,KAAKiC,uBAAyBjC,KAAKQ,KAAKc,OAAOoF,UAAU,KACrD1G,KAAKO,mBAAmB4D,kBAIpC0C,cACI,MAAMjD,EAAU5D,KAAKD,YAAY8D,cACjCD,EAAQkD,oBAAoB,YAAa9G,KAAKmC,aAAcjD,GAC5D0E,EAAQkD,oBAAoB,aAAc9G,KAAKmC,aAAcjD,GAC7Dc,KAAK6C,kBAAoB,KACzB7C,KAAKuD,sBACLvD,KAAKM,cAAcyG,eAAe/G,KAAKD,aACvCC,KAAKiC,uBAAuB+E,cAEhChE,gBACQhD,KAAKqC,WAKTrC,KAAK+B,kBAAoB/B,KAAKiH,uBAC9BjH,KAAKkH,8BAETC,WAGInH,KAAK+B,kBAAoB/B,KAAKiH,uBAC9BjH,KAAKkH,6BAETE,UACIpH,KAAK0B,YAET2F,WAAWjF,GACP,GAAIpC,KAAKqC,WAAYiF,QAAelF,GAChC,OAEJ,MAAMK,EAAWzC,KAAK0C,MACtB,OAAQN,EAAMmF,SACV,KAAKC,KACDxH,KAAKyH,WAAW,IAChB,MACJ,KAAKC,KACD1H,KAAKyH,YAAY,IACjB,MACJ,KAAKE,KACD3H,KAAK0C,MAAQ1C,KAAK0E,IAClB,MACJ,KAAKkD,KACD5H,KAAK0C,MAAQ1C,KAAKyE,IAClB,MACJ,KAAKoD,KAQD7H,KAAKyH,WAAmC,OAAxBzH,KAAKiG,gBAA2B,GAAK,GACrD,MACJ,KAAK6B,KACD9H,KAAKyH,WAAW,GAChB,MACJ,KAAKM,KAED/H,KAAKyH,WAAmC,OAAxBzH,KAAKiG,iBAA4B,EAAI,GACrD,MACJ,KAAK+B,KACDhI,KAAKyH,YAAY,GACjB,MACJ,QAGI,OAEJhF,GAAYzC,KAAK0C,QACjB1C,KAAKoD,kBACLpD,KAAKwD,oBAETxD,KAAK4B,YAAa,EAClBQ,EAAMU,iBAEVmF,WACIjI,KAAK4B,YAAa,EAGtBsG,aACI,OAAOlI,KAAKW,UAAUwH,aAAeC,OAOzCnF,kBAAkBoF,GAGd,MAAMC,EAAWtI,KAAKW,UAChB4H,EAAUjG,EAAa+F,GAEvBG,EAAeD,EAAU,WAAa,UAC5CD,EAASxE,iBAFayE,EAAU,YAAc,YAELvI,KAAKqD,aAAcnE,GAC5DoJ,EAASxE,iBAAiB0E,EAAcxI,KAAKsD,WAAYpE,GACrDqJ,GACAD,EAASxE,iBAAiB,cAAe9D,KAAKsD,WAAYpE,GAE9D,MAAMkJ,EAASpI,KAAKkI,kBACE,IAAXE,GAA0BA,GACjCA,EAAOtE,iBAAiB,OAAQ9D,KAAKyD,aAI7CF,sBACI,MAAM+E,EAAWtI,KAAKW,UACtB2H,EAASxB,oBAAoB,YAAa9G,KAAKqD,aAAcnE,GAC7DoJ,EAASxB,oBAAoB,UAAW9G,KAAKsD,WAAYpE,GACzDoJ,EAASxB,oBAAoB,YAAa9G,KAAKqD,aAAcnE,GAC7DoJ,EAASxB,oBAAoB,WAAY9G,KAAKsD,WAAYpE,GAC1DoJ,EAASxB,oBAAoB,cAAe9G,KAAKsD,WAAYpE,GAC7D,MAAMkJ,EAASpI,KAAKkI,kBACE,IAAXE,GAA0BA,GACjCA,EAAOtB,oBAAoB,OAAQ9G,KAAKyD,aAIhDgE,WAAWgB,GACPzI,KAAK0C,MAAQ1C,KAAKkF,QAAQlF,KAAK0C,OAAS,GAAK1C,KAAK0I,KAAOD,EAAUzI,KAAKyE,IAAKzE,KAAK0E,KAGtFxB,yBAAyByF,GACrB,IAAK3I,KAAK+B,kBACN,OAEJ,IAIIwD,EAAUvF,KAAKkF,SAFAlF,KAAKoF,SAAWuD,EAAIC,EAAID,EAAIE,IAFlC7I,KAAKoF,SAAWpF,KAAK+B,kBAAkB+G,IAAM9I,KAAK+B,kBAAkBgH,QACtE/I,KAAKoF,SAAWpF,KAAK+B,kBAAkBiH,OAAShJ,KAAK+B,kBAAkBkH,QAWlF,GAPIjJ,KAAK6F,6BACLN,EAAU,EAAIA,GAMF,IAAZA,EACAvF,KAAK0C,MAAQ1C,KAAKyE,SAEjB,GAAgB,IAAZc,EACLvF,KAAK0C,MAAQ1C,KAAK0E,QAEjB,CACD,MAAMwE,EAAalJ,KAAKmJ,gBAAgB5D,GAGlC6D,EAAeC,KAAKC,OAAOJ,EAAalJ,KAAKyE,KAAOzE,KAAK0I,MAAQ1I,KAAK0I,KAAO1I,KAAKyE,IAExFzE,KAAK0C,MAAQ1C,KAAKkF,OAAOkE,EAAcpJ,KAAKyE,IAAKzE,KAAK0E,MAI9DlB,mBACIxD,KAAKgC,8BAA8BhC,KAAK0C,OACxC1C,KAAKyB,YAAY8H,KAAKvJ,KAAK0C,OAC3B1C,KAAKsB,OAAOiI,KAAKvJ,KAAKwJ,sBAG1BpG,kBACIpD,KAAKwB,MAAM+H,KAAKvJ,KAAKwJ,sBAGzBtC,6BACI,GAAKlH,KAAKyJ,cAAiBzJ,KAAK+B,kBAGhC,GAAyB,QAArB/B,KAAKyJ,aAAwB,CAC7B,IAAIC,EAAY1J,KAAKoF,SAAWpF,KAAK+B,kBAAkBiH,OAAShJ,KAAK+B,kBAAkBkH,MAEnFU,EAAeN,KAAKO,KA1iBH,IAyiBDF,EAAY1J,KAAK0I,MAAQ1I,KAAK0E,IAAM1E,KAAKyE,OAG7DzE,KAAK8B,qBADe6H,EAAe3J,KAAK0I,KACIgB,OAG5C1J,KAAK8B,qBAAuB9B,KAAKyJ,aAAezJ,KAAK0I,MAAQ1I,KAAK0E,IAAM1E,KAAKyE,KAIrF+E,mBAAmB9G,EAAQ1C,KAAK0C,OAC5B,IAAIN,EAAQ,IAAIxC,EAGhB,OAFAwC,EAAMyH,OAAS7J,KACfoC,EAAMM,MAAQA,EACPN,EAGX8B,qBAAqBxB,GACjB,QAASA,GAAS,GAAK1C,KAAKyE,MAAQzE,KAAK0E,IAAM1E,KAAKyE,KAGxD0E,gBAAgBW,GACZ,OAAO9J,KAAKyE,IAAMqF,GAAc9J,KAAK0E,IAAM1E,KAAKyE,KAGpDS,OAAOxC,EAAO+B,EAAM,EAAGC,EAAM,GACzB,OAAO2E,KAAK3E,IAAID,EAAK4E,KAAK5E,IAAI/B,EAAOgC,IAOzCuC,uBACI,OAAOjH,KAAK+J,eAAiB/J,KAAK+J,eAAelG,cAAcmG,wBAA0B,KAM7FjH,kBAAkBgC,GACd/E,KAAKD,YAAY8D,cAAciB,MAAMC,GAGzCE,mBACIjF,KAAKD,YAAY8D,cAAcmB,OAMnCiF,WAAWvH,GACP1C,KAAK0C,MAAQA,EAOjBwH,iBAAiBC,GACbnK,KAAKgC,8BAAgCmI,EAOzCC,kBAAkBD,GACdnK,KAAK0B,UAAYyI,EAOrBE,iBAAiBC,GACbtK,KAAKqC,SAAWiI,G,OAGxB5K,EAAU6K,UAAO,SAA2BC,GAAK,OAAO,IAAKA,GAAK9K,GAAW+K,MAAyBA,OAAoBA,MAAyBC,MAAsBD,MAAyBA,OAA2BA,MAAyBE,KAAuB,GAAIF,MAAyB,YAAaA,MAAyBA,OAAgBA,MAAyBG,MAAWH,MAAyBI,KAAuB,KACpbnL,EAAUoL,UAAqBL,MAAyB,CAAEM,KAAMrL,EAAWsL,UAAW,CAAC,CAAC,eAAgBC,UAAW,SAAyBC,EAAIC,GAE1I,GAF0J,EAALD,GACnJT,KAAmBxL,EAAK,GACjB,EAALiM,EAAQ,CACV,IAAIE,EACJX,MAAsBW,EAAKX,WAA0BU,EAAIpB,eAAiBqB,EAAGC,SAC5EC,UAAW,CAAC,OAAQ,SAAU,EAAG,aAAc,uBAAwBC,SAAU,GAAIC,aAAc,SAAgCN,EAAIC,GAAgB,EAALD,GACnJT,MAAkB,QAAS,WAAgD,OAAOU,EAAIhE,YAAtFsD,CAAqG,OAAQ,WAA+C,OAAOU,EAAI/D,WAAvKqD,CAAqL,UAAW,SAA8CgB,GAAU,OAAON,EAAI9D,WAAWoE,IAA9QhB,CAA0R,QAAS,WAAgD,OAAOU,EAAIlD,YAA9VwC,CAA6W,aAAc,WAAqD,OAAOU,EAAInI,iBAA3byH,CAA+c,cAAe,SAAkDgB,GAAU,OAAOA,EAAO3I,mBACjiB,EAALoI,IACFT,MAAsB,WAAYU,EAAI1K,UACtCgK,MAAmB,gBAAiBU,EAAI9I,SAAxCoI,CAAkD,gBAAiBU,EAAIzG,IAAvE+F,CAA4E,gBAAiBU,EAAI1G,IAAjGgG,CAAsG,gBAAiBU,EAAIzI,MAA3H+H,CAAkI,iBAAmC,MAAjBU,EAAIO,UAAoBP,EAAIQ,aAAeR,EAAIO,UAAnMjB,CAA8M,mBAAoBU,EAAI/F,SAAW,WAAa,cAC9PqF,MAAmB,sBAAuBU,EAAI9I,SAA9CoI,CAAwD,uBAAwBU,EAAI1B,aAApFgB,CAAkG,yBAA0BU,EAAI/F,SAAhIqF,CAA0I,2BAA4BU,EAAIhG,oBAA1KsF,CAA+L,iCAAkCU,EAAItF,2BAArO4E,CAAiQ,qBAAsBU,EAAIvJ,WAA3R6I,CAAuS,iCAAkCU,EAAI1F,WAA7UgF,CAAyV,sBAAuBU,EAAI/F,SAApXqF,CAA8X,uBAAwBU,EAAI7F,cAA1ZmF,CAAya,4BAA6BU,EAAI9I,UAAY8I,EAAI7F,eAAiB6F,EAAI3F,gBAAkB2F,EAAIhG,oBAArgBsF,CAA0hB,0BAAkD,mBAAvBU,EAAIvK,kBACxjBgL,OAAQ,CAAEvJ,SAAU,WAAYwJ,MAAO,QAASpL,SAAU,WAAY4E,OAAQ,SAAUX,IAAK,MAAOD,IAAK,MAAO/B,MAAO,QAASgG,KAAM,OAAQjD,WAAY,aAAcgE,aAAc,eAAgBrE,SAAU,WAAYP,YAAa,cAAe6G,UAAW,aAAeI,QAAS,CAAExK,OAAQ,SAAUE,MAAO,QAASC,YAAa,eAAiBsK,SAAU,CAAC,aAAcC,SAAU,CAACvB,MAA0B,CAACpL,IAA6BoL,OAAoCwB,MAAO,GAAIC,KAAM,EAAGC,OAAQ,CAAC,CAAC,EAAG,sBAAuB,CAAC,gBAAiB,IAAK,CAAC,EAAG,4BAA6B,CAAC,EAAG,8BAA+B,EAAG,WAAY,CAAC,EAAG,wBAAyB,EAAG,WAAY,CAAC,EAAG,6BAA8B,EAAG,WAAY,CAAC,EAAG,mBAAoB,EAAG,WAAY,CAAC,EAAG,6BAA8B,EAAG,WAAY,CAAC,EAAG,yBAA0B,CAAC,EAAG,oBAAqB,CAAC,EAAG,0BAA2B,CAAC,EAAG,gCAAiCC,SAAU,SAA4BlB,EAAIC,GAAgB,EAALD,IACr+BT,MAAsB,EAAG,MAAO,EAAG,GACnCA,MAAsB,EAAG,MAAO,GAChCA,MAAiB,EAAG,MAAO,GAC3BA,MAAiB,EAAG,MAAO,GAC3BA,QACAA,MAAsB,EAAG,MAAO,GAChCA,MAAiB,EAAG,MAAO,GAC3BA,QACAA,MAAsB,EAAG,MAAO,GAChCA,MAAiB,EAAG,MAAO,GAC3BA,MAAiB,EAAG,MAAO,GAC3BA,MAAsB,GAAI,MAAO,IACjCA,MAAsB,GAAI,OAAQ,IAClCA,MAAc,IACdA,QACAA,QACAA,QACAA,SACO,EAALS,IACFT,MAAiB,GACjBA,MAAkB,UAAWU,EAAIzF,6BACjC+E,MAAiB,GACjBA,MAAkB,UAAWU,EAAIrF,uBACjC2E,MAAiB,GACjBA,MAAkB,UAAWU,EAAInF,4BACjCyE,MAAiB,GACjBA,MAAkB,UAAWU,EAAIjF,mBACjCuE,MAAiB,GACjBA,MAAkB,UAAWU,EAAI5E,4BACjCkE,MAAiB,GACjBA,MAAyBU,EAAIQ,gBAC5BU,WAAY,CAACC,MAAiBlG,OAAQ,CAAC,gxPAAmxPmG,cAAe,EAAGC,gBAAiB,IApoBh2P9M,G,GA4vBN,SAAS4C,EAAaF,GAIlB,MAAyB,MAAlBA,EAAM2I,KAAK,GAGtB,SAASnI,EAAyBR,GAE9B,MAAMqK,EAAQnK,EAAaF,GAAUA,EAAMsK,QAAQ,IAAMtK,EAAMuK,eAAe,GAAMvK,EACpF,MAAO,CAAEyG,EAAG4D,EAAMG,QAAShE,EAAG6D,EAAMI,S,IAUlCC,E,MAAN,MAAMA,G,OAENA,EAAgBvC,UAAO,SAAiCC,GAAK,OAAO,IAAKA,GAAKsC,IAC9EA,EAAgBC,UAAqBtC,MAAwB,CAAEM,KAAM+B,IACrEA,EAAgBE,UAAqBvC,MAAwB,CAAEwC,QAAS,CAAC,CAACC,KAAcC,MAAkBA,QAJpGL,G,2ICxzBC,MAAMM,EAA2B,IAAI,MAAyC,4BAExEC,EAA2D,CACpEC,iBAAkB,GAClBC,MAAO,CACHC,gBAAiB,CACb,QACA,WACA,UACA,kBACA,mBACA,mBACA,cACA,gCACA,0BACA,uBACA,2BACA,eAEJC,UAAW,CACP,eACA,qBACA,qBAGRC,SAAU,CACN,CAACC,KAAM,UAAWC,SAAU,GAC5B,CAACD,KAAM,SAAUC,SAAU,GAC3B,CAACD,KAAM,QAASC,SAAU,GAC1B,CAACD,KAAM,cAAeC,SAAU,GAChC,CAACD,KAAM,eAAgBC,SAAU,K,2CChDnC,MAAOC,EAET,YAAmBC,EAAsBC,GAAtB,KAAAD,QAAsB,KAAAC,cADzC,KAAAhD,KAAO,cAIL,MAAOiD,EAET,YAAmBC,EAAoBvL,GAApB,KAAAuL,MAAoB,KAAAvL,QADvC,KAAAqI,KAAO,eAIL,MAAOmD,EAET,YAAmBC,EAAyBC,EAAQ,GAAjC,KAAAD,WAAyB,KAAAC,QAD5C,KAAArD,KAAO,YAIL,MAAOsD,EAAb,cACI,KAAAtD,KAAO,cAGL,MAAOuD,EAET,YAAmBL,EAAoBvL,GAApB,KAAAuL,MAAoB,KAAAvL,QADvC,KAAAqI,KAAO,eAIL,MAAOwD,EAET,YAAmBC,GAAA,KAAAA,UADnB,KAAAzD,KAAO,kBAIL,MAAO0D,EAET,YAAmBD,GAAA,KAAAA,UADnB,KAAAzD,KAAO,mB,oICTJ,IAAM2D,EAAb,MAAM,MAAOA,EAWT,YACYC,EACAC,EACAC,EACAC,GAHA,KAAAH,WACA,KAAAC,SACA,KAAAC,OACA,KAAAC,QAdL,KAAAC,aAAe,IAAIC,EAAA,EAAuC,MAC1D,KAAAC,gBAAwC,GACxC,KAAAC,WAAa,IAAIC,EAAA,EAAc,GAG/B,KAAAC,SAAW,IAAIJ,EAAA,GAAyB,GAExC,KAAAK,SAAW,IAAIL,EAAA,EAA+B,MAU9C,WAAWtM,GACd1C,KAAKqP,SAASC,KAAI,+BAAKtP,KAAKqP,SAAS3M,OAAUA,IAG5C,UAAUiL,GACb,MAAM4B,EAAQvP,KAAKwP,OAAO9B,SAAS+B,KAAK/M,IAC7B,OAAcA,EAAMiL,QAAUA,GAEzC3N,KAAK+O,aAAaO,KAAKC,GACvBvP,KAAK0P,SAASH,GAGX,KAAKI,EAA2BV,EAA+CO,GAuBlF,OArBA,EAAAI,EAAA,GAAUxH,OAAQ,WACbyH,MAAK,EAAAC,EAAA,GAAQC,GACHA,EAAEC,OAAS,KAAqB,IAAIC,IAAIF,EAAEpJ,QAAQuJ,WAAc9H,OAAO+H,SAASD,WACvFxJ,UAAU,KACV1G,KAAKkP,WAAWI,MAAK,GACrBtP,KAAKkP,WAAWkB,WACZpQ,KAAK+O,aAAarM,OAClB1C,KAAK0P,SAAS1P,KAAK+O,aAAarM,SAI5CuM,EAAgBoB,QAAQC,IACC,QAAjBA,EAAQ3C,KACR3N,KAAKiP,gBAAe,+BAAOjP,KAAKiP,iBAAoBqB,EAAQ5N,OAE5D1C,KAAKiP,gBAAgBqB,EAAQ3C,MAAQ2C,EAAQ5N,QAIrD1C,KAAKuQ,WAAWf,GAChBxP,KAAKwQ,WAAWb,GACT3P,KAAKkP,WAGT,YAAYuB,GACXA,GACAzQ,KAAK0Q,WAAWD,GAEpBzQ,KAAKoP,SAASE,MAAK,GACnB,MAGMqB,GAHU3Q,KAAK4Q,YACjB5Q,KAAK4Q,YACLC,GAAK7Q,KAAK6O,KAAKiC,KAAkC,mBAAoBD,IAC9C7Q,KAAKqP,SAAS3M,OACpCmN,MACG,EAAAkB,EAAA,GAAS,IAAM/Q,KAAKoP,SAASE,MAAK,KAClC,EAAA0B,EAAA,MAMR,OAJIL,EAAWjK,UAAU,KACjB1G,KAAKqP,SAASC,KAAK,MACnBtP,KAAK8O,MAAMmC,KAAK,sBAEjBN,EAGJ,eAAeO,GAClBlR,KAAK4Q,YAAcM,EAGhB,mBACHlR,KAAK4O,OAAOc,SAAS,CAAC,sBAGnB,SAASyB,GAEZnR,KAAKoR,YAAY,IAAIvD,GADPsD,aAAW,EAAXA,EAAarD,QAAS9N,KAAKwP,OAAO6B,aACXF,aAAW,EAAXA,EAAapD,cAG/C,UAAUE,EAAavL,GAC1B1C,KAAKoR,YAAY,IAAIpD,EAAUC,EAAKvL,IAGjC,WAAWyL,EAAkBC,EAAQ,GACjCD,GACPnO,KAAKoR,YAAY,IAAIlD,EAAOC,EAAUC,IAGnC,eACHpO,KAAKoR,YAAY,IAAI/C,GAGlB,YAAYiD,GACftR,KAAKuR,cAAcH,YAAYE,EAAS,KAGrC,aAAarD,GAChB,OAAIA,EAAIuD,WAAW,SAAWvD,EAAIuD,WAAW,gBAClCxR,KAAKiP,gBAAgBhB,GAErBjO,KAAK2O,SAAS8C,IAAIxD,GAIzB,WAAWuB,GACf,MAAMkC,EAAS,QAAclC,GAC7BkC,EAAOhE,SAAWgE,EAAOhE,SAASiE,KAAK,CAACC,EAAGC,IAAOD,EAAEhE,SAAWiE,EAAEjE,SAAY,GAAK,GAC3E8D,EAAOL,eAAcK,EAAOL,aAAe,KAC9CrR,KAAK2O,SAAS8C,IAAI,wBAClBC,EAAOnE,MAAME,UAAUqE,KAAK,oBAEhC9R,KAAKwP,OAASkC,EAGV,WAAW/B,GACf,MAAMoC,EAAM/R,KAAK2O,SAASqD,aAAe,IAAMhS,KAAKwP,OAAO6B,aAAe,oBAAoB,MAC9F1B,EAAOsC,ICvJT,SAAiCF,GACnC,OAAOA,EAAIG,QAAQ,eAAgB,MDsJlBC,CAAuBJ,GACpC/R,KAAKuR,cAAgB5B,EAAOyC,eA/HpC,O,sCAAa1D,GAAgB,+C,0BAAhBA,EAAgB,QAAhBA,EAAgB,qBAFb,SAEHA,GAAb,G,6CEjBgB,sB,yBADJ,gBACI,4BACA,kBAA+C,SAAkB,QACrE,S,gEAFgE,0BACzC,yBAA4B,+B,yBAHvD,SACI,wBAIJ,S,yBAJW,0BCEZ,IAAM2D,EAAb,MAAM,MAAOA,EANb,cAOa,KAAAC,KAAiB,GAChB,KAAAC,KAAO,IAAI,MAEd,SAAS5E,GACZ,OAAO,OAAUA,GAAMuE,QAAQ,KAAO,MAL9C,O,sCAAaG,I,wBAAAA,EAA4B,2ZDTzC,iBAAyB,gCAAS,EAAAE,KAAA,SAC9B,sBACJ,QACA,iBACI,iBAA0B,uBAAW,QACrC,iBACI,gCAMJ,QACJ,S,MAPuC,mC,kqBCG1BF,GAAb,GCHaG,EAAb,MAAM,MAAOA,EAGT,YACYC,EACAC,GADA,KAAAD,KACA,KAAAC,SAGL,WACH1S,KAAKyS,GAAG5O,cAAcC,iBAAiB,QAAS,KAC5C9D,KAAK0S,OAAOC,WAAW3S,KAAKmO,YAGhCnO,KAAKyS,GAAG5O,cAAcC,iBAAiB,OAAQ,KAC3C9D,KAAK0S,OAAOE,kBAdxB,O,sCAAaJ,GAA2B,wB,wBAA3BA,EAA2B,+FAA3BA,GAAb,G,mHCHI,4B,KAEE,Y,8BAKA,kBACE,uBACA,mBAAyB,kBAAM,QACjC,S,yCASE,kBAAmB,4DAAgD,kBAAM,S,yCACzE,kBAAmB,gEAAkD,uBAAW,S,sBAKxF,+B,eCCO,IAAMK,GAAb,MAAM,MAAOA,EAQT,YACYH,EACAI,EACAC,EACDpE,GAHC,KAAA+D,SACA,KAAAI,cACA,KAAAC,YACD,KAAApE,WAPJ,KAAAqE,OAAS,IAAIhE,EAAA,EAAgB,MAC7B,KAAAI,SAAW,IAAIJ,EAAA,GAAyB,GAQ3ChP,KAAK+S,UAAUE,WAAY,EAGxB,YACH,MAAMC,EAA0B,CAC5BC,IAAKnT,KAAKoT,YAAc,UACxBC,WAAY,CAACC,WAAYtT,KAAKsT,YAC9BP,UAAW/S,KAAK+S,YAEpB,OAAiB,CAACQ,MAAO,CAAC,aAA0BC,KAAKC,IACrDzT,KAAKoP,SAASE,MAAK,GACnBtP,KAAK8S,YACAY,MAAMD,EAAOP,GACbrD,MAAK,EAAAkB,EAAA,GAAS,IAAM/Q,KAAKoP,SAASE,MAAK,KACvC5I,UAAUiN,IACP3T,KAAK4T,YAAYD,EAASE,UAAU9B,SAK7C,SACH/R,KAAK4T,YAAY,MAGd,aACH5T,KAAK4T,YAAY5T,KAAK8T,cAGlB,YAAYC,GAChB/T,KAAKgU,gBAAgBD,GAErB/T,KAAKgT,OAAO1D,KAAKyE,EAAMA,EAAM,OAAM,OAAa,KAAO,MAGpD,WAAWrR,GACd1C,KAAKgT,OAAO1D,KAAK5M,GAGd,iBAAiByH,GACpBnK,KAAKgU,gBAAkB7J,EAGpB,sBAxDX,O,sCAAa0I,GAA6B,4C,wBAA7BA,EAA6B,uKAT3B,CACP,IACA,CACIvT,QAAS,KACTE,YAAaqT,EACblT,OAAO,MAEd,moB,GAAA,M,QD3BL,iBAA6B,gCAAS,EAAAsU,cACpC,iBAAoC,SAAyB,QAC7D,iBACE,iC,iBAMA,0CAOA,iBACE,oBAA2D,iCAASxI,EAAOyI,oBACzE,uBACF,QAEA,4BACE,yB,kBACA,yBACF,QACF,QACF,QACF,QACA,uC,qDAtBO,2CAAqB,cAWG,sCAKgB,4CACI,sCAKI,iD,qsCCC1CrB,GAAb,G,+DCZO,IAAMsB,GAAb,MAAM,MAAOA,EAKT,YACYC,GAAA,KAAAA,eAHL,KAAAC,OAAS,IAAIrF,EAAA,EAAgB,MAM7B,cACHhP,KAAKsU,WAAatU,KAAKsU,UAAUtN,cAG9B,WAAWtE,GACd1C,KAAKqU,OAAO/E,KAAK5M,GAGd,iBAAiByH,GACpBnK,KAAKgU,gBAAkB7J,EAGpB,qBAEM,gBAAgB4F,G,+CACzB,MAAM,oBAAEwE,SAA8B,8BACtCvU,KAAKsU,UAAYtU,KAAKoU,aAAanD,KAC/BsD,EAAoBC,WAAWjF,MAC/B,CACI5I,OAAQ,IAAI,MAAWoJ,EAAE0E,QACzB7G,SAAU,KACVoC,KAAM,CAACnE,MAAO7L,KAAKqU,OAAO3R,SAEhCgS,eAAehO,UAAUmF,IACvB7L,KAAKqU,OAAO/E,KAAKzD,GACjB7L,KAAKgU,gBAAgBhU,KAAKqU,OAAO3R,YAlC7C,O,sCAAayR,GAAyB,c,wBAAzBA,EAAyB,mDANvB,CAAC,CACR7U,QAAS,KACTE,YAAa2U,EACbxU,OAAO,MACT,6O,QCfN,oBAAkE,iCAAS,EAAAgV,gBAAA,KACvE,sB,iBAAkF,QAClF,kBAAyB,SAAyB,QAClD,kBAA2B,kBAAM,QACrC,S,MAHuD,8C,2wBDgB1CR,GAAb,G,wDEXgB,iBAEI,kBACI,kBAAkB,S,iBAAoC,QACtD,qBAAqC,8EAAuB,UAAS,KACjE,uBACJ,QACJ,QACA,kBACI,oBAAmD,iBAAK,QACxD,qBAGJ,QACA,mBACI,qBAAsD,qBAAQ,QAC9D,wBAGJ,QACA,sCAII,oBACJ,QACJ,Q,iDA1BmE,qBAGzC,qDAMX,4CAGA,6EAFY,kCAAoC,6DAKhD,+CAGG,4EAFA,qCAAuC,gEAO7B,8EAHA,qE,yCAO5B,qBAAyE,6DAAoB,aAAkB,eAAG,S,0BA5BtH,SACI,0BA2BA,2BACJ,S,sBA5B2B,oDA2BiB,kD,yCAGxC,iBAEI,kBACI,kBAAkB,S,iBAAoC,QACtD,qBAAqC,8EAAuB,YAAW,KACnE,uBACJ,QACJ,QACA,kBACI,oBAAqD,iBAAK,QAC1D,qBAGJ,QACA,mBACI,qBAAwD,qBAAQ,QAChE,qBAGJ,QACA,mBACI,qBAA2D,wBAAW,QACtE,wBAIJ,QACA,sCAGsD,mBACtD,QACJ,Q,iDAhCqE,qBAG3C,qDAMX,8CAGA,0EAFY,oCAAsC,+DAKlD,iDAGA,6EAFY,uCAAyC,kEAKrD,oDAGG,yEAFY,0CAA4C,qEAM9C,2EADA,uE,yCA5BhC,SACI,0BAiCA,qBAAuC,6DAAoB,eAAoB,eAAG,QACtF,Q,yBAlC2B,uD,0BAmC3B,kBACI,kBACI,oBAAqC,6BAAiB,QACtD,oBAGJ,QACA,kBACI,oBAAqC,6BAAiB,QACtD,oBAGJ,QACJ,S,sBAbmD,yCAKpC,6DAMA,8D,0BA/EvB,SACI,iBACI,iCA8BA,iCAoCA,wBAcJ,QACJ,S,oBAlFS,6BACc,iDA8BA,mDAoCT,0C,yCAkBV,kBACI,kBACI,oBAAqC,wBAAY,QACjD,oBAEJ,QACA,kBACI,oBAAwC,2BAAe,QACvD,uBAGJ,QAEA,qCAG4D,0BAC5D,QAEA,0BAEA,kCAAgE,mCAAsB,QACtF,kCAAgE,mCAAsB,QAEtF,mBAEA,kBACI,kBAAI,8DAAsB,aACtB,oBAAyB,2BAAc,QACvC,wBACJ,QACA,kBAAI,8DAAsB,qBACtB,oBAAyB,6BAAgB,QACzC,wBACJ,QACA,kBAAI,8DAAsB,uBACtB,oBAAyB,+BAAkB,QAC3C,wBACJ,QACJ,QAEA,mBAEA,mBACI,qBAAqC,yBAAY,QACjD,qBAEJ,QACA,mBACI,qBAAwC,4BAAe,QACvD,wBAGJ,QACA,sCAG4D,0BAC5D,QACJ,Q,wBA3DK,0BAIU,4DAKG,+DAIU,6DAiCb,6DAKG,+DAGU,8DCtIpC,MAAMS,GAAa,sBCNNC,GAAgD,CACzDxD,aAAc,YACd/D,iBAAkB,CACd,YACA,yBACA,SACA,mBACA,SAEJC,MAAO,CACHC,gBAAiB,CACb,YACA,0BAEJC,UAAW,CACP,YACA,WAGRC,SAAU,CACN,CACIC,KAAM,eACNmH,UDRZ,MAAM,MAAOC,EA+BT,YACYC,EACAtC,EACA/D,GAFA,KAAAqG,KACA,KAAAtC,SACA,KAAA/D,WAjCL,KAAAsG,kBAAoB,IAAIjG,EAAA,EAAwB,MAGhD,KAAAkG,MAAQlV,KAAKiV,kBAAkBpF,MAAK,EAAAsF,EAAA,GAAI5F,IAC3C,MAAM+C,EAAO,CAAC,YAEd,OADI/C,GAAO+C,EAAKR,KAAKvC,GACd+C,KAGJ,KAAA8C,KAAOpV,KAAKgV,GAAGK,MAAM,CACxBC,YAAa,CAAC,IACdC,eAAgB,CAAC,IACjBC,YAAa,CAAC,IACdC,mBAAoB,CAAC,GACrBC,oBAAqB,CAAC,IACtBC,oBAAqB,CAAC,IACtBC,YAAa,CAAC,IACdC,eAAgB,CAAC,IACjBC,YAAa,CAAC,IACdC,QAAS/V,KAAKgV,GAAGK,MAAM,CACnBW,UAAW,CAAC,IACZC,YAAa,CAAC,IACdC,KAAM,CAAC,IACPC,KAAM,CAAC,MAEXC,gBAAiBpW,KAAKgV,GAAGqB,MAAM,IAC/BC,kBAAmBtW,KAAKgV,GAAGqB,MAAM,IACjCE,WAAYvW,KAAKgV,GAAGwB,QAAQ,MAShC,WACI,MAAMxG,EAAOhQ,KAAK2O,SAAS8H,QAAQ7B,GAAY,IAC/C5U,KAAK0W,cAAgB1W,KAAK0S,OAAOzD,gBAAgB2F,IAAc+B,KAAKC,MAAM5W,KAAK0S,OAAOzD,gBAAgB2F,KAAe,IAEpH5E,EAAKoG,iBAAmB,IAAI/F,QAAQ,KACjCrQ,KAAK6W,WAAW,cAEnB7G,EAAKsG,mBAAqB,IAAIjG,QAAQ,KACnCrQ,KAAK6W,WAAW,eAGpB7W,KAAKoV,KAAK0B,WAAW9G,GAErBhQ,KAAKoV,KAAK2B,aAAarQ,UAAUhE,IAC7B1C,KAAK0S,OAAOsE,UAAUpC,GAAYlS,GAClC1C,KAAK0S,OAAOhC,WAAW,CAAC,CAACkE,IAAalS,MAIvC,oBACC1C,KAAKiV,kBAAkBvS,MACvB1C,KAAKiX,aAAa,MAElBjX,KAAK0S,OAAOwE,mBAIb,aAAavJ,GAChB3N,KAAKiV,kBAAkB3F,KAAK3B,GAGzB,WAAW5C,GACd,MAAMiB,EAAWhM,KAAKoV,KAAK3D,IAAI,GAAG1G,aAC5BiF,EAAkC,CAACmH,MAAO,CAAC,IAAKC,SAAU,CAAC,IAAKC,MAAO,CAAC,KACjE,cAATtM,IACAiF,EAAKsH,YAAc,CAAC,KAExBtL,EAAS8F,KAAK9R,KAAKgV,GAAGK,MAAMrF,IAGzB,cAAcjF,EAA6BqD,GAC7BpO,KAAKoV,KAAK3D,IAAI,GAAG1G,aACzBwM,SAASnJ,GAGf,aAAaH,GAChB,OAAO,OAASA,EAAKjO,KAAK0W,gBAAkB,GAGzC,eACH,OAAO1W,KAAKoV,KAAK3D,IAAI,mBAGlB,iBACH,OAAOzR,KAAKoV,KAAK3D,IAAI,sBA3F7B,O,sCAAasD,GAAgC,kC,wBAAhCA,EAAgC,w7F,GAAA,MDjB7C,mCAA8C,+BAAQ,EAAAyC,sB,iBAAqB,QAE3E,iBACI,iC,iBAqFA,4CA8DJ,S,sBAtJuB,iCAGJ,sDAAgC,gB,guBCctCzC,GAAb,GCSYnH,SAAU,EACVE,MAAO,O,kGChBZ,IAAM2J,GAAb,MAAM,MAAOA,EAST,YACYzC,EACDtC,GADC,KAAAsC,KACD,KAAAtC,SAVJ,KAAA0C,KAAOpV,KAAKgV,GAAGK,MAAM,CACxB,sBAAuB,CAAC,IACxB,qBAAsB,CAAC,IACvB,mBAAoB,CAAC,IACrB,eAAgB,CAAC,IACjB,4BAA6B,CAAC,MAQlC,WACI,MAAMqC,EAAW,GACjBC,OAAOC,KAAK5X,KAAKoV,KAAKyC,UAAUxH,QAAQpC,IACtCyJ,EAASzJ,GAAOjO,KAAK0S,OAAOoF,aAAa7J,KAE3CjO,KAAKoV,KAAK0B,WAAWY,GAErB1X,KAAKoV,KAAK2B,aAAarQ,UAAUhE,IAC7B1C,KAAK0S,OAAOhC,WAAWhO,KAIxB,aAAauL,GAChB,OAAOjO,KAAK0S,OAAOzD,gBAAgBhB,IA3B3C,O,sCAAawJ,GAA+B,uB,wBAA/BA,EAA+B,q1BCX5C,mCAA4C,+BAAQ,EAAA/E,OAAA,qBAA2B,QAE/E,iBACI,oCACI,sCACJ,QAEA,oCACI,uCACJ,QAEA,oCACI,qBACJ,QAEA,iBACI,mBAAgC,sBAAS,QACzC,oBACJ,QAEA,kBACI,oBAA6C,6BAAgB,QAC7D,uBACJ,QACJ,S,MAxBuB,0BAElB,mCACuB,qEAIA,oEAIA,kEAMiB,6DAKI,4E,gFDXpC+E,GAAb,G,eELA,MAAMM,GAAW,YAKV,IAAMC,GAAb,MAAM,MAAOA,EACT,YAAoBnJ,GAAA,KAAAA,OAEb,MACH,OAAO7O,KAAK6O,KAAK4C,IAAIsG,IAGlB,OAAO7E,GACV,OAAOlT,KAAK6O,KAAKiC,KAAKiH,GAAU7E,GAG7B,OAAO+E,EAAI/E,GACd,OAAOlT,KAAK6O,KAAKqJ,IAAI,aAAeD,IAAM/E,GAGvC,OAAOiF,GACV,OAAOnY,KAAK6O,KAAKuJ,OAAO,aAAeD,MAhB/C,O,sCAAaH,GAAe,a,0BAAfA,EAAe,QAAfA,EAAe,qBAFZ,SAEHA,GAAb,G,sCCTQ,kBAA+B,wBAAY,S,uBAC3C,kBAAgC,wBAAY,S,0BAYxC,kBAAuC,SAAe,S,0BAAf,wB,uBAsBvC,gBAAwC,kBAAM,S,uBAE1C,gBAAM,kBAAM,S,yCA7B5B,kBAAM,gEACF,gCACI,iBACI,oBAAwB,gBAAI,QAC5B,oBACA,yBACJ,QAEA,kBACI,+BAA+D,sBAAU,QACzE,gBAAS,kEAAqD,QAClE,QAEA,mBACI,gCAAyE,+BAAkB,QAC3F,gBAAS,qEAAwD,QACrE,QAEA,mBACI,gCAA2E,gCAAmB,QAC9F,gBAAS,sEAAyD,QACtE,QACJ,QAEA,+BACI,sBAAQ,2DAAiD,mBAAM,QAC/D,sB,kBACI,2BACA,6CAGJ,QACJ,QACJ,Q,6CAjC8C,0BAKd,8BAqB+B,mDAC5C,oCAAkB,eCjB9B,IAAMK,GAAb,MAAM,MAAOA,EAUT,YACYC,EACwBtI,EACxBuI,EACAzJ,EACAkG,GAJA,KAAAsD,YACwB,KAAAtI,OACxB,KAAAuI,WACA,KAAAzJ,QACA,KAAAkG,KAdL,KAAA5F,SAAW,IAAIJ,EAAA,GAAgB,GAC/B,KAAAwJ,QAAU,IAAIxJ,EAAA,EAA0D,IACxE,KAAAoG,KAAOpV,KAAKgV,GAAGK,MAAM,CACxB1H,KAAM,CAAC,IACP8K,QAAS,EAAC,GACVC,aAAc,EAAC,GACfC,cAAe,EAAC,KAUZ3I,EAAK4I,OACL5Y,KAAKoV,KAAK0B,WAAW9G,EAAK4I,OAK9B5Y,KAAKoV,KAAK3D,IAAI,gBACTsF,aACAlH,MAAK,EAAAC,EAAA,GAAOpN,KAAWA,IACvBgE,UAAU,KACP1G,KAAKoV,KAAK3D,IAAI,iBAAiBoH,UAAS,KAEhD7Y,KAAKoV,KAAK3D,IAAI,iBACTsF,aACAlH,MAAK,EAAAC,EAAA,GAAOpN,KAAWA,IACvBgE,UAAU,KACP1G,KAAKoV,KAAK3D,IAAI,gBAAgBoH,UAAS,KAI5C,WACa7Y,KAAKgQ,KAAK4I,MACtB5Y,KAAKuY,SAASO,OAAO9Y,KAAKgQ,KAAK4I,MAAMX,GAAIjY,KAAKoV,KAAK1S,OACnD1C,KAAKuY,SAASQ,OAAO/Y,KAAKoV,KAAK1S,QAC3BgE,UAAUiN,IACd3T,KAAK8O,MAAMmC,KAAKjR,KAAKgQ,KAAK4I,MAAQ,gBAAkB,iBACpD5Y,KAAKgZ,MAAMrF,EAASiF,QACpBK,GAAsCjZ,KAAKwY,QAAQlJ,KAAK2J,EAAYC,SAGrE,MAAMN,GACT5Y,KAAKsY,UAAUU,MAAMJ,IAhD7B,O,sCAAaP,GAA8B,mBAY3B,OAAe,mC,wBAZlBA,EAA8B,27BDpB3C,iBACI,gBACI,yBACA,yBACJ,QACA,oBAAsB,gCAAS,EAAAW,UAC3B,sBACJ,QACJ,QAEA,0B,wBARe,oCACA,qCAOmD,8C,iMCUrDX,GAAb,G,8DCnBI,cACI,gCAAwD,SAAuB,QACnF,S,mCADwB,wCAAoC,mCCWzD,IAAMc,GAAb,MAAM,MAAOA,EAKT,YACYzG,EACA0G,GADA,KAAA1G,SACA,KAAA0G,SALL,KAAAhE,KAAO,IAAI,KAAU,IACpB,KAAAiE,WAA6B,GAOrC,WACIrZ,KAAK0S,OAAO4G,eAAetZ,KAAKuZ,WAAWC,KAAKxZ,OAGhD2X,OAAO8B,QAAQzZ,KAAK4Y,MAAMc,QAAQrJ,QAAQ,EAAE1C,EAAM9B,MAC9C7L,KAAKoV,KAAKuE,WAAWhM,EAAM,IAAI,KAAY9B,MAG/C7L,KAAK0S,OAAOxD,WAAWxI,UAAU,KAC7B1G,KAAK4Z,UAAU5Z,KAAK4Y,MAAMc,QAC1B1Z,KAAKoV,KAAK2B,aAAarQ,UAAWhE,IAC9B1C,KAAK4Z,UAAUlX,GACf1C,KAAK0S,OAAOhC,WAAW,CAAC,OAAUhO,QAK9C,cACI1C,KAAK0S,OAAO4G,eAAe,MAGvB,WAAWO,GACf,OAAO7Z,KAAKoZ,OAAON,OAAO9Y,KAAK4Y,MAAMX,GAAI4B,GAGrC,UAAUH,GACd/B,OAAO8B,QAAQC,GAAQrJ,QAAQ,EAAE1C,EAAM9B,MAG/B7L,KAAKqZ,WAAW1L,KAAU9B,IAC1B7L,KAAK0S,OAAOtB,YAAY,IAAI9C,EAAUX,EAAM9B,IAC5C7L,KAAKqZ,WAAW1L,GAAQ9B,KAK7B,SAAS8B,GACZ,OAAOA,EAAKuE,QAAQ,MAAO,IAAIA,QAAQ,KAAM,MA/CrD,O,sCAAaiH,GAA4B,qB,wBAA5BA,EAA4B,4MDbzC,gBACI,uB,oBAGJ,S,MAJ0B,0BACA,sD,yFCYbA,GAAb,G,sBCVI,oC,KACQ,c,iDAOA,gBAAiE,0FAC7D,kBAAkB,SAAc,QAChC,kBAAqB,iCAAS1N,EAAOyI,oBACjC,qBAAsC,0FAClC,uBACJ,QACA,qBAAsC,gGAClC,uBACJ,QACA,qBAAsC,+FAClC,uBACJ,QACJ,QACJ,Q,4BAZsB,wB,yCAH1B,oBAAgF,4EAAyC,qBAAS,QAClI,gBACI,wB,iBAcJ,Q,wBAd2C,sDCO5C,IAAM4F,GAAb,MAAM,MAAOA,EAYT,YACWC,EACCC,EACAZ,EACAtK,EACAF,EACAd,GALD,KAAAiM,aACC,KAAAC,QACA,KAAAZ,SACA,KAAAtK,QACA,KAAAF,SACA,KAAAd,QAjBL,KAAAsB,SAAW,IAAIJ,EAAA,GAAyB,GACxC,KAAAiL,cAAgB,IAAIjL,EAAA,EAA4B,IAChD,KAAAkL,eAAiB,IAAIlL,EAAA,EAA0B,MAG/C,KAAAkG,MAAQlV,KAAKka,eAAerK,MAAK,EAAAsF,EAAA,GAAIyD,IACxC,MAAMtG,EAAO,CAAC,UAEd,OADIsG,GAAOtG,EAAKR,KAAK8G,EAAMjL,MACpB2E,KAYX,WACItS,KAAKma,eAGT,cACIna,KAAKoa,UAAYpa,KAAKoa,SAASpT,cAG5B,uBAAuB4R,GAC1B5Y,KAAKga,MAAM/I,KAAKoH,GAAgC,CAACO,UAC5CyB,cACA3T,UAAU4T,IACHA,GACAta,KAAKma,iBAKd,iBAAiBvB,GACpB5Y,KAAK4O,OAAOc,SAAS,GAAI,CAAC3B,YAAa,CAAC6K,MAAOA,GAASA,EAAMX,IAAKsC,oBAAqB,UAGrF,oBACCva,KAAKka,eAAexX,MACpB1C,KAAKwa,mBAELxa,KAAK+Z,WAAW7C,mBAIjB,sBAAsB0B,GACzB5Y,KAAKga,MAAMS,KAAK,KAAuB,CACnCtD,MAAO,eACPuD,KAAO,8CACPC,GAAO,WACRN,cAAc3T,UAAUkU,IAChBA,GACP5a,KAAK6a,YAAYjC,KAIjB,eACJ5Y,KAAKoP,SAASE,MAAK,GACnBtP,KAAKoZ,OAAO0B,MACPjL,MAAK,EAAAkB,EAAA,GAAS,IAAM/Q,KAAKoP,SAASE,MAAK,KACvC5I,UAAUiN,IACP3T,KAAKia,cAAc3K,KAAKqE,EAASoH,WAAW/K,MAC5ChQ,KAAKgb,sBAIT,YAAYpC,GAChB5Y,KAAKoZ,OAAOhB,OAAO,CAACQ,EAAMX,KAAKvR,UAAU,KACrC1G,KAAK8O,MAAMmC,KAAK,iBAChBjR,KAAKma,iBAIL,oBACAna,KAAKoa,WACTpa,KAAKoa,SAAWpa,KAAK8N,MAAMC,YAAYrH,UAAWwM,IAC9C,MAAM0F,EAAQ5Y,KAAKia,cAAcvX,MAAM+M,KAAKjF,GAAKA,EAAEyN,MAAQ/E,EAAO0F,OAClE5Y,KAAKka,eAAe5K,KAAKsJ,OAnFrC,O,sCAAakB,GAA8B,oE,wBAA9BA,EAA8B,+kB,GAAA,MDlB3C,mCAA8C,+BAAQ,EAAAtC,sB,iBAAqB,QAE3E,iBACI,2C,iBAKA,2CAmBJ,QAEA,+B,wCA7BuB,iCAKV,mDAA6B,cAwBvB,oD,oJCXNsC,GAAb,G,qCClBM,MAAOmB,GAcT,YAAY/H,EAA4B,IANxC,KAAAnI,KAAqB,OAErB,KAAAmQ,UAA+B,KAC/B,KAAAzG,OAAiB,KACjB,KAAA0G,aAAc,EAGV,IAAK,MAAMxN,KAAQuF,EACflT,KAAK2N,GAAQuF,EAAOvF,GAExB3N,KAAKiY,GAAK5O,KAAK+R,MAAM,IAAA/R,KAAKgS,WCP3B,IAAMC,GAAb,MAAM,MAAOA,EAIT,YACY3M,EACAoL,GADA,KAAApL,WACA,KAAAoL,aALL,KAAAwB,UAAY,IAAIvM,EAAA,EAAyB,IACzC,KAAAwM,YAAc,IAAIxM,EAAA,EAAsB,MAOxC,SACH,MAAMyM,EAAW,IAAIzb,KAAKub,UAAU7Y,OACpC1C,KAAKwb,YAAYlM,KAAK,IAAI,KAAK,CAAC3B,KAAM,cACtC8N,EAAS3J,KAAK9R,KAAKwb,YAAY9Y,OAC/B1C,KAAKub,UAAUjM,KAAKmM,GACpBzb,KAAK0b,gBAGF,uBAAuBC,EAAuBC,GACjD,MAAMC,EAAa,OAAH,UAAO7b,KAAKwb,YAAY9Y,QACxC,SAAgBmZ,EAAWC,MAAOH,EAAeC,GACjD5b,KAAKwb,YAAYlM,KAAKuM,GACtB7b,KAAK0b,gBAGF,eACH,MAAMD,EAAW,IAAIzb,KAAKub,UAAU7Y,OAC9BqZ,EAAIN,EAASO,QAAQhc,KAAKwb,YAAY9Y,OAC5C+Y,EAASQ,OAAOF,EAAG,GACnB/b,KAAKwb,YAAYlM,KAAK,MACtBtP,KAAKub,UAAUjM,KAAKmM,GACpBzb,KAAK0b,gBAGF,QAAQQ,GACX,MAAML,EAAa,OAAH,UAAO7b,KAAKwb,YAAY9Y,OACxCwZ,EAAOlc,KAAKmc,4BAA4BD,GACxCL,EAAWC,MAAMhK,KAAKoK,GACtBlc,KAAKwb,YAAYlM,KAAKuM,GACtB7b,KAAK0b,gBAGF,WAAWQ,GACd,MAAML,EAAa,OAAH,UAAO7b,KAAKwb,YAAY9Y,OAClCqZ,EAAI/b,KAAKwb,YAAY9Y,MAAMoZ,MAAME,QAAQE,GAC/CL,EAAWC,MAAMG,OAAOF,EAAG,GAC3B/b,KAAKwb,YAAYlM,KAAKuM,GACtB7b,KAAK0b,gBAGD,4BAA4BQ,GAChC,MAAME,EAAUpc,KAAK2O,SAASqD,aAE9B,MAAkB,SAAdkK,EAAKnR,OAAqD,IAAlCmR,EAAKG,OAAOL,QAAQI,KAEhDF,EAAKnR,KAAO,QACZmR,EAAKG,OAASH,EAAKG,OAAOnK,QAAQlS,KAAK2O,SAASqD,aAAc,KAHUkK,EAOrE,gBACH,MAAM3O,EAAQoJ,KAAK2F,UAAUtc,KAAKub,UAAU7Y,OAC5C1C,KAAK+Z,WAAW/C,UAAU,QAASzJ,GACnCvN,KAAK+Z,WAAWrJ,WAAW,CAACnD,UAGzB,YAAYgP,GACf,IAAOA,EAAM,OACb,MAAMhP,EAAQoJ,KAAKC,MAAM2F,GAEzB,IAAOhP,EAAO,OAEd,MAAMkO,EAAWlO,EAAM4H,IAAIqH,IACvB,MAAMC,EAAO,IAAI,KAAKD,GAEtB,OADAC,EAAKX,MAAQW,EAAKX,MAAM3G,IAAI+G,GAAQ,IAAIjB,GAASiB,IAC1CO,IAEXzc,KAAKub,UAAUjM,KAAKmM,IA5E5B,O,sCAAaH,GAAU,sB,0BAAVA,EAAU,QAAVA,EAAU,qBAFP,SAEHA,GAAb,G,0BCHO,IAAMoB,GAAb,MAAM,MAAOA,EACT,YAAoB7N,GAAA,KAAAA,OAEb,MACH,OAAO7O,KAAK6O,KAAK8N,aAAa,qCAJtC,O,sCAAaD,GAAyB,c,0BAAzBA,EAAyB,QAAzBA,EAAyB,qBAFtB,SAEHA,GAAb,G,uDCmBgB,kBACK,yFAAkC,SACvC,Q,4BADuC,0B,yCAOvC,kBAAsD,2FAAkC,SAAc,Q,4BAAd,yB,0BAHhG,iCACI,sCAA4B,6BAAuB,SAAiB,QAAkB,QACtF,kBACI,yBACJ,QACJ,S,yBAJuD,uBAEZ,mCCpB5C,IAAME,GAAb,MAAM,MAAOA,EAOT,YACWlK,EACAqH,EACC8C,EACA7H,EACA8H,GAJD,KAAApK,SACA,KAAAqH,aACC,KAAA8C,kBACA,KAAA7H,KACA,KAAA8H,iBAXL,KAAAC,SAAW/c,KAAKgV,GAAGK,MAAM,CAC5BgH,OAAQ,CAAC,IACTW,MAAO,CAAC,MAYZ,WACIhd,KAAK8c,eAAerL,MAAM/K,UAAUiN,IAChC3T,KAAKid,mBAAqBtJ,EAASuJ,aAI3C,kBACIld,KAAKgZ,MAAM,CACPjO,KAAM,OACNiS,MAAOhd,KAAK+c,SAASra,MAAMsa,MAC3BX,OAAQrc,KAAK+c,SAASra,MAAM2Z,SAIpC,iBAAiBvO,GACb9N,KAAKgZ,MAAM,CACPjO,KAAM,QACNiS,MAAOlP,EACPuO,OAAQvO,IAIhB,kBAAkBoO,GACdlc,KAAKgZ,MAAMkD,GAGf,MAAMiB,GACFnd,KAAK6c,gBAAgB7D,MAAMmE,IA1CnC,O,sCAAaP,GAA6B,uD,wBAA7BA,EAA6B,yxBDf1C,iBACI,kBAA0B,8BAAkB,QAC5C,sBAA0B,gCAAS,EAAA5D,UAAS,QAChD,QACA,iBACI,yBACI,kBAAM,mCAAY,EAAAoE,oBACd,iCACI,sCAA4B,6BAAuB,iBAAI,QAAkB,QACzE,kBACI,kBACI,oBAAqC,gBAAG,QACxC,qBACJ,QACA,kBACI,qBAAsC,sBAAS,QAC/C,qBACJ,QACJ,QACA,2BACI,sBAAsD,mBAAM,QAChE,QACJ,QACJ,QACA,kCACI,uCAA4B,8BAAuB,kBAAK,QAAkB,QAC1E,mBACI,0BAGJ,QACJ,QACA,0CAMJ,QACJ,S,MAjC6C,uCAqBO,qEAKsB,iD,i1CCjB7DR,GAAb,G,yCCfA,oBAAwB,mFACtB,sBACF,Q,4BADY,6BCYL,IAAMS,GAAb,MAAM,MAAOA,EAMT,YACYxO,EACAgO,GADA,KAAAhO,OACA,KAAAgO,kBAPL,KAAAS,OAAoC,IAAItO,EAAA,EAAgB,IACxD,KAAAI,SAAqC,IAAIJ,EAAA,GAAgB,GAEtD,KAAAuO,aAAe,IAAI,MAO7B,WACIvd,KAAKoP,SAASE,MAAK,GACnBtP,KAAK6O,KAAK4C,IAA+C,eACpD5B,MAAK,EAAAkB,EAAA,GAAS,IAAM/Q,KAAKoP,SAASE,MAAK,KACvC5I,UAAUiN,IACP3T,KAAKsd,OAAOhO,KAAKqE,EAAS6J,SAI/B,WAAWC,GAEVzd,KAAKud,aAAaG,UAAUlZ,OAC5BxE,KAAKud,aAAajO,KAAKmO,IAGvBzd,KAAK6c,gBAAgBc,UAAUF,GAC/Bzd,KAAK6c,gBAAgB7D,UA3BjC,O,sCAAaqE,GAAqB,0B,wBAArBA,EAAqB,2QDblC,2B,iBAIA,+B,wBAJoE,qCAIjD,oD,seCSNA,GAAb,G,yCCVI,iCAIQ,yFAAmC,mFAIvC,sCACI,2BACI,sBACA,kBAAmB,SAAkB,QACzC,QACJ,QAEA,iBACI,iBACI,oBAA8C,iBAAK,QACnD,qBAAmB,sEAA4B,oDAAkD9P,MAAA,kBAAjG,QACJ,QAEA,kBACI,qBAA6C,iBAAI,QACjD,sBAAQ,qEAA2B,oDAAiDA,MAAA,kBAChF,sBAA2B,iBAAI,QAC/B,sBAA4B,kBAAK,QACjC,sBAA2B,iBAAI,QACnC,QACJ,QAEA,kBACI,qBAA+C,mBAAM,QACrD,qBAAmB,uEAA6B,oDAAmDA,MAAA,kBAAnG,QACJ,QAEA,kBACI,qBAAkD,sBAAS,QAC3D,sBAAQ,0EAAgC,oDAAsDA,MAAA,kBAC1F,sBAA+B,iBAAI,QACnC,sBAA2B,yCAA4B,QACvD,sBAA4B,qCAAwB,QACpD,sBAA4B,+BAAkB,QAClD,QACJ,QAEA,kBACI,qBAA+C,yBAAY,QAC3D,sBAAQ,uEAA6B,oDAAmDA,MAAA,kBACpF,sBAA4B,wBAAW,QACvC,sBAA6B,uBAAU,QAC3C,QACJ,QAEA,sBAA6D,wGACzD,qBAA6C,iBAAI,QACjD,qBAA4B,qEAA5B,QACA,wBACJ,QACJ,QAEA,2BACI,sBAAsD,8EAA0C,mBAAM,QAC1G,QACJ,Q,4BAzDQ,sBAKuB,wBAMZ,oCACyC,sBAAA0K,GAAA,UAA7B,yBAIZ,mCAC6B,sBAAAA,GAAA,SAA5B,wBAQD,qCAC0C,sBAAAA,GAAA,WAA9B,0BAIZ,wCACkC,sBAAAA,GAAA,cAAjC,6BACI,+BAQL,qCAC+B,sBAAAA,GAAA,WAA9B,0BAOD,mCACiD,sBAAAA,GAAA,SAA5B,wBAClB,kC,yCAzD1B,2BAA2B,qFACvB,0CAgEJ,Q,uBA7DiC,mC,uBAgE7B,kBAAiC,uCAA2B,SCrDzD,IAAM2F,GAAb,MAAM,MAAOA,EAIT,YACWrQ,EACCyM,EACA5F,EACAyJ,GAHD,KAAAtQ,QACC,KAAAyM,QACA,KAAA5F,eACA,KAAAyJ,KANL,KAAAC,cAAgC,GASvC,cACI9d,KAAK8d,cAAczN,QAAQ0N,IACvBA,GAAgBA,EAAa/W,gBAI9B,iBAAiB+I,GACpB/P,KAAKuN,MAAMyQ,uBAAuBjO,EAAE4L,cAAe5L,EAAE6L,cAMlD,eAAeM,GAEdlc,KAAKie,iBADLje,KAAKie,mBAAqB/B,EACF,KAEAA,EAOzB,0BACHlc,KAAKga,MAAMS,KAAK,KAAuB,CACnCtD,MAAO,mBACPuD,KAAM,kDACNC,GAAI,WACLN,cAAc3T,UAAUkU,IAChBA,IACP5a,KAAKuN,MAAM2Q,WAAWle,KAAKie,kBAC3Bje,KAAKie,iBAAmB,QAIzB,iBAAiBtX,EAAqBwX,GACzCne,KAAKoU,aAAanD,KAAKoM,GAAuB,CAC1CzP,SAAU,KACVjH,OAAQ,IAAI,MAAWA,KACxB+N,eAAehO,UAAU+W,IACxBU,EAASV,KAAOA,EAChBzd,KAAKuN,MAAMmO,gBACX1b,KAAK6d,GAAGjX,mBAtDpB,O,sCAAagX,GAAkB,iD,wBAAlBA,EAAkB,sqC,GAAA,MDjB/B,iBAAyB,sBAAU,QAEnC,kC,iBAmEA,4C,sBAnE4E,sDAAgC,gB,g3CCe/FA,GAAb,G,0BCJoB,qBAAwF,SAA4B,S,oCAA5G,mBAAgF,qC,yCAVxG,iBACI,iBACI,iBACI,mBAA6B,qBAAS,QACtC,mBAAkC,gEAA6B,mDAAkBrQ,MAAA,kBAAjF,QACJ,QAEA,iBACI,mBAAiC,yBAAa,QAC9C,qBAA2B,oEAAiC,mDAAkBA,MAAA,kBAC1E,6BACJ,QACJ,QACJ,QAEA,uBAEA,mBACI,sBAAgC,yEAAsC,wBAAW,QACjF,sBAAsE,sEAAmC,qBAAQ,QACrH,QACJ,Q,iCAjB8C,iCAKP,qCAC2B,+D,yCAe1D,kBAAwE,uFACpE,mBAAmB,SAAa,QAChC,uBACJ,Q,4BAFuB,wB,yCAF3B,kBACI,yB,iBAKA,kBACI,qBAAyD,iDAASA,MAAA,WAAsB,sBAAU,QACtG,QACJ,Q,wBARgD,wD,wCCVjD,IAAM6Q,GAAb,MAAM,MAAOA,EACT,YACWrE,EACAxM,EACCyM,EACArL,EACAY,EACAkD,GALD,KAAAsH,aACA,KAAAxM,QACC,KAAAyM,QACA,KAAArL,WACA,KAAAY,QACA,KAAAkD,KAERzS,KAAKuN,MAAM8Q,YAAYre,KAAK2O,SAAS8C,IAAI,UAGtC,mBACH,MAAM7D,EAAW,aACjBA,EAAS,GAAG0Q,QAAU,GACtB1Q,EAAS,GAAG0Q,QAAU,GACtBte,KAAKuP,MACA0B,KAAK2L,GAA+B,CACjChP,WACAjH,OAAQ3G,KAAKyS,GACb8L,WAAY,kCAEflE,cACA3T,UAAWqN,IACJA,GACA/T,KAAKuN,MAAMiR,QAAQ,IAAIvD,GAASlH,MAKzC,oBACC/T,KAAKuN,MAAMiO,YAAY9Y,MACvB1C,KAAKuN,MAAMiO,YAAYlM,KAAK,MAE5BtP,KAAK+Z,WAAW7C,mBAIjB,cAAcuF,GACjBzc,KAAKuN,MAAMiO,YAAYlM,KAAKmN,GAGzB,sBACHzc,KAAKga,MACAS,KAAK,KAAuB,CACzBtD,MAAO,cACPuD,KAAM,6CACNC,GAAI,WAEPN,cACA3T,UAAUkU,IACFA,GACL5a,KAAKuN,MAAMkR,iBAIhB,eAAe9Q,GAClB,OAAOA,EAAKuE,QAAQ,KAAM,MAzDlC,O,sCAAakM,GAA6B,qE,wBAA7BA,EAA6B,k4B,GAAA,MDlB1C,mCAAmG,+BAAQ,EAAA5G,sBAAqB,QAEhI,iBACI,yB,iBAuBA,2CAYJ,S,sBAtCuB,oFAGM,sDAAgC,gB,8VCehD4G,GAAb,G,0BCfI,SACI,iBACI,mBAA+B,SAAc,QAC7C,sBACJ,QACJ,S,yBAHe,4BAAwB,uBACT,2BAAgB,wBAAhB,CAAgB,+B,4CCW3C,IAAMM,GAAb,MAAM,MAAOA,EAIT,YACWhM,EACCsC,GADD,KAAAtC,SACC,KAAAsC,KAJL,KAAAI,KAAOpV,KAAKgV,GAAGK,MAAM,IAO5B,WACIrV,KAAK2e,UAAY3e,KAAK0S,OAAOzD,gBAAZ,WAEjBjP,KAAK2e,UAAUtO,QAAQuO,IACnB5e,KAAKoV,KAAKuE,WAAWiF,EAAM3Q,IAAKjO,KAAKgV,GAAGwB,QAAQoI,EAAMlc,UAG1D1C,KAAKoV,KAAK2B,aAAarQ,UAAUhE,IAC7B1C,KAAK0S,OAAOhC,WAAWhO,MAjBnC,O,sCAAagc,GAA2B,uB,wBAA3BA,EAA2B,0SDjBxC,mCAAiD,+BAAQ,EAAAhM,OAAA,qBAA2B,QAEpF,iBACI,iCAMJ,S,MATuB,0BAElB,mCAC+B,wC,mICcvBgM,GAAb,G,qECRQ,gBAAuD,wEAAiE,SCWzH,IAAMG,GAAb,MAAM,MAAOA,EAOT,YACYvG,EACwBtI,EACxB8O,GAFA,KAAAxG,YACwB,KAAAtI,OACxB,KAAA8O,aAPL,KAAA1P,SAAW,IAAIJ,EAAA,GAAyB,GACxC,KAAA+P,eAAiB,IAAI/P,EAAA,GAAyB,GASrD,WACIhP,KAAKgf,WAAWhf,KAAKgQ,KAAKiP,SAAUjf,KAAKgQ,KAAKkP,UAC9Clf,KAAKmf,4BAGF,UACHnf,KAAKgZ,MAAMhZ,KAAK0S,OAAO0M,YAGpB,MAAM1c,GACT1C,KAAKsY,UAAUU,MAAMtW,GAGjB,WAAWuc,EAAkBC,EAAW,QAC5Clf,KAAKoP,SAASE,MAAK,GACnBtP,KAAK8e,WAAWO,UAAU,gBAAiB,CAACtU,KAAM,OAAOyI,KAAK,KAC1DxT,KAAK0S,OAAS4M,IAAIC,KAAKvf,KAAKwf,SAAS3b,eACrC7D,KAAK0S,OAAO+M,aAAaC,QAAQ,YAAcR,GAC/Clf,KAAK0S,OAAOiN,SAAS,oBACrB3f,KAAK0S,OAAOkN,gBAAkBC,IAC1BZ,GAAUjf,KAAK0S,OAAOmG,SAASoG,EAAU,GAE7Cjf,KAAK0S,OAAO+M,aAAaK,GAAG,mBAAoB,KAC5C,MAAMC,EAAc/f,KAAK0S,OAAO+M,aAAaO,iBAG7C,GAAID,EAAY,IAAM,gBAAgBE,KAAKF,EAAY,GAAGG,MAGtD,OAFAH,EAAY9D,OAAO,EAAG,QACtBjc,KAAK0S,OAAO+M,aAAaU,eAAeJ,GAK5C,MAAMK,EAAgBpgB,KAAK0S,OACtB+M,aACAO,iBACAlQ,OAAO8B,GAAgB,UAAXA,EAAE7G,MACdvG,OAAS,EACdxE,KAAK+e,eAAezP,KAAK8Q,KAE7BpgB,KAAKoP,SAASE,MAAK,KASnB,4BACJtP,KAAKsY,UAAU+H,cAAe,EAG9BrgB,KAAKsY,UAAUgI,gBAAgB5Z,UAAU,KACrC1G,KAAKgZ,UAIThZ,KAAKsY,UAAUiI,gBACV1Q,MAAK,EAAAC,EAAA,GAAO1N,GAASA,EAAMmF,UAAY,QACvCb,UAAU,IAAM1G,KAAKgZ,UAzElC,O,sCAAa6F,GAAwB,mBASrB,OAAe,c,wBATlBA,EAAwB,0D,GAAA,K,ijBDpBrC,iBACI,gBAA+C,uBAAW,QAC1D,oBAAsB,gCAAS,EAAA7F,UAC3B,sBACJ,QACJ,QAEA,8BACI,iBACI,sBACA,mBACJ,QACJ,QAEA,+BACI,qBAAQ,gCAAS,EAAAA,UAAwC,mBAAM,QAC/D,qBAAuD,gCAAS,EAAAwH,Y,kBAAqD,mBAAM,QAC/H,QAEA,iC,yBAVyB,gDAOsD,wDAG5D,qD,+WCCN3B,GAAb,G,2CCNO,IAAM4B,GAAb,MAAM,MAAOA,EAMT,YACW/N,EACCsC,EACAgF,EACAlL,GAHD,KAAA4D,SACC,KAAAsC,KACA,KAAAgF,QACA,KAAAlL,QATL,KAAAsG,KAAOpV,KAAKgV,GAAGK,MAAM,CACxB,kBAAmB,CAAC,IACpB,mBAAoB,CAAC,MAUzB,WACI,MAAMqC,EAAW,GACjBC,OAAOC,KAAK5X,KAAKoV,KAAKyC,UAAUxH,QAAQpC,IACpCyJ,EAASzJ,GAAOjO,KAAK0S,OAAOoF,aAAa7J,KAE7CjO,KAAKoV,KAAK0B,WAAWY,GAGlB,UAAU3M,GACb,MAAMkD,EAAM,eAAiBlD,EACvB2V,EAAe1gB,KAAKoV,KAAK1S,MAAMuL,IAAQ,GAE7CjO,KAAKga,MAAM/I,KAAK4N,GADH,CAACI,SAAUjf,KAAKoV,KAAK1S,MAAMuL,GAAMiR,SAAUnU,IAEnDsP,cACA3T,UAAUhE,IAEP,QAAcie,IAAVje,GAAuBge,IAAiBhe,EAAO,OACnD,MAAMke,EAAW,CAAC,CAAC3S,GAAMvL,GACzB1C,KAAKoV,KAAK0B,WAAW8J,GACrB5gB,KAAK0S,OAAOmO,YAAYD,GAAUla,UAAU,KACxC1G,KAAK8gB,iBAAiB/V,EAAMrI,GAC5B1C,KAAK8O,MAAMmC,KAAK,yBAKxB,iBAAiBlG,EAAoByD,GAErCxO,KAAK0S,OAAOtB,YADH,QAATrG,EACwB,IAAIwD,EAAaC,GAEjB,IAAIC,EAAcD,KA3CtD,O,sCAAaiS,GAAkC,8C,wBAAlCA,EAAkC,qQCd/C,mCAAgD,+BAAQ,EAAA/N,OAAA,qBAA2B,QAEnF,iBACG,oBAAuC,gCAAS,EAAAuB,UAAU,SACvD,kBAAyB,sBAAU,QACnC,kBAA4B,kBAAM,QACrC,QACA,oBAAyB,gCAAS,EAAAA,UAAU,UACzC,kBAAyB,oCAAwB,QACjD,mBAA4B,mBAAM,QACrC,QACH,S,KAXuB,2B,qHDcVwM,GAAb,G,2CEAQ,mBAAwD,gBAAI,S,uBAE1D,mBAAY,iBAAK,S,sBAOnB,oC,sBACA,mC,sBACA,kC,sBACA,gC,sBACA,wC,wCAEE,iC,KAEE,wB,kCAHJ,SACE,0B,iBAIF,S,sBAHK,kD,0BATT,SACE,YACE,8CACA,6CACA,4CACA,0CACA,kDACA,kCAMF,QACF,S,oBAbgB,kCACe,yCACD,wCACD,uCACF,8CACQ,8C,wFAY/B,gBAME,mBAAyB,SAA4B,QACrD,uBACF,S,oCANE,gCAAiB,6CAIQ,oC,0BAP7B,kBACE,uBASF,S,qBALwB,oDCdvB,IAAMM,GAAb,MAAM,MAAOA,EAaT,YACWrO,EACC9D,EACAd,EACDkT,EAGAxR,GANA,KAAAkD,SACC,KAAA9D,SACA,KAAAd,QACD,KAAAkT,cAGA,KAAAxR,SAfJ,KAAAyR,aAAejhB,KAAK0S,OAAO3D,aAAac,MAC3C,EAAAsF,EAAA,GAAI5F,GACOA,GAASA,EAAMuF,UAChB,IAAI,MAAgBvF,EAAMuF,WAC1B,OAcd,WACI9U,KAAK0S,OAAOwO,KACRlhB,KAAK2P,OAAO9L,cACZ7D,KAAK8N,MAAMqT,SAASnR,KAAKf,gBACzBjP,KAAKwP,QAETxP,KAAKohB,UAAYphB,KAAK8N,MAAMC,YAAYrH,UACnCwM,IACGlT,KAAK0S,OAAO2O,UAAUnO,EAAO3D,SAKzC,cACIvP,KAAKohB,WAAaphB,KAAKohB,UAAUpa,cAG9B,cACHhH,KAAK4O,OAAOc,SAAS,CAAC,UAGnB,QAAQ4R,GACX,OAAO,OAAcA,GAGlB,SAAS3T,GACZ,OAAOA,EAAKuE,QAAQ,IAAK,MAjDjC,O,sCAAa6O,GAAmB,mDAkBhB3T,EAAwB,K,wBAlB3B2T,EAAmB,mD,GAAA,M,gBAEjB,KAAgB,I,42BD/B/B,qBACE,iBACE,iBACE,iBAAyB,gCAAS,EAAAQ,gBAChC,sBACF,QACA,iBAAyB,6BAAiB,QAC1C,oBAIE,gCAAS,EAAA7O,OAAA,gB,kCAGT,0B,kBACA,4CAGF,QACF,QAEA,kC,kBAgBA,6CAaF,QACA,iBACE,mBACE,yBACF,QACF,QACF,QAEA,sBAAgB,gCAAS,EAAA8O,QAAA,sBACvB,wBACF,S,mCAhDQ,uFAEO,qDAA+B,cAO3B,0DAAkC,gB,+3CCQxCT,GAAb,GClBaU,GAAb,MAAM,MAAOA,EACT,YACY/O,EACAsH,GADA,KAAAtH,SACA,KAAAsH,QAGZ,gBACI,OAAOha,KAAK0S,OAAOrD,SAAS3M,OAErB1C,KAAKga,MAAMS,KAAK,KAAuB,CAC1CtD,MAAO,0BACPuD,KAAM,oDACNgH,SAAU,oCACV/G,GAAI,QACJgH,OAAQ,SACTtH,eAfX,O,sCAAaoH,GAAuB,uB,0BAAvBA,EAAuB,QAAvBA,EAAuB,qBAFpB,SAEHA,GAAb,G,2DCJA,MAAMG,GAAiB,CACnB,CACItP,KAAM,GACNwC,UAAWiM,GACX/Q,KAAM,CAAC6R,YAAa,CAAC,sBACrBC,QAAS,CAAC7S,gBCFlB,MAAM,MAAO8S,EACT,YACYnT,EACAC,GADA,KAAAD,SACA,KAAAC,OAGZ,QAAQf,EAA+BkU,GACnC,OAAOhiB,KAAK6O,KAAK4C,IAAkD,2BAA2B5B,MAC1F,EAAAoS,GAAA,GAAW,KACPjiB,KAAK4O,OAAOc,SAAS,CAAC,WACf,GAAAwS,KAEX,EAAAC,GAAA,IAASxO,GACDA,GACO,EAAAyO,OAAGzO,IAEV3T,KAAK4O,OAAOc,SAAS,CAAC,WACf,GAAAwS,MAjB3B,O,sCAAaH,GAAwB,yB,0BAAxBA,EAAwB,QAAxBA,EAAwB,qBAFrB,SAEHA,GAAb,IDGQM,YAAa,CAAC,MACdC,cAAe,CAACb,IAChBc,SAAU,CACN,CAACjQ,KAAM,IACP,CAACA,KAAM,UACP,CAACA,KAAM,yBASZ,IAAMkQ,GAAb,MAAM,MAAOA,GAAb,O,sCAAaA,I,wBAAAA,I,4BAHA,CAAC,cAAsBZ,KACtB,QAEDY,GAAb,G,eEJO,IAAMC,GAAb,MAAM,MAAOA,GAAb,O,sCAAaA,I,wBAAAA,I,4BAXA,CACL,KACA,KAEA,KACA,SAMKA,GAAb,G,0BCoEO,IAAMC,GAAb,MAAM,MAAOA,GAAb,O,sCAAaA,I,wBAAAA,I,6BARE,CACP,CACIpjB,QAAS8N,EACTuV,SAAUtV,EACV1N,OAAO,IAEd,SAlDQ,CACL6iB,GACA,KACA,KACA,KACAC,GACA,KACA,KACA,KACA,KACA,KAGA,KACA,KACA,KACA,KACA,MACA,MACA,MACA,MACA,UA+BKC,GAAb,GCpDaE,GAAb,MAAM,MAAOA,GAAb,O,sCAAaA,I,wBAAAA,I,6BARE,CACP,CACItjB,QAAS8N,EACTuV,SAAU9N,GACVlV,OAAO,IAEd,SAnBQ,CACL,KACA+iB,GACA,KACA,KACA,KAGA,KACA,KACA,KACA,SAUKE,GAAb,I,mGC1BO,IAAMC,EAAb,MAAM,MAAOA,GAAb,O,sCAAaA,I,wBAAAA,I,4BAHA,CAAC,KAAc,IAAoB,KAAe,SAGlDA,GAAb,I,6CCXO,MAAMC,EAAsC,CAC/C,CAACC,QAAS,MAAOC,QAAS,SAAUC,SAAU,QAASC,SAAU,SAAU5E,QAAS,GACpF,CAACyE,QAAS,QAASC,QAAS,SAAUC,SAAU,MAAOC,SAAU,SAAU5E,QAAS","file":"299.3850a5b0d82da2414cfe.js","sourcesContent":["import { DOCUMENT, CommonModule } from '@angular/common';\nimport { forwardRef, EventEmitter, Component, ViewEncapsulation, ChangeDetectionStrategy, ElementRef, ChangeDetectorRef, Optional, Attribute, NgZone, Inject, Input, Output, ViewChild, NgModule } from '@angular/core';\nimport { mixinTabIndex, mixinColor, mixinDisabled, MatCommonModule } from '@angular/material/core';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport { hasModifierKey, DOWN_ARROW, RIGHT_ARROW, UP_ARROW, LEFT_ARROW, HOME, END, PAGE_DOWN, PAGE_UP } from '@angular/cdk/keycodes';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\nimport { normalizePassiveListenerOptions } from '@angular/cdk/platform';\nimport { Subscription } from 'rxjs';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/cdk/a11y';\nimport * as ɵngcc2 from '@angular/cdk/bidi';\nimport * as ɵngcc3 from '@angular/common';\n\nconst _c0 = [\"sliderWrapper\"];\nconst activeEventOptions = normalizePassiveListenerOptions({ passive: false });\n/**\n * Visually, a 30px separation between tick marks looks best. This is very subjective but it is\n * the default separation we chose.\n */\nconst MIN_AUTO_TICK_SEPARATION = 30;\n/** The thumb gap size for a disabled slider. */\nconst DISABLED_THUMB_GAP = 7;\n/** The thumb gap size for a non-active slider at its minimum value. */\nconst MIN_VALUE_NONACTIVE_THUMB_GAP = 7;\n/** The thumb gap size for an active slider at its minimum value. */\nconst MIN_VALUE_ACTIVE_THUMB_GAP = 10;\n/**\n * Provider Expression that allows mat-slider to register as a ControlValueAccessor.\n * This allows it to support [(ngModel)] and [formControl].\n * @docs-private\n */\nconst MAT_SLIDER_VALUE_ACCESSOR = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MatSlider),\n multi: true\n};\n/** A simple change event emitted by the MatSlider component. */\nclass MatSliderChange {\n}\n// Boilerplate for applying mixins to MatSlider.\n/** @docs-private */\nclass MatSliderBase {\n constructor(_elementRef) {\n this._elementRef = _elementRef;\n }\n}\nconst _MatSliderMixinBase = mixinTabIndex(mixinColor(mixinDisabled(MatSliderBase), 'accent'));\n/**\n * Allows users to select from a range of values by moving the slider thumb. It is similar in\n * behavior to the native `<input type=\"range\">` element.\n */\nclass MatSlider extends _MatSliderMixinBase {\n constructor(elementRef, _focusMonitor, _changeDetectorRef, _dir, tabIndex, _ngZone, _document, _animationMode) {\n super(elementRef);\n this._focusMonitor = _focusMonitor;\n this._changeDetectorRef = _changeDetectorRef;\n this._dir = _dir;\n this._ngZone = _ngZone;\n this._animationMode = _animationMode;\n this._invert = false;\n this._max = 100;\n this._min = 0;\n this._step = 1;\n this._thumbLabel = false;\n this._tickInterval = 0;\n this._value = null;\n this._vertical = false;\n /** Event emitted when the slider value has changed. */\n this.change = new EventEmitter();\n /** Event emitted when the slider thumb moves. */\n this.input = new EventEmitter();\n /**\n * Emits when the raw value of the slider changes. This is here primarily\n * to facilitate the two-way binding for the `value` input.\n * @docs-private\n */\n this.valueChange = new EventEmitter();\n /** onTouch function registered via registerOnTouch (ControlValueAccessor). */\n this.onTouched = () => { };\n this._percent = 0;\n /**\n * Whether or not the thumb is sliding.\n * Used to determine if there should be a transition for the thumb and fill track.\n */\n this._isSliding = false;\n /**\n * Whether or not the slider is active (clicked or sliding).\n * Used to shrink and grow the thumb as according to the Material Design spec.\n */\n this._isActive = false;\n /** The size of a tick interval as a percentage of the size of the track. */\n this._tickIntervalPercent = 0;\n /** The dimensions of the slider. */\n this._sliderDimensions = null;\n this._controlValueAccessorChangeFn = () => { };\n /** Subscription to the Directionality change EventEmitter. */\n this._dirChangeSubscription = Subscription.EMPTY;\n /** Called when the user has put their pointer down on the slider. */\n this._pointerDown = (event) => {\n // Don't do anything if the slider is disabled or the\n // user is using anything other than the main mouse button.\n if (this.disabled || this._isSliding || (!isTouchEvent(event) && event.button !== 0)) {\n return;\n }\n this._ngZone.run(() => {\n const oldValue = this.value;\n const pointerPosition = getPointerPositionOnPage(event);\n this._isSliding = true;\n this._lastPointerEvent = event;\n event.preventDefault();\n this._focusHostElement();\n this._onMouseenter(); // Simulate mouseenter in case this is a mobile device.\n this._bindGlobalEvents(event);\n this._focusHostElement();\n this._updateValueFromPosition(pointerPosition);\n this._valueOnSlideStart = oldValue;\n // Emit a change and input event if the value changed.\n if (oldValue != this.value) {\n this._emitInputEvent();\n }\n });\n };\n /**\n * Called when the user has moved their pointer after\n * starting to drag. Bound on the document level.\n */\n this._pointerMove = (event) => {\n if (this._isSliding) {\n // Prevent the slide from selecting anything else.\n event.preventDefault();\n const oldValue = this.value;\n this._lastPointerEvent = event;\n this._updateValueFromPosition(getPointerPositionOnPage(event));\n // Native range elements always emit `input` events when the value changed while sliding.\n if (oldValue != this.value) {\n this._emitInputEvent();\n }\n }\n };\n /** Called when the user has lifted their pointer. Bound on the document level. */\n this._pointerUp = (event) => {\n if (this._isSliding) {\n event.preventDefault();\n this._removeGlobalEvents();\n this._isSliding = false;\n if (this._valueOnSlideStart != this.value && !this.disabled) {\n this._emitChangeEvent();\n }\n this._valueOnSlideStart = this._lastPointerEvent = null;\n }\n };\n /** Called when the window has lost focus. */\n this._windowBlur = () => {\n // If the window is blurred while dragging we need to stop dragging because the\n // browser won't dispatch the `mouseup` and `touchend` events anymore.\n if (this._lastPointerEvent) {\n this._pointerUp(this._lastPointerEvent);\n }\n };\n this._document = _document;\n this.tabIndex = parseInt(tabIndex) || 0;\n _ngZone.runOutsideAngular(() => {\n const element = elementRef.nativeElement;\n element.addEventListener('mousedown', this._pointerDown, activeEventOptions);\n element.addEventListener('touchstart', this._pointerDown, activeEventOptions);\n });\n }\n /** Whether the slider is inverted. */\n get invert() { return this._invert; }\n set invert(value) {\n this._invert = coerceBooleanProperty(value);\n }\n /** The maximum value that the slider can have. */\n get max() { return this._max; }\n set max(v) {\n this._max = coerceNumberProperty(v, this._max);\n this._percent = this._calculatePercentage(this._value);\n // Since this also modifies the percentage, we need to let the change detection know.\n this._changeDetectorRef.markForCheck();\n }\n /** The minimum value that the slider can have. */\n get min() { return this._min; }\n set min(v) {\n this._min = coerceNumberProperty(v, this._min);\n // If the value wasn't explicitly set by the user, set it to the min.\n if (this._value === null) {\n this.value = this._min;\n }\n this._percent = this._calculatePercentage(this._value);\n // Since this also modifies the percentage, we need to let the change detection know.\n this._changeDetectorRef.markForCheck();\n }\n /** The values at which the thumb will snap. */\n get step() { return this._step; }\n set step(v) {\n this._step = coerceNumberProperty(v, this._step);\n if (this._step % 1 !== 0) {\n this._roundToDecimal = this._step.toString().split('.').pop().length;\n }\n // Since this could modify the label, we need to notify the change detection.\n this._changeDetectorRef.markForCheck();\n }\n /** Whether or not to show the thumb label. */\n get thumbLabel() { return this._thumbLabel; }\n set thumbLabel(value) { this._thumbLabel = coerceBooleanProperty(value); }\n /**\n * How often to show ticks. Relative to the step so that a tick always appears on a step.\n * Ex: Tick interval of 4 with a step of 3 will draw a tick every 4 steps (every 12 values).\n */\n get tickInterval() { return this._tickInterval; }\n set tickInterval(value) {\n if (value === 'auto') {\n this._tickInterval = 'auto';\n }\n else if (typeof value === 'number' || typeof value === 'string') {\n this._tickInterval = coerceNumberProperty(value, this._tickInterval);\n }\n else {\n this._tickInterval = 0;\n }\n }\n /** Value of the slider. */\n get value() {\n // If the value needs to be read and it is still uninitialized, initialize it to the min.\n if (this._value === null) {\n this.value = this._min;\n }\n return this._value;\n }\n set value(v) {\n if (v !== this._value) {\n let value = coerceNumberProperty(v);\n // While incrementing by a decimal we can end up with values like 33.300000000000004.\n // Truncate it to ensure that it matches the label and to make it easier to work with.\n if (this._roundToDecimal && value !== this.min && value !== this.max) {\n value = parseFloat(value.toFixed(this._roundToDecimal));\n }\n this._value = value;\n this._percent = this._calculatePercentage(this._value);\n // Since this also modifies the percentage, we need to let the change detection know.\n this._changeDetectorRef.markForCheck();\n }\n }\n /** Whether the slider is vertical. */\n get vertical() { return this._vertical; }\n set vertical(value) {\n this._vertical = coerceBooleanProperty(value);\n }\n /** The value to be used for display purposes. */\n get displayValue() {\n if (this.displayWith) {\n // Value is never null but since setters and getters cannot have\n // different types, the value getter is also typed to return null.\n return this.displayWith(this.value);\n }\n // Note that this could be improved further by rounding something like 0.999 to 1 or\n // 0.899 to 0.9, however it is very performance sensitive, because it gets called on\n // every change detection cycle.\n if (this._roundToDecimal && this.value && this.value % 1 !== 0) {\n return this.value.toFixed(this._roundToDecimal);\n }\n return this.value || 0;\n }\n /** set focus to the host element */\n focus(options) {\n this._focusHostElement(options);\n }\n /** blur the host element */\n blur() {\n this._blurHostElement();\n }\n /** The percentage of the slider that coincides with the value. */\n get percent() { return this._clamp(this._percent); }\n /**\n * Whether the axis of the slider is inverted.\n * (i.e. whether moving the thumb in the positive x or y direction decreases the slider's value).\n */\n _shouldInvertAxis() {\n // Standard non-inverted mode for a vertical slider should be dragging the thumb from bottom to\n // top. However from a y-axis standpoint this is inverted.\n return this.vertical ? !this.invert : this.invert;\n }\n /** Whether the slider is at its minimum value. */\n _isMinValue() {\n return this.percent === 0;\n }\n /**\n * The amount of space to leave between the slider thumb and the track fill & track background\n * elements.\n */\n _getThumbGap() {\n if (this.disabled) {\n return DISABLED_THUMB_GAP;\n }\n if (this._isMinValue() && !this.thumbLabel) {\n return this._isActive ? MIN_VALUE_ACTIVE_THUMB_GAP : MIN_VALUE_NONACTIVE_THUMB_GAP;\n }\n return 0;\n }\n /** CSS styles for the track background element. */\n _getTrackBackgroundStyles() {\n const axis = this.vertical ? 'Y' : 'X';\n const scale = this.vertical ? `1, ${1 - this.percent}, 1` : `${1 - this.percent}, 1, 1`;\n const sign = this._shouldInvertMouseCoords() ? '-' : '';\n return {\n // scale3d avoids some rendering issues in Chrome. See #12071.\n transform: `translate${axis}(${sign}${this._getThumbGap()}px) scale3d(${scale})`\n };\n }\n /** CSS styles for the track fill element. */\n _getTrackFillStyles() {\n const percent = this.percent;\n const axis = this.vertical ? 'Y' : 'X';\n const scale = this.vertical ? `1, ${percent}, 1` : `${percent}, 1, 1`;\n const sign = this._shouldInvertMouseCoords() ? '' : '-';\n return {\n // scale3d avoids some rendering issues in Chrome. See #12071.\n transform: `translate${axis}(${sign}${this._getThumbGap()}px) scale3d(${scale})`,\n // iOS Safari has a bug where it won't re-render elements which start of as `scale(0)` until\n // something forces a style recalculation on it. Since we'll end up with `scale(0)` when\n // the value of the slider is 0, we can easily get into this situation. We force a\n // recalculation by changing the element's `display` when it goes from 0 to any other value.\n display: percent === 0 ? 'none' : ''\n };\n }\n /** CSS styles for the ticks container element. */\n _getTicksContainerStyles() {\n let axis = this.vertical ? 'Y' : 'X';\n // For a horizontal slider in RTL languages we push the ticks container off the left edge\n // instead of the right edge to avoid causing a horizontal scrollbar to appear.\n let sign = !this.vertical && this._getDirection() == 'rtl' ? '' : '-';\n let offset = this._tickIntervalPercent / 2 * 100;\n return {\n 'transform': `translate${axis}(${sign}${offset}%)`\n };\n }\n /** CSS styles for the ticks element. */\n _getTicksStyles() {\n let tickSize = this._tickIntervalPercent * 100;\n let backgroundSize = this.vertical ? `2px ${tickSize}%` : `${tickSize}% 2px`;\n let axis = this.vertical ? 'Y' : 'X';\n // Depending on the direction we pushed the ticks container, push the ticks the opposite\n // direction to re-center them but clip off the end edge. In RTL languages we need to flip the\n // ticks 180 degrees so we're really cutting off the end edge abd not the start.\n let sign = !this.vertical && this._getDirection() == 'rtl' ? '-' : '';\n let rotate = !this.vertical && this._getDirection() == 'rtl' ? ' rotate(180deg)' : '';\n let styles = {\n 'backgroundSize': backgroundSize,\n // Without translateZ ticks sometimes jitter as the slider moves on Chrome & Firefox.\n 'transform': `translateZ(0) translate${axis}(${sign}${tickSize / 2}%)${rotate}`\n };\n if (this._isMinValue() && this._getThumbGap()) {\n const shouldInvertAxis = this._shouldInvertAxis();\n let side;\n if (this.vertical) {\n side = shouldInvertAxis ? 'Bottom' : 'Top';\n }\n else {\n side = shouldInvertAxis ? 'Right' : 'Left';\n }\n styles[`padding${side}`] = `${this._getThumbGap()}px`;\n }\n return styles;\n }\n _getThumbContainerStyles() {\n const shouldInvertAxis = this._shouldInvertAxis();\n let axis = this.vertical ? 'Y' : 'X';\n // For a horizontal slider in RTL languages we push the thumb container off the left edge\n // instead of the right edge to avoid causing a horizontal scrollbar to appear.\n let invertOffset = (this._getDirection() == 'rtl' && !this.vertical) ? !shouldInvertAxis : shouldInvertAxis;\n let offset = (invertOffset ? this.percent : 1 - this.percent) * 100;\n return {\n 'transform': `translate${axis}(-${offset}%)`\n };\n }\n /**\n * Whether mouse events should be converted to a slider position by calculating their distance\n * from the right or bottom edge of the slider as opposed to the top or left.\n */\n _shouldInvertMouseCoords() {\n const shouldInvertAxis = this._shouldInvertAxis();\n return (this._getDirection() == 'rtl' && !this.vertical) ? !shouldInvertAxis : shouldInvertAxis;\n }\n /** The language direction for this slider element. */\n _getDirection() {\n return (this._dir && this._dir.value == 'rtl') ? 'rtl' : 'ltr';\n }\n ngAfterViewInit() {\n this._focusMonitor\n .monitor(this._elementRef, true)\n .subscribe((origin) => {\n this._isActive = !!origin && origin !== 'keyboard';\n this._changeDetectorRef.detectChanges();\n });\n if (this._dir) {\n this._dirChangeSubscription = this._dir.change.subscribe(() => {\n this._changeDetectorRef.markForCheck();\n });\n }\n }\n ngOnDestroy() {\n const element = this._elementRef.nativeElement;\n element.removeEventListener('mousedown', this._pointerDown, activeEventOptions);\n element.removeEventListener('touchstart', this._pointerDown, activeEventOptions);\n this._lastPointerEvent = null;\n this._removeGlobalEvents();\n this._focusMonitor.stopMonitoring(this._elementRef);\n this._dirChangeSubscription.unsubscribe();\n }\n _onMouseenter() {\n if (this.disabled) {\n return;\n }\n // We save the dimensions of the slider here so we can use them to update the spacing of the\n // ticks and determine where on the slider click and slide events happen.\n this._sliderDimensions = this._getSliderDimensions();\n this._updateTickIntervalPercent();\n }\n _onFocus() {\n // We save the dimensions of the slider here so we can use them to update the spacing of the\n // ticks and determine where on the slider click and slide events happen.\n this._sliderDimensions = this._getSliderDimensions();\n this._updateTickIntervalPercent();\n }\n _onBlur() {\n this.onTouched();\n }\n _onKeydown(event) {\n if (this.disabled || hasModifierKey(event)) {\n return;\n }\n const oldValue = this.value;\n switch (event.keyCode) {\n case PAGE_UP:\n this._increment(10);\n break;\n case PAGE_DOWN:\n this._increment(-10);\n break;\n case END:\n this.value = this.max;\n break;\n case HOME:\n this.value = this.min;\n break;\n case LEFT_ARROW:\n // NOTE: For a sighted user it would make more sense that when they press an arrow key on an\n // inverted slider the thumb moves in that direction. However for a blind user, nothing\n // about the slider indicates that it is inverted. They will expect left to be decrement,\n // regardless of how it appears on the screen. For speakers ofRTL languages, they probably\n // expect left to mean increment. Therefore we flip the meaning of the side arrow keys for\n // RTL. For inverted sliders we prefer a good a11y experience to having it \"look right\" for\n // sighted users, therefore we do not swap the meaning.\n this._increment(this._getDirection() == 'rtl' ? 1 : -1);\n break;\n case UP_ARROW:\n this._increment(1);\n break;\n case RIGHT_ARROW:\n // See comment on LEFT_ARROW about the conditions under which we flip the meaning.\n this._increment(this._getDirection() == 'rtl' ? -1 : 1);\n break;\n case DOWN_ARROW:\n this._increment(-1);\n break;\n default:\n // Return if the key is not one that we explicitly handle to avoid calling preventDefault on\n // it.\n return;\n }\n if (oldValue != this.value) {\n this._emitInputEvent();\n this._emitChangeEvent();\n }\n this._isSliding = true;\n event.preventDefault();\n }\n _onKeyup() {\n this._isSliding = false;\n }\n /** Use defaultView of injected document if available or fallback to global window reference */\n _getWindow() {\n return this._document.defaultView || window;\n }\n /**\n * Binds our global move and end events. They're bound at the document level and only while\n * dragging so that the user doesn't have to keep their pointer exactly over the slider\n * as they're swiping across the screen.\n */\n _bindGlobalEvents(triggerEvent) {\n // Note that we bind the events to the `document`, because it allows us to capture\n // drag cancel events where the user's pointer is outside the browser window.\n const document = this._document;\n const isTouch = isTouchEvent(triggerEvent);\n const moveEventName = isTouch ? 'touchmove' : 'mousemove';\n const endEventName = isTouch ? 'touchend' : 'mouseup';\n document.addEventListener(moveEventName, this._pointerMove, activeEventOptions);\n document.addEventListener(endEventName, this._pointerUp, activeEventOptions);\n if (isTouch) {\n document.addEventListener('touchcancel', this._pointerUp, activeEventOptions);\n }\n const window = this._getWindow();\n if (typeof window !== 'undefined' && window) {\n window.addEventListener('blur', this._windowBlur);\n }\n }\n /** Removes any global event listeners that we may have added. */\n _removeGlobalEvents() {\n const document = this._document;\n document.removeEventListener('mousemove', this._pointerMove, activeEventOptions);\n document.removeEventListener('mouseup', this._pointerUp, activeEventOptions);\n document.removeEventListener('touchmove', this._pointerMove, activeEventOptions);\n document.removeEventListener('touchend', this._pointerUp, activeEventOptions);\n document.removeEventListener('touchcancel', this._pointerUp, activeEventOptions);\n const window = this._getWindow();\n if (typeof window !== 'undefined' && window) {\n window.removeEventListener('blur', this._windowBlur);\n }\n }\n /** Increments the slider by the given number of steps (negative number decrements). */\n _increment(numSteps) {\n this.value = this._clamp((this.value || 0) + this.step * numSteps, this.min, this.max);\n }\n /** Calculate the new value from the new physical location. The value will always be snapped. */\n _updateValueFromPosition(pos) {\n if (!this._sliderDimensions) {\n return;\n }\n let offset = this.vertical ? this._sliderDimensions.top : this._sliderDimensions.left;\n let size = this.vertical ? this._sliderDimensions.height : this._sliderDimensions.width;\n let posComponent = this.vertical ? pos.y : pos.x;\n // The exact value is calculated from the event and used to find the closest snap value.\n let percent = this._clamp((posComponent - offset) / size);\n if (this._shouldInvertMouseCoords()) {\n percent = 1 - percent;\n }\n // Since the steps may not divide cleanly into the max value, if the user\n // slid to 0 or 100 percent, we jump to the min/max value. This approach\n // is slightly more intuitive than using `Math.ceil` below, because it\n // follows the user's pointer closer.\n if (percent === 0) {\n this.value = this.min;\n }\n else if (percent === 1) {\n this.value = this.max;\n }\n else {\n const exactValue = this._calculateValue(percent);\n // This calculation finds the closest step by finding the closest\n // whole number divisible by the step relative to the min.\n const closestValue = Math.round((exactValue - this.min) / this.step) * this.step + this.min;\n // The value needs to snap to the min and max.\n this.value = this._clamp(closestValue, this.min, this.max);\n }\n }\n /** Emits a change event if the current value is different from the last emitted value. */\n _emitChangeEvent() {\n this._controlValueAccessorChangeFn(this.value);\n this.valueChange.emit(this.value);\n this.change.emit(this._createChangeEvent());\n }\n /** Emits an input event when the current value is different from the last emitted value. */\n _emitInputEvent() {\n this.input.emit(this._createChangeEvent());\n }\n /** Updates the amount of space between ticks as a percentage of the width of the slider. */\n _updateTickIntervalPercent() {\n if (!this.tickInterval || !this._sliderDimensions) {\n return;\n }\n if (this.tickInterval == 'auto') {\n let trackSize = this.vertical ? this._sliderDimensions.height : this._sliderDimensions.width;\n let pixelsPerStep = trackSize * this.step / (this.max - this.min);\n let stepsPerTick = Math.ceil(MIN_AUTO_TICK_SEPARATION / pixelsPerStep);\n let pixelsPerTick = stepsPerTick * this.step;\n this._tickIntervalPercent = pixelsPerTick / trackSize;\n }\n else {\n this._tickIntervalPercent = this.tickInterval * this.step / (this.max - this.min);\n }\n }\n /** Creates a slider change object from the specified value. */\n _createChangeEvent(value = this.value) {\n let event = new MatSliderChange();\n event.source = this;\n event.value = value;\n return event;\n }\n /** Calculates the percentage of the slider that a value is. */\n _calculatePercentage(value) {\n return ((value || 0) - this.min) / (this.max - this.min);\n }\n /** Calculates the value a percentage of the slider corresponds to. */\n _calculateValue(percentage) {\n return this.min + percentage * (this.max - this.min);\n }\n /** Return a number between two numbers. */\n _clamp(value, min = 0, max = 1) {\n return Math.max(min, Math.min(value, max));\n }\n /**\n * Get the bounding client rect of the slider track element.\n * The track is used rather than the native element to ignore the extra space that the thumb can\n * take up.\n */\n _getSliderDimensions() {\n return this._sliderWrapper ? this._sliderWrapper.nativeElement.getBoundingClientRect() : null;\n }\n /**\n * Focuses the native element.\n * Currently only used to allow a blur event to fire but will be used with keyboard input later.\n */\n _focusHostElement(options) {\n this._elementRef.nativeElement.focus(options);\n }\n /** Blurs the native element. */\n _blurHostElement() {\n this._elementRef.nativeElement.blur();\n }\n /**\n * Sets the model value. Implemented as part of ControlValueAccessor.\n * @param value\n */\n writeValue(value) {\n this.value = value;\n }\n /**\n * Registers a callback to be triggered when the value has changed.\n * Implemented as part of ControlValueAccessor.\n * @param fn Callback to be registered.\n */\n registerOnChange(fn) {\n this._controlValueAccessorChangeFn = fn;\n }\n /**\n * Registers a callback to be triggered when the component is touched.\n * Implemented as part of ControlValueAccessor.\n * @param fn Callback to be registered.\n */\n registerOnTouched(fn) {\n this.onTouched = fn;\n }\n /**\n * Sets whether the component should be disabled.\n * Implemented as part of ControlValueAccessor.\n * @param isDisabled\n */\n setDisabledState(isDisabled) {\n this.disabled = isDisabled;\n }\n}\nMatSlider.ɵfac = function MatSlider_Factory(t) { return new (t || MatSlider)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.FocusMonitor), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.Directionality, 8), ɵngcc0.ɵɵinjectAttribute('tabindex'), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(DOCUMENT), ɵngcc0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8)); };\nMatSlider.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatSlider, selectors: [[\"mat-slider\"]], viewQuery: function MatSlider_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(_c0, 5);\n } if (rf & 2) {\n let _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._sliderWrapper = _t.first);\n } }, hostAttrs: [\"role\", \"slider\", 1, \"mat-slider\", \"mat-focus-indicator\"], hostVars: 29, hostBindings: function MatSlider_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"focus\", function MatSlider_focus_HostBindingHandler() { return ctx._onFocus(); })(\"blur\", function MatSlider_blur_HostBindingHandler() { return ctx._onBlur(); })(\"keydown\", function MatSlider_keydown_HostBindingHandler($event) { return ctx._onKeydown($event); })(\"keyup\", function MatSlider_keyup_HostBindingHandler() { return ctx._onKeyup(); })(\"mouseenter\", function MatSlider_mouseenter_HostBindingHandler() { return ctx._onMouseenter(); })(\"selectstart\", function MatSlider_selectstart_HostBindingHandler($event) { return $event.preventDefault(); });\n } if (rf & 2) {\n ɵngcc0.ɵɵhostProperty(\"tabIndex\", ctx.tabIndex);\n ɵngcc0.ɵɵattribute(\"aria-disabled\", ctx.disabled)(\"aria-valuemax\", ctx.max)(\"aria-valuemin\", ctx.min)(\"aria-valuenow\", ctx.value)(\"aria-valuetext\", ctx.valueText == null ? ctx.displayValue : ctx.valueText)(\"aria-orientation\", ctx.vertical ? \"vertical\" : \"horizontal\");\n ɵngcc0.ɵɵclassProp(\"mat-slider-disabled\", ctx.disabled)(\"mat-slider-has-ticks\", ctx.tickInterval)(\"mat-slider-horizontal\", !ctx.vertical)(\"mat-slider-axis-inverted\", ctx._shouldInvertAxis())(\"mat-slider-invert-mouse-coords\", ctx._shouldInvertMouseCoords())(\"mat-slider-sliding\", ctx._isSliding)(\"mat-slider-thumb-label-showing\", ctx.thumbLabel)(\"mat-slider-vertical\", ctx.vertical)(\"mat-slider-min-value\", ctx._isMinValue())(\"mat-slider-hide-last-tick\", ctx.disabled || ctx._isMinValue() && ctx._getThumbGap() && ctx._shouldInvertAxis())(\"_mat-animation-noopable\", ctx._animationMode === \"NoopAnimations\");\n } }, inputs: { disabled: \"disabled\", color: \"color\", tabIndex: \"tabIndex\", invert: \"invert\", max: \"max\", min: \"min\", value: \"value\", step: \"step\", thumbLabel: \"thumbLabel\", tickInterval: \"tickInterval\", vertical: \"vertical\", displayWith: \"displayWith\", valueText: \"valueText\" }, outputs: { change: \"change\", input: \"input\", valueChange: \"valueChange\" }, exportAs: [\"matSlider\"], features: [ɵngcc0.ɵɵProvidersFeature([MAT_SLIDER_VALUE_ACCESSOR]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 13, vars: 6, consts: [[1, \"mat-slider-wrapper\"], [\"sliderWrapper\", \"\"], [1, \"mat-slider-track-wrapper\"], [1, \"mat-slider-track-background\", 3, \"ngStyle\"], [1, \"mat-slider-track-fill\", 3, \"ngStyle\"], [1, \"mat-slider-ticks-container\", 3, \"ngStyle\"], [1, \"mat-slider-ticks\", 3, \"ngStyle\"], [1, \"mat-slider-thumb-container\", 3, \"ngStyle\"], [1, \"mat-slider-focus-ring\"], [1, \"mat-slider-thumb\"], [1, \"mat-slider-thumb-label\"], [1, \"mat-slider-thumb-label-text\"]], template: function MatSlider_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 0, 1);\n ɵngcc0.ɵɵelementStart(2, \"div\", 2);\n ɵngcc0.ɵɵelement(3, \"div\", 3);\n ɵngcc0.ɵɵelement(4, \"div\", 4);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(5, \"div\", 5);\n ɵngcc0.ɵɵelement(6, \"div\", 6);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(7, \"div\", 7);\n ɵngcc0.ɵɵelement(8, \"div\", 8);\n ɵngcc0.ɵɵelement(9, \"div\", 9);\n ɵngcc0.ɵɵelementStart(10, \"div\", 10);\n ɵngcc0.ɵɵelementStart(11, \"span\", 11);\n ɵngcc0.ɵɵtext(12);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(3);\n ɵngcc0.ɵɵproperty(\"ngStyle\", ctx._getTrackBackgroundStyles());\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngStyle\", ctx._getTrackFillStyles());\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngStyle\", ctx._getTicksContainerStyles());\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngStyle\", ctx._getTicksStyles());\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngStyle\", ctx._getThumbContainerStyles());\n ɵngcc0.ɵɵadvance(5);\n ɵngcc0.ɵɵtextInterpolate(ctx.displayValue);\n } }, directives: [ɵngcc3.NgStyle], styles: [\".mat-slider{display:inline-block;position:relative;box-sizing:border-box;padding:8px;outline:none;vertical-align:middle}.mat-slider:not(.mat-slider-disabled):active,.mat-slider.mat-slider-sliding:not(.mat-slider-disabled){cursor:-webkit-grabbing;cursor:grabbing}.mat-slider-wrapper{position:absolute;-webkit-print-color-adjust:exact;color-adjust:exact}.mat-slider-track-wrapper{position:absolute;top:0;left:0;overflow:hidden}.mat-slider-track-fill{position:absolute;transform-origin:0 0;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-track-background{position:absolute;transform-origin:100% 100%;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-ticks-container{position:absolute;left:0;top:0;overflow:hidden}.mat-slider-ticks{background-repeat:repeat;background-clip:content-box;box-sizing:border-box;opacity:0;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-thumb-container{position:absolute;z-index:1;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-focus-ring{position:absolute;width:30px;height:30px;border-radius:50%;transform:scale(0);opacity:0;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1),opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider.cdk-keyboard-focused .mat-slider-focus-ring,.mat-slider.cdk-program-focused .mat-slider-focus-ring{transform:scale(1);opacity:1}.mat-slider:not(.mat-slider-disabled):not(.mat-slider-sliding) .mat-slider-thumb-label,.mat-slider:not(.mat-slider-disabled):not(.mat-slider-sliding) .mat-slider-thumb{cursor:-webkit-grab;cursor:grab}.mat-slider-thumb{position:absolute;right:-10px;bottom:-10px;box-sizing:border-box;width:20px;height:20px;border:3px solid transparent;border-radius:50%;transform:scale(0.7);transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1),border-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-thumb-label{display:none;align-items:center;justify-content:center;position:absolute;width:28px;height:28px;border-radius:50%;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),border-radius 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.cdk-high-contrast-active .mat-slider-thumb-label{outline:solid 1px}.mat-slider-thumb-label-text{z-index:1;opacity:0;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-sliding .mat-slider-track-fill,.mat-slider-sliding .mat-slider-track-background,.mat-slider-sliding .mat-slider-thumb-container{transition-duration:0ms}.mat-slider-has-ticks .mat-slider-wrapper::after{content:\\\"\\\";position:absolute;border-width:0;border-style:solid;opacity:0;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after,.mat-slider-has-ticks:hover:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after{opacity:1}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-disabled) .mat-slider-ticks,.mat-slider-has-ticks:hover:not(.mat-slider-disabled) .mat-slider-ticks{opacity:1}.mat-slider-thumb-label-showing .mat-slider-focus-ring{display:none}.mat-slider-thumb-label-showing .mat-slider-thumb-label{display:flex}.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:100% 100%}.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:0 0}.mat-slider:not(.mat-slider-disabled).cdk-focused.mat-slider-thumb-label-showing .mat-slider-thumb{transform:scale(0)}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label{border-radius:50% 50% 0}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label-text{opacity:1}.mat-slider:not(.mat-slider-disabled).cdk-mouse-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-touch-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-program-focused .mat-slider-thumb{border-width:2px;transform:scale(1)}.mat-slider-disabled .mat-slider-focus-ring{transform:scale(0);opacity:0}.mat-slider-disabled .mat-slider-thumb{border-width:4px;transform:scale(0.5)}.mat-slider-disabled .mat-slider-thumb-label{display:none}.mat-slider-horizontal{height:48px;min-width:128px}.mat-slider-horizontal .mat-slider-wrapper{height:2px;top:23px;left:8px;right:8px}.mat-slider-horizontal .mat-slider-wrapper::after{height:2px;border-left-width:2px;right:0;top:0}.mat-slider-horizontal .mat-slider-track-wrapper{height:2px;width:100%}.mat-slider-horizontal .mat-slider-track-fill{height:2px;width:100%;transform:scaleX(0)}.mat-slider-horizontal .mat-slider-track-background{height:2px;width:100%;transform:scaleX(1)}.mat-slider-horizontal .mat-slider-ticks-container{height:2px;width:100%}.cdk-high-contrast-active .mat-slider-horizontal .mat-slider-ticks-container{height:0;outline:solid 2px;top:1px}.mat-slider-horizontal .mat-slider-ticks{height:2px;width:100%}.mat-slider-horizontal .mat-slider-thumb-container{width:100%;height:0;top:50%}.mat-slider-horizontal .mat-slider-focus-ring{top:-15px;right:-15px}.mat-slider-horizontal .mat-slider-thumb-label{right:-14px;top:-40px;transform:translateY(26px) scale(0.01) rotate(45deg)}.mat-slider-horizontal .mat-slider-thumb-label-text{transform:rotate(-45deg)}.mat-slider-horizontal.cdk-focused .mat-slider-thumb-label{transform:rotate(45deg)}.cdk-high-contrast-active .mat-slider-horizontal.cdk-focused .mat-slider-thumb-label,.cdk-high-contrast-active .mat-slider-horizontal.cdk-focused .mat-slider-thumb-label-text{transform:none}.mat-slider-vertical{width:48px;min-height:128px}.mat-slider-vertical .mat-slider-wrapper{width:2px;top:8px;bottom:8px;left:23px}.mat-slider-vertical .mat-slider-wrapper::after{width:2px;border-top-width:2px;bottom:0;left:0}.mat-slider-vertical .mat-slider-track-wrapper{height:100%;width:2px}.mat-slider-vertical .mat-slider-track-fill{height:100%;width:2px;transform:scaleY(0)}.mat-slider-vertical .mat-slider-track-background{height:100%;width:2px;transform:scaleY(1)}.mat-slider-vertical .mat-slider-ticks-container{width:2px;height:100%}.cdk-high-contrast-active .mat-slider-vertical .mat-slider-ticks-container{width:0;outline:solid 2px;left:1px}.mat-slider-vertical .mat-slider-focus-ring{bottom:-15px;left:-15px}.mat-slider-vertical .mat-slider-ticks{width:2px;height:100%}.mat-slider-vertical .mat-slider-thumb-container{height:100%;width:0;left:50%}.mat-slider-vertical .mat-slider-thumb{-webkit-backface-visibility:hidden;backface-visibility:hidden}.mat-slider-vertical .mat-slider-thumb-label{bottom:-14px;left:-40px;transform:translateX(26px) scale(0.01) rotate(-45deg)}.mat-slider-vertical .mat-slider-thumb-label-text{transform:rotate(45deg)}.mat-slider-vertical.cdk-focused .mat-slider-thumb-label{transform:rotate(-45deg)}[dir=rtl] .mat-slider-wrapper::after{left:0;right:auto}[dir=rtl] .mat-slider-horizontal .mat-slider-track-fill{transform-origin:100% 100%}[dir=rtl] .mat-slider-horizontal .mat-slider-track-background{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:100% 100%}.mat-slider._mat-animation-noopable .mat-slider-track-fill,.mat-slider._mat-animation-noopable .mat-slider-track-background,.mat-slider._mat-animation-noopable .mat-slider-ticks,.mat-slider._mat-animation-noopable .mat-slider-thumb-container,.mat-slider._mat-animation-noopable .mat-slider-focus-ring,.mat-slider._mat-animation-noopable .mat-slider-thumb,.mat-slider._mat-animation-noopable .mat-slider-thumb-label,.mat-slider._mat-animation-noopable .mat-slider-thumb-label-text,.mat-slider._mat-animation-noopable .mat-slider-has-ticks .mat-slider-wrapper::after{transition:none}\\n\"], encapsulation: 2, changeDetection: 0 });\nMatSlider.ctorParameters = () => [\n { type: ElementRef },\n { type: FocusMonitor },\n { type: ChangeDetectorRef },\n { type: Directionality, decorators: [{ type: Optional }] },\n { type: String, decorators: [{ type: Attribute, args: ['tabindex',] }] },\n { type: NgZone },\n { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },\n { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] }\n];\nMatSlider.propDecorators = {\n invert: [{ type: Input }],\n max: [{ type: Input }],\n min: [{ type: Input }],\n step: [{ type: Input }],\n thumbLabel: [{ type: Input }],\n tickInterval: [{ type: Input }],\n value: [{ type: Input }],\n displayWith: [{ type: Input }],\n valueText: [{ type: Input }],\n vertical: [{ type: Input }],\n change: [{ type: Output }],\n input: [{ type: Output }],\n valueChange: [{ type: Output }],\n _sliderWrapper: [{ type: ViewChild, args: ['sliderWrapper',] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSlider, [{\n type: Component,\n args: [{\n selector: 'mat-slider',\n exportAs: 'matSlider',\n providers: [MAT_SLIDER_VALUE_ACCESSOR],\n host: {\n '(focus)': '_onFocus()',\n '(blur)': '_onBlur()',\n '(keydown)': '_onKeydown($event)',\n '(keyup)': '_onKeyup()',\n '(mouseenter)': '_onMouseenter()',\n // On Safari starting to slide temporarily triggers text selection mode which\n // show the wrong cursor. We prevent it by stopping the `selectstart` event.\n '(selectstart)': '$event.preventDefault()',\n 'class': 'mat-slider mat-focus-indicator',\n 'role': 'slider',\n '[tabIndex]': 'tabIndex',\n '[attr.aria-disabled]': 'disabled',\n '[attr.aria-valuemax]': 'max',\n '[attr.aria-valuemin]': 'min',\n '[attr.aria-valuenow]': 'value',\n // NVDA and Jaws appear to announce the `aria-valuenow` by calculating its percentage based\n // on its value between `aria-valuemin` and `aria-valuemax`. Due to how decimals are handled,\n // it can cause the slider to read out a very long value like 0.20000068 if the current value\n // is 0.2 with a min of 0 and max of 1. We work around the issue by setting `aria-valuetext`\n // to the same value that we set on the slider's thumb which will be truncated.\n '[attr.aria-valuetext]': 'valueText == null ? displayValue : valueText',\n '[attr.aria-orientation]': 'vertical ? \"vertical\" : \"horizontal\"',\n '[class.mat-slider-disabled]': 'disabled',\n '[class.mat-slider-has-ticks]': 'tickInterval',\n '[class.mat-slider-horizontal]': '!vertical',\n '[class.mat-slider-axis-inverted]': '_shouldInvertAxis()',\n // Class binding which is only used by the test harness as there is no other\n // way for the harness to detect if mouse coordinates need to be inverted.\n '[class.mat-slider-invert-mouse-coords]': '_shouldInvertMouseCoords()',\n '[class.mat-slider-sliding]': '_isSliding',\n '[class.mat-slider-thumb-label-showing]': 'thumbLabel',\n '[class.mat-slider-vertical]': 'vertical',\n '[class.mat-slider-min-value]': '_isMinValue()',\n '[class.mat-slider-hide-last-tick]': 'disabled || _isMinValue() && _getThumbGap() && _shouldInvertAxis()',\n '[class._mat-animation-noopable]': '_animationMode === \"NoopAnimations\"'\n },\n template: \"<div class=\\\"mat-slider-wrapper\\\" #sliderWrapper>\\n <div class=\\\"mat-slider-track-wrapper\\\">\\n <div class=\\\"mat-slider-track-background\\\" [ngStyle]=\\\"_getTrackBackgroundStyles()\\\"></div>\\n <div class=\\\"mat-slider-track-fill\\\" [ngStyle]=\\\"_getTrackFillStyles()\\\"></div>\\n </div>\\n <div class=\\\"mat-slider-ticks-container\\\" [ngStyle]=\\\"_getTicksContainerStyles()\\\">\\n <div class=\\\"mat-slider-ticks\\\" [ngStyle]=\\\"_getTicksStyles()\\\"></div>\\n </div>\\n <div class=\\\"mat-slider-thumb-container\\\" [ngStyle]=\\\"_getThumbContainerStyles()\\\">\\n <div class=\\\"mat-slider-focus-ring\\\"></div>\\n <div class=\\\"mat-slider-thumb\\\"></div>\\n <div class=\\\"mat-slider-thumb-label\\\">\\n <span class=\\\"mat-slider-thumb-label-text\\\">{{displayValue}}</span>\\n </div>\\n </div>\\n</div>\\n\",\n inputs: ['disabled', 'color', 'tabIndex'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [\".mat-slider{display:inline-block;position:relative;box-sizing:border-box;padding:8px;outline:none;vertical-align:middle}.mat-slider:not(.mat-slider-disabled):active,.mat-slider.mat-slider-sliding:not(.mat-slider-disabled){cursor:-webkit-grabbing;cursor:grabbing}.mat-slider-wrapper{position:absolute;-webkit-print-color-adjust:exact;color-adjust:exact}.mat-slider-track-wrapper{position:absolute;top:0;left:0;overflow:hidden}.mat-slider-track-fill{position:absolute;transform-origin:0 0;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-track-background{position:absolute;transform-origin:100% 100%;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-ticks-container{position:absolute;left:0;top:0;overflow:hidden}.mat-slider-ticks{background-repeat:repeat;background-clip:content-box;box-sizing:border-box;opacity:0;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-thumb-container{position:absolute;z-index:1;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-focus-ring{position:absolute;width:30px;height:30px;border-radius:50%;transform:scale(0);opacity:0;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1),opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider.cdk-keyboard-focused .mat-slider-focus-ring,.mat-slider.cdk-program-focused .mat-slider-focus-ring{transform:scale(1);opacity:1}.mat-slider:not(.mat-slider-disabled):not(.mat-slider-sliding) .mat-slider-thumb-label,.mat-slider:not(.mat-slider-disabled):not(.mat-slider-sliding) .mat-slider-thumb{cursor:-webkit-grab;cursor:grab}.mat-slider-thumb{position:absolute;right:-10px;bottom:-10px;box-sizing:border-box;width:20px;height:20px;border:3px solid transparent;border-radius:50%;transform:scale(0.7);transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1),border-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-thumb-label{display:none;align-items:center;justify-content:center;position:absolute;width:28px;height:28px;border-radius:50%;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),border-radius 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.cdk-high-contrast-active .mat-slider-thumb-label{outline:solid 1px}.mat-slider-thumb-label-text{z-index:1;opacity:0;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-sliding .mat-slider-track-fill,.mat-slider-sliding .mat-slider-track-background,.mat-slider-sliding .mat-slider-thumb-container{transition-duration:0ms}.mat-slider-has-ticks .mat-slider-wrapper::after{content:\\\"\\\";position:absolute;border-width:0;border-style:solid;opacity:0;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after,.mat-slider-has-ticks:hover:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after{opacity:1}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-disabled) .mat-slider-ticks,.mat-slider-has-ticks:hover:not(.mat-slider-disabled) .mat-slider-ticks{opacity:1}.mat-slider-thumb-label-showing .mat-slider-focus-ring{display:none}.mat-slider-thumb-label-showing .mat-slider-thumb-label{display:flex}.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:100% 100%}.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:0 0}.mat-slider:not(.mat-slider-disabled).cdk-focused.mat-slider-thumb-label-showing .mat-slider-thumb{transform:scale(0)}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label{border-radius:50% 50% 0}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label-text{opacity:1}.mat-slider:not(.mat-slider-disabled).cdk-mouse-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-touch-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-program-focused .mat-slider-thumb{border-width:2px;transform:scale(1)}.mat-slider-disabled .mat-slider-focus-ring{transform:scale(0);opacity:0}.mat-slider-disabled .mat-slider-thumb{border-width:4px;transform:scale(0.5)}.mat-slider-disabled .mat-slider-thumb-label{display:none}.mat-slider-horizontal{height:48px;min-width:128px}.mat-slider-horizontal .mat-slider-wrapper{height:2px;top:23px;left:8px;right:8px}.mat-slider-horizontal .mat-slider-wrapper::after{height:2px;border-left-width:2px;right:0;top:0}.mat-slider-horizontal .mat-slider-track-wrapper{height:2px;width:100%}.mat-slider-horizontal .mat-slider-track-fill{height:2px;width:100%;transform:scaleX(0)}.mat-slider-horizontal .mat-slider-track-background{height:2px;width:100%;transform:scaleX(1)}.mat-slider-horizontal .mat-slider-ticks-container{height:2px;width:100%}.cdk-high-contrast-active .mat-slider-horizontal .mat-slider-ticks-container{height:0;outline:solid 2px;top:1px}.mat-slider-horizontal .mat-slider-ticks{height:2px;width:100%}.mat-slider-horizontal .mat-slider-thumb-container{width:100%;height:0;top:50%}.mat-slider-horizontal .mat-slider-focus-ring{top:-15px;right:-15px}.mat-slider-horizontal .mat-slider-thumb-label{right:-14px;top:-40px;transform:translateY(26px) scale(0.01) rotate(45deg)}.mat-slider-horizontal .mat-slider-thumb-label-text{transform:rotate(-45deg)}.mat-slider-horizontal.cdk-focused .mat-slider-thumb-label{transform:rotate(45deg)}.cdk-high-contrast-active .mat-slider-horizontal.cdk-focused .mat-slider-thumb-label,.cdk-high-contrast-active .mat-slider-horizontal.cdk-focused .mat-slider-thumb-label-text{transform:none}.mat-slider-vertical{width:48px;min-height:128px}.mat-slider-vertical .mat-slider-wrapper{width:2px;top:8px;bottom:8px;left:23px}.mat-slider-vertical .mat-slider-wrapper::after{width:2px;border-top-width:2px;bottom:0;left:0}.mat-slider-vertical .mat-slider-track-wrapper{height:100%;width:2px}.mat-slider-vertical .mat-slider-track-fill{height:100%;width:2px;transform:scaleY(0)}.mat-slider-vertical .mat-slider-track-background{height:100%;width:2px;transform:scaleY(1)}.mat-slider-vertical .mat-slider-ticks-container{width:2px;height:100%}.cdk-high-contrast-active .mat-slider-vertical .mat-slider-ticks-container{width:0;outline:solid 2px;left:1px}.mat-slider-vertical .mat-slider-focus-ring{bottom:-15px;left:-15px}.mat-slider-vertical .mat-slider-ticks{width:2px;height:100%}.mat-slider-vertical .mat-slider-thumb-container{height:100%;width:0;left:50%}.mat-slider-vertical .mat-slider-thumb{-webkit-backface-visibility:hidden;backface-visibility:hidden}.mat-slider-vertical .mat-slider-thumb-label{bottom:-14px;left:-40px;transform:translateX(26px) scale(0.01) rotate(-45deg)}.mat-slider-vertical .mat-slider-thumb-label-text{transform:rotate(45deg)}.mat-slider-vertical.cdk-focused .mat-slider-thumb-label{transform:rotate(-45deg)}[dir=rtl] .mat-slider-wrapper::after{left:0;right:auto}[dir=rtl] .mat-slider-horizontal .mat-slider-track-fill{transform-origin:100% 100%}[dir=rtl] .mat-slider-horizontal .mat-slider-track-background{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:100% 100%}.mat-slider._mat-animation-noopable .mat-slider-track-fill,.mat-slider._mat-animation-noopable .mat-slider-track-background,.mat-slider._mat-animation-noopable .mat-slider-ticks,.mat-slider._mat-animation-noopable .mat-slider-thumb-container,.mat-slider._mat-animation-noopable .mat-slider-focus-ring,.mat-slider._mat-animation-noopable .mat-slider-thumb,.mat-slider._mat-animation-noopable .mat-slider-thumb-label,.mat-slider._mat-animation-noopable .mat-slider-thumb-label-text,.mat-slider._mat-animation-noopable .mat-slider-has-ticks .mat-slider-wrapper::after{transition:none}\\n\"]\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc1.FocusMonitor }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc2.Directionality, decorators: [{\n type: Optional\n }] }, { type: String, decorators: [{\n type: Attribute,\n args: ['tabindex']\n }] }, { type: ɵngcc0.NgZone }, { type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: String, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }]; }, { change: [{\n type: Output\n }], input: [{\n type: Output\n }], valueChange: [{\n type: Output\n }], invert: [{\n type: Input\n }], max: [{\n type: Input\n }], min: [{\n type: Input\n }], value: [{\n type: Input\n }], step: [{\n type: Input\n }], thumbLabel: [{\n type: Input\n }], tickInterval: [{\n type: Input\n }], vertical: [{\n type: Input\n }], displayWith: [{\n type: Input\n }], valueText: [{\n type: Input\n }], _sliderWrapper: [{\n type: ViewChild,\n args: ['sliderWrapper']\n }] }); })();\n/** Returns whether an event is a touch event. */\nfunction isTouchEvent(event) {\n // This function is called for every pixel that the user has dragged so we need it to be\n // as fast as possible. Since we only bind mouse events and touch events, we can assume\n // that if the event's name starts with `t`, it's a touch event.\n return event.type[0] === 't';\n}\n/** Gets the coordinates of a touch or mouse event relative to the viewport. */\nfunction getPointerPositionOnPage(event) {\n // `touches` will be empty for start/end events so we have to fall back to `changedTouches`.\n const point = isTouchEvent(event) ? (event.touches[0] || event.changedTouches[0]) : event;\n return { x: point.clientX, y: point.clientY };\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatSliderModule {\n}\nMatSliderModule.ɵfac = function MatSliderModule_Factory(t) { return new (t || MatSliderModule)(); };\nMatSliderModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: MatSliderModule });\nMatSliderModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({ imports: [[CommonModule, MatCommonModule], MatCommonModule] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSliderModule, [{\n type: NgModule,\n args: [{\n imports: [CommonModule, MatCommonModule],\n exports: [MatSlider, MatCommonModule],\n declarations: [MatSlider]\n }]\n }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MatSliderModule, { declarations: function () { return [MatSlider]; }, imports: function () { return [CommonModule, MatCommonModule]; }, exports: function () { return [MatSlider, MatCommonModule]; } }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MAT_SLIDER_VALUE_ACCESSOR, MatSlider, MatSliderChange, MatSliderModule };\n\n//# sourceMappingURL=slider.js.map","import {InjectionToken} from '@angular/core';\nimport {ComponentType} from '@angular/cdk/portal';\nimport {Params} from '@angular/router';\n\nexport interface AppearanceEditorConfig {\n navigationRoutes: string[];\n defaultRoute?: string;\n sections?: AppearanceEditorField[];\n menus: {\n availableRoutes: string[],\n positions?: string[],\n };\n}\n\nexport interface AppearanceEditorField {\n name: string;\n component?: ComponentType<any>;\n position?: number;\n route?: string;\n queryParams?: Params;\n}\n\nexport const APPEARANCE_EDITOR_CONFIG = new InjectionToken<AppearanceEditorConfig[]>('APPEARANCE_EDITOR_CONFIG');\n\nexport const DEFAULT_APPEARANCE_EDITOR_CONFIG: AppearanceEditorConfig = {\n navigationRoutes: [],\n menus: {\n availableRoutes: [\n 'login',\n 'register',\n 'contact',\n 'billing/pricing',\n 'account-settings',\n 'admin/appearance',\n 'admin/users',\n 'admin/settings/authentication',\n 'admin/settings/branding',\n 'admin/settings/cache',\n 'admin/settings/providers',\n 'admin/roles',\n ],\n positions: [\n 'admin-navbar',\n 'custom-page-navbar',\n 'auth-page-footer',\n ]\n },\n sections: [\n {name: 'general', position: 1},\n {name: 'themes', position: 2},\n {name: 'menus', position: 3},\n {name: 'custom-code', position: 4},\n {name: 'seo-settings', position: 5}\n ]\n};\n","import { AppearanceCommand } from './appearance-command';\nimport { CommandTypes } from './command-types';\nimport {Params} from '@angular/router';\n\nexport class Navigate implements AppearanceCommand {\n type = CommandTypes.Navigate;\n constructor(public route: string, public queryParams: Params) {}\n}\n\nexport class SetConfig implements AppearanceCommand {\n type = CommandTypes.SetConfig;\n constructor(public key: string, public value: string|number) {}\n}\n\nexport class Select implements AppearanceCommand {\n type = CommandTypes.Select;\n constructor(public selector: string, public index = 0) {}\n}\n\nexport class Deselect implements AppearanceCommand {\n type = CommandTypes.Deselect;\n}\n\nexport class SetColors implements AppearanceCommand {\n type = CommandTypes.SetColors;\n constructor(public key: string, public value: string) {}\n}\n\nexport class SetCustomCss implements AppearanceCommand {\n type = CommandTypes.SetCustomCss;\n constructor(public content: string) {}\n}\n\nexport class SetCustomHtml implements AppearanceCommand {\n type = CommandTypes.SetCustomHtml;\n constructor(public content: string) {}\n}\n\nexport type AllCommands = Navigate | SetConfig | Select;\n","import {Injectable} from '@angular/core';\nimport {Router} from '@angular/router';\nimport {Settings} from '@common/core/config/settings.service';\nimport {Deselect, Navigate, Select, SetConfig} from '@common/shared/appearance/commands/appearance-commands';\nimport {AppearanceCommand} from '@common/shared/appearance/commands/appearance-command';\nimport {APPEARANCE_TOKEN} from '@common/shared/appearance/appearance-listener.service';\nimport {BehaviorSubject, fromEvent, Observable, ReplaySubject} from 'rxjs';\nimport {filter, finalize, share} from 'rxjs/operators';\nimport {slugifyString} from '@common/core/utils/slugify-string';\nimport {CssThemeColors} from '@common/core/types/models/CssTheme';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {GenericBackendResponse} from '@common/core/types/backend-response';\nimport {removeDuplicateSlashes} from '@common/core/utils/remove-duplicate-slashes';\nimport {AppearanceEditorConfig, AppearanceEditorField} from '@common/admin/appearance/appearance-editor-config.token';\nimport deepmerge from 'deepmerge';\n\nexport interface EditorChanges {\n [key: string]: string|number|object;\n colors?: CssThemeColors;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AppearanceEditor {\n public activePanel$ = new BehaviorSubject<AppearanceEditorField>(null);\n public defaultSettings: {[key: string]: any} = {};\n public initiated$ = new ReplaySubject(1);\n private previewWindow: Window;\n\n public loading$ = new BehaviorSubject<boolean>(false);\n private saveRequest: (changes: EditorChanges) => Observable<void>;\n public changes$ = new BehaviorSubject<EditorChanges>(null);\n public config: AppearanceEditorConfig;\n\n constructor(\n private settings: Settings,\n private router: Router,\n private http: AppHttpClient,\n private toast: Toast,\n ) {}\n\n public addChanges(value: EditorChanges) {\n this.changes$.next({...this.changes$.value, ...value});\n }\n \n public openPanel(name: string) {\n const panel = this.config.sections.find(value => {\n return slugifyString(value.name) === name;\n });\n this.activePanel$.next(panel);\n this.navigate(panel);\n }\n\n public init(iframe: HTMLIFrameElement, defaultSettings: {name: string, value: any}[], config: AppearanceEditorConfig[]) {\n // listen for 'initiated' event from iframe window\n fromEvent(window, 'message')\n .pipe(filter((e: MessageEvent) => {\n return e.data === APPEARANCE_TOKEN && (new URL(e.origin).hostname) === window.location.hostname;\n })).subscribe(() => {\n this.initiated$.next(true);\n this.initiated$.complete();\n if (this.activePanel$.value) {\n this.navigate(this.activePanel$.value);\n }\n });\n\n defaultSettings.forEach(setting => {\n if (setting.name === 'env') {\n this.defaultSettings = {...this.defaultSettings, ...setting.value};\n } else {\n this.defaultSettings[setting.name] = setting.value;\n }\n });\n\n this.initConfig(config);\n this.initIframe(iframe);\n return this.initiated$;\n }\n\n public saveChanges(changes?: EditorChanges): Observable<unknown> {\n if (changes) {\n this.addChanges(changes);\n }\n this.loading$.next(true);\n const request = this.saveRequest ?\n this.saveRequest :\n c => this.http.post<GenericBackendResponse<any>>('admin/appearance', c);\n const observable = request(this.changes$.value)\n .pipe(\n finalize(() => this.loading$.next(false)),\n share()\n );\n observable.subscribe(() => {\n this.changes$.next(null);\n this.toast.open('Appearance saved');\n });\n return observable;\n }\n\n public setSaveRequest(request: (changes: EditorChanges) => Observable<void>) {\n this.saveRequest = request;\n }\n\n public closeActivePanel() {\n this.router.navigate(['/admin/appearance']);\n }\n\n public navigate(panelConfig: AppearanceEditorField) {\n const route = panelConfig?.route || this.config.defaultRoute;\n this.postMessage(new Navigate(route, panelConfig?.queryParams));\n }\n\n public setConfig(key: string, value: string|number) {\n this.postMessage(new SetConfig(key, value));\n }\n\n public selectNode(selector: string, index = 0) {\n if ( ! selector) return;\n this.postMessage(new Select(selector, index));\n }\n\n public deselectNode() {\n this.postMessage(new Deselect());\n }\n\n public postMessage(command: AppearanceCommand) {\n this.previewWindow.postMessage(command, '*');\n }\n\n public currentValue(key: string) {\n if (key.startsWith('env.') || key.startsWith('custom-code.')) {\n return this.defaultSettings[key];\n } else {\n return this.settings.get(key);\n }\n }\n\n private initConfig(config: AppearanceEditorConfig[]) {\n const merged = deepmerge.all(config) as AppearanceEditorConfig;\n merged.sections = merged.sections.sort((a, b) => (a.position > b.position) ? 1 : -1);\n if ( ! merged.defaultRoute) merged.defaultRoute = '/';\n if (this.settings.get('site.has_mobile_app')) {\n merged.menus.positions.push('mobile-app-about');\n }\n this.config = merged;\n }\n\n private initIframe(iframe: HTMLIFrameElement) {\n const url = this.settings.getBaseUrl() + '/' + this.config.defaultRoute + `?be-preview-mode=${APPEARANCE_TOKEN}`;\n iframe.src = removeDuplicateSlashes(url);\n this.previewWindow = iframe.contentWindow;\n }\n}\n","export function removeDuplicateSlashes(url: string): string {\n return url.replace(/([^:]\\/)\\/+/g, '$1');\n}\n","<div class=\"back-button\" (click)=\"back.emit()\">\n <mat-icon svgIcon=\"keyboard-arrow-left\"></mat-icon>\n</div>\n<div class=\"title\">\n <div class=\"static\" trans>Customizing</div>\n <div class=\"path\">\n <ng-container *ngFor=\"let item of path; last as isLast; first as isFirst;\">\n <span *ngIf=\"item\">\n <mat-icon svgIcon=\"keyboard-arrow-right\" class=\"separator\" *ngIf=\"!isFirst\"></mat-icon>\n <span class=\"name\" [class.last]=\"isLast\" trans>{{viewName(item)}}</span>\n </span>\n </ng-container>\n </div>\n</div>","import {ChangeDetectionStrategy, Component, EventEmitter, Input, Output} from '@angular/core';\nimport {snakeCase} from '@common/core/utils/snake-case';\n\n@Component({\n selector: 'appearance-panel-meta',\n templateUrl: './appearance-panel-meta.component.html',\n styleUrls: ['./appearance-panel-meta.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppearancePanelMetaComponent {\n @Input() path: string[] = [];\n @Output() back = new EventEmitter();\n\n public viewName(name: string) {\n return snakeCase(name).replace(/_/g , ' ');\n }\n}\n","import {Directive, ElementRef, Input, OnInit} from '@angular/core';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\n\n@Directive({\n selector: '[highlightInPreview]'\n})\nexport class HighlightInPreviewDirective implements OnInit {\n @Input('highlightInPreview') selector: string;\n\n constructor(\n private el: ElementRef<HTMLElement>,\n private editor: AppearanceEditor,\n ) {}\n\n public ngOnInit(): void {\n this.el.nativeElement.addEventListener('focus', () => {\n this.editor.selectNode(this.selector);\n });\n\n this.el.nativeElement.addEventListener('blur', () => {\n this.editor.deselectNode();\n });\n }\n}\n","<div class=\"field-container\" (click)=\"openModal()\">\n <div class=\"label fake-label\" trans><ng-content></ng-content></div>\n <div class=\"img-container\">\n <image-or-icon\n class=\"inherit-size\"\n [src]=\"image\"\n *ngIf=\"image$ | async as image; else noImage\"\n ></image-or-icon>\n\n <ng-template #noImage>\n <div class=\"no-image\">\n <mat-icon svgIcon=\"photo-size-select-actual\"></mat-icon>\n <span class=\"text\" trans>Upload</span>\n </div>\n </ng-template>\n\n <div class=\"actions-dropdown\">\n <button class=\"no-style\" [matMenuTriggerFor]=\"actionsMenu\" (click)=\"$event.stopPropagation()\">\n <mat-icon svgIcon=\"settings\" class=\"trigger-icon\"></mat-icon>\n </button>\n\n <mat-menu #actionsMenu>\n <div mat-menu-item (click)=\"remove()\" *ngIf=\"image$ | async\" trans>Remove</div>\n <div mat-menu-item (click)=\"useDefault()\" *ngIf=\"defaultValue\" trans>Use Default</div>\n </mat-menu>\n </div>\n </div>\n</div>\n<mat-progress-bar mode=\"indeterminate\" color=\"accent\" *ngIf=\"loading$ | async\"></mat-progress-bar>\n","import {ChangeDetectionStrategy, Component, Input} from '@angular/core';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\nimport {UploadQueueService} from '@common/uploads/upload-queue/upload-queue.service';\nimport {AppearanceImageUploadValidator} from '@common/admin/appearance/appearance-image-input/appearance-image-upload-validator';\nimport {Settings} from '@common/core/config/settings.service';\nimport {openUploadWindow} from '@common/uploads/utils/open-upload-window';\nimport {UploadInputTypes} from '@common/uploads/upload-input-config';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {BehaviorSubject} from 'rxjs';\nimport {randomString} from '@common/core/utils/random-string';\nimport {finalize} from 'rxjs/operators';\nimport {UploadUri} from '@common/uploads/types/upload-uri.enum';\nimport {UploadApiConfig} from '@common/uploads/types/upload-api-config';\n\n@Component({\n selector: 'appearance-image-input',\n templateUrl: './appearance-image-input.component.html',\n styleUrls: ['./appearance-image-input.component.scss'],\n host: {tabindex: '0'},\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n UploadQueueService,\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: AppearanceImageInputComponent,\n multi: true,\n },\n ],\n})\nexport class AppearanceImageInputComponent implements ControlValueAccessor {\n @Input() defaultValue: string;\n @Input() backendUri: string;\n @Input() diskPrefix: string;\n private propagateChange: Function;\n public image$ = new BehaviorSubject(null);\n public loading$ = new BehaviorSubject<boolean>(false);\n\n constructor(\n private editor: AppearanceEditor,\n private uploadQueue: UploadQueueService,\n private validator: AppearanceImageUploadValidator,\n public settings: Settings\n ) {\n this.validator.showToast = true;\n }\n\n public openModal() {\n const params: UploadApiConfig = {\n uri: this.backendUri || UploadUri.Image,\n httpParams: {diskPrefix: this.diskPrefix},\n validator: this.validator,\n };\n openUploadWindow({types: [UploadInputTypes.image]}).then(files => {\n this.loading$.next(true);\n this.uploadQueue\n .start(files, params)\n .pipe(finalize(() => this.loading$.next(false)))\n .subscribe(response => {\n this.updateValue(response.fileEntry.url);\n });\n });\n }\n\n public remove() {\n this.updateValue(null);\n }\n\n public useDefault() {\n this.updateValue(this.defaultValue);\n }\n\n private updateValue(val?: string) {\n this.propagateChange(val);\n // make sure new image is loaded by browser as path will be the same\n this.image$.next(val ? val + `?v=${randomString(8)}` : null);\n }\n\n public writeValue(value: string) {\n this.image$.next(value);\n }\n\n public registerOnChange(fn: Function) {\n this.propagateChange = fn;\n }\n\n public registerOnTouched() {}\n}\n","import {ChangeDetectionStrategy, Component, ElementRef, OnDestroy} from '@angular/core';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {BOTTOM_POSITION} from '@common/core/ui/overlay-panel/positions/bottom-position';\nimport {OverlayPanel} from '@common/core/ui/overlay-panel/overlay-panel.service';\nimport {BehaviorSubject, Subscription} from 'rxjs';\n\n@Component({\n selector: 'color-picker-input',\n templateUrl: './color-picker-input.component.html',\n styleUrls: ['./color-picker-input.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: ColorPickerInputComponent,\n multi: true,\n }]\n})\nexport class ColorPickerInputComponent implements OnDestroy, ControlValueAccessor {\n private pickerSub: Subscription;\n public propagateChange: Function;\n public color$ = new BehaviorSubject(null);\n\n constructor(\n private overlayPanel: OverlayPanel,\n ) {}\n\n public ngOnDestroy(): void {\n this.pickerSub && this.pickerSub.unsubscribe();\n }\n\n public writeValue(value: string) {\n this.color$.next(value);\n }\n\n public registerOnChange(fn: Function) {\n this.propagateChange = fn;\n }\n\n public registerOnTouched() {}\n\n public async openColorPicker(e: MouseEvent) {\n const { BeColorPickerModule } = await import('@common/core/ui/color-picker/be-color-picker.module');\n this.pickerSub = this.overlayPanel.open(\n BeColorPickerModule.components.panel,\n {\n origin: new ElementRef(e.target),\n position: BOTTOM_POSITION,\n data: {color: this.color$.value}\n }\n ).valueChanged().subscribe(color => {\n this.color$.next(color);\n this.propagateChange(this.color$.value);\n });\n }\n}\n","<button type=\"button\" matRipple class=\"no-style color-picker-btn\" (click)=\"openColorPicker($event)\">\n <mat-icon svgIcon=\"drop-custom\" class=\"color-icon\" [style.color]=\"color$ | async\"></mat-icon>\n <span class=\"name\" trans><ng-content></ng-content></span>\n <span class=\"change\" trans>Change</span>\n</button>\n","<appearance-panel-meta [path]=\"path$ | async\" (back)=\"openPreviousPanel()\"></appearance-panel-meta>\n\n<div class=\"appearance-panel-content\">\n <ng-container *ngIf=\"selectedSubpanel$ | async as selectedSubpanel; else mainPanel\">\n <div [ngSwitch]=\"selectedSubpanel\">\n <ng-container *ngSwitchCase=\"'primaryFeatures'\">\n <div *ngFor=\"let group of primaryArray().controls; index as index\" [formGroup]=\"group\"\n class=\"many-inputs feature-group\">\n <div class=\"feature-group-header\">\n <div class=\"text\">{{'Feature' | trans}} #{{index + 1}}</div>\n <button mat-icon-button color=\"warn\" (click)=\"removeFeature('primary', index)\">\n <mat-icon svgIcon=\"close\"></mat-icon>\n </button>\n </div>\n <div class=\"input-container\">\n <label [for]=\"'primary.' + index + '.title'\" trans>Title</label>\n <input type=\"text\" [id]=\"'primary.' + index + '.title'\" formControlName=\"title\"\n [placeholder]=\"defaultValue('primaryFeatures.' + index + '.title')\"\n highlightInPreview=\".inline-feature:nth-child({{index + 1}}) h3\" required>\n </div>\n <div class=\"input-container\">\n <label [for]=\"'primary.' + index + '.subtitle'\" trans>Subtitle</label>\n <textarea [id]=\"'primary.' + index + '.subtitle'\" formControlName=\"subtitle\"\n [placeholder]=\"defaultValue('primaryFeatures.' + index + '.subtitle')\"\n highlightInPreview=\".inline-feature:nth-child({{index + 1}}) p\" rows=\"3\" required></textarea>\n </div>\n <appearance-image-input [defaultValue]=\"defaultValue('primaryFeatures.' + index + '.image')\"\n formControlName=\"image\"\n diskPrefix=\"homepage\"\n highlightInPreview=\".inline-feature:nth-child({{index + 1}}) img\" trans>\n Image\n </appearance-image-input>\n </div>\n <button mat-flat-button color=\"accent\" *ngIf=\"primaryArray().length < 3\" (click)=\"addFeature('primary')\" trans>Add</button>\n </ng-container>\n <ng-container *ngSwitchCase=\"'secondaryFeatures'\">\n <div *ngFor=\"let group of secondaryArray().controls; index as index\" [formGroup]=\"group\"\n class=\"many-inputs feature-group\">\n <div class=\"feature-group-header\">\n <div class=\"text\">{{'Feature' | trans}} #{{index + 1}}</div>\n <button mat-icon-button color=\"warn\" (click)=\"removeFeature('secondary', index)\">\n <mat-icon svgIcon=\"close\"></mat-icon>\n </button>\n </div>\n <div class=\"input-container\">\n <label [for]=\"'secondary.' + index + '.title'\" trans>Title</label>\n <input type=\"text\" [id]=\"'secondary.' + index + '.title'\" formControlName=\"title\"\n [placeholder]=\"defaultValue('secondaryFeatures.' + index + '.title')\"\n highlightInPreview=\".big-feature:nth-child({{index + 1}}) h2\" required>\n </div>\n <div class=\"input-container\">\n <label [for]=\"'secondary.' + index + '.subtitle'\" trans>Subtitle</label>\n <input type=\"text\" [id]=\"'secondary.' + index + '.subtitle'\" formControlName=\"subtitle\"\n [placeholder]=\"defaultValue('secondaryFeatures.' + index + '.subtitle')\"\n highlightInPreview=\".big-feature:nth-child({{index + 1}}) small\" required>\n </div>\n <div class=\"input-container\">\n <label [for]=\"'secondary.' + index + '.description'\" trans>Description</label>\n <textarea type=\"text\" [id]=\"'secondary.' + index + '.description'\" formControlName=\"description\"\n rows=\"4\" [placeholder]=\"defaultValue('secondaryFeatures.' + index + '.description')\"\n highlightInPreview=\".big-feature:nth-child({{index + 1}}) p\"\n required></textarea>\n </div>\n <appearance-image-input [defaultValue]=\"defaultValue('secondaryFeatures.' + index + '.image')\"\n highlightInPreview=\".big-feature:nth-child({{index + 1}}) img\"\n diskPrefix=\"homepage\"\n formControlName=\"image\" trans>Image\n </appearance-image-input>\n </div>\n <button mat-flat-button color=\"accent\" (click)=\"addFeature('secondary')\" trans>Add</button>\n </ng-container>\n <div *ngSwitchCase=\"'actions'\" class=\"many-inputs\" [formGroup]=\"form.get('actions')\">\n <div class=\"input-container\">\n <label for=\"home.actions.cta1\" trans>Call to Action #1</label>\n <input type=\"text\" id=\"home.actions.cta1\" formControlName=\"cta1\"\n highlightInPreview=\".get-started-button\"\n [placeholder]=\"defaultValue('actions.cta1')\" required>\n </div>\n <div class=\"input-container\">\n <label for=\"home.actions.cta2\" trans>Call to Action #2</label>\n <input type=\"text\" id=\"home.actions.cta2\" formControlName=\"cta2\"\n highlightInPreview=\".learn-more-button\"\n [placeholder]=\"defaultValue('actions.cta2')\" required>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-template #mainPanel>\n <div [formGroup]=\"form\" class=\"many-inputs\">\n <div class=\"input-container\">\n <label for=\"home.header.title\" trans>Header Title</label>\n <input type=\"text\" id=\"home.header.title\" formControlName=\"headerTitle\"\n [placeholder]=\"defaultValue('headerTitle')\" highlightInPreview=\".header-title\" required>\n </div>\n <div class=\"input-container\">\n <label for=\"home.header.subtitle\" trans>Header Subtitle</label>\n <textarea type=\"text\" id=\"home.header.subtitle\" formControlName=\"headerSubtitle\" rows=\"4\"\n [placeholder]=\"defaultValue('headerSubtitle')\" highlightInPreview=\".header-description\"\n required></textarea>\n </div>\n\n <appearance-image-input [defaultValue]=\"defaultValue('headerImage')\"\n highlightInPreview=\".hero\"\n diskPrefix=\"homepage\"\n formControlName=\"headerImage\" trans>Header Image\n </appearance-image-input>\n\n <mat-slider min=\"0\" max=\"1\" step=\"0.1\" formControlName=\"headerImageOpacity\" class=\"opacity-slider\"></mat-slider>\n\n <color-picker-input formControlName=\"headerOverlayColor1\" trans>Header Overlay Color 1</color-picker-input>\n <color-picker-input formControlName=\"headerOverlayColor2\" trans>Header Overlay Color 2</color-picker-input>\n\n <div class=\"separator\"></div>\n\n <ul class=\"unstyled-list\">\n <li (click)=\"openSubpanel('actions')\" class=\"nav-item\">\n <span class=\"text\" trans>Action Buttons</span>\n <mat-icon class=\"actions\" svgIcon=\"keyboard-arrow-right\"></mat-icon>\n </li>\n <li (click)=\"openSubpanel('primaryFeatures')\" class=\"nav-item\">\n <span class=\"text\" trans>Primary Features</span>\n <mat-icon class=\"actions\" svgIcon=\"keyboard-arrow-right\"></mat-icon>\n </li>\n <li (click)=\"openSubpanel('secondaryFeatures')\" class=\"nav-item\">\n <span class=\"text\" trans>Secondary Features</span>\n <mat-icon class=\"actions\" svgIcon=\"keyboard-arrow-right\"></mat-icon>\n </li>\n </ul>\n\n <div class=\"separator\"></div>\n\n <div class=\"input-container\">\n <label for=\"home.footer.title\" trans>Footer Title</label>\n <input type=\"text\" id=\"home.footer.title\" formControlName=\"footerTitle\"\n [placeholder]=\"defaultValue('footerTitle')\" highlightInPreview=\".footer-title\" required>\n </div>\n <div class=\"input-container\">\n <label for=\"home.footer.subtitle\" trans>Footer Subtitle</label>\n <textarea type=\"text\" id=\"home.footer.subtitle\" formControlName=\"footerSubtitle\" rows=\"4\"\n [placeholder]=\"defaultValue('footerSubtitle')\" highlightInPreview=\".footer-description\"\n required></textarea>\n </div>\n <appearance-image-input [defaultValue]=\"defaultValue('footerImage')\"\n highlightInPreview=\".bottom-cta\"\n diskPrefix=\"homepage\"\n formControlName=\"footerImage\" trans>Footer Image\n </appearance-image-input>\n </div>\n </ng-template>\n</div>\n","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\nimport {FormArray, FormBuilder} from '@angular/forms';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\nimport {Settings} from '@common/core/config/settings.service';\nimport {map} from 'rxjs/operators';\nimport * as Dot from 'dot-object';\nimport {HomepageContent} from '../../../dashboard/landing/homepage-content';\n\nconst CONFIG_KEY = 'homepage.appearance';\n\n@Component({\n selector: 'homepage-appearance-panel',\n templateUrl: './homepage-appearance-panel.component.html',\n styleUrls: ['./homepage-appearance-panel.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class HomepageAppearancePanelComponent implements OnInit {\n public selectedSubpanel$ = new BehaviorSubject<string>(null);\n public defaultValues: HomepageContent;\n\n public path$ = this.selectedSubpanel$.pipe(map(panel => {\n const path = ['Homepage'];\n if (panel) path.push(panel);\n return path;\n }));\n\n public form = this.fb.group({\n headerTitle: [''],\n headerSubtitle: [''],\n headerImage: [''],\n headerImageOpacity: [1],\n headerOverlayColor1: [''],\n headerOverlayColor2: [''],\n footerTitle: [''],\n footerSubtitle: [''],\n footerImage: [''],\n actions: this.fb.group({\n inputText: [''],\n inputButton: [''],\n cta1: [''],\n cta2: [''],\n }),\n primaryFeatures: this.fb.array([]),\n secondaryFeatures: this.fb.array([]),\n channelIds: this.fb.control([]),\n });\n\n constructor(\n private fb: FormBuilder,\n private editor: AppearanceEditor,\n private settings: Settings,\n ) {}\n\n ngOnInit() {\n const data = this.settings.getJson(CONFIG_KEY, {}) as HomepageContent;\n this.defaultValues = this.editor.defaultSettings[CONFIG_KEY] ? JSON.parse(this.editor.defaultSettings[CONFIG_KEY]) : {};\n\n (data.primaryFeatures || []).forEach(() => {\n this.addFeature('primary');\n });\n (data.secondaryFeatures || []).forEach(() => {\n this.addFeature('secondary');\n });\n\n this.form.patchValue(data);\n\n this.form.valueChanges.subscribe(value => {\n this.editor.setConfig(CONFIG_KEY, value);\n this.editor.addChanges({[CONFIG_KEY]: value});\n });\n }\n\n public openPreviousPanel() {\n if (this.selectedSubpanel$.value) {\n this.openSubpanel(null);\n } else {\n this.editor.closeActivePanel();\n }\n }\n\n public openSubpanel(name: string) {\n this.selectedSubpanel$.next(name);\n }\n\n public addFeature(type: 'primary'|'secondary') {\n const features = this.form.get(`${type}Features`) as FormArray;\n const data: {[key: string]: string[]} = {title: [''], subtitle: [''], image: ['']};\n if (type === 'secondary') {\n data.description = [''];\n }\n features.push(this.fb.group(data));\n }\n\n public removeFeature(type: 'primary'|'secondary', index: number) {\n const features = this.form.get(`${type}Features`) as FormArray;\n features.removeAt(index);\n }\n\n public defaultValue(key: string): string {\n return Dot.pick(key, this.defaultValues) || '';\n }\n\n public primaryArray() {\n return this.form.get('primaryFeatures') as FormArray;\n }\n\n public secondaryArray() {\n return this.form.get('secondaryFeatures') as FormArray;\n }\n}\n","import {HomepageAppearancePanelComponent} from './homepage-appearance-panel/homepage-appearance-panel.component';\nimport {AppearanceEditorConfig} from '@common/admin/appearance/appearance-editor-config.token';\n\nexport const APP_APPEARANCE_CONFIG: AppearanceEditorConfig = {\n defaultRoute: 'dashboard',\n navigationRoutes: [\n 'dashboard',\n 'dashboard/projects/new',\n 'design',\n 'account/settings',\n 'admin',\n ],\n menus: {\n availableRoutes: [\n 'dashboard',\n 'dashboard/projects/new',\n ],\n positions: [\n 'dashboard',\n 'footer',\n ]\n },\n sections: [\n {\n name: 'landing page',\n component: HomepageAppearancePanelComponent,\n position: 1,\n route: '/',\n }\n ]\n};\n","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {FormBuilder} from '@angular/forms';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\n\n@Component({\n selector: 'general-appearance-panel',\n templateUrl: './general-appearance-panel.component.html',\n styleUrls: ['./general-appearance-panel.component.scss'],\n host: {'class': 'appearance-panel'},\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class GeneralAppearancePanelComponent implements OnInit {\n public form = this.fb.group({\n 'branding.logo_light': [''],\n 'branding.logo_dark': [''],\n 'branding.favicon': [''],\n 'env.app_name': [''],\n 'branding.site_description': [''],\n });\n\n constructor(\n private fb: FormBuilder,\n public editor: AppearanceEditor,\n ) {}\n\n ngOnInit() {\n const defaults = {};\n Object.keys(this.form.controls).forEach(key => {\n defaults[key] = this.editor.currentValue(key);\n });\n this.form.patchValue(defaults);\n\n this.form.valueChanges.subscribe(value => {\n this.editor.addChanges(value);\n });\n }\n\n public defaultValue(key: string) {\n return this.editor.defaultSettings[key];\n }\n}\n","<appearance-panel-meta [path]=\"['General']\" (back)=\"editor.closeActivePanel()\"></appearance-panel-meta>\n\n<div [formGroup]=\"form\" class=\"appearance-panel-content many-inputs\">\n <appearance-image-input [defaultValue]=\"defaultValue('branding.logo_light')\" formControlName=\"branding.logo_light\" diskPrefix=\"branding_media\" highlightInPreview=\".logo\">\n Logo #1 (For top navbar)\n </appearance-image-input>\n\n <appearance-image-input [defaultValue]=\"defaultValue('branding.logo_dark')\" formControlName=\"branding.logo_dark\" diskPrefix=\"branding_media\" highlightInPreview=\".logo\">\n Logo #2 (Everywhere else)\n </appearance-image-input>\n\n <appearance-image-input [defaultValue]=\"defaultValue('branding.favicon')\" backendUri=\"uploads/favicon\" diskPrefix=\"branding_media\" formControlName=\"branding.favicon\">\n Favicon\n </appearance-image-input>\n\n <div class=\"input-container\">\n <label for=\"env.app_name\" trans>Site Name</label>\n <input type=\"text\" id=\"env.app_name\" [placeholder]=\"defaultValue('env.app_name')\" formControlName=\"env.app_name\">\n </div>\n\n <div class=\"input-container\">\n <label for=\"branding.site_description\" trans>Site Description</label>\n <textarea id=\"branding.site_description\" [placeholder]=\"defaultValue('branding.site_description')\" rows=\"4\" formControlName=\"branding.site_description\"></textarea>\n </div>\n</div>\n","import {Injectable} from '@angular/core';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {BackendResponse} from '@common/core/types/backend-response';\nimport {CssTheme} from '@common/core/types/models/CssTheme';\nimport {PaginatedBackendResponse} from '@common/core/types/pagination/paginated-backend-response';\n\nconst BASE_URI = 'css-theme';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CssThemeService {\n constructor(private http: AppHttpClient) {}\n\n public all(): PaginatedBackendResponse<CssTheme> {\n return this.http.get(BASE_URI);\n }\n\n public create(params: Partial<CssTheme>): BackendResponse<{ theme: CssTheme }> {\n return this.http.post(BASE_URI, params);\n }\n\n public update(id, params: Partial<CssTheme>): BackendResponse<{ theme: CssTheme }> {\n return this.http.put(`${BASE_URI}/${id}`, params);\n }\n\n public delete(ids: number[]): BackendResponse<void> {\n return this.http.delete(`${BASE_URI}/${ids}`);\n }\n}\n","<div class=\"modal-header\">\n <h2 mat-dialog-title>\n <span *ngIf=\"data.theme\" trans>Update Theme</span>\n <span *ngIf=\"!data.theme\" trans>Create Theme</span>\n </h2>\n <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n <mat-icon svgIcon=\"close\"></mat-icon>\n </button>\n</div>\n\n<form (ngSubmit)=\"confirm()\" ngNativeValidate [formGroup]=\"form\" *ngIf=\"errors$ | async as errors\">\n <mat-dialog-content class=\"many-inputs\">\n <div class=\"input-container\">\n <label for=\"name\" trans>Name</label>\n <input type=\"text\" id=\"name\" formControlName=\"name\" required minlength=\"3\">\n <div class=\"error\" *ngIf=\"errors.name\">{{errors.name}}</div>\n </div>\n\n <div class=\"setting-toggle-container\">\n <mat-slide-toggle id=\"is_dark\" formControlName=\"is_dark\" trans>Dark Theme</mat-slide-toggle>\n <p trans>Whether this theme has light text on dark background.</p>\n </div>\n\n <div class=\"setting-toggle-container\">\n <mat-slide-toggle id=\"default_dark\" formControlName=\"default_dark\" trans>Default Dark Theme</mat-slide-toggle>\n <p trans>Whether this theme should be used as default dark theme.</p>\n </div>\n\n <div class=\"setting-toggle-container\">\n <mat-slide-toggle id=\"default_light\" formControlName=\"default_light\" trans>Default Light Theme</mat-slide-toggle>\n <p trans>Whether this theme should be used as default light theme.</p>\n </div>\n </mat-dialog-content>\n\n <mat-dialog-actions>\n <button (click)=\"close()\" type=\"button\" mat-button trans>Cancel</button>\n <button type=\"submit\" mat-raised-button color=\"accent\" [disabled]=\"loading$ | async\" trans>\n <span *ngIf=\"data.theme; else creating\">Update</span>\n <ng-template #creating>\n <span>Create</span>\n </ng-template>\n </button>\n </mat-dialog-actions>\n</form>\n\n\n","import {ChangeDetectionStrategy, Component, Inject} from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\nimport {FormBuilder} from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {CssTheme} from '@common/core/types/models/CssTheme';\nimport {CssThemeService} from '@common/admin/appearance/panels/themes-appearance-panel/css-theme.service';\nimport {filter} from 'rxjs/operators';\nimport {BackendErrorResponse} from '@common/core/types/backend-error-response';\n\ninterface CrupdateCssThemeModalData {\n theme: CssTheme;\n}\n\n@Component({\n selector: 'crupdate-css-theme-modal',\n templateUrl: './crupdate-css-theme-modal.component.html',\n styleUrls: ['./crupdate-css-theme-modal.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CrupdateCssThemeModalComponent {\n public loading$ = new BehaviorSubject(false);\n public errors$ = new BehaviorSubject<{[K in keyof Partial<CssTheme>]: string}>({});\n public form = this.fb.group({\n name: [''],\n is_dark: [false],\n default_dark: [false],\n default_light: [false],\n });\n\n constructor(\n private dialogRef: MatDialogRef<CrupdateCssThemeModalComponent>,\n @Inject(MAT_DIALOG_DATA) public data: CrupdateCssThemeModalData,\n private cssTheme: CssThemeService,\n private toast: Toast,\n private fb: FormBuilder,\n ) {\n if (data.theme) {\n this.form.patchValue(data.theme);\n }\n\n // make sure \"default_light\" and \"default_dark\"\n // can't be toggled on at the same time\n this.form.get('default_dark')\n .valueChanges\n .pipe(filter(value => !!value))\n .subscribe(() => {\n this.form.get('default_light').setValue(false);\n });\n this.form.get('default_light')\n .valueChanges\n .pipe(filter(value => !!value))\n .subscribe(() => {\n this.form.get('default_dark').setValue(false);\n });\n }\n\n public confirm() {\n const request = this.data.theme ?\n this.cssTheme.update(this.data.theme.id, this.form.value) :\n this.cssTheme.create(this.form.value);\n request.subscribe(response => {\n this.toast.open(this.data.theme ? 'Theme updated' : 'Theme created');\n this.close(response.theme);\n }, (errResponse: BackendErrorResponse) => this.errors$.next(errResponse.errors));\n }\n\n public close(theme?: CssTheme) {\n this.dialogRef.close(theme);\n }\n}\n","<ul class=\"unstyled-list\" [formGroup]=\"form\">\n <li *ngFor=\"let color of theme.colors | keyvalue\">\n <color-picker-input [formControlName]=\"color.key\" trans>{{viewName(color.key)}}</color-picker-input>\n </li>\n</ul>\n","import {ChangeDetectionStrategy, Component, Input, OnDestroy, OnInit} from '@angular/core';\nimport {CssTheme, CssThemeColors} from '@common/core/types/models/CssTheme';\nimport {FormControl, FormGroup} from '@angular/forms';\nimport {SetColors} from '@common/shared/appearance/commands/appearance-commands';\nimport {AppearanceEditor, EditorChanges} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\nimport {CssThemeService} from '@common/admin/appearance/panels/themes-appearance-panel/css-theme.service';\n\n@Component({\n selector: 'css-theme-colors-panel',\n templateUrl: './css-theme-colors-panel.component.html',\n styleUrls: ['./css-theme-colors-panel.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CssThemeColorsPanelComponent implements OnInit, OnDestroy {\n @Input() theme: CssTheme;\n public form = new FormGroup({});\n private colorCache: CssThemeColors = {};\n\n constructor(\n private editor: AppearanceEditor,\n private themes: CssThemeService,\n ) {}\n\n ngOnInit() {\n this.editor.setSaveRequest(this.saveColors.bind(this));\n\n // build form\n Object.entries(this.theme.colors).forEach(([name, color]) => {\n this.form.addControl(name, new FormControl(color));\n });\n\n this.editor.initiated$.subscribe(() => {\n this.setColors(this.theme.colors);\n this.form.valueChanges.subscribe((value: CssThemeColors) => {\n this.setColors(value);\n this.editor.addChanges({'colors': value});\n });\n });\n }\n\n ngOnDestroy() {\n this.editor.setSaveRequest(null);\n }\n\n private saveColors(payload: EditorChanges) {\n return this.themes.update(this.theme.id, payload);\n }\n\n private setColors(colors: CssThemeColors) {\n Object.entries(colors).forEach(([name, color]) => {\n // make sure we only set colors that actually changed\n // to keep performance as good as possible\n if (this.colorCache[name] !== color) {\n this.editor.postMessage(new SetColors(name, color));\n this.colorCache[name] = color;\n }\n });\n }\n\n public viewName(name: string) {\n return name.replace('be-', '').replace(/-/g, ' ');\n }\n}\n","<appearance-panel-meta [path]=\"path$ | async\" (back)=\"openPreviousPanel()\"></appearance-panel-meta>\n\n<div class=\"appearance-panel-content\">\n <css-theme-colors-panel\n [theme]=\"selectedTheme\"\n *ngIf=\"selectedTheme$ | async as selectedTheme else themesList\"\n ></css-theme-colors-panel>\n\n <ng-template #themesList>\n <button mat-raised-button color=\"accent\" type=\"button\" class=\"new-theme-button\" (click)=\"openCrupdateThemeModal()\" trans>New Theme</button>\n <ul class=\"unstyled-list\">\n <li class=\"nav-item\" *ngFor=\"let theme of loadedThemes$ | async\" (click)=\"setSelectedTheme(theme)\">\n <div class=\"name\">{{theme.name}}</div>\n <div class=\"actions\" (click)=\"$event.stopPropagation()\">\n <button mat-icon-button type=\"button\" (click)=\"setSelectedTheme(theme)\">\n <mat-icon svgIcon=\"drop-custom\"></mat-icon>\n </button>\n <button mat-icon-button type=\"button\" (click)=\"openCrupdateThemeModal(theme);\">\n <mat-icon svgIcon=\"edit\"></mat-icon>\n </button>\n <button mat-icon-button type=\"button\" (click)=\"maybeDeleteThemeModal(theme)\">\n <mat-icon svgIcon=\"delete\"></mat-icon>\n </button>\n </div>\n </li>\n </ul>\n </ng-template>\n</div>\n\n<loading-indicator [isVisible]=\"loading$ | async\" class=\"overlay overlay-partial\"></loading-indicator>\n","import {ChangeDetectionStrategy, Component, OnDestroy, OnInit} from '@angular/core';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {CrupdateCssThemeModalComponent} from '@common/admin/appearance/panels/themes-appearance-panel/crupdate-css-theme-modal/crupdate-css-theme-modal.component';\nimport {CssTheme} from '@common/core/types/models/CssTheme';\nimport {CssThemeService} from '@common/admin/appearance/panels/themes-appearance-panel/css-theme.service';\nimport {BehaviorSubject, Subscription} from 'rxjs';\nimport {finalize, map} from 'rxjs/operators';\nimport {ConfirmModalComponent} from '@common/core/ui/confirm-modal/confirm-modal.component';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {ActivatedRoute, Router} from '@angular/router';\n\n@Component({\n selector: 'themes-appearance-panel',\n templateUrl: './themes-appearance-panel.component.html',\n styleUrls: ['./themes-appearance-panel.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ThemesAppearancePanelComponent implements OnInit, OnDestroy {\n public loading$ = new BehaviorSubject<boolean>(false);\n public loadedThemes$ = new BehaviorSubject<CssTheme[]>([]);\n public selectedTheme$ = new BehaviorSubject<CssTheme>(null);\n private querySub: Subscription;\n\n public path$ = this.selectedTheme$.pipe(map(theme => {\n const path = ['Themes'];\n if (theme) path.push(theme.name);\n return path;\n }));\n\n constructor(\n public appearance: AppearanceEditor,\n private modal: Modal,\n private themes: CssThemeService,\n private toast: Toast,\n private router: Router,\n private route: ActivatedRoute,\n ) {}\n\n ngOnInit() {\n this.reloadThemes();\n }\n\n ngOnDestroy() {\n this.querySub && this.querySub.unsubscribe();\n }\n\n public openCrupdateThemeModal(theme?: CssTheme) {\n this.modal.open(CrupdateCssThemeModalComponent, {theme})\n .afterClosed()\n .subscribe(newTheme => {\n if (newTheme) {\n this.reloadThemes();\n }\n });\n }\n\n public setSelectedTheme(theme?: CssTheme) {\n this.router.navigate([], {queryParams: {theme: theme && theme.id}, queryParamsHandling: 'merge'});\n }\n\n public openPreviousPanel() {\n if (this.selectedTheme$.value) {\n this.setSelectedTheme();\n } else {\n this.appearance.closeActivePanel();\n }\n }\n\n public maybeDeleteThemeModal(theme: CssTheme) {\n this.modal.show(ConfirmModalComponent, {\n title: 'Delete Theme',\n body: 'Are you sure you want to delete this theme?',\n ok: 'Delete'\n }).afterClosed().subscribe(confirmed => {\n if ( ! confirmed) return;\n this.deleteTheme(theme);\n });\n }\n\n private reloadThemes() {\n this.loading$.next(true);\n this.themes.all()\n .pipe(finalize(() => this.loading$.next(false)))\n .subscribe(response => {\n this.loadedThemes$.next(response.pagination.data);\n this.bindToQueryParams();\n });\n }\n\n private deleteTheme(theme: CssTheme) {\n this.themes.delete([theme.id]).subscribe(() => {\n this.toast.open('Theme deleted');\n this.reloadThemes();\n });\n }\n\n private bindToQueryParams() {\n if (this.querySub) return;\n this.querySub = this.route.queryParams.subscribe((params: {theme?: string}) => {\n const theme = this.loadedThemes$.value.find(t => t.id === +params.theme);\n this.selectedTheme$.next(theme);\n });\n }\n}\n","export class MenuItem {\n id: number|string;\n label: string;\n action: string;\n\n // ID for model if action matches to specific model. If action\n // points to a specific custom page, model_id will be that page's ID.\n model_id: number;\n type: MenuItemType = 'link';\n icon: string;\n condition: MenuItemCondition = null;\n target: string = null;\n activeExact = false;\n\n constructor(params: Partial<MenuItem> = {}) {\n for (const name in params) {\n this[name] = params[name];\n }\n this.id = Math.floor(Math.random() * (1000 - 1));\n }\n}\n\nexport type MenuItemCondition = string|string[]|Function;\nexport type MenuItemType = 'link' | 'route' | 'scrollTo';\n","import {Injectable} from '@angular/core';\nimport {moveItemInArray} from '@angular/cdk/drag-drop';\nimport {Menu} from '@common/core/ui/custom-menu/menu';\nimport {Settings} from '@common/core/config/settings.service';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\nimport {MenuItem} from '@common/core/ui/custom-menu/menu-item';\nimport {BehaviorSubject} from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MenuEditor {\n public allMenus$ = new BehaviorSubject< Menu[]>([]);\n public activeMenu$ = new BehaviorSubject<Menu>(null);\n\n constructor(\n private settings: Settings,\n private appearance: AppearanceEditor,\n ) {}\n\n public create() {\n const allMenus = [...this.allMenus$.value];\n this.activeMenu$.next(new Menu({name: 'New Menu'}));\n allMenus.push(this.activeMenu$.value);\n this.allMenus$.next(allMenus);\n this.commitChanges();\n }\n\n public reorderActiveMenuItems(previousIndex: number, currentIndex: number) {\n const activeMenu = {...this.activeMenu$.value};\n moveItemInArray(activeMenu.items, previousIndex, currentIndex);\n this.activeMenu$.next(activeMenu);\n this.commitChanges();\n }\n\n public deleteActive() {\n const allMenus = [...this.allMenus$.value];\n const i = allMenus.indexOf(this.activeMenu$.value);\n allMenus.splice(i, 1);\n this.activeMenu$.next(null);\n this.allMenus$.next(allMenus);\n this.commitChanges();\n }\n\n public addItem(item: MenuItem) {\n const activeMenu = {...this.activeMenu$.value};\n item = this.transformLocalLinksToRoutes(item);\n activeMenu.items.push(item);\n this.activeMenu$.next(activeMenu);\n this.commitChanges();\n }\n\n public removeItem(item: MenuItem) {\n const activeMenu = {...this.activeMenu$.value};\n const i = this.activeMenu$.value.items.indexOf(item);\n activeMenu.items.splice(i, 1);\n this.activeMenu$.next(activeMenu);\n this.commitChanges();\n }\n\n private transformLocalLinksToRoutes(item: MenuItem): MenuItem {\n const baseUrl = this.settings.getBaseUrl();\n\n if (item.type !== 'link' || item.action.indexOf(baseUrl) === -1) return item;\n\n item.type = 'route';\n item.action = item.action.replace(this.settings.getBaseUrl(), '');\n return item;\n }\n\n public commitChanges() {\n const menus = JSON.stringify(this.allMenus$.value);\n this.appearance.setConfig('menus', menus);\n this.appearance.addChanges({menus});\n }\n\n public setFromJson(json: string) {\n if ( ! json) return;\n const menus = JSON.parse(json);\n\n if ( ! menus) return;\n\n const allMenus = menus.map(menuData => {\n const menu = new Menu(menuData);\n menu.items = menu.items.map(item => new MenuItem(item));\n return menu;\n });\n this.allMenus$.next(allMenus);\n }\n}\n","import {Injectable} from '@angular/core';\nimport {BackendResponse} from '@common/core/types/backend-response';\nimport {MenuItemCategory} from '@common/admin/appearance/panels/menus-appearance-panel/menus/item-categories/menu-item-category';\nimport {HttpCacheClient} from '@common/core/http/http-cache-client';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MenuItemCategoriesService {\n constructor(private http: HttpCacheClient) {}\n\n public get(): BackendResponse<{categories: MenuItemCategory[]}> {\n return this.http.getWithCache('admin/appearance/menu-categories');\n }\n}\n","<div class=\"header\">\n <span class=\"title\" trans>Select Destination</span>\n <mat-icon svgIcon=\"close\" (click)=\"close()\"></mat-icon>\n</div>\n<div class=\"new-item-tabs\">\n <mat-accordion>\n <form (ngSubmit)=\"addLinkMenuItem()\" [formGroup]=\"linkForm\" ngNativeValidate>\n <mat-expansion-panel class=\"mat-elevation-z\">\n <mat-expansion-panel-header><mat-panel-title trans>Link</mat-panel-title></mat-expansion-panel-header>\n <div class=\"many-inputs expansion-panel-content\">\n <div class=\"input-container\">\n <label for=\"external-link-url\" trans>URL</label>\n <input type=\"url\" id=\"external-link-url\" formControlName=\"action\" required>\n </div>\n <div class=\"input-container\">\n <label for=\"external-link-text\" trans>Link Text</label>\n <input type=\"text\" id=\"external-link-text\" formControlName=\"label\" required>\n </div>\n </div>\n <mat-action-row>\n <button mat-button color=\"accent\" type=\"submit\" trans>Select</button>\n </mat-action-row>\n </mat-expansion-panel>\n </form>\n <mat-expansion-panel class=\"mat-elevation-z\">\n <mat-expansion-panel-header><mat-panel-title trans>Route</mat-panel-title></mat-expansion-panel-header>\n <div class=\"items-list expansion-panel-content\">\n <div class=\"item\" *ngFor=\"let route of appearance.config.menus.availableRoutes\"\n (click)=\"addRouteMenuItem(route)\">{{route}}\n </div>\n </div>\n </mat-expansion-panel>\n <mat-expansion-panel class=\"mat-elevation-z\" *ngFor=\"let category of menuItemCategories\">\n <mat-expansion-panel-header><mat-panel-title trans>{{category.name}}</mat-panel-title></mat-expansion-panel-header>\n <div class=\"items-list expansion-panel-content\">\n <div class=\"item\" *ngFor=\"let item of category.items\" (click)=\"addCustomMenuItem(item)\">{{item.label}}</div>\n </div>\n </mat-expansion-panel>\n </mat-accordion>\n</div>\n","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {OverlayPanelRef} from '@common/core/ui/overlay-panel/overlay-panel-ref';\nimport {MenuEditor} from '@common/admin/appearance/panels/menus-appearance-panel/menus/menu-editor.service';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\nimport {FormBuilder} from '@angular/forms';\nimport {MenuItemCategory} from '@common/admin/appearance/panels/menus-appearance-panel/menus/item-categories/menu-item-category';\nimport {MenuItemCategoriesService} from '@common/admin/appearance/panels/menus-appearance-panel/menus/item-categories/menu-item-categories.service';\nimport {MenuItem} from '@common/core/ui/custom-menu/menu-item';\n\n@Component({\n selector: 'select-menu-item-action',\n templateUrl: './select-menu-item-action.component.html',\n styleUrls: ['./select-menu-item-action.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SelectMenuItemActionComponent implements OnInit {\n public linkForm = this.fb.group({\n action: [''],\n label: [''],\n });\n public menuItemCategories: MenuItemCategory[];\n\n constructor(\n public editor: MenuEditor,\n public appearance: AppearanceEditor,\n private overlayPanelRef: OverlayPanelRef,\n private fb: FormBuilder,\n private itemCategories: MenuItemCategoriesService\n ) {}\n\n ngOnInit() {\n this.itemCategories.get().subscribe(response => {\n this.menuItemCategories = response.categories;\n });\n }\n\n addLinkMenuItem() {\n this.close({\n type: 'link',\n label: this.linkForm.value.label,\n action: this.linkForm.value.action,\n });\n }\n\n addRouteMenuItem(route: string) {\n this.close({\n type: 'route',\n label: route,\n action: route,\n });\n }\n\n addCustomMenuItem(item: Partial<MenuItem>) {\n this.close(item);\n }\n\n close(destination?: Partial<MenuItem>) {\n this.overlayPanelRef.close(destination);\n }\n}\n","<button mat-icon-button (click)=\"selectIcon(icon)\" *ngFor=\"let icon of icons$ | async\">\n <mat-icon [svgIcon]=\"icon\"></mat-icon>\n</button>\n\n<loading-indicator [isVisible]=\"loading$ | async\" class=\"overlay overlay-partial\"></loading-indicator>","import {ChangeDetectionStrategy, Component, EventEmitter, OnInit, Output} from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\nimport {finalize} from 'rxjs/operators';\nimport {OverlayPanelRef} from '@common/core/ui/overlay-panel/overlay-panel-ref';\nimport {GenericBackendResponse} from '@common/core/types/backend-response';\nimport {HttpCacheClient} from '@common/core/http/http-cache-client';\n\n@Component({\n selector: 'icon-selector',\n templateUrl: './icon-selector.component.html',\n styleUrls: ['./icon-selector.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class IconSelectorComponent implements OnInit {\n public icons$: BehaviorSubject<string[]> = new BehaviorSubject([]);\n public loading$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n\n @Output() iconSelected = new EventEmitter<string>();\n\n constructor(\n private http: HttpCacheClient,\n private overlayPanelRef: OverlayPanelRef,\n ) {}\n\n ngOnInit() {\n this.loading$.next(true);\n this.http.get<GenericBackendResponse<{icons: string[]}>>('admin/icons')\n .pipe(finalize(() => this.loading$.next(false)))\n .subscribe(response => {\n this.icons$.next(response.icons);\n });\n }\n\n public selectIcon(icon: string) {\n // component is used inline\n if (this.iconSelected.observers.length) {\n this.iconSelected.next(icon);\n // component is used as overlay panel\n } else {\n this.overlayPanelRef.emitValue(icon);\n this.overlayPanelRef.close();\n }\n\n }\n}\n","<div class=\"title\" trans>Menu Items</div>\n\n<mat-accordion cdkDropList (cdkDropListDropped)=\"reorderMenuItems($event)\" *ngIf=\"menus.activeMenu$ | async as activeMenu; else noActiveMenu\">\n <mat-expansion-panel\n class=\"mat-elevation-z menu-item-container\"\n cdkDrag\n *ngFor=\"let menuItem of activeMenu.items\"\n (opened)=\"toggleMenuItem(menuItem)\"\n (closed)=\"toggleMenuItem(menuItem)\"\n [attr.data-id]=\"menuItem.id\"\n >\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"drag-handle\" cdkDragHandle svgIcon=\"drag-handle\"></mat-icon>\n <span class=\"name\">{{menuItem.label}}</span>\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <div class=\"many-inputs menu-item-list\">\n <div class=\"input-container\">\n <label for=\"{{menuItem.id + '-label'}}\" trans>Label</label>\n <input type=\"text\" [(ngModel)]=\"menuItem.label\" id=\"{{menuItem.id + '-label'}}\" (ngModelChange)=\"menus.commitChanges()\">\n </div>\n\n <div class=\"input-container\">\n <label for=\"{{menuItem.id + '-type'}}\" trans>Type</label>\n <select [(ngModel)]=\"menuItem.type\" id=\"{{menuItem.id + '-type'}}\" (ngModelChange)=\"menus.commitChanges()\">\n <option value=\"link\" trans>Link</option>\n <option value=\"route\" trans>Route</option>\n <option value=\"page\" trans>Page</option>\n </select>\n </div>\n\n <div class=\"input-container\">\n <label for=\"{{menuItem.id + '-action'}}\" trans>Action</label>\n <input type=\"text\" [(ngModel)]=\"menuItem.action\" id=\"{{menuItem.id + '-action'}}\" (ngModelChange)=\"menus.commitChanges()\">\n </div>\n\n <div class=\"input-container\">\n <label for=\"{{menuItem.id + '-condition'}}\" trans>Condition</label>\n <select [(ngModel)]=\"menuItem.condition\" id=\"{{menuItem.id + '-condition'}}\" (ngModelChange)=\"menus.commitChanges()\">\n <option [ngValue]=\"null\" trans>None</option>\n <option value=\"auth\" trans>Show to Logged in Users Only</option>\n <option value=\"guest\" trans>Show to Guest Users Only</option>\n <option value=\"admin\" trans>Show to Admin Only</option>\n </select>\n </div>\n\n <div class=\"input-container\">\n <label for=\"{{menuItem.id + '-target'}}\" trans>Open link in</label>\n <select [(ngModel)]=\"menuItem.target\" id=\"{{menuItem.id + '-target'}}\" (ngModelChange)=\"menus.commitChanges()\">\n <option value=\"_self\" trans>Same Window</option>\n <option value=\"_blank\" trans>New Window</option>\n </select>\n </div>\n\n <div class=\"input-container icon-input-container\" #iconInput (click)=\"openIconSelector(iconInput, menuItem)\">\n <label for=\"{{menuItem.id + '-icon'}}\" trans>Icon</label>\n <input type=\"text\" readonly [(ngModel)]=\"menuItem.icon\" id=\"{{menuItem.id + '-icon'}}\" placeholder=\"(Optional)\" trans-placeholder>\n <mat-icon [svgIcon]=\"menuItem.icon\"></mat-icon>\n </div>\n </div>\n\n <mat-action-row>\n <button mat-button color=\"warn\" class=\"delete-button\" (click)=\"confirmMenuItemDeletion()\" trans>Remove</button>\n </mat-action-row>\n </mat-expansion-panel>\n</mat-accordion>\n\n<ng-template #noActiveMenu>\n <div class=\"no-menu-items\" trans>This menu has no items yet.</div>\n</ng-template>\n","import {ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, OnDestroy} from '@angular/core';\nimport {Subscription} from 'rxjs';\nimport {CdkDragDrop} from '@angular/cdk/drag-drop';\nimport {MenuItem} from '@common/core/ui/custom-menu/menu-item';\nimport {MenuEditor} from '@common/admin/appearance/panels/menus-appearance-panel/menus/menu-editor.service';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {OverlayPanel} from '@common/core/ui/overlay-panel/overlay-panel.service';\nimport {ConfirmModalComponent} from '@common/core/ui/confirm-modal/confirm-modal.component';\nimport {IconSelectorComponent} from '@common/shared/icon-selector/icon-selector.component';\nimport {RIGHT_POSITION} from '@common/core/ui/overlay-panel/positions/right-position';\n\n@Component({\n selector: 'menu-items',\n templateUrl: './menu-items.component.html',\n styleUrls: ['./menu-items.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MenuItemsComponent implements OnDestroy {\n public selectedMenuItem: MenuItem;\n public subscriptions: Subscription[] = [];\n\n constructor(\n public menus: MenuEditor,\n private modal: Modal,\n private overlayPanel: OverlayPanel,\n private cd: ChangeDetectorRef,\n ) {}\n\n ngOnDestroy() {\n this.subscriptions.forEach(subscription => {\n subscription && subscription.unsubscribe();\n });\n }\n\n public reorderMenuItems(e: CdkDragDrop<void>) {\n this.menus.reorderActiveMenuItems(e.previousIndex, e.currentIndex);\n }\n\n /**\n * Toggle specified menu item settings panel visibility.\n */\n public toggleMenuItem(item: MenuItem) {\n if (this.selectedMenuItem === item) {\n this.selectedMenuItem = null;\n } else {\n this.selectedMenuItem = item;\n }\n }\n\n /**\n * Ask user to confirm menu item deletion.\n */\n public confirmMenuItemDeletion() {\n this.modal.show(ConfirmModalComponent, {\n title: 'Delete Menu Item',\n body: 'Are you sure you want to delete this menu item?',\n ok: 'Delete'\n }).afterClosed().subscribe(confirmed => {\n if ( ! confirmed) return;\n this.menus.removeItem(this.selectedMenuItem);\n this.selectedMenuItem = null;\n });\n }\n\n public openIconSelector(origin: HTMLElement, menuItem: MenuItem) {\n this.overlayPanel.open(IconSelectorComponent, {\n position: RIGHT_POSITION,\n origin: new ElementRef(origin),\n }).valueChanged().subscribe(icon => {\n menuItem.icon = icon;\n this.menus.commitChanges();\n this.cd.detectChanges();\n });\n }\n}\n","<appearance-panel-meta [path]=\"['Menus', menus.activeMenu$.value && menus.activeMenu$.value.name]\" (back)=\"openPreviousPanel()\"></appearance-panel-meta>\n\n<div class=\"appearance-panel-content\">\n <div class=\"menu-panel\" *ngIf=\"menus.activeMenu$ | async as activeMenu; else allMenuList\">\n <div class=\"many-inputs menu-settings\">\n <div class=\"input-container\">\n <label for=\"menu-name\" trans>Menu Name</label>\n <input type=\"text\" id=\"menu-name\" [(ngModel)]=\"activeMenu.name\" (ngModelChange)=\"menus.commitChanges()\">\n </div>\n\n <div class=\"input-container\">\n <label for=\"menu-position\" trans>Menu Position</label>\n <select id=\"menu-position\" [(ngModel)]=\"activeMenu.position\" (ngModelChange)=\"menus.commitChanges()\">\n <option [ngValue]=\"position\" *ngFor=\"let position of appearance.config.menus.positions\">{{getDisplayName(position)}}</option>\n </select>\n </div>\n </div>\n\n <menu-items></menu-items>\n\n <div class=\"action-buttons\">\n <button mat-button color=\"warn\" (click)=\"confirmMenuDeletion()\" trans>Delete Menu</button>\n <button class=\"button flat add-item-button\" mat-button color=\"accent\" (click)=\"openAddItemPanel()\" trans>Add Item</button>\n </div>\n </div>\n\n <ng-template #allMenuList>\n <div class=\"menus\">\n <div class=\"menu nav-item\" *ngFor=\"let menu of menus.allMenus$ | async\" (click)=\"setActiveMenu(menu)\">\n <span class=\"name\">{{menu.name}}</span>\n <mat-icon svgIcon=\"keyboard-arrow-right\" class=\"actions\"></mat-icon>\n </div>\n\n <div class=\"action-buttons\">\n <button mat-button color=\"accent\" class=\"button primary\" (click)=\"menus.create()\" trans>Add a Menu</button>\n </div>\n </div>\n </ng-template>\n</div>","import {ChangeDetectionStrategy, Component, ElementRef} from '@angular/core';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\nimport {MenuEditor} from '@common/admin/appearance/panels/menus-appearance-panel/menus/menu-editor.service';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {Settings} from '@common/core/config/settings.service';\nimport {OverlayPanel} from '@common/core/ui/overlay-panel/overlay-panel.service';\nimport {RIGHT_POSITION} from '@common/core/ui/overlay-panel/positions/right-position';\nimport {SelectMenuItemActionComponent} from '@common/admin/appearance/panels/menus-appearance-panel/menus/add-menu-item-panel/select-menu-item-action.component';\nimport {Menu} from '@common/core/ui/custom-menu/menu';\nimport {ConfirmModalComponent} from '@common/core/ui/confirm-modal/confirm-modal.component';\nimport {MenuItem} from '@common/core/ui/custom-menu/menu-item';\n\n@Component({\n selector: 'menus-appearance-panel',\n templateUrl: './menus-appearance-panel.component.html',\n styleUrls: ['./menus-appearance-panel.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MenusAppearancePanelComponent {\n constructor(\n public appearance: AppearanceEditor,\n public menus: MenuEditor,\n private modal: Modal,\n private settings: Settings,\n private panel: OverlayPanel,\n private el: ElementRef<HTMLElement>\n ) {\n this.menus.setFromJson(this.settings.get('menus'));\n }\n\n public openAddItemPanel() {\n const position = RIGHT_POSITION.slice();\n position[0].offsetX = 10;\n position[1].offsetX = 10;\n this.panel\n .open(SelectMenuItemActionComponent, {\n position,\n origin: this.el,\n panelClass: 'add-menu-item-panel-container',\n })\n .afterClosed()\n .subscribe((val: Partial<MenuItem>) => {\n if (val) {\n this.menus.addItem(new MenuItem(val));\n }\n });\n }\n\n public openPreviousPanel() {\n if (this.menus.activeMenu$.value) {\n this.menus.activeMenu$.next(null);\n } else {\n this.appearance.closeActivePanel();\n }\n }\n\n public setActiveMenu(menu: Menu) {\n this.menus.activeMenu$.next(menu);\n }\n\n public confirmMenuDeletion() {\n this.modal\n .show(ConfirmModalComponent, {\n title: 'Delete Menu',\n body: 'Are you sure you want to delete this menu?',\n ok: 'Delete',\n })\n .afterClosed()\n .subscribe(confirmed => {\n if (!confirmed) return;\n this.menus.deleteActive();\n });\n }\n\n public getDisplayName(name: string) {\n return name.replace(/-/g, ' ');\n }\n}\n","<appearance-panel-meta [path]=\"['Seo Settings']\" (back)=\"editor.closeActivePanel()\"></appearance-panel-meta>\n\n<div [formGroup]=\"form\" class=\"appearance-panel-content many-inputs\">\n <ng-container *ngFor=\"let field of seoFields\">\n <div class=\"input-container\">\n <label [for]=\"field.key\" trans>{{field.name}}</label>\n <textarea type=\"text\" [id]=\"field.key\" [formControlName]=\"field.key\" [placeholder]=\"field.defaultValue\" rows=\"2\"></textarea>\n </div>\n </ng-container>\n</div>","import {Component, OnInit, ChangeDetectionStrategy} from '@angular/core';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\nimport {FormBuilder} from '@angular/forms';\n\ninterface SeoField {\n name: string;\n key: string;\n defaultValue: string;\n value: string;\n}\n\n@Component({\n selector: 'seo-appearance-panel',\n templateUrl: './seo-appearance-panel.component.html',\n styleUrls: ['./seo-appearance-panel.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SeoAppearancePanelComponent implements OnInit {\n public seoFields: SeoField[];\n public form = this.fb.group({});\n\n constructor(\n public editor: AppearanceEditor,\n private fb: FormBuilder,\n ) {}\n\n ngOnInit() {\n this.seoFields = this.editor.defaultSettings['seo_fields'];\n\n this.seoFields.forEach(field => {\n this.form.addControl(field.key, this.fb.control(field.value));\n });\n\n this.form.valueChanges.subscribe(value => {\n this.editor.addChanges(value);\n });\n }\n}\n","<div class=\"modal-header\">\n <h2 class=\"modal-title\" mat-dialog-title trans>Code Editor</h2>\n <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n <mat-icon svgIcon=\"close\"></mat-icon>\n </button>\n</div>\n\n<mat-dialog-content>\n <div class=\"editor-container\">\n <p class=\"info\" *ngIf=\"data.language === 'html'\" trans>If entering javascript, wrap it with <script></script> tag.</p>\n <div class=\"editor\" #editor></div>\n </div>\n</mat-dialog-content>\n\n<mat-dialog-actions>\n <button (click)=\"close()\" type=\"button\" mat-button trans>Cancel</button>\n <button type=\"submit\" mat-raised-button color=\"accent\" (click)=\"confirm()\" [disabled]=\"syntaxInvalid$ | async\" trans>Update</button>\n</mat-dialog-actions>\n\n<loading-indicator [isVisible]=\"loading$ | async\" class=\"overlay\"></loading-indicator>","import {ChangeDetectionStrategy, Component, ElementRef, Inject, OnInit, ViewChild} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {filter} from 'rxjs/operators';\nimport {ESCAPE} from '@angular/cdk/keycodes';\nimport {LazyLoaderService} from '@common/core/utils/lazy-loader.service';\nimport {BehaviorSubject} from 'rxjs';\n\ndeclare let ace;\n\nexport interface CodeEditorModalData {\n contents?: string;\n language: string;\n}\n\n@Component({\n selector: 'code-editor-modal',\n templateUrl: './code-editor-modal.component.html',\n styleUrls: ['./code-editor-modal.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CodeEditorModalComponent implements OnInit {\n @ViewChild('editor', { static: true }) editorEl: ElementRef;\n\n public loading$ = new BehaviorSubject<boolean>(false);\n public syntaxInvalid$ = new BehaviorSubject<boolean>(false);\n private editor;\n\n constructor(\n private dialogRef: MatDialogRef<CodeEditorModalComponent>,\n @Inject(MAT_DIALOG_DATA) public data: CodeEditorModalData,\n private lazyLoader: LazyLoaderService,\n ) {}\n\n ngOnInit() {\n this.initEditor(this.data.contents, this.data.language);\n this.overrideDialogCloseEvents();\n }\n\n public confirm() {\n this.close(this.editor.getValue());\n }\n\n public close(value?: string) {\n this.dialogRef.close(value);\n }\n\n private initEditor(contents: string, language = 'html') {\n this.loading$.next(true);\n this.lazyLoader.loadAsset('js/ace/ace.js', {type: 'js'}).then(() => {\n this.editor = ace.edit(this.editorEl.nativeElement);\n this.editor.getSession().setMode('ace/mode/' + language);\n this.editor.setTheme('ace/theme/chrome');\n this.editor.$blockScrolling = Infinity;\n if (contents) this.editor.setValue(contents, 1);\n\n this.editor.getSession().on('changeAnnotation', () => {\n const annotations = this.editor.getSession().getAnnotations() as any[];\n\n // hide !doctype syntax error\n if (annotations[0] && /doctype first/.test(annotations[0].text)) {\n annotations.splice(0, 1);\n this.editor.getSession().setAnnotations(annotations);\n return;\n }\n\n // prevent editor submit if there are syntax errors\n const syntaxInvalid = this.editor\n .getSession()\n .getAnnotations()\n .filter(a => a.type === 'error')\n .length > 0;\n this.syntaxInvalid$.next(syntaxInvalid);\n });\n this.loading$.next(false);\n });\n }\n\n /**\n * Need to always send dialog data, regardless of how it was closed.\n * Angular material does not provide easy way to do this, so\n * we need to override backdrop click and escape key close events.\n */\n private overrideDialogCloseEvents() {\n this.dialogRef.disableClose = true;\n\n // close on backdrop click\n this.dialogRef.backdropClick().subscribe(() => {\n this.close();\n });\n\n // close on escape key\n this.dialogRef.keydownEvents()\n .pipe(filter(event => event.keyCode === ESCAPE))\n .subscribe(() => this.close());\n }\n}\n","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\nimport {FormBuilder} from '@angular/forms';\nimport {CodeEditorModalComponent} from '@common/admin/appearance/panels/custom-code-appearance-panel/code-editor-modal/code-editor-modal.component';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {SetCustomCss, SetCustomHtml} from '@common/shared/appearance/commands/appearance-commands';\n\n@Component({\n selector: 'custom-code-appearance-panel',\n templateUrl: './custom-code-appearance-panel.component.html',\n styleUrls: ['./custom-code-appearance-panel.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CustomCodeAppearancePanelComponent implements OnInit {\n public form = this.fb.group({\n 'custom-code.css': [''],\n 'custom-code.html': [''],\n });\n\n constructor(\n public editor: AppearanceEditor,\n private fb: FormBuilder,\n private modal: Modal,\n private toast: Toast,\n ) {}\n\n ngOnInit() {\n const defaults = {};\n Object.keys(this.form.controls).forEach(key => {\n defaults[key] = this.editor.currentValue(key);\n });\n this.form.patchValue(defaults);\n }\n\n public openModal(type: 'css'|'html') {\n const key = 'custom-code.' + type;\n const initialValue = this.form.value[key] || '',\n params = {contents: this.form.value[key], language: type};\n this.modal.open(CodeEditorModalComponent, params)\n .afterClosed()\n .subscribe(value => {\n // undefined means user closed modal without clicking \"update\" button\n if (value === undefined || initialValue === value) return;\n const newValue = {[key]: value};\n this.form.patchValue(newValue);\n this.editor.saveChanges(newValue).subscribe(() => {\n this.addCodeToPreview(type, value);\n this.toast.open('Custom code saved');\n });\n });\n }\n\n private addCodeToPreview(type: 'css'|'html', content: string) {\n if (type === 'css') {\n this.editor.postMessage(new SetCustomCss(content));\n } else {\n this.editor.postMessage(new SetCustomHtml(content));\n }\n }\n}\n","<appearance-panel-meta [path]=\"['Custom Code']\" (back)=\"editor.closeActivePanel()\"></appearance-panel-meta>\n\n<div class=\"appearance-panel-content\">\n <button type=\"button\" class=\"nav-item\" (click)=\"openModal('css')\">\n <span class=\"text\" trans>Custom CSS</span>\n <span class=\"actions\" trans>Modify</span>\n </button>\n <button class=\"nav-item\" (click)=\"openModal('html')\">\n <span class=\"text\" trans>Custom HTML & Javascript</span>\n <span class=\"actions\" trans>Modify</span>\n </button>\n</div>","<sidenav class=\"no-navbar\">\n <nav class=\"sidebar\">\n <div class=\"header\">\n <div class=\"back-button\" (click)=\"closeEditor()\">\n <mat-icon svgIcon=\"close\"></mat-icon>\n </div>\n <div class=\"title\" trans>Appearance Editor</div>\n <button\n mat-raised-button\n color=\"accent\"\n class=\"button primary save-button\"\n (click)=\"editor.saveChanges()\"\n [disabled]=\"!(editor.changes$ | async) || (editor.loading$ | async)\"\n >\n <span *ngIf=\"editor.changes$ | async; else saved\" trans>Save</span>\n <ng-template #saved>\n <span trans>Saved</span>\n </ng-template>\n </button>\n </div>\n\n <ng-container *ngIf=\"editor.activePanel$ | async as activePanel; else navigation\">\n <ng-container [ngSwitch]=\"activePanel.name\">\n <general-appearance-panel *ngSwitchCase=\"'general'\"></general-appearance-panel>\n <themes-appearance-panel *ngSwitchCase=\"'themes'\"></themes-appearance-panel>\n <menus-appearance-panel *ngSwitchCase=\"'menus'\"></menus-appearance-panel>\n <seo-appearance-panel *ngSwitchCase=\"'seo-settings'\"></seo-appearance-panel>\n <custom-code-appearance-panel *ngSwitchCase=\"'custom-code'\"></custom-code-appearance-panel>\n <ng-container *ngSwitchDefault>\n <ng-template\n *ngIf=\"panelPortal$ | async as portal\"\n [cdkPortalOutlet]=\"portal\"\n ></ng-template>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template #navigation>\n <div class=\"root-navigation\">\n <a\n class=\"nav-item\"\n [routerLink]=\"[]\"\n [queryParams]=\"{panel: slugify(section.name)}\"\n *ngFor=\"let section of editor.config.sections\"\n >\n <span class=\"text\" trans>{{ viewName(section.name) }}</span>\n <mat-icon class=\"actions\" svgIcon=\"keyboard-arrow-right\"></mat-icon>\n </a>\n </div>\n </ng-template>\n </nav>\n <main>\n <div class=\"live-preview\">\n <iframe src=\"about:blank\" #iframe></iframe>\n </div>\n </main>\n</sidenav>\n\n<button mat-fab (click)=\"sidenav.toggleSidebarMode()\" class=\"sidebar-toggle-button\">\n <mat-icon svgIcon=\"edit\"></mat-icon>\n</button>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Inject,\n OnDestroy,\n OnInit,\n Optional,\n ViewChild,\n} from '@angular/core';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {AppearanceEditor} from './appearance-editor/appearance-editor.service';\nimport {slugifyString} from '@common/core/utils/slugify-string';\nimport {Subscription} from 'rxjs';\nimport {ComponentPortal} from '@angular/cdk/portal';\nimport {map} from 'rxjs/operators';\nimport {BreakpointsService} from '@common/core/ui/breakpoints.service';\nimport {\n APPEARANCE_EDITOR_CONFIG,\n AppearanceEditorConfig,\n} from './appearance-editor-config.token';\nimport {SidenavComponent} from '@common/shared/sidenav/sidenav.component';\n\n@Component({\n selector: 'appearance',\n templateUrl: './appearance.component.html',\n styleUrls: ['./appearance.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppearanceComponent implements OnInit, OnDestroy {\n @ViewChild('iframe', {static: true}) iframe: ElementRef;\n @ViewChild(SidenavComponent, {static: true}) sidenav: SidenavComponent;\n private routerSub: Subscription;\n\n public panelPortal$ = this.editor.activePanel$.pipe(\n map(panel => {\n return panel && panel.component\n ? new ComponentPortal(panel.component)\n : null;\n })\n );\n\n constructor(\n public editor: AppearanceEditor,\n private router: Router,\n private route: ActivatedRoute,\n public breakpoints: BreakpointsService,\n @Inject(APPEARANCE_EDITOR_CONFIG)\n @Optional()\n public config: AppearanceEditorConfig[]\n ) {}\n\n ngOnInit() {\n this.editor.init(\n this.iframe.nativeElement,\n this.route.snapshot.data.defaultSettings,\n this.config\n );\n this.routerSub = this.route.queryParams.subscribe(\n (params: {panel?: string}) => {\n this.editor.openPanel(params.panel);\n }\n );\n }\n\n ngOnDestroy() {\n this.routerSub && this.routerSub.unsubscribe();\n }\n\n public closeEditor() {\n this.router.navigate(['admin']);\n }\n\n public slugify(str: string) {\n return slugifyString(str);\n }\n\n public viewName(name: string) {\n return name.replace('-', ' ');\n }\n}\n","import {Injectable} from '@angular/core';\nimport {CanDeactivate} from '@angular/router';\nimport {AppearanceComponent} from './appearance.component';\nimport {ConfirmModalComponent} from '@common/core/ui/confirm-modal/confirm-modal.component';\nimport {AppearanceEditor} from '@common/admin/appearance/appearance-editor/appearance-editor.service';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {Observable} from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CanDeactivateAppearance implements CanDeactivate<AppearanceComponent> {\n constructor(\n private editor: AppearanceEditor,\n private modal: Modal,\n ) {}\n\n canDeactivate(): Observable<boolean>|boolean {\n if ( ! this.editor.changes$.value) return true;\n\n return this.modal.show(ConfirmModalComponent, {\n title: 'Close Appearance Editor',\n body: 'Are you sure you want to close appearance editor?',\n bodyBold: 'All unsaved changes will be lost.',\n ok: 'Close',\n cancel: 'Stay',\n }).afterClosed();\n }\n}\n","import {RouterModule, Routes} from '@angular/router';\nimport {NgModule} from '@angular/core';\nimport {AppearanceComponent} from './appearance.component';\nimport {CanDeactivateAppearance} from './can-deactivate-appearance.guard';\nimport {AuthGuard} from '../../guards/auth-guard.service';\nimport {AppearanceEditorResolver} from './appearance-editor/appearance-editor-resolver.service';\n\nconst routes: Routes = [\n {\n path: '',\n component: AppearanceComponent,\n data: {permissions: ['appearance.update']},\n resolve: {defaultSettings: AppearanceEditorResolver},\n canActivate: [AuthGuard],\n canDeactivate: [CanDeactivateAppearance],\n children: [\n {path: ''},\n {path: ':panel'},\n {path: ':panel/:activeItem'},\n ]\n },\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class AppearanceRoutingModule {}\n","import {Injectable} from '@angular/core';\nimport {ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot} from '@angular/router';\nimport {catchError, mergeMap} from 'rxjs/operators';\nimport {EMPTY, Observable, of} from 'rxjs';\nimport {GenericBackendResponse} from '@common/core/types/backend-response';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AppearanceEditorResolver implements Resolve<GenericBackendResponse<{[key: string]: any}>> {\n constructor(\n private router: Router,\n private http: AppHttpClient\n ) {}\n\n resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<GenericBackendResponse<{[key: string]: any}>> {\n return this.http.get<GenericBackendResponse<{[key: string]: any}>>('admin/appearance/values').pipe(\n catchError(() => {\n this.router.navigate(['/admin']);\n return EMPTY;\n }),\n mergeMap(response => {\n if (response) {\n return of(response);\n } else {\n this.router.navigate(['/admin']);\n return EMPTY;\n }\n })\n );\n }\n}\n\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {IconSelectorComponent} from '@common/shared/icon-selector/icon-selector.component';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatIconModule} from '@angular/material/icon';\nimport {LoadingIndicatorModule} from '@common/core/ui/loading-indicator/loading-indicator.module';\n\n\n@NgModule({\n declarations: [\n IconSelectorComponent,\n ],\n imports: [\n CommonModule,\n LoadingIndicatorModule,\n\n MatButtonModule,\n MatIconModule,\n ],\n exports: [\n IconSelectorComponent,\n ]\n})\nexport class IconSelectorModule {\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport {AppearanceComponent} from './appearance.component';\nimport {MenusAppearancePanelComponent} from './panels/menus-appearance-panel/menus-appearance-panel.component';\nimport {SelectMenuItemActionComponent} from './panels/menus-appearance-panel/menus/add-menu-item-panel/select-menu-item-action.component';\nimport {AppearancePanelMetaComponent} from './appearance-panel-meta/appearance-panel-meta.component';\nimport {MenuItemsComponent} from './panels/menus-appearance-panel/menus/menu-items/menu-items.component';\nimport {AppearanceRoutingModule} from './appearance-routing.module';\nimport {CodeEditorModalComponent} from './panels/custom-code-appearance-panel/code-editor-modal/code-editor-modal.component';\nimport {ThemesAppearancePanelComponent} from './panels/themes-appearance-panel/themes-appearance-panel.component';\nimport {CrupdateCssThemeModalComponent} from './panels/themes-appearance-panel/crupdate-css-theme-modal/crupdate-css-theme-modal.component';\nimport {CssThemeColorsPanelComponent} from '@common/admin/appearance/panels/themes-appearance-panel/css-theme-colors-panel/css-theme-colors-panel.component';\nimport {GeneralAppearancePanelComponent} from '@common/admin/appearance/panels/general-appearance-panel/general-appearance-panel.component';\nimport {HighlightInPreviewDirective} from './highlight-in-preview.directive';\nimport {SeoAppearancePanelComponent} from '@common/admin/appearance/panels/seo-appearance-panel/seo-appearance-panel.component';\nimport {CustomCodeAppearancePanelComponent} from '@common/admin/appearance/panels/custom-code-appearance-panel/custom-code-appearance-panel.component';\nimport {AppearanceImageInputComponent} from '@common/admin/appearance/appearance-image-input/appearance-image-input.component';\nimport {IconSelectorModule} from '@common/shared/icon-selector/icon-selector.module';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {ImageOrIconModule} from '@common/core/ui/image-or-icon/image-or-icon.module';\nimport {LoadingIndicatorModule} from '@common/core/ui/loading-indicator/loading-indicator.module';\nimport {MatMenuModule} from '@angular/material/menu';\nimport {MatProgressBarModule} from '@angular/material/progress-bar';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatDialogModule} from '@angular/material/dialog';\nimport {MatExpansionModule} from '@angular/material/expansion';\nimport {DragDropModule} from '@angular/cdk/drag-drop';\nimport {MatButtonModule} from '@angular/material/button';\nimport {ColorPickerInputModule} from '@common/core/ui/color-picker/color-picker-input/color-picker-input.module';\nimport {PortalModule} from '@angular/cdk/portal';\nimport {MatSlideToggleModule} from '@angular/material/slide-toggle';\nimport {\n APPEARANCE_EDITOR_CONFIG,\n DEFAULT_APPEARANCE_EDITOR_CONFIG,\n} from './appearance-editor-config.token';\nimport {SidenavModule} from '@common/shared/sidenav/sidenav.module';\n\n@NgModule({\n imports: [\n AppearanceRoutingModule,\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n IconSelectorModule,\n TranslationsModule,\n ImageOrIconModule,\n LoadingIndicatorModule,\n ColorPickerInputModule,\n SidenavModule,\n\n // material\n MatMenuModule,\n MatProgressBarModule,\n MatIconModule,\n MatButtonModule,\n MatDialogModule,\n MatExpansionModule,\n DragDropModule,\n PortalModule,\n MatSlideToggleModule,\n ],\n exports: [\n AppearancePanelMetaComponent,\n HighlightInPreviewDirective,\n AppearanceImageInputComponent,\n ],\n declarations: [\n AppearanceComponent,\n SelectMenuItemActionComponent,\n AppearancePanelMetaComponent,\n MenuItemsComponent,\n CodeEditorModalComponent,\n CrupdateCssThemeModalComponent,\n CssThemeColorsPanelComponent,\n AppearanceImageInputComponent,\n MenusAppearancePanelComponent,\n ThemesAppearancePanelComponent,\n GeneralAppearancePanelComponent,\n SeoAppearancePanelComponent,\n CustomCodeAppearancePanelComponent,\n HighlightInPreviewDirective,\n ],\n providers: [\n {\n provide: APPEARANCE_EDITOR_CONFIG,\n useValue: DEFAULT_APPEARANCE_EDITOR_CONFIG,\n multi: true,\n },\n ],\n})\nexport class BaseAppearanceModule {}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatButtonModule} from '@angular/material/button';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatSliderModule} from '@angular/material/slider';\nimport {HomepageAppearancePanelComponent} from './homepage-appearance-panel/homepage-appearance-panel.component';\nimport {APPEARANCE_EDITOR_CONFIG} from '../../../common/admin/appearance/appearance-editor-config.token';\nimport {APP_APPEARANCE_CONFIG} from './app-appearance-config';\nimport {ColorPickerInputModule} from '../../../common/core/ui/color-picker/color-picker-input/color-picker-input.module';\nimport {TranslationsModule} from '../../../common/core/translations/translations.module';\nimport {BaseAppearanceModule} from '../../../common/admin/appearance/base-appearance.module';\n\n\n@NgModule({\n declarations: [\n HomepageAppearancePanelComponent,\n ],\n imports: [\n CommonModule,\n BaseAppearanceModule,\n ReactiveFormsModule,\n ColorPickerInputModule,\n TranslationsModule,\n\n // material\n MatIconModule,\n MatButtonModule,\n TranslationsModule,\n MatSliderModule,\n ],\n providers: [\n {\n provide: APPEARANCE_EDITOR_CONFIG,\n useValue: APP_APPEARANCE_CONFIG,\n multi: true,\n }\n ]\n})\nexport class AppAppearanceModule {\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {ColorPickerInputComponent} from '@common/core/ui/color-picker/color-picker-input/color-picker-input.component';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {MatIconModule} from '@angular/material/icon';\nimport { MatRippleModule } from '@angular/material/core';\n\n\n@NgModule({\n declarations: [ColorPickerInputComponent],\n imports: [CommonModule, TranslationsModule, MatIconModule, MatRippleModule],\n exports: [ColorPickerInputComponent],\n})\nexport class ColorPickerInputModule {}\n","import { ConnectedPosition } from '@angular/cdk/overlay';\n\nexport const RIGHT_POSITION: ConnectedPosition[] = [\n {originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: 5},\n {originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: 5},\n];\n"],"sourceRoot":"webpack:///"}