
/* /mail/static/src/component_hooks/use_component_to_model/use_component_to_model.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/component_hooks/use_component_to_model/use_component_to_model',async function(require){'use strict';let __exports={};const{clear}=require('@mail/model/model_field_command');const{onWillUpdateProps,useComponent}=owl.hooks;__exports.useComponentToModel=useComponentToModel;function useComponentToModel({fieldName,modelName,propNameAsRecordLocalId}){const component=useComponent();const{modelManager}=component.env.services.messaging;const record=modelManager.models[modelName].get(component.props[propNameAsRecordLocalId]);if(record){record.update({[fieldName]:component});}
onWillUpdateProps(nextProps=>{const currentRecord=modelManager.models[modelName].get(component.props[propNameAsRecordLocalId]);const nextRecord=modelManager.models[modelName].get(nextProps[propNameAsRecordLocalId]);if(currentRecord&&currentRecord!==nextRecord){currentRecord.update({[fieldName]:clear()});}
if(nextRecord){nextRecord.update({[fieldName]:component});}});const __destroy=component.__destroy;component.__destroy=parent=>{const record=modelManager.models[modelName].get(component.props[propNameAsRecordLocalId]);if(record){record.update({[fieldName]:clear()});}
__destroy.call(component,parent);};}
return __exports;});;

/* /mail/static/src/component_hooks/use_drag_visible_dropzone/use_drag_visible_dropzone.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/component_hooks/use_drag_visible_dropzone/use_drag_visible_dropzone',async function(require){'use strict';let __exports={};const{useState,onMounted,onWillUnmount}=owl.hooks;__exports.useDragVisibleDropZone=useDragVisibleDropZone;function useDragVisibleDropZone(){const isVisible=useState({value:false});let dragCount=0;onMounted(()=>{document.addEventListener('dragenter',_onDragenterListener,true);document.addEventListener('dragleave',_onDragleaveListener,true);document.addEventListener('drop',_onDropListener,true);window.addEventListener('dragover',preventDefault);window.addEventListener('drop',preventDefault);});onWillUnmount(()=>{document.removeEventListener('dragenter',_onDragenterListener,true);document.removeEventListener('dragleave',_onDragleaveListener,true);document.removeEventListener('drop',_onDropListener,true);window.removeEventListener('dragover',preventDefault);window.removeEventListener('drop',preventDefault);});function preventDefault(ev){ev.preventDefault();}
function _onDragenterListener(ev){if(dragCount===0&&ev.dataTransfer&&ev.dataTransfer.types.includes('Files')){isVisible.value=true;}
dragCount++;}
function _onDragleaveListener(ev){dragCount--;if(dragCount===0){isVisible.value=false;}}
function _onDropListener(ev){dragCount=0;isVisible.value=false;}
return isVisible;}
return __exports;});;

/* /mail/static/src/component_hooks/use_models/use_models.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/component_hooks/use_models/use_models',async function(require){'use strict';let __exports={};const{Listener}=require('@mail/model/model_listener');const{useComponent}=owl.hooks;__exports.useModels=useModels;function useModels(){const component=useComponent();const{modelManager}=component.env.services.messaging;const listener=new Listener({isLocking:false,name:`useModels() of ${component}`,onChange:()=>component.render(),});const __render=component.__render;component.__render=fiber=>{if(modelManager){modelManager.startListening(listener);}
__render.call(component,fiber);if(modelManager){modelManager.stopListening(listener);}};const __destroy=component.__destroy;component.__destroy=parent=>{if(modelManager){modelManager.removeListener(listener);}
__destroy.call(component,parent);};modelManager.messagingCreatedPromise.then(()=>{component.render();});}
return __exports;});;

/* /mail/static/src/component_hooks/use_ref_to_model/use_ref_to_model.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/component_hooks/use_ref_to_model/use_ref_to_model',async function(require){'use strict';let __exports={};const{clear}=require('@mail/model/model_field_command');const{onWillUpdateProps,useComponent,useRef}=owl.hooks;__exports.useRefToModel=useRefToModel;function useRefToModel({fieldName,modelName,propNameAsRecordLocalId,refName}){const component=useComponent();const{modelManager}=component.env.services.messaging;const record=modelManager.models[modelName].get(component.props[propNameAsRecordLocalId]);const ref=useRef(refName);if(record){record.update({[fieldName]:ref});}
onWillUpdateProps(nextProps=>{const currentRecord=modelManager.models[modelName].get(component.props[propNameAsRecordLocalId]);const nextRecord=modelManager.models[modelName].get(nextProps[propNameAsRecordLocalId]);if(currentRecord&&currentRecord!==nextRecord){currentRecord.update({[fieldName]:clear()});}
if(nextRecord){nextRecord.update({[fieldName]:ref});}});const __destroy=component.__destroy;component.__destroy=parent=>{const record=modelManager.models[modelName].get(component.props[propNameAsRecordLocalId]);if(record){record.update({[fieldName]:clear()});}
__destroy.call(component,parent);};}
return __exports;});;

/* /mail/static/src/component_hooks/use_refs/use_refs.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/component_hooks/use_refs/use_refs',async function(require){'use strict';let __exports={};const{Component}=owl;__exports.useRefs=useRefs;function useRefs(){const component=Component.current;return function(){return component.__owl__.refs||{};};}
return __exports;});;

/* /mail/static/src/component_hooks/use_rendered_values/use_rendered_values.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/component_hooks/use_rendered_values/use_rendered_values',async function(require){'use strict';let __exports={};const{Component}=owl;const{onMounted,onPatched}=owl.hooks;__exports.useRenderedValues=useRenderedValues;function useRenderedValues(selector){const component=Component.current;let renderedValues;let patchedValues;const __render=component.__render.bind(component);component.__render=function(){renderedValues=selector();return __render(...arguments);};onMounted(onUpdate);onPatched(onUpdate);function onUpdate(){patchedValues=renderedValues;}
return()=>patchedValues;}
return __exports;});;

/* /mail/static/src/component_hooks/use_should_update_based_on_props/use_should_update_based_on_props.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/component_hooks/use_should_update_based_on_props/use_should_update_based_on_props',async function(require){'use strict';let __exports={};'use strict';const{Component}=owl;const{onPatched}=owl.hooks;function isEqual(a,b,propsCompareDepth){const keys=Object.keys(a);if(Object.keys(b).length!==keys.length){return false;}
for(const key of keys){let depth;if(typeof propsCompareDepth==='number'){depth=propsCompareDepth;}else{depth=propsCompareDepth[key]||0;}
if(depth===0&&a[key]!==b[key]){return false;}
if(depth!==0){let nextDepth;if(typeof depth==='number'){nextDepth=depth-1;}else{nextDepth=depth;}
if(!isEqual(a[key],b[key],nextDepth)){return false;}}}
return true;}
__exports.useShouldUpdateBasedOnProps=useShouldUpdateBasedOnProps;function useShouldUpdateBasedOnProps({propsCompareDepth={}}={}){const component=Component.current;let forceRender=false;component.shouldUpdate=nextProps=>{if(forceRender){return true;}
const allNewProps=Object.assign({},nextProps);const defaultProps=component.constructor.defaultProps;for(const key in defaultProps){if(allNewProps[key]===undefined){allNewProps[key]=defaultProps[key];}}
forceRender=!isEqual(component.props,allNewProps,propsCompareDepth);return forceRender;};onPatched(()=>forceRender=false);}
return __exports;});;

/* /mail/static/src/component_hooks/use_update/use_update.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/component_hooks/use_update/use_update',async function(require){'use strict';let __exports={};const{Listener}=require('@mail/model/model_listener');const{onMounted,onPatched,useComponent}=owl.hooks;__exports.useUpdate=useUpdate;function useUpdate({func}){const component=useComponent();const{modelManager}=component.env.services.messaging;const listener=new Listener({isLocking:false,name:`useUpdate() of ${component}`,onChange:()=>component.render(),});function onUpdate(){if(modelManager){modelManager.startListening(listener);}
func();if(modelManager){modelManager.stopListening(listener);}}
onMounted(onUpdate);onPatched(onUpdate);const __destroy=component.__destroy;component.__destroy=parent=>{if(modelManager){modelManager.removeListener(listener);}
__destroy.call(component,parent);};}
return __exports;});;

/* /mail/static/src/component_hooks/use_update_to_model/use_update_to_model.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/component_hooks/use_update_to_model/use_update_to_model',async function(require){'use strict';let __exports={};const{useUpdate}=require('@mail/component_hooks/use_update/use_update');const{useComponent}=owl.hooks;__exports.useUpdateToModel=useUpdateToModel;function useUpdateToModel({methodName,modelName,propNameAsRecordLocalId}){const component=useComponent();useUpdate({func:()=>{const record=component.env.services.messaging.modelManager.models[modelName].get(component.props[propNameAsRecordLocalId]);if(record){record[methodName]();}}});}
return __exports;});;

/* /mail/static/src/components/activity/activity.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/activity/activity',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{auto_str_to_date,getLangDateFormat,getLangDatetimeFormat,}=require('web.time');const{Component,useState}=owl;const{useRef}=owl.hooks;const Activity=__exports.Activity=class Activity extends Component{constructor(...args){super(...args);this.state=useState({areDetailsVisible:false,});this._fileUploaderRef=useRef('fileUploader');}
get activity(){return this.messaging&&this.messaging.models['mail.activity'].get(this.props.activityLocalId);}
get assignedUserText(){return _.str.sprintf(this.env._t("for %s"),this.activity.assignee.nameOrDisplayName);}
get delayLabel(){const today=moment().startOf('day');const momentDeadlineDate=moment(auto_str_to_date(this.activity.dateDeadline));const diff=momentDeadlineDate.diff(today,'days',true);if(diff===0){return this.env._t("Today:");}else if(diff===-1){return this.env._t("Yesterday:");}else if(diff<0){return _.str.sprintf(this.env._t("%d days overdue:"),Math.abs(diff));}else if(diff===1){return this.env._t("Tomorrow:");}else{return _.str.sprintf(this.env._t("Due in %d days:"),Math.abs(diff));}}
get formattedCreateDatetime(){const momentCreateDate=moment(auto_str_to_date(this.activity.dateCreate));const datetimeFormat=getLangDatetimeFormat();return momentCreateDate.format(datetimeFormat);}
get formattedDeadlineDate(){const momentDeadlineDate=moment(auto_str_to_date(this.activity.dateDeadline));const datetimeFormat=getLangDateFormat();return momentDeadlineDate.format(datetimeFormat);}
get MARK_DONE(){return this.env._t("Mark Done");}
get summary(){return _.str.sprintf(this.env._t("“%s”"),this.activity.summary);}
async _onAttachmentCreated(ev){await this.activity.markAsDone({attachments:[ev.detail.attachment]});this.trigger('o-attachments-changed');}
_onClick(ev){if(ev.target.tagName==='A'&&ev.target.dataset.oeId&&ev.target.dataset.oeModel){this.messaging.openProfile({id:Number(ev.target.dataset.oeId),model:ev.target.dataset.oeModel,});ev.preventDefault();}}
async _onClickCancel(ev){ev.preventDefault();await this.activity.deleteServerRecord();this.trigger('reload',{keepChanges:true});}
_onClickDetailsButton(ev){ev.preventDefault();this.state.areDetailsVisible=!this.state.areDetailsVisible;}
_onClickEdit(ev){this.activity.edit();}
_onClickUploadDocument(ev){this._fileUploaderRef.comp.openBrowserFileUploader();}}
Object.assign(Activity,{props:{activityLocalId:String,},template:'mail.Activity',});registerMessagingComponent(Activity);return __exports;});;

/* /mail/static/src/components/activity_box/activity_box.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/activity_box/activity_box',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const ActivityBox=__exports.ActivityBox=class ActivityBox extends Component{get chatter(){return this.messaging.models['mail.chatter'].get(this.props.chatterLocalId);}}
Object.assign(ActivityBox,{props:{chatterLocalId:String,},template:'mail.ActivityBox',});registerMessagingComponent(ActivityBox);return __exports;});;

/* /mail/static/src/components/activity_mark_done_popover/activity_mark_done_popover.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/activity_mark_done_popover/activity_mark_done_popover',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const{useRef}=owl.hooks;const ActivityMarkDonePopover=__exports.ActivityMarkDonePopover=class ActivityMarkDonePopover extends Component{constructor(...args){super(...args);this._feedbackTextareaRef=useRef('feedbackTextarea');}
mounted(){this._feedbackTextareaRef.el.focus();if(this.activity.feedbackBackup){this._feedbackTextareaRef.el.value=this.activity.feedbackBackup;}}
get activity(){return this.messaging&&this.messaging.models['mail.activity'].get(this.props.activityLocalId);}
get DONE_AND_SCHEDULE_NEXT(){return this.env._t("Done & Schedule Next");}
_close(){this.trigger('o-popover-close');}
_onBlur(){this.activity.update({feedbackBackup:this._feedbackTextareaRef.el.value,});}
_onClickDiscard(){this._close();}
async _onClickDone(){await this.activity.markAsDone({feedback:this._feedbackTextareaRef.el.value,});this.trigger('reload',{keepChanges:true});}
async _onClickDoneAndScheduleNext(){await this.activity.markAsDoneAndScheduleNext({feedback:this._feedbackTextareaRef.el.value,});this.trigger('reload',{keepChanges:true});}
_onKeydown(ev){if(ev.key==='Escape'){this._close();}}}
Object.assign(ActivityMarkDonePopover,{props:{activityLocalId:String,},template:'mail.ActivityMarkDonePopover',});registerMessagingComponent(ActivityMarkDonePopover);return __exports;});;

/* /mail/static/src/components/attachment_box/attachment_box.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/attachment_box/attachment_box',async function(require){'use strict';let __exports={};const{useDragVisibleDropZone}=require('@mail/component_hooks/use_drag_visible_dropzone/use_drag_visible_dropzone');const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const{useRef}=owl.hooks;const AttachmentBox=__exports.AttachmentBox=class AttachmentBox extends Component{constructor(...args){super(...args);this.isDropZoneVisible=useDragVisibleDropZone();this._fileUploaderRef=useRef('fileUploader');}
get chatter(){return this.messaging&&this.messaging.models['mail.chatter'].get(this.props.chatterLocalId);}
_onAttachmentCreated(ev){this.trigger('o-attachments-changed');}
_onAttachmentRemoved(ev){this.trigger('o-attachments-changed');}
_onClickAdd(ev){ev.preventDefault();ev.stopPropagation();this._fileUploaderRef.comp.openBrowserFileUploader();}
async _onDropZoneFilesDropped(ev){ev.stopPropagation();await this._fileUploaderRef.comp.uploadFiles(ev.detail.files);this.isDropZoneVisible.value=false;}}
Object.assign(AttachmentBox,{props:{chatterLocalId:String,},template:'mail.AttachmentBox',});registerMessagingComponent(AttachmentBox);return __exports;});;

/* /mail/static/src/components/attachment_card/attachment_card.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/attachment_card/attachment_card',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{useComponentToModel}=require('@mail/component_hooks/use_component_to_model/use_component_to_model');const{Component}=owl;const AttachmentCard=__exports.AttachmentCard=class AttachmentCard extends Component{setup(){super.setup();useComponentToModel({fieldName:'component',modelName:'mail.attachment_card',propNameAsRecordLocalId:'attachmentCardLocalId'});}
get attachmentCard(){return this.messaging&&this.messaging.models['mail.attachment_card'].get(this.props.attachmentCardLocalId);}}
Object.assign(AttachmentCard,{props:{attachmentCardLocalId:String,},template:'mail.AttachmentCard',});registerMessagingComponent(AttachmentCard);return __exports;});;

/* /mail/static/src/components/attachment_delete_confirm_dialog/attachment_delete_confirm_dialog.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/attachment_delete_confirm_dialog/attachment_delete_confirm_dialog',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const Dialog=require('web.OwlDialog');const{Component}=owl;const{useRef}=owl.hooks;const AttachmentDeleteConfirmDialog=__exports.AttachmentDeleteConfirmDialog=class AttachmentDeleteConfirmDialog extends Component{constructor(...args){super(...args);this._dialogRef=useRef('dialog');}
get attachment(){return this.messaging&&this.messaging.models['mail.attachment'].get(this.props.attachmentLocalId);}
getBody(){return _.str.sprintf(this.env._t(`Do you really want to delete "%s"?`),owl.utils.escape(this.attachment.displayName));}
getTitle(){return this.env._t("Confirmation");}
_onClickCancel(){this._dialogRef.comp._close();}
async _onClickOk(){await this.attachment.remove();this._dialogRef.comp._close();this.trigger('o-attachment-removed',{attachmentLocalId:this.props.attachmentLocalId});}}
Object.assign(AttachmentDeleteConfirmDialog,{components:{Dialog},props:{attachmentLocalId:String,},template:'mail.AttachmentDeleteConfirmDialog',});registerMessagingComponent(AttachmentDeleteConfirmDialog);return __exports;});;

/* /mail/static/src/components/attachment_image/attachment_image.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/attachment_image/attachment_image',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{useComponentToModel}=require('@mail/component_hooks/use_component_to_model/use_component_to_model');const{Component}=owl;const AttachmentImage=__exports.AttachmentImage=class AttachmentImage extends Component{setup(){super.setup();useComponentToModel({fieldName:'component',modelName:'mail.attachment_image',propNameAsRecordLocalId:'attachmentImageLocalId'});}
get attachmentImage(){return this.messaging&&this.messaging.models['mail.attachment_image'].get(this.props.attachmentImageLocalId);}}
Object.assign(AttachmentImage,{props:{attachmentImageLocalId:String,},template:'mail.AttachmentImage',});registerMessagingComponent(AttachmentImage);return __exports;});;

/* /mail/static/src/components/attachment_list/attachment_list.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/attachment_list/attachment_list',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const AttachmentList=__exports.AttachmentList=class AttachmentList extends Component{get attachmentList(){return this.messaging&&this.messaging.models['mail.attachment_list'].get(this.props.attachmentListLocalId);}}
Object.assign(AttachmentList,{props:{attachmentListLocalId:String,},template:'mail.AttachmentList',});registerMessagingComponent(AttachmentList);return __exports;});;

/* /mail/static/src/components/attachment_viewer/attachment_viewer.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/attachment_viewer/attachment_viewer',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{useRefs}=require('@mail/component_hooks/use_refs/use_refs');const{link}=require('@mail/model/model_field_command');const{hidePDFJSButtons}=require('@web/legacy/js/libs/pdfjs');const{Component}=owl;const{useRef}=owl.hooks;const MIN_SCALE=0.5;const SCROLL_ZOOM_STEP=0.1;const ZOOM_STEP=0.5;const AttachmentViewer=__exports.AttachmentViewer=class AttachmentViewer extends Component{constructor(...args){super(...args);this.MIN_SCALE=MIN_SCALE;this._getRefs=useRefs();this._isDragging=false;this._zoomerRef=useRef('zoomer');this._iframeViewerPdfRef=useRef('iframeViewerPdf');this._translate={x:0,y:0,dx:0,dy:0};this._onClickGlobal=this._onClickGlobal.bind(this);}
mounted(){this.el.focus();this._handleImageLoad();this._hideUnwantedPdfJsButtons();document.addEventListener('click',this._onClickGlobal);}
patched(){this._handleImageLoad();this._hideUnwantedPdfJsButtons();}
willUnmount(){document.removeEventListener('click',this._onClickGlobal);}
get attachmentViewer(){return this.messaging&&this.messaging.models['mail.attachment_viewer'].get(this.props.localId);}
get imageStyle(){const attachmentViewer=this.attachmentViewer;let style=`transform: `+`scale3d(${attachmentViewer.scale}, ${attachmentViewer.scale}, 1) `+`rotate(${attachmentViewer.angle}deg);`;if(attachmentViewer.angle%180!==0){style+=``+`max-height: ${window.innerWidth}px; `+`max-width: ${window.innerHeight}px;`;}else{style+=``+`max-height: 100%; `+`max-width: 100%;`;}
return style;}
isCloseable(){return!this._isDragging;}
_close(){this.attachmentViewer.close();}
_download(){this.attachmentViewer.attachment.download();}
_handleImageLoad(){if(!this.attachmentViewer||!this.attachmentViewer.attachment){return;}
const refs=this._getRefs();const image=refs[`image_${this.attachmentViewer.attachment.id}`];if(this.attachmentViewer.attachment.isImage&&(!image||!image.complete)){this.attachmentViewer.update({isImageLoading:true});}}
_hideUnwantedPdfJsButtons(){if(this._iframeViewerPdfRef.el){hidePDFJSButtons(this._iframeViewerPdfRef.el);}}
_next(){const attachmentViewer=this.attachmentViewer;const index=attachmentViewer.attachments.findIndex(attachment=>attachment===attachmentViewer.attachment);const nextIndex=(index+1)%attachmentViewer.attachments.length;attachmentViewer.update({attachment:link(attachmentViewer.attachments[nextIndex]),});}
_previous(){const attachmentViewer=this.attachmentViewer;const index=attachmentViewer.attachments.findIndex(attachment=>attachment===attachmentViewer.attachment);const nextIndex=index===0?attachmentViewer.attachments.length-1:index-1;attachmentViewer.update({attachment:link(attachmentViewer.attachments[nextIndex]),});}
_print(){const printWindow=window.open('about:blank','_new');printWindow.document.open();printWindow.document.write(`
            <html>
                <head>
                    <script>
                        function onloadImage() {
                            setTimeout('printImage()', 10);
                        }
                        function printImage() {
                            window.print();
                            window.close();
                        }
                    </script>
                </head>
                <body onload='onloadImage()'>
                    <img src="${this.attachmentViewer.imageUrl}" alt=""/>
                </body>
            </html>`);printWindow.document.close();}
_rotate(){this.attachmentViewer.update({angle:this.attachmentViewer.angle+90});}
_stopDragging(){this._isDragging=false;this._translate.x+=this._translate.dx;this._translate.y+=this._translate.dy;this._translate.dx=0;this._translate.dy=0;this._updateZoomerStyle();}
_updateZoomerStyle(){const attachmentViewer=this.attachmentViewer;const refs=this._getRefs();const image=refs[`image_${this.attachmentViewer.attachment.id}`];const tx=image.offsetWidth*attachmentViewer.scale>this._zoomerRef.el.offsetWidth?this._translate.x+this._translate.dx:0;const ty=image.offsetHeight*attachmentViewer.scale>this._zoomerRef.el.offsetHeight?this._translate.y+this._translate.dy:0;if(tx===0){this._translate.x=0;}
if(ty===0){this._translate.y=0;}
this._zoomerRef.el.style=`transform: `+`translate(${tx}px, ${ty}px)`;}
_zoomIn({scroll=false}={}){this.attachmentViewer.update({scale:this.attachmentViewer.scale+(scroll?SCROLL_ZOOM_STEP:ZOOM_STEP),});this._updateZoomerStyle();}
_zoomOut({scroll=false}={}){if(this.attachmentViewer.scale===MIN_SCALE){return;}
const unflooredAdaptedScale=(this.attachmentViewer.scale-
(scroll?SCROLL_ZOOM_STEP:ZOOM_STEP));this.attachmentViewer.update({scale:Math.max(MIN_SCALE,unflooredAdaptedScale),});this._updateZoomerStyle();}
_zoomReset(){this.attachmentViewer.update({scale:1});this._updateZoomerStyle();}
_onClick(ev){if(this._isDragging){return;}
this._close();}
_onClickClose(ev){this._close();}
_onClickDownload(ev){ev.stopPropagation();this._download();}
_onClickGlobal(ev){if(!this._isDragging){return;}
ev.stopPropagation();this._stopDragging();}
_onClickHeader(ev){ev.stopPropagation();}
_onClickImage(ev){if(this._isDragging){return;}
ev.stopPropagation();}
_onClickNext(ev){ev.stopPropagation();this._next();}
_onClickPrevious(ev){ev.stopPropagation();this._previous();}
_onClickPrint(ev){ev.stopPropagation();this._print();}
_onClickRotate(ev){ev.stopPropagation();this._rotate();}
_onClickVideo(ev){ev.stopPropagation();}
_onClickZoomIn(ev){ev.stopPropagation();this._zoomIn();}
_onClickZoomOut(ev){ev.stopPropagation();this._zoomOut();}
_onClickZoomReset(ev){ev.stopPropagation();this._zoomReset();}
_onKeydown(ev){switch(ev.key){case'ArrowRight':this._next();break;case'ArrowLeft':this._previous();break;case'Escape':this._close();break;case'q':this._close();break;case'r':this._rotate();break;case'+':this._zoomIn();break;case'-':this._zoomOut();break;case'0':this._zoomReset();break;default:return;}
ev.stopPropagation();}
_onLoadImage(ev){ev.stopPropagation();this.attachmentViewer.update({isImageLoading:false});}
_onMousedownImage(ev){if(this._isDragging){return;}
if(ev.button!==0){return;}
ev.stopPropagation();this._isDragging=true;this._dragstartX=ev.clientX;this._dragstartY=ev.clientY;}
_onMousemoveView(ev){if(!this._isDragging){return;}
this._translate.dx=ev.clientX-this._dragstartX;this._translate.dy=ev.clientY-this._dragstartY;this._updateZoomerStyle();}
_onWheelImage(ev){ev.stopPropagation();if(!this.el){return;}
if(ev.deltaY>0){this._zoomOut({scroll:true});}else{this._zoomIn({scroll:true});}}}
Object.assign(AttachmentViewer,{props:{localId:String,},template:'mail.AttachmentViewer',});registerMessagingComponent(AttachmentViewer);return __exports;});;

/* /mail/static/src/components/autocomplete_input/autocomplete_input.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/autocomplete_input/autocomplete_input',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const AutocompleteInput=__exports.AutocompleteInput=class AutocompleteInput extends Component{mounted(){if(this.props.isFocusOnMount){this.el.focus();}
let args={autoFocus:true,select:(ev,ui)=>this._onAutocompleteSelect(ev,ui),source:(req,res)=>this._onAutocompleteSource(req,res),focus:ev=>this._onAutocompleteFocus(ev),html:this.props.isHtml||false,};if(this.props.customClass){args.classes={'ui-autocomplete':this.props.customClass};}
const autoCompleteElem=$(this.el).autocomplete(args);autoCompleteElem.data("ui-autocomplete")._resizeMenu=function(){const ul=this.menu.element;ul.outerWidth(this.element.outerWidth());};}
willUnmount(){$(this.el).autocomplete('destroy');}
contains(node){if(!this.el){return false;}
if(this.el.contains(node)){return true;}
if(!this.props.customClass){return false;}
const element=document.querySelector(`.${this.props.customClass}`);if(!element){return false;}
return element.contains(node);}
focus(){if(!this.el){return;}
this.el.focus();}
_onAutocompleteFocus(ev){if(this.props.focus){this.props.focus(ev);}else{ev.preventDefault();}}
_onAutocompleteSelect(ev,ui){if(this.props.select){this.props.select(ev,ui);}}
_onAutocompleteSource(req,res){if(this.props.source){this.props.source(req,res);}}
_onBlur(ev){this.trigger('o-hide');}
_onKeydown(ev){if(ev.key==='Escape'){this.trigger('o-hide');}}}
Object.assign(AutocompleteInput,{defaultProps:{isFocusOnMount:false,isHtml:false,placeholder:'',},props:{customClass:{type:String,optional:true,},focus:{type:Function,optional:true,},isFocusOnMount:Boolean,isHtml:Boolean,placeholder:String,select:{type:Function,optional:true,},source:{type:Function,optional:true,},},template:'mail.AutocompleteInput',});registerMessagingComponent(AutocompleteInput);return __exports;});;

/* /mail/static/src/components/channel_invitation_form/channel_invitation_form.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/channel_invitation_form/channel_invitation_form',async function(require){'use strict';let __exports={};const{useComponentToModel}=require('@mail/component_hooks/use_component_to_model/use_component_to_model');const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{useRefToModel}=require('@mail/component_hooks/use_ref_to_model/use_ref_to_model');const{useUpdateToModel}=require('@mail/component_hooks/use_update_to_model/use_update_to_model');const{Component}=owl;const ChannelInvitationForm=__exports.ChannelInvitationForm=class ChannelInvitationForm extends Component{setup(){super.setup();useComponentToModel({fieldName:'component',modelName:'mail.channel_invitation_form',propNameAsRecordLocalId:'localId'});useRefToModel({fieldName:'searchInputRef',modelName:'mail.channel_invitation_form',propNameAsRecordLocalId:'localId',refName:'searchInput'});useUpdateToModel({methodName:'onComponentUpdate',modelName:'mail.channel_invitation_form',propNameAsRecordLocalId:'localId'});}
get channelInvitationForm(){return this.messaging&&this.messaging.models['mail.channel_invitation_form'].get(this.props.localId);}}
Object.assign(ChannelInvitationForm,{props:{localId:{type:String,},},template:'mail.ChannelInvitationForm',});registerMessagingComponent(ChannelInvitationForm);return __exports;});;

/* /mail/static/src/components/channel_member_list/channel_member_list.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/channel_member_list/channel_member_list',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const ChannelMemberList=__exports.ChannelMemberList=class ChannelMemberList extends Component{get channel(){return this.messaging.models['mail.thread'].get(this.props.channelLocalId);}}
Object.assign(ChannelMemberList,{props:{channelLocalId:String,},template:'mail.ChannelMemberList',});registerMessagingComponent(ChannelMemberList);return __exports;});;

/* /mail/static/src/components/chat_window/chat_window.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/chat_window/chat_window',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{useUpdate}=require('@mail/component_hooks/use_update/use_update');const{isEventHandled}=require('@mail/utils/utils');const{Component}=owl;const{useRef}=owl.hooks;const ChatWindow=__exports.ChatWindow=class ChatWindow extends Component{constructor(...args){super(...args);useUpdate({func:()=>this._update()});this._chatWindowHeaderRef=useRef('header');this._inputRef=useRef('input');this._threadRef=useRef('thread');this._onAutocompleteSelect=this._onAutocompleteSelect.bind(this);this._onAutocompleteSource=this._onAutocompleteSource.bind(this);this._constructor(...args);}
_constructor(){}
get chatWindow(){return this.messaging&&this.messaging.models['mail.chat_window'].get(this.props.chatWindowLocalId);}
get newMessageFormInputPlaceholder(){return this.env._t("Search user...");}
_applyVisibleOffset(){const textDirection=this.messaging.locale.textDirection;const offsetFrom=textDirection==='rtl'?'left':'right';const oppositeFrom=offsetFrom==='right'?'left':'right';this.el.style[offsetFrom]=this.chatWindow.visibleOffset+'px';this.el.style[oppositeFrom]='auto';}
_saveThreadScrollTop(){if(!this._threadRef.comp||!this.chatWindow||!this.chatWindow.threadViewer){return;}
if(this.chatWindow.threadViewer.threadView&&this.chatWindow.threadViewer.threadView.componentHintList.length>0){return;}
this.chatWindow.threadViewer.saveThreadCacheScrollHeightAsInitial(this._threadRef.comp.getScrollHeight());this.chatWindow.threadViewer.saveThreadCacheScrollPositionsAsInitial(this._threadRef.comp.getScrollTop());}
_update(){if(!this.chatWindow){return;}
if(this.chatWindow.isDoFocus){this.chatWindow.update({isDoFocus:false});if(this._inputRef.comp){this._inputRef.comp.focus();}}
this._applyVisibleOffset();}
async _onAutocompleteSelect(ev,ui){const chat=await this.messaging.getChat({partnerId:ui.item.id});if(!chat){return;}
this.messaging.chatWindowManager.openThread(chat,{makeActive:true,replaceNewMessage:true,});}
_onAutocompleteSource(req,res){this.messaging.models['mail.partner'].imSearch({callback:(partners)=>{const suggestions=partners.map(partner=>{return{id:partner.id,value:partner.nameOrDisplayName,label:partner.nameOrDisplayName,};});res(_.sortBy(suggestions,'label'));},keyword:_.escape(req.term),limit:10,});}
_onClickedHeader(ev){ev.stopPropagation();if(this.messaging.device.isMobile){return;}
if(this.chatWindow.isFolded){this.chatWindow.unfold();this.chatWindow.focus();}else{this._saveThreadScrollTop();this.chatWindow.fold();}}
_onFocusinThread(ev){ev.stopPropagation();if(!this.chatWindow){return;}
this.chatWindow.update({isFocused:true});}
_onFocusout(){if(!this.chatWindow){return;}
this.chatWindow.update({isFocused:false});}
_onKeydown(ev){if(!this.chatWindow){return;}
switch(ev.key){case'Tab':ev.preventDefault();if(ev.shiftKey){this.chatWindow.focusPreviousVisibleUnfoldedChatWindow();}else{this.chatWindow.focusNextVisibleUnfoldedChatWindow();}
break;case'Escape':if(isEventHandled(ev,'ComposerTextInput.closeSuggestions')){break;}
if(isEventHandled(ev,'Composer.closeEmojisPopover')){break;}
ev.preventDefault();this.chatWindow.focusNextVisibleUnfoldedChatWindow();this.chatWindow.close();break;}}}
Object.assign(ChatWindow,{defaultProps:{hasCloseAsBackButton:false,isExpandable:false,isFullscreen:false,},props:{chatWindowLocalId:String,hasCloseAsBackButton:Boolean,isExpandable:Boolean,isFullscreen:Boolean,},template:'mail.ChatWindow',});registerMessagingComponent(ChatWindow);return __exports;});;

/* /mail/static/src/components/chat_window_header/chat_window_header.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/chat_window_header/chat_window_header',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{isEventHandled,markEventHandled,}=require('@mail/utils/utils');const{Component}=owl;const ChatWindowHeader=__exports.ChatWindowHeader=class ChatWindowHeader extends Component{get chatWindow(){return this.messaging&&this.messaging.models['mail.chat_window'].get(this.props.chatWindowLocalId);}
get shiftNextText(){if(this.messaging.locale.textDirection==='rtl'){return this.env._t("Shift left");}
return this.env._t("Shift right");}
get shiftPrevText(){if(this.messaging.locale.textDirection==='rtl'){return this.env._t("Shift right");}
return this.env._t("Shift left");}
_onClick(ev){if(isEventHandled(ev,'ChatWindow.onClickCommand')||isEventHandled(ev,'ChatWindowHeader.ClickShiftNext')||isEventHandled(ev,'ChatWindowHeader.ClickShiftPrev')||isEventHandled(ev,'ChatWindow.onClickHideMemberList')||isEventHandled(ev,'ChatWindow.onClickShowMemberList')){return;}
const chatWindow=this.chatWindow;this.trigger('o-clicked',{chatWindow});}
_onClickClose(ev){ev.stopPropagation();if(!this.chatWindow){return;}
this.chatWindow.close();}
async _onClickCamera(ev){ev.stopPropagation();if(this.chatWindow.thread.hasPendingRtcRequest){return;}
await this.chatWindow.thread.toggleCall({startWithVideo:true});}
async _onClickPhone(ev){ev.stopPropagation();if(this.chatWindow.thread.hasPendingRtcRequest){return;}
await this.chatWindow.thread.toggleCall();}
_onClickExpand(ev){ev.stopPropagation();this.chatWindow.expand();}
_onClickShiftPrev(ev){markEventHandled(ev,'ChatWindowHeader.ClickShiftPrev');this.chatWindow.shiftPrev();}
_onClickShiftNext(ev){markEventHandled(ev,'ChatWindowHeader.ClickShiftNext');this.chatWindow.shiftNext();}}
Object.assign(ChatWindowHeader,{defaultProps:{hasCloseAsBackButton:false,isExpandable:false,},props:{chatWindowLocalId:String,hasCloseAsBackButton:Boolean,isExpandable:Boolean,},template:'mail.ChatWindowHeader',});registerMessagingComponent(ChatWindowHeader);return __exports;});;

/* /mail/static/src/components/chat_window_hidden_menu/chat_window_hidden_menu.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/chat_window_hidden_menu/chat_window_hidden_menu',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const{useRef}=owl.hooks;const ChatWindowHiddenMenu=__exports.ChatWindowHiddenMenu=class ChatWindowHiddenMenu extends Component{constructor(...args){super(...args);this._onClickCaptureGlobal=this._onClickCaptureGlobal.bind(this);this._listRef=useRef('list');this._wasMenuOpen;}
mounted(){this._apply();document.addEventListener('click',this._onClickCaptureGlobal,true);}
patched(){this._apply();}
willUnmount(){document.removeEventListener('click',this._onClickCaptureGlobal,true);}
_apply(){if(!this.messaging){return;}
this._applyListHeight();this._applyOffset();this._wasMenuOpen=this.messaging.chatWindowManager.isHiddenMenuOpen;}
_applyListHeight(){const device=this.messaging.device;const height=device.globalWindowInnerHeight/2;this._listRef.el.style['max-height']=`${height}px`;}
_applyOffset(){const textDirection=this.messaging.locale.textDirection;const offsetFrom=textDirection==='rtl'?'left':'right';const oppositeFrom=offsetFrom==='right'?'left':'right';const offset=this.messaging.chatWindowManager.visual.hidden.offset;this.el.style[offsetFrom]=`${offset}px`;this.el.style[oppositeFrom]='auto';}
_onClickCaptureGlobal(ev){if(!this.el||this.el.contains(ev.target)){return;}
this.messaging.chatWindowManager.closeHiddenMenu();}
_onClickToggle(ev){if(this._wasMenuOpen){this.messaging.chatWindowManager.closeHiddenMenu();}else{this.messaging.chatWindowManager.openHiddenMenu();}}
_onClickedChatWindow(ev){const chatWindow=ev.detail.chatWindow;chatWindow.makeActive();this.messaging.chatWindowManager.closeHiddenMenu();}}
Object.assign(ChatWindowHiddenMenu,{props:{},template:'mail.ChatWindowHiddenMenu',});registerMessagingComponent(ChatWindowHiddenMenu);return __exports;});;

/* /mail/static/src/components/chat_window_manager/chat_window_manager.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/chat_window_manager/chat_window_manager',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const ChatWindowManager=__exports.ChatWindowManager=class ChatWindowManager extends Component{}
Object.assign(ChatWindowManager,{props:{},template:'mail.ChatWindowManager',});registerMessagingComponent(ChatWindowManager);return __exports;});;

/* /mail/static/src/components/chatter/chatter.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/chatter/chatter',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{useUpdate}=require('@mail/component_hooks/use_update/use_update');const{useComponentToModel}=require('@mail/component_hooks/use_component_to_model/use_component_to_model');const{useRefToModel}=require('@mail/component_hooks/use_ref_to_model/use_ref_to_model');const{Component}=owl;const{useRef}=owl.hooks;const Chatter=__exports.Chatter=class Chatter extends Component{constructor(...args){super(...args);useUpdate({func:()=>this._update()});useComponentToModel({fieldName:'component',modelName:'mail.chatter',propNameAsRecordLocalId:'chatterLocalId'});useRefToModel({fieldName:'threadRef',modelName:'mail.chatter',propNameAsRecordLocalId:'chatterLocalId',refName:'thread'});this._scrollPanelRef=useRef('scrollPanel');this.getScrollableElement=this.getScrollableElement.bind(this);}
get chatter(){return this.messaging&&this.messaging.models['mail.chatter'].get(this.props.chatterLocalId);}
getScrollableElement(){if(!this._scrollPanelRef.el){return;}
return this._scrollPanelRef.el;}
_notifyRendered(){this.trigger('o-chatter-rendered',{attachments:this.chatter.thread.allAttachments,thread:this.chatter.thread.localId,});}
_update(){if(!this.chatter){return;}
if(this.chatter.thread){this._notifyRendered();}}}
Object.assign(Chatter,{props:{chatterLocalId:String,},template:'mail.Chatter',});registerMessagingComponent(Chatter);return __exports;});;

/* /mail/static/src/components/chatter_container/chatter_container.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/chatter_container/chatter_container',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{clear}=require('@mail/model/model_field_command');const{Component}=owl;const getChatterNextTemporaryId=(function(){let tmpId=0;return()=>{tmpId+=1;return tmpId;};})();const ChatterContainer=__exports.ChatterContainer=class ChatterContainer extends Component{constructor(...args){super(...args);this.chatter=undefined;this.chatterId=getChatterNextTemporaryId();this._insertFromProps(this.props);}
willUpdateProps(nextProps){this._insertFromProps(nextProps);return super.willUpdateProps(...arguments);}
destroy(){super.destroy();if(this.chatter){this.chatter.delete();}}
async _insertFromProps(props){const messaging=await this.env.services.messaging.get();if(this.__owl__.status===5){return;}
const values={id:this.chatterId,...props};if(values.threadId===undefined){values.threadId=clear();}
this.chatter=messaging.models['mail.chatter'].insert(values);this.chatter.refresh();this.render();}}
Object.assign(ChatterContainer,{props:{hasActivities:{type:Boolean,optional:true,},hasExternalBorder:{type:Boolean,optional:true,},hasFollowers:{type:Boolean,optional:true,},hasMessageList:{type:Boolean,optional:true,},hasMessageListScrollAdjust:{type:Boolean,optional:true,},hasTopbarCloseButton:{type:Boolean,optional:true,},isAttachmentBoxVisibleInitially:{type:Boolean,optional:true,},threadId:{type:Number,optional:true,},threadModel:String,},template:'mail.ChatterContainer',});registerMessagingComponent(ChatterContainer);return __exports;});;

/* /mail/static/src/components/chatter_topbar/chatter_topbar.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/chatter_topbar/chatter_topbar',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{useComponentToModel}=require('@mail/component_hooks/use_component_to_model/use_component_to_model');const{Component}=owl;const ChatterTopbar=__exports.ChatterTopbar=class ChatterTopbar extends Component{setup(){super.setup();useComponentToModel({fieldName:'componentChatterTopbar',modelName:'mail.chatter',propNameAsRecordLocalId:'chatterLocalId'});}
get chatter(){return this.messaging&&this.messaging.models['mail.chatter'].get(this.props.chatterLocalId);}}
Object.assign(ChatterTopbar,{props:{chatterLocalId:String,},template:'mail.ChatterTopbar',});registerMessagingComponent(ChatterTopbar);return __exports;});;

/* /mail/static/src/components/composer/composer.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/composer/composer',async function(require){'use strict';let __exports={};const{useDragVisibleDropZone}=require('@mail/component_hooks/use_drag_visible_dropzone/use_drag_visible_dropzone');const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{isEventHandled,markEventHandled,}=require('@mail/utils/utils');const{Component}=owl;const{useRef}=owl.hooks;const Composer=__exports.Composer=class Composer extends Component{constructor(...args){super(...args);this.isDropZoneVisible=useDragVisibleDropZone();this._emojisPopoverRef=useRef('emojisPopover');this._fileUploaderRef=useRef('fileUploader');this._textInputRef=useRef('textInput');this._onClickCaptureGlobal=this._onClickCaptureGlobal.bind(this);}
mounted(){document.addEventListener('click',this._onClickCaptureGlobal,true);}
willUnmount(){document.removeEventListener('click',this._onClickCaptureGlobal,true);}
get composerView(){return this.messaging&&this.messaging.models['mail.composer_view'].get(this.props.composerViewLocalId);}
contains(node){const emojisPopover=this._emojisPopoverRef.comp;if(emojisPopover&&emojisPopover.contains(node)){return true;}
return Boolean(this.el&&this.el.contains(node));}
get currentPartnerAvatar(){const avatar=this.messaging.currentUser?this.env.session.url('/web/image',{field:'avatar_128',id:this.messaging.currentUser.id,model:'res.users',}):'/web/static/img/user_menu_avatar.png';return avatar;}
get hasFooter(){if(!this.composerView){return false;}
return(this.props.hasThreadTyping||this.composerView.composer.attachments.length>0||this.composerView.messageViewInEditing||!this.props.isCompact);}
get hasHeader(){if(!this.composerView){return false;}
return((this.props.hasThreadName&&this.composerView.composer.thread)||(this.props.hasFollowers&&!this.composerView.composer.isLog)||this.composerView.threadView&&this.composerView.threadView.replyingToMessageView);}
_postMessage(){if(!this.composerView.composer.canPostMessage){if(this.composerView.composer.hasUploadingAttachment){this.env.services['notification'].notify({message:this.env._t("Please wait while the file is uploading."),type:'warning',});}
return;}
if(this.composerView.messageViewInEditing){this.composerView.updateMessage();return;}
this.composerView.postMessage();}
_onClickAddAttachment(){this._fileUploaderRef.comp.openBrowserFileUploader();if(!this.messaging.device.isMobileDevice){this.composerView.update({doFocus:true});}}
async _onClickCaptureGlobal(ev){if(this.contains(ev.target)){return;}
await new Promise(this.env.browser.setTimeout);if(isEventHandled(ev,'MessageActionList.replyTo')){return;}
if(!this.composerView){return;}
this.composerView.discard();}
_onClickFullComposer(){this.composerView.openFullComposer();}
_onClickDiscard(ev){this.composerView.discard();}
_onClickSend(){this._postMessage();this.composerView.update({doFocus:true});}
_onComposerTextInputSendShortcut(){this._postMessage();}
async _onDropZoneFilesDropped(ev){ev.stopPropagation();await this._fileUploaderRef.comp.uploadFiles(ev.detail.files);this.isDropZoneVisible.value=false;}
_onEmojiSelection(ev){ev.stopPropagation();this._textInputRef.comp.saveStateInStore();this.composerView.insertIntoTextInput(ev.detail.unicode);if(!this.messaging.device.isMobileDevice){this.composerView.update({doFocus:true});}}
_onKeydown(ev){if(ev.key==='Escape'){if(isEventHandled(ev,'ComposerTextInput.closeSuggestions')){return;}
if(isEventHandled(ev,'Composer.closeEmojisPopover')){return;}
ev.preventDefault();this.composerView.discard();}}
_onKeydownEmojiButton(ev){if(ev.key==='Escape'){if(this._emojisPopoverRef.comp){this._emojisPopoverRef.comp.close();this.composerView.update({doFocus:true});markEventHandled(ev,'Composer.closeEmojisPopover');}}}
async _onPasteTextInput(ev){if(!ev.clipboardData||!ev.clipboardData.files){return;}
await this._fileUploaderRef.comp.uploadFiles(ev.clipboardData.files);}}
Object.assign(Composer,{defaultProps:{hasCurrentPartnerAvatar:true,hasDiscardButton:false,hasFollowers:false,hasSendButton:true,hasThreadName:false,hasThreadTyping:false,isCompact:true,isExpandable:false,},props:{composerViewLocalId:String,hasCurrentPartnerAvatar:Boolean,hasDiscardButton:Boolean,hasFollowers:Boolean,hasMentionSuggestionsBelowPosition:{type:Boolean,optional:true,},hasSendButton:Boolean,hasThreadName:Boolean,hasThreadTyping:Boolean,showAttachmentsExtensions:{type:Boolean,optional:true,},showAttachmentsFilenames:{type:Boolean,optional:true,},isCompact:Boolean,isExpandable:Boolean,textInputSendShortcuts:{type:Array,element:String,optional:true,},},template:'mail.Composer',});registerMessagingComponent(Composer,{propsCompareDepth:{textInputSendShortcuts:1}});return __exports;});;

/* /mail/static/src/components/composer_suggested_recipient_list/composer_suggested_recipient_list.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/composer_suggested_recipient_list/composer_suggested_recipient_list',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const{useState}=owl.hooks;const ComposerSuggestedRecipientList=__exports.ComposerSuggestedRecipientList=class ComposerSuggestedRecipientList extends Component{constructor(...args){super(...args);this.state=useState({hasShowMoreButton:false,});}
get thread(){return this.messaging&&this.messaging.models['mail.thread'].get(this.props.threadLocalId);}
_onClickShowLess(ev){this.state.hasShowMoreButton=false;}
_onClickShowMore(ev){this.state.hasShowMoreButton=true;}}
Object.assign(ComposerSuggestedRecipientList,{props:{threadLocalId:String,},template:'mail.ComposerSuggestedRecipientList',});registerMessagingComponent(ComposerSuggestedRecipientList);return __exports;});;

/* /mail/static/src/components/composer_suggestion/composer_suggestion.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/composer_suggestion/composer_suggestion',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{useUpdate}=require('@mail/component_hooks/use_update/use_update');const{link}=require('@mail/model/model_field_command');const{Component}=owl;const ComposerSuggestion=__exports.ComposerSuggestion=class ComposerSuggestion extends Component{constructor(...args){super(...args);useUpdate({func:()=>this._update()});}
get composerView(){return this.messaging&&this.messaging.models['mail.composer_view'].get(this.props.composerViewLocalId);}
get isCannedResponse(){return this.props.modelName==="mail.canned_response";}
get isChannel(){return this.props.modelName==="mail.thread";}
get isCommand(){return this.props.modelName==="mail.channel_command";}
get isPartner(){return this.props.modelName==="mail.partner";}
get record(){return this.messaging&&this.messaging.models[this.props.modelName].get(this.props.recordLocalId);}
title(){if(this.isCannedResponse){return _.str.sprintf("%s: %s",this.record.source,this.record.substitution);}
if(this.isChannel){return this.record.name;}
if(this.isCommand){return _.str.sprintf("%s: %s",this.record.name,this.record.help);}
if(this.isPartner){if(this.record.email){return _.str.sprintf("%s (%s)",this.record.nameOrDisplayName,this.record.email);}
return this.record.nameOrDisplayName;}
return"";}
_update(){if(this.composerView&&this.composerView.hasToScrollToActiveSuggestion&&this.props.isActive){this.el.scrollIntoView({block:'center',});this.composerView.update({hasToScrollToActiveSuggestion:false});}}
_onClick(ev){ev.preventDefault();this.composerView.update({activeSuggestedRecord:link(this.record)});this.composerView.insertSuggestion();this.composerView.closeSuggestions();this.composerView.update({doFocus:true});}}
Object.assign(ComposerSuggestion,{defaultProps:{isActive:false,},props:{composerViewLocalId:String,isActive:Boolean,modelName:String,recordLocalId:String,},template:'mail.ComposerSuggestion',});registerMessagingComponent(ComposerSuggestion);return __exports;});;

/* /mail/static/src/components/composer_suggestion_list/composer_suggestion_list.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/composer_suggestion_list/composer_suggestion_list',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const ComposerSuggestionList=__exports.ComposerSuggestionList=class ComposerSuggestionList extends Component{get composerView(){return this.messaging&&this.messaging.models['mail.composer_view'].get(this.props.composerViewLocalId);}}
Object.assign(ComposerSuggestionList,{defaultProps:{isBelow:false,},props:{composerViewLocalId:String,isBelow:Boolean,},template:'mail.ComposerSuggestionList',});registerMessagingComponent(ComposerSuggestionList);return __exports;});;

/* /mail/static/src/components/composer_text_input/composer_text_input.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/composer_text_input/composer_text_input',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{useUpdate}=require('@mail/component_hooks/use_update/use_update');const{markEventHandled}=require('@mail/utils/utils');const{Component}=owl;const{useRef}=owl.hooks;const ComposerTextInput=__exports.ComposerTextInput=class ComposerTextInput extends Component{constructor(...args){super(...args);useUpdate({func:()=>this._update()});this._textareaLastInputValue="";this._textareaRef=useRef('textarea');this._mirroredTextareaRef=useRef('mirroredTextarea');}
get composerView(){return this.messaging&&this.messaging.models['mail.composer_view'].get(this.props.composerViewLocalId);}
get textareaPlaceholder(){if(!this.composerView){return"";}
if(!this.composerView.composer.thread){return"";}
if(this.composerView.composer.thread.model==='mail.channel'){if(this.composerView.composer.thread.correspondent){return _.str.sprintf(this.env._t("Message %s..."),this.composerView.composer.thread.correspondent.nameOrDisplayName);}
return _.str.sprintf(this.env._t("Message #%s..."),this.composerView.composer.thread.displayName);}
if(this.composerView.composer.isLog){return this.env._t("Log an internal note...");}
return this.env._t("Send a message to followers...");}
saveStateInStore(){this.composerView.composer.update({textInputContent:this._getContent(),textInputCursorEnd:this._getSelectionEnd(),textInputCursorStart:this._getSelectionStart(),textInputSelectionDirection:this._textareaRef.el.selectionDirection,});}
_getContent(){return this._textareaRef.el.value;}
_getSelectionEnd(){return this._textareaRef.el.selectionEnd;}
_getSelectionStart(){return this._textareaRef.el.selectionStart;}
_isEmpty(){return this._getContent()==="";}
_update(){if(!this.composerView){return;}
if(this.composerView.doFocus){this.composerView.update({doFocus:false});if(this.messaging.device.isMobile){this.el.scrollIntoView();}
this._textareaRef.el.focus();}
if(this.composerView.composer.isLastStateChangeProgrammatic){this._textareaRef.el.value=this.composerView.composer.textInputContent;if(this.composerView.hasFocus){this._textareaRef.el.setSelectionRange(this.composerView.composer.textInputCursorStart,this.composerView.composer.textInputCursorEnd,this.composerView.composer.textInputSelectionDirection,);}
this.composerView.composer.update({isLastStateChangeProgrammatic:false});}
this._updateHeight();}
_updateHeight(){this._mirroredTextareaRef.el.value=this.composerView.composer.textInputContent;this._textareaRef.el.style.height=(this._mirroredTextareaRef.el.scrollHeight)+"px";}
_onClickTextarea(){if(!this.composerView){return;}
this.saveStateInStore();}
_onFocusinTextarea(){if(!this.composerView){return;}
this.composerView.update({hasFocus:true});}
_onFocusoutTextarea(){if(!this.composerView){return;}
this.saveStateInStore();this.composerView.update({hasFocus:false});}
_onInputTextarea(){if(!this.composerView){return;}
this.saveStateInStore();if(this._textareaLastInputValue!==this._textareaRef.el.value){this.composerView.handleCurrentPartnerIsTyping();}
this._textareaLastInputValue=this._textareaRef.el.value;this._updateHeight();}
_onKeydownTextarea(ev){if(!this.composerView){return;}
switch(ev.key){case'Escape':if(this.composerView.hasSuggestions){ev.preventDefault();this.composerView.closeSuggestions();markEventHandled(ev,'ComposerTextInput.closeSuggestions');}
break;case'ArrowUp':case'PageUp':case'ArrowDown':case'PageDown':case'Home':case'End':case'Tab':if(this.composerView.hasSuggestions){ev.preventDefault();}
break;case'Enter':this._onKeydownTextareaEnter(ev);break;}}
_onKeydownTextareaEnter(ev){if(!this.composerView){return;}
if(this.composerView.hasSuggestions){ev.preventDefault();return;}
if(this.props.sendShortcuts.includes('ctrl-enter')&&!ev.altKey&&ev.ctrlKey&&!ev.metaKey&&!ev.shiftKey){this.trigger('o-composer-text-input-send-shortcut');ev.preventDefault();return;}
if(this.props.sendShortcuts.includes('enter')&&!ev.altKey&&!ev.ctrlKey&&!ev.metaKey&&!ev.shiftKey){this.trigger('o-composer-text-input-send-shortcut');ev.preventDefault();return;}
if(this.props.sendShortcuts.includes('meta-enter')&&!ev.altKey&&!ev.ctrlKey&&ev.metaKey&&!ev.shiftKey){this.trigger('o-composer-text-input-send-shortcut');ev.preventDefault();return;}}
_onKeyupTextarea(ev){if(!this.composerView){return;}
switch(ev.key){case'Escape':break;case'Enter':if(this.composerView.hasSuggestions){this.composerView.insertSuggestion();this.composerView.closeSuggestions();this.composerView.update({doFocus:true});}
break;case'ArrowUp':case'PageUp':if(ev.key==='ArrowUp'&&!this.composerView.hasSuggestions&&!this.composerView.composer.textInputContent&&this.composerView.threadView){this.composerView.threadView.startEditingLastMessageFromCurrentUser();break;}
if(this.composerView.hasSuggestions){this.composerView.setPreviousSuggestionActive();this.composerView.update({hasToScrollToActiveSuggestion:true});}
break;case'ArrowDown':case'PageDown':if(ev.key==='ArrowDown'&&!this.composerView.hasSuggestions&&!this.composerView.composer.textInputContent&&this.composerView.threadView){this.composerView.threadView.startEditingLastMessageFromCurrentUser();break;}
if(this.composerView.hasSuggestions){this.composerView.setNextSuggestionActive();this.composerView.update({hasToScrollToActiveSuggestion:true});}
break;case'Home':if(this.composerView.hasSuggestions){this.composerView.setFirstSuggestionActive();this.composerView.update({hasToScrollToActiveSuggestion:true});}
break;case'End':if(this.composerView.hasSuggestions){this.composerView.setLastSuggestionActive();this.composerView.update({hasToScrollToActiveSuggestion:true});}
break;case'Tab':if(this.composerView.hasSuggestions){if(ev.shiftKey){this.composerView.setPreviousSuggestionActive();this.composerView.update({hasToScrollToActiveSuggestion:true});}else{this.composerView.setNextSuggestionActive();this.composerView.update({hasToScrollToActiveSuggestion:true});}}
break;case'Alt':case'AltGraph':case'CapsLock':case'Control':case'Fn':case'FnLock':case'Hyper':case'Meta':case'NumLock':case'ScrollLock':case'Shift':case'ShiftSuper':case'Symbol':case'SymbolLock':break;default:this.saveStateInStore();}}}
Object.assign(ComposerTextInput,{defaultProps:{hasMentionSuggestionsBelowPosition:false,sendShortcuts:[],},props:{composerViewLocalId:String,hasMentionSuggestionsBelowPosition:Boolean,isCompact:Boolean,sendShortcuts:{type:Array,element:String,validate:prop=>{for(const shortcut of prop){if(!['ctrl-enter','enter','meta-enter'].includes(shortcut)){return false;}}
return true;},},},template:'mail.ComposerTextInput',});registerMessagingComponent(ComposerTextInput,{propsCompareDepth:{sendShortcuts:1}});return __exports;});;

/* /mail/static/src/components/delete_message_confirm_dialog/delete_message_confirm_dialog.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/delete_message_confirm_dialog/delete_message_confirm_dialog',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const Dialog=require('web.OwlDialog');const{Component}=owl;const{useRef}=owl.hooks;const DeleteMessageConfirmDialog=__exports.DeleteMessageConfirmDialog=class DeleteMessageConfirmDialog extends Component{setup(){super.setup();this.title=this.env._t("Confirmation");this.dialogRef=useRef('dialog');}
get messageActionList(){return this.messaging&&this.messaging.models['mail.message_action_list'].get(this.props.messageActionListLocalId);}}
Object.assign(DeleteMessageConfirmDialog,{components:{Dialog,},props:{messageActionListLocalId:String,},template:'mail.DeleteMessageConfirmDialog',});registerMessagingComponent(DeleteMessageConfirmDialog);return __exports;});;

/* /mail/static/src/components/dialog/dialog.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/dialog/dialog',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const{useRef}=owl.hooks;const Dialog=__exports.Dialog=class Dialog extends Component{constructor(...args){super(...args);this._componentRef=useRef('component');this._onClickGlobal=this._onClickGlobal.bind(this);this._onKeydownDocument=this._onKeydownDocument.bind(this);this._constructor();}
_constructor(){}
mounted(){document.addEventListener('click',this._onClickGlobal,true);document.addEventListener('keydown',this._onKeydownDocument);}
willUnmount(){document.removeEventListener('click',this._onClickGlobal,true);document.removeEventListener('keydown',this._onKeydownDocument);}
get dialog(){return this.messaging&&this.messaging.models['mail.dialog'].get(this.props.dialogLocalId);}
_onClick(ev){ev.stopPropagation();}
_onClickGlobal(ev){if(this._componentRef.el&&this._componentRef.el.contains(ev.target)){return;}
if(this._componentRef.comp&&this._componentRef.comp.isCloseable&&!this._componentRef.comp.isCloseable()){return;}
this.dialog.delete();}
_onKeydownDocument(ev){if(ev.key==='Escape'){this.dialog.delete();}}}
Object.assign(Dialog,{props:{dialogLocalId:String,},template:'mail.Dialog',});registerMessagingComponent(Dialog);return __exports;});;

/* /mail/static/src/components/dialog_manager/dialog_manager.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/dialog_manager/dialog_manager',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const DialogManager=__exports.DialogManager=class DialogManager extends Component{mounted(){this._checkDialogOpen();}
patched(){this._checkDialogOpen();}
_checkDialogOpen(){if(!this.messaging||!this.messaging.dialogManager){return;}
if(this.messaging.dialogManager.dialogs.length>0){document.body.classList.add('modal-open');}else{document.body.classList.remove('modal-open');}}}
Object.assign(DialogManager,{props:{},template:'mail.DialogManager',});registerMessagingComponent(DialogManager);return __exports;});;

/* /mail/static/src/components/discuss/discuss.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/discuss/discuss',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{link,unlink}=require('@mail/model/model_field_command');const{useUpdate}=require('@mail/component_hooks/use_update/use_update');const{Component}=owl;const Discuss=__exports.Discuss=class Discuss extends Component{constructor(...args){super(...args);this._updateLocalStoreProps();this._onMobileAddItemHeaderInputSelect=this._onMobileAddItemHeaderInputSelect.bind(this);this._onMobileAddItemHeaderInputSource=this._onMobileAddItemHeaderInputSource.bind(this);useUpdate({func:()=>this._update()});}
_update(){if(!this.discuss){return;}
this.discuss.update({isOpen:true});if(this.discuss.thread){this.trigger('o-push-state-action-manager');}
if(this.discuss.thread&&this.discuss.thread===this.messaging.inbox&&this.discuss.threadView&&this._lastThreadCache===this.discuss.threadView.threadCache.localId&&this._lastThreadCounter>0&&this.discuss.thread.counter===0){this.trigger('o-show-rainbow-man');}
this._updateLocalStoreProps();}
willUnmount(){if(this.discuss){this.discuss.close();}}
get addChannelInputPlaceholder(){return this.env._t("Create or search channel...");}
get addChatInputPlaceholder(){return this.env._t("Search user...");}
get discuss(){return this.messaging&&this.messaging.discuss;}
mobileNavbarTabs(){return[{icon:'fa fa-inbox',id:'mailbox',label:this.env._t("Mailboxes"),},{icon:'fa fa-user',id:'chat',label:this.env._t("Chat"),},{icon:'fa fa-users',id:'channel',label:this.env._t("Channel"),}];}
_updateLocalStoreProps(){if(!this.discuss){return;}
this._lastThreadCache=(this.discuss.threadView&&this.discuss.threadView.threadCache&&this.discuss.threadView.threadCache.localId);this._lastThreadCounter=(this.discuss.thread&&this.discuss.thread.counter);}
_onHideMobileAddItemHeader(ev){ev.stopPropagation();this.discuss.clearIsAddingItem();}
_onMobileAddItemHeaderInputSelect(ev,ui){const discuss=this.discuss;if(discuss.isAddingChannel){discuss.handleAddChannelAutocompleteSelect(ev,ui);}else{discuss.handleAddChatAutocompleteSelect(ev,ui);}}
_onMobileAddItemHeaderInputSource(req,res){if(this.discuss.isAddingChannel){this.discuss.handleAddChannelAutocompleteSource(req,res);}else{this.discuss.handleAddChatAutocompleteSource(req,res);}}
_onSelectMobileNavbarTab(ev){ev.stopPropagation();if(this.discuss.activeMobileNavbarTabId===ev.detail.tabId){return;}
this.discuss.update({activeMobileNavbarTabId:ev.detail.tabId});if(this.discuss.activeMobileNavbarTabId==='mailbox'&&(!this.discuss.thread||this.discuss.thread.model!=='mailbox')){this.discuss.update({thread:link(this.messaging.inbox)});}
if(this.discuss.activeMobileNavbarTabId!=='mailbox'){this.discuss.update({thread:unlink()});}
if(this.discuss.activeMobileNavbarTabId!=='chat'){this.discuss.update({isAddingChat:false});}
if(this.discuss.activeMobileNavbarTabId!=='channel'){this.discuss.update({isAddingChannel:false});}}}
Object.assign(Discuss,{props:{},template:'mail.Discuss',});registerMessagingComponent(Discuss);return __exports;});;

/* /mail/static/src/components/discuss_mobile_mailbox_selection/discuss_mobile_mailbox_selection.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/discuss_mobile_mailbox_selection/discuss_mobile_mailbox_selection',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const DiscussMobileMailboxSelection=__exports.DiscussMobileMailboxSelection=class DiscussMobileMailboxSelection extends Component{get orderedMailboxes(){if(!this.messaging){return[];}
return this.messaging.models['mail.thread'].all(thread=>thread.isPinned&&thread.model==='mail.box').sort((mailbox1,mailbox2)=>{if(mailbox1===this.messaging.inbox){return-1;}
if(mailbox2===this.messaging.inbox){return 1;}
if(mailbox1===this.messaging.starred){return-1;}
if(mailbox2===this.messaging.starred){return 1;}
const mailbox1Name=mailbox1.displayName;const mailbox2Name=mailbox2.displayName;mailbox1Name<mailbox2Name?-1:1;});}
get discuss(){return this.messaging&&this.messaging.discuss;}
_onClick(ev){const{mailboxLocalId}=ev.currentTarget.dataset;const mailbox=this.messaging.models['mail.thread'].get(mailboxLocalId);if(!mailbox){return;}
mailbox.open();}}
Object.assign(DiscussMobileMailboxSelection,{props:{},template:'mail.DiscussMobileMailboxSelection',});registerMessagingComponent(DiscussMobileMailboxSelection);return __exports;});;

/* /mail/static/src/components/discuss_public_view/discuss_public_view.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/discuss_public_view/discuss_public_view',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;class DiscussPublicView extends Component{get discussPublicView(){return this.messaging&&this.messaging.models['mail.discuss_public_view'].get(this.props.localId);}}
Object.assign(DiscussPublicView,{props:{localId:String},template:'mail.DiscussPublicView',});registerMessagingComponent(DiscussPublicView);return __exports;});;

/* /mail/static/src/components/discuss_sidebar/discuss_sidebar.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/discuss_sidebar/discuss_sidebar',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{useRefToModel}=require('@mail/component_hooks/use_ref_to_model/use_ref_to_model');const{useUpdate}=require('@mail/component_hooks/use_update/use_update');const{Component}=owl;const{useRef}=owl.hooks;const DiscussSidebar=__exports.DiscussSidebar=class DiscussSidebar extends Component{constructor(...args){super(...args);useUpdate({func:()=>this._update()});useRefToModel({fieldName:'startAMeetingButtonRef',modelName:'mail.discuss',propNameAsRecordLocalId:'localId',refName:'startAMeetingButton'});this._quickSearchInputRef=useRef('quickSearchInput');}
get discuss(){return this.messaging&&this.messaging.models['mail.discuss'].get(this.props.localId);}
_update(){if(!this.discuss){return;}
if(this._quickSearchInputRef.el){this._quickSearchInputRef.el.value=this.discuss.sidebarQuickSearchValue;}}
_onInputQuickSearch(ev){ev.stopPropagation();this.discuss.onInputQuickSearch(this._quickSearchInputRef.el.value);}}
Object.assign(DiscussSidebar,{props:{localId:String},template:'mail.DiscussSidebar',});registerMessagingComponent(DiscussSidebar);return __exports;});;

/* /mail/static/src/components/discuss_sidebar_category/discuss_sidebar_category.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/discuss_sidebar_category/discuss_sidebar_category',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const DiscussSidebarCategory=__exports.DiscussSidebarCategory=class DiscussSidebarCategory extends Component{get category(){return this.messaging.models['mail.discuss_sidebar_category'].get(this.props.categoryLocalId);}}
Object.assign(DiscussSidebarCategory,{props:{categoryLocalId:String,},template:'mail.DiscussSidebarCategory',});registerMessagingComponent(DiscussSidebarCategory);return __exports;});;

/* /mail/static/src/components/discuss_sidebar_category_item/discuss_sidebar_category_item.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/discuss_sidebar_category_item/discuss_sidebar_category_item',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const DiscussSidebarCategoryItem=__exports.DiscussSidebarCategoryItem=class DiscussSidebarCategoryItem extends Component{get categoryItem(){return this.messaging.models['mail.discuss_sidebar_category_item'].get(this.props.categoryItemLocalId);}}
Object.assign(DiscussSidebarCategoryItem,{props:{categoryItemLocalId:String,},template:'mail.DiscussSidebarCategoryItem',});registerMessagingComponent(DiscussSidebarCategoryItem);return __exports;});;

/* /mail/static/src/components/discuss_sidebar_mailbox/discuss_sidebar_mailbox.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/discuss_sidebar_mailbox/discuss_sidebar_mailbox',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const DiscussSidebarMailbox=__exports.DiscussSidebarMailbox=class DiscussSidebarMailbox extends Component{get mailbox(){return this.messaging.models['mail.thread'].get(this.props.threadLocalId);}}
Object.assign(DiscussSidebarMailbox,{props:{threadLocalId:String,},template:'mail.DiscussSidebarMailbox',});registerMessagingComponent(DiscussSidebarMailbox);return __exports;});;

/* /mail/static/src/components/drop_zone/drop_zone.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/drop_zone/drop_zone',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component,useState}=owl;const DropZone=__exports.DropZone=class DropZone extends Component{constructor(...args){super(...args);this.state=useState({isDraggingInside:false,});this._dragCount=0;}
contains(node){return Boolean(this.el&&this.el.contains(node));}
_isDragSourceExternalFile(dataTransfer){const dragDataType=dataTransfer.types;if(dragDataType.constructor===window.DOMStringList){return dragDataType.contains('Files');}
if(dragDataType.constructor===Array){return dragDataType.includes('Files');}
return false;}
_onDragenter(ev){ev.preventDefault();if(this._dragCount===0){this.state.isDraggingInside=true;}
this._dragCount++;}
_onDragleave(ev){this._dragCount--;if(this._dragCount===0){this.state.isDraggingInside=false;}}
_onDragover(ev){ev.preventDefault();ev.dataTransfer.dropEffect='copy';}
_onDrop(ev){ev.preventDefault();if(this._isDragSourceExternalFile(ev.dataTransfer)){this.trigger('o-dropzone-files-dropped',{files:ev.dataTransfer.files,});}
this.state.isDraggingInside=false;}}
Object.assign(DropZone,{props:{},template:'mail.DropZone',});registerMessagingComponent(DropZone);return __exports;});;

/* /mail/static/src/components/editable_text/editable_text.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/editable_text/editable_text',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{markEventHandled}=require('@mail/utils/utils');const{Component}=owl;const EditableText=__exports.EditableText=class EditableText extends Component{mounted(){this.el.focus();this.el.setSelectionRange(0,(this.el.value&&this.el.value.length)||0);}
willUnmount(){this.trigger('o-cancel');}
_onBlur(ev){this.trigger('o-cancel');}
_onClick(ev){markEventHandled(ev,'EditableText.click');this.trigger('o-clicked');}
_onKeydown(ev){switch(ev.key){case'Enter':this._onKeydownEnter(ev);break;case'Escape':this.trigger('o-cancel');break;}}
_onKeydownEnter(ev){if(!this.el){return;}
const value=this.el.value;const newName=value||this.props.placeholder;if(this.props.value!==newName){this.trigger('o-validate',{newName});}else{this.trigger('o-cancel');}}}
Object.assign(EditableText,{defaultProps:{placeholder:"",value:"",},props:{placeholder:String,value:String,},template:'mail.EditableText',});registerMessagingComponent(EditableText);return __exports;});;

/* /mail/static/src/components/emojis_popover/emojis_popover.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/emojis_popover/emojis_popover',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{useUpdate}=require('@mail/component_hooks/use_update/use_update');const emojis=require('@mail/js/emojis')[Symbol.for("default")];const{Component}=owl;const EmojisPopover=__exports.EmojisPopover=class EmojisPopover extends Component{constructor(...args){super(...args);this.emojis=emojis;useUpdate({func:()=>this._update()});}
_update(){this.trigger('o-popover-compute');}
close(){this.trigger('o-popover-close');}
contains(node){return Boolean(this.el&&this.el.contains(node));}
_onClickEmoji(ev){this.close();this.trigger('o-emoji-selection',{unicode:ev.currentTarget.dataset.unicode,});}}
Object.assign(EmojisPopover,{props:{},template:'mail.EmojisPopover',});registerMessagingComponent(EmojisPopover);return __exports;});;

/* /mail/static/src/components/file_uploader/file_uploader.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/file_uploader/file_uploader',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{replace}=require('@mail/model/model_field_command');const core=require('web.core');const{Component}=owl;const{useRef}=owl.hooks;const geAttachmentNextTemporaryId=(function(){let tmpId=0;return()=>{tmpId-=1;return tmpId;};})();const FileUploader=__exports.FileUploader=class FileUploader extends Component{constructor(...args){super(...args);this._fileInputRef=useRef('fileInput');this._fileUploadId=_.uniqueId('o_FileUploader_fileupload');}
get composerView(){return this.messaging.models['mail.composer_view'].get(this.props.composerViewLocalId);}
async uploadFiles(files){await this._performUpload({composer:this.composerView&&this.composerView.composer,files,thread:this.thread,});this._fileInputRef.el.value='';}
openBrowserFileUploader(){this._fileInputRef.el.click();}
get thread(){return this.messaging.models['mail.thread'].get(this.props.threadLocalId);}
_createFormData({composer,file,thread}){const formData=new window.FormData();formData.append('csrf_token',core.csrf_token);formData.append('is_pending',Boolean(composer));formData.append('thread_id',thread&&thread.id);formData.append('thread_model',thread&&thread.model);formData.append('ufile',file,file.name);return formData;}
async _performUpload({composer,files,thread}){const uploadingAttachments=new Map();for(const file of files){uploadingAttachments.set(file,this.messaging.models['mail.attachment'].insert({composer:composer&&replace(composer),filename:file.name,id:geAttachmentNextTemporaryId(),isUploading:true,mimetype:file.type,name:file.name,originThread:(!composer&&thread)?replace(thread):undefined,}));}
for(const file of files){const uploadingAttachment=uploadingAttachments.get(file);if(!uploadingAttachment.exists()){continue;}
if((composer&&!composer.exists())||(thread&&!thread.exists())){return;}
try{const response=await this.env.browser.fetch('/mail/attachment/upload',{method:'POST',body:this._createFormData({composer,file,thread}),signal:uploadingAttachment.uploadingAbortController.signal,});const attachmentData=await response.json();if(uploadingAttachment.exists()){uploadingAttachment.delete();}
if((composer&&!composer.exists())||(thread&&!thread.exists())){return;}
this._onAttachmentUploaded({attachmentData,composer,thread});}catch(e){if(e.name!=='AbortError'){throw e;}}}}
_onAttachmentUploaded({attachmentData,composer,thread}){if(attachmentData.error||!attachmentData.id){this.env.services['notification'].notify({type:'danger',message:attachmentData.error,});return;}
const attachment=this.messaging.models['mail.attachment'].insert({composer:composer&&replace(composer),originThread:(!composer&&thread)?replace(thread):undefined,...attachmentData,});this.trigger('o-attachment-created',{attachment});}
async _onChangeAttachment(ev){await this.uploadFiles(ev.target.files);}}
Object.assign(FileUploader,{props:{composerViewLocalId:{type:String,optional:true,},threadLocalId:{type:String,optional:true,},},template:'mail.FileUploader',});registerMessagingComponent(FileUploader);return __exports;});;

/* /mail/static/src/components/follow_button/follow_button.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/follow_button/follow_button',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const{useState}=owl.hooks;const FollowButton=__exports.FollowButton=class FollowButton extends Component{constructor(...args){super(...args);this.state=useState({isUnfollowButtonHighlighted:false,});}
get thread(){return this.messaging&&this.messaging.models['mail.thread'].get(this.props.threadLocalId);}
_onClickFollow(ev){this.thread.follow();}
async _onClickUnfollow(ev){await this.thread.unfollow();this.trigger('reload',{fieldNames:['message_follower_ids'],keepChanges:true});}
_onMouseLeaveUnfollow(ev){this.state.isUnfollowButtonHighlighted=false;}
_onMouseEnterUnfollow(ev){this.state.isUnfollowButtonHighlighted=true;}}
Object.assign(FollowButton,{defaultProps:{isDisabled:false,},props:{isDisabled:Boolean,threadLocalId:String,},template:'mail.FollowButton',});registerMessagingComponent(FollowButton);return __exports;});;

/* /mail/static/src/components/follower/follower.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/follower/follower',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{markEventHandled}=require('@mail/utils/utils');const{Component}=owl;const Follower=__exports.Follower=class Follower extends Component{get follower(){return this.messaging&&this.messaging.models['mail.follower'].get(this.props.followerLocalId);}
_onClickDetails(ev){ev.preventDefault();ev.stopPropagation();this.follower.openProfile();}
_onClickEdit(ev){ev.preventDefault();this.follower.showSubtypes();}
async _onClickRemove(ev){markEventHandled(ev,'Follower.clickRemove');await this.follower.remove();this.trigger('reload',{fieldNames:['message_follower_ids'],keepChanges:true});this.trigger('o-hide-follower-list-menu');}}
Object.assign(Follower,{props:{followerLocalId:String,},template:'mail.Follower',});registerMessagingComponent(Follower);return __exports;});;

/* /mail/static/src/components/follower_list_menu/follower_list_menu.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/follower_list_menu/follower_list_menu',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{isEventHandled}=require('@mail/utils/utils');const{Component}=owl;const{useRef,useState}=owl.hooks;const FollowerListMenu=__exports.FollowerListMenu=class FollowerListMenu extends Component{constructor(...args){super(...args);this.state=useState({isDropdownOpen:false,});this._dropdownRef=useRef('dropdown');this._onClickCaptureGlobal=this._onClickCaptureGlobal.bind(this);}
mounted(){document.addEventListener('click',this._onClickCaptureGlobal,true);}
willUnmount(){document.removeEventListener('click',this._onClickCaptureGlobal,true);}
get thread(){return this.messaging&&this.messaging.models['mail.thread'].get(this.props.threadLocalId);}
_hide(){this.state.isDropdownOpen=false;}
_onKeydown(ev){ev.stopPropagation();switch(ev.key){case'Escape':ev.preventDefault();this._hide();break;}}
_onClickAddFollowers(ev){ev.preventDefault();this._hide();this.thread.promptAddPartnerFollower();}
_onClickCaptureGlobal(ev){if(this._dropdownRef.el&&!this._dropdownRef.el.contains(ev.target)){this._hide();}}
_onClickFollowersButton(ev){this.state.isDropdownOpen=!this.state.isDropdownOpen;}
_onClickFollower(ev){if(isEventHandled(ev,'Follower.clickRemove')){return;}
this._hide();}}
Object.assign(FollowerListMenu,{defaultProps:{isDisabled:false,},props:{isDisabled:Boolean,threadLocalId:String,},template:'mail.FollowerListMenu',});registerMessagingComponent(FollowerListMenu);return __exports;});;

/* /mail/static/src/components/follower_subtype/follower_subtype.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/follower_subtype/follower_subtype',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const FollowerSubtype=__exports.FollowerSubtype=class FollowerSubtype extends Component{get follower(){return this.messaging&&this.messaging.models['mail.follower'].get(this.props.followerLocalId);}
get followerSubtype(){return this.messaging&&this.messaging.models['mail.follower_subtype'].get(this.props.followerSubtypeLocalId);}
_onChangeCheckbox(ev){if(ev.target.checked){this.follower.selectSubtype(this.followerSubtype);}else{this.follower.unselectSubtype(this.followerSubtype);}}}
Object.assign(FollowerSubtype,{props:{followerLocalId:String,followerSubtypeLocalId:String,},template:'mail.FollowerSubtype',});registerMessagingComponent(FollowerSubtype);return __exports;});;

/* /mail/static/src/components/follower_subtype_list/follower_subtype_list.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/follower_subtype_list/follower_subtype_list',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const FollowerSubtypeList=__exports.FollowerSubtypeList=class FollowerSubtypeList extends Component{get followerSubtypeList(){return this.messaging&&this.messaging.models['mail.follower_subtype_list'].get(this.props.localId);}
_onClickCancel(ev){this.followerSubtypeList.follower.closeSubtypes();}
_onClickApply(ev){this.followerSubtypeList.follower.updateSubtypes();}}
Object.assign(FollowerSubtypeList,{props:{localId:String,},template:'mail.FollowerSubtypeList',});registerMessagingComponent(FollowerSubtypeList);return __exports;});;

/* /mail/static/src/components/mail_template/mail_template.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/mail_template/mail_template',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const MailTemplate=__exports.MailTemplate=class MailTemplate extends Component{get activity(){return this.messaging&&this.messaging.models['mail.activity'].get(this.props.activityLocalId);}
get mailTemplate(){return this.messaging&&this.messaging.models['mail.mail_template'].get(this.props.mailTemplateLocalId);}
_onClickPreview(ev){ev.stopPropagation();ev.preventDefault();this.mailTemplate.preview(this.activity);}
_onClickSend(ev){ev.stopPropagation();ev.preventDefault();this.mailTemplate.send(this.activity);}}
Object.assign(MailTemplate,{props:{activityLocalId:String,mailTemplateLocalId:String,},template:'mail.MailTemplate',});registerMessagingComponent(MailTemplate);return __exports;});;

/* /mail/static/src/components/media_preview/media_preview.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/media_preview/media_preview',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{useRefToModel}=require('@mail/component_hooks/use_ref_to_model/use_ref_to_model');const MediaPreview=__exports.MediaPreview=class MediaPreview extends owl.Component{setup(){super.setup();useRefToModel({fieldName:'audioRef',modelName:'mail.media_preview',propNameAsRecordLocalId:'localId',refName:'audio'});useRefToModel({fieldName:'videoRef',modelName:'mail.media_preview',propNameAsRecordLocalId:'localId',refName:'video'});}
get mediaPreview(){return this.messaging&&this.messaging.models['mail.media_preview'].get(this.props.localId);}}
Object.assign(MediaPreview,{props:{localId:String},template:'mail.MediaPreview',});registerMessagingComponent(MediaPreview);return __exports;});;

/* /mail/static/src/components/message/message.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/message/message',async function(require){'use strict';let __exports={};const{useComponentToModel}=require('@mail/component_hooks/use_component_to_model/use_component_to_model');const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{useUpdate}=require('@mail/component_hooks/use_update/use_update');const{isEventHandled,markEventHandled}=require('@mail/utils/utils');const{_lt}=require('web.core');const{format}=require('web.field_utils');const{getLangDatetimeFormat}=require('web.time');const{Component,useState}=owl;const{useRef}=owl.hooks;const READ_MORE=_lt("read more");const READ_LESS=_lt("read less");const Message=__exports.Message=class Message extends Component{constructor(...args){super(...args);this.state=useState({isHovered:false,isClicked:false,});useUpdate({func:()=>this._update()});this._lastPrettyBody;this._prettyBodyRef=useRef('prettyBody');this._contentRef=useRef('content');this._checkboxRef=useRef('checkbox');this._intervalId=undefined;this._lastReadMoreIndex=0;this._isReadMoreByIndex=new Map();this._constructor();}
_constructor(){}
setup(){super.setup();useComponentToModel({fieldName:'component',modelName:'mail.message_view',propNameAsRecordLocalId:'messageViewLocalId'});}
willUnmount(){clearInterval(this._intervalId);}
get avatar(){if(this.messageView.message.author&&(!this.messageView.message.originThread||this.messageView.message.originThread.model!=='mail.channel')){return this.messageView.message.author.avatarUrl;}else if(this.messageView.message.author&&this.messageView.message.originThread&&this.messageView.message.originThread.model==='mail.channel'){return`/mail/channel/${this.messageView.message.originThread.id}/partner/${this.messageView.message.author.id}/avatar_128`;}else if(this.messageView.message.guestAuthor&&(!this.messageView.message.originThread||this.messageView.message.originThread.model!=='mail.channel')){return this.messageView.message.guestAuthor.avatarUrl;}else if(this.messageView.message.guestAuthor&&this.messageView.message.originThread&&this.messageView.message.originThread.model==='mail.channel'){return`/mail/channel/${this.messageView.message.originThread.id}/guest/${this.messageView.message.guestAuthor.id}/avatar_128?unique=${this.messageView.message.guestAuthor.name}`;}else if(this.messageView.message.message_type==='email'){return'/mail/static/src/img/email_icon.png';}
return'/mail/static/src/img/smiley/avatar.jpg';}
get datetime(){return this.messageView.message.date.format(getLangDatetimeFormat());}
get hasAuthorOpenChat(){if(this.messaging.currentGuest){return false;}
if(!this.messageView.message.author){return false;}
if(this.threadView&&this.threadView.thread&&this.threadView.thread.correspondent===this.messageView.message.author){return false;}
return true;}
get isActive(){return Boolean(this.state.isHovered||this.state.isClicked||(this.messageView&&this.messageView.messageActionList&&(this.messageView.messageActionList.isReactionPopoverOpened||this.messageView.messageActionList.showDeleteConfirm)));}
isBottomVisible({offset=0}={}){if(!this.el){return false;}
const elRect=this.el.getBoundingClientRect();if(!this.el.parentNode){return false;}
const parentRect=this.el.parentNode.getBoundingClientRect();return(elRect.bottom<parentRect.bottom+offset&&parentRect.top<elRect.bottom+offset);}
isPartiallyVisible(){if(!this.el){return false;}
const elRect=this.el.getBoundingClientRect();if(!this.el.parentNode){return false;}
const parentRect=this.el.parentNode.getBoundingClientRect();return(elRect.top<parentRect.bottom+5&&parentRect.top<elRect.bottom+5);}
get isSelected(){return Boolean(this.threadView&&this.messageView&&this.threadView.replyingToMessageView===this.messageView);}
get messageView(){return this.messaging&&this.messaging.models['mail.message_view'].get(this.props.messageViewLocalId);}
get OPEN_CHAT(){return this.env._t("Open chat");}
async scrollIntoView({behavior='auto',block='end'}={}){this.el.scrollIntoView({behavior,block,inline:'nearest',});if(behavior==='smooth'){return new Promise(resolve=>setTimeout(resolve,500));}else{return Promise.resolve();}}
get shortTime(){return this.messageView.message.date.format('hh:mm');}
get threadView(){return this.messageView&&this.messageView.threadView;}
get trackingValues(){return this.messageView.message.tracking_value_ids.map(trackingValue=>{const value=Object.assign({},trackingValue);value.changed_field=_.str.sprintf(this.env._t("%s:"),value.changed_field);switch(value.field_type){case'boolean':value.old_value=format.boolean(value.old_value,undefined,{forceString:true});value.new_value=format.boolean(value.new_value,undefined,{forceString:true});break;case'char':case'many2one':case'selection':value.old_value=format.char(value.old_value);value.new_value=format.char(value.new_value);break;case'date':if(value.old_value){value.old_value=moment.utc(value.old_value);}
if(value.new_value){value.new_value=moment.utc(value.new_value);}
value.old_value=format.date(value.old_value);value.new_value=format.date(value.new_value);break;case'datetime':if(value.old_value){value.old_value=moment.utc(value.old_value);}
if(value.new_value){value.new_value=moment.utc(value.new_value);}
value.old_value=format.datetime(value.old_value);value.new_value=format.datetime(value.new_value);break;case'float':value.old_value=format.float(value.old_value);value.new_value=format.float(value.new_value);break;case'integer':value.old_value=format.integer(value.old_value);value.new_value=format.integer(value.new_value);break;case'monetary':value.old_value=format.monetary(value.old_value,undefined,{currency:value.currency_id?this.env.session.currencies[value.currency_id]:undefined,forceString:true,});value.new_value=format.monetary(value.new_value,undefined,{currency:value.currency_id?this.env.session.currencies[value.currency_id]:undefined,forceString:true,});break;case'text':value.old_value=format.text(value.old_value);value.new_value=format.text(value.new_value);break;}
return value;});}
_insertReadMoreLess($element){const groups=[];let readMoreNodes;const $children=$element.contents().filter((index,content)=>content.nodeType===1||(content.nodeType===3&&content.nodeValue.trim()));for(const child of $children){let $child=$(child);if(child.nodeType===3&&$child.prevAll('[id*="stopSpelling"]').length>0){$child=$('<span>',{text:child.textContent,'data-o-mail-quote':'1',});child.parentNode.replaceChild($child[0],child);}
if($child.attr('data-o-mail-quote')||($child.get(0).nodeName==='BR'&&$child.prev('[data-o-mail-quote="1"]').length>0)){if(!readMoreNodes){readMoreNodes=[];groups.push(readMoreNodes);}
$child.hide();readMoreNodes.push($child);}else{readMoreNodes=undefined;this._insertReadMoreLess($child);}}
for(const group of groups){const index=this._lastReadMoreIndex++;const $readMoreLess=$('<a>',{class:'o_Message_readMoreLess',href:'#',text:READ_MORE,}).insertBefore(group[0]);if(!this._isReadMoreByIndex.has(index)){this._isReadMoreByIndex.set(index,true);}
const updateFromState=()=>{const isReadMore=this._isReadMoreByIndex.get(index);for(const $child of group){$child.hide();$child.toggle(!isReadMore);}
$readMoreLess.text(isReadMore?READ_MORE:READ_LESS);};$readMoreLess.click(e=>{e.preventDefault();this._isReadMoreByIndex.set(index,!this._isReadMoreByIndex.get(index));updateFromState();});updateFromState();}}
_update(){if(!this.messageView){return;}
if(this._prettyBodyRef.el&&this.messageView.message.prettyBody!==this._lastPrettyBody){this._prettyBodyRef.el.innerHTML=this.messageView.message.prettyBody;this._lastPrettyBody=this.messageView.message.prettyBody;}
if(!this._prettyBodyRef.el){this._lastPrettyBody=undefined;}
if(this._contentRef.el){for(const el of[...this._contentRef.el.querySelectorAll(':scope .o_Message_readMoreLess')]){el.remove();}
this._lastReadMoreIndex=0;this._insertReadMoreLess($(this._contentRef.el));this.messaging.messagingBus.trigger('o-component-message-read-more-less-inserted',{message:this.messageView.message,});}
this.messageView.message.refreshDateFromNow();clearInterval(this._intervalId);this._intervalId=setInterval(()=>{if(this.messageView){this.messageView.message.refreshDateFromNow();}},60*1000);}
_onClick(ev){if(ev.target.closest('.o_channel_redirect')){this.messaging.openProfile({id:Number(ev.target.dataset.oeId),model:'mail.channel',});ev.preventDefault();return;}
if(ev.target.tagName==='A'){if(ev.target.dataset.oeId&&ev.target.dataset.oeModel){this.messaging.openProfile({id:Number(ev.target.dataset.oeId),model:ev.target.dataset.oeModel,});ev.preventDefault();}
return;}
if(!isEventHandled(ev,'Message.ClickAuthorAvatar')&&!isEventHandled(ev,'Message.ClickAuthorName')&&!isEventHandled(ev,'Message.ClickFailure')&&!isEventHandled(ev,'MessageActionList.Click')&&!isEventHandled(ev,'MessageReactionGroup.Click')&&!isEventHandled(ev,'MessageInReplyToView.ClickMessageInReplyTo')){this.state.isClicked=!this.state.isClicked;}}
_onClickAuthorAvatar(ev){markEventHandled(ev,'Message.ClickAuthorAvatar');if(!this.hasAuthorOpenChat){return;}
this.messageView.message.author.openChat();}
_onClickAuthorName(ev){markEventHandled(ev,'Message.ClickAuthorName');if(!this.messageView.message.author){return;}
this.messageView.message.author.openProfile();}
_onClickFailure(ev){markEventHandled(ev,'Message.ClickFailure');this.messageView.message.openResendAction();}
_onClickOriginThread(ev){ev.preventDefault();this.messageView.message.originThread.open();}}
Object.assign(Message,{props:{messageViewLocalId:String,},template:'mail.Message',});registerMessagingComponent(Message);return __exports;});;

/* /mail/static/src/components/message_action_list/message_action_list.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/message_action_list/message_action_list',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{useRefToModel}=require('@mail/component_hooks/use_ref_to_model/use_ref_to_model');const{Component}=owl;const MessageActionList=__exports.MessageActionList=class MessageActionList extends Component{setup(){super.setup();useRefToModel({fieldName:'reactionPopoverRef',modelName:'mail.message_action_list',propNameAsRecordLocalId:'messageActionListLocalId',refName:'reactionPopover'});this.ADD_A_REACTION=this.env._t("Add a Reaction");}
get messageActionList(){return this.messaging&&this.messaging.models['mail.message_action_list'].get(this.props.messageActionListLocalId);}}
Object.assign(MessageActionList,{props:{messageActionListLocalId:String,},template:"mail.MessageActionList",});registerMessagingComponent(MessageActionList);return __exports;});;

/* /mail/static/src/components/message_author_prefix/message_author_prefix.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/message_author_prefix/message_author_prefix',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const MessageAuthorPrefix=__exports.MessageAuthorPrefix=class MessageAuthorPrefix extends Component{get message(){return this.messaging&&this.messaging.models['mail.message'].get(this.props.messageLocalId);}
get thread(){return this.messaging&&this.messaging.models['mail.thread'].get(this.props.threadLocalId);}}
Object.assign(MessageAuthorPrefix,{props:{messageLocalId:String,threadLocalId:{type:String,optional:true,},},template:'mail.MessageAuthorPrefix',});registerMessagingComponent(MessageAuthorPrefix);return __exports;});;

/* /mail/static/src/components/message_in_reply_to_view/message_in_reply_to_view.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/message_in_reply_to_view/message_in_reply_to_view',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const MessageInReplyToView=__exports.MessageInReplyToView=class MessageInReplyToView extends Component{get messageInReplyToView(){return this.messaging&&this.messaging.models['mail.message_in_reply_to_view'].get(this.props.messageInReplyToViewLocalId);}}
Object.assign(MessageInReplyToView,{props:{messageInReplyToViewLocalId:String},template:"mail.MessageInReplyToView",});registerMessagingComponent(MessageInReplyToView);return __exports;});;

/* /mail/static/src/components/message_list/message_list.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/message_list/message_list',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{useRenderedValues}=require('@mail/component_hooks/use_rendered_values/use_rendered_values');const{useUpdate}=require('@mail/component_hooks/use_update/use_update');const{Component}=owl;const{useRef}=owl.hooks;const MessageList=__exports.MessageList=class MessageList extends Component{setup(){super.setup();this._isLastScrollProgrammatic=false;this._loadMoreRef=useRef('loadMore');this._willPatchSnapshot=undefined;this._onScrollThrottled=_.throttle(this._onScrollThrottled.bind(this),100);this._lastRenderedValues=useRenderedValues(()=>{const threadView=this.threadView;const thread=threadView&&threadView.thread;const threadCache=threadView&&threadView.threadCache;return{componentHintList:threadView?[...threadView.componentHintList]:[],hasAutoScrollOnMessageReceived:threadView&&threadView.hasAutoScrollOnMessageReceived,hasScrollAdjust:this.props.hasScrollAdjust,order:threadView&&threadView.order,orderedMessages:threadCache?[...threadCache.orderedMessages]:[],thread,threadCache,threadCacheInitialScrollHeight:threadView&&threadView.threadCacheInitialScrollHeight,threadCacheInitialScrollPosition:threadView&&threadView.threadCacheInitialScrollPosition,threadView,threadViewer:threadView&&threadView.threadViewer,};});useUpdate({func:()=>this._update()});}
willPatch(){this._willPatchSnapshot={scrollHeight:this._getScrollableElement().scrollHeight,scrollTop:this._getScrollableElement().scrollTop,};}
adjustFromComponentHints(){const{componentHintList,threadView}=this._lastRenderedValues();for(const hint of componentHintList){switch(hint.type){case'change-of-thread-cache':case'member-list-hidden':case'adjust-scroll':this._adjustScrollFromModel();break;case'message-posted':case'message-received':case'messages-loaded':case'new-messages-loaded':this._adjustScrollForExtraMessagesAtTheEnd();break;case'more-messages-loaded':this._adjustScrollForExtraMessagesAtTheStart();break;case'highlight-reply':this._highlightMessageView(hint.data);break;}
if(threadView&&threadView.exists()){threadView.markComponentHintProcessed(hint);}}
this._willPatchSnapshot=undefined;}
getScrollHeight(){return this._getScrollableElement().scrollHeight;}
getScrollTop(){return this._getScrollableElement().scrollTop;}
setScrollTop(value){if(this._getScrollableElement().scrollTop===value){return;}
this._isLastScrollProgrammatic=true;this._getScrollableElement().scrollTop=value;}
get threadView(){return this.messaging&&this.messaging.models['mail.thread_view'].get(this.props.threadViewLocalId);}
_adjustScrollForExtraMessagesAtTheEnd(){const{hasAutoScrollOnMessageReceived,hasScrollAdjust,order,}=this._lastRenderedValues();if(!this._getScrollableElement()||!hasScrollAdjust){return;}
if(!hasAutoScrollOnMessageReceived){if(order==='desc'&&this._willPatchSnapshot){const{scrollHeight,scrollTop}=this._willPatchSnapshot;this.setScrollTop(this._getScrollableElement().scrollHeight-scrollHeight+scrollTop);}
return;}
this._scrollToEnd();}
_adjustScrollForExtraMessagesAtTheStart(){const{hasScrollAdjust,order,}=this._lastRenderedValues();if(!this._getScrollableElement()||!hasScrollAdjust||!this._willPatchSnapshot||order==='desc'){return;}
const{scrollHeight,scrollTop}=this._willPatchSnapshot;this.setScrollTop(this._getScrollableElement().scrollHeight-scrollHeight+scrollTop);}
_adjustScrollFromModel(){const{hasScrollAdjust,threadCacheInitialScrollHeight,threadCacheInitialScrollPosition,}=this._lastRenderedValues();if(!this._getScrollableElement()||!hasScrollAdjust){return;}
if(threadCacheInitialScrollPosition!==undefined&&this._getScrollableElement().scrollHeight===threadCacheInitialScrollHeight){this.setScrollTop(threadCacheInitialScrollPosition);return;}
this._scrollToEnd();return;}
_checkMostRecentMessageIsVisible(){const{threadView}=this._lastRenderedValues();if(!threadView||!threadView.exists()){return;}
const{length,[length-1]:lastMessageView}=this.threadView.messageViews;if(lastMessageView&&lastMessageView.component&&lastMessageView.component.isPartiallyVisible()){threadView.handleVisibleMessage(lastMessageView.message);}}
_getScrollableElement(){if(this.props.getScrollableElement){return this.props.getScrollableElement();}else{return this.el;}}
_highlightMessageView(messageView){if(messageView.exists()&&messageView.component&&messageView.component.el){messageView.component.el.scrollIntoView({behavior:'smooth',block:'center'});messageView.highlight();}}
_isLoadMoreVisible(){const loadMore=this._loadMoreRef.el;if(!loadMore){return false;}
const loadMoreRect=loadMore.getBoundingClientRect();const elRect=this._getScrollableElement().getBoundingClientRect();const isInvisible=loadMoreRect.top>elRect.bottom||loadMoreRect.bottom<elRect.top;return!isInvisible;}
_loadMore(){const{threadCache}=this._lastRenderedValues();if(!threadCache||!threadCache.exists()){return;}
threadCache.loadMoreMessages();}
_scrollToEnd(){const{order}=this._lastRenderedValues();this.setScrollTop(order==='asc'?this._getScrollableElement().scrollHeight-this._getScrollableElement().clientHeight:0);}
_update(){this._checkMostRecentMessageIsVisible();this.adjustFromComponentHints();}
_onClickLoadMore(ev){ev.preventDefault();this._loadMore();}
_onClickRetryLoadMoreMessages(){if(!this.threadView){return;}
if(!this.threadView.threadCache){return;}
this.threadView.threadCache.update({hasLoadingFailed:false});this._loadMore();}
onScroll(ev){this._onScrollThrottled(ev);}
_onScrollThrottled(ev){const{order,orderedMessages,thread,threadCache,threadView,threadViewer,}=this._lastRenderedValues();if(!this._getScrollableElement()){return;}
const scrollTop=this._getScrollableElement().scrollTop;this.messaging.messagingBus.trigger('o-component-message-list-scrolled',{orderedMessages,scrollTop,thread,threadViewer,});if(!this._isLastScrollProgrammatic&&threadView&&threadView.exists()){const margin=30;const hasAutoScrollOnMessageReceived=(order==='asc')?scrollTop>=this._getScrollableElement().scrollHeight-this._getScrollableElement().clientHeight-margin:scrollTop<=margin;threadView.update({hasAutoScrollOnMessageReceived});}
if(threadViewer&&threadViewer.exists()){threadViewer.saveThreadCacheScrollHeightAsInitial(this._getScrollableElement().scrollHeight,threadCache);threadViewer.saveThreadCacheScrollPositionsAsInitial(scrollTop,threadCache);}
if(!this._isLastScrollProgrammatic&&this._isLoadMoreVisible()){this._loadMore();}
this._checkMostRecentMessageIsVisible();this._isLastScrollProgrammatic=false;}}
Object.assign(MessageList,{defaultProps:{hasScrollAdjust:true,},props:{getScrollableElement:{type:Function,optional:true,},hasScrollAdjust:Boolean,threadViewLocalId:String,},template:'mail.MessageList',});registerMessagingComponent(MessageList);return __exports;});;

/* /mail/static/src/components/message_reaction_group/message_reaction_group.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/message_reaction_group/message_reaction_group',async function(require){'use strict';let __exports={};const{Component}=owl;const{registerMessagingComponent}=require('@mail/utils/messaging_component');const MessageReactionGroup=__exports.MessageReactionGroup=class MessageReactionGroup extends Component{get messageReactionGroup(){return this.messaging.models['mail.message_reaction_group'].get(this.props.messageReactionGroupLocalId);}}
Object.assign(MessageReactionGroup,{props:{messageReactionGroupLocalId:String,},template:'mail.MessageReactionGroup',});registerMessagingComponent(MessageReactionGroup);return __exports;});;

/* /mail/static/src/components/message_seen_indicator/message_seen_indicator.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/message_seen_indicator/message_seen_indicator',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const MessageSeenIndicator=__exports.MessageSeenIndicator=class MessageSeenIndicator extends Component{get indicatorTitle(){if(!this.messageSeenIndicator){return'';}
if(this.messageSeenIndicator.hasEveryoneSeen){return this.env._t("Seen by Everyone");}
if(this.messageSeenIndicator.hasSomeoneSeen){const partnersThatHaveSeen=this.messageSeenIndicator.partnersThatHaveSeen.map(partner=>{if(this.message.originThread){return this.message.originThread.getMemberName(partner);}
return partner.nameOrDisplayName;});if(partnersThatHaveSeen.length===1){return _.str.sprintf(this.env._t("Seen by %s"),partnersThatHaveSeen[0]);}
if(partnersThatHaveSeen.length===2){return _.str.sprintf(this.env._t("Seen by %s and %s"),partnersThatHaveSeen[0],partnersThatHaveSeen[1]);}
return _.str.sprintf(this.env._t("Seen by %s, %s and more"),partnersThatHaveSeen[0],partnersThatHaveSeen[1]);}
if(this.messageSeenIndicator.hasEveryoneFetched){return this.env._t("Received by Everyone");}
if(this.messageSeenIndicator.hasSomeoneFetched){const partnersThatHaveFetched=this.messageSeenIndicator.partnersThatHaveFetched.map(partner=>{if(this.message.originThread){return this.message.originThread.getMemberName(partner);}
return partner.nameOrDisplayName;});if(partnersThatHaveFetched.length===1){return _.str.sprintf(this.env._t("Received by %s"),partnersThatHaveFetched[0]);}
if(partnersThatHaveFetched.length===2){return _.str.sprintf(this.env._t("Received by %s and %s"),partnersThatHaveFetched[0],partnersThatHaveFetched[1]);}
return _.str.sprintf(this.env._t("Received by %s, %s and more"),partnersThatHaveFetched[0],partnersThatHaveFetched[1]);}
return'';}
get message(){return this.messaging&&this.messaging.models['mail.message'].get(this.props.messageLocalId);}
get messageSeenIndicator(){if(!this.thread||this.thread.model!=='mail.channel'){return undefined;}
return this.messaging.models['mail.message_seen_indicator'].findFromIdentifyingData({message:this.message,thread:this.thread,});}
get thread(){return this.messaging&&this.messaging.models['mail.thread'].get(this.props.threadLocalId);}}
Object.assign(MessageSeenIndicator,{props:{messageLocalId:String,threadLocalId:String,},template:'mail.MessageSeenIndicator',});registerMessagingComponent(MessageSeenIndicator);return __exports;});;

/* /mail/static/src/components/messaging_menu/messaging_menu.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/messaging_menu/messaging_menu',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const MessagingMenu=__exports.MessagingMenu=class MessagingMenu extends Component{constructor(...args){super(...args);this.id=_.uniqueId('o_messagingMenu_');this._onMobileNewMessageInputSelect=this._onMobileNewMessageInputSelect.bind(this);this._onMobileNewMessageInputSource=this._onMobileNewMessageInputSource.bind(this);this._onClickCaptureGlobal=this._onClickCaptureGlobal.bind(this);this._constructor(...args);}
_constructor(){}
setup(){this.env=owl.Component.env;super.setup();}
mounted(){document.addEventListener('click',this._onClickCaptureGlobal,true);}
willUnmount(){document.removeEventListener('click',this._onClickCaptureGlobal,true);}
get messagingMenu(){return this.messaging&&this.messaging.messagingMenu;}
get mobileNewMessageInputPlaceholder(){return this.env._t("Search user...");}
get tabs(){return[{icon:'fa fa-envelope',id:'all',label:this.env._t("All"),},{icon:'fa fa-user',id:'chat',label:this.env._t("Chat"),},{icon:'fa fa-users',id:'channel',label:this.env._t("Channel"),}];}
_onClickCaptureGlobal(ev){if(!this.messagingMenu){return;}
if(!this.el||this.el.contains(ev.target)){return;}
this.messagingMenu.close();}
_onClickDesktopTabButton(ev){this.messagingMenu.update({activeTabId:ev.currentTarget.dataset.tabId});}
_onClickNewMessage(ev){if(!this.messaging.device.isMobile){this.messaging.chatWindowManager.openNewMessage();this.messagingMenu.close();}else{this.messagingMenu.toggleMobileNewMessage();}}
_onClickToggler(ev){ev.preventDefault();if(!this.messagingMenu){return;}
this.messagingMenu.toggleOpen();}
_onHideMobileNewMessage(ev){ev.stopPropagation();this.messagingMenu.toggleMobileNewMessage();}
_onMobileNewMessageInputSelect(ev,ui){this.messaging.openChat({partnerId:ui.item.id});}
_onMobileNewMessageInputSource(req,res){const value=_.escape(req.term);this.messaging.models['mail.partner'].imSearch({callback:partners=>{const suggestions=partners.map(partner=>{return{id:partner.id,value:partner.nameOrDisplayName,label:partner.nameOrDisplayName,};});res(_.sortBy(suggestions,'label'));},keyword:value,limit:10,});}
_onSelectMobileNavbarTab(ev){ev.stopPropagation();this.messagingMenu.update({activeTabId:ev.detail.tabId});}}
Object.assign(MessagingMenu,{props:{},template:'mail.MessagingMenu',});registerMessagingComponent(MessagingMenu);return __exports;});;

/* /mail/static/src/components/mobile_messaging_navbar/mobile_messaging_navbar.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/mobile_messaging_navbar/mobile_messaging_navbar',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const MobileMessagingNavbar=__exports.MobileMessagingNavbar=class MobileMessagingNavbar extends Component{_onClick(ev){this.trigger('o-select-mobile-messaging-navbar-tab',{tabId:ev.currentTarget.dataset.tabId,});}}
Object.assign(MobileMessagingNavbar,{defaultProps:{tabs:[],},props:{activeTabId:String,tabs:{type:Array,element:{type:Object,shape:{icon:{type:String,optional:true,},id:String,label:String,},},},},template:'mail.MobileMessagingNavbar',});registerMessagingComponent(MobileMessagingNavbar,{propsCompareDepth:{tabs:2}});return __exports;});;

/* /mail/static/src/components/notification_alert/notification_alert.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/notification_alert/notification_alert',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const NotificationAlert=__exports.NotificationAlert=class NotificationAlert extends Component{get isNotificationBlocked(){if(!this.messaging){return false;}
const windowNotification=this.env.browser.Notification;return(windowNotification&&windowNotification.permission!=="granted"&&!this.messaging.isNotificationPermissionDefault);}}
Object.assign(NotificationAlert,{props:{},template:'mail.NotificationAlert',});registerMessagingComponent(NotificationAlert);return __exports;});;

/* /mail/static/src/components/notification_group/notification_group.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/notification_group/notification_group',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const{useRef}=owl.hooks;const NotificationGroup=__exports.NotificationGroup=class NotificationGroup extends Component{constructor(...args){super(...args);this._markAsReadRef=useRef('markAsRead');}
get group(){return this.messaging&&this.messaging.models['mail.notification_group'].get(this.props.notificationGroupLocalId);}
image(){if(this.group.notification_type==='email'){return'/mail/static/src/img/smiley/mailfailure.jpg';}}
_onClick(ev){const markAsRead=this._markAsReadRef.el;if(markAsRead&&markAsRead.contains(ev.target)){return;}
this.group.openDocuments();if(!this.messaging.device.isMobile){this.messaging.messagingMenu.close();}}
_onClickMarkAsRead(ev){this.group.openCancelAction();if(!this.messaging.device.isMobile){this.messaging.messagingMenu.close();}}}
Object.assign(NotificationGroup,{props:{notificationGroupLocalId:String,},template:'mail.NotificationGroup',});registerMessagingComponent(NotificationGroup);return __exports;});;

/* /mail/static/src/components/notification_list/notification_list.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/notification_list/notification_list',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const NotificationList=__exports.NotificationList=class NotificationList extends Component{mounted(){this._loadPreviews();}
get notifications(){if(!this.messaging){return[];}
const threads=this._getThreads(this.props);let threadNeedactionNotifications=[];if(this.props.filter==='all'){threadNeedactionNotifications=this.messaging.models['mail.thread'].all(t=>t.model!=='mail.box'&&t.needactionMessagesAsOriginThread.length>0).sort((t1,t2)=>{if(t1.needactionMessagesAsOriginThread.length>0&&t2.needactionMessagesAsOriginThread.length===0){return-1;}
if(t1.needactionMessagesAsOriginThread.length===0&&t2.needactionMessagesAsOriginThread.length>0){return 1;}
if(t1.lastNeedactionMessageAsOriginThread&&t2.lastNeedactionMessageAsOriginThread){return t1.lastNeedactionMessageAsOriginThread.id<t2.lastNeedactionMessageAsOriginThread.id?1:-1;}
if(t1.lastNeedactionMessageAsOriginThread){return-1;}
if(t2.lastNeedactionMessageAsOriginThread){return 1;}
return t1.id<t2.id?-1:1;}).map(thread=>{return{thread,type:'thread_needaction',uniqueId:thread.localId+'_needaction',};});}
const threadNotifications=threads.sort((t1,t2)=>{if(t1.localMessageUnreadCounter>0&&t2.localMessageUnreadCounter===0){return-1;}
if(t1.localMessageUnreadCounter===0&&t2.localMessageUnreadCounter>0){return 1;}
if(t1.lastMessage&&t2.lastMessage){return t1.lastMessage.id<t2.lastMessage.id?1:-1;}
if(t1.lastMessage){return-1;}
if(t2.lastMessage){return 1;}
return t1.id<t2.id?-1:1;}).map(thread=>{return{thread,type:'thread',uniqueId:thread.localId,};});let notifications=threadNeedactionNotifications.concat(threadNotifications);if(this.props.filter==='all'){const notificationGroups=this.messaging.notificationGroupManager.groups;notifications=Object.values(notificationGroups).sort((group1,group2)=>group1.sequence-group2.sequence).map(notificationGroup=>{return{notificationGroup,uniqueId:notificationGroup.localId,};}).concat(notifications);}
if(this.props.filter==='all'&&this.messaging.isNotificationPermissionDefault){notifications.unshift({type:'odoobotRequest',uniqueId:'odoobotRequest',});}
return notifications;}
async _loadPreviews(){const threads=this.notifications.filter(notification=>notification.thread&&notification.thread.exists()).map(notification=>notification.thread);this.messaging.models['mail.thread'].loadPreviews(threads);}
_getThreads(props){if(props.filter==='mailbox'){return this.messaging.models['mail.thread'].all(thread=>thread.isPinned&&thread.model==='mail.box').sort((mailbox1,mailbox2)=>{if(mailbox1===this.messaging.inbox){return-1;}
if(mailbox2===this.messaging.inbox){return 1;}
if(mailbox1===this.messaging.starred){return-1;}
if(mailbox2===this.messaging.starred){return 1;}
const mailbox1Name=mailbox1.displayName;const mailbox2Name=mailbox2.displayName;mailbox1Name<mailbox2Name?-1:1;});}else if(props.filter==='channel'){return this.messaging.models['mail.thread'].all(thread=>thread.channel_type==='channel'&&thread.isPinned&&thread.model==='mail.channel').sort((c1,c2)=>c1.displayName<c2.displayName?-1:1);}else if(props.filter==='chat'){return this.messaging.models['mail.thread'].all(thread=>thread.isChatChannel&&thread.isPinned&&thread.model==='mail.channel').sort((c1,c2)=>c1.displayName<c2.displayName?-1:1);}else if(props.filter==='all'){return this.messaging.models['mail.thread'].all(thread=>thread.isPinned&&thread.model==='mail.channel').sort((c1,c2)=>c1.displayName<c2.displayName?-1:1);}else{throw new Error(`Unsupported filter ${props.filter}`);}}}
Object.assign(NotificationList,{_allowedFilters:['all','mailbox','channel','chat'],defaultProps:{filter:'all',},props:{filter:{type:String,validate:prop=>NotificationList._allowedFilters.includes(prop),},},template:'mail.NotificationList',});registerMessagingComponent(NotificationList);return __exports;});;

/* /mail/static/src/components/notification_popover/notification_popover.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/notification_popover/notification_popover',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const NotificationPopover=__exports.NotificationPopover=class NotificationPopover extends Component{get iconClass(){switch(this.notification.notification_status){case'sent':return'fa fa-check';case'bounce':return'fa fa-exclamation';case'exception':return'fa fa-exclamation';case'ready':return'fa fa-send-o';case'canceled':return'fa fa-trash-o';}
return'';}
get iconTitle(){switch(this.notification.notification_status){case'sent':return this.env._t("Sent");case'bounce':return this.env._t("Bounced");case'exception':return this.env._t("Error");case'ready':return this.env._t("Ready");case'canceled':return this.env._t("Canceled");}
return'';}
get notifications(){if(!this.messaging){return[];}
return this.props.notificationLocalIds.map(notificationLocalId=>this.messaging.models['mail.notification'].get(notificationLocalId));}}
Object.assign(NotificationPopover,{props:{notificationLocalIds:{type:Array,element:String,},},template:'mail.NotificationPopover',});registerMessagingComponent(NotificationPopover,{propsCompareDepth:{notificationLocalIds:1}});return __exports;});;

/* /mail/static/src/components/notification_request/notification_request.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/notification_request/notification_request',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const NotificationRequest=__exports.NotificationRequest=class NotificationRequest extends Component{getHeaderText(){return _.str.sprintf(this.env._t("%s has a request"),this.messaging.partnerRoot.nameOrDisplayName);}
_handleResponseNotificationPermission(value){this.messaging.refreshIsNotificationPermissionDefault();if(value!=='granted'){this.env.services['bus_service'].sendNotification({message:this.env._t("Odoo will not have the permission to send native notifications on this device."),title:this.env._t("Permission denied"),});}}
_onClick(){const windowNotification=this.env.browser.Notification;const def=windowNotification&&windowNotification.requestPermission();if(def){def.then(this._handleResponseNotificationPermission.bind(this));}
if(!this.messaging.device.isMobile){this.messaging.messagingMenu.close();}}}
Object.assign(NotificationRequest,{props:{},template:'mail.NotificationRequest',});registerMessagingComponent(NotificationRequest);return __exports;});;

/* /mail/static/src/components/partner_im_status_icon/partner_im_status_icon.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/partner_im_status_icon/partner_im_status_icon',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const PartnerImStatusIcon=__exports.PartnerImStatusIcon=class PartnerImStatusIcon extends Component{get partner(){return this.messaging&&this.messaging.models['mail.partner'].get(this.props.partnerLocalId);}
_onClick(ev){if(!this.props.hasOpenChat){return;}
this.partner.openChat();}}
Object.assign(PartnerImStatusIcon,{defaultProps:{hasBackground:true,hasOpenChat:false,},props:{partnerLocalId:String,hasBackground:Boolean,hasOpenChat:Boolean,},template:'mail.PartnerImStatusIcon',});registerMessagingComponent(PartnerImStatusIcon);return __exports;});;

/* /mail/static/src/components/popover_view/popover_view.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/popover_view/popover_view',async function(require){'use strict';let __exports={};const{useComponentToModel}=require('@mail/component_hooks/use_component_to_model/use_component_to_model');const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{usePosition}=require('@web/core/position/position_hook');const{Component}=owl;const PopoverView=__exports.PopoverView=class PopoverView extends Component{setup(){super.setup();useComponentToModel({fieldName:'component',modelName:'mail.popover_view',propNameAsRecordLocalId:'popoverViewLocalId'});usePosition(()=>this.popoverView&&this.popoverView.anchorRef&&this.popoverView.anchorRef.el,{margin:16,position:this.popoverView.position,});}
get popoverView(){return this.messaging&&this.messaging.models['mail.popover_view'].get(this.props.popoverViewLocalId);}}
Object.assign(PopoverView,{props:{popoverViewLocalId:String,},template:'mail.PopoverView',});registerMessagingComponent(PopoverView);return __exports;});;

/* /mail/static/src/components/rtc_activity_notice/rtc_activity_notice.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/rtc_activity_notice/rtc_activity_notice',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const RtcActivityNotice=__exports.RtcActivityNotice=class RtcActivityNotice extends Component{setup(){this.env=owl.Component.env;super.setup();}
_onClick(ev){this.messaging.rtc.channel.open();}}
Object.assign(RtcActivityNotice,{props:{},template:'mail.RtcActivityNotice',});registerMessagingComponent(RtcActivityNotice);return __exports;});;

/* /mail/static/src/components/rtc_call_participant_card/rtc_call_participant_card.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/rtc_call_participant_card/rtc_call_participant_card',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const{useRef}=owl.hooks;const RtcCallParticipantCard=__exports.RtcCallParticipantCard=class RtcCallParticipantCard extends Component{setup(){super.setup();this._volumeMenuAnchorRef=useRef('volumeMenuAnchor');}
get callParticipantCard(){return this.messaging.models['mail.rtc_call_participant_card'].get(this.props.callParticipantCardLocalId);}
async _onContextMenu(ev){if(!this._volumeMenuAnchorRef||!this._volumeMenuAnchorRef.el){return;}
ev.preventDefault();this._volumeMenuAnchorRef.el.click();}}
Object.assign(RtcCallParticipantCard,{props:{callParticipantCardLocalId:{type:String,},},template:'mail.RtcCallParticipantCard',});registerMessagingComponent(RtcCallParticipantCard);return __exports;});;

/* /mail/static/src/components/rtc_call_viewer/rtc_call_viewer.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/rtc_call_viewer/rtc_call_viewer',async function(require){'use strict';let __exports={};const{useUpdate}=require('@mail/component_hooks/use_update/use_update');const{registerMessagingComponent}=require('@mail/utils/messaging_component');const Dialog=require('web.OwlDialog');const{Component,useState}=owl;const{useRef}=owl.hooks;const components={Dialog,};const RtcCallViewer=__exports.RtcCallViewer=class RtcCallViewer extends Component{setup(){super.setup();this.state=useState({tileWidth:0,tileHeight:0,columnCount:0,});this.tileContainerRef=useRef('tileContainer');useUpdate({func:()=>this._update()});}
get rtcCallViewer(){return this.messaging.models['mail.rtc_call_viewer'].get(this.props.localId);}
_computeTessellation({aspectRatio=1,containerHeight,containerWidth,tileCount}){let optimalLayout={area:0,cols:0,tileHeight:0,tileWidth:0,};for(let columnCount=1;columnCount<=tileCount;columnCount++){const rowCount=Math.ceil(tileCount/columnCount);const potentialHeight=containerWidth/(columnCount*aspectRatio);const potentialWidth=containerHeight/rowCount;let tileHeight;let tileWidth;if(potentialHeight>potentialWidth){tileHeight=Math.floor(potentialWidth);tileWidth=Math.floor(tileHeight*aspectRatio);}else{tileWidth=Math.floor(containerWidth/columnCount);tileHeight=Math.floor(tileWidth/aspectRatio);}
const area=tileHeight*tileWidth;if(area<=optimalLayout.area){continue;}
optimalLayout={area,columnCount,tileHeight,tileWidth,};}
return optimalLayout;}
_setTileLayout(){if(!this.rtcCallViewer){return;}
if(!this.el){return;}
if(!this.tileContainerRef.el){return;}
const{width,height}=this.tileContainerRef.el.getBoundingClientRect();const{tileWidth,tileHeight,columnCount}=this._computeTessellation({aspectRatio:this.rtcCallViewer.aspectRatio,containerHeight:height,containerWidth:width,tileCount:this.tileContainerRef.el.children.length,});this.state.tileWidth=tileWidth;this.state.tileHeight=tileHeight;this.state.columnCount=columnCount;}
_update(){this._setTileLayout();}}
Object.assign(RtcCallViewer,{components,props:{localId:String,},template:'mail.RtcCallViewer',});registerMessagingComponent(RtcCallViewer);return __exports;});;

/* /mail/static/src/components/rtc_configuration_menu/rtc_configuration_menu.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/rtc_configuration_menu/rtc_configuration_menu',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{browser}=require("@web/core/browser/browser");const{Component}=owl;const{useState}=owl.hooks;const RtcConfigurationMenu=__exports.RtcConfigurationMenu=class RtcConfigurationMenu extends Component{setup(){super.setup();this.state=useState({userDevices:undefined,});}
async willStart(){this.state.userDevices=await browser.navigator.mediaDevices.enumerateDevices();}
_onChangeDelay(ev){this.messaging.userSetting.rtcConfigurationMenu.onChangeDelay(ev.target.value);}
_onChangePushToTalk(ev){this.messaging.userSetting.rtcConfigurationMenu.onChangePushToTalk();}
_onChangeSelectAudioInput(ev){this.messaging.userSetting.rtcConfigurationMenu.onChangeSelectAudioInput(ev.target.value);}
_onChangeThreshold(ev){this.messaging.userSetting.rtcConfigurationMenu.onChangeThreshold(ev.target.value);}
_onClickRegisterKeyButton(){this.messaging.userSetting.rtcConfigurationMenu.onClickRegisterKeyButton();}}
Object.assign(RtcConfigurationMenu,{template:'mail.RtcConfigurationMenu',});registerMessagingComponent(RtcConfigurationMenu);return __exports;});;

/* /mail/static/src/components/rtc_controller/rtc_controller.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/rtc_controller/rtc_controller',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const RtcController=__exports.RtcController=class RtcController extends Component{get rtcController(){return this.messaging&&this.messaging.models['mail.rtc_controller'].get(this.props.localId);}}
Object.assign(RtcController,{props:{localId:{type:String,},},template:'mail.RtcController',});registerMessagingComponent(RtcController);return __exports;});;

/* /mail/static/src/components/rtc_invitation_card/rtc_invitation_card.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/rtc_invitation_card/rtc_invitation_card',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const RtcInvitationCard=__exports.RtcInvitationCard=class RtcInvitationCard extends Component{get thread(){return this.messaging.models['mail.thread'].get(this.props.threadLocalId);}
async _onClickAccept(ev){this.thread.open();if(this.thread.hasPendingRtcRequest){return;}
await this.thread.toggleCall();}
_onClickAvatar(ev){this.thread.open();}
_onClickRefuse(ev){if(this.thread.hasPendingRtcRequest){return;}
this.thread.leaveCall();}}
Object.assign(RtcInvitationCard,{props:{threadLocalId:String,},template:'mail.RtcInvitationCard',});registerMessagingComponent(RtcInvitationCard);return __exports;});;

/* /mail/static/src/components/rtc_invitations/rtc_invitations.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/rtc_invitations/rtc_invitations',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const RtcInvitations=__exports.RtcInvitations=class RtcInvitations extends Component{}
Object.assign(RtcInvitations,{props:{},template:'mail.RtcInvitations',});registerMessagingComponent(RtcInvitations);return __exports;});;

/* /mail/static/src/components/rtc_layout_menu/rtc_layout_menu.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/rtc_layout_menu/rtc_layout_menu',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{useComponentToModel}=require('@mail/component_hooks/use_component_to_model/use_component_to_model');const{Component}=owl;const RtcLayoutMenu=__exports.RtcLayoutMenu=class RtcLayoutMenu extends Component{setup(){super.setup();useComponentToModel({fieldName:'component',modelName:'mail.rtc_layout_menu',propNameAsRecordLocalId:'localId'});}
get layoutMenu(){return this.messaging&&this.messaging.models['mail.rtc_layout_menu'].get(this.props.localId);}}
Object.assign(RtcLayoutMenu,{props:{localId:String,},template:'mail.RtcLayoutMenu',});registerMessagingComponent(RtcLayoutMenu);return __exports;});;

/* /mail/static/src/components/rtc_option_list/rtc_option_list.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/rtc_option_list/rtc_option_list',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{useComponentToModel}=require('@mail/component_hooks/use_component_to_model/use_component_to_model');const{Component}=owl;const RtcOptionList=__exports.RtcOptionList=class RtcOptionList extends Component{setup(){super.setup();useComponentToModel({fieldName:'component',modelName:'mail.rtc_option_list',propNameAsRecordLocalId:'localId'});}
get rtcOptionList(){return this.messaging&&this.messaging.models['mail.rtc_option_list'].get(this.props.localId);}}
Object.assign(RtcOptionList,{props:{localId:String,},template:'mail.RtcOptionList',});registerMessagingComponent(RtcOptionList);return __exports;});;

/* /mail/static/src/components/rtc_video/rtc_video.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/rtc_video/rtc_video',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{useUpdate}=require('@mail/component_hooks/use_update/use_update');const{Component}=owl;const{useRef}=owl.hooks;const RtcVideo=__exports.RtcVideo=class RtcVideo extends Component{setup(){super.setup();useUpdate({func:()=>this._update()});this._videoRef=useRef("video");}
get rtcSession(){return this.messaging.models["mail.rtc_session"].get(this.props.rtcSessionLocalId);}
_update(){this._loadVideo();}
_loadVideo(){if(!this._videoRef){return;}
if(!this.rtcSession||!this.rtcSession.videoStream){this._videoRef.el.srcObject=undefined;}else{this._videoRef.el.srcObject=this.rtcSession.videoStream;}
this._videoRef.el.load();}
async _onVideoLoadedMetaData(ev){try{await ev.target.play();}catch(error){if(typeof error==='object'&&error.name==='NotAllowedError'){return;}
throw error;}}}
Object.assign(RtcVideo,{props:{rtcSessionLocalId:{type:String,},},template:'mail.RtcVideo',});registerMessagingComponent(RtcVideo);return __exports;});;

/* /mail/static/src/components/thread_icon/thread_icon.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/thread_icon/thread_icon',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const ThreadIcon=__exports.ThreadIcon=class ThreadIcon extends Component{get thread(){return this.messaging&&this.messaging.models['mail.thread'].get(this.props.threadLocalId);}}
Object.assign(ThreadIcon,{props:{threadLocalId:String,},template:'mail.ThreadIcon',});registerMessagingComponent(ThreadIcon);return __exports;});;

/* /mail/static/src/components/thread_needaction_preview/thread_needaction_preview.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/thread_needaction_preview/thread_needaction_preview',async function(require){'use strict';let __exports={};const mailUtils=require('@mail/js/utils');const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const{useRef}=owl.hooks;const ThreadNeedactionPreview=__exports.ThreadNeedactionPreview=class ThreadNeedactionPreview extends Component{constructor(...args){super(...args);this._markAsReadRef=useRef('markAsRead');}
image(){if(this.thread.moduleIcon){return this.thread.moduleIcon;}
if(this.thread.correspondent){return this.thread.correspondent.avatarUrl;}
if(this.thread.model==='mail.channel'){return`/web/image/mail.channel/${this.thread.id}/avatar_128?unique=${this.thread.avatarCacheKey}`;}
return'/mail/static/src/img/smiley/avatar.jpg';}
get inlineLastNeedactionMessageAsOriginThreadBody(){if(!this.thread.lastNeedactionMessageAsOriginThread){return'';}
return mailUtils.htmlToTextContentInline(this.thread.lastNeedactionMessageAsOriginThread.prettyBody);}
get thread(){return this.messaging&&this.messaging.models['mail.thread'].get(this.props.threadLocalId);}
_onClick(ev){const markAsRead=this._markAsReadRef.el;if(markAsRead&&markAsRead.contains(ev.target)){return;}
this.thread.open();if(!this.messaging.device.isMobile){this.messaging.messagingMenu.close();}}
_onClickMarkAsRead(ev){this.messaging.models['mail.message'].markAllAsRead([['model','=',this.thread.model],['res_id','=',this.thread.id],]);}}
Object.assign(ThreadNeedactionPreview,{props:{threadLocalId:String,},template:'mail.ThreadNeedactionPreview',});registerMessagingComponent(ThreadNeedactionPreview);return __exports;});;

/* /mail/static/src/components/thread_preview/thread_preview.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/thread_preview/thread_preview',async function(require){'use strict';let __exports={};const mailUtils=require('@mail/js/utils');const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const{useRef}=owl.hooks;const ThreadPreview=__exports.ThreadPreview=class ThreadPreview extends Component{constructor(...args){super(...args);this._markAsReadRef=useRef('markAsRead');}
image(){if(this.thread.correspondent){return this.thread.correspondent.avatarUrl;}
return`/web/image/mail.channel/${this.thread.id}/avatar_128?unique=${this.thread.avatarCacheKey}`;}
get inlineLastMessageBody(){if(!this.thread.lastMessage){return'';}
return mailUtils.htmlToTextContentInline(this.thread.lastMessage.prettyBody);}
get thread(){return this.messaging&&this.messaging.models['mail.thread'].get(this.props.threadLocalId);}
_onClick(ev){const markAsRead=this._markAsReadRef.el;if(markAsRead&&markAsRead.contains(ev.target)){return;}
this.thread.open();if(!this.messaging.device.isMobile){this.messaging.messagingMenu.close();}}
_onClickMarkAsRead(ev){if(this.thread.lastNonTransientMessage){this.thread.markAsSeen(this.thread.lastNonTransientMessage);}}}
Object.assign(ThreadPreview,{props:{threadLocalId:String,},template:'mail.ThreadPreview',});registerMessagingComponent(ThreadPreview);return __exports;});;

/* /mail/static/src/components/thread_textual_typing_status/thread_textual_typing_status.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/thread_textual_typing_status/thread_textual_typing_status',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const ThreadTextualTypingStatus=__exports.ThreadTextualTypingStatus=class ThreadTextualTypingStatus extends Component{get thread(){return this.messaging&&this.messaging.models['mail.thread'].get(this.props.threadLocalId);}}
Object.assign(ThreadTextualTypingStatus,{props:{threadLocalId:String,},template:'mail.ThreadTextualTypingStatus',});registerMessagingComponent(ThreadTextualTypingStatus);return __exports;});;

/* /mail/static/src/components/thread_typing_icon/thread_typing_icon.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/thread_typing_icon/thread_typing_icon',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const ThreadTypingIcon=__exports.ThreadTypingIcon=class ThreadTypingIcon extends Component{}
Object.assign(ThreadTypingIcon,{defaultProps:{animation:'none',size:'small',},props:{animation:{type:String,validate:prop=>['bounce','none','pulse'].includes(prop),},size:{type:String,validate:prop=>['small','medium'].includes(prop),},title:{type:String,optional:true,}},template:'mail.ThreadTypingIcon',});registerMessagingComponent(ThreadTypingIcon);return __exports;});;

/* /mail/static/src/components/thread_view/thread_view.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/thread_view/thread_view',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;const{useRef}=owl.hooks;const ThreadView=__exports.ThreadView=class ThreadView extends Component{setup(){super.setup();this._messageListRef=useRef('messageList');}
getScrollHeight(){if(!this._messageListRef.comp){return undefined;}
return this._messageListRef.comp.getScrollHeight();}
getScrollTop(){if(!this._messageListRef.comp){return undefined;}
return this._messageListRef.comp.getScrollTop();}
onScroll(ev){if(!this._messageListRef.comp){return;}
this._messageListRef.comp.onScroll(ev);}
get threadView(){return this.messaging&&this.messaging.models['mail.thread_view'].get(this.props.threadViewLocalId);}
_onClickRetryLoadMessages(){if(!this.threadView){return;}
if(!this.threadView.threadCache){return;}
this.threadView.threadCache.update({hasLoadingFailed:false});}}
Object.assign(ThreadView,{defaultProps:{hasComposerDiscardButton:false,hasComposerThreadName:false,showComposerAttachmentsExtensions:true,showComposerAttachmentsFilenames:true,},props:{getScrollableElement:{type:Function,optional:true,},hasComposerCurrentPartnerAvatar:{type:Boolean,optional:true,},hasComposerDiscardButton:{type:Boolean,optional:true,},hasComposerSendButton:{type:Boolean,optional:true,},hasComposerThreadName:{type:Boolean,optional:true,},hasComposerThreadTyping:{type:Boolean,optional:true,},hasScrollAdjust:{type:Boolean,optional:true,},showComposerAttachmentsExtensions:Boolean,showComposerAttachmentsFilenames:Boolean,threadViewLocalId:String,},template:'mail.ThreadView',});registerMessagingComponent(ThreadView);return __exports;});;

/* /mail/static/src/components/thread_view_topbar/thread_view_topbar.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/thread_view_topbar/thread_view_topbar',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{useRefToModel}=require('@mail/component_hooks/use_ref_to_model/use_ref_to_model');const{useUpdateToModel}=require('@mail/component_hooks/use_update_to_model/use_update_to_model');const{Component}=owl;const ThreadViewTopbar=__exports.ThreadViewTopbar=class ThreadViewTopbar extends Component{setup(){super.setup();useRefToModel({fieldName:'guestNameInputRef',modelName:'mail.thread_view_topbar',propNameAsRecordLocalId:'localId',refName:'guestNameInput'});useRefToModel({fieldName:'inviteButtonRef',modelName:'mail.thread_view_topbar',propNameAsRecordLocalId:'localId',refName:'inviteButton'});useRefToModel({fieldName:'threadNameInputRef',modelName:'mail.thread_view_topbar',propNameAsRecordLocalId:'localId',refName:'threadNameInput'});useRefToModel({fieldName:'threadDescriptionInputRef',modelName:'mail.thread_view_topbar',propNameAsRecordLocalId:'localId',refName:'threadDescriptionInput'});useUpdateToModel({methodName:'onComponentUpdate',modelName:'mail.thread_view_topbar',propNameAsRecordLocalId:'localId'});}
get threadViewTopbar(){return this.messaging&&this.messaging.models['mail.thread_view_topbar'].get(this.props.localId);}
async _onClickPhone(ev){if(this.threadViewTopbar.thread.hasPendingRtcRequest){return;}
await this.threadViewTopbar.thread.toggleCall();}
async _onClickCamera(ev){if(this.threadViewTopbar.thread.hasPendingRtcRequest){return;}
await this.threadViewTopbar.thread.toggleCall({startWithVideo:true,});}}
Object.assign(ThreadViewTopbar,{props:{localId:String,},template:'mail.ThreadViewTopbar',});registerMessagingComponent(ThreadViewTopbar);return __exports;});;

/* /mail/static/src/components/welcome_view/welcome_view.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/components/welcome_view/welcome_view',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{useRefToModel}=require('@mail/component_hooks/use_ref_to_model/use_ref_to_model');const{useUpdateToModel}=require('@mail/component_hooks/use_update_to_model/use_update_to_model');const WelcomeView=__exports.WelcomeView=class WelcomeView extends owl.Component{setup(){super.setup();useRefToModel({fieldName:'guestNameInputRef',modelName:'mail.welcome_view',propNameAsRecordLocalId:'localId',refName:'guestNameInput'});useUpdateToModel({methodName:'onComponentUpdate',modelName:'mail.welcome_view',propNameAsRecordLocalId:'localId'});}
get welcomeView(){return this.messaging&&this.messaging.models['mail.welcome_view'].get(this.props.localId);}}
Object.assign(WelcomeView,{props:{localId:String},template:'mail.WelcomeView',});registerMessagingComponent(WelcomeView);return __exports;});;

/* /mail/static/src/js/emojis.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/js/emojis',async function(require){'use strict';let __exports={};const data={":)":"😊",":-)":"😊","=)":"😊",":]":"😊",":D":"😃",":-D":"😃","=D":"😃","xD":"😆","XD":"😆","x'D":"😂",";)":"😉",";-)":"😉","B)":"😎","8)":"😎","B-)":"😎","8-)":"😎",";p":"😜",";P":"😜",":p":"😋",":P":"😋",":-p":"😋",":-P":"😋","=P":"😋","xp":"😝","xP":"😝","o_o":"😳",":|":"😐",":-|":"😐",":/":"😕",":-/":"😕",":(":"😞",":@":"😱",":O":"😲",":-O":"😲",":o":"😲",":-o":"😲",":'o":"😨","3:(":"😠",">:(":"😠","3:)":"😈",">:)":"😈",":*":"😘",":-*":"😘","o:)":"😇",":'(":"😢",":'-(":"😭",":\"(":"😭","<3":"❤️","&lt;3":"❤️",":heart":"❤️","</3":"💔","&lt;/3":"💔",":heart_eyes":"😍",":turban":"👳",":+1":"👍",":-1":"👎",":ok":"👌",":poop":"💩",":no_see":"🙈",":no_hear":"🙉",":no_speak":"🙊",":bug":"🐞",":kitten":"😺",":bear":"🐻",":snail":"🐌",":boar":"🐗",":clover":"🍀",":sunflower":"🌹",":fire":"🔥",":sun":"☀️",":partly_sunny:":"⛅️",":rainbow":"🌈",":cloud":"☁️",":zap":"⚡️",":star":"⭐️",":cookie":"🍪",":pizza":"🍕",":hamburger":"🍔",":fries":"🍟",":cake":"🎂",":cake_part":"🍰",":coffee":"☕️",":banana":"🍌",":sushi":"🍣",":rice_ball":"🍙",":beer":"🍺",":wine":"🍷",":cocktail":"🍸",":tropical":"🍹",":beers":"🍻",":ghost":"👻",":skull":"💀",":et":"👽",":alien":"👽",":party":"🎉",":trophy":"🏆",":key":"🔑",":pin":"📌",":postal_horn":"📯",":music":"🎵",":trumpet":"🎺",":guitar":"🎸",":run":"🏃",":bike":"🚲",":soccer":"⚽️",":football":"🏈",":8ball":"🎱",":clapper":"🎬",":microphone":"🎤",":cheese":"🧀",};var emojiDict={};_.each(data,function(unicode,source){if(!emojiDict[unicode]){emojiDict[unicode]={sources:[source],unicode:unicode,description:source,};}else{emojiDict[unicode].sources.push(source);}});const emojis=__exports.emojis=_.values(emojiDict);__exports[Symbol.for("default")]=emojis;return __exports;});;

/* /mail/static/src/js/utils.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/js/utils',async function(require){'use strict';let __exports={};const core=require('web.core');var _t=core._t;function parseAndTransform(htmlString,transformFunction){var openToken="OPEN"+Date.now();var string=htmlString.replace(/&lt;/g,openToken);var children;try{children=$('<div>').html(string).contents();}catch(e){children=$('<div>').html('<pre>'+string+'</pre>').contents();}
return _parseAndTransform(children,transformFunction).replace(new RegExp(openToken,"g"),"&lt;");}
function _parseAndTransform(nodes,transformFunction){return _.map(nodes,function(node){return transformFunction(node,function(){return _parseAndTransform(node.childNodes,transformFunction);});}).join("");}
var urlRegexp=/\b(?:https?:\/\/\d{1,3}(?:\.\d{1,3}){3}|(?:https?:\/\/|(?:www\.))[-a-z0-9@:%._+~#=\u00C0-\u024F\u1E00-\u1EFF]{2,256}\.[a-z]{2,13})\b(?:[-a-z0-9@:%_+.~#?&'$//=;\u00C0-\u024F\u1E00-\u1EFF]*)/gi;function linkify(text,attrs){attrs=attrs||{};if(attrs.target===undefined){attrs.target='_blank';}
if(attrs.target==='_blank'){attrs.rel='noreferrer noopener';}
attrs=_.map(attrs,function(value,key){return key+'="'+_.escape(value)+'"';}).join(' ');return text.replace(urlRegexp,function(url){var href=(!/^https?:\/\//i.test(url))?"http://"+url:url;return'<a '+attrs+' href="'+href+'">'+url+'</a>';});}
function addLink(node,transformChildren){if(node.nodeType===3){const linkified=linkify(node.data);if(linkified!==node.data){const div=document.createElement('div');div.innerHTML=linkified;for(const childNode of[...div.childNodes]){node.parentNode.insertBefore(childNode,node);}
node.parentNode.removeChild(node);return linkified;}
return node.textContent;}
if(node.tagName==="A")return node.outerHTML;transformChildren();return node.outerHTML;}
function htmlToTextContentInline(htmlString){const fragment=document.createDocumentFragment();const div=document.createElement('div');fragment.appendChild(div);htmlString=htmlString.replace(/<br\s*\/?>/gi,' ');try{div.innerHTML=htmlString;}catch(e){div.innerHTML=`<pre>${htmlString}</pre>`;}
return div.textContent.trim().replace(/[\n\r]/g,'').replace(/\s\s+/g,' ');}
function stripHTML(node,transformChildren){if(node.nodeType===3)return node.data;if(node.tagName==="BR")return"\n";return transformChildren();}
function inline(node,transform_children){if(node.nodeType===3)return node.data;if(node.nodeType===8)return"";if(node.tagName==="BR")return" ";if(node.tagName.match(/^(A|P|DIV|PRE|BLOCKQUOTE)$/))return transform_children();node.innerHTML=transform_children();return node.outerHTML;}
function parseEmail(text){if(text){var result=text.match(/(.*)<(.*@.*)>/);if(result){return[_.str.trim(result[1]),_.str.trim(result[2])];}
result=text.match(/(.*@.*)/);if(result){return[_.str.trim(result[1]),_.str.trim(result[1])];}
return[text,false];}}
function escapeAndCompactTextContent(content){let value=owl.utils.escape(content).trim();value=value.replace(/(\r|\n){2,}/g,'<br/><br/>');value=value.replace(/(\r|\n)/g,'<br/>');value=value.replace(/ /g,'&nbsp;').replace(/([^>])&nbsp;([^<])/g,'$1 $2');return value;}
function getTextToHTML(text){return text.replace(/((?:https?|ftp):\/\/[\S]+)/g,'<a href="$1">$1</a> ').replace(/[\n\r]/g,'<br/>');}
function timeFromNow(date){if(moment().diff(date,'seconds')<45){return _t("now");}
return date.fromNow();}
Object.assign(__exports,{addLink,escapeAndCompactTextContent,getTextToHTML,htmlToTextContentInline,inline,linkify,parseAndTransform,parseEmail,stripHTML,timeFromNow,});return __exports;});;

/* /mail/static/src/model/model_core.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/model/model_core',async function(require){'use strict';let __exports={};const registry={};function _getEntryFromModelName(modelName){if(!registry[modelName]){registry[modelName]={dependencies:[],factory:undefined,name:modelName,patches:[],};}
return registry[modelName];}
function _registerPatchModel(modelName,patchName,patch,{type='instance'}={}){const entry=_getEntryFromModelName(modelName);Object.assign(entry,{patches:(entry.patches||[]).concat([{name:patchName,patch,type,}]),});}
function registerClassPatchModel(modelName,patchName,patch){_registerPatchModel(modelName,patchName,patch,{type:'class'});}
function registerFieldPatchModel(modelName,patchName,patch){_registerPatchModel(modelName,patchName,patch,{type:'field'});}
function registerIdentifyingFieldsPatch(modelName,patchName,patch){_registerPatchModel(modelName,patchName,patch,{type:'identifyingFields'});}
function registerInstancePatchModel(modelName,patchName,patch){_registerPatchModel(modelName,patchName,patch,{type:'instance'});}
function registerNewModel(name,factory,dependencies=[]){const entry=_getEntryFromModelName(name);let entryDependencies=[...dependencies];if(name!=='mail.model'){entryDependencies=[...new Set(entryDependencies.concat(['mail.model']))];}
if(entry.factory){throw new Error(`Model "${name}" has already been registered!`);}
Object.assign(entry,{dependencies:entryDependencies,factory,name,});}
Object.assign(__exports,{registerClassPatchModel,registerFieldPatchModel,registerInstancePatchModel,registerIdentifyingFieldsPatch,registerNewModel,registry,});return __exports;});;

/* /mail/static/src/model/model_errors.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/model/model_errors',async function(require){'use strict';let __exports={};const RecordDeletedError=__exports.RecordDeletedError=class RecordDeletedError extends Error{constructor(recordLocalId,...args){super(...args);this.recordLocalId=recordLocalId;this.name='RecordDeletedError';}}
return __exports;});;

/* /mail/static/src/model/model_field.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/model/model_field',async function(require){'use strict';let __exports={};const{clear,FieldCommand,link,replace,unlink,unlinkAll}=require('@mail/model/model_field_command');const ModelField=__exports.ModelField=class ModelField{constructor({compute,default:def,fieldName,fieldType,inverse,isCausal=false,readonly=false,related,relationType,required=false,sort,to,}={}){this.compute=compute;this.default=def;this.fieldName=fieldName;this.fieldType=fieldType;this.inverse=inverse;this.isCausal=isCausal;this.readonly=readonly;this.related=related;this.relationType=relationType;this.required=required;this.sort=sort;this.sumContributions=[];this.to=to;}
static attr(options){return Object.assign({fieldType:'attribute'},options);}
static many2many(modelName,options){return ModelField._relation(modelName,Object.assign({},options,{relationType:'many2many'}));}
static many2one(modelName,options){return ModelField._relation(modelName,Object.assign({},options,{relationType:'many2one'}));}
static one2many(modelName,options){return ModelField._relation(modelName,Object.assign({},options,{relationType:'one2many'}));}
static one2one(modelName,options){return ModelField._relation(modelName,Object.assign({},options,{relationType:'one2one'}));}
clear(record,options){let hasChanged=false;if(this.fieldType==='relation'){if(this.parseAndExecuteCommands(record,unlinkAll(),options)){hasChanged=true;}
if(!this.default){return hasChanged;}}
if(this.parseAndExecuteCommands(record,this.default,options)){hasChanged=true;}
return hasChanged;}
computeRelated(record){const[relationName,relatedFieldName]=this.related.split('.');const Model=record.constructor;const relationField=Model.__fieldMap[relationName];if(['one2many','many2many'].includes(relationField.relationType)){const newVal=[];for(const otherRecord of record[relationName]){const otherValue=otherRecord[relatedFieldName];if(otherValue){if(otherValue instanceof Array){for(const v of otherValue){newVal.push(v);}}else{newVal.push(otherValue);}}}
if(this.fieldType==='relation'){return replace(newVal);}
return newVal;}
const otherRecord=record[relationName];if(otherRecord){const newVal=otherRecord[relatedFieldName];if(newVal===undefined){return clear();}
if(this.fieldType==='relation'){return replace(newVal);}
return newVal;}
return clear();}
convertToFieldCommandList(newVal){if(newVal instanceof FieldCommand){return[newVal];}else if(newVal instanceof Array&&newVal[0]instanceof FieldCommand){return newVal;}else if(this.fieldType==='relation'){return newVal.map(([name,value])=>new FieldCommand(name,value));}else{return[new FieldCommand('set',newVal)];}}
decrement(record,amount){const currentValue=this.read(record);return this._setAttribute(record,currentValue-amount);}
get(record){if(this.fieldType==='attribute'){return this.read(record);}
if(this.fieldType==='relation'){if(['one2one','many2one'].includes(this.relationType)){return this.read(record);}
return[...this.read(record)];}
throw new Error(`cannot get field with unsupported type ${this.fieldType}.`);}
increment(record,amount){const currentValue=this.read(record);return this._setAttribute(record,currentValue+amount);}
parseAndExecuteCommands(record,newVal,options){const commandList=this.convertToFieldCommandList(newVal);let hasChanged=false;for(const command of commandList){const commandName=command.name;const newVal=command.value;if(this.fieldType==='attribute'){switch(commandName){case'clear':if(this.clear(record,options)){hasChanged=true;}
break;case'decrement':if(this.decrement(record,newVal)){hasChanged=true;}
break;case'increment':if(this.increment(record,newVal)){hasChanged=true;}
break;case'set':if(this._setAttribute(record,newVal)){hasChanged=true;}
break;default:throw new Error(`Field "${record.constructor.modelName}/${this.fieldName}"(${this.fieldType} type) does not support command "${commandName}"`);}}else if(this.fieldType==='relation'){switch(commandName){case'clear':if(this.clear(record,options)){hasChanged=true;}
break;case'insert':if(this._setRelationInsert(record,newVal,options)){hasChanged=true;}
break;case'insert-and-replace':if(this._setRelationInsertAndReplace(record,newVal,options)){hasChanged=true;}
break;case'insert-and-unlink':if(this._setRelationInsertAndUnlink(record,newVal,options)){hasChanged=true;}
break;case'link':if(this._setRelationLink(record,newVal,options)){hasChanged=true;}
break;case'replace':if(this._setRelationReplace(record,newVal,options)){hasChanged=true;}
break;case'unlink':if(this._setRelationUnlink(record,newVal,options)){hasChanged=true;}
break;case'unlink-all':if(this._setRelationUnlink(record,this.get(record),options)){hasChanged=true;}
break;default:throw new Error(`Field "${record.constructor.modelName}/${this.fieldName}"(${this.fieldType} type) does not support command "${commandName}"`);}}}
return hasChanged;}
read(record){return record.__values[this.fieldName];}
toString(){return`field(${this.fieldName})`;}
static _relation(modelName,options){return Object.assign({fieldType:'relation',to:modelName,},options);}
_convertX2ManyValue(newValue,{hasToVerify=true}={}){if(typeof newValue[Symbol.iterator]==='function'){if(hasToVerify){for(const value of newValue){this._verifyRelationalValue(value);}}
return newValue;}
if(hasToVerify){this._verifyRelationalValue(newValue);}
return[newValue];}
_insertOtherRecord(record,data){const OtherModel=record.models[this.to];const isMulti=typeof data[Symbol.iterator]==='function';const dataList=[];for(const recordData of(isMulti?data:[data])){const recordData2={...recordData};if(['one2one','one2many'].includes(this.relationType)){recordData2[this.inverse]=replace(record);}else{recordData2[this.inverse]=link(record);}
dataList.push(recordData2);}
const records=record.modelManager._insert(OtherModel,dataList);return isMulti?records:records[0];}
_setAttribute(record,newVal){const currentValue=this.read(record);if(currentValue===newVal){return false;}
record.__values[this.fieldName]=newVal;return true;}
_setRelationInsert(record,data,options){const newValue=this._insertOtherRecord(record,data);return this._setRelationLink(record,newValue,options);}
_setRelationInsertAndReplace(record,data,options){const newValue=this._insertOtherRecord(record,data);return this._setRelationReplace(record,newValue,options);}
_setRelationInsertAndUnlink(record,data,options){const newValue=this._insertOtherRecord(record,data);return this._setRelationUnlink(record,newValue,options);}
_setRelationLink(record,newValue,options){switch(this.relationType){case'many2many':case'one2many':return this._setRelationLinkX2Many(record,newValue,options);case'many2one':case'one2one':return this._setRelationLinkX2One(record,newValue,options);}}
_setRelationLinkX2Many(record,newValue,{hasToUpdateInverse=true}={}){const hasToVerify=record.modelManager.isDebug;const recordsToLink=this._convertX2ManyValue(newValue,{hasToVerify});const otherRecords=this.read(record);let hasChanged=false;for(const recordToLink of recordsToLink){if(otherRecords.has(recordToLink)){continue;}
hasChanged=true;otherRecords.add(recordToLink);if(hasToUpdateInverse){record.modelManager._update(recordToLink,{[this.inverse]:link(record)},{allowWriteReadonly:true,hasToUpdateInverse:false});}}
return hasChanged;}
_setRelationLinkX2One(record,recordToLink,{hasToUpdateInverse=true}={}){if(record.modelManager.isDebug){this._verifyRelationalValue(recordToLink);}
const prevOtherRecord=this.read(record);if(prevOtherRecord===recordToLink){return false;}
this._setRelationUnlinkX2One(record,{hasToUpdateInverse:true});record.__values[this.fieldName]=recordToLink;if(hasToUpdateInverse){record.modelManager._update(recordToLink,{[this.inverse]:link(record)},{allowWriteReadonly:true,hasToUpdateInverse:false});}
return true;}
_setRelationReplace(record,newValue,options){if(['one2one','many2one'].includes(this.relationType)){return this._setRelationLinkX2One(record,newValue,options);}
let hasChanged=false;let hasToReorder=false;const otherRecordsSet=this.read(record);const otherRecordsList=[...otherRecordsSet];const hasToVerify=record.modelManager.isDebug;const recordsToReplaceList=[...this._convertX2ManyValue(newValue,{hasToVerify})];const recordsToReplaceSet=new Set(recordsToReplaceList);const recordsToLink=[];for(let i=0;i<recordsToReplaceList.length;i++){const recordToReplace=recordsToReplaceList[i];if(!otherRecordsSet.has(recordToReplace)){recordsToLink.push(recordToReplace);}
if(otherRecordsList[i]!==recordToReplace){hasToReorder=true;}}
if(this._setRelationLinkX2Many(record,recordsToLink,options)){hasChanged=true;}
const recordsToUnlink=[];for(let i=0;i<otherRecordsList.length;i++){const otherRecord=otherRecordsList[i];if(!recordsToReplaceSet.has(otherRecord)){recordsToUnlink.push(otherRecord);}
if(recordsToReplaceList[i]!==otherRecord){hasToReorder=true;}}
if(this._setRelationUnlinkX2Many(record,recordsToUnlink,options)){hasChanged=true;}
if(hasToReorder){otherRecordsSet.clear();for(const record of recordsToReplaceList){otherRecordsSet.add(record);}
hasChanged=true;}
return hasChanged;}
_setRelationUnlink(record,newValue,options){switch(this.relationType){case'many2many':case'one2many':return this._setRelationUnlinkX2Many(record,newValue,options);case'many2one':case'one2one':return this._setRelationUnlinkX2One(record,options);}}
_setRelationUnlinkX2Many(record,newValue,{hasToUpdateInverse=true}={}){const recordsToUnlink=this._convertX2ManyValue(newValue,{hasToVerify:false});const otherRecords=this.read(record);let hasChanged=false;for(const recordToUnlink of recordsToUnlink){const wasLinked=otherRecords.delete(recordToUnlink);if(!wasLinked){continue;}
hasChanged=true;if(hasToUpdateInverse){if(!recordToUnlink.exists()){continue;}
if(this.isCausal){record.modelManager._delete(recordToUnlink);}else{record.modelManager._update(recordToUnlink,{[this.inverse]:unlink(record)},{allowWriteReadonly:true,hasToUpdateInverse:false});}}}
return hasChanged;}
_setRelationUnlinkX2One(record,{hasToUpdateInverse=true}={}){const otherRecord=this.read(record);if(!otherRecord){return false;}
record.__values[this.fieldName]=undefined;if(hasToUpdateInverse){if(!otherRecord.exists()){return;}
if(this.isCausal){record.modelManager._delete(otherRecord);}else{record.modelManager._update(otherRecord,{[this.inverse]:unlink(record)},{allowWriteReadonly:true,hasToUpdateInverse:false});}}
return true;}
_verifyRelationalValue(record){if(!record){throw Error(`record is undefined. Did you try to link() or insert() empty value? Considering clear() instead.`);}
if(!record.modelManager){throw Error(`${record} is not a record. Did you try to use link() instead of insert() with data?`);}
const OtherModel=record.modelManager.models[this.to];if(!OtherModel.get(record.localId,{isCheckingInheritance:true})){throw Error(`Record ${record.localId} is not valid for relational field ${this.fieldName}.`);}}}
const attr=__exports.attr=ModelField.attr;const many2many=__exports.many2many=ModelField.many2many;const many2one=__exports.many2one=ModelField.many2one;const one2many=__exports.one2many=ModelField.one2many;const one2one=__exports.one2one=ModelField.one2one;return __exports;});;

/* /mail/static/src/model/model_field_command.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/model/model_field_command',async function(require){'use strict';let __exports={};class FieldCommand{constructor(name,value){this._name=name;this._value=value;}
get name(){return this._name;}
get value(){return this._value;}}
function clear(){return new FieldCommand('clear');}
function create(data){return new FieldCommand('create',data);}
function decrement(amount=1){return new FieldCommand('decrement',amount);}
function increment(amount=1){return new FieldCommand('increment',amount);}
function insert(data){return new FieldCommand('insert',data);}
function insertAndReplace(data={}){return new FieldCommand('insert-and-replace',data);}
function link(newValue){return new FieldCommand('link',newValue);}
function replace(newValue){return new FieldCommand('replace',newValue);}
function set(newValue){return new FieldCommand('set',newValue);}
function unlink(data){return new FieldCommand('unlink',data);}
function unlinkAll(){return new FieldCommand('unlink-all');}
Object.assign(__exports,{FieldCommand,clear,create,decrement,increment,insert,insertAndReplace,link,replace,set,unlink,unlinkAll,});return __exports;});;

/* /mail/static/src/model/model_field_relation_set.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/model/model_field_relation_set',async function(require){'use strict';let __exports={};const{decrement,increment}=require('@mail/model/model_field_command');const{Listener}=require('@mail/model/model_listener');const{followRelations}=require('@mail/model/model_utils');const RelationSet=__exports.RelationSet=class RelationSet{constructor(record,field){this.record=record;this.field=field;this.set=new Set();if(this.field.sort){this.sortArray=new Array();this.sortListenerByValue=new Map();}
if(this.field.sumContributions.length>0){this.sumByValueByField=new Map();this.sumListenerByValueByField=new Map();for(const{to:sumFieldName}of this.field.sumContributions){this.sumByValueByField.set(sumFieldName,new Map());this.sumListenerByValueByField.set(sumFieldName,new Map());}}}
get size(){return this.set.size;}
add(value){if(this.set.has(value)){return;}
this.set.add(value);if(this.field.sort){this.sortArray.push(value);const listener=new Listener({isPartOfUpdateCycle:true,name:`sort of ${value} in ${this.field} of ${this.record}`,onChange:info=>{this.record.modelManager.startListening(listener);const compareDefinition=this.record[this.field.sort]();const relatedPathSet=new Set(compareDefinition.map(operation=>operation[1]));for(const relatedPath of relatedPathSet){followRelations(value,relatedPath);}
this.record.modelManager.stopListening(listener);const compareFunction=(a,b)=>{for(const[compareMethod,relatedPath]of compareDefinition){const valA=followRelations(a,relatedPath);const valB=followRelations(b,relatedPath);switch(compareMethod){case'defined-first':{if(!valA&&!valB){return 0;}
if(!valA){return 1;}
if(!valB){return-1;}
break;}
case'case-insensitive-asc':if(valA.toLowerCase()===valB.toLowerCase()){break;}
return valA.toLowerCase()<valB.toLowerCase()?-1:1;case'smaller-first':if(valA===valB){break;}
return valA-valB;case'greater-first':if(valA===valB){break;}
return valB-valA;default:throw Error(`sort compare method "${compareMethod}" is not supported.`);}}
return 0;};this.sortArray.sort(compareFunction);this.record.modelManager._markRecordFieldAsChanged(this.record,this.field);},});this.sortListenerByValue.set(value,listener);listener.onChange({reason:'initial call'});}
for(const{from:contributionFieldName,to:sumFieldName}of this.field.sumContributions){this.sumByValueByField.get(sumFieldName).set(value,0);const listener=new Listener({isPartOfUpdateCycle:true,name:`sum of field(${sumFieldName}) of ${this.record} from field(${contributionFieldName}) of ${value} through relation ${this.field}`,onChange:info=>{this.record.modelManager.startListening(listener);const contribution=value[contributionFieldName];this.record.modelManager.stopListening(listener);const previousContribution=this.sumByValueByField.get(sumFieldName).get(value);this.sumByValueByField.get(sumFieldName).set(value,contribution);this.record.modelManager._update(this.record,{[sumFieldName]:[decrement(previousContribution),increment(contribution),],},{allowWriteReadonly:true},);},});this.sumListenerByValueByField.get(sumFieldName).set(value,listener);listener.onChange({reason:'initial call'});}}
clear(){for(const record of this.set){this.delete(record);}}
delete(value){const wasPresent=this.set.delete(value);if(!wasPresent){return false;}
if(this.field.sort){const index=this.sortArray.indexOf(value);this.sortArray.splice(index,1);const listener=this.sortListenerByValue.get(value);this.sortListenerByValue.delete(listener);this.record.modelManager.removeListener(listener);}
for(const{to:sumFieldName}of this.field.sumContributions){const contribution=this.sumByValueByField.get(sumFieldName).get(value);this.sumByValueByField.get(sumFieldName).delete(value);this.record.modelManager._update(this.record,{[sumFieldName]:decrement(contribution)},{allowWriteReadonly:true});const listener=this.sumListenerByValueByField.get(sumFieldName).get(value);this.sumListenerByValueByField.get(sumFieldName).delete(value);this.record.modelManager.removeListener(listener);}
return true;}
has(value){return this.set.has(value);}
[Symbol.iterator](){if(this.field.sort){return this.sortArray[Symbol.iterator]();}
return this.set[Symbol.iterator]();}}
return __exports;});;

/* /mail/static/src/model/model_listener.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/model/model_listener',async function(require){'use strict';let __exports={};const Listener=__exports.Listener=class Listener{constructor({name,onChange,isLocking=true,isPartOfUpdateCycle=false}){this.isLocking=isLocking;this.isPartOfUpdateCycle=isPartOfUpdateCycle;this.name=name;this.onChange=onChange;this.lastObservedLocalIds=new Set();this.lastObservedFieldsByLocalId=new Map();this.lastObservedAllByModel=new Set();}
toString(){return`listener(${this.name})`;}}
return __exports;});;

/* /mail/static/src/model/model_manager.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/model/model_manager',async function(require){'use strict';let __exports={};const{registry}=require('@mail/model/model_core');const{ModelField}=require('@mail/model/model_field');const{FieldCommand,unlinkAll}=require('@mail/model/model_field_command');const{RelationSet}=require('@mail/model/model_field_relation_set');const{Listener}=require('@mail/model/model_listener');const{followRelations}=require('@mail/model/model_utils');const{patchClassMethods,patchInstanceMethods}=require('@mail/utils/utils');const{makeDeferred}=require('@mail/utils/deferred/deferred');const ModelManager=__exports.ModelManager=class ModelManager{constructor(env){this.env=env;this.messagingCreatedPromise=makeDeferred();this.messagingInitializedPromise=makeDeferred();this._createdRecordsComputes=new Set();this._createdRecordsCreated=new Set();this._createdRecordsOnChange=new Set();this._listeners=new Set();this._listenersObservingAllByModel=new Map();this._listenersObservingLocalId=new Map();this._listenersObservingFieldOfLocalId=new Map();this._listenersToNotifyAfterUpdateCycle=new Map();this._listenersToNotifyInUpdateCycle=new Map();this.models={};this._updatedRecordsCheckRequired=new Set();this.isDebug=false;}
async start(values){if(document.readyState==='loading'){await new Promise(resolve=>{window.addEventListener('load',resolve);});}
await new Promise(resolve=>setTimeout(resolve));await this.env.session.is_bound;this.models=this._generateModels();const messaging=this.models['mail.messaging'].insert(values);Object.assign(odoo.__DEBUG__,{messaging});this.messagingCreatedPromise.resolve();await this.messaging.start();this.messagingInitializedPromise.resolve();}
all(Model,filterFunc){for(const listener of this._listeners){listener.lastObservedAllByModel.add(Model);const entry=this._listenersObservingAllByModel.get(Model);const info={listener,reason:`all() - ${Model}`,};if(entry.has(listener)){entry.get(listener).push(info);}else{entry.set(listener,[info]);}}
const allRecords=Object.values(Model.__records);if(filterFunc){return allRecords.filter(filterFunc);}
return allRecords;}
create(Model,data={}){return this.insert(Model,data);}
delete(record){this._delete(record);this._flushUpdateCycle();}
exists(Model,record){const existingRecord=Model.__records[record.localId];return Boolean(existingRecord&&existingRecord===record);}
find(Model,findFunc){return this.all(Model).find(findFunc);}
findFromIdentifyingData(Model,data){return this.get(Model,this._getRecordIndex(Model,data));}
get(Model,localId,{isCheckingInheritance=false}={}){if(!localId){return;}
if(!isCheckingInheritance&&this.isDebug){const modelName=localId.split('(')[0];if(modelName!==Model.modelName){throw Error(`wrong format of localId ${localId} for ${Model}.`);}}
for(const listener of this._listeners){listener.lastObservedLocalIds.add(localId);if(!this._listenersObservingLocalId.has(localId)){this._listenersObservingLocalId.set(localId,new Map());}
const entry=this._listenersObservingLocalId.get(localId);const info={listener,reason:`get record - ${localId}`,};if(entry.has(listener)){entry.get(listener).push(info);}else{entry.set(listener,[info]);}}
const record=Model.__records[localId];if(record){return record;}
if(!isCheckingInheritance){return;}
for(const SubModel of Object.values(this.models)){if(!(SubModel.prototype instanceof Model)){continue;}
const record=SubModel.__records[localId];if(record){return record;}}
return;}
async getMessaging(){await this.messagingCreatedPromise;await this.messagingInitializedPromise;return this.messaging;}
insert(Model,data){const res=this._insert(Model,data);this._flushUpdateCycle();return res;}
get messaging(){if(!this.models['mail.messaging']){return undefined;}
return this.models['mail.messaging'].findFromIdentifyingData({});}
removeListener(listener){this._listeners.delete(listener);this._listenersToNotifyInUpdateCycle.delete(listener);this._listenersToNotifyAfterUpdateCycle.delete(listener);for(const localId of listener.lastObservedLocalIds){this._listenersObservingLocalId.get(localId).delete(listener);const listenersObservingFieldOfLocalId=this._listenersObservingFieldOfLocalId.get(localId);for(const field of listener.lastObservedFieldsByLocalId.get(localId)||[]){listenersObservingFieldOfLocalId.get(field).delete(listener);}}
for(const Model of listener.lastObservedAllByModel){this._listenersObservingAllByModel.get(Model).delete(listener);}
listener.lastObservedLocalIds.clear();listener.lastObservedFieldsByLocalId.clear();listener.lastObservedAllByModel.clear();}
startListening(listener){this.removeListener(listener);this._listeners.add(listener);}
stopListening(listener){this._listeners.delete(listener);}
update(record,data){const res=this._update(record,data);this._flushUpdateCycle();return res;}
_addDefaultData(Model,data={}){const data2={};for(const field of Model.__fieldList){if(data[field.fieldName]!==undefined){data2[field.fieldName]=data[field.fieldName];}else if(field.default!==undefined){data2[field.fieldName]=field.default;}}
return data2;}
_applyModelPatchFields(Model,patch){for(const[fieldName,field]of Object.entries(patch)){Model.fields[fieldName]=field;}}
_checkDeclaredFieldsOnModels(Models){for(const Model of Object.values(Models)){for(const fieldName in Model.fields){const field=Model.fields[fieldName];if(fieldName in Model.prototype){throw new Error(`Field "${Model}/${fieldName}" has a forbidden name.`);}
if(!(['attribute','relation'].includes(field.fieldType))){throw new Error(`Field "${Model}/${fieldName}" has unsupported type ${field.fieldType}.`);}
if(field.fieldType==='attribute'){const invalidKeys=Object.keys(field).filter(key=>!['compute','default','dependencies','fieldType','readonly','related','required','sum',].includes(key));if(invalidKeys.length>0){throw new Error(`Field "${Model}/${fieldName}" contains some invalid keys: "${invalidKeys.join(", ")}".`);}}
if(field.fieldType==='relation'){const invalidKeys=Object.keys(field).filter(key=>!['compute','default','dependencies','fieldType','inverse','isCausal','readonly','related','relationType','required','sort','to',].includes(key));if(invalidKeys.length>0){throw new Error(`Field "${Model}/${fieldName}" contains some invalid keys: "${invalidKeys.join(", ")}".`);}
if(!Models[field.to]){throw new Error(`Relational field "${Model}/${fieldName}" targets to unknown model name "${field.to}".`);}
if(field.isCausal&&!(['one2many','one2one'].includes(field.relationType))){throw new Error(`Relational field "${Model}/${fieldName}" has "isCausal" true with a relation of type "${field.relationType}" but "isCausal" is only supported for "one2many" and "one2one".`);}
if(field.required&&!(['one2one','many2one'].includes(field.relationType))){throw new Error(`Relational field "${Model}/${fieldName}" has "required" true with a relation of type "${field.relationType}" but "required" is only supported for "one2one" and "many2one".`);}
if(field.sort&&!(['one2many','many2many'].includes(field.relationType))){throw new Error(`Relational field "${Model}/${fieldName}" has "sort" with a relation of type "${field.relationType}" but "sort" is only supported for "one2many" and "many2many".`);}}
if(field.compute&&!(typeof field.compute==='string')){throw new Error(`Field "${Model}/${fieldName}" property "compute" must be a string (instance method name).`);}
if(field.compute&&!(Model.prototype[field.compute])){throw new Error(`Field "${Model}/${fieldName}" property "compute" does not refer to an instance method of this Model.`);}
if(field.compute&&field.related){throw new Error(`Field "${Model}/${fieldName}" cannot be a related and compute field at the same time.`);}
if(field.related){if(!(typeof field.related==='string')){throw new Error(`Field "${Model}/${fieldName}" property "related" has invalid format.`);}
const[relationName,relatedFieldName,other]=field.related.split('.');if(!relationName||!relatedFieldName||other){throw new Error(`Field "${Model}/${fieldName}" property "related" has invalid format.`);}
let relatedRelation;let TargetModel=Model;while(Models[TargetModel.modelName]&&!relatedRelation){if(TargetModel.fields){relatedRelation=TargetModel.fields[relationName];}
TargetModel=TargetModel.__proto__;}
if(!relatedRelation){throw new Error(`Related field "${Model}/${fieldName}" relates to unknown relation name "${relationName}".`);}
if(relatedRelation.fieldType!=='relation'){throw new Error(`Related field "${Model}/${fieldName}" relates to non-relational field "${relationName}".`);}
const RelatedModel=Models[relatedRelation.to];let relatedField;TargetModel=RelatedModel;while(Models[TargetModel.modelName]&&!relatedField){if(TargetModel.fields){relatedField=TargetModel.fields[relatedFieldName];}
TargetModel=TargetModel.__proto__;}
if(!relatedField){throw new Error(`Related field "${Model}/${fieldName}" relates to unknown related model field "${relatedFieldName}".`);}
if(relatedField.fieldType!==field.fieldType){throw new Error(`Related field "${Model}/${fieldName}" has mismatch type with its related model field.`);}
if(relatedField.fieldType==='relation'&&relatedField.to!==field.to){throw new Error(`Related field "${Model}/${fieldName}" has mismatch target model name with its related model field.`);}}}}}
_checkProcessedFieldsOnModels(Models){for(const Model of Object.values(Models)){for(const field of Model.__fieldList){const fieldName=field.fieldName;if(!(['attribute','relation'].includes(field.fieldType))){throw new Error(`Field "${Model}/${fieldName}" has unsupported type ${field.fieldType}.`);}
if(field.compute&&field.related){throw new Error(`Field "${Model}/${fieldName}" cannot be a related and compute field at the same time.`);}
if(field.fieldType==='attribute'){continue;}
if(!field.relationType){throw new Error(`Field "${Model}/${fieldName}" must define a relation type in "relationType".`);}
if(!(['one2one','one2many','many2one','many2many'].includes(field.relationType))){throw new Error(`Field "${Model}/${fieldName}" has invalid relation type "${field.relationType}".`);}
if(!field.inverse){throw new Error(`Field "${
                            Model.modelName
                        }/${
                            fieldName
                        }" must define an inverse relation name in "inverse".`);}
if(!field.to){throw new Error(`Relation "${
                            Model.modelNames
                        }/${
                            fieldName
                        }" must define a model name in "to" (1st positional parameter of relation field helpers).`);}
const RelatedModel=Models[field.to];if(!RelatedModel){throw new Error(`Model name of relation "${Model}/${fieldName}" does not exist.`);}
const inverseField=RelatedModel.__fieldMap[field.inverse];if(!inverseField){throw new Error(`Relation "${
                            Model.modelName
                        }/${
                            fieldName
                        }" has no inverse field "${RelatedModel}/${field.inverse}".`);}
if(inverseField.inverse!==fieldName){throw new Error(`Inverse field name of relation "${
                            Model.modelName
                        }/${
                            fieldName
                        }" does not match with field name of relation "${
                            RelatedModel.modelName
                        }/${
                            inverseField.inverse
                        }".`);}
const allSelfAndParentNames=[];let TargetModel=Model;while(TargetModel){allSelfAndParentNames.push(TargetModel.modelName);TargetModel=TargetModel.__proto__;}
if(!allSelfAndParentNames.includes(inverseField.to)){throw new Error(`Relation "${
                            Model.modelName
                        }/${
                            fieldName
                        }" has inverse relation "${
                            RelatedModel.modelName
                        }/${
                            field.inverse
                        }" misconfigured (currently "${
                            inverseField.to
                        }", should instead refer to this model or parented models: ${
                            allSelfAndParentNames.map(name => `"${name}"`).join(', ')
                        }?)`);}
if((field.relationType==='many2many'&&inverseField.relationType!=='many2many')||(field.relationType==='one2one'&&inverseField.relationType!=='one2one')||(field.relationType==='one2many'&&inverseField.relationType!=='many2one')||(field.relationType==='many2one'&&inverseField.relationType!=='one2many')){throw new Error(`Mismatch relations types "${
                            Model.modelName
                        }/${
                            fieldName
                        }" (${
                            field.relationType
                        }) and "${
                            RelatedModel.modelName
                        }/${
                            field.inverse
                        }" (${
                            inverseField.relationType
                        }).`);}}
for(const identifyingField of Model.__identifyingFieldsFlattened){const field=Model.__fieldMap[identifyingField];if(!field){throw new Error(`Identifying field "${identifyingField}" is not a field on model "${Model}".`);}
if(!field.readonly){throw new Error(`Identifying field "${identifyingField}" on model "${Model}" is lacking readonly.`);}
if(field.to){if(!(['one2one','many2one'].includes(field.relationType))){throw new Error(`Identifying field "${identifyingField}" on model "${Model}" has a relation of type "${field.relationType}" but identifying field is only supported for "one2one" and "many2one".`);}
const RelatedModel=Models[field.to];const inverseField=RelatedModel.__fieldMap[field.inverse];if(!inverseField.isCausal){throw new Error(`Identifying field "${identifyingField}" on model "${Model}" has an inverse "${field.inverse}" not declared as "isCausal" on "${RelatedModel}".`);}}}}}
_create(Model,localId){const nonProxyRecord=new Model({localId,valid:true});const record=!this.isDebug?nonProxyRecord:new Proxy(nonProxyRecord,{get:function getFromProxy(record,prop){if(!Model.__fieldMap[prop]&&!['_super','then'].includes(prop)&&typeof prop!=='symbol'&&!(prop in record)){console.warn(`non-field read "${prop}" on ${record}`);}
return record[prop];},});for(const field of Model.__fieldList){record.__values[field.fieldName]=undefined;if(field.fieldType==='relation'){if(['one2many','many2many'].includes(field.relationType)){record.__values[field.fieldName]=new RelationSet(record,field);}}}
if(!this._listenersObservingLocalId.has(localId)){this._listenersObservingLocalId.set(localId,new Map());}
this._listenersObservingFieldOfLocalId.set(localId,new Map());for(const field of Model.__fieldList){this._listenersObservingFieldOfLocalId.get(localId).set(field,new Map());}
Model.__records[record.localId]=record;record._willCreate();this._createdRecordsComputes.add(record);this._createdRecordsCreated.add(record);this._createdRecordsOnChange.add(record);for(const[listener,infoList]of this._listenersObservingAllByModel.get(Model).entries()){this._markListenerToNotify(listener,{listener,reason:`_create: allByModel - ${record}`,infoList,});}
for(const[listener,infoList]of this._listenersObservingLocalId.get(localId).entries()){this._markListenerToNotify(listener,{listener,reason:`_create: localId - ${record}`,infoList,});}
return record;}
_delete(record){this._ensureNoLockingListener();const Model=record.constructor;if(!record.exists()){throw Error(`Cannot delete already deleted record ${record.localId}.`);}
record._willDelete();for(const listener of record.__listeners){this.removeListener(listener);}
for(const field of Model.__fieldList){if(field.fieldType==='relation'){field.parseAndExecuteCommands(record,unlinkAll(),{allowWriteReadonly:true});}}
this._createdRecordsComputes.delete(record);this._createdRecordsCreated.delete(record);this._createdRecordsOnChange.delete(record);this._updatedRecordsCheckRequired.delete(record);for(const[listener,infoList]of this._listenersObservingLocalId.get(record.localId).entries()){this._markListenerToNotify(listener,{listener,reason:`_delete: localId - ${record}`,infoList,});}
for(const[listener,infoList]of this._listenersObservingAllByModel.get(Model).entries()){this._markListenerToNotify(listener,{listener,reason:`_delete: allByModel - ${record}`,infoList,});}
delete Model.__records[record.localId];}
_ensureNoLockingListener(){for(const listener of this._listeners){if(listener.isLocking){throw Error(`Model manager locked by ${listener}. It is not allowed to insert/update/delete from inside a lock.`);}}}
_executeCreatedRecordsComputes(){const hasChanged=this._createdRecordsComputes.size>0;for(const record of this._createdRecordsComputes){this._createdRecordsComputes.delete(record);if(!record.exists()){throw Error(`Cannot start compute/related for already deleted ${record}.`);}
const listeners=[];for(const field of record.constructor.__fieldList){if(field.compute){const listener=new Listener({isPartOfUpdateCycle:true,name:`compute ${field} of ${record}`,onChange:(info)=>{this.startListening(listener);const res=record[field.compute]();this.stopListening(listener);this._update(record,{[field.fieldName]:res},{allowWriteReadonly:true});},});listeners.push(listener);}
if(field.related){const listener=new Listener({isPartOfUpdateCycle:true,name:`related ${field} of ${record}`,onChange:(info)=>{this.startListening(listener);const res=field.computeRelated(record);this.stopListening(listener);this._update(record,{[field.fieldName]:res},{allowWriteReadonly:true});},});listeners.push(listener);}}
record.__listeners.push(...listeners);for(const listener of listeners){listener.onChange({listener,reason:`first call on ${record}`,});}}
if(hasChanged){this._flushUpdateCycle();}}
_executeCreatedRecordsCreated(){for(const record of this._createdRecordsCreated){this._createdRecordsCreated.delete(record);if(!record.exists()){throw Error(`Cannot call _created for already deleted ${record}.`);}
record._created();}}
_executeCreatedRecordsOnChange(){for(const record of this._createdRecordsOnChange){this._createdRecordsOnChange.delete(record);if(!record.exists()){throw Error(`Cannot call onChange for already deleted ${record}.`);}
for(const onChange of record.constructor.onChanges||[]){const listener=new Listener({name:`${onChange} of ${record}`,onChange:(info)=>{this.startListening(listener);for(const dependency of onChange.dependencies){followRelations(record,dependency);}
this.stopListening(listener);record[onChange.methodName]();},});record.__listeners.push(listener);listener.onChange({listener,reason:`first call on ${record}`,});}}}
_executeUpdatedRecordsCheckRequired(){for(const record of this._updatedRecordsCheckRequired){for(const required of record.constructor.__requiredFieldsList){if(record[required.fieldName]===undefined){throw Error(`required ${required} of ${record} is missing`);}}}
this._updatedRecordsCheckRequired.clear();}
_flushUpdateCycle(func){this._executeCreatedRecordsComputes();this._notifyListenersInUpdateCycle();this._executeUpdatedRecordsCheckRequired();this._executeCreatedRecordsCreated();this._executeCreatedRecordsOnChange();this._notifyListenersAfterUpdateCycle();}
_generateModels(){const allNames=Object.keys(registry);const Models={};const generatedNames=[];let toGenerateNames=[...allNames];while(toGenerateNames.length>0){const generatable=toGenerateNames.map(name=>registry[name]).find(entry=>{let isGenerateable=true;for(const dependencyName of entry.dependencies){if(!generatedNames.includes(dependencyName)){isGenerateable=false;}}
return isGenerateable;});if(!generatable){throw new Error(`Cannot generate following Model: ${toGenerateNames.join(', ')}`);}
if(!generatable.factory){throw new Error(`Missing factory for the following Model: ${generatable.name} (maybe check for typo in name?)`);}
const Model=generatable.factory(Models);Model.modelManager=this;Model.__records={};if(!Model.hasOwnProperty('identifyingFields')){throw new Error(`${Model} is lacking identifying fields.`);}
Model.__identifyingFields=Model.identifyingFields;const identifyingFieldsFlattened=new Set();for(const identifyingElement of Model.identifyingFields){const identifyingFields=typeof identifyingElement==='string'?[identifyingElement]:identifyingElement;for(const identifyingField of identifyingFields){identifyingFieldsFlattened.add(identifyingField);}}
Model.__identifyingFieldsFlattened=identifyingFieldsFlattened;for(const patch of generatable.patches){switch(patch.type){case'class':patchClassMethods(Model,patch.name,patch.patch);break;case'instance':patchInstanceMethods(Model,patch.name,patch.patch);break;case'field':this._applyModelPatchFields(Model,patch.patch);break;case'identifyingFields':patch.patch(Model.__identifyingFields);break;}}
if(!Object.prototype.hasOwnProperty.call(Model,'modelName')){throw new Error(`Missing static property "modelName" on Model class "${Model.name}".`);}
if(generatedNames.includes(Model.modelName)){throw new Error(`Duplicate model name "${Model}" shared on 2 distinct Model classes.`);}
Models[Model.modelName]=Model;generatedNames.push(Model.modelName);toGenerateNames=toGenerateNames.filter(name=>name!==Model.modelName);this._listenersObservingAllByModel.set(Model,new Map());}
this._checkDeclaredFieldsOnModels(Models);this._processDeclaredFieldsOnModels(Models);this._checkProcessedFieldsOnModels(Models);return Models;}
_getRecordIndex(Model,data){return`${Model.modelName}(${Model.__identifyingFields.map(identifyingElement => {
            const fieldName = typeof identifyingElement === 'string'
                ? identifyingElement
                : identifyingElement.reduce((fieldName, currentFieldName) => {
                    const fieldValue = data[currentFieldName] !== undefined
                        ? data[currentFieldName]
                        : Model.__fieldMap[currentFieldName].default;
                    if (fieldValue === undefined) {
                        return fieldName;
                    }
                    if (fieldName) {
                        throw new Error(`Identifying element on ${Model}with"or"value should have only one of the conditional values given in data.Currently have both ${fieldName}and ${currentFieldName}.`);
                    }
                    return currentFieldName;
                }, undefined);
            if (!fieldName) {
                throw new Error(`Identifying element"${identifyingElement}"on ${Model}is lacking a value.`);
            }
            const fieldValue = data[fieldName] !== undefined
                ? data[fieldName]
                : Model.__fieldMap[fieldName].default;
            if (fieldValue === undefined) {
                throw new Error(`Identifying field"${fieldName}"on ${Model}is lacking a value.`);
            }
            const relationTo = Model.__fieldMap[fieldName].to;
            if (!relationTo) {
                return `${fieldName}:${fieldValue}`;
            }
            const OtherModel = this.models[relationTo];
            if (fieldValue instanceof OtherModel) {
                return `${fieldName}:${this._getRecordIndex(OtherModel,fieldValue)}`;
            }
            if (!(fieldValue instanceof FieldCommand)) {
                throw new Error(`Identifying element"${Model}/${fieldName}"is expecting a command for relational field.`);
            }
            if (!['link', 'insert', 'replace', 'insert-and-replace'].includes(fieldValue._name)) {
                throw new Error(`Identifying element"${Model}/${fieldName}"is expecting a command of type"insert-and-replace","replace","insert"or"link"."${fieldValue._name}"was given instead.`);
            }
            const relationValue = fieldValue._value;
            if (!relationValue) {
                throw new Error(`Identifying element"${Model}/${fieldName}"is lacking a relation value.`);
            }
            return `${fieldName}:${this._getRecordIndex(OtherModel,relationValue)}`;
        }).join(', ')})`;}
_insert(Model,data={}){this._ensureNoLockingListener();const isMulti=typeof data[Symbol.iterator]==='function';const dataList=isMulti?data:[data];const records=[];for(const data of dataList){const localId=this._getRecordIndex(Model,data);let record=Model.get(localId);if(!record){record=this._create(Model,localId);this._update(record,this._addDefaultData(Model,data),{allowWriteReadonly:true});}else{this._update(record,data);}
records.push(record);}
return isMulti?records:records[0];}
_makeInverseRelationField(Model,field){const relFunc=field.relationType==='many2many'?ModelField.many2many:field.relationType==='many2one'?ModelField.one2many:field.relationType==='one2many'?ModelField.many2one:field.relationType==='one2one'?ModelField.one2one:undefined;if(!relFunc){throw new Error(`Cannot compute inverse Relation of "${Model}/${field.fieldName}".`);}
const inverseField=new ModelField(Object.assign({},relFunc(Model.modelName,{inverse:field.fieldName}),{fieldName:`_inverse_${Model}/${field.fieldName}`,}));return inverseField;}
_markListenerToNotify(listener,info){if(!(listener instanceof Listener)){throw new Error(`Listener is not a listener ${listener}`);}
if(listener.isPartOfUpdateCycle){const entry=this._listenersToNotifyInUpdateCycle.get(listener);if(entry){entry.push(info);}else{this._listenersToNotifyInUpdateCycle.set(listener,[info]);}}
if(!listener.isPartOfUpdateCycle){const entry=this._listenersToNotifyAfterUpdateCycle.get(listener);if(entry){entry.push(info);}else{this._listenersToNotifyAfterUpdateCycle.set(listener,[info]);}}}
_markRecordFieldAsChanged(record,field){for(const[listener,infoList]of this._listenersObservingFieldOfLocalId.get(record.localId).get(field).entries()){this._markListenerToNotify(listener,{listener,reason:`_update: ${field} of ${record}`,infoList,});}}
_notifyListenersAfterUpdateCycle(){for(const[listener,infoList]of this._listenersToNotifyAfterUpdateCycle.entries()){this._listenersToNotifyAfterUpdateCycle.delete(listener);listener.onChange(infoList);}}
_notifyListenersInUpdateCycle(){const hasChanged=this._listenersToNotifyInUpdateCycle.size>0;for(const[listener,infoList]of this._listenersToNotifyInUpdateCycle.entries()){this._listenersToNotifyInUpdateCycle.delete(listener);listener.onChange(infoList);}
if(hasChanged){this._flushUpdateCycle();}}
_processDeclaredFieldsOnModels(Models){for(const Model of Object.values(Models)){if(!Object.prototype.hasOwnProperty.call(Model,'fields')){Model.fields={};}
Model.inverseRelations=[];const sumContributionsByFieldName=new Map();for(const[fieldName,fieldData]of Object.entries(Model.fields)){Model.fields[fieldName]=new ModelField(Object.assign({},fieldData,{fieldName,}));if(fieldData.sum){const[relationFieldName,contributionFieldName]=fieldData.sum.split('.');if(!sumContributionsByFieldName.has(relationFieldName)){sumContributionsByFieldName.set(relationFieldName,[]);}
sumContributionsByFieldName.get(relationFieldName).push({from:contributionFieldName,to:fieldName,});}}
for(const[fieldName,sumContributions]of sumContributionsByFieldName){Model.fields[fieldName].sumContributions=sumContributions;}}
for(const Model of Object.values(Models)){for(const field of Object.values(Model.fields)){if(field.fieldType!=='relation'){continue;}
if(field.inverse){continue;}
const RelatedModel=Models[field.to];const inverseField=this._makeInverseRelationField(Model,field);field.inverse=inverseField.fieldName;RelatedModel.fields[inverseField.fieldName]=inverseField;}}
for(const Model of Object.values(Models)){Model.__combinedFields={};for(const field of Object.values(Model.fields)){Model.__combinedFields[field.fieldName]=field;}
let TargetModel=Model.__proto__;while(TargetModel&&TargetModel.fields){for(const targetField of Object.values(TargetModel.fields)){const field=Model.__combinedFields[targetField.fieldName];if(!field){Model.__combinedFields[targetField.fieldName]=targetField;}}
TargetModel=TargetModel.__proto__;}}
for(const Model of Object.values(Models)){Model.__fieldMap=Model.__combinedFields;Model.__fieldList=Object.values(Model.__fieldMap);Model.__requiredFieldsList=Model.__fieldList.filter(field=>field.required);for(const field of Model.__fieldList){Object.defineProperty(Model.prototype,field.fieldName,{get:function getFieldValue(){if(this.modelManager._listeners.size){if(!this.modelManager._listenersObservingLocalId.has(this.localId)){this.modelManager._listenersObservingLocalId.set(this.localId,new Map());}
const entryLocalId=this.modelManager._listenersObservingLocalId.get(this.localId);const reason=`getField - ${field} of ${this}`;const entryField=this.modelManager._listenersObservingFieldOfLocalId.get(this.localId).get(field);for(const listener of this.modelManager._listeners){listener.lastObservedLocalIds.add(this.localId);const info={listener,reason};if(entryLocalId.has(listener)){entryLocalId.get(listener).push(info);}else{entryLocalId.set(listener,[info]);}
if(!listener.lastObservedFieldsByLocalId.has(this.localId)){listener.lastObservedFieldsByLocalId.set(this.localId,new Set());}
listener.lastObservedFieldsByLocalId.get(this.localId).add(field);if(entryField.has(listener)){entryField.get(listener).push(info);}else{entryField.set(listener,[info]);}}}
return field.get(this);},});}
delete Model.__combinedFields;}}
_update(record,data,options={}){this._ensureNoLockingListener();if(!record.exists()){throw Error(`Cannot update already deleted record ${record.localId}.`);}
const{allowWriteReadonly=false}=options;const Model=record.constructor;let hasChanged=false;const sortedFieldNames=Object.keys(data);sortedFieldNames.sort((a,b)=>{if(Model.__identifyingFieldsFlattened.has(a)&&!Model.__identifyingFieldsFlattened.has(b)){return-1;}
if(!Model.__identifyingFieldsFlattened.has(a)&&Model.__identifyingFieldsFlattened.has(b)){return 1;}
return 0;});for(const fieldName of sortedFieldNames){if(data[fieldName]===undefined){continue;}
const field=Model.__fieldMap[fieldName];if(!field){throw new Error(`Cannot create/update record with data unrelated to a field. (record: "${record.localId}", non-field attempted update: "${fieldName}")`);}
const newVal=data[fieldName];if(!field.parseAndExecuteCommands(record,newVal,options)){continue;}
if(field.readonly&&!allowWriteReadonly){throw new Error(`read-only ${field} on ${record} was updated`);}
hasChanged=true;this._markRecordFieldAsChanged(record,field);}
if(hasChanged){this._updatedRecordsCheckRequired.add(record);}
return hasChanged;}}
return __exports;});;

/* /mail/static/src/model/model_onchange.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/model/model_onchange',async function(require){'use strict';let __exports={};const OnChange=__exports.OnChange=class OnChange{constructor({dependencies,methodName}){this.dependencies=dependencies;this.methodName=methodName;}
toString(){return`onChange(${this.methodName})`;}}
return __exports;});;

/* /mail/static/src/model/model_utils.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/model/model_utils',async function(require){'use strict';let __exports={};__exports.followRelations=followRelations;function followRelations(record,relatedPath){let target=record;for(const field of relatedPath.split('.')){if(!target.constructor.__fieldMap[field]){throw Error(`field(${field}) does not exist on ${target}`);}
target=target[field];if(!target){break;}}
return target;}
return __exports;});;

/* /mail/static/src/models/activity/activity.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/activity/activity',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2many,many2one}=require('@mail/model/model_field');const{clear,insert,unlink,unlinkAll}=require('@mail/model/model_field_command');function factory(dependencies){class Activity extends dependencies['mail.model']{async deleteServerRecord(){await this.async(()=>this.env.services.rpc({model:'mail.activity',method:'unlink',args:[[this.id]],}));this.delete();}
static convertData(data){const data2={};if('activity_category'in data){data2.category=data.activity_category;}
if('can_write'in data){data2.canWrite=data.can_write;}
if('create_date'in data){data2.dateCreate=data.create_date;}
if('date_deadline'in data){data2.dateDeadline=data.date_deadline;}
if('chaining_type'in data){data2.chaining_type=data.chaining_type;}
if('icon'in data){data2.icon=data.icon;}
if('id'in data){data2.id=data.id;}
if('note'in data){data2.note=data.note;}
if('state'in data){data2.state=data.state;}
if('summary'in data){data2.summary=data.summary;}
if('activity_type_id'in data){if(!data.activity_type_id){data2.type=unlinkAll();}else{data2.type=insert({displayName:data.activity_type_id[1],id:data.activity_type_id[0],});}}
if('create_uid'in data){if(!data.create_uid){data2.creator=unlinkAll();}else{data2.creator=insert({id:data.create_uid[0],display_name:data.create_uid[1],});}}
if('mail_template_ids'in data){data2.mailTemplates=insert(data.mail_template_ids);}
if('res_id'in data&&'res_model'in data){data2.thread=insert({id:data.res_id,model:data.res_model,});}
if('user_id'in data){if(!data.user_id){data2.assignee=unlinkAll();}else{data2.assignee=insert({id:data.user_id[0],display_name:data.user_id[1],});}}
if('request_partner_id'in data){if(!data.request_partner_id){data2.requestingPartner=unlink();}else{data2.requestingPartner=insert({id:data.request_partner_id[0],display_name:data.request_partner_id[1],});}}
return data2;}
edit(){const action={type:'ir.actions.act_window',name:this.env._t("Schedule Activity"),res_model:'mail.activity',view_mode:'form',views:[[false,'form']],target:'new',context:{default_res_id:this.thread.id,default_res_model:this.thread.model,},res_id:this.id,};this.env.bus.trigger('do-action',{action,options:{on_close:()=>this.fetchAndUpdate()},});}
async fetchAndUpdate(){const[data]=await this.env.services.rpc({model:'mail.activity',method:'activity_format',args:[this.id],},{shadow:true}).catch(e=>{const errorName=e.message&&e.message.data&&e.message.data.name;if(errorName==='odoo.exceptions.MissingError'){return[];}else{throw e;}});let shouldDelete=false;if(data){this.update(this.constructor.convertData(data));}else{shouldDelete=true;}
this.thread.refreshActivities();this.thread.refresh();if(shouldDelete){this.delete();}}
async markAsDone({attachments=[],feedback=false}){const attachmentIds=attachments.map(attachment=>attachment.id);await this.async(()=>this.env.services.rpc({model:'mail.activity',method:'action_feedback',args:[[this.id]],kwargs:{attachment_ids:attachmentIds,feedback,},}));this.thread.refresh();this.delete();}
async markAsDoneAndScheduleNext({feedback}){const action=await this.async(()=>this.env.services.rpc({model:'mail.activity',method:'action_feedback_schedule_next',args:[[this.id]],kwargs:{feedback},}));this.thread.refresh();const thread=this.thread;this.delete();if(!action){thread.refreshActivities();return;}
this.env.bus.trigger('do-action',{action,options:{on_close:()=>{thread.refreshActivities();},},});}
_computeIsCurrentPartnerAssignee(){if(!this.assignee||!this.assignee.partner||!this.messaging.currentPartner){return false;}
return this.assignee.partner===this.messaging.currentPartner;}
_computeNote(){if(this.note==='<p><br></p>'){return clear();}
return this.note;}}
Activity.fields={assignee:many2one('mail.user'),attachments:many2many('mail.attachment',{inverse:'activities',}),canWrite:attr({default:false,}),category:attr(),creator:many2one('mail.user'),dateCreate:attr(),dateDeadline:attr(),feedbackBackup:attr(),chaining_type:attr({default:'suggest',}),icon:attr(),id:attr({readonly:true,required:true,}),isCurrentPartnerAssignee:attr({compute:'_computeIsCurrentPartnerAssignee',default:false,}),mailTemplates:many2many('mail.mail_template',{inverse:'activities',}),note:attr({compute:'_computeNote',}),requestingPartner:many2one('mail.partner'),state:attr(),summary:attr(),thread:many2one('mail.thread',{inverse:'activities',}),type:many2one('mail.activity_type',{inverse:'activities',}),};Activity.identifyingFields=['id'];Activity.modelName='mail.activity';return Activity;}
registerNewModel('mail.activity',factory);return __exports;});;

/* /mail/static/src/models/activity_type/activity_type.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/activity_type/activity_type',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,one2many}=require('@mail/model/model_field');function factory(dependencies){class ActivityType extends dependencies['mail.model']{}
ActivityType.fields={activities:one2many('mail.activity',{inverse:'type',}),displayName:attr(),id:attr({readonly:true,required:true,}),};ActivityType.identifyingFields=['id'];ActivityType.modelName='mail.activity_type';return ActivityType;}
registerNewModel('mail.activity_type',factory);return __exports;});;

/* /mail/static/src/models/attachment/attachment.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/attachment/attachment',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2many,many2one,one2many}=require('@mail/model/model_field');const{clear,insert}=require('@mail/model/model_field_command');function factory(dependencies){class Attachment extends dependencies['mail.model']{_created(){this.onClickDownload=this.onClickDownload.bind(this);}
static convertData(data){const data2={};if('checksum'in data){data2.checksum=data.checksum;}
if('filename'in data){data2.filename=data.filename;}
if('id'in data){data2.id=data.id;}
if('is_main'in data){data2.is_main=data.is_main;}
if('mimetype'in data){data2.mimetype=data.mimetype;}
if('name'in data){data2.name=data.name;}
if('res_id'in data&&'res_model'in data){data2.originThread=insert({id:data.res_id,model:data.res_model,});}
if('originThread'in data){data2.originThread=data.originThread;}
return data2;}
download(){const downloadLink=document.createElement('a');downloadLink.setAttribute('href',this.downloadUrl);downloadLink.setAttribute('download','');downloadLink.click();}
onClickDownload(ev){ev.stopPropagation();this.download();}
async remove(){if(this.isUnlinkPending){return;}
if(!this.isUploading){this.update({isUnlinkPending:true});try{await this.async(()=>this.env.services.rpc({route:`/mail/attachment/delete`,params:{access_token:this.accessToken,attachment_id:this.id,},},{shadow:true}));}finally{this.update({isUnlinkPending:false});}}else if(this.uploadingAbortController){this.uploadingAbortController.abort();}
this.delete();}
_computeDefaultSource(){if(this.isImage){return`/web/image/${this.id}?signature=${this.checksum}`;}
if(this.isPdf){const pdf_lib=`/web/static/lib/pdfjs/web/viewer.html?file=`
if(!this.accessToken&&this.originThread&&this.originThread.model==='mail.channel'){return`${pdf_lib}/mail/channel/${this.originThread.id}/attachment/${this.id}`;}
const accessToken=this.accessToken?`?access_token%3D${this.accessToken}`:'';return`${pdf_lib}/web/content/${this.id}${accessToken}`;}
if(this.isUrlYoutube){const urlArr=this.url.split('/');let token=urlArr[urlArr.length-1];if(token.includes('watch')){token=token.split('v=')[1];const amp=token.indexOf('&');if(amp!==-1){token=token.substring(0,amp);}}
return`https://www.youtube.com/embed/${token}`;}
if(!this.accessToken&&this.originThread&&this.originThread.model==='mail.channel'){return`/mail/channel/${this.originThread.id}/attachment/${this.id}`;}
const accessToken=this.accessToken?`?access_token=${this.accessToken}`:'';return`/web/content/${this.id}${accessToken}`;}
_computeDisplayName(){const displayName=this.name||this.filename;if(displayName){return displayName;}
return clear();}
_computeDownloadUrl(){if(!this.accessToken&&this.originThread&&this.originThread.model==='mail.channel'){return`/mail/channel/${this.originThread.id}/attachment/${this.id}?download=true`;}
const accessToken=this.accessToken?`access_token=${this.accessToken}&`:'';return`/web/content/ir.attachment/${this.id}/datas?${accessToken}download=true`;}
_computeExtension(){const extension=this.filename&&this.filename.split('.').pop();if(extension){return extension;}
return clear();}
_computeIsEditable(){if(!this.messaging){return;}
if(this.messages.length&&this.originThread&&this.originThread.model==='mail.channel'){return this.messages.some(message=>(message.canBeDeleted||(message.author&&message.author===this.messaging.currentPartner)||(message.guestAuthor&&message.guestAuthor===this.messaging.currentGuest)));}
return true;}
_computeIsPdf(){return this.mimetype==='application/pdf';}
_computeIsImage(){const imageMimetypes=['image/bmp','image/gif','image/jpeg','image/png','image/svg+xml','image/tiff','image/x-icon',];return imageMimetypes.includes(this.mimetype);}
_computeIsText(){const textMimeType=['application/javascript','application/json','text/css','text/html','text/plain',];return textMimeType.includes(this.mimetype);}
_computeIsVideo(){const videoMimeTypes=['audio/mpeg','video/x-matroska','video/mp4','video/webm',];return videoMimeTypes.includes(this.mimetype);}
_computeIsUrl(){return this.type==='url'&&this.url;}
_computeIsViewable(){return this.isText||this.isImage||this.isVideo||this.isPdf||this.isUrlYoutube;}
_computeIsUrlYoutube(){return!!this.url&&this.url.includes('youtu');}
_computeMediaType(){return this.mimetype&&this.mimetype.split('/').shift();}
_computeUploadingAbortController(){if(this.isUploading){if(!this.uploadingAbortController){const abortController=new AbortController();abortController.signal.onabort=()=>{this.messaging.messagingBus.trigger('o-attachment-upload-abort',{attachment:this});};return abortController;}
return this.uploadingAbortController;}
return;}}
Attachment.fields={accessToken:attr(),activities:many2many('mail.activity',{inverse:'attachments',}),attachmentCards:one2many('mail.attachment_card',{inverse:'attachment',isCausal:true,}),attachmentImages:one2many('mail.attachment_image',{inverse:'attachment',isCausal:true,}),attachmentLists:many2many('mail.attachment_list',{inverse:'attachments',}),attachmentViewer:many2many('mail.attachment_viewer',{inverse:'attachments',}),checksum:attr(),composer:many2one('mail.composer',{inverse:'attachments',}),defaultSource:attr({compute:'_computeDefaultSource',}),dialogRef:attr(),displayName:attr({compute:'_computeDisplayName',}),downloadUrl:attr({compute:'_computeDownloadUrl',}),extension:attr({compute:'_computeExtension',}),filename:attr(),id:attr({readonly:true,required:true,}),isEditable:attr({compute:'_computeIsEditable',}),isImage:attr({compute:'_computeIsImage',}),is_main:attr(),isPdf:attr({compute:'_computeIsPdf',}),isText:attr({compute:'_computeIsText',}),isUnlinkPending:attr({default:false,}),isUploading:attr({default:false,}),isUrl:attr({compute:'_computeIsUrl',}),isUrlYoutube:attr({compute:'_computeIsUrlYoutube',}),isVideo:attr({compute:'_computeIsVideo',}),isViewable:attr({compute:'_computeIsViewable',}),mediaType:attr({compute:'_computeMediaType',}),messages:many2many('mail.message',{inverse:'attachments',}),mimetype:attr({default:'',}),name:attr(),originThread:many2one('mail.thread',{inverse:'originThreadAttachments',}),size:attr(),threads:many2many('mail.thread',{inverse:'attachments',}),type:attr(),uploadingAbortController:attr({compute:'_computeUploadingAbortController',}),url:attr(),};Attachment.identifyingFields=['id'];Attachment.modelName='mail.attachment';return Attachment;}
registerNewModel('mail.attachment',factory);return __exports;});;

/* /mail/static/src/models/attachment_card/attachment_card.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/attachment_card/attachment_card',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2one}=require('@mail/model/model_field');const{insert,insertAndReplace,replace}=require('@mail/model/model_field_command');function factory(dependencies){class AttachmentCard extends dependencies['mail.model']{_created(){this.onClickUnlink=this.onClickUnlink.bind(this);this.onClickImage=this.onClickImage.bind(this);this.onDeleteConfirmDialogClosed=this.onDeleteConfirmDialogClosed.bind(this);}
onClickImage(){if(!this.attachment||!this.attachment.isViewable){return;}
this.messaging.dialogManager.update({dialogs:insert({attachmentViewer:insertAndReplace({attachment:replace(this.attachment),attachmentList:replace(this.attachmentList),}),}),});}
onClickUnlink(ev){ev.stopPropagation();if(!this.attachment){return;}
if(this.attachmentList.composerView){this.component.trigger('o-attachment-removed',{attachmentLocalId:this.attachment.localId});this.attachment.remove();}else{this.update({hasDeleteConfirmDialog:true});}}
onDeleteConfirmDialogClosed(){if(!this.exists()){return;}
this.update({hasDeleteConfirmDialog:false});}}
AttachmentCard.fields={attachment:many2one('mail.attachment',{inverse:'attachmentCards',readonly:true,required:true,}),attachmentList:many2one('mail.attachment_list',{inverse:'attachmentCards',readonly:true,required:true,}),component:attr(),hasDeleteConfirmDialog:attr({default:false,}),};AttachmentCard.identifyingFields=['attachmentList','attachment'];AttachmentCard.modelName='mail.attachment_card';return AttachmentCard;}
registerNewModel('mail.attachment_card',factory);return __exports;});;

/* /mail/static/src/models/attachment_image/attachment_image.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/attachment_image/attachment_image',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2one}=require('@mail/model/model_field');const{clear,insert,insertAndReplace,replace}=require('@mail/model/model_field_command');function factory(dependencies){class AttachmentImage extends dependencies['mail.model']{_created(){this.onClickUnlink=this.onClickUnlink.bind(this);this.onDeleteConfirmDialogClosed=this.onDeleteConfirmDialogClosed.bind(this);this.onClickImage=this.onClickImage.bind(this);}
onClickImage(){if(!this.attachment||!this.attachment.isViewable){return;}
this.messaging.dialogManager.update({dialogs:insert({attachmentViewer:insertAndReplace({attachment:replace(this.attachment),attachmentList:replace(this.attachmentList),}),}),});}
onClickUnlink(ev){ev.stopPropagation();if(!this.attachment){return;}
if(this.attachmentList.composerView){this.component.trigger('o-attachment-removed',{attachmentLocalId:this.attachment.localId});this.attachment.remove();}else{this.update({hasDeleteConfirmDialog:true});}}
onDeleteConfirmDialogClosed(){if(!this.exists()){return;}
this.update({hasDeleteConfirmDialog:false});}
_computeHeight(){if(!this.attachmentList){return clear();}
if(this.attachmentList.composerView){return 50;}
if(this.attachmentList.chatter){return 160;}
if(this.attachmentList.message){return 300;}}
_computeImageUrl(){if(!this.attachment){return;}
if(!this.attachment.accessToken&&this.attachment.originThread&&this.attachment.originThread.model==='mail.channel'){return`/mail/channel/${this.attachment.originThread.id}/image/${this.attachment.id}/${this.width}x${this.height}`;}
const accessToken=this.attachment.accessToken?`?access_token=${this.attachment.accessToken}`:'';return`/web/image/${this.attachment.id}/${this.width}x${this.height}${accessToken}`;}
_computeWidth(){return 1920;}}
AttachmentImage.fields={attachment:many2one('mail.attachment',{inverse:'attachmentImages',readonly:true,required:true,}),attachmentList:many2one('mail.attachment_list',{inverse:'attachmentImages',readonly:true,required:true,}),component:attr(),hasDeleteConfirmDialog:attr({default:false,}),height:attr({compute:'_computeHeight',required:true,}),imageUrl:attr({compute:'_computeImageUrl',}),width:attr({compute:'_computeWidth',required:true,}),};AttachmentImage.identifyingFields=['attachmentList','attachment'];AttachmentImage.modelName='mail.attachment_image';return AttachmentImage;}
registerNewModel('mail.attachment_image',factory);return __exports;});;

/* /mail/static/src/models/attachment_list/attachment_list.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/attachment_list/attachment_list',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{many2many,many2one,one2many,one2one}=require('@mail/model/model_field');const{clear,insertAndReplace,replace}=require('@mail/model/model_field_command');function factory(dependencies){class AttachmentList extends dependencies['mail.model']{_computeAttachments(){if(this.message){return replace(this.message.attachments);}
if(this.chatter&&this.chatter.thread){return replace(this.chatter.thread.allAttachments);}
if(this.composerView&&this.composerView.composer){return replace(this.composerView.composer.attachments);}
return clear();}
_computeAttachmentImages(){return insertAndReplace(this.imageAttachments.map(attachment=>{return{attachment:replace(attachment),};}));}
_computeAttachmentCards(){return insertAndReplace(this.nonImageAttachments.map(attachment=>{return{attachment:replace(attachment),};}));}
_computeImageAttachments(){return replace(this.attachments.filter(attachment=>attachment.isImage));}
_computeNonImageAttachments(){return replace(this.attachments.filter(attachment=>!attachment.isImage));}
_computeViewableAttachments(){return replace(this.attachments.filter(attachment=>attachment.isViewable));}}
AttachmentList.fields={attachments:many2many('mail.attachment',{compute:'_computeAttachments',inverse:'attachmentLists',}),attachmentCards:one2many('mail.attachment_card',{compute:'_computeAttachmentCards',inverse:'attachmentList',isCausal:true,}),attachmentImages:one2many('mail.attachment_image',{compute:'_computeAttachmentImages',inverse:'attachmentList',isCausal:true,}),attachmentViewer:one2many('mail.attachment_viewer',{inverse:'attachmentList',isCausal:true,}),chatter:one2one('mail.chatter',{inverse:'attachmentList',readonly:true,}),composerView:one2one('mail.composer_view',{inverse:'attachmentList',readonly:true,}),imageAttachments:many2many('mail.attachment',{compute:'_computeImageAttachments',}),message:many2one('mail.message',{related:'messageView.message'}),messageView:one2one('mail.message_view',{inverse:'attachmentList',readonly:true,}),nonImageAttachments:many2many('mail.attachment',{compute:'_computeNonImageAttachments',}),viewableAttachments:many2many('mail.attachment',{compute:'_computeViewableAttachments',}),};AttachmentList.identifyingFields=[['composerView','messageView','chatter']];AttachmentList.modelName='mail.attachment_list';return AttachmentList;}
registerNewModel('mail.attachment_list',factory);return __exports;});;

/* /mail/static/src/models/attachment_viewer/attachment_viewer.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/attachment_viewer/attachment_viewer',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2many,many2one,one2one}=require('@mail/model/model_field');function factory(dependencies){class AttachmentViewer extends dependencies['mail.model']{close(){const dialog=this.messaging.models['mail.dialog'].find(dialog=>dialog.record===this);if(dialog){dialog.delete();}}
_computeImageUrl(){if(!this.attachment){return;}
if(!this.attachment.accessToken&&this.attachment.originThread&&this.attachment.originThread.model==='mail.channel'){return`/mail/channel/${this.attachment.originThread.id}/image/${this.attachment.id}`;}
const accessToken=this.attachment.accessToken?`?access_token=${this.attachment.accessToken}`:'';return`/web/image/${this.attachment.id}${accessToken}`;}}
AttachmentViewer.fields={angle:attr({default:0,}),attachment:many2one('mail.attachment'),attachmentList:many2one('mail.attachment_list',{inverse:'attachmentViewer',readonly:true,required:true,}),attachments:many2many('mail.attachment',{inverse:'attachmentViewer',related:'attachmentList.viewableAttachments',}),dialog:one2one('mail.dialog',{inverse:'attachmentViewer',isCausal:true,readonly:true,}),imageUrl:attr({compute:'_computeImageUrl',readonly:true,}),isImageLoading:attr({default:false,}),scale:attr({default:1,}),};AttachmentViewer.identifyingFields=['attachmentList'];AttachmentViewer.modelName='mail.attachment_viewer';return AttachmentViewer;}
registerNewModel('mail.attachment_viewer',factory);return __exports;});;

/* /mail/static/src/models/canned_response/canned_response.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/canned_response/canned_response',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr}=require('@mail/model/model_field');const{cleanSearchTerm}=require('@mail/utils/utils');function factory(dependencies){class CannedResponse extends dependencies['mail.model']{static fetchSuggestions(searchTerm,{thread}={}){}
static getSuggestionSortFunction(searchTerm,{thread}={}){const cleanedSearchTerm=cleanSearchTerm(searchTerm);return(a,b)=>{const cleanedAName=cleanSearchTerm(a.source||'');const cleanedBName=cleanSearchTerm(b.source||'');if(cleanedAName.startsWith(cleanedSearchTerm)&&!cleanedBName.startsWith(cleanedSearchTerm)){return-1;}
if(!cleanedAName.startsWith(cleanedSearchTerm)&&cleanedBName.startsWith(cleanedSearchTerm)){return 1;}
if(cleanedAName<cleanedBName){return-1;}
if(cleanedAName>cleanedBName){return 1;}
return a.id-b.id;};}
static searchSuggestions(searchTerm,{thread}={}){const cleanedSearchTerm=cleanSearchTerm(searchTerm);return[this.messaging.cannedResponses.filter(cannedResponse=>cleanSearchTerm(cannedResponse.source).includes(cleanedSearchTerm))];}
getMentionText(){return this.substitution;}}
CannedResponse.fields={id:attr({readonly:true,required:true,}),source:attr(),substitution:attr(),};CannedResponse.identifyingFields=['id'];CannedResponse.modelName='mail.canned_response';return CannedResponse;}
registerNewModel('mail.canned_response',factory);return __exports;});;

/* /mail/static/src/models/channel_command/channel_command.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/channel_command/channel_command',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr}=require('@mail/model/model_field');const{cleanSearchTerm}=require('@mail/utils/utils');function factory(dependencies){class ChannelCommand extends dependencies['mail.model']{static fetchSuggestions(searchTerm,{thread}={}){}
static getSuggestionSortFunction(searchTerm,{thread}={}){const cleanedSearchTerm=cleanSearchTerm(searchTerm);return(a,b)=>{const isATypeSpecific=a.channel_types;const isBTypeSpecific=b.channel_types;if(isATypeSpecific&&!isBTypeSpecific){return-1;}
if(!isATypeSpecific&&isBTypeSpecific){return 1;}
const cleanedAName=cleanSearchTerm(a.name||'');const cleanedBName=cleanSearchTerm(b.name||'');if(cleanedAName.startsWith(cleanedSearchTerm)&&!cleanedBName.startsWith(cleanedSearchTerm)){return-1;}
if(!cleanedAName.startsWith(cleanedSearchTerm)&&cleanedBName.startsWith(cleanedSearchTerm)){return 1;}
if(cleanedAName<cleanedBName){return-1;}
if(cleanedAName>cleanedBName){return 1;}
return a.id-b.id;};}
static searchSuggestions(searchTerm,{thread}={}){if(thread.model!=='mail.channel'){return[[]];}
const cleanedSearchTerm=cleanSearchTerm(searchTerm);return[this.messaging.commands.filter(command=>{if(!cleanSearchTerm(command.name).includes(cleanedSearchTerm)){return false;}
if(command.channel_types){return command.channel_types.includes(thread.channel_type);}
return true;})];}
async execute({channel,body=''}){return this.env.services.rpc({model:'mail.channel',method:this.methodName,args:[[channel.id]],kwargs:{body},});}
getMentionText(){return this.name;}}
ChannelCommand.fields={channel_types:attr(),help:attr({required:true,}),methodName:attr({required:true,}),name:attr({readonly:true,required:true,}),};ChannelCommand.identifyingFields=['name'];ChannelCommand.modelName='mail.channel_command';return ChannelCommand;}
registerNewModel('mail.channel_command',factory);return __exports;});;

/* /mail/static/src/models/channel_invitation_form/channel_invitation_form.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/channel_invitation_form/channel_invitation_form',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2many,many2one,one2one}=require('@mail/model/model_field');const{clear,insertAndReplace,link,replace,unlink,unlinkAll}=require('@mail/model/model_field_command');const{cleanSearchTerm}=require('@mail/utils/utils');function factory(dependencies){class ChannelInvitationForm extends dependencies['mail.model']{_created(){this.onClickInvite=this.onClickInvite.bind(this);this.onInputSearch=this.onInputSearch.bind(this);}
async onClickInvite(ev){if(this.thread.channel_type==='chat'){const partners_to=[...new Set([this.messaging.currentPartner.id,...this.thread.members.map(member=>member.id),...this.selectedPartners.map(partner=>partner.id),])];const channel=await this.messaging.models['mail.thread'].createGroupChat({partners_to});if(this.thread.rtc){await this.async(()=>channel.toggleCall({startWithVideo:!!this.thread.rtc.videoTrack,videoType:this.thread.rtc.sendUserVideo?'user-video':'display',}));}
channel.open();}else{await this.env.services.rpc(({model:'mail.channel',method:'add_members',args:[[this.thread.id]],kwargs:{partner_ids:this.selectedPartners.map(partner=>partner.id),invite_to_rtc_call:!!this.thread.rtc,},}));}
this.update({searchTerm:"",selectedPartners:unlinkAll(),});this.delete();}
onClickSelectablePartner(partner,ev){if(this.selectedPartners.includes(partner)){this.update({selectedPartners:unlink(partner)});return;}
this.update({selectedPartners:link(partner)});}
onClickSelectedPartner(partner,ev){this.update({selectedPartners:unlink(partner)});}
onComponentUpdate(){if(this.doFocusOnSearchInput&&this.searchInputRef.el){this.searchInputRef.el.focus();this.searchInputRef.el.setSelectionRange(this.searchTerm.length,this.searchTerm.length);this.update({doFocusOnSearchInput:clear()});}}
onInputPartnerCheckbox(partner,ev){if(!ev.target.checked){this.update({selectedPartners:unlink(partner)});return;}
this.update({selectedPartners:link(partner)});}
async onInputSearch(ev){this.update({searchTerm:ev.target.value});this.searchPartnersToInvite();}
async searchPartnersToInvite(){if(this.hasSearchRpcInProgress){this.update({hasPendingSearchRpc:true});return;}
this.update({hasPendingSearchRpc:false,hasSearchRpcInProgress:true,});try{const channelId=(this.thread&&this.thread.model==='mail.channel')?this.thread.id:undefined;const{count,partners:partnersData}=await this.env.services.rpc({model:'res.partner',method:'search_for_channel_invite',kwargs:{channel_id:channelId,search_term:cleanSearchTerm(this.searchTerm),},},{shadow:true});if(!this.exists()){return;}
this.update({searchResultCount:count,selectablePartners:insertAndReplace(partnersData.map(partnerData=>this.messaging.models['mail.partner'].convertData(partnerData))),});}finally{if(this.exists()){this.update({hasSearchRpcInProgress:false});if(this.hasPendingSearchRpc){this.searchPartnersToInvite();}}}}
_computeInviteButtonText(){if(!this.thread){return clear();}
switch(this.thread.channel_type){case'chat':return this.env._t("Create group chat");case'group':return this.env._t("Invite to group chat");}
return this.env._t("Invite to Channel");}
_computeThread(){if(this.threadView&&this.threadView.thread){return replace(this.threadView.thread);}
if(this.chatWindow&&this.chatWindow.thread){return replace(this.chatWindow.thread);}
return clear();}}
ChannelInvitationForm.fields={chatWindow:one2one('mail.chat_window',{inverse:'channelInvitationForm',readonly:true,}),component:attr(),doFocusOnSearchInput:attr(),hasPendingSearchRpc:attr({default:false,}),hasSearchRpcInProgress:attr({default:false,}),inviteButtonText:attr({compute:'_computeInviteButtonText',}),popoverView:one2one('mail.popover_view',{inverse:'channelInvitationForm',isCausal:true,}),searchInputRef:attr(),searchResultCount:attr({default:0,}),searchTerm:attr({default:"",}),selectablePartners:many2many('mail.partner'),selectedPartners:many2many('mail.partner'),thread:many2one('mail.thread',{compute:'_computeThread',readonly:true,required:true,}),threadView:one2one('mail.thread_view',{inverse:'channelInvitationForm',readonly:true,}),};ChannelInvitationForm.identifyingFields=[['chatWindow','threadView']];ChannelInvitationForm.modelName='mail.channel_invitation_form';return ChannelInvitationForm;}
registerNewModel('mail.channel_invitation_form',factory);return __exports;});;

/* /mail/static/src/models/chat_window/chat_window.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/chat_window/chat_window',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2one,one2one}=require('@mail/model/model_field');const{clear,insertAndReplace,link,unlink}=require('@mail/model/model_field_command');const{markEventHandled}=require('@mail/utils/utils');function factory(dependencies){class ChatWindow extends dependencies['mail.model']{_created(){super._created();this.onClickHideInviteForm=this.onClickHideInviteForm.bind(this);this.onClickHideMemberList=this.onClickHideMemberList.bind(this);this.onClickShowInviteForm=this.onClickShowInviteForm.bind(this);this.onClickShowMemberList=this.onClickShowMemberList.bind(this);this.onFocusInNewMessageFormInput=this.onFocusInNewMessageFormInput.bind(this);}
close({notifyServer}={}){if(notifyServer===undefined){notifyServer=!this.messaging.device.isMobile;}
if(this.messaging.device.isMobile&&!this.messaging.discuss.isOpen){this.messaging.messagingMenu.update({isOpen:true});}
if(this.thread&&notifyServer&&!this.messaging.currentGuest){this.thread.notifyFoldStateToServer('closed');}
if(this.exists()){this.delete();}}
expand(){if(this.thread){this.thread.open({expanded:true});}}
focus(){if(!this.thread){this.update({isDoFocus:true});}
if(this.threadView&&this.threadView.composerView){this.threadView.composerView.update({doFocus:true});}}
focusNextVisibleUnfoldedChatWindow(){const nextVisibleUnfoldedChatWindow=this._getNextVisibleUnfoldedChatWindow();if(nextVisibleUnfoldedChatWindow){nextVisibleUnfoldedChatWindow.focus();}}
focusPreviousVisibleUnfoldedChatWindow(){const previousVisibleUnfoldedChatWindow=this._getNextVisibleUnfoldedChatWindow({reverse:true});if(previousVisibleUnfoldedChatWindow){previousVisibleUnfoldedChatWindow.focus();}}
fold({notifyServer}={}){if(notifyServer===undefined){notifyServer=!this.messaging.device.isMobile;}
this.update({isFolded:true});if(this.thread&&notifyServer&&!this.messaging.currentGuest){this.thread.notifyFoldStateToServer('folded');}}
makeActive(options){this.makeVisible();this.unfold(options);if((options&&options.focus!==undefined)?options.focus:!this.messaging.device.isMobileDevice){this.focus();}}
makeVisible(){if(this.isVisible){return;}
const lastVisible=this.manager.lastVisible;this.manager.swap(this,lastVisible);}
onClickHideInviteForm(ev){markEventHandled(ev,'ChatWindow.onClickCommand');this.update({channelInvitationForm:clear()});}
onClickHideMemberList(ev){markEventHandled(ev,'ChatWindow.onClickHideMemberList');this.update({isMemberListOpened:false});if(this.threadViewer.threadView){this.threadViewer.threadView.addComponentHint('member-list-hidden');}}
onClickShowInviteForm(ev){markEventHandled(ev,'ChatWindow.onClickCommand');this.update({channelInvitationForm:insertAndReplace({doFocusOnSearchInput:true,}),isMemberListOpened:false,});if(!this.messaging.isCurrentUserGuest){this.channelInvitationForm.searchPartnersToInvite();}}
onClickShowMemberList(ev){markEventHandled(ev,'ChatWindow.onClickShowMemberList');this.update({channelInvitationForm:clear(),isMemberListOpened:true,});}
onFocusInNewMessageFormInput(ev){if(this.exists()){this.update({isFocused:true});}}
shiftPrev(){this.manager.shiftPrev(this);}
shiftNext(){this.manager.shiftNext(this);}
unfold({notifyServer}={}){if(notifyServer===undefined){notifyServer=!this.messaging.device.isMobile;}
this.update({isFolded:false});if(this.thread&&notifyServer&&!this.messaging.currentGuest){this.thread.notifyFoldStateToServer('open');}}
_computeHasCallButtons(){return Boolean(this.thread)&&this.thread.rtcSessions.length===0&&['channel','chat','group'].includes(this.thread.channel_type);}
_computeHasInviteFeature(){return Boolean(this.thread&&this.thread.hasInviteFeature&&this.messaging&&this.messaging.device&&this.messaging.device.isMobile);}
_computeHasNewMessageForm(){return this.isVisible&&!this.isFolded&&!this.thread;}
_computeHasShiftPrev(){if(!this.manager){return false;}
const allVisible=this.manager.allOrderedVisible;const index=allVisible.findIndex(visible=>visible===this);if(index===-1){return false;}
return index<allVisible.length-1;}
_computeHasShiftNext(){if(!this.manager){return false;}
const index=this.manager.allOrderedVisible.findIndex(visible=>visible===this);if(index===-1){return false;}
return index>0;}
_computeHasThreadView(){return this.isVisible&&!this.isFolded&&!!this.thread&&!this.isMemberListOpened&&!this.channelInvitationForm;}
_computeIsFolded(){const thread=this.thread;if(thread){return thread.foldState==='folded';}
return this.isFolded;}
_computeIsVisible(){if(!this.manager){return false;}
return this.manager.allOrderedVisible.includes(this);}
_computeName(){if(this.thread){return this.thread.displayName;}
return this.env._t("New message");}
_computeThreadViewer(){return insertAndReplace({compact:true,hasThreadView:this.hasThreadView,thread:this.thread?link(this.thread):unlink(),});}
_computeVisibleIndex(){if(!this.manager){return clear();}
const visible=this.manager.visual.visible;const index=visible.findIndex(visible=>visible.chatWindowLocalId===this.localId);if(index===-1){return clear();}
return index;}
_computeVisibleOffset(){if(!this.manager){return 0;}
const visible=this.manager.visual.visible;const index=visible.findIndex(visible=>visible.chatWindowLocalId===this.localId);if(index===-1){return 0;}
return visible[index].offset;}
_getNextVisibleUnfoldedChatWindow({reverse=false}={}){const orderedVisible=this.manager.allOrderedVisible;const _getNextIndex=index=>{const directionOffset=reverse?1:-1;let nextIndex=index+directionOffset;if(nextIndex>orderedVisible.length-1){nextIndex=0;}
if(nextIndex<0){nextIndex=orderedVisible.length-1;}
return nextIndex;};const currentIndex=orderedVisible.findIndex(visible=>visible===this);let nextIndex=_getNextIndex(currentIndex);let nextToFocus=orderedVisible[nextIndex];while(nextToFocus.isFolded){nextIndex=_getNextIndex(nextIndex);nextToFocus=orderedVisible[nextIndex];}
return nextToFocus;}}
ChatWindow.fields={channelInvitationForm:one2one('mail.channel_invitation_form',{inverse:'chatWindow',isCausal:true,}),hasCallButtons:attr({default:false,compute:'_computeHasCallButtons',}),hasInviteFeature:attr({compute:'_computeHasInviteFeature',}),hasNewMessageForm:attr({compute:'_computeHasNewMessageForm',}),hasShiftPrev:attr({compute:'_computeHasShiftPrev',default:false,}),hasShiftNext:attr({compute:'_computeHasShiftNext',default:false,}),hasThreadView:attr({compute:'_computeHasThreadView',}),isDoFocus:attr({default:false,}),isFocused:attr({default:false,}),isFolded:attr({default:false,}),isMemberListOpened:attr({default:false,}),isVisible:attr({compute:'_computeIsVisible',}),manager:many2one('mail.chat_window_manager',{inverse:'chatWindows',readonly:true,}),managerAsNewMessage:one2one('mail.chat_window_manager',{inverse:'newMessageChatWindow',readonly:true,}),name:attr({compute:'_computeName',}),thread:one2one('mail.thread',{inverse:'chatWindow',readonly:true,}),threadView:one2one('mail.thread_view',{related:'threadViewer.threadView',}),threadViewer:one2one('mail.thread_viewer',{compute:'_computeThreadViewer',inverse:'chatWindow',isCausal:true,readonly:true,required:true,}),visibleIndex:attr({compute:'_computeVisibleIndex',}),visibleOffset:attr({compute:'_computeVisibleOffset',}),};ChatWindow.identifyingFields=['manager',['thread','managerAsNewMessage']];ChatWindow.modelName='mail.chat_window';return ChatWindow;}
registerNewModel('mail.chat_window',factory);return __exports;});;

/* /mail/static/src/models/chat_window_manager/chat_window_manager.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/chat_window_manager/chat_window_manager',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2one,one2many,one2one}=require('@mail/model/model_field');const{insertAndReplace,link,replace,unlink}=require('@mail/model/model_field_command');function factory(dependencies){const BASE_VISUAL={availableVisibleSlots:0,hidden:{chatWindowLocalIds:[],isVisible:false,offset:0,},visible:[],};class ChatWindowManager extends dependencies['mail.model']{closeAll(){const chatWindows=this.allOrdered;for(const chatWindow of chatWindows){chatWindow.close();}}
closeHiddenMenu(){this.update({isHiddenMenuOpen:false});}
closeThread(thread,options){for(const chatWindow of this.chatWindows){if(chatWindow.thread===thread){chatWindow.close(options);}}}
openHiddenMenu(){this.update({isHiddenMenuOpen:true});}
openNewMessage(){if(!this.newMessageChatWindow){this.update({newMessageChatWindow:insertAndReplace({manager:replace(this)})});}
this.newMessageChatWindow.makeActive();}
openThread(thread,{focus,isFolded=false,makeActive=false,notifyServer,replaceNewMessage=false}={}){if(notifyServer===undefined){notifyServer=!this.messaging.device.isMobile;}
let chatWindow=this.chatWindows.find(chatWindow=>chatWindow.thread===thread);if(!chatWindow){chatWindow=this.messaging.models['mail.chat_window'].create({isFolded,manager:link(this),thread:link(thread),});}else{chatWindow.update({isFolded});}
if(replaceNewMessage&&this.newMessageChatWindow){this.swap(chatWindow,this.newMessageChatWindow);this.newMessageChatWindow.close();}
if(makeActive){chatWindow.makeActive({focus,notifyServer:false});}
if(notifyServer&&!this.messaging.currentGuest){const foldState=chatWindow.isFolded?'folded':'open';thread.notifyFoldStateToServer(foldState);}}
shiftPrev(chatWindow){const chatWindows=this.allOrdered;const index=chatWindows.findIndex(cw=>cw===chatWindow);if(index===chatWindows.length-1){return;}
const otherChatWindow=chatWindows[index+1];const _newOrdered=[...this.allOrdered];_newOrdered[index]=otherChatWindow;_newOrdered[index+1]=chatWindow;this.update({allOrdered:replace(_newOrdered)});chatWindow.focus();for(const loopedChatWindow of[chatWindow,otherChatWindow]){if(loopedChatWindow.threadView){loopedChatWindow.threadView.addComponentHint('adjust-scroll');}}}
shiftNext(chatWindow){const chatWindows=this.allOrdered;const index=chatWindows.findIndex(cw=>cw===chatWindow);if(index===0){return;}
const otherChatWindow=chatWindows[index-1];const _newOrdered=[...this.allOrdered];_newOrdered[index]=otherChatWindow;_newOrdered[index-1]=chatWindow;this.update({allOrdered:replace(_newOrdered)});chatWindow.focus();for(const loopedChatWindow of[chatWindow,otherChatWindow]){if(loopedChatWindow.threadView){loopedChatWindow.threadView.addComponentHint('adjust-scroll');}}}
swap(chatWindow1,chatWindow2){const ordered=this.allOrdered;const index1=ordered.findIndex(chatWindow=>chatWindow===chatWindow1);const index2=ordered.findIndex(chatWindow=>chatWindow===chatWindow2);if(index1===-1||index2===-1){return;}
const _newOrdered=[...this.allOrdered];_newOrdered[index1]=chatWindow2;_newOrdered[index2]=chatWindow1;this.update({allOrdered:replace(_newOrdered)});for(const chatWindow of[chatWindow1,chatWindow2]){if(chatWindow.threadView){chatWindow.threadView.addComponentHint('adjust-scroll');}}}
_computeAllOrdered(){return link(this.chatWindows);}
_computeAllOrderedHidden(){return replace(this.visual.hidden.chatWindowLocalIds.map(chatWindowLocalId=>this.messaging.models['mail.chat_window'].get(chatWindowLocalId)));}
_computeAllOrderedVisible(){return replace(this.visual.visible.map(({chatWindowLocalId})=>this.messaging.models['mail.chat_window'].get(chatWindowLocalId)));}
_computeHasHiddenChatWindows(){return this.allOrderedHidden.length>0;}
_computeHasVisibleChatWindows(){return this.allOrderedVisible.length>0;}
_computeLastVisible(){const{length:l,[l-1]:lastVisible}=this.allOrderedVisible;if(!lastVisible){return unlink();}
return link(lastVisible);}
_computeUnreadHiddenConversationAmount(){const allHiddenWithThread=this.allOrderedHidden.filter(chatWindow=>chatWindow.thread);let amount=0;for(const chatWindow of allHiddenWithThread){if(chatWindow.thread.localMessageUnreadCounter>0){amount++;}}
return amount;}
_computeVisual(){let visual=JSON.parse(JSON.stringify(BASE_VISUAL));if(!this.messaging||!this.messaging.device){return visual;}
const device=this.messaging.device;const discuss=this.messaging.discuss;const BETWEEN_GAP_WIDTH=5;const CHAT_WINDOW_WIDTH=325;const END_GAP_WIDTH=device.isMobile?0:10;const GLOBAL_WINDOW_WIDTH=device.globalWindowInnerWidth;const HIDDEN_MENU_WIDTH=200;const START_GAP_WIDTH=device.isMobile?0:10;const chatWindows=this.allOrdered;if(!device.isMobile&&discuss.isOpen){return visual;}
if(!chatWindows.length){return visual;}
const relativeGlobalWindowWidth=GLOBAL_WINDOW_WIDTH-START_GAP_WIDTH-END_GAP_WIDTH;let maxAmountWithoutHidden=Math.floor(relativeGlobalWindowWidth/(CHAT_WINDOW_WIDTH+BETWEEN_GAP_WIDTH));let maxAmountWithHidden=Math.floor((relativeGlobalWindowWidth-HIDDEN_MENU_WIDTH-BETWEEN_GAP_WIDTH)/(CHAT_WINDOW_WIDTH+BETWEEN_GAP_WIDTH));if(device.isMobile){maxAmountWithoutHidden=1;maxAmountWithHidden=1;}
if(chatWindows.length<=maxAmountWithoutHidden){for(let i=0;i<chatWindows.length;i++){const chatWindowLocalId=chatWindows[i].localId;const offset=START_GAP_WIDTH+i*(CHAT_WINDOW_WIDTH+BETWEEN_GAP_WIDTH);visual.visible.push({chatWindowLocalId,offset});}
visual.availableVisibleSlots=maxAmountWithoutHidden;}else if(maxAmountWithHidden>0){for(let i=0;i<maxAmountWithHidden;i++){const chatWindowLocalId=chatWindows[i].localId;const offset=START_GAP_WIDTH+i*(CHAT_WINDOW_WIDTH+BETWEEN_GAP_WIDTH);visual.visible.push({chatWindowLocalId,offset});}
if(chatWindows.length>maxAmountWithHidden){visual.hidden.isVisible=!device.isMobile;visual.hidden.offset=visual.visible[maxAmountWithHidden-1].offset
+CHAT_WINDOW_WIDTH+BETWEEN_GAP_WIDTH;}
for(let j=maxAmountWithHidden;j<chatWindows.length;j++){visual.hidden.chatWindowLocalIds.push(chatWindows[j].localId);}
visual.availableVisibleSlots=maxAmountWithHidden;}else{visual.hidden.isVisible=!device.isMobile;visual.hidden.offset=START_GAP_WIDTH;visual.hidden.chatWindowLocalIds.concat(chatWindows.map(chatWindow=>chatWindow.localId));console.warn('cannot display any visible chat windows (screen is too small)');visual.availableVisibleSlots=0;}
return visual;}}
ChatWindowManager.fields={allOrdered:one2many('mail.chat_window',{compute:'_computeAllOrdered',}),allOrderedHidden:one2many('mail.chat_window',{compute:'_computeAllOrderedHidden',}),allOrderedVisible:one2many('mail.chat_window',{compute:'_computeAllOrderedVisible',}),chatWindows:one2many('mail.chat_window',{inverse:'manager',isCausal:true,}),hasHiddenChatWindows:attr({compute:'_computeHasHiddenChatWindows',}),hasVisibleChatWindows:attr({compute:'_computeHasVisibleChatWindows',}),isHiddenMenuOpen:attr({default:false,}),lastVisible:many2one('mail.chat_window',{compute:'_computeLastVisible',}),newMessageChatWindow:one2one('mail.chat_window',{inverse:'managerAsNewMessage',isCausal:true,}),unreadHiddenConversationAmount:attr({compute:'_computeUnreadHiddenConversationAmount',}),visual:attr({compute:'_computeVisual',default:BASE_VISUAL,}),};ChatWindowManager.identifyingFields=['messaging'];ChatWindowManager.modelName='mail.chat_window_manager';return ChatWindowManager;}
registerNewModel('mail.chat_window_manager',factory);return __exports;});;

/* /mail/static/src/models/chatter/chatter.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/chatter/chatter',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2one,one2one}=require('@mail/model/model_field');const{clear,insert,insertAndReplace,link,unlink}=require('@mail/model/model_field_command');const{OnChange}=require('@mail/model/model_onchange');function factory(dependencies){const getThreadNextTemporaryId=(function(){let tmpId=0;return()=>{tmpId-=1;return tmpId;};})();const getMessageNextTemporaryId=(function(){let tmpId=0;return()=>{tmpId-=1;return tmpId;};})();class Chatter extends dependencies['mail.model']{_created(){this._attachmentsLoaderTimeout=undefined;this._isPreparingAttachmentsLoading=undefined;this.onClickActivityBoxTitle=this.onClickActivityBoxTitle.bind(this);this.onClickButtonAttachments=this.onClickButtonAttachments.bind(this);this.onClickChatterTopbarClose=this.onClickChatterTopbarClose.bind(this);this.onClickLogNote=this.onClickLogNote.bind(this);this.onClickScheduleActivity=this.onClickScheduleActivity.bind(this);this.onClickSendMessage=this.onClickSendMessage.bind(this);this.onScrollScrollPanel=this.onScrollScrollPanel.bind(this);}
_willDelete(){this._stopAttachmentsLoading();return super._willDelete(...arguments);}
focus(){if(this.composerView){this.composerView.update({doFocus:true});}}
onClickActivityBoxTitle(ev){ev.preventDefault();this.update({isActivityBoxVisible:!this.isActivityBoxVisible});}
onClickButtonAttachments(ev){this.update({isAttachmentBoxVisible:!this.isAttachmentBoxVisible});}
onClickChatterTopbarClose(ev){this.componentChatterTopbar.trigger('o-close-chatter');}
onClickLogNote(){if(this.composerView&&this.composerView.composer.isLog){this.update({composerView:clear()});}else{this.showLogNote();}}
onClickScheduleActivity(ev){const action={type:'ir.actions.act_window',name:this.env._t("Schedule Activity"),res_model:'mail.activity',view_mode:'form',views:[[false,'form']],target:'new',context:{default_res_id:this.thread.id,default_res_model:this.thread.model,},res_id:false,};return this.env.bus.trigger('do-action',{action,options:{on_close:()=>{if(!this.componentChatterTopbar){return;}
this.componentChatterTopbar.trigger('reload',{keepChanges:true});},},});}
onClickSendMessage(ev){if(this.composerView&&!this.composerView.composer.isLog){this.update({composerView:clear()});}else{this.showSendMessage();}}
onScrollScrollPanel(ev){if(!this.threadRef.comp){return;}
this.threadRef.comp.onScroll(ev);}
async refresh(){if(this.hasActivities){this.thread.refreshActivities();}
if(this.hasFollowers){this.thread.refreshFollowers();this.thread.fetchAndUpdateSuggestedRecipients();}
if(this.hasMessageList){this.thread.refresh();}}
showLogNote(){this.update({composerView:insertAndReplace()});this.composerView.composer.update({isLog:true});this.focus();}
showSendMessage(){this.update({composerView:insertAndReplace()});this.composerView.composer.update({isLog:false});this.focus();}
_computeAttachmentList(){return(this.thread&&this.thread.allAttachments.length>0)?insertAndReplace():clear();}
_computeHasThreadView(){return Boolean(this.thread&&this.hasMessageList);}
_computeIsDisabled(){return Boolean(!this.thread||this.thread.isTemporary);}
_computeThreadViewer(){return insertAndReplace({hasThreadView:this.hasThreadView,order:'desc',thread:this.thread?link(this.thread):unlink(),});}
_onThreadIdOrThreadModelChanged(){if(this.threadId){if(this.thread&&this.thread.isTemporary){this.thread.delete();}
this.update({isAttachmentBoxVisible:this.isAttachmentBoxVisibleInitially,thread:insert({hasActivities:this.hasActivities?true:undefined,id:this.threadId,model:this.threadModel,}),});if(this.hasActivities){this.thread.refreshActivities();}
if(this.hasFollowers){this.thread.refreshFollowers();this.thread.fetchAndUpdateSuggestedRecipients();}
if(this.hasMessageList){this.thread.refresh();}}else if(!this.thread||!this.thread.isTemporary){const currentPartner=this.messaging.currentPartner;const message=this.messaging.models['mail.message'].create({author:link(currentPartner),body:this.env._t("Creating a new record..."),id:getMessageNextTemporaryId(),isTemporary:true,});const nextId=getThreadNextTemporaryId();this.update({isAttachmentBoxVisible:false,thread:insert({areAttachmentsLoaded:true,id:nextId,isTemporary:true,model:this.threadModel,}),});this.thread.cache.update({messages:link(message)});}}
_onThreadIsLoadingAttachmentsChanged(){if(!this.thread||!this.thread.isLoadingAttachments){this._stopAttachmentsLoading();this.update({isShowingAttachmentsLoading:false});return;}
if(this._isPreparingAttachmentsLoading||this.isShowingAttachmentsLoading){return;}
this._prepareAttachmentsLoading();}
_prepareAttachmentsLoading(){this._isPreparingAttachmentsLoading=true;this._attachmentsLoaderTimeout=this.env.browser.setTimeout(()=>{this.update({isShowingAttachmentsLoading:true});this._isPreparingAttachmentsLoading=false;},this.messaging.loadingBaseDelayDuration);}
_stopAttachmentsLoading(){this.env.browser.clearTimeout(this._attachmentsLoaderTimeout);this._attachmentsLoaderTimeout=null;this._isPreparingAttachmentsLoading=false;}}
Chatter.fields={attachmentList:one2one('mail.attachment_list',{compute:'_computeAttachmentList',inverse:'chatter',isCausal:true,readonly:true,}),component:attr(),componentChatterTopbar:attr(),composerView:one2one('mail.composer_view',{inverse:'chatter',isCausal:true,}),context:attr({default:{},}),hasActivities:attr({default:true,}),hasExternalBorder:attr({default:true,}),hasFollowers:attr({default:true,}),hasMessageList:attr({default:true,}),hasMessageListScrollAdjust:attr({default:false,}),hasThreadView:attr({compute:'_computeHasThreadView',}),hasTopbarCloseButton:attr({default:false,}),id:attr({readonly:true,required:true,}),isActivityBoxVisible:attr({default:true,}),isAttachmentBoxVisible:attr({default:false,}),isAttachmentBoxVisibleInitially:attr({default:false,}),isDisabled:attr({compute:'_computeIsDisabled',default:false,}),isShowingAttachmentsLoading:attr({default:false,}),thread:many2one('mail.thread'),threadId:attr(),threadModel:attr(),threadRef:attr(),threadView:one2one('mail.thread_view',{related:'threadViewer.threadView',}),threadViewer:one2one('mail.thread_viewer',{compute:'_computeThreadViewer',inverse:'chatter',isCausal:true,readonly:true,required:true,}),};Chatter.identifyingFields=['id'];Chatter.onChanges=[new OnChange({dependencies:['threadId','threadModel'],methodName:'_onThreadIdOrThreadModelChanged',}),new OnChange({dependencies:['thread.isLoadingAttachments'],methodName:'_onThreadIsLoadingAttachmentsChanged',}),];Chatter.modelName='mail.chatter';return Chatter;}
registerNewModel('mail.chatter',factory);return __exports;});;

/* /mail/static/src/models/composer/composer.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/composer/composer',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2many,many2one,one2many,one2one}=require('@mail/model/model_field');const{clear,replace,unlink}=require('@mail/model/model_field_command');function factory(dependencies){class Composer extends dependencies['mail.model']{_computeActiveThread(){if(this.messageViewInEditing&&this.messageViewInEditing.message&&this.messageViewInEditing.message.originThread){return replace(this.messageViewInEditing.message.originThread);}
if(this.thread){return replace(this.thread);}
return clear();}
_computeCanPostMessage(){if(this.thread&&!this.textInputContent&&this.attachments.length===0){return false;}
return!this.hasUploadingAttachment&&!this.isPostingMessage;}
_computeHasUploadingAttachment(){return this.attachments.some(attachment=>attachment.isUploading);}
_computeMentionedPartners(){const unmentionedPartners=[];const namesIndex={};for(const partner of this.mentionedPartners){const fromIndex=namesIndex[partner.name]!==undefined?namesIndex[partner.name]+1:0;const index=this.textInputContent.indexOf(`@${partner.name}`,fromIndex);if(index!==-1){namesIndex[partner.name]=index;}else{unmentionedPartners.push(partner);}}
return unlink(unmentionedPartners);}
_computeMentionedChannels(){const unmentionedChannels=[];const namesIndex={};for(const channel of this.mentionedChannels){const fromIndex=namesIndex[channel.name]!==undefined?namesIndex[channel.name]+1:0;const index=this.textInputContent.indexOf(`#${channel.name}`,fromIndex);if(index!==-1){namesIndex[channel.name]=index;}else{unmentionedChannels.push(channel);}}
return unlink(unmentionedChannels);}
_computeRecipients(){const recipients=[...this.mentionedPartners];if(this.activeThread&&!this.isLog){for(const recipient of this.activeThread.suggestedRecipientInfoList){if(recipient.partner&&recipient.isSelected){recipients.push(recipient.partner);}}}
return replace(recipients);}
_reset(){this.update({attachments:clear(),isLastStateChangeProgrammatic:true,mentionedChannels:clear(),mentionedPartners:clear(),textInputContent:clear(),textInputCursorEnd:clear(),textInputCursorStart:clear(),textInputSelectionDirection:clear(),});}}
Composer.fields={activeThread:many2one('mail.thread',{compute:'_computeActiveThread',readonly:true,required:true,}),attachments:one2many('mail.attachment',{inverse:'composer',}),canPostMessage:attr({compute:'_computeCanPostMessage',default:false,}),composerViews:one2many('mail.composer_view',{inverse:'composer',isCausal:true,}),hasUploadingAttachment:attr({compute:'_computeHasUploadingAttachment',}),isLastStateChangeProgrammatic:attr({default:false,}),isLog:attr({default:true,}),isPostingMessage:attr(),mentionedChannels:many2many('mail.thread',{compute:'_computeMentionedChannels',}),mentionedPartners:many2many('mail.partner',{compute:'_computeMentionedPartners',}),messageViewInEditing:one2one('mail.message_view',{inverse:'composerForEditing',readonly:true,}),recipients:many2many('mail.partner',{compute:'_computeRecipients',}),textInputContent:attr({default:"",}),textInputCursorEnd:attr({default:0,}),textInputCursorStart:attr({default:0,}),textInputSelectionDirection:attr({default:"none",}),thread:one2one('mail.thread',{inverse:'composer',readonly:true,}),};Composer.identifyingFields=[['thread','messageViewInEditing']];Composer.modelName='mail.composer';return Composer;}
registerNewModel('mail.composer',factory);return __exports;});;

/* /mail/static/src/models/composer_view/composer_view.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/composer_view/composer_view',async function(require){'use strict';let __exports={};const{emojis}=require('@mail/js/emojis');const{registerNewModel}=require('@mail/model/model_core');const{attr,many2many,many2one,one2one}=require('@mail/model/model_field');const{clear,insertAndReplace,link,replace,unlink,unlinkAll}=require('@mail/model/model_field_command');const{OnChange}=require('@mail/model/model_onchange');const{addLink,escapeAndCompactTextContent,parseAndTransform}=require('@mail/js/utils');function factory(dependencies){class ComposerView extends dependencies['mail.model']{_willCreate(){const res=super._willCreate(...arguments);this._hasMentionRpcInProgress=false;this._nextMentionRpcFunction=undefined;return res;}
_created(){this.onClickCancelLink=this.onClickCancelLink.bind(this);this.onClickSaveLink=this.onClickSaveLink.bind(this);this.onClickStopReplying=this.onClickStopReplying.bind(this);}
_willDelete(){this._nextMentionRpcFunction=undefined;return super._willDelete(...arguments);}
closeSuggestions(){this.update({suggestionDelimiterPosition:clear()});}
discard(){if(this.messageViewInEditing){this.messageViewInEditing.stopEditing();}
if(this.threadView&&this.threadView.replyingToMessageView){const{threadView}=this;if(this.threadView.thread===this.messaging.inbox){this.delete();}
threadView.update({replyingToMessageView:clear()});}}
handleCurrentPartnerIsTyping(){if(!this.composer.thread){return;}
if(this.messaging.isCurrentUserGuest){return;}
if(this.suggestionModelName==='mail.channel_command'||this._getCommandFromText(this.composer.textInputContent)){return;}
if(this.composer.thread.typingMembers.includes(this.messaging.currentPartner)){this.composer.thread.refreshCurrentPartnerIsTyping();}else{this.composer.thread.registerCurrentPartnerIsTyping();}}
insertIntoTextInput(content){const partA=this.composer.textInputContent.slice(0,this.composer.textInputCursorStart);const partB=this.composer.textInputContent.slice(this.composer.textInputCursorEnd,this.composer.textInputContent.length);let suggestionDelimiterPosition=this.suggestionDelimiterPosition;if(suggestionDelimiterPosition!==undefined&&suggestionDelimiterPosition>=this.composer.textInputCursorStart){suggestionDelimiterPosition=suggestionDelimiterPosition+content.length;}
this.composer.update({isLastStateChangeProgrammatic:true,textInputContent:partA+content+partB,textInputCursorEnd:this.composer.textInputCursorStart+content.length,textInputCursorStart:this.composer.textInputCursorStart+content.length,});this.update({suggestionDelimiterPosition});}
insertSuggestion(){const cursorPosition=this.composer.textInputCursorStart;let textLeft=this.composer.textInputContent.substring(0,this.suggestionDelimiterPosition+1);let textRight=this.composer.textInputContent.substring(cursorPosition,this.composer.textInputContent.length);if(this.suggestionDelimiter===':'){textLeft=this.composer.textInputContent.substring(0,this.suggestionDelimiterPosition);textRight=this.composer.textInputContent.substring(cursorPosition,this.composer.textInputContent.length);}
const recordReplacement=this.activeSuggestedRecord.getMentionText();const updateData={isLastStateChangeProgrammatic:true,textInputContent:textLeft+recordReplacement+' '+textRight,textInputCursorEnd:textLeft.length+recordReplacement.length+1,textInputCursorStart:textLeft.length+recordReplacement.length+1,};switch(this.activeSuggestedRecord.constructor.modelName){case'mail.thread':Object.assign(updateData,{mentionedChannels:link(this.activeSuggestedRecord)});break;case'mail.partner':Object.assign(updateData,{mentionedPartners:link(this.activeSuggestedRecord)});break;}
this.composer.update(updateData);}
onClickCancelLink(ev){ev.preventDefault();this.discard();}
onClickSaveLink(ev){ev.preventDefault();if(!this.composer.canPostMessage){if(this.composer.hasUploadingAttachment){this.env.services['notification'].notify({message:this.env._t("Please wait while the file is uploading."),type:'warning',});}
return;}
if(this.messageViewInEditing){this.updateMessage();return;}
this.postMessage();}
onClickStopReplying(ev){this.threadView.update({replyingToMessageView:clear(),});}
async openFullComposer(){const attachmentIds=this.composer.attachments.map(attachment=>attachment.id);const context={default_attachment_ids:attachmentIds,default_body:escapeAndCompactTextContent(this.composer.textInputContent),default_is_log:this.composer.isLog,default_model:this.composer.activeThread.model,default_partner_ids:this.composer.recipients.map(partner=>partner.id),default_res_id:this.composer.activeThread.id,mail_post_autofollow:true,};const action={type:'ir.actions.act_window',res_model:'mail.compose.message',view_mode:'form',views:[[false,'form']],target:'new',context:context,};const composer=this.composer;const options={on_close:()=>{if(!composer.exists()){return;}
composer._reset();if(composer.activeThread){composer.activeThread.loadNewMessages();}},};await this.env.bus.trigger('do-action',{action,options});}
async postMessage(){const composer=this.composer;if(composer.thread.model==='mail.channel'){const command=this._getCommandFromText(composer.textInputContent);if(command){await command.execute({channel:composer.thread,body:composer.textInputContent});if(composer.exists()){composer._reset();}
return;}}
if(this.messaging.currentPartner){composer.thread.unregisterCurrentPartnerIsTyping({immediateNotify:true});}
const postData=this._getMessageData();const params={'post_data':postData,'thread_id':composer.thread.id,'thread_model':composer.thread.model,};try{composer.update({isPostingMessage:true});if(composer.thread.model==='mail.channel'){Object.assign(postData,{subtype_xmlid:'mail.mt_comment',});}else{Object.assign(postData,{subtype_xmlid:composer.isLog?'mail.mt_note':'mail.mt_comment',});if(!composer.isLog){params.context={mail_post_autofollow:true};}}
if(this.threadView&&this.threadView.replyingToMessageView&&this.threadView.thread!==this.messaging.inbox){postData.parent_id=this.threadView.replyingToMessageView.message.id;}
const chatter=this.chatter;const{threadView={}}=this;const{thread:chatterThread}=this.chatter||{};const{thread:threadViewThread}=threadView;const messageData=await this.env.services.rpc({route:`/mail/message/post`,params});if(!this.messaging){return;}
const message=this.messaging.models['mail.message'].insert(this.messaging.models['mail.message'].convertData(messageData));for(const threadView of message.originThread.threadViews){threadView.update({hasAutoScrollOnMessageReceived:true});threadView.addComponentHint('message-posted',{message});}
if(chatter&&chatter.exists()&&chatter.component){chatter.component.trigger('o-message-posted');}
if(chatterThread){if(this.exists()){this.delete();}
if(chatterThread.exists()){chatterThread.loadNewMessages();chatterThread.refreshFollowers();chatterThread.fetchAndUpdateSuggestedRecipients();}}
if(threadViewThread){if(threadViewThread===this.messaging.inbox){if(this.exists()){this.delete();}
this.env.services['notification'].notify({message:_.str.sprintf(this.env._t(`Message posted on "%s"`),message.originThread.displayName),type:'info',});}
if(threadView&&threadView.exists()){threadView.update({replyingToMessageView:clear()});}}
if(composer.exists()){composer._reset();}}finally{if(composer.exists()){composer.update({isPostingMessage:false});}}}
setFirstSuggestionActive(){const suggestedRecords=this.mainSuggestedRecords.concat(this.extraSuggestedRecords);const firstRecord=suggestedRecords[0];this.update({activeSuggestedRecord:link(firstRecord)});}
setLastSuggestionActive(){const suggestedRecords=this.mainSuggestedRecords.concat(this.extraSuggestedRecords);const{length,[length-1]:lastRecord}=suggestedRecords;this.update({activeSuggestedRecord:link(lastRecord)});}
setNextSuggestionActive(){const suggestedRecords=this.mainSuggestedRecords.concat(this.extraSuggestedRecords);const activeElementIndex=suggestedRecords.findIndex(suggestion=>suggestion===this.activeSuggestedRecord);if(activeElementIndex===suggestedRecords.length-1){this.setFirstSuggestionActive();return;}
const nextRecord=suggestedRecords[activeElementIndex+1];this.update({activeSuggestedRecord:link(nextRecord)});}
setPreviousSuggestionActive(){const suggestedRecords=this.mainSuggestedRecords.concat(this.extraSuggestedRecords);const activeElementIndex=suggestedRecords.findIndex(suggestion=>suggestion===this.activeSuggestedRecord);if(activeElementIndex===0){this.setLastSuggestionActive();return;}
const previousRecord=suggestedRecords[activeElementIndex-1];this.update({activeSuggestedRecord:link(previousRecord)});}
async updateMessage(){const composer=this.composer;if(!composer.textInputContent){this.messageViewInEditing.messageActionList.update({showDeleteConfirm:true});return;}
const escapedAndCompactContent=escapeAndCompactTextContent(composer.textInputContent);let body=escapedAndCompactContent.replace(/&nbsp;/g,' ').trim();body=this._generateMentionsLinks(body);body=parseAndTransform(body,addLink);body=this._generateEmojisOnHtml(body);let data={body:body,attachment_ids:composer.attachments.concat(this.messageViewInEditing.message.attachments).map(attachment=>attachment.id),};try{composer.update({isPostingMessage:true});const messageViewInEditing=this.messageViewInEditing;await messageViewInEditing.message.updateContent(data);if(messageViewInEditing.exists()){messageViewInEditing.stopEditing();}}finally{if(composer.exists()){composer.update({isPostingMessage:false});}}}
_computeActiveSuggestedRecord(){if(this.mainSuggestedRecords.length===0&&this.extraSuggestedRecords.length===0){return unlink();}
if(this.mainSuggestedRecords.includes(this.activeSuggestedRecord)||this.extraSuggestedRecords.includes(this.activeSuggestedRecord)){return;}
const suggestedRecords=this.mainSuggestedRecords.concat(this.extraSuggestedRecords);const firstRecord=suggestedRecords[0];return link(firstRecord);}
_computeAttachmentList(){return(this.composer&&this.composer.attachments.length>0)?insertAndReplace():clear();}
_computeComposer(){if(this.threadView){if(this.threadView&&this.threadView.replyingToMessageView){return replace(this.threadView.replyingToMessageView.message.originThread.composer);}
if(this.threadView.thread&&this.threadView.thread.composer){return replace(this.threadView.thread.composer);}}
if(this.messageViewInEditing&&this.messageViewInEditing.composerForEditing){return replace(this.messageViewInEditing.composerForEditing);}
if(this.chatter&&this.chatter.thread&&this.chatter.thread.composer){return replace(this.chatter.thread.composer);}
return clear();}
_computeExtraSuggestedRecords(){if(this.suggestionDelimiterPosition===undefined){return unlinkAll();}
return unlink(this.mainSuggestedRecords);}
_computeHasSuggestions(){return this.mainSuggestedRecords.length>0||this.extraSuggestedRecords.length>0;}
_computeMainSuggestedRecords(){if(this.suggestionDelimiterPosition===undefined){return unlinkAll();}}
_computeSendButtonText(){if(this.composer&&this.composer.isLog&&this.composer.activeThread&&this.composer.activeThread.model!=='mail.channel'){return this.env._t("Log");}
return this.env._t("Send");}
_computeSuggestionDelimiter(){if(!this.composer||this.suggestionDelimiterPosition===undefined||this.suggestionDelimiterPosition>=this.composer.textInputContent.length){return clear();}
return this.composer.textInputContent[this.suggestionDelimiterPosition];}
_computeSuggestionModelName(){switch(this.suggestionDelimiter){case'@':return'mail.partner';case':':return'mail.canned_response';case'/':return'mail.channel_command';case'#':return'mail.thread';default:return clear();}}
_computeSuggestionSearchTerm(){if(!this.composer||this.suggestionDelimiterPosition===undefined||this.suggestionDelimiterPosition>=this.composer.textInputCursorStart){return clear();}
return this.composer.textInputContent.substring(this.suggestionDelimiterPosition+1,this.composer.textInputCursorStart);}
async _executeOrQueueFunction(func){if(this._hasMentionRpcInProgress){this._nextMentionRpcFunction=func;return;}
this._hasMentionRpcInProgress=true;this._nextMentionRpcFunction=undefined;await func();if(this.exists()){this._hasMentionRpcInProgress=false;if(this._nextMentionRpcFunction){this._executeOrQueueFunction(this._nextMentionRpcFunction);}}}
_generateEmojisOnHtml(htmlString){for(const emoji of emojis){for(const source of emoji.sources){const escapedSource=String(source).replace(/([.*+?=^!:${}()|[\]/\\])/g,'\\$1');const regexp=new RegExp('(\\s|^)('+escapedSource+')(?=\\s|$)','g');htmlString=htmlString.replace(regexp,'$1'+emoji.unicode);}}
return htmlString;}
_generateMentionsLinks(body){const mentions=[];for(const partner of this.composer.mentionedPartners){const placeholder=`@-mention-partner-${partner.id}`;const text=`@${owl.utils.escape(partner.name)}`;mentions.push({class:'o_mail_redirect',id:partner.id,model:'res.partner',placeholder,text,});body=body.replace(text,placeholder);}
for(const channel of this.composer.mentionedChannels){const placeholder=`#-mention-channel-${channel.id}`;const text=`#${owl.utils.escape(channel.name)}`;mentions.push({class:'o_channel_redirect',id:channel.id,model:'mail.channel',placeholder,text,});body=body.replace(text,placeholder);}
const baseHREF=this.env.session.url('/web');for(const mention of mentions){const href=`href='${baseHREF}#model=${mention.model}&id=${mention.id}'`;const attClass=`class='${mention.class}'`;const dataOeId=`data-oe-id='${mention.id}'`;const dataOeModel=`data-oe-model='${mention.model}'`;const target=`target='_blank'`;const link=`<a ${href} ${attClass} ${dataOeId} ${dataOeModel} ${target}>${mention.text}</a>`;body=body.replace(mention.placeholder,link);}
return body;}
_getCommandFromText(content){if(content.startsWith('/')){const firstWord=content.substring(1).split(/\s/)[0];return this.messaging.commands.find(command=>{if(command.name!==firstWord){return false;}
if(command.channel_types){return command.channel_types.includes(this.composer.thread.channel_type);}
return true;});}
return undefined;}
_getMessageData(){const escapedAndCompactContent=escapeAndCompactTextContent(this.composer.textInputContent);let body=escapedAndCompactContent.replace(/&nbsp;/g,' ').trim();body=this._generateMentionsLinks(body);body=parseAndTransform(body,addLink);body=this._generateEmojisOnHtml(body);return{attachment_ids:this.composer.attachments.map(attachment=>attachment.id),body,message_type:'comment',partner_ids:this.composer.recipients.map(partner=>partner.id),};}
_onChangeComposer(){this.composer.update({isLastStateChangeProgrammatic:true});}
_onChangeDetectSuggestionDelimiterPosition(){if(!this.composer){return;}
if(this.composer.textInputCursorStart!==this.composer.textInputCursorEnd){return this.update({suggestionDelimiterPosition:clear()});}
const candidatePositions=[];if(this.suggestionDelimiterPosition!==undefined&&this.suggestionDelimiterPosition<this.composer.textInputCursorStart){candidatePositions.push(this.suggestionDelimiterPosition);}
if(this.composer.textInputCursorStart>0){candidatePositions.push(this.composer.textInputCursorStart-1);}
const suggestionDelimiters=['@',':','#','/'];for(const candidatePosition of candidatePositions){if(candidatePosition<0||candidatePosition>=this.composer.textInputContent.length){continue;}
const candidateChar=this.composer.textInputContent[candidatePosition];if(candidateChar==='/'&&candidatePosition!==0){continue;}
if(!suggestionDelimiters.includes(candidateChar)){continue;}
const charBeforeCandidate=this.composer.textInputContent[candidatePosition-1];if(charBeforeCandidate&&!/\s/.test(charBeforeCandidate)){continue;}
this.update({suggestionDelimiterPosition:candidatePosition});return;}
return this.update({suggestionDelimiterPosition:clear()});}
_onChangeUpdateSuggestionList(){if(this.messaging.isCurrentUserGuest){return;}
this._updateSuggestionList();this._executeOrQueueFunction(async()=>{if(!this.exists()||this.suggestionDelimiterPosition===undefined||this.suggestionSearchTerm===undefined||!this.suggestionModelName){return;}
const Model=this.messaging.models[this.suggestionModelName];const searchTerm=this.suggestionSearchTerm;await Model.fetchSuggestions(searchTerm,{thread:this.composer.activeThread});if(!this.exists()){return;}
this._updateSuggestionList();if(this.suggestionSearchTerm&&this.suggestionSearchTerm===searchTerm&&this.suggestionModelName&&this.messaging.models[this.suggestionModelName]===Model&&!this.hasSuggestions){this.closeSuggestions();}});}
_updateSuggestionList(){if(this.suggestionDelimiterPosition===undefined||this.suggestionSearchTerm===undefined||!this.suggestionModelName){return;}
const Model=this.messaging.models[this.suggestionModelName];const[mainSuggestedRecords,extraSuggestedRecords=[],]=Model.searchSuggestions(this.suggestionSearchTerm,{thread:this.composer.activeThread});const sortFunction=Model.getSuggestionSortFunction(this.suggestionSearchTerm,{thread:this.composer.activeThread});mainSuggestedRecords.sort(sortFunction);extraSuggestedRecords.sort(sortFunction);const limit=8;mainSuggestedRecords.length=Math.min(mainSuggestedRecords.length,limit);extraSuggestedRecords.length=Math.min(extraSuggestedRecords.length,limit-mainSuggestedRecords.length);this.update({extraSuggestedRecords:replace(extraSuggestedRecords),hasToScrollToActiveSuggestion:true,mainSuggestedRecords:replace(mainSuggestedRecords),});}}
ComposerView.fields={activeSuggestedRecord:many2one('mail.model',{compute:'_computeActiveSuggestedRecord',}),attachmentList:one2one('mail.attachment_list',{compute:'_computeAttachmentList',inverse:'composerView',isCausal:true,readonly:true,}),chatter:one2one('mail.chatter',{inverse:'composerView',readonly:true,}),composer:many2one('mail.composer',{compute:'_computeComposer',inverse:'composerViews',required:true,}),doFocus:attr(),extraSuggestedRecords:many2many('mail.model',{compute:'_computeExtraSuggestedRecords',}),hasFocus:attr({default:false,}),hasSuggestions:attr({compute:'_computeHasSuggestions',default:false,}),hasToScrollToActiveSuggestion:attr({default:false,}),mainSuggestedRecords:many2many('mail.model',{compute:'_computeMainSuggestedRecords',}),messageViewInEditing:one2one('mail.message_view',{inverse:'composerViewInEditing',readonly:true,}),sendButtonText:attr({compute:'_computeSendButtonText',}),suggestionDelimiter:attr({compute:'_computeSuggestionDelimiter',}),suggestionDelimiterPosition:attr(),suggestionModelName:attr({compute:'_computeSuggestionModelName',}),suggestionSearchTerm:attr({compute:'_computeSuggestionSearchTerm',}),threadView:one2one('mail.thread_view',{inverse:'composerView',readonly:true,}),};ComposerView.identifyingFields=[['threadView','messageViewInEditing','chatter']];ComposerView.onChanges=[new OnChange({dependencies:['composer'],methodName:'_onChangeComposer',}),new OnChange({dependencies:['composer.textInputContent','composer.textInputCursorEnd','composer.textInputCursorStart'],methodName:'_onChangeDetectSuggestionDelimiterPosition',}),new OnChange({dependencies:['suggestionDelimiterPosition','suggestionModelName','suggestionSearchTerm','composer.activeThread'],methodName:'_onChangeUpdateSuggestionList',}),];ComposerView.modelName='mail.composer_view';return ComposerView;}
registerNewModel('mail.composer_view',factory);return __exports;});;

/* /mail/static/src/models/country/country.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/country/country',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr}=require('@mail/model/model_field');const{clear}=require('@mail/model/model_field_command');function factory(dependencies){class Country extends dependencies['mail.model']{_computeFlagUrl(){if(!this.code){return clear();}
return`/base/static/img/country_flags/${this.code}.png`;}}
Country.fields={code:attr(),flagUrl:attr({compute:'_computeFlagUrl',}),id:attr({readonly:true,required:true,}),name:attr(),};Country.identifyingFields=['id'];Country.modelName='mail.country';return Country;}
registerNewModel('mail.country',factory);return __exports;});;

/* /mail/static/src/models/device/device.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/device/device',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr}=require('@mail/model/model_field');function factory(dependencies){class Device extends dependencies['mail.model']{_created(){const res=super._created(...arguments);this._refresh();this._onResize=_.debounce(()=>this._refresh(),100);return res;}
_willDelete(){window.removeEventListener('resize',this._onResize);return super._willDelete(...arguments);}
start(){window.addEventListener('resize',this._onResize);}
_refresh(){this.update({globalWindowInnerHeight:this.env.browser.innerHeight,globalWindowInnerWidth:this.env.browser.innerWidth,isMobile:this.env.device.isMobile,isMobileDevice:this.env.device.isMobileDevice,sizeClass:this.env.device.size_class,});}}
Device.fields={globalWindowInnerHeight:attr(),globalWindowInnerWidth:attr(),isMobile:attr(),isMobileDevice:attr(),sizeClass:attr(),};Device.identifyingFields=['messaging'];Device.modelName='mail.device';return Device;}
registerNewModel('mail.device',factory);return __exports;});;

/* /mail/static/src/models/dialog/dialog.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/dialog/dialog',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{many2one,one2one}=require('@mail/model/model_field');const{replace}=require('@mail/model/model_field_command');function factory(dependencies){class Dialog extends dependencies['mail.model']{_computeRecord(){if(this.attachmentViewer){return replace(this.attachmentViewer);}
if(this.followerSubtypeList){return replace(this.followerSubtypeList);}}}
Dialog.fields={attachmentViewer:one2one('mail.attachment_viewer',{isCausal:true,inverse:'dialog',readonly:true,}),followerSubtypeList:one2one('mail.follower_subtype_list',{isCausal:true,inverse:'dialog',readonly:true,}),manager:many2one('mail.dialog_manager',{inverse:'dialogs',readonly:true,}),record:one2one('mail.model',{compute:'_computeRecord',isCausal:true,readonly:true,required:true,}),};Dialog.identifyingFields=['manager',['attachmentViewer','followerSubtypeList']];Dialog.modelName='mail.dialog';return Dialog;}
registerNewModel('mail.dialog',factory);return __exports;});;

/* /mail/static/src/models/dialog_manager/dialog_manager.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/dialog_manager/dialog_manager',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{one2many}=require('@mail/model/model_field');function factory(dependencies){class DialogManager extends dependencies['mail.model']{}
DialogManager.fields={dialogs:one2many('mail.dialog',{inverse:'manager',isCausal:true,}),};DialogManager.identifyingFields=['messaging'];DialogManager.modelName='mail.dialog_manager';return DialogManager;}
registerNewModel('mail.dialog_manager',factory);return __exports;});;

/* /mail/static/src/models/discuss/discuss.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/discuss/discuss',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2one,one2one}=require('@mail/model/model_field');const{clear,insertAndReplace,link,unlink}=require('@mail/model/model_field_command');function factory(dependencies){class Discuss extends dependencies['mail.model']{_created(){super._created();this.onClickStartAMeetingButton=this.onClickStartAMeetingButton.bind(this);}
clearIsAddingItem(){this.update({addingChannelValue:"",isAddingChannel:false,isAddingChat:false,});}
close(){this.update({isOpen:false});}
focus(){if(this.threadView&&this.threadView.composerView){this.threadView.composerView.update({doFocus:true});}}
async handleAddChannelAutocompleteSelect(ev,ui){ev.preventDefault();const name=this.addingChannelValue;this.clearIsAddingItem();if(ui.item.special){const channel=await this.async(()=>this.messaging.models['mail.thread'].performRpcCreateChannel({name,privacy:ui.item.special==='private'?'private':'groups',}));channel.open();}else{const channel=this.messaging.models['mail.thread'].insert({id:ui.item.id,model:'mail.channel',});await channel.join();channel.update({isServerPinned:true});channel.open();}}
async handleAddChannelAutocompleteSource(req,res){this.update({addingChannelValue:req.term});const threads=await this.messaging.models['mail.thread'].searchChannelsToOpen({limit:10,searchTerm:req.term});const items=threads.map((thread)=>{const escapedName=owl.utils.escape(thread.name);return{id:thread.id,label:escapedName,value:escapedName,};});const escapedValue=owl.utils.escape(req.term);items.push({label:_.str.sprintf(`<strong>${this.env._t('Create %s')}</strong>`,`<em><span class="fa fa-hashtag"/>${escapedValue}</em>`,),escapedValue,special:'public'},{label:_.str.sprintf(`<strong>${this.env._t('Create %s')}</strong>`,`<em><span class="fa fa-lock"/>${escapedValue}</em>`,),escapedValue,special:'private'});res(items);}
handleAddChatAutocompleteSelect(ev,ui){this.messaging.openChat({partnerId:ui.item.id});this.clearIsAddingItem();}
handleAddChatAutocompleteSource(req,res){const value=owl.utils.escape(req.term);this.messaging.models['mail.partner'].imSearch({callback:partners=>{const suggestions=partners.map(partner=>{return{id:partner.id,value:partner.nameOrDisplayName,label:partner.nameOrDisplayName,};});res(_.sortBy(suggestions,'label'));},keyword:value,limit:10,});}
onClickMobileNewChatButton(ev){this.update({isAddingChat:true});}
onClickMobileNewChannelButton(ev){this.update({isAddingChannel:true});}
async onClickStartAMeetingButton(ev){const meetingChannel=await this.messaging.models['mail.thread'].createGroupChat({default_display_mode:'video_full_screen',partners_to:[this.messaging.currentPartner.id],});meetingChannel.toggleCall({startWithVideo:true});await meetingChannel.open({focus:false});if(!meetingChannel.exists()||!this.threadView){return;}
this.threadView.topbar.openInvitePopoverView();}
openInitThread(){const[model,id]=typeof this.initActiveId==='number'?['mail.channel',this.initActiveId]:this.initActiveId.split('_');const thread=this.messaging.models['mail.thread'].findFromIdentifyingData({id:model!=='mail.box'?Number(id):id,model,});if(!thread){return;}
thread.open();if(this.messaging.device.isMobile&&thread.channel_type){this.update({activeMobileNavbarTabId:thread.channel_type});}}
async openThread(thread,{focus}={}){this.update({thread:link(thread),});if(focus!==undefined?focus:!this.messaging.device.isMobileDevice){this.focus();}
if(!this.isOpen){this.env.bus.trigger('do-action',{action:'mail.action_discuss',options:{active_id:this.threadToActiveId(this),clear_breadcrumbs:false,on_reverse_breadcrumb:()=>this.close(),},});}}
threadToActiveId(thread){return`${thread.model}_${thread.id}`;}
onInputQuickSearch(value){if(!this.sidebarQuickSearchValue){this.categoryChat.open();this.categoryChannel.open();}
this.update({sidebarQuickSearchValue:value});}
_computeActiveId(){if(!this.thread){return clear();}
return this.threadToActiveId(this.thread);}
_computeAddingChannelValue(){if(!this.isOpen){return"";}
return this.addingChannelValue;}
_computeHasThreadView(){if(!this.thread||!this.isOpen){return false;}
if(this.messaging.device.isMobile&&(this.activeMobileNavbarTabId!=='mailbox'||this.thread.model!=='mail.box')){return false;}
return true;}
_computeIsAddingChannel(){if(!this.isOpen){return false;}
return this.isAddingChannel;}
_computeIsAddingChat(){if(!this.isOpen){return false;}
return this.isAddingChat;}
_computeThread(){if(!this.thread||!this.thread.isPinned){return unlink();}}
_computeThreadViewer(){return insertAndReplace({hasMemberList:true,hasThreadView:this.hasThreadView,hasTopbar:true,thread:this.thread?link(this.thread):unlink(),});}}
Discuss.fields={activeId:attr({compute:'_computeActiveId',}),activeMobileNavbarTabId:attr({default:'mailbox',}),addingChannelValue:attr({compute:'_computeAddingChannelValue',default:"",}),categoryChannel:one2one('mail.discuss_sidebar_category',{inverse:'discussAsChannel',isCausal:true,}),categoryChat:one2one('mail.discuss_sidebar_category',{inverse:'discussAsChat',isCausal:true,}),hasThreadView:attr({compute:'_computeHasThreadView',}),initActiveId:attr({default:'mail.box_inbox',}),isAddingChannel:attr({compute:'_computeIsAddingChannel',default:false,}),isAddingChat:attr({compute:'_computeIsAddingChat',default:false,}),isInitThreadHandled:attr({default:false,}),isOpen:attr({default:false,}),menu_id:attr({default:null,}),sidebarQuickSearchValue:attr({default:"",}),startAMeetingButtonRef:attr(),thread:many2one('mail.thread',{compute:'_computeThread',}),threadView:one2one('mail.thread_view',{related:'threadViewer.threadView',}),threadViewer:one2one('mail.thread_viewer',{compute:'_computeThreadViewer',inverse:'discuss',isCausal:true,readonly:true,required:true,}),};Discuss.identifyingFields=['messaging'];Discuss.modelName='mail.discuss';return Discuss;}
registerNewModel('mail.discuss',factory);return __exports;});;

/* /mail/static/src/models/discuss_public_view/discuss_public_view.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/discuss_public_view/discuss_public_view',async function(require){'use strict';let __exports={};const{attr,one2one}=require('@mail/model/model_field');const{registerNewModel}=require('@mail/model/model_core');const{clear,insertAndReplace,link}=require('@mail/model/model_field_command');function factory(dependencies){class DiscussPublicView extends dependencies['mail.model']{async switchToThreadView(){this.update({threadViewer:insertAndReplace({extraClass:'flex-grow-1',hasMemberList:true,hasThreadView:true,hasTopbar:true,thread:link(this.channel),}),welcomeView:clear(),});if(this.isChannelTokenSecret){window.history.replaceState(window.history.state,null,`/discuss/channel/${this.channel.id}${window.location.search}`);}
if(this.channel.defaultDisplayMode==='video_full_screen'){await this.channel.toggleCall({startWithVideo:true});await this.threadView.rtcCallViewer.activateFullScreen();}}
switchToWelcomeView(){this.update({threadViewer:clear(),welcomeView:insertAndReplace({channel:link(this.channel),isDoFocusGuestNameInput:true,originalGuestName:this.messaging.currentGuest&&this.messaging.currentGuest.name,pendingGuestName:this.messaging.currentGuest&&this.messaging.currentGuest.name,}),});if(this.welcomeView.mediaPreview){this.welcomeView.mediaPreview.enableMicrophone();this.welcomeView.mediaPreview.enableVideo();}}}
DiscussPublicView.fields={channel:one2one('mail.thread',{readonly:true,required:true,}),isChannelTokenSecret:attr({default:true,}),shouldAddGuestAsMemberOnJoin:attr({default:false,readonly:true,}),shouldDisplayWelcomeViewInitially:attr({default:false,readonly:true,}),threadView:one2one('mail.thread_view',{readonly:true,related:'threadViewer.threadView',}),threadViewer:one2one('mail.thread_viewer',{inverse:'discussPublicView',isCausal:true,}),welcomeView:one2one('mail.welcome_view',{inverse:'discussPublicView',isCausal:true,}),};DiscussPublicView.identifyingFields=['messaging'];DiscussPublicView.modelName='mail.discuss_public_view';return DiscussPublicView;}
registerNewModel('mail.discuss_public_view',factory);return __exports;});;

/* /mail/static/src/models/discuss_sidebar_category/discuss_sidebar_category.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/discuss_sidebar_category/discuss_sidebar_category',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,one2many,one2one}=require('@mail/model/model_field');const{clear,insertAndReplace,replace}=require('@mail/model/model_field_command');const{OnChange}=require('@mail/model/model_onchange');function factory(dependencies){class DiscussSidebarCategory extends dependencies['mail.model']{_created(){this.onClick=this.onClick.bind(this);this.onHideAddingItem=this.onHideAddingItem.bind(this);this.onAddItemAutocompleteSelect=this.onAddItemAutocompleteSelect.bind(this);this.onAddItemAutocompleteSource=this.onAddItemAutocompleteSource.bind(this);this.onClickCommandAdd=this.onClickCommandAdd.bind(this);this.onClickCommandView=this.onClickCommandView.bind(this);return super._created();}
static async performRpcSetResUsersSettings(resUsersSettings){return this.env.services.rpc({model:'res.users.settings',method:'set_res_users_settings',args:[[this.messaging.currentUser.resUsersSettingsId]],kwargs:{new_settings:resUsersSettings,},},{shadow:true},);}
async close(){this.update({isPendingOpen:false});await this.messaging.models['mail.discuss_sidebar_category'].performRpcSetResUsersSettings({[this.serverStateKey]:false,});}
async open(){this.update({isPendingOpen:true});await this.messaging.models['mail.discuss_sidebar_category'].performRpcSetResUsersSettings({[this.serverStateKey]:true,});}
_computeActiveItem(){const thread=this.messaging.discuss.thread;if(thread&&this.supportedChannelTypes.includes(thread.channel_type)){return insertAndReplace({channel:replace(thread),category:replace(this),});}
return clear();}
_computeFilteredCategoryItems(){let categoryItems=this.categoryItems;const searchValue=this.messaging.discuss.sidebarQuickSearchValue;if(searchValue){const qsVal=searchValue.toLowerCase();categoryItems=categoryItems.filter(categoryItem=>{const nameVal=categoryItem.channel.displayName.toLowerCase();return nameVal.includes(qsVal);});}
return replace(categoryItems);}
_computeIsOpen(){return this.isPendingOpen!==undefined?this.isPendingOpen:this.isServerOpen;}
_sortDefinitionCategoryItems(){switch(this.sortComputeMethod){case'name':return[['defined-first','channel'],['defined-first','channel.displayName'],['case-insensitive-asc','channel.displayName'],['smaller-first','channel.id'],];case'last_action':return[['defined-first','channel'],['defined-first','channel.lastInterestDateTime'],['greater-first','channel.lastInterestDateTime'],['greater-first','channel.id'],];}}
async onClick(){if(this.isOpen){await this.close();}else{await this.open();}}
onHideAddingItem(ev){ev.stopPropagation();this.update({isAddingItem:false});}
onAddItemAutocompleteSelect(ev,ui){switch(this.autocompleteMethod){case'channel':this.messaging.discuss.handleAddChannelAutocompleteSelect(ev,ui);break;case'chat':this.messaging.discuss.handleAddChatAutocompleteSelect(ev,ui);break;}}
onAddItemAutocompleteSource(req,res){switch(this.autocompleteMethod){case'channel':this.messaging.discuss.handleAddChannelAutocompleteSource(req,res);break;case'chat':this.messaging.discuss.handleAddChatAutocompleteSource(req,res);break;}}
onClickCommandAdd(ev){ev.stopPropagation();this.update({isAddingItem:true});}
onClickCommandView(ev){ev.stopPropagation();return this.env.bus.trigger('do-action',{action:{name:this.env._t("Public Channels"),type:'ir.actions.act_window',res_model:'mail.channel',views:[[false,'kanban'],[false,'form']],domain:[['public','!=','private']],},});}
_onIsServerOpenChanged(){if(this.isServerOpen===this.isPendingOpen){this.update({isPendingOpen:clear()});}}}
DiscussSidebarCategory.fields={activeItem:one2one('mail.discuss_sidebar_category_item',{compute:'_computeActiveItem',}),autocompleteMethod:attr(),commandAddTitleText:attr(),categoryItems:one2many('mail.discuss_sidebar_category_item',{inverse:'category',isCausal:true,sort:'_sortDefinitionCategoryItems',}),counter:attr({default:0,readonly:true,sum:'categoryItems.categoryCounterContribution',}),discussAsChannel:one2one('mail.discuss',{inverse:'categoryChannel',readonly:true,}),discussAsChat:one2one('mail.discuss',{inverse:'categoryChat',readonly:true,}),filteredCategoryItems:one2many('mail.discuss_sidebar_category_item',{compute:'_computeFilteredCategoryItems',readonly:true,}),name:attr(),hasAddCommand:attr({default:false,}),hasViewCommand:attr({default:false,}),isAddingItem:attr({default:false,}),isOpen:attr({compute:'_computeIsOpen',}),isPendingOpen:attr(),isServerOpen:attr(),newItemPlaceholderText:attr(),serverStateKey:attr({readonly:true,required:true,}),sortComputeMethod:attr({required:true,}),supportedChannelTypes:attr({required:true,readonly:true,}),};DiscussSidebarCategory.identifyingFields=[['discussAsChannel','discussAsChat']];DiscussSidebarCategory.onChanges=[new OnChange({dependencies:['isServerOpen'],methodName:['_onIsServerOpenChanged'],}),];DiscussSidebarCategory.modelName='mail.discuss_sidebar_category';return DiscussSidebarCategory;}
registerNewModel('mail.discuss_sidebar_category',factory);return __exports;});;

/* /mail/static/src/models/discuss_sidebar_category_item/discuss_sidebar_category_item.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/discuss_sidebar_category_item/discuss_sidebar_category_item',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2one,one2one}=require('@mail/model/model_field');const{clear,link}=require('@mail/model/model_field_command');const{isEventHandled}=require('@mail/utils/utils');const Dialog=require('web.Dialog');function factory(dependencies){class DiscussSidebarCategoryItem extends dependencies['mail.model']{_created(){this.onClick=this.onClick.bind(this);this.onClickCommandLeave=this.onClickCommandLeave.bind(this);this.onClickCommandSettings=this.onClickCommandSettings.bind(this);this.onClickCommandUnpin=this.onClickCommandUnpin.bind(this);}
_computeAvatarUrl(){switch(this.channelType){case'channel':case'group':return`/web/image/mail.channel/${this.channel.id}/avatar_128?unique=${this.channel.avatarCacheKey}`;case'chat':if(this.channel.correspondent){return this.channel.correspondent.avatarUrl;}}
return'/mail/static/src/img/smiley/avatar.jpg';}
_computeCategoryCounterContribution(){switch(this.channel.channel_type){case'channel':return this.channel.message_needaction_counter>0?1:0;case'chat':case'group':return this.channel.localMessageUnreadCounter>0?1:0;}}
_computeCounter(){switch(this.channelType){case'channel':return this.channel.message_needaction_counter;case'chat':case'group':return this.channel.localMessageUnreadCounter;}}
_computeHasLeaveCommand(){return(['channel','group'].includes(this.channelType)&&!this.channel.message_needaction_counter&&!this.channel.group_based_subscription);}
_computeHasSettingsCommand(){return this.channelType==='channel';}
_computeHasUnpinCommand(){return this.channelType==='chat'&&!this.channel.localMessageUnreadCounter;}
_computeIsActive(){return this.messaging.discuss&&this.channel===this.messaging.discuss.thread;}
_computeIsUnread(){if(!this.channel){return clear();}
return this.channel.localMessageUnreadCounter>0;}
_computeHasThreadIcon(){switch(this.channelType){case'channel':return['private','public'].includes(this.channel.public);case'chat':return true;case'group':return false;}}
onClick(ev){if(isEventHandled(ev,'EditableText.click')){return;}
this.channel.open();}
async onClickCommandLeave(ev){ev.stopPropagation();if(this.channel.channel_type!=='group'&&this.channel.creator===this.messaging.currentUser){await this._askAdminConfirmation();}
if(this.channel.channel_type==='group'){await this._askLeaveGroupConfirmation();}
this.channel.leave();}
onClickCommandSettings(ev){ev.stopPropagation();return this.env.bus.trigger('do-action',{action:{type:'ir.actions.act_window',res_model:this.channel.model,res_id:this.channel.id,views:[[false,'form']],target:'current',},});}
onClickCommandUnpin(ev){ev.stopPropagation();this.channel.unsubscribe();}
_askAdminConfirmation(){return new Promise(resolve=>{Dialog.confirm(this,this.env._t("You are the administrator of this channel. Are you sure you want to leave?"),{buttons:[{text:this.env._t("Leave"),classes:'btn-primary',close:true,click:resolve,},{text:this.env._t("Discard"),close:true,},],});});}
_askLeaveGroupConfirmation(){return new Promise(resolve=>{Dialog.confirm(this,this.env._t("You are about to leave this group conversation and will no longer have access to it unless you are invited again. Are you sure you want to continue?"),{buttons:[{text:this.env._t("Leave"),classes:'btn-primary',close:true,click:resolve},{text:this.env._t("Discard"),close:true}]});});}}
DiscussSidebarCategoryItem.fields={avatarUrl:attr({compute:'_computeAvatarUrl',}),category:many2one('mail.discuss_sidebar_category',{inverse:'categoryItems',readonly:true,required:true,}),categoryCounterContribution:attr({compute:'_computeCategoryCounterContribution',readonly:true,}),counter:attr({compute:'_computeCounter',}),hasLeaveCommand:attr({compute:'_computeHasLeaveCommand',}),hasSettingsCommand:attr({compute:'_computeHasSettingsCommand',}),hasThreadIcon:attr({compute:'_computeHasThreadIcon',}),hasUnpinCommand:attr({compute:'_computeHasUnpinCommand',}),isActive:attr({compute:'_computeIsActive',}),isUnread:attr({compute:'_computeIsUnread',}),channel:one2one('mail.thread',{inverse:'discussSidebarCategoryItem',readonly:true,required:true,}),channelType:attr({related:'channel.channel_type',}),};DiscussSidebarCategoryItem.identifyingFields=['category','channel'];DiscussSidebarCategoryItem.modelName='mail.discuss_sidebar_category_item';return DiscussSidebarCategoryItem;}
registerNewModel('mail.discuss_sidebar_category_item',factory);return __exports;});;

/* /mail/static/src/models/follower/follower.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/follower/follower',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2many,many2one,one2many}=require('@mail/model/model_field');const{clear,insert,insertAndReplace,link,replace,unlink,unlinkAll}=require('@mail/model/model_field_command');function factory(dependencies){class Follower extends dependencies['mail.model']{static convertData(data){const data2={};if('id'in data){data2.id=data.id;}
if('is_active'in data){data2.isActive=data.is_active;}
if('is_editable'in data){data2.isEditable=data.is_editable;}
if('partner_id'in data){if(!data.partner_id){data2.partner=unlinkAll();}else{const partnerData={display_name:data.display_name,email:data.email,id:data.partner_id,name:data.name,};data2.partner=insert(partnerData);}}
if(data.partner){data2.partner=insertAndReplace(this.models['mail.partner'].convertData(data.partner));}
return data2;}
closeSubtypes(){this.update({subtypeList:clear()});}
async openProfile(){return this.partner.openProfile();}
async remove(){const partner_ids=[];partner_ids.push(this.partner.id);await this.async(()=>this.env.services.rpc({model:this.followedThread.model,method:'message_unsubscribe',args:[[this.followedThread.id],partner_ids]}));const followedThread=this.followedThread;this.delete();followedThread.fetchAndUpdateSuggestedRecipients();}
selectSubtype(subtype){if(!this.selectedSubtypes.includes(subtype)){this.update({selectedSubtypes:link(subtype)});}}
async showSubtypes(){const subtypesData=await this.async(()=>this.env.services.rpc({route:'/mail/read_subscription_data',params:{follower_id:this.id},}));this.update({subtypes:unlinkAll()});for(const data of subtypesData){const subtype=this.messaging.models['mail.follower_subtype'].insert(this.messaging.models['mail.follower_subtype'].convertData(data));this.update({subtypes:link(subtype)});if(data.followed){this.update({selectedSubtypes:link(subtype)});}else{this.update({selectedSubtypes:unlink(subtype)});}}
this.messaging.dialogManager.update({dialogs:insert({followerSubtypeList:insertAndReplace({follower:replace(this),}),}),});}
unselectSubtype(subtype){if(this.selectedSubtypes.includes(subtype)){this.update({selectedSubtypes:unlink(subtype)});}}
async updateSubtypes(){if(this.selectedSubtypes.length===0){this.remove();}else{const kwargs={subtype_ids:this.selectedSubtypes.map(subtype=>subtype.id),};if(this.partner){kwargs.partner_ids=[this.partner.id];}
await this.async(()=>this.env.services.rpc({model:this.followedThread.model,method:'message_subscribe',args:[[this.followedThread.id]],kwargs,}));this.env.services['notification'].notify({type:'success',message:this.env._t("The subscription preferences were successfully applied."),});}
this.closeSubtypes();}}
Follower.fields={followedThread:many2one('mail.thread',{inverse:'followers',}),id:attr({readonly:true,required:true,}),isActive:attr({default:true,}),isEditable:attr({default:false,}),partner:many2one('mail.partner',{required:true,}),selectedSubtypes:many2many('mail.follower_subtype'),subtypeList:one2many('mail.follower_subtype_list',{inverse:'follower',isCausal:true,}),subtypes:many2many('mail.follower_subtype'),};Follower.identifyingFields=['id'];Follower.modelName='mail.follower';return Follower;}
registerNewModel('mail.follower',factory);return __exports;});;

/* /mail/static/src/models/follower_subtype/follower_subtype.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/follower_subtype/follower_subtype',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr}=require('@mail/model/model_field');function factory(dependencies){class FollowerSubtype extends dependencies['mail.model']{static convertData(data){const data2={};if('default'in data){data2.isDefault=data.default;}
if('id'in data){data2.id=data.id;}
if('internal'in data){data2.isInternal=data.internal;}
if('name'in data){data2.name=data.name;}
if('parent_model'in data){data2.parentModel=data.parent_model;}
if('res_model'in data){data2.resModel=data.res_model;}
if('sequence'in data){data2.sequence=data.sequence;}
return data2;}}
FollowerSubtype.fields={id:attr({readonly:true,required:true,}),isDefault:attr({default:false,}),isInternal:attr({default:false,}),name:attr(),parentModel:attr(),resModel:attr(),sequence:attr(),};FollowerSubtype.identifyingFields=['id'];FollowerSubtype.modelName='mail.follower_subtype';return FollowerSubtype;}
registerNewModel('mail.follower_subtype',factory);return __exports;});;

/* /mail/static/src/models/follower_subtype_list/follower_subtype_list.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/follower_subtype_list/follower_subtype_list',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{many2one,one2one}=require('@mail/model/model_field');function factory(dependencies){class FollowerSubtypeList extends dependencies['mail.model']{}
FollowerSubtypeList.fields={dialog:one2one('mail.dialog',{inverse:'followerSubtypeList',isCausal:true,readonly:true,}),follower:many2one('mail.follower',{inverse:'subtypeList',readonly:true,required:true,}),};FollowerSubtypeList.identifyingFields=['follower'];FollowerSubtypeList.modelName='mail.follower_subtype_list';return FollowerSubtypeList;}
registerNewModel('mail.follower_subtype_list',factory);return __exports;});;

/* /mail/static/src/models/guest/guest.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/guest/guest',async function(require){'use strict';let __exports={};const{attr,one2many,one2one}=require('@mail/model/model_field');const{registerNewModel}=require('@mail/model/model_core');function factory(dependencies){class Guest extends dependencies['mail.model']{static async performRpcGuestUpdateName({id,name}){await this.env.services.rpc({route:'/mail/guest/update_name',params:{guest_id:id,name,},});}
_computeAvatarUrl(){return`/web/image/mail.guest/${this.id}/avatar_128?unique=${this.name}`;}}
Guest.fields={authoredMessages:one2many('mail.message',{inverse:'guestAuthor',}),avatarUrl:attr({compute:'_computeAvatarUrl',}),id:attr({required:true,readonly:true,}),name:attr(),rtcSessions:one2many('mail.rtc_session',{inverse:'guest',}),volumeSetting:one2one('mail.volume_setting',{inverse:'guest',}),};Guest.identifyingFields=['id'];Guest.modelName='mail.guest';return Guest;}
registerNewModel('mail.guest',factory);return __exports;});;

/* /mail/static/src/models/locale/locale.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/locale/locale',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr}=require('@mail/model/model_field');function factory(dependencies){class Locale extends dependencies['mail.model']{_computeLanguage(){return this.env._t.database.parameters.code;}
_computeTextDirection(){return this.env._t.database.parameters.direction;}}
Locale.fields={language:attr({compute:'_computeLanguage',}),textDirection:attr({compute:'_computeTextDirection',}),};Locale.identifyingFields=['messaging'];Locale.modelName='mail.locale';return Locale;}
registerNewModel('mail.locale',factory);return __exports;});;

/* /mail/static/src/models/mail_template/mail_template.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/mail_template/mail_template',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2many}=require('@mail/model/model_field');function factory(dependencies){class MailTemplate extends dependencies['mail.model']{preview(activity){const action={name:this.env._t("Compose Email"),type:'ir.actions.act_window',res_model:'mail.compose.message',views:[[false,'form']],target:'new',context:{default_res_id:activity.thread.id,default_model:activity.thread.model,default_use_template:true,default_template_id:this.id,force_email:true,},};this.env.bus.trigger('do-action',{action,options:{on_close:()=>{activity.thread.refresh();},},});}
async send(activity){await this.async(()=>this.env.services.rpc({model:activity.thread.model,method:'activity_send_mail',args:[[activity.thread.id],this.id],}));activity.thread.refresh();}}
MailTemplate.fields={activities:many2many('mail.activity',{inverse:'mailTemplates',}),id:attr({readonly:true,required:true,}),name:attr(),};MailTemplate.identifyingFields=['id'];MailTemplate.modelName='mail.mail_template';return MailTemplate;}
registerNewModel('mail.mail_template',factory);return __exports;});;

/* /mail/static/src/models/media_preview/media_preview.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/media_preview/media_preview',async function(require){'use strict';let __exports={};const{attr}=require('@mail/model/model_field');const{registerNewModel}=require('@mail/model/model_core');function factory(dependencies){class MediaPreview extends dependencies['mail.model']{_created(){super._created();this.onClickDisableMicrophoneButton=this.onClickDisableMicrophoneButton.bind(this);this.onClickDisableVideoButton=this.onClickDisableVideoButton.bind(this);this.onClickEnableMicrophoneButton=this.onClickEnableMicrophoneButton.bind(this);this.onClickEnableVideoButton=this.onClickEnableVideoButton.bind(this);}
static stopTracksOnMediaStream(mediaStream){for(const track of mediaStream.getTracks()){track.stop();}}
disableMicrophone(){this.audioRef.el.srcObject=null;if(!this.audioStream){return;}
this.messaging.models['mail.media_preview'].stopTracksOnMediaStream(this.audioStream);this.update({audioStream:null});}
disableVideo(){this.videoRef.el.srcObject=null;if(!this.videoStream){return;}
this.messaging.models['mail.media_preview'].stopTracksOnMediaStream(this.videoStream);this.update({videoStream:null});}
async enableMicrophone(){if(!this.doesBrowserSupportMediaDevices){return;}
try{const audioStream=await navigator.mediaDevices.getUserMedia({audio:true});this.update({audioStream});this.audioRef.el.srcObject=this.audioStream;}catch{}}
async enableVideo(){if(!this.doesBrowserSupportMediaDevices){return;}
try{const videoStream=await navigator.mediaDevices.getUserMedia({video:true});this.update({videoStream});this.videoRef.el.srcObject=this.videoStream;}catch{}}
onClickDisableMicrophoneButton(){this.disableMicrophone();}
onClickDisableVideoButton(){this.disableVideo();}
onClickEnableMicrophoneButton(){this.enableMicrophone();}
onClickEnableVideoButton(){this.enableVideo();}
_computeDoesBrowserSupportMediaDevices(){return Boolean(navigator.mediaDevices&&navigator.mediaDevices.getUserMedia&&window.MediaStream);}
_computeIsMicrophoneEnabled(){return this.audioStream!==null;}
_computeIsVideoEnabled(){return this.videoStream!==null;}}
MediaPreview.fields={audioRef:attr(),audioStream:attr({default:null,}),doesBrowserSupportMediaDevices:attr({compute:'_computeDoesBrowserSupportMediaDevices',}),isMicrophoneEnabled:attr({compute:'_computeIsMicrophoneEnabled',}),isVideoEnabled:attr({compute:'_computeIsVideoEnabled',}),videoRef:attr(),videoStream:attr({default:null,}),};MediaPreview.identifyingFields=['messaging'];MediaPreview.modelName='mail.media_preview';return MediaPreview;}
registerNewModel('mail.media_preview',factory);return __exports;});;

/* /mail/static/src/models/message/message.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/message/message',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2many,many2one,one2many}=require('@mail/model/model_field');const{clear,insert,insertAndReplace,replace,unlinkAll}=require('@mail/model/model_field_command');const emojis=require('@mail/js/emojis')[Symbol.for("default")];const{addLink,htmlToTextContentInline,parseAndTransform,timeFromNow}=require('@mail/js/utils');const{session}=require('@web/session');const{str_to_datetime}=require('web.time');function factory(dependencies){class Message extends dependencies['mail.model']{static convertData(data){const data2={};if('attachment_ids'in data){if(!data.attachment_ids){data2.attachments=unlinkAll();}else{data2.attachments=insertAndReplace(data.attachment_ids.map(attachmentData=>this.messaging.models['mail.attachment'].convertData(attachmentData)));}}
if('author_id'in data){if(!data.author_id){data2.author=unlinkAll();}else if(data.author_id[0]!==0){data2.author=insert({display_name:data.author_id[1],id:data.author_id[0],});}}
if('body'in data){data2.body=data.body;}
if('date'in data&&data.date){data2.date=moment(str_to_datetime(data.date));}
if('email_from'in data){data2.email_from=data.email_from;}
if('guestAuthor'in data){data2.guestAuthor=data.guestAuthor;}
if('history_partner_ids'in data&&this.messaging.currentPartner){data2.isHistory=data.history_partner_ids.includes(this.messaging.currentPartner.id);}
if('id'in data){data2.id=data.id;}
if('is_discussion'in data){data2.is_discussion=data.is_discussion;}
if('is_note'in data){data2.is_note=data.is_note;}
if('is_notification'in data){data2.is_notification=data.is_notification;}
if('messageReactionGroups'in data){data2.messageReactionGroups=data.messageReactionGroups;}
if('message_type'in data){data2.message_type=data.message_type;}
if('model'in data&&'res_id'in data&&data.model&&data.res_id){const originThreadData={id:data.res_id,model:data.model,};if('record_name'in data&&data.record_name){originThreadData.name=data.record_name;}
if('res_model_name'in data&&data.res_model_name){originThreadData.model_name=data.res_model_name;}
if('module_icon'in data){originThreadData.moduleIcon=data.module_icon;}
data2.originThread=insertAndReplace(originThreadData);}
if('needaction_partner_ids'in data&&this.messaging.currentPartner){data2.isNeedaction=data.needaction_partner_ids.includes(this.messaging.currentPartner.id);}
if('notifications'in data){data2.notifications=insert(data.notifications.map(notificationData=>this.messaging.models['mail.notification'].convertData(notificationData)));}
if('parentMessage'in data){if(!data.parentMessage){data2.parentMessage=clear();}else{data2.parentMessage=insertAndReplace(this.convertData(data.parentMessage));}}
if('partner_ids'in data&&this.messaging.currentPartner){data2.recipients=insertAndReplace(data.partner_ids.map(partner_id=>({id:partner_id})));}
if('recipients'in data){data2.recipients=insertAndReplace(data.recipients);}
if('starred_partner_ids'in data&&this.messaging.currentPartner){data2.isStarred=data.starred_partner_ids.includes(this.messaging.currentPartner.id);}
if('subject'in data){data2.subject=data.subject;}
if('subtype_description'in data){data2.subtype_description=data.subtype_description;}
if('subtype_id'in data){data2.subtype_id=data.subtype_id;}
if('tracking_value_ids'in data){data2.tracking_value_ids=data.tracking_value_ids;}
return data2;}
static async markAllAsRead(domain){await this.env.services.rpc({model:'mail.message',method:'mark_all_as_read',kwargs:{domain},});}
static async markAsRead(messages){await this.env.services.rpc({model:'mail.message',method:'set_message_done',args:[messages.map(message=>message.id)]});}
static async performRpcMessageFetch(route,params){const messagesData=await this.env.services.rpc({route,params},{shadow:true});if(!this.messaging){return;}
const messages=this.messaging.models['mail.message'].insert(messagesData.map(messageData=>this.messaging.models['mail.message'].convertData(messageData)));for(const message of messages){for(const thread of message.threads){if(thread.model!=='mail.channel'||thread.channel_type==='channel'){continue;}
this.messaging.models['mail.message_seen_indicator'].insert({thread:replace(thread),message:replace(message),});}}
return messages;}
static async unstarAll(){await this.env.services.rpc({model:'mail.message',method:'unstar_all',});}
async addReaction(content){const messageData=await this.env.services.rpc({route:'/mail/message/add_reaction',params:{content,message_id:this.id},});if(!this.exists()){return;}
this.update(messageData);}
async markAsRead(){await this.async(()=>this.env.services.rpc({model:'mail.message',method:'set_message_done',args:[[this.id]]}));}
openResendAction(){this.env.bus.trigger('do-action',{action:'mail.mail_resend_message_action',options:{additional_context:{mail_message_to_resend:this.id,},},});}
refreshDateFromNow(){this.update({dateFromNow:this._computeDateFromNow()});}
async removeReaction(content){const messageData=await this.env.services.rpc({route:'/mail/message/remove_reaction',params:{content,message_id:this.id},});if(!this.exists()){return;}
this.update(messageData);}
async toggleStar(){await this.async(()=>this.env.services.rpc({model:'mail.message',method:'toggle_message_starred',args:[[this.id]]}));}
async updateContent({body,attachment_ids}){const messageData=await this.env.services.rpc({route:'/mail/message/update_content',params:{body,attachment_ids,message_id:this.id,},});if(!this.messaging){return;}
this.messaging.models['mail.message'].insert(messageData);}
_computeAuthorName(){if(this.author){return this.author.nameOrDisplayName;}
if(this.guestAuthor){return this.guestAuthor.name;}
if(this.email_from){return this.email_from;}
return this.env._t("Anonymous");}
_computeCanBeDeleted(){if(!session.is_admin&&!this.isCurrentUserOrGuestAuthor){return false;}
if(!this.originThread){return false;}
if(this.tracking_value_ids.length>0){return false;}
if(this.message_type!=='comment'){return false;}
if(this.originThread.model==='mail.channel'){return true;}
return this.is_note;}
_computeCanStarBeToggled(){return!this.messaging.isCurrentUserGuest&&!this.isTemporary&&!this.isTransient;}
_computeDateDay(){if(!this.date){return this.env._t("Today");}
const date=this.date.format('YYYY-MM-DD');if(date===moment().format('YYYY-MM-DD')){return this.env._t("Today");}else if(date===moment().subtract(1,'days').format('YYYY-MM-DD')){return this.env._t("Yesterday");}
return this.date.format('LL');}
_computeDateFromNow(){if(!this.date){return clear();}
return timeFromNow(this.date);}
_computeFailureNotifications(){return replace(this.notifications.filter(notifications=>['exception','bounce'].includes(notifications.notification_status)));}
_computeHasAttachments(){return this.attachments.length>0;}
_computeHasReactionIcon(){return!this.isTemporary&&!this.isTransient;}
_computeIsCurrentUserOrGuestAuthor(){return!!(this.author&&this.messaging.currentPartner&&this.messaging.currentPartner===this.author)||!!(this.guestAuthor&&this.messaging.currentGuest&&this.messaging.currentGuest===this.guestAuthor);}
_computeIsBodyEmpty(){return(!this.body||['','<p></p>','<p><br></p>','<p><br/></p>',].includes(this.body.replace(/\s/g,'')));}
_computeIsBodyEqualSubtypeDescription(){if(!this.body||!this.subtype_description){return false;}
const inlineBody=htmlToTextContentInline(this.body);return inlineBody.toLowerCase()===this.subtype_description.toLowerCase();}
_computeIsCurrentPartnerMentioned(){return this.recipients.includes(this.messaging.currentPartner);}
_computeIsEmpty(){return(this.isBodyEmpty&&!this.hasAttachments&&this.tracking_value_ids.length===0&&!this.subtype_description);}
_computeIsHighlighted(){return(this.isCurrentPartnerMentioned&&this.originThread&&this.originThread.model==='mail.channel');}
_computeIsSubjectSimilarToOriginThreadName(){if(!this.subject||!this.originThread||!this.originThread.name){return false;}
const threadName=this.originThread.name.toLowerCase().trim();const prefixList=['re:','fw:','fwd:'];let cleanedSubject=this.subject.toLowerCase();let wasSubjectCleaned=true;while(wasSubjectCleaned){wasSubjectCleaned=false;if(threadName===cleanedSubject){return true;}
for(const prefix of prefixList){if(cleanedSubject.startsWith(prefix)){cleanedSubject=cleanedSubject.replace(prefix,'').trim();wasSubjectCleaned=true;break;}}}
return false;}
_computeMessageTypeText(){if(this.message_type==='notification'){return this.env._t("System notification");}
if(!this.is_discussion&&!this.is_notification){return this.env._t("Note");}
return this.env._t("Message");}
_computePrettyBody(){if(!this.body){return clear();}
let prettyBody;for(const emoji of emojis){const{unicode}=emoji;const regexp=new RegExp(`(?:^|\\s|<[a-z]*>)(${unicode})(?=\\s|$|</[a-z]*>)`,"g");const originalBody=this.body;prettyBody=this.body.replace(regexp,` <span class="o_mail_emoji">${unicode}</span> `);if(_.str.count(prettyBody,"o_mail_emoji")>200){prettyBody=originalBody;}}
return parseAndTransform(prettyBody,addLink);}
_computeThreads(){const threads=[];if(this.isHistory&&this.messaging.history){threads.push(this.messaging.history);}
if(this.isNeedaction&&this.messaging.inbox){threads.push(this.messaging.inbox);}
if(this.isStarred&&this.messaging.starred){threads.push(this.messaging.starred);}
if(this.originThread){threads.push(this.originThread);}
return replace(threads);}}
Message.fields={authorName:attr({compute:'_computeAuthorName',}),attachments:many2many('mail.attachment',{inverse:'messages',}),author:many2one('mail.partner',{inverse:'messagesAsAuthor',}),body:attr({default:"",}),canBeDeleted:attr({compute:'_computeCanBeDeleted',}),canStarBeToggled:attr({compute:'_computeCanStarBeToggled',}),date:attr(),dateDay:attr({compute:'_computeDateDay',}),dateFromNow:attr({compute:'_computeDateFromNow',}),email_from:attr(),failureNotifications:one2many('mail.notification',{compute:'_computeFailureNotifications',}),guestAuthor:many2one('mail.guest',{inverse:'authoredMessages',}),hasAttachments:attr({compute:'_computeHasAttachments',}),hasReactionIcon:attr({compute:'_computeHasReactionIcon',}),id:attr({readonly:true,required:true,}),isCurrentUserOrGuestAuthor:attr({compute:'_computeIsCurrentUserOrGuestAuthor',default:false,}),isBodyEmpty:attr({compute:'_computeIsBodyEmpty',}),isBodyEqualSubtypeDescription:attr({compute:'_computeIsBodyEqualSubtypeDescription',default:false,}),isEmpty:attr({compute:'_computeIsEmpty',}),isSubjectSimilarToOriginThreadName:attr({compute:'_computeIsSubjectSimilarToOriginThreadName',}),isTemporary:attr({default:false,}),isTransient:attr({default:false,}),is_discussion:attr({default:false,}),isHistory:attr({default:false,}),isNeedaction:attr({default:false,}),is_note:attr({default:false,}),is_notification:attr({default:false,}),isCurrentPartnerMentioned:attr({compute:'_computeIsCurrentPartnerMentioned',default:false,}),isHighlighted:attr({compute:'_computeIsHighlighted',}),isStarred:attr({default:false,}),messageTypeText:attr({compute:'_computeMessageTypeText',}),messageReactionGroups:one2many('mail.message_reaction_group',{inverse:'message',isCausal:true,}),message_type:attr(),messageSeenIndicators:one2many('mail.message_seen_indicator',{inverse:'message',isCausal:true,}),messageViews:one2many('mail.message_view',{inverse:'message',isCausal:true,}),notifications:one2many('mail.notification',{inverse:'message',isCausal:true,}),originThread:many2one('mail.thread',{inverse:'messagesAsOriginThread',}),parentMessage:many2one('mail.message'),prettyBody:attr({compute:'_computePrettyBody',default:"",}),recipients:many2many('mail.partner'),subject:attr(),subtype_description:attr(),subtype_id:attr(),threads:many2many('mail.thread',{compute:'_computeThreads',inverse:'messages',}),tracking_value_ids:attr({default:[],}),};Message.identifyingFields=['id'];Message.modelName='mail.message';return Message;}
registerNewModel('mail.message',factory);return __exports;});;

/* /mail/static/src/models/message_action_list/message_action_list.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/message_action_list/message_action_list',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2one,one2one}=require('@mail/model/model_field');const{clear,insertAndReplace,replace}=require('@mail/model/model_field_command');const{markEventHandled}=require('@mail/utils/utils');function factory(dependencies){class MessageActionList extends dependencies['mail.model']{_created(){this.onClick=this.onClick.bind(this);this.onClickConfirmDelete=this.onClickConfirmDelete.bind(this);this.onClickDelete=this.onClickDelete.bind(this);this.onClickEdit=this.onClickEdit.bind(this);this.onClickMarkAsRead=this.onClickMarkAsRead.bind(this);this.onReactionPopoverOpened=this.onReactionPopoverOpened.bind(this);this.onReactionPopoverClosed=this.onReactionPopoverClosed.bind(this);this.onClickReplyTo=this.onClickReplyTo.bind(this);this.onClickToggleStar=this.onClickToggleStar.bind(this);this.onDeleteConfirmDialogClosed=this.onDeleteConfirmDialogClosed.bind(this);this.onEmojiSelection=this.onEmojiSelection.bind(this);}
onClick(ev){markEventHandled(ev,'MessageActionList.Click');}
onClickConfirmDelete(ev){this.message.updateContent({body:'',attachment_ids:[],});}
onClickDelete(ev){this.update({showDeleteConfirm:true});}
onClickEdit(ev){this.messageView.startEditing();}
onClickMarkAsRead(ev){this.message.markAsRead();}
onReactionPopoverClosed(ev){this.update({isReactionPopoverOpened:false});}
onReactionPopoverOpened(ev){this.update({isReactionPopoverOpened:true});}
onClickReplyTo(ev){markEventHandled(ev,'MessageActionList.replyTo');this.messageView.replyTo();}
onClickToggleStar(ev){this.message.toggleStar();}
onDeleteConfirmDialogClosed(ev){this.update({showDeleteConfirm:false});}
onEmojiSelection(ev){this.message.addReaction(ev.detail.unicode);}
_computeHasMarkAsReadIcon(){return Boolean(this.messaging&&this.messaging.inbox&&this.messageView&&this.messageView.threadView&&this.messageView.threadView.thread&&this.messageView.threadView.thread===this.messaging.inbox);}
_computeHasReplyIcon(){return Boolean(this.messaging&&this.messaging.inbox&&this.message&&!this.message.isTemporary&&!this.message.isTransient&&this.messageView&&this.messageView.threadView&&this.messageView.threadView.thread&&(this.messageView.threadView.thread===this.messaging.inbox||this.messageView.threadView.thread.model==='mail.channel'));}
_computeIsReactionPopoverOpened(){return Boolean(this.reactionPopoverRef&&this.reactionPopoverRef.comp&&this.reactionPopoverRef.comp.state.displayed);}
_computeMessageViewForDelete(){return this.message?insertAndReplace({message:replace(this.message)}):clear();}}
MessageActionList.fields={hasMarkAsReadIcon:attr({compute:'_computeHasMarkAsReadIcon',}),hasReplyIcon:attr({compute:'_computeHasReplyIcon',}),isReactionPopoverOpened:attr({compute:'_computeIsReactionPopoverOpened',}),message:many2one('mail.message',{related:'messageView.message',}),messageView:one2one('mail.message_view',{inverse:'messageActionList',readonly:true,required:true,}),messageViewForDelete:one2one('mail.message_view',{compute:'_computeMessageViewForDelete',inverse:'messageActionListWithDelete',isCausal:true,}),reactionPopoverRef:attr(),showDeleteConfirm:attr({default:false,}),};MessageActionList.identifyingFields=['messageView'];MessageActionList.modelName='mail.message_action_list';return MessageActionList;}
registerNewModel('mail.message_action_list',factory);return __exports;});;

/* /mail/static/src/models/message_in_reply_to_view/message_in_reply_to_view.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/message_in_reply_to_view/message_in_reply_to_view',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,one2one}=require('@mail/model/model_field');const{clear,replace}=require('@mail/model/model_field_command');const{markEventHandled}=require('@mail/utils/utils');function factory(dependencies){class MessageInReplyToView extends dependencies['mail.model']{_created(){this.onClickReply=this.onClickReply.bind(this);}
onClickReply(ev){markEventHandled(ev,'MessageInReplyToView.ClickMessageInReplyTo');const threadView=this.messageView&&this.messageView.threadView;const parentMessage=this.messageView.message.parentMessage;if(!threadView||!parentMessage){return;}
const parentMessageView=this.messaging.models['mail.message_view'].findFromIdentifyingData({message:replace(parentMessage),threadView:replace(threadView),});if(!parentMessageView){return;}
threadView.addComponentHint('highlight-reply',parentMessageView);}
_computeHasAttachmentBackLink(){const parentMessage=this.messageView.message.parentMessage;return parentMessage.isBodyEmpty&&parentMessage.hasAttachments;}
_computeHasBodyBackLink(){return!this.messageView.message.parentMessage.isBodyEmpty;}}
MessageInReplyToView.fields={hasAttachmentBackLink:attr({compute:'_computeHasAttachmentBackLink',}),hasBodyBackLink:attr({compute:'_computeHasBodyBackLink',}),messageView:one2one('mail.message_view',{inverse:'messageInReplyToView',readonly:true,required:true,}),};MessageInReplyToView.identifyingFields=['messageView'];MessageInReplyToView.modelName='mail.message_in_reply_to_view';return MessageInReplyToView;}
registerNewModel('mail.message_in_reply_to_view',factory);return __exports;});;

/* /mail/static/src/models/message_reaction_group/message_reaction_group.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/message_reaction_group/message_reaction_group',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2many,many2one}=require('@mail/model/model_field');const{insertAndReplace}=require('@mail/model/model_field_command');const{markEventHandled}=require('@mail/utils/utils');function factory(dependencies){class MessageReactionGroup extends dependencies['mail.model']{_created(){super._created();this.onClick=this.onClick.bind(this);}
onClick(ev){markEventHandled(ev,'MessageReactionGroup.Click');if(this.hasUserReacted){this.message.removeReaction(this.content);}else{this.message.addReaction(this.content);}}
_computeHasUserReacted(){return Boolean((this.messaging.currentPartner&&this.partners.includes(this.messaging.currentPartner))||(this.messaging.currentGuest&&this.guests.includes(this.messaging.currentGuest)));}
_computeMessage(){return insertAndReplace({id:this.messageId});}
_computeSummary(){const{length,0:firstUser,1:secondUser,2:thirdUser,}=[...this.partners.map(partner=>{if(this.message.originThread){return this.message.originThread.getMemberName(partner);}
return partner.nameOrDisplayName;}),...this.guests.map(guest=>guest.name),];switch(length){case 1:return _.str.sprintf(this.env._t('%s has reacted with %s'),firstUser,this.content);case 2:return _.str.sprintf(this.env._t('%s and %s have reacted with %s'),firstUser,secondUser,this.content);case 3:return _.str.sprintf(this.env._t('%s, %s, %s have reacted with %s'),firstUser,secondUser,thirdUser,this.content);case 4:return _.str.sprintf(this.env._t('%s, %s, %s and 1 other person have reacted with %s'),firstUser,secondUser,thirdUser,this.content);default:return _.str.sprintf(this.env._t('%s, %s, %s and %s other persons have reacted with %s'),firstUser,secondUser,thirdUser,length-3,this.content);}}}
MessageReactionGroup.fields={content:attr({readonly:true,required:true,}),count:attr({required:true,}),guests:many2many('mail.guest'),hasUserReacted:attr({compute:'_computeHasUserReacted',default:false,}),message:many2one('mail.message',{compute:'_computeMessage',inverse:'messageReactionGroups',readonly:true,required:true,}),messageId:attr({readonly:true,required:true,}),partners:many2many('mail.partner'),summary:attr({compute:'_computeSummary',}),};MessageReactionGroup.identifyingFields=['message','content'];MessageReactionGroup.modelName='mail.message_reaction_group';return MessageReactionGroup;}
registerNewModel('mail.message_reaction_group',factory);return __exports;});;

/* /mail/static/src/models/message_seen_indicator/message_seen_indicator.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/message_seen_indicator/message_seen_indicator',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2many,many2one}=require('@mail/model/model_field');const{replace,unlinkAll}=require('@mail/model/model_field_command');function factory(dependencies){class MessageSeenIndicator extends dependencies['mail.model']{static recomputeFetchedValues(channel=undefined){const indicatorFindFunction=channel?localIndicator=>localIndicator.thread===channel:undefined;const indicators=this.messaging.models['mail.message_seen_indicator'].all(indicatorFindFunction);for(const indicator of indicators){indicator.update({hasEveryoneFetched:indicator._computeHasEveryoneFetched(),hasSomeoneFetched:indicator._computeHasSomeoneFetched(),partnersThatHaveFetched:indicator._computePartnersThatHaveFetched(),});}}
static recomputeSeenValues(channel=undefined){const indicatorFindFunction=channel?localIndicator=>localIndicator.thread===channel:undefined;const indicators=this.messaging.models['mail.message_seen_indicator'].all(indicatorFindFunction);for(const indicator of indicators){indicator.update({hasEveryoneSeen:indicator._computeHasEveryoneSeen(),hasSomeoneFetched:indicator._computeHasSomeoneFetched(),hasSomeoneSeen:indicator._computeHasSomeoneSeen(),isMessagePreviousToLastCurrentPartnerMessageSeenByEveryone:indicator._computeIsMessagePreviousToLastCurrentPartnerMessageSeenByEveryone(),partnersThatHaveFetched:indicator._computePartnersThatHaveFetched(),partnersThatHaveSeen:indicator._computePartnersThatHaveSeen(),});}}
_computeHasEveryoneFetched(){if(!this.message||!this.thread||!this.thread.partnerSeenInfos){return false;}
const otherPartnerSeenInfosDidNotFetch=this.thread.partnerSeenInfos.filter(partnerSeenInfo=>partnerSeenInfo.partner!==this.message.author&&(!partnerSeenInfo.lastFetchedMessage||partnerSeenInfo.lastFetchedMessage.id<this.message.id));return otherPartnerSeenInfosDidNotFetch.length===0;}
_computeHasEveryoneSeen(){if(!this.message||!this.thread||!this.thread.partnerSeenInfos){return false;}
const otherPartnerSeenInfosDidNotSee=this.thread.partnerSeenInfos.filter(partnerSeenInfo=>partnerSeenInfo.partner!==this.message.author&&(!partnerSeenInfo.lastSeenMessage||partnerSeenInfo.lastSeenMessage.id<this.message.id));return otherPartnerSeenInfosDidNotSee.length===0;}
_computeHasSomeoneFetched(){if(!this.message||!this.thread||!this.thread.partnerSeenInfos){return false;}
const otherPartnerSeenInfosFetched=this.thread.partnerSeenInfos.filter(partnerSeenInfo=>partnerSeenInfo.partner!==this.message.author&&partnerSeenInfo.lastFetchedMessage&&partnerSeenInfo.lastFetchedMessage.id>=this.message.id);return otherPartnerSeenInfosFetched.length>0;}
_computeHasSomeoneSeen(){if(!this.message||!this.thread||!this.thread.partnerSeenInfos){return false;}
const otherPartnerSeenInfosSeen=this.thread.partnerSeenInfos.filter(partnerSeenInfo=>partnerSeenInfo.partner!==this.message.author&&partnerSeenInfo.lastSeenMessage&&partnerSeenInfo.lastSeenMessage.id>=this.message.id);return otherPartnerSeenInfosSeen.length>0;}
_computeIsMessagePreviousToLastCurrentPartnerMessageSeenByEveryone(){if(!this.message||!this.thread||!this.thread.lastCurrentPartnerMessageSeenByEveryone){return false;}
return this.message.id<this.thread.lastCurrentPartnerMessageSeenByEveryone.id;}
_computePartnersThatHaveFetched(){if(!this.message||!this.thread||!this.thread.partnerSeenInfos){return unlinkAll();}
const otherPartnersThatHaveFetched=this.thread.partnerSeenInfos.filter(partnerSeenInfo=>partnerSeenInfo.partner&&partnerSeenInfo.partner!==this.message.author&&partnerSeenInfo.lastFetchedMessage&&partnerSeenInfo.lastFetchedMessage.id>=this.message.id).map(partnerSeenInfo=>partnerSeenInfo.partner);if(otherPartnersThatHaveFetched.length===0){return unlinkAll();}
return replace(otherPartnersThatHaveFetched);}
_computePartnersThatHaveSeen(){if(!this.message||!this.thread||!this.thread.partnerSeenInfos){return unlinkAll();}
const otherPartnersThatHaveSeen=this.thread.partnerSeenInfos.filter(partnerSeenInfo=>partnerSeenInfo.partner&&partnerSeenInfo.partner!==this.message.author&&partnerSeenInfo.lastSeenMessage&&partnerSeenInfo.lastSeenMessage.id>=this.message.id).map(partnerSeenInfo=>partnerSeenInfo.partner);if(otherPartnersThatHaveSeen.length===0){return unlinkAll();}
return replace(otherPartnersThatHaveSeen);}}
MessageSeenIndicator.modelName='mail.message_seen_indicator';MessageSeenIndicator.fields={hasEveryoneFetched:attr({compute:'_computeHasEveryoneFetched',default:false,}),hasEveryoneSeen:attr({compute:'_computeHasEveryoneSeen',default:false,}),hasSomeoneFetched:attr({compute:'_computeHasSomeoneFetched',default:false,}),hasSomeoneSeen:attr({compute:'_computeHasSomeoneSeen',default:false,}),id:attr(),isMessagePreviousToLastCurrentPartnerMessageSeenByEveryone:attr({compute:'_computeIsMessagePreviousToLastCurrentPartnerMessageSeenByEveryone',default:false,}),message:many2one('mail.message',{inverse:'messageSeenIndicators',readonly:true,required:true,}),partnersThatHaveFetched:many2many('mail.partner',{compute:'_computePartnersThatHaveFetched',}),partnersThatHaveSeen:many2many('mail.partner',{compute:'_computePartnersThatHaveSeen',}),thread:many2one('mail.thread',{inverse:'messageSeenIndicators',readonly:true,required:true,}),};MessageSeenIndicator.identifyingFields=['thread','message'];return MessageSeenIndicator;}
registerNewModel('mail.message_seen_indicator',factory);return __exports;});;

/* /mail/static/src/models/message_view/message_view.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/message_view/message_view',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2one,one2one}=require('@mail/model/model_field');const{clear,insertAndReplace,replace}=require('@mail/model/model_field_command');function factory(dependencies){class MessageView extends dependencies['mail.model']{highlight(){this.env.browser.clearTimeout(this.highlightTimeout);this.update({isHighlighted:true,highlightTimeout:this.env.browser.setTimeout(()=>{if(!this.exists()){return;}
this.update({isHighlighted:false});},2000),});}
replyTo(){if(this.threadView.replyingToMessageView===this){this.threadView.composerView.discard();return;}
this.message.originThread.update({composer:insertAndReplace({isLog:!this.message.is_discussion&&!this.message.is_notification,}),});this.threadView.update({replyingToMessageView:replace(this),composerView:insertAndReplace({doFocus:true,}),});}
startEditing(){const parser=new DOMParser();const htmlDoc=parser.parseFromString(this.message.body.replaceAll('<br>','\n').replaceAll('</br>','\n'),"text/html");const textInputContent=htmlDoc.body.textContent;this.update({composerForEditing:insertAndReplace({isLastStateChangeProgrammatic:true,mentionedPartners:replace(this.message.recipients),textInputContent,textInputCursorEnd:textInputContent.length,textInputCursorStart:textInputContent.length,textInputSelectionDirection:'none',}),composerViewInEditing:insertAndReplace({doFocus:true,}),});}
stopEditing(){if(this.threadView&&this.threadView.composerView&&!this.messaging.device.isMobileDevice){this.threadView.composerView.update({doFocus:true});}
this.update({composerForEditing:clear(),composerViewInEditing:clear(),});}
_computeAttachmentList(){return(this.message&&this.message.attachments.length>0)?insertAndReplace():clear();}
_computeMessageActionList(){return(!this.messageActionListWithDelete)?insertAndReplace():clear();}
_computeMessageInReplyToView(){return(this.message&&this.message.originThread&&this.message.originThread.model==='mail.channel'&&this.message.parentMessage)?insertAndReplace():clear();}}
MessageView.fields={attachmentList:one2one('mail.attachment_list',{compute:'_computeAttachmentList',inverse:'messageView',isCausal:true,readonly:true,}),component:attr(),composerForEditing:one2one('mail.composer',{inverse:'messageViewInEditing',isCausal:true,}),composerViewInEditing:one2one('mail.composer_view',{inverse:'messageViewInEditing',isCausal:true,}),highlightTimeout:attr(),isHighlighted:attr(),isSquashed:attr({default:false,}),messageActionList:one2one('mail.message_action_list',{compute:'_computeMessageActionList',inverse:'messageView',isCausal:true,readonly:true,}),messageActionListWithDelete:one2one('mail.message_action_list',{inverse:'messageViewForDelete',isCausal:true,readonly:true,}),message:many2one('mail.message',{inverse:'messageViews',readonly:true,required:true,}),messageInReplyToView:one2one('mail.message_in_reply_to_view',{compute:'_computeMessageInReplyToView',inverse:'messageView',isCausal:true,readonly:true,}),threadView:many2one('mail.thread_view',{inverse:'messageViews',readonly:true,}),};MessageView.identifyingFields=[['threadView','messageActionListWithDelete'],'message'];MessageView.modelName='mail.message_view';return MessageView;}
registerNewModel('mail.message_view',factory);return __exports;});;

/* /mail/static/src/models/messaging/messaging.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/messaging/messaging',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2many,many2one,one2many,one2one}=require('@mail/model/model_field');const{OnChange}=require('@mail/model/model_onchange');const{insertAndReplace,replace,link,unlink}=require('@mail/model/model_field_command');const{makeDeferred}=require('@mail/utils/deferred/deferred');const{EventBus}=owl.core;function factory(dependencies){class Messaging extends dependencies['mail.model']{_created(){super._created();this._handleGlobalWindowFocus=this._handleGlobalWindowFocus.bind(this);}
_willDelete(){if(this.env.services['bus_service']){this.env.services['bus_service'].off('window_focus',null,this._handleGlobalWindowFocus);}
return super._willDelete(...arguments);}
async start(){this.env.services['bus_service'].on('window_focus',null,this._handleGlobalWindowFocus);await this.async(()=>this.initializer.start());this.notificationHandler.start();this.update({isInitialized:true});this.initializedPromise.resolve();}
async getChat({partnerId,userId}){if(userId){const user=this.messaging.models['mail.user'].insert({id:userId});return user.getChat();}
if(partnerId){const partner=this.messaging.models['mail.partner'].insert({id:partnerId});return partner.getChat();}}
async openChat(person,options){const chat=await this.async(()=>this.getChat(person));if(!chat){return;}
await this.async(()=>chat.open(options));return chat;}
async openDocument({id,model}){this.env.bus.trigger('do-action',{action:{type:'ir.actions.act_window',res_model:model,views:[[false,'form']],res_id:id,},});if(this.messaging.device.isMobile){this.messaging.messagingMenu.close();}}
async openProfile({id,model}){if(model==='res.partner'){const partner=this.messaging.models['mail.partner'].insert({id});return partner.openProfile();}
if(model==='res.users'){const user=this.messaging.models['mail.user'].insert({id});return user.openProfile();}
if(model==='mail.channel'){let channel=this.messaging.models['mail.thread'].findFromIdentifyingData({id,model:'mail.channel'});if(!channel){channel=(await this.async(()=>this.messaging.models['mail.thread'].performRpcChannelInfo({ids:[id]})))[0];}
if(!channel){this.env.services['notification'].notify({message:this.env._t("You can only open the profile of existing channels."),type:'warning',});return;}
return channel.openProfile();}
return this.messaging.openDocument({id,model});}
refreshIsNotificationPermissionDefault(){this.update({isNotificationPermissionDefault:this._computeIsNotificationPermissionDefault()});}
toggleFocusedRtcSession(sessionId){const rtcSession=this.messaging.models['mail.rtc_session'].findFromIdentifyingData({id:sessionId,});const focusedSessionId=this.focusedRtcSession&&this.focusedRtcSession.id;if(!sessionId||focusedSessionId===sessionId){this.update({focusedRtcSession:unlink()});return;}
this.update({focusedRtcSession:link(rtcSession)});if(this.userSetting.rtcLayout!=='tiled'){return;}
this.userSetting.update({rtcLayout:'sidebar'});}
_computeInitializedPromise(){return makeDeferred();}
_computeIsCurrentUserGuest(){return Boolean(!this.currentPartner&&this.currentGuest);}
_computeMessagingBus(){if(this.messagingBus){return;}
return new EventBus();}
_computeIsNotificationPermissionDefault(){const browserNotification=this.env.browser.Notification;return browserNotification?browserNotification.permission==='default':false;}
_handleGlobalWindowFocus(){this.update({outOfFocusUnreadMessageCounter:0});this.env.bus.trigger('set_title_part',{part:'_chat',});}
_onChangeRingingThreads(){if(this.ringingThreads&&this.ringingThreads.length>0){this.soundEffects.incomingCall.play({loop:true});}else{this.soundEffects.incomingCall.stop();}}
_onChangeFocusedRtcSession(){this.rtc.filterIncomingVideoTraffic(this.focusedRtcSession&&[this.focusedRtcSession.peerToken]);}}
Messaging.fields={allRecords:one2many('mail.model',{inverse:'messaging',isCausal:true,}),autofetchPartnerImStatus:attr({default:true,}),cannedResponses:one2many('mail.canned_response'),chatWindowManager:one2one('mail.chat_window_manager',{default:insertAndReplace(),isCausal:true,readonly:true,}),commands:one2many('mail.channel_command'),companyName:attr(),currentGuest:one2one('mail.guest'),currentPartner:one2one('mail.partner'),currentUser:one2one('mail.user'),device:one2one('mail.device',{default:insertAndReplace(),isCausal:true,readonly:true,}),dialogManager:one2one('mail.dialog_manager',{default:insertAndReplace(),isCausal:true,readonly:true,}),disableAnimation:attr({default:false,}),discuss:one2one('mail.discuss',{default:insertAndReplace(),isCausal:true,readonly:true,}),focusedRtcSession:one2one('mail.rtc_session'),history:one2one('mail.thread'),inbox:one2one('mail.thread'),initializedPromise:attr({compute:'_computeInitializedPromise',required:true,readonly:true,}),initializer:one2one('mail.messaging_initializer',{default:insertAndReplace(),isCausal:true,readonly:true,}),isCurrentUserGuest:attr({compute:'_computeIsCurrentUserGuest',}),isInitialized:attr({default:false,}),isNotificationPermissionDefault:attr({compute:'_computeIsNotificationPermissionDefault',}),isQUnitTest:attr({default:false,}),locale:one2one('mail.locale',{default:insertAndReplace(),isCausal:true,readonly:true,}),loadingBaseDelayDuration:attr({default:400,}),messagingBus:attr({compute:'_computeMessagingBus',readonly:true,required:true,}),messagingMenu:one2one('mail.messaging_menu',{default:insertAndReplace(),isCausal:true,readonly:true,}),notificationGroupManager:one2one('mail.notification_group_manager',{default:insertAndReplace(),isCausal:true,readonly:true,}),notificationHandler:one2one('mail.messaging_notification_handler',{default:insertAndReplace(),isCausal:true,readonly:true,}),outOfFocusUnreadMessageCounter:attr({default:0,}),partnerRoot:many2one('mail.partner'),publicPartners:many2many('mail.partner'),ringingThreads:one2many('mail.thread',{inverse:'messagingAsRingingThread',}),rtc:one2one('mail.rtc',{default:insertAndReplace(),isCausal:true,readonly:true,}),soundEffects:one2one('mail.sound_effects',{default:insertAndReplace(),isCausal:true,readonly:true,}),starred:one2one('mail.thread'),userSetting:one2one('mail.user_setting',{isCausal:true,}),};Messaging.identifyingFields=[];Messaging.onChanges=[new OnChange({dependencies:['ringingThreads'],methodName:'_onChangeRingingThreads',}),new OnChange({dependencies:['focusedRtcSession'],methodName:'_onChangeFocusedRtcSession',}),];Messaging.modelName='mail.messaging';return Messaging;}
registerNewModel('mail.messaging',factory);return __exports;});;

/* /mail/static/src/models/messaging_initializer/messaging_initializer.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/messaging_initializer/messaging_initializer',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{executeGracefully}=require('@mail/utils/utils');const{link,insert,insertAndReplace}=require('@mail/model/model_field_command');function factory(dependencies){class MessagingInitializer extends dependencies['mail.model']{async start(){this.messaging.update({history:insertAndReplace({id:'history',isServerPinned:true,model:'mail.box',name:this.env._t("History"),}),inbox:insertAndReplace({id:'inbox',isServerPinned:true,model:'mail.box',name:this.env._t("Inbox"),}),starred:insertAndReplace({id:'starred',isServerPinned:true,model:'mail.box',name:this.env._t("Starred"),}),});const device=this.messaging.device;device.start();const data=await this.async(()=>this.env.services.rpc({route:'/mail/init_messaging',},{shadow:true}));await this.async(()=>this._init(data));if(this.messaging.autofetchPartnerImStatus){this.messaging.models['mail.partner'].startLoopFetchImStatus();}
if(this.messaging.currentUser){this._loadMessageFailures();}}
async _init({channels,commands=[],companyName,current_partner,currentGuest,current_user_id,current_user_settings,mail_failures=[],menu_id,needaction_inbox_counter=0,partner_root,public_partners,shortcodes=[],starred_counter=0}){const discuss=this.messaging.discuss;this._initPartners({currentGuest,current_partner,current_user_id,partner_root,public_partners,});this._initMailboxes({needaction_inbox_counter,starred_counter,});if(current_user_settings){this._initResUsersSettings(current_user_settings);}else{this.messaging.update({userSetting:insertAndReplace({id:-1,}),});}
this._initCannedResponses(shortcodes);if(!this.messaging.isCurrentUserGuest){this._initCommands();}
await this.async(()=>this._initChannels(channels));this._initMailFailures(mail_failures);discuss.update({menu_id});this.messaging.update({companyName});}
_initCannedResponses(cannedResponsesData){this.messaging.update({cannedResponses:insert(cannedResponsesData),});}
async _initChannels(channelsData){return executeGracefully(channelsData.map(channelData=>()=>{const convertedData=this.messaging.models['mail.thread'].convertData(channelData);if(!convertedData.members){if(this.messaging.currentPartner){convertedData.members=link(this.messaging.currentPartner);}
if(this.messaging.currentGuest){convertedData.guestMembers=link(this.messaging.currentGuest);}}
const channel=this.messaging.models['mail.thread'].insert(Object.assign({model:'mail.channel'},convertedData));if(!channel.isPinned){channel.pin();}}));}
_initCommands(){this.messaging.update({commands:insert([{help:this.env._t("Show a helper message"),methodName:'execute_command_help',name:"help",},{help:this.env._t("Leave this channel"),methodName:'execute_command_leave',name:"leave",},{channel_types:['channel','chat'],help:this.env._t("List users in the current channel"),methodName:'execute_command_who',name:"who",}]),});}
_initMailboxes({needaction_inbox_counter,starred_counter,}){this.messaging.inbox.update({counter:needaction_inbox_counter});this.messaging.starred.update({counter:starred_counter});}
async _initMailFailures(mailFailuresData){await executeGracefully(mailFailuresData.map(messageData=>()=>{const message=this.messaging.models['mail.message'].insert(this.messaging.models['mail.message'].convertData(messageData));if(!message.author&&this.messaging.currentPartner){message.update({author:link(this.messaging.currentPartner)});}}));this.messaging.notificationGroupManager.computeGroups();}
_initResUsersSettings({id,is_discuss_sidebar_category_channel_open,is_discuss_sidebar_category_chat_open,use_push_to_talk,push_to_talk_key,voice_active_duration,volume_settings=[],}){this.messaging.currentUser.update({resUsersSettingsId:id});this.messaging.update({userSetting:insertAndReplace({id,usePushToTalk:use_push_to_talk,pushToTalkKey:push_to_talk_key,voiceActiveDuration:voice_active_duration,volumeSettings:volume_settings,}),});this.messaging.discuss.update({categoryChannel:insertAndReplace({autocompleteMethod:'channel',commandAddTitleText:this.env._t("Add or join a channel"),hasAddCommand:true,hasViewCommand:true,isServerOpen:is_discuss_sidebar_category_channel_open,name:this.env._t("Channels"),newItemPlaceholderText:this.env._t("Find or create a channel..."),serverStateKey:'is_discuss_sidebar_category_channel_open',sortComputeMethod:'name',supportedChannelTypes:['channel'],}),categoryChat:insertAndReplace({autocompleteMethod:'chat',commandAddTitleText:this.env._t("Start a conversation"),hasAddCommand:true,isServerOpen:is_discuss_sidebar_category_chat_open,name:this.env._t("Direct Messages"),newItemPlaceholderText:this.env._t("Find or start a conversation..."),serverStateKey:'is_discuss_sidebar_category_chat_open',sortComputeMethod:'last_action',supportedChannelTypes:['chat','group'],}),});}
_initPartners({currentGuest,current_partner,current_user_id:currentUserId,partner_root,public_partners=[],}){if(currentGuest){this.messaging.update({currentGuest:insert(currentGuest)});}
if(current_partner){const partnerData=this.messaging.models['mail.partner'].convertData(current_partner);this.messaging.update({currentPartner:insert(partnerData),currentUser:insert({id:currentUserId}),});}
this.messaging.update({partnerRoot:insert(this.messaging.models['mail.partner'].convertData(partner_root)),publicPartners:insert(public_partners.map(publicPartner=>this.messaging.models['mail.partner'].convertData(publicPartner))),});}
async _loadMessageFailures(){const data=await this.env.services.rpc({route:'/mail/load_message_failures',},{shadow:true});this._initMailFailures(data);}}
MessagingInitializer.identifyingFields=['messaging'];MessagingInitializer.modelName='mail.messaging_initializer';return MessagingInitializer;}
registerNewModel('mail.messaging_initializer',factory);return __exports;});;

/* /mail/static/src/models/messaging_menu/messaging_menu.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/messaging_menu/messaging_menu',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,one2many}=require('@mail/model/model_field');function factory(dependencies){class MessagingMenu extends dependencies['mail.model']{close(){this.update({isOpen:false});}
toggleMobileNewMessage(){this.update({isMobileNewMessageToggled:!this.isMobileNewMessageToggled});}
toggleOpen(){this.update({isOpen:!this.isOpen});this.messaging.refreshIsNotificationPermissionDefault();if(this.isOpen){this.messaging.inbox.cache.update({isCacheRefreshRequested:true});}}
_computeCounter(){if(!this.messaging){return 0;}
const inboxCounter=this.messaging.inbox?this.messaging.inbox.counter:0;const unreadChannelsCounter=this.pinnedAndUnreadChannels.length;const notificationGroupsCounter=this.messaging.notificationGroupManager?this.messaging.notificationGroupManager.groups.reduce((total,group)=>total+group.notifications.length,0):0;const notificationPemissionCounter=this.messaging.isNotificationPermissionDefault?1:0;return inboxCounter+unreadChannelsCounter+notificationGroupsCounter+notificationPemissionCounter;}}
MessagingMenu.fields={activeTabId:attr({default:'all',}),counter:attr({compute:'_computeCounter',}),isMobileNewMessageToggled:attr({default:false,}),isOpen:attr({default:false,}),pinnedAndUnreadChannels:one2many('mail.thread',{inverse:'messagingMenuAsPinnedAndUnreadChannel',readonly:true,}),};MessagingMenu.identifyingFields=['messaging'];MessagingMenu.modelName='mail.messaging_menu';return MessagingMenu;}
registerNewModel('mail.messaging_menu',factory);return __exports;});;

/* /mail/static/src/models/messaging_notification_handler/messaging_notification_handler.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/messaging_notification_handler/messaging_notification_handler',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{decrement,increment,insert,insertAndReplace,link,replace,unlink}=require('@mail/model/model_field_command');const{htmlToTextContentInline}=require('@mail/js/utils');const{str_to_datetime}=require('web.time');const PREVIEW_MSG_MAX_SIZE=350;function factory(dependencies){class MessagingNotificationHandler extends dependencies['mail.model']{_willDelete(){if(this.env.services['bus_service']){this.env.services['bus_service'].off('notification');this.env.services['bus_service'].stopPolling();}
return super._willDelete(...arguments);}
start(){this.env.services.bus_service.onNotification(null,notifs=>this._handleNotifications(notifs));this.env.services.bus_service.startPolling();}
async _handleNotifications(notifications){const channelsLeft=new Set(notifications.filter(notification=>notification.type==='mail.channel/leave').map(notification=>notification.payload.id));const proms=notifications.map(message=>{if(typeof message==='object'){switch(message.type){case'ir.attachment/delete':return this._handleNotificationAttachmentDelete(message.payload);case'mail.channel.partner/seen':return this._handleNotificationChannelPartnerSeen(message.payload);case'mail.channel.partner/fetched':return this._handleNotificationChannelPartnerFetched(message.payload);case'mail.channel.partner/typing_status':return this._handleNotificationChannelPartnerTypingStatus(message.payload);case'mail.channel/new_message':if(channelsLeft.has(message.payload.id)){return;}
return this._handleNotificationChannelMessage(message.payload);case'mail.message/delete':return this._handleNotificationMessageDelete(message.payload);case'mail.message/inbox':return this._handleNotificationNeedaction(message.payload);case'mail.message/mark_as_read':return this._handleNotificationPartnerMarkAsRead(message.payload);case'mail.message/notification_update':return this._handleNotificationPartnerMessageNotificationUpdate(message.payload);case'simple_notification':return this._handleNotificationSimpleNotification(message.payload);case'mail.message/toggle_star':return this._handleNotificationPartnerToggleStar(message.payload);case'mail.channel/transient_message':return this._handleNotificationPartnerTransientMessage(message.payload);case'mail.channel/leave':return this._handleNotificationChannelLeave(message.payload);case'res.users/connection':return this._handleNotificationPartnerUserConnection(message.payload);case'mail.activity/updated':return this.env.bus.trigger('activity_updated',message.payload);case'mail.channel/unpin':return this._handleNotificationChannelUnpin(message.payload);case'mail.channel/joined':return this._handleNotificationChannelJoined(message.payload);case'mail.channel/last_interest_dt_changed':return this._handleNotificationChannelLastInterestDateTimeChanged(message.payload);case'mail.channel/legacy_insert':return this.messaging.models['mail.thread'].insert(this.messaging.models['mail.thread'].convertData({model:'mail.channel',...message.payload}));case'mail.channel/insert':return this._handleNotificationChannelUpdate(message.payload);case'mail.guest/insert':return this.messaging.models['mail.guest'].insert(message.payload);case'mail.message/insert':return this.messaging.models['mail.message'].insert(message.payload);case'mail.channel.rtc.session/insert':return this.messaging.models['mail.rtc_session'].insert(message.payload);case'res.users.settings/changed':return this._handleNotificationResUsersSettings(message.payload);case'mail.channel.rtc.session/peer_notification':return this._handleNotificationRtcPeerToPeer(message.payload);case'mail.channel/rtc_sessions_update':return this._handleNotificationRtcSessionUpdate(message.payload);case'mail.channel.rtc.session/ended':return this._handleNotificationRtcSessionEnded(message.payload);case'res.users.settings/volumes_update':return this._handleNotificationVolumeSettingUpdate(message.payload);default:return this._handleNotification(message);}}});await this.async(()=>Promise.all(proms));}
_handleNotification(message){}
_handleNotificationAttachmentDelete(payload){const attachment=this.messaging.models['mail.attachment'].findFromIdentifyingData(payload);if(attachment){attachment.delete();}}
async _handleNotificationChannelPartnerFetched({channel_id:channelId,last_message_id,partner_id,}){const channel=this.messaging.models['mail.thread'].findFromIdentifyingData({id:channelId,model:'mail.channel',});if(!channel){return;}
if(channel.channel_type==='channel'){return;}
this.messaging.models['mail.thread_partner_seen_info'].insert({lastFetchedMessage:insert({id:last_message_id}),partner:insertAndReplace({id:partner_id}),thread:replace(channel),});this.messaging.models['mail.message_seen_indicator'].insert({message:insertAndReplace({id:last_message_id}),thread:replace(channel),});this.messaging.models['mail.message_seen_indicator'].recomputeFetchedValues(channel);}
_handleNotificationChannelJoined({channel:channelData,invited_by_user_id:invitedByUserId}){const channel=this.messaging.models['mail.thread'].insert(this.messaging.models['mail.thread'].convertData(channelData));if(this.messaging.currentUser&&invitedByUserId!==this.messaging.currentUser.id){this.env.services['notification'].notify({message:_.str.sprintf(this.env._t("You have been invited to #%s"),channel.displayName),type:'info',});}}
_handleNotificationChannelLastInterestDateTimeChanged({id,last_interest_dt}){const channel=this.messaging.models['mail.thread'].findFromIdentifyingData({id:id,model:'mail.channel',});if(channel){channel.update({lastInterestDateTime:str_to_datetime(last_interest_dt),});}}
async _handleNotificationChannelMessage({id:channelId,message:messageData}){let channel=this.messaging.models['mail.thread'].findFromIdentifyingData({id:channelId,model:'mail.channel',});if(!channel&&this.messaging.isCurrentUserGuest){return;}
const convertedData=this.messaging.models['mail.message'].convertData(messageData);if(!channel){channel=(await this.async(()=>this.messaging.models['mail.thread'].performRpcChannelInfo({ids:[channelId]})))[0];}
if(!channel.isPinned){channel.pin();}
const message=this.messaging.models['mail.message'].insert(convertedData);this._notifyThreadViewsMessageReceived(message);if(message.author===this.messaging.currentPartner){return;}
const isChatWithOdooBot=(channel.correspondent&&channel.correspondent===this.messaging.partnerRoot);if(!isChatWithOdooBot){const isOdooFocused=this.env.services['bus_service'].isOdooFocused();if(!isOdooFocused&&channel.isChatChannel){this._notifyNewChannelMessageWhileOutOfFocus({channel,message,});}
if(channel.model==='mail.channel'&&channel.channel_type!=='channel'&&!this.messaging.currentGuest){channel.markAsFetched();}
if(channel.channel_type!=='channel'&&!this.messaging.device.isMobile&&!channel.chatWindow){this.messaging.chatWindowManager.openThread(channel);}}}
async _handleNotificationChannelPartnerSeen({channel_id:channelId,last_message_id,partner_id,}){const channel=this.messaging.models['mail.thread'].findFromIdentifyingData({id:channelId,model:'mail.channel',});if(!channel){return;}
const lastMessage=this.messaging.models['mail.message'].insert({id:last_message_id});const shouldComputeSeenIndicators=channel.channel_type!=='channel';if(shouldComputeSeenIndicators){this.messaging.models['mail.thread_partner_seen_info'].insert({lastSeenMessage:link(lastMessage),partner:insertAndReplace({id:partner_id}),thread:replace(channel),});this.messaging.models['mail.message_seen_indicator'].insert({message:replace(lastMessage),thread:replace(channel),});}
if(this.messaging.currentPartner&&this.messaging.currentPartner.id===partner_id){channel.update({lastSeenByCurrentPartnerMessageId:last_message_id,pendingSeenMessageId:undefined,});}
if(shouldComputeSeenIndicators){this.messaging.models['mail.thread'].computeLastCurrentPartnerMessageSeenByEveryone(channel);this.messaging.models['mail.message_seen_indicator'].recomputeSeenValues(channel);}}
_handleNotificationChannelPartnerTypingStatus({channel_id,is_typing,partner_id,partner_name}){const channel=this.messaging.models['mail.thread'].findFromIdentifyingData({id:channel_id,model:'mail.channel',});if(!channel){return;}
const partner=this.messaging.models['mail.partner'].insert({id:partner_id,name:partner_name,});if(partner===this.messaging.currentPartner){return;}
if(is_typing){if(channel.typingMembers.includes(partner)){channel.refreshOtherMemberTypingMember(partner);}else{channel.registerOtherMemberTypingMember(partner);}}else{if(!channel.typingMembers.includes(partner)){return;}
channel.unregisterOtherMemberTypingMember(partner);}}
_handleNotificationChannelUpdate(channelData){this.messaging.models['mail.thread'].insert({model:'mail.channel',...channelData});}
_handleNotificationResUsersSettings(settings){if('is_discuss_sidebar_category_channel_open'in settings){this.messaging.discuss.categoryChannel.update({isServerOpen:settings.is_discuss_sidebar_category_channel_open,});}
if('is_discuss_sidebar_category_chat_open'in settings){this.messaging.discuss.categoryChat.update({isServerOpen:settings.is_discuss_sidebar_category_chat_open,});}
this.messaging.userSetting.update({usePushToTalk:settings.use_push_to_talk,pushToTalkKey:settings.push_to_talk_key,voiceActiveDuration:settings.voice_active_duration,});}
_handleNotificationNeedaction(data){const message=this.messaging.models['mail.message'].insert(this.messaging.models['mail.message'].convertData(data));this.messaging.inbox.update({counter:increment()});const originThread=message.originThread;if(originThread&&message.isNeedaction){originThread.update({message_needaction_counter:increment()});}}
_handleNotificationRtcPeerToPeer({sender,notifications}){for(const content of notifications){this.messaging.rtc.handleNotification(sender,content);}}
_handleNotificationSimpleNotification({message,sticky,title,warning}){this.env.services['notification'].notify({message,sticky,title,type:warning?'warning':'danger',});}
async _handleNotificationVolumeSettingUpdate({volumeSettings}){this.messaging&&this.messaging.userSetting.update({volumeSettings:volumeSettings,});}
async _handleNotificationRtcSessionEnded({sessionId}){const currentSession=this.messaging.rtc.currentRtcSession;if(currentSession&&currentSession.id===sessionId){this.messaging.rtc.channel.endCall();this.env.services['notification'].notify({message:this.env._t("Disconnected from the RTC call by the server"),type:'warning',});}}
async _handleNotificationRtcSessionUpdate({id,rtcSessions}){const channel=this.messaging.models['mail.thread'].findFromIdentifyingData({id,model:'mail.channel'});if(!channel){return;}
channel.updateRtcSessions(rtcSessions);}
_handleNotificationMessageDelete({message_ids}){for(const id of message_ids){const message=this.messaging.models['mail.message'].findFromIdentifyingData({id});if(message){message.delete();}}
this.messaging.notificationGroupManager.computeGroups();}
_handleNotificationPartnerMessageNotificationUpdate({elements}){for(const messageData of elements){const message=this.messaging.models['mail.message'].insert(this.messaging.models['mail.message'].convertData(messageData));if(!message.author&&this.messaging.currentPartner){message.update({author:link(this.messaging.currentPartner)});}}
this.messaging.notificationGroupManager.computeGroups();}
_handleNotificationPartnerMarkAsRead({message_ids=[],needaction_inbox_counter}){for(const message_id of message_ids){const message=this.messaging.models['mail.message'].findFromIdentifyingData({id:message_id});if(!message){continue;}
const originThread=message.originThread;if(originThread&&message.isNeedaction){originThread.update({message_needaction_counter:decrement()});}
message.update({isHistory:true,isNeedaction:false,});}
const inbox=this.messaging.inbox;if(needaction_inbox_counter!==undefined){inbox.update({counter:needaction_inbox_counter});}else{inbox.update({counter:decrement(message_ids.length)});}
if(inbox.counter>inbox.cache.fetchedMessages.length){inbox.cache.update({hasToLoadMessages:true});}}
_handleNotificationPartnerToggleStar({message_ids=[],starred}){const starredMailbox=this.messaging.starred;for(const messageId of message_ids){const message=this.messaging.models['mail.message'].findFromIdentifyingData({id:messageId,});if(!message){continue;}
message.update({isStarred:starred});starredMailbox.update({counter:starred?increment():decrement(),});}}
_handleNotificationPartnerTransientMessage(data){const convertedData=this.messaging.models['mail.message'].convertData(data);const lastMessageId=this.messaging.models['mail.message'].all().reduce((lastMessageId,message)=>Math.max(lastMessageId,message.id),0);const partnerRoot=this.messaging.partnerRoot;const message=this.messaging.models['mail.message'].create(Object.assign(convertedData,{author:link(partnerRoot),id:lastMessageId+0.01,isTransient:true,}));this._notifyThreadViewsMessageReceived(message);}
_handleNotificationChannelLeave({id}){const channel=this.messaging.models['mail.thread'].findFromIdentifyingData({id,model:'mail.channel',});if(!channel){return;}
const message=_.str.sprintf(this.env._t("You unsubscribed from %s."),channel.displayName);this.env.services['notification'].notify({message,type:'info'});channel.update({isServerPinned:false,members:unlink(this.messaging.currentPartner)});}
_handleNotificationChannelUnpin({id}){const channel=this.messaging.models['mail.thread'].findFromIdentifyingData({id,model:'mail.channel',});if(!channel){return;}
const message=_.str.sprintf(this.env._t("You unpinned your conversation with %s."),channel.displayName);this.env.services['notification'].notify({message,type:'info'});channel.update({isServerPinned:false,members:unlink(this.messaging.currentPartner)});}
async _handleNotificationPartnerUserConnection({partnerId,username}){const message=_.str.sprintf(this.env._t('%s connected'),username);const title=this.env._t("This is their first connection. Wish them luck.");this.env.services['bus_service'].sendNotification({message,title,type:'info'});const chat=await this.async(()=>this.messaging.getChat({partnerId}));if(!chat||this.messaging.device.isMobile){return;}
this.messaging.chatWindowManager.openThread(chat);}
_notifyNewChannelMessageWhileOutOfFocus({channel,message}){const author=message.author;const messaging=this.messaging;let notificationTitle;if(!author){notificationTitle=this.env._t("New message");}else{if(channel.channel_type==='channel'){const channelIcon=this.env.qweb.renderToString('mail.ThreadIcon',{env:this.env,thread:channel,});const channelName=channel.displayName;const channelNameWithIcon=channelIcon+channelName;notificationTitle=_.str.sprintf(this.env._t("%s from %s"),author.nameOrDisplayName,channelNameWithIcon);}else{notificationTitle=author.nameOrDisplayName;}}
const notificationContent=owl.utils.escape(htmlToTextContentInline(message.body).substr(0,PREVIEW_MSG_MAX_SIZE));this.env.services['bus_service'].sendNotification({message:notificationContent,title:notificationTitle,type:'info',});messaging.update({outOfFocusUnreadMessageCounter:increment()});const titlePattern=messaging.outOfFocusUnreadMessageCounter===1?this.env._t("%d Message"):this.env._t("%d Messages");this.env.bus.trigger('set_title_part',{part:'_chat',title:_.str.sprintf(titlePattern,messaging.outOfFocusUnreadMessageCounter),});}
_notifyThreadViewsMessageReceived(message){for(const thread of message.threads){for(const threadView of thread.threadViews){threadView.addComponentHint('message-received',{message});}}}}
MessagingNotificationHandler.identifyingFields=['messaging'];MessagingNotificationHandler.modelName='mail.messaging_notification_handler';return MessagingNotificationHandler;}
registerNewModel('mail.messaging_notification_handler',factory);return __exports;});;

/* /mail/static/src/models/model/model.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/model/model',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{RecordDeletedError}=require('@mail/model/model_errors');const{many2one}=require('@mail/model/model_field');const{insertAndReplace}=require('@mail/model/model_field_command');function factory(){class Model{constructor({localId,valid=false}={}){if(!valid){throw new Error("Record must always be instantiated from static method 'create()'");}
Object.assign(this,{localId,__listeners:[],__values:{},});}
_willCreate(){}
_created(){}
_willDelete(){}
static all(filterFunc){return this.modelManager.all(this,filterFunc);}
static create(data){return this.modelManager.create(this,data);}
static get env(){return this.modelManager.env;}
static find(findFunc){return this.modelManager.find(this,findFunc);}
static findFromIdentifyingData(data){return this.modelManager.findFromIdentifyingData(this,data);}
static get(localId,{isCheckingInheritance}={}){return this.modelManager.get(this,localId,{isCheckingInheritance});}
static insert(data={}){return this.modelManager.insert(this,data);}
static get messaging(){return this.modelManager.messaging;}
static get models(){return this.modelManager.models;}
static toString(){return`model(${this.modelName})`;}
async async(func){return new Promise((resolve,reject)=>{Promise.resolve(func()).then(result=>{if(this.exists()){resolve(result);}else{reject(new RecordDeletedError(this.localId));}}).catch(error=>{if(this.exists()){reject(error);}else{reject(new RecordDeletedError(this.localId));}});});}
delete(){this.modelManager.delete(this);}
get env(){return this.modelManager.env;}
exists(){return this.modelManager.exists(this.constructor,this);}
get modelManager(){return this.constructor.modelManager;}
get models(){return this.modelManager.models;}
toString(){return`record(${this.localId})`;}
update(data={}){this.modelManager.update(this,data);}}
Model.fields={messaging:many2one('mail.messaging',{default:insertAndReplace(),inverse:'allRecords',readonly:true,required:true,}),};Model.identifyingFields=['messaging'];Model.modelName='mail.model';return Model;}
registerNewModel('mail.model',factory);return __exports;});;

/* /mail/static/src/models/notification/notification.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/notification/notification',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2one}=require('@mail/model/model_field');const{insert,unlinkAll}=require('@mail/model/model_field_command');function factory(dependencies){class Notification extends dependencies['mail.model']{static convertData(data){const data2={};if('failure_type'in data){data2.failure_type=data.failure_type;}
if('id'in data){data2.id=data.id;}
if('notification_status'in data){data2.notification_status=data.notification_status;}
if('notification_type'in data){data2.notification_type=data.notification_type;}
if('res_partner_id'in data){if(!data.res_partner_id){data2.partner=unlinkAll();}else{data2.partner=insert({display_name:data.res_partner_id[1],id:data.res_partner_id[0],});}}
return data2;}}
Notification.fields={failure_type:attr(),id:attr({readonly:true,required:true,}),message:many2one('mail.message',{inverse:'notifications',}),notification_status:attr(),notification_type:attr(),partner:many2one('mail.partner'),};Notification.identifyingFields=['id'];Notification.modelName='mail.notification';return Notification;}
registerNewModel('mail.notification',factory);return __exports;});;

/* /mail/static/src/models/notification_group/notification_group.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/notification_group/notification_group',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2one,one2many}=require('@mail/model/model_field');const{clear,insert,unlink}=require('@mail/model/model_field_command');function factory(dependencies){class NotificationGroup extends dependencies['mail.model']{openCancelAction(){if(this.notification_type!=='email'){return;}
this.env.bus.trigger('do-action',{action:'mail.mail_resend_cancel_action',options:{additional_context:{default_model:this.res_model,unread_counter:this.notifications.length,},},});}
openDocuments(){if(this.thread){this.thread.open();}else{this._openDocuments();}}
_computeThread(){const notificationsThreadIds=this.notifications.filter(notification=>notification.message&&notification.message.originThread).map(notification=>notification.message.originThread.id);const threadIds=new Set(notificationsThreadIds);if(threadIds.size!==1){return unlink();}
return insert({id:notificationsThreadIds[0],model:this.res_model,});}
_computeDate(){const dates=this.notifications.filter(notification=>notification.message&&notification.message.date).map(notification=>notification.message.date);if(dates.length===0){return clear();}
return moment.max(dates);}
_computeSequence(){return-Math.max(...this.notifications.map(notification=>notification.message.id));}
_openDocuments(){if(this.notification_type!=='email'){return;}
this.env.bus.trigger('do-action',{action:{name:this.env._t("Mail Failures"),type:'ir.actions.act_window',view_mode:'kanban,list,form',views:[[false,'kanban'],[false,'list'],[false,'form']],target:'current',res_model:this.res_model,domain:[['message_has_error','=',true]],},});if(this.messaging.device.isMobile){this.messaging.messagingMenu.close();}}}
NotificationGroup.fields={date:attr({compute:'_computeDate',}),id:attr({readonly:true,required:true,}),notification_type:attr(),notifications:one2many('mail.notification'),res_model:attr(),res_model_name:attr(),sequence:attr({compute:'_computeSequence',default:0,}),thread:many2one('mail.thread',{compute:'_computeThread',})};NotificationGroup.identifyingFields=['id'];NotificationGroup.modelName='mail.notification_group';return NotificationGroup;}
registerNewModel('mail.notification_group',factory);return __exports;});;

/* /mail/static/src/models/notification_group_manager/notification_group_manager.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/notification_group_manager/notification_group_manager',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{one2many}=require('@mail/model/model_field');const{link}=require('@mail/model/model_field_command');function factory(dependencies){class NotificationGroupManager extends dependencies['mail.model']{computeGroups(){if(this.messaging.isCurrentUserGuest){return;}
for(const group of this.groups){group.delete();}
const groups=[];this.messaging.currentPartner.failureNotifications.forEach(notification=>{const thread=notification.message.originThread;const channelId=thread.model==='mail.channel'?thread.id:null;const id=`${thread.model}/${channelId}/${notification.notification_type}`;const group=this.messaging.models['mail.notification_group'].insert({id,notification_type:notification.notification_type,res_model:thread.model,res_model_name:thread.model_name,});group.update({notifications:link(notification)});if(!groups.includes(group)){groups.push(group);}});this.update({groups:link(groups)});}}
NotificationGroupManager.fields={groups:one2many('mail.notification_group'),};NotificationGroupManager.identifyingFields=['messaging'];NotificationGroupManager.modelName='mail.notification_group_manager';return NotificationGroupManager;}
registerNewModel('mail.notification_group_manager',factory);return __exports;});;

/* /mail/static/src/models/partner/partner.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/partner/partner',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2many,many2one,one2many,one2one}=require('@mail/model/model_field');const{insert,link,unlinkAll}=require('@mail/model/model_field_command');const{cleanSearchTerm}=require('@mail/utils/utils');function factory(dependencies){class Partner extends dependencies['mail.model']{static convertData(data){const data2={};if('active'in data){data2.active=data.active;}
if('country'in data){if(!data.country){data2.country=unlinkAll();}else{data2.country=insert({id:data.country[0],name:data.country[1],});}}
if('display_name'in data){data2.display_name=data.display_name;}
if('email'in data){data2.email=data.email;}
if('id'in data){data2.id=data.id;}
if('is_muted'in data){data2.isMuted=data.is_muted;}
if('im_status'in data){data2.im_status=data.im_status;}
if('name'in data){data2.name=data.name;}
if('user_id'in data){if(!data.user_id){data2.user=unlinkAll();}else{let user={};if(Array.isArray(data.user_id)){user={id:data.user_id[0],display_name:data.user_id[1],};}else{user={id:data.user_id,};}
user.isInternalUser=data.is_internal_user;data2.user=insert(user);}}
return data2;}
static async fetchSuggestions(searchTerm,{thread}={}){const kwargs={search:searchTerm};const isNonPublicChannel=thread&&thread.model==='mail.channel'&&thread.public!=='public';if(isNonPublicChannel){kwargs.channel_id=thread.id;}
const suggestedPartners=await this.env.services.rpc({model:'res.partner',method:'get_mention_suggestions',kwargs,},{shadow:true},);const partners=this.messaging.models['mail.partner'].insert(suggestedPartners.map(data=>this.messaging.models['mail.partner'].convertData(data)));if(isNonPublicChannel){thread.update({members:link(partners)});}}
static async imSearch({callback,keyword,limit=10}){let partners=[];const cleanedSearchTerm=cleanSearchTerm(keyword);const currentPartner=this.messaging.currentPartner;for(const partner of this.all(partner=>partner.active)){if(partners.length<limit){if(partner!==currentPartner&&partner.name&&partner.user&&cleanSearchTerm(partner.name).includes(cleanedSearchTerm)){partners.push(partner);}}}
if(!partners.length){const partnersData=await this.env.services.rpc({model:'res.partner',method:'im_search',args:[keyword,limit]},{shadow:true});const newPartners=this.insert(partnersData.map(partnerData=>this.convertData(partnerData)));partners.push(...newPartners);}
callback(partners);}
static searchSuggestions(searchTerm,{thread}={}){let partners;const isNonPublicChannel=thread&&thread.model==='mail.channel'&&thread.public!=='public';if(isNonPublicChannel){partners=thread.members;}else{partners=this.messaging.models['mail.partner'].all();}
const cleanedSearchTerm=cleanSearchTerm(searchTerm);const mainSuggestionList=[];const extraSuggestionList=[];for(const partner of partners){if((!partner.active&&partner!==this.messaging.partnerRoot)||partner.id<=0||this.messaging.publicPartners.includes(partner)){continue;}
if((partner.nameOrDisplayName&&cleanSearchTerm(partner.nameOrDisplayName).includes(cleanedSearchTerm))||(partner.email&&cleanSearchTerm(partner.email).includes(cleanedSearchTerm))){if(partner.user){mainSuggestionList.push(partner);}else{extraSuggestionList.push(partner);}}}
return[mainSuggestionList,extraSuggestionList];}
static async startLoopFetchImStatus(){await this._fetchImStatus();this._loopFetchImStatus();}
async checkIsUser(){const userIds=await this.async(()=>this.env.services.rpc({model:'res.users',method:'search',args:[[['partner_id','=',this.id]]],kwargs:{context:{active_test:false},},},{shadow:true}));this.update({hasCheckedUser:true});if(userIds.length>0){this.update({user:insert({id:userIds[0]})});}}
async getChat(){if(!this.user&&!this.hasCheckedUser){await this.async(()=>this.checkIsUser());}
if(!this.user){this.env.services['notification'].notify({message:this.env._t("You can only chat with partners that have a dedicated user."),type:'info',});return;}
return this.user.getChat();}
getMentionText(){return this.name;}
static getSuggestionSortFunction(searchTerm,{thread}={}){const cleanedSearchTerm=cleanSearchTerm(searchTerm);return(a,b)=>{const isAInternalUser=a.user&&a.user.isInternalUser;const isBInternalUser=b.user&&b.user.isInternalUser;if(isAInternalUser&&!isBInternalUser){return-1;}
if(!isAInternalUser&&isBInternalUser){return 1;}
if(thread&&thread.model==='mail.channel'){const isAMember=thread.members.includes(a);const isBMember=thread.members.includes(b);if(isAMember&&!isBMember){return-1;}
if(!isAMember&&isBMember){return 1;}}
if(thread){const isAFollower=thread.followersPartner.includes(a);const isBFollower=thread.followersPartner.includes(b);if(isAFollower&&!isBFollower){return-1;}
if(!isAFollower&&isBFollower){return 1;}}
const cleanedAName=cleanSearchTerm(a.nameOrDisplayName||'');const cleanedBName=cleanSearchTerm(b.nameOrDisplayName||'');if(cleanedAName.startsWith(cleanedSearchTerm)&&!cleanedBName.startsWith(cleanedSearchTerm)){return-1;}
if(!cleanedAName.startsWith(cleanedSearchTerm)&&cleanedBName.startsWith(cleanedSearchTerm)){return 1;}
if(cleanedAName<cleanedBName){return-1;}
if(cleanedAName>cleanedBName){return 1;}
const cleanedAEmail=cleanSearchTerm(a.email||'');const cleanedBEmail=cleanSearchTerm(b.email||'');if(cleanedAEmail.startsWith(cleanedSearchTerm)&&!cleanedAEmail.startsWith(cleanedSearchTerm)){return-1;}
if(!cleanedBEmail.startsWith(cleanedSearchTerm)&&cleanedBEmail.startsWith(cleanedSearchTerm)){return 1;}
if(cleanedAEmail<cleanedBEmail){return-1;}
if(cleanedAEmail>cleanedBEmail){return 1;}
return a.id-b.id;};}
async openChat(options){const chat=await this.async(()=>this.getChat());if(!chat){return;}
await this.async(()=>chat.open(options));return chat;}
async openProfile(){return this.messaging.openDocument({id:this.id,model:'res.partner',});}
_computeAvatarUrl(){return`/web/image/res.partner/${this.id}/avatar_128`;}
static async _fetchImStatus(){const partnerIds=[];for(const partner of this.all()){if(partner.im_status!=='im_partner'&&partner.id>0){partnerIds.push(partner.id);}}
if(partnerIds.length===0){return;}
const dataList=await this.env.services.rpc({route:'/longpolling/im_status',params:{partner_ids:partnerIds,},},{shadow:true});this.insert(dataList);}
static _loopFetchImStatus(){setTimeout(async()=>{await this._fetchImStatus();this._loopFetchImStatus();},50*1000);}
_computeDisplayName(){return this.display_name||this.user&&this.user.display_name;}
_computeIsOnline(){return['online','away'].includes(this.im_status);}
_computeNameOrDisplayName(){return this.name||this.display_name;}}
Partner.fields={active:attr({default:true,}),avatarUrl:attr({compute:'_computeAvatarUrl',}),country:many2one('mail.country'),display_name:attr({compute:'_computeDisplayName',default:"",}),email:attr(),failureNotifications:one2many('mail.notification',{related:'messagesAsAuthor.failureNotifications',}),hasCheckedUser:attr({default:false,}),id:attr({readonly:true,required:true,}),im_status:attr(),isOnline:attr({compute:'_computeIsOnline',}),isMuted:attr({default:false,}),memberThreads:many2many('mail.thread',{inverse:'members',}),messagesAsAuthor:one2many('mail.message',{inverse:'author',}),model:attr({default:'res.partner',}),name:attr(),nameOrDisplayName:attr({compute:'_computeNameOrDisplayName',}),partnerSeenInfos:one2many('mail.thread_partner_seen_info',{inverse:'partner',isCausal:true,}),rtcSessions:one2many('mail.rtc_session',{inverse:'partner',}),user:one2one('mail.user',{inverse:'partner',}),volumeSetting:one2one('mail.volume_setting',{inverse:'partner',}),};Partner.identifyingFields=['id'];Partner.modelName='mail.partner';return Partner;}
registerNewModel('mail.partner',factory);return __exports;});;

/* /mail/static/src/models/popover_view/popover_view.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/popover_view/popover_view',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,one2one}=require('@mail/model/model_field');const{clear}=require('@mail/model/model_field_command');function factory(dependencies){class PopoverView extends dependencies['mail.model']{_created(){this._onClickCaptureGlobal=this._onClickCaptureGlobal.bind(this);document.addEventListener('click',this._onClickCaptureGlobal,true);}
_willDelete(){document.removeEventListener('click',this._onClickCaptureGlobal,true);}
_computeAnchorRef(){if(this.threadViewTopbarOwner){return this.threadViewTopbarOwner.inviteButtonRef;}
return clear();}
_computePosition(){if(this.threadViewTopbarOwner){return'bottom';}
return clear();}
_onClickCaptureGlobal(ev){if(!this.component||!this.component.el){return;}
if(this.anchorRef&&this.anchorRef.el&&this.anchorRef.el.contains(ev.target)){return;}
if(this.component.el.contains(ev.target)){return;}
this.delete();}}
PopoverView.fields={anchorRef:attr({compute:'_computeAnchorRef',required:true,}),channelInvitationForm:one2one('mail.channel_invitation_form',{inverse:'popoverView',isCausal:true,readonly:true,required:true,}),component:attr(),position:attr({compute:'_computePosition',default:'top',}),threadViewTopbarOwner:one2one('mail.thread_view_topbar',{inverse:'invitePopoverView',readonly:true,}),};PopoverView.identifyingFields=['threadViewTopbarOwner','channelInvitationForm'];PopoverView.modelName='mail.popover_view';return PopoverView;}
registerNewModel('mail.popover_view',factory);return __exports;});;

/* /mail/static/src/models/rtc/rtc.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/rtc/rtc',async function(require){'use strict';let __exports={};const{browser}=require("@web/core/browser/browser");const{registerNewModel}=require('@mail/model/model_core');const{attr,one2many,one2one}=require('@mail/model/model_field');const{clear,insert,unlink}=require('@mail/model/model_field_command');const{monitorAudio}=require('@mail/utils/media_monitoring/media_monitoring');const TRANSCEIVER_ORDER=['audio','video'];function factory(dependencies){const getRTCPeerNotificationNextTemporaryId=(function(){let tmpId=0;return()=>{tmpId+=1;return tmpId;};})();class Rtc extends dependencies['mail.model']{_created(){super._created();this._dataChannels={};this._disconnectAudioMonitor=undefined;this._fallBackTimeouts={};this._outGoingCallTokens=new Set();this._peerConnections={};this._pushToTalkTimeoutId=undefined;this._onKeyDown=this._onKeyDown.bind(this);this._onKeyUp=this._onKeyUp.bind(this);browser.addEventListener('keydown',this._onKeyDown);browser.addEventListener('keyup',this._onKeyUp);this._onBeforeUnload=this._onBeforeUnload.bind(this);browser.addEventListener('beforeunload',this._onBeforeUnload);this._intervalId=browser.setInterval(async()=>{if(!this.currentRtcSession||!this.channel){return;}
await this._pingServer();if(!this.currentRtcSession||!this.channel){return;}
this._callSessions();},30000);}
async _willDelete(){browser.removeEventListener('beforeunload',this._onBeforeUnload);browser.removeEventListener('keydown',this._onKeyDown);browser.removeEventListener('keyup',this._onKeyUp);browser.clearInterval(this._intervalId);return super._willDelete(...arguments);}
async filterCallees(currentSessions){const currentSessionsTokens=new Set(currentSessions.map(session=>session.peerToken));for(const token of Object.keys(this._peerConnections)){if(!currentSessionsTokens.has(token)){this._addLogEntry(token,'session removed from the server');this._removePeer(token);}}
if(this.channel&&this.currentRtcSession&&!currentSessionsTokens.has(this.currentRtcSession.peerToken)){this.channel.endCall();}}
filterIncomingVideoTraffic(allowedTokens){const tokenSet=new Set(allowedTokens);for(const[token,peerConnection]of Object.entries(this._peerConnections)){const fullDirection=this.videoTrack?'sendrecv':'recvonly';const limitedDirection=this.videoTrack?'sendonly':'inactive';const transceiver=this._getTransceiver(peerConnection,'video');if(!transceiver){continue;}
if(!tokenSet.size||tokenSet.has(token)){transceiver.direction=fullDirection;}else{transceiver.direction=limitedDirection;}}}
async handleNotification(sender,content){const{event,channelId,payload}=JSON.parse(content);const rtcSession=this.messaging.models['mail.rtc_session'].findFromIdentifyingData({id:sender});if(!rtcSession||rtcSession.channel!==this.channel){return;}
if(!this.isClientRtcCompatible){return;}
if(!this._peerConnections[sender]&&(!channelId||!this.channel||channelId!==this.channel.id)){return;}
switch(event){case"offer":this._addLogEntry(sender,`received notification: ${event}`,{step:'received offer'});await this._handleRtcTransactionOffer(rtcSession.peerToken,payload);break;case"answer":this._addLogEntry(sender,`received notification: ${event}`,{step:'received answer'});await this._handleRtcTransactionAnswer(rtcSession.peerToken,payload);break;case"ice-candidate":await this._handleRtcTransactionICECandidate(rtcSession.peerToken,payload);break;case"disconnect":this._addLogEntry(sender,`received notification: ${event}`,{step:' peer cleanly disconnected '});this._removePeer(rtcSession.peerToken);break;case'trackChange':this._handleTrackChange(rtcSession,payload);break;}}
async initSession({currentSessionId,iceServers,startWithAudio,startWithVideo,videoType='user-video'}){this.reset();this.update({currentRtcSession:insert({id:currentSessionId}),iceServers:iceServers||this.iceServers,});await this._callSessions();await this.updateLocalAudioTrack(startWithAudio);if(startWithVideo){await this._toggleVideoBroadcast({type:videoType});}}
reset(){if(this._peerConnections){const peerTokens=Object.keys(this._peerConnections);for(const token of peerTokens){this._removePeer(token);}}
this._disconnectAudioMonitor&&this._disconnectAudioMonitor();this.audioTrack&&this.audioTrack.stop();this.videoTrack&&this.videoTrack.stop();this._disconnectAudioMonitor=undefined;this._dataChannels={};this._fallBackTimeouts={};this._outGoingCallTokens=new Set();this._peerConnections={};this.update({currentRtcSession:clear(),logs:clear(),sendUserVideo:clear(),sendDisplay:clear(),videoTrack:clear(),audioTrack:clear(),});}
async toggleMicrophone({requestAudioDevice=true}={}){const shouldMute=this.currentRtcSession.isDeaf||!this.currentRtcSession.isMuted;this.currentRtcSession.updateAndBroadcast({isMuted:shouldMute||!this.audioTrack});if(!this.audioTrack&&!shouldMute&&requestAudioDevice){await this.updateLocalAudioTrack(true);}
await this.async(()=>this._updateLocalAudioTrackEnabledState());}
async toggleScreenShare(){this._toggleVideoBroadcast({type:'display'});}
async toggleUserVideo(){this._toggleVideoBroadcast({type:'user-video'});}
async updateLocalAudioTrack(audio){if(this.audioTrack){this.audioTrack.stop();}
this.update({audioTrack:clear()});if(!this.channel){return;}
if(audio){let audioTrack;try{const audioStream=await browser.navigator.mediaDevices.getUserMedia({audio:this.messaging.userSetting.getAudioConstraints()});audioTrack=audioStream.getAudioTracks()[0];}catch(e){this.env.services.notification.notify({message:_.str.sprintf(this.env._t(`"%s" requires microphone access`),window.location.host,),type:'warning',});if(this.currentRtcSession){this.currentRtcSession.updateAndBroadcast({isMuted:true});}
return;}
if(!this.currentRtcSession){audioTrack.stop();return;}
audioTrack.addEventListener('ended',async()=>{await this.async(()=>this.updateLocalAudioTrack(false));this.currentRtcSession.updateAndBroadcast({isMuted:true});await this.async(()=>this._updateLocalAudioTrackEnabledState());});this.currentRtcSession.updateAndBroadcast({isMuted:false});audioTrack.enabled=!this.currentRtcSession.isMuted&&this.currentRtcSession.isTalking;this.update({audioTrack});await this.async(()=>this.updateVoiceActivation());for(const[token,peerConnection]of Object.entries(this._peerConnections)){await this._updateRemoteTrack(peerConnection,'audio',{token});}}}
updateVideoConfig(constraints){const videoConfig=Object.assign(this.videoConfig,constraints);this.update({videoConfig});this.videoTrack&&this.videoTrack.applyConstraints(this.videoConfig);}
async updateVoiceActivation(){this._disconnectAudioMonitor&&this._disconnectAudioMonitor();if(this.messaging.userSetting.usePushToTalk||!this.channel||!this.audioTrack){this.currentRtcSession.update({isTalking:false});await this._updateLocalAudioTrackEnabledState();return;}
try{this._disconnectAudioMonitor=await monitorAudio(this.audioTrack,{onThreshold:async(isAboveThreshold)=>{this._setSoundBroadcast(isAboveThreshold);},volumeThreshold:this.messaging.userSetting.voiceActivationThreshold,});}catch(e){this.env.services.notification.notify({message:this.env._t("Your browser does not support voice activation"),type:'warning',});this.currentRtcSession.update({isTalking:true});}
await this._updateLocalAudioTrackEnabledState();}
_addLogEntry(token,entry,{error,step,state}={}){if(!this.modelManager.isDebug){return;}
if(!(token in this.logs)){this.logs[token]={step:'',state:'',logs:[]};}
const trace=window.Error().stack||'';this.logs[token].logs.push({event:`${window.moment().format('h:mm:ss')}: ${entry}`,error:error&&{name:error.name,message:error.message,stack:error.stack&&error.stack.split('\n'),},trace:trace.split('\n'),});if(step){this.logs[token].step=step;}
if(state){this.logs[token].state=state;}}
async _callPeer(token){const peerConnection=this._createPeerConnection(token);for(const trackKind of TRANSCEIVER_ORDER){await this._updateRemoteTrack(peerConnection,trackKind,{initTransceiver:true,token});}
this._outGoingCallTokens.add(token);}
_callSessions(){if(!this.channel.rtcSessions){return;}
for(const session of this.channel.rtcSessions){if(session.peerToken in this._peerConnections){continue;}
if(session===this.currentRtcSession){continue;}
session.update({connectionState:'Not connected: sending initial RTC offer',});this._addLogEntry(session.peerToken,'init call',{step:'init call'});this._callPeer(session.peerToken);}}
_computeIsClientRtcCompatible(){return window.RTCPeerConnection&&window.MediaStream;}
_createPeerConnection(token){const peerConnection=new window.RTCPeerConnection({iceServers:this.iceServers});this._addLogEntry(token,`RTCPeerConnection created`,{step:'peer connection created'});peerConnection.onicecandidate=async(event)=>{if(!event.candidate){return;}
await this._notifyPeers([token],{event:'ice-candidate',payload:{candidate:event.candidate},});};peerConnection.oniceconnectionstatechange=(event)=>{this._onICEConnectionStateChange(peerConnection.iceConnectionState,token);};peerConnection.onconnectionstatechange=(event)=>{this._onConnectionStateChange(peerConnection.connectionState,token);};peerConnection.onicecandidateerror=async(error)=>{this._addLogEntry(token,`ice candidate error`);this._recoverConnection(token,{delay:this.recoveryTimeout,reason:'ice candidate error'});};peerConnection.onnegotiationneeded=async(event)=>{const offer=await peerConnection.createOffer();try{await peerConnection.setLocalDescription(offer);}catch(e){this._addLogEntry(token,`couldn't setLocalDescription`,{error:e});return;}
this._addLogEntry(token,`sending notification: offer`,{step:'sending offer'});await this._notifyPeers([token],{event:'offer',payload:{sdp:peerConnection.localDescription},});};peerConnection.ontrack=({transceiver,track})=>{this._addLogEntry(token,`received ${track.kind} track`);this._updateExternalSessionTrack(track,token);};const dataChannel=peerConnection.createDataChannel("notifications",{negotiated:true,id:1});dataChannel.onmessage=(event)=>{this.handleNotification(token,event.data);};dataChannel.onopen=async()=>{try{await this._notifyPeers([token],{event:'trackChange',type:'peerToPeer',payload:{type:'audio',state:{isTalking:this.currentRtcSession.isTalking,isMuted:this.currentRtcSession.isMuted},},});}catch(e){if(!(e instanceof DOMException)||e.name!=="OperationError"){throw e;}
this._addLogEntry(token,`failed to send on datachannel; dataChannelInfo: ${this._serializeRTCDataChannel(dataChannel)}`,{error:e});}};this._peerConnections[token]=peerConnection;this._dataChannels[token]=dataChannel;return peerConnection;}
_getTransceiver(peerConnection,trackKind){const transceivers=peerConnection.getTransceivers();return transceivers[TRANSCEIVER_ORDER.indexOf(trackKind)];}
async _handleRtcTransactionAnswer(fromToken,{sdp}){const peerConnection=this._peerConnections[fromToken];if(!peerConnection||this.invalidIceConnectionStates.has(peerConnection.iceConnectionState)||peerConnection.signalingState==='stable'){return;}
if(peerConnection.signalingState==='have-remote-offer'){return;}
const rtcSessionDescription=new window.RTCSessionDescription(sdp);try{await peerConnection.setRemoteDescription(rtcSessionDescription);}catch(e){this._addLogEntry(fromToken,'answer handling: Failed at setting remoteDescription',{error:e});}}
async _handleRtcTransactionICECandidate(fromToken,{candidate}){const peerConnection=this._peerConnections[fromToken];if(!peerConnection||this.invalidIceConnectionStates.has(peerConnection.iceConnectionState)){return;}
const rtcIceCandidate=new window.RTCIceCandidate(candidate);try{await peerConnection.addIceCandidate(rtcIceCandidate);}catch(error){this._addLogEntry(fromToken,'ICE candidate handling: failed at adding the candidate to the connection',{error});this._recoverConnection(fromToken,{delay:this.recoveryTimeout,reason:'failed at adding ice candidate'});}}
async _handleRtcTransactionOffer(fromToken,{sdp}){const peerConnection=this._peerConnections[fromToken]||this._createPeerConnection(fromToken);if(!peerConnection||this.invalidIceConnectionStates.has(peerConnection.iceConnectionState)){return;}
if(peerConnection.signalingState==='have-remote-offer'){return;}
const rtcSessionDescription=new window.RTCSessionDescription(sdp);try{await peerConnection.setRemoteDescription(rtcSessionDescription);}catch(e){this._addLogEntry(fromToken,'offer handling: failed at setting remoteDescription',{error:e});return;}
await this._updateRemoteTrack(peerConnection,'audio',{token:fromToken});await this._updateRemoteTrack(peerConnection,'video',{token:fromToken});let answer;try{answer=await peerConnection.createAnswer();}catch(e){this._addLogEntry(fromToken,'offer handling: failed at creating answer',{error:e});return;}
try{await peerConnection.setLocalDescription(answer);}catch(e){this._addLogEntry(fromToken,'offer handling: failed at setting localDescription',{error:e});return;}
this._addLogEntry(fromToken,`sending notification: answer`,{step:'sending answer'});await this._notifyPeers([fromToken],{event:'answer',payload:{sdp:peerConnection.localDescription},});this._recoverConnection(fromToken,{delay:this.recoveryTimeout,reason:'standard answer timeout'});}
_handleTrackChange(rtcSession,{type,state}){const{isMuted,isTalking,isSendingVideo,isDeaf}=state;if(type==='audio'){if(!rtcSession.audioStream){return;}
rtcSession.update({isMuted,isTalking,isDeaf,});}
if(type==='video'&&isSendingVideo===false){rtcSession.update({videoStream:clear()});}}
async _notifyPeers(targetTokens,{event,payload,type='server'}){if(!targetTokens.length||!this.channel||!this.currentRtcSession){return;}
if(type==='server'){this.update({peerNotificationsToSend:insert({channelId:this.channel.id,event,id:getRTCPeerNotificationNextTemporaryId(),payload,senderId:this.currentRtcSession.id,targetTokens}),});await this._sendPeerNotifications();}
if(type==='peerToPeer'){for(const token of targetTokens){const dataChannel=this._dataChannels[token];if(!dataChannel||dataChannel.readyState!=='open'){continue;}
dataChannel.send(JSON.stringify({event,channelId:this.channel.id,payload,}));}}}
async _pingServer(){const channel=this.channel;const{rtcSessions}=await this.env.services.rpc({route:'/mail/channel/ping',params:{'channel_id':channel.id,'check_rtc_session_ids':channel.rtcSessions.map(rtcSession=>rtcSession.id),'rtc_session_id':this.currentRtcSession.id,},},{shadow:true});if(channel.exists()){channel.updateRtcSessions(rtcSessions);}}
_recoverConnection(token,{delay=0,reason=''}={}){if(this._fallBackTimeouts[token]){return;}
this._fallBackTimeouts[token]=browser.setTimeout(async()=>{delete this._fallBackTimeouts[token];const peerConnection=this._peerConnections[token];if(!peerConnection||!this.channel){return;}
if(this._outGoingCallTokens.has(token)){return;}
if(peerConnection.iceConnectionState==='connected'){return;}
this._addLogEntry(token,`calling back to recover ${peerConnection.iceConnectionState} connection, reason: ${reason}`);await this._notifyPeers([token],{event:'disconnect',});this._removePeer(token);this._callPeer(token);},delay);}
_removePeer(token){const rtcSession=this.messaging.models['mail.rtc_session'].findFromIdentifyingData({id:token});if(rtcSession){rtcSession.reset();}
const dataChannel=this._dataChannels[token];if(dataChannel){dataChannel.close();}
delete this._dataChannels[token];const peerConnection=this._peerConnections[token];if(peerConnection){this._removeRemoteTracks(peerConnection);peerConnection.close();}
delete this._peerConnections[token];browser.clearTimeout(this._fallBackTimeouts[token]);delete this._fallBackTimeouts[token];this._outGoingCallTokens.delete(token);this._addLogEntry(token,'peer removed',{step:'peer removed'});}
_removeRemoteTracks(peerConnection){const RTCRtpSenders=peerConnection.getSenders();for(const sender of RTCRtpSenders){try{peerConnection.removeTrack(sender);}catch(e){}}
for(const transceiver of peerConnection.getTransceivers()){try{transceiver.stop();}catch(e){}}}
async _sendPeerNotifications(){if(this.isNotifyPeersRPCInProgress){return;}
this.update({isNotifyPeersRPCInProgress:true});await new Promise(resolve=>setTimeout(resolve,this.peerNotificationWaitDelay));const peerNotifications=this.peerNotificationsToSend;try{await this.env.services.rpc({route:'/mail/rtc/session/notify_call_members',params:{'peer_notifications':peerNotifications.map(peerNotification=>[peerNotification.senderId,peerNotification.targetTokens,JSON.stringify({event:peerNotification.event,channelId:peerNotification.channelId,payload:peerNotification.payload,}),],),},},{shadow:true});if(!this.exists()){return;}
this.update({peerNotificationsToSend:unlink(peerNotifications)});}finally{if(this.exists()){this.update({isNotifyPeersRPCInProgress:false});if(this.peerNotificationsToSend.length>0){this._sendPeerNotifications();}}}}
_serializeRTCDataChannel(dataChannel){const toLog=["binaryType","bufferedAmount","bufferedAmountLowThreshold","id","label","maxPacketLifeTime","maxRetransmits","negotiated","ordered","protocol","readyState",];return JSON.stringify(Object.fromEntries(toLog.map(p=>[p,dataChannel[p]])));}
async _setSoundBroadcast(isTalking){if(!this.currentRtcSession){return;}
if(isTalking===this.currentRtcSession.isTalking){return;}
this.currentRtcSession.update({isTalking});if(!this.currentRtcSession.isMuted){await this._updateLocalAudioTrackEnabledState();}}
async _toggleVideoBroadcast(trackOptions){if(!this.channel){return;}
await this._toggleLocalVideoTrack(trackOptions);for(const[token,peerConnection]of Object.entries(this._peerConnections)){await this._updateRemoteTrack(peerConnection,'video',{token});}
if(!this.currentRtcSession){return;}
this.currentRtcSession.updateAndBroadcast({isScreenSharingOn:!!this.sendDisplay,isCameraOn:!!this.sendUserVideo,});}
async _toggleLocalVideoTrack({type,force}){if(type==='user-video'){const sendUserVideo=force!==undefined?force:!this.sendUserVideo;await this._updateLocalVideoTrack(type,sendUserVideo);}
if(type==='display'){const sendDisplay=force!==undefined?force:!this.sendDisplay;await this._updateLocalVideoTrack(type,sendDisplay);}
if(!this.currentRtcSession){return;}
if(!this.videoTrack){this.currentRtcSession.removeVideo();}else{this._updateExternalSessionTrack(this.videoTrack,this.currentRtcSession.peerToken);}}
_updateExternalSessionTrack(track,token){const rtcSession=this.messaging.models['mail.rtc_session'].findFromIdentifyingData({id:token});if(!rtcSession){return;}
const stream=new window.MediaStream();stream.addTrack(track);if(track.kind==='audio'){rtcSession.setAudio({audioStream:stream,isMuted:false,isTalking:false,});}
if(track.kind==='video'){rtcSession.update({videoStream:stream,});}}
async _updateLocalAudioTrackEnabledState(){if(!this.audioTrack){return;}
this.audioTrack.enabled=!this.currentRtcSession.isMuted&&this.currentRtcSession.isTalking;await this._notifyPeers(Object.keys(this._peerConnections),{event:'trackChange',type:'peerToPeer',payload:{type:'audio',state:{isTalking:this.currentRtcSession.isTalking&&!this.currentRtcSession.isMuted,isMuted:this.currentRtcSession.isMuted,isDeaf:this.currentRtcSession.isDeaf,},},});}
async _updateLocalVideoTrack(type,activateVideo){if(this.videoTrack){this.videoTrack.stop();}
this.update({sendDisplay:false,sendUserVideo:false,videoTrack:clear(),});let videoStream;if(!activateVideo){if(type==='display'){this.messaging.soundEffects.screenSharing.play();}
return;}
try{if(type==='user-video'){videoStream=await browser.navigator.mediaDevices.getUserMedia({video:this.videoConfig});}
if(type==='display'){videoStream=await browser.navigator.mediaDevices.getDisplayMedia({video:this.videoConfig});this.messaging.soundEffects.screenSharing.play();}}catch(e){this.env.services.notification.notify({message:_.str.sprintf(this.env._t(`"%s" requires "%s" access`),window.location.host,type==='user-video'?'camera':'display',),type:'warning',});return;}
const videoTrack=videoStream?videoStream.getVideoTracks()[0]:undefined;if(videoTrack){videoTrack.addEventListener('ended',async()=>{await this.async(()=>this._toggleVideoBroadcast({force:false,type}));});}
this.update({videoTrack,sendUserVideo:type==='user-video'&&!!videoTrack,sendDisplay:type==='display'&&!!videoTrack,});}
async _updateRemoteTrack(peerConnection,trackKind,{initTransceiver,token}={}){this._addLogEntry(token,`updating ${trackKind} transceiver`);const track=trackKind==='audio'?this.audioTrack:this.videoTrack;const fullDirection=track?'sendrecv':'recvonly';const limitedDirection=track?'sendonly':'inactive';let transceiverDirection=fullDirection;if(trackKind==='video'){const focusedToken=this.messaging.focusedRtcSession&&this.messaging.focusedRtcSession.peerToken;transceiverDirection=!focusedToken||focusedToken===token?fullDirection:limitedDirection;}
let transceiver;if(initTransceiver){transceiver=peerConnection.addTransceiver(trackKind);}else{transceiver=this._getTransceiver(peerConnection,trackKind);}
if(track){try{await transceiver.sender.replaceTrack(track);transceiver.direction=transceiverDirection;}catch(e){}
return;}
try{await transceiver.sender.replaceTrack(null);transceiver.direction=transceiverDirection;}catch(e){}
if(trackKind==='video'){this._notifyPeers([token],{event:'trackChange',type:'peerToPeer',payload:{type:'video',state:{isSendingVideo:false},},});}}
async _onBeforeUnload(ev){if(this.channel){await this.channel.performRpcLeaveCall();}}
async _onConnectionStateChange(state,token){this._addLogEntry(token,`connection state changed: ${state}`);switch(state){case"closed":this._removePeer(token);break;case"failed":case"disconnected":await this._recoverConnection(token,{delay:this.recoveryDelay,reason:`connection ${state}`});break;}}
async _onICEConnectionStateChange(connectionState,token){this._addLogEntry(token,`ICE connection state changed: ${connectionState}`,{state:connectionState});const rtcSession=this.messaging.models['mail.rtc_session'].findFromIdentifyingData({id:token});if(!rtcSession){return;}
rtcSession.update({connectionState,});switch(connectionState){case"closed":this._removePeer(token);break;case"failed":case"disconnected":await this._recoverConnection(token,{delay:this.recoveryDelay,reason:`ice connection ${connectionState}`});break;}}
_onKeyDown(ev){if(!this.channel){return;}
if(this.messaging.userSetting.rtcConfigurationMenu.isRegisteringKey){return;}
if(!this.messaging.userSetting.usePushToTalk||!this.messaging.userSetting.isPushToTalkKey(ev)){return;}
if(this._pushToTalkTimeoutId){browser.clearTimeout(this._pushToTalkTimeoutId);}
if(!this.currentRtcSession.isTalking&&!this.currentRtcSession.isMuted){this.messaging.soundEffects.pushToTalk.play({volume:0.3});}
this._setSoundBroadcast(true);}
_onKeyUp(ev){if(!this.channel){return;}
if(!this.messaging.userSetting.usePushToTalk||!this.messaging.userSetting.isPushToTalkKey(ev,{ignoreModifiers:true})){return;}
if(!this.currentRtcSession.isTalking){return;}
if(!this.currentRtcSession.isMuted){this.messaging.soundEffects.pushToTalk.play({volume:0.3});}
this._pushToTalkTimeoutId=browser.setTimeout(()=>{this._setSoundBroadcast(false);},this.messaging.userSetting.voiceActiveDuration||0,);}}
Rtc.fields={audioTrack:attr(),channel:one2one('mail.thread',{inverse:'rtc',}),currentRtcSession:one2one('mail.rtc_session',{inverse:'rtc',}),iceServers:attr({default:[{urls:['stun:stun1.l.google.com:19302','stun:stun2.l.google.com:19302',],},],}),invalidIceConnectionStates:attr({default:new Set(['disconnected','failed','closed']),readonly:true,}),isClientRtcCompatible:attr({compute:'_computeIsClientRtcCompatible',default:true,}),isNotifyPeersRPCInProgress:attr({default:false,}),logs:attr({default:{},}),peerNotificationsToSend:one2many('mail.rtc_peer_notification',{isCausal:true,}),peerNotificationWaitDelay:attr({default:50,}),recoveryTimeout:attr({default:15000,}),recoveryDelay:attr({default:3000,}),sendUserVideo:attr({default:false,}),sendDisplay:attr({default:false,}),videoConfig:attr({default:{aspectRatio:16/9,frameRate:{max:30,},},}),videoTrack:attr(),};Rtc.identifyingFields=['messaging'];Rtc.modelName='mail.rtc';return Rtc;}
registerNewModel('mail.rtc',factory);return __exports;});;

/* /mail/static/src/models/rtc_call_participant_card/rtc_call_participant_card.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/rtc_call_participant_card/rtc_call_participant_card',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2one,one2one}=require('@mail/model/model_field');const{isEventHandled,markEventHandled}=require('@mail/utils/utils');function factory(dependencies){class RtcCallParticipantCard extends dependencies['mail.model']{_created(){super._created();this.onChangeVolume=this.onChangeVolume.bind(this);this.onClick=this.onClick.bind(this);this.onClickVolumeAnchor=this.onClickVolumeAnchor.bind(this);}
onChangeVolume(ev){this.rtcSession&&this.rtcSession.setVolume(parseFloat(ev.target.value));}
async onClick(ev){if(isEventHandled(ev,'CallParticipantCard.clickVolumeAnchor')){return;}
if(!this.invitedPartner&&!this.invitedGuest){if(!this.isMinimized){this.messaging.toggleFocusedRtcSession(this.rtcSession.id);}
return;}
const channel=this.channel;const channelData=await this.env.services.rpc(({route:'/mail/rtc/channel/cancel_call_invitation',params:{channel_id:this.channel.id,partner_ids:this.invitedPartner&&[this.invitedPartner.id],guest_ids:this.invitedGuest&&[this.invitedGuest.id],},}));if(!channel.exists()){return;}
channel.update(channelData);}
async onClickVolumeAnchor(ev){markEventHandled(ev,'CallParticipantCard.clickVolumeAnchor');}
_computeAvatarUrl(){if(!this.channel){return;}
if(this.rtcSession){return this.rtcSession.avatarUrl;}
if(this.invitedPartner){return`/mail/channel/${this.channel.id}/partner/${this.invitedPartner.id}/avatar_128`;}
if(this.invitedGuest){return`/mail/channel/${this.channel.id}/guest/${this.invitedGuest.id}/avatar_128?unique=${this.invitedGuest.name}`;}}
_computeIsMinimized(){const callViewer=this.rtcCallViewerOfMainCard||this.rtcCallViewerOfTile;return Boolean(callViewer&&callViewer.isMinimized);}
_computeIsInvitation(){return Boolean(this.invitedPartner||this.invitedGuest);}
_computeIsTalking(){return Boolean(this.rtcSession&&this.rtcSession.isTalking&&!this.rtcSession.isMuted);}
_computeName(){if(this.rtcSession){return this.rtcSession.name;}
if(this.invitedPartner){return this.invitedPartner.name;}
if(this.invitedGuest){return this.invitedGuest.name;}}}
RtcCallParticipantCard.fields={avatarUrl:attr({compute:'_computeAvatarUrl',}),channel:many2one('mail.thread',{required:true,}),invitedGuest:many2one('mail.guest'),invitedPartner:many2one('mail.partner'),isInvitation:attr({compute:'_computeIsInvitation'}),isMinimized:attr({default:false,compute:'_computeIsMinimized',}),isTalking:attr({default:false,compute:'_computeIsTalking',}),name:attr({default:'Anonymous',compute:'_computeName',}),relationalId:attr({readonly:true,required:true,}),rtcCallViewerOfMainCard:one2one('mail.rtc_call_viewer',{inverse:'mainParticipantCard',}),rtcCallViewerOfTile:many2one('mail.rtc_call_viewer',{inverse:'tileParticipantCards',}),rtcSession:many2one('mail.rtc_session'),};RtcCallParticipantCard.identifyingFields=['relationalId'];RtcCallParticipantCard.modelName='mail.rtc_call_participant_card';return RtcCallParticipantCard;}
registerNewModel('mail.rtc_call_participant_card',factory);return __exports;});;

/* /mail/static/src/models/rtc_call_viewer/rtc_call_viewer.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/rtc_call_viewer/rtc_call_viewer',async function(require){'use strict';let __exports={};const{browser}=require("@web/core/browser/browser");const{registerNewModel}=require('@mail/model/model_core');const{attr,one2one,one2many}=require('@mail/model/model_field');const{OnChange}=require('@mail/model/model_onchange');const{clear,insert,insertAndReplace,link,unlink}=require('@mail/model/model_field_command');const{isEventHandled,markEventHandled}=require('@mail/utils/utils');function factory(dependencies){class RtcCallViewer extends dependencies['mail.model']{_created(){super._created();this._timeoutId=undefined;this.onClick=this.onClick.bind(this);this.onLayoutSettingsDialogClosed=this.onLayoutSettingsDialogClosed.bind(this);this.onMouseMove=this.onMouseMove.bind(this);this.onMouseMoveOverlay=this.onMouseMoveOverlay.bind(this);this.onRtcSettingsDialogClosed=this.onRtcSettingsDialogClosed.bind(this);this._onFullScreenChange=this._onFullScreenChange.bind(this);browser.addEventListener('fullscreenchange',this._onFullScreenChange);}
_willDelete(){browser.clearTimeout(this._timeoutId);browser.removeEventListener('fullscreenchange',this._onFullScreenChange);return super._willDelete(...arguments);}
onClick(ev){this._showOverlay();}
onLayoutSettingsDialogClosed(ev){this.toggleLayoutMenu();}
onMouseMove(ev){if(!this.exists()){return;}
if(isEventHandled(ev,'RtcCallViewer.MouseMoveOverlay')){return;}
this._showOverlay();}
onMouseMoveOverlay(ev){if(!this.exists()){return;}
markEventHandled(ev,'RtcCallViewer.MouseMoveOverlay');this.update({showOverlay:true,});browser.clearTimeout(this._timeoutId);}
onRtcSettingsDialogClosed(ev){this.messaging.userSetting.rtcConfigurationMenu.toggle();}
async activateFullScreen(){const el=document.body;try{if(el.requestFullscreen){await el.requestFullscreen();}else if(el.mozRequestFullScreen){await el.mozRequestFullScreen();}else if(el.webkitRequestFullscreen){await el.webkitRequestFullscreen();}
if(this.exists()){this.update({isFullScreen:true});}}catch(e){if(this.exists()){this.update({isFullScreen:false});}
this.env.services.notification.notify({message:this.env._t("The FullScreen mode was denied by the browser"),type:'warning',});}}
async deactivateFullScreen(){const fullScreenElement=document.webkitFullscreenElement||document.fullscreenElement;if(fullScreenElement){if(document.exitFullscreen){await document.exitFullscreen();}else if(document.mozCancelFullScreen){await document.mozCancelFullScreen();}else if(document.webkitCancelFullScreen){await document.webkitCancelFullScreen();}}
if(this.exists()){this.update({isFullScreen:false});}}
toggleLayoutMenu(){if(!this.rtcLayoutMenu){this.update({rtcLayoutMenu:insertAndReplace()});return;}
this.update({rtcLayoutMenu:unlink()});}
_computeAspectRatio(){const rtcAspectRatio=this.messaging.rtc.videoConfig&&this.messaging.rtc.videoConfig.aspectRatio;const aspectRatio=rtcAspectRatio||16/9;return this.isMinimized?1:aspectRatio;}
_computeIsControllerFloating(){return(this.isFullScreen||this.layout!=="tiled"&&!this.threadView.compact);}
_computeIsMinimized(){if(!this.threadView){return true;}
if(this.isFullScreen||this.threadView.compact){return false;}
return!this.threadView.thread.rtc||this.threadView.thread.videoCount===0;}
_computeLayout(){if(!this.threadView){return'tiled';}
if(this.isMinimized){return'tiled';}
if(!this.threadView.thread.rtc){return'tiled';}
if(!this.mainParticipantCard){return'tiled';}
if(this.threadView.thread.rtcSessions.length+
this.threadView.thread.invitedPartners.length+
this.threadView.thread.invitedGuests.length<2){return"tiled";}
if(this.threadView.compact&&this.messaging.userSetting.rtcLayout==='sidebar'){return'spotlight';}
return this.messaging.userSetting.rtcLayout;}
_computeLayoutSettingsTitle(){return this.env._t("Change Layout");}
_computeMainParticipantCard(){if(!this.messaging||!this.threadView){return unlink();}
if(this.messaging.focusedRtcSession&&this.messaging.focusedRtcSession.channel===this.threadView.thread){return insert({relationalId:`rtc_session_${this.messaging.focusedRtcSession.localId}_${this.threadView.thread.localId}`,rtcSession:link(this.messaging.focusedRtcSession),channel:link(this.threadView.thread),});}
return unlink();}
_computeSettingsTitle(){return this.env._t("Settings");}
_computeTileParticipantCards(){if(!this.threadView){return clear();}
const tileCards=[];const sessionPartners=new Set();const sessionGuests=new Set();for(const rtcSession of this.threadView.thread.rtcSessions){rtcSession.partner&&sessionPartners.add(rtcSession.partner.id);rtcSession.guest&&sessionPartners.add(rtcSession.guest.id);tileCards.push({relationalId:`rtc_session_${rtcSession.localId}_${this.threadView.thread.localId}`,rtcSession:link(rtcSession),channel:link(this.threadView.thread),});}
for(const partner of this.threadView.thread.invitedPartners){if(sessionPartners.has(partner.id)){continue;}
tileCards.push({relationalId:`invited_partner_${partner.localId}_${this.threadView.thread.localId}`,invitedPartner:link(partner),channel:link(this.threadView.thread),});}
for(const guest of this.threadView.thread.invitedGuests){if(sessionGuests.has(guest.id)){continue;}
tileCards.push({relationalId:`invited_guest_${guest.localId}_${this.threadView.thread.localId}`,invitedGuest:link(guest),channel:link(this.threadView.thread),});}
return insertAndReplace(tileCards);}
_debounce(f,{delay=0}={}){browser.clearTimeout(this._timeoutId);this._timeoutId=browser.setTimeout(()=>{if(!this.exists()){return;}
f();},delay);}
_onChangeRtcChannel(){this.deactivateFullScreen();this.update({filterVideoGrid:false});}
_onChangeVideoCount(){if(this.threadView.thread.videoCount===0){this.update({filterVideoGrid:false});}}
_showOverlay(){this.update({showOverlay:true,});this._debounce(()=>{if(!this.exists()){return;}
this.update({showOverlay:false});},{delay:3000});}
_onFullScreenChange(){const fullScreenElement=document.webkitFullscreenElement||document.fullscreenElement;if(fullScreenElement){this.update({isFullScreen:true});return;}
this.update({isFullScreen:false});}}
RtcCallViewer.fields={aspectRatio:attr({default:16/9,compute:'_computeAspectRatio',}),filterVideoGrid:attr({default:false,}),isControllerFloating:attr({default:false,compute:'_computeIsControllerFloating',}),isFullScreen:attr({default:false,}),isMinimized:attr({default:false,compute:'_computeIsMinimized',}),layout:attr({default:'tiled',compute:'_computeLayout',}),layoutSettingsTitle:attr({compute:'_computeLayoutSettingsTitle',}),mainParticipantCard:one2one('mail.rtc_call_participant_card',{compute:'_computeMainParticipantCard',inverse:'rtcCallViewerOfMainCard',}),rtcController:one2one('mail.rtc_controller',{default:insertAndReplace(),readonly:true,required:true,inverse:'callViewer',isCausal:true,}),rtcLayoutMenu:one2one('mail.rtc_layout_menu',{inverse:'callViewer',isCausal:true,}),settingsTitle:attr({compute:'_computeSettingsTitle',}),showOverlay:attr({default:true,}),threadView:one2one('mail.thread_view',{inverse:'rtcCallViewer',readonly:true,required:true,}),tileParticipantCards:one2many('mail.rtc_call_participant_card',{compute:'_computeTileParticipantCards',inverse:'rtcCallViewerOfTile',}),};RtcCallViewer.identifyingFields=['threadView'];RtcCallViewer.onChanges=[new OnChange({dependencies:['threadView.thread.rtc'],methodName:'_onChangeRtcChannel',}),new OnChange({dependencies:['threadView.thread.videoCount'],methodName:'_onChangeVideoCount',}),];RtcCallViewer.modelName='mail.rtc_call_viewer';return RtcCallViewer;}
registerNewModel('mail.rtc_call_viewer',factory);return __exports;});;

/* /mail/static/src/models/rtc_configuration_menu/rtc_configuration_menu.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/rtc_configuration_menu/rtc_configuration_menu',async function(require){'use strict';let __exports={};const{browser}=require("@web/core/browser/browser");const{registerNewModel}=require('@mail/model/model_core');const{attr,one2one}=require('@mail/model/model_field');function factory(dependencies){class RtcConfigurationMenu extends dependencies['mail.model']{_created(){const res=super._created(...arguments);this._onKeyDown=this._onKeyDown.bind(this);this._onKeyUp=this._onKeyUp.bind(this);browser.addEventListener('keydown',this._onKeyDown);browser.addEventListener('keyup',this._onKeyUp);return res;}
_willDelete(){browser.removeEventListener('keydown',this._onKeyDown);browser.removeEventListener('keyup',this._onKeyUp);return super._willDelete(...arguments);}
onChangeDelay(value){this.userSetting.setDelayValue(value);}
onChangePushToTalk(){if(this.userSetting.usePushToTalk){this.update({isRegisteringKey:false,});}
this.userSetting.togglePushToTalk();}
onChangeSelectAudioInput(value){this.userSetting.setAudioInputDevice(value);}
onChangeThreshold(value){this.userSetting.setThresholdValue(parseFloat(value));}
onClickRegisterKeyButton(){this.update({isRegisteringKey:!this.isRegisteringKey,});}
toggle(){this.update({isOpen:!this.isOpen});}
_onKeyDown(ev){if(!this.isRegisteringKey){return;}
ev.stopPropagation();ev.preventDefault();this.userSetting.setPushToTalkKey(ev);}
_onKeyUp(ev){if(!this.isRegisteringKey){return;}
ev.stopPropagation();ev.preventDefault();this.update({isRegisteringKey:false,});}}
RtcConfigurationMenu.fields={isOpen:attr({default:false,}),isRegisteringKey:attr({default:false,}),userSetting:one2one('mail.user_setting',{inverse:'rtcConfigurationMenu',readonly:true,required:true,}),};RtcConfigurationMenu.identifyingFields=['userSetting'];RtcConfigurationMenu.modelName='mail.rtc_configuration_menu';return RtcConfigurationMenu;}
registerNewModel('mail.rtc_configuration_menu',factory);return __exports;});;

/* /mail/static/src/models/rtc_controller/rtc_controller.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/rtc_controller/rtc_controller',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,one2one}=require('@mail/model/model_field');const{insertAndReplace}=require('@mail/model/model_field_command');function factory(dependencies){class RtcController extends dependencies['mail.model']{_created(){super._created();this.onClickCamera=this.onClickCamera.bind(this);this.onClickDeafen=this.onClickDeafen.bind(this);this.onClickMicrophone=this.onClickMicrophone.bind(this);this.onClickRejectCall=this.onClickRejectCall.bind(this);this.onClickScreen=this.onClickScreen.bind(this);this.onClickToggleAudioCall=this.onClickToggleAudioCall.bind(this);this.onClickToggleVideoCall=this.onClickToggleVideoCall.bind(this);}
onClickCamera(ev){this.messaging.rtc.toggleUserVideo();}
async onClickDeafen(ev){await this.messaging.rtc.currentRtcSession.toggleDeaf();}
onClickMicrophone(ev){this.messaging.rtc.toggleMicrophone();}
async onClickRejectCall(ev){if(this.callViewer.threadView.thread.hasPendingRtcRequest){return;}
await this.callViewer.threadView.thread.leaveCall();}
onClickScreen(ev){this.messaging.rtc.toggleScreenShare();}
async onClickToggleAudioCall(ev){if(this.callViewer.threadView.thread.hasPendingRtcRequest){return;}
await this.callViewer.threadView.thread.toggleCall();}
async onClickToggleVideoCall(ev){if(this.callViewer.threadView.thread.hasPendingRtcRequest){return;}
await this.callViewer.threadView.thread.toggleCall({startWithVideo:true,});}
_computeIsSmall(){return Boolean(this.callViewer&&this.callViewer.threadView.compact&&!this.callViewer.isFullScreen);}}
RtcController.fields={callViewer:one2one('mail.rtc_call_viewer',{inverse:'rtcController',readonly:true,required:true,}),isSmall:attr({compute:'_computeIsSmall',}),rtcOptionList:one2one('mail.rtc_option_list',{default:insertAndReplace(),inverse:'rtcController',isCausal:true,required:true,}),};RtcController.identifyingFields=['callViewer'];RtcController.modelName='mail.rtc_controller';return RtcController;}
registerNewModel('mail.rtc_controller',factory);return __exports;});;

/* /mail/static/src/models/rtc_layout_menu/rtc_layout_menu.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/rtc_layout_menu/rtc_layout_menu',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,one2one}=require('@mail/model/model_field');const{clear}=require('@mail/model/model_field_command');function factory(dependencies){class RtcLayoutMenu extends dependencies['mail.model']{_created(){super._created();this.onClickFilter=this.onClickFilter.bind(this);this.onClickLayout=this.onClickLayout.bind(this);}
onClickFilter(ev){ev.preventDefault();switch(ev.target.value){case'all':this.callViewer.update({filterVideoGrid:false,});break;case'video':this.callViewer.update({filterVideoGrid:true,});if(this.messaging.focusedRtcSession&&!this.messaging.focusedRtcSession.videoStream){this.messaging.update({focusedRtcSession:clear()});}
break;}}
onClickLayout(ev){ev.preventDefault();this.messaging.userSetting.update({rtcLayout:ev.target.value,});this.component.trigger('dialog-closed');}}
RtcLayoutMenu.fields={component:attr(),callViewer:one2one('mail.rtc_call_viewer',{inverse:'rtcLayoutMenu',readonly:true,}),};RtcLayoutMenu.identifyingFields=['callViewer'];RtcLayoutMenu.modelName='mail.rtc_layout_menu';return RtcLayoutMenu;}
registerNewModel('mail.rtc_layout_menu',factory);return __exports;});;

/* /mail/static/src/models/rtc_option_list/rtc_option_list.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/rtc_option_list/rtc_option_list',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,one2one}=require('@mail/model/model_field');function factory(dependencies){class RtcOptionList extends dependencies['mail.model']{_created(){super._created();this.onClickDownloadLogs=this.onClickDownloadLogs.bind(this);this.onClickActivateFullScreen=this.onClickActivateFullScreen.bind(this);this.onClickDeactivateFullScreen=this.onClickDeactivateFullScreen.bind(this);this.onClickLayout=this.onClickLayout.bind(this);this.onClickOptions=this.onClickOptions.bind(this);}
async onClickDownloadLogs(ev){const channel=this.rtcController.callViewer.threadView.thread;if(!channel.rtc){return;}
const data=window.JSON.stringify(channel.rtc.logs);const blob=new window.Blob([data],{type:'application/json'});const url=window.URL.createObjectURL(blob);const a=document.createElement('a');a.href=url;a.download=`RtcLogs_Channel${channel.id}_Session${channel.rtc.currentRtcSession.id}_${window.moment().format('YYYY-MM-DD_HH-mm')}.json`;a.click();window.URL.revokeObjectURL(url);this.component.trigger('o-popover-close');}
onClickActivateFullScreen(ev){this.rtcController.callViewer.activateFullScreen();this.component.trigger('o-popover-close');}
onClickDeactivateFullScreen(ev){this.rtcController.callViewer.deactivateFullScreen();this.component.trigger('o-popover-close');}
onClickLayout(ev){this.rtcController.callViewer.toggleLayoutMenu();this.component.trigger('o-popover-close');}
onClickOptions(ev){this.messaging.userSetting.rtcConfigurationMenu.toggle();this.component.trigger('o-popover-close');}}
RtcOptionList.fields={component:attr(),rtcController:one2one('mail.rtc_controller',{inverse:'rtcOptionList',readonly:true,required:true,}),};RtcOptionList.identifyingFields=['rtcController'];RtcOptionList.modelName='mail.rtc_option_list';return RtcOptionList;}
registerNewModel('mail.rtc_option_list',factory);return __exports;});;

/* /mail/static/src/models/rtc_peer_notification/rtc_peer_notification.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/rtc_peer_notification/rtc_peer_notification',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr}=require('@mail/model/model_field');function factory(dependencies){class RTCPeerNotification extends dependencies['mail.model']{}
RTCPeerNotification.fields={channelId:attr({readonly:true,required:true,}),event:attr({readonly:true,required:true,}),id:attr({readonly:true,required:true,}),payload:attr({readonly:true,}),senderId:attr({readonly:true,required:true,}),targetTokens:attr({readonly:true,required:true,}),};RTCPeerNotification.identifyingFields=['id'];RTCPeerNotification.modelName='mail.rtc_peer_notification';return RTCPeerNotification;}
registerNewModel('mail.rtc_peer_notification',factory);return __exports;});;

/* /mail/static/src/models/rtc_session/rtc_session.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/rtc_session/rtc_session',async function(require){'use strict';let __exports={};const{browser}=require("@web/core/browser/browser");const{registerNewModel}=require('@mail/model/model_core');const{attr,many2one,one2one,one2many}=require('@mail/model/model_field');const{clear}=require('@mail/model/model_field_command');function factory(dependencies){class RtcSession extends dependencies['mail.model']{_created(){super._created();this._timeoutId=undefined;}
_willDelete(){this.reset();return super._willDelete(...arguments);}
reset(){this._timeoutId&&browser.clearTimeout(this._timeoutId);this._removeAudio();this.removeVideo();this.update({audioElement:clear(),isTalking:clear(),});}
removeVideo(){if(this.videoStream){for(const track of this.videoStream.getTracks()||[]){track.stop();}}
this.update({videoStream:clear(),});}
async setAudio({audioStream,isMuted,isTalking}){const audioElement=this.audioElement||new window.Audio();try{audioElement.srcObject=audioStream;}catch(error){this.update({isAudioInError:true});console.error(error);}
audioElement.load();if(this.partner&&this.partner.volumeSetting){audioElement.volume=this.partner.volumeSetting.volume;}else if(this.guest&&this.guest.volumeSetting){audioElement.volume=this.guest.volumeSetting.volume;}else{audioElement.volume=this.volume;}
audioElement.muted=this.messaging.rtc.currentRtcSession.isDeaf;audioElement.autoplay=true;this.update({audioElement,audioStream,isMuted,isTalking,});try{await audioElement.play();if(!this.exists()){return;}
this.update({isAudioInError:false});}catch(error){if(typeof error==='object'&&error.name==='NotAllowedError'){return;}
if(this.exists()){this.update({isAudioInError:true});}
console.error(error);}}
setVolume(volume){this.update({volume});if(this.audioElement){this.audioElement.volume=volume;}
if(this.isOwnSession){return;}
if(this.partner&&this.partner.volumeSetting){this.partner.volumeSetting.update({volume});}
if(this.guest&&this.guest.volumeSetting){this.guest.volumeSetting.update({volume});}
if(this.messaging.isCurrentUserGuest){return;}
this.messaging.userSetting.saveVolumeSetting({partnerId:this.partner&&this.partner.id,guestId:this.guest&&this.guest.id,volume,});}
async toggleDeaf(){if(!this.rtc){return;}
this.updateAndBroadcast({isDeaf:!this.isDeaf,});for(const session of this.messaging.models['mail.rtc_session'].all()){if(!session.audioElement){continue;}
session.audioElement.muted=this.isDeaf;}
if(this.channel.rtc){await this.async(()=>this.channel.rtc.toggleMicrophone({requestAudioDevice:false,}));}}
updateAndBroadcast(data){if(!this.rtc){return;}
this.update(data);this._debounce(async()=>{if(!this.exists()){return;}
await this.async(()=>{this.env.services.rpc({route:'/mail/rtc/session/update_and_broadcast',params:{session_id:this.id,values:{is_camera_on:this.isCameraOn,is_deaf:this.isDeaf,is_muted:this.isMuted,is_screen_sharing_on:this.isScreenSharingOn,},},},{shadow:true});});},3000);}
_computeAvatarUrl(){if(!this.channel){return;}
if(this.partner){return`/mail/channel/${this.channel.id}/partner/${this.partner.id}/avatar_128`;}
if(this.guest){return`/mail/channel/${this.channel.id}/guest/${this.guest.id}/avatar_128?unique=${this.guest.name}`;}}
_computeIsOwnSession(){if(!this.messaging){return;}
return(this.partner&&this.messaging.currentPartner===this.partner)||(this.guest&&this.messaging.currentGuest===this.guest);}
_computeName(){if(this.partner){return this.partner.name;}
if(this.guest){return this.guest.name;}}
_computePeerToken(){return String(this.id);}
_computeVolume(){if(this.partner&&this.partner.volumeSetting){return this.partner.volumeSetting.volume;}else if(this.guest&&this.guest.volumeSetting){return this.guest.volumeSetting.volume;}
if(this.audioElement){return this.audioElement.volume;}}
_debounce(f,delay){this._timeoutId&&browser.clearTimeout(this._timeoutId);this._timeoutId=browser.setTimeout(()=>{if(!this.exists()){return;}
f();},delay);}
_removeAudio(){if(this.audioStream){for(const track of this.audioStream.getTracks()||[]){track.stop();}}
if(this.audioElement){this.audioElement.pause();try{this.audioElement.srcObject=undefined;}catch(error){}}
this.update({audioStream:clear(),isAudioInError:false,});}}
RtcSession.fields={audioElement:attr(),audioStream:attr(),avatarUrl:attr({compute:'_computeAvatarUrl',}),channel:many2one('mail.thread',{inverse:'rtcSessions',}),connectionState:attr({default:'Waiting for the peer to send a RTC offer',}),guest:many2one('mail.guest',{inverse:'rtcSessions',}),id:attr({readonly:true,required:true,}),calledChannels:one2many('mail.thread',{inverse:'rtcInvitingSession',}),isAudioInError:attr({default:false,}),isCameraOn:attr({default:false,}),isDeaf:attr({default:false,}),isMuted:attr({default:false,}),isOwnSession:attr({compute:'_computeIsOwnSession',}),isScreenSharingOn:attr({default:false,}),isTalking:attr({default:false,}),name:attr({compute:'_computeName',}),partner:many2one('mail.partner',{inverse:'rtcSessions',}),peerToken:attr({compute:'_computePeerToken',}),rtc:one2one('mail.rtc',{inverse:'currentRtcSession',}),videoStream:attr(),volume:attr({default:0.5,compute:'_computeVolume',}),};RtcSession.identifyingFields=['id'];RtcSession.modelName='mail.rtc_session';return RtcSession;}
registerNewModel('mail.rtc_session',factory);return __exports;});;

/* /mail/static/src/models/sound_effect/sound_effect.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/sound_effect/sound_effect',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr}=require('@mail/model/model_field');function factory(dependencies){class SoundEffect extends dependencies['mail.model']{play({loop=false,volume=1}={}){if(typeof(Audio)==="undefined"){return;}
if(!this.audio){const audio=new window.Audio();const ext=audio.canPlayType("audio/ogg; codecs=vorbis")?".ogg":".mp3";audio.src=this.path+this.filename+ext;this.update({audio});}
this.audio.pause();this.audio.currentTime=0;this.audio.loop=loop;this.audio.volume=volume;Promise.resolve(this.audio.play()).catch(()=>{});}
stop(){if(this.audio){this.audio.pause();this.audio.currentTime=0;}}}
SoundEffect.fields={audio:attr(),filename:attr({readonly:true,required:true,}),path:attr({default:'/mail/static/src/audio/',readonly:true,required:true,}),};SoundEffect.identifyingFields=['path','filename'];SoundEffect.modelName='mail.sound_effect';return SoundEffect;}
registerNewModel('mail.sound_effect',factory);return __exports;});;

/* /mail/static/src/models/sound_effects/sound_effects.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/sound_effects/sound_effects',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{one2one}=require('@mail/model/model_field');const{insertAndReplace}=require('@mail/model/model_field_command');function factory(dependencies){class SoundEffects extends dependencies['mail.model']{}
SoundEffects.fields={channelJoin:one2one('mail.sound_effect',{default:insertAndReplace({filename:'channel_01_in'}),isCausal:true,}),channelLeave:one2one('mail.sound_effect',{default:insertAndReplace({filename:'channel_04_out'}),isCausal:true,}),incomingCall:one2one('mail.sound_effect',{default:insertAndReplace({filename:'call_02_in_'}),isCausal:true,}),memberLeave:one2one('mail.sound_effect',{default:insertAndReplace({filename:'channel_01_out'}),isCausal:true,}),newMessage:one2one('mail.sound_effect',{default:insertAndReplace({filename:'dm_02'}),isCausal:true,}),pushToTalk:one2one('mail.sound_effect',{default:insertAndReplace({filename:'dm_01'}),isCausal:true,}),screenSharing:one2one('mail.sound_effect',{default:insertAndReplace({filename:'share_02'}),isCausal:true,}),};SoundEffects.identifyingFields=['messaging'];SoundEffects.modelName='mail.sound_effects';return SoundEffects;}
registerNewModel('mail.sound_effects',factory);return __exports;});;

/* /mail/static/src/models/suggested_recipient_info/suggested_recipient_info.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/suggested_recipient_info/suggested_recipient_info',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2one}=require('@mail/model/model_field');function factory(dependencies){class SuggestedRecipientInfo extends dependencies['mail.model']{_computeIsSelected(){return this.partner?this.isSelected:false;}
_computeName(){return this.partner&&this.partner.nameOrDisplayName||this.name;}}
SuggestedRecipientInfo.fields={email:attr({readonly:true,}),id:attr({readonly:true,}),isSelected:attr({compute:'_computeIsSelected',default:true,}),name:attr({compute:'_computeName',}),partner:many2one('mail.partner'),reason:attr(),thread:many2one('mail.thread',{inverse:'suggestedRecipientInfoList',required:true,}),};SuggestedRecipientInfo.identifyingFields=['id'];SuggestedRecipientInfo.modelName='mail.suggested_recipient_info';return SuggestedRecipientInfo;}
registerNewModel('mail.suggested_recipient_info',factory);return __exports;});;

/* /mail/static/src/models/thread/thread.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/thread/thread',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2many,many2one,one2many,one2one}=require('@mail/model/model_field');const{clear,insert,insertAndReplace,link,replace,unlink,unlinkAll}=require('@mail/model/model_field_command');const{OnChange}=require('@mail/model/model_onchange');const throttle=require('@mail/utils/throttle/throttle')[Symbol.for("default")];const Timer=require('@mail/utils/timer/timer')[Symbol.for("default")];const{cleanSearchTerm}=require('@mail/utils/utils');const mailUtils=require('@mail/js/utils');const{str_to_datetime}=require('web.time');function factory(dependencies){const getSuggestedRecipientInfoNextTemporaryId=(function(){let tmpId=0;return()=>{tmpId+=1;return tmpId;};})();class Thread extends dependencies['mail.model']{_willCreate(){const res=super._willCreate(...arguments);this._currentPartnerInactiveTypingTimer=new Timer(this.env,()=>this.async(()=>{if(this.messaging.currentPartner){return this._onCurrentPartnerInactiveTypingTimeout();}}),5*1000);this._currentPartnerLastNotifiedIsTyping=undefined;this._currentPartnerLongTypingTimer=new Timer(this.env,()=>this.async(()=>this._onCurrentPartnerLongTypingTimeout()),50*1000);this._forceNotifyNextCurrentPartnerTypingStatus=false;this._otherMembersLongTypingTimers=new Map();this._throttleNotifyCurrentPartnerTypingStatus=throttle(this.env,({isTyping})=>this.async(()=>this._notifyCurrentPartnerTypingStatus({isTyping})),2.5*1000);return res;}
_created(){super._created();this.onClick=this.onClick.bind(this);this.onClickLoadMoreMembers=this.onClickLoadMoreMembers.bind(this);}
_willDelete(){this._currentPartnerInactiveTypingTimer.clear();this._currentPartnerLongTypingTimer.clear();this._throttleNotifyCurrentPartnerTypingStatus.clear();for(const timer of this._otherMembersLongTypingTimers.values()){timer.clear();}
if(this.isTemporary){for(const message of this.messages){message.delete();}}
return super._willDelete(...arguments);}
async changeDescription(description){this.update({description});return this.env.services.rpc({model:'mail.channel',method:'channel_change_description',args:[[this.id]],kwargs:{description},});}
static computeLastCurrentPartnerMessageSeenByEveryone(thread=undefined){const threads=thread?[thread]:this.messaging.models['mail.thread'].all();threads.map(localThread=>{localThread.update({lastCurrentPartnerMessageSeenByEveryone:localThread._computeLastCurrentPartnerMessageSeenByEveryone(),});});}
static convertData(data){const data2={};if('avatarCacheKey'in data){data2.avatarCacheKey=data.avatarCacheKey;}
if('defaultDisplayMode'in data){data2.defaultDisplayMode=data.defaultDisplayMode;}
if('description'in data){data2.description=data.description;}
if('model'in data){data2.model=data.model;}
if('channel_type'in data){data2.channel_type=data.channel_type;data2.model='mail.channel';}
if('create_uid'in data){data2.creator=insert({id:data.create_uid});}
if('custom_channel_name'in data){data2.custom_channel_name=data.custom_channel_name;}
if('group_based_subscription'in data){data2.group_based_subscription=data.group_based_subscription;}
if('guestMembers'in data){data2.guestMembers=data.guestMembers;}
if('id'in data){data2.id=data.id;}
if('invitedGuests'in data){data2.invitedGuests=data.invitedGuests;}
if('invitedPartners'in data){data2.invitedPartners=data.invitedPartners;}
if('is_minimized'in data&&'state'in data){data2.serverFoldState=data.is_minimized?data.state:'closed';}
if('is_pinned'in data){data2.isServerPinned=data.is_pinned;}
if('last_interest_dt'in data&&data.last_interest_dt){data2.lastInterestDateTime=str_to_datetime(data.last_interest_dt);}
if('last_message'in data&&data.last_message){const messageData=this.messaging.models['mail.message'].convertData({id:data.last_message.id,model:data2.model,res_id:data2.id,});data2.serverLastMessage=insert(messageData);}
if('last_message_id'in data&&data.last_message_id){const messageData=this.messaging.models['mail.message'].convertData({id:data.last_message_id,model:data2.model,res_id:data2.id,});data2.serverLastMessage=insert(messageData);}
if('memberCount'in data){data2.memberCount=data.memberCount;}
if('message_needaction_counter'in data){data2.message_needaction_counter=data.message_needaction_counter;}
if('message_unread_counter'in data){data2.serverMessageUnreadCounter=data.message_unread_counter;}
if('name'in data){data2.name=data.name;}
if('public'in data){data2.public=data.public;}
if('seen_message_id'in data){data2.lastSeenByCurrentPartnerMessageId=data.seen_message_id||0;}
if('uuid'in data){data2.uuid=data.uuid;}
if('members'in data){if(!data.members){data2.members=[unlinkAll()];}else{data2.members=[insertAndReplace(data.members.map(memberData=>this.messaging.models['mail.partner'].convertData(memberData)))];}}
if('rtc_inviting_session'in data){data2.rtcInvitingSession=insert(data.rtc_inviting_session);}
if('rtcSessions'in data){data2.rtcSessions=data.rtcSessions;}
if('seen_partners_info'in data){if(!data.seen_partners_info){data2.partnerSeenInfos=unlinkAll();}else{data2.partnerSeenInfos=insertAndReplace(data.seen_partners_info.map(({fetched_message_id,partner_id,seen_message_id})=>{return{lastFetchedMessage:fetched_message_id?insert({id:fetched_message_id}):unlinkAll(),lastSeenMessage:seen_message_id?insert({id:seen_message_id}):unlinkAll(),partner:insertAndReplace({id:partner_id}),};}));if(data.id||this.id){const messageIds=data.seen_partners_info.reduce((currentSet,{fetched_message_id,seen_message_id})=>{if(fetched_message_id){currentSet.add(fetched_message_id);}
if(seen_message_id){currentSet.add(seen_message_id);}
return currentSet;},new Set());if(messageIds.size>0){data2.messageSeenIndicators=insertAndReplace([...messageIds].map(messageId=>{return{message:insertAndReplace({id:messageId}),};}));}}}}
return data2;}
static async createGroupChat({default_display_mode,partners_to}){const channelData=await this.env.services.rpc({model:'mail.channel',method:'create_group',kwargs:{default_display_mode,partners_to,},});return this.messaging.models['mail.thread'].insert(this.messaging.models['mail.thread'].convertData(channelData));}
endCall(){if(this.rtc){this.rtc.reset();this.messaging.soundEffects.channelLeave.play();}
this.update({rtc:unlink(),rtcInvitingSession:unlink(),});}
static async fetchSuggestions(searchTerm,{thread}={}){const channelsData=await this.env.services.rpc({model:'mail.channel',method:'get_mention_suggestions',kwargs:{search:searchTerm},},{shadow:true},);this.messaging.models['mail.thread'].insert(channelsData.map(channelData=>Object.assign({model:'mail.channel'},this.messaging.models['mail.thread'].convertData(channelData),)));}
static getSuggestionSortFunction(searchTerm,{thread}={}){const cleanedSearchTerm=cleanSearchTerm(searchTerm);return(a,b)=>{const isAPublic=a.model==='mail.channel'&&a.public==='public';const isBPublic=b.model==='mail.channel'&&b.public==='public';if(isAPublic&&!isBPublic){return-1;}
if(!isAPublic&&isBPublic){return 1;}
const isMemberOfA=a.model==='mail.channel'&&a.members.includes(this.messaging.currentPartner);const isMemberOfB=b.model==='mail.channel'&&b.members.includes(this.messaging.currentPartner);if(isMemberOfA&&!isMemberOfB){return-1;}
if(!isMemberOfA&&isMemberOfB){return 1;}
const cleanedAName=cleanSearchTerm(a.name||'');const cleanedBName=cleanSearchTerm(b.name||'');if(cleanedAName.startsWith(cleanedSearchTerm)&&!cleanedBName.startsWith(cleanedSearchTerm)){return-1;}
if(!cleanedAName.startsWith(cleanedSearchTerm)&&cleanedBName.startsWith(cleanedSearchTerm)){return 1;}
if(cleanedAName<cleanedBName){return-1;}
if(cleanedAName>cleanedBName){return 1;}
return a.id-b.id;};}
static async loadPreviews(threads){const channelIds=threads.reduce((list,thread)=>{if(thread.model==='mail.channel'){return list.concat(thread.id);}
return list;},[]);if(channelIds.length===0){return;}
const channelPreviews=await this.env.services.rpc({model:'mail.channel',method:'channel_fetch_preview',args:[channelIds],},{shadow:true});this.messaging.models['mail.message'].insert(channelPreviews.filter(p=>p.last_message).map(channelPreview=>this.messaging.models['mail.message'].convertData(channelPreview.last_message)));}
static async performRpcChannelFold(uuid,state){return this.env.services.rpc({model:'mail.channel',method:'channel_fold',kwargs:{state,uuid,}},{shadow:true});}
static async performRpcChannelInfo({ids}){const channelInfos=await this.env.services.rpc({model:'mail.channel',method:'channel_info',args:[ids],},{shadow:true});const channels=this.messaging.models['mail.thread'].insert(channelInfos.map(channelInfo=>this.messaging.models['mail.thread'].convertData(channelInfo)));return channels;}
static async performRpcChannelSeen({id,lastMessageId}){return this.env.services.rpc({route:`/mail/channel/set_last_seen_message`,params:{channel_id:id,last_message_id:lastMessageId,},},{shadow:true});}
static async performRpcChannelPin({pinned=false,uuid}){return this.env.services.rpc({model:'mail.channel',method:'channel_pin',kwargs:{uuid,pinned,},},{shadow:true});}
static async performRpcCreateChannel({name,privacy}){const device=this.messaging.device;const data=await this.env.services.rpc({model:'mail.channel',method:'channel_create',args:[name,privacy],kwargs:{context:Object.assign({},this.env.session.user_content,{isMobile:device.isMobile,}),},});return this.messaging.models['mail.thread'].insert(this.messaging.models['mail.thread'].convertData(data));}
static async performRpcCreateChat({partnerIds,pinForCurrentPartner}){const device=this.messaging.device;const data=await this.env.services.rpc({model:'mail.channel',method:'channel_get',kwargs:{context:Object.assign({},this.env.session.user_content,{isMobile:device.isMobile,}),partners_to:partnerIds,pin:pinForCurrentPartner,},});if(!data){return;}
return this.messaging.models['mail.thread'].insert(this.messaging.models['mail.thread'].convertData(data));}
async performRpcLeaveCall(){await this.async(()=>this.env.services.rpc({route:'/mail/rtc/channel/leave_call',params:{channel_id:this.id},},{shadow:true}));}
static async performRpcMailGetSuggestedRecipients({model,res_ids}){const data=await this.env.services.rpc({route:'/mail/get_suggested_recipients',params:{model,res_ids,},},{shadow:true});for(const id in data){const recipientInfoList=data[id].map(recipientInfoData=>{const[partner_id,emailInfo,reason]=recipientInfoData;const[name,email]=emailInfo&&mailUtils.parseEmail(emailInfo);return{email,id:getSuggestedRecipientInfoNextTemporaryId(),name,partner:partner_id?insert({id:partner_id}):unlink(),reason,};});this.insert({id:parseInt(id),model,suggestedRecipientInfoList:insertAndReplace(recipientInfoList),});}}
static async searchChannelsToOpen({limit,searchTerm}){const domain=[['channel_type','=','channel'],['name','ilike',searchTerm],];const fields=['channel_type','name'];const channelsData=await this.env.services.rpc({model:"mail.channel",method:"search_read",kwargs:{domain,fields,limit,},});return this.insert(channelsData.map(channelData=>this.convertData(channelData)));}
static searchSuggestions(searchTerm,{thread}={}){let threads;if(thread&&thread.model==='mail.channel'&&thread.public!=='public'){threads=[thread];}else{threads=this.messaging.models['mail.thread'].all();}
const cleanedSearchTerm=cleanSearchTerm(searchTerm);return[threads.filter(thread=>!thread.isTemporary&&thread.model==='mail.channel'&&thread.channel_type==='channel'&&thread.displayName&&cleanSearchTerm(thread.displayName).includes(cleanedSearchTerm))];}
async fetchAttachments(){return this.fetchData(['attachments']);}
async fetchData(requestList){if(this.isTemporary){return;}
const requestSet=new Set(requestList);if(requestSet.has('attachments')){this.update({isLoadingAttachments:true});}
const{attachments:attachmentsData,}=await this.env.services.rpc({route:'/mail/thread/data',params:{request_list:[...requestSet],thread_id:this.id,thread_model:this.model,},},{shadow:true});if(!this.exists()){return;}
const values={};if(attachmentsData){Object.assign(values,{areAttachmentsLoaded:true,isLoadingAttachments:false,originThreadAttachments:insertAndReplace(attachmentsData),});}
this.update(values);}
async fetchAndUpdateSuggestedRecipients(){if(this.isTemporary){return;}
return this.messaging.models['mail.thread'].performRpcMailGetSuggestedRecipients({model:this.model,res_ids:[this.id],});}
async follow(){await this.async(()=>this.env.services.rpc({model:this.model,method:'message_subscribe',args:[[this.id]],kwargs:{partner_ids:[this.messaging.currentPartner.id],},}));this.refreshFollowers();this.fetchAndUpdateSuggestedRecipients();}
async toggleCall(options){this.update({hasPendingRtcRequest:true});const isActiveCall=!!this.rtc;if(this.messaging.rtc.channel){await this.messaging.rtc.channel.leaveCall();}
if(isActiveCall){this.update({hasPendingRtcRequest:false});return;}
await this._joinCall(options);this.update({hasPendingRtcRequest:false});}
async _joinCall({startWithVideo=false,videoType}={}){if(this.model!=='mail.channel'){return;}
if(!this.messaging.rtc.isClientRtcCompatible){this.env.services.notification.notify({message:this.env._t("Your browser does not support webRTC."),type:'warning',});return;}
const{rtcSessions,iceServers,sessionId,invitedPartners,invitedGuests}=await this.async(()=>this.env.services.rpc({route:'/mail/rtc/channel/join_call',params:{channel_id:this.id,check_rtc_session_ids:this.rtcSessions.map(rtcSession=>rtcSession.id),},},{shadow:true}));if(!this.exists()){return;}
this.update({rtc:link(this.messaging.rtc),rtcInvitingSession:unlink(),rtcSessions,invitedGuests,invitedPartners,});await this.async(()=>this.messaging.rtc.initSession({currentSessionId:sessionId,iceServers,startWithAudio:true,startWithVideo,videoType,}));this.messaging.soundEffects.channelJoin.play();}
async leaveCall(){await this.performRpcLeaveCall();this.endCall();}
updateRtcSessions(rtcSessions){const oldCount=this.rtcSessions.length;this.update({rtcSessions});if(this.rtc){const newCount=this.rtcSessions.length;if(newCount>oldCount){this.messaging.soundEffects.channelJoin.play();}
if(newCount<oldCount){this.messaging.soundEffects.memberLeave.play();}}
this.rtc&&this.rtc.filterCallees(this.rtcSessions);if(this.rtc&&!this.rtc.currentRtcSession){this.endCall();}}
getMemberName(partner){return partner.nameOrDisplayName;}
getMentionText(){return this.name;}
async join(){await this.env.services.rpc({model:'mail.channel',method:'add_members',args:[[this.id]],kwargs:{partner_ids:[this.messaging.currentPartner.id]}});}
async leave(){await this.env.services.rpc({model:'mail.channel',method:'action_unfollow',args:[[this.id]],});}
loadNewMessages(){this.cache.loadNewMessages();}
async markAsFetched(){await this.async(()=>this.env.services.rpc({model:'mail.channel',method:'channel_fetched',args:[[this.id]],},{shadow:true}));}
async markAsSeen(message){if(this.messaging.currentGuest){return;}
if(this.model!=='mail.channel'){return;}
if(this.pendingSeenMessageId&&message.id<=this.pendingSeenMessageId){return;}
if(this.lastSeenByCurrentPartnerMessageId&&message.id<=this.lastSeenByCurrentPartnerMessageId){return;}
this.update({pendingSeenMessageId:message.id});return this.messaging.models['mail.thread'].performRpcChannelSeen({id:this.id,lastMessageId:message.id,});}
async markNeedactionMessagesAsOriginThreadAsRead(){await this.async(()=>this.messaging.models['mail.message'].markAsRead(this.needactionMessagesAsOriginThread));}
async notifyFoldStateToServer(state){if(this.model!=='mail.channel'){return;}
if(!this.uuid){return;}
return this.messaging.models['mail.thread'].performRpcChannelFold(this.uuid,state);}
async notifyPinStateToServer(){if(this.channel_type==='channel'){await this.leave();return;}
await this.messaging.models['mail.thread'].performRpcChannelPin({pinned:this.isPendingPinned,uuid:this.uuid,});}
onClickMemberAvatar(member){member.openChat();}
onClickMemberName(member){member.openProfile();}
async open({expanded=false,focus}={}){const discuss=this.messaging.discuss;if(!['mail.box','mail.channel'].includes(this.model)){if(expanded||discuss.isOpen){this.messaging.chatWindowManager.closeThread(this);await this.messaging.openDocument({id:this.id,model:this.model,});return;}}
const device=this.messaging.device;if((!device.isMobile&&(discuss.isOpen||expanded))||this.model==='mail.box'){return discuss.openThread(this,{focus:focus!==undefined?focus:!this.messaging.device.isMobileDevice,});}
return this.messaging.chatWindowManager.openThread(this,{makeActive:true,});}
async openProfile(){return this.messaging.openDocument({id:this.id,model:this.model,});}
async pin(){this.update({isPendingPinned:true});if(this.messaging.currentGuest){return;}
await this.notifyPinStateToServer();}
promptAddPartnerFollower(){this._promptAddFollower();}
async refresh(){if(this.isTemporary){return;}
this.loadNewMessages();await this.async(()=>this.fetchAttachments());}
async refreshActivities(){if(!this.hasActivities){return;}
if(this.isTemporary){return;}
const[{activity_ids:newActivityIds}]=await this.async(()=>this.env.services.rpc({model:this.model,method:'read',args:[this.id,['activity_ids']]},{shadow:true}));const activitiesData=await this.async(()=>this.env.services.rpc({model:'mail.activity',method:'activity_format',args:[newActivityIds]},{shadow:true}));const activities=this.messaging.models['mail.activity'].insert(activitiesData.map(activityData=>this.messaging.models['mail.activity'].convertData(activityData)));this.update({activities:replace(activities)});}
async refreshFollowers(){if(this.isTemporary){this.update({followers:unlinkAll()});return;}
const{followers}=await this.async(()=>this.env.services.rpc({route:'/mail/read_followers',params:{res_id:this.id,res_model:this.model,},},{shadow:true}));this.update({areFollowersLoaded:true});if(followers.length>0){this.update({followers:insertAndReplace(followers.map(data=>this.messaging.models['mail.follower'].convertData(data))),});}else{this.update({followers:unlinkAll(),});}}
refreshCurrentPartnerIsTyping(){this._currentPartnerInactiveTypingTimer.reset();}
refreshOtherMemberTypingMember(partner){this._otherMembersLongTypingTimers.get(partner).reset();}
async registerCurrentPartnerIsTyping(){this._currentPartnerInactiveTypingTimer.start();this._currentPartnerLongTypingTimer.start();const currentPartner=this.messaging.currentPartner;const newOrderedTypingMemberLocalIds=this.orderedTypingMemberLocalIds.filter(localId=>localId!==currentPartner.localId);newOrderedTypingMemberLocalIds.push(currentPartner.localId);this.update({orderedTypingMemberLocalIds:newOrderedTypingMemberLocalIds,typingMembers:link(currentPartner),});await this._throttleNotifyCurrentPartnerTypingStatus({isTyping:true});}
registerOtherMemberTypingMember(partner){const timer=new Timer(this.env,()=>this.async(()=>this._onOtherMemberLongTypingTimeout(partner)),60*1000);this._otherMembersLongTypingTimers.set(partner,timer);timer.start();const newOrderedTypingMemberLocalIds=this.orderedTypingMemberLocalIds.filter(localId=>localId!==partner.localId);newOrderedTypingMemberLocalIds.push(partner.localId);this.update({orderedTypingMemberLocalIds:newOrderedTypingMemberLocalIds,typingMembers:link(partner),});}
async rename(name){this.update({name});return this.env.services.rpc({model:'mail.channel',method:'channel_rename',args:[[this.id]],kwargs:{name},});}
async setCustomName(newName){return this.env.services.rpc({model:'mail.channel',method:'channel_set_custom_name',args:[this.id],kwargs:{name:newName},});}
async unfollow(){const currentPartnerFollower=this.followers.find(follower=>follower.partner===this.messaging.currentPartner);await this.async(()=>currentPartnerFollower.remove());}
async unpin(){this.update({isPendingPinned:false});if(this.messaging.currentGuest){return;}
await this.notifyPinStateToServer();}
async unregisterCurrentPartnerIsTyping({immediateNotify=false}={}){this._currentPartnerInactiveTypingTimer.clear();this._currentPartnerLongTypingTimer.clear();const currentPartner=this.messaging.currentPartner;const newOrderedTypingMemberLocalIds=this.orderedTypingMemberLocalIds.filter(localId=>localId!==currentPartner.localId);this.update({orderedTypingMemberLocalIds:newOrderedTypingMemberLocalIds,typingMembers:unlink(currentPartner),});if(immediateNotify){this._throttleNotifyCurrentPartnerTypingStatus.clear();}
await this.async(()=>this._throttleNotifyCurrentPartnerTypingStatus({isTyping:false}));}
unregisterOtherMemberTypingMember(partner){this._otherMembersLongTypingTimers.get(partner).clear();this._otherMembersLongTypingTimers.delete(partner);const newOrderedTypingMemberLocalIds=this.orderedTypingMemberLocalIds.filter(localId=>localId!==partner.localId);this.update({orderedTypingMemberLocalIds:newOrderedTypingMemberLocalIds,typingMembers:unlink(partner),});}
unsubscribe(){this.leaveCall();this.messaging.chatWindowManager.closeThread(this);this.unpin();}
_computeAllAttachments(){const allAttachments=[...new Set(this.originThreadAttachments.concat(this.attachments))].sort((a1,a2)=>{if(!a1.isUploading&&a2.isUploading){return 1;}
if(a1.isUploading&&!a2.isUploading){return-1;}
return Math.abs(a2.id)-Math.abs(a1.id);});return replace(allAttachments);}
_computeComposer(){if(this.model==='mail.box'){return clear();}
return insertAndReplace();}
_computeCorrespondent(){if(this.channel_type==='channel'){return unlink();}
const correspondents=this.members.filter(partner=>partner!==this.messaging.currentPartner);if(correspondents.length===1){return link(correspondents[0]);}
if(this.members.length===1){return link(this.members[0]);}
return unlink();}
_computeDiscussSidebarCategoryItem(){if(this.model!=='mail.channel'){return clear();}
if(!this.isPinned){return clear();}
const discussSidebarCategory=this._getDiscussSidebarCategory();if(!discussSidebarCategory){return clear();}
return insertAndReplace({category:replace(discussSidebarCategory)});}
_computeDisplayName(){if(this.channel_type==='chat'&&this.correspondent){return this.custom_channel_name||this.correspondent.nameOrDisplayName;}
if(this.channel_type==='group'&&!this.name){const partnerNames=this.members.map(partner=>partner.nameOrDisplayName);const guestNames=this.guestMembers.map(guest=>guest.name);return[...partnerNames,...guestNames].join(this.env._t(", "));}
return this.name;}
_computeFetchMessagesParams(){if(this.model==='mail.box'){return{};}
if(this.model==='mail.channel'){return{'channel_id':this.id};}
return{'thread_id':this.id,'thread_model':this.model,};}
_computeFetchMessagesUrl(){switch(this){case this.messaging.inbox:return'/mail/inbox/messages';case this.messaging.history:return'/mail/history/messages';case this.messaging.starred:return'/mail/starred/messages';}
if(this.model==='mail.channel'){return`/mail/channel/messages`;}
return`/mail/thread/messages`;}
_computeFutureActivities(){return replace(this.activities.filter(activity=>activity.state==='planned'));}
_computeHasCallFeature(){return['channel','chat','group'].includes(this.channel_type);}
_computeHasInviteFeature(){return this.model==='mail.channel';}
_computeHasSeenIndicators(){if(this.model!=='mail.channel'){return false;}
return['chat','livechat'].includes(this.channel_type);}
_computeIsChannelDescriptionChangeable(){return this.model==='mail.channel'&&['channel','group'].includes(this.channel_type);}
_computeIsDescriptionEditableByCurrentUser(){return Boolean(this.messaging.currentUser&&this.messaging.currentUser.isInternalUser&&this.isChannelDescriptionChangeable);}
_computeIsChannelRenamable(){return(this.model==='mail.channel'&&['chat','channel','group'].includes(this.channel_type));}
_computeHasMemberListFeature(){return this.model==='mail.channel'&&['channel','group'].includes(this.channel_type);}
_computeInvitationLink(){if(!this.uuid||!this.channel_type||this.channel_type==='chat'){return clear();}
return`${window.location.origin}/chat/${this.id}/${this.uuid}`;}
_computeIsChatChannel(){return this.channel_type==='chat'||this.channel_type==='group';}
_computeIsCurrentPartnerFollowing(){return this.followers.some(follower=>follower.partner&&follower.partner===this.messaging.currentPartner);}
_computeIsPinned(){return this.isPendingPinned!==undefined?this.isPendingPinned:this.isServerPinned;}
_computeLastCurrentPartnerMessageSeenByEveryone(){const otherPartnerSeenInfos=this.partnerSeenInfos.filter(partnerSeenInfo=>partnerSeenInfo.partner!==this.messaging.currentPartner);if(otherPartnerSeenInfos.length===0){return unlinkAll();}
const otherPartnersLastSeenMessageIds=otherPartnerSeenInfos.map(partnerSeenInfo=>partnerSeenInfo.lastSeenMessage?partnerSeenInfo.lastSeenMessage.id:0);if(otherPartnersLastSeenMessageIds.length===0){return unlinkAll();}
const lastMessageSeenByAllId=Math.min(...otherPartnersLastSeenMessageIds);const currentPartnerOrderedSeenMessages=this.orderedNonTransientMessages.filter(message=>message.author===this.messaging.currentPartner&&message.id<=lastMessageSeenByAllId);if(!currentPartnerOrderedSeenMessages||currentPartnerOrderedSeenMessages.length===0){return unlinkAll();}
return link(currentPartnerOrderedSeenMessages.slice().pop());}
_computeLastMessage(){const{length:l,[l-1]:lastMessage,}=this.orderedMessages;if(lastMessage){return link(lastMessage);}
return unlink();}
_computeLastNonTransientMessage(){const{length:l,[l-1]:lastMessage,}=this.orderedNonTransientMessages;if(lastMessage){return link(lastMessage);}
return unlink();}
_computeLastSeenByCurrentPartnerMessageId(){const firstMessage=this.orderedMessages[0];if(firstMessage&&this.lastSeenByCurrentPartnerMessageId&&this.lastSeenByCurrentPartnerMessageId<firstMessage.id){return this.lastSeenByCurrentPartnerMessageId;}
let lastSeenByCurrentPartnerMessageId=this.lastSeenByCurrentPartnerMessageId;for(const message of this.orderedMessages){if(message.id<=this.lastSeenByCurrentPartnerMessageId){continue;}
if((message.author&&this.messaging.currentPartner&&message.author===this.messaging.currentPartner)||(message.guestAuthor&&this.messaging.currentGuest&&message.guestAuthor===this.messaging.currentGuest)||message.isTransient){lastSeenByCurrentPartnerMessageId=message.id;continue;}
return lastSeenByCurrentPartnerMessageId;}
return lastSeenByCurrentPartnerMessageId;}
_computeLastNeedactionMessageAsOriginThread(){const orderedNeedactionMessagesAsOriginThread=this.needactionMessagesAsOriginThread.sort((m1,m2)=>m1.id<m2.id?-1:1);const{length:l,[l-1]:lastNeedactionMessageAsOriginThread,}=orderedNeedactionMessagesAsOriginThread;if(lastNeedactionMessageAsOriginThread){return link(lastNeedactionMessageAsOriginThread);}
return unlink();}
_computeLocalMessageUnreadCounter(){if(this.model!=='mail.channel'){return clear();}
let baseCounter=this.serverMessageUnreadCounter;let countFromId=this.serverLastMessage?this.serverLastMessage.id:0;const firstMessage=this.orderedMessages[0];if(firstMessage&&this.lastSeenByCurrentPartnerMessageId&&this.lastSeenByCurrentPartnerMessageId>=firstMessage.id){baseCounter=0;countFromId=this.lastSeenByCurrentPartnerMessageId;}
return this.orderedMessages.reduce((total,message)=>{if(message.id<=countFromId){return total;}
return total+1;},baseCounter);}
_computeMessagingAsRingingThread(){if(this.rtcInvitingSession){return replace(this.messaging);}
return clear();}
_computeMessagingMenuAsPinnedAndUnreadChannel(){if(!this.messaging.messagingMenu){return clear();}
return(this.model==='mail.channel'&&this.isPinned&&this.localMessageUnreadCounter>0)?replace(this.messaging.messagingMenu):clear();}
_computeNeedactionMessagesAsOriginThread(){return replace(this.messagesAsOriginThread.filter(message=>message.isNeedaction));}
_computeMessageAfterNewMessageSeparator(){if(this.model!=='mail.channel'){return unlink();}
if(this.localMessageUnreadCounter===0){return unlink();}
const index=this.orderedMessages.findIndex(message=>message.id===this.lastSeenByCurrentPartnerMessageId);if(index===-1){return unlink();}
const message=this.orderedMessages[index+1];if(!message){return unlink();}
return link(message);}
_computeOrderedOfflineMembers(){return replace(this._sortMembers(this.members.filter(member=>!member.isOnline)));}
_computeOrderedOnlineMembers(){return replace(this._sortMembers(this.members.filter(member=>member.isOnline)));}
_computeOrderedMessages(){return replace(this.messages.sort((m1,m2)=>m1.id<m2.id?-1:1));}
_computeOrderedNonTransientMessages(){return replace(this.orderedMessages.filter(m=>!m.isTransient));}
_computeOrderedOtherTypingMembers(){return replace(this.orderedTypingMembers.filter(member=>member!==this.messaging.currentPartner));}
_computeOrderedTypingMembers(){return[['replace',this.orderedTypingMemberLocalIds.map(localId=>this.messaging.models['mail.partner'].get(localId)).filter(member=>!!member),]];}
_computeOverdueActivities(){return replace(this.activities.filter(activity=>activity.state==='overdue'));}
_computeTodayActivities(){return replace(this.activities.filter(activity=>activity.state==='today'));}
_computeTypingStatusText(){if(this.orderedOtherTypingMembers.length===0){return this.constructor.fields.typingStatusText.default;}
if(this.orderedOtherTypingMembers.length===1){return _.str.sprintf(this.env._t("%s is typing..."),this.getMemberName(this.orderedOtherTypingMembers[0]));}
if(this.orderedOtherTypingMembers.length===2){return _.str.sprintf(this.env._t("%s and %s are typing..."),this.getMemberName(this.orderedOtherTypingMembers[0]),this.getMemberName(this.orderedOtherTypingMembers[1]));}
return _.str.sprintf(this.env._t("%s, %s and more are typing..."),this.getMemberName(this.orderedOtherTypingMembers[0]),this.getMemberName(this.orderedOtherTypingMembers[1]));}
_computeUnknownMemberCount(){return this.memberCount-this.members.length;}
_computeUrl(){const baseHref=this.env.session.url('/web');if(this.model==='mail.channel'){return`${baseHref}#action=mail.action_discuss&active_id=${this.model}_${this.id}`;}
return`${baseHref}#model=${this.model}&id=${this.id}`;}
_computeVideoCount(){return this.rtcSessions.filter(session=>session.videoStream).length;}
_getDiscussSidebarCategory(){switch(this.channel_type){case'channel':return this.messaging.discuss.categoryChannel;case'chat':case'group':return this.messaging.discuss.categoryChat;}}
async _notifyCurrentPartnerTypingStatus({isTyping}){if(this._forceNotifyNextCurrentPartnerTypingStatus||isTyping!==this._currentPartnerLastNotifiedIsTyping){if(this.model==='mail.channel'){await this.async(()=>this.env.services.rpc({model:'mail.channel',method:'notify_typing',args:[this.id],kwargs:{is_typing:isTyping},},{shadow:true}));}
if(isTyping&&this._currentPartnerLongTypingTimer.isRunning){this._currentPartnerLongTypingTimer.reset();}}
this._forceNotifyNextCurrentPartnerTypingStatus=false;this._currentPartnerLastNotifiedIsTyping=isTyping;}
_onChangeLastSeenByCurrentPartnerMessageId(){this.messaging.messagingBus.trigger('o-thread-last-seen-by-current-partner-message-id-changed',{thread:this,});}
_onIsServerPinnedChanged(){if(this.isServerPinned===this.isPendingPinned){this.update({isPendingPinned:clear()});}}
_onServerFoldStateChanged(){if(!this.messaging.chatWindowManager){return;}
if(this.messaging.device.isMobile){return;}
if(this.serverFoldState==='closed'){this.messaging.chatWindowManager.closeThread(this,{notifyServer:false,});}else{this.messaging.chatWindowManager.openThread(this,{isFolded:this.serverFoldState==='folded',notifyServer:false,});}}
_promptAddFollower(){const action={type:'ir.actions.act_window',res_model:'mail.wizard.invite',view_mode:'form',views:[[false,'form']],name:this.env._t("Invite Follower"),target:'new',context:{default_res_model:this.model,default_res_id:this.id,},};this.env.bus.trigger('do-action',{action,options:{on_close:async()=>{await this.async(()=>this.refreshFollowers());this.env.bus.trigger('mail.thread:promptAddFollower-closed');},},});}
_sortGuestMembers(){return[['defined-first','name'],['case-insensitive-asc','name'],];}
_sortPartnerMembers(){return[['defined-first','nameOrDisplayName'],['case-insensitive-asc','nameOrDisplayName'],];}
_sortMembers(members){return[...members].sort((a,b)=>{const cleanedAName=cleanSearchTerm(a.nameOrDisplayName||'');const cleanedBName=cleanSearchTerm(b.nameOrDisplayName||'');if(cleanedAName<cleanedBName){return-1;}
if(cleanedAName>cleanedBName){return 1;}
return a.id-b.id;});}
async onClick(){await this.open();}
async onClickLoadMoreMembers(){const members=await this.env.services.rpc({model:'mail.channel',method:'load_more_members',args:[[this.id]],kwargs:{'known_member_ids':this.members.map(partner=>partner.id),},});this.update({members});}
async _onCurrentPartnerInactiveTypingTimeout(){await this.async(()=>this.unregisterCurrentPartnerIsTyping());}
async _onCurrentPartnerLongTypingTimeout(){this._forceNotifyNextCurrentPartnerTypingStatus=true;this._throttleNotifyCurrentPartnerTypingStatus.clear();await this.async(()=>this._throttleNotifyCurrentPartnerTypingStatus({isTyping:true}));}
async _onOtherMemberLongTypingTimeout(partner){if(!this.typingMembers.includes(partner)){this._otherMembersLongTypingTimers.delete(partner);return;}
this.unregisterOtherMemberTypingMember(partner);}}
Thread.fields={activities:one2many('mail.activity',{inverse:'thread',}),allAttachments:many2many('mail.attachment',{compute:'_computeAllAttachments',}),areAttachmentsLoaded:attr({default:false,}),areFollowersLoaded:attr({default:false,}),attachments:many2many('mail.attachment',{inverse:'threads',}),avatarCacheKey:attr(),cache:one2one('mail.thread_cache',{default:insertAndReplace(),inverse:'thread',isCausal:true,readonly:true,required:true,}),channel_type:attr(),chatWindow:one2one('mail.chat_window',{inverse:'thread',isCausal:true,}),composer:one2one('mail.composer',{compute:'_computeComposer',inverse:'thread',isCausal:true,readonly:true,}),correspondent:many2one('mail.partner',{compute:'_computeCorrespondent',}),counter:attr({default:0,}),creator:many2one('mail.user'),custom_channel_name:attr(),defaultDisplayMode:attr(),description:attr(),discussSidebarCategoryItem:one2one('mail.discuss_sidebar_category_item',{compute:'_computeDiscussSidebarCategoryItem',inverse:'channel',isCausal:true,readonly:true,}),displayName:attr({compute:'_computeDisplayName',}),fetchMessagesParams:attr({compute:'_computeFetchMessagesParams',}),fetchMessagesUrl:attr({compute:'_computeFetchMessagesUrl',}),followersPartner:many2many('mail.partner',{related:'followers.partner',}),followers:one2many('mail.follower',{inverse:'followedThread',}),futureActivities:one2many('mail.activity',{compute:'_computeFutureActivities',}),group_based_subscription:attr({default:false,}),guestMembers:many2many('mail.guest',{sort:'_sortGuestMembers',}),hasActivities:attr({default:false,}),hasCallFeature:attr({compute:'_computeHasCallFeature',}),hasInviteFeature:attr({compute:'_computeHasInviteFeature',}),hasMemberListFeature:attr({compute:'_computeHasMemberListFeature',}),hasPendingRtcRequest:attr({default:false,}),hasSeenIndicators:attr({compute:'_computeHasSeenIndicators',default:false,}),id:attr({readonly:true,required:true,}),invitationLink:attr({compute:'_computeInvitationLink',}),invitedGuests:many2many('mail.guest'),invitedPartners:many2many('mail.partner'),isChannelDescriptionChangeable:attr({compute:'_computeIsChannelDescriptionChangeable',}),isChannelRenamable:attr({compute:'_computeIsChannelRenamable',}),isChatChannel:attr({compute:'_computeIsChatChannel',default:false,}),isCurrentPartnerFollowing:attr({compute:'_computeIsCurrentPartnerFollowing',default:false,}),isDescriptionEditableByCurrentUser:attr({compute:'_computeIsDescriptionEditableByCurrentUser',}),isLoadingAttachments:attr({default:false,}),isPendingPinned:attr(),isPinned:attr({compute:'_computeIsPinned',}),isServerPinned:attr({default:false,}),isTemporary:attr({default:false,}),lastInterestDateTime:attr(),lastCurrentPartnerMessageSeenByEveryone:many2one('mail.message',{compute:'_computeLastCurrentPartnerMessageSeenByEveryone',}),lastMessage:many2one('mail.message',{compute:'_computeLastMessage',}),lastNeedactionMessageAsOriginThread:many2one('mail.message',{compute:'_computeLastNeedactionMessageAsOriginThread',}),lastNonTransientMessage:many2one('mail.message',{compute:'_computeLastNonTransientMessage',}),lastSeenByCurrentPartnerMessageId:attr({compute:'_computeLastSeenByCurrentPartnerMessageId',default:0,}),localMessageUnreadCounter:attr({compute:'_computeLocalMessageUnreadCounter',}),memberCount:attr(),members:many2many('mail.partner',{inverse:'memberThreads',sort:'_sortPartnerMembers',}),mentionedChannelsBackup:many2many('mail.thread'),mentionedPartnersBackup:many2many('mail.partner'),messageAfterNewMessageSeparator:many2one('mail.message',{compute:'_computeMessageAfterNewMessageSeparator',}),message_needaction_counter:attr({default:0,}),messages:many2many('mail.message',{inverse:'threads',readonly:true,}),messagesAsOriginThread:one2many('mail.message',{inverse:'originThread',isCausal:true,}),messageSeenIndicators:one2many('mail.message_seen_indicator',{inverse:'thread',isCausal:true,}),messagingAsRingingThread:many2one('mail.messaging',{compute:'_computeMessagingAsRingingThread',inverse:'ringingThreads',readonly:true,}),messagingMenuAsPinnedAndUnreadChannel:many2one('mail.messaging_menu',{compute:'_computeMessagingMenuAsPinnedAndUnreadChannel',inverse:'pinnedAndUnreadChannels',readonly:true,}),model:attr({readonly:true,required:true,}),model_name:attr(),moduleIcon:attr(),name:attr(),needactionMessagesAsOriginThread:many2many('mail.message',{compute:'_computeNeedactionMessagesAsOriginThread',}),orderedOfflineMembers:many2many('mail.partner',{compute:'_computeOrderedOfflineMembers',}),orderedOnlineMembers:many2many('mail.partner',{compute:'_computeOrderedOnlineMembers',}),orderedMessages:many2many('mail.message',{compute:'_computeOrderedMessages',}),orderedNonTransientMessages:many2many('mail.message',{compute:'_computeOrderedNonTransientMessages',}),orderedOtherTypingMembers:many2many('mail.partner',{compute:'_computeOrderedOtherTypingMembers',}),orderedTypingMembers:many2many('mail.partner',{compute:'_computeOrderedTypingMembers',}),orderedTypingMemberLocalIds:attr({default:[],}),originThreadAttachments:one2many('mail.attachment',{inverse:'originThread',isCausal:true,}),overdueActivities:one2many('mail.activity',{compute:'_computeOverdueActivities',}),partnerSeenInfos:one2many('mail.thread_partner_seen_info',{inverse:'thread',isCausal:true,}),pendingSeenMessageId:attr(),public:attr(),rtc:one2one('mail.rtc',{inverse:'channel',}),rtcInvitingSession:many2one('mail.rtc_session',{inverse:'calledChannels',}),rtcSessions:one2many('mail.rtc_session',{inverse:'channel',isCausal:true,}),serverFoldState:attr({default:'closed',}),serverLastMessage:many2one('mail.message'),serverMessageUnreadCounter:attr({default:0,}),suggestedRecipientInfoList:one2many('mail.suggested_recipient_info',{inverse:'thread',isCausal:true,}),textInputContentBackup:attr({default:"",}),textInputCursorEndBackup:attr({default:0,}),textInputCursorStartBackup:attr({default:0,}),textInputSelectionDirectionBackup:attr({default:"none",}),threadViews:one2many('mail.thread_view',{inverse:'thread',}),todayActivities:one2many('mail.activity',{compute:'_computeTodayActivities',}),typingMembers:many2many('mail.partner'),typingStatusText:attr({compute:'_computeTypingStatusText',default:'',}),unknownMemberCount:attr({compute:'_computeUnknownMemberCount',}),url:attr({compute:'_computeUrl',default:'',}),uuid:attr(),videoCount:attr({compute:'_computeVideoCount',default:0,}),};Thread.identifyingFields=['model','id'];Thread.onChanges=[new OnChange({dependencies:['lastSeenByCurrentPartnerMessageId'],methodName:'_onChangeLastSeenByCurrentPartnerMessageId',}),new OnChange({dependencies:['isServerPinned'],methodName:'_onIsServerPinnedChanged',}),new OnChange({dependencies:['serverFoldState'],methodName:'_onServerFoldStateChanged',}),];Thread.modelName='mail.thread';return Thread;}
registerNewModel('mail.thread',factory);return __exports;});;

/* /mail/static/src/models/thread_cache/thread_cache.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/thread_cache/thread_cache',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2many,many2one,one2many,one2one}=require('@mail/model/model_field');const{link,replace,unlink,unlinkAll}=require('@mail/model/model_field_command');const{OnChange}=require('@mail/model/model_onchange');function factory(dependencies){class ThreadCache extends dependencies['mail.model']{async loadMoreMessages(){if(this.isAllHistoryLoaded||this.isLoading){return;}
if(!this.isLoaded){this.update({isCacheRefreshRequested:true});return;}
this.update({isLoadingMore:true});const messageIds=this.fetchedMessages.map(message=>message.id);const limit=30;let fetchedMessages;let success;try{fetchedMessages=await this._loadMessages({limit,maxId:Math.min(...messageIds)});success=true;}catch(e){success=false;}
if(!this.exists()){return;}
if(success){if(fetchedMessages.length<limit){this.update({isAllHistoryLoaded:true});}
for(const threadView of this.threadViews){threadView.addComponentHint('more-messages-loaded',{fetchedMessages});}}
this.update({isLoadingMore:false});}
async loadNewMessages(){if(this.isLoading){return;}
if(!this.isLoaded){this.update({isCacheRefreshRequested:true});return;}
const messageIds=this.fetchedMessages.map(message=>message.id);const fetchedMessages=this._loadMessages({minId:Math.max(...messageIds,0)});if(!fetchedMessages||fetchedMessages.length===0){return;}
for(const threadView of this.threadViews){threadView.addComponentHint('new-messages-loaded',{fetchedMessages});}
return fetchedMessages;}
_computeFetchedMessages(){if(!this.thread){return unlinkAll();}
const toUnlinkMessages=[];for(const message of this.fetchedMessages){if(!this.thread.messages.includes(message)){toUnlinkMessages.push(message);}}
return unlink(toUnlinkMessages);}
_computeLastFetchedMessage(){const{length:l,[l-1]:lastFetchedMessage,}=this.orderedFetchedMessages;if(!lastFetchedMessage){return unlink();}
return link(lastFetchedMessage);}
_computeLastMessage(){const{length:l,[l-1]:lastMessage,}=this.orderedMessages;if(!lastMessage){return unlink();}
return link(lastMessage);}
_computeMessages(){if(!this.thread){return unlinkAll();}
let newerMessages;if(!this.lastFetchedMessage){newerMessages=this.thread.messages;}else{newerMessages=this.thread.messages.filter(message=>message.id>this.lastFetchedMessage.id);}
return replace(this.fetchedMessages.concat(newerMessages));}
_computeOrderedFetchedMessages(){return replace(this.fetchedMessages.sort((m1,m2)=>m1.id<m2.id?-1:1));}
_computeOrderedMessages(){return replace(this.messages.sort((m1,m2)=>m1.id<m2.id?-1:1));}
_computeOrderedNonEmptyMessages(){return replace(this.orderedMessages.filter(message=>!message.isEmpty));}
_computeHasToLoadMessages(){const res={hasToLoadMessages:false};if(!this.thread){return res;}
if(this.hasLoadingFailed){return res;}
const wasCacheRefreshRequested=this.isCacheRefreshRequested;if(this.isCacheRefreshRequested){res.isCacheRefreshRequested=false;}
if(this.thread.isTemporary){return res;}
if(!wasCacheRefreshRequested&&this.threadViews.length===0){return res;}
if(this.isLoading){return res;}
if(!wasCacheRefreshRequested&&this.isLoaded){return res;}
if(this.isLoaded){return res;}
res.hasToLoadMessages=true;return res;}
async _loadMessages({limit=30,maxId,minId}={}){this.update({isLoading:true});let messages;try{messages=await this.messaging.models['mail.message'].performRpcMessageFetch(this.thread.fetchMessagesUrl,{...this.thread.fetchMessagesParams,limit,'max_id':maxId,'min_id':minId,});}catch(e){if(this.exists()){this.update({hasLoadingFailed:true,isLoading:false,});}
throw e;}
if(!this.exists()){return;}
this.update({fetchedMessages:link(messages),hasLoadingFailed:false,isLoaded:true,isLoading:false,});if(!minId&&messages.length<limit){this.update({isAllHistoryLoaded:true});}
this.messaging.messagingBus.trigger('o-thread-cache-loaded-messages',{fetchedMessages:messages,threadCache:this,});return messages;}
_onChangeForHasToLoadMessages(){this.update(this._computeHasToLoadMessages());}
_onChangeMarkAllAsRead(){if(this.messaging.currentGuest){return;}
if(!this.isMarkAllAsReadRequested||!this.isLoaded||this.isLoading){return;}
this.update({isMarkAllAsReadRequested:false});if(this.thread.isTemporary||this.thread.model==='mail.box'||this.threadViews.length===0){return;}
this.messaging.models['mail.message'].markAllAsRead([['model','=',this.thread.model],['res_id','=',this.thread.id],]);}
async _onHasToLoadMessagesChanged(){if(!this.hasToLoadMessages){return;}
const fetchedMessages=await this._loadMessages();for(const threadView of this.threadViews){threadView.addComponentHint('messages-loaded',{fetchedMessages});}}}
ThreadCache.fields={fetchedMessages:many2many('mail.message',{compute:'_computeFetchedMessages',}),hasLoadingFailed:attr({default:false,}),hasToLoadMessages:attr(),isAllHistoryLoaded:attr({default:false,}),isLoaded:attr({default:false,}),isLoading:attr({default:false,}),isLoadingMore:attr({default:false,}),isCacheRefreshRequested:attr({default:false,}),isMarkAllAsReadRequested:attr({default:false,}),lastFetchedMessage:many2one('mail.message',{compute:'_computeLastFetchedMessage',}),lastMessage:many2one('mail.message',{compute:'_computeLastMessage',}),messages:many2many('mail.message',{compute:'_computeMessages',}),orderedFetchedMessages:many2many('mail.message',{compute:'_computeOrderedFetchedMessages',}),orderedMessages:many2many('mail.message',{compute:'_computeOrderedMessages',}),orderedNonEmptyMessages:many2many('mail.message',{compute:'_computeOrderedNonEmptyMessages',}),thread:one2one('mail.thread',{inverse:'cache',readonly:true,required:true,}),threadViews:one2many('mail.thread_view',{inverse:'threadCache',}),};ThreadCache.identifyingFields=['thread'];ThreadCache.onChanges=[new OnChange({dependencies:['hasLoadingFailed','isCacheRefreshRequested','isLoaded','isLoading','thread.isTemporary','threadViews'],methodName:'_onChangeForHasToLoadMessages',}),new OnChange({dependencies:['isLoaded','isLoading','isMarkAllAsReadRequested','thread.isTemporary','thread.model','threadViews'],methodName:'_onChangeMarkAllAsRead',}),new OnChange({dependencies:['hasToLoadMessages'],methodName:'_onHasToLoadMessagesChanged',}),];ThreadCache.modelName='mail.thread_cache';return ThreadCache;}
registerNewModel('mail.thread_cache',factory);return __exports;});;

/* /mail/static/src/models/thread_partner_seen_info/thread_partner_seen_info.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/thread_partner_seen_info/thread_partner_seen_info',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{many2one}=require('@mail/model/model_field');function factory(dependencies){class ThreadPartnerSeenInfo extends dependencies['mail.model']{}
ThreadPartnerSeenInfo.fields={lastFetchedMessage:many2one('mail.message'),lastSeenMessage:many2one('mail.message'),partner:many2one('mail.partner',{inverse:'partnerSeenInfos',readonly:true,required:true,}),thread:many2one('mail.thread',{inverse:'partnerSeenInfos',readonly:true,required:true,}),};ThreadPartnerSeenInfo.identifyingFields=['thread','partner'];ThreadPartnerSeenInfo.modelName='mail.thread_partner_seen_info';return ThreadPartnerSeenInfo;}
registerNewModel('mail.thread_partner_seen_info',factory);return __exports;});;

/* /mail/static/src/models/thread_view/thread_view.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/thread_view/thread_view',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{RecordDeletedError}=require('@mail/model/model_errors');const{attr,many2many,many2one,one2many,one2one}=require('@mail/model/model_field');const{clear,insertAndReplace,link,replace,unlink,update}=require('@mail/model/model_field_command');const{OnChange}=require('@mail/model/model_onchange');function factory(dependencies){class ThreadView extends dependencies['mail.model']{_created(){this._loaderTimeout=undefined;}
_willDelete(){this.env.browser.clearTimeout(this._loaderTimeout);return super._willDelete(...arguments);}
addComponentHint(hintType,hintData){const hint={data:hintData,type:hintType};this.update({componentHintList:this.componentHintList.concat([hint]),});}
handleVisibleMessage(message){if(!this.lastVisibleMessage||this.lastVisibleMessage.id<message.id){this.update({lastVisibleMessage:link(message)});}}
markComponentHintProcessed(hint){this.update({componentHintList:this.componentHintList.filter(h=>h!==hint),});this.messaging.messagingBus.trigger('o-thread-view-hint-processed',{hint,threadViewer:this.threadViewer,});}
startEditingLastMessageFromCurrentUser(){const messageViews=this.messageViews;messageViews.reverse();const messageView=messageViews.find(messageViews=>messageViews.message.isCurrentUserOrGuestAuthor&&messageViews.message.canBeDeleted);if(messageView){messageView.startEditing();}}
_computeRtcCallViewer(){return(this.thread&&this.thread.model==='mail.channel'&&this.thread.rtcSessions.length>0)?insertAndReplace():clear();}
_computeComposerView(){if(!this.thread||this.thread.model==='mail.box'){return clear();}
if(this.threadViewer&&this.threadViewer.chatter){return clear();}
return insertAndReplace();}
_computeHasSquashCloseMessages(){return Boolean(this.threadViewer&&!this.threadViewer.chatter&&this.thread&&this.thread.model!=='mail.box');}
_computeMessageViews(){if(!this.threadCache){return clear();}
const orderedMessages=this.threadCache.orderedNonEmptyMessages;if(this.order==='desc'){orderedMessages.reverse();}
const messageViewsData=[];let prevMessage;for(const message of orderedMessages){messageViewsData.push({isSquashed:this._shouldMessageBeSquashed(prevMessage,message),message:replace(message),});prevMessage=message;}
return insertAndReplace(messageViewsData);}
_computeTextInputSendShortcuts(){if(!this.thread){return;}
if(!this.messaging.device){return;}
if(this.messaging.device.isMobile||(this.messaging.discuss.threadView===this&&this.messaging.discuss.thread===this.messaging.inbox)){return['ctrl-enter','meta-enter'];}
return['enter'];}
_computeThreadCacheInitialScrollHeight(){if(!this.threadCache){return clear();}
const threadCacheInitialScrollHeight=this.threadCacheInitialScrollHeights[this.threadCache.localId];if(threadCacheInitialScrollHeight!==undefined){return threadCacheInitialScrollHeight;}
return clear();}
_computeThreadCacheInitialScrollPosition(){if(!this.threadCache){return clear();}
const threadCacheInitialScrollPosition=this.threadCacheInitialScrollPositions[this.threadCache.localId];if(threadCacheInitialScrollPosition!==undefined){return threadCacheInitialScrollPosition;}
return clear();}
_computeThreadShouldBeSetAsSeen(){if(!this.thread){return;}
if(!this.thread.lastNonTransientMessage){return;}
if(!this.lastVisibleMessage){return;}
if(this.lastVisibleMessage!==this.lastMessage){return;}
if(!this.hasComposerFocus){return;}
if(this.messaging.currentGuest){return;}
this.thread.markAsSeen(this.thread.lastNonTransientMessage).catch(e=>{if(!(e instanceof RecordDeletedError)){throw e;}});}
_computeTopbar(){return this.hasTopbar?insertAndReplace():clear();}
_onThreadCacheChanged(){this.update({componentHintList:clear()});this.addComponentHint('change-of-thread-cache');if(this.threadCache){this.threadCache.update({isCacheRefreshRequested:true,isMarkAllAsReadRequested:true,});}
this.update({lastVisibleMessage:unlink()});}
_onThreadCacheIsLoadingChanged(){if(this.threadCache&&this.threadCache.isLoading){if(!this.isLoading&&!this.isPreparingLoading){this.update({isPreparingLoading:true});this.async(()=>new Promise(resolve=>{this._loaderTimeout=this.env.browser.setTimeout(resolve,400);})).then(()=>{const isLoading=this.threadCache?this.threadCache.isLoading:false;this.update({isLoading,isPreparingLoading:false});});}
return;}
this.env.browser.clearTimeout(this._loaderTimeout);this.update({isLoading:false,isPreparingLoading:false});}
_shouldMessageBeSquashed(prevMessage,message){if(!this.hasSquashCloseMessages){return false;}
if(message.parentMessage){return false;}
if(!prevMessage){return false;}
if(!prevMessage.date&&message.date){return false;}
if(message.date&&prevMessage.date&&Math.abs(message.date.diff(prevMessage.date))>60000){return false;}
if(prevMessage.dateDay!==message.dateDay){return false;}
if(prevMessage.message_type!=='comment'||message.message_type!=='comment'){return false;}
if(prevMessage.author!==message.author||prevMessage.guestAuthor!==message.guestAuthor){return false;}
if(prevMessage.originThread!==message.originThread){return false;}
if(prevMessage.notifications.length>0||message.notifications.length>0){return false;}
const prevOriginThread=prevMessage.originThread;const originThread=message.originThread;if(prevOriginThread&&originThread&&prevOriginThread.model===originThread.model&&originThread.model!=='mail.channel'&&prevOriginThread.id!==originThread.id){return false;}
return true;}}
ThreadView.fields={compact:attr({related:'threadViewer.compact',}),channelInvitationForm:one2one('mail.channel_invitation_form',{inverse:'threadView',isCausal:true,}),componentHintList:attr({default:[],}),composerView:one2one('mail.composer_view',{compute:'_computeComposerView',inverse:'threadView',isCausal:true,}),extraClass:attr({related:'threadViewer.extraClass',}),hasComposerFocus:attr({related:'composerView.hasFocus',}),hasMemberList:attr({related:'threadViewer.hasMemberList',}),hasSquashCloseMessages:attr({compute:'_computeHasSquashCloseMessages',}),hasTopbar:attr({related:'threadViewer.hasTopbar',}),isLoading:attr({default:false,}),isMemberListOpened:attr({default:false,}),isPreparingLoading:attr({default:false,}),hasAutoScrollOnMessageReceived:attr({default:true,}),lastMessage:many2one('mail.message',{related:'thread.lastMessage',}),lastVisibleMessage:many2one('mail.message'),messages:many2many('mail.message',{related:'threadCache.messages',}),messageViews:one2many('mail.message_view',{compute:'_computeMessageViews',inverse:'threadView',isCausal:true,}),order:attr({related:'threadViewer.order',}),replyingToMessageView:many2one('mail.message_view'),rtcCallViewer:one2one('mail.rtc_call_viewer',{compute:'_computeRtcCallViewer',inverse:'threadView',isCausal:true,readonly:true,}),textInputSendShortcuts:attr({compute:'_computeTextInputSendShortcuts',}),thread:many2one('mail.thread',{inverse:'threadViews',readonly:true,related:'threadViewer.thread',}),threadCache:many2one('mail.thread_cache',{inverse:'threadViews',readonly:true,related:'threadViewer.threadCache',}),threadCacheInitialScrollHeight:attr({compute:'_computeThreadCacheInitialScrollHeight',}),threadCacheInitialScrollPosition:attr({compute:'_computeThreadCacheInitialScrollPosition',}),threadCacheInitialScrollHeights:attr({default:{},related:'threadViewer.threadCacheInitialScrollHeights',}),threadCacheInitialScrollPositions:attr({default:{},related:'threadViewer.threadCacheInitialScrollPositions',}),threadViewer:one2one('mail.thread_viewer',{inverse:'threadView',readonly:true,required:true,}),topbar:one2one('mail.thread_view_topbar',{compute:'_computeTopbar',inverse:'threadView',isCausal:true,readonly:true,}),};ThreadView.identifyingFields=['threadViewer'];ThreadView.onChanges=[new OnChange({dependencies:['threadCache'],methodName:'_onThreadCacheChanged',}),new OnChange({dependencies:['threadCache.isLoading'],methodName:'_onThreadCacheIsLoadingChanged',}),new OnChange({dependencies:['hasComposerFocus','lastMessage','thread.lastNonTransientMessage','lastVisibleMessage','threadCache'],methodName:'_computeThreadShouldBeSetAsSeen',}),];ThreadView.modelName='mail.thread_view';return ThreadView;}
registerNewModel('mail.thread_view',factory);return __exports;});;

/* /mail/static/src/models/thread_view/thread_viewer.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/thread_view/thread_viewer',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2one,one2one}=require('@mail/model/model_field');const{clear,insertAndReplace}=require('@mail/model/model_field_command');function factory(dependencies){class ThreadViewer extends dependencies['mail.model']{saveThreadCacheScrollHeightAsInitial(scrollHeight,threadCache){threadCache=threadCache||this.threadCache;if(!threadCache){return;}
if(this.chatter){return;}
this.update({threadCacheInitialScrollHeights:Object.assign({},this.threadCacheInitialScrollHeights,{[threadCache.localId]:scrollHeight,}),});}
saveThreadCacheScrollPositionsAsInitial(scrollTop,threadCache){threadCache=threadCache||this.threadCache;if(!threadCache){return;}
if(this.chatter){return;}
this.update({threadCacheInitialScrollPositions:Object.assign({},this.threadCacheInitialScrollPositions,{[threadCache.localId]:scrollTop,}),});}
_computeThreadView(){return this.hasThreadView?insertAndReplace():clear();}}
ThreadViewer.fields={chatter:one2one('mail.chatter',{inverse:'threadViewer',readonly:true,}),chatWindow:one2one('mail.chat_window',{inverse:'threadViewer',readonly:true,}),compact:attr({default:false,}),discuss:one2one('mail.discuss',{inverse:'threadViewer',readonly:true,}),discussPublicView:one2one('mail.discuss_public_view',{inverse:'threadViewer',readonly:true,}),extraClass:attr(),hasMemberList:attr({default:false,}),hasThreadView:attr({default:false,}),hasTopbar:attr({default:false,}),order:attr({default:'asc',}),thread:many2one('mail.thread'),threadCache:many2one('mail.thread_cache',{related:'thread.cache',}),threadCacheInitialScrollHeights:attr({default:{},}),threadCacheInitialScrollPositions:attr({default:{},}),threadView:one2one('mail.thread_view',{compute:'_computeThreadView',inverse:'threadViewer',isCausal:true,}),};ThreadViewer.identifyingFields=[['chatter','chatWindow','discuss','discussPublicView']];ThreadViewer.modelName='mail.thread_viewer';return ThreadViewer;}
registerNewModel('mail.thread_viewer',factory);return __exports;});;

/* /mail/static/src/models/thread_view_topbar/thread_view_topbar.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/thread_view_topbar/thread_view_topbar',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2one,one2one}=require('@mail/model/model_field');const{clear,insertAndReplace,replace}=require('@mail/model/model_field_command');function factory(dependencies){class ThreadViewTopbar extends dependencies['mail.model']{_created(){this.onClickHideMemberList=this.onClickHideMemberList.bind(this);this.onClickInboxMarkAllAsRead=this.onClickInboxMarkAllAsRead.bind(this);this.onClickInviteButton=this.onClickInviteButton.bind(this);this.onClickShowMemberList=this.onClickShowMemberList.bind(this);this.onClickTopbarThreadName=this.onClickTopbarThreadName.bind(this);this.onClickUnstarAll=this.onClickUnstarAll.bind(this);this.onClickUserName=this.onClickUserName.bind(this);this.onInputGuestNameInput=this.onInputGuestNameInput.bind(this);this.onInputThreadNameInput=this.onInputThreadNameInput.bind(this);this.onKeyDownGuestNameInput=this.onKeyDownGuestNameInput.bind(this);this.onKeyDownThreadNameInput=this.onKeyDownThreadNameInput.bind(this);this.onMouseEnterUserName=this.onMouseEnterUserName.bind(this);this.onMouseEnterTopbarThreadName=this.onMouseEnterTopbarThreadName.bind(this);this.onMouseLeaveUserName=this.onMouseLeaveUserName.bind(this);this.onMouseLeaveTopbarThreadName=this.onMouseLeaveTopbarThreadName.bind(this);this._onClickCaptureGlobal=this._onClickCaptureGlobal.bind(this);this.onClickTopbarThreadDescription=this.onClickTopbarThreadDescription.bind(this);this.onInputThreadDescriptionInput=this.onInputThreadDescriptionInput.bind(this);this.onKeyDownThreadDescriptionInput=this.onKeyDownThreadDescriptionInput.bind(this);this.onMouseEnterTopbarThreadDescription=this.onMouseEnterTopbarThreadDescription.bind(this);this.onMouseLeaveTopbarThreadDescription=this.onMouseLeaveTopbarThreadDescription.bind(this);document.addEventListener('click',this._onClickCaptureGlobal,true);return super._created();}
_willDelete(){document.removeEventListener('click',this._onClickCaptureGlobal,true);return super._willDelete();}
onClickHideMemberList(ev){this.threadView.update({isMemberListOpened:false});this.threadView.addComponentHint('member-list-hidden');}
onClickInboxMarkAllAsRead(ev){this.messaging.models['mail.message'].markAllAsRead();}
onClickInviteButton(ev){if(this.invitePopoverView){this.update({invitePopoverView:clear()});}else{this.openInvitePopoverView();}}
onClickShowMemberList(ev){this.threadView.update({isMemberListOpened:true});}
onClickTopbarThreadName(ev){if(!this.thread||!this.thread.isChannelRenamable){return;}
if(this.messaging.isCurrentUserGuest){return;}
const selection=window.getSelection();this.update({doFocusOnThreadNameInput:true,doSetSelectionDirectionOnThreadNameInput:selection.anchorOffset<selection.focusOffset?'forward':'backward',doSetSelectionEndOnThreadNameInput:Math.max(selection.focusOffset,selection.anchorOffset),doSetSelectionStartOnThreadNameInput:Math.min(selection.focusOffset,selection.anchorOffset),isEditingThreadName:true,isMouseOverThreadName:false,pendingThreadName:this.thread.displayName,});}
onClickTopbarThreadDescription(ev){if(!this.thread||!this.thread.isDescriptionEditableByCurrentUser){return;}
const selection=window.getSelection();this.update({doFocusOnThreadDescriptionInput:true,doSetSelectionDirectionOnThreadDescriptionInput:selection.anchorOffset<selection.focusOffset?'forward':'backward',doSetSelectionEndOnThreadDescriptionInput:Math.max(selection.focusOffset,selection.anchorOffset),doSetSelectionStartOnThreadDescriptionInput:Math.min(selection.focusOffset,selection.anchorOffset),isEditingThreadDescription:true,isMouseOverThreadDescription:false,pendingThreadDescription:this.thread.description||"",});}
onClickUnstarAll(ev){this.messaging.models['mail.message'].unstarAll();}
onClickUserName(ev){if(!this.messaging.isCurrentUserGuest){return;}
const selection=window.getSelection();this.update({doFocusOnGuestNameInput:true,doSetSelectionDirectionOnGuestNameInput:selection.anchorOffset<selection.focusOffset?'forward':'backward',doSetSelectionEndOnGuestNameInput:Math.max(selection.focusOffset,selection.anchorOffset),doSetSelectionStartOnGuestNameInput:Math.min(selection.focusOffset,selection.anchorOffset),isEditingGuestName:true,isMouseOverUserName:false,pendingGuestName:this.messaging.currentGuest.name,});}
onComponentUpdate(){if(this.doFocusOnGuestNameInput){this.guestNameInputRef.el.focus();this.update({doFocusOnGuestNameInput:clear()});}
if(this.doFocusOnThreadNameInput){this.threadNameInputRef.el.focus();this.update({doFocusOnThreadNameInput:clear()});}
if(this.doFocusOnThreadDescriptionInput){this.threadDescriptionInputRef.el.focus();this.update({doFocusOnThreadDescriptionInput:clear()});}
if(this.doSetSelectionStartOnGuestNameInput!==undefined&&this.doSetSelectionEndOnGuestNameInput!==undefined&&this.doSetSelectionDirectionOnGuestNameInput!==undefined){this.guestNameInputRef.el.setSelectionRange(this.doSetSelectionStartOnGuestNameInput,this.doSetSelectionEndOnGuestNameInput,this.doSetSelectionDirectionOnGuestNameInput);this.update({doSetSelectionDirectionOnGuestNameInput:clear(),doSetSelectionEndOnGuestNameInput:clear(),doSetSelectionStartOnGuestNameInput:clear(),});}
if(this.doSetSelectionStartOnThreadNameInput!==undefined&&this.doSetSelectionEndOnThreadNameInput!==undefined&&this.doSetSelectionDirectionOnThreadNameInput!==undefined){this.threadNameInputRef.el.setSelectionRange(this.doSetSelectionStartOnThreadNameInput,this.doSetSelectionEndOnThreadNameInput,this.doSetSelectionDirectionOnThreadNameInput);this.update({doSetSelectionDirectionOnThreadNameInput:clear(),doSetSelectionEndOnThreadNameInput:clear(),doSetSelectionStartOnThreadNameInput:clear(),});}
if(this.doSetSelectionStartOnThreadDescriptionInput!==undefined&&this.doSetSelectionEndOnThreadDescriptionInput!==undefined&&this.doSetSelectionDirectionOnThreadDescriptionInput!==undefined){this.threadDescriptionInputRef.el.setSelectionRange(this.doSetSelectionStartOnThreadDescriptionInput,this.doSetSelectionEndOnThreadDescriptionInput,this.doSetSelectionDirectionOnThreadDescriptionInput);this.update({doSetSelectionDirectionOnThreadDescriptionInput:clear(),doSetSelectionEndOnThreadDescriptionInput:clear(),doSetSelectionStartOnThreadDescriptionInput:clear(),});}}
onInputGuestNameInput(ev){this.update({pendingGuestName:this.guestNameInputRef.el.value});}
onInputThreadNameInput(ev){this.update({pendingThreadName:ev.target.value});}
onInputThreadDescriptionInput(ev){this.update({pendingThreadDescription:ev.target.value});}
onKeyDownGuestNameInput(ev){switch(ev.key){case'Enter':if(this.pendingGuestName.trim()!==''){this._applyGuestRename();}
break;case'Escape':this._resetGuestNameInput();break;}}
onKeyDownThreadNameInput(ev){switch(ev.key){case'Enter':this._applyThreadRename();break;case'Escape':this._discardThreadRename();break;}}
onKeyDownThreadDescriptionInput(ev){switch(ev.key){case'Enter':this._applyThreadChangeDescription();break;case'Escape':this._discardThreadChangeDescription();break;}}
onMouseEnterTopbarThreadName(ev){if(!this.thread||!this.thread.isChannelRenamable){return;}
this.update({isMouseOverThreadName:true});}
onMouseEnterTopbarThreadDescription(ev){if(!this.exists()){return;}
this.update({isMouseOverThreadDescription:true});}
onMouseEnterUserName(ev){this.update({isMouseOverUserName:true});}
onMouseLeaveTopbarThreadName(ev){this.update({isMouseOverThreadName:false});}
onMouseLeaveTopbarThreadDescription(ev){this.update({isMouseOverThreadDescription:false});}
onMouseLeaveUserName(ev){this.update({isMouseOverUserName:false});}
openInvitePopoverView(){this.threadView.update({channelInvitationForm:insertAndReplace()});this.update({invitePopoverView:insertAndReplace({channelInvitationForm:replace(this.threadView.channelInvitationForm),}),});if(this.messaging.isCurrentUserGuest){return;}
this.threadView.channelInvitationForm.update({doFocusOnSearchInput:true});this.threadView.channelInvitationForm.searchPartnersToInvite();}
_applyGuestRename(){if(this.hasGuestNameChanged){this.messaging.models['mail.guest'].performRpcGuestUpdateName({id:this.messaging.currentGuest.id,name:this.pendingGuestName.trim(),});}
this._resetGuestNameInput();}
_applyThreadRename(){const newName=this.pendingThreadName;this.update({isEditingThreadName:false,pendingThreadName:clear(),});if(this.thread.channel_type==='chat'&&newName!==this.thread.custom_channel_name){this.thread.setCustomName(newName);}
if(newName&&this.thread.channel_type==='channel'&&newName!==this.thread.name){this.thread.rename(newName);}
if(this.thread.channel_type==='group'&&newName!==this.thread.name){this.thread.rename(newName);}}
_applyThreadChangeDescription(){const newDescription=this.pendingThreadDescription||"";this.update({isEditingThreadDescription:false,pendingThreadDescription:clear(),});if(newDescription!==this.thread.description){this.thread.changeDescription(newDescription);}}
_computeAvatarUrl(){if(this.messaging.isCurrentUserGuest){if(!this.thread){return'';}
return`/mail/channel/${this.thread.id}/guest/${this.messaging.currentGuest.id}/avatar_128?unique=${this.messaging.currentGuest.name}`;}
return this.messaging.currentPartner.avatarUrl;}
_computeHasGuestNameChanged(){return Boolean(this.messaging.currentGuest&&this.pendingGuestName!==this.messaging.currentGuest.name);}
_computeHasDescriptionArea(){return Boolean(this.thread&&(this.thread.description||this.thread.isDescriptionEditableByCurrentUser));}
_computeIsDescriptionHighlighted(){return Boolean(this.isMouseOverThreadDescription&&this.thread.isDescriptionEditableByCurrentUser);}
_discardThreadRename(){this.update({isEditingThreadName:false,pendingThreadName:clear(),});}
_discardThreadChangeDescription(){this.update({isEditingThreadDescription:false,pendingThreadDescription:clear(),});}
_onClickCaptureGlobal(ev){if(this.isEditingGuestName&&this.guestNameInputRef.el&&!this.guestNameInputRef.el.contains(ev.target)){if(this.pendingGuestName.trim()!==''){this._applyGuestRename();}else{this._resetGuestNameInput();}}
if(this.isEditingThreadName&&this.threadNameInputRef.el&&!this.threadNameInputRef.el.contains(ev.target)){this._applyThreadRename();}
if(this.isEditingThreadDescription&&this.threadDescriptionInputRef.el&&!this.threadDescriptionInputRef.el.contains(ev.target)){this._applyThreadChangeDescription();}}
_resetGuestNameInput(){this.update({isEditingGuestName:false,pendingGuestName:clear(),});}}
ThreadViewTopbar.fields={avatarUrl:attr({compute:'_computeAvatarUrl',readonly:true,}),doFocusOnGuestNameInput:attr(),doFocusOnThreadNameInput:attr(),doFocusOnThreadDescriptionInput:attr(),doSetSelectionDirectionOnGuestNameInput:attr(),doSetSelectionDirectionOnThreadNameInput:attr(),doSetSelectionDirectionOnThreadDescriptionInput:attr(),doSetSelectionEndOnGuestNameInput:attr(),doSetSelectionEndOnThreadNameInput:attr(),doSetSelectionEndOnThreadDescriptionInput:attr(),doSetSelectionStartOnGuestNameInput:attr(),doSetSelectionStartOnThreadNameInput:attr(),doSetSelectionStartOnThreadDescriptionInput:attr(),guestNameInputRef:attr(),hasGuestNameChanged:attr({compute:'_computeHasGuestNameChanged',readonly:true,}),hasDescriptionArea:attr({compute:'_computeHasDescriptionArea',}),isEditingGuestName:attr({default:false,}),inviteButtonRef:attr(),invitePopoverView:one2one('mail.popover_view',{isCausal:true,inverse:'threadViewTopbarOwner',}),isDescriptionHighlighted:attr({compute:'_computeIsDescriptionHighlighted'}),isEditingThreadName:attr({default:false,}),isEditingThreadDescription:attr({default:false,}),isMouseOverThreadName:attr({default:false,}),isMouseOverThreadDescription:attr({default:false,}),isMouseOverUserName:attr({default:false,}),pendingGuestName:attr({default:"",}),pendingThreadName:attr({default:"",}),pendingThreadDescription:attr({default:"",}),thread:many2one('mail.thread',{related:'threadView.thread',}),threadNameInputRef:attr(),threadDescriptionInputRef:attr(),threadView:one2one('mail.thread_view',{inverse:'topbar',readonly:true,required:true,}),};ThreadViewTopbar.identifyingFields=['threadView'];ThreadViewTopbar.modelName='mail.thread_view_topbar';return ThreadViewTopbar;}
registerNewModel('mail.thread_view_topbar',factory);return __exports;});;

/* /mail/static/src/models/user/user.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/user/user',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,one2one}=require('@mail/model/model_field');const{insert,unlink}=require('@mail/model/model_field_command');function factory(dependencies){class User extends dependencies['mail.model']{static convertData(data){const data2={};if('id'in data){data2.id=data.id;}
if('partner_id'in data){if(!data.partner_id){data2.partner=unlink();}else{const partnerNameGet=data['partner_id'];const partnerData={display_name:partnerNameGet[1],id:partnerNameGet[0],};data2.partner=insert(partnerData);}}
return data2;}
static async performRpcRead({context,fields,ids}){const usersData=await this.env.services.rpc({model:'res.users',method:'read',args:[ids],kwargs:{context,fields,},},{shadow:true});return this.messaging.models['mail.user'].insert(usersData.map(userData=>this.messaging.models['mail.user'].convertData(userData)));}
async fetchPartner(){return this.messaging.models['mail.user'].performRpcRead({ids:[this.id],fields:['partner_id'],context:{active_test:false},});}
async getChat(){if(!this.partner){await this.async(()=>this.fetchPartner());}
if(!this.partner){this.env.services['notification'].notify({message:this.env._t("You can only chat with existing users."),type:'warning',});return;}
let chat=this.messaging.models['mail.thread'].find(thread=>thread.channel_type==='chat'&&thread.correspondent===this.partner&&thread.model==='mail.channel'&&thread.public==='private');if(!chat||!chat.isPinned){chat=await this.async(()=>this.messaging.models['mail.thread'].performRpcCreateChat({partnerIds:[this.partner.id],}));}
if(!chat){this.env.services['notification'].notify({message:this.env._t("An unexpected error occurred during the creation of the chat."),type:'warning',});return;}
return chat;}
async openChat(options){const chat=await this.async(()=>this.getChat());if(!chat){return;}
await this.async(()=>chat.open(options));return chat;}
async openProfile(){if(!this.partner){await this.async(()=>this.fetchPartner());}
if(!this.partner){this.env.services['notification'].notify({message:this.env._t("You can only open the profile of existing users."),type:'warning',});return;}
return this.partner.openProfile();}
_computeDisplayName(){return this.display_name||this.partner&&this.partner.display_name;}
_computeNameOrDisplayName(){return this.partner&&this.partner.nameOrDisplayName||this.display_name;}}
User.fields={id:attr({readonly:true,required:true,}),isInternalUser:attr(),display_name:attr({compute:'_computeDisplayName',}),model:attr({default:'res.user',}),nameOrDisplayName:attr({compute:'_computeNameOrDisplayName',}),partner:one2one('mail.partner',{inverse:'user',}),resUsersSettingsId:attr(),};User.identifyingFields=['id'];User.modelName='mail.user';return User;}
registerNewModel('mail.user',factory);return __exports;});;

/* /mail/static/src/models/user_setting/user_setting.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/user_setting/user_setting',async function(require){'use strict';let __exports={};const{browser}=require("@web/core/browser/browser");const{registerNewModel}=require('@mail/model/model_core');const{attr,one2one,one2many}=require('@mail/model/model_field');const{insertAndReplace}=require('@mail/model/model_field_command');function factory(dependencies){class UserSetting extends dependencies['mail.model']{_created(){const res=super._created(...arguments);this._timeoutIds={};this._loadLocalSettings();this._onStorage=this._onStorage.bind(this);browser.addEventListener('storage',this._onStorage);return res;}
_willDelete(){browser.removeEventListener('storage',this._onStorage);for(const timeoutId of Object.values(this._timeoutIds)){browser.clearTimeout(timeoutId);}
return super._willDelete(...arguments);}
static convertData(data){const data2={};if('use_push_to_talk'in data){data2.usePushToTalk=data.use_push_to_talk;}
if('push_to_talk_key'in data){data2.pushToTalkKey=data.push_to_talk_key||'';}
if('voice_active_duration'in data){data2.voiceActiveDuration=data.voice_active_duration;}
if('id'in data){data2.id=data.id;}
return data2;}
getAudioConstraints(){const constraints={echoCancellation:true,noiseSuppression:true,};if(this.audioInputDeviceId){constraints.deviceId=this.audioInputDeviceId;}
return constraints;}
isPushToTalkKey(ev,{ignoreModifiers=false}={}){if(!this.usePushToTalk||!this.pushToTalkKey){return;}
const{key,shiftKey,ctrlKey,altKey}=this.pushToTalkKeyFormat();if(ignoreModifiers){return ev.key===key;}
return(ev.key===key&&ev.shiftKey===shiftKey&&ev.ctrlKey===ctrlKey&&ev.altKey===altKey);}
pushToTalkKeyFormat(){if(!this.pushToTalkKey){return;}
const[shiftKey,ctrlKey,altKey,key]=this.pushToTalkKey.split('.');return{shiftKey:!!shiftKey,ctrlKey:!!ctrlKey,altKey:!!altKey,key:key||false,};}
pushToTalkKeyToString(){const{shiftKey,ctrlKey,altKey,key}=this.pushToTalkKeyFormat();const f=(k,name)=>k?name:'';return`${f(ctrlKey, 'Ctrl + ')}${f(altKey, 'Alt + ')}${f(shiftKey, 'Shift + ')}${key}`;}
async setAudioInputDevice(audioInputDeviceId){this.update({audioInputDeviceId,});this.env.services.local_storage.setItem('mail_user_setting_audio_input_device_id',audioInputDeviceId);await this.messaging.rtc.updateLocalAudioTrack(true);}
setDelayValue(value){const voiceActiveDuration=parseInt(value,10);this.update({voiceActiveDuration});if(!this.messaging.isCurrentUserGuest){this._saveSettings();}}
async setPushToTalkKey(ev){const pushToTalkKey=`${ev.shiftKey || ''}.${ev.ctrlKey || ev.metaKey || ''}.${ev.altKey || ''}.${ev.key}`;this.update({pushToTalkKey});if(!this.messaging.isCurrentUserGuest){this._saveSettings();}}
async saveVolumeSetting({guestId,partnerId,volume}){this._debounce(async()=>{await this.async(()=>this.env.services.rpc({model:'res.users.settings',method:'set_volume_setting',args:[[this.messaging.currentUser.resUsersSettingsId],partnerId,volume,],kwargs:{guest_id:guestId,},},{shadow:true},));},5000,`sound_${partnerId}`);}
async setThresholdValue(voiceActivationThreshold){this.update({voiceActivationThreshold});this.env.services.local_storage.setItem('mail_user_setting_voice_threshold',voiceActivationThreshold);await this.messaging.rtc.updateVoiceActivation();}
async togglePushToTalk(){this.update({usePushToTalk:!this.usePushToTalk});await this.messaging.rtc.updateVoiceActivation();if(!this.messaging.isCurrentUserGuest){this._saveSettings();}}
toggleLayoutSettingsWindow(){this.update({isRtcLayoutSettingDialogOpen:!this.isRtcLayoutSettingDialogOpen});}
toggleWindow(){this.update({isOpen:!this.isOpen});}
_debounce(f,delay,key){this._timeoutIds[key]&&browser.clearTimeout(this._timeoutIds[key]);this._timeoutIds[key]=browser.setTimeout(()=>{if(!this.exists()){return;}
f();},delay);}
_loadLocalSettings(){const voiceActivationThresholdString=this.env.services.local_storage.getItem("mail_user_setting_voice_threshold");const audioInputDeviceId=this.env.services.local_storage.getItem("mail_user_setting_audio_input_device_id");this.update({voiceActivationThreshold:voiceActivationThresholdString?parseFloat(voiceActivationThresholdString):undefined,audioInputDeviceId:audioInputDeviceId||undefined,});}
async _saveSettings(){this._debounce(async()=>{await this.async(()=>this.env.services.rpc({model:'res.users.settings',method:'set_res_users_settings',args:[[this.messaging.currentUser.resUsersSettingsId],{push_to_talk_key:this.pushToTalkKey,use_push_to_talk:this.usePushToTalk,voice_active_duration:this.voiceActiveDuration,}],},{shadow:true},));},2000,'globalSettings');}
async _onStorage(ev){if(ev.key==='mail_user_setting_voice_threshold'){this.update({voiceActivationThreshold:ev.newValue});await this.messaging.rtc.updateVoiceActivation();}}}
UserSetting.fields={audioInputDeviceId:attr({default:'',}),id:attr({readonly:true,required:true,}),isRtcLayoutSettingDialogOpen:attr({default:false,}),pushToTalkKey:attr({default:'',}),rtcConfigurationMenu:one2one('mail.rtc_configuration_menu',{default:insertAndReplace(),inverse:'userSetting',isCausal:true,required:true,}),rtcLayout:attr({default:'tiled',}),usePushToTalk:attr({default:false,}),voiceActivationThreshold:attr({default:0.05,}),voiceActiveDuration:attr({default:0,}),volumeSettings:one2many('mail.volume_setting',{inverse:'userSetting',isCausal:true,}),};UserSetting.identifyingFields=['id'];UserSetting.modelName='mail.user_setting';return UserSetting;}
registerNewModel('mail.user_setting',factory);return __exports;});;

/* /mail/static/src/models/volume_setting/volume_setting.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/volume_setting/volume_setting',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,one2one,many2one}=require('@mail/model/model_field');const{insert}=require('@mail/model/model_field_command');const{OnChange}=require('@mail/model/model_onchange');function factory(dependencies){class VolumeSetting extends dependencies['mail.model']{_onChangeVolume(){let rtcSessions;if(this.partner){rtcSessions=this.partner.rtcSessions;}else if(this.guest){rtcSessions=this.guest.rtcSessions;}else{return;}
for(const rtcSession of rtcSessions){if(rtcSession.audioElement){rtcSession.audioElement.volume=this.volume;}}}}
VolumeSetting.fields={guest:one2one('mail.guest',{inverse:'volumeSetting',}),id:attr({readonly:true,required:true,}),partner:one2one('mail.partner',{inverse:'volumeSetting',}),userSetting:many2one('mail.user_setting',{inverse:'volumeSettings',required:true,}),volume:attr({default:0.5,}),};VolumeSetting.identifyingFields=['id'];VolumeSetting.onChanges=[new OnChange({dependencies:['volume'],methodName:'_onChangeVolume',}),];VolumeSetting.modelName='mail.volume_setting';return VolumeSetting;}
registerNewModel('mail.volume_setting',factory);return __exports;});;

/* /mail/static/src/models/welcome_view/welcome_view.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/models/welcome_view/welcome_view',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,one2one}=require('@mail/model/model_field');const{clear,insertAndReplace}=require('@mail/model/model_field_command');function factory(dependencies){const getNextGuestNameInputId=(function(){let id=0;return()=>++id;})();class WelcomeView extends dependencies['mail.model']{_created(){super._created();this.onClickJoinButton=this.onClickJoinButton.bind(this);this.onInputGuestNameInput=this.onInputGuestNameInput.bind(this);this.onKeydownGuestNameInput=this.onKeydownGuestNameInput.bind(this);}
async joinChannel(){if(this.hasGuestNameChanged){await this.messaging.models['mail.guest'].performRpcGuestUpdateName({id:this.messaging.currentGuest.id,name:this.pendingGuestName.trim(),});}
if(this.discussPublicView.shouldAddGuestAsMemberOnJoin){await this.performRpcAddGuestAsMember();}
this.discussPublicView.switchToThreadView();}
onClickJoinButton(ev){this.joinChannel();}
onComponentUpdate(){this._handleFocus();}
onInputGuestNameInput(ev){this._updateGuestNameWithInputValue();}
onKeydownGuestNameInput(ev){if(ev.key==='Enter'){this.joinChannel();}}
async performRpcAddGuestAsMember(){await this.env.services.rpc({route:'/mail/channel/add_guest_as_member',params:{channel_id:this.channel.id,channel_uuid:this.channel.uuid,},});}
_computeGuestNameInputUniqueId(){return`o_WelcomeView_guestNameInput_${getNextGuestNameInputId()}`;}
_computeHasGuestNameChanged(){return Boolean(this.messaging.currentGuest&&this.originalGuestName!==this.pendingGuestName);}
_computeIsJoinButtonDisabled(){return Boolean(this.messaging.currentGuest&&this.pendingGuestName.trim()==='');}
_computeMediaPreview(){return(this.channel&&this.channel.defaultDisplayMode==='video_full_screen')?insertAndReplace():clear();}
_handleFocus(){if(this.isDoFocusGuestNameInput){if(!this.guestNameInputRef.el){return;}
this.update({isDoFocusGuestNameInput:false});this.guestNameInputRef.el.focus();const{length}=(this.pendingGuestName||'');this.guestNameInputRef.el.setSelectionRange(length,length);}}
_updateGuestNameWithInputValue(){this.update({pendingGuestName:this.guestNameInputRef.el.value});}}
WelcomeView.fields={channel:one2one('mail.thread',{readonly:true,required:true,}),discussPublicView:one2one('mail.discuss_public_view',{inverse:'welcomeView',readonly:true,required:true,}),guestNameInputRef:attr(),guestNameInputUniqueId:attr({compute:'_computeGuestNameInputUniqueId',readonly:true,}),hasGuestNameChanged:attr({compute:'_computeHasGuestNameChanged',readonly:true,}),isDoFocusGuestNameInput:attr(),isJoinButtonDisabled:attr({compute:'_computeIsJoinButtonDisabled'}),mediaPreview:one2one('mail.media_preview',{compute:'_computeMediaPreview',isCausal:true,readonly:true,}),originalGuestName:attr(),pendingGuestName:attr(),};WelcomeView.identifyingFields=['messaging'];WelcomeView.modelName='mail.welcome_view';return WelcomeView;}
registerNewModel('mail.welcome_view',factory);return __exports;});;

/* /mail/static/src/public/discuss_public_boot.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/public/discuss_public_boot',async function(require){'use strict';let __exports={};const{data}=require('mail.discuss_public_channel_template');require('@mail/components/dialog_manager/dialog_manager');require('@mail/components/discuss_public_view/discuss_public_view');const{MessagingService}=require('@mail/services/messaging/messaging');const{getMessagingComponent}=require('@mail/utils/messaging_component');const{processTemplates}=require('@web/core/assets');const{MainComponentsContainer}=require('@web/core/main_components_container');const{registry}=require('@web/core/registry');const{makeEnv,startServices}=require('@web/env');const{session}=require('@web/session');const AbstractService=require('web.AbstractService');const{serviceRegistry:legacyServiceRegistry}=require('web.core');const legacyEnv=require('web.env');const{makeLegacyCrashManagerService,makeLegacyDialogMappingService,makeLegacyNotificationService,makeLegacyRpcService,makeLegacySessionService,mapLegacyEnvToWowlEnv,}=require('@web/legacy/utils');const legacySession=require('web.session');owl.Component.env=legacyEnv;(async function boot(){await owl.utils.whenReady();owl.config.mode=owl.Component.env.isDebug()?'dev':'prod';AbstractService.prototype.deployServices(owl.Component.env);const serviceRegistry=registry.category('services');serviceRegistry.add('legacy_rpc',makeLegacyRpcService(owl.Component.env));serviceRegistry.add('legacy_session',makeLegacySessionService(owl.Component.env,legacySession));serviceRegistry.add('legacy_notification',makeLegacyNotificationService(owl.Component.env));serviceRegistry.add('legacy_crash_manager',makeLegacyCrashManagerService(owl.Component.env));serviceRegistry.add('legacy_dialog_mapping',makeLegacyDialogMappingService(owl.Component.env));await legacySession.is_bound;owl.Component.env.qweb.addTemplates(legacySession.owlTemplates);Object.assign(odoo,{info:{db:session.db,server_version:session.server_version,server_version_info:session.server_version_info,isEnterprise:session.server_version_info.slice(-1)[0]==='e',},isReady:false,});const env=makeEnv();const[,templates]=await Promise.all([startServices(env),odoo.loadTemplatesPromise.then(processTemplates),]);env.qweb.addTemplates(templates);mapLegacyEnvToWowlEnv(owl.Component.env,env);odoo.isReady=true;legacyServiceRegistry.add('messaging',MessagingService.extend({messagingValues:{autofetchPartnerImStatus:false,},}));await owl.mount(MainComponentsContainer,{env,target:document.body});createAndMountDiscussPublicView();})();async function createAndMountDiscussPublicView(){const messaging=await owl.Component.env.services.messaging.get();const DialogManager=getMessagingComponent('DialogManager');const dialogManagerComponent=new DialogManager(null,{});await dialogManagerComponent.mount(document.body);messaging.models['mail.thread'].insert(messaging.models['mail.thread'].convertData(data.channelData));const discussPublicView=messaging.models['mail.discuss_public_view'].create(data.discussPublicViewData);if(discussPublicView.shouldDisplayWelcomeViewInitially){discussPublicView.switchToWelcomeView();}else{discussPublicView.switchToThreadView();}
const DiscussPublicView=getMessagingComponent('DiscussPublicView');const discussPublicViewComponent=new DiscussPublicView(null,{localId:discussPublicView.localId,});await discussPublicViewComponent.mount(document.body);}
return __exports;});;

/* /mail/static/src/public/root_widget.js defined in bundle 'mail.assets_discuss_public' */
odoo.define("root.widget",function(require){const{ComponentAdapter}=require("web.OwlCompatibility");const{Component}=owl;return new ComponentAdapter(null,{Component});});;

/* /mail/static/src/services/messaging/messaging.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/services/messaging/messaging',async function(require){'use strict';let __exports={};const{ModelManager}=require('@mail/model/model_manager');const AbstractService=require('web.AbstractService');const MessagingService=__exports.MessagingService=AbstractService.extend({dependencies:['bus_service'],messagingValues:{},init(env){this._super(env);this.modelManager=new ModelManager(env);},start(){this._super();this.modelManager.start(this.messagingValues);},async get(){return this.modelManager.getMessaging();}});return __exports;});;

/* /mail/static/src/utils/deferred/deferred.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/utils/deferred/deferred',async function(require){'use strict';let __exports={};__exports.makeDeferred=makeDeferred;function makeDeferred(){let resolve;let reject;const prom=new Promise(function(res,rej){resolve=res.bind(this);reject=rej.bind(this);});prom.resolve=(...args)=>resolve(...args);prom.reject=(...args)=>reject(...args);return prom;}
return __exports;});;

/* /mail/static/src/utils/media_monitoring/media_monitoring.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/utils/media_monitoring/media_monitoring',async function(require){'use strict';let __exports={};const HUMAN_VOICE_FREQUENCY_RANGE=[80,1000];__exports.monitorAudio=monitorAudio;async function monitorAudio(track,processorOptions){const monitoredTrack=track.clone();monitoredTrack.enabled=true;const stream=new window.MediaStream([monitoredTrack]);const AudioContext=window.AudioContext||window.webkitAudioContext;if(!AudioContext){throw'missing audio context';}
const audioContext=new AudioContext();const source=audioContext.createMediaStreamSource(stream);let processor;try{processor=await _loadAudioWorkletProcessor(source,audioContext,processorOptions);}catch(e){processor=_loadScriptProcessor(source,audioContext,processorOptions);}
return()=>{processor.disconnect();source.disconnect();monitoredTrack.stop();}}
function _loadScriptProcessor(source,audioContext,{frequencyRange=HUMAN_VOICE_FREQUENCY_RANGE,minimumActiveCycles=10,onThreshold,onTic,volumeThreshold=0.3}={}){const bitSize=1024;const analyser=audioContext.createAnalyser();source.connect(analyser);const scriptProcessorNode=audioContext.createScriptProcessor(bitSize,1,1);analyser.connect(scriptProcessorNode);analyser.fftsize=bitSize;scriptProcessorNode.connect(audioContext.destination);const processInterval=50;const intervalInFrames=processInterval/1000*analyser.context.sampleRate;let nextUpdateFrame=processInterval;let activityBuffer=0;let wasAboveThreshold=undefined;let isAboveThreshold=false;scriptProcessorNode.onaudioprocess=()=>{nextUpdateFrame-=bitSize;if(nextUpdateFrame>=0){return;}
nextUpdateFrame+=intervalInFrames;const normalizedVolume=getFrequencyAverage(analyser,frequencyRange[0],frequencyRange[1]);if(normalizedVolume>=volumeThreshold){activityBuffer=minimumActiveCycles;}else if(normalizedVolume<volumeThreshold&&activityBuffer>0){activityBuffer--;}
isAboveThreshold=activityBuffer>0;onTic&&onTic(normalizedVolume);if(wasAboveThreshold!==isAboveThreshold){wasAboveThreshold=isAboveThreshold;onThreshold&&onThreshold(isAboveThreshold);}};return{disconnect:()=>{analyser.disconnect();scriptProcessorNode.disconnect();scriptProcessorNode.onaudioprocess=null;},};}
async function _loadAudioWorkletProcessor(source,audioContext,{frequencyRange=HUMAN_VOICE_FREQUENCY_RANGE,minimumActiveCycles=10,onThreshold,onTic,volumeThreshold=0.3}={}){await audioContext.resume();await audioContext.audioWorklet.addModule('/mail/rtc/audio_worklet_processor');const thresholdProcessor=new window.AudioWorkletNode(audioContext,'audio-processor',{processorOptions:{minimumActiveCycles,volumeThreshold,frequencyRange,postAllTics:!!onTic,}});source.connect(thresholdProcessor).connect(audioContext.destination);thresholdProcessor.port.onmessage=(event)=>{const{isAboveThreshold,volume}=event.data;onThreshold&&isAboveThreshold!==undefined&&onThreshold(isAboveThreshold);onTic&&volume!==undefined&&onTic(volume);};return{disconnect:()=>{thresholdProcessor.disconnect();},};}
function getFrequencyAverage(analyser,lowerFrequency,higherFrequency){const frequencies=new window.Uint8Array(analyser.frequencyBinCount);analyser.getByteFrequencyData(frequencies);const sampleRate=analyser.context.sampleRate;const startIndex=_getFrequencyIndex(lowerFrequency,sampleRate,analyser.frequencyBinCount);const endIndex=_getFrequencyIndex(higherFrequency,sampleRate,analyser.frequencyBinCount);const count=endIndex-startIndex;let sum=0;for(let index=startIndex;index<endIndex;index++){sum+=frequencies[index]/255;}
if(!count){return 0;}
return sum/count;}
function _getFrequencyIndex(targetFrequency,sampleRate,binCount){const index=Math.round(targetFrequency/(sampleRate/2)*binCount);return Math.min(Math.max(0,index),binCount);}
return __exports;});;

/* /mail/static/src/utils/throttle/throttle.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/utils/throttle/throttle',async function(require){'use strict';let __exports={};const{makeDeferred}=require('@mail/utils/deferred/deferred');class ThrottleCanceledError extends Error{constructor(throttleId,...args){super(...args);this.name='ThrottleCanceledError';this.throttleId=throttleId;}}
class ThrottleReinvokedError extends Error{constructor(throttleId,...args){super(...args);this.name='ThrottleReinvokedError';this.throttleId=throttleId;}}
class _ThrottleFlushedError extends Error{constructor(throttleId,...args){super(...args);this.name='_ThrottleFlushedError';this.throttleId=throttleId;}}
class Throttle{constructor(env,func,duration){this.env=env;this.id=_.uniqueId('throttle_');this._coolingDownDeferred=undefined;this._duration=duration;this._function=func;this._isCoolingDown=false;this._pendingInvokeDeferred=undefined;}
cancel(){if(!this._isCoolingDown){return;}
if(!this._pendingInvokeDeferred){return;}
this._pendingInvokeDeferred.reject(new ThrottleCanceledError(this.id));}
clear(){this.cancel();this.flush();}
async do(...args){if(!this._isCoolingDown){return this._invokeFunction(...args);}
if(this._pendingInvokeDeferred){this._pendingInvokeDeferred.reject(new ThrottleReinvokedError(this.id));}
try{this._pendingInvokeDeferred=makeDeferred();await Promise.race([this._coolingDownDeferred,this._pendingInvokeDeferred]);}catch(error){if(!(error instanceof _ThrottleFlushedError)||error.throttleId!==this.id){throw error;}}finally{this._pendingInvokeDeferred=undefined;}
return this._invokeFunction(...args);}
flush(){if(!this._isCoolingDown){return;}
const coolingDownDeferred=this._coolingDownDeferred;this._coolingDownDeferred=undefined;this._isCoolingDown=false;coolingDownDeferred.reject(new _ThrottleFlushedError(this.id));}
_invokeFunction(...args){const res=this._function(...args);this._startCoolingDown();return res;}
async _startCoolingDown(){if(this._coolingDownDeferred){throw new Error("Cannot start cooling down if there's already a cooling down in progress.");}
const coolingDownDeferred=makeDeferred();this._coolingDownDeferred=coolingDownDeferred;this._isCoolingDown=true;const cooldownTimeoutId=this.env.browser.setTimeout(()=>coolingDownDeferred.resolve(),this._duration);let unexpectedError;try{await coolingDownDeferred;}catch(error){if(!(error instanceof _ThrottleFlushedError)||error.throttleId!==this.id){unexpectedError=error;}}finally{this.env.browser.clearTimeout(cooldownTimeoutId);this._coolingDownDeferred=undefined;this._isCoolingDown=false;}
if(unexpectedError){throw unexpectedError;}}}
function throttle(env,func,duration,{silentCancelationErrors=true}={}){const throttleObj=new Throttle(env,func,duration);const callable=async(...args)=>{try{return await throttleObj.do(...args);}catch(error){const isSelfReinvokedError=(error instanceof ThrottleReinvokedError&&error.throttleId===throttleObj.id);const isSelfCanceledError=(error instanceof ThrottleCanceledError&&error.throttleId===throttleObj.id);if(silentCancelationErrors&&(isSelfReinvokedError||isSelfCanceledError)){return new Promise(()=>{});}else{throw error;}}};Object.assign(callable,{cancel:()=>throttleObj.cancel(),clear:()=>throttleObj.clear(),flush:()=>throttleObj.flush(),});return callable;}
Object.assign(throttle,{ThrottleReinvokedError,ThrottleCanceledError,});__exports[Symbol.for("default")]=throttle;return __exports;});;

/* /mail/static/src/utils/timer/timer.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/utils/timer/timer',async function(require){'use strict';let __exports={};const{makeDeferred}=require('@mail/utils/deferred/deferred');class TimerClearedError extends Error{constructor(timerId,...args){super(...args);this.name='TimerClearedError';this.timerId=timerId;}}
class Timer{constructor(env,onTimeout,duration,{silentCancelationErrors=true}={}){this.env=env;this.isRunning=false;this._duration=duration;this._hasSilentCancelationErrors=silentCancelationErrors;this._onTimeout=onTimeout;this._timeoutDeferred=undefined;this._timeoutId=undefined;}
clear(){this.env.browser.clearTimeout(this._timeoutId);this.isRunning=false;if(!this._timeoutDeferred){return;}
this._timeoutDeferred.reject(new TimerClearedError(this.id));}
async reset(){this.clear();await this.start();}
async start(){if(this.isRunning){throw new Error("Cannot start a timer that is currently running.");}
this.isRunning=true;const timeoutDeferred=makeDeferred();this._timeoutDeferred=timeoutDeferred;const timeoutId=this.env.browser.setTimeout(()=>{this.isRunning=false;timeoutDeferred.resolve(this._onTimeout());},this._duration);this._timeoutId=timeoutId;let result;try{result=await timeoutDeferred;}catch(error){if(!this._hasSilentCancelationErrors||!(error instanceof TimerClearedError)||error.timerId!==this.id){throw error;}}finally{this.env.browser.clearTimeout(timeoutId);this._timeoutDeferred=undefined;this.isRunning=false;}
return result;}}
Object.assign(Timer,{TimerClearedError,});__exports[Symbol.for("default")]=Timer;return __exports;});;

/* /mail/static/src/utils/messaging_component.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/utils/messaging_component',async function(require){'use strict';let __exports={};const{useModels}=require("@mail/component_hooks/use_models/use_models");const{useShouldUpdateBasedOnProps}=require("@mail/component_hooks/use_should_update_based_on_props/use_should_update_based_on_props");const componentRegistry={};__exports.registerMessagingComponent=registerMessagingComponent;function registerMessagingComponent(ComponentClass,{propsCompareDepth={}}={}){const{name,components}=ComponentClass;if(componentRegistry[name]){throw new Error(`There already is a registered component with the name "${name}"`);}
const decoratedName=`@messaging ${name}`;const MessagingClass={[decoratedName]:class extends ComponentClass{setup(...args){super.setup(...args);useModels();useShouldUpdateBasedOnProps({propsCompareDepth});}
get messaging(){return this.env.services.messaging.modelManager.messaging;}
toString(){return`component(${decoratedName}, props: ${Object.entries(this.props || {})})`;}}}[decoratedName];MessagingClass.components=Object.assign(Object.create(componentRegistry),components);componentRegistry[name]=MessagingClass;}
__exports.unregisterMessagingComponent=unregisterMessagingComponent;function unregisterMessagingComponent(ComponentClass){delete componentRegistry[ComponentClass.name];}
__exports.getMessagingComponent=getMessagingComponent;function getMessagingComponent(name){return componentRegistry[name];}
return __exports;});;

/* /mail/static/src/utils/utils.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail/utils/utils',async function(require){'use strict';let __exports={};const{delay}=require('web.concurrency');const{patch:webUtilsPatch,unaccent,unpatch:webUtilsUnpatch,}=require('web.utils');const classPatchMap=new WeakMap();const eventHandledWeakMap=new WeakMap();function cleanSearchTerm(searchTerm){return unaccent(searchTerm.toLowerCase());}
async function executeGracefully(functions,maxTimeFrame=100){let startDate=new Date();for(const func of functions){if(new Date()-startDate>maxTimeFrame){await new Promise(resolve=>setTimeout(resolve));startDate=new Date();}
await func();}}
function isEventHandled(ev,markName){if(!eventHandledWeakMap.get(ev)){return false;}
return eventHandledWeakMap.get(ev).includes(markName);}
function markEventHandled(ev,markName){if(!eventHandledWeakMap.get(ev)){eventHandledWeakMap.set(ev,[]);}
eventHandledWeakMap.get(ev).push(markName);}
async function nextTick(){await delay(0);}
function patchClassMethods(Class,patchName,patch){let metadata=classPatchMap.get(Class);if(!metadata){metadata={origMethods:{},patches:{},current:[]};classPatchMap.set(Class,metadata);}
if(metadata.patches[patchName]){throw new Error(`Patch [${patchName}] already exists`);}
metadata.patches[patchName]=patch;applyPatch(Class,patch);metadata.current.push(patchName);function applyPatch(Class,patch){Object.keys(patch).forEach(function(methodName){const method=patch[methodName];if(typeof method==="function"){const original=Class[methodName];if(!(methodName in metadata.origMethods)){metadata.origMethods[methodName]=original;}
Class[methodName]=function(...args){const previousSuper=this._super;this._super=original;const res=method.call(this,...args);this._super=previousSuper;return res;};}});}
return()=>unpatchClassMethods.bind(Class,patchName);}
function patchInstanceMethods(Class,patchName,patch){return webUtilsPatch(Class.prototype,patchName,patch);}
function unpatchClassMethods(Class,patchName){let metadata=classPatchMap.get(Class);if(!metadata){return;}
classPatchMap.delete(Class);for(let k in metadata.origMethods){Class[k]=metadata.origMethods[k];}
for(let name of metadata.current){if(name!==patchName){patchClassMethods(Class,name,metadata.patches[name]);}}}
function unpatchInstanceMethods(Class,patchName){return webUtilsUnpatch(Class.prototype,patchName);}
Object.assign(__exports,{cleanSearchTerm,executeGracefully,isEventHandled,markEventHandled,nextTick,patchClassMethods,patchInstanceMethods,unpatchClassMethods,unpatchInstanceMethods,});return __exports;});;

/* /bus/static/src/js/crosstab_bus.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('bus.CrossTab',function(require){"use strict";var Longpolling=require('bus.Longpolling');var session=require('web.session');var CrossTabBus=Longpolling.extend({TAB_HEARTBEAT_PERIOD:10000,MASTER_TAB_HEARTBEAT_PERIOD:1500,HEARTBEAT_OUT_OF_DATE_PERIOD:5000,HEARTBEAT_KILL_OLD_PERIOD:15000,LOCAL_STORAGE_PREFIX:'bus',_isMasterTab:false,_isRegistered:false,init:function(){this._super.apply(this,arguments);var now=new Date().getTime();this._sanitizedOrigin=session.origin.replace(/:\/{0,2}/g,'_');this._currentTabChannels=new Set();this._id=_.uniqueId(this.LOCAL_STORAGE_PREFIX)+':'+now;if(this._callLocalStorage('getItem','last_ts',0)+50000<now){this._callLocalStorage('removeItem','last');}
this._lastNotificationID=this._callLocalStorage('getItem','last',0);this.call('local_storage','onStorage',this,this._onStorage);},destroy:function(){this._super();clearTimeout(this._heartbeatTimeout);},addChannel:function(channel){this._currentTabChannels.add(channel);this._super.apply(this,arguments);this._updateChannels();},deleteChannel:function(channel){this._currentTabChannels.delete(channel);this._super.apply(this,arguments);this._updateChannels();},getTabId:function(){return this._id;},isMasterTab:function(){return this._isMasterTab;},startPolling:function(){if(this._isActive===null){this._heartbeat=this._heartbeat.bind(this);}
if(!this._isRegistered){this._isRegistered=true;var peers=this._callLocalStorage('getItem','peers',{});peers[this._id]=new Date().getTime();this._callLocalStorage('setItem','peers',peers);this._registerWindowUnload();if(!this._callLocalStorage('getItem','master')){this._startElection();}
this._heartbeat();if(this._isMasterTab){this._callLocalStorage('setItem','options',this._options);}else{this._options=this._callLocalStorage('getItem','options',this._options);}
this._updateChannels();return;}
if(this._isMasterTab){this._super.apply(this,arguments);}},updateOption:function(){this._super.apply(this,arguments);this._callLocalStorage('setItem','options',this._options);},_callLocalStorage:function(method,key,param){return this.call('local_storage',method,this._generateKey(key),param);},_generateKey:function(key){return this.LOCAL_STORAGE_PREFIX+'.'+this._sanitizedOrigin+'.'+key;},_getLastPresence:function(){return this._callLocalStorage('getItem','lastPresence')||this._super();},_heartbeat:function(){var now=new Date().getTime();var heartbeatValue=parseInt(this._callLocalStorage('getItem','heartbeat',0));var peers=this._callLocalStorage('getItem','peers',{});if((heartbeatValue+this.HEARTBEAT_OUT_OF_DATE_PERIOD)<now){this._startElection();heartbeatValue=parseInt(this._callLocalStorage('getItem','heartbeat',0));}
if(this._isMasterTab){var cleanedPeers={};for(var peerName in peers){if(peers[peerName]+this.HEARTBEAT_KILL_OLD_PERIOD>now){cleanedPeers[peerName]=peers[peerName];}}
if(heartbeatValue!==this.lastHeartbeat){this._isMasterTab=false;this.lastHeartbeat=0;peers[this._id]=now;this._callLocalStorage('setItem','peers',peers);this.stopPolling();this.trigger('no_longer_master');}else{this.lastHeartbeat=now;this._callLocalStorage('setItem','heartbeat',now);this._callLocalStorage('setItem','peers',cleanedPeers);}}else{peers[this._id]=now;this._callLocalStorage('setItem','peers',peers);}
var hbPeriod=this._isMasterTab?this.MASTER_TAB_HEARTBEAT_PERIOD:this.TAB_HEARTBEAT_PERIOD;if(this._lastPresenceTime+hbPeriod>now){this._callLocalStorage('setItem','lastPresence',this._lastPresenceTime);}
this._heartbeatTimeout=setTimeout(this._heartbeat.bind(this),hbPeriod);},_registerWindowUnload:function(){$(window).on('unload.'+this._id,this._onUnload.bind(this));},_startElection:function(){if(this._isMasterTab){return;}
var now=new Date().getTime();var peers=this._callLocalStorage('getItem','peers',{});var heartbeatKillOld=now-this.HEARTBEAT_KILL_OLD_PERIOD;var newMaster;for(var peerName in peers){if(peers[peerName]<heartbeatKillOld){continue;}
newMaster=peerName;break;}
if(newMaster===this._id){this.lastHeartbeat=now;this._callLocalStorage('setItem','heartbeat',this.lastHeartbeat);this._callLocalStorage('setItem','master',true);this._isMasterTab=true;this.startPolling();this.trigger('become_master');delete peers[newMaster];this._callLocalStorage('setItem','peers',peers);}},_updateChannels:function(){const currentPeerIds=new Set(Object.keys(this._callLocalStorage('getItem','peers')||{}));const peerChannels=this._callLocalStorage('getItem','channels')||{};const peerChannelsBefore=JSON.stringify(peerChannels);peerChannels[this._id]=Array.from(this._currentTabChannels);for(const channelPeerId of Object.keys(peerChannels)){if(!currentPeerIds.has(channelPeerId)){delete peerChannels[channelPeerId];}}
const peerChannelsAfter=JSON.stringify(peerChannels);if(peerChannelsBefore===peerChannelsAfter){return false;}
this._callLocalStorage('setItem','channels',peerChannels);const allChannels=new Set();for(const channels of Object.values(peerChannels)){for(const channel of channels){allChannels.add(channel);}}
for(const channel of this._currentTabChannels){allChannels.add(channel);}
this._channels=Array.from(allChannels);return true;},_onFocusChange:function(params){this._super.apply(this,arguments);this._callLocalStorage('setItem','focus',params.focus);},_onPoll:function(notifications){var notifs=this._super(notifications);if(this._isMasterTab&&notifs.length){this._callLocalStorage('setItem','last',this._lastNotificationID);this._callLocalStorage('setItem','last_ts',new Date().getTime());this._callLocalStorage('setItem','notification',notifs);}},_onStorage:function(e){var value=JSON.parse(e.newValue);var key=e.key;if(this._isRegistered&&key===this._generateKey('master')&&!value){this._startElection();}
if(key===this._generateKey('last')){this._lastNotificationID=value||0;}
else if(key===this._generateKey('notification')){if(!this._isMasterTab){this.trigger("notification",value);}}
else if(key===this._generateKey('channels')){if(this._updateChannels()){this._restartPolling();};}
else if(key===this._generateKey('options')){this._options=value;}
else if(key===this._generateKey('focus')){this._isOdooFocused=value;this.trigger('window_focus',this._isOdooFocused);}},_onUnload:function(){var peers=this._callLocalStorage('getItem','peers')||{};delete peers[this._id];this._callLocalStorage('setItem','peers',peers);this._currentTabChannels.clear();this._updateChannels();if(this._isMasterTab){this._callLocalStorage('removeItem','master');}},});return CrossTabBus;});;

/* /bus/static/src/js/longpolling_bus.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('bus.Longpolling',function(require){"use strict";var Bus=require('web.Bus');var ServicesMixin=require('web.ServicesMixin');var LongpollingBus=Bus.extend(ServicesMixin,{PARTNERS_PRESENCE_CHECK_PERIOD:30000,ERROR_RETRY_DELAY:10000,POLL_ROUTE:'/longpolling/poll',_isActive:null,_lastNotificationID:0,_isOdooFocused:true,_pollRetryTimeout:null,init:function(parent,params){this._super.apply(this,arguments);this._id=_.uniqueId('bus');this._longPollingBusId=this._id;this._options={};this._channels=[];this._lastPresenceTime=new Date().getTime();$(window).on("focus."+this._longPollingBusId,this._onFocusChange.bind(this,{focus:true}));$(window).on("blur."+this._longPollingBusId,this._onFocusChange.bind(this,{focus:false}));$(window).on("unload."+this._longPollingBusId,this._onFocusChange.bind(this,{focus:false}));$(window).on("click."+this._longPollingBusId,this._onPresence.bind(this));$(window).on("keydown."+this._longPollingBusId,this._onPresence.bind(this));$(window).on("keyup."+this._longPollingBusId,this._onPresence.bind(this));},destroy:function(){this.stopPolling();$(window).off("focus."+this._longPollingBusId);$(window).off("blur."+this._longPollingBusId);$(window).off("unload."+this._longPollingBusId);$(window).off("click."+this._longPollingBusId);$(window).off("keydown."+this._longPollingBusId);$(window).off("keyup."+this._longPollingBusId);this._super();},addChannel:function(channel){if(this._channels.indexOf(channel)===-1){this._channels.push(channel);this._restartPolling();}},deleteChannel:function(channel){var index=this._channels.indexOf(channel);if(index!==-1){this._channels.splice(index,1);if(this._pollRpc){this._pollRpc.abort();}}},isOdooFocused:function(){return this._isOdooFocused;},startPolling:function(){if(this._isActive===null){this._poll=this._poll.bind(this);}
if(!this._isActive){this._isActive=true;this._poll();}},stopPolling:function(){this._isActive=false;this._channels=[];clearTimeout(this._pollRetryTimeout);if(this._pollRpc){this._pollRpc.abort();}},updateOption:function(key,value){this._options[key]=value;},_getLastPresence:function(){return this._lastPresenceTime;},_poll:function(){var self=this;if(!this._isActive){return;}
var now=new Date().getTime();var options=_.extend({},this._options,{bus_inactivity:now-this._getLastPresence(),});var data={channels:this._channels,last:this._lastNotificationID,options:options};this._pollRpc=this._makePoll(data);this._pollRpc.then(function(result){self._pollRpc=false;self._onPoll(result);self._poll();}).guardedCatch(function(result){self._pollRpc=false;result.event.preventDefault();if(result.message==="XmlHttpRequestError abort"){self._poll();}else{self._pollRetryTimeout=setTimeout(self._poll,self.ERROR_RETRY_DELAY+(Math.floor((Math.random()*20)+1)*1000));}});},_makePoll:function(data){return this._rpc({route:this.POLL_ROUTE,params:data},{shadow:true,timeout:60000});},_onFocusChange:function(params){this._isOdooFocused=params.focus;if(params.focus){this._lastPresenceTime=new Date().getTime();this.trigger('window_focus',this._isOdooFocused);}},_onPoll:function(notifications){var self=this;var notifs=_.map(notifications,function(notif){if(notif.id>self._lastNotificationID){self._lastNotificationID=notif.id;}
return notif.message;});this.trigger("notification",notifs);return notifs;},_onPresence:function(){this._lastPresenceTime=new Date().getTime();},_restartPolling(){if(this._pollRpc){this._pollRpc.abort();}else{this.startPolling();}},});return LongpollingBus;});;

/* /bus/static/src/js/services/bus_service.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('bus.BusService',function(require){"use strict";var CrossTab=require('bus.CrossTab');var core=require('web.core');var ServicesMixin=require('web.ServicesMixin');const session=require('web.session');var BusService=CrossTab.extend(ServicesMixin,{dependencies:['local_storage'],_audio:null,init:function(env){this.env=env;this._super();},_trigger_up:function(ev){if(ev.name==='call_service'){const payload=ev.data;let args=payload.args||[];if(payload.service==='ajax'&&payload.method==='rpc'){args=args.concat(ev.target);}
const service=this.env.services[payload.service];const result=service[payload.method].apply(service,args);payload.callback(result);}},start:function(){},sendNotification(options,callback){if(window.Notification&&Notification.permission==="granted"){if(this.isMasterTab()){try{this._sendNativeNotification(options.title,options.message,callback);}catch(error){if(error.message.indexOf('ServiceWorkerRegistration')>-1){this.displayNotification(options);this._beep();}else{throw error;}}}}else{this.displayNotification(options);if(this.isMasterTab()){this._beep();}}},onNotification:function(){this.on.apply(this,["notification"].concat(Array.prototype.slice.call(arguments)));},_beep:function(){if(typeof(Audio)!=="undefined"){if(!this._audio){this._audio=new Audio();var ext=this._audio.canPlayType("audio/ogg; codecs=vorbis")?".ogg":".mp3";this._audio.src=session.url("/mail/static/src/audio/ting"+ext);}
Promise.resolve(this._audio.play()).catch(_.noop);}},_sendNativeNotification:function(title,content,callback){var notification=new Notification(_.unescape(title),{body:_.unescape(content),icon:"/mail/static/src/img/odoobot_transparent.png"});notification.onclick=function(){window.focus();if(this.cancel){this.cancel();}else if(this.close){this.close();}
if(callback){callback();}};},});core.serviceRegistry.add('bus_service',BusService);return BusService;});;

/* /web/static/lib/luxon/luxon.js defined in bundle 'mail.assets_discuss_public' */
var luxon=(function(exports){'use strict';function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor);}}
function _createClass(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor;}
function _inheritsLoose(subClass,superClass){subClass.prototype=Object.create(superClass.prototype);subClass.prototype.constructor=subClass;subClass.__proto__=superClass;}
function _getPrototypeOf(o){_getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function _getPrototypeOf(o){return o.__proto__||Object.getPrototypeOf(o);};return _getPrototypeOf(o);}
function _setPrototypeOf(o,p){_setPrototypeOf=Object.setPrototypeOf||function _setPrototypeOf(o,p){o.__proto__=p;return o;};return _setPrototypeOf(o,p);}
function _isNativeReflectConstruct(){if(typeof Reflect==="undefined"||!Reflect.construct)return false;if(Reflect.construct.sham)return false;if(typeof Proxy==="function")return true;try{Date.prototype.toString.call(Reflect.construct(Date,[],function(){}));return true;}catch(e){return false;}}
function _construct(Parent,args,Class){if(_isNativeReflectConstruct()){_construct=Reflect.construct;}else{_construct=function _construct(Parent,args,Class){var a=[null];a.push.apply(a,args);var Constructor=Function.bind.apply(Parent,a);var instance=new Constructor();if(Class)_setPrototypeOf(instance,Class.prototype);return instance;};}
return _construct.apply(null,arguments);}
function _isNativeFunction(fn){return Function.toString.call(fn).indexOf("[native code]")!==-1;}
function _wrapNativeSuper(Class){var _cache=typeof Map==="function"?new Map():undefined;_wrapNativeSuper=function _wrapNativeSuper(Class){if(Class===null||!_isNativeFunction(Class))return Class;if(typeof Class!=="function"){throw new TypeError("Super expression must either be null or a function");}
if(typeof _cache!=="undefined"){if(_cache.has(Class))return _cache.get(Class);_cache.set(Class,Wrapper);}
function Wrapper(){return _construct(Class,arguments,_getPrototypeOf(this).constructor);}
Wrapper.prototype=Object.create(Class.prototype,{constructor:{value:Wrapper,enumerable:false,writable:true,configurable:true}});return _setPrototypeOf(Wrapper,Class);};return _wrapNativeSuper(Class);}
function _objectWithoutPropertiesLoose(source,excluded){if(source==null)return{};var target={};var sourceKeys=Object.keys(source);var key,i;for(i=0;i<sourceKeys.length;i++){key=sourceKeys[i];if(excluded.indexOf(key)>=0)continue;target[key]=source[key];}
return target;}
function _unsupportedIterableToArray(o,minLen){if(!o)return;if(typeof o==="string")return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(n);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _arrayLikeToArray(o,minLen);}
function _arrayLikeToArray(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2;}
function _createForOfIteratorHelperLoose(o){var i=0;if(typeof Symbol==="undefined"||o[Symbol.iterator]==null){if(Array.isArray(o)||(o=_unsupportedIterableToArray(o)))return function(){if(i>=o.length)return{done:true};return{done:false,value:o[i++]};};throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");}
i=o[Symbol.iterator]();return i.next.bind(i);}
var LuxonError=function(_Error){_inheritsLoose(LuxonError,_Error);function LuxonError(){return _Error.apply(this,arguments)||this;}
return LuxonError;}(_wrapNativeSuper(Error));var InvalidDateTimeError=function(_LuxonError){_inheritsLoose(InvalidDateTimeError,_LuxonError);function InvalidDateTimeError(reason){return _LuxonError.call(this,"Invalid DateTime: "+reason.toMessage())||this;}
return InvalidDateTimeError;}(LuxonError);var InvalidIntervalError=function(_LuxonError2){_inheritsLoose(InvalidIntervalError,_LuxonError2);function InvalidIntervalError(reason){return _LuxonError2.call(this,"Invalid Interval: "+reason.toMessage())||this;}
return InvalidIntervalError;}(LuxonError);var InvalidDurationError=function(_LuxonError3){_inheritsLoose(InvalidDurationError,_LuxonError3);function InvalidDurationError(reason){return _LuxonError3.call(this,"Invalid Duration: "+reason.toMessage())||this;}
return InvalidDurationError;}(LuxonError);var ConflictingSpecificationError=function(_LuxonError4){_inheritsLoose(ConflictingSpecificationError,_LuxonError4);function ConflictingSpecificationError(){return _LuxonError4.apply(this,arguments)||this;}
return ConflictingSpecificationError;}(LuxonError);var InvalidUnitError=function(_LuxonError5){_inheritsLoose(InvalidUnitError,_LuxonError5);function InvalidUnitError(unit){return _LuxonError5.call(this,"Invalid unit "+unit)||this;}
return InvalidUnitError;}(LuxonError);var InvalidArgumentError=function(_LuxonError6){_inheritsLoose(InvalidArgumentError,_LuxonError6);function InvalidArgumentError(){return _LuxonError6.apply(this,arguments)||this;}
return InvalidArgumentError;}(LuxonError);var ZoneIsAbstractError=function(_LuxonError7){_inheritsLoose(ZoneIsAbstractError,_LuxonError7);function ZoneIsAbstractError(){return _LuxonError7.call(this,"Zone is an abstract class")||this;}
return ZoneIsAbstractError;}(LuxonError);var n="numeric",s="short",l="long";var DATE_SHORT={year:n,month:n,day:n};var DATE_MED={year:n,month:s,day:n};var DATE_MED_WITH_WEEKDAY={year:n,month:s,day:n,weekday:s};var DATE_FULL={year:n,month:l,day:n};var DATE_HUGE={year:n,month:l,day:n,weekday:l};var TIME_SIMPLE={hour:n,minute:n};var TIME_WITH_SECONDS={hour:n,minute:n,second:n};var TIME_WITH_SHORT_OFFSET={hour:n,minute:n,second:n,timeZoneName:s};var TIME_WITH_LONG_OFFSET={hour:n,minute:n,second:n,timeZoneName:l};var TIME_24_SIMPLE={hour:n,minute:n,hour12:false};var TIME_24_WITH_SECONDS={hour:n,minute:n,second:n,hour12:false};var TIME_24_WITH_SHORT_OFFSET={hour:n,minute:n,second:n,hour12:false,timeZoneName:s};var TIME_24_WITH_LONG_OFFSET={hour:n,minute:n,second:n,hour12:false,timeZoneName:l};var DATETIME_SHORT={year:n,month:n,day:n,hour:n,minute:n};var DATETIME_SHORT_WITH_SECONDS={year:n,month:n,day:n,hour:n,minute:n,second:n};var DATETIME_MED={year:n,month:s,day:n,hour:n,minute:n};var DATETIME_MED_WITH_SECONDS={year:n,month:s,day:n,hour:n,minute:n,second:n};var DATETIME_MED_WITH_WEEKDAY={year:n,month:s,day:n,weekday:s,hour:n,minute:n};var DATETIME_FULL={year:n,month:l,day:n,hour:n,minute:n,timeZoneName:s};var DATETIME_FULL_WITH_SECONDS={year:n,month:l,day:n,hour:n,minute:n,second:n,timeZoneName:s};var DATETIME_HUGE={year:n,month:l,day:n,weekday:l,hour:n,minute:n,timeZoneName:l};var DATETIME_HUGE_WITH_SECONDS={year:n,month:l,day:n,weekday:l,hour:n,minute:n,second:n,timeZoneName:l};function isUndefined(o){return typeof o==="undefined";}
function isNumber(o){return typeof o==="number";}
function isInteger(o){return typeof o==="number"&&o%1===0;}
function isString(o){return typeof o==="string";}
function isDate(o){return Object.prototype.toString.call(o)==="[object Date]";}
function hasIntl(){try{return typeof Intl!=="undefined"&&Intl.DateTimeFormat;}catch(e){return false;}}
function hasFormatToParts(){return!isUndefined(Intl.DateTimeFormat.prototype.formatToParts);}
function hasRelative(){try{return typeof Intl!=="undefined"&&!!Intl.RelativeTimeFormat;}catch(e){return false;}}
function maybeArray(thing){return Array.isArray(thing)?thing:[thing];}
function bestBy(arr,by,compare){if(arr.length===0){return undefined;}
return arr.reduce(function(best,next){var pair=[by(next),next];if(!best){return pair;}else if(compare(best[0],pair[0])===best[0]){return best;}else{return pair;}},null)[1];}
function pick(obj,keys){return keys.reduce(function(a,k){a[k]=obj[k];return a;},{});}
function hasOwnProperty(obj,prop){return Object.prototype.hasOwnProperty.call(obj,prop);}
function integerBetween(thing,bottom,top){return isInteger(thing)&&thing>=bottom&&thing<=top;}
function floorMod(x,n){return x-n*Math.floor(x/n);}
function padStart(input,n){if(n===void 0){n=2;}
if(input.toString().length<n){return("0".repeat(n)+input).slice(-n);}else{return input.toString();}}
function parseInteger(string){if(isUndefined(string)||string===null||string===""){return undefined;}else{return parseInt(string,10);}}
function parseMillis(fraction){if(isUndefined(fraction)||fraction===null||fraction===""){return undefined;}else{var f=parseFloat("0."+fraction)*1000;return Math.floor(f);}}
function roundTo(number,digits,towardZero){if(towardZero===void 0){towardZero=false;}
var factor=Math.pow(10,digits),rounder=towardZero?Math.trunc:Math.round;return rounder(number*factor)/factor;}
function isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0);}
function daysInYear(year){return isLeapYear(year)?366:365;}
function daysInMonth(year,month){var modMonth=floorMod(month-1,12)+1,modYear=year+(month-modMonth)/12;if(modMonth===2){return isLeapYear(modYear)?29:28;}else{return[31,null,31,30,31,30,31,31,30,31,30,31][modMonth-1];}}
function objToLocalTS(obj){var d=Date.UTC(obj.year,obj.month-1,obj.day,obj.hour,obj.minute,obj.second,obj.millisecond);if(obj.year<100&&obj.year>=0){d=new Date(d);d.setUTCFullYear(d.getUTCFullYear()-1900);}
return+d;}
function weeksInWeekYear(weekYear){var p1=(weekYear+Math.floor(weekYear/4)-Math.floor(weekYear/100)+Math.floor(weekYear/400))%7,last=weekYear-1,p2=(last+Math.floor(last/4)-Math.floor(last/100)+Math.floor(last/400))%7;return p1===4||p2===3?53:52;}
function untruncateYear(year){if(year>99){return year;}else return year>60?1900+year:2000+year;}
function parseZoneInfo(ts,offsetFormat,locale,timeZone){if(timeZone===void 0){timeZone=null;}
var date=new Date(ts),intlOpts={hour12:false,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"};if(timeZone){intlOpts.timeZone=timeZone;}
var modified=Object.assign({timeZoneName:offsetFormat},intlOpts),intl=hasIntl();if(intl&&hasFormatToParts()){var parsed=new Intl.DateTimeFormat(locale,modified).formatToParts(date).find(function(m){return m.type.toLowerCase()==="timezonename";});return parsed?parsed.value:null;}else if(intl){var without=new Intl.DateTimeFormat(locale,intlOpts).format(date),included=new Intl.DateTimeFormat(locale,modified).format(date),diffed=included.substring(without.length),trimmed=diffed.replace(/^[, \u200e]+/,"");return trimmed;}else{return null;}}
function signedOffset(offHourStr,offMinuteStr){var offHour=parseInt(offHourStr,10);if(Number.isNaN(offHour)){offHour=0;}
var offMin=parseInt(offMinuteStr,10)||0,offMinSigned=offHour<0||Object.is(offHour,-0)?-offMin:offMin;return offHour*60+offMinSigned;}
function asNumber(value){var numericValue=Number(value);if(typeof value==="boolean"||value===""||Number.isNaN(numericValue))throw new InvalidArgumentError("Invalid unit value "+value);return numericValue;}
function normalizeObject(obj,normalizer,nonUnitKeys){var normalized={};for(var u in obj){if(hasOwnProperty(obj,u)){if(nonUnitKeys.indexOf(u)>=0)continue;var v=obj[u];if(v===undefined||v===null)continue;normalized[normalizer(u)]=asNumber(v);}}
return normalized;}
function formatOffset(offset,format){var hours=Math.trunc(Math.abs(offset/60)),minutes=Math.trunc(Math.abs(offset%60)),sign=offset>=0?"+":"-";switch(format){case"short":return""+sign+padStart(hours,2)+":"+padStart(minutes,2);case"narrow":return""+sign+hours+(minutes>0?":"+minutes:"");case"techie":return""+sign+padStart(hours,2)+padStart(minutes,2);default:throw new RangeError("Value format "+format+" is out of range for property format");}}
function timeObject(obj){return pick(obj,["hour","minute","second","millisecond"]);}
var ianaRegex=/[A-Za-z_+-]{1,256}(:?\/[A-Za-z_+-]{1,256}(\/[A-Za-z_+-]{1,256})?)?/;function stringify(obj){return JSON.stringify(obj,Object.keys(obj).sort());}
var monthsLong=["January","February","March","April","May","June","July","August","September","October","November","December"];var monthsShort=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];var monthsNarrow=["J","F","M","A","M","J","J","A","S","O","N","D"];function months(length){switch(length){case"narrow":return monthsNarrow;case"short":return monthsShort;case"long":return monthsLong;case"numeric":return["1","2","3","4","5","6","7","8","9","10","11","12"];case"2-digit":return["01","02","03","04","05","06","07","08","09","10","11","12"];default:return null;}}
var weekdaysLong=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"];var weekdaysShort=["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];var weekdaysNarrow=["M","T","W","T","F","S","S"];function weekdays(length){switch(length){case"narrow":return weekdaysNarrow;case"short":return weekdaysShort;case"long":return weekdaysLong;case"numeric":return["1","2","3","4","5","6","7"];default:return null;}}
var meridiems=["AM","PM"];var erasLong=["Before Christ","Anno Domini"];var erasShort=["BC","AD"];var erasNarrow=["B","A"];function eras(length){switch(length){case"narrow":return erasNarrow;case"short":return erasShort;case"long":return erasLong;default:return null;}}
function meridiemForDateTime(dt){return meridiems[dt.hour<12?0:1];}
function weekdayForDateTime(dt,length){return weekdays(length)[dt.weekday-1];}
function monthForDateTime(dt,length){return months(length)[dt.month-1];}
function eraForDateTime(dt,length){return eras(length)[dt.year<0?0:1];}
function formatRelativeTime(unit,count,numeric,narrow){if(numeric===void 0){numeric="always";}
if(narrow===void 0){narrow=false;}
var units={years:["year","yr."],quarters:["quarter","qtr."],months:["month","mo."],weeks:["week","wk."],days:["day","day","days"],hours:["hour","hr."],minutes:["minute","min."],seconds:["second","sec."]};var lastable=["hours","minutes","seconds"].indexOf(unit)===-1;if(numeric==="auto"&&lastable){var isDay=unit==="days";switch(count){case 1:return isDay?"tomorrow":"next "+units[unit][0];case-1:return isDay?"yesterday":"last "+units[unit][0];case 0:return isDay?"today":"this "+units[unit][0];}}
var isInPast=Object.is(count,-0)||count<0,fmtValue=Math.abs(count),singular=fmtValue===1,lilUnits=units[unit],fmtUnit=narrow?singular?lilUnits[1]:lilUnits[2]||lilUnits[1]:singular?units[unit][0]:unit;return isInPast?fmtValue+" "+fmtUnit+" ago":"in "+fmtValue+" "+fmtUnit;}
function formatString(knownFormat){var filtered=pick(knownFormat,["weekday","era","year","month","day","hour","minute","second","timeZoneName","hour12"]),key=stringify(filtered),dateTimeHuge="EEEE, LLLL d, yyyy, h:mm a";switch(key){case stringify(DATE_SHORT):return"M/d/yyyy";case stringify(DATE_MED):return"LLL d, yyyy";case stringify(DATE_MED_WITH_WEEKDAY):return"EEE, LLL d, yyyy";case stringify(DATE_FULL):return"LLLL d, yyyy";case stringify(DATE_HUGE):return"EEEE, LLLL d, yyyy";case stringify(TIME_SIMPLE):return"h:mm a";case stringify(TIME_WITH_SECONDS):return"h:mm:ss a";case stringify(TIME_WITH_SHORT_OFFSET):return"h:mm a";case stringify(TIME_WITH_LONG_OFFSET):return"h:mm a";case stringify(TIME_24_SIMPLE):return"HH:mm";case stringify(TIME_24_WITH_SECONDS):return"HH:mm:ss";case stringify(TIME_24_WITH_SHORT_OFFSET):return"HH:mm";case stringify(TIME_24_WITH_LONG_OFFSET):return"HH:mm";case stringify(DATETIME_SHORT):return"M/d/yyyy, h:mm a";case stringify(DATETIME_MED):return"LLL d, yyyy, h:mm a";case stringify(DATETIME_FULL):return"LLLL d, yyyy, h:mm a";case stringify(DATETIME_HUGE):return dateTimeHuge;case stringify(DATETIME_SHORT_WITH_SECONDS):return"M/d/yyyy, h:mm:ss a";case stringify(DATETIME_MED_WITH_SECONDS):return"LLL d, yyyy, h:mm:ss a";case stringify(DATETIME_MED_WITH_WEEKDAY):return"EEE, d LLL yyyy, h:mm a";case stringify(DATETIME_FULL_WITH_SECONDS):return"LLLL d, yyyy, h:mm:ss a";case stringify(DATETIME_HUGE_WITH_SECONDS):return"EEEE, LLLL d, yyyy, h:mm:ss a";default:return dateTimeHuge;}}
function stringifyTokens(splits,tokenToString){var s="";for(var _iterator=_createForOfIteratorHelperLoose(splits),_step;!(_step=_iterator()).done;){var token=_step.value;if(token.literal){s+=token.val;}else{s+=tokenToString(token.val);}}
return s;}
var _macroTokenToFormatOpts={D:DATE_SHORT,DD:DATE_MED,DDD:DATE_FULL,DDDD:DATE_HUGE,t:TIME_SIMPLE,tt:TIME_WITH_SECONDS,ttt:TIME_WITH_SHORT_OFFSET,tttt:TIME_WITH_LONG_OFFSET,T:TIME_24_SIMPLE,TT:TIME_24_WITH_SECONDS,TTT:TIME_24_WITH_SHORT_OFFSET,TTTT:TIME_24_WITH_LONG_OFFSET,f:DATETIME_SHORT,ff:DATETIME_MED,fff:DATETIME_FULL,ffff:DATETIME_HUGE,F:DATETIME_SHORT_WITH_SECONDS,FF:DATETIME_MED_WITH_SECONDS,FFF:DATETIME_FULL_WITH_SECONDS,FFFF:DATETIME_HUGE_WITH_SECONDS};var Formatter=function(){Formatter.create=function create(locale,opts){if(opts===void 0){opts={};}
return new Formatter(locale,opts);};Formatter.parseFormat=function parseFormat(fmt){var current=null,currentFull="",bracketed=false;var splits=[];for(var i=0;i<fmt.length;i++){var c=fmt.charAt(i);if(c==="'"){if(currentFull.length>0){splits.push({literal:bracketed,val:currentFull});}
current=null;currentFull="";bracketed=!bracketed;}else if(bracketed){currentFull+=c;}else if(c===current){currentFull+=c;}else{if(currentFull.length>0){splits.push({literal:false,val:currentFull});}
currentFull=c;current=c;}}
if(currentFull.length>0){splits.push({literal:bracketed,val:currentFull});}
return splits;};Formatter.macroTokenToFormatOpts=function macroTokenToFormatOpts(token){return _macroTokenToFormatOpts[token];};function Formatter(locale,formatOpts){this.opts=formatOpts;this.loc=locale;this.systemLoc=null;}
var _proto=Formatter.prototype;_proto.formatWithSystemDefault=function formatWithSystemDefault(dt,opts){if(this.systemLoc===null){this.systemLoc=this.loc.redefaultToSystem();}
var df=this.systemLoc.dtFormatter(dt,Object.assign({},this.opts,opts));return df.format();};_proto.formatDateTime=function formatDateTime(dt,opts){if(opts===void 0){opts={};}
var df=this.loc.dtFormatter(dt,Object.assign({},this.opts,opts));return df.format();};_proto.formatDateTimeParts=function formatDateTimeParts(dt,opts){if(opts===void 0){opts={};}
var df=this.loc.dtFormatter(dt,Object.assign({},this.opts,opts));return df.formatToParts();};_proto.resolvedOptions=function resolvedOptions(dt,opts){if(opts===void 0){opts={};}
var df=this.loc.dtFormatter(dt,Object.assign({},this.opts,opts));return df.resolvedOptions();};_proto.num=function num(n,p){if(p===void 0){p=0;}
if(this.opts.forceSimple){return padStart(n,p);}
var opts=Object.assign({},this.opts);if(p>0){opts.padTo=p;}
return this.loc.numberFormatter(opts).format(n);};_proto.formatDateTimeFromString=function formatDateTimeFromString(dt,fmt){var _this=this;var knownEnglish=this.loc.listingMode()==="en",useDateTimeFormatter=this.loc.outputCalendar&&this.loc.outputCalendar!=="gregory"&&hasFormatToParts(),string=function string(opts,extract){return _this.loc.extract(dt,opts,extract);},formatOffset=function formatOffset(opts){if(dt.isOffsetFixed&&dt.offset===0&&opts.allowZ){return"Z";}
return dt.isValid?dt.zone.formatOffset(dt.ts,opts.format):"";},meridiem=function meridiem(){return knownEnglish?meridiemForDateTime(dt):string({hour:"numeric",hour12:true},"dayperiod");},month=function month(length,standalone){return knownEnglish?monthForDateTime(dt,length):string(standalone?{month:length}:{month:length,day:"numeric"},"month");},weekday=function weekday(length,standalone){return knownEnglish?weekdayForDateTime(dt,length):string(standalone?{weekday:length}:{weekday:length,month:"long",day:"numeric"},"weekday");},maybeMacro=function maybeMacro(token){var formatOpts=Formatter.macroTokenToFormatOpts(token);if(formatOpts){return _this.formatWithSystemDefault(dt,formatOpts);}else{return token;}},era=function era(length){return knownEnglish?eraForDateTime(dt,length):string({era:length},"era");},tokenToString=function tokenToString(token){switch(token){case"S":return _this.num(dt.millisecond);case"u":case"SSS":return _this.num(dt.millisecond,3);case"s":return _this.num(dt.second);case"ss":return _this.num(dt.second,2);case"m":return _this.num(dt.minute);case"mm":return _this.num(dt.minute,2);case"h":return _this.num(dt.hour%12===0?12:dt.hour%12);case"hh":return _this.num(dt.hour%12===0?12:dt.hour%12,2);case"H":return _this.num(dt.hour);case"HH":return _this.num(dt.hour,2);case"Z":return formatOffset({format:"narrow",allowZ:_this.opts.allowZ});case"ZZ":return formatOffset({format:"short",allowZ:_this.opts.allowZ});case"ZZZ":return formatOffset({format:"techie",allowZ:_this.opts.allowZ});case"ZZZZ":return dt.zone.offsetName(dt.ts,{format:"short",locale:_this.loc.locale});case"ZZZZZ":return dt.zone.offsetName(dt.ts,{format:"long",locale:_this.loc.locale});case"z":return dt.zoneName;case"a":return meridiem();case"d":return useDateTimeFormatter?string({day:"numeric"},"day"):_this.num(dt.day);case"dd":return useDateTimeFormatter?string({day:"2-digit"},"day"):_this.num(dt.day,2);case"c":return _this.num(dt.weekday);case"ccc":return weekday("short",true);case"cccc":return weekday("long",true);case"ccccc":return weekday("narrow",true);case"E":return _this.num(dt.weekday);case"EEE":return weekday("short",false);case"EEEE":return weekday("long",false);case"EEEEE":return weekday("narrow",false);case"L":return useDateTimeFormatter?string({month:"numeric",day:"numeric"},"month"):_this.num(dt.month);case"LL":return useDateTimeFormatter?string({month:"2-digit",day:"numeric"},"month"):_this.num(dt.month,2);case"LLL":return month("short",true);case"LLLL":return month("long",true);case"LLLLL":return month("narrow",true);case"M":return useDateTimeFormatter?string({month:"numeric"},"month"):_this.num(dt.month);case"MM":return useDateTimeFormatter?string({month:"2-digit"},"month"):_this.num(dt.month,2);case"MMM":return month("short",false);case"MMMM":return month("long",false);case"MMMMM":return month("narrow",false);case"y":return useDateTimeFormatter?string({year:"numeric"},"year"):_this.num(dt.year);case"yy":return useDateTimeFormatter?string({year:"2-digit"},"year"):_this.num(dt.year.toString().slice(-2),2);case"yyyy":return useDateTimeFormatter?string({year:"numeric"},"year"):_this.num(dt.year,4);case"yyyyyy":return useDateTimeFormatter?string({year:"numeric"},"year"):_this.num(dt.year,6);case"G":return era("short");case"GG":return era("long");case"GGGGG":return era("narrow");case"kk":return _this.num(dt.weekYear.toString().slice(-2),2);case"kkkk":return _this.num(dt.weekYear,4);case"W":return _this.num(dt.weekNumber);case"WW":return _this.num(dt.weekNumber,2);case"o":return _this.num(dt.ordinal);case"ooo":return _this.num(dt.ordinal,3);case"q":return _this.num(dt.quarter);case"qq":return _this.num(dt.quarter,2);case"X":return _this.num(Math.floor(dt.ts/1000));case"x":return _this.num(dt.ts);default:return maybeMacro(token);}};return stringifyTokens(Formatter.parseFormat(fmt),tokenToString);};_proto.formatDurationFromString=function formatDurationFromString(dur,fmt){var _this2=this;var tokenToField=function tokenToField(token){switch(token[0]){case"S":return"millisecond";case"s":return"second";case"m":return"minute";case"h":return"hour";case"d":return"day";case"M":return"month";case"y":return"year";default:return null;}},tokenToString=function tokenToString(lildur){return function(token){var mapped=tokenToField(token);if(mapped){return _this2.num(lildur.get(mapped),token.length);}else{return token;}};},tokens=Formatter.parseFormat(fmt),realTokens=tokens.reduce(function(found,_ref){var literal=_ref.literal,val=_ref.val;return literal?found:found.concat(val);},[]),collapsed=dur.shiftTo.apply(dur,realTokens.map(tokenToField).filter(function(t){return t;}));return stringifyTokens(tokens,tokenToString(collapsed));};return Formatter;}();var Invalid=function(){function Invalid(reason,explanation){this.reason=reason;this.explanation=explanation;}
var _proto=Invalid.prototype;_proto.toMessage=function toMessage(){if(this.explanation){return this.reason+": "+this.explanation;}else{return this.reason;}};return Invalid;}();var Zone=function(){function Zone(){}
var _proto=Zone.prototype;_proto.offsetName=function offsetName(ts,opts){throw new ZoneIsAbstractError();};_proto.formatOffset=function formatOffset(ts,format){throw new ZoneIsAbstractError();};_proto.offset=function offset(ts){throw new ZoneIsAbstractError();};_proto.equals=function equals(otherZone){throw new ZoneIsAbstractError();};_createClass(Zone,[{key:"type",get:function get(){throw new ZoneIsAbstractError();}},{key:"name",get:function get(){throw new ZoneIsAbstractError();}},{key:"universal",get:function get(){throw new ZoneIsAbstractError();}},{key:"isValid",get:function get(){throw new ZoneIsAbstractError();}}]);return Zone;}();var singleton=null;var LocalZone=function(_Zone){_inheritsLoose(LocalZone,_Zone);function LocalZone(){return _Zone.apply(this,arguments)||this;}
var _proto=LocalZone.prototype;_proto.offsetName=function offsetName(ts,_ref){var format=_ref.format,locale=_ref.locale;return parseZoneInfo(ts,format,locale);};_proto.formatOffset=function formatOffset$1(ts,format){return formatOffset(this.offset(ts),format);};_proto.offset=function offset(ts){return-new Date(ts).getTimezoneOffset();};_proto.equals=function equals(otherZone){return otherZone.type==="local";};_createClass(LocalZone,[{key:"type",get:function get(){return"local";}},{key:"name",get:function get(){if(hasIntl()){return new Intl.DateTimeFormat().resolvedOptions().timeZone;}else return"local";}},{key:"universal",get:function get(){return false;}},{key:"isValid",get:function get(){return true;}}],[{key:"instance",get:function get(){if(singleton===null){singleton=new LocalZone();}
return singleton;}}]);return LocalZone;}(Zone);var matchingRegex=RegExp("^"+ianaRegex.source+"$");var dtfCache={};function makeDTF(zone){if(!dtfCache[zone]){dtfCache[zone]=new Intl.DateTimeFormat("en-US",{hour12:false,timeZone:zone,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"});}
return dtfCache[zone];}
var typeToPos={year:0,month:1,day:2,hour:3,minute:4,second:5};function hackyOffset(dtf,date){var formatted=dtf.format(date).replace(/\u200E/g,""),parsed=/(\d+)\/(\d+)\/(\d+),? (\d+):(\d+):(\d+)/.exec(formatted),fMonth=parsed[1],fDay=parsed[2],fYear=parsed[3],fHour=parsed[4],fMinute=parsed[5],fSecond=parsed[6];return[fYear,fMonth,fDay,fHour,fMinute,fSecond];}
function partsOffset(dtf,date){var formatted=dtf.formatToParts(date),filled=[];for(var i=0;i<formatted.length;i++){var _formatted$i=formatted[i],type=_formatted$i.type,value=_formatted$i.value,pos=typeToPos[type];if(!isUndefined(pos)){filled[pos]=parseInt(value,10);}}
return filled;}
var ianaZoneCache={};var IANAZone=function(_Zone){_inheritsLoose(IANAZone,_Zone);IANAZone.create=function create(name){if(!ianaZoneCache[name]){ianaZoneCache[name]=new IANAZone(name);}
return ianaZoneCache[name];};IANAZone.resetCache=function resetCache(){ianaZoneCache={};dtfCache={};};IANAZone.isValidSpecifier=function isValidSpecifier(s){return!!(s&&s.match(matchingRegex));};IANAZone.isValidZone=function isValidZone(zone){try{new Intl.DateTimeFormat("en-US",{timeZone:zone}).format();return true;}catch(e){return false;}};IANAZone.parseGMTOffset=function parseGMTOffset(specifier){if(specifier){var match=specifier.match(/^Etc\/GMT([+-]\d{1,2})$/i);if(match){return-60*parseInt(match[1]);}}
return null;};function IANAZone(name){var _this;_this=_Zone.call(this)||this;_this.zoneName=name;_this.valid=IANAZone.isValidZone(name);return _this;}
var _proto=IANAZone.prototype;_proto.offsetName=function offsetName(ts,_ref){var format=_ref.format,locale=_ref.locale;return parseZoneInfo(ts,format,locale,this.name);};_proto.formatOffset=function formatOffset$1(ts,format){return formatOffset(this.offset(ts),format);};_proto.offset=function offset(ts){var date=new Date(ts),dtf=makeDTF(this.name),_ref2=dtf.formatToParts?partsOffset(dtf,date):hackyOffset(dtf,date),year=_ref2[0],month=_ref2[1],day=_ref2[2],hour=_ref2[3],minute=_ref2[4],second=_ref2[5],adjustedHour=hour===24?0:hour;var asUTC=objToLocalTS({year:year,month:month,day:day,hour:adjustedHour,minute:minute,second:second,millisecond:0});var asTS=+date;var over=asTS%1000;asTS-=over>=0?over:1000+over;return(asUTC-asTS)/(60*1000);};_proto.equals=function equals(otherZone){return otherZone.type==="iana"&&otherZone.name===this.name;};_createClass(IANAZone,[{key:"type",get:function get(){return"iana";}},{key:"name",get:function get(){return this.zoneName;}},{key:"universal",get:function get(){return false;}},{key:"isValid",get:function get(){return this.valid;}}]);return IANAZone;}(Zone);var singleton$1=null;var FixedOffsetZone=function(_Zone){_inheritsLoose(FixedOffsetZone,_Zone);FixedOffsetZone.instance=function instance(offset){return offset===0?FixedOffsetZone.utcInstance:new FixedOffsetZone(offset);};FixedOffsetZone.parseSpecifier=function parseSpecifier(s){if(s){var r=s.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i);if(r){return new FixedOffsetZone(signedOffset(r[1],r[2]));}}
return null;};_createClass(FixedOffsetZone,null,[{key:"utcInstance",get:function get(){if(singleton$1===null){singleton$1=new FixedOffsetZone(0);}
return singleton$1;}}]);function FixedOffsetZone(offset){var _this;_this=_Zone.call(this)||this;_this.fixed=offset;return _this;}
var _proto=FixedOffsetZone.prototype;_proto.offsetName=function offsetName(){return this.name;};_proto.formatOffset=function formatOffset$1(ts,format){return formatOffset(this.fixed,format);};_proto.offset=function offset(){return this.fixed;};_proto.equals=function equals(otherZone){return otherZone.type==="fixed"&&otherZone.fixed===this.fixed;};_createClass(FixedOffsetZone,[{key:"type",get:function get(){return"fixed";}},{key:"name",get:function get(){return this.fixed===0?"UTC":"UTC"+formatOffset(this.fixed,"narrow");}},{key:"universal",get:function get(){return true;}},{key:"isValid",get:function get(){return true;}}]);return FixedOffsetZone;}(Zone);var InvalidZone=function(_Zone){_inheritsLoose(InvalidZone,_Zone);function InvalidZone(zoneName){var _this;_this=_Zone.call(this)||this;_this.zoneName=zoneName;return _this;}
var _proto=InvalidZone.prototype;_proto.offsetName=function offsetName(){return null;};_proto.formatOffset=function formatOffset(){return"";};_proto.offset=function offset(){return NaN;};_proto.equals=function equals(){return false;};_createClass(InvalidZone,[{key:"type",get:function get(){return"invalid";}},{key:"name",get:function get(){return this.zoneName;}},{key:"universal",get:function get(){return false;}},{key:"isValid",get:function get(){return false;}}]);return InvalidZone;}(Zone);function normalizeZone(input,defaultZone){var offset;if(isUndefined(input)||input===null){return defaultZone;}else if(input instanceof Zone){return input;}else if(isString(input)){var lowered=input.toLowerCase();if(lowered==="local")return defaultZone;else if(lowered==="utc"||lowered==="gmt")return FixedOffsetZone.utcInstance;else if((offset=IANAZone.parseGMTOffset(input))!=null){return FixedOffsetZone.instance(offset);}else if(IANAZone.isValidSpecifier(lowered))return IANAZone.create(input);else return FixedOffsetZone.parseSpecifier(lowered)||new InvalidZone(input);}else if(isNumber(input)){return FixedOffsetZone.instance(input);}else if(typeof input==="object"&&input.offset&&typeof input.offset==="number"){return input;}else{return new InvalidZone(input);}}
var now=function now(){return Date.now();},defaultZone=null,defaultLocale=null,defaultNumberingSystem=null,defaultOutputCalendar=null,throwOnInvalid=false;var Settings=function(){function Settings(){}
Settings.resetCaches=function resetCaches(){Locale.resetCache();IANAZone.resetCache();};_createClass(Settings,null,[{key:"now",get:function get(){return now;},set:function set(n){now=n;}},{key:"defaultZoneName",get:function get(){return Settings.defaultZone.name;},set:function set(z){if(!z){defaultZone=null;}else{defaultZone=normalizeZone(z);}}},{key:"defaultZone",get:function get(){return defaultZone||LocalZone.instance;}},{key:"defaultLocale",get:function get(){return defaultLocale;},set:function set(locale){defaultLocale=locale;}},{key:"defaultNumberingSystem",get:function get(){return defaultNumberingSystem;},set:function set(numberingSystem){defaultNumberingSystem=numberingSystem;}},{key:"defaultOutputCalendar",get:function get(){return defaultOutputCalendar;},set:function set(outputCalendar){defaultOutputCalendar=outputCalendar;}},{key:"throwOnInvalid",get:function get(){return throwOnInvalid;},set:function set(t){throwOnInvalid=t;}}]);return Settings;}();var intlDTCache={};function getCachedDTF(locString,opts){if(opts===void 0){opts={};}
var key=JSON.stringify([locString,opts]);var dtf=intlDTCache[key];if(!dtf){dtf=new Intl.DateTimeFormat(locString,opts);intlDTCache[key]=dtf;}
return dtf;}
var intlNumCache={};function getCachedINF(locString,opts){if(opts===void 0){opts={};}
var key=JSON.stringify([locString,opts]);var inf=intlNumCache[key];if(!inf){inf=new Intl.NumberFormat(locString,opts);intlNumCache[key]=inf;}
return inf;}
var intlRelCache={};function getCachedRTF(locString,opts){if(opts===void 0){opts={};}
var _opts=opts,base=_opts.base,cacheKeyOpts=_objectWithoutPropertiesLoose(_opts,["base"]);var key=JSON.stringify([locString,cacheKeyOpts]);var inf=intlRelCache[key];if(!inf){inf=new Intl.RelativeTimeFormat(locString,opts);intlRelCache[key]=inf;}
return inf;}
var sysLocaleCache=null;function systemLocale(){if(sysLocaleCache){return sysLocaleCache;}else if(hasIntl()){var computedSys=new Intl.DateTimeFormat().resolvedOptions().locale;sysLocaleCache=!computedSys||computedSys==="und"?"en-US":computedSys;return sysLocaleCache;}else{sysLocaleCache="en-US";return sysLocaleCache;}}
function parseLocaleString(localeStr){var uIndex=localeStr.indexOf("-u-");if(uIndex===-1){return[localeStr];}else{var options;var smaller=localeStr.substring(0,uIndex);try{options=getCachedDTF(localeStr).resolvedOptions();}catch(e){options=getCachedDTF(smaller).resolvedOptions();}
var _options=options,numberingSystem=_options.numberingSystem,calendar=_options.calendar;return[smaller,numberingSystem,calendar];}}
function intlConfigString(localeStr,numberingSystem,outputCalendar){if(hasIntl()){if(outputCalendar||numberingSystem){localeStr+="-u";if(outputCalendar){localeStr+="-ca-"+outputCalendar;}
if(numberingSystem){localeStr+="-nu-"+numberingSystem;}
return localeStr;}else{return localeStr;}}else{return[];}}
function mapMonths(f){var ms=[];for(var i=1;i<=12;i++){var dt=DateTime.utc(2016,i,1);ms.push(f(dt));}
return ms;}
function mapWeekdays(f){var ms=[];for(var i=1;i<=7;i++){var dt=DateTime.utc(2016,11,13+i);ms.push(f(dt));}
return ms;}
function listStuff(loc,length,defaultOK,englishFn,intlFn){var mode=loc.listingMode(defaultOK);if(mode==="error"){return null;}else if(mode==="en"){return englishFn(length);}else{return intlFn(length);}}
function supportsFastNumbers(loc){if(loc.numberingSystem&&loc.numberingSystem!=="latn"){return false;}else{return loc.numberingSystem==="latn"||!loc.locale||loc.locale.startsWith("en")||hasIntl()&&new Intl.DateTimeFormat(loc.intl).resolvedOptions().numberingSystem==="latn";}}
var PolyNumberFormatter=function(){function PolyNumberFormatter(intl,forceSimple,opts){this.padTo=opts.padTo||0;this.floor=opts.floor||false;if(!forceSimple&&hasIntl()){var intlOpts={useGrouping:false};if(opts.padTo>0)intlOpts.minimumIntegerDigits=opts.padTo;this.inf=getCachedINF(intl,intlOpts);}}
var _proto=PolyNumberFormatter.prototype;_proto.format=function format(i){if(this.inf){var fixed=this.floor?Math.floor(i):i;return this.inf.format(fixed);}else{var _fixed=this.floor?Math.floor(i):roundTo(i,3);return padStart(_fixed,this.padTo);}};return PolyNumberFormatter;}();var PolyDateFormatter=function(){function PolyDateFormatter(dt,intl,opts){this.opts=opts;this.hasIntl=hasIntl();var z;if(dt.zone.universal&&this.hasIntl){z="UTC";if(opts.timeZoneName){this.dt=dt;}else{this.dt=dt.offset===0?dt:DateTime.fromMillis(dt.ts+dt.offset*60*1000);}}else if(dt.zone.type==="local"){this.dt=dt;}else{this.dt=dt;z=dt.zone.name;}
if(this.hasIntl){var intlOpts=Object.assign({},this.opts);if(z){intlOpts.timeZone=z;}
this.dtf=getCachedDTF(intl,intlOpts);}}
var _proto2=PolyDateFormatter.prototype;_proto2.format=function format(){if(this.hasIntl){return this.dtf.format(this.dt.toJSDate());}else{var tokenFormat=formatString(this.opts),loc=Locale.create("en-US");return Formatter.create(loc).formatDateTimeFromString(this.dt,tokenFormat);}};_proto2.formatToParts=function formatToParts(){if(this.hasIntl&&hasFormatToParts()){return this.dtf.formatToParts(this.dt.toJSDate());}else{return[];}};_proto2.resolvedOptions=function resolvedOptions(){if(this.hasIntl){return this.dtf.resolvedOptions();}else{return{locale:"en-US",numberingSystem:"latn",outputCalendar:"gregory"};}};return PolyDateFormatter;}();var PolyRelFormatter=function(){function PolyRelFormatter(intl,isEnglish,opts){this.opts=Object.assign({style:"long"},opts);if(!isEnglish&&hasRelative()){this.rtf=getCachedRTF(intl,opts);}}
var _proto3=PolyRelFormatter.prototype;_proto3.format=function format(count,unit){if(this.rtf){return this.rtf.format(count,unit);}else{return formatRelativeTime(unit,count,this.opts.numeric,this.opts.style!=="long");}};_proto3.formatToParts=function formatToParts(count,unit){if(this.rtf){return this.rtf.formatToParts(count,unit);}else{return[];}};return PolyRelFormatter;}();var Locale=function(){Locale.fromOpts=function fromOpts(opts){return Locale.create(opts.locale,opts.numberingSystem,opts.outputCalendar,opts.defaultToEN);};Locale.create=function create(locale,numberingSystem,outputCalendar,defaultToEN){if(defaultToEN===void 0){defaultToEN=false;}
var specifiedLocale=locale||Settings.defaultLocale,localeR=specifiedLocale||(defaultToEN?"en-US":systemLocale()),numberingSystemR=numberingSystem||Settings.defaultNumberingSystem,outputCalendarR=outputCalendar||Settings.defaultOutputCalendar;return new Locale(localeR,numberingSystemR,outputCalendarR,specifiedLocale);};Locale.resetCache=function resetCache(){sysLocaleCache=null;intlDTCache={};intlNumCache={};intlRelCache={};};Locale.fromObject=function fromObject(_temp){var _ref=_temp===void 0?{}:_temp,locale=_ref.locale,numberingSystem=_ref.numberingSystem,outputCalendar=_ref.outputCalendar;return Locale.create(locale,numberingSystem,outputCalendar);};function Locale(locale,numbering,outputCalendar,specifiedLocale){var _parseLocaleString=parseLocaleString(locale),parsedLocale=_parseLocaleString[0],parsedNumberingSystem=_parseLocaleString[1],parsedOutputCalendar=_parseLocaleString[2];this.locale=parsedLocale;this.numberingSystem=numbering||parsedNumberingSystem||null;this.outputCalendar=outputCalendar||parsedOutputCalendar||null;this.intl=intlConfigString(this.locale,this.numberingSystem,this.outputCalendar);this.weekdaysCache={format:{},standalone:{}};this.monthsCache={format:{},standalone:{}};this.meridiemCache=null;this.eraCache={};this.specifiedLocale=specifiedLocale;this.fastNumbersCached=null;}
var _proto4=Locale.prototype;_proto4.listingMode=function listingMode(defaultOK){if(defaultOK===void 0){defaultOK=true;}
var intl=hasIntl(),hasFTP=intl&&hasFormatToParts(),isActuallyEn=this.isEnglish(),hasNoWeirdness=(this.numberingSystem===null||this.numberingSystem==="latn")&&(this.outputCalendar===null||this.outputCalendar==="gregory");if(!hasFTP&&!(isActuallyEn&&hasNoWeirdness)&&!defaultOK){return"error";}else if(!hasFTP||isActuallyEn&&hasNoWeirdness){return"en";}else{return"intl";}};_proto4.clone=function clone(alts){if(!alts||Object.getOwnPropertyNames(alts).length===0){return this;}else{return Locale.create(alts.locale||this.specifiedLocale,alts.numberingSystem||this.numberingSystem,alts.outputCalendar||this.outputCalendar,alts.defaultToEN||false);}};_proto4.redefaultToEN=function redefaultToEN(alts){if(alts===void 0){alts={};}
return this.clone(Object.assign({},alts,{defaultToEN:true}));};_proto4.redefaultToSystem=function redefaultToSystem(alts){if(alts===void 0){alts={};}
return this.clone(Object.assign({},alts,{defaultToEN:false}));};_proto4.months=function months$1(length,format,defaultOK){var _this=this;if(format===void 0){format=false;}
if(defaultOK===void 0){defaultOK=true;}
return listStuff(this,length,defaultOK,months,function(){var intl=format?{month:length,day:"numeric"}:{month:length},formatStr=format?"format":"standalone";if(!_this.monthsCache[formatStr][length]){_this.monthsCache[formatStr][length]=mapMonths(function(dt){return _this.extract(dt,intl,"month");});}
return _this.monthsCache[formatStr][length];});};_proto4.weekdays=function weekdays$1(length,format,defaultOK){var _this2=this;if(format===void 0){format=false;}
if(defaultOK===void 0){defaultOK=true;}
return listStuff(this,length,defaultOK,weekdays,function(){var intl=format?{weekday:length,year:"numeric",month:"long",day:"numeric"}:{weekday:length},formatStr=format?"format":"standalone";if(!_this2.weekdaysCache[formatStr][length]){_this2.weekdaysCache[formatStr][length]=mapWeekdays(function(dt){return _this2.extract(dt,intl,"weekday");});}
return _this2.weekdaysCache[formatStr][length];});};_proto4.meridiems=function meridiems$1(defaultOK){var _this3=this;if(defaultOK===void 0){defaultOK=true;}
return listStuff(this,undefined,defaultOK,function(){return meridiems;},function(){if(!_this3.meridiemCache){var intl={hour:"numeric",hour12:true};_this3.meridiemCache=[DateTime.utc(2016,11,13,9),DateTime.utc(2016,11,13,19)].map(function(dt){return _this3.extract(dt,intl,"dayperiod");});}
return _this3.meridiemCache;});};_proto4.eras=function eras$1(length,defaultOK){var _this4=this;if(defaultOK===void 0){defaultOK=true;}
return listStuff(this,length,defaultOK,eras,function(){var intl={era:length};if(!_this4.eraCache[length]){_this4.eraCache[length]=[DateTime.utc(-40,1,1),DateTime.utc(2017,1,1)].map(function(dt){return _this4.extract(dt,intl,"era");});}
return _this4.eraCache[length];});};_proto4.extract=function extract(dt,intlOpts,field){var df=this.dtFormatter(dt,intlOpts),results=df.formatToParts(),matching=results.find(function(m){return m.type.toLowerCase()===field;});return matching?matching.value:null;};_proto4.numberFormatter=function numberFormatter(opts){if(opts===void 0){opts={};}
return new PolyNumberFormatter(this.intl,opts.forceSimple||this.fastNumbers,opts);};_proto4.dtFormatter=function dtFormatter(dt,intlOpts){if(intlOpts===void 0){intlOpts={};}
return new PolyDateFormatter(dt,this.intl,intlOpts);};_proto4.relFormatter=function relFormatter(opts){if(opts===void 0){opts={};}
return new PolyRelFormatter(this.intl,this.isEnglish(),opts);};_proto4.isEnglish=function isEnglish(){return this.locale==="en"||this.locale.toLowerCase()==="en-us"||hasIntl()&&new Intl.DateTimeFormat(this.intl).resolvedOptions().locale.startsWith("en-us");};_proto4.equals=function equals(other){return this.locale===other.locale&&this.numberingSystem===other.numberingSystem&&this.outputCalendar===other.outputCalendar;};_createClass(Locale,[{key:"fastNumbers",get:function get(){if(this.fastNumbersCached==null){this.fastNumbersCached=supportsFastNumbers(this);}
return this.fastNumbersCached;}}]);return Locale;}();function combineRegexes(){for(var _len=arguments.length,regexes=new Array(_len),_key=0;_key<_len;_key++){regexes[_key]=arguments[_key];}
var full=regexes.reduce(function(f,r){return f+r.source;},"");return RegExp("^"+full+"$");}
function combineExtractors(){for(var _len2=arguments.length,extractors=new Array(_len2),_key2=0;_key2<_len2;_key2++){extractors[_key2]=arguments[_key2];}
return function(m){return extractors.reduce(function(_ref,ex){var mergedVals=_ref[0],mergedZone=_ref[1],cursor=_ref[2];var _ex=ex(m,cursor),val=_ex[0],zone=_ex[1],next=_ex[2];return[Object.assign(mergedVals,val),mergedZone||zone,next];},[{},null,1]).slice(0,2);};}
function parse(s){if(s==null){return[null,null];}
for(var _len3=arguments.length,patterns=new Array(_len3>1?_len3-1:0),_key3=1;_key3<_len3;_key3++){patterns[_key3-1]=arguments[_key3];}
for(var _i=0,_patterns=patterns;_i<_patterns.length;_i++){var _patterns$_i=_patterns[_i],regex=_patterns$_i[0],extractor=_patterns$_i[1];var m=regex.exec(s);if(m){return extractor(m);}}
return[null,null];}
function simpleParse(){for(var _len4=arguments.length,keys=new Array(_len4),_key4=0;_key4<_len4;_key4++){keys[_key4]=arguments[_key4];}
return function(match,cursor){var ret={};var i;for(i=0;i<keys.length;i++){ret[keys[i]]=parseInteger(match[cursor+i]);}
return[ret,null,cursor+i];};}
var offsetRegex=/(?:(Z)|([+-]\d\d)(?::?(\d\d))?)/,isoTimeBaseRegex=/(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/,isoTimeRegex=RegExp(""+isoTimeBaseRegex.source+offsetRegex.source+"?"),isoTimeExtensionRegex=RegExp("(?:T"+isoTimeRegex.source+")?"),isoYmdRegex=/([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/,isoWeekRegex=/(\d{4})-?W(\d\d)(?:-?(\d))?/,isoOrdinalRegex=/(\d{4})-?(\d{3})/,extractISOWeekData=simpleParse("weekYear","weekNumber","weekDay"),extractISOOrdinalData=simpleParse("year","ordinal"),sqlYmdRegex=/(\d{4})-(\d\d)-(\d\d)/,sqlTimeRegex=RegExp(isoTimeBaseRegex.source+" ?(?:"+offsetRegex.source+"|("+ianaRegex.source+"))?"),sqlTimeExtensionRegex=RegExp("(?: "+sqlTimeRegex.source+")?");function int(match,pos,fallback){var m=match[pos];return isUndefined(m)?fallback:parseInteger(m);}
function extractISOYmd(match,cursor){var item={year:int(match,cursor),month:int(match,cursor+1,1),day:int(match,cursor+2,1)};return[item,null,cursor+3];}
function extractISOTime(match,cursor){var item={hour:int(match,cursor,0),minute:int(match,cursor+1,0),second:int(match,cursor+2,0),millisecond:parseMillis(match[cursor+3])};return[item,null,cursor+4];}
function extractISOOffset(match,cursor){var local=!match[cursor]&&!match[cursor+1],fullOffset=signedOffset(match[cursor+1],match[cursor+2]),zone=local?null:FixedOffsetZone.instance(fullOffset);return[{},zone,cursor+3];}
function extractIANAZone(match,cursor){var zone=match[cursor]?IANAZone.create(match[cursor]):null;return[{},zone,cursor+1];}
var isoDuration=/^-?P(?:(?:(-?\d{1,9})Y)?(?:(-?\d{1,9})M)?(?:(-?\d{1,9})W)?(?:(-?\d{1,9})D)?(?:T(?:(-?\d{1,9})H)?(?:(-?\d{1,9})M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,9}))?S)?)?)$/;function extractISODuration(match){var s=match[0],yearStr=match[1],monthStr=match[2],weekStr=match[3],dayStr=match[4],hourStr=match[5],minuteStr=match[6],secondStr=match[7],millisecondsStr=match[8];var hasNegativePrefix=s[0]==="-";var maybeNegate=function maybeNegate(num){return num&&hasNegativePrefix?-num:num;};return[{years:maybeNegate(parseInteger(yearStr)),months:maybeNegate(parseInteger(monthStr)),weeks:maybeNegate(parseInteger(weekStr)),days:maybeNegate(parseInteger(dayStr)),hours:maybeNegate(parseInteger(hourStr)),minutes:maybeNegate(parseInteger(minuteStr)),seconds:maybeNegate(parseInteger(secondStr)),milliseconds:maybeNegate(parseMillis(millisecondsStr))}];}
var obsOffsets={GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function fromStrings(weekdayStr,yearStr,monthStr,dayStr,hourStr,minuteStr,secondStr){var result={year:yearStr.length===2?untruncateYear(parseInteger(yearStr)):parseInteger(yearStr),month:monthsShort.indexOf(monthStr)+1,day:parseInteger(dayStr),hour:parseInteger(hourStr),minute:parseInteger(minuteStr)};if(secondStr)result.second=parseInteger(secondStr);if(weekdayStr){result.weekday=weekdayStr.length>3?weekdaysLong.indexOf(weekdayStr)+1:weekdaysShort.indexOf(weekdayStr)+1;}
return result;}
var rfc2822=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/;function extractRFC2822(match){var weekdayStr=match[1],dayStr=match[2],monthStr=match[3],yearStr=match[4],hourStr=match[5],minuteStr=match[6],secondStr=match[7],obsOffset=match[8],milOffset=match[9],offHourStr=match[10],offMinuteStr=match[11],result=fromStrings(weekdayStr,yearStr,monthStr,dayStr,hourStr,minuteStr,secondStr);var offset;if(obsOffset){offset=obsOffsets[obsOffset];}else if(milOffset){offset=0;}else{offset=signedOffset(offHourStr,offMinuteStr);}
return[result,new FixedOffsetZone(offset)];}
function preprocessRFC2822(s){return s.replace(/\([^)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").trim();}
var rfc1123=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/,rfc850=/^(Monday|Tuesday|Wedsday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/,ascii=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/;function extractRFC1123Or850(match){var weekdayStr=match[1],dayStr=match[2],monthStr=match[3],yearStr=match[4],hourStr=match[5],minuteStr=match[6],secondStr=match[7],result=fromStrings(weekdayStr,yearStr,monthStr,dayStr,hourStr,minuteStr,secondStr);return[result,FixedOffsetZone.utcInstance];}
function extractASCII(match){var weekdayStr=match[1],monthStr=match[2],dayStr=match[3],hourStr=match[4],minuteStr=match[5],secondStr=match[6],yearStr=match[7],result=fromStrings(weekdayStr,yearStr,monthStr,dayStr,hourStr,minuteStr,secondStr);return[result,FixedOffsetZone.utcInstance];}
var isoYmdWithTimeExtensionRegex=combineRegexes(isoYmdRegex,isoTimeExtensionRegex);var isoWeekWithTimeExtensionRegex=combineRegexes(isoWeekRegex,isoTimeExtensionRegex);var isoOrdinalWithTimeExtensionRegex=combineRegexes(isoOrdinalRegex,isoTimeExtensionRegex);var isoTimeCombinedRegex=combineRegexes(isoTimeRegex);var extractISOYmdTimeAndOffset=combineExtractors(extractISOYmd,extractISOTime,extractISOOffset);var extractISOWeekTimeAndOffset=combineExtractors(extractISOWeekData,extractISOTime,extractISOOffset);var extractISOOrdinalDataAndTime=combineExtractors(extractISOOrdinalData,extractISOTime);var extractISOTimeAndOffset=combineExtractors(extractISOTime,extractISOOffset);function parseISODate(s){return parse(s,[isoYmdWithTimeExtensionRegex,extractISOYmdTimeAndOffset],[isoWeekWithTimeExtensionRegex,extractISOWeekTimeAndOffset],[isoOrdinalWithTimeExtensionRegex,extractISOOrdinalDataAndTime],[isoTimeCombinedRegex,extractISOTimeAndOffset]);}
function parseRFC2822Date(s){return parse(preprocessRFC2822(s),[rfc2822,extractRFC2822]);}
function parseHTTPDate(s){return parse(s,[rfc1123,extractRFC1123Or850],[rfc850,extractRFC1123Or850],[ascii,extractASCII]);}
function parseISODuration(s){return parse(s,[isoDuration,extractISODuration]);}
var sqlYmdWithTimeExtensionRegex=combineRegexes(sqlYmdRegex,sqlTimeExtensionRegex);var sqlTimeCombinedRegex=combineRegexes(sqlTimeRegex);var extractISOYmdTimeOffsetAndIANAZone=combineExtractors(extractISOYmd,extractISOTime,extractISOOffset,extractIANAZone);var extractISOTimeOffsetAndIANAZone=combineExtractors(extractISOTime,extractISOOffset,extractIANAZone);function parseSQL(s){return parse(s,[sqlYmdWithTimeExtensionRegex,extractISOYmdTimeOffsetAndIANAZone],[sqlTimeCombinedRegex,extractISOTimeOffsetAndIANAZone]);}
var INVALID="Invalid Duration";var lowOrderMatrix={weeks:{days:7,hours:7*24,minutes:7*24*60,seconds:7*24*60*60,milliseconds:7*24*60*60*1000},days:{hours:24,minutes:24*60,seconds:24*60*60,milliseconds:24*60*60*1000},hours:{minutes:60,seconds:60*60,milliseconds:60*60*1000},minutes:{seconds:60,milliseconds:60*1000},seconds:{milliseconds:1000}},casualMatrix=Object.assign({years:{quarters:4,months:12,weeks:52,days:365,hours:365*24,minutes:365*24*60,seconds:365*24*60*60,milliseconds:365*24*60*60*1000},quarters:{months:3,weeks:13,days:91,hours:91*24,minutes:91*24*60,seconds:91*24*60*60,milliseconds:91*24*60*60*1000},months:{weeks:4,days:30,hours:30*24,minutes:30*24*60,seconds:30*24*60*60,milliseconds:30*24*60*60*1000}},lowOrderMatrix),daysInYearAccurate=146097.0/400,daysInMonthAccurate=146097.0/4800,accurateMatrix=Object.assign({years:{quarters:4,months:12,weeks:daysInYearAccurate/7,days:daysInYearAccurate,hours:daysInYearAccurate*24,minutes:daysInYearAccurate*24*60,seconds:daysInYearAccurate*24*60*60,milliseconds:daysInYearAccurate*24*60*60*1000},quarters:{months:3,weeks:daysInYearAccurate/28,days:daysInYearAccurate/4,hours:daysInYearAccurate*24/4,minutes:daysInYearAccurate*24*60/4,seconds:daysInYearAccurate*24*60*60/4,milliseconds:daysInYearAccurate*24*60*60*1000/4},months:{weeks:daysInMonthAccurate/7,days:daysInMonthAccurate,hours:daysInMonthAccurate*24,minutes:daysInMonthAccurate*24*60,seconds:daysInMonthAccurate*24*60*60,milliseconds:daysInMonthAccurate*24*60*60*1000}},lowOrderMatrix);var orderedUnits=["years","quarters","months","weeks","days","hours","minutes","seconds","milliseconds"];var reverseUnits=orderedUnits.slice(0).reverse();function clone(dur,alts,clear){if(clear===void 0){clear=false;}
var conf={values:clear?alts.values:Object.assign({},dur.values,alts.values||{}),loc:dur.loc.clone(alts.loc),conversionAccuracy:alts.conversionAccuracy||dur.conversionAccuracy};return new Duration(conf);}
function antiTrunc(n){return n<0?Math.floor(n):Math.ceil(n);}
function convert(matrix,fromMap,fromUnit,toMap,toUnit){var conv=matrix[toUnit][fromUnit],raw=fromMap[fromUnit]/conv,sameSign=Math.sign(raw)===Math.sign(toMap[toUnit]),added=!sameSign&&toMap[toUnit]!==0&&Math.abs(raw)<=1?antiTrunc(raw):Math.trunc(raw);toMap[toUnit]+=added;fromMap[fromUnit]-=added*conv;}
function normalizeValues(matrix,vals){reverseUnits.reduce(function(previous,current){if(!isUndefined(vals[current])){if(previous){convert(matrix,vals,previous,vals,current);}
return current;}else{return previous;}},null);}
var Duration=function(){function Duration(config){var accurate=config.conversionAccuracy==="longterm"||false;this.values=config.values;this.loc=config.loc||Locale.create();this.conversionAccuracy=accurate?"longterm":"casual";this.invalid=config.invalid||null;this.matrix=accurate?accurateMatrix:casualMatrix;this.isLuxonDuration=true;}
Duration.fromMillis=function fromMillis(count,opts){return Duration.fromObject(Object.assign({milliseconds:count},opts));};Duration.fromObject=function fromObject(obj){if(obj==null||typeof obj!=="object"){throw new InvalidArgumentError("Duration.fromObject: argument expected to be an object, got "+(obj===null?"null":typeof obj));}
return new Duration({values:normalizeObject(obj,Duration.normalizeUnit,["locale","numberingSystem","conversionAccuracy","zone"]),loc:Locale.fromObject(obj),conversionAccuracy:obj.conversionAccuracy});};Duration.fromISO=function fromISO(text,opts){var _parseISODuration=parseISODuration(text),parsed=_parseISODuration[0];if(parsed){var obj=Object.assign(parsed,opts);return Duration.fromObject(obj);}else{return Duration.invalid("unparsable","the input \""+text+"\" can't be parsed as ISO 8601");}};Duration.invalid=function invalid(reason,explanation){if(explanation===void 0){explanation=null;}
if(!reason){throw new InvalidArgumentError("need to specify a reason the Duration is invalid");}
var invalid=reason instanceof Invalid?reason:new Invalid(reason,explanation);if(Settings.throwOnInvalid){throw new InvalidDurationError(invalid);}else{return new Duration({invalid:invalid});}};Duration.normalizeUnit=function normalizeUnit(unit){var normalized={year:"years",years:"years",quarter:"quarters",quarters:"quarters",month:"months",months:"months",week:"weeks",weeks:"weeks",day:"days",days:"days",hour:"hours",hours:"hours",minute:"minutes",minutes:"minutes",second:"seconds",seconds:"seconds",millisecond:"milliseconds",milliseconds:"milliseconds"}[unit?unit.toLowerCase():unit];if(!normalized)throw new InvalidUnitError(unit);return normalized;};Duration.isDuration=function isDuration(o){return o&&o.isLuxonDuration||false;};var _proto=Duration.prototype;_proto.toFormat=function toFormat(fmt,opts){if(opts===void 0){opts={};}
var fmtOpts=Object.assign({},opts,{floor:opts.round!==false&&opts.floor!==false});return this.isValid?Formatter.create(this.loc,fmtOpts).formatDurationFromString(this,fmt):INVALID;};_proto.toObject=function toObject(opts){if(opts===void 0){opts={};}
if(!this.isValid)return{};var base=Object.assign({},this.values);if(opts.includeConfig){base.conversionAccuracy=this.conversionAccuracy;base.numberingSystem=this.loc.numberingSystem;base.locale=this.loc.locale;}
return base;};_proto.toISO=function toISO(){if(!this.isValid)return null;var s="P";if(this.years!==0)s+=this.years+"Y";if(this.months!==0||this.quarters!==0)s+=this.months+this.quarters*3+"M";if(this.weeks!==0)s+=this.weeks+"W";if(this.days!==0)s+=this.days+"D";if(this.hours!==0||this.minutes!==0||this.seconds!==0||this.milliseconds!==0)s+="T";if(this.hours!==0)s+=this.hours+"H";if(this.minutes!==0)s+=this.minutes+"M";if(this.seconds!==0||this.milliseconds!==0)
s+=roundTo(this.seconds+this.milliseconds/1000,3)+"S";if(s==="P")s+="T0S";return s;};_proto.toJSON=function toJSON(){return this.toISO();};_proto.toString=function toString(){return this.toISO();};_proto.valueOf=function valueOf(){return this.as("milliseconds");};_proto.plus=function plus(duration){if(!this.isValid)return this;var dur=friendlyDuration(duration),result={};for(var _iterator=_createForOfIteratorHelperLoose(orderedUnits),_step;!(_step=_iterator()).done;){var k=_step.value;if(hasOwnProperty(dur.values,k)||hasOwnProperty(this.values,k)){result[k]=dur.get(k)+this.get(k);}}
return clone(this,{values:result},true);};_proto.minus=function minus(duration){if(!this.isValid)return this;var dur=friendlyDuration(duration);return this.plus(dur.negate());};_proto.mapUnits=function mapUnits(fn){if(!this.isValid)return this;var result={};for(var _i=0,_Object$keys=Object.keys(this.values);_i<_Object$keys.length;_i++){var k=_Object$keys[_i];result[k]=asNumber(fn(this.values[k],k));}
return clone(this,{values:result},true);};_proto.get=function get(unit){return this[Duration.normalizeUnit(unit)];};_proto.set=function set(values){if(!this.isValid)return this;var mixed=Object.assign(this.values,normalizeObject(values,Duration.normalizeUnit,[]));return clone(this,{values:mixed});};_proto.reconfigure=function reconfigure(_temp){var _ref=_temp===void 0?{}:_temp,locale=_ref.locale,numberingSystem=_ref.numberingSystem,conversionAccuracy=_ref.conversionAccuracy;var loc=this.loc.clone({locale:locale,numberingSystem:numberingSystem}),opts={loc:loc};if(conversionAccuracy){opts.conversionAccuracy=conversionAccuracy;}
return clone(this,opts);};_proto.as=function as(unit){return this.isValid?this.shiftTo(unit).get(unit):NaN;};_proto.normalize=function normalize(){if(!this.isValid)return this;var vals=this.toObject();normalizeValues(this.matrix,vals);return clone(this,{values:vals},true);};_proto.shiftTo=function shiftTo(){for(var _len=arguments.length,units=new Array(_len),_key=0;_key<_len;_key++){units[_key]=arguments[_key];}
if(!this.isValid)return this;if(units.length===0){return this;}
units=units.map(function(u){return Duration.normalizeUnit(u);});var built={},accumulated={},vals=this.toObject();var lastUnit;for(var _iterator2=_createForOfIteratorHelperLoose(orderedUnits),_step2;!(_step2=_iterator2()).done;){var k=_step2.value;if(units.indexOf(k)>=0){lastUnit=k;var own=0;for(var ak in accumulated){own+=this.matrix[ak][k]*accumulated[ak];accumulated[ak]=0;}
if(isNumber(vals[k])){own+=vals[k];}
var i=Math.trunc(own);built[k]=i;accumulated[k]=own-i;for(var down in vals){if(orderedUnits.indexOf(down)>orderedUnits.indexOf(k)){convert(this.matrix,vals,down,built,k);}}}else if(isNumber(vals[k])){accumulated[k]=vals[k];}}
for(var key in accumulated){if(accumulated[key]!==0){built[lastUnit]+=key===lastUnit?accumulated[key]:accumulated[key]/this.matrix[lastUnit][key];}}
return clone(this,{values:built},true).normalize();};_proto.negate=function negate(){if(!this.isValid)return this;var negated={};for(var _i2=0,_Object$keys2=Object.keys(this.values);_i2<_Object$keys2.length;_i2++){var k=_Object$keys2[_i2];negated[k]=-this.values[k];}
return clone(this,{values:negated},true);};_proto.equals=function equals(other){if(!this.isValid||!other.isValid){return false;}
if(!this.loc.equals(other.loc)){return false;}
for(var _iterator3=_createForOfIteratorHelperLoose(orderedUnits),_step3;!(_step3=_iterator3()).done;){var u=_step3.value;if(this.values[u]!==other.values[u]){return false;}}
return true;};_createClass(Duration,[{key:"locale",get:function get(){return this.isValid?this.loc.locale:null;}},{key:"numberingSystem",get:function get(){return this.isValid?this.loc.numberingSystem:null;}},{key:"years",get:function get(){return this.isValid?this.values.years||0:NaN;}},{key:"quarters",get:function get(){return this.isValid?this.values.quarters||0:NaN;}},{key:"months",get:function get(){return this.isValid?this.values.months||0:NaN;}},{key:"weeks",get:function get(){return this.isValid?this.values.weeks||0:NaN;}},{key:"days",get:function get(){return this.isValid?this.values.days||0:NaN;}},{key:"hours",get:function get(){return this.isValid?this.values.hours||0:NaN;}},{key:"minutes",get:function get(){return this.isValid?this.values.minutes||0:NaN;}},{key:"seconds",get:function get(){return this.isValid?this.values.seconds||0:NaN;}},{key:"milliseconds",get:function get(){return this.isValid?this.values.milliseconds||0:NaN;}},{key:"isValid",get:function get(){return this.invalid===null;}},{key:"invalidReason",get:function get(){return this.invalid?this.invalid.reason:null;}},{key:"invalidExplanation",get:function get(){return this.invalid?this.invalid.explanation:null;}}]);return Duration;}();function friendlyDuration(durationish){if(isNumber(durationish)){return Duration.fromMillis(durationish);}else if(Duration.isDuration(durationish)){return durationish;}else if(typeof durationish==="object"){return Duration.fromObject(durationish);}else{throw new InvalidArgumentError("Unknown duration argument "+durationish+" of type "+typeof durationish);}}
var INVALID$1="Invalid Interval";function validateStartEnd(start,end){if(!start||!start.isValid){return Interval.invalid("missing or invalid start");}else if(!end||!end.isValid){return Interval.invalid("missing or invalid end");}else if(end<start){return Interval.invalid("end before start","The end of an interval must be after its start, but you had start="+start.toISO()+" and end="+end.toISO());}else{return null;}}
var Interval=function(){function Interval(config){this.s=config.start;this.e=config.end;this.invalid=config.invalid||null;this.isLuxonInterval=true;}
Interval.invalid=function invalid(reason,explanation){if(explanation===void 0){explanation=null;}
if(!reason){throw new InvalidArgumentError("need to specify a reason the Interval is invalid");}
var invalid=reason instanceof Invalid?reason:new Invalid(reason,explanation);if(Settings.throwOnInvalid){throw new InvalidIntervalError(invalid);}else{return new Interval({invalid:invalid});}};Interval.fromDateTimes=function fromDateTimes(start,end){var builtStart=friendlyDateTime(start),builtEnd=friendlyDateTime(end);var validateError=validateStartEnd(builtStart,builtEnd);if(validateError==null){return new Interval({start:builtStart,end:builtEnd});}else{return validateError;}};Interval.after=function after(start,duration){var dur=friendlyDuration(duration),dt=friendlyDateTime(start);return Interval.fromDateTimes(dt,dt.plus(dur));};Interval.before=function before(end,duration){var dur=friendlyDuration(duration),dt=friendlyDateTime(end);return Interval.fromDateTimes(dt.minus(dur),dt);};Interval.fromISO=function fromISO(text,opts){var _split=(text||"").split("/",2),s=_split[0],e=_split[1];if(s&&e){var start,startIsValid;try{start=DateTime.fromISO(s,opts);startIsValid=start.isValid;}catch(e){startIsValid=false;}
var end,endIsValid;try{end=DateTime.fromISO(e,opts);endIsValid=end.isValid;}catch(e){endIsValid=false;}
if(startIsValid&&endIsValid){return Interval.fromDateTimes(start,end);}
if(startIsValid){var dur=Duration.fromISO(e,opts);if(dur.isValid){return Interval.after(start,dur);}}else if(endIsValid){var _dur=Duration.fromISO(s,opts);if(_dur.isValid){return Interval.before(end,_dur);}}}
return Interval.invalid("unparsable","the input \""+text+"\" can't be parsed as ISO 8601");};Interval.isInterval=function isInterval(o){return o&&o.isLuxonInterval||false;};var _proto=Interval.prototype;_proto.length=function length(unit){if(unit===void 0){unit="milliseconds";}
return this.isValid?this.toDuration.apply(this,[unit]).get(unit):NaN;};_proto.count=function count(unit){if(unit===void 0){unit="milliseconds";}
if(!this.isValid)return NaN;var start=this.start.startOf(unit),end=this.end.startOf(unit);return Math.floor(end.diff(start,unit).get(unit))+1;};_proto.hasSame=function hasSame(unit){return this.isValid?this.isEmpty()||this.e.minus(1).hasSame(this.s,unit):false;};_proto.isEmpty=function isEmpty(){return this.s.valueOf()===this.e.valueOf();};_proto.isAfter=function isAfter(dateTime){if(!this.isValid)return false;return this.s>dateTime;};_proto.isBefore=function isBefore(dateTime){if(!this.isValid)return false;return this.e<=dateTime;};_proto.contains=function contains(dateTime){if(!this.isValid)return false;return this.s<=dateTime&&this.e>dateTime;};_proto.set=function set(_temp){var _ref=_temp===void 0?{}:_temp,start=_ref.start,end=_ref.end;if(!this.isValid)return this;return Interval.fromDateTimes(start||this.s,end||this.e);};_proto.splitAt=function splitAt(){var _this=this;if(!this.isValid)return[];for(var _len=arguments.length,dateTimes=new Array(_len),_key=0;_key<_len;_key++){dateTimes[_key]=arguments[_key];}
var sorted=dateTimes.map(friendlyDateTime).filter(function(d){return _this.contains(d);}).sort(),results=[];var s=this.s,i=0;while(s<this.e){var added=sorted[i]||this.e,next=+added>+this.e?this.e:added;results.push(Interval.fromDateTimes(s,next));s=next;i+=1;}
return results;};_proto.splitBy=function splitBy(duration){var dur=friendlyDuration(duration);if(!this.isValid||!dur.isValid||dur.as("milliseconds")===0){return[];}
var s=this.s,added,next;var results=[];while(s<this.e){added=s.plus(dur);next=+added>+this.e?this.e:added;results.push(Interval.fromDateTimes(s,next));s=next;}
return results;};_proto.divideEqually=function divideEqually(numberOfParts){if(!this.isValid)return[];return this.splitBy(this.length()/numberOfParts).slice(0,numberOfParts);};_proto.overlaps=function overlaps(other){return this.e>other.s&&this.s<other.e;};_proto.abutsStart=function abutsStart(other){if(!this.isValid)return false;return+this.e===+other.s;};_proto.abutsEnd=function abutsEnd(other){if(!this.isValid)return false;return+other.e===+this.s;};_proto.engulfs=function engulfs(other){if(!this.isValid)return false;return this.s<=other.s&&this.e>=other.e;};_proto.equals=function equals(other){if(!this.isValid||!other.isValid){return false;}
return this.s.equals(other.s)&&this.e.equals(other.e);};_proto.intersection=function intersection(other){if(!this.isValid)return this;var s=this.s>other.s?this.s:other.s,e=this.e<other.e?this.e:other.e;if(s>e){return null;}else{return Interval.fromDateTimes(s,e);}};_proto.union=function union(other){if(!this.isValid)return this;var s=this.s<other.s?this.s:other.s,e=this.e>other.e?this.e:other.e;return Interval.fromDateTimes(s,e);};Interval.merge=function merge(intervals){var _intervals$sort$reduc=intervals.sort(function(a,b){return a.s-b.s;}).reduce(function(_ref2,item){var sofar=_ref2[0],current=_ref2[1];if(!current){return[sofar,item];}else if(current.overlaps(item)||current.abutsStart(item)){return[sofar,current.union(item)];}else{return[sofar.concat([current]),item];}},[[],null]),found=_intervals$sort$reduc[0],final=_intervals$sort$reduc[1];if(final){found.push(final);}
return found;};Interval.xor=function xor(intervals){var _Array$prototype;var start=null,currentCount=0;var results=[],ends=intervals.map(function(i){return[{time:i.s,type:"s"},{time:i.e,type:"e"}];}),flattened=(_Array$prototype=Array.prototype).concat.apply(_Array$prototype,ends),arr=flattened.sort(function(a,b){return a.time-b.time;});for(var _iterator=_createForOfIteratorHelperLoose(arr),_step;!(_step=_iterator()).done;){var i=_step.value;currentCount+=i.type==="s"?1:-1;if(currentCount===1){start=i.time;}else{if(start&&+start!==+i.time){results.push(Interval.fromDateTimes(start,i.time));}
start=null;}}
return Interval.merge(results);};_proto.difference=function difference(){var _this2=this;for(var _len2=arguments.length,intervals=new Array(_len2),_key2=0;_key2<_len2;_key2++){intervals[_key2]=arguments[_key2];}
return Interval.xor([this].concat(intervals)).map(function(i){return _this2.intersection(i);}).filter(function(i){return i&&!i.isEmpty();});};_proto.toString=function toString(){if(!this.isValid)return INVALID$1;return"["+this.s.toISO()+" \u2013 "+this.e.toISO()+")";};_proto.toISO=function toISO(opts){if(!this.isValid)return INVALID$1;return this.s.toISO(opts)+"/"+this.e.toISO(opts);};_proto.toISODate=function toISODate(){if(!this.isValid)return INVALID$1;return this.s.toISODate()+"/"+this.e.toISODate();};_proto.toISOTime=function toISOTime(opts){if(!this.isValid)return INVALID$1;return this.s.toISOTime(opts)+"/"+this.e.toISOTime(opts);};_proto.toFormat=function toFormat(dateFormat,_temp2){var _ref3=_temp2===void 0?{}:_temp2,_ref3$separator=_ref3.separator,separator=_ref3$separator===void 0?" – ":_ref3$separator;if(!this.isValid)return INVALID$1;return""+this.s.toFormat(dateFormat)+separator+this.e.toFormat(dateFormat);};_proto.toDuration=function toDuration(unit,opts){if(!this.isValid){return Duration.invalid(this.invalidReason);}
return this.e.diff(this.s,unit,opts);};_proto.mapEndpoints=function mapEndpoints(mapFn){return Interval.fromDateTimes(mapFn(this.s),mapFn(this.e));};_createClass(Interval,[{key:"start",get:function get(){return this.isValid?this.s:null;}},{key:"end",get:function get(){return this.isValid?this.e:null;}},{key:"isValid",get:function get(){return this.invalidReason===null;}},{key:"invalidReason",get:function get(){return this.invalid?this.invalid.reason:null;}},{key:"invalidExplanation",get:function get(){return this.invalid?this.invalid.explanation:null;}}]);return Interval;}();var Info=function(){function Info(){}
Info.hasDST=function hasDST(zone){if(zone===void 0){zone=Settings.defaultZone;}
var proto=DateTime.local().setZone(zone).set({month:12});return!zone.universal&&proto.offset!==proto.set({month:6}).offset;};Info.isValidIANAZone=function isValidIANAZone(zone){return IANAZone.isValidSpecifier(zone)&&IANAZone.isValidZone(zone);};Info.normalizeZone=function normalizeZone$1(input){return normalizeZone(input,Settings.defaultZone);};Info.months=function months(length,_temp){if(length===void 0){length="long";}
var _ref=_temp===void 0?{}:_temp,_ref$locale=_ref.locale,locale=_ref$locale===void 0?null:_ref$locale,_ref$numberingSystem=_ref.numberingSystem,numberingSystem=_ref$numberingSystem===void 0?null:_ref$numberingSystem,_ref$outputCalendar=_ref.outputCalendar,outputCalendar=_ref$outputCalendar===void 0?"gregory":_ref$outputCalendar;return Locale.create(locale,numberingSystem,outputCalendar).months(length);};Info.monthsFormat=function monthsFormat(length,_temp2){if(length===void 0){length="long";}
var _ref2=_temp2===void 0?{}:_temp2,_ref2$locale=_ref2.locale,locale=_ref2$locale===void 0?null:_ref2$locale,_ref2$numberingSystem=_ref2.numberingSystem,numberingSystem=_ref2$numberingSystem===void 0?null:_ref2$numberingSystem,_ref2$outputCalendar=_ref2.outputCalendar,outputCalendar=_ref2$outputCalendar===void 0?"gregory":_ref2$outputCalendar;return Locale.create(locale,numberingSystem,outputCalendar).months(length,true);};Info.weekdays=function weekdays(length,_temp3){if(length===void 0){length="long";}
var _ref3=_temp3===void 0?{}:_temp3,_ref3$locale=_ref3.locale,locale=_ref3$locale===void 0?null:_ref3$locale,_ref3$numberingSystem=_ref3.numberingSystem,numberingSystem=_ref3$numberingSystem===void 0?null:_ref3$numberingSystem;return Locale.create(locale,numberingSystem,null).weekdays(length);};Info.weekdaysFormat=function weekdaysFormat(length,_temp4){if(length===void 0){length="long";}
var _ref4=_temp4===void 0?{}:_temp4,_ref4$locale=_ref4.locale,locale=_ref4$locale===void 0?null:_ref4$locale,_ref4$numberingSystem=_ref4.numberingSystem,numberingSystem=_ref4$numberingSystem===void 0?null:_ref4$numberingSystem;return Locale.create(locale,numberingSystem,null).weekdays(length,true);};Info.meridiems=function meridiems(_temp5){var _ref5=_temp5===void 0?{}:_temp5,_ref5$locale=_ref5.locale,locale=_ref5$locale===void 0?null:_ref5$locale;return Locale.create(locale).meridiems();};Info.eras=function eras(length,_temp6){if(length===void 0){length="short";}
var _ref6=_temp6===void 0?{}:_temp6,_ref6$locale=_ref6.locale,locale=_ref6$locale===void 0?null:_ref6$locale;return Locale.create(locale,null,"gregory").eras(length);};Info.features=function features(){var intl=false,intlTokens=false,zones=false,relative=false;if(hasIntl()){intl=true;intlTokens=hasFormatToParts();relative=hasRelative();try{zones=new Intl.DateTimeFormat("en",{timeZone:"America/New_York"}).resolvedOptions().timeZone==="America/New_York";}catch(e){zones=false;}}
return{intl:intl,intlTokens:intlTokens,zones:zones,relative:relative};};return Info;}();function dayDiff(earlier,later){var utcDayStart=function utcDayStart(dt){return dt.toUTC(0,{keepLocalTime:true}).startOf("day").valueOf();},ms=utcDayStart(later)-utcDayStart(earlier);return Math.floor(Duration.fromMillis(ms).as("days"));}
function highOrderDiffs(cursor,later,units){var differs=[["years",function(a,b){return b.year-a.year;}],["months",function(a,b){return b.month-a.month+(b.year-a.year)*12;}],["weeks",function(a,b){var days=dayDiff(a,b);return(days-days%7)/7;}],["days",dayDiff]];var results={};var lowestOrder,highWater;for(var _i=0,_differs=differs;_i<_differs.length;_i++){var _differs$_i=_differs[_i],unit=_differs$_i[0],differ=_differs$_i[1];if(units.indexOf(unit)>=0){var _cursor$plus;lowestOrder=unit;var delta=differ(cursor,later);highWater=cursor.plus((_cursor$plus={},_cursor$plus[unit]=delta,_cursor$plus));if(highWater>later){var _cursor$plus2;cursor=cursor.plus((_cursor$plus2={},_cursor$plus2[unit]=delta-1,_cursor$plus2));delta-=1;}else{cursor=highWater;}
results[unit]=delta;}}
return[cursor,results,highWater,lowestOrder];}
function _diff(earlier,later,units,opts){var _highOrderDiffs=highOrderDiffs(earlier,later,units),cursor=_highOrderDiffs[0],results=_highOrderDiffs[1],highWater=_highOrderDiffs[2],lowestOrder=_highOrderDiffs[3];var remainingMillis=later-cursor;var lowerOrderUnits=units.filter(function(u){return["hours","minutes","seconds","milliseconds"].indexOf(u)>=0;});if(lowerOrderUnits.length===0){if(highWater<later){var _cursor$plus3;highWater=cursor.plus((_cursor$plus3={},_cursor$plus3[lowestOrder]=1,_cursor$plus3));}
if(highWater!==cursor){results[lowestOrder]=(results[lowestOrder]||0)+remainingMillis/(highWater-cursor);}}
var duration=Duration.fromObject(Object.assign(results,opts));if(lowerOrderUnits.length>0){var _Duration$fromMillis;return(_Duration$fromMillis=Duration.fromMillis(remainingMillis,opts)).shiftTo.apply(_Duration$fromMillis,lowerOrderUnits).plus(duration);}else{return duration;}}
var numberingSystems={arab:"[\u0660-\u0669]",arabext:"[\u06F0-\u06F9]",bali:"[\u1B50-\u1B59]",beng:"[\u09E6-\u09EF]",deva:"[\u0966-\u096F]",fullwide:"[\uFF10-\uFF19]",gujr:"[\u0AE6-\u0AEF]",hanidec:"[〇|一|二|三|四|五|六|七|八|九]",khmr:"[\u17E0-\u17E9]",knda:"[\u0CE6-\u0CEF]",laoo:"[\u0ED0-\u0ED9]",limb:"[\u1946-\u194F]",mlym:"[\u0D66-\u0D6F]",mong:"[\u1810-\u1819]",mymr:"[\u1040-\u1049]",orya:"[\u0B66-\u0B6F]",tamldec:"[\u0BE6-\u0BEF]",telu:"[\u0C66-\u0C6F]",thai:"[\u0E50-\u0E59]",tibt:"[\u0F20-\u0F29]",latn:"\\d"};var numberingSystemsUTF16={arab:[1632,1641],arabext:[1776,1785],bali:[6992,7001],beng:[2534,2543],deva:[2406,2415],fullwide:[65296,65303],gujr:[2790,2799],khmr:[6112,6121],knda:[3302,3311],laoo:[3792,3801],limb:[6470,6479],mlym:[3430,3439],mong:[6160,6169],mymr:[4160,4169],orya:[2918,2927],tamldec:[3046,3055],telu:[3174,3183],thai:[3664,3673],tibt:[3872,3881]};var hanidecChars=numberingSystems.hanidec.replace(/[\[|\]]/g,"").split("");function parseDigits(str){var value=parseInt(str,10);if(isNaN(value)){value="";for(var i=0;i<str.length;i++){var code=str.charCodeAt(i);if(str[i].search(numberingSystems.hanidec)!==-1){value+=hanidecChars.indexOf(str[i]);}else{for(var key in numberingSystemsUTF16){var _numberingSystemsUTF=numberingSystemsUTF16[key],min=_numberingSystemsUTF[0],max=_numberingSystemsUTF[1];if(code>=min&&code<=max){value+=code-min;}}}}
return parseInt(value,10);}else{return value;}}
function digitRegex(_ref,append){var numberingSystem=_ref.numberingSystem;if(append===void 0){append="";}
return new RegExp(""+numberingSystems[numberingSystem||"latn"]+append);}
var MISSING_FTP="missing Intl.DateTimeFormat.formatToParts support";function intUnit(regex,post){if(post===void 0){post=function post(i){return i;};}
return{regex:regex,deser:function deser(_ref){var s=_ref[0];return post(parseDigits(s));}};}
var NBSP=String.fromCharCode(160);var spaceOrNBSP="[ "+NBSP+"]";var spaceOrNBSPRegExp=new RegExp(spaceOrNBSP,"g");function fixListRegex(s){return s.replace(/\./g,"\\.?").replace(spaceOrNBSPRegExp,spaceOrNBSP);}
function stripInsensitivities(s){return s.replace(/\./g,"").replace(spaceOrNBSPRegExp," ").toLowerCase();}
function oneOf(strings,startIndex){if(strings===null){return null;}else{return{regex:RegExp(strings.map(fixListRegex).join("|")),deser:function deser(_ref2){var s=_ref2[0];return strings.findIndex(function(i){return stripInsensitivities(s)===stripInsensitivities(i);})+startIndex;}};}}
function offset(regex,groups){return{regex:regex,deser:function deser(_ref3){var h=_ref3[1],m=_ref3[2];return signedOffset(h,m);},groups:groups};}
function simple(regex){return{regex:regex,deser:function deser(_ref4){var s=_ref4[0];return s;}};}
function escapeToken(value){return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");}
function unitForToken(token,loc){var one=digitRegex(loc),two=digitRegex(loc,"{2}"),three=digitRegex(loc,"{3}"),four=digitRegex(loc,"{4}"),six=digitRegex(loc,"{6}"),oneOrTwo=digitRegex(loc,"{1,2}"),oneToThree=digitRegex(loc,"{1,3}"),oneToSix=digitRegex(loc,"{1,6}"),oneToNine=digitRegex(loc,"{1,9}"),twoToFour=digitRegex(loc,"{2,4}"),fourToSix=digitRegex(loc,"{4,6}"),literal=function literal(t){return{regex:RegExp(escapeToken(t.val)),deser:function deser(_ref5){var s=_ref5[0];return s;},literal:true};},unitate=function unitate(t){if(token.literal){return literal(t);}
switch(t.val){case"G":return oneOf(loc.eras("short",false),0);case"GG":return oneOf(loc.eras("long",false),0);case"y":return intUnit(oneToSix);case"yy":return intUnit(twoToFour,untruncateYear);case"yyyy":return intUnit(four);case"yyyyy":return intUnit(fourToSix);case"yyyyyy":return intUnit(six);case"M":return intUnit(oneOrTwo);case"MM":return intUnit(two);case"MMM":return oneOf(loc.months("short",true,false),1);case"MMMM":return oneOf(loc.months("long",true,false),1);case"L":return intUnit(oneOrTwo);case"LL":return intUnit(two);case"LLL":return oneOf(loc.months("short",false,false),1);case"LLLL":return oneOf(loc.months("long",false,false),1);case"d":return intUnit(oneOrTwo);case"dd":return intUnit(two);case"o":return intUnit(oneToThree);case"ooo":return intUnit(three);case"HH":return intUnit(two);case"H":return intUnit(oneOrTwo);case"hh":return intUnit(two);case"h":return intUnit(oneOrTwo);case"mm":return intUnit(two);case"m":return intUnit(oneOrTwo);case"q":return intUnit(oneOrTwo);case"qq":return intUnit(two);case"s":return intUnit(oneOrTwo);case"ss":return intUnit(two);case"S":return intUnit(oneToThree);case"SSS":return intUnit(three);case"u":return simple(oneToNine);case"a":return oneOf(loc.meridiems(),0);case"kkkk":return intUnit(four);case"kk":return intUnit(twoToFour,untruncateYear);case"W":return intUnit(oneOrTwo);case"WW":return intUnit(two);case"E":case"c":return intUnit(one);case"EEE":return oneOf(loc.weekdays("short",false,false),1);case"EEEE":return oneOf(loc.weekdays("long",false,false),1);case"ccc":return oneOf(loc.weekdays("short",true,false),1);case"cccc":return oneOf(loc.weekdays("long",true,false),1);case"Z":case"ZZ":return offset(new RegExp("([+-]"+oneOrTwo.source+")(?::("+two.source+"))?"),2);case"ZZZ":return offset(new RegExp("([+-]"+oneOrTwo.source+")("+two.source+")?"),2);case"z":return simple(/[a-z_+-/]{1,256}?/i);default:return literal(t);}};var unit=unitate(token)||{invalidReason:MISSING_FTP};unit.token=token;return unit;}
var partTypeStyleToTokenVal={year:{"2-digit":"yy",numeric:"yyyyy"},month:{numeric:"M","2-digit":"MM",short:"MMM",long:"MMMM"},day:{numeric:"d","2-digit":"dd"},weekday:{short:"EEE",long:"EEEE"},dayperiod:"a",dayPeriod:"a",hour:{numeric:"h","2-digit":"hh"},minute:{numeric:"m","2-digit":"mm"},second:{numeric:"s","2-digit":"ss"}};function tokenForPart(part,locale,formatOpts){var type=part.type,value=part.value;if(type==="literal"){return{literal:true,val:value};}
var style=formatOpts[type];var val=partTypeStyleToTokenVal[type];if(typeof val==="object"){val=val[style];}
if(val){return{literal:false,val:val};}
return undefined;}
function buildRegex(units){var re=units.map(function(u){return u.regex;}).reduce(function(f,r){return f+"("+r.source+")";},"");return["^"+re+"$",units];}
function match(input,regex,handlers){var matches=input.match(regex);if(matches){var all={};var matchIndex=1;for(var i in handlers){if(hasOwnProperty(handlers,i)){var h=handlers[i],groups=h.groups?h.groups+1:1;if(!h.literal&&h.token){all[h.token.val[0]]=h.deser(matches.slice(matchIndex,matchIndex+groups));}
matchIndex+=groups;}}
return[matches,all];}else{return[matches,{}];}}
function dateTimeFromMatches(matches){var toField=function toField(token){switch(token){case"S":return"millisecond";case"s":return"second";case"m":return"minute";case"h":case"H":return"hour";case"d":return"day";case"o":return"ordinal";case"L":case"M":return"month";case"y":return"year";case"E":case"c":return"weekday";case"W":return"weekNumber";case"k":return"weekYear";case"q":return"quarter";default:return null;}};var zone;if(!isUndefined(matches.Z)){zone=new FixedOffsetZone(matches.Z);}else if(!isUndefined(matches.z)){zone=IANAZone.create(matches.z);}else{zone=null;}
if(!isUndefined(matches.q)){matches.M=(matches.q-1)*3+1;}
if(!isUndefined(matches.h)){if(matches.h<12&&matches.a===1){matches.h+=12;}else if(matches.h===12&&matches.a===0){matches.h=0;}}
if(matches.G===0&&matches.y){matches.y=-matches.y;}
if(!isUndefined(matches.u)){matches.S=parseMillis(matches.u);}
var vals=Object.keys(matches).reduce(function(r,k){var f=toField(k);if(f){r[f]=matches[k];}
return r;},{});return[vals,zone];}
var dummyDateTimeCache=null;function getDummyDateTime(){if(!dummyDateTimeCache){dummyDateTimeCache=DateTime.fromMillis(1555555555555);}
return dummyDateTimeCache;}
function maybeExpandMacroToken(token,locale){if(token.literal){return token;}
var formatOpts=Formatter.macroTokenToFormatOpts(token.val);if(!formatOpts){return token;}
var formatter=Formatter.create(locale,formatOpts);var parts=formatter.formatDateTimeParts(getDummyDateTime());var tokens=parts.map(function(p){return tokenForPart(p,locale,formatOpts);});if(tokens.includes(undefined)){return token;}
return tokens;}
function expandMacroTokens(tokens,locale){var _Array$prototype;return(_Array$prototype=Array.prototype).concat.apply(_Array$prototype,tokens.map(function(t){return maybeExpandMacroToken(t,locale);}));}
function explainFromTokens(locale,input,format){var tokens=expandMacroTokens(Formatter.parseFormat(format),locale),units=tokens.map(function(t){return unitForToken(t,locale);}),disqualifyingUnit=units.find(function(t){return t.invalidReason;});if(disqualifyingUnit){return{input:input,tokens:tokens,invalidReason:disqualifyingUnit.invalidReason};}else{var _buildRegex=buildRegex(units),regexString=_buildRegex[0],handlers=_buildRegex[1],regex=RegExp(regexString,"i"),_match=match(input,regex,handlers),rawMatches=_match[0],matches=_match[1],_ref6=matches?dateTimeFromMatches(matches):[null,null],result=_ref6[0],zone=_ref6[1];if(hasOwnProperty(matches,"a")&&hasOwnProperty(matches,"H")){throw new ConflictingSpecificationError("Can't include meridiem when specifying 24-hour format");}
return{input:input,tokens:tokens,regex:regex,rawMatches:rawMatches,matches:matches,result:result,zone:zone};}}
function parseFromTokens(locale,input,format){var _explainFromTokens=explainFromTokens(locale,input,format),result=_explainFromTokens.result,zone=_explainFromTokens.zone,invalidReason=_explainFromTokens.invalidReason;return[result,zone,invalidReason];}
var nonLeapLadder=[0,31,59,90,120,151,181,212,243,273,304,334],leapLadder=[0,31,60,91,121,152,182,213,244,274,305,335];function unitOutOfRange(unit,value){return new Invalid("unit out of range","you specified "+value+" (of type "+typeof value+") as a "+unit+", which is invalid");}
function dayOfWeek(year,month,day){var js=new Date(Date.UTC(year,month-1,day)).getUTCDay();return js===0?7:js;}
function computeOrdinal(year,month,day){return day+(isLeapYear(year)?leapLadder:nonLeapLadder)[month-1];}
function uncomputeOrdinal(year,ordinal){var table=isLeapYear(year)?leapLadder:nonLeapLadder,month0=table.findIndex(function(i){return i<ordinal;}),day=ordinal-table[month0];return{month:month0+1,day:day};}
function gregorianToWeek(gregObj){var year=gregObj.year,month=gregObj.month,day=gregObj.day,ordinal=computeOrdinal(year,month,day),weekday=dayOfWeek(year,month,day);var weekNumber=Math.floor((ordinal-weekday+10)/7),weekYear;if(weekNumber<1){weekYear=year-1;weekNumber=weeksInWeekYear(weekYear);}else if(weekNumber>weeksInWeekYear(year)){weekYear=year+1;weekNumber=1;}else{weekYear=year;}
return Object.assign({weekYear:weekYear,weekNumber:weekNumber,weekday:weekday},timeObject(gregObj));}
function weekToGregorian(weekData){var weekYear=weekData.weekYear,weekNumber=weekData.weekNumber,weekday=weekData.weekday,weekdayOfJan4=dayOfWeek(weekYear,1,4),yearInDays=daysInYear(weekYear);var ordinal=weekNumber*7+weekday-weekdayOfJan4-3,year;if(ordinal<1){year=weekYear-1;ordinal+=daysInYear(year);}else if(ordinal>yearInDays){year=weekYear+1;ordinal-=daysInYear(weekYear);}else{year=weekYear;}
var _uncomputeOrdinal=uncomputeOrdinal(year,ordinal),month=_uncomputeOrdinal.month,day=_uncomputeOrdinal.day;return Object.assign({year:year,month:month,day:day},timeObject(weekData));}
function gregorianToOrdinal(gregData){var year=gregData.year,month=gregData.month,day=gregData.day,ordinal=computeOrdinal(year,month,day);return Object.assign({year:year,ordinal:ordinal},timeObject(gregData));}
function ordinalToGregorian(ordinalData){var year=ordinalData.year,ordinal=ordinalData.ordinal,_uncomputeOrdinal2=uncomputeOrdinal(year,ordinal),month=_uncomputeOrdinal2.month,day=_uncomputeOrdinal2.day;return Object.assign({year:year,month:month,day:day},timeObject(ordinalData));}
function hasInvalidWeekData(obj){var validYear=isInteger(obj.weekYear),validWeek=integerBetween(obj.weekNumber,1,weeksInWeekYear(obj.weekYear)),validWeekday=integerBetween(obj.weekday,1,7);if(!validYear){return unitOutOfRange("weekYear",obj.weekYear);}else if(!validWeek){return unitOutOfRange("week",obj.week);}else if(!validWeekday){return unitOutOfRange("weekday",obj.weekday);}else return false;}
function hasInvalidOrdinalData(obj){var validYear=isInteger(obj.year),validOrdinal=integerBetween(obj.ordinal,1,daysInYear(obj.year));if(!validYear){return unitOutOfRange("year",obj.year);}else if(!validOrdinal){return unitOutOfRange("ordinal",obj.ordinal);}else return false;}
function hasInvalidGregorianData(obj){var validYear=isInteger(obj.year),validMonth=integerBetween(obj.month,1,12),validDay=integerBetween(obj.day,1,daysInMonth(obj.year,obj.month));if(!validYear){return unitOutOfRange("year",obj.year);}else if(!validMonth){return unitOutOfRange("month",obj.month);}else if(!validDay){return unitOutOfRange("day",obj.day);}else return false;}
function hasInvalidTimeData(obj){var hour=obj.hour,minute=obj.minute,second=obj.second,millisecond=obj.millisecond;var validHour=integerBetween(hour,0,23)||hour===24&&minute===0&&second===0&&millisecond===0,validMinute=integerBetween(minute,0,59),validSecond=integerBetween(second,0,59),validMillisecond=integerBetween(millisecond,0,999);if(!validHour){return unitOutOfRange("hour",hour);}else if(!validMinute){return unitOutOfRange("minute",minute);}else if(!validSecond){return unitOutOfRange("second",second);}else if(!validMillisecond){return unitOutOfRange("millisecond",millisecond);}else return false;}
var INVALID$2="Invalid DateTime";var MAX_DATE=8.64e15;function unsupportedZone(zone){return new Invalid("unsupported zone","the zone \""+zone.name+"\" is not supported");}
function possiblyCachedWeekData(dt){if(dt.weekData===null){dt.weekData=gregorianToWeek(dt.c);}
return dt.weekData;}
function clone$1(inst,alts){var current={ts:inst.ts,zone:inst.zone,c:inst.c,o:inst.o,loc:inst.loc,invalid:inst.invalid};return new DateTime(Object.assign({},current,alts,{old:current}));}
function fixOffset(localTS,o,tz){var utcGuess=localTS-o*60*1000;var o2=tz.offset(utcGuess);if(o===o2){return[utcGuess,o];}
utcGuess-=(o2-o)*60*1000;var o3=tz.offset(utcGuess);if(o2===o3){return[utcGuess,o2];}
return[localTS-Math.min(o2,o3)*60*1000,Math.max(o2,o3)];}
function tsToObj(ts,offset){ts+=offset*60*1000;var d=new Date(ts);return{year:d.getUTCFullYear(),month:d.getUTCMonth()+1,day:d.getUTCDate(),hour:d.getUTCHours(),minute:d.getUTCMinutes(),second:d.getUTCSeconds(),millisecond:d.getUTCMilliseconds()};}
function objToTS(obj,offset,zone){return fixOffset(objToLocalTS(obj),offset,zone);}
function adjustTime(inst,dur){var oPre=inst.o,year=inst.c.year+Math.trunc(dur.years),month=inst.c.month+Math.trunc(dur.months)+Math.trunc(dur.quarters)*3,c=Object.assign({},inst.c,{year:year,month:month,day:Math.min(inst.c.day,daysInMonth(year,month))+Math.trunc(dur.days)+Math.trunc(dur.weeks)*7}),millisToAdd=Duration.fromObject({years:dur.years-Math.trunc(dur.years),quarters:dur.quarters-Math.trunc(dur.quarters),months:dur.months-Math.trunc(dur.months),weeks:dur.weeks-Math.trunc(dur.weeks),days:dur.days-Math.trunc(dur.days),hours:dur.hours,minutes:dur.minutes,seconds:dur.seconds,milliseconds:dur.milliseconds}).as("milliseconds"),localTS=objToLocalTS(c);var _fixOffset=fixOffset(localTS,oPre,inst.zone),ts=_fixOffset[0],o=_fixOffset[1];if(millisToAdd!==0){ts+=millisToAdd;o=inst.zone.offset(ts);}
return{ts:ts,o:o};}
function parseDataToDateTime(parsed,parsedZone,opts,format,text){var setZone=opts.setZone,zone=opts.zone;if(parsed&&Object.keys(parsed).length!==0){var interpretationZone=parsedZone||zone,inst=DateTime.fromObject(Object.assign(parsed,opts,{zone:interpretationZone,setZone:undefined}));return setZone?inst:inst.setZone(zone);}else{return DateTime.invalid(new Invalid("unparsable","the input \""+text+"\" can't be parsed as "+format));}}
function toTechFormat(dt,format,allowZ){if(allowZ===void 0){allowZ=true;}
return dt.isValid?Formatter.create(Locale.create("en-US"),{allowZ:allowZ,forceSimple:true}).formatDateTimeFromString(dt,format):null;}
function toTechTimeFormat(dt,_ref){var _ref$suppressSeconds=_ref.suppressSeconds,suppressSeconds=_ref$suppressSeconds===void 0?false:_ref$suppressSeconds,_ref$suppressMillisec=_ref.suppressMilliseconds,suppressMilliseconds=_ref$suppressMillisec===void 0?false:_ref$suppressMillisec,includeOffset=_ref.includeOffset,_ref$includeZone=_ref.includeZone,includeZone=_ref$includeZone===void 0?false:_ref$includeZone,_ref$spaceZone=_ref.spaceZone,spaceZone=_ref$spaceZone===void 0?false:_ref$spaceZone,_ref$format=_ref.format,format=_ref$format===void 0?"extended":_ref$format;var fmt=format==="basic"?"HHmm":"HH:mm";if(!suppressSeconds||dt.second!==0||dt.millisecond!==0){fmt+=format==="basic"?"ss":":ss";if(!suppressMilliseconds||dt.millisecond!==0){fmt+=".SSS";}}
if((includeZone||includeOffset)&&spaceZone){fmt+=" ";}
if(includeZone){fmt+="z";}else if(includeOffset){fmt+=format==="basic"?"ZZZ":"ZZ";}
return toTechFormat(dt,fmt);}
var defaultUnitValues={month:1,day:1,hour:0,minute:0,second:0,millisecond:0},defaultWeekUnitValues={weekNumber:1,weekday:1,hour:0,minute:0,second:0,millisecond:0},defaultOrdinalUnitValues={ordinal:1,hour:0,minute:0,second:0,millisecond:0};var orderedUnits$1=["year","month","day","hour","minute","second","millisecond"],orderedWeekUnits=["weekYear","weekNumber","weekday","hour","minute","second","millisecond"],orderedOrdinalUnits=["year","ordinal","hour","minute","second","millisecond"];function normalizeUnit(unit){var normalized={year:"year",years:"year",month:"month",months:"month",day:"day",days:"day",hour:"hour",hours:"hour",minute:"minute",minutes:"minute",quarter:"quarter",quarters:"quarter",second:"second",seconds:"second",millisecond:"millisecond",milliseconds:"millisecond",weekday:"weekday",weekdays:"weekday",weeknumber:"weekNumber",weeksnumber:"weekNumber",weeknumbers:"weekNumber",weekyear:"weekYear",weekyears:"weekYear",ordinal:"ordinal"}[unit.toLowerCase()];if(!normalized)throw new InvalidUnitError(unit);return normalized;}
function quickDT(obj,zone){for(var _iterator=_createForOfIteratorHelperLoose(orderedUnits$1),_step;!(_step=_iterator()).done;){var u=_step.value;if(isUndefined(obj[u])){obj[u]=defaultUnitValues[u];}}
var invalid=hasInvalidGregorianData(obj)||hasInvalidTimeData(obj);if(invalid){return DateTime.invalid(invalid);}
var tsNow=Settings.now(),offsetProvis=zone.offset(tsNow),_objToTS=objToTS(obj,offsetProvis,zone),ts=_objToTS[0],o=_objToTS[1];return new DateTime({ts:ts,zone:zone,o:o});}
function diffRelative(start,end,opts){var round=isUndefined(opts.round)?true:opts.round,format=function format(c,unit){c=roundTo(c,round||opts.calendary?0:2,true);var formatter=end.loc.clone(opts).relFormatter(opts);return formatter.format(c,unit);},differ=function differ(unit){if(opts.calendary){if(!end.hasSame(start,unit)){return end.startOf(unit).diff(start.startOf(unit),unit).get(unit);}else return 0;}else{return end.diff(start,unit).get(unit);}};if(opts.unit){return format(differ(opts.unit),opts.unit);}
for(var _iterator2=_createForOfIteratorHelperLoose(opts.units),_step2;!(_step2=_iterator2()).done;){var unit=_step2.value;var count=differ(unit);if(Math.abs(count)>=1){return format(count,unit);}}
return format(0,opts.units[opts.units.length-1]);}
var DateTime=function(){function DateTime(config){var zone=config.zone||Settings.defaultZone;var invalid=config.invalid||(Number.isNaN(config.ts)?new Invalid("invalid input"):null)||(!zone.isValid?unsupportedZone(zone):null);this.ts=isUndefined(config.ts)?Settings.now():config.ts;var c=null,o=null;if(!invalid){var unchanged=config.old&&config.old.ts===this.ts&&config.old.zone.equals(zone);if(unchanged){var _ref2=[config.old.c,config.old.o];c=_ref2[0];o=_ref2[1];}else{var ot=zone.offset(this.ts);c=tsToObj(this.ts,ot);invalid=Number.isNaN(c.year)?new Invalid("invalid input"):null;c=invalid?null:c;o=invalid?null:ot;}}
this._zone=zone;this.loc=config.loc||Locale.create();this.invalid=invalid;this.weekData=null;this.c=c;this.o=o;this.isLuxonDateTime=true;}
DateTime.local=function local(year,month,day,hour,minute,second,millisecond){if(isUndefined(year)){return new DateTime({ts:Settings.now()});}else{return quickDT({year:year,month:month,day:day,hour:hour,minute:minute,second:second,millisecond:millisecond},Settings.defaultZone);}};DateTime.utc=function utc(year,month,day,hour,minute,second,millisecond){if(isUndefined(year)){return new DateTime({ts:Settings.now(),zone:FixedOffsetZone.utcInstance});}else{return quickDT({year:year,month:month,day:day,hour:hour,minute:minute,second:second,millisecond:millisecond},FixedOffsetZone.utcInstance);}};DateTime.fromJSDate=function fromJSDate(date,options){if(options===void 0){options={};}
var ts=isDate(date)?date.valueOf():NaN;if(Number.isNaN(ts)){return DateTime.invalid("invalid input");}
var zoneToUse=normalizeZone(options.zone,Settings.defaultZone);if(!zoneToUse.isValid){return DateTime.invalid(unsupportedZone(zoneToUse));}
return new DateTime({ts:ts,zone:zoneToUse,loc:Locale.fromObject(options)});};DateTime.fromMillis=function fromMillis(milliseconds,options){if(options===void 0){options={};}
if(!isNumber(milliseconds)){throw new InvalidArgumentError("fromMillis requires a numerical input, but received a "+typeof milliseconds+" with value "+milliseconds);}else if(milliseconds<-MAX_DATE||milliseconds>MAX_DATE){return DateTime.invalid("Timestamp out of range");}else{return new DateTime({ts:milliseconds,zone:normalizeZone(options.zone,Settings.defaultZone),loc:Locale.fromObject(options)});}};DateTime.fromSeconds=function fromSeconds(seconds,options){if(options===void 0){options={};}
if(!isNumber(seconds)){throw new InvalidArgumentError("fromSeconds requires a numerical input");}else{return new DateTime({ts:seconds*1000,zone:normalizeZone(options.zone,Settings.defaultZone),loc:Locale.fromObject(options)});}};DateTime.fromObject=function fromObject(obj){var zoneToUse=normalizeZone(obj.zone,Settings.defaultZone);if(!zoneToUse.isValid){return DateTime.invalid(unsupportedZone(zoneToUse));}
var tsNow=Settings.now(),offsetProvis=zoneToUse.offset(tsNow),normalized=normalizeObject(obj,normalizeUnit,["zone","locale","outputCalendar","numberingSystem"]),containsOrdinal=!isUndefined(normalized.ordinal),containsGregorYear=!isUndefined(normalized.year),containsGregorMD=!isUndefined(normalized.month)||!isUndefined(normalized.day),containsGregor=containsGregorYear||containsGregorMD,definiteWeekDef=normalized.weekYear||normalized.weekNumber,loc=Locale.fromObject(obj);if((containsGregor||containsOrdinal)&&definiteWeekDef){throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals");}
if(containsGregorMD&&containsOrdinal){throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day");}
var useWeekData=definiteWeekDef||normalized.weekday&&!containsGregor;var units,defaultValues,objNow=tsToObj(tsNow,offsetProvis);if(useWeekData){units=orderedWeekUnits;defaultValues=defaultWeekUnitValues;objNow=gregorianToWeek(objNow);}else if(containsOrdinal){units=orderedOrdinalUnits;defaultValues=defaultOrdinalUnitValues;objNow=gregorianToOrdinal(objNow);}else{units=orderedUnits$1;defaultValues=defaultUnitValues;}
var foundFirst=false;for(var _iterator3=_createForOfIteratorHelperLoose(units),_step3;!(_step3=_iterator3()).done;){var u=_step3.value;var v=normalized[u];if(!isUndefined(v)){foundFirst=true;}else if(foundFirst){normalized[u]=defaultValues[u];}else{normalized[u]=objNow[u];}}
var higherOrderInvalid=useWeekData?hasInvalidWeekData(normalized):containsOrdinal?hasInvalidOrdinalData(normalized):hasInvalidGregorianData(normalized),invalid=higherOrderInvalid||hasInvalidTimeData(normalized);if(invalid){return DateTime.invalid(invalid);}
var gregorian=useWeekData?weekToGregorian(normalized):containsOrdinal?ordinalToGregorian(normalized):normalized,_objToTS2=objToTS(gregorian,offsetProvis,zoneToUse),tsFinal=_objToTS2[0],offsetFinal=_objToTS2[1],inst=new DateTime({ts:tsFinal,zone:zoneToUse,o:offsetFinal,loc:loc});if(normalized.weekday&&containsGregor&&obj.weekday!==inst.weekday){return DateTime.invalid("mismatched weekday","you can't specify both a weekday of "+normalized.weekday+" and a date of "+inst.toISO());}
return inst;};DateTime.fromISO=function fromISO(text,opts){if(opts===void 0){opts={};}
var _parseISODate=parseISODate(text),vals=_parseISODate[0],parsedZone=_parseISODate[1];return parseDataToDateTime(vals,parsedZone,opts,"ISO 8601",text);};DateTime.fromRFC2822=function fromRFC2822(text,opts){if(opts===void 0){opts={};}
var _parseRFC2822Date=parseRFC2822Date(text),vals=_parseRFC2822Date[0],parsedZone=_parseRFC2822Date[1];return parseDataToDateTime(vals,parsedZone,opts,"RFC 2822",text);};DateTime.fromHTTP=function fromHTTP(text,opts){if(opts===void 0){opts={};}
var _parseHTTPDate=parseHTTPDate(text),vals=_parseHTTPDate[0],parsedZone=_parseHTTPDate[1];return parseDataToDateTime(vals,parsedZone,opts,"HTTP",opts);};DateTime.fromFormat=function fromFormat(text,fmt,opts){if(opts===void 0){opts={};}
if(isUndefined(text)||isUndefined(fmt)){throw new InvalidArgumentError("fromFormat requires an input string and a format");}
var _opts=opts,_opts$locale=_opts.locale,locale=_opts$locale===void 0?null:_opts$locale,_opts$numberingSystem=_opts.numberingSystem,numberingSystem=_opts$numberingSystem===void 0?null:_opts$numberingSystem,localeToUse=Locale.fromOpts({locale:locale,numberingSystem:numberingSystem,defaultToEN:true}),_parseFromTokens=parseFromTokens(localeToUse,text,fmt),vals=_parseFromTokens[0],parsedZone=_parseFromTokens[1],invalid=_parseFromTokens[2];if(invalid){return DateTime.invalid(invalid);}else{return parseDataToDateTime(vals,parsedZone,opts,"format "+fmt,text);}};DateTime.fromString=function fromString(text,fmt,opts){if(opts===void 0){opts={};}
return DateTime.fromFormat(text,fmt,opts);};DateTime.fromSQL=function fromSQL(text,opts){if(opts===void 0){opts={};}
var _parseSQL=parseSQL(text),vals=_parseSQL[0],parsedZone=_parseSQL[1];return parseDataToDateTime(vals,parsedZone,opts,"SQL",text);};DateTime.invalid=function invalid(reason,explanation){if(explanation===void 0){explanation=null;}
if(!reason){throw new InvalidArgumentError("need to specify a reason the DateTime is invalid");}
var invalid=reason instanceof Invalid?reason:new Invalid(reason,explanation);if(Settings.throwOnInvalid){throw new InvalidDateTimeError(invalid);}else{return new DateTime({invalid:invalid});}};DateTime.isDateTime=function isDateTime(o){return o&&o.isLuxonDateTime||false;};var _proto=DateTime.prototype;_proto.get=function get(unit){return this[unit];};_proto.resolvedLocaleOpts=function resolvedLocaleOpts(opts){if(opts===void 0){opts={};}
var _Formatter$create$res=Formatter.create(this.loc.clone(opts),opts).resolvedOptions(this),locale=_Formatter$create$res.locale,numberingSystem=_Formatter$create$res.numberingSystem,calendar=_Formatter$create$res.calendar;return{locale:locale,numberingSystem:numberingSystem,outputCalendar:calendar};};_proto.toUTC=function toUTC(offset,opts){if(offset===void 0){offset=0;}
if(opts===void 0){opts={};}
return this.setZone(FixedOffsetZone.instance(offset),opts);};_proto.toLocal=function toLocal(){return this.setZone(Settings.defaultZone);};_proto.setZone=function setZone(zone,_temp){var _ref3=_temp===void 0?{}:_temp,_ref3$keepLocalTime=_ref3.keepLocalTime,keepLocalTime=_ref3$keepLocalTime===void 0?false:_ref3$keepLocalTime,_ref3$keepCalendarTim=_ref3.keepCalendarTime,keepCalendarTime=_ref3$keepCalendarTim===void 0?false:_ref3$keepCalendarTim;zone=normalizeZone(zone,Settings.defaultZone);if(zone.equals(this.zone)){return this;}else if(!zone.isValid){return DateTime.invalid(unsupportedZone(zone));}else{var newTS=this.ts;if(keepLocalTime||keepCalendarTime){var offsetGuess=zone.offset(this.ts);var asObj=this.toObject();var _objToTS3=objToTS(asObj,offsetGuess,zone);newTS=_objToTS3[0];}
return clone$1(this,{ts:newTS,zone:zone});}};_proto.reconfigure=function reconfigure(_temp2){var _ref4=_temp2===void 0?{}:_temp2,locale=_ref4.locale,numberingSystem=_ref4.numberingSystem,outputCalendar=_ref4.outputCalendar;var loc=this.loc.clone({locale:locale,numberingSystem:numberingSystem,outputCalendar:outputCalendar});return clone$1(this,{loc:loc});};_proto.setLocale=function setLocale(locale){return this.reconfigure({locale:locale});};_proto.set=function set(values){if(!this.isValid)return this;var normalized=normalizeObject(values,normalizeUnit,[]),settingWeekStuff=!isUndefined(normalized.weekYear)||!isUndefined(normalized.weekNumber)||!isUndefined(normalized.weekday);var mixed;if(settingWeekStuff){mixed=weekToGregorian(Object.assign(gregorianToWeek(this.c),normalized));}else if(!isUndefined(normalized.ordinal)){mixed=ordinalToGregorian(Object.assign(gregorianToOrdinal(this.c),normalized));}else{mixed=Object.assign(this.toObject(),normalized);if(isUndefined(normalized.day)){mixed.day=Math.min(daysInMonth(mixed.year,mixed.month),mixed.day);}}
var _objToTS4=objToTS(mixed,this.o,this.zone),ts=_objToTS4[0],o=_objToTS4[1];return clone$1(this,{ts:ts,o:o});};_proto.plus=function plus(duration){if(!this.isValid)return this;var dur=friendlyDuration(duration);return clone$1(this,adjustTime(this,dur));};_proto.minus=function minus(duration){if(!this.isValid)return this;var dur=friendlyDuration(duration).negate();return clone$1(this,adjustTime(this,dur));};_proto.startOf=function startOf(unit){if(!this.isValid)return this;var o={},normalizedUnit=Duration.normalizeUnit(unit);switch(normalizedUnit){case"years":o.month=1;case"quarters":case"months":o.day=1;case"weeks":case"days":o.hour=0;case"hours":o.minute=0;case"minutes":o.second=0;case"seconds":o.millisecond=0;break;}
if(normalizedUnit==="weeks"){o.weekday=1;}
if(normalizedUnit==="quarters"){var q=Math.ceil(this.month/3);o.month=(q-1)*3+1;}
return this.set(o);};_proto.endOf=function endOf(unit){var _this$plus;return this.isValid?this.plus((_this$plus={},_this$plus[unit]=1,_this$plus)).startOf(unit).minus(1):this;};_proto.toFormat=function toFormat(fmt,opts){if(opts===void 0){opts={};}
return this.isValid?Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this,fmt):INVALID$2;};_proto.toLocaleString=function toLocaleString(opts){if(opts===void 0){opts=DATE_SHORT;}
return this.isValid?Formatter.create(this.loc.clone(opts),opts).formatDateTime(this):INVALID$2;};_proto.toLocaleParts=function toLocaleParts(opts){if(opts===void 0){opts={};}
return this.isValid?Formatter.create(this.loc.clone(opts),opts).formatDateTimeParts(this):[];};_proto.toISO=function toISO(opts){if(opts===void 0){opts={};}
if(!this.isValid){return null;}
return this.toISODate(opts)+"T"+this.toISOTime(opts);};_proto.toISODate=function toISODate(_temp3){var _ref5=_temp3===void 0?{}:_temp3,_ref5$format=_ref5.format,format=_ref5$format===void 0?"extended":_ref5$format;var fmt=format==="basic"?"yyyyMMdd":"yyyy-MM-dd";if(this.year>9999){fmt="+"+fmt;}
return toTechFormat(this,fmt);};_proto.toISOWeekDate=function toISOWeekDate(){return toTechFormat(this,"kkkk-'W'WW-c");};_proto.toISOTime=function toISOTime(_temp4){var _ref6=_temp4===void 0?{}:_temp4,_ref6$suppressMillise=_ref6.suppressMilliseconds,suppressMilliseconds=_ref6$suppressMillise===void 0?false:_ref6$suppressMillise,_ref6$suppressSeconds=_ref6.suppressSeconds,suppressSeconds=_ref6$suppressSeconds===void 0?false:_ref6$suppressSeconds,_ref6$includeOffset=_ref6.includeOffset,includeOffset=_ref6$includeOffset===void 0?true:_ref6$includeOffset,_ref6$format=_ref6.format,format=_ref6$format===void 0?"extended":_ref6$format;return toTechTimeFormat(this,{suppressSeconds:suppressSeconds,suppressMilliseconds:suppressMilliseconds,includeOffset:includeOffset,format:format});};_proto.toRFC2822=function toRFC2822(){return toTechFormat(this,"EEE, dd LLL yyyy HH:mm:ss ZZZ",false);};_proto.toHTTP=function toHTTP(){return toTechFormat(this.toUTC(),"EEE, dd LLL yyyy HH:mm:ss 'GMT'");};_proto.toSQLDate=function toSQLDate(){return toTechFormat(this,"yyyy-MM-dd");};_proto.toSQLTime=function toSQLTime(_temp5){var _ref7=_temp5===void 0?{}:_temp5,_ref7$includeOffset=_ref7.includeOffset,includeOffset=_ref7$includeOffset===void 0?true:_ref7$includeOffset,_ref7$includeZone=_ref7.includeZone,includeZone=_ref7$includeZone===void 0?false:_ref7$includeZone;return toTechTimeFormat(this,{includeOffset:includeOffset,includeZone:includeZone,spaceZone:true});};_proto.toSQL=function toSQL(opts){if(opts===void 0){opts={};}
if(!this.isValid){return null;}
return this.toSQLDate()+" "+this.toSQLTime(opts);};_proto.toString=function toString(){return this.isValid?this.toISO():INVALID$2;};_proto.valueOf=function valueOf(){return this.toMillis();};_proto.toMillis=function toMillis(){return this.isValid?this.ts:NaN;};_proto.toSeconds=function toSeconds(){return this.isValid?this.ts/1000:NaN;};_proto.toJSON=function toJSON(){return this.toISO();};_proto.toBSON=function toBSON(){return this.toJSDate();};_proto.toObject=function toObject(opts){if(opts===void 0){opts={};}
if(!this.isValid)return{};var base=Object.assign({},this.c);if(opts.includeConfig){base.outputCalendar=this.outputCalendar;base.numberingSystem=this.loc.numberingSystem;base.locale=this.loc.locale;}
return base;};_proto.toJSDate=function toJSDate(){return new Date(this.isValid?this.ts:NaN);};_proto.diff=function diff(otherDateTime,unit,opts){if(unit===void 0){unit="milliseconds";}
if(opts===void 0){opts={};}
if(!this.isValid||!otherDateTime.isValid){return Duration.invalid(this.invalid||otherDateTime.invalid,"created by diffing an invalid DateTime");}
var durOpts=Object.assign({locale:this.locale,numberingSystem:this.numberingSystem},opts);var units=maybeArray(unit).map(Duration.normalizeUnit),otherIsLater=otherDateTime.valueOf()>this.valueOf(),earlier=otherIsLater?this:otherDateTime,later=otherIsLater?otherDateTime:this,diffed=_diff(earlier,later,units,durOpts);return otherIsLater?diffed.negate():diffed;};_proto.diffNow=function diffNow(unit,opts){if(unit===void 0){unit="milliseconds";}
if(opts===void 0){opts={};}
return this.diff(DateTime.local(),unit,opts);};_proto.until=function until(otherDateTime){return this.isValid?Interval.fromDateTimes(this,otherDateTime):this;};_proto.hasSame=function hasSame(otherDateTime,unit){if(!this.isValid)return false;if(unit==="millisecond"){return this.valueOf()===otherDateTime.valueOf();}else{var inputMs=otherDateTime.valueOf();return this.startOf(unit)<=inputMs&&inputMs<=this.endOf(unit);}};_proto.equals=function equals(other){return this.isValid&&other.isValid&&this.valueOf()===other.valueOf()&&this.zone.equals(other.zone)&&this.loc.equals(other.loc);};_proto.toRelative=function toRelative(options){if(options===void 0){options={};}
if(!this.isValid)return null;var base=options.base||DateTime.fromObject({zone:this.zone}),padding=options.padding?this<base?-options.padding:options.padding:0;return diffRelative(base,this.plus(padding),Object.assign(options,{numeric:"always",units:["years","months","days","hours","minutes","seconds"]}));};_proto.toRelativeCalendar=function toRelativeCalendar(options){if(options===void 0){options={};}
if(!this.isValid)return null;return diffRelative(options.base||DateTime.fromObject({zone:this.zone}),this,Object.assign(options,{numeric:"auto",units:["years","months","days"],calendary:true}));};DateTime.min=function min(){for(var _len=arguments.length,dateTimes=new Array(_len),_key=0;_key<_len;_key++){dateTimes[_key]=arguments[_key];}
if(!dateTimes.every(DateTime.isDateTime)){throw new InvalidArgumentError("min requires all arguments be DateTimes");}
return bestBy(dateTimes,function(i){return i.valueOf();},Math.min);};DateTime.max=function max(){for(var _len2=arguments.length,dateTimes=new Array(_len2),_key2=0;_key2<_len2;_key2++){dateTimes[_key2]=arguments[_key2];}
if(!dateTimes.every(DateTime.isDateTime)){throw new InvalidArgumentError("max requires all arguments be DateTimes");}
return bestBy(dateTimes,function(i){return i.valueOf();},Math.max);};DateTime.fromFormatExplain=function fromFormatExplain(text,fmt,options){if(options===void 0){options={};}
var _options=options,_options$locale=_options.locale,locale=_options$locale===void 0?null:_options$locale,_options$numberingSys=_options.numberingSystem,numberingSystem=_options$numberingSys===void 0?null:_options$numberingSys,localeToUse=Locale.fromOpts({locale:locale,numberingSystem:numberingSystem,defaultToEN:true});return explainFromTokens(localeToUse,text,fmt);};DateTime.fromStringExplain=function fromStringExplain(text,fmt,options){if(options===void 0){options={};}
return DateTime.fromFormatExplain(text,fmt,options);};_createClass(DateTime,[{key:"isValid",get:function get(){return this.invalid===null;}},{key:"invalidReason",get:function get(){return this.invalid?this.invalid.reason:null;}},{key:"invalidExplanation",get:function get(){return this.invalid?this.invalid.explanation:null;}},{key:"locale",get:function get(){return this.isValid?this.loc.locale:null;}},{key:"numberingSystem",get:function get(){return this.isValid?this.loc.numberingSystem:null;}},{key:"outputCalendar",get:function get(){return this.isValid?this.loc.outputCalendar:null;}},{key:"zone",get:function get(){return this._zone;}},{key:"zoneName",get:function get(){return this.isValid?this.zone.name:null;}},{key:"year",get:function get(){return this.isValid?this.c.year:NaN;}},{key:"quarter",get:function get(){return this.isValid?Math.ceil(this.c.month/3):NaN;}},{key:"month",get:function get(){return this.isValid?this.c.month:NaN;}},{key:"day",get:function get(){return this.isValid?this.c.day:NaN;}},{key:"hour",get:function get(){return this.isValid?this.c.hour:NaN;}},{key:"minute",get:function get(){return this.isValid?this.c.minute:NaN;}},{key:"second",get:function get(){return this.isValid?this.c.second:NaN;}},{key:"millisecond",get:function get(){return this.isValid?this.c.millisecond:NaN;}},{key:"weekYear",get:function get(){return this.isValid?possiblyCachedWeekData(this).weekYear:NaN;}},{key:"weekNumber",get:function get(){return this.isValid?possiblyCachedWeekData(this).weekNumber:NaN;}},{key:"weekday",get:function get(){return this.isValid?possiblyCachedWeekData(this).weekday:NaN;}},{key:"ordinal",get:function get(){return this.isValid?gregorianToOrdinal(this.c).ordinal:NaN;}},{key:"monthShort",get:function get(){return this.isValid?Info.months("short",{locale:this.locale})[this.month-1]:null;}},{key:"monthLong",get:function get(){return this.isValid?Info.months("long",{locale:this.locale})[this.month-1]:null;}},{key:"weekdayShort",get:function get(){return this.isValid?Info.weekdays("short",{locale:this.locale})[this.weekday-1]:null;}},{key:"weekdayLong",get:function get(){return this.isValid?Info.weekdays("long",{locale:this.locale})[this.weekday-1]:null;}},{key:"offset",get:function get(){return this.isValid?+this.o:NaN;}},{key:"offsetNameShort",get:function get(){if(this.isValid){return this.zone.offsetName(this.ts,{format:"short",locale:this.locale});}else{return null;}}},{key:"offsetNameLong",get:function get(){if(this.isValid){return this.zone.offsetName(this.ts,{format:"long",locale:this.locale});}else{return null;}}},{key:"isOffsetFixed",get:function get(){return this.isValid?this.zone.universal:null;}},{key:"isInDST",get:function get(){if(this.isOffsetFixed){return false;}else{return this.offset>this.set({month:1}).offset||this.offset>this.set({month:5}).offset;}}},{key:"isInLeapYear",get:function get(){return isLeapYear(this.year);}},{key:"daysInMonth",get:function get(){return daysInMonth(this.year,this.month);}},{key:"daysInYear",get:function get(){return this.isValid?daysInYear(this.year):NaN;}},{key:"weeksInWeekYear",get:function get(){return this.isValid?weeksInWeekYear(this.weekYear):NaN;}}],[{key:"DATE_SHORT",get:function get(){return DATE_SHORT;}},{key:"DATE_MED",get:function get(){return DATE_MED;}},{key:"DATE_MED_WITH_WEEKDAY",get:function get(){return DATE_MED_WITH_WEEKDAY;}},{key:"DATE_FULL",get:function get(){return DATE_FULL;}},{key:"DATE_HUGE",get:function get(){return DATE_HUGE;}},{key:"TIME_SIMPLE",get:function get(){return TIME_SIMPLE;}},{key:"TIME_WITH_SECONDS",get:function get(){return TIME_WITH_SECONDS;}},{key:"TIME_WITH_SHORT_OFFSET",get:function get(){return TIME_WITH_SHORT_OFFSET;}},{key:"TIME_WITH_LONG_OFFSET",get:function get(){return TIME_WITH_LONG_OFFSET;}},{key:"TIME_24_SIMPLE",get:function get(){return TIME_24_SIMPLE;}},{key:"TIME_24_WITH_SECONDS",get:function get(){return TIME_24_WITH_SECONDS;}},{key:"TIME_24_WITH_SHORT_OFFSET",get:function get(){return TIME_24_WITH_SHORT_OFFSET;}},{key:"TIME_24_WITH_LONG_OFFSET",get:function get(){return TIME_24_WITH_LONG_OFFSET;}},{key:"DATETIME_SHORT",get:function get(){return DATETIME_SHORT;}},{key:"DATETIME_SHORT_WITH_SECONDS",get:function get(){return DATETIME_SHORT_WITH_SECONDS;}},{key:"DATETIME_MED",get:function get(){return DATETIME_MED;}},{key:"DATETIME_MED_WITH_SECONDS",get:function get(){return DATETIME_MED_WITH_SECONDS;}},{key:"DATETIME_MED_WITH_WEEKDAY",get:function get(){return DATETIME_MED_WITH_WEEKDAY;}},{key:"DATETIME_FULL",get:function get(){return DATETIME_FULL;}},{key:"DATETIME_FULL_WITH_SECONDS",get:function get(){return DATETIME_FULL_WITH_SECONDS;}},{key:"DATETIME_HUGE",get:function get(){return DATETIME_HUGE;}},{key:"DATETIME_HUGE_WITH_SECONDS",get:function get(){return DATETIME_HUGE_WITH_SECONDS;}}]);return DateTime;}();function friendlyDateTime(dateTimeish){if(DateTime.isDateTime(dateTimeish)){return dateTimeish;}else if(dateTimeish&&dateTimeish.valueOf&&isNumber(dateTimeish.valueOf())){return DateTime.fromJSDate(dateTimeish);}else if(dateTimeish&&typeof dateTimeish==="object"){return DateTime.fromObject(dateTimeish);}else{throw new InvalidArgumentError("Unknown datetime argument: "+dateTimeish+", of type "+typeof dateTimeish);}}
exports.DateTime=DateTime;exports.Duration=Duration;exports.FixedOffsetZone=FixedOffsetZone;exports.IANAZone=IANAZone;exports.Info=Info;exports.Interval=Interval;exports.InvalidZone=InvalidZone;exports.LocalZone=LocalZone;exports.Settings=Settings;exports.Zone=Zone;return exports;}({}));;

/* /web/static/src/core/assets.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/assets',async function(require){'use strict';let __exports={};const{useEnv,onWillStart}=owl.hooks;const{memoize}=require("@web/core/utils/functions");const{browser}=require("@web/core/browser/browser");class AssetsLoadingError extends Error{}
const loadJS=memoize(function loadJS(url){if(document.querySelector(`script[src="${url}"]`)){return Promise.resolve();}
const scriptEl=document.createElement("script");scriptEl.type="text/javascript";scriptEl.src=url;document.head.appendChild(scriptEl);return new Promise((resolve,reject)=>{scriptEl.addEventListener("load",resolve);scriptEl.addEventListener("error",()=>{reject(new AssetsLoadingError(`The loading of ${url} failed`));});});});const loadCSS=memoize(function loadCSS(url){if(document.querySelector(`link[href="${url}"]`)){return Promise.resolve();}
const linkEl=document.createElement("link");linkEl.type="text/css";linkEl.rel="stylesheet";linkEl.href=url;document.head.appendChild(linkEl);return new Promise(function(resolve,reject){linkEl.addEventListener("load",resolve);linkEl.addEventListener("error",()=>{reject(new AssetsLoadingError(`The loading of ${url} failed`));});});});const loadBundleTemplates=__exports.loadBundleTemplates=memoize(async function loadBundleTemplates(name){const bundleURL=`/web/webclient/qweb/${Date.now()}?bundle=${name}`;const templates=await(await browser.fetch(bundleURL)).text();return processTemplates(templates);});const bundlesCache={};async function loadBundle(name,options){const{templates}=options;if(!bundlesCache[name]){bundlesCache[name]={name};}
if(templates&&!bundlesCache[name].templates){bundlesCache[name].templates=loadBundleTemplates(name);}
const entries=await Promise.all(Object.keys(options).map(async(key)=>[key,await bundlesCache[name][key]]));return Object.fromEntries(entries);}
__exports.processTemplates=processTemplates;function processTemplates(templates){const doc=new DOMParser().parseFromString(templates,"text/xml");for(const template of[...doc.querySelector("templates").children]){if(template.hasAttribute("owl")){template.removeAttribute("owl");}else{template.remove();}}
return doc;}
const loadPublicAsset=__exports.loadPublicAsset=memoize(async function loadPublicAsset(xmlid,orm){const xml=await orm.call("ir.ui.view","render_public_asset",[xmlid]);const doc=new DOMParser().parseFromString(`<xml>${xml}</xml>`,"text/xml");return loadAssets({cssLibs:[...doc.querySelectorAll("link[href]")].map((node)=>node.getAttribute("href")),jsLibs:[...doc.querySelectorAll("script[src]")].map((node)=>node.getAttribute("src")),});});__exports.loadAssets=loadAssets;async function loadAssets(assets){const proms=[];const loadedAssets={};if("bundles"in assets){const bundles=Object.entries(assets.bundles);const bundlesProm=Promise.all(bundles.map(async([name,options])=>[name,await loadBundle(name,options)])).then((loadedBundles)=>{loadedAssets.bundles=Object.fromEntries(loadedBundles);});proms.push(bundlesProm);}
if("jsLibs"in assets){proms.push(Promise.all(assets.jsLibs.map(loadJS)));}
if("cssLibs"in assets){proms.push(Promise.all(assets.cssLibs.map(loadCSS)));}
await Promise.all(proms);return loadedAssets;}
__exports.useAssets=useAssets;function useAssets(assets){const env=useEnv();onWillStart(async()=>{const loadedAssets=await loadAssets(assets);const{bundles}=loadedAssets;if(bundles){const templateDocs=Object.values(bundles).map(({templates})=>templates);for(const xmlDoc of templateDocs){for(const template of[...xmlDoc.querySelector("templates").children]){if(template.getAttribute("t-name")in env.qweb.templates){template.remove();}}
env.qweb.addTemplates(xmlDoc);}}});}
return __exports;});;

/* /web/static/src/core/browser/browser.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/browser/browser',async function(require){'use strict';let __exports={};let sessionStorage=window.sessionStorage;let localStorage=owl.browser.localStorage;try{localStorage.setItem("__localStorage__","true");localStorage.removeItem("__localStorage__");}catch(e){localStorage=makeRAMLocalStorage();sessionStorage=makeRAMLocalStorage();}
const browser=__exports.browser=Object.assign({},owl.browser,{addEventListener:window.addEventListener.bind(window),removeEventListener:window.removeEventListener.bind(window),requestAnimationFrame:window.requestAnimationFrame.bind(window),cancelAnimationFrame:window.cancelAnimationFrame.bind(window),console:window.console,history:window.history,navigator:navigator,open:window.open.bind(window),XMLHttpRequest:window.XMLHttpRequest,localStorage,sessionStorage,});Object.defineProperty(browser,"location",{set(val){window.location=val;},get(){return window.location;},configurable:true,});__exports.makeRAMLocalStorage=makeRAMLocalStorage;function makeRAMLocalStorage(){let store={};return{setItem(key,value){store[key]=value;},getItem(key){return store[key];},clear(){store={};},removeItem(key){delete store[key];},get length(){return Object.keys(store).length;},key(){return"";},};}
return __exports;});;

/* /web/static/src/core/browser/cookie_service.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/browser/cookie_service',async function(require){'use strict';let __exports={};const{registry}=require("@web/core/registry");const COOKIE_TTL=24*60*60*365;function parseCookieString(str){const cookie={};const parts=str.split("; ");for(let part of parts){const[key,value]=part.split("=");cookie[key]=value||"";}
return cookie;}
function cookieToString(key,value,ttl=COOKIE_TTL){let fullCookie=[];if(value!==undefined){fullCookie.push(`${key}=${value}`);}
fullCookie=fullCookie.concat(["path=/",`max-age=${ttl}`]);return fullCookie.join(";");}
function makeCookieService(){function getCurrent(){return parseCookieString(document.cookie);}
let cookie=getCurrent();function setCookie(key,value,ttl){document.cookie=cookieToString(key,value,ttl);cookie=getCurrent();}
return{get current(){return cookie;},setCookie,deleteCookie(key){setCookie(key,"kill",0);},};}
const cookieService=__exports.cookieService={start(){return makeCookieService();},};registry.category("services").add("cookie",cookieService);return __exports;});;

/* /web/static/src/core/browser/feature_detection.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/browser/feature_detection',async function(require){'use strict';let __exports={};const{browser}=require("@web/core/browser/browser");__exports.isBrowserChrome=isBrowserChrome;function isBrowserChrome(){return browser.navigator.userAgent.includes("Chrome");}
__exports.isAndroid=isAndroid;function isAndroid(){return/Android/i.test(browser.navigator.userAgent);}
__exports.isIOS=isIOS;function isIOS(){return/(iPad|iPhone|iPod)/i.test(browser.navigator.userAgent)||(browser.navigator.platform==='MacIntel'&&maxTouchPoints()>1);}
__exports.isOtherMobileOS=isOtherMobileOS;function isOtherMobileOS(){return/(webOS|BlackBerry|Windows Phone)/i.test(browser.navigator.userAgent);}
__exports.isMacOS=isMacOS;function isMacOS(){return Boolean(browser.navigator.userAgent.match(/Mac/i));}
__exports.isMobileOS=isMobileOS;function isMobileOS(){return isAndroid()||isIOS()||isOtherMobileOS();}
__exports.isIosApp=isIosApp;function isIosApp(){return/OdooMobile \(iOS\)/i.test(browser.navigator.userAgent);}
__exports.hasTouch=hasTouch;function hasTouch(){return"ontouchstart"in window||"onmsgesturechange"in window;}
__exports.maxTouchPoints=maxTouchPoints;function maxTouchPoints(){return browser.navigator.maxTouchPoints||1;}
return __exports;});;

/* /web/static/src/core/browser/router_service.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/browser/router_service',async function(require){'use strict';let __exports={};const{registry}=require("@web/core/registry");const{shallowEqual}=require("@web/core/utils/objects");const{objectToUrlEncodedString}=require("@web/core/utils/urls");const{browser}=require("@web/core/browser/browser");function cast(value){return!value||isNaN(value)?value:Number(value);}
function parseString(str){const parts=str.split("&");const result={};for(let part of parts){const[key,value]=part.split("=");const decoded=decodeURIComponent(value||"");result[key]=cast(decoded);}
return result;}
function applyLocking(lockedKeys,hash,currentHash,options={}){const newHash={};for(const key in hash){if("lock"in options){options.lock?lockedKeys.add(key):lockedKeys.delete(key);}else if(lockedKeys.has(key)){continue;}
newHash[key]=hash[key];}
for(const key in currentHash){if(lockedKeys.has(key)&&!(key in newHash)){newHash[key]=currentHash[key];}}
return newHash;}
function computeNewRoute(hash,replace,currentRoute){if(!replace){hash=Object.assign({},currentRoute.hash,hash);}
hash=sanitizeHash(hash);if(!shallowEqual(currentRoute.hash,hash)){return Object.assign({},currentRoute,{hash});}
return false;}
function sanitizeHash(hash){return Object.fromEntries(Object.entries(hash).filter(([,v])=>v!==undefined).map(([k,v])=>[k,cast(v)]));}
__exports.parseHash=parseHash;function parseHash(hash){return hash&&hash!=="#"?parseString(hash.slice(1)):{};}
__exports.parseSearchQuery=parseSearchQuery;function parseSearchQuery(search){return search?parseString(search.slice(1)):{};}
__exports.routeToUrl=routeToUrl;function routeToUrl(route){const search=objectToUrlEncodedString(route.search);const hash=objectToUrlEncodedString(route.hash);return route.pathname+(search?"?"+search:"")+(hash?"#"+hash:"");}
async function redirect(env,url,wait=false){if(wait){await new Promise((resolve)=>{const waitForServer=(delay)=>{browser.setTimeout(async()=>{env.services.rpc("/web/webclient/version_info",{}).then(resolve).catch(()=>waitForServer(250));},delay);};waitForServer(1000);});}
browser.location.assign(url);}
function getRoute(urlObj){const{pathname,search,hash}=urlObj;const searchQuery=parseSearchQuery(search);const hashQuery=parseHash(hash);return{pathname,search:searchQuery,hash:hashQuery};}
function makeRouter(env){const bus=env.bus;const lockedKeys=new Set();let current=getRoute(browser.location);let pushTimeout;browser.addEventListener("hashchange",(ev)=>{browser.clearTimeout(pushTimeout);const loc=new URL(ev.newURL);current=getRoute(loc);bus.trigger("ROUTE_CHANGE");});function makeDebouncedPush(mode){let allPushArgs=[];function doPush(){const replace=allPushArgs.some(([,options])=>options&&options.replace);const newHash=allPushArgs.reduce((finalHash,[hash,options])=>{hash=applyLocking(lockedKeys,hash,current.hash,options);if(finalHash){hash=applyLocking(lockedKeys,hash,finalHash,options);}
return Object.assign(finalHash||{},hash);},null);const newRoute=computeNewRoute(newHash,replace,current);if(!newRoute){return;}
const url=browser.location.origin+routeToUrl(newRoute);if(mode==="push"){browser.history.pushState({},"",url);}else{browser.history.replaceState({},"",url);}
current=getRoute(browser.location);}
return function pushOrReplaceState(hash,options){allPushArgs.push([hash,options]);browser.clearTimeout(pushTimeout);pushTimeout=browser.setTimeout(()=>{doPush();pushTimeout=null;allPushArgs=[];});};}
return{get current(){return current;},pushState:makeDebouncedPush("push"),replaceState:makeDebouncedPush("replace"),redirect:(url,wait)=>redirect(env,url,wait),cancelPushes:()=>browser.clearTimeout(pushTimeout),};}
const routerService=__exports.routerService={start(env){return makeRouter(env);},};__exports.objectToQuery=objectToQuery;function objectToQuery(obj){const query={};Object.entries(obj).forEach(([k,v])=>{query[k]=v?String(v):v;});return query;}
registry.category("services").add("router",routerService);return __exports;});;

/* /web/static/src/core/browser/title_service.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/browser/title_service',async function(require){'use strict';let __exports={};const{registry}=require("@web/core/registry");const titleService=__exports.titleService={start(){const titleParts={};function getParts(){return Object.assign({},titleParts);}
function setParts(parts){for(const key in parts){const val=parts[key];if(!val){delete titleParts[key];}else{titleParts[key]=val;}}
document.title=Object.values(titleParts).join(" - ");}
return{get current(){return document.title;},getParts,setParts,};},};registry.category("services").add("title",titleService);return __exports;});;

/* /web/static/src/core/checkbox/checkbox.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/checkbox/checkbox',async function(require){'use strict';let __exports={};const{Component,QWeb}=owl;const CheckBox=__exports.CheckBox=class CheckBox extends Component{setup(){this.id=`checkbox-comp-${CheckBox.nextId++}`;}}
CheckBox.template="web.CheckBox";CheckBox.nextId=1;QWeb.registerComponent("CheckBox",CheckBox);return __exports;});;

/* /web/static/src/core/commands/command_category.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/commands/command_category',async function(require){'use strict';let __exports={};const{registry}=require("@web/core/registry");const commandCategoryRegistry=registry.category("command_categories");commandCategoryRegistry.add("app",{},{sequence:10}).add("smart_action",{},{sequence:15}).add("actions",{},{sequence:30}).add("navbar",{},{sequence:40}).add("default",{},{sequence:100}).add("debug",{},{sequence:110});return __exports;});;

/* /web/static/src/core/commands/command_hook.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/commands/command_hook',async function(require){'use strict';let __exports={};const{useEffect,useService}=require("@web/core/utils/hooks");__exports.useCommand=useCommand;function useCommand(name,action,options={}){const commandService=useService("command");useEffect(()=>commandService.add(name,action,options),()=>[]);}
return __exports;});;

/* /web/static/src/core/commands/command_palette.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/commands/command_palette',async function(require){'use strict';let __exports={};const{useAutofocus,useService}=require("@web/core/utils/hooks");const{useHotkey}=require("@web/core/hotkeys/hotkey_hook");const{KeepLast}=require("@web/core/utils/concurrency");const{scrollTo}=require("@web/core/utils/scrolling");const{fuzzyLookup}=require("@web/core/utils/search");const{debounce}=require("@web/core/utils/timing");const{_lt}=require("@web/core/l10n/translation");const{Component,hooks}=owl;const{useState}=hooks;const DEFAULT_PLACEHOLDER=_lt("Search...");const DEFAULT_EMPTY_MESSAGE=_lt("No results found");const FUZZY_NAMESPACES=["default"];function commandsWithinCategory(categoryName,categories){return(cmd)=>{const inCurrentCategory=categoryName===cmd.category;const fallbackCategory=categoryName==="default"&&!categories.includes(cmd.category);return inCurrentCategory||fallbackCategory;};}
const DefaultCommandItem=__exports.DefaultCommandItem=class DefaultCommandItem extends Component{}
DefaultCommandItem.template="web.DefaultCommandItem";const CommandPalette=__exports.CommandPalette=class CommandPalette extends Component{setup(){this.keyId=1;this.keepLast=new KeepLast();this._sessionId=CommandPalette.lastSessionId++;this.DefaultCommandItem=DefaultCommandItem;this.activeElement=useService("ui").activeElement;const onDebouncedSearchInput=debounce.apply(this,[this.onSearchInput,200]);this.onDebouncedSearchInput=(...args)=>{this.inputPromise=onDebouncedSearchInput.apply(this,args).catch(()=>{this.inputPromise=null;});};useAutofocus();useHotkey("Enter",()=>this.executeSelectedCommand(),{bypassEditableProtection:true});useHotkey("ArrowUp",()=>this.selectCommandAndScrollTo("PREV"),{bypassEditableProtection:true,allowRepeat:true,});useHotkey("ArrowDown",()=>this.selectCommandAndScrollTo("NEXT"),{bypassEditableProtection:true,allowRepeat:true,});this.state=useState({commands:[],});this.setCommandPaletteConfig(this.props.config);}
get commandsByCategory(){const categories=[];for(const category of this.categoryKeys){const commands=this.state.commands.filter(commandsWithinCategory(category,this.categoryKeys));if(commands.length){categories.push({commands,keyId:category,});}}
return categories;}
setCommandPaletteConfig(config){const result={default:[]};for(const provider of config.providers){const namespace=provider.namespace||"default";if(namespace in result){result[namespace].push(provider);}else{result[namespace]=[provider];}}
this.categoriesByNamespace=config.categoriesByNamespace;this.emptyMessageByNamespace=config.emptyMessageByNamespace||{};this.providersByNamespace=result;this.state.footerTemplate=config.footerTemplate;this.state.placeholder=config.placeholder||DEFAULT_PLACEHOLDER.toString();const namespace=config.namespace||"default";this.setCommands(namespace,{activeElement:this.activeElement,searchValue:"",sessionId:this._sessionId,});this.state.searchValue=namespace==="default"?"":namespace;}
async setCommands(namespace,options={}){this.categoryKeys=["default"];const proms=this.providersByNamespace[namespace].map((provider)=>{const{provide}=provider;const result=provide(this.env,options);return result;});let commands=(await this.keepLast.add(Promise.all(proms))).flat();if(options.searchValue&&FUZZY_NAMESPACES.includes(namespace)){commands=fuzzyLookup(options.searchValue,commands,(c)=>c.name);}else{if(this.categoriesByNamespace&&this.categoriesByNamespace[namespace]){let commandsSorted=[];this.categoryKeys=this.categoriesByNamespace[namespace];if(!this.categoryKeys.includes("default")){this.categoryKeys.push("default");}
for(const category of this.categoryKeys){commandsSorted=commandsSorted.concat(commands.filter(commandsWithinCategory(category,this.categoryKeys)));}
commands=commandsSorted;}}
this.state.commands=commands.map((command)=>({...command,keyId:this.keyId++,}));this.selectCommand(this.state.commands.length?0:-1);this.mouseSelectionActive=false;this.state.emptyMessage=this.emptyMessageByNamespace[namespace]||DEFAULT_EMPTY_MESSAGE.toString();}
selectCommand(index){if(index===-1||index>=this.state.commands.length){this.state.selectedCommand=null;return;}
this.state.selectedCommand=this.state.commands[index];}
selectCommandAndScrollTo(type){this.mouseSelectionActive=false;const index=this.state.commands.indexOf(this.state.selectedCommand);if(index===-1){return;}
let nextIndex;if(type==="NEXT"){nextIndex=index<this.state.commands.length-1?index+1:0;}else if(type==="PREV"){nextIndex=index>0?index-1:this.state.commands.length-1;}
this.selectCommand(nextIndex);const listbox=this.el.querySelector(".o_command_palette_listbox");const command=listbox.querySelector(`#o_command_${nextIndex}`);scrollTo(command,{scrollable:listbox});}
onCommandClicked(index){this.selectCommand(index);this.executeSelectedCommand();}
async executeCommand(command){const config=await command.action();if(config){this.setCommandPaletteConfig(config);}else{this.props.closeMe();}}
async executeSelectedCommand(){await this.inputPromise;if(this.state.selectedCommand){this.executeCommand(this.state.selectedCommand);}}
onCommandMouseEnter(index){if(this.mouseSelectionActive){this.selectCommand(index);}else{this.mouseSelectionActive=true;}}
async onSearchInput(ev){this.state.searchValue=ev.target.value;let searchValue=this.state.searchValue;let namespace="default";if(searchValue.length&&searchValue[0]in this.providersByNamespace){namespace=searchValue[0];searchValue=searchValue.slice(1);}
await this.setCommands(namespace,{searchValue,activeElement:this.activeElement,sessionId:this._sessionId,});}}
CommandPalette.lastSessionId=0;CommandPalette.template="web.CommandPalette";return __exports;});;

/* /web/static/src/core/commands/command_palette_dialog.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/commands/command_palette_dialog',async function(require){'use strict';let __exports={};const{Dialog}=require("@web/core/dialog/dialog");const{CommandPalette}=require("@web/core/commands/command_palette");const{hooks}=owl;const{useExternalListener}=hooks;const CommandPaletteDialog=__exports.CommandPaletteDialog=class CommandPaletteDialog extends Dialog{setup(){super.setup();useExternalListener(window,"mousedown",this.onWindowMouseDown);}
onWindowMouseDown(ev){const element=ev.target.parentElement;const gotClickedInside=this.modalRef.el.contains(element);if(!gotClickedInside){this.close();}}}
CommandPaletteDialog.renderHeader=false;CommandPaletteDialog.renderFooter=false;CommandPaletteDialog.size="modal-md";CommandPaletteDialog.contentClass="o_command_palette";CommandPaletteDialog.bodyTemplate="web.CommandPaletteDialogBody";CommandPaletteDialog.components=Object.assign({},Dialog.components,{CommandPalette});return __exports;});;

/* /web/static/src/core/commands/command_service.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/commands/command_service',async function(require){'use strict';let __exports={};const{registry}=require("@web/core/registry");const{CommandPaletteDialog}=require("@web/core/commands/command_palette_dialog");const{xml}=owl.tags;const commandCategoryRegistry=registry.category("command_categories");const commandEmptyMessageRegistry=registry.category("command_empty_list");const commandProviderRegistry=registry.category("command_provider");const footerTemplate=xml`
<span>
    <span class='o_promote'>TIP</span> — search for <span class='o_promote'>@</span>users, <span class='o_promote'>#</span>channels, and <span class='o_promote'>/</span>menus
</span>
`;const commandService=__exports.commandService={dependencies:["dialog","hotkey","ui"],start(env,{dialog,hotkey:hotkeyService,ui}){const registeredCommands=new Map();let nextToken=0;let isPaletteOpened=false;hotkeyService.add("control+k",openMainPalette,{bypassEditableProtection:true,global:true,});function openMainPalette(){const categoriesByNamespace={};commandCategoryRegistry.getEntries().forEach(([category,el])=>{const namespace=el.namespace?el.namespace:"default";if(namespace in categoriesByNamespace){categoriesByNamespace[namespace].push(category);}else{categoriesByNamespace[namespace]=[category];}});const emptyMessageByNamespace={};commandEmptyMessageRegistry.getEntries().forEach(([key,message])=>{emptyMessageByNamespace[key]=message.toString();});const config={categoriesByNamespace,emptyMessageByNamespace,footerTemplate,placeholder:env._t("Search for a command..."),providers:commandProviderRegistry.getAll(),};return openPalette(config);}
function openPalette(config){if(isPaletteOpened){return config;}
isPaletteOpened=true;dialog.add(CommandPaletteDialog,{config,},{onClose:()=>{isPaletteOpened=false;},});}
function registerCommand(command,options){if(!command.name||!command.action||typeof command.action!=="function"){throw new Error("A Command must have a name and an action function.");}
const registration=Object.assign({},command,options);if(registration.hotkey){registration.removeHotkey=hotkeyService.add(registration.hotkey,registration.action,{activeElement:registration.activeElement,global:registration.global,});}
const token=nextToken++;registeredCommands.set(token,registration);if(!options.activeElement){Promise.resolve().then(()=>{registration.activeElement=ui.activeElement;});}
return token;}
function unregisterCommand(token){const cmd=registeredCommands.get(token);if(cmd&&cmd.removeHotkey){cmd.removeHotkey();}
registeredCommands.delete(token);}
return{add(name,action,options={}){const token=registerCommand({name,action},options);return()=>{unregisterCommand(token);};},getCommands(activeElement){return[...registeredCommands.values()].filter((command)=>command.activeElement===activeElement||command.global);},openPalette,};},};registry.category("services").add("command",commandService);return __exports;});;

/* /web/static/src/core/commands/default_providers.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/commands/default_providers',async function(require){'use strict';let __exports={};const{isMacOS}=require("@web/core/browser/feature_detection");const{useHotkey}=require("@web/core/hotkeys/hotkey_hook");const{_lt}=require("@web/core/l10n/translation");const{registry}=require("@web/core/registry");const{capitalize}=require("@web/core/utils/strings");const{getVisibleElements}=require("@web/core/utils/ui");const{DefaultCommandItem}=require("@web/core/commands/command_palette");const{Component}=owl;const HotkeyCommandItem=__exports.HotkeyCommandItem=class HotkeyCommandItem extends Component{setup(){useHotkey(this.props.hotkey,()=>{this.trigger("execute-command");});}
getKeysToPress(command){const{hotkey}=command;let result=hotkey.split("+");if(isMacOS()){result=result.map((x)=>x.replace("control","command")).map((x)=>x.replace("alt","control"));}
return result.map((key)=>key.toUpperCase());}}
HotkeyCommandItem.template="web.HotkeyCommandItem";const commandEmptyMessageRegistry=registry.category("command_empty_list");commandEmptyMessageRegistry.add("default",_lt("No commands found"));const commandCategoryRegistry=registry.category("command_categories");const commandProviderRegistry=registry.category("command_provider");commandProviderRegistry.add("command",{provide:(env,options={})=>{const commands=env.services.command.getCommands(options.activeElement).map((cmd)=>{cmd.category=commandCategoryRegistry.contains(cmd.category)?cmd.category:"default";return cmd;});return commands.map((command)=>({Component:command.hotkey?HotkeyCommandItem:DefaultCommandItem,action:command.action,category:command.category,name:command.name,props:{hotkey:command.hotkey,hotkeyOptions:command.hotkeyOptions,},}));},});commandProviderRegistry.add("data-hotkeys",{provide:(env,options={})=>{const commands=[];const overlayModifier=registry.category("services").get("hotkey").overlayModifier;for(const el of getVisibleElements(options.activeElement,"[data-hotkey]:not(:disabled)")){const closest=el.closest("[data-command-category]");const category=closest?closest.dataset.commandCategory:"default";const description=el.title||el.dataset.originalTitle||el.placeholder||(el.innerText&&`${el.innerText.slice(0, 50)}${el.innerText.length > 50 ? "..." : ""}`)||env._t("no description provided");commands.push({Component:HotkeyCommandItem,action:()=>{el.focus();el.click();},category,name:capitalize(description.trim().toLowerCase()),props:{hotkey:`${overlayModifier}+${el.dataset.hotkey}`,},});}
return commands;},});return __exports;});;

/* /web/static/src/core/confirmation_dialog/confirmation_dialog.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/confirmation_dialog/confirmation_dialog',async function(require){'use strict';let __exports={};const{Dialog}=require("@web/core/dialog/dialog");const{_lt}=require("@web/core/l10n/translation");const ConfirmationDialog=__exports.ConfirmationDialog=class ConfirmationDialog extends Dialog{setup(){super.setup();this.title=this.props.title;}
_cancel(){if(this.props.cancel){this.props.cancel();}
this.close();}
_confirm(){if(this.props.confirm){this.props.confirm();}
this.close();}}
ConfirmationDialog.props={title:{validate:(m)=>{return(typeof m==="string"||(typeof m==="object"&&typeof m.toString==="function"));},},body:String,confirm:{type:Function,optional:true},cancel:{type:Function,optional:true},close:Function,};ConfirmationDialog.defaultProps={title:_lt("Confirmation"),};ConfirmationDialog.bodyTemplate="web.ConfirmationDialogBody";ConfirmationDialog.footerTemplate="web.ConfirmationDialogFooter";ConfirmationDialog.size="modal-md";const AlertDialog=__exports.AlertDialog=class AlertDialog extends ConfirmationDialog{setup(){super.setup();if("contentClass"in this.props){this.contentClass=this.props.contentClass;}}}
AlertDialog.size="modal-sm";AlertDialog.props=Object.assign(Object.create(ConfirmationDialog.props),{contentClass:{type:String,optional:true},});AlertDialog.defaultProps={title:_lt("Alert"),};return __exports;});;

/* /web/static/src/core/context.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/context',async function(require){'use strict';let __exports={};const{evaluateExpr}=require("@web/core/py_js/py");__exports.makeContext=makeContext;function makeContext(contexts,initialEvaluationContext){const evaluationContext=Object.assign({},initialEvaluationContext);const context={};for(let ctx of contexts){if(ctx!==""){ctx=typeof ctx==="string"?evaluateExpr(ctx,evaluationContext):ctx;Object.assign(context,ctx);Object.assign(evaluationContext,context);}}
return context;}
return __exports;});;

/* /web/static/src/core/datepicker/datepicker.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/datepicker/datepicker',async function(require){'use strict';let __exports={};const{localization}=require("@web/core/l10n/localization");const{registry}=require("@web/core/registry");const{useAutofocus}=require("@web/core/utils/hooks");const{Component,hooks}=owl;const{DateTime}=luxon;const{useExternalListener,useRef,useState}=hooks;const formatters=registry.category("formatters");const parsers=registry.category("parsers");let datePickerId=0;const luxonDateToMomentDate=(date)=>{return window.moment(String(date));};const luxonFormatToMomentFormat=(format)=>{return format.replace(/[dy]/g,(x)=>x.toUpperCase());};const isValidStaticFormat=(format)=>{try{return/^[\d\s/:-]+$/.test(DateTime.local().toFormat(format));}catch(_err){return false;}};const DatePicker=__exports.DatePicker=class DatePicker extends Component{setup(){this.inputRef=useRef("input");this.state=useState({warning:false});this.datePickerId=`o_datepicker_${datePickerId++}`;this.datePickerShown=false;this.initFormat();this.setDate(this.props);this.setFormat(this.props);useAutofocus();useExternalListener(window,"scroll",this.onWindowScroll);}
mounted(){this.bootstrapDateTimePicker(this.props);this.updateInput();window.$(this.el).on("show.datetimepicker",()=>{this.datePickerShown=true;this.inputRef.el.select();});window.$(this.el).on("hide.datetimepicker",()=>{this.datePickerShown=false;this.onDateChange({useStatic:true});});window.$(this.el).on("error.datetimepicker",()=>false);}
willUpdateProps(nextProps){const pickerParams={};let shouldUpdateInput=false;for(const prop in nextProps){const prev=this.props[prop];const next=nextProps[prop];if((prev instanceof DateTime&&!prev.equals(next))||prev!==next){pickerParams[prop]=nextProps[prop];if(prop==="date"){this.setDate(nextProps);shouldUpdateInput=true;}else if(prop==="format"){this.setFormat(nextProps);shouldUpdateInput=true;}}}
if(shouldUpdateInput){this.updateInput();}
this.bootstrapDateTimePicker(pickerParams);}
willUnmount(){window.$(this.el).off();this.bootstrapDateTimePicker("destroy");}
getOptions(useStatic=false){return{format:!useStatic||isValidStaticFormat(this.format)?this.format:this.staticFormat,locale:this.date.locale,timezone:this.isLocal,};}
initFormat(){this.defaultFormat=localization.dateFormat;this.staticFormat="yyyy/MM/dd";this.formatValue=formatters.get("date");this.parseValue=parsers.get("date");this.isLocal=false;}
setDate({date,locale}){this.date=locale?date.setLocale(locale):date;}
setFormat({format}){this.format=format||this.defaultFormat;}
updateInput({useStatic}={}){try{this.inputRef.el.value=this.formatValue(this.date,this.getOptions(useStatic));}catch(_err){}}
bootstrapDateTimePicker(commandOrParams){if(typeof commandOrParams==="object"){const format=isValidStaticFormat(this.format)?this.format:this.staticFormat;const params={...commandOrParams,format:luxonFormatToMomentFormat(format)};if(!params.locale&&commandOrParams.date){params.locale=commandOrParams.date.locale;}
for(const prop in params){if(params[prop]instanceof DateTime){const luxonDate=params[prop];const momentDate=luxonDateToMomentDate(luxonDate);params[prop]=momentDate;}}
commandOrParams=params;}
return window.$(this.el).datetimepicker(commandOrParams);}
onInputClick(){if(!this.datePickerShown){this.updateInput({useStatic:true});}
this.bootstrapDateTimePicker("toggle");}
onDateChange({useStatic}={}){let date;try{date=this.parseValue(this.inputRef.el.value,this.getOptions(useStatic));}catch(_err){}
if(!date||date.equals(this.date)){this.updateInput();}else{this.state.warning=date>DateTime.local();this.trigger("datetime-changed",{date});}}
onWindowScroll(ev){if(ev.target!==this.inputRef.el){this.bootstrapDateTimePicker("hide");}}}
DatePicker.defaultProps={calendarWeeks:true,icons:{clear:"fa fa-delete",close:"fa fa-check primary",date:"fa fa-calendar",down:"fa fa-chevron-down",next:"fa fa-chevron-right",previous:"fa fa-chevron-left",time:"fa fa-clock-o",today:"fa fa-calendar-check-o",up:"fa fa-chevron-up",},maxDate:DateTime.fromObject({year:9999,month:12,day:31}),minDate:DateTime.fromObject({year:1000}),useCurrent:false,widgetParent:"body",};DatePicker.props={date:DateTime,warn_future:{type:Boolean,optional:true},buttons:{type:Object,shape:{showClear:Boolean,showClose:Boolean,showToday:Boolean,},optional:true,},calendarWeeks:Boolean,format:{type:String,optional:true},icons:{type:Object,shape:{clear:String,close:String,date:String,down:String,next:String,previous:String,time:String,today:String,up:String,},},keyBinds:{validate:(kb)=>typeof kb==="object"||kb===null,optional:true},locale:{type:String,optional:true},maxDate:DateTime,minDate:DateTime,readonly:{type:Boolean,optional:true},useCurrent:Boolean,widgetParent:String,};DatePicker.template="web.DatePicker";const DateTimePicker=__exports.DateTimePicker=class DateTimePicker extends DatePicker{initFormat(){this.defaultFormat=localization.dateTimeFormat;this.staticFormat="yyyy/MM/dd HH:mm:ss";this.formatValue=formatters.get("datetime");this.parseValue=parsers.get("datetime");this.isLocal=true;}}
DateTimePicker.defaultProps={...DatePicker.defaultProps,buttons:{showClear:false,showClose:true,showToday:false,},};return __exports;});;

/* /web/static/src/core/dialog/dialog.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/dialog/dialog',async function(require){'use strict';let __exports={};const{useHotkey}=require("@web/core/hotkeys/hotkey_hook");const{useActiveElement}=require("@web/core/ui/ui_service");const{Component,hooks}=owl;const{useRef,useSubEnv}=hooks;const Dialog=__exports.Dialog=class Dialog extends Component{setup(){if(this.constructor===Dialog){throw new Error("Dialog should not be used by itself. Please use the dialog service with a Dialog subclass.");}
this.modalRef=useRef("modal");useActiveElement("modal");useHotkey("escape",()=>{this.close();});useSubEnv({inDialog:true});this.close=this.close.bind(this);this.contentClass=this.constructor.contentClass;this.fullscreen=this.constructor.fullscreen;this.renderFooter=this.constructor.renderFooter;this.renderHeader=this.constructor.renderHeader;this.size=this.constructor.size;this.technical=this.constructor.technical;this.title=this.constructor.title;}
close(){this.props.close();}}
Dialog.template="web.Dialog";Dialog.contentClass=null;Dialog.fullscreen=false;Dialog.renderFooter=true;Dialog.renderHeader=true;Dialog.size="modal-lg";Dialog.technical=true;Dialog.title="Odoo";Dialog.bodyTemplate=owl.tags.xml`<div/>`;Dialog.footerTemplate="web.DialogFooterDefault";return __exports;});;

/* /web/static/src/core/dialog/dialog_container.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/dialog/dialog_container',async function(require){'use strict';let __exports={};const{ErrorHandler,NotUpdatable}=require("@web/core/utils/components");const{Component,tags}=owl;const DialogContainer=__exports.DialogContainer=class DialogContainer extends Component{setup(){this.props.bus.on("UPDATE",this,this.render);}
close(id){if(this.props.dialogs[id]){this.props.dialogs[id].props.close();}}
handleError(error,dialogId){this.close(dialogId);Promise.resolve().then(()=>{throw error;});}}
DialogContainer.components={ErrorHandler,NotUpdatable};DialogContainer.template=tags.xml`
    <div class="o_dialog_container" t-att-class="{'modal-open': Object.keys(props.dialogs).length > 0}">
      <t t-foreach="Object.values(props.dialogs)" t-as="dialog" t-key="dialog.id">
        <NotUpdatable>
            <ErrorHandler onError="(error) => handleError(error, dialog.id)">
                <t t-component="dialog.class" t-props="dialog.props"
                    t-on-dialog-closed="dialog.props.close()" 
                    t-att-class="{o_inactive_modal: !dialog_last}"/>
            </ErrorHandler>
        </NotUpdatable>
      </t>
    </div>
    `;return __exports;});;

/* /web/static/src/core/dialog/dialog_service.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/dialog/dialog_service',async function(require){'use strict';let __exports={};const{registry}=require("@web/core/registry");const{Dialog}=require("@web/core/dialog/dialog");const{DialogContainer}=require("@web/core/dialog/dialog_container");const{core}=owl;const{EventBus}=core;const dialogService=__exports.dialogService={start(){const dialogs={};const bus=new EventBus();let dialogId=0;registry.category("main_components").add("DialogContainer",{Component:DialogContainer,props:{bus,dialogs},});function add(dialogClass,props,options={}){if(!(dialogClass.prototype instanceof Dialog)){throw new Error(`${dialogClass.name} must be a subclass of Dialog`);}
const id=++dialogId;function close(){if(dialogs[id]){delete dialogs[id];if(options.onClose){options.onClose();}
bus.trigger("UPDATE");}}
const dialog={id,class:dialogClass,props:{...props,close},};dialogs[id]=dialog;bus.trigger("UPDATE");return close;}
return{add};},};registry.category("services").add("dialog",dialogService);return __exports;});;

/* /web/static/src/core/domain.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/domain',async function(require){'use strict';let __exports={};const{evaluate,formatAST,parseExpr}=require("@web/core/py_js/py");const{toPyValue}=require("@web/core/py_js/py_utils");class InvalidDomainError extends Error{}
const Domain=__exports.Domain=class Domain{static combine(domains,operator){if(domains.length===0){return new Domain([]);}
const domain1=domains[0]instanceof Domain?domains[0]:new Domain(domains[0]);if(domains.length===1){return domain1;}
const domain2=Domain.combine(domains.slice(1),operator);const result=new Domain([]);const astValues1=domain1.ast.value;const astValues2=domain2.ast.value;const op=operator==="AND"?"&":"|";const combinedAST={type:4,value:astValues1.concat(astValues2)};result.ast=normalizeDomainAST(combinedAST,op);return result;}
static and(domains){return Domain.combine(domains,"AND");}
static or(domains){return Domain.combine(domains,"OR");}
static not(domain){const result=new Domain(domain);result.ast.value.unshift({type:1,value:"!"});return result;}
constructor(descr=[]){if(descr instanceof Domain){return new Domain(descr.toString());}else{const rawAST=typeof descr==="string"?parseExpr(descr):toAST(descr);this.ast=normalizeDomainAST(rawAST);}}
contains(record){const expr=evaluate(this.ast,record);return matchDomain(record,expr);}
toString(){return formatAST(this.ast);}
toList(context){return evaluate(this.ast,context);}}
const TRUE_LEAF=[1,"=",1];const FALSE_LEAF=[0,"=",1];const TRUE_DOMAIN=new Domain([TRUE_LEAF]);const FALSE_DOMAIN=new Domain([FALSE_LEAF]);Domain.TRUE=TRUE_DOMAIN;Domain.FALSE=FALSE_DOMAIN;function toAST(domain){const elems=domain.map((elem)=>{switch(elem){case"!":case"&":case"|":return{type:1,value:elem};default:return{type:10,value:elem.map(toPyValue),};}});return{type:4,value:elems};}
function normalizeDomainAST(domain,op="&"){if(domain.type!==4){throw new InvalidDomainError("Invalid domain AST");}
if(domain.value.length===0){return domain;}
let expected=1;for(let child of domain.value){if(child.type===1&&(child.value==="&"||child.value==="|")){expected++;}else if(child.type!==1||child.value!=="!"){expected--;}}
let values=domain.value.slice();while(expected<0){expected++;values.unshift({type:1,value:op});}
if(expected>0){throw new InvalidDomainError(`invalid domain ${formatAST(domain)} (missing ${expected} segment(s))`);}
return{type:4,value:values};}
function matchCondition(record,condition){if(typeof condition==="boolean"){return condition;}
const[field,operator,value]=condition;const fieldValue=typeof field==="number"?field:record[field];switch(operator){case"=":case"==":return fieldValue===value;case"!=":case"<>":return fieldValue!==value;case"<":return fieldValue<value;case"<=":return fieldValue<=value;case">":return fieldValue>value;case">=":return fieldValue>=value;case"in":{const val=Array.isArray(value)?value:[value];const fieldVal=Array.isArray(fieldValue)?fieldValue:[fieldValue];return fieldVal.some((fv)=>val.includes(fv));}
case"not in":{const val=Array.isArray(value)?value:[value];const fieldVal=Array.isArray(fieldValue)?fieldValue:[fieldValue];return!fieldVal.some((fv)=>val.includes(fv));}
case"like":if(fieldValue===false){return false;}
return fieldValue.indexOf(value)>=0;case"=like":if(fieldValue===false){return false;}
return new RegExp(value.replace(/%/g,".*")).test(fieldValue);case"ilike":if(fieldValue===false){return false;}
return fieldValue.toLowerCase().indexOf(value.toLowerCase())>=0;case"=ilike":if(fieldValue===false){return false;}
return new RegExp(value.replace(/%/g,".*"),"i").test(fieldValue);}
throw new InvalidDomainError("could not match domain");}
function makeOperators(record){const match=matchCondition.bind(null,record);return{"!":(x)=>!match(x),"&":(a,b)=>match(a)&&match(b),"|":(a,b)=>match(a)||match(b),};}
function matchDomain(record,domain){if(domain.length===0){return true;}
const operators=makeOperators(record);const reversedDomain=Array.from(domain).reverse();const condStack=[];for(const item of reversedDomain){if(item in operators){const operator=operators[item];const operands=condStack.splice(-operator.length);condStack.push(operator(...operands));}else{condStack.push(item);}}
return matchCondition(record,condStack.pop());}
return __exports;});;

/* /web/static/src/core/dropdown/dropdown.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/dropdown/dropdown',async function(require){'use strict';let __exports={};const{useBus,useEffect,useService}=require("@web/core/utils/hooks");const{usePosition}=require("@web/core/position/position_hook");const{useDropdownNavigation}=require("@web/core/dropdown/dropdown_navigation_hook");const{ParentClosingMode}=require("@web/core/dropdown/dropdown_item");const{localization}=require("@web/core/l10n/localization");const{Component,core,hooks,useState,QWeb}=owl;const{EventBus}=core;const{onWillStart,useExternalListener,useRef,useSubEnv}=hooks;const DIRECTION_CARET_CLASS={bottom:"dropdown",top:"dropup",left:"dropleft",right:"dropright",};const Dropdown=__exports.Dropdown=class Dropdown extends Component{setup(){this.state=useState({open:this.props.startOpen,groupIsOpen:this.props.startOpen,});onWillStart(()=>{if(this.state.open&&this.props.beforeOpen){return this.props.beforeOpen();}});if(!this.props.manualOnly){useExternalListener(window,"click",this.onWindowClicked);useBus(Dropdown.bus,"state-changed",this.onDropdownStateChanged);}
this.ui=useService("ui");useEffect(()=>{Promise.resolve().then(()=>{this.myActiveEl=this.ui.activeElement;});},()=>[]);this.hasParentDropdown=this.env.inDropdown;useSubEnv({inDropdown:true});useDropdownNavigation();let position=this.props.position||(this.hasParentDropdown?"right-start":"bottom-start");let[direction,variant="middle"]=position.split("-");if(localization.direction==="rtl"){if(["bottom","top"].includes(direction)){variant=variant==="start"?"end":"start";}else{direction=direction==="left"?"right":"left";}
position=[direction,variant].join("-");}
const positioningOptions={popper:"menuRef",position,};this.directionCaretClass=DIRECTION_CARET_CLASS[direction];this.togglerRef=useRef("togglerRef");if(this.props.toggler==="parent"){useEffect(()=>{const onClick=(ev)=>{if(this.el.contains(ev.target)){return;}
this.toggle();};this.el.parentElement.addEventListener("click",onClick);return()=>{this.el.parentElement.removeEventListener("click",onClick);};},()=>[]);usePosition(()=>this.el.parentElement,positioningOptions);}else{const togglerRef=useRef("togglerRef");usePosition(()=>togglerRef.el,positioningOptions);}}
async changeStateAndNotify(stateSlice){if(stateSlice.open&&this.props.beforeOpen){await this.props.beforeOpen();}
Object.assign(this.state,stateSlice);const stateChangedPayload={emitter:this,newState:{...this.state},};Dropdown.bus.trigger("state-changed",stateChangedPayload);}
close(){return this.changeStateAndNotify({open:false,groupIsOpen:false});}
open(){return this.changeStateAndNotify({open:true,groupIsOpen:true});}
toggle(){const toggled=!this.state.open;return this.changeStateAndNotify({open:toggled,groupIsOpen:toggled});}
onItemSelected(ev){const{dropdownClosingRequest}=ev.detail;const closeAll=dropdownClosingRequest.mode===ParentClosingMode.AllParents;const closeSelf=dropdownClosingRequest.isFresh&&dropdownClosingRequest.mode===ParentClosingMode.ClosestParent;if(!this.props.manualOnly&&(closeAll||closeSelf)){this.close();}
ev.detail.dropdownClosingRequest.isFresh=false;}
onDropdownStateChanged(args){if(this.el.contains(args.emitter.el)){return;}
if(args.emitter.el.parentElement===this.el.parentElement){this.state.groupIsOpen=args.newState.groupIsOpen;if(this.state.open&&args.newState.open){this.state.open=false;}}else{if(this.state.open&&args.newState.open){this.close();}}}
onTogglerClick(){this.toggle();}
onTogglerMouseEnter(){if(this.state.groupIsOpen&&!this.state.open){this.open();}}
onWindowClicked(ev){if(!this.state.open){return;}
if(this.ui.activeElement!==this.myActiveEl){return;}
const rootEl=this.props.toggler==="parent"?this.el.parentElement:this.el;const gotClickedInside=rootEl.contains(ev.target);if(!gotClickedInside){this.close();}}}
Dropdown.bus=new EventBus();Dropdown.props={toggler:{type:String,optional:true,validate:(prop)=>["parent"].includes(prop),},startOpen:{type:Boolean,optional:true,},manualOnly:{type:Boolean,optional:true,},menuClass:{type:String,optional:true,},beforeOpen:{type:Function,optional:true,},togglerClass:{type:String,optional:true,},hotkey:{type:String,optional:true,},title:{type:String,optional:true,},position:{type:String,optional:true,},};Dropdown.template="web.Dropdown";QWeb.registerComponent("Dropdown",Dropdown);return __exports;});;

/* /web/static/src/core/dropdown/dropdown_item.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/dropdown/dropdown_item',async function(require){'use strict';let __exports={};const{Component,QWeb}=owl;const ParentClosingMode=__exports.ParentClosingMode={None:"none",ClosestParent:"closest",AllParents:"all",};const DropdownItem=__exports.DropdownItem=class DropdownItem extends Component{onClick(ev){if(this.props.href){ev.preventDefault();}
const detail={payload:this.props.payload,dropdownClosingRequest:{isFresh:true,mode:this.props.parentClosingMode,},};this.trigger("dropdown-item-selected",detail);}}
DropdownItem.template="web.DropdownItem";DropdownItem.props={payload:{type:Object,optional:true,},parentClosingMode:{type:ParentClosingMode,optional:true,},hotkey:{type:String,optional:true,},href:{type:String,optional:true,},title:{type:String,optional:true,},};DropdownItem.defaultProps={parentClosingMode:ParentClosingMode.AllParents,};QWeb.registerComponent("DropdownItem",DropdownItem);return __exports;});;

/* /web/static/src/core/dropdown/dropdown_navigation_hook.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/dropdown/dropdown_navigation_hook',async function(require){'use strict';let __exports={};const{useEffect,useService}=require("@web/core/utils/hooks");const{browser}=require("@web/core/browser/browser");const{localization}=require("@web/core/l10n/localization");const{scrollTo}=require("@web/core/utils/scrolling");const{hooks}=owl;const{useComponent,useRef}=hooks;const ACTIVE_MENU_ELEMENT_CLASS="focus";const MENU_ELEMENTS_SELECTORS=[":scope > .dropdown-item",":scope > .dropdown"];const NEXT_ACTIVE_INDEX_FNS={FIRST:()=>0,LAST:(list)=>list.length-1,NEXT:(list,prevActiveIndex)=>(prevActiveIndex+1)%list.length,PREV:(list,prevActiveIndex)=>(prevActiveIndex<=0?list.length:prevActiveIndex)-1,};__exports.useDropdownNavigation=useDropdownNavigation;function useDropdownNavigation(){const comp=useComponent();if(comp.hasParentDropdown&&comp.props.toggler==="parent"){throw new Error("A nested Dropdown must use its standard toggler");}
const originalOnTogglerClick=comp.onTogglerClick.bind(comp);comp.onTogglerClick=(ev)=>{if(comp.hasParentDropdown&&!ev.__fromDropdownNavigation){return;}
originalOnTogglerClick();};const originalOnTogglerMouseEnter=comp.onTogglerMouseEnter.bind(comp);comp.onTogglerMouseEnter=()=>{if(comp.hasParentDropdown){return;}
originalOnTogglerMouseEnter();};let mouseSelectionActive=true;const menuRef=useRef("menuRef");let menuElements=[];useEffect(()=>{if(!comp.state.open){return;}
const addedListeners=[];const queryResult=menuRef.el.querySelectorAll(MENU_ELEMENTS_SELECTORS.join());for(const el of queryResult){const isSubDropdown=el.classList.contains("dropdown");const isSubDropdownOpen=()=>el.classList.contains("show");const navTarget=isSubDropdown?el.querySelector(":scope > .dropdown-toggle"):el;let subDropdownTimeout;const closeSubDropdown=()=>{browser.clearTimeout(subDropdownTimeout);subDropdownTimeout=browser.setTimeout(()=>{if(isSubDropdownOpen()){const ev=new MouseEvent("click",{bubbles:false});ev.__fromDropdownNavigation=true;navTarget.dispatchEvent(ev);}},200);};const openSubDropdown=(immediate=false)=>{browser.clearTimeout(subDropdownTimeout);subDropdownTimeout=browser.setTimeout(()=>{if(!isSubDropdownOpen()){const ev=new MouseEvent("click",{bubbles:false});ev.__fromDropdownNavigation=true;navTarget.dispatchEvent(ev);}},immediate?0:200);};const makeOnlyActive=()=>{for(const menuElement of menuElements){if(menuElement.el===el){continue;}
menuElement.navTarget.classList.remove(ACTIVE_MENU_ELEMENT_CLASS);if(menuElement.isSubDropdown){menuElement.closeSubDropdown();}}
navTarget.classList.add(ACTIVE_MENU_ELEMENT_CLASS);};const menuElement={el,get isActive(){return navTarget.classList.contains(ACTIVE_MENU_ELEMENT_CLASS);},makeOnlyActive,navTarget,get isSubDropdownOpen(){return isSubDropdownOpen();},isSubDropdown,closeSubDropdown,openSubDropdown,};menuElements.push(menuElement);const elementListeners={mouseenter:()=>{if(!mouseSelectionActive){mouseSelectionActive=true;}else{makeOnlyActive();if(isSubDropdown){openSubDropdown();}}},};for(const[eventType,listener]of Object.entries(elementListeners)){navTarget.addEventListener(eventType,listener);}
addedListeners.push([navTarget,elementListeners]);}
return()=>{menuElements=[];mouseSelectionActive=true;for(const[navTarget,listeners]of addedListeners){for(const[eventType,listener]of Object.entries(listeners)){navTarget.removeEventListener(eventType,listener);}}};});const getActiveMenuElement=()=>{return menuElements.find((menuElement)=>menuElement.isActive);};const setActiveMenuElement=(menuElement)=>{if(menuElements.length){if(typeof menuElement==="string"){const prevIndex=menuElements.indexOf(getActiveMenuElement());const nextIndex=NEXT_ACTIVE_INDEX_FNS[menuElement](menuElements,prevIndex);menuElement=menuElements[nextIndex];}
menuElement.makeOnlyActive();scrollTo(menuElement.el,{scrollable:menuElement.el.parentElement});}};useEffect((open)=>{if(open&&comp.hasParentDropdown){setActiveMenuElement("FIRST");}},()=>[comp.state.open]);const hotkeyService=useService("hotkey");const closeSubDropdown=comp.hasParentDropdown?comp.close:()=>{};const openSubDropdown=()=>{const menuElement=getActiveMenuElement();if(menuElement&&menuElement.isSubDropdown){menuElement.openSubDropdown(true);}};const selectActiveMenuElement=()=>{const menuElement=getActiveMenuElement();if(menuElement){if(menuElement.isSubDropdown){menuElement.openSubDropdown(true);}else{menuElement.navTarget.click();}}};let hotkeyRemoves=[];const hotkeyCallbacks={home:()=>setActiveMenuElement("FIRST"),end:()=>setActiveMenuElement("LAST"),tab:()=>setActiveMenuElement("NEXT"),"shift+tab":()=>setActiveMenuElement("PREV"),arrowdown:()=>setActiveMenuElement("NEXT"),arrowup:()=>setActiveMenuElement("PREV"),arrowleft:localization.direction==="rtl"?openSubDropdown:closeSubDropdown,arrowright:localization.direction==="rtl"?closeSubDropdown:openSubDropdown,enter:selectActiveMenuElement,escape:comp.close,};useEffect((open)=>{if(!open){return;}
for(const[hotkey,callback]of Object.entries(hotkeyCallbacks)){const callbackWrapper=()=>{const hasOpenedSubDropdown=menuElements.some((m)=>m.isSubDropdownOpen);if(!hasOpenedSubDropdown){mouseSelectionActive=false;callback.call(comp);}};hotkeyRemoves.push(hotkeyService.add(hotkey,callbackWrapper,{allowRepeat:true}));}
return()=>{for(const removeHotkey of hotkeyRemoves){removeHotkey();}
hotkeyRemoves=[];};},()=>[comp.state.open]);}
return __exports;});;

/* /web/static/src/core/effects/effect_container.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/effects/effect_container',async function(require){'use strict';let __exports={};const{Component,tags}=owl;const EffectContainer=__exports.EffectContainer=class EffectContainer extends Component{setup(){this.effect=null;this.props.bus.on("UPDATE",this,(effect)=>{this.effect=effect;this.render();});}
removeEffect(){this.effect=null;this.render();}}
EffectContainer.template=tags.xml`
  <div class="o_effects_manager">
    <t t-if="effect">
        <t t-component="effect.Component" t-props="effect.props" t-key="effect.id" close="() => removeEffect()"/>
    </t>
  </div>`;return __exports;});;

/* /web/static/src/core/effects/effect_service.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/effects/effect_service',async function(require){'use strict';let __exports={};const{registry}=require("@web/core/registry");const{EffectContainer}=require("@web/core/effects/effect_container");const{RainbowMan}=require("@web/core/effects/rainbow_man");const{EventBus}=owl.core;const effectRegistry=registry.category("effects");function rainbowMan(env,params={}){let message=params.message;if(message instanceof jQuery){console.log("Providing a jQuery element to an effect is deprecated. Note that all event handlers will be lost.");message=message.html();}else if(message instanceof Element){console.log("Providing an HTML element to an effect is deprecated. Note that all event handlers will be lost.");message=message.outerHTML;}else if(!message){message=env._t("well Done!");}
if(env.services.user.showEffect){return{Component:params.Component||RainbowMan,props:{imgUrl:params.img_url||"/web/static/img/smile.svg",fadeout:params.fadeout,message,messageIsHtml:params.messageIsHtml||false,...params.props,},};}
env.services.notification.add(message);}
effectRegistry.add("rainbow_man",rainbowMan);const effectService=__exports.effectService={start(env){const bus=new EventBus();registry.category("main_components").add("EffectContainer",{Component:EffectContainer,props:{bus},});let effectId=0;function add(params){const type=params.type||"rainbow_man";const effect=effectRegistry.get(type);const{Component,props}=effect(env,params)||{};if(Component){bus.trigger("UPDATE",{Component,props,id:effectId++});}}
return{add};},};registry.category("services").add("effect",effectService);return __exports;});;

/* /web/static/src/core/effects/rainbow_man.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/effects/rainbow_man',async function(require){'use strict';let __exports={};const{browser}=require("@web/core/browser/browser");const{useEffect}=require("@web/core/utils/hooks");const{Component,hooks}=owl;const RainbowMan=__exports.RainbowMan=class RainbowMan extends Component{setup(){hooks.useExternalListener(document.body,"click",this.closeRainbowMan);const fadeout="fadeout"in this.props?this.props.fadeout:"medium";const delay=fadeout?RainbowMan.rainbowFadeouts[fadeout]:false;this.delay=typeof delay==="number"?delay:false;if(this.delay!==false){useEffect(()=>{const timeout=browser.setTimeout(()=>{this.el.classList.add("o_reward_fading");},this.delay);return()=>browser.clearTimeout(timeout);},()=>[]);}}
onAnimationEnd(ev){if(this.delay!==false&&ev.animationName==="reward-fading-reverse"){ev.stopPropagation();this.closeRainbowMan();}}
closeRainbowMan(){this.props.close();}}
RainbowMan.template="web.RainbowMan";RainbowMan.rainbowFadeouts={slow:4500,medium:3500,fast:2000,no:false};return __exports;});;

/* /web/static/src/core/errors/error_dialogs.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/errors/error_dialogs',async function(require){'use strict';let __exports={};const{browser}=require("@web/core/browser/browser");const{Dialog}=require("@web/core/dialog/dialog");const{_lt}=require("@web/core/l10n/translation");const{registry}=require("@web/core/registry");const{useService}=require("@web/core/utils/hooks");const{capitalize}=require("@web/core/utils/strings");const{hooks}=owl;const{useState}=hooks;const odooExceptionTitleMap=__exports.odooExceptionTitleMap=new Map(Object.entries({"odoo.addons.base.models.ir_mail_server.MailDeliveryException":_lt("MailDeliveryException"),"odoo.exceptions.AccessDenied":_lt("Access Denied"),"odoo.exceptions.MissingError":_lt("Missing Record"),"odoo.exceptions.UserError":_lt("User Error"),"odoo.exceptions.ValidationError":_lt("Validation Error"),"odoo.exceptions.AccessError":_lt("Access Error"),"odoo.exceptions.Warning":_lt("Warning"),}));const ErrorDialog=__exports.ErrorDialog=class ErrorDialog extends Dialog{setup(){super.setup();this.state=useState({showTraceback:false,});}
onClickClipboard(){browser.navigator.clipboard.writeText(`${this.props.name}\n${this.props.message}\n${this.props.traceback}`);}}
ErrorDialog.contentClass="o_dialog_error";ErrorDialog.bodyTemplate="web.ErrorDialogBody";ErrorDialog.title=_lt("Odoo Error");const ClientErrorDialog=__exports.ClientErrorDialog=class ClientErrorDialog extends ErrorDialog{}
ClientErrorDialog.title=_lt("Odoo Client Error");const NetworkErrorDialog=__exports.NetworkErrorDialog=class NetworkErrorDialog extends ErrorDialog{}
NetworkErrorDialog.title=_lt("Odoo Network Error");const RPCErrorDialog=__exports.RPCErrorDialog=class RPCErrorDialog extends ErrorDialog{setup(){super.setup();this.inferTitle();this.traceback=this.props.traceback;if(this.props.data&&this.props.data.debug){this.traceback=`${this.props.data.debug}`;}}
inferTitle(){if(this.props.exceptionName&&odooExceptionTitleMap.has(this.props.exceptionName)){this.title=odooExceptionTitleMap.get(this.props.exceptionName).toString();return;}
if(!this.props.type)return;switch(this.props.type){case"server":this.title=this.env._t("Odoo Server Error");break;case"script":this.title=this.env._t("Odoo Client Error");break;case"network":this.title=this.env._t("Odoo Network Error");break;}}
onClickClipboard(){browser.navigator.clipboard.writeText(`${this.props.name}\n${this.props.message}\n${this.traceback}`);}}
const WarningDialog=__exports.WarningDialog=class WarningDialog extends Dialog{setup(){super.setup();this.title=this.env._t("Odoo Warning");this.inferTitle();const{data,message}=this.props;if(data&&data.arguments&&data.arguments.length>0){this.message=data.arguments[0];}else{this.message=message;}}
inferTitle(){if(this.props.exceptionName&&odooExceptionTitleMap.has(this.props.exceptionName)){this.title=odooExceptionTitleMap.get(this.props.exceptionName).toString();}}}
WarningDialog.bodyTemplate="web.WarningDialogBody";const RedirectWarningDialog=__exports.RedirectWarningDialog=class RedirectWarningDialog extends Dialog{setup(){super.setup();this.actionService=useService("action");const{data,subType}=this.props;const[message,actionId,buttonText,additional_context]=data.arguments;this.title=capitalize(subType)||this.env._t("Odoo Warning");this.message=message;this.actionId=actionId;this.buttonText=buttonText;this.additionalContext=additional_context;}
async onClick(){const options={};if(this.additionalContext){options.additionalContext=this.additionalContext;}
await this.actionService.doAction(this.actionId,options);this.close();}
onCancel(){this.close();}}
RedirectWarningDialog.bodyTemplate="web.RedirectWarningDialogBody";RedirectWarningDialog.footerTemplate="web.RedirectWarningDialogFooter";const Error504Dialog=__exports.Error504Dialog=class Error504Dialog extends Dialog{}
Error504Dialog.bodyTemplate="web.Error504DialogBody";Error504Dialog.title=_lt("Request timeout");const SessionExpiredDialog=__exports.SessionExpiredDialog=class SessionExpiredDialog extends Dialog{onClick(){browser.location.reload();}}
SessionExpiredDialog.bodyTemplate="web.SessionExpiredDialogBody";SessionExpiredDialog.footerTemplate="web.SessionExpiredDialogFooter";SessionExpiredDialog.title=_lt("Odoo Session Expired");registry.category("error_dialogs").add("odoo.exceptions.AccessDenied",WarningDialog).add("odoo.exceptions.AccessError",WarningDialog).add("odoo.exceptions.MissingError",WarningDialog).add("odoo.exceptions.UserError",WarningDialog).add("odoo.exceptions.ValidationError",WarningDialog).add("odoo.exceptions.RedirectWarning",RedirectWarningDialog).add("odoo.http.SessionExpiredException",SessionExpiredDialog).add("werkzeug.exceptions.Forbidden",SessionExpiredDialog).add("504",Error504Dialog);return __exports;});;

/* /web/static/src/core/errors/error_handlers.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/errors/error_handlers',async function(require){'use strict';let __exports={};const{browser}=require("@web/core/browser/browser");const{ConnectionLostError,RPCError}=require("@web/core/network/rpc_service");const{registry}=require("@web/core/registry");const{ClientErrorDialog,ErrorDialog,NetworkErrorDialog,RPCErrorDialog,}=require("@web/core/errors/error_dialogs");const{UncaughtClientError,UncaughtCorsError,UncaughtPromiseError}=require("@web/core/errors/error_service");const errorHandlerRegistry=registry.category("error_handlers");const errorDialogRegistry=registry.category("error_dialogs");const errorNotificationRegistry=registry.category("error_notifications");function corsErrorHandler(env,error){if(error instanceof UncaughtCorsError){env.services.dialog.add(NetworkErrorDialog,{traceback:error.traceback,message:error.message,name:error.name,});return true;}}
errorHandlerRegistry.add("corsErrorHandler",corsErrorHandler,{sequence:95});function clientErrorHandler(env,error){if(error instanceof UncaughtClientError){env.services.dialog.add(ClientErrorDialog,{traceback:error.traceback,message:error.message,name:error.name,});return true;}}
errorHandlerRegistry.add("clientErrorHandler",clientErrorHandler,{sequence:96});__exports.rpcErrorHandler=rpcErrorHandler;function rpcErrorHandler(env,error,originalError){if(!(error instanceof UncaughtPromiseError)){return false;}
if(originalError instanceof RPCError){error.unhandledRejectionEvent.preventDefault();const exceptionName=originalError.exceptionName;let ErrorComponent=originalError.Component;if(!ErrorComponent&&exceptionName){if(errorNotificationRegistry.contains(exceptionName)){const notif=errorNotificationRegistry.get(exceptionName);env.services.notification.add(notif.message||originalError.data.message,notif);return true;}
if(errorDialogRegistry.contains(exceptionName)){ErrorComponent=errorDialogRegistry.get(exceptionName);}}
if(!ErrorComponent&&originalError.data.context){const exceptionClass=originalError.data.context.exception_class;if(errorDialogRegistry.contains(exceptionClass)){ErrorComponent=errorDialogRegistry.get(exceptionClass);}}
env.services.dialog.add(ErrorComponent||RPCErrorDialog,{traceback:error.traceback,message:originalError.message,name:originalError.name,exceptionName:originalError.exceptionName,data:originalError.data,subType:originalError.subType,code:originalError.code,type:originalError.type,});return true;}}
errorHandlerRegistry.add("rpcErrorHandler",rpcErrorHandler,{sequence:97});let connectionLostNotifRemove=null;__exports.lostConnectionHandler=lostConnectionHandler;function lostConnectionHandler(env,error,originalError){if(!(error instanceof UncaughtPromiseError)){return false;}
if(originalError instanceof ConnectionLostError){if(connectionLostNotifRemove){return true;}
connectionLostNotifRemove=env.services.notification.add(env._t("Connection lost. Trying to reconnect..."),{sticky:true});let delay=2000;browser.setTimeout(function checkConnection(){env.services.rpc("/web/webclient/version_info",{}).then(function(){if(connectionLostNotifRemove){connectionLostNotifRemove();connectionLostNotifRemove=null;}
env.services.notification.add(env._t("Connection restored. You are back online."),{type:"info",});}).catch(()=>{delay=delay*1.5+500*Math.random();browser.setTimeout(checkConnection,delay);});},delay);return true;}}
errorHandlerRegistry.add("lostConnectionHandler",lostConnectionHandler,{sequence:98});function emptyRejectionErrorHandler(env,error){if(!(error instanceof UncaughtPromiseError)){return false;}
env.services.dialog.add(ClientErrorDialog,{traceback:error.traceback,message:error.message,name:error.name,});return true;}
errorHandlerRegistry.add("emptyRejectionErrorHandler",emptyRejectionErrorHandler,{sequence:99,});function defaultHandler(env,error){env.services.dialog.add(ErrorDialog,{traceback:error.traceback,message:error.message,name:error.name,});return true;}
errorHandlerRegistry.add("defaultHandler",defaultHandler,{sequence:100});return __exports;});;

/* /web/static/src/core/errors/error_service.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/errors/error_service',async function(require){'use strict';let __exports={};const{browser}=require("@web/core/browser/browser");const{_lt}=require("@web/core/l10n/translation");const{registry}=require("@web/core/registry");const{annotateTraceback,formatTraceback,getErrorTechnicalName}=require("@web/core/errors/error_utils");const UncaughtError=__exports.UncaughtError=class UncaughtError extends Error{constructor(message){super(message);this.name=getErrorTechnicalName(this);this.traceback=null;}}
const UncaughtClientError=__exports.UncaughtClientError=class UncaughtClientError extends UncaughtError{constructor(message=_lt("Uncaught Javascript Error")){super(message);}}
const UncaughtPromiseError=__exports.UncaughtPromiseError=class UncaughtPromiseError extends UncaughtError{constructor(message=_lt("Uncaught Promise")){super(message);this.unhandledRejectionEvent=null;}}
const UncaughtCorsError=__exports.UncaughtCorsError=class UncaughtCorsError extends UncaughtError{constructor(message=_lt("Uncaught CORS Error")){super(message);}}
function combineErrorNames(uncaughtError,originalError){const originalErrorName=getErrorTechnicalName(originalError);const uncaughtErrorName=getErrorTechnicalName(uncaughtError);if(originalErrorName===Error.name){return uncaughtErrorName;}else{return`${uncaughtErrorName} > ${originalErrorName}`;}}
async function completeUncaughtError(env,uncaughtError,originalError){uncaughtError.name=combineErrorNames(uncaughtError,originalError);if(env.debug.includes("assets")){uncaughtError.traceback=await annotateTraceback(originalError);}else{uncaughtError.traceback=formatTraceback(originalError);}
if(originalError.message){uncaughtError.message=`${uncaughtError.message} > ${originalError.message}`;}}
const errorService=__exports.errorService={start(env){function handleError(error,originalError,retry=true){const services=env.services;if(!services.dialog||!services.notification||!services.rpc){if(retry){browser.setTimeout(()=>{handleError(error,originalError,false);},1000);}
return;}
for(let handler of registry.category("error_handlers").getAll()){if(handler(env,error,originalError)){break;}}}
browser.addEventListener("error",async(ev)=>{const{colno,error:originalError,filename,lineno,message}=ev;const errorsToIgnore=["ResizeObserver loop completed with undelivered notifications.","ResizeObserver loop limit exceeded"]
if(!originalError&&errorsToIgnore.includes(message)){return;}
let uncaughtError;if(!filename&&!lineno&&!colno){uncaughtError=new UncaughtCorsError();uncaughtError.traceback=env._t(`Unknown CORS error\n\n`+`An unknown CORS error occured.\n`+`The error probably originates from a JavaScript file served from a different origin.\n`+`(Opening your browser console might give you a hint on the error.)`);}else{uncaughtError=new UncaughtClientError();await completeUncaughtError(env,uncaughtError,originalError);}
handleError(uncaughtError,originalError);});browser.addEventListener("unhandledrejection",async(ev)=>{const originalError=ev.reason;const uncaughtError=new UncaughtPromiseError();uncaughtError.unhandledRejectionEvent=ev;if(originalError instanceof Error){await completeUncaughtError(env,uncaughtError,originalError);}
handleError(uncaughtError,originalError);});},};registry.category("services").add("error",errorService,{sequence:1});return __exports;});;

/* /web/static/src/core/errors/error_utils.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/errors/error_utils',async function(require){'use strict';let __exports={};const{loadAssets}=require("@web/core/assets");const{isBrowserChrome}=require("@web/core/browser/feature_detection");__exports.getErrorTechnicalName=getErrorTechnicalName;function getErrorTechnicalName(error){return error.name!==Error.name?error.name:error.constructor.name;}
__exports.formatTraceback=formatTraceback;function formatTraceback(error){let traceback=error.stack;const errorName=getErrorTechnicalName(error);if(!isBrowserChrome()){traceback=`${errorName}: ${error.message}\n${error.stack}`.replace(/\n/g,"\n    ");}else if(error.stack){traceback=error.stack.replace(/^[^:]*/g,errorName);}
return traceback;}
__exports.annotateTraceback=annotateTraceback;async function annotateTraceback(error){const traceback=formatTraceback(error);try{await loadAssets({jsLibs:["/web/static/lib/stacktracejs/stacktrace.js"],});}catch(e){return traceback;}
if(error.stack){const regex=/ line (\d*) > (Function):(\d*)/gm;const subst=`:$1`;error.stack=error.stack.replace(regex,subst);}
let frames;try{frames=await StackTrace.fromError(error);}catch(e){console.warn("The following error could not be annotated:",error,e);return traceback;}
const lines=traceback.split("\n");if(lines[lines.length-1].trim()===""){lines.splice(-1);}
const skips=lines.filter((l)=>l.includes("(index 0")).length;const offset=lines.length-frames.length-skips;let lineIndex=offset;let frameIndex=0;while(frameIndex<frames.length){const line=lines[lineIndex];if(line.includes("(index 0)")){lineIndex++;continue;}
const frame=frames[frameIndex];const info=` (${frame.fileName}:${frame.lineNumber})`;lines[lineIndex]=line+info;lineIndex++;frameIndex++;}
return lines.join("\n");}
return __exports;});;

/* /web/static/src/core/file_input/file_input.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/file_input/file_input',async function(require){'use strict';let __exports={};const{useService}=require("@web/core/utils/hooks");const{Component,hooks,QWeb}=owl;const{useRef}=hooks;const FileInput=__exports.FileInput=class FileInput extends Component{setup(){this.http=useService("http");this.fileInputRef=useRef("file-input");}
async onFileInputChange(){const{action,model,id}=this.props;const params={csrf_token:odoo.csrf_token,ufile:[...this.fileInputRef.el.files],};if(model){params.model=model;}
if(id){params.id=id;}
const fileData=await this.http.post(action,params,"text");const parsedFileData=JSON.parse(fileData);if(parsedFileData.error){throw new Error(parsedFileData.error);}
this.trigger("uploaded",{files:parsedFileData});}
onTriggerClicked(){this.fileInputRef.el.click();}}
FileInput.defaultProps={accepted_file_extensions:"*",action:"/web/binary/upload",multi_upload:false,};FileInput.props={accepted_file_extensions:{type:String,optional:1},action:{type:String,optional:1},id:{type:Number,optional:1},model:{type:String,optional:1},multi_upload:{type:Boolean,optional:1},};FileInput.template="web.FileInput";QWeb.registerComponent("FileInput",FileInput);return __exports;});;

/* /web/static/src/core/hotkeys/hotkey_hook.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/hotkeys/hotkey_hook',async function(require){'use strict';let __exports={};const{useEffect,useService}=require("@web/core/utils/hooks");__exports.useHotkey=useHotkey;function useHotkey(hotkey,callback,options={}){const hotkeyService=useService("hotkey");useEffect(()=>hotkeyService.add(hotkey,callback,options),()=>[]);}
return __exports;});;

/* /web/static/src/core/hotkeys/hotkey_service.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/hotkeys/hotkey_service',async function(require){'use strict';let __exports={};const{isMacOS}=require("@web/core/browser/feature_detection");const{registry}=require("@web/core/registry");const{browser}=require("@web/core/browser/browser");const{getVisibleElements}=require("@web/core/utils/ui");const ALPHANUM_KEYS="abcdefghijklmnopqrstuvwxyz0123456789".split("");const NAV_KEYS=["arrowleft","arrowright","arrowup","arrowdown","pageup","pagedown","home","end","backspace","enter","tab","delete",];const MODIFIERS=new Set(["alt","control","shift"]);const AUTHORIZED_KEYS=new Set([...ALPHANUM_KEYS,...NAV_KEYS,"escape"]);const hotkeyService=__exports.hotkeyService={dependencies:["ui"],overlayModifier:"alt",start(env,{ui}){const registrations=new Map();let nextToken=0;let overlaysVisible=false;addListeners(browser);function addListeners(target){target.addEventListener("keydown",onKeydown);target.addEventListener("keyup",removeHotkeyOverlays);target.addEventListener("blur",removeHotkeyOverlays);target.addEventListener("click",removeHotkeyOverlays);}
function onKeydown(event){if(!event.key){return;}
if(event.code&&event.code.indexOf("Numpad")===0&&/^\d$/.test(event.key)){return;}
const hotkey=getActiveHotkey(event);if(ui.isBlocked){return;}
const elementsWithAccessKey=document.querySelectorAll("[accesskey]");for(const el of elementsWithAccessKey){if(el instanceof HTMLElement){el.dataset.hotkey=el.accessKey;el.removeAttribute("accesskey");}}
if(hotkey===hotkeyService.overlayModifier){addHotkeyOverlays();event.preventDefault();return;}
const singleKey=hotkey.split("+").pop();if(!AUTHORIZED_KEYS.has(singleKey)){return;}
const targetIsEditable=event.target instanceof HTMLElement&&(/input|textarea/i.test(event.target.tagName)||event.target.isContentEditable);const shouldProtectEditable=targetIsEditable&&!event.target.dataset.allowHotkeys&&singleKey!=="escape";const infos={hotkey,shouldProtectEditable,_originalEvent:event,};dispatch(infos);removeHotkeyOverlays(event);}
function dispatch(infos){let dispatched=false;const{hotkey,shouldProtectEditable,_originalEvent:event}=infos;const activeElement=ui.activeElement;for(const reg of Array.from(registrations.values()).reverse()){if(!reg.global&&reg.activeElement!==activeElement){continue;}
if(reg.hotkey!==hotkey){continue;}
if(!reg.allowRepeat&&event.repeat){continue;}
if(!reg.bypassEditableProtection&&shouldProtectEditable){continue;}
reg.callback();dispatched=true;break;}
const overlayModParts=hotkeyService.overlayModifier.split("+");if(!dispatched&&!event.repeat&&overlayModParts.every((el)=>hotkey.includes(el))){const cleanHotkey=hotkey.split("+").filter((key)=>!overlayModParts.includes(key)).join("+");const elems=getVisibleElements(ui.activeElement,`[data-hotkey='${cleanHotkey}' i]`);for(const el of elems){el.focus();el.click();dispatched=true;break;}}
if(dispatched){event.preventDefault();event.stopImmediatePropagation();}}
function addHotkeyOverlays(){if(overlaysVisible){return;}
for(const el of getVisibleElements(ui.activeElement,"[data-hotkey]:not(:disabled)")){const hotkey=el.dataset.hotkey;const overlay=document.createElement("div");overlay.className="o_web_hotkey_overlay";overlay.appendChild(document.createTextNode(hotkey.toUpperCase()));let overlayParent;if(el.tagName.toUpperCase()==="INPUT"){overlayParent=el.parentElement;}else{overlayParent=el;}
if(overlayParent.style.position!=="absolute"){overlayParent.style.position="relative";}
overlayParent.appendChild(overlay);}
overlaysVisible=true;}
function removeHotkeyOverlays(event){if(!overlaysVisible){return;}
for(const overlay of document.querySelectorAll(".o_web_hotkey_overlay")){overlay.remove();}
overlaysVisible=false;event.preventDefault();}
function getActiveHotkey(ev){const hotkey=[];if(isMacOS()?ev.ctrlKey:ev.altKey){hotkey.push("alt");}
if(isMacOS()?ev.metaKey:ev.ctrlKey){hotkey.push("control");}
if(ev.shiftKey){hotkey.push("shift");}
let key=ev.key.toLowerCase();if(ev.code&&ev.code.indexOf("Digit")===0){key=ev.code.slice(-1);}
if(!AUTHORIZED_KEYS.has(key)&&ev.code&&ev.code.indexOf("Key")===0){key=ev.code.slice(-1).toLowerCase();}
if(!MODIFIERS.has(key)){hotkey.push(key);}
return hotkey.join("+");}
function registerHotkey(hotkey,callback,options={}){if(!hotkey||hotkey.length===0){throw new Error("You must specify an hotkey when registering a registration.");}
if(!callback||typeof callback!=="function"){throw new Error("You must specify a callback function when registering a registration.");}
const keys=hotkey.toLowerCase().split("+").filter((k)=>!MODIFIERS.has(k));if(keys.some((k)=>!AUTHORIZED_KEYS.has(k))){throw new Error(`You are trying to subscribe for an hotkey ('${hotkey}')
            that contains parts not whitelisted: ${keys.join(", ")}`);}else if(keys.length>1){throw new Error(`You are trying to subscribe for an hotkey ('${hotkey}')
            that contains more than one single key part: ${keys.join("+")}`);}
const token=nextToken++;const registration={hotkey:hotkey.toLowerCase(),callback,activeElement:null,allowRepeat:options&&options.allowRepeat,bypassEditableProtection:options&&options.bypassEditableProtection,global:options&&options.global,};registrations.set(token,registration);Promise.resolve().then(()=>{registration.activeElement=ui.activeElement;});return token;}
function unregisterHotkey(token){registrations.delete(token);}
return{add(hotkey,callback,options={}){const token=registerHotkey(hotkey,callback,options);return()=>{unregisterHotkey(token);};},registerIframe(iframe){addListeners(iframe.contentWindow);},};},};registry.category("services").add("hotkey",hotkeyService);return __exports;});;

/* /web/static/src/core/l10n/dates.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/l10n/dates',async function(require){'use strict';let __exports={};const{localization}=require("@web/core/l10n/localization");const{_t}=require("@web/core/l10n/translation");const{memoize}=require("@web/core/utils/functions");const{sprintf}=require("@web/core/utils/strings");const{DateTime,Settings}=luxon;const SERVER_DATE_FORMAT="yyyy-MM-dd";const SERVER_TIME_FORMAT="HH:mm:ss";const alphaRegex=/[a-zA-Z]/g;const nonAlphaRegex=/[^a-zA-Z]/g;const nonDigitsRegex=/[^0-9]/g;const normalizeFormatTable={a:"ccc",A:"cccc",b:"MMM",B:"MMMM",d:"dd",H:"HH",I:"hh",j:"o",m:"MM",M:"mm",p:"a",S:"ss",W:"WW",w:"c",y:"yy",Y:"yyyy",c:"ccc MMM d HH:mm:ss yyyy",x:"MM/dd/yy",X:"HH:mm:ss",};const smartDateUnits={d:"days",m:"months",w:"weeks",y:"years",};const smartDateRegex=new RegExp(`^([+-])(\\d+)([${Object.keys(smartDateUnits).join("")}]?)$`);function parseSmartDateInput(value){const match=smartDateRegex.exec(value);if(match){let date=DateTime.utc();const offset=parseInt(match[2],10);const unit=smartDateUnits[match[3]||"d"];if(match[1]==="+"){date=date.plus({[unit]:offset});}else{date=date.minus({[unit]:offset});}
return date;}
return false;}
function constrain(dt){let valid=dt!==false;valid=valid&&dt.isValid;valid=valid&&dt.year>=1000;valid=valid&&dt.year<10000;return valid?dt:false;}
const stripAlphaDupes=memoize(function stripAlphaDupes(str){return str.replace(alphaRegex,(letter,index,str)=>{return letter===str[index-1]?"":letter;});});const strftimeToLuxonFormat=__exports.strftimeToLuxonFormat=memoize(function strftimeToLuxonFormat(value){const output=[];let inToken=false;for(let index=0;index<value.length;++index){let character=value[index];if(character==="%"&&!inToken){inToken=true;continue;}
if(character.match(alphaRegex)){if(inToken&&normalizeFormatTable[character]!==undefined){character=normalizeFormatTable[character];}else{character="["+character+"]";}}
output.push(character);inToken=false;}
return output.join("");});__exports.formatDate=formatDate;function formatDate(value,options={}){return formatDateTime(value,{timezone:false,...options,format:options.format||localization.dateFormat,});}
__exports.formatDateTime=formatDateTime;function formatDateTime(value,options={}){if(value===false){return"";}
const format=options.format||localization.dateTimeFormat;const numberingSystem=options.numberingSystem||Settings.defaultNumberingSystem;const zone=options.timezone?"local":"utc";value=value.setZone(zone,{keepLocaltime:options.timezone});return value.toFormat(format,{numberingSystem});}
__exports.parseDate=parseDate;function parseDate(value,options={}){return parseDateTime(value,{timezone:false,...options}).startOf("day");}
__exports.parseDateTime=parseDateTime;function parseDateTime(value,options={}){if(!value){return false;}
const valueDigitsOnly=value.replace(nonDigitsRegex,"");const parseOpts={setZone:true,zone:options.timezone?"local":"utc",locale:options.locale,numberingSystem:options.numberingSystem||Settings.defaultNumberingSystem,};let result=constrain(parseSmartDateInput(value));if(!result){const fmt=options.format||localization.dateTimeFormat;const fmtWoZero=stripAlphaDupes(fmt);const woSeps={val:valueDigitsOnly,fmt:fmt.replace(nonAlphaRegex,"").slice(0,valueDigitsOnly.length),};result=constrain(DateTime.fromFormat(value,fmt,parseOpts))||constrain(DateTime.fromFormat(value,fmtWoZero,parseOpts))||constrain(DateTime.fromFormat(woSeps.val,woSeps.fmt,parseOpts));}
if(!result){if(valueDigitsOnly.length>4){result=constrain(DateTime.fromISO(value,parseOpts))||constrain(DateTime.fromSQL(value,parseOpts));}}
if(!result){throw new Error(sprintf(_t("'%s' is not a correct date or datetime"),value));}
return options.timezone?result:result.toUTC();}
const deserializeDate=__exports.deserializeDate=(value)=>{return parseDate(value,{format:SERVER_DATE_FORMAT,numberingSystem:"latn",});};const deserializeDateTime=__exports.deserializeDateTime=(value)=>{return parseDateTime(value,{format:`${SERVER_DATE_FORMAT} ${SERVER_TIME_FORMAT}`,numberingSystem:"latn",});};const serializeDate=__exports.serializeDate=(value)=>{return formatDate(value,{format:SERVER_DATE_FORMAT,numberingSystem:"latn",});};const serializeDateTime=__exports.serializeDateTime=(value)=>{return formatDateTime(value,{format:`${SERVER_DATE_FORMAT} ${SERVER_TIME_FORMAT}`,numberingSystem:"latn",});};return __exports;});;

/* /web/static/src/core/l10n/localization.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/l10n/localization',async function(require){'use strict';let __exports={};const notReadyError=new Error("Localization parameters not ready yet. Maybe add 'localization' to your dependencies?");const localization=__exports.localization={dateFormat:notReadyError,dateTimeFormat:notReadyError,timeFormat:notReadyError,decimalPoint:notReadyError,direction:notReadyError,grouping:notReadyError,multiLang:notReadyError,thousandsSep:notReadyError,weekStart:notReadyError,};return __exports;});;

/* /web/static/src/core/l10n/localization_service.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/l10n/localization_service',async function(require){'use strict';let __exports={};const{session}=require("@web/session");const{browser}=require("@web/core/browser/browser");const{registry}=require("@web/core/registry");const{strftimeToLuxonFormat}=require("@web/core/l10n/dates");const{localization}=require("@web/core/l10n/localization");const{translatedTerms,_t}=require("@web/core/l10n/translation");const{Settings}=luxon;const NUMBERING_SYSTEMS=[[/^ar-(sa|001)$/i,"arab"],[/^bn/i,"beng"],[/^bo/i,"tibt"],[/^pa-in/i,"guru"],[/^ta/i,"tamldec"],[/.*/i,"latn"],];const localizationService=__exports.localizationService={dependencies:["user"],start:async(env,{user})=>{owl.config.translatableAttributes.push("data-tooltip");const cacheHashes=session.cache_hashes||{};const translationsHash=cacheHashes.translations||new Date().getTime().toString();const lang=user.lang||null;const translationURL=session.translationURL||"/web/webclient/translations";let url=`${translationURL}/${translationsHash}`;if(lang){url+=`?lang=${lang}`;}
const response=await browser.fetch(url);if(!response.ok){throw new Error("Error while fetching translations");}
const{lang_parameters:userLocalization,modules:modules}=await response.json();let terms={};for(const addon of Object.keys(modules)){for(const message of modules[addon].messages){terms[message.id]=message.string;}}
Object.setPrototypeOf(translatedTerms,terms);env._t=_t;env.qweb.translateFn=_t;if(lang){const locale=lang==="sr@latin"?"sr-Latn-RS":lang.replace(/_/g,"-");Settings.defaultLocale=locale;for(const[re,numberingSystem]of NUMBERING_SYSTEMS){if(re.test(locale)){Settings.defaultNumberingSystem=numberingSystem;break;}}}
const dateFormat=strftimeToLuxonFormat(userLocalization.date_format);const timeFormat=strftimeToLuxonFormat(userLocalization.time_format);const dateTimeFormat=`${dateFormat} ${timeFormat}`;const grouping=JSON.parse(userLocalization.grouping);Object.assign(localization,{dateFormat,timeFormat,dateTimeFormat,decimalPoint:userLocalization.decimal_point,direction:userLocalization.direction,grouping,multiLang:userLocalization.multi_lang,thousandsSep:userLocalization.thousands_sep,weekStart:userLocalization.week_start,});},};registry.category("services").add("localization",localizationService);return __exports;});;

/* /web/static/src/core/l10n/translation.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/l10n/translation',async function(require){'use strict';let __exports={};const translatedTerms=__exports.translatedTerms={};__exports._t=_t;function _t(term){return translatedTerms[term]||term;}
class LazyTranslatedString extends String{valueOf(){const str=super.valueOf();return _t(str);}
toString(){return this.valueOf();}}
__exports._lt=_lt;function _lt(term){return new LazyTranslatedString(term);}
_lt("less than a minute ago");_lt("about a minute ago");_lt("%d minutes ago");_lt("about an hour ago");_lt("%d hours ago");_lt("a day ago");_lt("%d days ago");_lt("about a month ago");_lt("%d months ago");_lt("about a year ago");_lt("%d years ago");return __exports;});;

/* /web/static/src/core/main_components_container.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/main_components_container',async function(require){'use strict';let __exports={};const{registry}=require("@web/core/registry");const{NotUpdatable,ErrorHandler}=require("@web/core/utils/components");const{Component,tags}=owl;const MainComponentsContainer=__exports.MainComponentsContainer=class MainComponentsContainer extends Component{setup(){this.Components=registry.category("main_components").getEntries();}
handleComponentError(error,C){this.Components.splice(this.Components.indexOf(C),1);this.render();Promise.resolve().then(()=>{throw error;});}}
MainComponentsContainer.template=tags.xml`
<div>
    <t t-foreach="Components" t-as="C" t-key="C[0]">
        <NotUpdatable>
            <ErrorHandler onError="error => handleComponentError(error, C)">
                <t t-component="C[1].Component" t-props="C[1].props"/>
            </ErrorHandler>
        </NotUpdatable>
    </t>
</div>
`;MainComponentsContainer.components={NotUpdatable,ErrorHandler};return __exports;});;

/* /web/static/src/core/network/download.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/network/download',async function(require){'use strict';let __exports={};const{_lt}=require("@web/core/l10n/translation");const{makeErrorFromResponse}=require("@web/core/network/rpc_service");const{ConnectionLostError}=require("@web/core/network/rpc_service");const{browser}=require("@web/core/browser/browser");const HEX_ESCAPE_REPLACE_REGEXP=/%([0-9A-Fa-f]{2})/g;const NON_LATIN1_REGEXP=/[^\x20-\x7e\xa0-\xff]/g;const QESC_REGEXP=/\\([\u0000-\u007f])/g;const PARAM_REGEXP=/;[\x09\x20]*([!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*=[\x09\x20]*("(?:[\x20!\x23-\x5b\x5d-\x7e\x80-\xff]|\\[\x20-\x7e])*"|[!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*/g;const EXT_VALUE_REGEXP=/^([A-Za-z0-9!#$%&+\-^_`{}~]+)'(?:[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,3}|[A-Za-z]{4,8}|)'((?:%[0-9A-Fa-f]{2}|[A-Za-z0-9!#$&+.^_`|~-])+)$/;const DISPOSITION_TYPE_REGEXP=/^([!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*(?:$|;)/;function decodefield(str){const match=EXT_VALUE_REGEXP.exec(str);if(!match){throw new TypeError("invalid extended field value");}
const charset=match[1].toLowerCase();const encoded=match[2];switch(charset){case"iso-8859-1":return encoded.replace(HEX_ESCAPE_REPLACE_REGEXP,pdecode).replace(NON_LATIN1_REGEXP,"?");case"utf-8":return decodeURIComponent(encoded);default:throw new TypeError("unsupported charset in extended field");}}
function parse(string){if(!string||typeof string!=="string"){throw new TypeError("argument string is required");}
let match=DISPOSITION_TYPE_REGEXP.exec(string);if(!match){throw new TypeError("invalid type format");}
let index=match[0].length;const type=match[1].toLowerCase();let key;const names=[];const params={};let value;index=PARAM_REGEXP.lastIndex=match[0].substr(-1)===";"?index-1:index;while((match=PARAM_REGEXP.exec(string))){if(match.index!==index){throw new TypeError("invalid parameter format");}
index+=match[0].length;key=match[1].toLowerCase();value=match[2];if(names.indexOf(key)!==-1){throw new TypeError("invalid duplicate parameter");}
names.push(key);if(key.indexOf("*")+1===key.length){key=key.slice(0,-1);value=decodefield(value);params[key]=value;continue;}
if(typeof params[key]==="string"){continue;}
if(value[0]==='"'){value=value.substr(1,value.length-2).replace(QESC_REGEXP,"$1");}
params[key]=value;}
if(index!==-1&&index!==string.length){throw new TypeError("invalid parameter format");}
return new ContentDisposition(type,params);}
function pdecode(str,hex){return String.fromCharCode(parseInt(hex,16));}
function ContentDisposition(type,parameters){this.type=type;this.parameters=parameters;}
function _download(data,filename,mimetype){let self=window,defaultMime="application/octet-stream",mimeType=mimetype||defaultMime,payload=data,url=!filename&&!mimetype&&payload,anchor=document.createElement("a"),toString=function(a){return String(a);},myBlob=self.Blob||self.MozBlob||self.WebKitBlob||toString,fileName=filename||"download",blob,reader;myBlob=myBlob.call?myBlob.bind(self):Blob;if(String(this)==="true"){payload=[payload,mimeType];mimeType=payload[0];payload=payload[1];}
if(url&&url.length<2048){fileName=url.split("/").pop().split("?")[0];anchor.href=url;if(anchor.href.indexOf(url)!==-1){let ajax=new XMLHttpRequest();ajax.open("GET",url,true);ajax.responseType="blob";ajax.onload=function(e){_download(e.target.response,fileName,defaultMime);};setTimeout(()=>{ajax.send();},0);return ajax;}}
if(/^data:[\w+\-]+\/[\w+\-]+[,;]/.test(payload)){if(payload.length>1024*1024*1.999&&myBlob!==toString){payload=dataUrlToBlob(payload);mimeType=payload.type||defaultMime;}else{return navigator.msSaveBlob?navigator.msSaveBlob(dataUrlToBlob(payload),fileName):saver(payload);}}
blob=payload instanceof myBlob?payload:new myBlob([payload],{type:mimeType});function dataUrlToBlob(strUrl){let parts=strUrl.split(/[:;,]/),type=parts[1],decoder=parts[2]==="base64"?atob:decodeURIComponent,binData=decoder(parts.pop()),mx=binData.length,i=0,uiArr=new Uint8Array(mx);for(i;i<mx;++i){uiArr[i]=binData.charCodeAt(i);}
return new myBlob([uiArr],{type});}
function saver(url,winMode){if("download"in anchor){anchor.href=url;anchor.setAttribute("download",fileName);anchor.className="download-js-link";anchor.innerText=_lt("downloading...");anchor.style.display="none";document.body.appendChild(anchor);setTimeout(()=>{anchor.click();document.body.removeChild(anchor);if(winMode===true){setTimeout(()=>{self.URL.revokeObjectURL(anchor.href);},250);}},66);return true;}
if(/(Version)\/(\d+)\.(\d+)(?:\.(\d+))?.*Safari\//.test(navigator.userAgent)){url=url.replace(/^data:([\w\/\-+]+)/,defaultMime);if(!window.open(url)){if(confirm("Displaying New Document\n\nUse Save As... to download, then click back to return to this page.")){location.href=url;}}
return true;}
let f=document.createElement("iframe");document.body.appendChild(f);if(!winMode){url=`data:${url.replace(/^data:([\w\/\-+]+)/, defaultMime)}`;}
f.src=url;setTimeout(()=>{document.body.removeChild(f);},333);}
if(navigator.msSaveBlob){return navigator.msSaveBlob(blob,fileName);}
if(self.URL){saver(self.URL.createObjectURL(blob),true);}else{if(typeof blob==="string"||blob.constructor===toString){try{return saver(`data:${mimeType};base64,${self.btoa(blob)}`);}catch(y){return saver(`data:${mimeType},${encodeURIComponent(blob)}`);}}
reader=new FileReader();reader.onload=function(){saver(this.result);};reader.readAsDataURL(blob);}
return true;}
__exports.download=download;function download(options){return download._download(options);}
download._download=(options)=>{return new Promise((resolve,reject)=>{const xhr=new browser.XMLHttpRequest();let data;if(Object.prototype.hasOwnProperty.call(options,"form")){xhr.open(options.form.method,options.form.action);data=new FormData(options.form);}else{xhr.open("POST",options.url);data=new FormData();Object.entries(options.data).forEach((entry)=>{const[key,value]=entry;data.append(key,value);});}
data.append("token","dummy-because-api-expects-one");if(odoo.csrf_token){data.append("csrf_token",odoo.csrf_token);}
xhr.responseType="blob";xhr.onload=()=>{const mimetype=xhr.response.type;if(xhr.status===200&&mimetype!=="text/html"){const header=(xhr.getResponseHeader("Content-Disposition")||"").replace(/;$/,"");const filename=header?parse(header).parameters.filename:null;_download(xhr.response,filename,mimetype);return resolve(filename);}else if(xhr.status===502){reject(new ConnectionLostError());}else{const decoder=new FileReader();decoder.onload=()=>{const contents=decoder.result;const doc=new DOMParser().parseFromString(contents,"text/html");const nodes=doc.body.children.length===0?doc.body.childNodes:doc.body.children;let error;try{const node=nodes[1]||nodes[0];error=JSON.parse(node.textContent);}catch(e){error={message:"Arbitrary Uncaught Python Exception",data:{debug:`${xhr.status}`+`\n`+`${nodes.length > 0 ? nodes[0].textContent : ""}
                                    ${nodes.length > 1 ? nodes[1].textContent : ""}`},};}
error=makeErrorFromResponse(error);reject(error);};decoder.readAsText(xhr.response);}};xhr.onerror=()=>{reject(new ConnectionLostError());};xhr.send(data);});};return __exports;});;

/* /web/static/src/core/network/http_service.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/network/http_service',async function(require){'use strict';let __exports={};const{registry}=require("@web/core/registry");function checkResponseStatus(response){if(response.status===502){throw new Error("Failed to fetch");}}
const httpService=__exports.httpService={start(){return{async get(route,readMethod="json"){const response=await fetch(route,{method:"GET"});checkResponseStatus(response);return response[readMethod]();},async post(route,params={},readMethod="json"){const formData=new FormData();for(const key in params){const value=params[key];if(Array.isArray(value)&&value.length){for(const val of value){formData.append(key,val);}}else{formData.append(key,value);}}
const info={body:formData,method:"POST",};const response=await fetch(route,info);checkResponseStatus(response);return response[readMethod]();},};},};registry.category("services").add("http",httpService);return __exports;});;

/* /web/static/src/core/network/rpc_service.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/network/rpc_service',async function(require){'use strict';let __exports={};const{browser}=require("@web/core/browser/browser");const{registry}=require("@web/core/registry");const RPCError=__exports.RPCError=class RPCError extends Error{constructor(){super(...arguments);this.name="RPC_ERROR";this.type="server";this.code=null;this.data=null;this.exceptionName=null;this.subType=null;}}
const ConnectionLostError=__exports.ConnectionLostError=class ConnectionLostError extends Error{}
const ConnectionAbortedError=__exports.ConnectionAbortedError=class ConnectionAbortedError extends Error{}
__exports.makeErrorFromResponse=makeErrorFromResponse;function makeErrorFromResponse(reponse){const{code,data:errorData,message,type:subType}=reponse;const error=new RPCError();error.exceptionName=errorData.name;error.subType=subType;error.data=errorData;error.message=message;error.code=code;return error;}
__exports.jsonrpc=jsonrpc;function jsonrpc(env,rpcId,url,params,settings={}){const bus=env.bus;const XHR=browser.XMLHttpRequest;const data={id:rpcId,jsonrpc:"2.0",method:"call",params:params,};const request=settings.xhr||new XHR();let rejectFn;const promise=new Promise((resolve,reject)=>{rejectFn=reject;if(!settings.silent){bus.trigger("RPC:REQUEST",data.id);}
request.addEventListener("load",()=>{if(request.status===502){if(!settings.silent){bus.trigger("RPC:RESPONSE",data.id);}
reject(new ConnectionLostError());return;}
const{error:responseError,result:responseResult}=JSON.parse(request.response);if(!settings.silent){bus.trigger("RPC:RESPONSE",data.id);}
if(!responseError){return resolve(responseResult);}
const error=makeErrorFromResponse(responseError);reject(error);});request.addEventListener("error",()=>{if(!settings.silent){bus.trigger("RPC:RESPONSE",data.id);}
reject(new ConnectionLostError());});request.open("POST",url);request.setRequestHeader("Content-Type","application/json");request.send(JSON.stringify(data));});promise.abort=function(){if(request.abort){request.abort();}
rejectFn(new ConnectionAbortedError("XmlHttpRequestError abort"));};return promise;}
const rpcService=__exports.rpcService={async:true,start(env){let rpcId=0;return function rpc(route,params={},settings){return jsonrpc(env,rpcId++,route,params,settings);};},};registry.category("services").add("rpc",rpcService);return __exports;});;

/* /web/static/src/core/notifications/notification.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/notifications/notification',async function(require){'use strict';let __exports={};const{Component,hooks}=owl;const Notification=__exports.Notification=class Notification extends Component{setup(){if(this.props.onClose){hooks.onWillUnmount(()=>this.props.onClose());}}
shouldUpdate(){return false;}
get className(){let className;switch(this.props.type){case"danger":className="bg-danger";break;case"warning":className="bg-warning";break;case"success":className="bg-success";break;case"info":className="bg-info";break;}
return className?`${className} ${this.props.className}`:this.props.className;}}
Notification.template="web.NotificationWowl";Notification.props={message:{validate:(m)=>{return(typeof m==="string"||(typeof m==="object"&&typeof m.toString==="function"));}},title:{type:[String,Boolean,{toString:Function}],optional:true},type:{type:String,optional:true,validate:(t)=>["warning","danger","success","info"].includes(t)},messageIsHtml:{type:Boolean,optional:true},className:{type:String,optional:true},buttons:{type:Array,element:{type:Object,shape:{name:{type:String},icon:{type:String,optional:true},primary:{type:Boolean,optional:true},onClick:Function}}},onClose:{type:Function,optional:true}};Notification.defaultProps={buttons:[],className:"",messageIsHtml:false,type:"warning"};return __exports;});;

/* /web/static/src/core/notifications/notification_container.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/notifications/notification_container',async function(require){'use strict';let __exports={};const{Notification}=require("@web/core/notifications/notification");const{Component,tags}=owl;const NotificationContainer=__exports.NotificationContainer=class NotificationContainer extends Component{setup(){this.props.bus.on("UPDATE",this,this.render);}}
NotificationContainer.template=tags.xml`
    <div class="o_notification_manager">
        <t t-foreach="props.notifications" t-as="notification" t-key="notification.id">
            <Notification
                t-props="notification.props"
                t-transition="o_notification_fade"
                t-on-close="notification.close()"
            />
        </t>
    </div>`;NotificationContainer.components={Notification};return __exports;});;

/* /web/static/src/core/notifications/notification_service.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/notifications/notification_service',async function(require){'use strict';let __exports={};const{browser}=require("@web/core/browser/browser");const{registry}=require("@web/core/registry");const{NotificationContainer}=require("@web/core/notifications/notification_container");const{EventBus}=owl.core;const AUTOCLOSE_DELAY=4000;const notificationService=__exports.notificationService={start(){let notifId=0;let notifications=[];const bus=new EventBus();registry.category("main_components").add("NotificationContainer",{Component:NotificationContainer,props:{bus,notifications},});function add(message,options={}){const id=++notifId;const props=Object.assign({},options,{message});const sticky=props.sticky;delete props.sticky;const closeFn=()=>close(id);const notification={id,props,close:closeFn,};notifications.push(notification);bus.trigger("UPDATE");if(!sticky){browser.setTimeout(closeFn,AUTOCLOSE_DELAY);}
return closeFn;}
function close(id){const index=notifications.findIndex((n)=>n.id===id);if(index>-1){notifications.splice(index,1);bus.trigger("UPDATE");}}
return{add};},};registry.category("services").add("notification",notificationService);return __exports;});;

/* /web/static/src/core/orm_service.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/orm_service',async function(require){'use strict';let __exports={};const{registry}=require("@web/core/registry");function assignOptions(kwargs,options,whileList){for(let elem of whileList){if(elem in options){kwargs[elem]=options[elem];}}}
const Commands=__exports.Commands={create(virtualID,values){delete values.id;return[0,virtualID||false,values];},update(id,values){delete values.id;return[1,id,values];},delete(id){return[2,id,false];},forget(id){return[3,id,false];},linkTo(id){return[4,id,false];},deleteAll(){return[5,false,false];},replaceWith(ids){return[6,false,ids];},};function validateModel(value){if(typeof value!=="string"||value.length===0){throw new Error(`Invalid model name: ${value}`);}}
function validatePrimitiveList(name,type,value){if(!Array.isArray(value)||value.some((val)=>typeof val!==type)){throw new Error(`Invalid ${name} list: ${value}`);}}
function validateObject(name,obj){if(typeof obj!=="object"||obj===null||Array.isArray(obj)){throw new Error(`${name} should be an object`);}}
function validateArray(name,array){if(!Array.isArray(array)){throw new Error(`${name} should be an array`);}}
const ORM=__exports.ORM=class ORM{constructor(rpc,user){this.rpc=rpc;this.user=user;this._silent=false;}
get silent(){return Object.assign(Object.create(this),{_silent:true});}
call(model,method,args=[],kwargs={}){validateModel(model);let url=`/web/dataset/call_kw/${model}/${method}`;const fullContext=Object.assign({},this.user.context,kwargs.context||{});const fullKwargs=Object.assign({},kwargs,{context:fullContext});let params={model,method,args,kwargs:fullKwargs,};return this.rpc(url,params,{silent:this._silent});}
create(model,state,ctx){validateObject("state",state);return this.call(model,"create",[state],{context:ctx});}
read(model,ids,fields,ctx){validatePrimitiveList("ids","number",ids);if(fields){validatePrimitiveList("fields","string",fields);}
if(!ids.length){return Promise.resolve([]);}
return this.call(model,"read",[ids,fields],{context:ctx});}
readGroup(model,domain,fields,groupby,options={},ctx={}){validateArray("domain",domain);validatePrimitiveList("fields","string",fields);validatePrimitiveList("groupby","string",groupby);const kwargs={domain,groupby,fields,context:ctx,};assignOptions(kwargs,options,["lazy","offset","orderby","limit"]);return this.call(model,"read_group",[],kwargs);}
search(model,domain,options={},ctx={}){validateArray("domain",domain);const kwargs={context:ctx,};assignOptions(kwargs,options,["offset","limit","order"]);return this.call(model,"search",[domain],kwargs);}
searchRead(model,domain,fields,options={},ctx={}){validateArray("domain",domain);if(fields){validatePrimitiveList("fields","string",fields);}
const kwargs={context:ctx,domain,fields};assignOptions(kwargs,options,["offset","limit","order"]);return this.call(model,"search_read",[],kwargs);}
unlink(model,ids,ctx){validatePrimitiveList("ids","number",ids);if(!ids.length){return true;}
return this.call(model,"unlink",[ids],{context:ctx});}
webReadGroup(model,domain,fields,groupby,options={},ctx={}){validateArray("domain",domain);validatePrimitiveList("fields","string",fields);validatePrimitiveList("groupby","string",groupby);const kwargs={domain,groupby,fields,context:ctx,};assignOptions(kwargs,options,["lazy","offset","orderby","limit"]);return this.call(model,"web_read_group",[],kwargs);}
webSearchRead(model,domain,fields,options={},ctx={}){validateArray("domain",domain);validatePrimitiveList("fields","string",fields);const kwargs={context:ctx,domain,fields};assignOptions(kwargs,options,["offset","limit","order"]);return this.call(model,"web_search_read",[],kwargs);}
write(model,ids,data,ctx){validatePrimitiveList("ids","number",ids);validateObject("data",data);return this.call(model,"write",[ids,data],{context:ctx});}}
const ormService=__exports.ormService={dependencies:["rpc","user"],async:["call","create","read","readGroup","search","searchRead","unlink","web_search_read","write",],start(env,{rpc,user}){return new ORM(rpc,user);},};registry.category("services").add("orm",ormService);return __exports;});;

/* /web/static/src/core/popover/popover.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/popover/popover',async function(require){'use strict';let __exports={};const{usePosition}=require("@web/core/position/position_hook");const{Component}=owl;const Popover=__exports.Popover=class Popover extends Component{setup(){usePosition(this.props.target,{margin:16,position:this.props.position,});}}
Popover.template="web.PopoverWowl";Popover.defaultProps={position:"bottom",};Popover.props={popoverClass:{optional:true,type:String,},position:{type:String,validate:(p)=>["top","bottom","left","right"].includes(p),},target:HTMLElement,};return __exports;});;

/* /web/static/src/core/popover/popover_container.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/popover/popover_container',async function(require){'use strict';let __exports={};const{Popover}=require("@web/core/popover/popover");const{Component}=owl;const{useExternalListener,useState}=owl.hooks;const{xml}=owl.tags;class PopoverController extends Component{setup(){this.state=useState({displayed:false});this.targetObserver=new MutationObserver(this.onTargetMutate.bind(this));useExternalListener(window,"click",this.onClickAway,{capture:true});}
mounted(){this.targetObserver.observe(this.target.parentElement,{childList:true});}
willUnmount(){this.targetObserver.disconnect();}
shouldUpdate(){return false;}
get popoverProps(){return{target:this.target,position:this.props.position,popoverClass:this.props.popoverClass,};}
get target(){if(typeof this.props.target==="string"){return document.querySelector(this.props.target);}else{return this.props.target;}}
onClickAway(ev){if(this.target.contains(ev.target)||ev.target.closest(".o_popover")){return;}
if(this.props.closeOnClickAway){this.props.close();}}
onTargetMutate(){const target=this.target;if(!target||!target.parentElement){this.props.close();}}}
PopoverController.components={Popover};PopoverController.defaultProps={alwaysDisplayed:false,closeOnClickAway:true,};PopoverController.template=xml`
    <Popover t-props="popoverProps" t-on-popover-closed="props.close()">
        <t t-component="props.Component" t-props="props.props" />
    </Popover>
`;const PopoverContainer=__exports.PopoverContainer=class PopoverContainer extends Component{setup(){this.props.bus.on("UPDATE",this,this.render);}}
PopoverContainer.components={PopoverController};PopoverContainer.template=xml`
    <div class="o_popover_container">
        <t t-foreach="Object.values(props.popovers)" t-as="popover" t-key="popover.id">
            <PopoverController t-props="popover" />
        </t>
    </div>
`;return __exports;});;

/* /web/static/src/core/popover/popover_hook.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/popover/popover_hook',async function(require){'use strict';let __exports={};const{useService}=require("@web/core/utils/hooks");const{onWillUnmount,useComponent}=owl.hooks;__exports.usePopover=usePopover;function usePopover(){const removeFns=new Set();const service=useService("popover");const component=useComponent();onWillUnmount(function(){for(const removeFn of removeFns){removeFn();}
removeFns.clear();});return{add(target,Component,props,options={}){const newOptions=Object.create(options);newOptions.onClose=function(){removeFns.delete(removeFn);if(options.onClose&&component.__owl__.status!==5){options.onClose();}};const removeFn=service.add(target,Component,props,newOptions);removeFns.add(removeFn);return removeFn;},};}
return __exports;});;

/* /web/static/src/core/popover/popover_service.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/popover/popover_service',async function(require){'use strict';let __exports={};const{registry}=require("@web/core/registry");const{PopoverContainer}=require("@web/core/popover/popover_container");const{EventBus}=owl.core;const popoverService=__exports.popoverService={start(){let nextId=0;const popovers={};const bus=new EventBus();registry.category("main_components").add("PopoverContainer",{Component:PopoverContainer,props:{bus,popovers}});function add(target,Component,props,options={}){const id=++nextId;const closeFn=()=>close(id);const popover={id,target,Component,props,close:closeFn,onClose:options.onClose,position:options.position,popoverClass:options.popoverClass,closeOnClickAway:options.closeOnClickAway,};popovers[id]=popover;bus.trigger("UPDATE");return closeFn;}
function close(id){if(id in popovers){const popover=popovers[id];if(popover.onClose){popover.onClose();}
delete popovers[id];bus.trigger("UPDATE");}}
return{add};},};registry.category("services").add("popover",popoverService);return __exports;});;

/* /web/static/src/core/position/position_hook.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/position/position_hook',async function(require){'use strict';let __exports={};const{useEffect}=require("@web/core/utils/hooks");const{throttleForAnimation}=require("@web/core/utils/timing");const{onWillUnmount}=owl.hooks;const{hooks}=owl;const{useComponent,useExternalListener,useRef}=hooks;const POPPER_CLASS="o-popper-position";const DIRECTION_FLIP_ORDER={top:"tbrl",right:"rltb",bottom:"btrl",left:"lrbt"};const VARIANT_FLIP_ORDER={start:"sme",middle:"mse",end:"ems"};const DEFAULTS=__exports.DEFAULTS={margin:0,position:"bottom",};__exports.computePositioning=computePositioning;function computePositioning(reference,popper,options){const{container,margin,position}=options;const[directionKey,variantKey="middle"]=position.split("-");const directions=DIRECTION_FLIP_ORDER[directionKey];const variants=VARIANT_FLIP_ORDER[variantKey];const popBox=popper.getBoundingClientRect();const refBox=reference.getBoundingClientRect();const contBox=container.getBoundingClientRect();const containerIsHTMLNode=container===document.firstElementChild;const directionsData={t:refBox.top-popBox.height-margin,b:refBox.bottom+margin,r:refBox.right+margin,l:refBox.left-popBox.width-margin,};const variantsData={vs:refBox.left,vm:refBox.left+refBox.width/2+-popBox.width/2,ve:refBox.right-popBox.width,hs:refBox.top,hm:refBox.top+refBox.height/2+-popBox.height/2,he:refBox.bottom-popBox.height,};function get(d=directions[0],v=variants[0],containerRestricted=false){const vertical=["t","b"].includes(d);const variantPrefix=vertical?"v":"h";const directionValue=directionsData[d];const variantValue=variantsData[variantPrefix+v];if(containerRestricted){const[directionSize,variantSize]=vertical?[popBox.height+margin,popBox.width]:[popBox.width,popBox.height+margin];let[directionMin,directionMax]=vertical?[contBox.top,contBox.bottom]:[contBox.left,contBox.right];let[variantMin,variantMax]=vertical?[contBox.left,contBox.right]:[contBox.top,contBox.bottom];if(containerIsHTMLNode){if(vertical){directionMin+=container.scrollTop;directionMax+=container.scrollTop;}else{variantMin+=container.scrollTop;variantMax+=container.scrollTop;}}
const directionOverflow=directionValue<directionMin||directionValue+directionSize>directionMax;const variantOverflow=variantValue<variantMin||variantValue+variantSize>variantMax;if(directionOverflow||variantOverflow){return null;}}
const positioning=vertical?{top:directionValue,left:variantValue,}:{top:variantValue,left:directionValue,};return{...positioning,className:`${POPPER_CLASS}--${d}${v}`};}
return{directions,variants,get,};}
function reposition(reference,popper,options){options={container:document.documentElement,...DEFAULTS,...options,};for(const popperClass of popper.classList){if(popperClass.startsWith(POPPER_CLASS)){popper.classList.remove(popperClass);}}
popper.classList.add(POPPER_CLASS);const positioning=computePositioning(reference,popper,options);for(const d of positioning.directions){for(const v of positioning.variants){const posData=positioning.get(d,v,true);if(!posData){continue;}
const{className,top,left}=posData;popper.classList.add(className);popper.style.top=`${top}px`;popper.style.left=`${left}px`;return;}}
const{className,top,left}=positioning.get();popper.classList.add(className);popper.style.top=`${top}px`;popper.style.left=`${left}px`;}
__exports.usePosition=usePosition;function usePosition(reference,options){options={...DEFAULTS,...options};const{popper}=options;const popperRef=popper?useRef(popper):useComponent();const getReference=reference instanceof HTMLElement?()=>reference:reference;const update=()=>{const ref=getReference();if(popperRef.el&&ref){reposition(ref,popperRef.el,options);}};useEffect(update);const throttledUpdate=throttleForAnimation(update);useExternalListener(document,"scroll",throttledUpdate,{capture:true});useExternalListener(window,"resize",throttledUpdate);onWillUnmount(throttledUpdate.cancel);}
return __exports;});;

/* /web/static/src/core/py_js/py.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/py_js/py',async function(require){'use strict';let __exports={};const{evaluate}=require("@web/core/py_js/py_interpreter");const{parse}=require("@web/core/py_js/py_parser");const{tokenize}=require("@web/core/py_js/py_tokenizer");{const{evaluate}=require("@web/core/py_js/py_interpreter");Object.assign(__exports,{evaluate})};{const{parse}=require("@web/core/py_js/py_parser");Object.assign(__exports,{parse})};{const{tokenize}=require("@web/core/py_js/py_tokenizer");Object.assign(__exports,{tokenize})};{const{formatAST}=require("@web/core/py_js/py_utils");Object.assign(__exports,{formatAST})};__exports.parseExpr=parseExpr;function parseExpr(expr){const tokens=tokenize(expr);return parse(tokens);}
__exports.evaluateExpr=evaluateExpr;function evaluateExpr(expr,context={}){const ast=parseExpr(expr);return evaluate(ast,context);}
return __exports;});;

/* /web/static/src/core/py_js/py_builtin.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/py_js/py_builtin',async function(require){'use strict';let __exports={};const{PyDate,PyDateTime,PyRelativeDelta,PyTime,PyTimeDelta}=require("@web/core/py_js/py_date");const BUILTINS=__exports.BUILTINS={bool(value){switch(typeof value){case"number":return value!==0;case"string":return value!=="";case"boolean":return value;case"object":if(value===null){return false;}
if(value.isTrue){return value.isTrue();}
return true;}
return true;},time:{strftime(format){return PyDateTime.now().strftime(format);},},context_today(){return PyDate.today();},get current_date(){return this.today;},get today(){return PyDate.today().strftime("%Y-%m-%d");},get now(){return PyDateTime.now().strftime("%Y-%m-%d %H:%M:%S");},datetime:{time:PyTime,timedelta:PyTimeDelta,datetime:PyDateTime,date:PyDate,},relativedelta:PyRelativeDelta,};return __exports;});;

/* /web/static/src/core/py_js/py_date.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/py_js/py_date',async function(require){'use strict';let __exports={};const{parseArgs}=require("@web/core/py_js/py_utils");const AssertionError=__exports.AssertionError=class AssertionError extends Error{}
const ValueError=__exports.ValueError=class ValueError extends Error{}
const NotSupportedError=__exports.NotSupportedError=class NotSupportedError extends Error{}
function fmt2(n){return String(n).padStart(2,"0");}
function fmt4(n){return String(n).padStart(4,"0");}
function divmod(a,b,fn){let mod=a%b;if((mod>0&&b<0)||(mod<0&&b>0)){mod+=b;}
return fn(Math.floor(a/b),mod);}
function assert(bool,message="AssertionError"){if(!bool){throw new AssertionError(message);}}
const DAYS_IN_MONTH=[null,31,28,31,30,31,30,31,31,30,31,30,31];const DAYS_BEFORE_MONTH=[null];for(let dbm=0,i=1;i<DAYS_IN_MONTH.length;++i){DAYS_BEFORE_MONTH.push(dbm);dbm+=DAYS_IN_MONTH[i];}
function daysInMonth(year,month){if(month===2&&isLeap(year)){return 29;}
return DAYS_IN_MONTH[month];}
function isLeap(year){return year%4===0&&(year%100!==0||year%400===0);}
function daysBeforeYear(year){const y=year-1;return y*365+Math.floor(y/4)-Math.floor(y/100)+Math.floor(y/400);}
function daysBeforeMonth(year,month){const postLeapFeb=month>2&&isLeap(year);return DAYS_BEFORE_MONTH[month]+(postLeapFeb?1:0);}
function ymd2ord(year,month,day){const dim=daysInMonth(year,month);if(!(1<=day&&day<=dim)){throw new ValueError(`day must be in 1..${dim}`);}
return daysBeforeYear(year)+daysBeforeMonth(year,month)+day;}
const DI400Y=daysBeforeYear(401);const DI100Y=daysBeforeYear(101);const DI4Y=daysBeforeYear(5);function ord2ymd(n){--n;let n400,n100,n4,n1,n0;divmod(n,DI400Y,function(_n400,n){n400=_n400;divmod(n,DI100Y,function(_n100,n){n100=_n100;divmod(n,DI4Y,function(_n4,n){n4=_n4;divmod(n,365,function(_n1,n){n1=_n1;n0=n;});});});});n=n0;const year=n400*400+1+n100*100+n4*4+n1;if(n1==4||n100==100){assert(n0===0);return{year:year-1,month:12,day:31,};}
let leapyear=n1===3&&(n4!==24||n100==3);assert(leapyear==isLeap(year));let month=(n+50)>>5;let preceding=DAYS_BEFORE_MONTH[month]+(month>2&&leapyear?1:0);if(preceding>n){--month;preceding-=DAYS_IN_MONTH[month]+(month===2&&leapyear?1:0);}
n-=preceding;return{year:year,month:month,day:n+1,};}
function tmxxx(year,month,day,hour,minute,second,microsecond){hour=hour||0;minute=minute||0;second=second||0;microsecond=microsecond||0;if(microsecond<0||microsecond>999999){divmod(microsecond,1000000,function(carry,ms){microsecond=ms;second+=carry;});}
if(second<0||second>59){divmod(second,60,function(carry,s){second=s;minute+=carry;});}
if(minute<0||minute>59){divmod(minute,60,function(carry,m){minute=m;hour+=carry;});}
if(hour<0||hour>23){divmod(hour,24,function(carry,h){hour=h;day+=carry;});}
if(month<1||month>12){divmod(month-1,12,function(carry,m){month=m+1;year+=carry;});}
let dim=daysInMonth(year,month);if(day<1||day>dim){if(day===0){--month;if(month>0){day=daysInMonth(year,month);}else{--year;month=12;day=31;}}else if(day==dim+1){++month;day=1;if(month>12){month=1;++year;}}else{let r=ord2ymd(ymd2ord(year,month,1)+(day-1));year=r.year;month=r.month;day=r.day;}}
return{year:year,month:month,day:day,hour:hour,minute:minute,second:second,microsecond:microsecond,};}
const PyDate=__exports.PyDate=class PyDate{static today(){const now=new Date();const year=now.getUTCFullYear();const month=now.getUTCMonth()+1;const day=now.getUTCDate();return new PyDate(year,month,day);}
constructor(year,month,day){this.year=year;this.month=month;this.day=day;}
static create(...args){const{year,month,day}=parseArgs(args,["year","month","day"]);return new PyDate(year,month,day);}
add(timedelta){const s=tmxxx(this.year,this.month,this.day+timedelta.days);return new PyDate(s.year,s.month,s.day);}
isEqual(other){if(!(other instanceof PyDate)){return false;}
return this.year===other.year&&this.month===other.month&&this.day===other.day;}
strftime(format){return format.replace(/%([A-Za-z])/g,(m,c)=>{switch(c){case"Y":return fmt4(this.year);case"m":return fmt2(this.month);case"d":return fmt2(this.day);}
throw new ValueError(`No known conversion for ${m}`);});}
substract(other){if(other instanceof PyTimeDelta){return this.add(other.negate());}
if(other instanceof PyDate){return PyTimeDelta.create(this.toordinal()-other.toordinal());}
throw NotSupportedError();}
toJSON(){return this.strftime("%Y-%m-%d");}
toordinal(){return ymd2ord(this.year,this.month,this.day);}}
const PyDateTime=__exports.PyDateTime=class PyDateTime{static now(){const now=new Date();const year=now.getUTCFullYear();const month=now.getUTCMonth()+1;const day=now.getUTCDate();const hour=now.getUTCHours();const minute=now.getUTCMinutes();const second=now.getUTCSeconds();return new PyDateTime(year,month,day,hour,minute,second,0);}
static create(...args){const namedArgs=parseArgs(args,["year","month","day","hour","minute","second","microsecond",]);const year=namedArgs.year;const month=namedArgs.month;const day=namedArgs.day;const hour=namedArgs.hour||0;const minute=namedArgs.minute||0;const second=namedArgs.second||0;const ms=namedArgs.micro/1000||0;return new PyDateTime(year,month,day,hour,minute,second,ms);}
static combine(...args){const{date,time}=parseArgs(args,["date","time"]);return PyDateTime.create(date.year,date.month,date.day,time.hour,time.minute,time.second);}
constructor(year,month,day,hour,minute,second,microsecond){this.year=year;this.month=month;this.day=day;this.hour=hour;this.minute=minute;this.second=second;this.microsecond=microsecond;}
add(timedelta){const s=tmxxx(this.year,this.month,this.day+timedelta.days,this.hour,this.minute,this.second+timedelta.seconds,this.microsecond+timedelta.microseconds);return new PyDateTime(s.year,s.month,s.day,s.hour,s.minute,s.second,s.microsecond);}
isEqual(other){if(!(other instanceof PyDateTime)){return false;}
return(this.year===other.year&&this.month===other.month&&this.day===other.day&&this.hour===other.hour&&this.minute===other.minute&&this.second===other.second&&this.microsecond===other.microsecond);}
strftime(format){return format.replace(/%([A-Za-z])/g,(m,c)=>{switch(c){case"Y":return fmt4(this.year);case"m":return fmt2(this.month);case"d":return fmt2(this.day);case"H":return fmt2(this.hour);case"M":return fmt2(this.minute);case"S":return fmt2(this.second);}
throw new ValueError(`No known conversion for ${m}`);});}
substract(timedelta){return this.add(timedelta.negate());}
toJSON(){return this.strftime("%Y-%m-%d %H:%M:%S");}
to_utc(){const d=new Date(this.year,this.month,this.day,this.hour,this.minute,this.second);const timedelta=PyTimeDelta.create({minutes:d.getTimezoneOffset()});return this.add(timedelta);}}
const PyTime=__exports.PyTime=class PyTime extends PyDate{static create(...args){const namedArgs=parseArgs(args,["hour","minute","second"]);const hour=namedArgs.hour||0;const minute=namedArgs.minute||0;const second=namedArgs.second||0;return new PyTime(hour,minute,second);}
constructor(hour,minute,second){const now=new Date();const year=now.getFullYear();const month=now.getUTCMonth();const day=now.getUTCDate();super(year,month,day);this.hour=hour;this.minute=minute;this.second=second;}
strftime(format){return format.replace(/%([A-Za-z])/g,(m,c)=>{switch(c){case"Y":return fmt4(this.year);case"m":return fmt2(this.month+1);case"d":return fmt2(this.day);case"H":return fmt2(this.hour);case"M":return fmt2(this.minute);case"S":return fmt2(this.second);}
throw new ValueError(`No known conversion for ${m}`);});}
toJSON(){return this.strftime("%H:%M:%S");}}
const DAYS_IN_YEAR=[31,59,90,120,151,181,212,243,273,304,334,366];const TIME_PERIODS=["hour","minute","second"];const PERIODS=["year","month","day",...TIME_PERIODS];const RELATIVE_KEYS="years months weeks days hours minutes seconds microseconds leapdays".split(" ");const ABSOLUTE_KEYS="year month day hour minute second microsecond weekday nlyearday yearday".split(" ");const argsSpec=["dt1","dt2"];const PyRelativeDelta=__exports.PyRelativeDelta=class PyRelativeDelta{static create(...args){const params=parseArgs(args,argsSpec);if("dt1"in params){throw new Error("relativedelta(dt1, dt2) is not supported for now");}
for(const period of PERIODS){if(period in params){const val=params[period];assert(val>=0,`${period} ${val} is out of range`);}}
for(const key of RELATIVE_KEYS){params[key]=params[key]||0;}
for(const key of ABSOLUTE_KEYS){params[key]=key in params?params[key]:null;}
params.days+=7*params.weeks;let yearDay=0;if(params.nlyearday){yearDay=params.nlyearday;}else if(params.yearday){yearDay=params.yearday;if(yearDay>59){params.leapDays=-1;}}
if(yearDay){for(let monthIndex=0;monthIndex<DAYS_IN_YEAR.length;monthIndex++){if(yearDay<=DAYS_IN_YEAR[monthIndex]){params.month=monthIndex+1;if(monthIndex===0){params.day=yearDay;}else{params.day=yearDay-DAYS_IN_YEAR[monthIndex-1];}
break;}}}
return new PyRelativeDelta(params);}
static add(date,delta){if(!(date instanceof PyDate||date instanceof PyDateTime)){throw NotSupportedError();}
const s=tmxxx((delta.year||date.year)+delta.years,(delta.month||date.month)+delta.months,delta.day||date.day,delta.hour||date.hour||0,delta.minute||date.minute||0,delta.second||date.seconds||0,delta.microseconds||date.microseconds||0);const newDateTime=new PyDateTime(s.year,s.month,s.day,s.hour,s.minute,s.second,s.microsecond);let leapDays=0;if(delta.leapDays&&newDateTime.month>2&&isLeap(newDateTime.year)){leapDays=delta.leapDays;}
const temp=newDateTime.add(PyTimeDelta.create({days:delta.days+leapDays,hours:delta.hours,minutes:delta.minutes,seconds:delta.seconds,microseconds:delta.microseconds,}));const hasTime=Boolean(temp.hour||temp.minute||temp.second||temp.microsecond);const returnDate=!hasTime&&date instanceof PyDate?new PyDate(temp.year,temp.month,temp.day):temp;if(delta.weekday!==null){const wantedDow=delta.weekday+1;const _date=new Date(returnDate.year,returnDate.month-1,returnDate.day);const days=(7-_date.getDay()+wantedDow)%7;return returnDate.add(new PyTimeDelta(days,0,0));}
return returnDate;}
static substract(date,delta){return PyRelativeDelta.add(date,delta.negate());}
constructor(params={},sign=+1){this.years=sign*params.years;this.months=sign*params.months;this.days=sign*params.days;this.hours=sign*params.hours;this.minutes=sign*params.minutes;this.seconds=sign*params.seconds;this.microseconds=sign*params.microseconds;this.leapDays=params.leapDays;this.year=params.year;this.month=params.month;this.day=params.day;this.hour=params.hour;this.minute=params.minute;this.second=params.second;this.microsecond=params.microsecond;this.weekday=params.weekday;}
negate(){return new PyRelativeDelta(this,-1);}
isEqual(other){throw new NotSupportedError();}}
const TIME_DELTA_KEYS="weeks days hours minutes seconds milliseconds microseconds".split(" ");function modf(x){const mod=x%1;return[mod<0?mod+1:mod,Math.floor(x)];}
const PyTimeDelta=__exports.PyTimeDelta=class PyTimeDelta{static create(...args){const namedArgs=parseArgs(args,["days","seconds","microseconds"]);for(const key of TIME_DELTA_KEYS){namedArgs[key]=namedArgs[key]||0;}
let d=0;let s=0;let us=0;const days=namedArgs.days+namedArgs.weeks*7;let seconds=namedArgs.seconds+60*namedArgs.minutes+3600*namedArgs.hours;let microseconds=namedArgs.microseconds+1000*namedArgs.milliseconds;const[dFrac,dInt]=modf(days);d=dInt;let daysecondsfrac=0;if(dFrac){const[dsFrac,dsInt]=modf(dFrac*24*3600);s=dsInt;daysecondsfrac=dsFrac;}
const[sFrac,sInt]=modf(seconds);seconds=sInt;const secondsfrac=sFrac+daysecondsfrac;divmod(seconds,24*3600,(days,seconds)=>{d+=days;s+=seconds;});microseconds+=secondsfrac*1e6;divmod(microseconds,1000000,(seconds,microseconds)=>{divmod(seconds,24*3600,(days,seconds)=>{d+=days;s+=seconds;us+=Math.round(microseconds);});});return new PyTimeDelta(d,s,us);}
constructor(days,seconds,microseconds){this.days=days;this.seconds=seconds;this.microseconds=microseconds;}
add(other){return PyTimeDelta.create({days:this.days+other.days,seconds:this.seconds+other.seconds,microseconds:this.microseconds+other.microseconds,});}
divide(n){const us=(this.days*24*3600+this.seconds)*1e6+this.microseconds;return PyTimeDelta.create({microseconds:Math.floor(us/n)});}
isEqual(other){if(!(other instanceof PyTimeDelta)){return false;}
return(this.days===other.days&&this.seconds===other.seconds&&this.microseconds===other.microseconds);}
isTrue(){return this.days!==0||this.seconds!==0||this.microseconds!==0;}
multiply(n){return PyTimeDelta.create({days:n*this.days,seconds:n*this.seconds,microseconds:n*this.microseconds,});}
negate(){return PyTimeDelta.create({days:-this.days,seconds:-this.seconds,microseconds:-this.microseconds,});}
substract(other){return PyTimeDelta.create({days:this.days-other.days,seconds:this.seconds-other.seconds,microseconds:this.microseconds-other.microseconds,});}
total_seconds(){return this.days*86400+this.seconds+this.microseconds/1000000;}}
return __exports;});;

/* /web/static/src/core/py_js/py_interpreter.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/py_js/py_interpreter',async function(require){'use strict';let __exports={};const{BUILTINS}=require("@web/core/py_js/py_builtin");const{NotSupportedError,PyDate,PyDateTime,PyRelativeDelta,PyTime,PyTimeDelta,}=require("@web/core/py_js/py_date");const{parseArgs,PY_DICT,toPyDict}=require("@web/core/py_js/py_utils");const EvaluationError=__exports.EvaluationError=class EvaluationError extends Error{}
const isTrue=BUILTINS.bool;function applyUnaryOp(ast,context){const value=evaluate(ast.right,context);switch(ast.op){case"-":if(value instanceof Object&&value.negate){return value.negate();}
return-value;case"+":return value;case"not":return!isTrue(value);}
throw new EvaluationError(`Unknown unary operator: ${ast.op}`);}
function pytypeIndex(val){switch(typeof val){case"object":return val===null?1:Array.isArray(val)?5:3;case"number":return 2;case"string":return 4;}
throw new EvaluationError(`Unknown type: ${typeof val}`);}
function isConstructor(obj){return!!obj.prototype&&!!obj.prototype.constructor.name;}
function isLess(left,right){if(typeof left==="number"&&typeof right==="number"){return left<right;}
if(typeof left==="boolean"){left=left?1:0;}
if(typeof right==="boolean"){right=right?1:0;}
const leftIndex=pytypeIndex(left);const rightIndex=pytypeIndex(right);if(leftIndex===rightIndex){return left<right;}
return leftIndex<rightIndex;}
function isEqual(left,right){if(typeof left!==typeof right){if(typeof left==="boolean"&&typeof right==="number"){return right===(left?1:0);}
if(typeof left==="number"&&typeof right==="boolean"){return left===(right?1:0);}
return false;}
if(left instanceof Object&&left.isEqual){return left.isEqual(right);}
return left===right;}
function isIn(left,right){if(Array.isArray(right)){return right.includes(left);}
if(typeof right==="string"&&typeof left==="string"){return right.includes(left);}
return false;}
function applyBinaryOp(ast,context){const left=evaluate(ast.left,context);const right=evaluate(ast.right,context);switch(ast.op){case"+":{const relativeDeltaOnLeft=left instanceof PyRelativeDelta;const relativeDeltaOnRight=right instanceof PyRelativeDelta;if(relativeDeltaOnLeft||relativeDeltaOnRight){const date=relativeDeltaOnLeft?right:left;const delta=relativeDeltaOnLeft?left:right;return PyRelativeDelta.add(date,delta);}
const timeDeltaOnLeft=left instanceof PyTimeDelta;const timeDeltaOnRight=right instanceof PyTimeDelta;if(timeDeltaOnLeft&&timeDeltaOnRight){return left.add(right);}
if(timeDeltaOnLeft){if(right instanceof PyDate||right instanceof PyDateTime){return right.add(left);}else{throw NotSupportedError();}}
if(timeDeltaOnRight){if(left instanceof PyDate||left instanceof PyDateTime){return left.add(right);}else{throw NotSupportedError();}}
return left+right;}
case"-":{const isRightDelta=right instanceof PyRelativeDelta;if(isRightDelta){return PyRelativeDelta.substract(left,right);}
const timeDeltaOnRight=right instanceof PyTimeDelta;if(timeDeltaOnRight){if(left instanceof PyTimeDelta){return left.substract(right);}else if(left instanceof PyDate||left instanceof PyDateTime){return left.substract(right);}else{throw NotSupportedError();}}
if(left instanceof PyDate){return left.substract(right);}
return left-right;}
case"*":const timeDeltaOnLeft=left instanceof PyTimeDelta;const timeDeltaOnRight=right instanceof PyTimeDelta;if(timeDeltaOnLeft||timeDeltaOnRight){const number=timeDeltaOnLeft?right:left;const delta=timeDeltaOnLeft?left:right;return delta.multiply(number);}
return left*right;case"/":return left/right;case"%":return left%right;case"//":if(left instanceof PyTimeDelta){return left.divide(right);}
return Math.floor(left/right);case"**":return left**right;case"==":return isEqual(left,right);case"<>":case"!=":return!isEqual(left,right);case"<":return isLess(left,right);case">":return isLess(right,left);case">=":return isEqual(left,right)||isLess(right,left);case"<=":return isEqual(left,right)||isLess(left,right);case"in":return isIn(left,right);case"not in":return!isIn(left,right);}
throw new EvaluationError(`Unknown binary operator: ${ast.op}`);}
const DICT={get(dict){return(...args)=>{const{key,defValue}=parseArgs(args,["key","defValue"]);if(key in dict){return dict[key];}else if(defValue){return defValue;}
return null;};},};__exports.evaluate=evaluate;function evaluate(ast,context={}){const dicts=new Set();let pyContext;const evalContext=Object.create(context);Object.defineProperty(evalContext,"context",{get(){if(!pyContext){pyContext=toPyDict(context);}
return pyContext;},});function _evaluate(ast){switch(ast.type){case 0:case 1:return ast.value;case 5:if(ast.value in evalContext){return evalContext[ast.value];}else if(ast.value in BUILTINS){return BUILTINS[ast.value];}else{throw new EvaluationError(`Name '${ast.value}' is not defined`);}
case 3:return null;case 2:return ast.value;case 6:return applyUnaryOp(ast,evalContext);case 7:return applyBinaryOp(ast,evalContext);case 14:const left=_evaluate(ast.left);if(ast.op==="and"){return isTrue(left)?_evaluate(ast.right):left;}else{return isTrue(left)?left:_evaluate(ast.right);}
case 4:case 10:return ast.value.map(_evaluate);case 11:const dict={};for(let key in ast.value){dict[key]=_evaluate(ast.value[key]);}
dicts.add(dict);return dict;case 8:const fnValue=_evaluate(ast.fn);const args=ast.args.map(_evaluate);const kwargs={};for(let kwarg in ast.kwargs){kwargs[kwarg]=_evaluate(ast.kwargs[kwarg]);}
if(fnValue===PyDate||fnValue===PyDateTime||fnValue===PyTime||fnValue===PyRelativeDelta||fnValue===PyTimeDelta){return fnValue.create(...args,kwargs);}
return fnValue(...args,kwargs);case 12:{const dict=_evaluate(ast.target);const key=_evaluate(ast.key);return dict[key];}
case 13:{if(isTrue(_evaluate(ast.condition))){return _evaluate(ast.ifTrue);}else{return _evaluate(ast.ifFalse);}}
case 15:{const left=_evaluate(ast.obj);if(dicts.has(left)||Object.isPrototypeOf.call(PY_DICT,left)){return DICT[ast.key](left);}
const result=left[ast.key];if(typeof result==="function"&&!isConstructor(result)){return result.bind(left);}
return result;}}
throw new EvaluationError(`AST of type ${ast.type} cannot be evaluated`);}
return _evaluate(ast);}
return __exports;});;

/* /web/static/src/core/py_js/py_parser.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/py_js/py_parser',async function(require){'use strict';let __exports={};const{binaryOperators,comparators}=require("@web/core/py_js/py_tokenizer");const ParserError=__exports.ParserError=class ParserError extends Error{}
const chainedOperators=new Set(comparators);const infixOperators=new Set(binaryOperators.concat(comparators));__exports.bp=bp;function bp(symbol){switch(symbol){case"=":return 10;case"if":return 20;case"in":case"not in":case"is":case"is not":case"<":case"<=":case">":case">=":case"<>":case"==":case"!=":return 60;case"or":return 30;case"and":return 40;case"not":return 50;case"|":return 70;case"^":return 80;case"&":return 90;case"<<":case">>":return 100;case"+":case"-":return 110;case"*":case"/":case"//":case"%":return 120;case"**":return 140;case".":case"(":case"[":return 150;}
return 0;}
function bindingPower(token){return token.type===2?bp(token.value):0;}
function isSymbol(token,value){return token.type===2&&token.value===value;}
function parsePrefix(current,tokens){switch(current.type){case 0:return{type:0,value:current.value};case 1:return{type:1,value:current.value};case 4:if(current.value==="None"){return{type:3};}else{return{type:2,value:current.value==="True"};}
case 3:return{type:5,value:current.value};case 2:switch(current.value){case"-":case"+":case"~":return{type:6,op:current.value,right:_parse(tokens,130),};case"not":return{type:6,op:current.value,right:_parse(tokens,50),};case"(":const content=[];let isTuple=false;while(tokens[0]&&!isSymbol(tokens[0],")")){content.push(_parse(tokens,0));if(tokens[0]){if(tokens[0]&&isSymbol(tokens[0],",")){isTuple=true;tokens.shift();}else if(!isSymbol(tokens[0],")")){throw new ParserError("parsing error");}}else{throw new ParserError("parsing error");}}
if(!tokens[0]||!isSymbol(tokens[0],")")){throw new ParserError("parsing error");}
tokens.shift();isTuple=isTuple||content.length===0;return isTuple?{type:10,value:content}:content[0];case"[":const value=[];while(tokens[0]&&!isSymbol(tokens[0],"]")){value.push(_parse(tokens,0));if(tokens[0]){if(isSymbol(tokens[0],",")){tokens.shift();}else if(!isSymbol(tokens[0],"]")){throw new ParserError("parsing error");}}}
if(!tokens[0]||!isSymbol(tokens[0],"]")){throw new ParserError("parsing error");}
tokens.shift();return{type:4,value};case"{":{const dict={};while(tokens[0]&&!isSymbol(tokens[0],"}")){const key=_parse(tokens,0);if((key.type!==1&&key.type!==0)||!tokens[0]||!isSymbol(tokens[0],":")){throw new ParserError("parsing error");}
tokens.shift();const value=_parse(tokens,0);dict[key.value]=value;if(isSymbol(tokens[0],",")){tokens.shift();}}
if(!tokens.shift()){throw new ParserError("parsing error");}
return{type:11,value:dict};}}}
throw new ParserError("Token cannot be parsed");}
function parseInfix(left,current,tokens){switch(current.type){case 2:if(infixOperators.has(current.value)){let right=_parse(tokens,bindingPower(current));if(current.value==="and"||current.value==="or"){return{type:14,op:current.value,left,right,};}else if(current.value==="."){if(right.type===5){return{type:15,obj:left,key:right.value,};}else{throw new ParserError("invalid obj lookup");}}
let op={type:7,op:current.value,left,right,};while(chainedOperators.has(current.value)&&tokens[0]&&tokens[0].type===2&&chainedOperators.has(tokens[0].value)){const nextToken=tokens.shift();op={type:14,op:"and",left:op,right:{type:7,op:nextToken.value,left:right,right:_parse(tokens,bindingPower(nextToken)),},};right=op.right.right;}
return op;}
switch(current.value){case"(":const args=[];const kwargs={};while(tokens[0]&&!isSymbol(tokens[0],")")){const arg=_parse(tokens,0);if(arg.type===9){kwargs[arg.name.value]=arg.value;}else{args.push(arg);}
if(tokens[0]&&isSymbol(tokens[0],",")){tokens.shift();}}
if(!tokens[0]||!isSymbol(tokens[0],")")){throw new ParserError("parsing error");}
tokens.shift();return{type:8,fn:left,args,kwargs};case"=":if(left.type===5){return{type:9,name:left,value:_parse(tokens,10),};}
case"[":{const key=_parse(tokens);if(!tokens[0]||!isSymbol(tokens[0],"]")){throw new ParserError("parsing error");}
tokens.shift();return{type:12,target:left,key:key,};}
case"if":{const condition=_parse(tokens);if(!tokens[0]||!isSymbol(tokens[0],"else")){throw new ParserError("parsing error");}
tokens.shift();const ifFalse=_parse(tokens);return{type:13,condition,ifTrue:left,ifFalse,};}}}
throw new ParserError("Token cannot be parsed");}
function _parse(tokens,bp=0){const token=tokens.shift();let expr=parsePrefix(token,tokens);while(tokens[0]&&bindingPower(tokens[0])>bp){expr=parseInfix(expr,tokens.shift(),tokens);}
return expr;}
__exports.parse=parse;function parse(tokens){if(tokens.length){return _parse(tokens,0);}
throw new ParserError("Missing token");}
return __exports;});;

/* /web/static/src/core/py_js/py_tokenizer.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/py_js/py_tokenizer',async function(require){'use strict';let __exports={};const TokenizerError=__exports.TokenizerError=class TokenizerError extends Error{}
const directMap={"\\":"\\",'"':'"',"'":"'",a:"\x07",b:"\x08",f:"\x0c",n:"\n",r:"\r",t:"\t",v:"\v",};function decodeStringLiteral(str,unicode){let out=[];let code;for(var i=0;i<str.length;++i){if(str[i]!=="\\"){out.push(str[i]);continue;}
var escape=str[i+1];if(escape in directMap){out.push(directMap[escape]);++i;continue;}
switch(escape){case"\n":++i;continue;case"N":if(!unicode){break;}
throw new TokenizerError("SyntaxError: \\N{} escape not implemented");case"u":if(!unicode){break;}
var uni=str.slice(i+2,i+6);if(!/[0-9a-f]{4}/i.test(uni)){throw new TokenizerError(["SyntaxError: (unicode error) 'unicodeescape' codec"," can't decode bytes in position ",i,"-",i+4,": truncated \\uXXXX escape",].join(""));}
code=parseInt(uni,16);out.push(String.fromCharCode(code));i+=5;continue;case"U":if(!unicode){break;}
throw new TokenizerError("SyntaxError: \\U escape not implemented");case"x":var hex=str.slice(i+2,i+4);if(!/[0-9a-f]{2}/i.test(hex)){if(!unicode){throw new TokenizerError("ValueError: invalid \\x escape");}
throw new TokenizerError(["SyntaxError: (unicode error) 'unicodeescape'"," codec can't decode bytes in position ",i,"-",i+2,": truncated \\xXX escape",].join(""));}
code=parseInt(hex,16);out.push(String.fromCharCode(code));i+=3;continue;default:if(!/[0-8]/.test(escape)){break;}
var r=/[0-8]{1,3}/g;r.lastIndex=i+1;var m=r.exec(str);var oct=m[0];code=parseInt(oct,8);out.push(String.fromCharCode(code));i+=oct.length;continue;}
out.push("\\");}
return out.join("");}
const constants=new Set(["None","False","True"]);const comparators=__exports.comparators=["in","not","not in","is","is not","<","<=",">",">=","<>","!=","==",];const binaryOperators=__exports.binaryOperators=["or","and","|","^","&","<<",">>","+","-","*","/","//","%","~","**",".",];const unaryOperators=__exports.unaryOperators=["-"];const symbols=new Set([...["(",")","[","]","{","}",":",","],...["if","else","lambda","="],...comparators,...binaryOperators,...unaryOperators,]);function group(...args){return"("+args.join("|")+")";}
const Name="[a-zA-Z_]\\w*";const Whitespace="[ \\f\\t]*";const DecNumber="\\d+(L|l)?";const IntNumber=DecNumber;const PointFloat=group("\\d+\\.\\d*","\\.\\d+");const FloatNumber=PointFloat;const Number=group(FloatNumber,IntNumber);const Operator=group("\\*\\*=?",">>=?","<<=?","<>","!=","//=?","[+\\-*/%&|^=<>]=?","~");const Bracket="[\\[\\]\\(\\)\\{\\}]";const Special="[:;.,`@]";const Funny=group(Operator,Bracket,Special);const ContStr=group("([uU])?'([^\n'\\\\]*(?:\\\\.[^\n'\\\\]*)*)'",'([uU])?"([^\n"\\\\]*(?:\\\\.[^\n"\\\\]*)*)"');const PseudoToken=Whitespace+group(Number,Funny,ContStr,Name);const NumberPattern=new RegExp("^"+Number+"$");const StringPattern=new RegExp("^"+ContStr+"$");const NamePattern=new RegExp("^"+Name+"$");const strip=new RegExp("^"+Whitespace);__exports.tokenize=tokenize;function tokenize(str){const tokens=[];let max=str.length;let start=0;let end=0;const pseudoprog=new RegExp(PseudoToken,"g");while(pseudoprog.lastIndex<max){const pseudomatch=pseudoprog.exec(str);if(!pseudomatch){if(/^\s+$/.test(str.slice(end))){break;}
throw new TokenizerError("Failed to tokenize <<"+
str+">> at index "+
(end||0)+"; parsed so far: "+
tokens);}
if(pseudomatch.index>end){if(str.slice(end,pseudomatch.index).trim()){throw new TokenizerError("Invalid expression");}}
start=pseudomatch.index;end=pseudoprog.lastIndex;let token=str.slice(start,end).replace(strip,"");if(NumberPattern.test(token)){tokens.push({type:0,value:parseFloat(token),});}else if(StringPattern.test(token)){var m=StringPattern.exec(token);tokens.push({type:1,value:decodeStringLiteral(m[3]!==undefined?m[3]:m[5],!!(m[2]||m[4])),});}else if(symbols.has(token)){if(token==="in"&&tokens.length>0&&tokens[tokens.length-1].value==="not"){token="not in";tokens.pop();}else if(token==="not"&&tokens.length>0&&tokens[tokens.length-1].value==="is"){token="is not";tokens.pop();}
tokens.push({type:2,value:token,});}else if(constants.has(token)){tokens.push({type:4,value:token,});}else if(NamePattern.test(token)){tokens.push({type:3,value:token,});}else{throw new TokenizerError("Invalid expression");}}
return tokens;}
return __exports;});;

/* /web/static/src/core/py_js/py_utils.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/py_js/py_utils',async function(require){'use strict';let __exports={};const{bp}=require("@web/core/py_js/py_parser");__exports.parseArgs=parseArgs;function parseArgs(args,spec){const last=args[args.length-1];const unnamedArgs=typeof last==="object"?args.slice(0,-1):args;const kwargs=typeof last==="object"?last:{};for(let[index,val]of unnamedArgs.entries()){kwargs[spec[index]]=val;}
return kwargs;}
__exports.toPyValue=toPyValue;function toPyValue(value){switch(typeof value){case"string":return{type:1,value};case"number":return{type:0,value};case"boolean":return{type:2,value};case"object":if(Array.isArray(value)){return{type:4,value:value.map(toPyValue)};}else if(value===null){return{type:3};}else{const content={};for(let key in value){content[key]=toPyValue(value[key]);}
return{type:11,value:content};}
default:throw new Error("Invalid type");}}
__exports.formatAST=formatAST;function formatAST(ast,lbp=0){switch(ast.type){case 3:return"None";case 1:return JSON.stringify(ast.value);case 0:return String(ast.value);case 2:return ast.value?"True":"False";case 4:return`[${ast.value.map(formatAST).join(", ")}]`;case 6:if(ast.op==="not"){return`not `+formatAST(ast.right,50);}
return ast.op+formatAST(ast.right,130);case 7:{const abp=bp(ast.op);const str=`${formatAST(ast.left, abp)} ${ast.op} ${formatAST(ast.right, abp)}`;return abp<lbp?`(${str})`:str;}
case 11:{const pairs=[];for(let k in ast.value){pairs.push(`"${k}": ${formatAST(ast.value[k])}`);}
return`{`+pairs.join(", ")+`}`;}
case 10:return`(${ast.value.map(formatAST).join(", ")})`;case 5:return ast.value;case 12:{return`${formatAST(ast.target)}[${formatAST(ast.key)}]`;}
case 13:{const{ifTrue,condition,ifFalse}=ast;return`${formatAST(ifTrue)} if ${formatAST(condition)} else ${formatAST(ifFalse)}`;}
case 14:{const abp=bp(ast.op);const str=`${formatAST(ast.left, abp)} ${ast.op} ${formatAST(ast.right, abp)}`;return abp<lbp?`(${str})`:str;}
case 15:return`${formatAST(ast.obj, 150)}.${ast.key}`;case 8:{const args=ast.args.map(formatAST);const kwargs=[];for(let kwarg in ast.kwargs){kwargs.push(`${kwarg} = ${formatAST(ast.kwargs[kwarg])}`);}
const argStr=args.concat(kwargs).join(", ");return`${formatAST(ast.fn)}(${argStr})`;}}
throw new Error("invalid expression: "+ast);}
const PY_DICT=__exports.PY_DICT=Object.create(null);__exports.toPyDict=toPyDict;function toPyDict(obj){const result=Object.create(PY_DICT);return Object.assign(result,obj);}
return __exports;});;

/* /web/static/src/core/registry.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/registry',async function(require){'use strict';let __exports={};const{core}=owl;const{EventBus}=core;const KeyNotFoundError=__exports.KeyNotFoundError=class KeyNotFoundError extends Error{}
const DuplicatedKeyError=__exports.DuplicatedKeyError=class DuplicatedKeyError extends Error{}
const Registry=__exports.Registry=class Registry extends EventBus{constructor(){super();this.content={};this.subRegistries={};this.elements=null;this.entries=null;this.on("UPDATE",this,()=>{this.elements=null;this.entries=null;});}
add(key,value,{force,sequence}={}){if(!force&&key in this.content){throw new DuplicatedKeyError(`Cannot add '${key}' in this registry: it already exists`);}
let previousSequence;if(force){const elem=this.content[key];previousSequence=elem&&elem[0];}
sequence=sequence===undefined?previousSequence||50:sequence;this.content[key]=[sequence,value];const payload={operation:"add",key,value};this.trigger("UPDATE",payload);return this;}
get(key,defaultValue){if(arguments.length<2&&!(key in this.content)){throw new KeyNotFoundError(`Cannot find ${key} in this registry!`);}
const info=this.content[key];return info?info[1]:defaultValue;}
contains(key){return key in this.content;}
getAll(){if(!this.elements){const content=Object.values(this.content).sort((el1,el2)=>el1[0]-el2[0]);this.elements=content.map((elem)=>elem[1]);}
return this.elements.slice();}
getEntries(){if(!this.entries){const entries=Object.entries(this.content).sort((el1,el2)=>el1[1][0]-el2[1][0]);this.entries=entries.map(([str,elem])=>[str,elem[1]]);}
return this.entries.slice();}
remove(key){const value=this.content[key];delete this.content[key];const payload={operation:"delete",key,value};this.trigger("UPDATE",payload);}
category(subcategory){if(!(subcategory in this.subRegistries)){this.subRegistries[subcategory]=new Registry();}
return this.subRegistries[subcategory];}}
const registry=__exports.registry=new Registry();return __exports;});;

/* /web/static/src/core/scroller_service.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/scroller_service',async function(require){'use strict';let __exports={};const{browser}=require("@web/core/browser/browser");const{registry}=require("@web/core/registry");const{scrollTo}=require("@web/core/utils/scrolling");const scrollerService=__exports.scrollerService={start(env){browser.addEventListener("click",(ev)=>{const link=ev.target.closest("a");if(!link){return;}
const disableAnchor=link.attributes.getNamedItem("disable_anchor");if(disableAnchor&&disableAnchor.value==="true"){return;}
const href=link.attributes.getNamedItem("href");if(href){if(href.value[0]==="#"){if(href.value.length===1){ev.preventDefault();return;}
let matchingEl=null;try{matchingEl=document.querySelector(`.o_content #${href.value.substr(1)}`);}catch(e){}
const triggerEv=new CustomEvent("anchor-link-clicked",{detail:{element:matchingEl,id:href.value,originalEv:ev,},});env.bus.trigger("SCROLLER:ANCHOR_LINK_CLICKED",triggerEv);if(matchingEl&&!triggerEv.defaultPrevented){ev.preventDefault();scrollTo(matchingEl,{isAnchor:true});}}}});},};registry.category("services").add("scroller",scrollerService);return __exports;});;

/* /web/static/src/core/tooltip/tooltip.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/tooltip/tooltip',async function(require){'use strict';let __exports={};const{Component}=owl;const Tooltip=__exports.Tooltip=class Tooltip extends Component{}
Tooltip.template="web.Tooltip";Tooltip.props={tooltip:{type:String,optional:true},template:{type:String,optional:true},info:{optional:true},};return __exports;});;

/* /web/static/src/core/tooltip/tooltip_hook.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/tooltip/tooltip_hook',async function(require){'use strict';let __exports={};const{browser}=require("@web/core/browser/browser");const{useEffect,useListener}=require("@web/core/utils/hooks");const{usePopover}=require("@web/core/popover/popover_hook");const{Tooltip}=require("@web/core/tooltip/tooltip");const OPEN_DELAY=400;const CLOSE_DELAY=200;__exports.useTooltip=useTooltip;function useTooltip(){const popover=usePopover();let openTooltipTimeout;let closeTooltip;let target=null;function cleanup(){browser.clearTimeout(openTooltipTimeout);if(closeTooltip){closeTooltip();}}
function onMouseEnter(ev){const dataset=ev.target.dataset;const tooltip=dataset.tooltip;let template,info;if("tooltipTemplate"in dataset){template=dataset.tooltipTemplate;info=dataset.tooltipInfo?JSON.parse(dataset.tooltipInfo):null;}
if(tooltip||template){cleanup();target=ev.target;openTooltipTimeout=browser.setTimeout(()=>{const position=dataset.tooltipPosition;closeTooltip=popover.add(target,Tooltip,{tooltip,template,info},{position});},OPEN_DELAY);}}
let positionX;let positionY;useListener("mousemove",(ev)=>{positionX=ev.x;positionY=ev.y;});useEffect(()=>{const interval=browser.setInterval(()=>{if(!target){return;}
if(!document.body.contains(target)){return cleanup();}
const targetRect=target.getBoundingClientRect();if(positionX<targetRect.left||positionX>targetRect.right||positionY<targetRect.top||positionY>targetRect.bottom){return cleanup();}},CLOSE_DELAY);return()=>browser.clearInterval(interval);},()=>[]);const selector="[data-tooltip], [data-tooltip-template]";useListener("mouseenter",selector,onMouseEnter,{capture:true});}
return __exports;});;

/* /web/static/src/core/ui/block_ui.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/ui/block_ui',async function(require){'use strict';let __exports={};const{browser}=require("@web/core/browser/browser");const{Component,tags,useState}=owl;const BlockUI=__exports.BlockUI=class BlockUI extends Component{setup(){this.messagesByDuration=[{time:20,l1:this.env._t("Loading...")},{time:40,l1:this.env._t("Still loading...")},{time:60,l1:this.env._t("Still loading..."),l2:this.env._t("Please be patient."),},{time:180,l1:this.env._t("Don't leave yet,"),l2:this.env._t("it's still loading..."),},{time:120,l1:this.env._t("You may not believe it,"),l2:this.env._t("but the application is actually loading..."),},{time:3180,l1:this.env._t("Take a minute to get a coffee,"),l2:this.env._t("because it's loading..."),},{time:null,l1:this.env._t("Maybe you should consider reloading the application by pressing F5..."),},];this.state=useState({blockUI:false,line1:"",line2:"",});this.props.bus.on("BLOCK",this,this.block);this.props.bus.on("UNBLOCK",this,this.unblock);}
replaceMessage(index){const message=this.messagesByDuration[index];this.state.line1=message.l1;this.state.line2=message.l2||"";if(message.time!==null){this.msgTimer=browser.setTimeout(()=>{this.replaceMessage(index+1);},message.time*1000);}}
block(){this.state.blockUI=true;this.replaceMessage(0);}
unblock(){this.state.blockUI=false;clearTimeout(this.msgTimer);this.state.line1="";this.state.line2="";}}
BlockUI.template=tags.xml`
    <div t-att-class="state.blockUI ? 'o_blockUI' : ''">
      <t t-if="state.blockUI">
        <div class="o_spinner">
            <img src="/web/static/img/spin.png" alt="Loading..."/>
        </div>
        <div class="o_message">
            <t t-raw="state.line1"/> <br/>
            <t t-raw="state.line2"/>
        </div>
      </t>
    </div>`;return __exports;});;

/* /web/static/src/core/ui/ui_service.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/ui/ui_service',async function(require){'use strict';let __exports={};const{useEffect,useService}=require("@web/core/utils/hooks");const{registry}=require("@web/core/registry");const{debounce}=require("@web/core/utils/timing");const{BlockUI}=require("@web/core/ui/block_ui");const{browser}=require("@web/core/browser/browser");const{Component,core,hooks}=owl;const{EventBus}=core;const{useRef}=hooks;const SIZES=__exports.SIZES={XS:0,VSM:1,SM:2,MD:3,LG:4,XL:5,XXL:6};__exports.useActiveElement=useActiveElement;function useActiveElement(refName=null){const uiService=useService("ui");const owner=refName?useRef(refName):Component.current;useEffect(()=>{uiService.activateElement(owner.el);return()=>uiService.deactivateElement(owner.el);},()=>[]);}
const uiService=__exports.uiService={start(env){let ui={};const bus=new EventBus();registry.category("main_components").add("BlockUI",{Component:BlockUI,props:{bus}});let blockCount=0;function block(){blockCount++;if(blockCount===1){bus.trigger("BLOCK");}}
function unblock(){blockCount--;if(blockCount<0){console.warn("Unblock ui was called more times than block, you should only unblock the UI if you have previously blocked it.");blockCount=0;}
if(blockCount===0){bus.trigger("UNBLOCK");}}
Object.assign(ui,{bus,block,unblock,});Object.defineProperty(ui,"isBlocked",{get(){return blockCount>0;},});let activeElems=[document];function activateElement(el){activeElems.push(el);bus.trigger("active-element-changed",el);}
function deactivateElement(el){activeElems=activeElems.filter((x)=>x!==el);bus.trigger("active-element-changed",ui.activeElement);}
function getActiveElementOf(el){for(const activeElement of[...activeElems].reverse()){if(activeElement.contains(el)){return activeElement;}}}
Object.assign(ui,{activateElement,deactivateElement,getActiveElementOf,});Object.defineProperty(ui,"activeElement",{get(){return activeElems[activeElems.length-1];},});const MEDIAS=[window.matchMedia("(max-width: 474px)"),window.matchMedia("(min-width: 475px) and (max-width: 575px)"),window.matchMedia("(min-width: 576px) and (max-width: 767px)"),window.matchMedia("(min-width: 768px) and (max-width: 991px)"),window.matchMedia("(min-width: 992px) and (max-width: 1199px)"),window.matchMedia("(min-width: 1200px) and (max-width: 1533px)"),window.matchMedia("(min-width: 1534px)"),];function getSize(){return MEDIAS.findIndex((media)=>media.matches);}
function updateSize(){ui.size=getSize();}
browser.addEventListener("resize",debounce(updateSize,100));Object.assign(ui,{size:getSize(),});Object.defineProperty(ui,"isSmall",{get(){return ui.size<=SIZES.SM;},});Object.defineProperty(env,"isSmall",{get(){return ui.size<=SIZES.SM;},});return ui;},};registry.category("services").add("ui",uiService);return __exports;});;

/* /web/static/src/core/user_service.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/user_service',async function(require){'use strict';let __exports={};const{registry}=require("@web/core/registry");const{session}=require("@web/session");const userService=__exports.userService={dependencies:["rpc"],async:["hasGroup"],start(env,{rpc}){const groupProms={};const context={...session.user_context,uid:session.uid,};return{get context(){return Object.assign({},context);},removeFromContext(key){delete context[key];},updateContext(update){Object.assign(context,update);},hasGroup(group){if(!context.uid){return Promise.resolve(false);}
if(!groupProms[group]){groupProms[group]=rpc("/web/dataset/call_kw/res.users/has_group",{model:"res.users",method:"has_group",args:[group],kwargs:{context},});}
return groupProms[group];},name:session.name,userName:session.username,isAdmin:session.is_admin,isSystem:session.is_system,partnerId:session.partner_id,home_action_id:session.home_action_id,showEffect:session.show_effect,get userId(){return context.uid;},get lang(){return context.lang;},get tz(){return context.tz;},get db(){const res={name:session.db,};if("dbuuid"in session){res.uuid=session.dbuuid;}
return res;},};},};registry.category("services").add("user",userService);return __exports;});;

/* /web/static/src/core/utils/arrays.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/utils/arrays',async function(require){'use strict';let __exports={};function _cartesian(){const args=Array.prototype.slice.call(arguments);if(args.length===0){return[undefined];}
const firstArray=args[0].map(function(elem){return[elem];});if(args.length===1){return firstArray;}
const productOfOtherArrays=_cartesian.apply(null,args.slice(1));return firstArray.reduce(function(acc,elem){return acc.concat(productOfOtherArrays.map(function(tuple){return elem.concat(tuple);}));},[]);}
function _getExtractorFrom(criterion){if(criterion){switch(typeof criterion){case"string":return(element)=>element[criterion];case"function":return criterion;default:throw new Error(`Expected criterion of type 'string' or 'function' and got '${typeof criterion}'`);}}else{return(element)=>element;}}
__exports.groupBy=groupBy;function groupBy(array,criterion){const extract=_getExtractorFrom(criterion);const groups={};for(const element of array){const group=String(extract(element));if(!(group in groups)){groups[group]=[];}
groups[group].push(element);}
return groups;}
__exports.sortBy=sortBy;function sortBy(array,criterion,order="asc"){const extract=_getExtractorFrom(criterion);return array.slice().sort((elA,elB)=>{const a=extract(elA);const b=extract(elB);let result;if(isNaN(a)&&isNaN(b)){result=a>b?1:a<b?-1:0;}else{result=a-b;}
return order==="asc"?result:-result;});}
__exports.symmetricalDifference=symmetricalDifference;function symmetricalDifference(arrayA,arrayB){return arrayA.filter((id)=>!arrayB.includes(id)).concat(arrayB.filter((id)=>!arrayA.includes(id)));}
__exports.cartesian=cartesian;function cartesian(){const args=Array.prototype.slice.call(arguments);if(args.length===0){return[undefined];}else if(args.length===1){return args[0];}else{return _cartesian.apply(null,args);}}
__exports.sections=sections;function sections(array){const sections=[];for(let i=0;i<array.length+1;i++){sections.push(array.slice(0,i));}
return sections;}
return __exports;});;

/* /web/static/src/core/utils/components.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/utils/components',async function(require){'use strict';let __exports={};const{Component,tags}=owl;const NotUpdatable=__exports.NotUpdatable=class NotUpdatable extends Component{shouldUpdate(){return false;}}
NotUpdatable.template=tags.xml`<t t-slot="default" />`;const ErrorHandler=__exports.ErrorHandler=class ErrorHandler extends Component{catchError(error){if(this.props.onError){this.props.onError(error);}}}
ErrorHandler.template=tags.xml`<t t-slot="default" />`;return __exports;});;

/* /web/static/src/core/utils/concurrency.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/utils/concurrency',async function(require){'use strict';let __exports={};const KeepLast=__exports.KeepLast=class KeepLast{constructor(){this._id=0;}
add(promise){this._id++;const currentId=this._id;return new Promise((resolve,reject)=>{promise.then((value)=>{if(this._id===currentId){resolve(value);}}).catch((reason)=>{if(this._id===currentId){reject(reason);}});});}}
const Mutex=__exports.Mutex=class Mutex{constructor(){this._lock=Promise.resolve();this._queueSize=0;this._unlockedProm=undefined;this._unlock=undefined;}
async exec(action){const currentLock=this._lock;let result;this._queueSize++;this._unlockedProm=this._unlockedProm||new Promise((resolve)=>{this._unlock=resolve;});this._lock=new Promise((unlockCurrent)=>{currentLock.then(()=>{result=action();const always=(returnedResult)=>{unlockCurrent();this._queueSize--;if(this._queueSize===0){this._unlockedProm=undefined;this._unlock();}
return returnedResult;};Promise.resolve(result).then(always).guardedCatch(always);});});await this._lock;return result;}
getUnlockedDef(){return this._unlockedProm||Promise.resolve();}}
const Race=__exports.Race=class Race{constructor(){this.currentProm=null;this.currentPromResolver=null;}
add(promise){if(!this.currentProm){this.currentProm=new Promise((resolve)=>{this.currentPromResolver=(value)=>{this.currentProm=null;this.currentPromResolver=null;resolve(value);};});}
promise.then(this.currentPromResolver);return this.currentProm;}
getCurrentProm(){return this.currentProm;}}
return __exports;});;

/* /web/static/src/core/utils/functions.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/utils/functions',async function(require){'use strict';let __exports={};__exports.memoize=memoize;function memoize(func){const cache=new Map();const funcName=func.name?func.name+" (memoized)":"memoized";return{[funcName](...args){if(!cache.has(args[0])){cache.set(args[0],func(...args));}
return cache.get(...args);},}[funcName];}
return __exports;});;

/* /web/static/src/core/utils/hooks.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/utils/hooks',async function(require){'use strict';let __exports={};const{SERVICES_METADATA}=require("@web/env");const{onMounted,onWillPatch,onPatched,onWillUnmount,useComponent}=owl.hooks;__exports.useAutofocus=useAutofocus;function useAutofocus(params={}){const comp=useComponent();if(comp.env.isSmall){return()=>{};}
const selector=params.selector||"[autofocus]";let forceFocusCount=0;useEffect(function autofocus(){const target=comp.el.querySelector(selector);if(target){target.focus();if(["INPUT","TEXTAREA"].includes(target.tagName)){const inputEl=target;inputEl.selectionStart=inputEl.selectionEnd=inputEl.value.length;}}},()=>[forceFocusCount]);return function focusOnUpdate(){forceFocusCount++;};}
__exports.useBus=useBus;function useBus(bus,eventName,callback){const component=useComponent();useEffect(()=>{bus.on(eventName,component,callback);return()=>bus.off(eventName,component);},()=>[]);}
const NO_OP=()=>{};__exports.useEffect=useEffect;function useEffect(effect,computeDependencies=()=>[NaN]){let cleanup,dependencies;onMounted(()=>{dependencies=computeDependencies();cleanup=effect(...dependencies)||NO_OP;});let shouldReapplyOnPatch=false;onWillPatch(()=>{const newDeps=computeDependencies();shouldReapplyOnPatch=newDeps.some((val,i)=>val!==dependencies[i]);if(shouldReapplyOnPatch){cleanup();dependencies=newDeps;}});onPatched(()=>{if(shouldReapplyOnPatch){cleanup=effect(...dependencies)||NO_OP;}});onWillUnmount(()=>cleanup());}
__exports.useListener=useListener;function useListener(eventName,querySelector,handler,options={}){if(typeof arguments[1]!=="string"){querySelector=null;handler=arguments[1];options=arguments[2]||{};}
if(typeof handler!=="function"){throw new Error("The handler must be a function");}
const comp=useComponent();let boundHandler;if(querySelector){boundHandler=function(ev){let el=ev.target;let target;while(el&&!target){if(el.matches(querySelector)){target=el;}else if(el===comp.el){el=null;}else{el=el.parentElement;}}
if(el){handler.call(comp,ev);}};}else{boundHandler=handler.bind(comp);}
useEffect(()=>{comp.el.addEventListener(eventName,boundHandler,options);return()=>{comp.el.removeEventListener(eventName,boundHandler,options);};},()=>[]);}
function _protectMethod(component,caller,fn){return async(...args)=>{if(component.__owl__.status===5){throw new Error("Component is destroyed");}
const result=await fn.call(caller,...args);return component.__owl__.status===5?new Promise(()=>{}):result;};}
__exports.useService=useService;function useService(serviceName){const component=useComponent();const{services}=component.env;if(!(serviceName in services)){throw new Error(`Service ${serviceName} is not available`);}
const service=services[serviceName];if(serviceName in SERVICES_METADATA){if(service instanceof Function){return _protectMethod(component,null,service);}else{const methods=SERVICES_METADATA[serviceName];const result=Object.create(service);for(let method of methods){result[method]=_protectMethod(component,service,service[method]);}
return result;}}
return service;}
__exports.onDestroyed=onDestroyed;function onDestroyed(callback){const component=useComponent();const _destroy=component.__destroy;component.__destroy=(...args)=>{_destroy.call(component,...args);callback();};}
return __exports;});;

/* /web/static/src/core/utils/numbers.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/utils/numbers',async function(require){'use strict';let __exports={};__exports.computeVariation=computeVariation;function computeVariation(value,comparisonValue){if(isNaN(value)||isNaN(comparisonValue)){return NaN;}
if(comparisonValue===0){if(value===0){return 0;}else if(value>0){return 1;}else{return-1;}}
return(value-comparisonValue)/Math.abs(comparisonValue);}
return __exports;});;

/* /web/static/src/core/utils/objects.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/utils/objects',async function(require){'use strict';let __exports={};__exports.shallowEqual=shallowEqual;function shallowEqual(obj1,obj2){const obj1Keys=Object.keys(obj1);return(obj1Keys.length===Object.keys(obj2).length&&obj1Keys.every((key)=>obj1[key]===obj2[key]));}
__exports.deepCopy=deepCopy;function deepCopy(obj){return JSON.parse(JSON.stringify(obj));}
return __exports;});;

/* /web/static/src/core/utils/patch.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/utils/patch',async function(require){'use strict';let __exports={};const patchMap=new WeakMap();__exports.patch=patch;function patch(obj,patchName,patchValue,options={}){const pure=Boolean(options.pure);if(!patchMap.has(obj)){patchMap.set(obj,{original:{},patches:[],});}
const objDesc=patchMap.get(obj);if(objDesc.patches.some((p)=>p.name===patchName)){throw new Error(`Class ${obj.name} already has a patch ${patchName}`);}
objDesc.patches.push({name:patchName,patch:patchValue,pure,});for(const k in patchValue){let prevDesc=null;let proto=obj;do{prevDesc=Object.getOwnPropertyDescriptor(proto,k);proto=Object.getPrototypeOf(proto);}while(!prevDesc&&proto);const newDesc=Object.getOwnPropertyDescriptor(patchValue,k);if(!objDesc.original.hasOwnProperty(k)){objDesc.original[k]=Object.getOwnPropertyDescriptor(obj,k);}
if(prevDesc){const patchedFnName=`${k} (patch ${patchName})`;if(prevDesc.value&&typeof newDesc.value==="function"){makeIntermediateFunction("value",prevDesc,newDesc,patchedFnName);}
if((newDesc.get||newDesc.set)&&(prevDesc.get||prevDesc.set)){newDesc.get=newDesc.get||prevDesc.get;newDesc.set=newDesc.set||prevDesc.set;if(prevDesc.get&&typeof newDesc.get==="function"){makeIntermediateFunction("get",prevDesc,newDesc,patchedFnName);}
if(prevDesc.set&&typeof newDesc.set==="function"){makeIntermediateFunction("set",prevDesc,newDesc,patchedFnName);}}}
Object.defineProperty(obj,k,newDesc);}
function makeIntermediateFunction(key,prevDesc,newDesc,patchedFnName){const _superFn=prevDesc[key];const patchFn=newDesc[key];if(pure){newDesc[key]=patchFn;}else{newDesc[key]={[patchedFnName](...args){let prevSuper;if(this){prevSuper=this._super;Object.defineProperty(this,"_super",{value:_superFn.bind(this),configurable:true,writable:true,});}
const result=patchFn.call(this,...args);if(this){Object.defineProperty(this,"_super",{value:prevSuper,configurable:true,writable:true,});}
return result;},}[patchedFnName];}}}
__exports.unpatch=unpatch;function unpatch(obj,patchName){const objDesc=patchMap.get(obj);if(!objDesc.patches.some((p)=>p.name===patchName)){throw new Error(`Class ${obj.name} does not have any patch ${patchName}`);}
patchMap.delete(obj);for(const k in objDesc.original){if(objDesc.original[k]===undefined){delete obj[k];}else{Object.defineProperty(obj,k,objDesc.original[k]);}}
for(const patchDesc of objDesc.patches){if(patchDesc.name!==patchName){patch(obj,patchDesc.name,patchDesc.patch,{pure:patchDesc.pure});}}}
return __exports;});;

/* /web/static/src/core/utils/scrolling.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/utils/scrolling',async function(require){'use strict';let __exports={};__exports.scrollTo=scrollTo;function scrollTo(element,options={scrollable:null,isAnchor:false}){function _getScrollParent(node){if(node==null){return null;}
if(node.scrollHeight>node.clientHeight&&node.clientHeight>0){return node;}else{return _getScrollParent(node.parentNode);}}
const scrollable=options.scrollable?options.scrollable:_getScrollParent(element.parentNode);if(scrollable){const scrollBottom=scrollable.getBoundingClientRect().bottom;const scrollTop=scrollable.getBoundingClientRect().top;const elementBottom=element.getBoundingClientRect().bottom;const elementTop=element.getBoundingClientRect().top;if(elementBottom>scrollBottom&&!options.isAnchor){scrollable.scrollTop+=elementTop-scrollBottom+Math.ceil(element.getBoundingClientRect().height);}else if(elementTop<scrollTop||options.isAnchor){scrollable.scrollTop-=scrollTop-elementTop;if(options.isAnchor){const parentScrollable=_getScrollParent(scrollable.parentNode);if(parentScrollable){scrollTo(scrollable,{isAnchor:true,scrollable:parentScrollable});}}}}}
function getScrollableElement(component){if(component.env.isSmall){return document.firstElementChild;}else{return component.el.querySelector(".o_action_manager .o_content");}}
__exports.getScrollPosition=getScrollPosition;function getScrollPosition(component){const scrollingEl=getScrollableElement(component);return{left:scrollingEl?scrollingEl.scrollLeft:0,top:scrollingEl?scrollingEl.scrollTop:0,};}
__exports.setScrollPosition=setScrollPosition;function setScrollPosition(component,offset){const scrollingEl=getScrollableElement(component);if(scrollingEl){scrollingEl.scrollLeft=offset.left||0;scrollingEl.scrollTop=offset.top||0;}}
return __exports;});;

/* /web/static/src/core/utils/search.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/utils/search',async function(require){'use strict';let __exports={};const{unaccent}=require("@web/core/utils/strings");function match(pattern,str){let totalScore=0;let currentScore=0;let len=str.length;let patternIndex=0;pattern=unaccent(pattern,false);str=unaccent(str,false);for(let i=0;i<len;i++){if(str[i]===pattern[patternIndex]){patternIndex++;currentScore+=100+currentScore-i/200;}else{currentScore=0;}
totalScore=totalScore+currentScore;}
return patternIndex===pattern.length?totalScore:0;}
__exports.fuzzyLookup=fuzzyLookup;function fuzzyLookup(pattern,list,fn){const results=[];list.forEach((data)=>{const score=match(pattern,fn(data));if(score>0){results.push({score,elem:data});}});results.sort((a,b)=>b.score-a.score);return results.map((r)=>r.elem);}
__exports.fuzzyTest=fuzzyTest;function fuzzyTest(pattern,string){return match(pattern,string)!==0;}
return __exports;});;

/* /web/static/src/core/utils/strings.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/utils/strings',async function(require){'use strict';let __exports={};__exports.escapeRegExp=escapeRegExp;function escapeRegExp(str){return str.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");}
__exports.intersperse=intersperse;function intersperse(str,indices,separator=""){separator=separator||"";const result=[];let last=str.length;for(let i=0;i<indices.length;++i){let section=indices[i];if(section===-1||last<=0){break;}else if(section===0&&i===0){break;}else if(section===0){section=indices[--i];}
result.push(str.substring(last-section,last));last-=section;}
const s=str.substring(0,last);if(s){result.push(s);}
return result.reverse().join(separator);}
__exports.sprintf=sprintf;function sprintf(s,...values){if(values.length===1&&Object.prototype.toString.call(values[0])==="[object Object]"){const valuesDict=values[0];s=s.replace(/\%\(?([^\)]+)\)s/g,(match,value)=>valuesDict[value]);}else if(values.length>0){s=s.replace(/\%s/g,()=>values.shift());}
return s;}
__exports.capitalize=capitalize;function capitalize(s){return s?s[0].toUpperCase()+s.slice(1):"";}
const diacriticsMap={'\u0041':'A','\u24B6':'A','\uFF21':'A','\u00C0':'A','\u00C1':'A','\u00C2':'A','\u1EA6':'A','\u1EA4':'A','\u1EAA':'A','\u1EA8':'A','\u00C3':'A','\u0100':'A','\u0102':'A','\u1EB0':'A','\u1EAE':'A','\u1EB4':'A','\u1EB2':'A','\u0226':'A','\u01E0':'A','\u00C4':'A','\u01DE':'A','\u1EA2':'A','\u00C5':'A','\u01FA':'A','\u01CD':'A','\u0200':'A','\u0202':'A','\u1EA0':'A','\u1EAC':'A','\u1EB6':'A','\u1E00':'A','\u0104':'A','\u023A':'A','\u2C6F':'A','\uA732':'AA','\u00C6':'AE','\u01FC':'AE','\u01E2':'AE','\uA734':'AO','\uA736':'AU','\uA738':'AV','\uA73A':'AV','\uA73C':'AY','\u0042':'B','\u24B7':'B','\uFF22':'B','\u1E02':'B','\u1E04':'B','\u1E06':'B','\u0243':'B','\u0182':'B','\u0181':'B','\u0043':'C','\u24B8':'C','\uFF23':'C','\u0106':'C','\u0108':'C','\u010A':'C','\u010C':'C','\u00C7':'C','\u1E08':'C','\u0187':'C','\u023B':'C','\uA73E':'C','\u0044':'D','\u24B9':'D','\uFF24':'D','\u1E0A':'D','\u010E':'D','\u1E0C':'D','\u1E10':'D','\u1E12':'D','\u1E0E':'D','\u0110':'D','\u018B':'D','\u018A':'D','\u0189':'D','\uA779':'D','\u01F1':'DZ','\u01C4':'DZ','\u01F2':'Dz','\u01C5':'Dz','\u0045':'E','\u24BA':'E','\uFF25':'E','\u00C8':'E','\u00C9':'E','\u00CA':'E','\u1EC0':'E','\u1EBE':'E','\u1EC4':'E','\u1EC2':'E','\u1EBC':'E','\u0112':'E','\u1E14':'E','\u1E16':'E','\u0114':'E','\u0116':'E','\u00CB':'E','\u1EBA':'E','\u011A':'E','\u0204':'E','\u0206':'E','\u1EB8':'E','\u1EC6':'E','\u0228':'E','\u1E1C':'E','\u0118':'E','\u1E18':'E','\u1E1A':'E','\u0190':'E','\u018E':'E','\u0046':'F','\u24BB':'F','\uFF26':'F','\u1E1E':'F','\u0191':'F','\uA77B':'F','\u0047':'G','\u24BC':'G','\uFF27':'G','\u01F4':'G','\u011C':'G','\u1E20':'G','\u011E':'G','\u0120':'G','\u01E6':'G','\u0122':'G','\u01E4':'G','\u0193':'G','\uA7A0':'G','\uA77D':'G','\uA77E':'G','\u0048':'H','\u24BD':'H','\uFF28':'H','\u0124':'H','\u1E22':'H','\u1E26':'H','\u021E':'H','\u1E24':'H','\u1E28':'H','\u1E2A':'H','\u0126':'H','\u2C67':'H','\u2C75':'H','\uA78D':'H','\u0049':'I','\u24BE':'I','\uFF29':'I','\u00CC':'I','\u00CD':'I','\u00CE':'I','\u0128':'I','\u012A':'I','\u012C':'I','\u0130':'I','\u00CF':'I','\u1E2E':'I','\u1EC8':'I','\u01CF':'I','\u0208':'I','\u020A':'I','\u1ECA':'I','\u012E':'I','\u1E2C':'I','\u0197':'I','\u004A':'J','\u24BF':'J','\uFF2A':'J','\u0134':'J','\u0248':'J','\u004B':'K','\u24C0':'K','\uFF2B':'K','\u1E30':'K','\u01E8':'K','\u1E32':'K','\u0136':'K','\u1E34':'K','\u0198':'K','\u2C69':'K','\uA740':'K','\uA742':'K','\uA744':'K','\uA7A2':'K','\u004C':'L','\u24C1':'L','\uFF2C':'L','\u013F':'L','\u0139':'L','\u013D':'L','\u1E36':'L','\u1E38':'L','\u013B':'L','\u1E3C':'L','\u1E3A':'L','\u0141':'L','\u023D':'L','\u2C62':'L','\u2C60':'L','\uA748':'L','\uA746':'L','\uA780':'L','\u01C7':'LJ','\u01C8':'Lj','\u004D':'M','\u24C2':'M','\uFF2D':'M','\u1E3E':'M','\u1E40':'M','\u1E42':'M','\u2C6E':'M','\u019C':'M','\u004E':'N','\u24C3':'N','\uFF2E':'N','\u01F8':'N','\u0143':'N','\u00D1':'N','\u1E44':'N','\u0147':'N','\u1E46':'N','\u0145':'N','\u1E4A':'N','\u1E48':'N','\u0220':'N','\u019D':'N','\uA790':'N','\uA7A4':'N','\u01CA':'NJ','\u01CB':'Nj','\u004F':'O','\u24C4':'O','\uFF2F':'O','\u00D2':'O','\u00D3':'O','\u00D4':'O','\u1ED2':'O','\u1ED0':'O','\u1ED6':'O','\u1ED4':'O','\u00D5':'O','\u1E4C':'O','\u022C':'O','\u1E4E':'O','\u014C':'O','\u1E50':'O','\u1E52':'O','\u014E':'O','\u022E':'O','\u0230':'O','\u00D6':'O','\u022A':'O','\u1ECE':'O','\u0150':'O','\u01D1':'O','\u020C':'O','\u020E':'O','\u01A0':'O','\u1EDC':'O','\u1EDA':'O','\u1EE0':'O','\u1EDE':'O','\u1EE2':'O','\u1ECC':'O','\u1ED8':'O','\u01EA':'O','\u01EC':'O','\u00D8':'O','\u01FE':'O','\u0186':'O','\u019F':'O','\uA74A':'O','\uA74C':'O','\u01A2':'OI','\uA74E':'OO','\u0222':'OU','\u0050':'P','\u24C5':'P','\uFF30':'P','\u1E54':'P','\u1E56':'P','\u01A4':'P','\u2C63':'P','\uA750':'P','\uA752':'P','\uA754':'P','\u0051':'Q','\u24C6':'Q','\uFF31':'Q','\uA756':'Q','\uA758':'Q','\u024A':'Q','\u0052':'R','\u24C7':'R','\uFF32':'R','\u0154':'R','\u1E58':'R','\u0158':'R','\u0210':'R','\u0212':'R','\u1E5A':'R','\u1E5C':'R','\u0156':'R','\u1E5E':'R','\u024C':'R','\u2C64':'R','\uA75A':'R','\uA7A6':'R','\uA782':'R','\u0053':'S','\u24C8':'S','\uFF33':'S','\u1E9E':'S','\u015A':'S','\u1E64':'S','\u015C':'S','\u1E60':'S','\u0160':'S','\u1E66':'S','\u1E62':'S','\u1E68':'S','\u0218':'S','\u015E':'S','\u2C7E':'S','\uA7A8':'S','\uA784':'S','\u0054':'T','\u24C9':'T','\uFF34':'T','\u1E6A':'T','\u0164':'T','\u1E6C':'T','\u021A':'T','\u0162':'T','\u1E70':'T','\u1E6E':'T','\u0166':'T','\u01AC':'T','\u01AE':'T','\u023E':'T','\uA786':'T','\uA728':'TZ','\u0055':'U','\u24CA':'U','\uFF35':'U','\u00D9':'U','\u00DA':'U','\u00DB':'U','\u0168':'U','\u1E78':'U','\u016A':'U','\u1E7A':'U','\u016C':'U','\u00DC':'U','\u01DB':'U','\u01D7':'U','\u01D5':'U','\u01D9':'U','\u1EE6':'U','\u016E':'U','\u0170':'U','\u01D3':'U','\u0214':'U','\u0216':'U','\u01AF':'U','\u1EEA':'U','\u1EE8':'U','\u1EEE':'U','\u1EEC':'U','\u1EF0':'U','\u1EE4':'U','\u1E72':'U','\u0172':'U','\u1E76':'U','\u1E74':'U','\u0244':'U','\u0056':'V','\u24CB':'V','\uFF36':'V','\u1E7C':'V','\u1E7E':'V','\u01B2':'V','\uA75E':'V','\u0245':'V','\uA760':'VY','\u0057':'W','\u24CC':'W','\uFF37':'W','\u1E80':'W','\u1E82':'W','\u0174':'W','\u1E86':'W','\u1E84':'W','\u1E88':'W','\u2C72':'W','\u0058':'X','\u24CD':'X','\uFF38':'X','\u1E8A':'X','\u1E8C':'X','\u0059':'Y','\u24CE':'Y','\uFF39':'Y','\u1EF2':'Y','\u00DD':'Y','\u0176':'Y','\u1EF8':'Y','\u0232':'Y','\u1E8E':'Y','\u0178':'Y','\u1EF6':'Y','\u1EF4':'Y','\u01B3':'Y','\u024E':'Y','\u1EFE':'Y','\u005A':'Z','\u24CF':'Z','\uFF3A':'Z','\u0179':'Z','\u1E90':'Z','\u017B':'Z','\u017D':'Z','\u1E92':'Z','\u1E94':'Z','\u01B5':'Z','\u0224':'Z','\u2C7F':'Z','\u2C6B':'Z','\uA762':'Z','\u0061':'a','\u24D0':'a','\uFF41':'a','\u1E9A':'a','\u00E0':'a','\u00E1':'a','\u00E2':'a','\u1EA7':'a','\u1EA5':'a','\u1EAB':'a','\u1EA9':'a','\u00E3':'a','\u0101':'a','\u0103':'a','\u1EB1':'a','\u1EAF':'a','\u1EB5':'a','\u1EB3':'a','\u0227':'a','\u01E1':'a','\u00E4':'a','\u01DF':'a','\u1EA3':'a','\u00E5':'a','\u01FB':'a','\u01CE':'a','\u0201':'a','\u0203':'a','\u1EA1':'a','\u1EAD':'a','\u1EB7':'a','\u1E01':'a','\u0105':'a','\u2C65':'a','\u0250':'a','\uA733':'aa','\u00E6':'ae','\u01FD':'ae','\u01E3':'ae','\uA735':'ao','\uA737':'au','\uA739':'av','\uA73B':'av','\uA73D':'ay','\u0062':'b','\u24D1':'b','\uFF42':'b','\u1E03':'b','\u1E05':'b','\u1E07':'b','\u0180':'b','\u0183':'b','\u0253':'b','\u0063':'c','\u24D2':'c','\uFF43':'c','\u0107':'c','\u0109':'c','\u010B':'c','\u010D':'c','\u00E7':'c','\u1E09':'c','\u0188':'c','\u023C':'c','\uA73F':'c','\u2184':'c','\u0064':'d','\u24D3':'d','\uFF44':'d','\u1E0B':'d','\u010F':'d','\u1E0D':'d','\u1E11':'d','\u1E13':'d','\u1E0F':'d','\u0111':'d','\u018C':'d','\u0256':'d','\u0257':'d','\uA77A':'d','\u01F3':'dz','\u01C6':'dz','\u0065':'e','\u24D4':'e','\uFF45':'e','\u00E8':'e','\u00E9':'e','\u00EA':'e','\u1EC1':'e','\u1EBF':'e','\u1EC5':'e','\u1EC3':'e','\u1EBD':'e','\u0113':'e','\u1E15':'e','\u1E17':'e','\u0115':'e','\u0117':'e','\u00EB':'e','\u1EBB':'e','\u011B':'e','\u0205':'e','\u0207':'e','\u1EB9':'e','\u1EC7':'e','\u0229':'e','\u1E1D':'e','\u0119':'e','\u1E19':'e','\u1E1B':'e','\u0247':'e','\u025B':'e','\u01DD':'e','\u0066':'f','\u24D5':'f','\uFF46':'f','\u1E1F':'f','\u0192':'f','\uA77C':'f','\u0067':'g','\u24D6':'g','\uFF47':'g','\u01F5':'g','\u011D':'g','\u1E21':'g','\u011F':'g','\u0121':'g','\u01E7':'g','\u0123':'g','\u01E5':'g','\u0260':'g','\uA7A1':'g','\u1D79':'g','\uA77F':'g','\u0068':'h','\u24D7':'h','\uFF48':'h','\u0125':'h','\u1E23':'h','\u1E27':'h','\u021F':'h','\u1E25':'h','\u1E29':'h','\u1E2B':'h','\u1E96':'h','\u0127':'h','\u2C68':'h','\u2C76':'h','\u0265':'h','\u0195':'hv','\u0069':'i','\u24D8':'i','\uFF49':'i','\u00EC':'i','\u00ED':'i','\u00EE':'i','\u0129':'i','\u012B':'i','\u012D':'i','\u00EF':'i','\u1E2F':'i','\u1EC9':'i','\u01D0':'i','\u0209':'i','\u020B':'i','\u1ECB':'i','\u012F':'i','\u1E2D':'i','\u0268':'i','\u0131':'i','\u006A':'j','\u24D9':'j','\uFF4A':'j','\u0135':'j','\u01F0':'j','\u0249':'j','\u006B':'k','\u24DA':'k','\uFF4B':'k','\u1E31':'k','\u01E9':'k','\u1E33':'k','\u0137':'k','\u1E35':'k','\u0199':'k','\u2C6A':'k','\uA741':'k','\uA743':'k','\uA745':'k','\uA7A3':'k','\u006C':'l','\u24DB':'l','\uFF4C':'l','\u0140':'l','\u013A':'l','\u013E':'l','\u1E37':'l','\u1E39':'l','\u013C':'l','\u1E3D':'l','\u1E3B':'l','\u017F':'l','\u0142':'l','\u019A':'l','\u026B':'l','\u2C61':'l','\uA749':'l','\uA781':'l','\uA747':'l','\u01C9':'lj','\u006D':'m','\u24DC':'m','\uFF4D':'m','\u1E3F':'m','\u1E41':'m','\u1E43':'m','\u0271':'m','\u026F':'m','\u006E':'n','\u24DD':'n','\uFF4E':'n','\u01F9':'n','\u0144':'n','\u00F1':'n','\u1E45':'n','\u0148':'n','\u1E47':'n','\u0146':'n','\u1E4B':'n','\u1E49':'n','\u019E':'n','\u0272':'n','\u0149':'n','\uA791':'n','\uA7A5':'n','\u01CC':'nj','\u006F':'o','\u24DE':'o','\uFF4F':'o','\u00F2':'o','\u00F3':'o','\u00F4':'o','\u1ED3':'o','\u1ED1':'o','\u1ED7':'o','\u1ED5':'o','\u00F5':'o','\u1E4D':'o','\u022D':'o','\u1E4F':'o','\u014D':'o','\u1E51':'o','\u1E53':'o','\u014F':'o','\u022F':'o','\u0231':'o','\u00F6':'o','\u022B':'o','\u1ECF':'o','\u0151':'o','\u01D2':'o','\u020D':'o','\u020F':'o','\u01A1':'o','\u1EDD':'o','\u1EDB':'o','\u1EE1':'o','\u1EDF':'o','\u1EE3':'o','\u1ECD':'o','\u1ED9':'o','\u01EB':'o','\u01ED':'o','\u00F8':'o','\u01FF':'o','\u0254':'o','\uA74B':'o','\uA74D':'o','\u0275':'o','\u01A3':'oi','\u0223':'ou','\uA74F':'oo','\u0070':'p','\u24DF':'p','\uFF50':'p','\u1E55':'p','\u1E57':'p','\u01A5':'p','\u1D7D':'p','\uA751':'p','\uA753':'p','\uA755':'p','\u0071':'q','\u24E0':'q','\uFF51':'q','\u024B':'q','\uA757':'q','\uA759':'q','\u0072':'r','\u24E1':'r','\uFF52':'r','\u0155':'r','\u1E59':'r','\u0159':'r','\u0211':'r','\u0213':'r','\u1E5B':'r','\u1E5D':'r','\u0157':'r','\u1E5F':'r','\u024D':'r','\u027D':'r','\uA75B':'r','\uA7A7':'r','\uA783':'r','\u0073':'s','\u24E2':'s','\uFF53':'s','\u00DF':'s','\u015B':'s','\u1E65':'s','\u015D':'s','\u1E61':'s','\u0161':'s','\u1E67':'s','\u1E63':'s','\u1E69':'s','\u0219':'s','\u015F':'s','\u023F':'s','\uA7A9':'s','\uA785':'s','\u1E9B':'s','\u0074':'t','\u24E3':'t','\uFF54':'t','\u1E6B':'t','\u1E97':'t','\u0165':'t','\u1E6D':'t','\u021B':'t','\u0163':'t','\u1E71':'t','\u1E6F':'t','\u0167':'t','\u01AD':'t','\u0288':'t','\u2C66':'t','\uA787':'t','\uA729':'tz','\u0075':'u','\u24E4':'u','\uFF55':'u','\u00F9':'u','\u00FA':'u','\u00FB':'u','\u0169':'u','\u1E79':'u','\u016B':'u','\u1E7B':'u','\u016D':'u','\u00FC':'u','\u01DC':'u','\u01D8':'u','\u01D6':'u','\u01DA':'u','\u1EE7':'u','\u016F':'u','\u0171':'u','\u01D4':'u','\u0215':'u','\u0217':'u','\u01B0':'u','\u1EEB':'u','\u1EE9':'u','\u1EEF':'u','\u1EED':'u','\u1EF1':'u','\u1EE5':'u','\u1E73':'u','\u0173':'u','\u1E77':'u','\u1E75':'u','\u0289':'u','\u0076':'v','\u24E5':'v','\uFF56':'v','\u1E7D':'v','\u1E7F':'v','\u028B':'v','\uA75F':'v','\u028C':'v','\uA761':'vy','\u0077':'w','\u24E6':'w','\uFF57':'w','\u1E81':'w','\u1E83':'w','\u0175':'w','\u1E87':'w','\u1E85':'w','\u1E98':'w','\u1E89':'w','\u2C73':'w','\u0078':'x','\u24E7':'x','\uFF58':'x','\u1E8B':'x','\u1E8D':'x','\u0079':'y','\u24E8':'y','\uFF59':'y','\u1EF3':'y','\u00FD':'y','\u0177':'y','\u1EF9':'y','\u0233':'y','\u1E8F':'y','\u00FF':'y','\u1EF7':'y','\u1E99':'y','\u1EF5':'y','\u01B4':'y','\u024F':'y','\u1EFF':'y','\u007A':'z','\u24E9':'z','\uFF5A':'z','\u017A':'z','\u1E91':'z','\u017C':'z','\u017E':'z','\u1E93':'z','\u1E95':'z','\u01B6':'z','\u0225':'z','\u0240':'z','\u2C6C':'z','\uA763':'z',};__exports.unaccent=unaccent;function unaccent(str,caseSensitive){str=str.replace(/[^\u0000-\u007E]/g,function(accented){return diacriticsMap[accented]||accented;});return caseSensitive?str:str.toLowerCase();}
return __exports;});;

/* /web/static/src/core/utils/timing.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/utils/timing',async function(require){'use strict';let __exports={};const{browser}=require("@web/core/browser/browser");__exports.throttleForAnimation=throttleForAnimation;function throttleForAnimation(func){let handle=null;const funcName=func.name?`${func.name} (throttleForAnimation)`:"throttleForAnimation";return Object.assign({[funcName](...args){browser.cancelAnimationFrame(handle);handle=browser.requestAnimationFrame(()=>{handle=null;func.call(this,...args);});},}[funcName],{cancel(){browser.cancelAnimationFrame(handle);},});}
__exports.debounce=debounce;function debounce(func,wait,immediate=false){let timeout;const funcName=func.name?func.name+" (debounce)":"debounce";return Object.assign({[funcName](...args){return new Promise((resolve)=>{const callNow=immediate&&!timeout;browser.clearTimeout(timeout);timeout=browser.setTimeout(()=>{timeout=null;if(!immediate){Promise.resolve(func.apply(this,args)).then(resolve);}},wait);if(callNow){Promise.resolve(func.apply(this,args)).then(resolve);}});},}[funcName],{cancel(){browser.clearTimeout(timeout);},});}
__exports.throttle=throttle;function throttle(func,wait){let waiting=false;const funcName=func.name?func.name+" (throttle)":"throttle";return{[funcName](...args){const context=this;if(!waiting){waiting=true;browser.setTimeout(function(){waiting=false;func.call(context,...args);},wait);}},}[funcName];}
return __exports;});;

/* /web/static/src/core/utils/ui.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/utils/ui',async function(require){'use strict';let __exports={};__exports.getVisibleElements=getVisibleElements;function getVisibleElements(activeElement,selector){const visibleElements=[];for(const el of activeElement.querySelectorAll(selector)){const isVisible=el.offsetWidth>0&&el.offsetHeight>0;if(isVisible){visibleElements.push(el);}}
return visibleElements;}
return __exports;});;

/* /web/static/src/core/utils/urls.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/utils/urls',async function(require){'use strict';let __exports={};const{browser}=require("@web/core/browser/browser");__exports.objectToUrlEncodedString=objectToUrlEncodedString;function objectToUrlEncodedString(obj){return Object.entries(obj).map(([k,v])=>(v?`${k}=${encodeURIComponent(v)}`:k)).join("&");}
__exports.getOrigin=getOrigin;function getOrigin(origin){if(origin){origin=origin.replace(/\/+$/,"");}else{const{host,protocol}=browser.location;origin=`${protocol}//${host}`;}
return origin;}
__exports.url=url;function url(route,queryParams,options={}){const origin=getOrigin(options.origin);if(!route){return origin;}
let queryString=objectToUrlEncodedString(queryParams||{});queryString=queryString.length>0?`?${queryString}`:queryString;let prefix=["http://","https://","//"].some((el)=>route.length>=el.length&&route.slice(0,el.length)===el);prefix=prefix?"":origin;return`${prefix}${route}${queryString}`;}
return __exports;});;

/* /web/static/src/core/utils/xml.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/core/utils/xml',async function(require){'use strict';let __exports={};function hasParsingError(parsedDocument){return parsedDocument.getElementsByTagName("parsererror").length>0;}
const XMLParser=__exports.XMLParser=class XMLParser{parse(){}
visitXML(xml,callback){function visit(xml){if(xml){let didVisitChildren=false;const visitChildren=()=>{for(let child of xml.children){visit(child);}
didVisitChildren=true;};const shouldVisitChildren=callback(xml,visitChildren);if(shouldVisitChildren!==false&&!didVisitChildren){visitChildren();}}}
const xmlDoc=typeof xml==="string"?this.parseXML(xml):xml;visit(xmlDoc);}
parseXML(arch){const parser=new DOMParser();const xml=parser.parseFromString(arch,"text/xml");if(hasParsingError(xml)){throw new Error(`An error occured while parsing ${arch}: ${xml.getElementsByTagName("parsererror")}`);}
return xml.documentElement;}}
return __exports;});;

/* /web/static/src/env.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/env',async function(require){'use strict';let __exports={};const{registry}=require("@web/core/registry");__exports.makeEnv=makeEnv;function makeEnv(){return{qweb:new owl.QWeb(),bus:new owl.core.EventBus(),services:{},debug:odoo.debug,_t:()=>{throw new Error("Translations are not ready yet. Maybe use _lt instead?");},get isSmall(){throw new Error("UI service not initialized!");},};}
const serviceRegistry=registry.category("services");const SERVICES_METADATA=__exports.SERVICES_METADATA={};__exports.startServices=startServices;async function startServices(env){const toStart=new Set();serviceRegistry.on("UPDATE",null,async(payload)=>{await Promise.resolve();const{operation,key:name,value:service}=payload;if(operation==="delete"){return;}
if(toStart.size){const namedService=Object.assign(Object.create(service),{name});toStart.add(namedService);}else{await _startServices(env,toStart);}});await Promise.resolve();await _startServices(env,toStart);}
async function _startServices(env,toStart){const services=env.services;for(const[name,service]of serviceRegistry.getEntries()){if(!(name in services)){const namedService=Object.assign(Object.create(service),{name});toStart.add(namedService);}}
async function start(){let service=null;const proms=[];while((service=findNext())){let name=service.name;toStart.delete(service);const entries=(service.dependencies||[]).map((dep)=>[dep,services[dep]]);const dependencies=Object.fromEntries(entries);let value;try{value=service.start(env,dependencies);}catch(e){value=e;console.error(e);}
if("async"in service){SERVICES_METADATA[name]=service.async;}
if(value instanceof Promise){proms.push(new Promise(async(resolve)=>{value.then((val)=>{services[name]=val||null;}).catch((error)=>{services[name]=error;console.error(error);}).finally(resolve);}));}else{services[service.name]=value||null;}}
await Promise.all(proms);if(proms.length){return start();}}
await start();if(toStart.size){const names=[...toStart].map((s)=>s.name);const missingDeps=new Set();[...toStart].forEach((s)=>s.dependencies.forEach((dep)=>{if(!(dep in services)&&!names.includes(dep)){missingDeps.add(dep);}}));const depNames=[...missingDeps].join(", ");throw new Error(`Some services could not be started: ${names}. Missing dependencies: ${depNames}`);}
function findNext(){for(let s of toStart){if(s.dependencies){if(s.dependencies.every((d)=>d in services)){return s;}}else{return s;}}
return null;}}
return __exports;});;

/* /web/static/src/legacy/js/core/misc.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('web.framework',function(require){"use strict";var core=require('web.core');var ajax=require('web.ajax');var Widget=require('web.Widget');const{sprintf}=require('web.utils')
var _t=core._t;var messages_by_seconds=function(){return[[0,_t("Loading...")],[20,_t("Still loading...")],[60,_t("Still loading...<br />Please be patient.")],[120,_t("Don't leave yet,<br />it's still loading...")],[300,_t("You may not believe it,<br />but the application is actually loading...")],[420,_t("Take a minute to get a coffee,<br />because it's loading...")],[3600,_t("Maybe you should consider reloading the application by pressing F5...")]];};var Throbber=Widget.extend({template:"Throbber",start:function(){this.start_time=new Date().getTime();this.act_message();},act_message:function(){var self=this;setTimeout(function(){if(self.isDestroyed())
return;var seconds=(new Date().getTime()-self.start_time)/1000;var mes;_.each(messages_by_seconds(),function(el){if(seconds>=el[0])
mes=el[1];});self.$(".oe_throbber_message").html(mes);self.act_message();},1000);},});if($.blockUI){$.blockUI.defaults.baseZ=1100;$.blockUI.defaults.message='<div class="openerp oe_blockui_spin_container" style="background-color: transparent;">';$.blockUI.defaults.css.border='0';$.blockUI.defaults.css["background-color"]='';}
function blockAccessKeys(){var elementWithAccessKey=[];elementWithAccessKey=document.querySelectorAll('[accesskey]');_.each(elementWithAccessKey,function(elem){elem.setAttribute("data-accesskey",elem.getAttribute('accesskey'));elem.removeAttribute('accesskey');});}
function unblockAccessKeys(){var elementWithDataAccessKey=[];elementWithDataAccessKey=document.querySelectorAll('[data-accesskey]');_.each(elementWithDataAccessKey,function(elem){elem.setAttribute('accesskey',elem.getAttribute('data-accesskey'));elem.removeAttribute('data-accesskey');});}
var throbbers=[];function blockUI(){var tmp=$.blockUI.apply($,arguments);var throbber=new Throbber();throbbers.push(throbber);throbber.appendTo($(".oe_blockui_spin_container"));$(document.body).addClass('o_ui_blocked');blockAccessKeys();return tmp;}
function unblockUI(){_.invoke(throbbers,'destroy');throbbers=[];$(document.body).removeClass('o_ui_blocked');unblockAccessKeys();return $.unblockUI.apply($,arguments);}
function redirect(url,wait){var load=function(){var old=""+window.location;var old_no_hash=old.split("#")[0];var url_no_hash=url.split("#")[0];location.assign(url);if(old_no_hash===url_no_hash){location.reload(true);}};var wait_server=function(){ajax.rpc("/web/webclient/version_info",{}).then(load).guardedCatch(function(){setTimeout(wait_server,250);});};if(wait){setTimeout(wait_server,1000);}else{load();}}
function Reload(parent,action){var params=action.params||{};var menu_id=params.menu_id||false;var l=window.location;var sobj=$.deparam(l.search.substr(1));if(params.url_search){sobj=_.extend(sobj,params.url_search);}
var search='?'+$.param(sobj);var hash=l.hash;if(menu_id){hash="#menu_id="+menu_id;}
var url=l.protocol+"//"+l.host+l.pathname+search+hash;core.bus.trigger('clear_cache');redirect(url,params.wait);}
core.action_registry.add("reload",Reload);function Home(parent,action){var url='/'+(window.location.search||'');redirect(url,action&&action.params&&action.params.wait);}
core.action_registry.add("home",Home);function login(){redirect('/web/login');}
core.action_registry.add("login",login);function logout(){redirect('/web/session/logout');}
core.action_registry.add("logout",logout);function displayNotification(parent,action){let{title='',message='',links=[],type='info',sticky=false,next}=action.params||{};links=links.map(({url,label})=>`<a href="${_.escape(url)}" target="_blank">${_.escape(label)}</a>`)
parent.displayNotification({title,message:sprintf(_.escape(message),...links),type,sticky,messageIsHtml:true,});return next;}
core.action_registry.add("display_notification",displayNotification);function ReloadContext(parent,action){ajax.rpc("/web/session/get_session_info",{}).then(function(){Reload(parent,action);});}
core.action_registry.add("reload_context",ReloadContext);if(!document.contains){document.contains=function contains(node){if(!(0 in arguments)){throw new TypeError('1 argument is required');}
do{if(this===node){return true;}}while(node=node&&node.parentNode);return false;};}
return{blockUI:blockUI,unblockUI:unblockUI,redirect:redirect,};});;

/* /web/static/src/legacy/js/env.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/legacy/js/env',async function(require){'use strict';let __exports={};const commonEnv=require('web.commonEnv');const dataManager=require('web.data_manager');const{blockUI,unblockUI}=require("web.framework");const env=Object.assign(commonEnv,{dataManager});env.services=Object.assign(env.services,{blockUI,unblockUI});__exports[Symbol.for("default")]=env;return __exports;});odoo.define(`web.env`,async function(require){return require('@web/legacy/js/env')[Symbol.for("default")];});;

/* /web/static/src/legacy/js/fields/field_utils.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('web.field_utils',function(require){"use strict";var core=require('web.core');var dom=require('web.dom');var session=require('web.session');var time=require('web.time');var utils=require('web.utils');var _t=core._t;function formatBinary(value,field,options){if(!value){return'';}
return utils.binaryToBinsize(value);}
function formatBoolean(value,field,options){if(options&&options.forceString){return value?_t('True'):_t('False');}
return dom.renderCheckbox({prop:{checked:value,disabled:true,},});}
function formatChar(value,field,options){value=typeof value==='string'?value:'';if(options&&options.isPassword){return _.str.repeat('*',value?value.length:0);}
if(options&&options.escape){value=_.escape(value);}
return value;}
function formatDate(value,field,options){if(value===false||isNaN(value)){return"";}
if(field&&field.type==='datetime'){if(!options||!('timezone'in options)||options.timezone){value=value.clone().add(session.getTZOffset(value),'minutes');}}
var date_format=time.getLangDateFormat();return value.format(date_format);}
function formatDateTime(value,field,options){if(value===false){return"";}
if(!options||!('timezone'in options)||options.timezone){value=value.clone().add(session.getTZOffset(value),'minutes');}
return value.format(time.getLangDatetimeFormat());}
function formatFloat(value,field,options){options=options||{};if(value===false){return"";}
if(options.humanReadable&&options.humanReadable(value)){return utils.human_number(value,options.decimals,options.minDigits,options.formatterCallback);}
var l10n=core._t.database.parameters;var precision;if(options.digits){precision=options.digits[1];}else if(field&&field.digits){precision=field.digits[1];}else{precision=2;}
var formatted=_.str.sprintf('%.'+precision+'f',value||0).split('.');formatted[0]=utils.insert_thousand_seps(formatted[0]);return formatted.join(l10n.decimal_point);}
function formatFloatFactor(value,field,options){var factor=options.factor||1;return formatFloat(value*factor,field,options);}
function formatFloatTime(value,field,options){options=options||{};var pattern=options.noLeadingZeroHour?'%1d:%02d':'%02d:%02d';if(value<0){value=Math.abs(value);pattern='-'+pattern;}
var hour=Math.floor(value);var min=Math.round((value%1)*60);if(min===60){min=0;hour=hour+1;}
return _.str.sprintf(pattern,hour,min);}
function formatInteger(value,field,options){options=options||{};if(options.isPassword){return _.str.repeat('*',String(value).length);}
if(!value&&value!==0){return"";}
if(options.humanReadable&&options.humanReadable(value)){return utils.human_number(value,options.decimals,options.minDigits,options.formatterCallback);}
return utils.insert_thousand_seps(_.str.sprintf('%d',value));}
function formatMany2one(value,field,options){if(!value){value='';}else if(_.isArray(value)){value=value[1];}else{while(value.data){value=value.data.display_name||'';}}
if(options&&options.escape){value=_.escape(value);}
return value;}
function formatX2Many(value){if(value.data.length===0){return _t('No records');}else if(value.data.length===1){return _t('1 record');}else{return value.data.length+_t(' records');}}
function formatMonetary(value,field,options){if(value===false){return"";}
options=Object.assign({forceString:false},options);var currency=options.currency;if(!currency){var currency_id=options.currency_id;if(!currency_id&&options.data){var currency_field=options.currency_field||field.currency_field||'currency_id';currency_id=options.data[currency_field]&&options.data[currency_field].res_id;}
currency=session.get_currency(currency_id);}
var digits=(currency&&currency.digits)||options.digits;if(options.field_digits===true){digits=field.digits||digits;}
var formatted_value=formatFloat(value,field,_.extend({},options,{digits:digits}));if(!currency||options.noSymbol){return formatted_value;}
const val=currency.position==='after'?[formatted_value,currency.symbol]:[currency.symbol,formatted_value];if(options.forceString){return val.join(' ');}
return utils.Markup(val.map((v)=>_.escape(v)).join('&nbsp;'));}
function formatPercentage(value,field,options){options=options||{};let result=formatFloat(value*100,field,options)||'0';if(!options.humanReadable||!options.humanReadable(value*100)){result=parseFloat(result).toString().replace('.',_t.database.parameters.decimal_point);}
return result+(options.noSymbol?'':'%');}
function formatSelection(value,field,options){var val=_.find(field.selection,function(option){return option[0]===value;});if(!val){return'';}
value=val[1];if(options&&options.escape){value=_.escape(value);}
return value;}
function parseSmartDateInput(value){const units={d:'days',m:'months',w:'weeks',y:'years',};const re=new RegExp(`^([+-])(\\d+)([${Object.keys(units).join('')}]?)$`);const match=re.exec(value);if(match){let date=moment();const offset=parseInt(match[2],10);const unit=units[match[3]||'d'];if(match[1]==='+'){date.add(offset,unit);}else{date.subtract(offset,unit);}
return date;}
return false;}
function parseDate(value,field,options){if(!value){return false;}
var datePattern=time.getLangDateFormat();var datePatternWoZero=time.getLangDateFormatWoZero();var date;const smartDate=parseSmartDateInput(value);if(smartDate){date=smartDate;}else{if(options&&options.isUTC){value=value.padStart(10,"0");date=moment.utc(value);}else{date=moment.utc(value,[datePattern,datePatternWoZero,moment.ISO_8601]);}}
if(date.isValid()){if(date.year()===0){date.year(moment.utc().year());}
if(date.year()>=1000){date.toJSON=function(){return this.clone().locale('en').format('YYYY-MM-DD');};return date;}}
throw new Error(_.str.sprintf(core._t("'%s' is not a correct date"),value));}
function parseDateTime(value,field,options){if(!value){return false;}
const datePattern=time.getLangDateFormat();const timePattern=time.getLangTimeFormat();const datePatternWoZero=time.getLangDateFormatWoZero();const timePatternWoZero=time.getLangTimeFormatWoZero();var pattern1=datePattern+' '+timePattern;var pattern2=datePatternWoZero+' '+timePatternWoZero;var datetime;const smartDate=parseSmartDateInput(value);if(smartDate){datetime=smartDate;}else{if(options&&options.isUTC){value=value.padStart(19,"0");datetime=moment.utc(value.replace(' ','T')+'Z');}else{datetime=moment.utc(value,[pattern1,pattern2,moment.ISO_8601]);if(options&&options.timezone){datetime.add(-session.getTZOffset(datetime),'minutes');}}}
if(datetime.isValid()){if(datetime.year()===0){datetime.year(moment.utc().year());}
if(datetime.year()>=1000){datetime.toJSON=function(){return this.clone().locale('en').format('YYYY-MM-DD HH:mm:ss');};return datetime;}}
throw new Error(_.str.sprintf(core._t("'%s' is not a correct datetime"),value));}
function parseNumber(value){if(core._t.database.parameters.thousands_sep){var escapedSep=_.str.escapeRegExp(core._t.database.parameters.thousands_sep);value=value.replace(new RegExp(escapedSep,'g'),'');}
if(core._t.database.parameters.decimal_point){value=value.replace(core._t.database.parameters.decimal_point,'.');}
return Number(value);}
function parseFloat(value){var parsed=parseNumber(value);if(isNaN(parsed)){throw new Error(_.str.sprintf(core._t("'%s' is not a correct float"),value));}
return parsed;}
function parseMonetary(value,field,options){var values=value.split('&nbsp;');if(values.length===1){return parseFloat(value);}
else if(values.length!==2){throw new Error(_.str.sprintf(core._t("'%s' is not a correct monetary field"),value));}
options=options||{};var currency=options.currency;if(!currency){var currency_id=options.currency_id;if(!currency_id&&options.data){var currency_field=options.currency_field||field.currency_field||'currency_id';currency_id=options.data[currency_field]&&options.data[currency_field].res_id;}
currency=session.get_currency(currency_id);}
return parseFloat(values[0]===currency.symbol?values[1]:values[0]);}
function parseFloatFactor(value,field,options){var parsed=parseFloat(value);var factor=options.factor||1.0;return parsed/factor;}
function parseFloatTime(value){var factor=1;if(value[0]==='-'){value=value.slice(1);factor=-1;}
var float_time_pair=value.split(":");if(float_time_pair.length!==2)
return factor*parseFloat(value);var hours=parseInteger(float_time_pair[0]);var minutes=parseInteger(float_time_pair[1]);return factor*(hours+(minutes/60));}
function parsePercentage(value){return parseFloat(value)/100;}
function parseInteger(value){var parsed=parseNumber(value);if(isNaN(parsed)||parsed%1||parsed<-2147483648||parsed>2147483647){throw new Error(_.str.sprintf(core._t("'%s' is not a correct integer"),value));}
return parsed;}
function parseMany2one(value){if(_.isArray(value)){return{id:value[0],display_name:value[1],};}
if(_.isNumber(value)||_.isString(value)){return{id:parseInt(value,10),};}
return value;}
return{format:{binary:formatBinary,boolean:formatBoolean,char:formatChar,date:formatDate,datetime:formatDateTime,float:formatFloat,float_factor:formatFloatFactor,float_time:formatFloatTime,html:_.identity,integer:formatInteger,many2many:formatX2Many,many2one:formatMany2one,many2one_reference:formatInteger,monetary:formatMonetary,one2many:formatX2Many,percentage:formatPercentage,reference:formatMany2one,selection:formatSelection,text:formatChar,},parse:{binary:_.identity,boolean:_.identity,char:_.identity,date:parseDate,datetime:parseDateTime,float:parseFloat,float_factor:parseFloatFactor,float_time:parseFloatTime,html:_.identity,integer:parseInteger,many2many:_.identity,many2one:parseMany2one,many2one_reference:parseInteger,monetary:parseMonetary,one2many:_.identity,percentage:parsePercentage,reference:parseMany2one,selection:_.identity,text:_.identity,},};});;

/* /web/static/src/legacy/js/owl_compatibility.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('web.OwlCompatibility',function(){"use strict";const{Component,hooks,tags}=owl;const{useRef,useSubEnv}=hooks;const{xml}=tags;const widgetSymbol=odoo.widgetSymbol;const children=new WeakMap();const templateForLegacy=tags.xml`<div/>`;const templateForOwl=tags.xml`<t t-component="props.Component" t-props="childProps" />`;class ComponentAdapter extends Component{constructor(parent,props){if(!props.Component){throw Error(`ComponentAdapter: 'Component' prop is missing.`);}
let template;if(!(props.Component.prototype instanceof Component)){template=templateForLegacy;}else{template=templateForOwl;}
ComponentAdapter.template=template;super(...arguments);this.template=template;ComponentAdapter.template=null;this.widget=null;}
get childProps(){if(!this._childProps){this._childProps=Object.assign({},this.props);delete this._childProps.Component;}
return this._childProps;}
willStart(){if(!(this.props.Component.prototype instanceof Component)){this.widget=new this.props.Component(this,...this.widgetArgs);return this.widget._widgetRenderAndInsert(()=>{});}}
willUpdateProps(nextProps){if(this.widget){return this.updateWidget(nextProps);}}
__patch(target,vnode){if(this.widget){if(this.__owl__.vnode){this.renderWidget();}
vnode.elm=this.widget.el;}
const result=super.__patch(...arguments);if(this.widget&&this.el!==this.widget.el){this.__owl__.vnode.elm=this.widget.el;}
return result;}
mounted(){if(this.widget&&this.widget.on_attach_callback){this.widget.on_attach_callback();}}
willUnmount(){if(this.widget&&this.widget.on_detach_callback){this.widget.on_detach_callback();}}
__destroy(){super.__destroy(...arguments);if(this.widget){this.widget.destroy();}}
get widgetArgs(){if(this.props.widgetArgs){return this.props.widgetArgs;}
const args=Object.keys(this.props);args.splice(args.indexOf('Component'),1);if(args.length>1){throw new Error(`ComponentAdapter has more than 1 argument, 'widgetArgs' must be overriden.`);}
return args.map(a=>this.props[a]);}
updateWidget(){if(this.env.isDebug('assets')){console.warn(`ComponentAdapter: Widget could not be updated, maybe override 'updateWidget' function?`);}}
renderWidget(){if(this.env.isDebug('assets')){console.warn(`ComponentAdapter: Widget could not be re-rendered, maybe override 'renderWidget' function?`);}}
_trigger_up(ev){const evType=ev.name;const payload=ev.data;if(evType==='call_service'){let args=payload.args||[];if(payload.service==='ajax'&&payload.method==='rpc'){args=args.concat(ev.target);}
const service=this.env.services[payload.service];if(service){const result=service[payload.method].apply(service,args);payload.callback(result);}else{throw new Error(`The service "${payload.service}" is not present in the legacy owl environment.
                         You should probably create a mapper in @web/legacy/utils`);}}else if(evType==='get_session'){if(payload.callback){payload.callback(this.env.session);}}else if(evType==='load_views'){const params={model:payload.modelName,context:payload.context,views_descr:payload.views,};this.env.dataManager.load_views(params,payload.options||{}).then(payload.on_success);}else if(evType==='load_filters'){return this.env.dataManager.load_filters(payload).then(payload.on_success);}else{payload.__targetWidget=ev.target;this.trigger(evType.replace(/_/g,'-'),payload);}}}
const WidgetAdapterMixin={on_attach_callback(){for(const component of children.get(this)||[]){component.on_attach_callback();}},on_detach_callback(){for(const component of children.get(this)||[]){component.on_detach_callback();}},destroy(){for(const component of children.get(this)||[]){component.env.qweb.off("update",component);component.__destroy();}
children.delete(this);},};class ComponentWrapper extends Component{constructor(parent,Component,props){if(parent instanceof Component){throw new Error('ComponentWrapper must be used with a legacy Widget as parent');}
super(null,props);if(parent){this._register(parent);}
useSubEnv({[widgetSymbol]:this._addListener.bind(this)});this.parentWidget=parent;this.Component=Component;this.props=props||{};this._handledEvents=new Set();this.componentRef=useRef("component");}
on_attach_callback(){function recursiveCallMounted(component){const{status,currentFiber}=component.__owl__;if(status===2&&currentFiber&&!currentFiber.isCompleted){return;}
if(status!==2&&status!==3&&status!==4){return;}
for(const key in component.__owl__.children){recursiveCallMounted(component.__owl__.children[key]);}
component.__callMounted();}
recursiveCallMounted(this);}
on_detach_callback(){this.__callWillUnmount();}
destroy(){if(this.parentWidget){const parentChildren=children.get(this.parentWidget);if(parentChildren){const index=parentChildren.indexOf(this);children.get(this.parentWidget).splice(index,1);}}
super.destroy();}
setParent(parent){if(parent instanceof Component){throw new Error('ComponentWrapper must be used with a legacy Widget as parent');}
this._register(parent);if(this.parentWidget){const parentChildren=children.get(this.parentWidget);parentChildren.splice(parentChildren.indexOf(this),1);}
this.parentWidget=parent;}
async update(props={}){if(this.__owl__.status===5){return new Promise(()=>{});}
Object.assign(this.props,props);let prom;if(this.__owl__.status===3){prom=this.render();}else{prom=this.mount(...this._mountArgs);}
return prom;}
_addListener(evType){if(this.parentWidget&&!this._handledEvents.has(evType)){this._handledEvents.add(evType);this.el.addEventListener(evType,ev=>{if(!ev.cancelBubble){ev.stopPropagation();const detail=Object.assign({},ev.detail,{__originalComponent:ev.originalComponent,});this.parentWidget.trigger_up(ev.type.replace(/-/g,'_'),detail);}});}}
_register(parent){let parentChildren=children.get(parent);if(!parentChildren){parentChildren=[];children.set(parent,parentChildren);}
parentChildren.push(this);}
async mount(target,options){if(options&&options.position==='self'){throw new Error('Unsupported position: "self" is not allowed for wrapper components. '+'Contact the JS Framework team or open an issue if your use case is relevant.');}
this._mountArgs=arguments;return super.mount(...arguments);}
get $el(){return $(this.el);}}
ComponentWrapper.template=xml`<t t-component="Component" t-props="props" t-ref="component"/>`;return{ComponentAdapter,ComponentWrapper,WidgetAdapterMixin,};});;

/* /web/static/src/legacy/js/services/data_manager.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('web.DataManager',function(require){"use strict";var config=require('web.config');var core=require('web.core');var rpc=require('web.rpc');var session=require('web.session');var utils=require('web.utils');return core.Class.extend({init:function(){this._init_cache();core.bus.on('clear_cache',this,this.invalidate.bind(this));},_init_cache:function(){this._cache={actions:{},filters:{},views:{},};},invalidate:function(dataManager){if(dataManager===this){return;}
session.invalidateCacheKey('load_menus');this._init_cache();},load_action:function(action_id,additional_context){var self=this;var key=this._gen_key(action_id,additional_context||{});if(config.isDebug('assets')||!this._cache.actions[key]){this._cache.actions[key]=rpc.query({route:"/web/action/load",params:{action_id:action_id,additional_context:additional_context,},}).then(function(action){self._cache.actions[key]=action.no_cache?null:self._cache.actions[key];return action;}).guardedCatch(()=>this._invalidate('actions',key));}
return this._cache.actions[key].then(function(action){return $.extend(true,{},action);});},load_views:async function({model,context,views_descr},options={}){const viewsKey=this._gen_key(model,views_descr,options,context);const filtersKey=this._gen_key(model,options.action_id);const withFilters=Boolean(options.load_filters);const shouldLoadViews=config.isDebug('assets')||!this._cache.views[viewsKey];const shouldLoadFilters=config.isDebug('assets')||(withFilters&&!this._cache.filters[filtersKey]);if(shouldLoadViews){options.load_filters=shouldLoadFilters;this._cache.views[viewsKey]=rpc.query({args:[],kwargs:{context,options,views:views_descr},model,method:'load_views',}).then(result=>{utils.deepFreeze(result.fields);for(const[viewId,viewType]of views_descr){const fvg=result.fields_views[viewType];fvg.viewFields=fvg.fields;fvg.fields=result.fields;}
if(shouldLoadFilters){this._cache.filters[filtersKey]=Promise.resolve(result.filters);}
return result.fields_views;}).guardedCatch(()=>this._invalidate('views',viewsKey));}
const result=await this._cache.views[viewsKey];if(withFilters&&result.search){if(shouldLoadFilters){await this.load_filters({actionId:options.action_id,context,forceReload:false,modelName:model,});}
result.search.favoriteFilters=await this._cache.filters[filtersKey];}
return result;},load_filters:function(params){const key=this._gen_key(params.modelName,params.actionId);const forceReload=params.forceReload!==false&&config.isDebug('assets');if(forceReload||!this._cache.filters[key]){this._cache.filters[key]=rpc.query({args:[params.modelName,params.actionId],kwargs:{context:params.context||{},},model:'ir.filters',method:'get_filters',}).guardedCatch(()=>this._invalidate('filters',key));}
return this._cache.filters[key];},create_filter:function(filter){return rpc.query({args:[filter],model:'ir.filters',method:'create_or_replace',}).then(filterId=>{const filtersKey=this._gen_key(filter.model_id,filter.action_id);this._invalidate('filters',filtersKey);return filterId;});},delete_filter:function(filterId){return rpc.query({args:[filterId],model:'ir.filters',method:'unlink',}).then(()=>this._invalidate('filters'));},_gen_key:function(){return _.map(Array.prototype.slice.call(arguments),function(arg){if(!arg){return false;}
return _.isObject(arg)?JSON.stringify(arg):arg;}).join(',');},_invalidate(section,key){core.bus.trigger("clear_cache",this);if(key){delete this._cache[section][key];}else{this._cache[section]={};}},});});odoo.define('web.data_manager',function(require){"use strict";var DataManager=require('web.DataManager');var data_manager=new DataManager();return data_manager;});;

/* /web/static/src/legacy/js/services/session.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('web.session',function(require){"use strict";var Session=require('web.Session');var session=new Session(undefined,undefined,{use_cors:false});session.is_bound=session.session_bind();return session;});;

/* /web/static/src/legacy/js/widgets/date_picker.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('web.datepicker',function(require){"use strict";var core=require('web.core');var field_utils=require('web.field_utils');var time=require('web.time');var Widget=require('web.Widget');var _t=core._t;var DateWidget=Widget.extend({template:"web.datepicker",type_of_date:"date",events:{'error.datetimepicker':'errorDatetime','change .o_datepicker_input':'changeDatetime','click input':'_onInputClicked','input input':'_onInput','keydown':'_onKeydown','show.datetimepicker':'_onDateTimePickerShow','hide.datetimepicker':'_onDateTimePickerHide',},init:function(parent,options){this._super.apply(this,arguments);this.name=parent.name;this.options=_.extend({locale:moment.locale(),format:this.type_of_date==='datetime'?time.getLangDatetimeFormat():time.getLangDateFormat(),minDate:moment({y:1000}),maxDate:moment({y:9999,M:11,d:31}),useCurrent:false,icons:{time:'fa fa-clock-o',date:'fa fa-calendar',up:'fa fa-chevron-up',down:'fa fa-chevron-down',previous:'fa fa-chevron-left',next:'fa fa-chevron-right',today:'fa fa-calendar-check-o',clear:'fa fa-trash',close:'fa fa-check primary',},calendarWeeks:true,buttons:{showToday:false,showClear:false,showClose:false,},widgetParent:'body',keyBinds:null,},options||{});this.__libInput=0;this.__isOpen=false;},start:function(){this.$input=this.$('input.o_datepicker_input');this.__libInput++;this.$el.datetimepicker(this.options);this.__libInput--;this._setReadonly(false);},destroy:function(){if(this._onScroll){window.removeEventListener('wheel',this._onScroll,true);}
this.__libInput++;this.$el.datetimepicker('destroy');this.__libInput--;this._super.apply(this,arguments);},changeDatetime:function(){if(this.__libInput>0){if(this.options.warn_future){this._warnFuture(this.getValue());}
this.trigger("datetime_changed");return;}
var oldValue=this.getValue();if(this.isValid()){this._setValueFromUi();var newValue=this.getValue();var hasChanged=!oldValue!==!newValue;if(oldValue&&newValue){var formattedOldValue=oldValue.format(time.getLangDatetimeFormat());var formattedNewValue=newValue.format(time.getLangDatetimeFormat());if(formattedNewValue!==formattedOldValue){hasChanged=true;}}
if(hasChanged){if(this.options.warn_future){this._warnFuture(newValue);}
this.trigger("datetime_changed");}}else{var formattedValue=oldValue?this._formatClient(oldValue):null;this.$input.val(formattedValue);}},errorDatetime:function(e){return false;},focus:function(){this.__libInput++;this.$input.focus();this.__libInput--;},getValue:function(){var value=this.get('value');return value&&value.clone();},isValid:function(){var value=this.$input.val();if(value===""){return true;}else{try{this._parseClient(value);return true;}catch(e){return false;}}},maxDate:function(date){this.__libInput++;this.$el.datetimepicker('maxDate',date||null);this.__libInput--;},minDate:function(date){this.__libInput++;this.$el.datetimepicker('minDate',date||null);this.__libInput--;},setValue:function(value){this.set({'value':value});var formatted_value=value?this._formatClient(value):null;this.$input.val(formatted_value);this._setLibInputValue(value);},_warnFuture:function(currentDate){if(!this.$warning){this.$warning=$('<span>',{class:'fa fa-exclamation-triangle o_tz_warning o_datepicker_warning',});var title=_t("This date is in the future. Make sure this is what you expect.");this.$warning.attr('title',title);this.$input.after(this.$warning);}
if(currentDate&&currentDate.format('YYYY-MM-DD')>moment().format('YYYY-MM-DD')){this.$warning.show();}else{this.$warning.hide();}},_formatClient:function(v){return field_utils.format[this.type_of_date](v,null,{timezone:false});},_parseClient:function(v){return field_utils.parse[this.type_of_date](v,null,{timezone:false});},_setLibInputValue:function(value){this.__libInput++;this.$el.datetimepicker('date',value||null);this.__libInput--;},_setReadonly:function(readonly){this.readonly=readonly;this.$input.prop('readonly',this.readonly);},_setValueFromUi:function(){var value=this.$input.val()||false;this.setValue(this._parseClient(value));},_onDateTimePickerHide:function(){this.__isOpen=false;this.changeDatetime();if(this._onScroll){window.removeEventListener('wheel',this._onScroll,true);}
this.changeDatetime();},_onDateTimePickerShow:function(){this.__isOpen=true;if(this.$input.val().length!==0&&this.isValid()){this.$input.select();}
var self=this;this._onScroll=function(ev){if(ev.target!==self.$input.get(0)){self.__libInput++;self.$el.datetimepicker('hide');self.__libInput--;}};window.addEventListener('wheel',this._onScroll,true);},_onKeydown:function(ev){if(ev.which===$.ui.keyCode.ESCAPE){if(this.__isOpen){ev.stopImmediatePropagation();this.__libInput++;this.$el.datetimepicker('hide');this.__libInput--;this.focus();}}},_onInput:function(ev){if(this.__libInput>0){ev.stopImmediatePropagation();}},_onInputClicked:function(){this.__libInput++;this.$el.datetimepicker('toggle');this.__libInput--;this.focus();},});var DateTimeWidget=DateWidget.extend({type_of_date:"datetime",init:function(parent,options){this._super(parent,_.extend({buttons:{showToday:false,showClear:false,showClose:true,},},options||{}));},});return{DateWidget:DateWidget,DateTimeWidget:DateTimeWidget,};});;

/* /web/static/src/legacy/legacy_promise_error_handler.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/legacy/legacy_promise_error_handler',async function(require){'use strict';let __exports={};const{registry}=require("@web/core/registry");function legacyRejectPromiseHandler(env,error,originalError){if(error.name==="UncaughtPromiseError"){const isLegitError=originalError&&originalError instanceof Error;const isLegacyRPC=originalError&&originalError.legacy;if(!isLegitError&&!isLegacyRPC){error.unhandledRejectionEvent.preventDefault();return true;}}
return false;}
registry.category("error_handlers").add("legacyRejectPromiseHandler",legacyRejectPromiseHandler,{sequence:1});return __exports;});;

/* /web/static/src/legacy/legacy_rpc_error_handler.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/legacy/legacy_rpc_error_handler',async function(require){'use strict';let __exports={};const{registry}=require("@web/core/registry");const{ConnectionLostError,RPCError}=require("@web/core/network/rpc_service");const{lostConnectionHandler,rpcErrorHandler}=require("@web/core/errors/error_handlers");const errorHandlerRegistry=registry.category("error_handlers");function legacyRPCErrorHandler(env,error,originalError){if(originalError&&originalError.legacy&&originalError.message&&(originalError.message instanceof RPCError||originalError.message instanceof ConnectionLostError)){const event=originalError.event;originalError=originalError.message;if(event.isDefaultPrevented()){error.unhandledRejectionEvent.preventDefault();return true;}
event.preventDefault();if(originalError instanceof ConnectionLostError){return lostConnectionHandler(env,error,originalError);}
return rpcErrorHandler(env,error,originalError);}
return false;}
errorHandlerRegistry.add("legacyRPCErrorHandler",legacyRPCErrorHandler,{sequence:2});return __exports;});;

/* /web/static/src/legacy/utils.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@web/legacy/utils',async function(require){'use strict';let __exports={};const{browser}=require("@web/core/browser/browser");const AbstractStorageService=require("web.AbstractStorageService");const{ConnectionAbortedError,RPCError,makeErrorFromResponse,ConnectionLostError,}=require("@web/core/network/rpc_service");const{ErrorDialog}=require("@web/core/errors/error_dialogs");__exports.makeLegacyRpcService=makeLegacyRpcService;function makeLegacyRpcService(legacyEnv){return{start(env){legacyEnv.bus.on("rpc_request",null,(rpcId)=>{env.bus.trigger("RPC:REQUEST",rpcId);});legacyEnv.bus.on("rpc_response",null,(rpcId)=>{env.bus.trigger("RPC:RESPONSE",rpcId);});legacyEnv.bus.on("rpc_response_failed",null,(rpcId)=>{env.bus.trigger("RPC:RESPONSE",rpcId);});},};}
__exports.makeLegacyDialogMappingService=makeLegacyDialogMappingService;function makeLegacyDialogMappingService(legacyEnv){return{dependencies:["ui","hotkey"],start(env){const{ui,hotkey}=env.services;function getModalEl(dialog){return dialog.modalRef?dialog.modalRef.el:dialog.$modal[0];}
function getCloseCallback(dialog){return dialog.modalRef?()=>dialog._close():()=>dialog.$modal.modal("hide");}
const dialogHotkeyRemoveMap=new Map();function onOpenDialog(dialog){ui.activateElement(getModalEl(dialog));const remove=hotkey.add("escape",getCloseCallback(dialog));dialogHotkeyRemoveMap.set(dialog,remove);}
function onCloseDialog(dialog){ui.deactivateElement(getModalEl(dialog));if(dialogHotkeyRemoveMap.has(dialog)){const removeHotkey=dialogHotkeyRemoveMap.get(dialog);removeHotkey();dialogHotkeyRemoveMap.delete(dialog);}}
legacyEnv.bus.on("legacy_dialog_opened",null,onOpenDialog);legacyEnv.bus.on("legacy_dialog_destroyed",null,onCloseDialog);legacyEnv.bus.on("owl_dialog_mounted",null,onOpenDialog);legacyEnv.bus.on("owl_dialog_willunmount",null,onCloseDialog);},};}
__exports.makeLegacyCommandService=makeLegacyCommandService;function makeLegacyCommandService(legacyEnv){return{dependencies:["command"],start(env){const{command}=env.services;const commandRemoveMap=new Map();function setLegacyCommand(uniqueId,getCommandDefinition){const{name,action,options}=getCommandDefinition(env);removeLegacyCommand(uniqueId);commandRemoveMap.set(uniqueId,command.add(name,action,options));}
function removeLegacyCommand(uniqueId){if(commandRemoveMap.has(uniqueId)){const removeCommand=commandRemoveMap.get(uniqueId);removeCommand();commandRemoveMap.delete(uniqueId);}}
legacyEnv.bus.on("set_legacy_command",null,setLegacyCommand);legacyEnv.bus.on("remove_legacy_command",null,removeLegacyCommand);},};}
__exports.makeLegacyDropdownService=makeLegacyDropdownService;function makeLegacyDropdownService(legacyEnv){return{dependencies:["ui","hotkey"],start(_,{ui,hotkey}){legacyEnv.services.ui=ui;legacyEnv.services.hotkey=hotkey;},};}
__exports.makeLegacySessionService=makeLegacySessionService;function makeLegacySessionService(legacyEnv,session){return{dependencies:["user"],start(env){function mapContext(){return Object.assign({},env.services.user.context);}
Object.defineProperty(legacyEnv.session,"userContext",{get:()=>mapContext(),});Object.defineProperty(session,"user_context",{get:()=>mapContext(),});},};}
__exports.mapLegacyEnvToWowlEnv=mapLegacyEnvToWowlEnv;function mapLegacyEnvToWowlEnv(legacyEnv,wowlEnv){legacyEnv.session.rpc=(...args)=>{let rejection;const prom=new Promise((resolve,reject)=>{const[route,params,settings={}]=args;if(params&&params.kwargs){params.kwargs.context=Object.assign(params.kwargs.context||{},legacyEnv.session.user_context);}
const jsonrpc=wowlEnv.services.rpc(route,params,{silent:settings.shadow,xhr:settings.xhr,});rejection=()=>{jsonrpc.abort();};jsonrpc.then(resolve).catch((reason)=>{if(reason instanceof RPCError||reason instanceof ConnectionLostError){reject({message:reason,event:$.Event(),legacy:true});}else if(reason instanceof ConnectionAbortedError){reject({message:reason.message,event:$.Event("abort")});}else{reject(reason);}});});prom.abort=rejection;return prom;};function mapStorage(storage){const StorageService=AbstractStorageService.extend({storage});return new StorageService();}
legacyEnv.services.local_storage=mapStorage(browser.localStorage);legacyEnv.services.session_storage=mapStorage(browser.sessionStorage);wowlEnv.bus.on("WEB_CLIENT_READY",null,()=>{legacyEnv.bus.trigger("web_client_ready");});wowlEnv.bus.on("SCROLLER:ANCHOR_LINK_CLICKED",null,(payload)=>{legacyEnv.bus.trigger("SCROLLER:ANCHOR_LINK_CLICKED",payload);});legacyEnv.bus.on("clear_cache",null,()=>{wowlEnv.bus.trigger("CLEAR-CACHES");});}
const reBSTooltip=/^bs-.*$/;__exports.cleanDomFromBootstrap=cleanDomFromBootstrap;function cleanDomFromBootstrap(){const body=document.body;const tooltips=body.querySelectorAll("body .tooltip");for(const tt of tooltips){if(Array.from(tt.classList).find((cls)=>reBSTooltip.test(cls))){tt.parentNode.removeChild(tt);}}}
__exports.makeLegacyNotificationService=makeLegacyNotificationService;function makeLegacyNotificationService(legacyEnv){return{dependencies:["notification"],start(env){let notifId=0;const idsToRemoveFn={};function notify({title,message,subtitle,buttons=[],sticky,type,className,onClose,}){if(subtitle){title=[title,subtitle].filter(Boolean).join(" ");}
if(!message&&title){message=title;title=undefined;}
buttons=buttons.map((button)=>{return{name:button.text,icon:button.icon,primary:button.primary,onClick:button.click,};});const removeFn=env.services.notification.add(_.escape(message),{sticky,title,type,className,onClose,buttons,messageIsHtml:true,});const id=++notifId;idsToRemoveFn[id]=removeFn;return id;}
function close(id,_,wait){const removeFn=idsToRemoveFn[id];delete idsToRemoveFn[id];if(wait){browser.setTimeout(()=>{removeFn(id);},wait);}else{removeFn(id);}}
legacyEnv.services.notification={notify,close};},};}
__exports.makeLegacyCrashManagerService=makeLegacyCrashManagerService;function makeLegacyCrashManagerService(legacyEnv){return{dependencies:["dialog"],start(env){legacyEnv.services.crash_manager={show_message(message){env.services.dialog.add(ErrorDialog,{traceback:message});},rpc_error(errorResponse){Promise.reject(makeErrorFromResponse(errorResponse));},};},};}
__exports.wrapSuccessOrFail=wrapSuccessOrFail;function wrapSuccessOrFail(promise,{on_success,on_fail}={}){return promise.then(on_success||(()=>{})).catch((reason)=>{let alreadyThrown=false;if(on_fail){alreadyThrown=on_fail(reason)==="alreadyThrown";}
if(reason instanceof Error&&!alreadyThrown){throw reason;}});}
__exports.makeLegacyRainbowManService=makeLegacyRainbowManService;function makeLegacyRainbowManService(legacyEnv){return{dependencies:["effect"],start(env,{effect}){legacyEnv.bus.on("show-effect",null,(payload)=>{effect.add(payload);});},};}
return __exports;});;

/* /hr/static/src/models/employee/employee.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@hr/models/employee/employee',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,one2one}=require('@mail/model/model_field');const{insert,unlink}=require('@mail/model/model_field_command');function factory(dependencies){class Employee extends dependencies['mail.model']{static convertData(data){const data2={};if('id'in data){data2.id=data.id;}
if('user_id'in data){data2.hasCheckedUser=true;if(!data.user_id){data2.user=unlink();}else{const partnerNameGet=data['user_partner_id'];const partnerData={display_name:partnerNameGet[1],id:partnerNameGet[0],};const userNameGet=data['user_id'];const userData={id:userNameGet[0],partner:insert(partnerData),display_name:userNameGet[1],};data2.user=insert(userData);}}
return data2;}
static async performRpcRead({context,fields,ids}){const employeesData=await this.env.services.rpc({model:'hr.employee.public',method:'read',args:[ids],kwargs:{context,fields,},});this.messaging.models['hr.employee'].insert(employeesData.map(employeeData=>this.messaging.models['hr.employee'].convertData(employeeData)));}
static async performRpcSearchRead({context,domain,fields}){const employeesData=await this.env.services.rpc({model:'hr.employee.public',method:'search_read',kwargs:{context,domain,fields,},});this.messaging.models['hr.employee'].insert(employeesData.map(employeeData=>this.messaging.models['hr.employee'].convertData(employeeData)));}
async checkIsUser(){return this.messaging.models['hr.employee'].performRpcRead({ids:[this.id],fields:['user_id','user_partner_id'],context:{active_test:false},});}
async getChat(){if(!this.user&&!this.hasCheckedUser){await this.async(()=>this.checkIsUser());}
if(!this.user){this.env.services['notification'].notify({message:this.env._t("You can only chat with employees that have a dedicated user."),type:'info',});return;}
return this.user.getChat();}
async openChat(options){const chat=await this.async(()=>this.getChat());if(!chat){return;}
await this.async(()=>chat.open(options));return chat;}
async openProfile(){return this.messaging.openDocument({id:this.id,model:'hr.employee.public',});}}
Employee.fields={hasCheckedUser:attr({default:false,}),id:attr({readonly:true,required:true,}),partner:one2one('mail.partner',{inverse:'employee',related:'user.partner',}),user:one2one('mail.user',{inverse:'employee',}),};Employee.identifyingFields=['id'];Employee.modelName='hr.employee';return Employee;}
registerNewModel('hr.employee',factory);return __exports;});;

/* /hr/static/src/models/messaging/messaging.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@hr/models/messaging/messaging',async function(require){'use strict';let __exports={};const{registerInstancePatchModel,}=require('@mail/model/model_core');registerInstancePatchModel('mail.messaging','hr/static/src/models/messaging/messaging.js',{async getChat({employeeId}){if(employeeId){const employee=this.messaging.models['hr.employee'].insert({id:employeeId});return employee.getChat();}
return this._super(...arguments);},async openProfile({id,model}){if(model==='hr.employee'||model==='hr.employee.public'){const employee=this.messaging.models['hr.employee'].insert({id});return employee.openProfile();}
return this._super(...arguments);},});return __exports;});;

/* /hr/static/src/models/partner/partner.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@hr/models/partner/partner',async function(require){'use strict';let __exports={};const{registerInstancePatchModel,registerFieldPatchModel,}=require('@mail/model/model_core');const{attr,one2one}=require('@mail/model/model_field');registerInstancePatchModel('mail.partner','hr/static/src/models/partner/partner.js',{async checkIsEmployee(){await this.async(()=>this.messaging.models['hr.employee'].performRpcSearchRead({context:{active_test:false},domain:[['user_partner_id','=',this.id]],fields:['user_id','user_partner_id'],}));this.update({hasCheckedEmployee:true});},async openProfile(){const _super=this._super.bind(this,...arguments);if(!this.employee&&!this.hasCheckedEmployee){await this.async(()=>this.checkIsEmployee());}
if(this.employee){return this.employee.openProfile();}
return _super();},});registerFieldPatchModel('mail.partner','hr/static/src/models/partner/partner.js',{employee:one2one('hr.employee',{inverse:'partner',}),hasCheckedEmployee:attr({default:false,}),});return __exports;});;

/* /hr/static/src/models/user/user.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@hr/models/user/user',async function(require){'use strict';let __exports={};const{registerFieldPatchModel,}=require('@mail/model/model_core');const{one2one}=require('@mail/model/model_field');registerFieldPatchModel('mail.user','hr/static/src/models/user/user.js',{employee:one2one('hr.employee',{inverse:'user',}),});return __exports;});;

/* /im_livechat/static/src/components/discuss/discuss.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@im_livechat/components/discuss/discuss',async function(require){'use strict';let __exports={};const{Discuss}=require('@mail/components/discuss/discuss');const{patch}=require('web.utils');const components={Discuss};patch(components.Discuss.prototype,'im_livechat/static/src/components/discuss/discuss.js',{mobileNavbarTabs(...args){return[...this._super(...args),{icon:'fa fa-comments',id:'livechat',label:this.env._t("Livechat"),}];}});return __exports;});;

/* /im_livechat/static/src/components/notification_list/notification_list.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@im_livechat/components/notification_list/notification_list',async function(require){'use strict';let __exports={};const{NotificationList}=require('@mail/components/notification_list/notification_list');const{patch}=require('web.utils');const components={NotificationList};components.NotificationList._allowedFilters.push('livechat');patch(components.NotificationList.prototype,'im_livechat/static/src/components/notification_list/notification_list.js',{_getThreads(props){if(props.filter==='livechat'){return this.messaging.models['mail.thread'].all(thread=>thread.channel_type==='livechat'&&thread.isPinned&&thread.model==='mail.channel');}
return this._super(...arguments);},});return __exports;});;

/* /im_livechat/static/src/components/thread_needaction_preview/thread_needaction_preview.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@im_livechat/components/thread_needaction_preview/thread_needaction_preview',async function(require){'use strict';let __exports={};const{ThreadNeedactionPreview}=require('@mail/components/thread_needaction_preview/thread_needaction_preview');const{patch}=require('web.utils');const components={ThreadNeedactionPreview};patch(components.ThreadNeedactionPreview.prototype,'thread_needaction_preview',{image(...args){if(this.thread.channel_type==='livechat'){return'/mail/static/src/img/smiley/avatar.jpg';}
return this._super(...args);}});return __exports;});;

/* /im_livechat/static/src/components/thread_preview/thread_preview.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@im_livechat/components/thread_preview/thread_preview',async function(require){'use strict';let __exports={};const{ThreadPreview}=require('@mail/components/thread_preview/thread_preview');const{patch}=require('web.utils');const components={ThreadPreview};patch(components.ThreadPreview.prototype,'im_livechat/static/src/components/thread_preview/thread_preview.js',{image(...args){if(this.thread.channel_type==='livechat'){return'/mail/static/src/img/smiley/avatar.jpg';}
return this._super(...args);}});return __exports;});;

/* /im_livechat/static/src/models/chat_window/chat_window.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@im_livechat/models/chat_window/chat_window',async function(require){'use strict';let __exports={};const{registerInstancePatchModel}=require('@mail/model/model_core');registerInstancePatchModel('mail.chat_window','im_livechat/static/src/models/chat_window/chat_window.js',{close({notifyServer}={}){if(this.thread&&this.thread.model==='mail.channel'&&this.thread.channel_type==='livechat'&&this.thread.cache.isLoaded&&this.thread.messages.length===0){notifyServer=true;this.thread.unpin();}
this._super({notifyServer});}});return __exports;});;

/* /im_livechat/static/src/models/discuss/discuss.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@im_livechat/models/discuss/discuss',async function(require){'use strict';let __exports={};const{registerFieldPatchModel,registerInstancePatchModel}=require('@mail/model/model_core');const{one2one}=require('@mail/model/model_field');registerInstancePatchModel('mail.discuss','im_livechat/static/src/models/discuss/discuss.js',{onInputQuickSearch(value){if(!this.sidebarQuickSearchValue){this.categoryLivechat.open();}
return this._super(value);},});registerFieldPatchModel('mail.discuss','im_livechat/static/src/models/discuss/discuss.js',{categoryLivechat:one2one('mail.discuss_sidebar_category',{inverse:'discussAsLivechat',isCausal:true,}),});return __exports;});;

/* /im_livechat/static/src/models/discuss_sidebar_category/discuss_sidebar_category.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@im_livechat/models/discuss_sidebar_category/discuss_sidebar_category',async function(require){'use strict';let __exports={};const{registerFieldPatchModel,registerIdentifyingFieldsPatch}=require('@mail/model/model_core');const{one2one}=require('@mail/model/model_field');registerFieldPatchModel('mail.discuss_sidebar_category','im_livechat',{discussAsLivechat:one2one('mail.discuss',{inverse:'categoryLivechat',readonly:true,}),});registerIdentifyingFieldsPatch('mail.discuss_sidebar_category','im_livechat',identifyingFields=>{identifyingFields[0].push('discussAsLivechat');});return __exports;});;

/* /im_livechat/static/src/models/discuss_sidebar_category_item/discuss_sidebar_category_item.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@im_livechat/models/discuss_sidebar_category_item/discuss_sidebar_category_item',async function(require){'use strict';let __exports={};const{registerInstancePatchModel}=require('@mail/model/model_core');registerInstancePatchModel('mail.discuss_sidebar_category_item','im_livechat/static/src/models/discuss_sidebar_category_item/discuss_sidebar_category_item.js',{_computeAvatarUrl(){if(this.channelType==='livechat'){if(this.channel.correspondent&&this.channel.correspondent.id>0){return this.channel.correspondent.avatarUrl;}}
return this._super();},_computeCategoryCounterContribution(){switch(this.channel.channel_type){case'livechat':return this.channel.localMessageUnreadCounter>0?1:0;}
return this._super();},_computeCounter(){if(this.channelType==='livechat'){return this.channel.localMessageUnreadCounter;}
return this._super();},_computeHasUnpinCommand(){if(this.channelType==='livechat'){return!this.channel.localMessageUnreadCounter;}
return this._super();},_computeHasThreadIcon(){if(this.channelType==='livechat'){return false;}
return this._super();},});return __exports;});;

/* /im_livechat/static/src/models/message/message.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@im_livechat/models/message/message',async function(require){'use strict';let __exports={};const{registerClassPatchModel,registerInstancePatchModel,}=require('@mail/model/model_core');registerClassPatchModel('mail.message','im_livechat/static/src/models/message/message.js',{convertData(data){const data2=this._super(data);if('author_id'in data){if(data.author_id[2]){data2.author=[['insert-and-replace',{id:data.author_id[0],livechat_username:data.author_id[2],}],];}}
return data2;},});registerInstancePatchModel('mail.message','im_livechat/static/src/models/message/message.js',{_computeHasReactionIcon(){if(this.originThread&&this.originThread.channel_type==='livechat'){return false;}
return this._super();},});return __exports;});;

/* /im_livechat/static/src/models/message_action_list/message_action_list.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@im_livechat/models/message_action_list/message_action_list',async function(require){'use strict';let __exports={};const{registerInstancePatchModel}=require('@mail/model/model_core');registerInstancePatchModel('mail.message_action_list','im_livechat/static/src/models/message_action_list/message_action_list.js',{_computeHasReplyIcon(){if(this.message&&this.message.originThread&&this.message.originThread.channel_type==='livechat'){return false;}
return this._super();}});return __exports;});;

/* /im_livechat/static/src/models/messaging_initializer/messaging_initializer.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@im_livechat/models/messaging_initializer/messaging_initializer',async function(require){'use strict';let __exports={};const{registerInstancePatchModel}=require('@mail/model/model_core');const{insert,insertAndReplace}=require('@mail/model/model_field_command');registerInstancePatchModel('mail.messaging_initializer','im_livechat/static/src/models/messaging_initializer/messaging_initializer.js',{_initResUsersSettings({is_discuss_sidebar_category_livechat_open}){this.messaging.discuss.update({categoryLivechat:insertAndReplace({isServerOpen:is_discuss_sidebar_category_livechat_open,name:this.env._t("Livechat"),serverStateKey:'is_discuss_sidebar_category_livechat_open',sortComputeMethod:'last_action',supportedChannelTypes:['livechat'],}),});this._super(...arguments);},_initCommands(){this._super();this.messaging.update({commands:insert({channel_types:['livechat'],help:this.env._t("See 15 last visited pages"),methodName:'execute_command_history',name:"history",}),});},});return __exports;});;

/* /im_livechat/static/src/models/messaging_notification_handler/messaging_notification_handler.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@im_livechat/models/messaging_notification_handler/messaging_notification_handler',async function(require){'use strict';let __exports={};const{registerInstancePatchModel}=require('@mail/model/model_core');registerInstancePatchModel('mail.messaging_notification_handler','im_livechat/static/src/models/messaging_notification_handler/messaging_notification_handler.js',{_handleNotificationResUsersSettings(settings){if('is_discuss_sidebar_category_livechat_open'in settings){this.messaging.discuss.categoryLivechat.update({isServerOpen:settings.is_discuss_sidebar_category_livechat_open,});}
this._super(settings);},_handleNotificationChannelPartnerTypingStatus({channel_id,is_typing,livechat_username,partner_id,partner_name}){const channel=this.messaging.models['mail.thread'].findFromIdentifyingData({id:channel_id,model:'mail.channel',});if(!channel){return;}
let partnerId;let partnerName;if(this.messaging.publicPartners.some(publicPartner=>publicPartner.id===partner_id)){partnerId=channel.correspondent.id;partnerName=channel.correspondent.name;}else{partnerId=partner_id;partnerName=partner_name;}
const data={channel_id,is_typing,partner_id:partnerId,partner_name:partnerName,};if(livechat_username){delete data.partner_name;this.models['mail.partner'].insert({id:partnerId,livechat_username:livechat_username,});}
this._super(data);},});return __exports;});;

/* /im_livechat/static/src/models/partner/partner.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@im_livechat/models/partner/partner',async function(require){'use strict';let __exports={};const{registerClassPatchModel,registerFieldPatchModel}=require('@mail/model/model_core');const{attr}=require('@mail/model/model_field');let nextPublicId=-1;registerClassPatchModel('mail.partner','im_livechat/static/src/models/partner/partner.js',{convertData(data){const data2=this._super(data);if('livechat_username'in data){delete data2.name;delete data2.email;delete data2.im_status;data2.livechat_username=data.livechat_username;}
return data2;},getNextPublicId(){const id=nextPublicId;nextPublicId-=1;return id;},});registerFieldPatchModel('mail.partner','im_livechat/static/src/models/partner/partner.js',{livechat_username:attr(),});return __exports;});;

/* /im_livechat/static/src/models/thread/thread.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@im_livechat/models/thread/thread',async function(require){'use strict';let __exports={};const{registerClassPatchModel,registerInstancePatchModel,}=require('@mail/model/model_core');const{insert,link,unlink}=require('@mail/model/model_field_command');registerClassPatchModel('mail.thread','im_livechat/static/src/models/thread/thread.js',{convertData(data){const data2=this._super(data);if('livechat_visitor'in data&&data.livechat_visitor){if(!data2.members){data2.members=[];}
if(!data.livechat_visitor.id){data2.members.push(unlink(this.messaging.publicPartners));const partner=this.messaging.models['mail.partner'].create(Object.assign(this.messaging.models['mail.partner'].convertData(data.livechat_visitor),{id:this.messaging.models['mail.partner'].getNextPublicId()}));data2.members.push(link(partner));data2.correspondent=link(partner);}else{const partnerData=this.messaging.models['mail.partner'].convertData(data.livechat_visitor);data2.members.push(insert(partnerData));data2.correspondent=insert(partnerData);}}
return data2;},});registerInstancePatchModel('mail.thread','im_livechat/static/src/models/thread/thread.js',{getMemberName(partner){if(this.channel_type==='livechat'&&partner.livechat_username){return partner.livechat_username;}
return this._super(partner);},_computeCorrespondent(){if(this.channel_type==='livechat'){return;}
return this._super();},_computeDisplayName(){if(this.channel_type==='livechat'&&this.correspondent){if(this.correspondent.country){return`${this.correspondent.nameOrDisplayName} (${this.correspondent.country.name})`;}
return this.correspondent.nameOrDisplayName;}
return this._super();},_computeHasInviteFeature(){if(this.channel_type==='livechat'){return true;}
return this._super();},_computeHasMemberListFeature(){if(this.channel_type==='livechat'){return true;}
return this._super();},_computeIsChatChannel(){return this.channel_type==='livechat'||this._super();},_getDiscussSidebarCategory(){switch(this.channel_type){case'livechat':return this.messaging.discuss.categoryLivechat;}
return this._super();}});return __exports;});;

/* /sms/static/src/components/notification_group/notification_group.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@sms/components/notification_group/notification_group',async function(require){'use strict';let __exports={};const{NotificationGroup}=require('@mail/components/notification_group/notification_group');const{patch}=require('web.utils');patch(NotificationGroup.prototype,'sms/static/src/components/notification_group/notification_group.js',{image(){if(this.group.notification_type==='sms'){return'/sms/static/img/sms_failure.svg';}
return this._super(...arguments);},});return __exports;});;

/* /sms/static/src/models/message/message.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@sms/models/message/message',async function(require){'use strict';let __exports={};const{registerInstancePatchModel,}=require('@mail/model/model_core');registerInstancePatchModel('mail.message','sms/static/src/models/message/message.js',{openResendAction(){if(this.message_type==='sms'){this.env.bus.trigger('do-action',{action:'sms.sms_resend_action',options:{additional_context:{default_mail_message_id:this.id,},},});}else{this._super(...arguments);}},});return __exports;});;

/* /sms/static/src/models/notification_group/notification_group.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@sms/models/notification_group/notification_group',async function(require){'use strict';let __exports={};const{registerInstancePatchModel,}=require('@mail/model/model_core');registerInstancePatchModel('mail.notification_group','sms/static/src/models/notification_group/notification_group.js',{openCancelAction(){if(this.notification_type!=='sms'){return this._super(...arguments);}
this.env.bus.trigger('do-action',{action:'sms.sms_cancel_action',options:{additional_context:{default_model:this.res_model,unread_counter:this.notifications.length,},},});},_openDocuments(){if(this.notification_type!=='sms'){return this._super(...arguments);}
this.env.bus.trigger('do-action',{action:{name:this.env._t("SMS Failures"),type:'ir.actions.act_window',view_mode:'kanban,list,form',views:[[false,'kanban'],[false,'list'],[false,'form']],target:'current',res_model:this.res_model,domain:[['message_has_sms_error','=',true]],},});if(this.messaging.device.isMobile){this.messaging.messagingMenu.close();}},});return __exports;});;

/* /crm_livechat/static/src/models/messaging_initializer/messaging_initializer.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@crm_livechat/models/messaging_initializer/messaging_initializer',async function(require){'use strict';let __exports={};const{registerInstancePatchModel}=require('@mail/model/model_core');const{insert}=require('@mail/model/model_field_command');registerInstancePatchModel('mail.messaging_initializer','crm_livechat',{_initCommands(){this._super();this.messaging.update({commands:insert({help:this.env._t("Create a new lead (/lead lead title)"),methodName:'execute_command_lead',name:"lead",}),});},});return __exports;});;

/* /mail_bot/static/src/models/messaging_initializer/messaging_initializer.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@mail_bot/models/messaging_initializer/messaging_initializer',async function(require){'use strict';let __exports={};const{registerInstancePatchModel}=require('@mail/model/model_core');registerInstancePatchModel('mail.messaging_initializer','mail_bot/static/src/models/messaging_initializer/messaging_initializer.js',{async _initializeOdooBot(){const data=await this.async(()=>this.env.services.rpc({model:'mail.channel',method:'init_odoobot',}));if(!data){return;}
this.env.session.odoobot_initialized=true;},async start(){await this.async(()=>this._super());if('odoobot_initialized'in this.env.session&&!this.env.session.odoobot_initialized){this._initializeOdooBot();}},});return __exports;});;

/* /snailmail/static/src/components/message/message.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@snailmail/components/message/message',async function(require){'use strict';let __exports={};const{Message}=require('@mail/components/message/message');const{patch}=require('web.utils');const{useState}=owl;patch(Message.prototype,'snailmail/static/src/components/message/message.js',{_constructor(){this._super(...arguments);this.snailmailState=useState({hasDialog:false,});},_onClickFailure(){if(this.messageView.message.message_type==='snailmail'){switch(this.messageView.message.notifications[0].failure_type){case'sn_credit':this.messaging.fetchSnailmailCreditsUrl();this.snailmailState.hasDialog=true;break;case'sn_error':this.snailmailState.hasDialog=true;break;case'sn_fields':this.messageView.message.openMissingFieldsLetterAction();break;case'sn_format':this.messageView.message.openFormatLetterAction();break;case'sn_price':this.snailmailState.hasDialog=true;break;case'sn_trial':this.messaging.fetchSnailmailCreditsUrlTrial();this.snailmailState.hasDialog=true;break;}}else{this._super(...arguments);}},_onDialogClosedSnailmailError(){this.snailmailState.hasDialog=false;},});return __exports;});;

/* /snailmail/static/src/components/notification_group/notification_group.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@snailmail/components/notification_group/notification_group',async function(require){'use strict';let __exports={};const{NotificationGroup}=require('@mail/components/notification_group/notification_group');const{patch}=require('web.utils');patch(NotificationGroup.prototype,'snailmail/static/src/components/notification_group/notification_group.js',{image(){if(this.group.notification_type==='snail'){return'/snailmail/static/img/snailmail_failure.png';}
return this._super(...arguments);},});return __exports;});;

/* /snailmail/static/src/components/snailmail_error_dialog/snailmail_error_dialog.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@snailmail/components/snailmail_error_dialog/snailmail_error_dialog',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const Dialog=require('web.OwlDialog');const{Component}=owl;const{useRef}=owl.hooks;class SnailmailErrorDialog extends Component{constructor(...args){super(...args);this._dialogRef=useRef('dialog');}
get hasCreditsError(){return(this.notification.failure_type==='sn_credit'||this.notification.failure_type==='sn_trial');}
get message(){return this.messaging&&this.messaging.models['mail.message'].get(this.props.messageLocalId);}
get notification(){return this.message.notifications[0];}
get title(){return this.env._t("Failed letter");}
_onClickCancelLetter(){this._dialogRef.comp._close();this.message.cancelLetter();}
_onClickClose(){this._dialogRef.comp._close();}
_onClickResendLetter(){this._dialogRef.comp._close();this.message.resendLetter();}}
Object.assign(SnailmailErrorDialog,{components:{Dialog},props:{messageLocalId:String,},template:'snailmail.SnailmailErrorDialog',});registerMessagingComponent(SnailmailErrorDialog);__exports[Symbol.for("default")]=SnailmailErrorDialog;return __exports;});;

/* /snailmail/static/src/components/snailmail_notification_popover/snailmail_notification_popover.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@snailmail/components/snailmail_notification_popover/snailmail_notification_popover',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;class SnailmailNotificationPopover extends Component{get iconClass(){switch(this.notification.notification_status){case'sent':return'fa fa-check';case'ready':return'fa fa-clock-o';case'canceled':return'fa fa-trash-o';default:return'fa fa-exclamation text-danger';}}
get iconTitle(){switch(this.notification.notification_status){case'sent':return this.env._t("Sent");case'ready':return this.env._t("Awaiting Dispatch");case'canceled':return this.env._t("Canceled");default:return this.env._t("Error");}}
get message(){return this.messaging&&this.messaging.models['mail.message'].get(this.props.messageLocalId);}
get notification(){return this.message.notifications[0];}}
Object.assign(SnailmailNotificationPopover,{props:{messageLocalId:String,},template:'snailmail.SnailmailNotificationPopover',});registerMessagingComponent(SnailmailNotificationPopover);__exports[Symbol.for("default")]=SnailmailNotificationPopover;return __exports;});;

/* /snailmail/static/src/models/message/message.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@snailmail/models/message/message',async function(require){'use strict';let __exports={};const{registerInstancePatchModel}=require('@mail/model/model_core');registerInstancePatchModel('mail.message','snailmail/static/src/models/message.message.js',{async cancelLetter(){await this.async(()=>this.env.services.rpc({model:'mail.message',method:'cancel_letter',args:[[this.id]],}));},openFormatLetterAction(){this.env.bus.trigger('do-action',{action:'snailmail.snailmail_letter_format_error_action',options:{additional_context:{message_id:this.id,},},});},async openMissingFieldsLetterAction(){const letterIds=await this.async(()=>this.env.services.rpc({model:'snailmail.letter',method:'search',args:[[['message_id','=',this.id]]],}));this.env.bus.trigger('do-action',{action:'snailmail.snailmail_letter_missing_required_fields_action',options:{additional_context:{default_letter_id:letterIds[0],},},});},async resendLetter(){await this.async(()=>this.env.services.rpc({model:'mail.message',method:'send_letter',args:[[this.id]],}));},});return __exports;});;

/* /snailmail/static/src/models/messaging/messaging.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@snailmail/models/messaging/messaging',async function(require){'use strict';let __exports={};const{registerInstancePatchModel,registerFieldPatchModel,}=require('@mail/model/model_core');const{attr}=require('@mail/model/model_field');registerInstancePatchModel('mail.messaging','snailmail/static/src/models/messaging/messaging.js',{async fetchSnailmailCreditsUrl(){const snailmail_credits_url=await this.async(()=>this.env.services.rpc({model:'iap.account',method:'get_credits_url',args:['snailmail'],}));this.update({snailmail_credits_url,});},async fetchSnailmailCreditsUrlTrial(){const snailmail_credits_url_trial=await this.async(()=>this.env.services.rpc({model:'iap.account',method:'get_credits_url',args:['snailmail','',0,true],}));this.update({snailmail_credits_url_trial,});},});registerFieldPatchModel('mail.messaging','snailmail/static/src/models/messaging/messaging.js',{snailmail_credits_url:attr(),snailmail_credits_url_trial:attr(),});return __exports;});;

/* /snailmail/static/src/models/notification_group/notification_group.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@snailmail/models/notification_group/notification_group',async function(require){'use strict';let __exports={};const{registerInstancePatchModel,}=require('@mail/model/model_core');registerInstancePatchModel('mail.notification_group','snailmail/static/src/models/notification_group/notification_group.js',{openCancelAction(){if(this.notification_type!=='snail'){return this._super(...arguments);}
this.env.bus.trigger('do-action',{action:'snailmail.snailmail_letter_cancel_action',options:{additional_context:{default_model:this.res_model,unread_counter:this.notifications.length,},},});},_openDocuments(){if(this.notification_type!=='snail'){return this._super(...arguments);}
this.env.bus.trigger('do-action',{action:{name:this.env._t("Snailmail Failures"),type:'ir.actions.act_window',view_mode:'kanban,list,form',views:[[false,'kanban'],[false,'list'],[false,'form']],target:'current',res_model:this.res_model,domain:[['message_ids.snailmail_error','=',true]],},});if(this.messaging.device.isMobile){this.messaging.messagingMenu.close();}},});return __exports;});;

/* /website_livechat/static/src/components/visitor_banner/visitor_banner.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@website_livechat/components/visitor_banner/visitor_banner',async function(require){'use strict';let __exports={};const{registerMessagingComponent}=require('@mail/utils/messaging_component');const{Component}=owl;class VisitorBanner extends Component{get visitor(){return this.messaging&&this.messaging.models['website_livechat.visitor'].get(this.props.visitorLocalId);}}
Object.assign(VisitorBanner,{props:{visitorLocalId:String,},template:'website_livechat.VisitorBanner',});registerMessagingComponent(VisitorBanner);__exports[Symbol.for("default")]=VisitorBanner;return __exports;});;

/* /website_livechat/static/src/models/messaging_notification_handler/messaging_notification_handler.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@website_livechat/models/messaging_notification_handler/messaging_notification_handler',async function(require){'use strict';let __exports={};const{registerInstancePatchModel}=require('@mail/model/model_core');registerInstancePatchModel('mail.messaging_notification_handler','website_livechat/static/src/models/messaging_notification_handler/messaging_notification_handler.js',{async _handleNotification(message){if(message.type==='website_livechat.send_chat_request'){const convertedData=this.messaging.models['mail.thread'].convertData(Object.assign({model:'mail.channel'},message.payload));this.messaging.models['mail.thread'].insert(convertedData);const channel=this.messaging.models['mail.thread'].findFromIdentifyingData({id:message.payload.id,model:'mail.channel',});this.messaging.chatWindowManager.openThread(channel,{makeActive:true,});}
return this._super(message);},});return __exports;});;

/* /website_livechat/static/src/models/thread/thread.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@website_livechat/models/thread/thread',async function(require){'use strict';let __exports={};const{registerClassPatchModel,registerFieldPatchModel,}=require('@mail/model/model_core');const{many2one}=require('@mail/model/model_field');const{insert,unlink}=require('@mail/model/model_field_command');registerClassPatchModel('mail.thread','website_livechat/static/src/models/thread/thread.js',{convertData(data){const data2=this._super(data);if('visitor'in data){if(data.visitor){data2.visitor=insert(this.messaging.models['website_livechat.visitor'].convertData(data.visitor));}else{data2.visitor=unlink();}}
return data2;},});registerFieldPatchModel('mail.thread','website_livechat/static/src/models/thread/thread.js',{visitor:many2one('website_livechat.visitor',{inverse:'threads',}),});return __exports;});;

/* /website_livechat/static/src/models/thread_view/thread_view.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@website_livechat/models/thread_view/thread_view',async function(require){'use strict';let __exports={};const{registerFieldPatchModel,registerInstancePatchModel,}=require('@mail/model/model_core');const{attr}=require('@mail/model/model_field');registerInstancePatchModel('mail.thread_view','website_livechat/static/src/models/thread_view/thread_view.js',{_computeHasVisitorBanner(){return Boolean(this.thread&&this.thread.visitor&&this.threadViewer&&this.threadViewer.discuss);},});registerFieldPatchModel('mail.thread_view','website_livechat/static/src/models/thread_view/thread_view.js',{hasVisitorBanner:attr({compute:'_computeHasVisitorBanner',}),});return __exports;});;

/* /website_livechat/static/src/models/visitor/visitor.js defined in bundle 'mail.assets_discuss_public' */
odoo.define('@website_livechat/models/visitor/visitor',async function(require){'use strict';let __exports={};const{registerNewModel}=require('@mail/model/model_core');const{attr,many2one,one2many}=require('@mail/model/model_field');const{insert,link,unlink}=require('@mail/model/model_field_command');function factory(dependencies){class Visitor extends dependencies['mail.model']{static convertData(data){const data2={};if('country_id'in data){if(data.country_id){data2.country=insert({id:data.country_id,code:data.country_code,});}else{data2.country=unlink();}}
if('history'in data){data2.history=data.history;}
if('id'in data){data2.id=data.id;}
if('is_connected'in data){data2.is_connected=data.is_connected;}
if('lang_name'in data){data2.lang_name=data.lang_name;}
if('display_name'in data){data2.display_name=data.display_name;}
if('partner_id'in data){if(data.partner_id){data2.partner=insert({id:data.partner_id});}else{data2.partner=unlink();}}
if('website_name'in data){data2.website_name=data.website_name;}
return data2;}
_computeAvatarUrl(){if(!this.partner){return'/mail/static/src/img/smiley/avatar.jpg';}
return this.partner.avatarUrl;}
_computeCountry(){if(this.partner&&this.partner.country){return link(this.partner.country);}
if(this.country){return link(this.country);}
return unlink();}
_computeNameOrDisplayName(){if(this.partner){return this.partner.nameOrDisplayName;}
return this.display_name;}}
Visitor.fields={avatarUrl:attr({compute:'_computeAvatarUrl',}),country:many2one('mail.country',{compute:'_computeCountry',}),display_name:attr(),history:attr(),id:attr({readonly:true,required:true,}),is_connected:attr(),lang_name:attr(),nameOrDisplayName:attr({compute:'_computeNameOrDisplayName',}),partner:many2one('mail.partner'),threads:one2many('mail.thread',{inverse:'visitor',}),website_name:attr(),};Visitor.identifyingFields=['id'];Visitor.modelName='website_livechat.visitor';return Visitor;}
registerNewModel('website_livechat.visitor',factory);return __exports;});