@plusscommunities/pluss-core-app 8.0.4 → 8.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,7 +4,7 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
4
4
  import React, { Component } from 'react';
5
5
  import { View, TouchableOpacity, Text, StyleSheet, ActivityIndicator } from 'react-native';
6
6
  import { Icon } from '@rneui/themed';
7
- // import * as DocumentPicker from 'expo-document-picker';
7
+ import * as DocumentPicker from 'expo-document-picker';
8
8
  import { connect } from 'react-redux';
9
9
  import Config from '../config';
10
10
  import { fileActions } from '../apis';
@@ -23,22 +23,21 @@ class DocumentUploader extends Component {
23
23
  allowedTypes,
24
24
  multiple
25
25
  } = this.props;
26
+ try {
27
+ const result = await DocumentPicker.getDocumentAsync({
28
+ type: allowedTypes,
29
+ copyToCacheDirectory: true,
30
+ multiple: multiple || false
31
+ });
32
+ // console.log('pickDocument', JSON.stringify(result, null, 2));
26
33
 
27
- // try {
28
- // const result = await DocumentPicker.getDocumentAsync({
29
- // type: allowedTypes,
30
- // copyToCacheDirectory: true,
31
- // multiple: multiple || false,
32
- // });
33
- // // console.log('pickDocument', JSON.stringify(result, null, 2));
34
-
35
- // if (!result.canceled) {
36
- // await this.handleDocumentPicked(result);
37
- // }
38
- // } catch (error) {
39
- // console.log('Document picker error:', error);
40
- // this.props.onUploadFailed(null, error.message);
41
- // }
34
+ if (!result.canceled) {
35
+ await this.handleDocumentPicked(result);
36
+ }
37
+ } catch (error) {
38
+ console.log('Document picker error:', error);
39
+ this.props.onUploadFailed(null, error.message);
40
+ }
42
41
  });
43
42
  _defineProperty(this, "handleDocumentPicked", async documentResult => {
44
43
  const {
@@ -1 +1 @@
1
- {"version":3,"names":["React","Component","View","TouchableOpacity","Text","StyleSheet","ActivityIndicator","Icon","connect","Config","fileActions","getValueOrDefault","TEXT_DARK","getMainBrandingColourFromState","DEFAULT_DOCUMENT_NAME","DocumentUploader","constructor","args","_defineProperty","isUploading","uploadProgress","allowedTypes","multiple","props","documentResult","assets","userId","setState","uploadPromises","map","asset","name","uri","mimeType","file","fileExt","includes","lastDotIndex","lastIndexOf","substring","mimeTypeParts","split","startsWith","fileName","uploadUri","getUploadUrl","onUploadStarted","toUpperCase","res","uploadUserMediaWithProgress","progress","onUploadProgress","fileUrl","env","baseUploadsUrl","key","onUploadSuccess","console","log","success","url","error","onUploadFailed","message","results","Promise","all","buttonTitle","buttonStyle","buttonTextStyle","disabled","state","mainColor","createElement","style","styles","uploadButton","borderColor","onPress","pickDocument","activeOpacity","buttonContent","color","type","size","icon","buttonText","progressContainer","progressBar","progressFill","width","progressText","Math","round","render","container","renderUploadButton","renderProgress","create","marginVertical","flexDirection","alignItems","justifyContent","paddingVertical","paddingHorizontal","borderRadius","backgroundColor","borderWidth","fontSize","fontWeight","marginLeft","marginRight","marginTop","height","overflow","mapStateToProps","user","colourBrandingMain"],"sources":["DocumentUploader.js"],"sourcesContent":["import React, { Component } from 'react';\nimport { View, TouchableOpacity, Text, StyleSheet, ActivityIndicator } from 'react-native';\nimport { Icon } from '@rneui/themed';\n// import * as DocumentPicker from 'expo-document-picker';\nimport { connect } from 'react-redux';\nimport Config from '../config';\nimport { fileActions } from '../apis';\nimport { getValueOrDefault } from '../helper';\nimport { TEXT_DARK, getMainBrandingColourFromState } from '../colours';\n\nconst DEFAULT_DOCUMENT_NAME = 'document';\n\nclass DocumentUploader extends Component {\n static defaultProps = {\n allowedTypes: ['application/pdf'],\n buttonTitle: 'Upload Document',\n buttonStyle: {},\n buttonTextStyle: {},\n onUploadStarted: () => {},\n onUploadSuccess: () => {},\n onUploadFailed: () => {},\n onUploadProgress: null,\n userId: null,\n fileName: null,\n disabled: false,\n };\n\n state = {\n isUploading: false,\n uploadProgress: 0,\n };\n\n pickDocument = async () => {\n const { allowedTypes, multiple } = this.props;\n\n // try {\n // const result = await DocumentPicker.getDocumentAsync({\n // type: allowedTypes,\n // copyToCacheDirectory: true,\n // multiple: multiple || false,\n // });\n // // console.log('pickDocument', JSON.stringify(result, null, 2));\n\n // if (!result.canceled) {\n // await this.handleDocumentPicked(result);\n // }\n // } catch (error) {\n // console.log('Document picker error:', error);\n // this.props.onUploadFailed(null, error.message);\n // }\n };\n\n handleDocumentPicked = async documentResult => {\n const { assets } = documentResult;\n const { userId } = this.props;\n\n try {\n this.setState({ isUploading: true, uploadProgress: 0 });\n\n // Process each asset in parallel\n const uploadPromises = assets.map(async asset => {\n const { name, uri, mimeType } = asset;\n\n let file, fileExt;\n if (name && name.includes('.')) {\n const lastDotIndex = name.lastIndexOf('.');\n file = name.substring(0, lastDotIndex);\n fileExt = name.substring(lastDotIndex + 1);\n } else {\n // Fallback: extract extension from mimeType\n file = name || 'document';\n if (mimeType) {\n const mimeTypeParts = mimeType.split('/');\n // Handle specific MIME type mappings\n if (mimeType === 'application/pdf') fileExt = 'pdf';\n else if (mimeType.startsWith('image/')) fileExt = mimeTypeParts[1];\n else if (mimeType.startsWith('text/')) fileExt = 'txt';\n else fileExt = mimeTypeParts[1] || 'pdf';\n } else {\n fileExt = 'pdf';\n }\n }\n\n // Generate a unique filename if not provided\n const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_DOCUMENT_NAME)}.${fileExt}`;\n const uploadUri = fileActions.getUploadUrl(userId, fileName);\n // console.log('handleDocumentPicked', JSON.stringify({ uploadUri, uri, name, fileName, mimeType, file, fileExt }, null, 2));\n\n try {\n // Notify parent component that upload has started for this file\n this.props.onUploadStarted(uploadUri, uri, file, fileExt.toUpperCase());\n\n const res = await fileActions.uploadUserMediaWithProgress(uri, uploadUri, progress => {\n if (this.props.onUploadProgress) this.props.onUploadProgress(progress);\n });\n\n const fileUrl = Config.env.baseUploadsUrl + res.key;\n this.props.onUploadSuccess(fileUrl, uploadUri);\n console.log('Upload success', fileUrl);\n return { success: true, url: fileUrl, uploadUri };\n } catch (error) {\n console.error(`Upload failed for ${name}:`, error);\n this.props.onUploadFailed(uploadUri, error.message);\n return { success: false, error, uploadUri };\n }\n });\n\n // Wait for all uploads to complete\n const results = await Promise.all(uploadPromises);\n return results;\n } catch (error) {\n console.error('Document upload error:', error);\n return [];\n } finally {\n this.setState({ isUploading: false, uploadProgress: 0 });\n }\n };\n\n renderUploadButton = () => {\n const { buttonTitle, buttonStyle, buttonTextStyle, disabled } = this.props;\n const { isUploading } = this.state;\n const mainColor = getMainBrandingColourFromState(this.props);\n\n return (\n <TouchableOpacity\n style={[styles.uploadButton, { borderColor: mainColor }, buttonStyle]}\n onPress={this.pickDocument}\n disabled={isUploading || disabled}\n activeOpacity={0.7}\n >\n <View style={styles.buttonContent}>\n {isUploading ? (\n <ActivityIndicator color={mainColor} />\n ) : (\n <Icon name=\"attachment\" type=\"entypo\" color={mainColor} size={18} style={styles.icon} />\n )}\n <Text style={[styles.buttonText, { color: mainColor }, buttonTextStyle]}>{buttonTitle}</Text>\n </View>\n </TouchableOpacity>\n );\n };\n\n renderProgress = () => {\n const { uploadProgress } = this.state;\n if (uploadProgress <= 0 || uploadProgress >= 1) return null;\n\n return (\n <View style={styles.progressContainer}>\n <View style={styles.progressBar}>\n <View style={[styles.progressFill, { width: `${uploadProgress * 100}%` }]} />\n </View>\n <Text style={styles.progressText}>{Math.round(uploadProgress * 100)}%</Text>\n </View>\n );\n };\n\n render() {\n return (\n <View style={styles.container}>\n {this.renderUploadButton()}\n {this.renderProgress()}\n </View>\n );\n }\n}\n\nconst styles = StyleSheet.create({\n container: {\n marginVertical: 10,\n },\n uploadButton: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n paddingVertical: 8,\n paddingHorizontal: 16,\n borderRadius: 6,\n backgroundColor: '#fff',\n borderWidth: 1,\n borderColor: '#007AFF',\n },\n buttonContent: {\n flexDirection: 'row',\n alignItems: 'center',\n },\n buttonText: {\n color: '#fff',\n fontSize: 16,\n fontWeight: '500',\n marginLeft: 8,\n },\n icon: {\n marginRight: 8,\n },\n progressContainer: {\n marginTop: 8,\n alignItems: 'center',\n },\n progressBar: {\n height: 4,\n width: '100%',\n backgroundColor: '#E0E0E0',\n borderRadius: 2,\n overflow: 'hidden',\n },\n progressFill: {\n height: '100%',\n backgroundColor: '#4CAF50',\n },\n progressText: {\n marginTop: 4,\n fontSize: 12,\n color: TEXT_DARK,\n },\n});\n\nconst mapStateToProps = state => {\n const { user } = state;\n return {\n user,\n colourBrandingMain: getMainBrandingColourFromState(state),\n };\n};\n\nexport default connect(mapStateToProps)(DocumentUploader);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","Component","View","TouchableOpacity","Text","StyleSheet","ActivityIndicator","Icon","DocumentPicker","connect","Config","fileActions","getValueOrDefault","TEXT_DARK","getMainBrandingColourFromState","DEFAULT_DOCUMENT_NAME","DocumentUploader","constructor","args","_defineProperty","isUploading","uploadProgress","allowedTypes","multiple","props","result","getDocumentAsync","type","copyToCacheDirectory","canceled","handleDocumentPicked","error","console","log","onUploadFailed","message","documentResult","assets","userId","setState","uploadPromises","map","asset","name","uri","mimeType","file","fileExt","includes","lastDotIndex","lastIndexOf","substring","mimeTypeParts","split","startsWith","fileName","uploadUri","getUploadUrl","onUploadStarted","toUpperCase","res","uploadUserMediaWithProgress","progress","onUploadProgress","fileUrl","env","baseUploadsUrl","key","onUploadSuccess","success","url","results","Promise","all","buttonTitle","buttonStyle","buttonTextStyle","disabled","state","mainColor","createElement","style","styles","uploadButton","borderColor","onPress","pickDocument","activeOpacity","buttonContent","color","size","icon","buttonText","progressContainer","progressBar","progressFill","width","progressText","Math","round","render","container","renderUploadButton","renderProgress","create","marginVertical","flexDirection","alignItems","justifyContent","paddingVertical","paddingHorizontal","borderRadius","backgroundColor","borderWidth","fontSize","fontWeight","marginLeft","marginRight","marginTop","height","overflow","mapStateToProps","user","colourBrandingMain"],"sources":["DocumentUploader.js"],"sourcesContent":["import React, { Component } from 'react';\nimport { View, TouchableOpacity, Text, StyleSheet, ActivityIndicator } from 'react-native';\nimport { Icon } from '@rneui/themed';\nimport * as DocumentPicker from 'expo-document-picker';\nimport { connect } from 'react-redux';\nimport Config from '../config';\nimport { fileActions } from '../apis';\nimport { getValueOrDefault } from '../helper';\nimport { TEXT_DARK, getMainBrandingColourFromState } from '../colours';\n\nconst DEFAULT_DOCUMENT_NAME = 'document';\n\nclass DocumentUploader extends Component {\n static defaultProps = {\n allowedTypes: ['application/pdf'],\n buttonTitle: 'Upload Document',\n buttonStyle: {},\n buttonTextStyle: {},\n onUploadStarted: () => {},\n onUploadSuccess: () => {},\n onUploadFailed: () => {},\n onUploadProgress: null,\n userId: null,\n fileName: null,\n disabled: false,\n };\n\n state = {\n isUploading: false,\n uploadProgress: 0,\n };\n\n pickDocument = async () => {\n const { allowedTypes, multiple } = this.props;\n\n try {\n const result = await DocumentPicker.getDocumentAsync({\n type: allowedTypes,\n copyToCacheDirectory: true,\n multiple: multiple || false,\n });\n // console.log('pickDocument', JSON.stringify(result, null, 2));\n\n if (!result.canceled) {\n await this.handleDocumentPicked(result);\n }\n } catch (error) {\n console.log('Document picker error:', error);\n this.props.onUploadFailed(null, error.message);\n }\n };\n\n handleDocumentPicked = async documentResult => {\n const { assets } = documentResult;\n const { userId } = this.props;\n\n try {\n this.setState({ isUploading: true, uploadProgress: 0 });\n\n // Process each asset in parallel\n const uploadPromises = assets.map(async asset => {\n const { name, uri, mimeType } = asset;\n\n let file, fileExt;\n if (name && name.includes('.')) {\n const lastDotIndex = name.lastIndexOf('.');\n file = name.substring(0, lastDotIndex);\n fileExt = name.substring(lastDotIndex + 1);\n } else {\n // Fallback: extract extension from mimeType\n file = name || 'document';\n if (mimeType) {\n const mimeTypeParts = mimeType.split('/');\n // Handle specific MIME type mappings\n if (mimeType === 'application/pdf') fileExt = 'pdf';\n else if (mimeType.startsWith('image/')) fileExt = mimeTypeParts[1];\n else if (mimeType.startsWith('text/')) fileExt = 'txt';\n else fileExt = mimeTypeParts[1] || 'pdf';\n } else {\n fileExt = 'pdf';\n }\n }\n\n // Generate a unique filename if not provided\n const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_DOCUMENT_NAME)}.${fileExt}`;\n const uploadUri = fileActions.getUploadUrl(userId, fileName);\n // console.log('handleDocumentPicked', JSON.stringify({ uploadUri, uri, name, fileName, mimeType, file, fileExt }, null, 2));\n\n try {\n // Notify parent component that upload has started for this file\n this.props.onUploadStarted(uploadUri, uri, file, fileExt.toUpperCase());\n\n const res = await fileActions.uploadUserMediaWithProgress(uri, uploadUri, progress => {\n if (this.props.onUploadProgress) this.props.onUploadProgress(progress);\n });\n\n const fileUrl = Config.env.baseUploadsUrl + res.key;\n this.props.onUploadSuccess(fileUrl, uploadUri);\n console.log('Upload success', fileUrl);\n return { success: true, url: fileUrl, uploadUri };\n } catch (error) {\n console.error(`Upload failed for ${name}:`, error);\n this.props.onUploadFailed(uploadUri, error.message);\n return { success: false, error, uploadUri };\n }\n });\n\n // Wait for all uploads to complete\n const results = await Promise.all(uploadPromises);\n return results;\n } catch (error) {\n console.error('Document upload error:', error);\n return [];\n } finally {\n this.setState({ isUploading: false, uploadProgress: 0 });\n }\n };\n\n renderUploadButton = () => {\n const { buttonTitle, buttonStyle, buttonTextStyle, disabled } = this.props;\n const { isUploading } = this.state;\n const mainColor = getMainBrandingColourFromState(this.props);\n\n return (\n <TouchableOpacity\n style={[styles.uploadButton, { borderColor: mainColor }, buttonStyle]}\n onPress={this.pickDocument}\n disabled={isUploading || disabled}\n activeOpacity={0.7}\n >\n <View style={styles.buttonContent}>\n {isUploading ? (\n <ActivityIndicator color={mainColor} />\n ) : (\n <Icon name=\"attachment\" type=\"entypo\" color={mainColor} size={18} style={styles.icon} />\n )}\n <Text style={[styles.buttonText, { color: mainColor }, buttonTextStyle]}>{buttonTitle}</Text>\n </View>\n </TouchableOpacity>\n );\n };\n\n renderProgress = () => {\n const { uploadProgress } = this.state;\n if (uploadProgress <= 0 || uploadProgress >= 1) return null;\n\n return (\n <View style={styles.progressContainer}>\n <View style={styles.progressBar}>\n <View style={[styles.progressFill, { width: `${uploadProgress * 100}%` }]} />\n </View>\n <Text style={styles.progressText}>{Math.round(uploadProgress * 100)}%</Text>\n </View>\n );\n };\n\n render() {\n return (\n <View style={styles.container}>\n {this.renderUploadButton()}\n {this.renderProgress()}\n </View>\n );\n }\n}\n\nconst styles = StyleSheet.create({\n container: {\n marginVertical: 10,\n },\n uploadButton: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n paddingVertical: 8,\n paddingHorizontal: 16,\n borderRadius: 6,\n backgroundColor: '#fff',\n borderWidth: 1,\n borderColor: '#007AFF',\n },\n buttonContent: {\n flexDirection: 'row',\n alignItems: 'center',\n },\n buttonText: {\n color: '#fff',\n fontSize: 16,\n fontWeight: '500',\n marginLeft: 8,\n },\n icon: {\n marginRight: 8,\n },\n progressContainer: {\n marginTop: 8,\n alignItems: 'center',\n },\n progressBar: {\n height: 4,\n width: '100%',\n backgroundColor: '#E0E0E0',\n borderRadius: 2,\n overflow: 'hidden',\n },\n progressFill: {\n height: '100%',\n backgroundColor: '#4CAF50',\n },\n progressText: {\n marginTop: 4,\n fontSize: 12,\n color: TEXT_DARK,\n },\n});\n\nconst mapStateToProps = state => {\n const { user } = state;\n return {\n user,\n colourBrandingMain: getMainBrandingColourFromState(state),\n };\n};\n\nexport default connect(mapStateToProps)(DocumentUploader);\n"],"mappings":"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","ignoreList":[]}
@@ -3,8 +3,8 @@ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object
3
3
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
4
4
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
5
5
  import React, { Component } from 'react';
6
- import { View, Image, ImageBackground, TouchableOpacity, Text, KeyboardAvoidingView, Platform, ScrollView, Alert } from 'react-native';
7
- import { GiftedChat, Bubble, MessageText, Send, InputToolbar, Composer } from 'react-native-gifted-chat';
6
+ import { View, Image, ImageBackground, TouchableOpacity, Text, KeyboardAvoidingView, Platform, ScrollView, Alert, TextInput } from 'react-native';
7
+ import { GiftedChat, Bubble, MessageText, Send, InputToolbar } from 'react-native-gifted-chat';
8
8
  import { connect } from 'react-redux';
9
9
  import _ from 'lodash';
10
10
  import moment from 'moment';
@@ -268,7 +268,8 @@ class PlussChat extends Component {
268
268
  showFullscreenVideo: false,
269
269
  currentVideoUrl: '',
270
270
  showDeleteMessageConfirm: false,
271
- messageToDelete: null
271
+ messageToDelete: null,
272
+ composerHeight: this.MIN_COMPOSER_HEIGHT
272
273
  };
273
274
  this.checkThumb = null;
274
275
  }
@@ -282,13 +283,11 @@ class PlussChat extends Component {
282
283
  }
283
284
  }
284
285
  updateMessages(props) {
285
- const newState = {};
286
- if (!_.isUndefined(props.messages)) {
287
- newState.messages = props.messages;
288
- }
289
- // Only setState if we have something to update
290
- if (Object.keys(newState).length > 0) {
291
- this.setState(newState);
286
+ // Only update if messages actually changed
287
+ if (!_.isUndefined(props.messages) && !_.isEqual(props.messages, this.state.messages)) {
288
+ this.setState({
289
+ messages: props.messages
290
+ });
292
291
  }
293
292
  }
294
293
 
@@ -555,35 +554,39 @@ class PlussChat extends Component {
555
554
  return null;
556
555
  }
557
556
  renderSend(props) {
557
+ const buttonTopOffset = this.state.replyingTo ? 46 : 4;
558
+ const showSendButton = !_.isEmpty(props.text) || this.hasImagesReady(props.imagesToUpload);
558
559
  return /*#__PURE__*/React.createElement(View, {
559
- style: [{
560
+ style: {
560
561
  position: 'absolute',
561
- top: 0,
562
- right: 0
563
- }, !!this.state.replyingTo && {
564
- marginTop: 38
565
- }]
566
- }, (!_.isEmpty(props.text) || this.hasImagesReady(props.imagesToUpload)) && /*#__PURE__*/React.createElement(Send, _extends({}, props, {
567
- alwaysShowSend: true,
568
- containerStyle: [styles.sendContainer, {
562
+ top: buttonTopOffset,
563
+ right: 8,
564
+ flexDirection: 'row',
565
+ alignItems: 'center'
566
+ }
567
+ }, /*#__PURE__*/React.createElement(TouchableOpacity, {
568
+ onPress: this.showUploadMenu.bind(this),
569
+ style: [styles.sendContainer, {
570
+ right: _.isEmpty(props.text) && !this.hasImagesReady(props.imagesToUpload) ? 0 : this.MIN_COMPOSER_HEIGHT,
569
571
  width: this.MIN_COMPOSER_HEIGHT,
570
572
  height: this.MIN_COMPOSER_HEIGHT
571
573
  }]
572
- }), /*#__PURE__*/React.createElement(Icon, {
573
- name: 'paper-plane',
574
+ }, /*#__PURE__*/React.createElement(Icon, {
575
+ name: 'picture-o',
574
576
  type: "font-awesome",
575
577
  iconStyle: [styles.send, {
576
578
  width: this.MIN_COMPOSER_HEIGHT
577
579
  }]
578
- })), /*#__PURE__*/React.createElement(TouchableOpacity, {
579
- onPress: this.showUploadMenu.bind(this),
580
- style: [styles.sendContainer, {
581
- right: _.isEmpty(props.text) && !this.hasImagesReady(props.imagesToUpload) ? 0 : 8 + this.MIN_COMPOSER_HEIGHT,
580
+ })), showSendButton && /*#__PURE__*/React.createElement(Send, _extends({}, props, {
581
+ alwaysShowSend: true,
582
+ onSend: props.onSend,
583
+ text: props.text || ' ',
584
+ containerStyle: [styles.sendContainer, {
582
585
  width: this.MIN_COMPOSER_HEIGHT,
583
586
  height: this.MIN_COMPOSER_HEIGHT
584
587
  }]
585
- }, /*#__PURE__*/React.createElement(Icon, {
586
- name: 'picture-o',
588
+ }), /*#__PURE__*/React.createElement(Icon, {
589
+ name: 'paper-plane',
587
590
  type: "font-awesome",
588
591
  iconStyle: [styles.send, {
589
592
  width: this.MIN_COMPOSER_HEIGHT
@@ -695,7 +698,9 @@ class PlussChat extends Component {
695
698
  renderComposer(props) {
696
699
  var _this$state$replyingT, _this$state$replyingT2;
697
700
  return /*#__PURE__*/React.createElement(View, {
698
- style: styles.composerContainer
701
+ style: {
702
+ width: '100%'
703
+ }
699
704
  }, this.state.replyingTo && /*#__PURE__*/React.createElement(View, {
700
705
  style: styles.replyingTo
701
706
  }, /*#__PURE__*/React.createElement(TextStyle, {
@@ -718,25 +723,36 @@ class PlussChat extends Component {
718
723
  type: "font-awesome",
719
724
  iconStyle: styles.replyingRemoveIcon
720
725
  })))), /*#__PURE__*/React.createElement(View, {
721
- style: styles.composerInputWrapper
726
+ style: {
727
+ flexDirection: 'row',
728
+ alignItems: 'flex-end',
729
+ width: '100%',
730
+ paddingBottom: 8
731
+ }
722
732
  }, /*#__PURE__*/React.createElement(View, {
723
733
  style: [styles.input, {
724
- //height: props.composerHeight + 10,
725
- //borderRadius: (this.MIN_COMPOSER_HEIGHT + 10) / 2,
726
- marginRight: _.isEmpty(props.text) && !this.hasImagesReady(props.imagesToUpload) ? 8 + this.MIN_COMPOSER_HEIGHT : 2 * (this.MIN_COMPOSER_HEIGHT + 8),
727
- justifyContent: 'center'
728
- }, Platform.OS === 'ios' && {
729
- height: props.composerHeight + 10
734
+ flex: 1,
735
+ marginRight: _.isEmpty(props.text) && !this.hasImagesReady(props.imagesToUpload) ? 16 + this.MIN_COMPOSER_HEIGHT : 2 * (this.MIN_COMPOSER_HEIGHT + 8),
736
+ paddingHorizontal: 12,
737
+ paddingVertical: Platform.select({
738
+ ios: 8,
739
+ android: 6
740
+ })
730
741
  }]
731
- }, /*#__PURE__*/React.createElement(Composer, _extends({}, props, {
732
- //composerHeight={props.composerHeight}
742
+ }, /*#__PURE__*/React.createElement(TextInput, {
733
743
  placeholder: "Type a message...",
734
- textInputStyle: styles.inputText,
735
- textInputProps: {
736
- onFocus: this.onFocusInput.bind(this),
737
- onBlur: this.onBlurInput.bind(this)
738
- }
739
- })))));
744
+ multiline: true,
745
+ value: props.text,
746
+ onChangeText: props.onTextChanged,
747
+ style: [styles.inputText, {
748
+ lineHeight: 20,
749
+ minHeight: this.MIN_COMPOSER_HEIGHT - 16,
750
+ maxHeight: 100
751
+ }],
752
+ onFocus: this.onFocusInput.bind(this),
753
+ onBlur: this.onBlurInput.bind(this),
754
+ placeholderTextColor: "#999"
755
+ }))));
740
756
  }
741
757
 
742
758
  /***
@@ -747,13 +763,17 @@ class PlussChat extends Component {
747
763
  tabCount,
748
764
  noTab
749
765
  } = this.props;
750
- const iosBottomOffset = (tabCount === 1 || noTab ? -10 : 52) + getBottomSpace();
751
- const minInputToolbarHeight = this.MIN_COMPOSER_HEIGHT + 16 + (this.state.replyingTo ? 30 : 0) + (this.hasImagesAttached() ? IMAGE_PREVIEW_AREA_HEIGHT : 0);
766
+ const safeAreaBottom = getBottomSpace();
767
+ // Adjusted for react-native-gifted-chat v2: account for tab bar + safe area
768
+ const iosBottomOffset = (tabCount === 1 || noTab ? 0 : 49) + safeAreaBottom;
769
+ const minInputToolbarHeight = this.MIN_COMPOSER_HEIGHT + 32 + (this.state.replyingTo ? 38 : 0) + (this.hasImagesAttached() ? IMAGE_PREVIEW_AREA_HEIGHT : 0);
752
770
  return /*#__PURE__*/React.createElement(GiftedChat, {
771
+ disableKeyboardController: true,
753
772
  alwaysShowSend: false,
754
773
  keyboardShouldPersistTaps: 'never',
755
774
  renderAvatarOnTop: true,
756
775
  minInputToolbarHeight: minInputToolbarHeight,
776
+ minComposerHeight: this.MIN_COMPOSER_HEIGHT,
757
777
  bottomOffset: Platform.OS === 'android' ? 0 : iosBottomOffset,
758
778
  onSend: this.sendMessages.bind(this),
759
779
  messages: this.state.messages,
@@ -1 +1 @@
1
- {"version":3,"names":["React","Component","View","Image","ImageBackground","TouchableOpacity","Text","KeyboardAvoidingView","Platform","ScrollView","Alert","GiftedChat","Bubble","MessageText","Send","InputToolbar","Composer","connect","_","moment","Icon","getBottomSpace","Spinner","ProfilePic","PlussChatTime","PDFPopup","Attachment","PlussChatMessage","TextStyle","ConfirmPopup","TEXT_DARK","LINEGREY","TEXT_DARKEST","getMainBrandingColourFromState","getLightBrandingColourFromState","BG_GREY","TEXT_BLUEGREY","getEnabledTabsFromState","get1400","getThumb300","imageExists","isVideo","getImageSource","getFileName","Config","Services","ImageUploader","ImageUploadProgress","ImagePopup","VideoPopup","IMAGE_SIZE_SMALL","IMAGE_SIZE_LARGE","IMAGES_PER_ROW","IMAGE_MARGIN","IMAGE_PREVIEW_AREA_HEIGHT","IMAGE_PREVIEW_SIZE","PlussChat","constructor","props","_defineProperty","event","navigation","navigate","attachment","Type","place","imagesToUpload","isEmpty","state","upload","hasImagesAttached","every","i","uploading","thumbNailExists","checkThumb","setInterval","Promise","all","map","image","resolve","newImage","push","url","allowRetry","thumbNailUrl","thumbnailsExist","clearInterval","setState","a","selectedPDF","keyboardOpen","uploadUri","imageUri","uploadProgress","progress","img","uri","percentage","replace","waitForThumbnails","images","selected","imagePopupSource","imagePopupIndex","indexOf","imagePopupOpen","message","replyingTo","onDeleteMessage","user","_id","uid","showDeleteMessageConfirm","messageToDelete","error","console","log","filter","showFullscreenVideo","length","currentVideoUrl","isSingleTab","tabCount","MIN_COMPOSER_HEIGHT","select","ios","android","currentUser","name","displayName","avatar","isUndefined","profilePic","env","tinyChatDefault","messages","UNSAFE_componentWillMount","updateMessages","UNSAFE_componentWillReceiveProps","nextProps","newState","Object","keys","onSend","showUploadMenu","imageUploader","closeGallery","sendMessages","hasImagesReady","text","renderBubble","bubbleProps","wrapperStyle","currentMessage","paddingTop","paddingBottom","minWidth","attachments","paddingHorizontal","createElement","_extends","renderMessageImage","isCustomViewBottom","left","backgroundColor","borderRadius","right","colourBrandingLight","containerToNextStyle","borderBottomLeftRadius","borderBottomRightRadius","containerToPreviousStyle","borderTopLeftRadius","borderTopRightRadius","renderMessage","key","RowId","colourBrandingMain","onPressReply","onReply","onPressDelete","onDelete","renderMessageText","messageTextProps","deleted","textStyle","fontFamily","fontSize","color","marginTop","marginBottom","marginLeft","marginRight","linkStyle","renderTime","renderDay","dayProps","renderCustomView","position","containerWidth","style","styles","imagesContainer","width","paddingVertical","thumb","onPress","toggleFullscreenVideo","bind","messageImageSmall","messageImageLarge","source","imagePlayContainer","type","iconStyle","imageControlIcon","onPressImage","onOpenAttachment","title","onPressEvent","eventContainer","eventImage","eventImageMargin","Thumbnail","eventInfo","numberOfLines","eventTitle","eventInfoAlign","Title","eventDate","utc","StartTime","local","format","onPressAttachment","renderSend","top","alwaysShowSend","containerStyle","sendContainer","height","send","renderAccessory","hasAttachment","horizontal","uploadImagesContainer","uploader","progressTextStyle","isVideoUrl","accessoryImageContainer","accessoryImage","imageStyle","accessoryImageBorder","previewItemRemoveButton","onRemoveImage","hitSlop","bottom","previewItemRemoveContainer","previewItemRemoveIcon","renderInputToolbar","inputContainer","renderComposer","accessoryStyle","accessory","renderFooter","renderLoading","justifyContent","alignContent","size","renderAvatar","Diameter","_this$state$replyingT","_this$state$replyingT2","composerContainer","replyingRemoveButton","replyingRemoveContainer","replyingRemoveIcon","composerInputWrapper","input","OS","composerHeight","placeholder","textInputStyle","inputText","textInputProps","onFocus","onFocusInput","onBlur","onBlurInput","renderChat","noTab","iosBottomOffset","minInputToolbarHeight","keyboardShouldPersistTaps","renderAvatarOnTop","bottomOffset","renderImageUploader","ref","onUploadStarted","onUploadProgress","onUploadSuccess","onUploadFailed","onLibrarySelected","quality","allowsEditing","fileName","popupTitle","userId","multiple","allowVideo","renderImagePopup","visible","index","onClose","renderVideoPlayerPopup","renderPDF","onCloseAttachment","pdfCount","renderDeleteConfirmPopup","onConfirm","onConfirmDeleteMessage","onCancel","onCancelDeleteMessage","yesText","noText","render","noAndroidAvoid","behavior","chatContainer","flex","paddingLeft","paddingRight","flexDirection","resizeMode","minHeight","textAlign","alignSelf","margin","alignItems","borderBottomWidth","borderBottomColor","borderWidth","borderColor","borderTopWidth","borderTopColor","settingDropDownOpen","flexWrap","overflow","textShadowColor","textShadowOffset","mapStateToProps"],"sources":["PlussChat.js"],"sourcesContent":["import React, { Component } from 'react';\nimport { View, Image, ImageBackground, TouchableOpacity, Text, KeyboardAvoidingView, Platform, ScrollView, Alert } from 'react-native';\nimport { GiftedChat, Bubble, MessageText, Send, InputToolbar, Composer } from 'react-native-gifted-chat';\nimport { connect } from 'react-redux';\nimport _ from 'lodash';\nimport moment from 'moment';\nimport { Icon } from '@rneui/themed';\nimport { getBottomSpace } from 'react-native-iphone-x-helper';\nimport { Spinner } from './Spinner';\nimport { ProfilePic } from './ProfilePic';\nimport PlussChatTime from './PlussChatTime';\nimport { PDFPopup } from './PDFPopup';\nimport { Attachment } from './Attachment';\nimport PlussChatMessage from './PlussChatMessage';\nimport { TextStyle } from './TextStyle';\nimport { ConfirmPopup } from './ConfirmPopup';\nimport {\n TEXT_DARK,\n LINEGREY,\n TEXT_DARKEST,\n getMainBrandingColourFromState,\n getLightBrandingColourFromState,\n BG_GREY,\n TEXT_BLUEGREY,\n} from '../colours';\nimport { getEnabledTabsFromState, get1400, getThumb300, imageExists, isVideo, getImageSource, getFileName } from '../helper';\nimport Config, { Services } from '../config';\nimport ImageUploader from './ImageUploader';\nimport ImageUploadProgress from './ImageUploadProgress';\nimport { ImagePopup } from './ImagePopup';\nimport { VideoPopup } from './VideoPopup';\n\nconst IMAGE_SIZE_SMALL = 55;\nconst IMAGE_SIZE_LARGE = 110;\nconst IMAGES_PER_ROW = 4;\nconst IMAGE_MARGIN = 2;\nconst IMAGE_PREVIEW_AREA_HEIGHT = 105;\nconst IMAGE_PREVIEW_SIZE = IMAGE_PREVIEW_AREA_HEIGHT - 25;\n\nclass PlussChat extends Component {\n constructor(props) {\n super(props);\n const isSingleTab = this.props.tabCount === 1 && getBottomSpace() > 0;\n this.MIN_COMPOSER_HEIGHT = Platform.select({\n ios: isSingleTab ? 42 : 33,\n android: 41,\n });\n\n this.state = {\n currentUser: {\n _id: this.props.user.uid,\n name: this.props.user.displayName,\n avatar:\n !_.isUndefined(this.props.user.profilePic) && !_.isEmpty(this.props.user.profilePic)\n ? this.props.user.profilePic\n : Config.env.tinyChatDefault,\n },\n\n messages: [],\n imagePopupSource: [],\n imagePopupIndex: 0,\n imagePopupOpen: false,\n imagesToUpload: [],\n showFullscreenVideo: false,\n currentVideoUrl: '',\n showDeleteMessageConfirm: false,\n messageToDelete: null,\n };\n this.checkThumb = null;\n }\n\n UNSAFE_componentWillMount() {\n this.updateMessages(this.props);\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n // Only update if messages actually changed\n if (nextProps.messages !== this.props.messages) {\n this.updateMessages(nextProps);\n }\n }\n\n updateMessages(props) {\n const newState = {};\n if (!_.isUndefined(props.messages)) {\n newState.messages = props.messages;\n }\n // Only setState if we have something to update\n if (Object.keys(newState).length > 0) {\n this.setState(newState);\n }\n }\n\n /***\n *\n * Messaging functionality\n */\n onSend(messages = []) {\n // if (this.chatKey) {\n // this.sendMessage(messages[0]);\n // }\n }\n\n onPressEvent = event => {\n Services.navigation.navigate('eventDetail', { event });\n };\n onPressAttachment = attachment => {\n switch (attachment.Type) {\n case 'Event':\n Services.navigation.navigate('eventDetail', { event: attachment });\n break;\n case 'Place':\n Services.navigation.navigate('placeDetail', { place: attachment });\n break;\n default:\n return;\n }\n };\n\n hasImagesAttached = (imagesToUpload = null) => {\n return !_.isEmpty(imagesToUpload || this.state.imagesToUpload);\n };\n\n hasImagesReady = (imagesToUpload = null) => {\n const upload = imagesToUpload || this.state.imagesToUpload;\n return this.hasImagesAttached(upload) && upload.every(i => !i.uploading && i.thumbNailExists);\n };\n\n waitForThumbnails = () => {\n if (this.checkThumb) return;\n\n this.checkThumb = setInterval(async () => {\n const imagesToUpload = [];\n await Promise.all(\n this.state.imagesToUpload.map(image => {\n return new Promise(async resolve => {\n const newImage = { ...image };\n imagesToUpload.push(newImage);\n if (newImage.url && !newImage.thumbNailExists) {\n newImage.uploading = false;\n newImage.allowRetry = false;\n newImage.thumbNailExists = await imageExists(newImage.thumbNailUrl);\n resolve(newImage.thumbNailExists);\n }\n resolve(true);\n });\n }),\n );\n const thumbnailsExist = imagesToUpload.every(image => !image.url || image.thumbNailExists);\n if (thumbnailsExist) {\n clearInterval(this.checkThumb);\n this.checkThumb = null;\n this.setState({ imagesToUpload });\n }\n }, 2000);\n };\n\n onOpenAttachment = a => {\n this.setState({\n selectedPDF: a,\n });\n };\n\n onCloseAttachment = () => {\n this.setState({\n selectedPDF: null,\n });\n };\n\n showUploadMenu() {\n this.imageUploader.showUploadMenu();\n }\n\n onFocusInput = () => {\n this.setState({\n keyboardOpen: true,\n });\n if (this.props.keyboardOpen) {\n this.props.keyboardOpen();\n }\n };\n\n onBlurInput = () => {\n this.setState({\n keyboardOpen: false,\n });\n };\n\n onUploadStarted = (uploadUri, imageUri) => {\n const imagesToUpload = [\n ...this.state.imagesToUpload,\n {\n uploading: true,\n uploadProgress: '0%',\n uploadUri,\n imageUri,\n allowRetry: true,\n },\n ];\n this.setState({ imagesToUpload });\n };\n\n onUploadProgress = progress => {\n const imagesToUpload = [...this.state.imagesToUpload];\n imagesToUpload.map(img => {\n if (img.uploadUri === progress.uri) {\n img.uploadProgress = progress.percentage;\n img.uploading = true;\n img.allowRetry = true;\n }\n });\n this.setState({ imagesToUpload });\n };\n\n onUploadSuccess = async (uri, uploadUri) => {\n const imagesToUpload = [...this.state.imagesToUpload];\n imagesToUpload.map(img => {\n if (img.uploadUri === uploadUri && img.uploading) {\n img.url = uri.replace('/general/', '/general1400/');\n img.thumbNailExists = false;\n img.thumbNailUrl = getThumb300(img.url);\n img.allowRetry = true;\n }\n });\n this.setState({ imagesToUpload }, () => this.waitForThumbnails());\n };\n\n onUploadFailed = uploadUri => {\n const imagesToUpload = [...this.state.imagesToUpload];\n imagesToUpload.map(img => {\n if (img.uploadUri === uploadUri) {\n img.uploading = true; // Requried for retry\n img.uploadProgress = '';\n img.allowRetry = true;\n }\n });\n this.setState({ imagesToUpload });\n };\n\n onLibrarySelected = uri => {\n const imagesToUpload = [\n ...this.state.imagesToUpload,\n {\n uploading: false,\n allowRetry: false,\n url: get1400(uri),\n thumbNailExists: true,\n thumbNailUrl: getThumb300(uri),\n },\n ];\n this.setState({ imagesToUpload });\n };\n\n onPressImage = (images, selected) => {\n this.setState({\n imagePopupSource: images,\n imagePopupIndex: images.indexOf(selected),\n imagePopupOpen: true,\n });\n };\n\n onReply = message => {\n this.setState({\n replyingTo: message,\n });\n };\n\n onDelete = message => {\n // Only proceed if delete handler is provided\n if (!this.props.onDeleteMessage) {\n return;\n }\n\n // Only allow deletion of own messages\n if (message.user._id !== this.props.user.uid) {\n return;\n }\n\n this.setState({\n showDeleteMessageConfirm: true,\n messageToDelete: message,\n });\n };\n\n onCancelDeleteMessage = () => {\n this.setState({\n showDeleteMessageConfirm: false,\n messageToDelete: null,\n });\n };\n\n onConfirmDeleteMessage = async () => {\n const { messageToDelete } = this.state;\n if (!messageToDelete) return;\n\n this.setState({\n showDeleteMessageConfirm: false,\n });\n\n try {\n // Call the parent's delete handler if provided\n if (this.props.onDeleteMessage) {\n await this.props.onDeleteMessage(messageToDelete);\n }\n\n this.setState({\n messageToDelete: null,\n });\n } catch (error) {\n // Handle error gracefully if parent handler fails\n console.log('onConfirmDeleteMessage error', error);\n // Error is already handled by parent component\n this.setState({ messageToDelete: null });\n }\n };\n\n closeGallery() {\n this.setState({\n imagePopupSource: [],\n imagePopupIndex: 0,\n imagePopupOpen: false,\n });\n }\n\n onRemoveImage = url => {\n const imagesToUpload = this.state.imagesToUpload.filter(image => image.url !== url);\n this.setState({ imagesToUpload });\n };\n\n toggleFullscreenVideo = url => {\n if (typeof url !== 'string') url = '';\n this.setState({ showFullscreenVideo: url.length > 0, currentVideoUrl: url });\n };\n\n sendMessages(messages) {\n if (this.hasImagesAttached()) {\n // Don't allow send if attached images aren't ready\n if (!this.hasImagesReady()) return;\n messages[0].image = this.state.imagesToUpload.map(image => image.url);\n }\n if (_.isEmpty(messages[0].text)) {\n messages[0].text = '';\n }\n if (!messages[0].text && !messages[0].image) return;\n\n if (this.state.replyingTo) {\n messages[0].replyingTo = this.state.replyingTo;\n }\n\n this.props.onSend(messages);\n this.setState({ imagesToUpload: [], replyingTo: null });\n }\n\n /**\n *\n * Render Functions\n */\n renderBubble(bubbleProps) {\n const wrapperStyle = {};\n if (!_.isEmpty(bubbleProps.currentMessage.text) && !_.isEmpty(bubbleProps.currentMessage.image)) {\n wrapperStyle.paddingTop = 8;\n wrapperStyle.paddingBottom = 16;\n wrapperStyle.minWidth = 142; // 110 image width + 16 padding either side\n }\n if (!_.isEmpty(bubbleProps.currentMessage.attachments)) {\n wrapperStyle.paddingTop = 8;\n wrapperStyle.paddingBottom = 16;\n wrapperStyle.paddingHorizontal = 16;\n }\n return (\n <Bubble\n {...bubbleProps}\n renderMessageImage={() => null}\n isCustomViewBottom={true}\n wrapperStyle={{\n left: {\n backgroundColor: LINEGREY,\n borderRadius: 25,\n ...wrapperStyle,\n },\n right: {\n backgroundColor: this.props.colourBrandingLight,\n borderRadius: 25,\n ...wrapperStyle,\n },\n }}\n containerToNextStyle={{\n left: {\n borderBottomLeftRadius: 5,\n },\n right: {\n borderBottomRightRadius: 5,\n },\n }}\n containerToPreviousStyle={{\n left: {\n borderTopLeftRadius: 5,\n },\n right: {\n borderTopRightRadius: 5,\n },\n }}\n />\n );\n }\n renderMessage(props) {\n return (\n <PlussChatMessage\n key={props.RowId}\n colourBrandingMain={this.props.colourBrandingMain}\n onPressReply={() => {\n this.onReply(props.currentMessage);\n }}\n onPressDelete={\n this.props.onDeleteMessage\n ? () => {\n this.onDelete(props.currentMessage);\n }\n : null\n }\n {...props}\n />\n );\n }\n renderMessageText(messageTextProps) {\n // If message is deleted, show placeholder text\n const props = messageTextProps.currentMessage.deleted\n ? {\n ...messageTextProps,\n currentMessage: {\n ...messageTextProps.currentMessage,\n text: '[Message deleted]',\n },\n }\n : messageTextProps;\n\n return (\n <MessageText\n {...props}\n textStyle={{\n left: {\n fontFamily: 'sf-regular',\n fontSize: 16,\n color: TEXT_DARKEST,\n marginTop: 10,\n marginBottom: 10,\n marginLeft: 15,\n marginRight: 15,\n },\n right: {\n fontFamily: 'sf-regular',\n fontSize: 16,\n color: this.props.colourBrandingMain,\n marginTop: 10,\n marginBottom: 10,\n marginLeft: 15,\n marginRight: 15,\n },\n }}\n linkStyle={{\n left: {\n color: TEXT_DARKEST,\n },\n right: {\n color: this.props.colourBrandingMain,\n },\n }}\n />\n );\n }\n renderTime() {\n return null;\n }\n renderDay(dayProps) {\n return (\n <PlussChatTime\n {...dayProps}\n textStyle={{\n fontFamily: 'sf-semibold',\n color: TEXT_DARK,\n fontSize: 12,\n }}\n />\n );\n }\n renderCustomView({ currentMessage, position }) {\n // Don't show images or attachments for deleted messages\n if (currentMessage.deleted) {\n return null;\n }\n\n if (currentMessage.image) {\n const images = typeof currentMessage.image === 'string' ? [currentMessage.image] : currentMessage.image;\n const containerWidth = (() => {\n if (images.length === 0) return 0;\n if (images.length === 1) return IMAGE_SIZE_LARGE;\n if (images.length <= IMAGES_PER_ROW) return (IMAGE_SIZE_SMALL + IMAGE_MARGIN) * images.length;\n return (IMAGE_SIZE_SMALL + IMAGE_MARGIN) * IMAGES_PER_ROW;\n })();\n return (\n <View style={[styles.imagesContainer, { width: containerWidth, paddingVertical: currentMessage.text ? 0 : 20 }]}>\n {images.map(img => {\n const thumb = getThumb300(img);\n if (isVideo(img)) {\n return (\n <TouchableOpacity key={thumb} onPress={this.toggleFullscreenVideo.bind(this, img)}>\n <ImageBackground style={images.length > 1 ? styles.messageImageSmall : styles.messageImageLarge} source={{ uri: thumb }}>\n <View style={styles.imagePlayContainer}>\n <Icon name=\"play\" type=\"font-awesome\" iconStyle={styles.imageControlIcon} />\n </View>\n </ImageBackground>\n </TouchableOpacity>\n );\n }\n return (\n <TouchableOpacity key={thumb} onPress={() => this.onPressImage(images, img)}>\n <Image source={{ uri: thumb }} style={images.length > 1 ? styles.messageImageSmall : styles.messageImageLarge} />\n </TouchableOpacity>\n );\n })}\n </View>\n );\n }\n if (!_.isEmpty(currentMessage.attachments)) {\n return (\n <View>\n {currentMessage.attachments.map((url, i) => {\n return (\n <Attachment\n onPress={() => {\n this.onOpenAttachment(url);\n }}\n key={i}\n title={getFileName(url)}\n />\n );\n })}\n </View>\n );\n }\n if (currentMessage.event) {\n return (\n <TouchableOpacity onPress={this.onPressEvent.bind(this, currentMessage.event)}>\n <View style={styles.eventContainer[position]}>\n <Image style={[styles.eventImage, styles.eventImageMargin[position]]} source={{ uri: currentMessage.event.Thumbnail }} />\n <View style={styles.eventInfo}>\n <Text\n numberOfLines={3}\n style={[styles.eventTitle, styles.eventInfoAlign[position], { color: this.props.colourBrandingMain }]}\n >\n {currentMessage.event.Title}\n </Text>\n <Text style={[styles.eventDate, styles.eventInfoAlign[position], { color: this.props.colourBrandingMain }]}>\n {moment\n .utc(currentMessage.event.StartTime)\n .local()\n .format('ddd D MMM')}\n </Text>\n </View>\n </View>\n </TouchableOpacity>\n );\n }\n if (currentMessage.attachment) {\n return (\n <TouchableOpacity onPress={this.onPressAttachment.bind(this, currentMessage.attachment)}>\n <View style={styles.eventContainer[position]}>\n <Image style={[styles.eventImage, styles.eventImageMargin[position]]} source={{ uri: currentMessage.attachment.Thumbnail }} />\n <View style={styles.eventInfo}>\n <Text\n numberOfLines={3}\n style={[styles.eventTitle, styles.eventInfoAlign[position], { color: this.props.colourBrandingMain }]}\n >\n {currentMessage.attachment.Title}\n </Text>\n {currentMessage.attachment.StartTime && (\n <Text style={[styles.eventDate, styles.eventInfoAlign[position], { color: this.props.colourBrandingMain }]}>\n {moment\n .utc(currentMessage.attachment.StartTime)\n .local()\n .format('ddd D MMM')}\n </Text>\n )}\n </View>\n </View>\n </TouchableOpacity>\n );\n }\n return null;\n }\n\n renderSend(props) {\n return (\n <View style={[{ position: 'absolute', top: 0, right: 0 }, !!this.state.replyingTo && { marginTop: 38 }]}>\n {(!_.isEmpty(props.text) || this.hasImagesReady(props.imagesToUpload)) && (\n <Send\n {...props}\n alwaysShowSend={true}\n containerStyle={[\n styles.sendContainer,\n {\n width: this.MIN_COMPOSER_HEIGHT,\n height: this.MIN_COMPOSER_HEIGHT,\n },\n ]}\n >\n <Icon name={'paper-plane'} type=\"font-awesome\" iconStyle={[styles.send, { width: this.MIN_COMPOSER_HEIGHT }]} />\n </Send>\n )}\n <TouchableOpacity\n onPress={this.showUploadMenu.bind(this)}\n style={[\n styles.sendContainer,\n {\n right: _.isEmpty(props.text) && !this.hasImagesReady(props.imagesToUpload) ? 0 : 8 + this.MIN_COMPOSER_HEIGHT,\n width: this.MIN_COMPOSER_HEIGHT,\n height: this.MIN_COMPOSER_HEIGHT,\n },\n ]}\n >\n <Icon name={'picture-o'} type=\"font-awesome\" iconStyle={[styles.send, { width: this.MIN_COMPOSER_HEIGHT }]} />\n </TouchableOpacity>\n </View>\n );\n }\n\n renderAccessory(props) {\n const hasAttachment = this.hasImagesAttached(props.imagesToUpload);\n if (!hasAttachment) {\n return null;\n }\n return (\n <ScrollView horizontal style={styles.uploadImagesContainer}>\n {props.imagesToUpload.map(image => {\n if (image.uploading) {\n return (\n <ImageUploadProgress\n key={image.uploadUri}\n uploader={this.imageUploader}\n image={image}\n color={this.props.colourBrandingMain}\n style={{ width: IMAGE_PREVIEW_SIZE, marginRight: 10 }}\n progressTextStyle={{ fontSize: 10 }}\n />\n );\n }\n const isVideoUrl = isVideo(image.url);\n return (\n <View key={image.url} style={styles.accessoryImageContainer}>\n <ImageBackground\n style={styles.accessoryImage}\n imageStyle={styles.accessoryImageBorder}\n source={getImageSource(image.thumbNailExists ? image.thumbNailUrl : image.url)}\n >\n {isVideoUrl && (\n <View style={styles.imagePlayContainer}>\n <TouchableOpacity onPress={this.toggleFullscreenVideo.bind(this, image.url)}>\n <Icon name=\"play\" type=\"font-awesome\" iconStyle={styles.imageControlIcon} />\n </TouchableOpacity>\n </View>\n )}\n </ImageBackground>\n <TouchableOpacity\n style={styles.previewItemRemoveButton}\n onPress={() => this.onRemoveImage(image.url)}\n hitSlop={{ top: 8, right: 8, bottom: 8, left: 8 }}\n >\n <View style={[styles.previewItemRemoveContainer, { backgroundColor: this.props.colourBrandingMain }]}>\n <Icon name=\"times\" type=\"font-awesome\" iconStyle={styles.previewItemRemoveIcon} />\n </View>\n </TouchableOpacity>\n </View>\n );\n })}\n </ScrollView>\n );\n }\n\n renderInputToolbar(props) {\n const hasAttachment = this.hasImagesAttached(props.imagesToUpload);\n return (\n <InputToolbar\n {...props}\n containerStyle={styles.inputContainer}\n renderComposer={this.renderComposer.bind(this)}\n renderAccessory={hasAttachment ? this.renderAccessory.bind(this) : null}\n accessoryStyle={hasAttachment && styles.accessory}\n />\n );\n }\n renderFooter() {\n // if (this.state.keyboardOpen) {\n // return null;\n // }\n // fixes an issue where there's no gap between bottom message and reply container\n return <View style={{ height: 10 }} />;\n }\n renderLoading() {\n return (\n <View style={{ marginTop: 15, justifyContent: 'center', alignContent: 'center' }}>\n <Spinner size={'small'} color={this.props.colourBrandingMain} />\n </View>\n );\n }\n renderAvatar(props) {\n return (\n <View style={{ marginRight: 2 }}>\n <ProfilePic ProfilePic={props.currentMessage.user.avatar} Diameter={28} />\n </View>\n );\n }\n renderComposer(props) {\n return (\n <View style={styles.composerContainer}>\n {this.state.replyingTo && (\n <View style={styles.replyingTo}>\n <TextStyle type=\"body\">\n Replying to {_.isEmpty(this.state.replyingTo?.user?.name) ? 'message' : this.state.replyingTo?.user?.name}\n </TextStyle>\n <TouchableOpacity\n style={styles.replyingRemoveButton}\n onPress={() => this.onReply(null)}\n hitSlop={{ top: 8, right: 8, bottom: 8, left: 8 }}\n >\n <View style={[styles.replyingRemoveContainer, { backgroundColor: this.props.colourBrandingMain }]}>\n <Icon name=\"times\" type=\"font-awesome\" iconStyle={styles.replyingRemoveIcon} />\n </View>\n </TouchableOpacity>\n </View>\n )}\n <View style={styles.composerInputWrapper}>\n <View\n style={[\n styles.input,\n {\n //height: props.composerHeight + 10,\n //borderRadius: (this.MIN_COMPOSER_HEIGHT + 10) / 2,\n marginRight:\n _.isEmpty(props.text) && !this.hasImagesReady(props.imagesToUpload)\n ? 8 + this.MIN_COMPOSER_HEIGHT\n : 2 * (this.MIN_COMPOSER_HEIGHT + 8),\n justifyContent: 'center',\n },\n Platform.OS === 'ios' && {\n height: props.composerHeight + 10,\n },\n ]}\n >\n <Composer\n {...props}\n //composerHeight={props.composerHeight}\n placeholder=\"Type a message...\"\n textInputStyle={styles.inputText}\n textInputProps={{\n onFocus: this.onFocusInput.bind(this),\n onBlur: this.onBlurInput.bind(this),\n }}\n />\n </View>\n </View>\n </View>\n );\n }\n\n /***\n * Main Render\n */\n renderChat() {\n const { tabCount, noTab } = this.props;\n const iosBottomOffset = (tabCount === 1 || noTab ? -10 : 52) + getBottomSpace();\n const minInputToolbarHeight =\n this.MIN_COMPOSER_HEIGHT + 16 + (this.state.replyingTo ? 30 : 0) + (this.hasImagesAttached() ? IMAGE_PREVIEW_AREA_HEIGHT : 0);\n\n return (\n <GiftedChat\n alwaysShowSend={false}\n keyboardShouldPersistTaps={'never'}\n renderAvatarOnTop\n minInputToolbarHeight={minInputToolbarHeight}\n bottomOffset={Platform.OS === 'android' ? 0 : iosBottomOffset}\n onSend={this.sendMessages.bind(this)}\n messages={this.state.messages}\n user={this.state.currentUser}\n renderBubble={this.renderBubble.bind(this)}\n renderMessage={this.renderMessage.bind(this)}\n renderMessageText={this.renderMessageText.bind(this)}\n renderTime={this.renderTime.bind(this)}\n renderDay={this.renderDay.bind(this)}\n renderCustomView={this.renderCustomView.bind(this)}\n renderSend={this.renderSend.bind(this)}\n renderInputToolbar={this.renderInputToolbar.bind(this)}\n renderFooter={this.renderFooter.bind(this)}\n renderLoading={this.renderLoading.bind(this)}\n renderAvatar={this.renderAvatar.bind(this)}\n imagesToUpload={this.state.imagesToUpload}\n />\n );\n }\n\n renderImageUploader() {\n return (\n <ImageUploader\n ref={ref => (this.imageUploader = ref)}\n onUploadStarted={this.onUploadStarted}\n onUploadProgress={this.onUploadProgress}\n onUploadSuccess={this.onUploadSuccess}\n onUploadFailed={this.onUploadFailed}\n onLibrarySelected={this.onLibrarySelected}\n quality={0.8}\n allowsEditing={false}\n fileName={'imageInput'}\n popupTitle={'Add Image'}\n userId={this.props.user.uid}\n multiple\n allowVideo\n />\n );\n }\n\n renderImagePopup() {\n const { imagePopupOpen, imagePopupSource, imagePopupIndex } = this.state;\n return (\n <ImagePopup\n visible={imagePopupOpen}\n images={imagePopupSource}\n index={imagePopupIndex}\n onClose={this.closeGallery.bind(this)}\n />\n );\n }\n\n renderVideoPlayerPopup() {\n const { showFullscreenVideo, currentVideoUrl } = this.state;\n if (!currentVideoUrl) return;\n\n return <VideoPopup uri={currentVideoUrl} visible={showFullscreenVideo} onClose={this.toggleFullscreenVideo} />;\n }\n\n renderPDF() {\n if (_.isEmpty(this.state.selectedPDF)) {\n return null;\n }\n return (\n <PDFPopup source={this.state.selectedPDF} onClose={this.onCloseAttachment} title={getFileName(this.state.selectedPDF)} pdfCount={1} />\n );\n }\n\n renderDeleteConfirmPopup() {\n return (\n <ConfirmPopup\n visible={this.state.showDeleteMessageConfirm}\n onConfirm={this.onConfirmDeleteMessage}\n onCancel={this.onCancelDeleteMessage}\n text=\"Are you sure you want to delete this message?\"\n yesText=\"Delete\"\n noText=\"Cancel\"\n />\n );\n }\n\n render() {\n if (Platform.OS === 'android' && !this.props.noAndroidAvoid) {\n return (\n <KeyboardAvoidingView behavior={'padding'} style={styles.chatContainer}>\n {this.renderChat()}\n {this.renderImageUploader()}\n {this.renderImagePopup()}\n {this.renderVideoPlayerPopup()}\n {this.renderPDF()}\n {this.renderDeleteConfirmPopup()}\n </KeyboardAvoidingView>\n );\n }\n return (\n <View style={styles.chatContainer}>\n {this.renderChat()}\n {this.renderImageUploader()}\n {this.renderImagePopup()}\n {this.renderVideoPlayerPopup()}\n {this.renderPDF()}\n {this.renderDeleteConfirmPopup()}\n </View>\n );\n }\n}\n\nconst styles = {\n chatContainer: {\n flex: 1,\n justifyContent: 'center',\n },\n eventContainer: {\n left: {\n paddingTop: 5,\n paddingLeft: 15,\n paddingRight: 15,\n paddingBottom: 5,\n flexDirection: 'row',\n },\n right: {\n paddingTop: 5,\n paddingLeft: 15,\n paddingRight: 15,\n paddingBottom: 5,\n flexDirection: 'row-reverse',\n },\n },\n eventImage: {\n width: 80,\n height: 80,\n resizeMode: 'cover',\n borderRadius: 2,\n },\n eventImageMargin: {\n right: {\n marginLeft: 15,\n },\n left: {\n marginRight: 15,\n },\n },\n eventInfo: {\n minHeight: 80,\n width: 150,\n },\n eventTitle: {\n fontSize: 12,\n fontFamily: 'sf-bold',\n backgroundColor: 'rgba(255,255,255,0)',\n },\n eventInfoAlign: {\n left: {\n textAlign: 'left',\n },\n right: {\n textAlign: 'right',\n },\n },\n messageImageLarge: {\n width: IMAGE_SIZE_LARGE,\n height: IMAGE_SIZE_LARGE,\n borderRadius: 2,\n alignSelf: 'center',\n },\n messageImageSmall: {\n width: IMAGE_SIZE_SMALL,\n height: IMAGE_SIZE_SMALL,\n borderRadius: 2,\n alignSelf: 'center',\n marginRight: IMAGE_MARGIN,\n marginBottom: IMAGE_MARGIN,\n },\n eventDate: {\n fontSize: 12,\n fontFamily: 'sf-regular',\n backgroundColor: 'rgba(255,255,255,0)',\n },\n inputContainer: {\n backgroundColor: '#fff',\n paddingVertical: 8,\n paddingHorizontal: 8,\n },\n inputText: {\n color: TEXT_DARKEST,\n fontSize: 14,\n fontFamily: 'sf-medium',\n },\n input: {\n margin: 0,\n backgroundColor: BG_GREY,\n borderRadius: 5,\n flex: 1,\n },\n composerContainer: {\n flex: 1,\n },\n composerInputWrapper: {\n flex: 1,\n flexDirection: 'row',\n },\n replyingTo: {\n minHeight: 30,\n flexDirection: 'row',\n alignItems: 'center',\n borderBottomWidth: 1,\n borderBottomColor: LINEGREY,\n marginBottom: 8,\n },\n replyingRemoveButton: {\n marginLeft: 10,\n },\n replyingRemoveContainer: {\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: 10,\n width: 20,\n height: 20,\n borderWidth: 2,\n borderColor: '#fff',\n },\n replyingRemoveIcon: {\n fontSize: 10,\n color: '#fff',\n marginBottom: 1,\n },\n sendContainer: {\n position: 'absolute',\n top: 0,\n right: 0,\n height: 30,\n width: 30,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#fff',\n },\n send: {\n fontSize: 15,\n color: TEXT_BLUEGREY,\n fontSize: 24,\n textAlign: 'center',\n },\n accessory: {\n height: IMAGE_PREVIEW_AREA_HEIGHT,\n borderTopWidth: 1,\n borderTopColor: LINEGREY,\n paddingTop: 8,\n marginTop: 8,\n },\n accessoryImageContainer: {\n paddingRight: 8,\n paddingTop: 8,\n marginRight: 5,\n },\n accessoryImage: {\n width: IMAGE_PREVIEW_SIZE,\n height: IMAGE_PREVIEW_SIZE,\n },\n accessoryImageBorder: {\n borderRadius: 2,\n },\n settingDropDownOpen: {\n height: 'auto',\n },\n imagesContainer: {\n marginLeft: 10,\n marginRight: 10,\n flexDirection: 'row',\n flexWrap: 'wrap',\n },\n uploadImagesContainer: {\n flexDirection: 'row',\n overflow: 'visible',\n },\n previewItemRemoveButton: {\n position: 'absolute',\n top: 0,\n right: 0,\n },\n previewItemRemoveContainer: {\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: 10,\n width: 20,\n height: 20,\n borderWidth: 2,\n borderColor: '#fff',\n },\n previewItemRemoveIcon: {\n fontSize: 10,\n color: '#fff',\n marginBottom: 1,\n },\n imagePlayContainer: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n alignItems: 'center',\n justifyContent: 'center',\n },\n imageControlIcon: {\n color: '#fff',\n fontSize: 20,\n textShadowColor: 'rgba(0,0,0,0.3)',\n textShadowOffset: { width: 2, height: 2 },\n },\n};\n\nconst mapStateToProps = state => {\n return {\n user: state.user,\n colourBrandingMain: getMainBrandingColourFromState(state),\n colourBrandingLight: getLightBrandingColourFromState(state),\n tabCount: getEnabledTabsFromState(state).length,\n };\n};\n\nexport default connect(mapStateToProps, {})(PlussChat);\n"],"mappings":";;;;AAAA,OAAOA,KAAK,IAAIC,SAAS,QAAQ,OAAO;AACxC,SAASC,IAAI,EAAEC,KAAK,EAAEC,eAAe,EAAEC,gBAAgB,EAAEC,IAAI,EAAEC,oBAAoB,EAAEC,QAAQ,EAAEC,UAAU,EAAEC,KAAK,QAAQ,cAAc;AACtI,SAASC,UAAU,EAAEC,MAAM,EAAEC,WAAW,EAAEC,IAAI,EAAEC,YAAY,EAAEC,QAAQ,QAAQ,0BAA0B;AACxG,SAASC,OAAO,QAAQ,aAAa;AACrC,OAAOC,CAAC,MAAM,QAAQ;AACtB,OAAOC,MAAM,MAAM,QAAQ;AAC3B,SAASC,IAAI,QAAQ,eAAe;AACpC,SAASC,cAAc,QAAQ,8BAA8B;AAC7D,SAASC,OAAO,QAAQ,WAAW;AACnC,SAASC,UAAU,QAAQ,cAAc;AACzC,OAAOC,aAAa,MAAM,iBAAiB;AAC3C,SAASC,QAAQ,QAAQ,YAAY;AACrC,SAASC,UAAU,QAAQ,cAAc;AACzC,OAAOC,gBAAgB,MAAM,oBAAoB;AACjD,SAASC,SAAS,QAAQ,aAAa;AACvC,SAASC,YAAY,QAAQ,gBAAgB;AAC7C,SACEC,SAAS,EACTC,QAAQ,EACRC,YAAY,EACZC,8BAA8B,EAC9BC,+BAA+B,EAC/BC,OAAO,EACPC,aAAa,QACR,YAAY;AACnB,SAASC,uBAAuB,EAAEC,OAAO,EAAEC,WAAW,EAAEC,WAAW,EAAEC,OAAO,EAAEC,cAAc,EAAEC,WAAW,QAAQ,WAAW;AAC5H,OAAOC,MAAM,IAAIC,QAAQ,QAAQ,WAAW;AAC5C,OAAOC,aAAa,MAAM,iBAAiB;AAC3C,OAAOC,mBAAmB,MAAM,uBAAuB;AACvD,SAASC,UAAU,QAAQ,cAAc;AACzC,SAASC,UAAU,QAAQ,cAAc;AAEzC,MAAMC,gBAAgB,GAAG,EAAE;AAC3B,MAAMC,gBAAgB,GAAG,GAAG;AAC5B,MAAMC,cAAc,GAAG,CAAC;AACxB,MAAMC,YAAY,GAAG,CAAC;AACtB,MAAMC,yBAAyB,GAAG,GAAG;AACrC,MAAMC,kBAAkB,GAAGD,yBAAyB,GAAG,EAAE;AAEzD,MAAME,SAAS,SAASvD,SAAS,CAAC;EAChCwD,WAAWA,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAACC,eAAA,uBA8DAC,KAAK,IAAI;MACtBf,QAAQ,CAACgB,UAAU,CAACC,QAAQ,CAAC,aAAa,EAAE;QAAEF;MAAM,CAAC,CAAC;IACxD,CAAC;IAAAD,eAAA,4BACmBI,UAAU,IAAI;MAChC,QAAQA,UAAU,CAACC,IAAI;QACrB,KAAK,OAAO;UACVnB,QAAQ,CAACgB,UAAU,CAACC,QAAQ,CAAC,aAAa,EAAE;YAAEF,KAAK,EAAEG;UAAW,CAAC,CAAC;UAClE;QACF,KAAK,OAAO;UACVlB,QAAQ,CAACgB,UAAU,CAACC,QAAQ,CAAC,aAAa,EAAE;YAAEG,KAAK,EAAEF;UAAW,CAAC,CAAC;UAClE;QACF;UACE;MACJ;IACF,CAAC;IAAAJ,eAAA,4BAEmB,CAACO,cAAc,GAAG,IAAI,KAAK;MAC7C,OAAO,CAAChD,CAAC,CAACiD,OAAO,CAACD,cAAc,IAAI,IAAI,CAACE,KAAK,CAACF,cAAc,CAAC;IAChE,CAAC;IAAAP,eAAA,yBAEgB,CAACO,cAAc,GAAG,IAAI,KAAK;MAC1C,MAAMG,MAAM,GAAGH,cAAc,IAAI,IAAI,CAACE,KAAK,CAACF,cAAc;MAC1D,OAAO,IAAI,CAACI,iBAAiB,CAACD,MAAM,CAAC,IAAIA,MAAM,CAACE,KAAK,CAACC,CAAC,IAAI,CAACA,CAAC,CAACC,SAAS,IAAID,CAAC,CAACE,eAAe,CAAC;IAC/F,CAAC;IAAAf,eAAA,4BAEmB,MAAM;MACxB,IAAI,IAAI,CAACgB,UAAU,EAAE;MAErB,IAAI,CAACA,UAAU,GAAGC,WAAW,CAAC,YAAY;QACxC,MAAMV,cAAc,GAAG,EAAE;QACzB,MAAMW,OAAO,CAACC,GAAG,CACf,IAAI,CAACV,KAAK,CAACF,cAAc,CAACa,GAAG,CAACC,KAAK,IAAI;UACrC,OAAO,IAAIH,OAAO,CAAC,MAAMI,OAAO,IAAI;YAClC,MAAMC,QAAQ,GAAG;cAAE,GAAGF;YAAM,CAAC;YAC7Bd,cAAc,CAACiB,IAAI,CAACD,QAAQ,CAAC;YAC7B,IAAIA,QAAQ,CAACE,GAAG,IAAI,CAACF,QAAQ,CAACR,eAAe,EAAE;cAC7CQ,QAAQ,CAACT,SAAS,GAAG,KAAK;cAC1BS,QAAQ,CAACG,UAAU,GAAG,KAAK;cAC3BH,QAAQ,CAACR,eAAe,GAAG,MAAMlC,WAAW,CAAC0C,QAAQ,CAACI,YAAY,CAAC;cACnEL,OAAO,CAACC,QAAQ,CAACR,eAAe,CAAC;YACnC;YACAO,OAAO,CAAC,IAAI,CAAC;UACf,CAAC,CAAC;QACJ,CAAC,CACH,CAAC;QACD,MAAMM,eAAe,GAAGrB,cAAc,CAACK,KAAK,CAACS,KAAK,IAAI,CAACA,KAAK,CAACI,GAAG,IAAIJ,KAAK,CAACN,eAAe,CAAC;QAC1F,IAAIa,eAAe,EAAE;UACnBC,aAAa,CAAC,IAAI,CAACb,UAAU,CAAC;UAC9B,IAAI,CAACA,UAAU,GAAG,IAAI;UACtB,IAAI,CAACc,QAAQ,CAAC;YAAEvB;UAAe,CAAC,CAAC;QACnC;MACF,CAAC,EAAE,IAAI,CAAC;IACV,CAAC;IAAAP,eAAA,2BAEkB+B,CAAC,IAAI;MACtB,IAAI,CAACD,QAAQ,CAAC;QACZE,WAAW,EAAED;MACf,CAAC,CAAC;IACJ,CAAC;IAAA/B,eAAA,4BAEmB,MAAM;MACxB,IAAI,CAAC8B,QAAQ,CAAC;QACZE,WAAW,EAAE;MACf,CAAC,CAAC;IACJ,CAAC;IAAAhC,eAAA,uBAMc,MAAM;MACnB,IAAI,CAAC8B,QAAQ,CAAC;QACZG,YAAY,EAAE;MAChB,CAAC,CAAC;MACF,IAAI,IAAI,CAAClC,KAAK,CAACkC,YAAY,EAAE;QAC3B,IAAI,CAAClC,KAAK,CAACkC,YAAY,CAAC,CAAC;MAC3B;IACF,CAAC;IAAAjC,eAAA,sBAEa,MAAM;MAClB,IAAI,CAAC8B,QAAQ,CAAC;QACZG,YAAY,EAAE;MAChB,CAAC,CAAC;IACJ,CAAC;IAAAjC,eAAA,0BAEiB,CAACkC,SAAS,EAAEC,QAAQ,KAAK;MACzC,MAAM5B,cAAc,GAAG,CACrB,GAAG,IAAI,CAACE,KAAK,CAACF,cAAc,EAC5B;QACEO,SAAS,EAAE,IAAI;QACfsB,cAAc,EAAE,IAAI;QACpBF,SAAS;QACTC,QAAQ;QACRT,UAAU,EAAE;MACd,CAAC,CACF;MACD,IAAI,CAACI,QAAQ,CAAC;QAAEvB;MAAe,CAAC,CAAC;IACnC,CAAC;IAAAP,eAAA,2BAEkBqC,QAAQ,IAAI;MAC7B,MAAM9B,cAAc,GAAG,CAAC,GAAG,IAAI,CAACE,KAAK,CAACF,cAAc,CAAC;MACrDA,cAAc,CAACa,GAAG,CAACkB,GAAG,IAAI;QACxB,IAAIA,GAAG,CAACJ,SAAS,KAAKG,QAAQ,CAACE,GAAG,EAAE;UAClCD,GAAG,CAACF,cAAc,GAAGC,QAAQ,CAACG,UAAU;UACxCF,GAAG,CAACxB,SAAS,GAAG,IAAI;UACpBwB,GAAG,CAACZ,UAAU,GAAG,IAAI;QACvB;MACF,CAAC,CAAC;MACF,IAAI,CAACI,QAAQ,CAAC;QAAEvB;MAAe,CAAC,CAAC;IACnC,CAAC;IAAAP,eAAA,0BAEiB,OAAOuC,GAAG,EAAEL,SAAS,KAAK;MAC1C,MAAM3B,cAAc,GAAG,CAAC,GAAG,IAAI,CAACE,KAAK,CAACF,cAAc,CAAC;MACrDA,cAAc,CAACa,GAAG,CAACkB,GAAG,IAAI;QACxB,IAAIA,GAAG,CAACJ,SAAS,KAAKA,SAAS,IAAII,GAAG,CAACxB,SAAS,EAAE;UAChDwB,GAAG,CAACb,GAAG,GAAGc,GAAG,CAACE,OAAO,CAAC,WAAW,EAAE,eAAe,CAAC;UACnDH,GAAG,CAACvB,eAAe,GAAG,KAAK;UAC3BuB,GAAG,CAACX,YAAY,GAAG/C,WAAW,CAAC0D,GAAG,CAACb,GAAG,CAAC;UACvCa,GAAG,CAACZ,UAAU,GAAG,IAAI;QACvB;MACF,CAAC,CAAC;MACF,IAAI,CAACI,QAAQ,CAAC;QAAEvB;MAAe,CAAC,EAAE,MAAM,IAAI,CAACmC,iBAAiB,CAAC,CAAC,CAAC;IACnE,CAAC;IAAA1C,eAAA,yBAEgBkC,SAAS,IAAI;MAC5B,MAAM3B,cAAc,GAAG,CAAC,GAAG,IAAI,CAACE,KAAK,CAACF,cAAc,CAAC;MACrDA,cAAc,CAACa,GAAG,CAACkB,GAAG,IAAI;QACxB,IAAIA,GAAG,CAACJ,SAAS,KAAKA,SAAS,EAAE;UAC/BI,GAAG,CAACxB,SAAS,GAAG,IAAI,CAAC,CAAC;UACtBwB,GAAG,CAACF,cAAc,GAAG,EAAE;UACvBE,GAAG,CAACZ,UAAU,GAAG,IAAI;QACvB;MACF,CAAC,CAAC;MACF,IAAI,CAACI,QAAQ,CAAC;QAAEvB;MAAe,CAAC,CAAC;IACnC,CAAC;IAAAP,eAAA,4BAEmBuC,GAAG,IAAI;MACzB,MAAMhC,cAAc,GAAG,CACrB,GAAG,IAAI,CAACE,KAAK,CAACF,cAAc,EAC5B;QACEO,SAAS,EAAE,KAAK;QAChBY,UAAU,EAAE,KAAK;QACjBD,GAAG,EAAE9C,OAAO,CAAC4D,GAAG,CAAC;QACjBxB,eAAe,EAAE,IAAI;QACrBY,YAAY,EAAE/C,WAAW,CAAC2D,GAAG;MAC/B,CAAC,CACF;MACD,IAAI,CAACT,QAAQ,CAAC;QAAEvB;MAAe,CAAC,CAAC;IACnC,CAAC;IAAAP,eAAA,uBAEc,CAAC2C,MAAM,EAAEC,QAAQ,KAAK;MACnC,IAAI,CAACd,QAAQ,CAAC;QACZe,gBAAgB,EAAEF,MAAM;QACxBG,eAAe,EAAEH,MAAM,CAACI,OAAO,CAACH,QAAQ,CAAC;QACzCI,cAAc,EAAE;MAClB,CAAC,CAAC;IACJ,CAAC;IAAAhD,eAAA,kBAESiD,OAAO,IAAI;MACnB,IAAI,CAACnB,QAAQ,CAAC;QACZoB,UAAU,EAAED;MACd,CAAC,CAAC;IACJ,CAAC;IAAAjD,eAAA,mBAEUiD,OAAO,IAAI;MACpB;MACA,IAAI,CAAC,IAAI,CAAClD,KAAK,CAACoD,eAAe,EAAE;QAC/B;MACF;;MAEA;MACA,IAAIF,OAAO,CAACG,IAAI,CAACC,GAAG,KAAK,IAAI,CAACtD,KAAK,CAACqD,IAAI,CAACE,GAAG,EAAE;QAC5C;MACF;MAEA,IAAI,CAACxB,QAAQ,CAAC;QACZyB,wBAAwB,EAAE,IAAI;QAC9BC,eAAe,EAAEP;MACnB,CAAC,CAAC;IACJ,CAAC;IAAAjD,eAAA,gCAEuB,MAAM;MAC5B,IAAI,CAAC8B,QAAQ,CAAC;QACZyB,wBAAwB,EAAE,KAAK;QAC/BC,eAAe,EAAE;MACnB,CAAC,CAAC;IACJ,CAAC;IAAAxD,eAAA,iCAEwB,YAAY;MACnC,MAAM;QAAEwD;MAAgB,CAAC,GAAG,IAAI,CAAC/C,KAAK;MACtC,IAAI,CAAC+C,eAAe,EAAE;MAEtB,IAAI,CAAC1B,QAAQ,CAAC;QACZyB,wBAAwB,EAAE;MAC5B,CAAC,CAAC;MAEF,IAAI;QACF;QACA,IAAI,IAAI,CAACxD,KAAK,CAACoD,eAAe,EAAE;UAC9B,MAAM,IAAI,CAACpD,KAAK,CAACoD,eAAe,CAACK,eAAe,CAAC;QACnD;QAEA,IAAI,CAAC1B,QAAQ,CAAC;UACZ0B,eAAe,EAAE;QACnB,CAAC,CAAC;MACJ,CAAC,CAAC,OAAOC,KAAK,EAAE;QACd;QACAC,OAAO,CAACC,GAAG,CAAC,8BAA8B,EAAEF,KAAK,CAAC;QAClD;QACA,IAAI,CAAC3B,QAAQ,CAAC;UAAE0B,eAAe,EAAE;QAAK,CAAC,CAAC;MAC1C;IACF,CAAC;IAAAxD,eAAA,wBAUeyB,GAAG,IAAI;MACrB,MAAMlB,cAAc,GAAG,IAAI,CAACE,KAAK,CAACF,cAAc,CAACqD,MAAM,CAACvC,KAAK,IAAIA,KAAK,CAACI,GAAG,KAAKA,GAAG,CAAC;MACnF,IAAI,CAACK,QAAQ,CAAC;QAAEvB;MAAe,CAAC,CAAC;IACnC,CAAC;IAAAP,eAAA,gCAEuByB,GAAG,IAAI;MAC7B,IAAI,OAAOA,GAAG,KAAK,QAAQ,EAAEA,GAAG,GAAG,EAAE;MACrC,IAAI,CAACK,QAAQ,CAAC;QAAE+B,mBAAmB,EAAEpC,GAAG,CAACqC,MAAM,GAAG,CAAC;QAAEC,eAAe,EAAEtC;MAAI,CAAC,CAAC;IAC9E,CAAC;IAlSC,MAAMuC,WAAW,GAAG,IAAI,CAACjE,KAAK,CAACkE,QAAQ,KAAK,CAAC,IAAIvG,cAAc,CAAC,CAAC,GAAG,CAAC;IACrE,IAAI,CAACwG,mBAAmB,GAAGrH,QAAQ,CAACsH,MAAM,CAAC;MACzCC,GAAG,EAAEJ,WAAW,GAAG,EAAE,GAAG,EAAE;MAC1BK,OAAO,EAAE;IACX,CAAC,CAAC;IAEF,IAAI,CAAC5D,KAAK,GAAG;MACX6D,WAAW,EAAE;QACXjB,GAAG,EAAE,IAAI,CAACtD,KAAK,CAACqD,IAAI,CAACE,GAAG;QACxBiB,IAAI,EAAE,IAAI,CAACxE,KAAK,CAACqD,IAAI,CAACoB,WAAW;QACjCC,MAAM,EACJ,CAAClH,CAAC,CAACmH,WAAW,CAAC,IAAI,CAAC3E,KAAK,CAACqD,IAAI,CAACuB,UAAU,CAAC,IAAI,CAACpH,CAAC,CAACiD,OAAO,CAAC,IAAI,CAACT,KAAK,CAACqD,IAAI,CAACuB,UAAU,CAAC,GAChF,IAAI,CAAC5E,KAAK,CAACqD,IAAI,CAACuB,UAAU,GAC1B1F,MAAM,CAAC2F,GAAG,CAACC;MACnB,CAAC;MAEDC,QAAQ,EAAE,EAAE;MACZjC,gBAAgB,EAAE,EAAE;MACpBC,eAAe,EAAE,CAAC;MAClBE,cAAc,EAAE,KAAK;MACrBzC,cAAc,EAAE,EAAE;MAClBsD,mBAAmB,EAAE,KAAK;MAC1BE,eAAe,EAAE,EAAE;MACnBR,wBAAwB,EAAE,KAAK;MAC/BC,eAAe,EAAE;IACnB,CAAC;IACD,IAAI,CAACxC,UAAU,GAAG,IAAI;EACxB;EAEA+D,yBAAyBA,CAAA,EAAG;IAC1B,IAAI,CAACC,cAAc,CAAC,IAAI,CAACjF,KAAK,CAAC;EACjC;EAEAkF,gCAAgCA,CAACC,SAAS,EAAE;IAC1C;IACA,IAAIA,SAAS,CAACJ,QAAQ,KAAK,IAAI,CAAC/E,KAAK,CAAC+E,QAAQ,EAAE;MAC9C,IAAI,CAACE,cAAc,CAACE,SAAS,CAAC;IAChC;EACF;EAEAF,cAAcA,CAACjF,KAAK,EAAE;IACpB,MAAMoF,QAAQ,GAAG,CAAC,CAAC;IACnB,IAAI,CAAC5H,CAAC,CAACmH,WAAW,CAAC3E,KAAK,CAAC+E,QAAQ,CAAC,EAAE;MAClCK,QAAQ,CAACL,QAAQ,GAAG/E,KAAK,CAAC+E,QAAQ;IACpC;IACA;IACA,IAAIM,MAAM,CAACC,IAAI,CAACF,QAAQ,CAAC,CAACrB,MAAM,GAAG,CAAC,EAAE;MACpC,IAAI,CAAChC,QAAQ,CAACqD,QAAQ,CAAC;IACzB;EACF;;EAEA;AACF;AACA;AACA;EACEG,MAAMA,CAACR,QAAQ,GAAG,EAAE,EAAE;IACpB;IACA;IACA;EAAA;EAqEFS,cAAcA,CAAA,EAAG;IACf,IAAI,CAACC,aAAa,CAACD,cAAc,CAAC,CAAC;EACrC;EAiJAE,YAAYA,CAAA,EAAG;IACb,IAAI,CAAC3D,QAAQ,CAAC;MACZe,gBAAgB,EAAE,EAAE;MACpBC,eAAe,EAAE,CAAC;MAClBE,cAAc,EAAE;IAClB,CAAC,CAAC;EACJ;EAYA0C,YAAYA,CAACZ,QAAQ,EAAE;IACrB,IAAI,IAAI,CAACnE,iBAAiB,CAAC,CAAC,EAAE;MAC5B;MACA,IAAI,CAAC,IAAI,CAACgF,cAAc,CAAC,CAAC,EAAE;MAC5Bb,QAAQ,CAAC,CAAC,CAAC,CAACzD,KAAK,GAAG,IAAI,CAACZ,KAAK,CAACF,cAAc,CAACa,GAAG,CAACC,KAAK,IAAIA,KAAK,CAACI,GAAG,CAAC;IACvE;IACA,IAAIlE,CAAC,CAACiD,OAAO,CAACsE,QAAQ,CAAC,CAAC,CAAC,CAACc,IAAI,CAAC,EAAE;MAC/Bd,QAAQ,CAAC,CAAC,CAAC,CAACc,IAAI,GAAG,EAAE;IACvB;IACA,IAAI,CAACd,QAAQ,CAAC,CAAC,CAAC,CAACc,IAAI,IAAI,CAACd,QAAQ,CAAC,CAAC,CAAC,CAACzD,KAAK,EAAE;IAE7C,IAAI,IAAI,CAACZ,KAAK,CAACyC,UAAU,EAAE;MACzB4B,QAAQ,CAAC,CAAC,CAAC,CAAC5B,UAAU,GAAG,IAAI,CAACzC,KAAK,CAACyC,UAAU;IAChD;IAEA,IAAI,CAACnD,KAAK,CAACuF,MAAM,CAACR,QAAQ,CAAC;IAC3B,IAAI,CAAChD,QAAQ,CAAC;MAAEvB,cAAc,EAAE,EAAE;MAAE2C,UAAU,EAAE;IAAK,CAAC,CAAC;EACzD;;EAEA;AACF;AACA;AACA;EACE2C,YAAYA,CAACC,WAAW,EAAE;IACxB,MAAMC,YAAY,GAAG,CAAC,CAAC;IACvB,IAAI,CAACxI,CAAC,CAACiD,OAAO,CAACsF,WAAW,CAACE,cAAc,CAACJ,IAAI,CAAC,IAAI,CAACrI,CAAC,CAACiD,OAAO,CAACsF,WAAW,CAACE,cAAc,CAAC3E,KAAK,CAAC,EAAE;MAC/F0E,YAAY,CAACE,UAAU,GAAG,CAAC;MAC3BF,YAAY,CAACG,aAAa,GAAG,EAAE;MAC/BH,YAAY,CAACI,QAAQ,GAAG,GAAG,CAAC,CAAC;IAC/B;IACA,IAAI,CAAC5I,CAAC,CAACiD,OAAO,CAACsF,WAAW,CAACE,cAAc,CAACI,WAAW,CAAC,EAAE;MACtDL,YAAY,CAACE,UAAU,GAAG,CAAC;MAC3BF,YAAY,CAACG,aAAa,GAAG,EAAE;MAC/BH,YAAY,CAACM,iBAAiB,GAAG,EAAE;IACrC;IACA,oBACEhK,KAAA,CAAAiK,aAAA,CAACrJ,MAAM,EAAAsJ,QAAA,KACDT,WAAW;MACfU,kBAAkB,EAAEA,CAAA,KAAM,IAAK;MAC/BC,kBAAkB,EAAE,IAAK;MACzBV,YAAY,EAAE;QACZW,IAAI,EAAE;UACJC,eAAe,EAAEvI,QAAQ;UACzBwI,YAAY,EAAE,EAAE;UAChB,GAAGb;QACL,CAAC;QACDc,KAAK,EAAE;UACLF,eAAe,EAAE,IAAI,CAAC5G,KAAK,CAAC+G,mBAAmB;UAC/CF,YAAY,EAAE,EAAE;UAChB,GAAGb;QACL;MACF,CAAE;MACFgB,oBAAoB,EAAE;QACpBL,IAAI,EAAE;UACJM,sBAAsB,EAAE;QAC1B,CAAC;QACDH,KAAK,EAAE;UACLI,uBAAuB,EAAE;QAC3B;MACF,CAAE;MACFC,wBAAwB,EAAE;QACxBR,IAAI,EAAE;UACJS,mBAAmB,EAAE;QACvB,CAAC;QACDN,KAAK,EAAE;UACLO,oBAAoB,EAAE;QACxB;MACF;IAAE,EACH,CAAC;EAEN;EACAC,aAAaA,CAACtH,KAAK,EAAE;IACnB,oBACE1D,KAAA,CAAAiK,aAAA,CAACtI,gBAAgB,EAAAuI,QAAA;MACfe,GAAG,EAAEvH,KAAK,CAACwH,KAAM;MACjBC,kBAAkB,EAAE,IAAI,CAACzH,KAAK,CAACyH,kBAAmB;MAClDC,YAAY,EAAEA,CAAA,KAAM;QAClB,IAAI,CAACC,OAAO,CAAC3H,KAAK,CAACiG,cAAc,CAAC;MACpC,CAAE;MACF2B,aAAa,EACX,IAAI,CAAC5H,KAAK,CAACoD,eAAe,GACtB,MAAM;QACJ,IAAI,CAACyE,QAAQ,CAAC7H,KAAK,CAACiG,cAAc,CAAC;MACrC,CAAC,GACD;IACL,GACGjG,KAAK,CACV,CAAC;EAEN;EACA8H,iBAAiBA,CAACC,gBAAgB,EAAE;IAClC;IACA,MAAM/H,KAAK,GAAG+H,gBAAgB,CAAC9B,cAAc,CAAC+B,OAAO,GACjD;MACE,GAAGD,gBAAgB;MACnB9B,cAAc,EAAE;QACd,GAAG8B,gBAAgB,CAAC9B,cAAc;QAClCJ,IAAI,EAAE;MACR;IACF,CAAC,GACDkC,gBAAgB;IAEpB,oBACEzL,KAAA,CAAAiK,aAAA,CAACpJ,WAAW,EAAAqJ,QAAA,KACNxG,KAAK;MACTiI,SAAS,EAAE;QACTtB,IAAI,EAAE;UACJuB,UAAU,EAAE,YAAY;UACxBC,QAAQ,EAAE,EAAE;UACZC,KAAK,EAAE9J,YAAY;UACnB+J,SAAS,EAAE,EAAE;UACbC,YAAY,EAAE,EAAE;UAChBC,UAAU,EAAE,EAAE;UACdC,WAAW,EAAE;QACf,CAAC;QACD1B,KAAK,EAAE;UACLoB,UAAU,EAAE,YAAY;UACxBC,QAAQ,EAAE,EAAE;UACZC,KAAK,EAAE,IAAI,CAACpI,KAAK,CAACyH,kBAAkB;UACpCY,SAAS,EAAE,EAAE;UACbC,YAAY,EAAE,EAAE;UAChBC,UAAU,EAAE,EAAE;UACdC,WAAW,EAAE;QACf;MACF,CAAE;MACFC,SAAS,EAAE;QACT9B,IAAI,EAAE;UACJyB,KAAK,EAAE9J;QACT,CAAC;QACDwI,KAAK,EAAE;UACLsB,KAAK,EAAE,IAAI,CAACpI,KAAK,CAACyH;QACpB;MACF;IAAE,EACH,CAAC;EAEN;EACAiB,UAAUA,CAAA,EAAG;IACX,OAAO,IAAI;EACb;EACAC,SAASA,CAACC,QAAQ,EAAE;IAClB,oBACEtM,KAAA,CAAAiK,aAAA,CAACzI,aAAa,EAAA0I,QAAA,KACRoC,QAAQ;MACZX,SAAS,EAAE;QACTC,UAAU,EAAE,aAAa;QACzBE,KAAK,EAAEhK,SAAS;QAChB+J,QAAQ,EAAE;MACZ;IAAE,EACH,CAAC;EAEN;EACAU,gBAAgBA,CAAC;IAAE5C,cAAc;IAAE6C;EAAS,CAAC,EAAE;IAC7C;IACA,IAAI7C,cAAc,CAAC+B,OAAO,EAAE;MAC1B,OAAO,IAAI;IACb;IAEA,IAAI/B,cAAc,CAAC3E,KAAK,EAAE;MACxB,MAAMsB,MAAM,GAAG,OAAOqD,cAAc,CAAC3E,KAAK,KAAK,QAAQ,GAAG,CAAC2E,cAAc,CAAC3E,KAAK,CAAC,GAAG2E,cAAc,CAAC3E,KAAK;MACvG,MAAMyH,cAAc,GAAG,CAAC,MAAM;QAC5B,IAAInG,MAAM,CAACmB,MAAM,KAAK,CAAC,EAAE,OAAO,CAAC;QACjC,IAAInB,MAAM,CAACmB,MAAM,KAAK,CAAC,EAAE,OAAOtE,gBAAgB;QAChD,IAAImD,MAAM,CAACmB,MAAM,IAAIrE,cAAc,EAAE,OAAO,CAACF,gBAAgB,GAAGG,YAAY,IAAIiD,MAAM,CAACmB,MAAM;QAC7F,OAAO,CAACvE,gBAAgB,GAAGG,YAAY,IAAID,cAAc;MAC3D,CAAC,EAAE,CAAC;MACJ,oBACEpD,KAAA,CAAAiK,aAAA,CAAC/J,IAAI;QAACwM,KAAK,EAAE,CAACC,MAAM,CAACC,eAAe,EAAE;UAAEC,KAAK,EAAEJ,cAAc;UAAEK,eAAe,EAAEnD,cAAc,CAACJ,IAAI,GAAG,CAAC,GAAG;QAAG,CAAC;MAAE,GAC7GjD,MAAM,CAACvB,GAAG,CAACkB,GAAG,IAAI;QACjB,MAAM8G,KAAK,GAAGxK,WAAW,CAAC0D,GAAG,CAAC;QAC9B,IAAIxD,OAAO,CAACwD,GAAG,CAAC,EAAE;UAChB,oBACEjG,KAAA,CAAAiK,aAAA,CAAC5J,gBAAgB;YAAC4K,GAAG,EAAE8B,KAAM;YAACC,OAAO,EAAE,IAAI,CAACC,qBAAqB,CAACC,IAAI,CAAC,IAAI,EAAEjH,GAAG;UAAE,gBAChFjG,KAAA,CAAAiK,aAAA,CAAC7J,eAAe;YAACsM,KAAK,EAAEpG,MAAM,CAACmB,MAAM,GAAG,CAAC,GAAGkF,MAAM,CAACQ,iBAAiB,GAAGR,MAAM,CAACS,iBAAkB;YAACC,MAAM,EAAE;cAAEnH,GAAG,EAAE6G;YAAM;UAAE,gBACtH/M,KAAA,CAAAiK,aAAA,CAAC/J,IAAI;YAACwM,KAAK,EAAEC,MAAM,CAACW;UAAmB,gBACrCtN,KAAA,CAAAiK,aAAA,CAAC7I,IAAI;YAAC8G,IAAI,EAAC,MAAM;YAACqF,IAAI,EAAC,cAAc;YAACC,SAAS,EAAEb,MAAM,CAACc;UAAiB,CAAE,CACvE,CACS,CACD,CAAC;QAEvB;QACA,oBACEzN,KAAA,CAAAiK,aAAA,CAAC5J,gBAAgB;UAAC4K,GAAG,EAAE8B,KAAM;UAACC,OAAO,EAAEA,CAAA,KAAM,IAAI,CAACU,YAAY,CAACpH,MAAM,EAAEL,GAAG;QAAE,gBAC1EjG,KAAA,CAAAiK,aAAA,CAAC9J,KAAK;UAACkN,MAAM,EAAE;YAAEnH,GAAG,EAAE6G;UAAM,CAAE;UAACL,KAAK,EAAEpG,MAAM,CAACmB,MAAM,GAAG,CAAC,GAAGkF,MAAM,CAACQ,iBAAiB,GAAGR,MAAM,CAACS;QAAkB,CAAE,CAChG,CAAC;MAEvB,CAAC,CACG,CAAC;IAEX;IACA,IAAI,CAAClM,CAAC,CAACiD,OAAO,CAACwF,cAAc,CAACI,WAAW,CAAC,EAAE;MAC1C,oBACE/J,KAAA,CAAAiK,aAAA,CAAC/J,IAAI,QACFyJ,cAAc,CAACI,WAAW,CAAChF,GAAG,CAAC,CAACK,GAAG,EAAEZ,CAAC,KAAK;QAC1C,oBACExE,KAAA,CAAAiK,aAAA,CAACvI,UAAU;UACTsL,OAAO,EAAEA,CAAA,KAAM;YACb,IAAI,CAACW,gBAAgB,CAACvI,GAAG,CAAC;UAC5B,CAAE;UACF6F,GAAG,EAAEzG,CAAE;UACPoJ,KAAK,EAAEjL,WAAW,CAACyC,GAAG;QAAE,CACzB,CAAC;MAEN,CAAC,CACG,CAAC;IAEX;IACA,IAAIuE,cAAc,CAAC/F,KAAK,EAAE;MACxB,oBACE5D,KAAA,CAAAiK,aAAA,CAAC5J,gBAAgB;QAAC2M,OAAO,EAAE,IAAI,CAACa,YAAY,CAACX,IAAI,CAAC,IAAI,EAAEvD,cAAc,CAAC/F,KAAK;MAAE,gBAC5E5D,KAAA,CAAAiK,aAAA,CAAC/J,IAAI;QAACwM,KAAK,EAAEC,MAAM,CAACmB,cAAc,CAACtB,QAAQ;MAAE,gBAC3CxM,KAAA,CAAAiK,aAAA,CAAC9J,KAAK;QAACuM,KAAK,EAAE,CAACC,MAAM,CAACoB,UAAU,EAAEpB,MAAM,CAACqB,gBAAgB,CAACxB,QAAQ,CAAC,CAAE;QAACa,MAAM,EAAE;UAAEnH,GAAG,EAAEyD,cAAc,CAAC/F,KAAK,CAACqK;QAAU;MAAE,CAAE,CAAC,eACzHjO,KAAA,CAAAiK,aAAA,CAAC/J,IAAI;QAACwM,KAAK,EAAEC,MAAM,CAACuB;MAAU,gBAC5BlO,KAAA,CAAAiK,aAAA,CAAC3J,IAAI;QACH6N,aAAa,EAAE,CAAE;QACjBzB,KAAK,EAAE,CAACC,MAAM,CAACyB,UAAU,EAAEzB,MAAM,CAAC0B,cAAc,CAAC7B,QAAQ,CAAC,EAAE;UAAEV,KAAK,EAAE,IAAI,CAACpI,KAAK,CAACyH;QAAmB,CAAC;MAAE,GAErGxB,cAAc,CAAC/F,KAAK,CAAC0K,KAClB,CAAC,eACPtO,KAAA,CAAAiK,aAAA,CAAC3J,IAAI;QAACoM,KAAK,EAAE,CAACC,MAAM,CAAC4B,SAAS,EAAE5B,MAAM,CAAC0B,cAAc,CAAC7B,QAAQ,CAAC,EAAE;UAAEV,KAAK,EAAE,IAAI,CAACpI,KAAK,CAACyH;QAAmB,CAAC;MAAE,GACxGhK,MAAM,CACJqN,GAAG,CAAC7E,cAAc,CAAC/F,KAAK,CAAC6K,SAAS,CAAC,CACnCC,KAAK,CAAC,CAAC,CACPC,MAAM,CAAC,WAAW,CACjB,CACF,CACF,CACU,CAAC;IAEvB;IACA,IAAIhF,cAAc,CAAC5F,UAAU,EAAE;MAC7B,oBACE/D,KAAA,CAAAiK,aAAA,CAAC5J,gBAAgB;QAAC2M,OAAO,EAAE,IAAI,CAAC4B,iBAAiB,CAAC1B,IAAI,CAAC,IAAI,EAAEvD,cAAc,CAAC5F,UAAU;MAAE,gBACtF/D,KAAA,CAAAiK,aAAA,CAAC/J,IAAI;QAACwM,KAAK,EAAEC,MAAM,CAACmB,cAAc,CAACtB,QAAQ;MAAE,gBAC3CxM,KAAA,CAAAiK,aAAA,CAAC9J,KAAK;QAACuM,KAAK,EAAE,CAACC,MAAM,CAACoB,UAAU,EAAEpB,MAAM,CAACqB,gBAAgB,CAACxB,QAAQ,CAAC,CAAE;QAACa,MAAM,EAAE;UAAEnH,GAAG,EAAEyD,cAAc,CAAC5F,UAAU,CAACkK;QAAU;MAAE,CAAE,CAAC,eAC9HjO,KAAA,CAAAiK,aAAA,CAAC/J,IAAI;QAACwM,KAAK,EAAEC,MAAM,CAACuB;MAAU,gBAC5BlO,KAAA,CAAAiK,aAAA,CAAC3J,IAAI;QACH6N,aAAa,EAAE,CAAE;QACjBzB,KAAK,EAAE,CAACC,MAAM,CAACyB,UAAU,EAAEzB,MAAM,CAAC0B,cAAc,CAAC7B,QAAQ,CAAC,EAAE;UAAEV,KAAK,EAAE,IAAI,CAACpI,KAAK,CAACyH;QAAmB,CAAC;MAAE,GAErGxB,cAAc,CAAC5F,UAAU,CAACuK,KACvB,CAAC,EACN3E,cAAc,CAAC5F,UAAU,CAAC0K,SAAS,iBAClCzO,KAAA,CAAAiK,aAAA,CAAC3J,IAAI;QAACoM,KAAK,EAAE,CAACC,MAAM,CAAC4B,SAAS,EAAE5B,MAAM,CAAC0B,cAAc,CAAC7B,QAAQ,CAAC,EAAE;UAAEV,KAAK,EAAE,IAAI,CAACpI,KAAK,CAACyH;QAAmB,CAAC;MAAE,GACxGhK,MAAM,CACJqN,GAAG,CAAC7E,cAAc,CAAC5F,UAAU,CAAC0K,SAAS,CAAC,CACxCC,KAAK,CAAC,CAAC,CACPC,MAAM,CAAC,WAAW,CACjB,CAEJ,CACF,CACU,CAAC;IAEvB;IACA,OAAO,IAAI;EACb;EAEAE,UAAUA,CAACnL,KAAK,EAAE;IAChB,oBACE1D,KAAA,CAAAiK,aAAA,CAAC/J,IAAI;MAACwM,KAAK,EAAE,CAAC;QAAEF,QAAQ,EAAE,UAAU;QAAEsC,GAAG,EAAE,CAAC;QAAEtE,KAAK,EAAE;MAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAACpG,KAAK,CAACyC,UAAU,IAAI;QAAEkF,SAAS,EAAE;MAAG,CAAC;IAAE,GACrG,CAAC,CAAC7K,CAAC,CAACiD,OAAO,CAACT,KAAK,CAAC6F,IAAI,CAAC,IAAI,IAAI,CAACD,cAAc,CAAC5F,KAAK,CAACQ,cAAc,CAAC,kBACnElE,KAAA,CAAAiK,aAAA,CAACnJ,IAAI,EAAAoJ,QAAA,KACCxG,KAAK;MACTqL,cAAc,EAAE,IAAK;MACrBC,cAAc,EAAE,CACdrC,MAAM,CAACsC,aAAa,EACpB;QACEpC,KAAK,EAAE,IAAI,CAAChF,mBAAmB;QAC/BqH,MAAM,EAAE,IAAI,CAACrH;MACf,CAAC;IACD,iBAEF7H,KAAA,CAAAiK,aAAA,CAAC7I,IAAI;MAAC8G,IAAI,EAAE,aAAc;MAACqF,IAAI,EAAC,cAAc;MAACC,SAAS,EAAE,CAACb,MAAM,CAACwC,IAAI,EAAE;QAAEtC,KAAK,EAAE,IAAI,CAAChF;MAAoB,CAAC;IAAE,CAAE,CAC3G,CACP,eACD7H,KAAA,CAAAiK,aAAA,CAAC5J,gBAAgB;MACf2M,OAAO,EAAE,IAAI,CAAC9D,cAAc,CAACgE,IAAI,CAAC,IAAI,CAAE;MACxCR,KAAK,EAAE,CACLC,MAAM,CAACsC,aAAa,EACpB;QACEzE,KAAK,EAAEtJ,CAAC,CAACiD,OAAO,CAACT,KAAK,CAAC6F,IAAI,CAAC,IAAI,CAAC,IAAI,CAACD,cAAc,CAAC5F,KAAK,CAACQ,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC2D,mBAAmB;QAC7GgF,KAAK,EAAE,IAAI,CAAChF,mBAAmB;QAC/BqH,MAAM,EAAE,IAAI,CAACrH;MACf,CAAC;IACD,gBAEF7H,KAAA,CAAAiK,aAAA,CAAC7I,IAAI;MAAC8G,IAAI,EAAE,WAAY;MAACqF,IAAI,EAAC,cAAc;MAACC,SAAS,EAAE,CAACb,MAAM,CAACwC,IAAI,EAAE;QAAEtC,KAAK,EAAE,IAAI,CAAChF;MAAoB,CAAC;IAAE,CAAE,CAC7F,CACd,CAAC;EAEX;EAEAuH,eAAeA,CAAC1L,KAAK,EAAE;IACrB,MAAM2L,aAAa,GAAG,IAAI,CAAC/K,iBAAiB,CAACZ,KAAK,CAACQ,cAAc,CAAC;IAClE,IAAI,CAACmL,aAAa,EAAE;MAClB,OAAO,IAAI;IACb;IACA,oBACErP,KAAA,CAAAiK,aAAA,CAACxJ,UAAU;MAAC6O,UAAU;MAAC5C,KAAK,EAAEC,MAAM,CAAC4C;IAAsB,GACxD7L,KAAK,CAACQ,cAAc,CAACa,GAAG,CAACC,KAAK,IAAI;MACjC,IAAIA,KAAK,CAACP,SAAS,EAAE;QACnB,oBACEzE,KAAA,CAAAiK,aAAA,CAAClH,mBAAmB;UAClBkI,GAAG,EAAEjG,KAAK,CAACa,SAAU;UACrB2J,QAAQ,EAAE,IAAI,CAACrG,aAAc;UAC7BnE,KAAK,EAAEA,KAAM;UACb8G,KAAK,EAAE,IAAI,CAACpI,KAAK,CAACyH,kBAAmB;UACrCuB,KAAK,EAAE;YAAEG,KAAK,EAAEtJ,kBAAkB;YAAE2I,WAAW,EAAE;UAAG,CAAE;UACtDuD,iBAAiB,EAAE;YAAE5D,QAAQ,EAAE;UAAG;QAAE,CACrC,CAAC;MAEN;MACA,MAAM6D,UAAU,GAAGjN,OAAO,CAACuC,KAAK,CAACI,GAAG,CAAC;MACrC,oBACEpF,KAAA,CAAAiK,aAAA,CAAC/J,IAAI;QAAC+K,GAAG,EAAEjG,KAAK,CAACI,GAAI;QAACsH,KAAK,EAAEC,MAAM,CAACgD;MAAwB,gBAC1D3P,KAAA,CAAAiK,aAAA,CAAC7J,eAAe;QACdsM,KAAK,EAAEC,MAAM,CAACiD,cAAe;QAC7BC,UAAU,EAAElD,MAAM,CAACmD,oBAAqB;QACxCzC,MAAM,EAAE3K,cAAc,CAACsC,KAAK,CAACN,eAAe,GAAGM,KAAK,CAACM,YAAY,GAAGN,KAAK,CAACI,GAAG;MAAE,GAE9EsK,UAAU,iBACT1P,KAAA,CAAAiK,aAAA,CAAC/J,IAAI;QAACwM,KAAK,EAAEC,MAAM,CAACW;MAAmB,gBACrCtN,KAAA,CAAAiK,aAAA,CAAC5J,gBAAgB;QAAC2M,OAAO,EAAE,IAAI,CAACC,qBAAqB,CAACC,IAAI,CAAC,IAAI,EAAElI,KAAK,CAACI,GAAG;MAAE,gBAC1EpF,KAAA,CAAAiK,aAAA,CAAC7I,IAAI;QAAC8G,IAAI,EAAC,MAAM;QAACqF,IAAI,EAAC,cAAc;QAACC,SAAS,EAAEb,MAAM,CAACc;MAAiB,CAAE,CAC3D,CACd,CAEO,CAAC,eAClBzN,KAAA,CAAAiK,aAAA,CAAC5J,gBAAgB;QACfqM,KAAK,EAAEC,MAAM,CAACoD,uBAAwB;QACtC/C,OAAO,EAAEA,CAAA,KAAM,IAAI,CAACgD,aAAa,CAAChL,KAAK,CAACI,GAAG,CAAE;QAC7C6K,OAAO,EAAE;UAAEnB,GAAG,EAAE,CAAC;UAAEtE,KAAK,EAAE,CAAC;UAAE0F,MAAM,EAAE,CAAC;UAAE7F,IAAI,EAAE;QAAE;MAAE,gBAElDrK,KAAA,CAAAiK,aAAA,CAAC/J,IAAI;QAACwM,KAAK,EAAE,CAACC,MAAM,CAACwD,0BAA0B,EAAE;UAAE7F,eAAe,EAAE,IAAI,CAAC5G,KAAK,CAACyH;QAAmB,CAAC;MAAE,gBACnGnL,KAAA,CAAAiK,aAAA,CAAC7I,IAAI;QAAC8G,IAAI,EAAC,OAAO;QAACqF,IAAI,EAAC,cAAc;QAACC,SAAS,EAAEb,MAAM,CAACyD;MAAsB,CAAE,CAC7E,CACU,CACd,CAAC;IAEX,CAAC,CACS,CAAC;EAEjB;EAEAC,kBAAkBA,CAAC3M,KAAK,EAAE;IACxB,MAAM2L,aAAa,GAAG,IAAI,CAAC/K,iBAAiB,CAACZ,KAAK,CAACQ,cAAc,CAAC;IAClE,oBACElE,KAAA,CAAAiK,aAAA,CAAClJ,YAAY,EAAAmJ,QAAA,KACPxG,KAAK;MACTsL,cAAc,EAAErC,MAAM,CAAC2D,cAAe;MACtCC,cAAc,EAAE,IAAI,CAACA,cAAc,CAACrD,IAAI,CAAC,IAAI,CAAE;MAC/CkC,eAAe,EAAEC,aAAa,GAAG,IAAI,CAACD,eAAe,CAAClC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAK;MACxEsD,cAAc,EAAEnB,aAAa,IAAI1C,MAAM,CAAC8D;IAAU,EACnD,CAAC;EAEN;EACAC,YAAYA,CAAA,EAAG;IACb;IACA;IACA;IACA;IACA,oBAAO1Q,KAAA,CAAAiK,aAAA,CAAC/J,IAAI;MAACwM,KAAK,EAAE;QAAEwC,MAAM,EAAE;MAAG;IAAE,CAAE,CAAC;EACxC;EACAyB,aAAaA,CAAA,EAAG;IACd,oBACE3Q,KAAA,CAAAiK,aAAA,CAAC/J,IAAI;MAACwM,KAAK,EAAE;QAAEX,SAAS,EAAE,EAAE;QAAE6E,cAAc,EAAE,QAAQ;QAAEC,YAAY,EAAE;MAAS;IAAE,gBAC/E7Q,KAAA,CAAAiK,aAAA,CAAC3I,OAAO;MAACwP,IAAI,EAAE,OAAQ;MAAChF,KAAK,EAAE,IAAI,CAACpI,KAAK,CAACyH;IAAmB,CAAE,CAC3D,CAAC;EAEX;EACA4F,YAAYA,CAACrN,KAAK,EAAE;IAClB,oBACE1D,KAAA,CAAAiK,aAAA,CAAC/J,IAAI;MAACwM,KAAK,EAAE;QAAER,WAAW,EAAE;MAAE;IAAE,gBAC9BlM,KAAA,CAAAiK,aAAA,CAAC1I,UAAU;MAACA,UAAU,EAAEmC,KAAK,CAACiG,cAAc,CAAC5C,IAAI,CAACqB,MAAO;MAAC4I,QAAQ,EAAE;IAAG,CAAE,CACrE,CAAC;EAEX;EACAT,cAAcA,CAAC7M,KAAK,EAAE;IAAA,IAAAuN,qBAAA,EAAAC,sBAAA;IACpB,oBACElR,KAAA,CAAAiK,aAAA,CAAC/J,IAAI;MAACwM,KAAK,EAAEC,MAAM,CAACwE;IAAkB,GACnC,IAAI,CAAC/M,KAAK,CAACyC,UAAU,iBACpB7G,KAAA,CAAAiK,aAAA,CAAC/J,IAAI;MAACwM,KAAK,EAAEC,MAAM,CAAC9F;IAAW,gBAC7B7G,KAAA,CAAAiK,aAAA,CAACrI,SAAS;MAAC2L,IAAI,EAAC;IAAM,GAAC,cACT,EAACrM,CAAC,CAACiD,OAAO,EAAA8M,qBAAA,GAAC,IAAI,CAAC7M,KAAK,CAACyC,UAAU,cAAAoK,qBAAA,gBAAAA,qBAAA,GAArBA,qBAAA,CAAuBlK,IAAI,cAAAkK,qBAAA,uBAA3BA,qBAAA,CAA6B/I,IAAI,CAAC,GAAG,SAAS,IAAAgJ,sBAAA,GAAG,IAAI,CAAC9M,KAAK,CAACyC,UAAU,cAAAqK,sBAAA,gBAAAA,sBAAA,GAArBA,sBAAA,CAAuBnK,IAAI,cAAAmK,sBAAA,uBAA3BA,sBAAA,CAA6BhJ,IAC5F,CAAC,eACZlI,KAAA,CAAAiK,aAAA,CAAC5J,gBAAgB;MACfqM,KAAK,EAAEC,MAAM,CAACyE,oBAAqB;MACnCpE,OAAO,EAAEA,CAAA,KAAM,IAAI,CAAC3B,OAAO,CAAC,IAAI,CAAE;MAClC4E,OAAO,EAAE;QAAEnB,GAAG,EAAE,CAAC;QAAEtE,KAAK,EAAE,CAAC;QAAE0F,MAAM,EAAE,CAAC;QAAE7F,IAAI,EAAE;MAAE;IAAE,gBAElDrK,KAAA,CAAAiK,aAAA,CAAC/J,IAAI;MAACwM,KAAK,EAAE,CAACC,MAAM,CAAC0E,uBAAuB,EAAE;QAAE/G,eAAe,EAAE,IAAI,CAAC5G,KAAK,CAACyH;MAAmB,CAAC;IAAE,gBAChGnL,KAAA,CAAAiK,aAAA,CAAC7I,IAAI;MAAC8G,IAAI,EAAC,OAAO;MAACqF,IAAI,EAAC,cAAc;MAACC,SAAS,EAAEb,MAAM,CAAC2E;IAAmB,CAAE,CAC1E,CACU,CACd,CACP,eACDtR,KAAA,CAAAiK,aAAA,CAAC/J,IAAI;MAACwM,KAAK,EAAEC,MAAM,CAAC4E;IAAqB,gBACvCvR,KAAA,CAAAiK,aAAA,CAAC/J,IAAI;MACHwM,KAAK,EAAE,CACLC,MAAM,CAAC6E,KAAK,EACZ;QACE;QACA;QACAtF,WAAW,EACThL,CAAC,CAACiD,OAAO,CAACT,KAAK,CAAC6F,IAAI,CAAC,IAAI,CAAC,IAAI,CAACD,cAAc,CAAC5F,KAAK,CAACQ,cAAc,CAAC,GAC/D,CAAC,GAAG,IAAI,CAAC2D,mBAAmB,GAC5B,CAAC,IAAI,IAAI,CAACA,mBAAmB,GAAG,CAAC,CAAC;QACxC+I,cAAc,EAAE;MAClB,CAAC,EACDpQ,QAAQ,CAACiR,EAAE,KAAK,KAAK,IAAI;QACvBvC,MAAM,EAAExL,KAAK,CAACgO,cAAc,GAAG;MACjC,CAAC;IACD,gBAEF1R,KAAA,CAAAiK,aAAA,CAACjJ,QAAQ,EAAAkJ,QAAA,KACHxG,KAAK;MACT;MACAiO,WAAW,EAAC,mBAAmB;MAC/BC,cAAc,EAAEjF,MAAM,CAACkF,SAAU;MACjCC,cAAc,EAAE;QACdC,OAAO,EAAE,IAAI,CAACC,YAAY,CAAC9E,IAAI,CAAC,IAAI,CAAC;QACrC+E,MAAM,EAAE,IAAI,CAACC,WAAW,CAAChF,IAAI,CAAC,IAAI;MACpC;IAAE,EACH,CACG,CACF,CACF,CAAC;EAEX;;EAEA;AACF;AACA;EACEiF,UAAUA,CAAA,EAAG;IACX,MAAM;MAAEvK,QAAQ;MAAEwK;IAAM,CAAC,GAAG,IAAI,CAAC1O,KAAK;IACtC,MAAM2O,eAAe,GAAG,CAACzK,QAAQ,KAAK,CAAC,IAAIwK,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI/Q,cAAc,CAAC,CAAC;IAC/E,MAAMiR,qBAAqB,GACzB,IAAI,CAACzK,mBAAmB,GAAG,EAAE,IAAI,IAAI,CAACzD,KAAK,CAACyC,UAAU,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAACvC,iBAAiB,CAAC,CAAC,GAAGhB,yBAAyB,GAAG,CAAC,CAAC;IAE/H,oBACEtD,KAAA,CAAAiK,aAAA,CAACtJ,UAAU;MACToO,cAAc,EAAE,KAAM;MACtBwD,yBAAyB,EAAE,OAAQ;MACnCC,iBAAiB;MACjBF,qBAAqB,EAAEA,qBAAsB;MAC7CG,YAAY,EAAEjS,QAAQ,CAACiR,EAAE,KAAK,SAAS,GAAG,CAAC,GAAGY,eAAgB;MAC9DpJ,MAAM,EAAE,IAAI,CAACI,YAAY,CAAC6D,IAAI,CAAC,IAAI,CAAE;MACrCzE,QAAQ,EAAE,IAAI,CAACrE,KAAK,CAACqE,QAAS;MAC9B1B,IAAI,EAAE,IAAI,CAAC3C,KAAK,CAAC6D,WAAY;MAC7BuB,YAAY,EAAE,IAAI,CAACA,YAAY,CAAC0D,IAAI,CAAC,IAAI,CAAE;MAC3ClC,aAAa,EAAE,IAAI,CAACA,aAAa,CAACkC,IAAI,CAAC,IAAI,CAAE;MAC7C1B,iBAAiB,EAAE,IAAI,CAACA,iBAAiB,CAAC0B,IAAI,CAAC,IAAI,CAAE;MACrDd,UAAU,EAAE,IAAI,CAACA,UAAU,CAACc,IAAI,CAAC,IAAI,CAAE;MACvCb,SAAS,EAAE,IAAI,CAACA,SAAS,CAACa,IAAI,CAAC,IAAI,CAAE;MACrCX,gBAAgB,EAAE,IAAI,CAACA,gBAAgB,CAACW,IAAI,CAAC,IAAI,CAAE;MACnD2B,UAAU,EAAE,IAAI,CAACA,UAAU,CAAC3B,IAAI,CAAC,IAAI,CAAE;MACvCmD,kBAAkB,EAAE,IAAI,CAACA,kBAAkB,CAACnD,IAAI,CAAC,IAAI,CAAE;MACvDwD,YAAY,EAAE,IAAI,CAACA,YAAY,CAACxD,IAAI,CAAC,IAAI,CAAE;MAC3CyD,aAAa,EAAE,IAAI,CAACA,aAAa,CAACzD,IAAI,CAAC,IAAI,CAAE;MAC7C6D,YAAY,EAAE,IAAI,CAACA,YAAY,CAAC7D,IAAI,CAAC,IAAI,CAAE;MAC3ChJ,cAAc,EAAE,IAAI,CAACE,KAAK,CAACF;IAAe,CAC3C,CAAC;EAEN;EAEAwO,mBAAmBA,CAAA,EAAG;IACpB,oBACE1S,KAAA,CAAAiK,aAAA,CAACnH,aAAa;MACZ6P,GAAG,EAAEA,GAAG,IAAK,IAAI,CAACxJ,aAAa,GAAGwJ,GAAK;MACvCC,eAAe,EAAE,IAAI,CAACA,eAAgB;MACtCC,gBAAgB,EAAE,IAAI,CAACA,gBAAiB;MACxCC,eAAe,EAAE,IAAI,CAACA,eAAgB;MACtCC,cAAc,EAAE,IAAI,CAACA,cAAe;MACpCC,iBAAiB,EAAE,IAAI,CAACA,iBAAkB;MAC1CC,OAAO,EAAE,GAAI;MACbC,aAAa,EAAE,KAAM;MACrBC,QAAQ,EAAE,YAAa;MACvBC,UAAU,EAAE,WAAY;MACxBC,MAAM,EAAE,IAAI,CAAC3P,KAAK,CAACqD,IAAI,CAACE,GAAI;MAC5BqM,QAAQ;MACRC,UAAU;IAAA,CACX,CAAC;EAEN;EAEAC,gBAAgBA,CAAA,EAAG;IACjB,MAAM;MAAE7M,cAAc;MAAEH,gBAAgB;MAAEC;IAAgB,CAAC,GAAG,IAAI,CAACrC,KAAK;IACxE,oBACEpE,KAAA,CAAAiK,aAAA,CAACjH,UAAU;MACTyQ,OAAO,EAAE9M,cAAe;MACxBL,MAAM,EAAEE,gBAAiB;MACzBkN,KAAK,EAAEjN,eAAgB;MACvBkN,OAAO,EAAE,IAAI,CAACvK,YAAY,CAAC8D,IAAI,CAAC,IAAI;IAAE,CACvC,CAAC;EAEN;EAEA0G,sBAAsBA,CAAA,EAAG;IACvB,MAAM;MAAEpM,mBAAmB;MAAEE;IAAgB,CAAC,GAAG,IAAI,CAACtD,KAAK;IAC3D,IAAI,CAACsD,eAAe,EAAE;IAEtB,oBAAO1H,KAAA,CAAAiK,aAAA,CAAChH,UAAU;MAACiD,GAAG,EAAEwB,eAAgB;MAAC+L,OAAO,EAAEjM,mBAAoB;MAACmM,OAAO,EAAE,IAAI,CAAC1G;IAAsB,CAAE,CAAC;EAChH;EAEA4G,SAASA,CAAA,EAAG;IACV,IAAI3S,CAAC,CAACiD,OAAO,CAAC,IAAI,CAACC,KAAK,CAACuB,WAAW,CAAC,EAAE;MACrC,OAAO,IAAI;IACb;IACA,oBACE3F,KAAA,CAAAiK,aAAA,CAACxI,QAAQ;MAAC4L,MAAM,EAAE,IAAI,CAACjJ,KAAK,CAACuB,WAAY;MAACgO,OAAO,EAAE,IAAI,CAACG,iBAAkB;MAAClG,KAAK,EAAEjL,WAAW,CAAC,IAAI,CAACyB,KAAK,CAACuB,WAAW,CAAE;MAACoO,QAAQ,EAAE;IAAE,CAAE,CAAC;EAE1I;EAEAC,wBAAwBA,CAAA,EAAG;IACzB,oBACEhU,KAAA,CAAAiK,aAAA,CAACpI,YAAY;MACX4R,OAAO,EAAE,IAAI,CAACrP,KAAK,CAAC8C,wBAAyB;MAC7C+M,SAAS,EAAE,IAAI,CAACC,sBAAuB;MACvCC,QAAQ,EAAE,IAAI,CAACC,qBAAsB;MACrC7K,IAAI,EAAC,+CAA+C;MACpD8K,OAAO,EAAC,QAAQ;MAChBC,MAAM,EAAC;IAAQ,CAChB,CAAC;EAEN;EAEAC,MAAMA,CAAA,EAAG;IACP,IAAI/T,QAAQ,CAACiR,EAAE,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC/N,KAAK,CAAC8Q,cAAc,EAAE;MAC3D,oBACExU,KAAA,CAAAiK,aAAA,CAAC1J,oBAAoB;QAACkU,QAAQ,EAAE,SAAU;QAAC/H,KAAK,EAAEC,MAAM,CAAC+H;MAAc,GACpE,IAAI,CAACvC,UAAU,CAAC,CAAC,EACjB,IAAI,CAACO,mBAAmB,CAAC,CAAC,EAC1B,IAAI,CAACc,gBAAgB,CAAC,CAAC,EACvB,IAAI,CAACI,sBAAsB,CAAC,CAAC,EAC7B,IAAI,CAACC,SAAS,CAAC,CAAC,EAChB,IAAI,CAACG,wBAAwB,CAAC,CACX,CAAC;IAE3B;IACA,oBACEhU,KAAA,CAAAiK,aAAA,CAAC/J,IAAI;MAACwM,KAAK,EAAEC,MAAM,CAAC+H;IAAc,GAC/B,IAAI,CAACvC,UAAU,CAAC,CAAC,EACjB,IAAI,CAACO,mBAAmB,CAAC,CAAC,EAC1B,IAAI,CAACc,gBAAgB,CAAC,CAAC,EACvB,IAAI,CAACI,sBAAsB,CAAC,CAAC,EAC7B,IAAI,CAACC,SAAS,CAAC,CAAC,EAChB,IAAI,CAACG,wBAAwB,CAAC,CAC3B,CAAC;EAEX;AACF;AAEA,MAAMrH,MAAM,GAAG;EACb+H,aAAa,EAAE;IACbC,IAAI,EAAE,CAAC;IACP/D,cAAc,EAAE;EAClB,CAAC;EACD9C,cAAc,EAAE;IACdzD,IAAI,EAAE;MACJT,UAAU,EAAE,CAAC;MACbgL,WAAW,EAAE,EAAE;MACfC,YAAY,EAAE,EAAE;MAChBhL,aAAa,EAAE,CAAC;MAChBiL,aAAa,EAAE;IACjB,CAAC;IACDtK,KAAK,EAAE;MACLZ,UAAU,EAAE,CAAC;MACbgL,WAAW,EAAE,EAAE;MACfC,YAAY,EAAE,EAAE;MAChBhL,aAAa,EAAE,CAAC;MAChBiL,aAAa,EAAE;IACjB;EACF,CAAC;EACD/G,UAAU,EAAE;IACVlB,KAAK,EAAE,EAAE;IACTqC,MAAM,EAAE,EAAE;IACV6F,UAAU,EAAE,OAAO;IACnBxK,YAAY,EAAE;EAChB,CAAC;EACDyD,gBAAgB,EAAE;IAChBxD,KAAK,EAAE;MACLyB,UAAU,EAAE;IACd,CAAC;IACD5B,IAAI,EAAE;MACJ6B,WAAW,EAAE;IACf;EACF,CAAC;EACDgC,SAAS,EAAE;IACT8G,SAAS,EAAE,EAAE;IACbnI,KAAK,EAAE;EACT,CAAC;EACDuB,UAAU,EAAE;IACVvC,QAAQ,EAAE,EAAE;IACZD,UAAU,EAAE,SAAS;IACrBtB,eAAe,EAAE;EACnB,CAAC;EACD+D,cAAc,EAAE;IACdhE,IAAI,EAAE;MACJ4K,SAAS,EAAE;IACb,CAAC;IACDzK,KAAK,EAAE;MACLyK,SAAS,EAAE;IACb;EACF,CAAC;EACD7H,iBAAiB,EAAE;IACjBP,KAAK,EAAE1J,gBAAgB;IACvB+L,MAAM,EAAE/L,gBAAgB;IACxBoH,YAAY,EAAE,CAAC;IACf2K,SAAS,EAAE;EACb,CAAC;EACD/H,iBAAiB,EAAE;IACjBN,KAAK,EAAE3J,gBAAgB;IACvBgM,MAAM,EAAEhM,gBAAgB;IACxBqH,YAAY,EAAE,CAAC;IACf2K,SAAS,EAAE,QAAQ;IACnBhJ,WAAW,EAAE7I,YAAY;IACzB2I,YAAY,EAAE3I;EAChB,CAAC;EACDkL,SAAS,EAAE;IACT1C,QAAQ,EAAE,EAAE;IACZD,UAAU,EAAE,YAAY;IACxBtB,eAAe,EAAE;EACnB,CAAC;EACDgG,cAAc,EAAE;IACdhG,eAAe,EAAE,MAAM;IACvBwC,eAAe,EAAE,CAAC;IAClB9C,iBAAiB,EAAE;EACrB,CAAC;EACD6H,SAAS,EAAE;IACT/F,KAAK,EAAE9J,YAAY;IACnB6J,QAAQ,EAAE,EAAE;IACZD,UAAU,EAAE;EACd,CAAC;EACD4F,KAAK,EAAE;IACL2D,MAAM,EAAE,CAAC;IACT7K,eAAe,EAAEnI,OAAO;IACxBoI,YAAY,EAAE,CAAC;IACfoK,IAAI,EAAE;EACR,CAAC;EACDxD,iBAAiB,EAAE;IACjBwD,IAAI,EAAE;EACR,CAAC;EACDpD,oBAAoB,EAAE;IACpBoD,IAAI,EAAE,CAAC;IACPG,aAAa,EAAE;EACjB,CAAC;EACDjO,UAAU,EAAE;IACVmO,SAAS,EAAE,EAAE;IACbF,aAAa,EAAE,KAAK;IACpBM,UAAU,EAAE,QAAQ;IACpBC,iBAAiB,EAAE,CAAC;IACpBC,iBAAiB,EAAEvT,QAAQ;IAC3BiK,YAAY,EAAE;EAChB,CAAC;EACDoF,oBAAoB,EAAE;IACpBnF,UAAU,EAAE;EACd,CAAC;EACDoF,uBAAuB,EAAE;IACvBT,cAAc,EAAE,QAAQ;IACxBwE,UAAU,EAAE,QAAQ;IACpB7K,YAAY,EAAE,EAAE;IAChBsC,KAAK,EAAE,EAAE;IACTqC,MAAM,EAAE,EAAE;IACVqG,WAAW,EAAE,CAAC;IACdC,WAAW,EAAE;EACf,CAAC;EACDlE,kBAAkB,EAAE;IAClBzF,QAAQ,EAAE,EAAE;IACZC,KAAK,EAAE,MAAM;IACbE,YAAY,EAAE;EAChB,CAAC;EACDiD,aAAa,EAAE;IACbzC,QAAQ,EAAE,UAAU;IACpBsC,GAAG,EAAE,CAAC;IACNtE,KAAK,EAAE,CAAC;IACR0E,MAAM,EAAE,EAAE;IACVrC,KAAK,EAAE,EAAE;IACTuI,UAAU,EAAE,QAAQ;IACpBxE,cAAc,EAAE,QAAQ;IACxBtG,eAAe,EAAE;EACnB,CAAC;EACD6E,IAAI,EAAE;IACJtD,QAAQ,EAAE,EAAE;IACZC,KAAK,EAAE1J,aAAa;IACpByJ,QAAQ,EAAE,EAAE;IACZoJ,SAAS,EAAE;EACb,CAAC;EACDxE,SAAS,EAAE;IACTvB,MAAM,EAAE5L,yBAAyB;IACjCmS,cAAc,EAAE,CAAC;IACjBC,cAAc,EAAE3T,QAAQ;IACxB6H,UAAU,EAAE,CAAC;IACbmC,SAAS,EAAE;EACb,CAAC;EACD4D,uBAAuB,EAAE;IACvBkF,YAAY,EAAE,CAAC;IACfjL,UAAU,EAAE,CAAC;IACbsC,WAAW,EAAE;EACf,CAAC;EACD0D,cAAc,EAAE;IACd/C,KAAK,EAAEtJ,kBAAkB;IACzB2L,MAAM,EAAE3L;EACV,CAAC;EACDuM,oBAAoB,EAAE;IACpBvF,YAAY,EAAE;EAChB,CAAC;EACDoL,mBAAmB,EAAE;IACnBzG,MAAM,EAAE;EACV,CAAC;EACDtC,eAAe,EAAE;IACfX,UAAU,EAAE,EAAE;IACdC,WAAW,EAAE,EAAE;IACf4I,aAAa,EAAE,KAAK;IACpBc,QAAQ,EAAE;EACZ,CAAC;EACDrG,qBAAqB,EAAE;IACrBuF,aAAa,EAAE,KAAK;IACpBe,QAAQ,EAAE;EACZ,CAAC;EACD9F,uBAAuB,EAAE;IACvBvD,QAAQ,EAAE,UAAU;IACpBsC,GAAG,EAAE,CAAC;IACNtE,KAAK,EAAE;EACT,CAAC;EACD2F,0BAA0B,EAAE;IAC1BS,cAAc,EAAE,QAAQ;IACxBwE,UAAU,EAAE,QAAQ;IACpB7K,YAAY,EAAE,EAAE;IAChBsC,KAAK,EAAE,EAAE;IACTqC,MAAM,EAAE,EAAE;IACVqG,WAAW,EAAE,CAAC;IACdC,WAAW,EAAE;EACf,CAAC;EACDpF,qBAAqB,EAAE;IACrBvE,QAAQ,EAAE,EAAE;IACZC,KAAK,EAAE,MAAM;IACbE,YAAY,EAAE;EAChB,CAAC;EACDsB,kBAAkB,EAAE;IAClBd,QAAQ,EAAE,UAAU;IACpBsC,GAAG,EAAE,CAAC;IACNzE,IAAI,EAAE,CAAC;IACPG,KAAK,EAAE,CAAC;IACR0F,MAAM,EAAE,CAAC;IACTkF,UAAU,EAAE,QAAQ;IACpBxE,cAAc,EAAE;EAClB,CAAC;EACDnD,gBAAgB,EAAE;IAChB3B,KAAK,EAAE,MAAM;IACbD,QAAQ,EAAE,EAAE;IACZiK,eAAe,EAAE,iBAAiB;IAClCC,gBAAgB,EAAE;MAAElJ,KAAK,EAAE,CAAC;MAAEqC,MAAM,EAAE;IAAE;EAC1C;AACF,CAAC;AAED,MAAM8G,eAAe,GAAG5R,KAAK,IAAI;EAC/B,OAAO;IACL2C,IAAI,EAAE3C,KAAK,CAAC2C,IAAI;IAChBoE,kBAAkB,EAAElJ,8BAA8B,CAACmC,KAAK,CAAC;IACzDqG,mBAAmB,EAAEvI,+BAA+B,CAACkC,KAAK,CAAC;IAC3DwD,QAAQ,EAAEvF,uBAAuB,CAAC+B,KAAK,CAAC,CAACqD;EAC3C,CAAC;AACH,CAAC;AAED,eAAexG,OAAO,CAAC+U,eAAe,EAAE,CAAC,CAAC,CAAC,CAACxS,SAAS,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","Component","View","Image","ImageBackground","TouchableOpacity","Text","KeyboardAvoidingView","Platform","ScrollView","Alert","TextInput","GiftedChat","Bubble","MessageText","Send","InputToolbar","connect","_","moment","Icon","getBottomSpace","Spinner","ProfilePic","PlussChatTime","PDFPopup","Attachment","PlussChatMessage","TextStyle","ConfirmPopup","TEXT_DARK","LINEGREY","TEXT_DARKEST","getMainBrandingColourFromState","getLightBrandingColourFromState","BG_GREY","TEXT_BLUEGREY","getEnabledTabsFromState","get1400","getThumb300","imageExists","isVideo","getImageSource","getFileName","Config","Services","ImageUploader","ImageUploadProgress","ImagePopup","VideoPopup","IMAGE_SIZE_SMALL","IMAGE_SIZE_LARGE","IMAGES_PER_ROW","IMAGE_MARGIN","IMAGE_PREVIEW_AREA_HEIGHT","IMAGE_PREVIEW_SIZE","PlussChat","constructor","props","_defineProperty","event","navigation","navigate","attachment","Type","place","imagesToUpload","isEmpty","state","upload","hasImagesAttached","every","i","uploading","thumbNailExists","checkThumb","setInterval","Promise","all","map","image","resolve","newImage","push","url","allowRetry","thumbNailUrl","thumbnailsExist","clearInterval","setState","a","selectedPDF","keyboardOpen","uploadUri","imageUri","uploadProgress","progress","img","uri","percentage","replace","waitForThumbnails","images","selected","imagePopupSource","imagePopupIndex","indexOf","imagePopupOpen","message","replyingTo","onDeleteMessage","user","_id","uid","showDeleteMessageConfirm","messageToDelete","error","console","log","filter","showFullscreenVideo","length","currentVideoUrl","isSingleTab","tabCount","MIN_COMPOSER_HEIGHT","select","ios","android","currentUser","name","displayName","avatar","isUndefined","profilePic","env","tinyChatDefault","messages","composerHeight","UNSAFE_componentWillMount","updateMessages","UNSAFE_componentWillReceiveProps","nextProps","isEqual","onSend","showUploadMenu","imageUploader","closeGallery","sendMessages","hasImagesReady","text","renderBubble","bubbleProps","wrapperStyle","currentMessage","paddingTop","paddingBottom","minWidth","attachments","paddingHorizontal","createElement","_extends","renderMessageImage","isCustomViewBottom","left","backgroundColor","borderRadius","right","colourBrandingLight","containerToNextStyle","borderBottomLeftRadius","borderBottomRightRadius","containerToPreviousStyle","borderTopLeftRadius","borderTopRightRadius","renderMessage","key","RowId","colourBrandingMain","onPressReply","onReply","onPressDelete","onDelete","renderMessageText","messageTextProps","deleted","textStyle","fontFamily","fontSize","color","marginTop","marginBottom","marginLeft","marginRight","linkStyle","renderTime","renderDay","dayProps","renderCustomView","position","containerWidth","style","styles","imagesContainer","width","paddingVertical","thumb","onPress","toggleFullscreenVideo","bind","messageImageSmall","messageImageLarge","source","imagePlayContainer","type","iconStyle","imageControlIcon","onPressImage","onOpenAttachment","title","onPressEvent","eventContainer","eventImage","eventImageMargin","Thumbnail","eventInfo","numberOfLines","eventTitle","eventInfoAlign","Title","eventDate","utc","StartTime","local","format","onPressAttachment","renderSend","buttonTopOffset","showSendButton","top","flexDirection","alignItems","sendContainer","height","send","alwaysShowSend","containerStyle","renderAccessory","hasAttachment","horizontal","uploadImagesContainer","uploader","progressTextStyle","isVideoUrl","accessoryImageContainer","accessoryImage","imageStyle","accessoryImageBorder","previewItemRemoveButton","onRemoveImage","hitSlop","bottom","previewItemRemoveContainer","previewItemRemoveIcon","renderInputToolbar","inputContainer","renderComposer","accessoryStyle","accessory","renderFooter","renderLoading","justifyContent","alignContent","size","renderAvatar","Diameter","_this$state$replyingT","_this$state$replyingT2","replyingRemoveButton","replyingRemoveContainer","replyingRemoveIcon","input","flex","placeholder","multiline","value","onChangeText","onTextChanged","inputText","lineHeight","minHeight","maxHeight","onFocus","onFocusInput","onBlur","onBlurInput","placeholderTextColor","renderChat","noTab","safeAreaBottom","iosBottomOffset","minInputToolbarHeight","disableKeyboardController","keyboardShouldPersistTaps","renderAvatarOnTop","minComposerHeight","bottomOffset","OS","renderImageUploader","ref","onUploadStarted","onUploadProgress","onUploadSuccess","onUploadFailed","onLibrarySelected","quality","allowsEditing","fileName","popupTitle","userId","multiple","allowVideo","renderImagePopup","visible","index","onClose","renderVideoPlayerPopup","renderPDF","onCloseAttachment","pdfCount","renderDeleteConfirmPopup","onConfirm","onConfirmDeleteMessage","onCancel","onCancelDeleteMessage","yesText","noText","render","noAndroidAvoid","behavior","chatContainer","paddingLeft","paddingRight","resizeMode","textAlign","alignSelf","margin","composerContainer","composerInputWrapper","borderBottomWidth","borderBottomColor","borderWidth","borderColor","borderTopWidth","borderTopColor","settingDropDownOpen","flexWrap","overflow","textShadowColor","textShadowOffset","mapStateToProps"],"sources":["PlussChat.js"],"sourcesContent":["import React, { Component } from 'react';\nimport {\n View,\n Image,\n ImageBackground,\n TouchableOpacity,\n Text,\n KeyboardAvoidingView,\n Platform,\n ScrollView,\n Alert,\n TextInput,\n} from 'react-native';\nimport { GiftedChat, Bubble, MessageText, Send, InputToolbar } from 'react-native-gifted-chat';\nimport { connect } from 'react-redux';\nimport _ from 'lodash';\nimport moment from 'moment';\nimport { Icon } from '@rneui/themed';\nimport { getBottomSpace } from 'react-native-iphone-x-helper';\nimport { Spinner } from './Spinner';\nimport { ProfilePic } from './ProfilePic';\nimport PlussChatTime from './PlussChatTime';\nimport { PDFPopup } from './PDFPopup';\nimport { Attachment } from './Attachment';\nimport PlussChatMessage from './PlussChatMessage';\nimport { TextStyle } from './TextStyle';\nimport { ConfirmPopup } from './ConfirmPopup';\nimport {\n TEXT_DARK,\n LINEGREY,\n TEXT_DARKEST,\n getMainBrandingColourFromState,\n getLightBrandingColourFromState,\n BG_GREY,\n TEXT_BLUEGREY,\n} from '../colours';\nimport { getEnabledTabsFromState, get1400, getThumb300, imageExists, isVideo, getImageSource, getFileName } from '../helper';\nimport Config, { Services } from '../config';\nimport ImageUploader from './ImageUploader';\nimport ImageUploadProgress from './ImageUploadProgress';\nimport { ImagePopup } from './ImagePopup';\nimport { VideoPopup } from './VideoPopup';\n\nconst IMAGE_SIZE_SMALL = 55;\nconst IMAGE_SIZE_LARGE = 110;\nconst IMAGES_PER_ROW = 4;\nconst IMAGE_MARGIN = 2;\nconst IMAGE_PREVIEW_AREA_HEIGHT = 105;\nconst IMAGE_PREVIEW_SIZE = IMAGE_PREVIEW_AREA_HEIGHT - 25;\n\nclass PlussChat extends Component {\n constructor(props) {\n super(props);\n const isSingleTab = this.props.tabCount === 1 && getBottomSpace() > 0;\n this.MIN_COMPOSER_HEIGHT = Platform.select({\n ios: isSingleTab ? 42 : 33,\n android: 41,\n });\n\n this.state = {\n currentUser: {\n _id: this.props.user.uid,\n name: this.props.user.displayName,\n avatar:\n !_.isUndefined(this.props.user.profilePic) && !_.isEmpty(this.props.user.profilePic)\n ? this.props.user.profilePic\n : Config.env.tinyChatDefault,\n },\n\n messages: [],\n imagePopupSource: [],\n imagePopupIndex: 0,\n imagePopupOpen: false,\n imagesToUpload: [],\n showFullscreenVideo: false,\n currentVideoUrl: '',\n showDeleteMessageConfirm: false,\n messageToDelete: null,\n composerHeight: this.MIN_COMPOSER_HEIGHT,\n };\n this.checkThumb = null;\n }\n\n UNSAFE_componentWillMount() {\n this.updateMessages(this.props);\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n // Only update if messages actually changed\n if (nextProps.messages !== this.props.messages) {\n this.updateMessages(nextProps);\n }\n }\n\n updateMessages(props) {\n // Only update if messages actually changed\n if (!_.isUndefined(props.messages) && !_.isEqual(props.messages, this.state.messages)) {\n this.setState({ messages: props.messages });\n }\n }\n\n /***\n *\n * Messaging functionality\n */\n onSend(messages = []) {\n // if (this.chatKey) {\n // this.sendMessage(messages[0]);\n // }\n }\n\n onPressEvent = event => {\n Services.navigation.navigate('eventDetail', { event });\n };\n onPressAttachment = attachment => {\n switch (attachment.Type) {\n case 'Event':\n Services.navigation.navigate('eventDetail', { event: attachment });\n break;\n case 'Place':\n Services.navigation.navigate('placeDetail', { place: attachment });\n break;\n default:\n return;\n }\n };\n\n hasImagesAttached = (imagesToUpload = null) => {\n return !_.isEmpty(imagesToUpload || this.state.imagesToUpload);\n };\n\n hasImagesReady = (imagesToUpload = null) => {\n const upload = imagesToUpload || this.state.imagesToUpload;\n return this.hasImagesAttached(upload) && upload.every(i => !i.uploading && i.thumbNailExists);\n };\n\n waitForThumbnails = () => {\n if (this.checkThumb) return;\n\n this.checkThumb = setInterval(async () => {\n const imagesToUpload = [];\n await Promise.all(\n this.state.imagesToUpload.map(image => {\n return new Promise(async resolve => {\n const newImage = { ...image };\n imagesToUpload.push(newImage);\n if (newImage.url && !newImage.thumbNailExists) {\n newImage.uploading = false;\n newImage.allowRetry = false;\n newImage.thumbNailExists = await imageExists(newImage.thumbNailUrl);\n resolve(newImage.thumbNailExists);\n }\n resolve(true);\n });\n }),\n );\n const thumbnailsExist = imagesToUpload.every(image => !image.url || image.thumbNailExists);\n if (thumbnailsExist) {\n clearInterval(this.checkThumb);\n this.checkThumb = null;\n this.setState({ imagesToUpload });\n }\n }, 2000);\n };\n\n onOpenAttachment = a => {\n this.setState({\n selectedPDF: a,\n });\n };\n\n onCloseAttachment = () => {\n this.setState({\n selectedPDF: null,\n });\n };\n\n showUploadMenu() {\n this.imageUploader.showUploadMenu();\n }\n\n onFocusInput = () => {\n this.setState({\n keyboardOpen: true,\n });\n if (this.props.keyboardOpen) {\n this.props.keyboardOpen();\n }\n };\n\n onBlurInput = () => {\n this.setState({\n keyboardOpen: false,\n });\n };\n\n onUploadStarted = (uploadUri, imageUri) => {\n const imagesToUpload = [\n ...this.state.imagesToUpload,\n {\n uploading: true,\n uploadProgress: '0%',\n uploadUri,\n imageUri,\n allowRetry: true,\n },\n ];\n this.setState({ imagesToUpload });\n };\n\n onUploadProgress = progress => {\n const imagesToUpload = [...this.state.imagesToUpload];\n imagesToUpload.map(img => {\n if (img.uploadUri === progress.uri) {\n img.uploadProgress = progress.percentage;\n img.uploading = true;\n img.allowRetry = true;\n }\n });\n this.setState({ imagesToUpload });\n };\n\n onUploadSuccess = async (uri, uploadUri) => {\n const imagesToUpload = [...this.state.imagesToUpload];\n imagesToUpload.map(img => {\n if (img.uploadUri === uploadUri && img.uploading) {\n img.url = uri.replace('/general/', '/general1400/');\n img.thumbNailExists = false;\n img.thumbNailUrl = getThumb300(img.url);\n img.allowRetry = true;\n }\n });\n this.setState({ imagesToUpload }, () => this.waitForThumbnails());\n };\n\n onUploadFailed = uploadUri => {\n const imagesToUpload = [...this.state.imagesToUpload];\n imagesToUpload.map(img => {\n if (img.uploadUri === uploadUri) {\n img.uploading = true; // Requried for retry\n img.uploadProgress = '';\n img.allowRetry = true;\n }\n });\n this.setState({ imagesToUpload });\n };\n\n onLibrarySelected = uri => {\n const imagesToUpload = [\n ...this.state.imagesToUpload,\n {\n uploading: false,\n allowRetry: false,\n url: get1400(uri),\n thumbNailExists: true,\n thumbNailUrl: getThumb300(uri),\n },\n ];\n this.setState({ imagesToUpload });\n };\n\n onPressImage = (images, selected) => {\n this.setState({\n imagePopupSource: images,\n imagePopupIndex: images.indexOf(selected),\n imagePopupOpen: true,\n });\n };\n\n onReply = message => {\n this.setState({\n replyingTo: message,\n });\n };\n\n onDelete = message => {\n // Only proceed if delete handler is provided\n if (!this.props.onDeleteMessage) {\n return;\n }\n\n // Only allow deletion of own messages\n if (message.user._id !== this.props.user.uid) {\n return;\n }\n\n this.setState({\n showDeleteMessageConfirm: true,\n messageToDelete: message,\n });\n };\n\n onCancelDeleteMessage = () => {\n this.setState({\n showDeleteMessageConfirm: false,\n messageToDelete: null,\n });\n };\n\n onConfirmDeleteMessage = async () => {\n const { messageToDelete } = this.state;\n if (!messageToDelete) return;\n\n this.setState({\n showDeleteMessageConfirm: false,\n });\n\n try {\n // Call the parent's delete handler if provided\n if (this.props.onDeleteMessage) {\n await this.props.onDeleteMessage(messageToDelete);\n }\n\n this.setState({\n messageToDelete: null,\n });\n } catch (error) {\n // Handle error gracefully if parent handler fails\n console.log('onConfirmDeleteMessage error', error);\n // Error is already handled by parent component\n this.setState({ messageToDelete: null });\n }\n };\n\n closeGallery() {\n this.setState({\n imagePopupSource: [],\n imagePopupIndex: 0,\n imagePopupOpen: false,\n });\n }\n\n onRemoveImage = url => {\n const imagesToUpload = this.state.imagesToUpload.filter(image => image.url !== url);\n this.setState({ imagesToUpload });\n };\n\n toggleFullscreenVideo = url => {\n if (typeof url !== 'string') url = '';\n this.setState({ showFullscreenVideo: url.length > 0, currentVideoUrl: url });\n };\n\n sendMessages(messages) {\n if (this.hasImagesAttached()) {\n // Don't allow send if attached images aren't ready\n if (!this.hasImagesReady()) return;\n messages[0].image = this.state.imagesToUpload.map(image => image.url);\n }\n if (_.isEmpty(messages[0].text)) {\n messages[0].text = '';\n }\n if (!messages[0].text && !messages[0].image) return;\n\n if (this.state.replyingTo) {\n messages[0].replyingTo = this.state.replyingTo;\n }\n\n this.props.onSend(messages);\n this.setState({ imagesToUpload: [], replyingTo: null });\n }\n\n /**\n *\n * Render Functions\n */\n renderBubble(bubbleProps) {\n const wrapperStyle = {};\n if (!_.isEmpty(bubbleProps.currentMessage.text) && !_.isEmpty(bubbleProps.currentMessage.image)) {\n wrapperStyle.paddingTop = 8;\n wrapperStyle.paddingBottom = 16;\n wrapperStyle.minWidth = 142; // 110 image width + 16 padding either side\n }\n if (!_.isEmpty(bubbleProps.currentMessage.attachments)) {\n wrapperStyle.paddingTop = 8;\n wrapperStyle.paddingBottom = 16;\n wrapperStyle.paddingHorizontal = 16;\n }\n return (\n <Bubble\n {...bubbleProps}\n renderMessageImage={() => null}\n isCustomViewBottom={true}\n wrapperStyle={{\n left: {\n backgroundColor: LINEGREY,\n borderRadius: 25,\n ...wrapperStyle,\n },\n right: {\n backgroundColor: this.props.colourBrandingLight,\n borderRadius: 25,\n ...wrapperStyle,\n },\n }}\n containerToNextStyle={{\n left: {\n borderBottomLeftRadius: 5,\n },\n right: {\n borderBottomRightRadius: 5,\n },\n }}\n containerToPreviousStyle={{\n left: {\n borderTopLeftRadius: 5,\n },\n right: {\n borderTopRightRadius: 5,\n },\n }}\n />\n );\n }\n renderMessage(props) {\n return (\n <PlussChatMessage\n key={props.RowId}\n colourBrandingMain={this.props.colourBrandingMain}\n onPressReply={() => {\n this.onReply(props.currentMessage);\n }}\n onPressDelete={\n this.props.onDeleteMessage\n ? () => {\n this.onDelete(props.currentMessage);\n }\n : null\n }\n {...props}\n />\n );\n }\n renderMessageText(messageTextProps) {\n // If message is deleted, show placeholder text\n const props = messageTextProps.currentMessage.deleted\n ? {\n ...messageTextProps,\n currentMessage: {\n ...messageTextProps.currentMessage,\n text: '[Message deleted]',\n },\n }\n : messageTextProps;\n\n return (\n <MessageText\n {...props}\n textStyle={{\n left: {\n fontFamily: 'sf-regular',\n fontSize: 16,\n color: TEXT_DARKEST,\n marginTop: 10,\n marginBottom: 10,\n marginLeft: 15,\n marginRight: 15,\n },\n right: {\n fontFamily: 'sf-regular',\n fontSize: 16,\n color: this.props.colourBrandingMain,\n marginTop: 10,\n marginBottom: 10,\n marginLeft: 15,\n marginRight: 15,\n },\n }}\n linkStyle={{\n left: {\n color: TEXT_DARKEST,\n },\n right: {\n color: this.props.colourBrandingMain,\n },\n }}\n />\n );\n }\n renderTime() {\n return null;\n }\n renderDay(dayProps) {\n return (\n <PlussChatTime\n {...dayProps}\n textStyle={{\n fontFamily: 'sf-semibold',\n color: TEXT_DARK,\n fontSize: 12,\n }}\n />\n );\n }\n renderCustomView({ currentMessage, position }) {\n // Don't show images or attachments for deleted messages\n if (currentMessage.deleted) {\n return null;\n }\n\n if (currentMessage.image) {\n const images = typeof currentMessage.image === 'string' ? [currentMessage.image] : currentMessage.image;\n const containerWidth = (() => {\n if (images.length === 0) return 0;\n if (images.length === 1) return IMAGE_SIZE_LARGE;\n if (images.length <= IMAGES_PER_ROW) return (IMAGE_SIZE_SMALL + IMAGE_MARGIN) * images.length;\n return (IMAGE_SIZE_SMALL + IMAGE_MARGIN) * IMAGES_PER_ROW;\n })();\n return (\n <View style={[styles.imagesContainer, { width: containerWidth, paddingVertical: currentMessage.text ? 0 : 20 }]}>\n {images.map(img => {\n const thumb = getThumb300(img);\n if (isVideo(img)) {\n return (\n <TouchableOpacity key={thumb} onPress={this.toggleFullscreenVideo.bind(this, img)}>\n <ImageBackground style={images.length > 1 ? styles.messageImageSmall : styles.messageImageLarge} source={{ uri: thumb }}>\n <View style={styles.imagePlayContainer}>\n <Icon name=\"play\" type=\"font-awesome\" iconStyle={styles.imageControlIcon} />\n </View>\n </ImageBackground>\n </TouchableOpacity>\n );\n }\n return (\n <TouchableOpacity key={thumb} onPress={() => this.onPressImage(images, img)}>\n <Image source={{ uri: thumb }} style={images.length > 1 ? styles.messageImageSmall : styles.messageImageLarge} />\n </TouchableOpacity>\n );\n })}\n </View>\n );\n }\n if (!_.isEmpty(currentMessage.attachments)) {\n return (\n <View>\n {currentMessage.attachments.map((url, i) => {\n return (\n <Attachment\n onPress={() => {\n this.onOpenAttachment(url);\n }}\n key={i}\n title={getFileName(url)}\n />\n );\n })}\n </View>\n );\n }\n if (currentMessage.event) {\n return (\n <TouchableOpacity onPress={this.onPressEvent.bind(this, currentMessage.event)}>\n <View style={styles.eventContainer[position]}>\n <Image style={[styles.eventImage, styles.eventImageMargin[position]]} source={{ uri: currentMessage.event.Thumbnail }} />\n <View style={styles.eventInfo}>\n <Text\n numberOfLines={3}\n style={[styles.eventTitle, styles.eventInfoAlign[position], { color: this.props.colourBrandingMain }]}\n >\n {currentMessage.event.Title}\n </Text>\n <Text style={[styles.eventDate, styles.eventInfoAlign[position], { color: this.props.colourBrandingMain }]}>\n {moment\n .utc(currentMessage.event.StartTime)\n .local()\n .format('ddd D MMM')}\n </Text>\n </View>\n </View>\n </TouchableOpacity>\n );\n }\n if (currentMessage.attachment) {\n return (\n <TouchableOpacity onPress={this.onPressAttachment.bind(this, currentMessage.attachment)}>\n <View style={styles.eventContainer[position]}>\n <Image style={[styles.eventImage, styles.eventImageMargin[position]]} source={{ uri: currentMessage.attachment.Thumbnail }} />\n <View style={styles.eventInfo}>\n <Text\n numberOfLines={3}\n style={[styles.eventTitle, styles.eventInfoAlign[position], { color: this.props.colourBrandingMain }]}\n >\n {currentMessage.attachment.Title}\n </Text>\n {currentMessage.attachment.StartTime && (\n <Text style={[styles.eventDate, styles.eventInfoAlign[position], { color: this.props.colourBrandingMain }]}>\n {moment\n .utc(currentMessage.attachment.StartTime)\n .local()\n .format('ddd D MMM')}\n </Text>\n )}\n </View>\n </View>\n </TouchableOpacity>\n );\n }\n return null;\n }\n\n renderSend(props) {\n const buttonTopOffset = this.state.replyingTo ? 46 : 4;\n const showSendButton = !_.isEmpty(props.text) || this.hasImagesReady(props.imagesToUpload);\n return (\n <View\n style={{\n position: 'absolute',\n top: buttonTopOffset,\n right: 8,\n flexDirection: 'row',\n alignItems: 'center',\n }}\n >\n {/* Image upload button - always visible */}\n <TouchableOpacity\n onPress={this.showUploadMenu.bind(this)}\n style={[\n styles.sendContainer,\n {\n right: _.isEmpty(props.text) && !this.hasImagesReady(props.imagesToUpload) ? 0 : this.MIN_COMPOSER_HEIGHT,\n\n width: this.MIN_COMPOSER_HEIGHT,\n height: this.MIN_COMPOSER_HEIGHT,\n },\n ]}\n >\n <Icon name={'picture-o'} type=\"font-awesome\" iconStyle={[styles.send, { width: this.MIN_COMPOSER_HEIGHT }]} />\n </TouchableOpacity>\n\n {/* Send button - only visible when there's text or images */}\n {showSendButton && (\n <Send\n {...props}\n alwaysShowSend={true}\n onSend={props.onSend}\n text={props.text || ' '}\n containerStyle={[\n styles.sendContainer,\n {\n width: this.MIN_COMPOSER_HEIGHT,\n height: this.MIN_COMPOSER_HEIGHT,\n },\n ]}\n >\n <Icon name={'paper-plane'} type=\"font-awesome\" iconStyle={[styles.send, { width: this.MIN_COMPOSER_HEIGHT }]} />\n </Send>\n )}\n </View>\n );\n }\n\n renderAccessory(props) {\n const hasAttachment = this.hasImagesAttached(props.imagesToUpload);\n if (!hasAttachment) {\n return null;\n }\n return (\n <ScrollView horizontal style={styles.uploadImagesContainer}>\n {props.imagesToUpload.map(image => {\n if (image.uploading) {\n return (\n <ImageUploadProgress\n key={image.uploadUri}\n uploader={this.imageUploader}\n image={image}\n color={this.props.colourBrandingMain}\n style={{ width: IMAGE_PREVIEW_SIZE, marginRight: 10 }}\n progressTextStyle={{ fontSize: 10 }}\n />\n );\n }\n const isVideoUrl = isVideo(image.url);\n return (\n <View key={image.url} style={styles.accessoryImageContainer}>\n <ImageBackground\n style={styles.accessoryImage}\n imageStyle={styles.accessoryImageBorder}\n source={getImageSource(image.thumbNailExists ? image.thumbNailUrl : image.url)}\n >\n {isVideoUrl && (\n <View style={styles.imagePlayContainer}>\n <TouchableOpacity onPress={this.toggleFullscreenVideo.bind(this, image.url)}>\n <Icon name=\"play\" type=\"font-awesome\" iconStyle={styles.imageControlIcon} />\n </TouchableOpacity>\n </View>\n )}\n </ImageBackground>\n <TouchableOpacity\n style={styles.previewItemRemoveButton}\n onPress={() => this.onRemoveImage(image.url)}\n hitSlop={{ top: 8, right: 8, bottom: 8, left: 8 }}\n >\n <View style={[styles.previewItemRemoveContainer, { backgroundColor: this.props.colourBrandingMain }]}>\n <Icon name=\"times\" type=\"font-awesome\" iconStyle={styles.previewItemRemoveIcon} />\n </View>\n </TouchableOpacity>\n </View>\n );\n })}\n </ScrollView>\n );\n }\n\n renderInputToolbar(props) {\n const hasAttachment = this.hasImagesAttached(props.imagesToUpload);\n return (\n <InputToolbar\n {...props}\n containerStyle={styles.inputContainer}\n renderComposer={this.renderComposer.bind(this)}\n renderAccessory={hasAttachment ? this.renderAccessory.bind(this) : null}\n accessoryStyle={hasAttachment && styles.accessory}\n />\n );\n }\n renderFooter() {\n // if (this.state.keyboardOpen) {\n // return null;\n // }\n // fixes an issue where there's no gap between bottom message and reply container\n return <View style={{ height: 10 }} />;\n }\n renderLoading() {\n return (\n <View style={{ marginTop: 15, justifyContent: 'center', alignContent: 'center' }}>\n <Spinner size={'small'} color={this.props.colourBrandingMain} />\n </View>\n );\n }\n renderAvatar(props) {\n return (\n <View style={{ marginRight: 2 }}>\n <ProfilePic ProfilePic={props.currentMessage.user.avatar} Diameter={28} />\n </View>\n );\n }\n renderComposer(props) {\n return (\n <View style={{ width: '100%' }}>\n {/* Replying to section - stacked vertically on top */}\n {this.state.replyingTo && (\n <View style={styles.replyingTo}>\n <TextStyle type=\"body\">\n Replying to {_.isEmpty(this.state.replyingTo?.user?.name) ? 'message' : this.state.replyingTo?.user?.name}\n </TextStyle>\n <TouchableOpacity\n style={styles.replyingRemoveButton}\n onPress={() => this.onReply(null)}\n hitSlop={{ top: 8, right: 8, bottom: 8, left: 8 }}\n >\n <View style={[styles.replyingRemoveContainer, { backgroundColor: this.props.colourBrandingMain }]}>\n <Icon name=\"times\" type=\"font-awesome\" iconStyle={styles.replyingRemoveIcon} />\n </View>\n </TouchableOpacity>\n </View>\n )}\n {/* Horizontal row for input - buttons are absolutely positioned via renderSend */}\n <View style={{ flexDirection: 'row', alignItems: 'flex-end', width: '100%', paddingBottom: 8 }}>\n <View\n style={[\n styles.input,\n {\n flex: 1,\n marginRight:\n _.isEmpty(props.text) && !this.hasImagesReady(props.imagesToUpload)\n ? 16 + this.MIN_COMPOSER_HEIGHT\n : 2 * (this.MIN_COMPOSER_HEIGHT + 8),\n paddingHorizontal: 12,\n paddingVertical: Platform.select({ ios: 8, android: 6 }),\n },\n ]}\n >\n <TextInput\n placeholder=\"Type a message...\"\n multiline\n value={props.text}\n onChangeText={props.onTextChanged}\n style={[\n styles.inputText,\n {\n lineHeight: 20,\n minHeight: this.MIN_COMPOSER_HEIGHT - 16,\n maxHeight: 100,\n },\n ]}\n onFocus={this.onFocusInput.bind(this)}\n onBlur={this.onBlurInput.bind(this)}\n placeholderTextColor=\"#999\"\n />\n </View>\n </View>\n </View>\n );\n }\n\n /***\n * Main Render\n */\n renderChat() {\n const { tabCount, noTab } = this.props;\n const safeAreaBottom = getBottomSpace();\n // Adjusted for react-native-gifted-chat v2: account for tab bar + safe area\n const iosBottomOffset = (tabCount === 1 || noTab ? 0 : 49) + safeAreaBottom;\n const minInputToolbarHeight =\n this.MIN_COMPOSER_HEIGHT + 32 + (this.state.replyingTo ? 38 : 0) + (this.hasImagesAttached() ? IMAGE_PREVIEW_AREA_HEIGHT : 0);\n\n return (\n <GiftedChat\n disableKeyboardController={true}\n alwaysShowSend={false}\n keyboardShouldPersistTaps={'never'}\n renderAvatarOnTop\n minInputToolbarHeight={minInputToolbarHeight}\n minComposerHeight={this.MIN_COMPOSER_HEIGHT}\n bottomOffset={Platform.OS === 'android' ? 0 : iosBottomOffset}\n onSend={this.sendMessages.bind(this)}\n messages={this.state.messages}\n user={this.state.currentUser}\n renderBubble={this.renderBubble.bind(this)}\n renderMessage={this.renderMessage.bind(this)}\n renderMessageText={this.renderMessageText.bind(this)}\n renderTime={this.renderTime.bind(this)}\n renderDay={this.renderDay.bind(this)}\n renderCustomView={this.renderCustomView.bind(this)}\n renderSend={this.renderSend.bind(this)}\n renderInputToolbar={this.renderInputToolbar.bind(this)}\n renderFooter={this.renderFooter.bind(this)}\n renderLoading={this.renderLoading.bind(this)}\n renderAvatar={this.renderAvatar.bind(this)}\n imagesToUpload={this.state.imagesToUpload}\n />\n );\n }\n\n renderImageUploader() {\n return (\n <ImageUploader\n ref={ref => (this.imageUploader = ref)}\n onUploadStarted={this.onUploadStarted}\n onUploadProgress={this.onUploadProgress}\n onUploadSuccess={this.onUploadSuccess}\n onUploadFailed={this.onUploadFailed}\n onLibrarySelected={this.onLibrarySelected}\n quality={0.8}\n allowsEditing={false}\n fileName={'imageInput'}\n popupTitle={'Add Image'}\n userId={this.props.user.uid}\n multiple\n allowVideo\n />\n );\n }\n\n renderImagePopup() {\n const { imagePopupOpen, imagePopupSource, imagePopupIndex } = this.state;\n return <ImagePopup visible={imagePopupOpen} images={imagePopupSource} index={imagePopupIndex} onClose={this.closeGallery.bind(this)} />;\n }\n\n renderVideoPlayerPopup() {\n const { showFullscreenVideo, currentVideoUrl } = this.state;\n if (!currentVideoUrl) return;\n\n return <VideoPopup uri={currentVideoUrl} visible={showFullscreenVideo} onClose={this.toggleFullscreenVideo} />;\n }\n\n renderPDF() {\n if (_.isEmpty(this.state.selectedPDF)) {\n return null;\n }\n return (\n <PDFPopup source={this.state.selectedPDF} onClose={this.onCloseAttachment} title={getFileName(this.state.selectedPDF)} pdfCount={1} />\n );\n }\n\n renderDeleteConfirmPopup() {\n return (\n <ConfirmPopup\n visible={this.state.showDeleteMessageConfirm}\n onConfirm={this.onConfirmDeleteMessage}\n onCancel={this.onCancelDeleteMessage}\n text=\"Are you sure you want to delete this message?\"\n yesText=\"Delete\"\n noText=\"Cancel\"\n />\n );\n }\n\n render() {\n if (Platform.OS === 'android' && !this.props.noAndroidAvoid) {\n return (\n <KeyboardAvoidingView behavior={'padding'} style={styles.chatContainer}>\n {this.renderChat()}\n {this.renderImageUploader()}\n {this.renderImagePopup()}\n {this.renderVideoPlayerPopup()}\n {this.renderPDF()}\n {this.renderDeleteConfirmPopup()}\n </KeyboardAvoidingView>\n );\n }\n return (\n <View style={styles.chatContainer}>\n {this.renderChat()}\n {this.renderImageUploader()}\n {this.renderImagePopup()}\n {this.renderVideoPlayerPopup()}\n {this.renderPDF()}\n {this.renderDeleteConfirmPopup()}\n </View>\n );\n }\n}\n\nconst styles = {\n chatContainer: {\n flex: 1,\n justifyContent: 'center',\n },\n eventContainer: {\n left: {\n paddingTop: 5,\n paddingLeft: 15,\n paddingRight: 15,\n paddingBottom: 5,\n flexDirection: 'row',\n },\n right: {\n paddingTop: 5,\n paddingLeft: 15,\n paddingRight: 15,\n paddingBottom: 5,\n flexDirection: 'row-reverse',\n },\n },\n eventImage: {\n width: 80,\n height: 80,\n resizeMode: 'cover',\n borderRadius: 2,\n },\n eventImageMargin: {\n right: {\n marginLeft: 15,\n },\n left: {\n marginRight: 15,\n },\n },\n eventInfo: {\n minHeight: 80,\n width: 150,\n },\n eventTitle: {\n fontSize: 12,\n fontFamily: 'sf-bold',\n backgroundColor: 'rgba(255,255,255,0)',\n },\n eventInfoAlign: {\n left: {\n textAlign: 'left',\n },\n right: {\n textAlign: 'right',\n },\n },\n messageImageLarge: {\n width: IMAGE_SIZE_LARGE,\n height: IMAGE_SIZE_LARGE,\n borderRadius: 2,\n alignSelf: 'center',\n },\n messageImageSmall: {\n width: IMAGE_SIZE_SMALL,\n height: IMAGE_SIZE_SMALL,\n borderRadius: 2,\n alignSelf: 'center',\n marginRight: IMAGE_MARGIN,\n marginBottom: IMAGE_MARGIN,\n },\n eventDate: {\n fontSize: 12,\n fontFamily: 'sf-regular',\n backgroundColor: 'rgba(255,255,255,0)',\n },\n inputContainer: {\n backgroundColor: '#fff',\n paddingVertical: 8,\n paddingHorizontal: 8,\n },\n inputText: {\n color: TEXT_DARKEST,\n fontSize: 14,\n fontFamily: 'sf-medium',\n },\n input: {\n margin: 0,\n backgroundColor: BG_GREY,\n borderRadius: 5,\n flex: 1,\n },\n composerContainer: {\n flex: 1,\n },\n composerInputWrapper: {\n flex: 1,\n flexDirection: 'row',\n },\n replyingTo: {\n minHeight: 30,\n flexDirection: 'row',\n alignItems: 'center',\n borderBottomWidth: 1,\n borderBottomColor: LINEGREY,\n marginBottom: 8,\n },\n replyingRemoveButton: {\n marginLeft: 10,\n },\n replyingRemoveContainer: {\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: 10,\n width: 20,\n height: 20,\n borderWidth: 2,\n borderColor: '#fff',\n },\n replyingRemoveIcon: {\n fontSize: 10,\n color: '#fff',\n marginBottom: 1,\n },\n sendContainer: {\n position: 'absolute',\n top: 0,\n right: 0,\n height: 30,\n width: 30,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#fff',\n },\n send: {\n fontSize: 15,\n color: TEXT_BLUEGREY,\n fontSize: 24,\n textAlign: 'center',\n },\n accessory: {\n height: IMAGE_PREVIEW_AREA_HEIGHT,\n borderTopWidth: 1,\n borderTopColor: LINEGREY,\n paddingTop: 8,\n marginTop: 8,\n },\n accessoryImageContainer: {\n paddingRight: 8,\n paddingTop: 8,\n marginRight: 5,\n },\n accessoryImage: {\n width: IMAGE_PREVIEW_SIZE,\n height: IMAGE_PREVIEW_SIZE,\n },\n accessoryImageBorder: {\n borderRadius: 2,\n },\n settingDropDownOpen: {\n height: 'auto',\n },\n imagesContainer: {\n marginLeft: 10,\n marginRight: 10,\n flexDirection: 'row',\n flexWrap: 'wrap',\n },\n uploadImagesContainer: {\n flexDirection: 'row',\n overflow: 'visible',\n },\n previewItemRemoveButton: {\n position: 'absolute',\n top: 0,\n right: 0,\n },\n previewItemRemoveContainer: {\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: 10,\n width: 20,\n height: 20,\n borderWidth: 2,\n borderColor: '#fff',\n },\n previewItemRemoveIcon: {\n fontSize: 10,\n color: '#fff',\n marginBottom: 1,\n },\n imagePlayContainer: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n alignItems: 'center',\n justifyContent: 'center',\n },\n imageControlIcon: {\n color: '#fff',\n fontSize: 20,\n textShadowColor: 'rgba(0,0,0,0.3)',\n textShadowOffset: { width: 2, height: 2 },\n },\n};\n\nconst mapStateToProps = state => {\n return {\n user: state.user,\n colourBrandingMain: getMainBrandingColourFromState(state),\n colourBrandingLight: getLightBrandingColourFromState(state),\n tabCount: getEnabledTabsFromState(state).length,\n };\n};\n\nexport default connect(mapStateToProps, {})(PlussChat);\n"],"mappings":";;;;AAAA,OAAOA,KAAK,IAAIC,SAAS,QAAQ,OAAO;AACxC,SACEC,IAAI,EACJC,KAAK,EACLC,eAAe,EACfC,gBAAgB,EAChBC,IAAI,EACJC,oBAAoB,EACpBC,QAAQ,EACRC,UAAU,EACVC,KAAK,EACLC,SAAS,QACJ,cAAc;AACrB,SAASC,UAAU,EAAEC,MAAM,EAAEC,WAAW,EAAEC,IAAI,EAAEC,YAAY,QAAQ,0BAA0B;AAC9F,SAASC,OAAO,QAAQ,aAAa;AACrC,OAAOC,CAAC,MAAM,QAAQ;AACtB,OAAOC,MAAM,MAAM,QAAQ;AAC3B,SAASC,IAAI,QAAQ,eAAe;AACpC,SAASC,cAAc,QAAQ,8BAA8B;AAC7D,SAASC,OAAO,QAAQ,WAAW;AACnC,SAASC,UAAU,QAAQ,cAAc;AACzC,OAAOC,aAAa,MAAM,iBAAiB;AAC3C,SAASC,QAAQ,QAAQ,YAAY;AACrC,SAASC,UAAU,QAAQ,cAAc;AACzC,OAAOC,gBAAgB,MAAM,oBAAoB;AACjD,SAASC,SAAS,QAAQ,aAAa;AACvC,SAASC,YAAY,QAAQ,gBAAgB;AAC7C,SACEC,SAAS,EACTC,QAAQ,EACRC,YAAY,EACZC,8BAA8B,EAC9BC,+BAA+B,EAC/BC,OAAO,EACPC,aAAa,QACR,YAAY;AACnB,SAASC,uBAAuB,EAAEC,OAAO,EAAEC,WAAW,EAAEC,WAAW,EAAEC,OAAO,EAAEC,cAAc,EAAEC,WAAW,QAAQ,WAAW;AAC5H,OAAOC,MAAM,IAAIC,QAAQ,QAAQ,WAAW;AAC5C,OAAOC,aAAa,MAAM,iBAAiB;AAC3C,OAAOC,mBAAmB,MAAM,uBAAuB;AACvD,SAASC,UAAU,QAAQ,cAAc;AACzC,SAASC,UAAU,QAAQ,cAAc;AAEzC,MAAMC,gBAAgB,GAAG,EAAE;AAC3B,MAAMC,gBAAgB,GAAG,GAAG;AAC5B,MAAMC,cAAc,GAAG,CAAC;AACxB,MAAMC,YAAY,GAAG,CAAC;AACtB,MAAMC,yBAAyB,GAAG,GAAG;AACrC,MAAMC,kBAAkB,GAAGD,yBAAyB,GAAG,EAAE;AAEzD,MAAME,SAAS,SAASvD,SAAS,CAAC;EAChCwD,WAAWA,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;IAACC,eAAA,uBA2DAC,KAAK,IAAI;MACtBf,QAAQ,CAACgB,UAAU,CAACC,QAAQ,CAAC,aAAa,EAAE;QAAEF;MAAM,CAAC,CAAC;IACxD,CAAC;IAAAD,eAAA,4BACmBI,UAAU,IAAI;MAChC,QAAQA,UAAU,CAACC,IAAI;QACrB,KAAK,OAAO;UACVnB,QAAQ,CAACgB,UAAU,CAACC,QAAQ,CAAC,aAAa,EAAE;YAAEF,KAAK,EAAEG;UAAW,CAAC,CAAC;UAClE;QACF,KAAK,OAAO;UACVlB,QAAQ,CAACgB,UAAU,CAACC,QAAQ,CAAC,aAAa,EAAE;YAAEG,KAAK,EAAEF;UAAW,CAAC,CAAC;UAClE;QACF;UACE;MACJ;IACF,CAAC;IAAAJ,eAAA,4BAEmB,CAACO,cAAc,GAAG,IAAI,KAAK;MAC7C,OAAO,CAAChD,CAAC,CAACiD,OAAO,CAACD,cAAc,IAAI,IAAI,CAACE,KAAK,CAACF,cAAc,CAAC;IAChE,CAAC;IAAAP,eAAA,yBAEgB,CAACO,cAAc,GAAG,IAAI,KAAK;MAC1C,MAAMG,MAAM,GAAGH,cAAc,IAAI,IAAI,CAACE,KAAK,CAACF,cAAc;MAC1D,OAAO,IAAI,CAACI,iBAAiB,CAACD,MAAM,CAAC,IAAIA,MAAM,CAACE,KAAK,CAACC,CAAC,IAAI,CAACA,CAAC,CAACC,SAAS,IAAID,CAAC,CAACE,eAAe,CAAC;IAC/F,CAAC;IAAAf,eAAA,4BAEmB,MAAM;MACxB,IAAI,IAAI,CAACgB,UAAU,EAAE;MAErB,IAAI,CAACA,UAAU,GAAGC,WAAW,CAAC,YAAY;QACxC,MAAMV,cAAc,GAAG,EAAE;QACzB,MAAMW,OAAO,CAACC,GAAG,CACf,IAAI,CAACV,KAAK,CAACF,cAAc,CAACa,GAAG,CAACC,KAAK,IAAI;UACrC,OAAO,IAAIH,OAAO,CAAC,MAAMI,OAAO,IAAI;YAClC,MAAMC,QAAQ,GAAG;cAAE,GAAGF;YAAM,CAAC;YAC7Bd,cAAc,CAACiB,IAAI,CAACD,QAAQ,CAAC;YAC7B,IAAIA,QAAQ,CAACE,GAAG,IAAI,CAACF,QAAQ,CAACR,eAAe,EAAE;cAC7CQ,QAAQ,CAACT,SAAS,GAAG,KAAK;cAC1BS,QAAQ,CAACG,UAAU,GAAG,KAAK;cAC3BH,QAAQ,CAACR,eAAe,GAAG,MAAMlC,WAAW,CAAC0C,QAAQ,CAACI,YAAY,CAAC;cACnEL,OAAO,CAACC,QAAQ,CAACR,eAAe,CAAC;YACnC;YACAO,OAAO,CAAC,IAAI,CAAC;UACf,CAAC,CAAC;QACJ,CAAC,CACH,CAAC;QACD,MAAMM,eAAe,GAAGrB,cAAc,CAACK,KAAK,CAACS,KAAK,IAAI,CAACA,KAAK,CAACI,GAAG,IAAIJ,KAAK,CAACN,eAAe,CAAC;QAC1F,IAAIa,eAAe,EAAE;UACnBC,aAAa,CAAC,IAAI,CAACb,UAAU,CAAC;UAC9B,IAAI,CAACA,UAAU,GAAG,IAAI;UACtB,IAAI,CAACc,QAAQ,CAAC;YAAEvB;UAAe,CAAC,CAAC;QACnC;MACF,CAAC,EAAE,IAAI,CAAC;IACV,CAAC;IAAAP,eAAA,2BAEkB+B,CAAC,IAAI;MACtB,IAAI,CAACD,QAAQ,CAAC;QACZE,WAAW,EAAED;MACf,CAAC,CAAC;IACJ,CAAC;IAAA/B,eAAA,4BAEmB,MAAM;MACxB,IAAI,CAAC8B,QAAQ,CAAC;QACZE,WAAW,EAAE;MACf,CAAC,CAAC;IACJ,CAAC;IAAAhC,eAAA,uBAMc,MAAM;MACnB,IAAI,CAAC8B,QAAQ,CAAC;QACZG,YAAY,EAAE;MAChB,CAAC,CAAC;MACF,IAAI,IAAI,CAAClC,KAAK,CAACkC,YAAY,EAAE;QAC3B,IAAI,CAAClC,KAAK,CAACkC,YAAY,CAAC,CAAC;MAC3B;IACF,CAAC;IAAAjC,eAAA,sBAEa,MAAM;MAClB,IAAI,CAAC8B,QAAQ,CAAC;QACZG,YAAY,EAAE;MAChB,CAAC,CAAC;IACJ,CAAC;IAAAjC,eAAA,0BAEiB,CAACkC,SAAS,EAAEC,QAAQ,KAAK;MACzC,MAAM5B,cAAc,GAAG,CACrB,GAAG,IAAI,CAACE,KAAK,CAACF,cAAc,EAC5B;QACEO,SAAS,EAAE,IAAI;QACfsB,cAAc,EAAE,IAAI;QACpBF,SAAS;QACTC,QAAQ;QACRT,UAAU,EAAE;MACd,CAAC,CACF;MACD,IAAI,CAACI,QAAQ,CAAC;QAAEvB;MAAe,CAAC,CAAC;IACnC,CAAC;IAAAP,eAAA,2BAEkBqC,QAAQ,IAAI;MAC7B,MAAM9B,cAAc,GAAG,CAAC,GAAG,IAAI,CAACE,KAAK,CAACF,cAAc,CAAC;MACrDA,cAAc,CAACa,GAAG,CAACkB,GAAG,IAAI;QACxB,IAAIA,GAAG,CAACJ,SAAS,KAAKG,QAAQ,CAACE,GAAG,EAAE;UAClCD,GAAG,CAACF,cAAc,GAAGC,QAAQ,CAACG,UAAU;UACxCF,GAAG,CAACxB,SAAS,GAAG,IAAI;UACpBwB,GAAG,CAACZ,UAAU,GAAG,IAAI;QACvB;MACF,CAAC,CAAC;MACF,IAAI,CAACI,QAAQ,CAAC;QAAEvB;MAAe,CAAC,CAAC;IACnC,CAAC;IAAAP,eAAA,0BAEiB,OAAOuC,GAAG,EAAEL,SAAS,KAAK;MAC1C,MAAM3B,cAAc,GAAG,CAAC,GAAG,IAAI,CAACE,KAAK,CAACF,cAAc,CAAC;MACrDA,cAAc,CAACa,GAAG,CAACkB,GAAG,IAAI;QACxB,IAAIA,GAAG,CAACJ,SAAS,KAAKA,SAAS,IAAII,GAAG,CAACxB,SAAS,EAAE;UAChDwB,GAAG,CAACb,GAAG,GAAGc,GAAG,CAACE,OAAO,CAAC,WAAW,EAAE,eAAe,CAAC;UACnDH,GAAG,CAACvB,eAAe,GAAG,KAAK;UAC3BuB,GAAG,CAACX,YAAY,GAAG/C,WAAW,CAAC0D,GAAG,CAACb,GAAG,CAAC;UACvCa,GAAG,CAACZ,UAAU,GAAG,IAAI;QACvB;MACF,CAAC,CAAC;MACF,IAAI,CAACI,QAAQ,CAAC;QAAEvB;MAAe,CAAC,EAAE,MAAM,IAAI,CAACmC,iBAAiB,CAAC,CAAC,CAAC;IACnE,CAAC;IAAA1C,eAAA,yBAEgBkC,SAAS,IAAI;MAC5B,MAAM3B,cAAc,GAAG,CAAC,GAAG,IAAI,CAACE,KAAK,CAACF,cAAc,CAAC;MACrDA,cAAc,CAACa,GAAG,CAACkB,GAAG,IAAI;QACxB,IAAIA,GAAG,CAACJ,SAAS,KAAKA,SAAS,EAAE;UAC/BI,GAAG,CAACxB,SAAS,GAAG,IAAI,CAAC,CAAC;UACtBwB,GAAG,CAACF,cAAc,GAAG,EAAE;UACvBE,GAAG,CAACZ,UAAU,GAAG,IAAI;QACvB;MACF,CAAC,CAAC;MACF,IAAI,CAACI,QAAQ,CAAC;QAAEvB;MAAe,CAAC,CAAC;IACnC,CAAC;IAAAP,eAAA,4BAEmBuC,GAAG,IAAI;MACzB,MAAMhC,cAAc,GAAG,CACrB,GAAG,IAAI,CAACE,KAAK,CAACF,cAAc,EAC5B;QACEO,SAAS,EAAE,KAAK;QAChBY,UAAU,EAAE,KAAK;QACjBD,GAAG,EAAE9C,OAAO,CAAC4D,GAAG,CAAC;QACjBxB,eAAe,EAAE,IAAI;QACrBY,YAAY,EAAE/C,WAAW,CAAC2D,GAAG;MAC/B,CAAC,CACF;MACD,IAAI,CAACT,QAAQ,CAAC;QAAEvB;MAAe,CAAC,CAAC;IACnC,CAAC;IAAAP,eAAA,uBAEc,CAAC2C,MAAM,EAAEC,QAAQ,KAAK;MACnC,IAAI,CAACd,QAAQ,CAAC;QACZe,gBAAgB,EAAEF,MAAM;QACxBG,eAAe,EAAEH,MAAM,CAACI,OAAO,CAACH,QAAQ,CAAC;QACzCI,cAAc,EAAE;MAClB,CAAC,CAAC;IACJ,CAAC;IAAAhD,eAAA,kBAESiD,OAAO,IAAI;MACnB,IAAI,CAACnB,QAAQ,CAAC;QACZoB,UAAU,EAAED;MACd,CAAC,CAAC;IACJ,CAAC;IAAAjD,eAAA,mBAEUiD,OAAO,IAAI;MACpB;MACA,IAAI,CAAC,IAAI,CAAClD,KAAK,CAACoD,eAAe,EAAE;QAC/B;MACF;;MAEA;MACA,IAAIF,OAAO,CAACG,IAAI,CAACC,GAAG,KAAK,IAAI,CAACtD,KAAK,CAACqD,IAAI,CAACE,GAAG,EAAE;QAC5C;MACF;MAEA,IAAI,CAACxB,QAAQ,CAAC;QACZyB,wBAAwB,EAAE,IAAI;QAC9BC,eAAe,EAAEP;MACnB,CAAC,CAAC;IACJ,CAAC;IAAAjD,eAAA,gCAEuB,MAAM;MAC5B,IAAI,CAAC8B,QAAQ,CAAC;QACZyB,wBAAwB,EAAE,KAAK;QAC/BC,eAAe,EAAE;MACnB,CAAC,CAAC;IACJ,CAAC;IAAAxD,eAAA,iCAEwB,YAAY;MACnC,MAAM;QAAEwD;MAAgB,CAAC,GAAG,IAAI,CAAC/C,KAAK;MACtC,IAAI,CAAC+C,eAAe,EAAE;MAEtB,IAAI,CAAC1B,QAAQ,CAAC;QACZyB,wBAAwB,EAAE;MAC5B,CAAC,CAAC;MAEF,IAAI;QACF;QACA,IAAI,IAAI,CAACxD,KAAK,CAACoD,eAAe,EAAE;UAC9B,MAAM,IAAI,CAACpD,KAAK,CAACoD,eAAe,CAACK,eAAe,CAAC;QACnD;QAEA,IAAI,CAAC1B,QAAQ,CAAC;UACZ0B,eAAe,EAAE;QACnB,CAAC,CAAC;MACJ,CAAC,CAAC,OAAOC,KAAK,EAAE;QACd;QACAC,OAAO,CAACC,GAAG,CAAC,8BAA8B,EAAEF,KAAK,CAAC;QAClD;QACA,IAAI,CAAC3B,QAAQ,CAAC;UAAE0B,eAAe,EAAE;QAAK,CAAC,CAAC;MAC1C;IACF,CAAC;IAAAxD,eAAA,wBAUeyB,GAAG,IAAI;MACrB,MAAMlB,cAAc,GAAG,IAAI,CAACE,KAAK,CAACF,cAAc,CAACqD,MAAM,CAACvC,KAAK,IAAIA,KAAK,CAACI,GAAG,KAAKA,GAAG,CAAC;MACnF,IAAI,CAACK,QAAQ,CAAC;QAAEvB;MAAe,CAAC,CAAC;IACnC,CAAC;IAAAP,eAAA,gCAEuByB,GAAG,IAAI;MAC7B,IAAI,OAAOA,GAAG,KAAK,QAAQ,EAAEA,GAAG,GAAG,EAAE;MACrC,IAAI,CAACK,QAAQ,CAAC;QAAE+B,mBAAmB,EAAEpC,GAAG,CAACqC,MAAM,GAAG,CAAC;QAAEC,eAAe,EAAEtC;MAAI,CAAC,CAAC;IAC9E,CAAC;IA/RC,MAAMuC,WAAW,GAAG,IAAI,CAACjE,KAAK,CAACkE,QAAQ,KAAK,CAAC,IAAIvG,cAAc,CAAC,CAAC,GAAG,CAAC;IACrE,IAAI,CAACwG,mBAAmB,GAAGrH,QAAQ,CAACsH,MAAM,CAAC;MACzCC,GAAG,EAAEJ,WAAW,GAAG,EAAE,GAAG,EAAE;MAC1BK,OAAO,EAAE;IACX,CAAC,CAAC;IAEF,IAAI,CAAC5D,KAAK,GAAG;MACX6D,WAAW,EAAE;QACXjB,GAAG,EAAE,IAAI,CAACtD,KAAK,CAACqD,IAAI,CAACE,GAAG;QACxBiB,IAAI,EAAE,IAAI,CAACxE,KAAK,CAACqD,IAAI,CAACoB,WAAW;QACjCC,MAAM,EACJ,CAAClH,CAAC,CAACmH,WAAW,CAAC,IAAI,CAAC3E,KAAK,CAACqD,IAAI,CAACuB,UAAU,CAAC,IAAI,CAACpH,CAAC,CAACiD,OAAO,CAAC,IAAI,CAACT,KAAK,CAACqD,IAAI,CAACuB,UAAU,CAAC,GAChF,IAAI,CAAC5E,KAAK,CAACqD,IAAI,CAACuB,UAAU,GAC1B1F,MAAM,CAAC2F,GAAG,CAACC;MACnB,CAAC;MAEDC,QAAQ,EAAE,EAAE;MACZjC,gBAAgB,EAAE,EAAE;MACpBC,eAAe,EAAE,CAAC;MAClBE,cAAc,EAAE,KAAK;MACrBzC,cAAc,EAAE,EAAE;MAClBsD,mBAAmB,EAAE,KAAK;MAC1BE,eAAe,EAAE,EAAE;MACnBR,wBAAwB,EAAE,KAAK;MAC/BC,eAAe,EAAE,IAAI;MACrBuB,cAAc,EAAE,IAAI,CAACb;IACvB,CAAC;IACD,IAAI,CAAClD,UAAU,GAAG,IAAI;EACxB;EAEAgE,yBAAyBA,CAAA,EAAG;IAC1B,IAAI,CAACC,cAAc,CAAC,IAAI,CAAClF,KAAK,CAAC;EACjC;EAEAmF,gCAAgCA,CAACC,SAAS,EAAE;IAC1C;IACA,IAAIA,SAAS,CAACL,QAAQ,KAAK,IAAI,CAAC/E,KAAK,CAAC+E,QAAQ,EAAE;MAC9C,IAAI,CAACG,cAAc,CAACE,SAAS,CAAC;IAChC;EACF;EAEAF,cAAcA,CAAClF,KAAK,EAAE;IACpB;IACA,IAAI,CAACxC,CAAC,CAACmH,WAAW,CAAC3E,KAAK,CAAC+E,QAAQ,CAAC,IAAI,CAACvH,CAAC,CAAC6H,OAAO,CAACrF,KAAK,CAAC+E,QAAQ,EAAE,IAAI,CAACrE,KAAK,CAACqE,QAAQ,CAAC,EAAE;MACrF,IAAI,CAAChD,QAAQ,CAAC;QAAEgD,QAAQ,EAAE/E,KAAK,CAAC+E;MAAS,CAAC,CAAC;IAC7C;EACF;;EAEA;AACF;AACA;AACA;EACEO,MAAMA,CAACP,QAAQ,GAAG,EAAE,EAAE;IACpB;IACA;IACA;EAAA;EAqEFQ,cAAcA,CAAA,EAAG;IACf,IAAI,CAACC,aAAa,CAACD,cAAc,CAAC,CAAC;EACrC;EAiJAE,YAAYA,CAAA,EAAG;IACb,IAAI,CAAC1D,QAAQ,CAAC;MACZe,gBAAgB,EAAE,EAAE;MACpBC,eAAe,EAAE,CAAC;MAClBE,cAAc,EAAE;IAClB,CAAC,CAAC;EACJ;EAYAyC,YAAYA,CAACX,QAAQ,EAAE;IACrB,IAAI,IAAI,CAACnE,iBAAiB,CAAC,CAAC,EAAE;MAC5B;MACA,IAAI,CAAC,IAAI,CAAC+E,cAAc,CAAC,CAAC,EAAE;MAC5BZ,QAAQ,CAAC,CAAC,CAAC,CAACzD,KAAK,GAAG,IAAI,CAACZ,KAAK,CAACF,cAAc,CAACa,GAAG,CAACC,KAAK,IAAIA,KAAK,CAACI,GAAG,CAAC;IACvE;IACA,IAAIlE,CAAC,CAACiD,OAAO,CAACsE,QAAQ,CAAC,CAAC,CAAC,CAACa,IAAI,CAAC,EAAE;MAC/Bb,QAAQ,CAAC,CAAC,CAAC,CAACa,IAAI,GAAG,EAAE;IACvB;IACA,IAAI,CAACb,QAAQ,CAAC,CAAC,CAAC,CAACa,IAAI,IAAI,CAACb,QAAQ,CAAC,CAAC,CAAC,CAACzD,KAAK,EAAE;IAE7C,IAAI,IAAI,CAACZ,KAAK,CAACyC,UAAU,EAAE;MACzB4B,QAAQ,CAAC,CAAC,CAAC,CAAC5B,UAAU,GAAG,IAAI,CAACzC,KAAK,CAACyC,UAAU;IAChD;IAEA,IAAI,CAACnD,KAAK,CAACsF,MAAM,CAACP,QAAQ,CAAC;IAC3B,IAAI,CAAChD,QAAQ,CAAC;MAAEvB,cAAc,EAAE,EAAE;MAAE2C,UAAU,EAAE;IAAK,CAAC,CAAC;EACzD;;EAEA;AACF;AACA;AACA;EACE0C,YAAYA,CAACC,WAAW,EAAE;IACxB,MAAMC,YAAY,GAAG,CAAC,CAAC;IACvB,IAAI,CAACvI,CAAC,CAACiD,OAAO,CAACqF,WAAW,CAACE,cAAc,CAACJ,IAAI,CAAC,IAAI,CAACpI,CAAC,CAACiD,OAAO,CAACqF,WAAW,CAACE,cAAc,CAAC1E,KAAK,CAAC,EAAE;MAC/FyE,YAAY,CAACE,UAAU,GAAG,CAAC;MAC3BF,YAAY,CAACG,aAAa,GAAG,EAAE;MAC/BH,YAAY,CAACI,QAAQ,GAAG,GAAG,CAAC,CAAC;IAC/B;IACA,IAAI,CAAC3I,CAAC,CAACiD,OAAO,CAACqF,WAAW,CAACE,cAAc,CAACI,WAAW,CAAC,EAAE;MACtDL,YAAY,CAACE,UAAU,GAAG,CAAC;MAC3BF,YAAY,CAACG,aAAa,GAAG,EAAE;MAC/BH,YAAY,CAACM,iBAAiB,GAAG,EAAE;IACrC;IACA,oBACE/J,KAAA,CAAAgK,aAAA,CAACnJ,MAAM,EAAAoJ,QAAA,KACDT,WAAW;MACfU,kBAAkB,EAAEA,CAAA,KAAM,IAAK;MAC/BC,kBAAkB,EAAE,IAAK;MACzBV,YAAY,EAAE;QACZW,IAAI,EAAE;UACJC,eAAe,EAAEtI,QAAQ;UACzBuI,YAAY,EAAE,EAAE;UAChB,GAAGb;QACL,CAAC;QACDc,KAAK,EAAE;UACLF,eAAe,EAAE,IAAI,CAAC3G,KAAK,CAAC8G,mBAAmB;UAC/CF,YAAY,EAAE,EAAE;UAChB,GAAGb;QACL;MACF,CAAE;MACFgB,oBAAoB,EAAE;QACpBL,IAAI,EAAE;UACJM,sBAAsB,EAAE;QAC1B,CAAC;QACDH,KAAK,EAAE;UACLI,uBAAuB,EAAE;QAC3B;MACF,CAAE;MACFC,wBAAwB,EAAE;QACxBR,IAAI,EAAE;UACJS,mBAAmB,EAAE;QACvB,CAAC;QACDN,KAAK,EAAE;UACLO,oBAAoB,EAAE;QACxB;MACF;IAAE,EACH,CAAC;EAEN;EACAC,aAAaA,CAACrH,KAAK,EAAE;IACnB,oBACE1D,KAAA,CAAAgK,aAAA,CAACrI,gBAAgB,EAAAsI,QAAA;MACfe,GAAG,EAAEtH,KAAK,CAACuH,KAAM;MACjBC,kBAAkB,EAAE,IAAI,CAACxH,KAAK,CAACwH,kBAAmB;MAClDC,YAAY,EAAEA,CAAA,KAAM;QAClB,IAAI,CAACC,OAAO,CAAC1H,KAAK,CAACgG,cAAc,CAAC;MACpC,CAAE;MACF2B,aAAa,EACX,IAAI,CAAC3H,KAAK,CAACoD,eAAe,GACtB,MAAM;QACJ,IAAI,CAACwE,QAAQ,CAAC5H,KAAK,CAACgG,cAAc,CAAC;MACrC,CAAC,GACD;IACL,GACGhG,KAAK,CACV,CAAC;EAEN;EACA6H,iBAAiBA,CAACC,gBAAgB,EAAE;IAClC;IACA,MAAM9H,KAAK,GAAG8H,gBAAgB,CAAC9B,cAAc,CAAC+B,OAAO,GACjD;MACE,GAAGD,gBAAgB;MACnB9B,cAAc,EAAE;QACd,GAAG8B,gBAAgB,CAAC9B,cAAc;QAClCJ,IAAI,EAAE;MACR;IACF,CAAC,GACDkC,gBAAgB;IAEpB,oBACExL,KAAA,CAAAgK,aAAA,CAAClJ,WAAW,EAAAmJ,QAAA,KACNvG,KAAK;MACTgI,SAAS,EAAE;QACTtB,IAAI,EAAE;UACJuB,UAAU,EAAE,YAAY;UACxBC,QAAQ,EAAE,EAAE;UACZC,KAAK,EAAE7J,YAAY;UACnB8J,SAAS,EAAE,EAAE;UACbC,YAAY,EAAE,EAAE;UAChBC,UAAU,EAAE,EAAE;UACdC,WAAW,EAAE;QACf,CAAC;QACD1B,KAAK,EAAE;UACLoB,UAAU,EAAE,YAAY;UACxBC,QAAQ,EAAE,EAAE;UACZC,KAAK,EAAE,IAAI,CAACnI,KAAK,CAACwH,kBAAkB;UACpCY,SAAS,EAAE,EAAE;UACbC,YAAY,EAAE,EAAE;UAChBC,UAAU,EAAE,EAAE;UACdC,WAAW,EAAE;QACf;MACF,CAAE;MACFC,SAAS,EAAE;QACT9B,IAAI,EAAE;UACJyB,KAAK,EAAE7J;QACT,CAAC;QACDuI,KAAK,EAAE;UACLsB,KAAK,EAAE,IAAI,CAACnI,KAAK,CAACwH;QACpB;MACF;IAAE,EACH,CAAC;EAEN;EACAiB,UAAUA,CAAA,EAAG;IACX,OAAO,IAAI;EACb;EACAC,SAASA,CAACC,QAAQ,EAAE;IAClB,oBACErM,KAAA,CAAAgK,aAAA,CAACxI,aAAa,EAAAyI,QAAA,KACRoC,QAAQ;MACZX,SAAS,EAAE;QACTC,UAAU,EAAE,aAAa;QACzBE,KAAK,EAAE/J,SAAS;QAChB8J,QAAQ,EAAE;MACZ;IAAE,EACH,CAAC;EAEN;EACAU,gBAAgBA,CAAC;IAAE5C,cAAc;IAAE6C;EAAS,CAAC,EAAE;IAC7C;IACA,IAAI7C,cAAc,CAAC+B,OAAO,EAAE;MAC1B,OAAO,IAAI;IACb;IAEA,IAAI/B,cAAc,CAAC1E,KAAK,EAAE;MACxB,MAAMsB,MAAM,GAAG,OAAOoD,cAAc,CAAC1E,KAAK,KAAK,QAAQ,GAAG,CAAC0E,cAAc,CAAC1E,KAAK,CAAC,GAAG0E,cAAc,CAAC1E,KAAK;MACvG,MAAMwH,cAAc,GAAG,CAAC,MAAM;QAC5B,IAAIlG,MAAM,CAACmB,MAAM,KAAK,CAAC,EAAE,OAAO,CAAC;QACjC,IAAInB,MAAM,CAACmB,MAAM,KAAK,CAAC,EAAE,OAAOtE,gBAAgB;QAChD,IAAImD,MAAM,CAACmB,MAAM,IAAIrE,cAAc,EAAE,OAAO,CAACF,gBAAgB,GAAGG,YAAY,IAAIiD,MAAM,CAACmB,MAAM;QAC7F,OAAO,CAACvE,gBAAgB,GAAGG,YAAY,IAAID,cAAc;MAC3D,CAAC,EAAE,CAAC;MACJ,oBACEpD,KAAA,CAAAgK,aAAA,CAAC9J,IAAI;QAACuM,KAAK,EAAE,CAACC,MAAM,CAACC,eAAe,EAAE;UAAEC,KAAK,EAAEJ,cAAc;UAAEK,eAAe,EAAEnD,cAAc,CAACJ,IAAI,GAAG,CAAC,GAAG;QAAG,CAAC;MAAE,GAC7GhD,MAAM,CAACvB,GAAG,CAACkB,GAAG,IAAI;QACjB,MAAM6G,KAAK,GAAGvK,WAAW,CAAC0D,GAAG,CAAC;QAC9B,IAAIxD,OAAO,CAACwD,GAAG,CAAC,EAAE;UAChB,oBACEjG,KAAA,CAAAgK,aAAA,CAAC3J,gBAAgB;YAAC2K,GAAG,EAAE8B,KAAM;YAACC,OAAO,EAAE,IAAI,CAACC,qBAAqB,CAACC,IAAI,CAAC,IAAI,EAAEhH,GAAG;UAAE,gBAChFjG,KAAA,CAAAgK,aAAA,CAAC5J,eAAe;YAACqM,KAAK,EAAEnG,MAAM,CAACmB,MAAM,GAAG,CAAC,GAAGiF,MAAM,CAACQ,iBAAiB,GAAGR,MAAM,CAACS,iBAAkB;YAACC,MAAM,EAAE;cAAElH,GAAG,EAAE4G;YAAM;UAAE,gBACtH9M,KAAA,CAAAgK,aAAA,CAAC9J,IAAI;YAACuM,KAAK,EAAEC,MAAM,CAACW;UAAmB,gBACrCrN,KAAA,CAAAgK,aAAA,CAAC5I,IAAI;YAAC8G,IAAI,EAAC,MAAM;YAACoF,IAAI,EAAC,cAAc;YAACC,SAAS,EAAEb,MAAM,CAACc;UAAiB,CAAE,CACvE,CACS,CACD,CAAC;QAEvB;QACA,oBACExN,KAAA,CAAAgK,aAAA,CAAC3J,gBAAgB;UAAC2K,GAAG,EAAE8B,KAAM;UAACC,OAAO,EAAEA,CAAA,KAAM,IAAI,CAACU,YAAY,CAACnH,MAAM,EAAEL,GAAG;QAAE,gBAC1EjG,KAAA,CAAAgK,aAAA,CAAC7J,KAAK;UAACiN,MAAM,EAAE;YAAElH,GAAG,EAAE4G;UAAM,CAAE;UAACL,KAAK,EAAEnG,MAAM,CAACmB,MAAM,GAAG,CAAC,GAAGiF,MAAM,CAACQ,iBAAiB,GAAGR,MAAM,CAACS;QAAkB,CAAE,CAChG,CAAC;MAEvB,CAAC,CACG,CAAC;IAEX;IACA,IAAI,CAACjM,CAAC,CAACiD,OAAO,CAACuF,cAAc,CAACI,WAAW,CAAC,EAAE;MAC1C,oBACE9J,KAAA,CAAAgK,aAAA,CAAC9J,IAAI,QACFwJ,cAAc,CAACI,WAAW,CAAC/E,GAAG,CAAC,CAACK,GAAG,EAAEZ,CAAC,KAAK;QAC1C,oBACExE,KAAA,CAAAgK,aAAA,CAACtI,UAAU;UACTqL,OAAO,EAAEA,CAAA,KAAM;YACb,IAAI,CAACW,gBAAgB,CAACtI,GAAG,CAAC;UAC5B,CAAE;UACF4F,GAAG,EAAExG,CAAE;UACPmJ,KAAK,EAAEhL,WAAW,CAACyC,GAAG;QAAE,CACzB,CAAC;MAEN,CAAC,CACG,CAAC;IAEX;IACA,IAAIsE,cAAc,CAAC9F,KAAK,EAAE;MACxB,oBACE5D,KAAA,CAAAgK,aAAA,CAAC3J,gBAAgB;QAAC0M,OAAO,EAAE,IAAI,CAACa,YAAY,CAACX,IAAI,CAAC,IAAI,EAAEvD,cAAc,CAAC9F,KAAK;MAAE,gBAC5E5D,KAAA,CAAAgK,aAAA,CAAC9J,IAAI;QAACuM,KAAK,EAAEC,MAAM,CAACmB,cAAc,CAACtB,QAAQ;MAAE,gBAC3CvM,KAAA,CAAAgK,aAAA,CAAC7J,KAAK;QAACsM,KAAK,EAAE,CAACC,MAAM,CAACoB,UAAU,EAAEpB,MAAM,CAACqB,gBAAgB,CAACxB,QAAQ,CAAC,CAAE;QAACa,MAAM,EAAE;UAAElH,GAAG,EAAEwD,cAAc,CAAC9F,KAAK,CAACoK;QAAU;MAAE,CAAE,CAAC,eACzHhO,KAAA,CAAAgK,aAAA,CAAC9J,IAAI;QAACuM,KAAK,EAAEC,MAAM,CAACuB;MAAU,gBAC5BjO,KAAA,CAAAgK,aAAA,CAAC1J,IAAI;QACH4N,aAAa,EAAE,CAAE;QACjBzB,KAAK,EAAE,CAACC,MAAM,CAACyB,UAAU,EAAEzB,MAAM,CAAC0B,cAAc,CAAC7B,QAAQ,CAAC,EAAE;UAAEV,KAAK,EAAE,IAAI,CAACnI,KAAK,CAACwH;QAAmB,CAAC;MAAE,GAErGxB,cAAc,CAAC9F,KAAK,CAACyK,KAClB,CAAC,eACPrO,KAAA,CAAAgK,aAAA,CAAC1J,IAAI;QAACmM,KAAK,EAAE,CAACC,MAAM,CAAC4B,SAAS,EAAE5B,MAAM,CAAC0B,cAAc,CAAC7B,QAAQ,CAAC,EAAE;UAAEV,KAAK,EAAE,IAAI,CAACnI,KAAK,CAACwH;QAAmB,CAAC;MAAE,GACxG/J,MAAM,CACJoN,GAAG,CAAC7E,cAAc,CAAC9F,KAAK,CAAC4K,SAAS,CAAC,CACnCC,KAAK,CAAC,CAAC,CACPC,MAAM,CAAC,WAAW,CACjB,CACF,CACF,CACU,CAAC;IAEvB;IACA,IAAIhF,cAAc,CAAC3F,UAAU,EAAE;MAC7B,oBACE/D,KAAA,CAAAgK,aAAA,CAAC3J,gBAAgB;QAAC0M,OAAO,EAAE,IAAI,CAAC4B,iBAAiB,CAAC1B,IAAI,CAAC,IAAI,EAAEvD,cAAc,CAAC3F,UAAU;MAAE,gBACtF/D,KAAA,CAAAgK,aAAA,CAAC9J,IAAI;QAACuM,KAAK,EAAEC,MAAM,CAACmB,cAAc,CAACtB,QAAQ;MAAE,gBAC3CvM,KAAA,CAAAgK,aAAA,CAAC7J,KAAK;QAACsM,KAAK,EAAE,CAACC,MAAM,CAACoB,UAAU,EAAEpB,MAAM,CAACqB,gBAAgB,CAACxB,QAAQ,CAAC,CAAE;QAACa,MAAM,EAAE;UAAElH,GAAG,EAAEwD,cAAc,CAAC3F,UAAU,CAACiK;QAAU;MAAE,CAAE,CAAC,eAC9HhO,KAAA,CAAAgK,aAAA,CAAC9J,IAAI;QAACuM,KAAK,EAAEC,MAAM,CAACuB;MAAU,gBAC5BjO,KAAA,CAAAgK,aAAA,CAAC1J,IAAI;QACH4N,aAAa,EAAE,CAAE;QACjBzB,KAAK,EAAE,CAACC,MAAM,CAACyB,UAAU,EAAEzB,MAAM,CAAC0B,cAAc,CAAC7B,QAAQ,CAAC,EAAE;UAAEV,KAAK,EAAE,IAAI,CAACnI,KAAK,CAACwH;QAAmB,CAAC;MAAE,GAErGxB,cAAc,CAAC3F,UAAU,CAACsK,KACvB,CAAC,EACN3E,cAAc,CAAC3F,UAAU,CAACyK,SAAS,iBAClCxO,KAAA,CAAAgK,aAAA,CAAC1J,IAAI;QAACmM,KAAK,EAAE,CAACC,MAAM,CAAC4B,SAAS,EAAE5B,MAAM,CAAC0B,cAAc,CAAC7B,QAAQ,CAAC,EAAE;UAAEV,KAAK,EAAE,IAAI,CAACnI,KAAK,CAACwH;QAAmB,CAAC;MAAE,GACxG/J,MAAM,CACJoN,GAAG,CAAC7E,cAAc,CAAC3F,UAAU,CAACyK,SAAS,CAAC,CACxCC,KAAK,CAAC,CAAC,CACPC,MAAM,CAAC,WAAW,CACjB,CAEJ,CACF,CACU,CAAC;IAEvB;IACA,OAAO,IAAI;EACb;EAEAE,UAAUA,CAAClL,KAAK,EAAE;IAChB,MAAMmL,eAAe,GAAG,IAAI,CAACzK,KAAK,CAACyC,UAAU,GAAG,EAAE,GAAG,CAAC;IACtD,MAAMiI,cAAc,GAAG,CAAC5N,CAAC,CAACiD,OAAO,CAACT,KAAK,CAAC4F,IAAI,CAAC,IAAI,IAAI,CAACD,cAAc,CAAC3F,KAAK,CAACQ,cAAc,CAAC;IAC1F,oBACElE,KAAA,CAAAgK,aAAA,CAAC9J,IAAI;MACHuM,KAAK,EAAE;QACLF,QAAQ,EAAE,UAAU;QACpBwC,GAAG,EAAEF,eAAe;QACpBtE,KAAK,EAAE,CAAC;QACRyE,aAAa,EAAE,KAAK;QACpBC,UAAU,EAAE;MACd;IAAE,gBAGFjP,KAAA,CAAAgK,aAAA,CAAC3J,gBAAgB;MACf0M,OAAO,EAAE,IAAI,CAAC9D,cAAc,CAACgE,IAAI,CAAC,IAAI,CAAE;MACxCR,KAAK,EAAE,CACLC,MAAM,CAACwC,aAAa,EACpB;QACE3E,KAAK,EAAErJ,CAAC,CAACiD,OAAO,CAACT,KAAK,CAAC4F,IAAI,CAAC,IAAI,CAAC,IAAI,CAACD,cAAc,CAAC3F,KAAK,CAACQ,cAAc,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC2D,mBAAmB;QAEzG+E,KAAK,EAAE,IAAI,CAAC/E,mBAAmB;QAC/BsH,MAAM,EAAE,IAAI,CAACtH;MACf,CAAC;IACD,gBAEF7H,KAAA,CAAAgK,aAAA,CAAC5I,IAAI;MAAC8G,IAAI,EAAE,WAAY;MAACoF,IAAI,EAAC,cAAc;MAACC,SAAS,EAAE,CAACb,MAAM,CAAC0C,IAAI,EAAE;QAAExC,KAAK,EAAE,IAAI,CAAC/E;MAAoB,CAAC;IAAE,CAAE,CAC7F,CAAC,EAGlBiH,cAAc,iBACb9O,KAAA,CAAAgK,aAAA,CAACjJ,IAAI,EAAAkJ,QAAA,KACCvG,KAAK;MACT2L,cAAc,EAAE,IAAK;MACrBrG,MAAM,EAAEtF,KAAK,CAACsF,MAAO;MACrBM,IAAI,EAAE5F,KAAK,CAAC4F,IAAI,IAAI,GAAI;MACxBgG,cAAc,EAAE,CACd5C,MAAM,CAACwC,aAAa,EACpB;QACEtC,KAAK,EAAE,IAAI,CAAC/E,mBAAmB;QAC/BsH,MAAM,EAAE,IAAI,CAACtH;MACf,CAAC;IACD,iBAEF7H,KAAA,CAAAgK,aAAA,CAAC5I,IAAI;MAAC8G,IAAI,EAAE,aAAc;MAACoF,IAAI,EAAC,cAAc;MAACC,SAAS,EAAE,CAACb,MAAM,CAAC0C,IAAI,EAAE;QAAExC,KAAK,EAAE,IAAI,CAAC/E;MAAoB,CAAC;IAAE,CAAE,CAC3G,CAEJ,CAAC;EAEX;EAEA0H,eAAeA,CAAC7L,KAAK,EAAE;IACrB,MAAM8L,aAAa,GAAG,IAAI,CAAClL,iBAAiB,CAACZ,KAAK,CAACQ,cAAc,CAAC;IAClE,IAAI,CAACsL,aAAa,EAAE;MAClB,OAAO,IAAI;IACb;IACA,oBACExP,KAAA,CAAAgK,aAAA,CAACvJ,UAAU;MAACgP,UAAU;MAAChD,KAAK,EAAEC,MAAM,CAACgD;IAAsB,GACxDhM,KAAK,CAACQ,cAAc,CAACa,GAAG,CAACC,KAAK,IAAI;MACjC,IAAIA,KAAK,CAACP,SAAS,EAAE;QACnB,oBACEzE,KAAA,CAAAgK,aAAA,CAACjH,mBAAmB;UAClBiI,GAAG,EAAEhG,KAAK,CAACa,SAAU;UACrB8J,QAAQ,EAAE,IAAI,CAACzG,aAAc;UAC7BlE,KAAK,EAAEA,KAAM;UACb6G,KAAK,EAAE,IAAI,CAACnI,KAAK,CAACwH,kBAAmB;UACrCuB,KAAK,EAAE;YAAEG,KAAK,EAAErJ,kBAAkB;YAAE0I,WAAW,EAAE;UAAG,CAAE;UACtD2D,iBAAiB,EAAE;YAAEhE,QAAQ,EAAE;UAAG;QAAE,CACrC,CAAC;MAEN;MACA,MAAMiE,UAAU,GAAGpN,OAAO,CAACuC,KAAK,CAACI,GAAG,CAAC;MACrC,oBACEpF,KAAA,CAAAgK,aAAA,CAAC9J,IAAI;QAAC8K,GAAG,EAAEhG,KAAK,CAACI,GAAI;QAACqH,KAAK,EAAEC,MAAM,CAACoD;MAAwB,gBAC1D9P,KAAA,CAAAgK,aAAA,CAAC5J,eAAe;QACdqM,KAAK,EAAEC,MAAM,CAACqD,cAAe;QAC7BC,UAAU,EAAEtD,MAAM,CAACuD,oBAAqB;QACxC7C,MAAM,EAAE1K,cAAc,CAACsC,KAAK,CAACN,eAAe,GAAGM,KAAK,CAACM,YAAY,GAAGN,KAAK,CAACI,GAAG;MAAE,GAE9EyK,UAAU,iBACT7P,KAAA,CAAAgK,aAAA,CAAC9J,IAAI;QAACuM,KAAK,EAAEC,MAAM,CAACW;MAAmB,gBACrCrN,KAAA,CAAAgK,aAAA,CAAC3J,gBAAgB;QAAC0M,OAAO,EAAE,IAAI,CAACC,qBAAqB,CAACC,IAAI,CAAC,IAAI,EAAEjI,KAAK,CAACI,GAAG;MAAE,gBAC1EpF,KAAA,CAAAgK,aAAA,CAAC5I,IAAI;QAAC8G,IAAI,EAAC,MAAM;QAACoF,IAAI,EAAC,cAAc;QAACC,SAAS,EAAEb,MAAM,CAACc;MAAiB,CAAE,CAC3D,CACd,CAEO,CAAC,eAClBxN,KAAA,CAAAgK,aAAA,CAAC3J,gBAAgB;QACfoM,KAAK,EAAEC,MAAM,CAACwD,uBAAwB;QACtCnD,OAAO,EAAEA,CAAA,KAAM,IAAI,CAACoD,aAAa,CAACnL,KAAK,CAACI,GAAG,CAAE;QAC7CgL,OAAO,EAAE;UAAErB,GAAG,EAAE,CAAC;UAAExE,KAAK,EAAE,CAAC;UAAE8F,MAAM,EAAE,CAAC;UAAEjG,IAAI,EAAE;QAAE;MAAE,gBAElDpK,KAAA,CAAAgK,aAAA,CAAC9J,IAAI;QAACuM,KAAK,EAAE,CAACC,MAAM,CAAC4D,0BAA0B,EAAE;UAAEjG,eAAe,EAAE,IAAI,CAAC3G,KAAK,CAACwH;QAAmB,CAAC;MAAE,gBACnGlL,KAAA,CAAAgK,aAAA,CAAC5I,IAAI;QAAC8G,IAAI,EAAC,OAAO;QAACoF,IAAI,EAAC,cAAc;QAACC,SAAS,EAAEb,MAAM,CAAC6D;MAAsB,CAAE,CAC7E,CACU,CACd,CAAC;IAEX,CAAC,CACS,CAAC;EAEjB;EAEAC,kBAAkBA,CAAC9M,KAAK,EAAE;IACxB,MAAM8L,aAAa,GAAG,IAAI,CAAClL,iBAAiB,CAACZ,KAAK,CAACQ,cAAc,CAAC;IAClE,oBACElE,KAAA,CAAAgK,aAAA,CAAChJ,YAAY,EAAAiJ,QAAA,KACPvG,KAAK;MACT4L,cAAc,EAAE5C,MAAM,CAAC+D,cAAe;MACtCC,cAAc,EAAE,IAAI,CAACA,cAAc,CAACzD,IAAI,CAAC,IAAI,CAAE;MAC/CsC,eAAe,EAAEC,aAAa,GAAG,IAAI,CAACD,eAAe,CAACtC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAK;MACxE0D,cAAc,EAAEnB,aAAa,IAAI9C,MAAM,CAACkE;IAAU,EACnD,CAAC;EAEN;EACAC,YAAYA,CAAA,EAAG;IACb;IACA;IACA;IACA;IACA,oBAAO7Q,KAAA,CAAAgK,aAAA,CAAC9J,IAAI;MAACuM,KAAK,EAAE;QAAE0C,MAAM,EAAE;MAAG;IAAE,CAAE,CAAC;EACxC;EACA2B,aAAaA,CAAA,EAAG;IACd,oBACE9Q,KAAA,CAAAgK,aAAA,CAAC9J,IAAI;MAACuM,KAAK,EAAE;QAAEX,SAAS,EAAE,EAAE;QAAEiF,cAAc,EAAE,QAAQ;QAAEC,YAAY,EAAE;MAAS;IAAE,gBAC/EhR,KAAA,CAAAgK,aAAA,CAAC1I,OAAO;MAAC2P,IAAI,EAAE,OAAQ;MAACpF,KAAK,EAAE,IAAI,CAACnI,KAAK,CAACwH;IAAmB,CAAE,CAC3D,CAAC;EAEX;EACAgG,YAAYA,CAACxN,KAAK,EAAE;IAClB,oBACE1D,KAAA,CAAAgK,aAAA,CAAC9J,IAAI;MAACuM,KAAK,EAAE;QAAER,WAAW,EAAE;MAAE;IAAE,gBAC9BjM,KAAA,CAAAgK,aAAA,CAACzI,UAAU;MAACA,UAAU,EAAEmC,KAAK,CAACgG,cAAc,CAAC3C,IAAI,CAACqB,MAAO;MAAC+I,QAAQ,EAAE;IAAG,CAAE,CACrE,CAAC;EAEX;EACAT,cAAcA,CAAChN,KAAK,EAAE;IAAA,IAAA0N,qBAAA,EAAAC,sBAAA;IACpB,oBACErR,KAAA,CAAAgK,aAAA,CAAC9J,IAAI;MAACuM,KAAK,EAAE;QAAEG,KAAK,EAAE;MAAO;IAAE,GAE5B,IAAI,CAACxI,KAAK,CAACyC,UAAU,iBACpB7G,KAAA,CAAAgK,aAAA,CAAC9J,IAAI;MAACuM,KAAK,EAAEC,MAAM,CAAC7F;IAAW,gBAC7B7G,KAAA,CAAAgK,aAAA,CAACpI,SAAS;MAAC0L,IAAI,EAAC;IAAM,GAAC,cACT,EAACpM,CAAC,CAACiD,OAAO,EAAAiN,qBAAA,GAAC,IAAI,CAAChN,KAAK,CAACyC,UAAU,cAAAuK,qBAAA,gBAAAA,qBAAA,GAArBA,qBAAA,CAAuBrK,IAAI,cAAAqK,qBAAA,uBAA3BA,qBAAA,CAA6BlJ,IAAI,CAAC,GAAG,SAAS,IAAAmJ,sBAAA,GAAG,IAAI,CAACjN,KAAK,CAACyC,UAAU,cAAAwK,sBAAA,gBAAAA,sBAAA,GAArBA,sBAAA,CAAuBtK,IAAI,cAAAsK,sBAAA,uBAA3BA,sBAAA,CAA6BnJ,IAC5F,CAAC,eACZlI,KAAA,CAAAgK,aAAA,CAAC3J,gBAAgB;MACfoM,KAAK,EAAEC,MAAM,CAAC4E,oBAAqB;MACnCvE,OAAO,EAAEA,CAAA,KAAM,IAAI,CAAC3B,OAAO,CAAC,IAAI,CAAE;MAClCgF,OAAO,EAAE;QAAErB,GAAG,EAAE,CAAC;QAAExE,KAAK,EAAE,CAAC;QAAE8F,MAAM,EAAE,CAAC;QAAEjG,IAAI,EAAE;MAAE;IAAE,gBAElDpK,KAAA,CAAAgK,aAAA,CAAC9J,IAAI;MAACuM,KAAK,EAAE,CAACC,MAAM,CAAC6E,uBAAuB,EAAE;QAAElH,eAAe,EAAE,IAAI,CAAC3G,KAAK,CAACwH;MAAmB,CAAC;IAAE,gBAChGlL,KAAA,CAAAgK,aAAA,CAAC5I,IAAI;MAAC8G,IAAI,EAAC,OAAO;MAACoF,IAAI,EAAC,cAAc;MAACC,SAAS,EAAEb,MAAM,CAAC8E;IAAmB,CAAE,CAC1E,CACU,CACd,CACP,eAEDxR,KAAA,CAAAgK,aAAA,CAAC9J,IAAI;MAACuM,KAAK,EAAE;QAAEuC,aAAa,EAAE,KAAK;QAAEC,UAAU,EAAE,UAAU;QAAErC,KAAK,EAAE,MAAM;QAAEhD,aAAa,EAAE;MAAE;IAAE,gBAC7F5J,KAAA,CAAAgK,aAAA,CAAC9J,IAAI;MACHuM,KAAK,EAAE,CACLC,MAAM,CAAC+E,KAAK,EACZ;QACEC,IAAI,EAAE,CAAC;QACPzF,WAAW,EACT/K,CAAC,CAACiD,OAAO,CAACT,KAAK,CAAC4F,IAAI,CAAC,IAAI,CAAC,IAAI,CAACD,cAAc,CAAC3F,KAAK,CAACQ,cAAc,CAAC,GAC/D,EAAE,GAAG,IAAI,CAAC2D,mBAAmB,GAC7B,CAAC,IAAI,IAAI,CAACA,mBAAmB,GAAG,CAAC,CAAC;QACxCkC,iBAAiB,EAAE,EAAE;QACrB8C,eAAe,EAAErM,QAAQ,CAACsH,MAAM,CAAC;UAAEC,GAAG,EAAE,CAAC;UAAEC,OAAO,EAAE;QAAE,CAAC;MACzD,CAAC;IACD,gBAEFhI,KAAA,CAAAgK,aAAA,CAACrJ,SAAS;MACRgR,WAAW,EAAC,mBAAmB;MAC/BC,SAAS;MACTC,KAAK,EAAEnO,KAAK,CAAC4F,IAAK;MAClBwI,YAAY,EAAEpO,KAAK,CAACqO,aAAc;MAClCtF,KAAK,EAAE,CACLC,MAAM,CAACsF,SAAS,EAChB;QACEC,UAAU,EAAE,EAAE;QACdC,SAAS,EAAE,IAAI,CAACrK,mBAAmB,GAAG,EAAE;QACxCsK,SAAS,EAAE;MACb,CAAC,CACD;MACFC,OAAO,EAAE,IAAI,CAACC,YAAY,CAACpF,IAAI,CAAC,IAAI,CAAE;MACtCqF,MAAM,EAAE,IAAI,CAACC,WAAW,CAACtF,IAAI,CAAC,IAAI,CAAE;MACpCuF,oBAAoB,EAAC;IAAM,CAC5B,CACG,CACF,CACF,CAAC;EAEX;;EAEA;AACF;AACA;EACEC,UAAUA,CAAA,EAAG;IACX,MAAM;MAAE7K,QAAQ;MAAE8K;IAAM,CAAC,GAAG,IAAI,CAAChP,KAAK;IACtC,MAAMiP,cAAc,GAAGtR,cAAc,CAAC,CAAC;IACvC;IACA,MAAMuR,eAAe,GAAG,CAAChL,QAAQ,KAAK,CAAC,IAAI8K,KAAK,GAAG,CAAC,GAAG,EAAE,IAAIC,cAAc;IAC3E,MAAME,qBAAqB,GACzB,IAAI,CAAChL,mBAAmB,GAAG,EAAE,IAAI,IAAI,CAACzD,KAAK,CAACyC,UAAU,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAACvC,iBAAiB,CAAC,CAAC,GAAGhB,yBAAyB,GAAG,CAAC,CAAC;IAE/H,oBACEtD,KAAA,CAAAgK,aAAA,CAACpJ,UAAU;MACTkS,yBAAyB,EAAE,IAAK;MAChCzD,cAAc,EAAE,KAAM;MACtB0D,yBAAyB,EAAE,OAAQ;MACnCC,iBAAiB;MACjBH,qBAAqB,EAAEA,qBAAsB;MAC7CI,iBAAiB,EAAE,IAAI,CAACpL,mBAAoB;MAC5CqL,YAAY,EAAE1S,QAAQ,CAAC2S,EAAE,KAAK,SAAS,GAAG,CAAC,GAAGP,eAAgB;MAC9D5J,MAAM,EAAE,IAAI,CAACI,YAAY,CAAC6D,IAAI,CAAC,IAAI,CAAE;MACrCxE,QAAQ,EAAE,IAAI,CAACrE,KAAK,CAACqE,QAAS;MAC9B1B,IAAI,EAAE,IAAI,CAAC3C,KAAK,CAAC6D,WAAY;MAC7BsB,YAAY,EAAE,IAAI,CAACA,YAAY,CAAC0D,IAAI,CAAC,IAAI,CAAE;MAC3ClC,aAAa,EAAE,IAAI,CAACA,aAAa,CAACkC,IAAI,CAAC,IAAI,CAAE;MAC7C1B,iBAAiB,EAAE,IAAI,CAACA,iBAAiB,CAAC0B,IAAI,CAAC,IAAI,CAAE;MACrDd,UAAU,EAAE,IAAI,CAACA,UAAU,CAACc,IAAI,CAAC,IAAI,CAAE;MACvCb,SAAS,EAAE,IAAI,CAACA,SAAS,CAACa,IAAI,CAAC,IAAI,CAAE;MACrCX,gBAAgB,EAAE,IAAI,CAACA,gBAAgB,CAACW,IAAI,CAAC,IAAI,CAAE;MACnD2B,UAAU,EAAE,IAAI,CAACA,UAAU,CAAC3B,IAAI,CAAC,IAAI,CAAE;MACvCuD,kBAAkB,EAAE,IAAI,CAACA,kBAAkB,CAACvD,IAAI,CAAC,IAAI,CAAE;MACvD4D,YAAY,EAAE,IAAI,CAACA,YAAY,CAAC5D,IAAI,CAAC,IAAI,CAAE;MAC3C6D,aAAa,EAAE,IAAI,CAACA,aAAa,CAAC7D,IAAI,CAAC,IAAI,CAAE;MAC7CiE,YAAY,EAAE,IAAI,CAACA,YAAY,CAACjE,IAAI,CAAC,IAAI,CAAE;MAC3C/I,cAAc,EAAE,IAAI,CAACE,KAAK,CAACF;IAAe,CAC3C,CAAC;EAEN;EAEAkP,mBAAmBA,CAAA,EAAG;IACpB,oBACEpT,KAAA,CAAAgK,aAAA,CAAClH,aAAa;MACZuQ,GAAG,EAAEA,GAAG,IAAK,IAAI,CAACnK,aAAa,GAAGmK,GAAK;MACvCC,eAAe,EAAE,IAAI,CAACA,eAAgB;MACtCC,gBAAgB,EAAE,IAAI,CAACA,gBAAiB;MACxCC,eAAe,EAAE,IAAI,CAACA,eAAgB;MACtCC,cAAc,EAAE,IAAI,CAACA,cAAe;MACpCC,iBAAiB,EAAE,IAAI,CAACA,iBAAkB;MAC1CC,OAAO,EAAE,GAAI;MACbC,aAAa,EAAE,KAAM;MACrBC,QAAQ,EAAE,YAAa;MACvBC,UAAU,EAAE,WAAY;MACxBC,MAAM,EAAE,IAAI,CAACrQ,KAAK,CAACqD,IAAI,CAACE,GAAI;MAC5B+M,QAAQ;MACRC,UAAU;IAAA,CACX,CAAC;EAEN;EAEAC,gBAAgBA,CAAA,EAAG;IACjB,MAAM;MAAEvN,cAAc;MAAEH,gBAAgB;MAAEC;IAAgB,CAAC,GAAG,IAAI,CAACrC,KAAK;IACxE,oBAAOpE,KAAA,CAAAgK,aAAA,CAAChH,UAAU;MAACmR,OAAO,EAAExN,cAAe;MAACL,MAAM,EAAEE,gBAAiB;MAAC4N,KAAK,EAAE3N,eAAgB;MAAC4N,OAAO,EAAE,IAAI,CAAClL,YAAY,CAAC8D,IAAI,CAAC,IAAI;IAAE,CAAE,CAAC;EACzI;EAEAqH,sBAAsBA,CAAA,EAAG;IACvB,MAAM;MAAE9M,mBAAmB;MAAEE;IAAgB,CAAC,GAAG,IAAI,CAACtD,KAAK;IAC3D,IAAI,CAACsD,eAAe,EAAE;IAEtB,oBAAO1H,KAAA,CAAAgK,aAAA,CAAC/G,UAAU;MAACiD,GAAG,EAAEwB,eAAgB;MAACyM,OAAO,EAAE3M,mBAAoB;MAAC6M,OAAO,EAAE,IAAI,CAACrH;IAAsB,CAAE,CAAC;EAChH;EAEAuH,SAASA,CAAA,EAAG;IACV,IAAIrT,CAAC,CAACiD,OAAO,CAAC,IAAI,CAACC,KAAK,CAACuB,WAAW,CAAC,EAAE;MACrC,OAAO,IAAI;IACb;IACA,oBACE3F,KAAA,CAAAgK,aAAA,CAACvI,QAAQ;MAAC2L,MAAM,EAAE,IAAI,CAAChJ,KAAK,CAACuB,WAAY;MAAC0O,OAAO,EAAE,IAAI,CAACG,iBAAkB;MAAC7G,KAAK,EAAEhL,WAAW,CAAC,IAAI,CAACyB,KAAK,CAACuB,WAAW,CAAE;MAAC8O,QAAQ,EAAE;IAAE,CAAE,CAAC;EAE1I;EAEAC,wBAAwBA,CAAA,EAAG;IACzB,oBACE1U,KAAA,CAAAgK,aAAA,CAACnI,YAAY;MACXsS,OAAO,EAAE,IAAI,CAAC/P,KAAK,CAAC8C,wBAAyB;MAC7CyN,SAAS,EAAE,IAAI,CAACC,sBAAuB;MACvCC,QAAQ,EAAE,IAAI,CAACC,qBAAsB;MACrCxL,IAAI,EAAC,+CAA+C;MACpDyL,OAAO,EAAC,QAAQ;MAChBC,MAAM,EAAC;IAAQ,CAChB,CAAC;EAEN;EAEAC,MAAMA,CAAA,EAAG;IACP,IAAIzU,QAAQ,CAAC2S,EAAE,KAAK,SAAS,IAAI,CAAC,IAAI,CAACzP,KAAK,CAACwR,cAAc,EAAE;MAC3D,oBACElV,KAAA,CAAAgK,aAAA,CAACzJ,oBAAoB;QAAC4U,QAAQ,EAAE,SAAU;QAAC1I,KAAK,EAAEC,MAAM,CAAC0I;MAAc,GACpE,IAAI,CAAC3C,UAAU,CAAC,CAAC,EACjB,IAAI,CAACW,mBAAmB,CAAC,CAAC,EAC1B,IAAI,CAACc,gBAAgB,CAAC,CAAC,EACvB,IAAI,CAACI,sBAAsB,CAAC,CAAC,EAC7B,IAAI,CAACC,SAAS,CAAC,CAAC,EAChB,IAAI,CAACG,wBAAwB,CAAC,CACX,CAAC;IAE3B;IACA,oBACE1U,KAAA,CAAAgK,aAAA,CAAC9J,IAAI;MAACuM,KAAK,EAAEC,MAAM,CAAC0I;IAAc,GAC/B,IAAI,CAAC3C,UAAU,CAAC,CAAC,EACjB,IAAI,CAACW,mBAAmB,CAAC,CAAC,EAC1B,IAAI,CAACc,gBAAgB,CAAC,CAAC,EACvB,IAAI,CAACI,sBAAsB,CAAC,CAAC,EAC7B,IAAI,CAACC,SAAS,CAAC,CAAC,EAChB,IAAI,CAACG,wBAAwB,CAAC,CAC3B,CAAC;EAEX;AACF;AAEA,MAAMhI,MAAM,GAAG;EACb0I,aAAa,EAAE;IACb1D,IAAI,EAAE,CAAC;IACPX,cAAc,EAAE;EAClB,CAAC;EACDlD,cAAc,EAAE;IACdzD,IAAI,EAAE;MACJT,UAAU,EAAE,CAAC;MACb0L,WAAW,EAAE,EAAE;MACfC,YAAY,EAAE,EAAE;MAChB1L,aAAa,EAAE,CAAC;MAChBoF,aAAa,EAAE;IACjB,CAAC;IACDzE,KAAK,EAAE;MACLZ,UAAU,EAAE,CAAC;MACb0L,WAAW,EAAE,EAAE;MACfC,YAAY,EAAE,EAAE;MAChB1L,aAAa,EAAE,CAAC;MAChBoF,aAAa,EAAE;IACjB;EACF,CAAC;EACDlB,UAAU,EAAE;IACVlB,KAAK,EAAE,EAAE;IACTuC,MAAM,EAAE,EAAE;IACVoG,UAAU,EAAE,OAAO;IACnBjL,YAAY,EAAE;EAChB,CAAC;EACDyD,gBAAgB,EAAE;IAChBxD,KAAK,EAAE;MACLyB,UAAU,EAAE;IACd,CAAC;IACD5B,IAAI,EAAE;MACJ6B,WAAW,EAAE;IACf;EACF,CAAC;EACDgC,SAAS,EAAE;IACTiE,SAAS,EAAE,EAAE;IACbtF,KAAK,EAAE;EACT,CAAC;EACDuB,UAAU,EAAE;IACVvC,QAAQ,EAAE,EAAE;IACZD,UAAU,EAAE,SAAS;IACrBtB,eAAe,EAAE;EACnB,CAAC;EACD+D,cAAc,EAAE;IACdhE,IAAI,EAAE;MACJoL,SAAS,EAAE;IACb,CAAC;IACDjL,KAAK,EAAE;MACLiL,SAAS,EAAE;IACb;EACF,CAAC;EACDrI,iBAAiB,EAAE;IACjBP,KAAK,EAAEzJ,gBAAgB;IACvBgM,MAAM,EAAEhM,gBAAgB;IACxBmH,YAAY,EAAE,CAAC;IACfmL,SAAS,EAAE;EACb,CAAC;EACDvI,iBAAiB,EAAE;IACjBN,KAAK,EAAE1J,gBAAgB;IACvBiM,MAAM,EAAEjM,gBAAgB;IACxBoH,YAAY,EAAE,CAAC;IACfmL,SAAS,EAAE,QAAQ;IACnBxJ,WAAW,EAAE5I,YAAY;IACzB0I,YAAY,EAAE1I;EAChB,CAAC;EACDiL,SAAS,EAAE;IACT1C,QAAQ,EAAE,EAAE;IACZD,UAAU,EAAE,YAAY;IACxBtB,eAAe,EAAE;EACnB,CAAC;EACDoG,cAAc,EAAE;IACdpG,eAAe,EAAE,MAAM;IACvBwC,eAAe,EAAE,CAAC;IAClB9C,iBAAiB,EAAE;EACrB,CAAC;EACDiI,SAAS,EAAE;IACTnG,KAAK,EAAE7J,YAAY;IACnB4J,QAAQ,EAAE,EAAE;IACZD,UAAU,EAAE;EACd,CAAC;EACD8F,KAAK,EAAE;IACLiE,MAAM,EAAE,CAAC;IACTrL,eAAe,EAAElI,OAAO;IACxBmI,YAAY,EAAE,CAAC;IACfoH,IAAI,EAAE;EACR,CAAC;EACDiE,iBAAiB,EAAE;IACjBjE,IAAI,EAAE;EACR,CAAC;EACDkE,oBAAoB,EAAE;IACpBlE,IAAI,EAAE,CAAC;IACP1C,aAAa,EAAE;EACjB,CAAC;EACDnI,UAAU,EAAE;IACVqL,SAAS,EAAE,EAAE;IACblD,aAAa,EAAE,KAAK;IACpBC,UAAU,EAAE,QAAQ;IACpB4G,iBAAiB,EAAE,CAAC;IACpBC,iBAAiB,EAAE/T,QAAQ;IAC3BgK,YAAY,EAAE;EAChB,CAAC;EACDuF,oBAAoB,EAAE;IACpBtF,UAAU,EAAE;EACd,CAAC;EACDuF,uBAAuB,EAAE;IACvBR,cAAc,EAAE,QAAQ;IACxB9B,UAAU,EAAE,QAAQ;IACpB3E,YAAY,EAAE,EAAE;IAChBsC,KAAK,EAAE,EAAE;IACTuC,MAAM,EAAE,EAAE;IACV4G,WAAW,EAAE,CAAC;IACdC,WAAW,EAAE;EACf,CAAC;EACDxE,kBAAkB,EAAE;IAClB5F,QAAQ,EAAE,EAAE;IACZC,KAAK,EAAE,MAAM;IACbE,YAAY,EAAE;EAChB,CAAC;EACDmD,aAAa,EAAE;IACb3C,QAAQ,EAAE,UAAU;IACpBwC,GAAG,EAAE,CAAC;IACNxE,KAAK,EAAE,CAAC;IACR4E,MAAM,EAAE,EAAE;IACVvC,KAAK,EAAE,EAAE;IACTqC,UAAU,EAAE,QAAQ;IACpB8B,cAAc,EAAE,QAAQ;IACxB1G,eAAe,EAAE;EACnB,CAAC;EACD+E,IAAI,EAAE;IACJxD,QAAQ,EAAE,EAAE;IACZC,KAAK,EAAEzJ,aAAa;IACpBwJ,QAAQ,EAAE,EAAE;IACZ4J,SAAS,EAAE;EACb,CAAC;EACD5E,SAAS,EAAE;IACTzB,MAAM,EAAE7L,yBAAyB;IACjC2S,cAAc,EAAE,CAAC;IACjBC,cAAc,EAAEnU,QAAQ;IACxB4H,UAAU,EAAE,CAAC;IACbmC,SAAS,EAAE;EACb,CAAC;EACDgE,uBAAuB,EAAE;IACvBwF,YAAY,EAAE,CAAC;IACf3L,UAAU,EAAE,CAAC;IACbsC,WAAW,EAAE;EACf,CAAC;EACD8D,cAAc,EAAE;IACdnD,KAAK,EAAErJ,kBAAkB;IACzB4L,MAAM,EAAE5L;EACV,CAAC;EACD0M,oBAAoB,EAAE;IACpB3F,YAAY,EAAE;EAChB,CAAC;EACD6L,mBAAmB,EAAE;IACnBhH,MAAM,EAAE;EACV,CAAC;EACDxC,eAAe,EAAE;IACfX,UAAU,EAAE,EAAE;IACdC,WAAW,EAAE,EAAE;IACf+C,aAAa,EAAE,KAAK;IACpBoH,QAAQ,EAAE;EACZ,CAAC;EACD1G,qBAAqB,EAAE;IACrBV,aAAa,EAAE,KAAK;IACpBqH,QAAQ,EAAE;EACZ,CAAC;EACDnG,uBAAuB,EAAE;IACvB3D,QAAQ,EAAE,UAAU;IACpBwC,GAAG,EAAE,CAAC;IACNxE,KAAK,EAAE;EACT,CAAC;EACD+F,0BAA0B,EAAE;IAC1BS,cAAc,EAAE,QAAQ;IACxB9B,UAAU,EAAE,QAAQ;IACpB3E,YAAY,EAAE,EAAE;IAChBsC,KAAK,EAAE,EAAE;IACTuC,MAAM,EAAE,EAAE;IACV4G,WAAW,EAAE,CAAC;IACdC,WAAW,EAAE;EACf,CAAC;EACDzF,qBAAqB,EAAE;IACrB3E,QAAQ,EAAE,EAAE;IACZC,KAAK,EAAE,MAAM;IACbE,YAAY,EAAE;EAChB,CAAC;EACDsB,kBAAkB,EAAE;IAClBd,QAAQ,EAAE,UAAU;IACpBwC,GAAG,EAAE,CAAC;IACN3E,IAAI,EAAE,CAAC;IACPG,KAAK,EAAE,CAAC;IACR8F,MAAM,EAAE,CAAC;IACTpB,UAAU,EAAE,QAAQ;IACpB8B,cAAc,EAAE;EAClB,CAAC;EACDvD,gBAAgB,EAAE;IAChB3B,KAAK,EAAE,MAAM;IACbD,QAAQ,EAAE,EAAE;IACZ0K,eAAe,EAAE,iBAAiB;IAClCC,gBAAgB,EAAE;MAAE3J,KAAK,EAAE,CAAC;MAAEuC,MAAM,EAAE;IAAE;EAC1C;AACF,CAAC;AAED,MAAMqH,eAAe,GAAGpS,KAAK,IAAI;EAC/B,OAAO;IACL2C,IAAI,EAAE3C,KAAK,CAAC2C,IAAI;IAChBmE,kBAAkB,EAAEjJ,8BAA8B,CAACmC,KAAK,CAAC;IACzDoG,mBAAmB,EAAEtI,+BAA+B,CAACkC,KAAK,CAAC;IAC3DwD,QAAQ,EAAEvF,uBAAuB,CAAC+B,KAAK,CAAC,CAACqD;EAC3C,CAAC;AACH,CAAC;AAED,eAAexG,OAAO,CAACuV,eAAe,EAAE,CAAC,CAAC,CAAC,CAAChT,SAAS,CAAC","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plusscommunities/pluss-core-app",
3
- "version": "8.0.4",
3
+ "version": "8.0.6",
4
4
  "description": "Core extension package for Pluss Communities platform",
5
5
  "main": "dist/module/index.js",
6
6
  "module": "dist/module/index.js",
@@ -31,6 +31,7 @@
31
31
  "expo-av": "~16.0.7",
32
32
  "expo-calendar": "~15.0.7",
33
33
  "expo-constants": "~18.0.10",
34
+ "expo-document-picker": "~14.0.7",
34
35
  "expo-file-system": "~19.0.17",
35
36
  "expo-image-manipulator": "~14.0.7",
36
37
  "expo-image-picker": "~17.0.8",
@@ -1,7 +1,7 @@
1
1
  import React, { Component } from 'react';
2
2
  import { View, TouchableOpacity, Text, StyleSheet, ActivityIndicator } from 'react-native';
3
3
  import { Icon } from '@rneui/themed';
4
- // import * as DocumentPicker from 'expo-document-picker';
4
+ import * as DocumentPicker from 'expo-document-picker';
5
5
  import { connect } from 'react-redux';
6
6
  import Config from '../config';
7
7
  import { fileActions } from '../apis';
@@ -33,21 +33,21 @@ class DocumentUploader extends Component {
33
33
  pickDocument = async () => {
34
34
  const { allowedTypes, multiple } = this.props;
35
35
 
36
- // try {
37
- // const result = await DocumentPicker.getDocumentAsync({
38
- // type: allowedTypes,
39
- // copyToCacheDirectory: true,
40
- // multiple: multiple || false,
41
- // });
42
- // // console.log('pickDocument', JSON.stringify(result, null, 2));
43
-
44
- // if (!result.canceled) {
45
- // await this.handleDocumentPicked(result);
46
- // }
47
- // } catch (error) {
48
- // console.log('Document picker error:', error);
49
- // this.props.onUploadFailed(null, error.message);
50
- // }
36
+ try {
37
+ const result = await DocumentPicker.getDocumentAsync({
38
+ type: allowedTypes,
39
+ copyToCacheDirectory: true,
40
+ multiple: multiple || false,
41
+ });
42
+ // console.log('pickDocument', JSON.stringify(result, null, 2));
43
+
44
+ if (!result.canceled) {
45
+ await this.handleDocumentPicked(result);
46
+ }
47
+ } catch (error) {
48
+ console.log('Document picker error:', error);
49
+ this.props.onUploadFailed(null, error.message);
50
+ }
51
51
  };
52
52
 
53
53
  handleDocumentPicked = async documentResult => {
@@ -1,6 +1,17 @@
1
1
  import React, { Component } from 'react';
2
- import { View, Image, ImageBackground, TouchableOpacity, Text, KeyboardAvoidingView, Platform, ScrollView, Alert } from 'react-native';
3
- import { GiftedChat, Bubble, MessageText, Send, InputToolbar, Composer } from 'react-native-gifted-chat';
2
+ import {
3
+ View,
4
+ Image,
5
+ ImageBackground,
6
+ TouchableOpacity,
7
+ Text,
8
+ KeyboardAvoidingView,
9
+ Platform,
10
+ ScrollView,
11
+ Alert,
12
+ TextInput,
13
+ } from 'react-native';
14
+ import { GiftedChat, Bubble, MessageText, Send, InputToolbar } from 'react-native-gifted-chat';
4
15
  import { connect } from 'react-redux';
5
16
  import _ from 'lodash';
6
17
  import moment from 'moment';
@@ -65,6 +76,7 @@ class PlussChat extends Component {
65
76
  currentVideoUrl: '',
66
77
  showDeleteMessageConfirm: false,
67
78
  messageToDelete: null,
79
+ composerHeight: this.MIN_COMPOSER_HEIGHT,
68
80
  };
69
81
  this.checkThumb = null;
70
82
  }
@@ -81,13 +93,9 @@ class PlussChat extends Component {
81
93
  }
82
94
 
83
95
  updateMessages(props) {
84
- const newState = {};
85
- if (!_.isUndefined(props.messages)) {
86
- newState.messages = props.messages;
87
- }
88
- // Only setState if we have something to update
89
- if (Object.keys(newState).length > 0) {
90
- this.setState(newState);
96
+ // Only update if messages actually changed
97
+ if (!_.isUndefined(props.messages) && !_.isEqual(props.messages, this.state.messages)) {
98
+ this.setState({ messages: props.messages });
91
99
  }
92
100
  }
93
101
 
@@ -590,12 +598,41 @@ class PlussChat extends Component {
590
598
  }
591
599
 
592
600
  renderSend(props) {
601
+ const buttonTopOffset = this.state.replyingTo ? 46 : 4;
602
+ const showSendButton = !_.isEmpty(props.text) || this.hasImagesReady(props.imagesToUpload);
593
603
  return (
594
- <View style={[{ position: 'absolute', top: 0, right: 0 }, !!this.state.replyingTo && { marginTop: 38 }]}>
595
- {(!_.isEmpty(props.text) || this.hasImagesReady(props.imagesToUpload)) && (
604
+ <View
605
+ style={{
606
+ position: 'absolute',
607
+ top: buttonTopOffset,
608
+ right: 8,
609
+ flexDirection: 'row',
610
+ alignItems: 'center',
611
+ }}
612
+ >
613
+ {/* Image upload button - always visible */}
614
+ <TouchableOpacity
615
+ onPress={this.showUploadMenu.bind(this)}
616
+ style={[
617
+ styles.sendContainer,
618
+ {
619
+ right: _.isEmpty(props.text) && !this.hasImagesReady(props.imagesToUpload) ? 0 : this.MIN_COMPOSER_HEIGHT,
620
+
621
+ width: this.MIN_COMPOSER_HEIGHT,
622
+ height: this.MIN_COMPOSER_HEIGHT,
623
+ },
624
+ ]}
625
+ >
626
+ <Icon name={'picture-o'} type="font-awesome" iconStyle={[styles.send, { width: this.MIN_COMPOSER_HEIGHT }]} />
627
+ </TouchableOpacity>
628
+
629
+ {/* Send button - only visible when there's text or images */}
630
+ {showSendButton && (
596
631
  <Send
597
632
  {...props}
598
633
  alwaysShowSend={true}
634
+ onSend={props.onSend}
635
+ text={props.text || ' '}
599
636
  containerStyle={[
600
637
  styles.sendContainer,
601
638
  {
@@ -607,19 +644,6 @@ class PlussChat extends Component {
607
644
  <Icon name={'paper-plane'} type="font-awesome" iconStyle={[styles.send, { width: this.MIN_COMPOSER_HEIGHT }]} />
608
645
  </Send>
609
646
  )}
610
- <TouchableOpacity
611
- onPress={this.showUploadMenu.bind(this)}
612
- style={[
613
- styles.sendContainer,
614
- {
615
- right: _.isEmpty(props.text) && !this.hasImagesReady(props.imagesToUpload) ? 0 : 8 + this.MIN_COMPOSER_HEIGHT,
616
- width: this.MIN_COMPOSER_HEIGHT,
617
- height: this.MIN_COMPOSER_HEIGHT,
618
- },
619
- ]}
620
- >
621
- <Icon name={'picture-o'} type="font-awesome" iconStyle={[styles.send, { width: this.MIN_COMPOSER_HEIGHT }]} />
622
- </TouchableOpacity>
623
647
  </View>
624
648
  );
625
649
  }
@@ -711,7 +735,8 @@ class PlussChat extends Component {
711
735
  }
712
736
  renderComposer(props) {
713
737
  return (
714
- <View style={styles.composerContainer}>
738
+ <View style={{ width: '100%' }}>
739
+ {/* Replying to section - stacked vertically on top */}
715
740
  {this.state.replyingTo && (
716
741
  <View style={styles.replyingTo}>
717
742
  <TextStyle type="body">
@@ -728,33 +753,38 @@ class PlussChat extends Component {
728
753
  </TouchableOpacity>
729
754
  </View>
730
755
  )}
731
- <View style={styles.composerInputWrapper}>
756
+ {/* Horizontal row for input - buttons are absolutely positioned via renderSend */}
757
+ <View style={{ flexDirection: 'row', alignItems: 'flex-end', width: '100%', paddingBottom: 8 }}>
732
758
  <View
733
759
  style={[
734
760
  styles.input,
735
761
  {
736
- //height: props.composerHeight + 10,
737
- //borderRadius: (this.MIN_COMPOSER_HEIGHT + 10) / 2,
762
+ flex: 1,
738
763
  marginRight:
739
764
  _.isEmpty(props.text) && !this.hasImagesReady(props.imagesToUpload)
740
- ? 8 + this.MIN_COMPOSER_HEIGHT
765
+ ? 16 + this.MIN_COMPOSER_HEIGHT
741
766
  : 2 * (this.MIN_COMPOSER_HEIGHT + 8),
742
- justifyContent: 'center',
743
- },
744
- Platform.OS === 'ios' && {
745
- height: props.composerHeight + 10,
767
+ paddingHorizontal: 12,
768
+ paddingVertical: Platform.select({ ios: 8, android: 6 }),
746
769
  },
747
770
  ]}
748
771
  >
749
- <Composer
750
- {...props}
751
- //composerHeight={props.composerHeight}
772
+ <TextInput
752
773
  placeholder="Type a message..."
753
- textInputStyle={styles.inputText}
754
- textInputProps={{
755
- onFocus: this.onFocusInput.bind(this),
756
- onBlur: this.onBlurInput.bind(this),
757
- }}
774
+ multiline
775
+ value={props.text}
776
+ onChangeText={props.onTextChanged}
777
+ style={[
778
+ styles.inputText,
779
+ {
780
+ lineHeight: 20,
781
+ minHeight: this.MIN_COMPOSER_HEIGHT - 16,
782
+ maxHeight: 100,
783
+ },
784
+ ]}
785
+ onFocus={this.onFocusInput.bind(this)}
786
+ onBlur={this.onBlurInput.bind(this)}
787
+ placeholderTextColor="#999"
758
788
  />
759
789
  </View>
760
790
  </View>
@@ -767,16 +797,20 @@ class PlussChat extends Component {
767
797
  */
768
798
  renderChat() {
769
799
  const { tabCount, noTab } = this.props;
770
- const iosBottomOffset = (tabCount === 1 || noTab ? -10 : 52) + getBottomSpace();
800
+ const safeAreaBottom = getBottomSpace();
801
+ // Adjusted for react-native-gifted-chat v2: account for tab bar + safe area
802
+ const iosBottomOffset = (tabCount === 1 || noTab ? 0 : 49) + safeAreaBottom;
771
803
  const minInputToolbarHeight =
772
- this.MIN_COMPOSER_HEIGHT + 16 + (this.state.replyingTo ? 30 : 0) + (this.hasImagesAttached() ? IMAGE_PREVIEW_AREA_HEIGHT : 0);
804
+ this.MIN_COMPOSER_HEIGHT + 32 + (this.state.replyingTo ? 38 : 0) + (this.hasImagesAttached() ? IMAGE_PREVIEW_AREA_HEIGHT : 0);
773
805
 
774
806
  return (
775
807
  <GiftedChat
808
+ disableKeyboardController={true}
776
809
  alwaysShowSend={false}
777
810
  keyboardShouldPersistTaps={'never'}
778
811
  renderAvatarOnTop
779
812
  minInputToolbarHeight={minInputToolbarHeight}
813
+ minComposerHeight={this.MIN_COMPOSER_HEIGHT}
780
814
  bottomOffset={Platform.OS === 'android' ? 0 : iosBottomOffset}
781
815
  onSend={this.sendMessages.bind(this)}
782
816
  messages={this.state.messages}
@@ -819,14 +853,7 @@ class PlussChat extends Component {
819
853
 
820
854
  renderImagePopup() {
821
855
  const { imagePopupOpen, imagePopupSource, imagePopupIndex } = this.state;
822
- return (
823
- <ImagePopup
824
- visible={imagePopupOpen}
825
- images={imagePopupSource}
826
- index={imagePopupIndex}
827
- onClose={this.closeGallery.bind(this)}
828
- />
829
- );
856
+ return <ImagePopup visible={imagePopupOpen} images={imagePopupSource} index={imagePopupIndex} onClose={this.closeGallery.bind(this)} />;
830
857
  }
831
858
 
832
859
  renderVideoPlayerPopup() {