UNPKG

xng-breadcrumb

Version:

A declarative and reactive breadcrumb approach for Angular 6 and beyond https://www.npmjs.com/package/xng-breadcrumb

1 lines 37.9 kB
{"version":3,"file":"xng-breadcrumb.mjs","sources":["../../../../libs/xng-breadcrumb/src/lib/breadcrumb-item.directive.ts","../../../../libs/xng-breadcrumb/src/lib/breadcrumb.service.ts","../../../../libs/xng-breadcrumb/src/lib/breadcrumb.component.ts","../../../../libs/xng-breadcrumb/src/lib/breadcrumb.component.html","../../../../libs/xng-breadcrumb/src/lib/breadcrumb.module.ts","../../../../libs/xng-breadcrumb/src/index.ts","../../../../libs/xng-breadcrumb/src/xng-breadcrumb.ts"],"sourcesContent":["import { Directive } from '@angular/core';\n\n/**\n * This directive is used to customize the breadcrumb label behavior\n * *xngBreadcrumbItem directive can be used in the child element of xng-breadcrumb\n * Usage: refer to the demo - app.component.html\n */\n@Directive({\n selector: '[xngBreadcrumbItem]',\n})\nexport class BreadcrumbItemDirective {}\n","import { Injectable } from '@angular/core';\nimport {\n ActivatedRoute,\n ActivatedRouteSnapshot,\n GuardsCheckEnd,\n Router,\n} from '@angular/router';\nimport { BehaviorSubject } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { Breadcrumb } from './types/breadcrumb';\nimport {\n BreadcrumbFunction,\n BreadcrumbObject,\n} from './types/breadcrumb.config';\n\ntype BreadcrumbConfig = BreadcrumbObject | BreadcrumbFunction | string;\ntype StoreMatcherKey = 'routeLink' | 'routeRegex' | 'alias';\nexport type BreadcrumbDefinition = Breadcrumb & BreadcrumbObject;\nconst PATH_PARAM = {\n PREFIX: ':',\n REGEX_IDENTIFIER: '/:[^/]+',\n REGEX_REPLACER: '/[^/]+',\n};\nconst ALIAS_PREFIX = '@';\nconst isNonEmpty = (obj: unknown): boolean => {\n return obj && Object.keys(obj).length > 0;\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BreadcrumbService {\n private baseHref = '/';\n\n /**\n * dynamicBreadcrumbStore holds information about dynamically updated breadcrumbs.\n * Breadcrumbs can be set from anywhere (component, service) in the app.\n * On every breadcrumb update check this store and use the info if available.\n */\n private dynamicBreadcrumbStore: BreadcrumbDefinition[] = [];\n\n /**\n * breadcrumbList for the current route\n * When breadcrumb info is changed dynamically, check if the currentBreadcrumbs is effected\n * If effected, update the change and emit a new stream\n */\n private currentBreadcrumbs: BreadcrumbDefinition[] = [];\n private previousBreadcrumbs: BreadcrumbDefinition[] = [];\n\n /**\n * Breadcrumbs observable to be subscribed by BreadcrumbComponent\n * Emits on every route change OR dynamic update of breadcrumb\n */\n private breadcrumbs = new BehaviorSubject<BreadcrumbDefinition[]>([]);\n public breadcrumbs$ = this.breadcrumbs.asObservable();\n\n constructor(private activatedRoute: ActivatedRoute, private router: Router) {\n this.detectRouteChanges();\n }\n\n /**\n * Whenever route changes build breadcrumb list again\n */\n private detectRouteChanges() {\n // Special case where breadcrumb service & component instantiates after a route is navigated.\n // Ex: put breadcrumbs within *ngIf and this.router.events would be empty\n // This check is also required where { initialNavigation: 'enabledBlocking' } is applied to routes\n this.setupBreadcrumbs(this.activatedRoute.snapshot);\n\n this.router.events\n .pipe(\n filter(\n (event): event is GuardsCheckEnd => event instanceof GuardsCheckEnd\n )\n )\n .subscribe((event) => {\n // activatedRoute doesn't carry data when shouldReuseRoute returns false\n // use the event data with GuardsCheckEnd as workaround\n // Check for shouldActivate in case where the authGuard returns false the breadcrumbs shouldn't be changed\n if (event.shouldActivate) {\n this.setupBreadcrumbs(event.state.root);\n }\n });\n }\n\n private setupBreadcrumbs(activatedRouteSnapshot: ActivatedRouteSnapshot) {\n this.previousBreadcrumbs = this.currentBreadcrumbs;\n // breadcrumb label for base OR root path. Usually, this can be set as 'Home'\n const rootBreadcrumb = this.getRootBreadcrumb();\n this.currentBreadcrumbs = rootBreadcrumb ? [rootBreadcrumb] : [];\n this.prepareBreadcrumbList(activatedRouteSnapshot, this.baseHref);\n }\n\n private getRootBreadcrumb(): Breadcrumb | void {\n const rootConfig = this.router.config.find((config) => config.path === '');\n const rootBreadcrumb = this.extractObject(rootConfig?.data?.breadcrumb);\n const storeItem = this.getFromStore(rootBreadcrumb.alias, '/');\n\n if (isNonEmpty(rootBreadcrumb) || isNonEmpty(storeItem)) {\n return {\n ...storeItem,\n ...rootBreadcrumb,\n routeLink: this.baseHref,\n ...this.getQueryParamsFromPreviousList('/'),\n };\n }\n }\n\n private prepareBreadcrumbItem(\n activatedRouteSnapshot: ActivatedRouteSnapshot,\n routeLinkPrefix: string\n ): BreadcrumbDefinition {\n const { path, breadcrumb } = this.parseRouteData(\n activatedRouteSnapshot.routeConfig\n );\n const resolvedSegment = this.resolvePathSegment(\n path,\n activatedRouteSnapshot\n );\n const routeLink = `${routeLinkPrefix}${resolvedSegment}`;\n const storeItem = this.getFromStore(breadcrumb.alias, routeLink);\n\n const label = this.extractLabel(\n storeItem?.label || breadcrumb?.label,\n resolvedSegment\n );\n let isAutoGeneratedLabel = false;\n let autoGeneratedLabel = '';\n if (!label) {\n isAutoGeneratedLabel = true;\n autoGeneratedLabel = resolvedSegment;\n }\n\n return {\n ...storeItem,\n ...breadcrumb,\n label: isAutoGeneratedLabel ? autoGeneratedLabel : label,\n routeLink,\n isAutoGeneratedLabel,\n ...this.getQueryParamsFromPreviousList(routeLink),\n };\n }\n\n private prepareBreadcrumbList(\n activatedRouteSnapshot: ActivatedRouteSnapshot,\n routeLinkPrefix: string\n ): Breadcrumb[] | void {\n if (activatedRouteSnapshot.routeConfig?.path) {\n const breadcrumbItem = this.prepareBreadcrumbItem(\n activatedRouteSnapshot,\n routeLinkPrefix\n );\n this.currentBreadcrumbs.push(breadcrumbItem);\n\n if (activatedRouteSnapshot.firstChild) {\n return this.prepareBreadcrumbList(\n activatedRouteSnapshot.firstChild,\n breadcrumbItem.routeLink + '/'\n );\n }\n } else if (activatedRouteSnapshot.firstChild) {\n return this.prepareBreadcrumbList(\n activatedRouteSnapshot.firstChild,\n routeLinkPrefix\n );\n }\n const lastCrumb =\n this.currentBreadcrumbs[this.currentBreadcrumbs.length - 1];\n this.setQueryParamsForActiveBreadcrumb(lastCrumb, activatedRouteSnapshot);\n\n // remove breadcrumb items that needs to be hidden\n const breadcrumbsToShow = this.currentBreadcrumbs.filter(\n (item) => !item.skip\n );\n\n this.breadcrumbs.next(breadcrumbsToShow);\n }\n\n private getFromStore(alias: string, routeLink: string): BreadcrumbDefinition {\n return this.dynamicBreadcrumbStore.find((item) => {\n return (\n (alias && alias === item.alias) ||\n (routeLink && routeLink === item.routeLink) ||\n this.matchRegex(routeLink, item.routeRegex)\n );\n });\n }\n\n /**\n * use exact match instead of regexp.test\n * for /mentor/[^/]+ we should match '/mentor/12' but not '/mentor/12/abc'\n */\n private matchRegex(routeLink: string, routeRegex: string) {\n const match = routeLink.match(new RegExp(routeRegex));\n return match?.[0] === routeLink;\n }\n\n /**\n * if the path segment has route params, read the param value from url\n * for each segment of route this gets called\n *\n * for mentor/:id/view - it gets called with mentor, :id, view 3 times\n */\n private resolvePathSegment(\n segment: string,\n activatedRouteSnapshot: ActivatedRouteSnapshot\n ) {\n //quirk -segment can be defined as view/:id in route config in which case you need to make it view/<resolved-param>\n if (segment.includes(PATH_PARAM.PREFIX)) {\n Object.entries(activatedRouteSnapshot.params).forEach(([key, value]) => {\n segment = segment.replace(`:${key}`, `${value}`);\n });\n }\n return segment;\n }\n\n /**\n * queryParams & fragments for previous breadcrumb path are copied over to new list\n */\n private getQueryParamsFromPreviousList(routeLink: string): Breadcrumb {\n const { queryParams, fragment } =\n this.previousBreadcrumbs.find((item) => item.routeLink === routeLink) ||\n {};\n return { queryParams, fragment };\n }\n\n /**\n * set current activated route query params to the last breadcrumb item\n */\n private setQueryParamsForActiveBreadcrumb(\n lastItem: Breadcrumb,\n activatedRouteSnapshot: ActivatedRouteSnapshot\n ) {\n if (lastItem) {\n const { queryParams, fragment } = activatedRouteSnapshot;\n lastItem.queryParams = queryParams ? { ...queryParams } : undefined;\n lastItem.fragment = fragment;\n }\n }\n\n /**\n * For a specific route, breadcrumb can be defined either on parent OR it's child(which has empty path)\n * When both are defined, child takes precedence\n *\n * Ex: Below we are setting breadcrumb on both parent and child.\n * So, child takes precedence and \"Defined On Child\" is displayed for the route 'home'\n * { path: 'home', loadChildren: () => import('./home/home.module').then((m) => m.HomeModule) , data: {breadcrumb: \"Defined On Module\"}}\n * AND\n * children: [\n * { path: '', component: ShowUserComponent, data: {breadcrumb: \"Defined On Child\" }\n * ]\n */\n private parseRouteData(routeConfig) {\n const { path, data } = routeConfig;\n const breadcrumb = this.mergeWithBaseChildData(\n routeConfig,\n data?.breadcrumb\n );\n\n return { path, breadcrumb };\n }\n\n /**\n * get empty children of a module or Component. Empty child is the one with path: ''\n * When parent and it's children (that has empty route path) define data merge them both with child taking precedence\n */\n private mergeWithBaseChildData(\n routeConfig,\n config: BreadcrumbConfig\n ): BreadcrumbObject {\n if (!routeConfig) {\n return this.extractObject(config);\n }\n\n let baseChild;\n if (routeConfig.loadChildren) {\n // To handle a module with empty child route\n baseChild = routeConfig._loadedRoutes.find((route) => route.path === '');\n } else if (routeConfig.children) {\n // To handle a component with empty child route\n baseChild = routeConfig.children.find((route) => route.path === '');\n }\n\n const childConfig = baseChild?.data?.breadcrumb;\n return childConfig\n ? this.mergeWithBaseChildData(baseChild, {\n ...this.extractObject(config),\n ...this.extractObject(childConfig),\n })\n : this.extractObject(config);\n }\n\n /**\n * Update breadcrumb dynamically\n *\n * key can be a path | alias\n *\n * 1) Using complete route path. route can be passed the same way you define angular routes\n * - path can be passed as 'exact path(routeLink)' or 'path with params(routeRegex)'\n * - update label Ex: set('/mentor', 'Mentor'), set('/mentor/:id', 'Mentor Details')\n * - change visibility Ex: set('/mentor/:id/edit', { skip: true })\n * ------------------------------------------ OR ------------------------------------------\n * 2) Using route alias (prefixed with '@'). alias should be unique for a route\n * - update label Ex: set('@mentor', 'Enabler')\n * - change visibility Ex: set('@mentorEdit', { skip: true })\n *\n *\n * value can be string | BreadcrumbObject | BreadcrumbFunction\n */\n set(key: string, breadcrumb: string | BreadcrumbObject) {\n const breadcrumbObject = this.extractObject(breadcrumb);\n let updateArgs: [StoreMatcherKey, BreadcrumbDefinition];\n\n if (key.startsWith(ALIAS_PREFIX)) {\n updateArgs = ['alias', { ...breadcrumbObject, alias: key.slice(1) }];\n } else if (key.includes(PATH_PARAM.PREFIX)) {\n updateArgs = [\n 'routeRegex',\n { ...breadcrumbObject, routeRegex: this.buildRegex(key) },\n ];\n } else {\n updateArgs = [\n 'routeLink',\n { ...breadcrumbObject, routeLink: this.ensureLeadingSlash(key) },\n ];\n }\n\n // For this route if previously a breadcrumb is not defined that sets isAutoGeneratedLabel: true\n // change it to false since this is user supplied value\n updateArgs[1].isAutoGeneratedLabel = false;\n\n this.updateStore(...updateArgs);\n this.updateCurrentBreadcrumbs(...updateArgs);\n }\n\n /**\n * Update the store to reuse for dynamic declarations\n * If the store already has this route definition update it, else add\n */\n private updateStore(key: string, breadcrumb: BreadcrumbDefinition) {\n const storeItemIndex = this.dynamicBreadcrumbStore.findIndex((item) => {\n return breadcrumb[key] === item[key];\n });\n if (storeItemIndex > -1) {\n this.dynamicBreadcrumbStore[storeItemIndex] = {\n ...this.dynamicBreadcrumbStore[storeItemIndex],\n ...breadcrumb,\n };\n } else {\n this.dynamicBreadcrumbStore.push({ ...breadcrumb });\n }\n }\n\n /**\n * If breadcrumb is present in current breadcrumbs update it and emit new stream\n */\n private updateCurrentBreadcrumbs(\n key: string,\n breadcrumb: BreadcrumbDefinition\n ) {\n const itemIndex = this.currentBreadcrumbs.findIndex((item) => {\n return key === 'routeRegex'\n ? this.matchRegex(item.routeLink, breadcrumb[key])\n : breadcrumb[key] === item[key];\n });\n if (itemIndex > -1) {\n this.currentBreadcrumbs[itemIndex] = {\n ...this.currentBreadcrumbs[itemIndex],\n ...breadcrumb,\n };\n const breadcrumbsToShow = this.currentBreadcrumbs.filter(\n (item) => !item.skip\n );\n this.breadcrumbs.next([...breadcrumbsToShow]);\n }\n }\n\n /**\n * For a route with path param, we create regex dynamically from angular route syntax\n * '/mentor/:id' becomes '/mentor/[^/]',\n * breadcrumbService.set('/mentor/:id', 'Uday') should update 'Uday' as label for '/mentor/2' OR 'mentor/ada'\n */\n private buildRegex(path: string) {\n return this.ensureLeadingSlash(path).replace(\n new RegExp(PATH_PARAM.REGEX_IDENTIFIER, 'g'),\n PATH_PARAM.REGEX_REPLACER\n );\n }\n\n private ensureLeadingSlash(path: string) {\n return path.startsWith('/') ? path : `/${path}`;\n }\n\n /**\n * In App's RouteConfig, breadcrumb can be defined as a string OR a function OR an object\n *\n * string: simple static breadcrumb label for a path\n * function: callback that gets invoked with resolved path param\n * object: additional data defined along with breadcrumb label that gets passed to *xngBreadcrumbItem directive\n */\n private extractLabel(config: BreadcrumbConfig, resolvedParam?: string) {\n const label = typeof config === 'object' ? config.label : config;\n if (typeof label === 'function') {\n return label(resolvedParam);\n }\n return label;\n }\n\n private extractObject(config: BreadcrumbConfig): BreadcrumbObject {\n // don't include {label} if config is undefined. This is important since we merge the configs\n if (\n config &&\n (typeof config === 'string' || typeof config === 'function')\n ) {\n return { label: config };\n }\n return (config as BreadcrumbObject) || {};\n }\n}\n","import {\n Component,\n ContentChild,\n Input,\n OnInit,\n TemplateRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { BreadcrumbItemDirective } from './breadcrumb-item.directive';\nimport { BreadcrumbDefinition, BreadcrumbService } from './breadcrumb.service';\n\n@Component({\n selector: 'xng-breadcrumb',\n templateUrl: './breadcrumb.component.html',\n styleUrls: ['./breadcrumb.component.css'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class BreadcrumbComponent implements OnInit {\n breadcrumbs$: Observable<BreadcrumbDefinition[]>;\n separatorTemplate: TemplateRef<void>;\n private _separator = '/';\n\n /**\n * Breadcrumb item can be customized with this template\n * Template context is provided label, additional info, first and last indexes\n * Use cases:\n * 1) Add an icon along with label\n * 2) i18n. {{breadcrumb | translate}} or {{breadcrumb | transloco}}\n * 3) Change text case {{breadcrumb | titlecase}}\n */\n @ContentChild(BreadcrumbItemDirective, { static: false, read: TemplateRef })\n itemTemplate;\n\n /**\n * If true, breadcrumb is auto generated even without any mapping label\n * Default label is same as route segment\n */\n @Input() autoGenerate = true;\n\n /**\n * By default query params will be preserved with breadcrumbs\n */\n @Input() preserveQueryParams = true;\n\n /**\n * By default query fragments will be preserved with breadcrumbs\n */\n @Input() preserveFragment = true;\n\n /**\n * custom class provided by consumer to increase specificity\n * This will benefit to override styles that are conflicting\n */\n @Input() class = '';\n\n /**\n * anchorTarget = \"_blank\" makes the breadcrumb link open in a new tab\n */\n @Input() anchorTarget: '_blank' | undefined;\n\n /**\n * separator between breadcrumbs, defaults to '/'.\n * User can customize separator either by passing a String or Template\n *\n * String --> Ex: <xng-breadcrumb separator=\"-\"> </xng-breadcrumb>\n *\n * Template --> Ex: <xng-breadcrumb [separator]=\"separatorTemplate\"> </xng-breadcrumb>\n * <ng-template #separatorTemplate><mat-icon>arrow_right</mat-icon></ng-template>\n */\n @Input('separator')\n set separator(value: string | TemplateRef<void>) {\n if (value instanceof TemplateRef) {\n this.separatorTemplate = value;\n this._separator = undefined;\n } else {\n this.separatorTemplate = undefined;\n this._separator = value || '/';\n }\n }\n get separator() {\n return this._separator;\n }\n\n setupMessage = 'not set up yet';\n someParameterValue = null;\n\n constructor(\n private breadcrumbService: BreadcrumbService,\n activateRoute: ActivatedRoute\n ) {\n // breadcrumb inside ngIf works only this way\n activateRoute.params.subscribe((params) => {\n this.setupComponent(params['someParam']);\n });\n }\n\n setupComponent(someParam) {\n this.setupMessage = 'set up at ' + new Date();\n this.someParameterValue = someParam;\n }\n\n ngOnInit() {\n this.breadcrumbs$ = this.breadcrumbService.breadcrumbs$.pipe(\n map((breadcrumbs: BreadcrumbDefinition[]) => {\n return breadcrumbs\n .filter((breadcrumb: BreadcrumbDefinition) => {\n // Usually, breadcrumb list can contain a combination of auto generated and user specified labels\n // this filters autogenerated labels in case of \"[autoGenerate]: false\"\n if (this.autoGenerate) {\n return true;\n }\n return !breadcrumb.isAutoGeneratedLabel;\n })\n .map((breadcrumb: BreadcrumbDefinition) => {\n // Do not mutate breadcrumb as its source of truth.\n // There can be scenarios where we can have multiple xng-breadcrumb instances in page\n const { routeInterceptor, routeLink } = breadcrumb;\n return {\n ...breadcrumb,\n routeLink: routeInterceptor?.(routeLink, breadcrumb) || routeLink,\n };\n });\n })\n );\n }\n}\n","<nav aria-label=\"breadcrumb\" class=\"xng-breadcrumb-root\" [ngClass]=\"class\">\n <ol class=\"xng-breadcrumb-list\">\n <ng-container\n *ngFor=\"\n let breadcrumb of breadcrumbs$ | async;\n last as isLast;\n first as isFirst;\n index as index;\n count as count\n \"\n >\n <li class=\"xng-breadcrumb-item\">\n <a\n *ngIf=\"!isLast\"\n class=\"xng-breadcrumb-link\"\n [ngClass]=\"{ 'xng-breadcrumb-link-disabled': breadcrumb.disable }\"\n [attr.aria-disabled]=\"breadcrumb.disable\"\n [attr.tabIndex]=\"breadcrumb.disable ? -1 : 0\"\n role=\"button\"\n rel=\"noopener noreferrer\"\n [routerLink]=\"\n breadcrumb.routeInterceptor\n ? breadcrumb.routeInterceptor(breadcrumb.routeLink, breadcrumb)\n : breadcrumb.routeLink\n \"\n [queryParams]=\"\n preserveQueryParams ? breadcrumb.queryParams : undefined\n \"\n [fragment]=\"preserveFragment ? breadcrumb.fragment : undefined\"\n [target]=\"anchorTarget ? anchorTarget : '_self'\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n itemTemplate;\n context: {\n $implicit: breadcrumb.label,\n info: breadcrumb.info,\n last: isLast,\n first: isFirst,\n index: index,\n count: count\n }\n \"\n ></ng-container>\n <ng-container *ngIf=\"!itemTemplate\">{{\n breadcrumb.label\n }}</ng-container>\n </a>\n\n <label *ngIf=\"isLast\" class=\"xng-breadcrumb-trail\">\n <ng-container\n *ngTemplateOutlet=\"\n itemTemplate;\n context: {\n $implicit: breadcrumb.label,\n info: breadcrumb.info,\n last: isLast,\n first: isFirst,\n index: index,\n count: count\n }\n \"\n ></ng-container>\n <ng-container *ngIf=\"!itemTemplate\">{{\n breadcrumb.label\n }}</ng-container>\n </label>\n </li>\n\n <li *ngIf=\"!isLast\" class=\"xng-breadcrumb-separator\" aria-hidden=\"true\">\n <ng-container *ngTemplateOutlet=\"separatorTemplate\"></ng-container>\n <ng-container *ngIf=\"!separatorTemplate\">{{ separator }}</ng-container>\n </li>\n </ng-container>\n </ol>\n</nav>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { BreadcrumbItemDirective } from './breadcrumb-item.directive';\nimport { BreadcrumbComponent } from './breadcrumb.component';\n\n@NgModule({\n declarations: [BreadcrumbComponent, BreadcrumbItemDirective],\n imports: [CommonModule, RouterModule],\n exports: [BreadcrumbComponent, BreadcrumbItemDirective],\n})\nexport class BreadcrumbModule {}\n","/*\n * Public API Surface of xng-breadcrumb\n */\n\nexport * from './lib/breadcrumb-item.directive';\nexport * from './lib/breadcrumb.component';\nexport * from './lib/breadcrumb.module';\nexport * from './lib/breadcrumb.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.BreadcrumbService","i2"],"mappings":";;;;;;;;;AAEA;;;;AAIG;MAIU,uBAAuB,CAAA;;oHAAvB,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;wGAAvB,uBAAuB,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;2FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qBAAqB;iBAChC,CAAA;;;ACSD,MAAM,UAAU,GAAG;AACjB,IAAA,MAAM,EAAE,GAAG;AACX,IAAA,gBAAgB,EAAE,SAAS;AAC3B,IAAA,cAAc,EAAE,QAAQ;CACzB,CAAC;AACF,MAAM,YAAY,GAAG,GAAG,CAAC;AACzB,MAAM,UAAU,GAAG,CAAC,GAAY,KAAa;AAC3C,IAAA,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5C,CAAC,CAAC;MAKW,iBAAiB,CAAA;IAyB5B,WAAoB,CAAA,cAA8B,EAAU,MAAc,EAAA;AAAtD,QAAA,IAAc,CAAA,cAAA,GAAd,cAAc,CAAgB;AAAU,QAAA,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;AAxBlE,QAAA,IAAQ,CAAA,QAAA,GAAG,GAAG,CAAC;AAEvB;;;;AAIG;AACK,QAAA,IAAsB,CAAA,sBAAA,GAA2B,EAAE,CAAC;AAE5D;;;;AAIG;AACK,QAAA,IAAkB,CAAA,kBAAA,GAA2B,EAAE,CAAC;AAChD,QAAA,IAAmB,CAAA,mBAAA,GAA2B,EAAE,CAAC;AAEzD;;;AAGG;QACK,IAAA,CAAA,WAAW,GAAG,IAAI,eAAe,CAAyB,EAAE,CAAC,CAAC;QAC/D,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;QAGpD,IAAI,CAAC,kBAAkB,EAAE,CAAC;KAC3B;AAED;;AAEG;IACK,kBAAkB,GAAA;;;;QAIxB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAEpD,IAAI,CAAC,MAAM,CAAC,MAAM;AACf,aAAA,IAAI,CACH,MAAM,CACJ,CAAC,KAAK,KAA8B,KAAK,YAAY,cAAc,CACpE,CACF;AACA,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;;;;YAInB,IAAI,KAAK,CAAC,cAAc,EAAE;gBACxB,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACzC,aAAA;AACH,SAAC,CAAC,CAAC;KACN;AAEO,IAAA,gBAAgB,CAAC,sBAA8C,EAAA;AACrE,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,CAAC;;AAEnD,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAChD,QAAA,IAAI,CAAC,kBAAkB,GAAG,cAAc,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC;QACjE,IAAI,CAAC,qBAAqB,CAAC,sBAAsB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KACnE;IAEO,iBAAiB,GAAA;;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;AAC3E,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,CAAA,EAAA,GAAA,UAAU,KAAV,IAAA,IAAA,UAAU,uBAAV,UAAU,CAAE,IAAI,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,UAAU,CAAC,CAAC;AACxE,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAE/D,IAAI,UAAU,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE;AACvD,YAAA,OAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACK,SAAS,CACT,EAAA,cAAc,CACjB,EAAA,EAAA,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAA,CAAA,EACrB,IAAI,CAAC,8BAA8B,CAAC,GAAG,CAAC,CAC3C,CAAA;AACH,SAAA;KACF;IAEO,qBAAqB,CAC3B,sBAA8C,EAC9C,eAAuB,EAAA;AAEvB,QAAA,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,cAAc,CAC9C,sBAAsB,CAAC,WAAW,CACnC,CAAC;QACF,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAC7C,IAAI,EACJ,sBAAsB,CACvB,CAAC;AACF,QAAA,MAAM,SAAS,GAAG,CAAA,EAAG,eAAe,CAAG,EAAA,eAAe,EAAE,CAAC;AACzD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAEjE,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAC7B,CAAA,SAAS,KAAA,IAAA,IAAT,SAAS,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAT,SAAS,CAAE,KAAK,MAAI,UAAU,KAAV,IAAA,IAAA,UAAU,KAAV,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,UAAU,CAAE,KAAK,CAAA,EACrC,eAAe,CAChB,CAAC;QACF,IAAI,oBAAoB,GAAG,KAAK,CAAC;QACjC,IAAI,kBAAkB,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,EAAE;YACV,oBAAoB,GAAG,IAAI,CAAC;YAC5B,kBAAkB,GAAG,eAAe,CAAC;AACtC,SAAA;AAED,QAAA,OAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACK,SAAS,CACT,EAAA,UAAU,CACb,EAAA,EAAA,KAAK,EAAE,oBAAoB,GAAG,kBAAkB,GAAG,KAAK,EACxD,SAAS;AACT,YAAA,oBAAoB,KACjB,IAAI,CAAC,8BAA8B,CAAC,SAAS,CAAC,CACjD,CAAA;KACH;IAEO,qBAAqB,CAC3B,sBAA8C,EAC9C,eAAuB,EAAA;;AAEvB,QAAA,IAAI,MAAA,sBAAsB,CAAC,WAAW,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,IAAI,EAAE;YAC5C,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAC/C,sBAAsB,EACtB,eAAe,CAChB,CAAC;AACF,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAE7C,IAAI,sBAAsB,CAAC,UAAU,EAAE;AACrC,gBAAA,OAAO,IAAI,CAAC,qBAAqB,CAC/B,sBAAsB,CAAC,UAAU,EACjC,cAAc,CAAC,SAAS,GAAG,GAAG,CAC/B,CAAC;AACH,aAAA;AACF,SAAA;aAAM,IAAI,sBAAsB,CAAC,UAAU,EAAE;YAC5C,OAAO,IAAI,CAAC,qBAAqB,CAC/B,sBAAsB,CAAC,UAAU,EACjC,eAAe,CAChB,CAAC;AACH,SAAA;AACD,QAAA,MAAM,SAAS,GACb,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC9D,QAAA,IAAI,CAAC,iCAAiC,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;;AAG1E,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CACtD,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CACrB,CAAC;AAEF,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;KAC1C;IAEO,YAAY,CAAC,KAAa,EAAE,SAAiB,EAAA;QACnD,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,IAAI,KAAI;YAC/C,QACE,CAAC,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK;AAC9B,iBAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC,SAAS,CAAC;gBAC3C,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,EAC3C;AACJ,SAAC,CAAC,CAAC;KACJ;AAED;;;AAGG;IACK,UAAU,CAAC,SAAiB,EAAE,UAAkB,EAAA;AACtD,QAAA,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QACtD,OAAO,CAAA,KAAK,KAAA,IAAA,IAAL,KAAK,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAL,KAAK,CAAG,CAAC,CAAC,MAAK,SAAS,CAAC;KACjC;AAED;;;;;AAKG;IACK,kBAAkB,CACxB,OAAe,EACf,sBAA8C,EAAA;;QAG9C,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;AACvC,YAAA,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AACrE,gBAAA,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,EAAE,CAAA,EAAG,KAAK,CAAA,CAAE,CAAC,CAAC;AACnD,aAAC,CAAC,CAAC;AACJ,SAAA;AACD,QAAA,OAAO,OAAO,CAAC;KAChB;AAED;;AAEG;AACK,IAAA,8BAA8B,CAAC,SAAiB,EAAA;QACtD,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAC7B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC;AACrE,YAAA,EAAE,CAAC;AACL,QAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;KAClC;AAED;;AAEG;IACK,iCAAiC,CACvC,QAAoB,EACpB,sBAA8C,EAAA;AAE9C,QAAA,IAAI,QAAQ,EAAE;AACZ,YAAA,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,sBAAsB,CAAC;AACzD,YAAA,QAAQ,CAAC,WAAW,GAAG,WAAW,GAAQ,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,WAAW,CAAG,GAAE,SAAS,CAAC;AACpE,YAAA,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC9B,SAAA;KACF;AAED;;;;;;;;;;;AAWG;AACK,IAAA,cAAc,CAAC,WAAW,EAAA;AAChC,QAAA,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC;AACnC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAC5C,WAAW,EACX,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAJ,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,IAAI,CAAE,UAAU,CACjB,CAAC;AAEF,QAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;KAC7B;AAED;;;AAGG;IACK,sBAAsB,CAC5B,WAAW,EACX,MAAwB,EAAA;;QAExB,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AACnC,SAAA;AAED,QAAA,IAAI,SAAS,CAAC;QACd,IAAI,WAAW,CAAC,YAAY,EAAE;;AAE5B,YAAA,SAAS,GAAG,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;AAC1E,SAAA;aAAM,IAAI,WAAW,CAAC,QAAQ,EAAE;;AAE/B,YAAA,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;AACrE,SAAA;AAED,QAAA,MAAM,WAAW,GAAG,CAAA,EAAA,GAAA,SAAS,KAAT,IAAA,IAAA,SAAS,KAAT,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,SAAS,CAAE,IAAI,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,UAAU,CAAC;AAChD,QAAA,OAAO,WAAW;cACd,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAChC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAC1B,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAClC,CAAA;AACJ,cAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;KAChC;AAED;;;;;;;;;;;;;;;;AAgBG;IACH,GAAG,CAAC,GAAW,EAAE,UAAqC,EAAA;QACpD,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;AACxD,QAAA,IAAI,UAAmD,CAAC;AAExD,QAAA,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;AAChC,YAAA,UAAU,GAAG,CAAC,OAAO,EAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAO,gBAAgB,CAAE,EAAA,EAAA,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAG,CAAC;AACtE,SAAA;aAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;AAC1C,YAAA,UAAU,GAAG;gBACX,YAAY;gDACP,gBAAgB,CAAA,EAAA,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAA,CAAA;aACxD,CAAC;AACH,SAAA;AAAM,aAAA;AACL,YAAA,UAAU,GAAG;gBACX,WAAW;gDACN,gBAAgB,CAAA,EAAA,EAAE,SAAS,EAAE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAA,CAAA;aAC/D,CAAC;AACH,SAAA;;;AAID,QAAA,UAAU,CAAC,CAAC,CAAC,CAAC,oBAAoB,GAAG,KAAK,CAAC;AAE3C,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,UAAU,CAAC,CAAC;AAChC,QAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,UAAU,CAAC,CAAC;KAC9C;AAED;;;AAGG;IACK,WAAW,CAAC,GAAW,EAAE,UAAgC,EAAA;QAC/D,MAAM,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,IAAI,KAAI;YACpE,OAAO,UAAU,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC;AACvC,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,cAAc,GAAG,CAAC,CAAC,EAAE;AACvB,YAAA,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,GACtC,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAC3C,EAAA,UAAU,CACd,CAAC;AACH,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAM,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,UAAU,EAAG,CAAC;AACrD,SAAA;KACF;AAED;;AAEG;IACK,wBAAwB,CAC9B,GAAW,EACX,UAAgC,EAAA;QAEhC,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,IAAI,KAAI;YAC3D,OAAO,GAAG,KAAK,YAAY;AACzB,kBAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;kBAChD,UAAU,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC;AACpC,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,SAAS,GAAG,CAAC,CAAC,EAAE;AAClB,YAAA,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,GAC7B,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAClC,EAAA,UAAU,CACd,CAAC;AACF,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CACtD,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CACrB,CAAC;YACF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC;AAC/C,SAAA;KACF;AAED;;;;AAIG;AACK,IAAA,UAAU,CAAC,IAAY,EAAA;QAC7B,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,OAAO,CAC1C,IAAI,MAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAC5C,UAAU,CAAC,cAAc,CAC1B,CAAC;KACH;AAEO,IAAA,kBAAkB,CAAC,IAAY,EAAA;AACrC,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAI,CAAA,EAAA,IAAI,EAAE,CAAC;KACjD;AAED;;;;;;AAMG;IACK,YAAY,CAAC,MAAwB,EAAE,aAAsB,EAAA;AACnE,QAAA,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC;AACjE,QAAA,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;AAC/B,YAAA,OAAO,KAAK,CAAC,aAAa,CAAC,CAAC;AAC7B,SAAA;AACD,QAAA,OAAO,KAAK,CAAC;KACd;AAEO,IAAA,aAAa,CAAC,MAAwB,EAAA;;AAE5C,QAAA,IACE,MAAM;aACL,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,UAAU,CAAC,EAC5D;AACA,YAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC1B,SAAA;QACD,OAAQ,MAA2B,IAAI,EAAE,CAAC;KAC3C;;8GAlYU,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAjB,iBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA,CAAA;2FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;iBACnB,CAAA;;;MCVY,mBAAmB,CAAA;IAqE9B,WACU,CAAA,iBAAoC,EAC5C,aAA6B,EAAA;AADrB,QAAA,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB,CAAmB;AAnEtC,QAAA,IAAU,CAAA,UAAA,GAAG,GAAG,CAAC;AAazB;;;AAGG;AACM,QAAA,IAAY,CAAA,YAAA,GAAG,IAAI,CAAC;AAE7B;;AAEG;AACM,QAAA,IAAmB,CAAA,mBAAA,GAAG,IAAI,CAAC;AAEpC;;AAEG;AACM,QAAA,IAAgB,CAAA,gBAAA,GAAG,IAAI,CAAC;AAEjC;;;AAGG;AACM,QAAA,IAAK,CAAA,KAAA,GAAG,EAAE,CAAC;AA8BpB,QAAA,IAAY,CAAA,YAAA,GAAG,gBAAgB,CAAC;AAChC,QAAA,IAAkB,CAAA,kBAAA,GAAG,IAAI,CAAC;;QAOxB,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;YACxC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;AAC3C,SAAC,CAAC,CAAC;KACJ;AAlCD;;;;;;;;AAQG;IACH,IACI,SAAS,CAAC,KAAiC,EAAA;QAC7C,IAAI,KAAK,YAAY,WAAW,EAAE;AAChC,YAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;AAC/B,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;AAC7B,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;AACnC,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK,IAAI,GAAG,CAAC;AAChC,SAAA;KACF;AACD,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;KACxB;AAeD,IAAA,cAAc,CAAC,SAAS,EAAA;QACtB,IAAI,CAAC,YAAY,GAAG,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC;AAC9C,QAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;KACrC;IAED,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAC1D,GAAG,CAAC,CAAC,WAAmC,KAAI;AAC1C,YAAA,OAAO,WAAW;AACf,iBAAA,MAAM,CAAC,CAAC,UAAgC,KAAI;;;gBAG3C,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,oBAAA,OAAO,IAAI,CAAC;AACb,iBAAA;AACD,gBAAA,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC;AAC1C,aAAC,CAAC;AACD,iBAAA,GAAG,CAAC,CAAC,UAAgC,KAAI;;;AAGxC,gBAAA,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC;AACnD,gBAAA,OAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACK,UAAU,CACb,EAAA,EAAA,SAAS,EAAE,CAAA,gBAAgB,KAAhB,IAAA,IAAA,gBAAgB,KAAhB,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,gBAAgB,CAAG,SAAS,EAAE,UAAU,CAAC,KAAI,SAAS,EACjE,CAAA,CAAA;AACJ,aAAC,CAAC,CAAC;SACN,CAAC,CACH,CAAC;KACH;;gHA3GU,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,EAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,mBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,EAahB,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,OAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,uBAAuB,EAAyB,WAAA,EAAA,IAAA,EAAA,IAAA,EAAA,WAAW,6BCjC3E,khFA4EA,EAAA,MAAA,EAAA,CAAA,otBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;2FDxDa,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,SAAS;+BACE,gBAAgB,EAAA,aAAA,EAGX,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,khFAAA,EAAA,MAAA,EAAA,CAAA,otBAAA,CAAA,EAAA,CAAA;kIAgBrC,YAAY,EAAA,CAAA;sBADX,YAAY;uBAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;gBAOlE,YAAY,EAAA,CAAA;sBAApB,KAAK;gBAKG,mBAAmB,EAAA,CAAA;sBAA3B,KAAK;gBAKG,gBAAgB,EAAA,CAAA;sBAAxB,KAAK;gBAMG,KAAK,EAAA,CAAA;sBAAb,KAAK;gBAKG,YAAY,EAAA,CAAA;sBAApB,KAAK;gBAYF,SAAS,EAAA,CAAA;sBADZ,KAAK;uBAAC,WAAW,CAAA;;;ME7DP,gBAAgB,CAAA;;6GAAhB,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;8GAAhB,gBAAgB,EAAA,YAAA,EAAA,CAJZ,mBAAmB,EAAE,uBAAuB,CAAA,EAAA,OAAA,EAAA,CACjD,YAAY,EAAE,YAAY,CAAA,EAAA,OAAA,EAAA,CAC1B,mBAAmB,EAAE,uBAAuB,CAAA,EAAA,CAAA,CAAA;8GAE3C,gBAAgB,EAAA,OAAA,EAAA,CAHjB,YAAY,EAAE,YAAY,CAAA,EAAA,CAAA,CAAA;2FAGzB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAL5B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE,CAAC,mBAAmB,EAAE,uBAAuB,CAAC;AAC5D,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;AACrC,oBAAA,OAAO,EAAE,CAAC,mBAAmB,EAAE,uBAAuB,CAAC;iBACxD,CAAA;;;ACVD;;AAEG;;ACFH;;AAEG;;;;"}