{"version":3,"file":"sinequa-components-rfm.mjs","sources":["../../../projects/components/rfm/rfm.service.ts","../../../projects/components/rfm/bootstrap/rfm-action/rfm-action.ts","../../../projects/components/rfm/bootstrap/rfm-action/rfm-action.html","../../../projects/components/rfm/bootstrap/rfm.module.ts","../../../projects/components/rfm/sinequa-components-rfm.ts"],"sourcesContent":["import {Injectable, OnDestroy} from \"@angular/core\";\nimport {RfmWebService, AuditWebService, Results, Record, RFMDisplay} from \"@sinequa/core/web-services\";\nimport {AppService} from \"@sinequa/core/app-utils\";\nimport {Utils} from \"@sinequa/core/base\";\nimport {SearchService} from \"@sinequa/components/search\";\nimport {Subject, Observable, Subscription} from 'rxjs';\n\nexport type RFMType = \"important\" | \"click\" | \"like\";\n\nexport interface CCRFM {\n    name: string;\n    click: CCRFM.Action;\n    like: CCRFM.Action;\n    important: CCRFM.Action;\n}\n\nexport declare module CCRFM {\n    interface Action {\n        name: string;\n        enabled: boolean;\n        actionEnabled: boolean;\n        noMenu: boolean;\n        displayUnrated: boolean;\n        negAvailable: boolean;\n    }\n}\n\nexport enum RFMEventType {\n    ClickSet = \"RFM_ClickSet\",\n    ClickReset = \"RFM_ClickReset\",\n    Like = \"RFM_Like\",\n    LikeReset = \"RFM_LikeReset\",\n    Dislike = \"RFM_Dislike\",\n    Important = \"RFM_Important\",\n    ImportantReset = \"RFM_ImportantReset\",\n    Ban = \"RFM_Ban\"\n}\n\nexport interface RFMEvent {\n    type: \"updated\";\n}\n\n@Injectable({\n    providedIn: 'root',\n})\nexport class RFMService implements OnDestroy {\n\n    private _events = new Subject<RFMEvent>();\n    private _subscription: Subscription;\n\n    constructor(\n        public appService: AppService,\n        public rfmService: RfmWebService,\n        public searchService: SearchService,\n        public auditService: AuditWebService\n    ){\n        this._subscription = this.searchService.resultsStream.subscribe(results => {\n            this.updateRfm(results);\n        });\n    }\n\n    get events(): Observable<RFMEvent> {\n        return this._events;\n    }\n\n    ngOnDestroy(){\n        this._events.complete();\n        this._subscription.unsubscribe();\n    }\n\n    public getMenuActions(config: CCRFM.Action): RFMDisplay[] {\n        const actions = [RFMDisplay.positiveRate, RFMDisplay.unrate];\n        if(config.negAvailable)\n            actions.push(RFMDisplay.negativeRate);\n        return actions;\n    }\n\n    public static getActionName(rfmDisplay: RFMDisplay): string {\n        switch (rfmDisplay) {\n            case RFMDisplay.positiveRate:\n                return \"pos\";\n            case RFMDisplay.mainlyPosRate:\n                return \"mpos\";\n            case RFMDisplay.unrate:\n                return \"unrated\";\n            case RFMDisplay.mainlyNegRate:\n                return \"mneg\";\n            case RFMDisplay.negativeRate:\n                return \"neg\";\n            default:\n                return \"none\";\n        }\n    }\n\n\n    public static toAuditEventType(action : RFMType, evt: RFMDisplay): RFMEventType | undefined {\n        let aet: RFMEventType | undefined;\n        switch (action) {\n            case \"important\":\n                switch (evt) {\n                    case RFMDisplay.positiveRate:\n                        aet = RFMEventType.Important;\n                        break;\n                    case RFMDisplay.unrate:\n                        aet = RFMEventType.ImportantReset;\n                        break;\n                    case RFMDisplay.negativeRate:\n                        aet = RFMEventType.Ban;\n                        break;\n                }\n                break;\n            case \"like\":\n                switch (evt) {\n                    case RFMDisplay.positiveRate:\n                        aet = RFMEventType.Like;\n                        break;\n                    case RFMDisplay.unrate:\n                        aet = RFMEventType.LikeReset;\n                        break;\n                    case RFMDisplay.negativeRate:\n                        aet = RFMEventType.Dislike;\n                        break;\n                }\n                break;\n            case \"click\":\n                switch (evt) {\n                    case RFMDisplay.positiveRate:\n                        aet = RFMEventType.ClickSet;\n                        break;\n                    case RFMDisplay.unrate:\n                        aet = RFMEventType.ClickReset;\n                        break;\n                    //case RFMDisplay.negativeRate:\n                    //aet = AuditEventType.RFM_Dislike;\n                    //break;\n                }\n                break;\n        }\n        return aet;\n    }\n\n    public notifyRfmAction(rfmEvent: any, record: Record, results: Results) {\n        this.auditService.notifyDocument(rfmEvent, record, results, undefined, {\n            queryhash: this.searchService.results ? this.searchService.results.rfmQueryHash : undefined,\n            querytext: this.searchService.query.text,\n            querylang: this.searchService.query.questionLanguage || (this.appService.ccquery && this.appService.ccquery.questionLanguage)\n        });\n    }\n\n\n    /**\n     * Called every time new results come in.\n     * Performs a request for\n     * @param results\n     */\n    private updateRfm(results: Results | undefined) {\n        if (results && results.records) {\n            const ccquery = this.appService.ccquery;\n            if (ccquery && ccquery.rFM) {\n                Utils.subscribe(this.rfmService.getRfmData(ccquery.rFM, results),\n                    (value) => {\n                        if (value) {\n                            for (const record of results.records) {\n                                const rfmData = value[record.id];\n                                if (!!rfmData) {\n                                    record.rfm = rfmData;\n                                }\n                            }\n                            this._events.next({type: \"updated\"});\n                        }\n                    });\n            }\n        }\n    }\n}\n","import {Component, Input, OnChanges, SimpleChanges, OnDestroy, ChangeDetectorRef} from \"@angular/core\";\nimport {Utils} from \"@sinequa/core/base\";\nimport {Results, Record, RFMDisplay, RFMActionDisplay} from \"@sinequa/core/web-services\";\nimport {RFMService, CCRFM, RFMType} from \"../../rfm.service\";\nimport {Action} from \"@sinequa/components/action\";\nimport {Subscription} from \"rxjs\";\n\n@Component({\n    selector: \"sq-rfm-action\",\n    templateUrl: \"./rfm-action.html\",\n    standalone: false\n})\nexport class BsRfmAction implements OnChanges, OnDestroy {\n    @Input() results: Results;\n    @Input() record: Record;\n    @Input() config: CCRFM.Action;  // Parent should bind this.appService.ccrfm[type]\n    @Input() rfm: RFMActionDisplay; // Parent should bind record.rfm && record.rfm[type]\n    @Input() type: RFMType;         // click, like, important (default)\n    @Input() size: string;\n    action: Action;\n\n    menuActions: RFMDisplay[];\n\n    private rfmSubscription: Subscription;\n\n    constructor(\n        protected changeDetectorRef: ChangeDetectorRef,\n        protected rFMService: RFMService) {\n    }\n\n    ngOnChanges(changes: SimpleChanges) {\n        if (!this.rfmSubscription) {\n            this.rfmSubscription = this.rFMService.events.subscribe(\n                (event) => {\n                    this.changeDetectorRef.markForCheck();\n                }\n            );\n        }\n        if (changes[\"rfm\"]) {\n            if (!this.action) {\n                this.type = (Utils.toLowerCase(this.type) || \"important\") as RFMType;\n                // List of menu actions from app config\n                this.menuActions = this.rFMService.getMenuActions(this.config);\n                this.buildAction();\n            }\n            else {\n                this.action.update();\n            }\n        }\n    }\n\n    ngOnDestroy() {\n        this.rfmSubscription.unsubscribe();\n    }\n\n    get hasRFMAction(): boolean {\n        return this.record.rfmEnabled && this.config.enabled &&\n            this.hasRfmImage;\n    }\n\n    get rfmStatus(): RFMDisplay {\n        return (!this.rfm) ? RFMDisplay.unrate : this.rfm.status;\n    }\n\n    get hasRfmImage() : boolean {\n        return this.rfmImage !== RFMDisplay.none;\n    }\n\n    get rfmImage(): RFMDisplay {\n        return (!this.rfm) ? this.rfmDefaultImage : this.rfm.image;\n    }\n\n    private get rfmDefaultImage(): RFMDisplay {\n        return ( this.config.displayUnrated || !this.config.noMenu) ? RFMDisplay.unrate : RFMDisplay.none;\n    }\n\n    get rfmImageAction(): RFMDisplay {\n        return (!this.rfm) ? this.rfmDefaultImageAction : this.rfm.imageAction;\n    }\n\n    private get rfmDefaultImageAction(): RFMDisplay {\n        return this.config.noMenu ? RFMDisplay.positiveRate : RFMDisplay.none;\n    }\n\n    get rfmAvailableActions(): RFMDisplay {\n        return (!this.rfm) ? this.rfmDefaultAvailableActions : this.rfm.availableActions;\n    }\n\n    private get rfmDefaultAvailableActions(): RFMDisplay {\n        if (this.config.noMenu) {\n            return RFMDisplay.none;\n        }\n        if (this.config.negAvailable) {\n            return RFMDisplay.personalAll;\n        }\n        return RFMDisplay.personalPosOnly;\n    }\n\n    get displayImgAction(): boolean {\n        return this.rfmImageAction !== RFMDisplay.none;\n    }\n\n    get displayMenu(): boolean {\n        return this.rfmImageAction === RFMDisplay.none &&\n            this.rfmAvailableActions !== RFMDisplay.none &&\n            !this.config.noMenu;\n    }\n\n    get displayNoAction(): boolean {\n        return this.rfmImageAction === RFMDisplay.none &&\n            this.rfmAvailableActions === RFMDisplay.none;\n    }\n\n    getActionIcon(rfmDisplay: RFMDisplay): string {\n        const name = RFMService.getActionName(rfmDisplay);\n        return `rfm-${this.type}-${name}`;\n    }\n\n    buildAction() {\n        this.action = new Action({\n            updater: (item) => {\n                item.icon = this.getActionIcon(this.rfmImage);\n            }\n        });\n        if (this.displayImgAction) {\n            this.action.action = (item) => {\n                this.selectRfmDisplay(this.rfmImageAction);\n            };\n        }\n        if (this.displayMenu) {\n            this.action.children = this.menuActions.map(rfmDisplay => new Action({\n                icon: this.getActionIcon(rfmDisplay),\n                data: rfmDisplay,\n                action: (item) => {\n                    this.selectRfmDisplay(item.data);\n                },\n                updater: (item) => {\n                    item.disabled = rfmDisplay === this.rfmStatus;\n                }\n            }));\n        }\n        this.action.update();\n    }\n\n    selectRfmDisplay(rfmDisplay: RFMDisplay) {\n        if (rfmDisplay !== this.rfmStatus) {\n            const eventtype = RFMService.toAuditEventType(this.type, rfmDisplay);\n            this.rFMService.notifyRfmAction(eventtype, this.record, this.results);\n            // Update RFM data for the record (created a new RFM data can be necessary)\n            this.updateRfmData(rfmDisplay, this.rfmStatus);\n        }\n    }\n\n    private updateRfmData(newStatus: RFMDisplay, newAction: RFMDisplay) {\n        let updateNeeded = false;\n        if (!this.rfm) {\n            this.rfm = {\n                eventCount: 1,\n                average: 0,\n                status: newStatus,\n                image: newStatus,\n                imageAction: newAction,\n                availableActions: this.rfmDefaultAvailableActions\n            };\n            updateNeeded = true;\n        }\n        else {\n            if (newStatus === RFMDisplay.unrate) {\n                this.rfm.eventCount--;\n            }\n            else {\n                this.rfm.eventCount++;\n            }\n            this.rfm.status = newStatus;\n            this.rfm.image = newStatus;\n            this.rfm.imageAction = newAction;\n        }\n\n        if (updateNeeded) {\n            let rfm = this.record.rfm;\n            let updateRfm = false;\n            if (!rfm) {\n                updateRfm = true;\n                rfm = {};\n            }\n            rfm[this.type] = this.rfm;\n            if (updateRfm) {\n                this.record.rfm = rfm;\n            }\n        }\n        this.action.update();\n    }\n}","<ng-container *ngIf=\"hasRFMAction\">\n    <div *ngIf=\"displayImgAction || displayMenu\" [sq-action-buttons]=\"{items: [action], autoAdjust: true, size: size}\"></div>\n    <div *ngIf=\"displayNoAction\">\n        <div class=\"rfm-no-action\">\n            <span class=\"{{getActionIcon(rfm.image)}}\"></span>\n        </div>\n    </div>\n</ng-container>\n","import {NgModule} from \"@angular/core\";\nimport {CommonModule} from \"@angular/common\";\n\nimport {BsActionModule} from \"@sinequa/components/action\";\nimport {BsRfmAction} from \"./rfm-action/rfm-action\";\n\n@NgModule({\n    imports: [\n        CommonModule,\n\n        BsActionModule\n    ],\n    declarations: [\n        BsRfmAction\n    ],\n    exports: [\n        BsRfmAction\n    ]\n})\nexport class BsRfmModule {\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.RFMService","i2","i3"],"mappings":";;;;;;;;;;;;;IA2BY;AAAZ,CAAA,UAAY,YAAY,EAAA;AACpB,IAAA,YAAA,CAAA,UAAA,CAAA,GAAA,cAAyB;AACzB,IAAA,YAAA,CAAA,YAAA,CAAA,GAAA,gBAA6B;AAC7B,IAAA,YAAA,CAAA,MAAA,CAAA,GAAA,UAAiB;AACjB,IAAA,YAAA,CAAA,WAAA,CAAA,GAAA,eAA2B;AAC3B,IAAA,YAAA,CAAA,SAAA,CAAA,GAAA,aAAuB;AACvB,IAAA,YAAA,CAAA,WAAA,CAAA,GAAA,eAA2B;AAC3B,IAAA,YAAA,CAAA,gBAAA,CAAA,GAAA,oBAAqC;AACrC,IAAA,YAAA,CAAA,KAAA,CAAA,GAAA,SAAe;AACnB,CAAC,EATW,YAAY,KAAZ,YAAY,GAAA,EAAA,CAAA,CAAA;MAkBX,UAAU,CAAA;AAKnB,IAAA,WAAA,CACW,UAAsB,EACtB,UAAyB,EACzB,aAA4B,EAC5B,YAA6B,EAAA;QAH7B,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,aAAa,GAAb,aAAa;QACb,IAAA,CAAA,YAAY,GAAZ,YAAY;AAPf,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,OAAO,EAAY;AASrC,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,IAAG;AACtE,YAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;AAC3B,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,IAAI,MAAM,GAAA;QACN,OAAO,IAAI,CAAC,OAAO;IACvB;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;AACvB,QAAA,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE;IACpC;AAEO,IAAA,cAAc,CAAC,MAAoB,EAAA;QACtC,MAAM,OAAO,GAAG,CAAC,UAAU,CAAC,YAAY,EAAE,UAAU,CAAC,MAAM,CAAC;QAC5D,IAAG,MAAM,CAAC,YAAY;AAClB,YAAA,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;AACzC,QAAA,OAAO,OAAO;IAClB;IAEO,OAAO,aAAa,CAAC,UAAsB,EAAA;QAC9C,QAAQ,UAAU;YACd,KAAK,UAAU,CAAC,YAAY;AACxB,gBAAA,OAAO,KAAK;YAChB,KAAK,UAAU,CAAC,aAAa;AACzB,gBAAA,OAAO,MAAM;YACjB,KAAK,UAAU,CAAC,MAAM;AAClB,gBAAA,OAAO,SAAS;YACpB,KAAK,UAAU,CAAC,aAAa;AACzB,gBAAA,OAAO,MAAM;YACjB,KAAK,UAAU,CAAC,YAAY;AACxB,gBAAA,OAAO,KAAK;AAChB,YAAA;AACI,gBAAA,OAAO,MAAM;;IAEzB;AAGO,IAAA,OAAO,gBAAgB,CAAC,MAAgB,EAAE,GAAe,EAAA;AAC5D,QAAA,IAAI,GAA6B;QACjC,QAAQ,MAAM;AACV,YAAA,KAAK,WAAW;gBACZ,QAAQ,GAAG;oBACP,KAAK,UAAU,CAAC,YAAY;AACxB,wBAAA,GAAG,GAAG,YAAY,CAAC,SAAS;wBAC5B;oBACJ,KAAK,UAAU,CAAC,MAAM;AAClB,wBAAA,GAAG,GAAG,YAAY,CAAC,cAAc;wBACjC;oBACJ,KAAK,UAAU,CAAC,YAAY;AACxB,wBAAA,GAAG,GAAG,YAAY,CAAC,GAAG;wBACtB;;gBAER;AACJ,YAAA,KAAK,MAAM;gBACP,QAAQ,GAAG;oBACP,KAAK,UAAU,CAAC,YAAY;AACxB,wBAAA,GAAG,GAAG,YAAY,CAAC,IAAI;wBACvB;oBACJ,KAAK,UAAU,CAAC,MAAM;AAClB,wBAAA,GAAG,GAAG,YAAY,CAAC,SAAS;wBAC5B;oBACJ,KAAK,UAAU,CAAC,YAAY;AACxB,wBAAA,GAAG,GAAG,YAAY,CAAC,OAAO;wBAC1B;;gBAER;AACJ,YAAA,KAAK,OAAO;gBACR,QAAQ,GAAG;oBACP,KAAK,UAAU,CAAC,YAAY;AACxB,wBAAA,GAAG,GAAG,YAAY,CAAC,QAAQ;wBAC3B;oBACJ,KAAK,UAAU,CAAC,MAAM;AAClB,wBAAA,GAAG,GAAG,YAAY,CAAC,UAAU;wBAC7B;;;;;gBAKR;;AAER,QAAA,OAAO,GAAG;IACd;AAEO,IAAA,eAAe,CAAC,QAAa,EAAE,MAAc,EAAE,OAAgB,EAAA;AAClE,QAAA,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;AACnE,YAAA,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,GAAG,SAAS;AAC3F,YAAA,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI;YACxC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,gBAAgB,KAAK,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,gBAAgB;AAC/H,SAAA,CAAC;IACN;AAGA;;;;AAIG;AACK,IAAA,SAAS,CAAC,OAA4B,EAAA;AAC1C,QAAA,IAAI,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE;AAC5B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO;AACvC,YAAA,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE;AACxB,gBAAA,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,EAC5D,CAAC,KAAK,KAAI;oBACN,IAAI,KAAK,EAAE;AACP,wBAAA,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE;4BAClC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;AAChC,4BAAA,IAAI,CAAC,CAAC,OAAO,EAAE;AACX,gCAAA,MAAM,CAAC,GAAG,GAAG,OAAO;4BACxB;wBACJ;wBACA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,SAAS,EAAC,CAAC;oBACxC;AACJ,gBAAA,CAAC,CAAC;YACV;QACJ;IACJ;+GAhIS,UAAU,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAV,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,cAFP,MAAM,EAAA,CAAA,CAAA;;4FAET,UAAU,EAAA,UAAA,EAAA,CAAA;kBAHtB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE,MAAM;AACrB,iBAAA;;;MChCY,WAAW,CAAA;IAapB,WAAA,CACc,iBAAoC,EACpC,UAAsB,EAAA;QADtB,IAAA,CAAA,iBAAiB,GAAjB,iBAAiB;QACjB,IAAA,CAAA,UAAU,GAAV,UAAU;IACxB;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AACvB,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CACnD,CAAC,KAAK,KAAI;AACN,gBAAA,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE;AACzC,YAAA,CAAC,CACJ;QACL;AACA,QAAA,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;AAChB,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AACd,gBAAA,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,WAAW,CAAY;;AAEpE,gBAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC9D,IAAI,CAAC,WAAW,EAAE;YACtB;iBACK;AACD,gBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YACxB;QACJ;IACJ;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE;IACtC;AAEA,IAAA,IAAI,YAAY,GAAA;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;YAChD,IAAI,CAAC,WAAW;IACxB;AAEA,IAAA,IAAI,SAAS,GAAA;QACT,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM;IAC5D;AAEA,IAAA,IAAI,WAAW,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,QAAQ,KAAK,UAAU,CAAC,IAAI;IAC5C;AAEA,IAAA,IAAI,QAAQ,GAAA;QACR,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK;IAC9D;AAEA,IAAA,IAAY,eAAe,GAAA;QACvB,OAAO,CAAE,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,IAAI;IACrG;AAEA,IAAA,IAAI,cAAc,GAAA;QACd,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW;IAC1E;AAEA,IAAA,IAAY,qBAAqB,GAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,YAAY,GAAG,UAAU,CAAC,IAAI;IACzE;AAEA,IAAA,IAAI,mBAAmB,GAAA;QACnB,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB;IACpF;AAEA,IAAA,IAAY,0BAA0B,GAAA;AAClC,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YACpB,OAAO,UAAU,CAAC,IAAI;QAC1B;AACA,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;YAC1B,OAAO,UAAU,CAAC,WAAW;QACjC;QACA,OAAO,UAAU,CAAC,eAAe;IACrC;AAEA,IAAA,IAAI,gBAAgB,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,cAAc,KAAK,UAAU,CAAC,IAAI;IAClD;AAEA,IAAA,IAAI,WAAW,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,cAAc,KAAK,UAAU,CAAC,IAAI;AAC1C,YAAA,IAAI,CAAC,mBAAmB,KAAK,UAAU,CAAC,IAAI;AAC5C,YAAA,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;IAC3B;AAEA,IAAA,IAAI,eAAe,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,cAAc,KAAK,UAAU,CAAC,IAAI;AAC1C,YAAA,IAAI,CAAC,mBAAmB,KAAK,UAAU,CAAC,IAAI;IACpD;AAEA,IAAA,aAAa,CAAC,UAAsB,EAAA;QAChC,MAAM,IAAI,GAAG,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC;AACjD,QAAA,OAAO,OAAO,IAAI,CAAC,IAAI,CAAA,CAAA,EAAI,IAAI,EAAE;IACrC;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC;AACrB,YAAA,OAAO,EAAE,CAAC,IAAI,KAAI;gBACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC;YACjD;AACH,SAAA,CAAC;AACF,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,KAAI;AAC1B,gBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC;AAC9C,YAAA,CAAC;QACL;AACA,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AAClB,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,MAAM,CAAC;AACjE,gBAAA,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;AACpC,gBAAA,IAAI,EAAE,UAAU;AAChB,gBAAA,MAAM,EAAE,CAAC,IAAI,KAAI;AACb,oBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;gBACpC,CAAC;AACD,gBAAA,OAAO,EAAE,CAAC,IAAI,KAAI;oBACd,IAAI,CAAC,QAAQ,GAAG,UAAU,KAAK,IAAI,CAAC,SAAS;gBACjD;AACH,aAAA,CAAC,CAAC;QACP;AACA,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;IACxB;AAEA,IAAA,gBAAgB,CAAC,UAAsB,EAAA;AACnC,QAAA,IAAI,UAAU,KAAK,IAAI,CAAC,SAAS,EAAE;AAC/B,YAAA,MAAM,SAAS,GAAG,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;AACpE,YAAA,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC;;YAErE,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC;QAClD;IACJ;IAEQ,aAAa,CAAC,SAAqB,EAAE,SAAqB,EAAA;QAC9D,IAAI,YAAY,GAAG,KAAK;AACxB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACX,IAAI,CAAC,GAAG,GAAG;AACP,gBAAA,UAAU,EAAE,CAAC;AACb,gBAAA,OAAO,EAAE,CAAC;AACV,gBAAA,MAAM,EAAE,SAAS;AACjB,gBAAA,KAAK,EAAE,SAAS;AAChB,gBAAA,WAAW,EAAE,SAAS;gBACtB,gBAAgB,EAAE,IAAI,CAAC;aAC1B;YACD,YAAY,GAAG,IAAI;QACvB;aACK;AACD,YAAA,IAAI,SAAS,KAAK,UAAU,CAAC,MAAM,EAAE;AACjC,gBAAA,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE;YACzB;iBACK;AACD,gBAAA,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE;YACzB;AACA,YAAA,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,SAAS;AAC3B,YAAA,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,SAAS;AAC1B,YAAA,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,SAAS;QACpC;QAEA,IAAI,YAAY,EAAE;AACd,YAAA,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG;YACzB,IAAI,SAAS,GAAG,KAAK;YACrB,IAAI,CAAC,GAAG,EAAE;gBACN,SAAS,GAAG,IAAI;gBAChB,GAAG,GAAG,EAAE;YACZ;YACA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG;YACzB,IAAI,SAAS,EAAE;AACX,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG;YACzB;QACJ;AACA,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;IACxB;+GAnLS,WAAW,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAX,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,WAAW,2MCZxB,uWAQA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDIa,WAAW,EAAA,UAAA,EAAA,CAAA;kBALvB,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,cAEb,KAAK,EAAA,QAAA,EAAA,uWAAA,EAAA;;sBAGhB;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;;MECQ,WAAW,CAAA;+GAAX,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;gHAAX,WAAW,EAAA,YAAA,EAAA,CANhB,WAAW,CAAA,EAAA,OAAA,EAAA,CALX,YAAY;AAEZ,YAAA,cAAc,aAMd,WAAW,CAAA,EAAA,CAAA,CAAA;AAGN,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,YAXhB,YAAY;YAEZ,cAAc,CAAA,EAAA,CAAA,CAAA;;4FAST,WAAW,EAAA,UAAA,EAAA,CAAA;kBAbvB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACN,oBAAA,OAAO,EAAE;wBACL,YAAY;wBAEZ;AACH,qBAAA;AACD,oBAAA,YAAY,EAAE;wBACV;AACH,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACL;AACH;AACJ,iBAAA;;;AClBD;;AAEG;;;;"}