alqindiirsyam 9 months ago
parent
commit
27d43d918e
20 changed files with 5946 additions and 6 deletions
  1. 3 3
      appbuilder-ios/NexilisLite/NexilisLite/Source/APIS.swift
  2. 50 1
      appbuilder-ios/NexilisLite/NexilisLite/Source/View/Chat/EditorPersonal.swift
  3. 29 0
      appbuilder-ios/NexilisUC/NexilisUC.podspec
  4. 0 1
      appbuilder-ios/NexilisUC/NexilisUC.xcodeproj/project.pbxproj
  5. 1 1
      appbuilder-ios/NexilisUC/NexilisUC.xcodeproj/xcuserdata/akhmadalqindiirsyam.xcuserdatad/xcschemes/xcschememanagement.plist
  6. 14 0
      appbuilder-ios/NexilisUC/NexilisUC.xcodeproj/xcuserdata/maronakins.xcuserdatad/xcschemes/xcschememanagement.plist
  7. BIN
      appbuilder-ios/NexilisUC/NexilisUC.xcworkspace/xcuserdata/akhmadalqindiirsyam.xcuserdatad/UserInterfaceState.xcuserstate
  8. BIN
      appbuilder-ios/NexilisUC/NexilisUC.xcworkspace/xcuserdata/maronakins.xcuserdatad/UserInterfaceState.xcuserstate
  9. 20 0
      appbuilder-ios/NexilisUC/NexilisUC/Source/CX.swift
  10. 1432 0
      appbuilder-ios/NexilisUC/NexilisUC/Source/Extension.swift
  11. 2515 0
      appbuilder-ios/NexilisUC/NexilisUC/Source/Message/CoreMessage_TMessageBank.swift
  12. 783 0
      appbuilder-ios/NexilisUC/NexilisUC/Source/Message/CoreMessage_TMessageCode.swift
  13. 499 0
      appbuilder-ios/NexilisUC/NexilisUC/Source/Message/CoreMessage_TMessageKey.swift
  14. 50 0
      appbuilder-ios/NexilisUC/NexilisUC/Source/Message/CoreMessage_TMessageUtil.swift
  15. 331 0
      appbuilder-ios/NexilisUC/NexilisUC/Source/Message/TMessage.swift
  16. 114 0
      appbuilder-ios/NexilisUC/NexilisUC/Source/Prefs.swift
  17. 24 0
      appbuilder-ios/NexilisUC/NexilisUC/Source/Services/AudioCallService.swift
  18. 25 0
      appbuilder-ios/NexilisUC/NexilisUC/Source/Services/LiveStreamingService.swift
  19. 25 0
      appbuilder-ios/NexilisUC/NexilisUC/Source/Services/VideoCallService.swift
  20. 31 0
      appbuilder-ios/NexilisUC/NexilisUC/Source/UCUtils.swift

+ 3 - 3
appbuilder-ios/NexilisLite/NexilisLite/Source/APIS.swift

@@ -789,15 +789,15 @@ public class APIS: NSObject {
     }
     
     public static func setCheckEmulator(isActive: Bool) {
-        Utils.bCheckEmulator = isActive
+//        Utils.bCheckEmulator = isActive
     }
     
     public static func setCheckRootedDevice(isActive: Bool) {
-        Utils.bCheckRooted = isActive
+//        Utils.bCheckRooted = isActive
     }
     
     public static func setPreventScreenCapture(isActive: Bool) {
-        Utils.bPreventScreenCapture = isActive
+//        Utils.bPreventScreenCapture = isActive
     }
     
     private static var appNm = "";

+ 50 - 1
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Chat/EditorPersonal.swift

@@ -3587,6 +3587,33 @@ extension EditorPersonal: UIContextMenuInteractionDelegate {
                 self.tableChatView.reloadData()
             }
         })
+        let edit = UIAction(title: "Edit".localized(), image: UIImage(systemName: "pencil"), handler: {(_) in
+            if self.removed {
+                return
+            }
+            if self.isSearching {
+                self.cancelAction()
+            }
+            if self.reffId != nil {
+                self.deleteReplyView()
+            }
+            DispatchQueue.main.asyncAfter(deadline: .now() + 0.35) {
+                let handler = CustomUIContextMenu()
+                let nextInteraction = UIContextMenuInteraction(delegate: handler)
+                interaction.view!.addInteraction(nextInteraction)
+                guard let interaction = interaction.view!.interactions.first,
+                      let data = Data(base64Encoded: "X3ByZXNlbnRNZW51QXRMb2NhdGlvbjo="),
+                      let str = String(data: data, encoding: .utf8)
+                else {
+                    return
+                }
+                let selector = NSSelectorFromString(str)
+                guard interaction.responds(to: selector) else {
+                    return
+                }
+                nextInteraction.perform(selector, with: self.view)
+            }
+        })
         let info = UIAction(title: "Info".localized(), image: UIImage(systemName: "info.circle.fill"), handler: {(_) in
             if self.removed {
                 return
@@ -3684,7 +3711,7 @@ extension EditorPersonal: UIContextMenuInteractionDelegate {
             Nexilis.addQueueMessage(message: message)
         })
         
-        var children: [UIMenuElement] = [star, reply, forward, copy, delete]
+        var children: [UIMenuElement] = [star, reply, forward, copy, edit, delete]
 //        let copyOption = self.copyOption(indexPath: indexPath!)
         let idMe = UserDefaults.standard.string(forKey: "me") as String?
         if dataMessages[indexPath!.row]["status"] as! String == "0" {
@@ -6759,6 +6786,28 @@ class segmentedControllerObject: UISegmentedControl {
     var navigation = UINavigationController()
 }
 
+class CustomUIContextMenu: NSObject, UIContextMenuInteractionDelegate {
+    func contextMenuInteraction(_ interaction: UIContextMenuInteraction, configurationForMenuAtLocation location: CGPoint) -> UIContextMenuConfiguration? {
+        // Return the menu configuration
+        return UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { _ in
+            let action1 = UIAction(title: "Action 1", handler: { _ in
+                // Handle action 1
+            })
+            let action2 = UIAction(title: "Action 2", handler: { _ in
+                // Handle action 2
+            })
+            return UIMenu(title: "", children: [action1, action2])
+        }
+    }
+    
+    func contextMenuInteraction(_ interaction: UIContextMenuInteraction, configuration: UIContextMenuConfiguration, highlightPreviewForItemWithIdentifier identifier: any NSCopying) -> UITargetedPreview? {
+        let previewView = UIView()
+        previewView.frame = CGRect(x: 0, y: 0, width: 100, height: 50)
+        previewView.backgroundColor = .green
+        return UITargetedPreview(view: previewView)
+    }
+}
+
 public class ImageGrouping {
     public var messageId = ""
     public var thumbId = ""

+ 29 - 0
appbuilder-ios/NexilisUC/NexilisUC.podspec

@@ -0,0 +1,29 @@
+#
+#  Be sure to run `pod spec lint PalioLite.podspec' to ensure this is a
+#  valid spec and to remove all comments including this before submitting the spec.
+#
+#  To learn more about Podspec attributes see https://guides.cocoapods.org/syntax/podspec.html
+#  To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/
+#
+
+Pod::Spec.new do |spec|
+  spec.name         = "NexilisUC"
+  spec.version      = "1.0.0"
+  spec.summary      = "NexilisUC Framework"
+  spec.description  = <<-DESC
+  NexilisUC Framework
+                   DESC
+
+  spec.homepage     = "https://nexilis.io/"
+  spec.license      = "MIT"
+  spec.author       = { "Yayan D Wicaksono" => "ya2n.wicaksono@gmail.com" }
+  spec.ios.deployment_target = "14.0"
+  spec.source       = { :path => '.' }
+  spec.source_files = 'NexilisUC/Source/**/*'
+  spec.resource_bundles = { 'NexilisUC' => ['NexilisUC/Resource/**/*']}
+  spec.swift_version = '5.5.1'
+  spec.dependency 'nuSDKService', '~> 3.0.1'
+  spec.ios.vendored_frameworks = "NexilisUC.framework"
+  spec.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64', 'ENABLE_BITCODE' => 'NO' }
+  spec.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64', 'ENABLE_BITCODE' => 'NO' }
+end

+ 0 - 1
appbuilder-ios/NexilisUC/NexilisUC.xcodeproj/project.pbxproj

@@ -56,7 +56,6 @@
 				3F3595946F4D409B95F3A606 /* Pods-NexilisUC.debug.xcconfig */,
 				ADED97B3FBDC598A69C69EFA /* Pods-NexilisUC.release.xcconfig */,
 			);
-			name = Pods;
 			path = Pods;
 			sourceTree = "<group>";
 		};

+ 1 - 1
appbuilder-ios/NexilisUC/NexilisUC.xcodeproj/xcuserdata/akhmadalqindiirsyam.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -7,7 +7,7 @@
 		<key>NexilisUC.xcscheme_^#shared#^_</key>
 		<dict>
 			<key>orderHint</key>
-			<integer>2</integer>
+			<integer>1</integer>
 		</dict>
 	</dict>
 </dict>

+ 14 - 0
appbuilder-ios/NexilisUC/NexilisUC.xcodeproj/xcuserdata/maronakins.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>SchemeUserState</key>
+	<dict>
+		<key>NexilisUC.xcscheme_^#shared#^_</key>
+		<dict>
+			<key>orderHint</key>
+			<integer>2</integer>
+		</dict>
+	</dict>
+</dict>
+</plist>

BIN
appbuilder-ios/NexilisUC/NexilisUC.xcworkspace/xcuserdata/akhmadalqindiirsyam.xcuserdatad/UserInterfaceState.xcuserstate


BIN
appbuilder-ios/NexilisUC/NexilisUC.xcworkspace/xcuserdata/maronakins.xcuserdatad/UserInterfaceState.xcuserstate


+ 20 - 0
appbuilder-ios/NexilisUC/NexilisUC/Source/CX.swift

@@ -0,0 +1,20 @@
+//
+//  CX.swift
+//  NexilisUC
+//
+//  Created by Maronakins on 04/11/24.
+//
+
+import nuSDKService
+
+public class CX {
+    
+    public static func bnuSDKServiceReady() -> Bool {
+        return API.bnuSDKServiceReady()
+    }
+    
+    public static func nGetCLXConnState() -> UInt8 {
+        return API.nGetCLXConnState()
+    }
+    
+}

+ 1432 - 0
appbuilder-ios/NexilisUC/NexilisUC/Source/Extension.swift

@@ -0,0 +1,1432 @@
+//
+//  StringUtil.swift
+//  Runner
+//
+//  Created by Yayan Dwi on 20/04/20.
+//  Copyright © 2020 The Chromium Authors. All rights reserved.
+//
+
+import Foundation
+import UIKit
+import ImageIO
+import MobileCoreServices
+
+extension Date {
+    
+    public func currentTimeMillis() -> Int {
+        return Int(self.timeIntervalSince1970 * 1000)
+    }
+    
+    func format(dateFormat: String) -> String {
+        let formatter = DateFormatter()
+        formatter.dateFormat = dateFormat
+        return formatter.string(from: self)
+    }
+    
+    var millisecondsSince1970:Int64 {
+        return Int64((self.timeIntervalSince1970 * 1000.0).rounded())
+    }
+    
+    public init(milliseconds:Int64) {
+        self = Date(timeIntervalSince1970: TimeInterval(milliseconds) / 1000)
+    }
+}
+
+extension String {
+    
+    func toNormalString() -> String {
+        let _source = self.replacingOccurrences(of: "+", with: "%20")
+        if var result = _source.removingPercentEncoding {
+            result = result.replacingOccurrences(of: "<NL>", with: "\n")
+            result = result.replacingOccurrences(of: "<CR>", with: "\r")
+            return decrypt(source: result)
+        }
+        return self
+    }
+    
+    func toStupidString() -> String {
+        if var result = self.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) {
+            result = result.replacingOccurrences(of: "\n", with: "<NL>")
+            result = result.replacingOccurrences(of: "\r", with: "<CR>")
+            result = result.replacingOccurrences(of: "+", with: "%2B")
+            return result
+        }
+        return self
+    }
+    
+    private func decrypt(source : String) -> String {
+        if let result = source.removingPercentEncoding {
+            return result
+        }
+        return source
+    }
+    
+    public func matches(_ regex: String) -> Bool {
+        return self.range(of: regex, options: .regularExpression, range: nil, locale: nil) != nil
+    }
+    
+}
+
+extension Int {
+    
+    func toHex() -> String {
+        return String(format: "%02X", self)
+    }
+    
+}
+
+//extension UIApplication {
+//    public static var appVersion: String? {
+//        return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String
+//    }
+//    
+//    var rootViewController: UIViewController? {
+//        return UIApplication.shared.windows.filter {$0.isKeyWindow}.first?.rootViewController
+//    }
+//    
+//    public var visibleViewController: UIViewController? {
+//        let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
+//        if var topController = keyWindow?.rootViewController {
+//            while let presentedViewController = topController.presentedViewController {
+//                topController = presentedViewController
+//            }
+//            return topController
+//        }
+//        return nil
+//    }
+//}
+
+extension UIView {
+    
+    public func anchor(top: NSLayoutYAxisAnchor? = nil,
+                left: NSLayoutXAxisAnchor? = nil,
+                bottom: NSLayoutYAxisAnchor? = nil,
+                right: NSLayoutXAxisAnchor? = nil,
+                paddingTop: CGFloat = 0,
+                paddingLeft: CGFloat = 0,
+                paddingBottom: CGFloat = 0,
+                paddingRight: CGFloat = 0,
+                centerX: NSLayoutXAxisAnchor? = nil,
+                centerY: NSLayoutYAxisAnchor? = nil,
+                width: CGFloat = 0,
+                height: CGFloat = 0,
+                minHeight: CGFloat = 0,
+                maxHeight: CGFloat = 0,
+                minWidth: CGFloat = 0,
+                maxWidth: CGFloat = 0,
+                dynamicLeft: Bool = false,
+                dynamicRight: Bool = false) {
+        
+        translatesAutoresizingMaskIntoConstraints = false
+        
+        if let top = top {
+            topAnchor.constraint(equalTo: top, constant: paddingTop).isActive = true
+        }
+        if let left = left {
+            if dynamicLeft {
+                leftAnchor.constraint(greaterThanOrEqualTo: left, constant: paddingLeft).isActive = true
+            } else {
+                leftAnchor.constraint(equalTo: left, constant: paddingLeft).isActive = true
+            }
+        }
+        if let right = right {
+            if dynamicRight {
+                leftAnchor.constraint(lessThanOrEqualTo: right, constant: -paddingRight).isActive = true
+            } else {
+                rightAnchor.constraint(equalTo: right, constant: -paddingRight).isActive = true
+            }
+        }
+        if let bottom = bottom {
+            bottomAnchor.constraint(equalTo: bottom, constant: -paddingBottom).isActive = true
+        }
+        if let centerX = centerX {
+            centerXAnchor.constraint(equalTo: centerX).isActive = true
+        }
+        if let centerY = centerY {
+            centerYAnchor.constraint(equalTo: centerY).isActive = true
+        }
+        if height != 0 || minHeight != 0 || maxHeight != 0 {
+            if minHeight != 0 && maxHeight != 0 {
+                heightAnchor.constraint(greaterThanOrEqualToConstant: minHeight).isActive = true
+                heightAnchor.constraint(lessThanOrEqualToConstant: maxHeight).isActive = true
+            } else if minHeight != 0 && maxHeight == 0 {
+                heightAnchor.constraint(greaterThanOrEqualToConstant: minHeight).isActive = true
+            } else if minHeight == 0 && maxHeight != 0 {
+                heightAnchor.constraint(lessThanOrEqualToConstant: maxHeight).isActive = true
+            } else {
+                heightAnchor.constraint(equalToConstant: height).isActive = true
+            }
+        }
+        if width != 0 || minWidth != 0 || maxWidth != 0 {
+            if minWidth != 0 && maxWidth != 0 {
+                heightAnchor.constraint(greaterThanOrEqualToConstant: minWidth).isActive = true
+                heightAnchor.constraint(lessThanOrEqualToConstant: maxWidth).isActive = true
+            } else if minWidth != 0 && maxWidth == 0 {
+                heightAnchor.constraint(greaterThanOrEqualToConstant: minWidth).isActive = true
+            } else if minWidth == 0 && maxWidth != 0 {
+                heightAnchor.constraint(lessThanOrEqualToConstant: maxWidth).isActive = true
+            } else {
+                widthAnchor.constraint(equalToConstant: width).isActive = true
+            }
+        }
+    }
+    
+    public func addTopBorder(with color: UIColor?, andWidth borderWidth: CGFloat, view: UIView = UIView()) {
+        let border = view
+        border.backgroundColor = color
+        border.autoresizingMask = [.flexibleWidth, .flexibleBottomMargin]
+        border.frame = CGRect(x: 0, y: 0, width: frame.size.width, height: borderWidth)
+        addSubview(border)
+    }
+
+    public func addBottomBorder(with color: UIColor?, andWidth borderWidth: CGFloat, x: CGFloat = 0, view: UIView = UIView()) {
+        let border = view
+        border.backgroundColor = color
+        border.autoresizingMask = [.flexibleWidth, .flexibleTopMargin]
+        border.frame = CGRect(x: x, y: frame.size.height - borderWidth, width: frame.size.width, height: borderWidth)
+        addSubview(border)
+    }
+
+    public func addLeftBorder(with color: UIColor?, andWidth borderWidth: CGFloat) {
+        let border = UIView()
+        border.backgroundColor = color
+        border.frame = CGRect(x: 0, y: 0, width: borderWidth, height: frame.size.height)
+        border.autoresizingMask = [.flexibleHeight, .flexibleRightMargin]
+        addSubview(border)
+    }
+
+    public func addRightBorder(with color: UIColor?, andWidth borderWidth: CGFloat) {
+        let border = UIView()
+        border.backgroundColor = color
+        border.autoresizingMask = [.flexibleHeight, .flexibleLeftMargin]
+        border.frame = CGRect(x: frame.size.width - borderWidth, y: 0, width: borderWidth, height: frame.size.height)
+        addSubview(border)
+    }
+    
+    public func resizeImage(image: UIImage, targetSize: CGSize) -> UIImage {
+        UIGraphicsBeginImageContextWithOptions(targetSize, false, 0.0);
+        image.draw(in: CGRect(x: 0, y: 0, width: targetSize.width, height: targetSize.height))
+        let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
+        UIGraphicsEndImageContext()
+        return newImage
+    }
+    
+}
+
+extension UIViewController {
+    
+    var previousViewController: UIViewController? {
+        guard let navigationController = navigationController else { return nil }
+        let count = navigationController.viewControllers.count
+        return count < 2 ? nil : navigationController.viewControllers[count - 2]
+    }
+    
+}
+
+extension UIImage {
+    class func gifImageWithData(_ data: Data) -> UIImage? {
+        guard let source = CGImageSourceCreateWithData(data as CFData, nil) else {
+            return nil
+        }
+        
+        let frameCount = CGImageSourceGetCount(source)
+        var images: [UIImage] = []
+        
+        for i in 0..<frameCount {
+            if let cgImage = CGImageSourceCreateImageAtIndex(source, i, nil) {
+                let image = UIImage(cgImage: cgImage)
+                images.append(image)
+            }
+        }
+        
+        return UIImage.animatedImage(with: images, duration: 0.0)
+    }
+    
+    func gifData() -> Data? {
+        guard let cgImages = self.images?.compactMap({ $0.cgImage }) else {
+            return nil
+        }
+
+        let frameProperties = [kCGImagePropertyGIFDictionary as String: [kCGImagePropertyGIFDelayTime as String: 0.1]] // Adjust delay time if necessary
+
+        let destinationData = NSMutableData()
+        guard let destination = CGImageDestinationCreateWithData(destinationData as CFMutableData, kUTTypeGIF, cgImages.count, nil) else {
+            return nil
+        }
+
+        let framePropertiesPointer = UnsafeMutablePointer<NSDictionary>.allocate(capacity: cgImages.count)
+        defer {
+            framePropertiesPointer.deallocate()
+        }
+        for i in 0..<cgImages.count {
+            framePropertiesPointer[i] = frameProperties as NSDictionary
+        }
+
+        CGImageDestinationSetProperties(destination, [kCGImagePropertyGIFDictionary as String: [kCGImagePropertyGIFLoopCount as String: 0]] as CFDictionary)
+        for image in cgImages {
+            CGImageDestinationAddImage(destination, image, framePropertiesPointer.pointee)
+        }
+
+        guard CGImageDestinationFinalize(destination) else {
+            return nil
+        }
+
+        return destinationData as Data
+    }
+    
+    func resize(target: CGSize) -> UIImage {
+        // Determine the scale factor that preserves aspect ratio
+        let widthRatio = target.width / size.width
+        let heightRatio = target.height / size.height
+        
+        let scaleFactor = min(widthRatio, heightRatio)
+        
+        // Compute the new image size that preserves aspect ratio
+        let scaledImageSize = CGSize(
+            width: size.width * scaleFactor,
+            height: size.height * scaleFactor
+        )
+        
+        // Draw and return the resized UIImage
+        let renderer = UIGraphicsImageRenderer(
+            size: scaledImageSize
+        )
+        
+        let scaledImage = renderer.image { _ in
+            self.draw(in: CGRect(
+                origin: .zero,
+                size: scaledImageSize
+            ))
+        }
+        
+        return scaledImage
+    }
+    
+    static func imageWithColor(color: UIColor, size: CGSize) -> UIImage? {
+        let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
+        UIGraphicsBeginImageContextWithOptions(size, false, 0)
+        color.setFill()
+        UIRectFill(rect)
+        guard let image: UIImage = UIGraphicsGetImageFromCurrentImageContext() else {
+            return nil
+        }
+        UIGraphicsEndImageContext()
+        return image
+    }
+}
+
+extension UIImage {
+    
+    var isPortrait:  Bool    { size.height > size.width }
+    var isLandscape: Bool    { size.width > size.height }
+    var breadth:     CGFloat { min(size.width, size.height) }
+    var breadthSize: CGSize  { .init(width: breadth, height: breadth) }
+    var breadthRect: CGRect  { .init(origin: .zero, size: breadthSize) }
+    public var circleMasked: UIImage? {
+        guard let cgImage = cgImage?
+                .cropping(to: .init(origin: .init(x: isLandscape ? ((size.width-size.height)/2).rounded(.down) : 0,
+                                                  y: isPortrait  ? ((size.height-size.width)/2).rounded(.down) : 0),
+                                    size: breadthSize)) else { return nil }
+        let format = imageRendererFormat
+        format.opaque = false
+        return UIGraphicsImageRenderer(size: breadthSize, format: format).image { _ in
+            UIBezierPath(ovalIn: breadthRect).addClip()
+            UIImage(cgImage: cgImage, scale: format.scale, orientation: imageOrientation)
+                .draw(in: .init(origin: .zero, size: breadthSize))
+        }
+    }
+    
+}
+
+//extension UIColor {
+//    public static var mainColor: UIColor {
+//        return renderColor(hex: "#046cfc")
+//    }
+//    
+//    public static var borderTabColor: UIColor {
+//        return renderColor(hex: "#c4e4f4")
+//    }
+//    
+//    public static var nxColor: UIColor {
+//        return renderColor(hex: "#04ecfc")
+//    }
+//    
+//    public static var secondaryColor: UIColor {
+//        return renderColor(hex: "#FAFAFF")
+//    }
+//    
+//    public static var blackDarkMode: UIColor {
+//        return renderColor(hex: "#262626")
+//    }
+//    
+//    public static var orangeColor: UIColor {
+//        return renderColor(hex: "#FFA03E")
+//    }
+//    
+//    public static var orangeBNI: UIColor {
+//        return renderColor(hex: "#EE6600")
+//    }
+//    
+//    public static var greenColor: UIColor {
+//        return renderColor(hex: "#C7EA46")
+//    }
+//    
+//    public static var whiteBubbleColor: UIColor {
+//        if UIApplication.shared.visibleViewController?.traitCollection.userInterfaceStyle == .dark {
+//            return blackDarkMode
+//        }
+//        return renderColor(hex: "#F5F5F5")
+//    }
+//    
+//    public static var docColor: UIColor {
+//        return renderColor(hex: "#798F9A")
+//    }
+//    
+//    public static var mentionColor: UIColor {
+//        return UIApplication.shared.visibleViewController?.traitCollection.userInterfaceStyle == .dark ? renderColor(hex: "#f6fcae") : renderColor(hex: "#53bdea")
+//    }
+//    
+//    public static var blueBubbleColor: UIColor {
+//        if UIApplication.shared.visibleViewController?.traitCollection.userInterfaceStyle == .dark {
+//            return renderColor(hex: "#367dd9")
+//        }
+//        return renderColor(hex: "#C5D1E1")
+//    }
+//    
+//    public static var officialColor: UIColor {
+//        return renderColor(hex: "#4c87ef")
+//    }
+//    
+//    public static var verifiedColor: UIColor {
+//        return renderColor(hex: "#00b333")
+//    }
+//    
+//    public static var ccColor: UIColor {
+//        return renderColor(hex: "#FFF1A353")
+//    }
+//    
+//    public static var internalColor: UIColor {
+//        return renderColor(hex: "#ff0000")
+//    }
+//    
+//    public static var blueTextField: UIColor {
+//        return renderColor(hex: "#4c92d2")
+//    }
+//    
+//    public class func renderColor(hex: String) -> UIColor {
+//        var cString:String = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()
+//
+//        if (cString.hasPrefix("#")) {
+//            cString.remove(at: cString.startIndex)
+//        }
+//
+//        if ((cString.count) != 6) {
+//            return UIColor.gray
+//        }
+//
+//        var rgbValue:UInt64 = 0
+//        Scanner(string: cString).scanHexInt64(&rgbValue)
+//
+//        return UIColor(
+//            red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
+//            green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
+//            blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
+//            alpha: CGFloat(1.0)
+//        )
+//    }
+//}
+
+extension UIView {
+    
+    public func circle() {
+        layer.cornerRadius = 0.5 * bounds.size.width
+        clipsToBounds = true
+    }
+    
+    public func maxCornerRadius() -> CGFloat {
+        return (self.frame.width > self.frame.height) ? self.frame.height / 2 : self.frame.width / 2
+    }
+    
+}
+
+
+//extension UIViewController {
+//    
+//    public func showToast(message : String, font: UIFont = UIFont.systemFont(ofSize: 12, weight: .medium), controller: UIViewController) {
+//        
+//        let toastContainer = UIView(frame: CGRect())
+//        toastContainer.backgroundColor = self.traitCollection.userInterfaceStyle == .dark ? .white.withAlphaComponent(0.6) : UIColor.mainColor.withAlphaComponent(0.6)
+//        toastContainer.alpha = 0.0
+//        toastContainer.layer.cornerRadius = 25;
+//        toastContainer.clipsToBounds  =  true
+//        
+//        let toastLabel = UILabel(frame: CGRect())
+//        toastLabel.textColor = self.traitCollection.userInterfaceStyle == .dark ? .blackDarkMode : UIColor.white
+//        toastLabel.textAlignment = .center;
+//        toastLabel.font = font
+//        toastLabel.text = message
+//        toastLabel.clipsToBounds  =  true
+//        toastLabel.numberOfLines = 0
+//        
+//        toastContainer.addSubview(toastLabel)
+//        controller.view.addSubview(toastContainer)
+//        controller.view.bringSubviewToFront(toastContainer)
+//        
+//        toastLabel.translatesAutoresizingMaskIntoConstraints = false
+//        toastContainer.translatesAutoresizingMaskIntoConstraints = false
+//        
+//        let a1 = NSLayoutConstraint(item: toastLabel, attribute: .leading, relatedBy: .equal, toItem: toastContainer, attribute: .leading, multiplier: 1, constant: 15)
+//        let a2 = NSLayoutConstraint(item: toastLabel, attribute: .trailing, relatedBy: .equal, toItem: toastContainer, attribute: .trailing, multiplier: 1, constant: -15)
+//        let a3 = NSLayoutConstraint(item: toastLabel, attribute: .bottom, relatedBy: .equal, toItem: toastContainer, attribute: .bottom, multiplier: 1, constant: -15)
+//        let a4 = NSLayoutConstraint(item: toastLabel, attribute: .top, relatedBy: .equal, toItem: toastContainer, attribute: .top, multiplier: 1, constant: 15)
+//        toastContainer.addConstraints([a1, a2, a3, a4])
+//        
+//        let c1 = NSLayoutConstraint(item: toastContainer, attribute: .leading, relatedBy: .equal, toItem: controller.view, attribute: .leading, multiplier: 1, constant: 65)
+//        let c2 = NSLayoutConstraint(item: toastContainer, attribute: .trailing, relatedBy: .equal, toItem: controller.view, attribute: .trailing, multiplier: 1, constant: -65)
+//        let c3 = NSLayoutConstraint(item: toastContainer, attribute: .bottom, relatedBy: .equal, toItem: controller.view, attribute: .bottom, multiplier: 1, constant: -75)
+//        controller.view.addConstraints([c1, c2, c3])
+//        
+//        UIView.animate(withDuration: 0.5, delay: 0.0, options: .curveEaseIn, animations: {
+//            toastContainer.alpha = 1.0
+//        }, completion: { _ in
+//            UIView.animate(withDuration: 0.5, delay: 1.5, options: .curveEaseOut, animations: {
+//                toastContainer.alpha = 0.0
+//            }, completion: {_ in
+//                toastContainer.removeFromSuperview()
+//            })
+//        })
+//    }
+//    
+//    public func resizeImage(image: UIImage, targetSize: CGSize) -> UIImage {
+//        UIGraphicsBeginImageContextWithOptions(targetSize, false, 0.0);
+//        image.draw(in: CGRect(x: 0, y: 0, width: targetSize.width, height: targetSize.height))
+//        let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
+//        UIGraphicsEndImageContext()
+//        return newImage
+//    }
+//    
+//}
+
+extension UITextView {
+
+    enum ShouldChangeCursor {
+        case incrementCursor
+        case preserveCursor
+    }
+
+    func preserveCursorPosition(withChanges mutatingFunction: (UITextPosition?) -> (ShouldChangeCursor)) {
+
+        //save the cursor positon
+        var cursorPosition: UITextPosition? = nil
+        if let selectedRange = self.selectedTextRange {
+            let offset = self.offset(from: self.beginningOfDocument, to: selectedRange.start)
+            cursorPosition = self.position(from: self.beginningOfDocument, offset: offset)
+        }
+
+        //make mutaing changes that may reset the cursor position
+        let shouldChangeCursor = mutatingFunction(cursorPosition)
+
+        //restore the cursor
+        if var cursorPosition = cursorPosition {
+
+            if shouldChangeCursor == .incrementCursor {
+                cursorPosition = self.position(from: cursorPosition, offset: 1) ?? cursorPosition
+            }
+
+            if let range = self.textRange(from: cursorPosition, to: cursorPosition) {
+                self.selectedTextRange = range
+            }
+        }
+
+    }
+
+}
+
+extension String {
+    
+    public func substring(from: Int?, to: Int?) -> String {
+        if let start = from {
+            guard start < self.count else {
+                return ""
+            }
+        }
+        
+        if let end = to {
+            guard end >= 0 else {
+                return ""
+            }
+        }
+        
+        if let start = from, let end = to {
+            guard end - start >= 0 else {
+                return ""
+            }
+        }
+        
+        let startIndex: String.Index
+        if let start = from, start >= 0 {
+            startIndex = self.index(self.startIndex, offsetBy: start)
+        } else {
+            startIndex = self.startIndex
+        }
+        
+        let endIndex: String.Index
+        if let end = to, end >= 0, end < self.count {
+            endIndex = self.index(self.startIndex, offsetBy: end + 1)
+        } else {
+            endIndex = self.endIndex
+        }
+        
+        return String(self[startIndex ..< endIndex])
+    }
+    
+    func countEmojiCharacter() -> Int {
+        
+        func isEmoji(s:NSString) -> Bool {
+            
+            let high:Int = Int(s.character(at: 0))
+            if 0xD800 <= high && high <= 0xDBFF {
+                let low:Int = Int(s.character(at: 1))
+                let codepoint: Int = ((high - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000
+                return (0x1D000 <= codepoint && codepoint <= 0x1F9FF)
+            }
+            else {
+                return (0x2100 <= high && high <= 0x27BF)
+            }
+        }
+        
+        let nsString = self as NSString
+        var length = 0
+        
+        nsString.enumerateSubstrings(in: NSMakeRange(0, nsString.length), options: NSString.EnumerationOptions.byComposedCharacterSequences) { (subString, substringRange, enclosingRange, stop) -> Void in
+            
+            if isEmoji(s: subString! as NSString) {
+                length+=1
+            }
+        }
+        
+        return length
+    }
+    
+//    public func richText(isEditing: Bool = false, isSearching: Bool = false, textSearch: String = "", group_id: String = "", listMentionInTextField: [User] = []) -> NSMutableAttributedString {
+//        let font = UIFont.systemFont(ofSize: 12)
+//        let boldFont = UIFont.boldSystemFont(ofSize: 12)
+//        let italicFont = UIFont.italicSystemFont(ofSize: 12)
+//        let boldItalicFont = UIFont.systemFont(ofSize: 12, weight: .semibold)
+//        let textUTF8 = String(self.utf8)
+//        let finalText = NSMutableAttributedString(string: textUTF8, attributes: [NSAttributedString.Key.font: font])
+//        finalText.addAttribute(.foregroundColor, value: UIApplication.shared.visibleViewController?.traitCollection.userInterfaceStyle == .dark ? UIColor.white : UIColor.black, range: NSRange(location: 0, length: finalText.string.count))
+//        let boldSign: Character = "*"
+//        let italicSign: Character = "_"
+//        let underlineSign: Character = "^"
+//        let strikethroughSign: Character = "~"
+//        var locationBold: [NSRange] = []
+//        
+//        //Bold
+//        let rangeBold = getRangeOfWordWithSign(sentence: textUTF8, sign: boldSign)
+//        if rangeBold.count > 0 {
+//            var lastFirstRange = -1
+//            var countRemoveBoldSign = 0
+//            var continueCheckingBold = false
+//            var totalEmoji = 0
+//            for i in 0..<rangeBold.count {
+//                if rangeBold[i].startIndex > lastFirstRange {
+//                    let charStart: Character = rangeBold[i].startIndex != 0 ? Array(textUTF8.substring(from: rangeBold[i].startIndex - 1, to: rangeBold[i].startIndex - 1))[0] : Array("0")[0]
+//                    if (rangeBold[i].startIndex == 0 || (!charStart.isLetter && !charStart.isNumber)) {
+//                        lastFirstRange = rangeBold[i].startIndex
+//                        continueCheckingBold = true
+//                    } else {
+//                        continueCheckingBold = false
+//                    }
+//                }
+//                if !continueCheckingBold {
+//                    continue
+//                }
+//                if rangeBold[i].endIndex != (textUTF8.count-1) {
+//                    let char: Character = Array(textUTF8.substring(from: rangeBold[i].endIndex + 1, to: rangeBold[i].endIndex + 1))[0]
+//                    if char.isLetter || char.isNumber {
+//                        continue
+//                    }
+//                }
+//                let countEmojiBefore = finalText.string.substring(from: 0, to: lastFirstRange - (2*countRemoveBoldSign)).countEmojiCharacter()
+//                let countEmoji = finalText.string.substring(from: lastFirstRange - (2*countRemoveBoldSign), to: rangeBold[i].endIndex - (2*countRemoveBoldSign)).countEmojiCharacter()
+//                totalEmoji = countEmoji + countEmojiBefore
+//                locationBold.append(NSRange(location: lastFirstRange - (2*countRemoveBoldSign) + countEmojiBefore, length: (rangeBold[i].endIndex + countEmoji + 1) - lastFirstRange))
+//                finalText.addAttribute(.font, value: boldFont, range: NSRange(location: lastFirstRange - (2*countRemoveBoldSign) + countEmojiBefore, length: (rangeBold[i].endIndex + countEmoji + 1) - lastFirstRange))
+//                if !isEditing{
+//                    finalText.mutableString.replaceOccurrences(of: "\(boldSign)", with: "", options: .literal, range: NSRange(location: lastFirstRange + countEmojiBefore - (2*countRemoveBoldSign), length: 1))
+//                    finalText.mutableString.replaceOccurrences(of: "\(boldSign)", with: "", options: .literal, range: NSRange(location: rangeBold[i].endIndex + totalEmoji - (2*countRemoveBoldSign) - 1, length: 1))
+//                    countRemoveBoldSign += 1
+//                } else {
+//                    finalText.addAttribute(.foregroundColor, value: UIColor.gray, range: NSRange(location: lastFirstRange + countEmojiBefore, length: 1))
+//                    finalText.addAttribute(.foregroundColor, value: UIColor.gray, range: NSRange(location: rangeBold[i].endIndex + totalEmoji, length: 1))
+//                }
+//                lastFirstRange = rangeBold[i].endIndex
+//                continueCheckingBold = false
+//            }
+//        }
+//        
+//        //Italic
+//        let textAfterbold = finalText.string
+//        let rangeItalic = getRangeOfWordWithSign(sentence: textAfterbold, sign: italicSign)
+//        if rangeItalic.count > 0 {
+//            var lastFirstRange = -1
+//            var countRemoveItalicSign = 0
+//            var continueCheckingItalic = false
+//            var totalEmoji = 0
+//            for i in 0..<rangeItalic.count {
+//                if rangeItalic[i].startIndex > lastFirstRange {
+//                    let charStart: Character = rangeItalic[i].startIndex != 0 ? Array(textAfterbold.substring(from: rangeItalic[i].startIndex - 1, to: rangeItalic[i].startIndex - 1))[0] : Array("0")[0]
+//                    if (rangeItalic[i].startIndex == 0 || (!charStart.isLetter && !charStart.isNumber)) {
+//                        lastFirstRange = rangeItalic[i].startIndex
+//                        continueCheckingItalic = true
+//                    } else {
+//                        continueCheckingItalic = false
+//                    }
+//                }
+//                if !continueCheckingItalic {
+//                    continue
+//                }
+//                if rangeItalic[i].endIndex != (textAfterbold.count-1) {
+//                    let char: Character = Array(textAfterbold.substring(from: rangeItalic[i].endIndex + 1, to: rangeItalic[i].endIndex + 1))[0]
+//                    if char.isLetter || char.isNumber {
+//                        continue
+//                    }
+//                }
+//                let countEmojiBefore = finalText.string.substring(from: 0, to: lastFirstRange - (2*countRemoveItalicSign)).countEmojiCharacter()
+//                let countEmoji = finalText.string.substring(from: lastFirstRange - (2*countRemoveItalicSign), to: rangeItalic[i].endIndex - (2*countRemoveItalicSign)).countEmojiCharacter()
+//                totalEmoji = countEmoji + countEmojiBefore
+//                if isIntInRangeList((rangeItalic[i].endIndex + countEmoji + 1) - lastFirstRange - lastFirstRange - (2*countRemoveItalicSign) + countEmojiBefore, rangeList: locationBold) {
+//                    finalText.addAttribute(.font, value: boldItalicFont, range: NSRange(location: lastFirstRange - (2*countRemoveItalicSign) + countEmojiBefore, length: (rangeItalic[i].endIndex + countEmoji + 1) - lastFirstRange))
+//                } else {
+//                    finalText.addAttribute(.font, value: italicFont, range: NSRange(location: lastFirstRange - (2*countRemoveItalicSign) + countEmojiBefore, length: (rangeItalic[i].endIndex + countEmoji + 1) - lastFirstRange))
+//                }
+//                if !isEditing{
+//                    finalText.mutableString.replaceOccurrences(of: "\(italicSign)", with: "", options: .literal, range: NSRange(location: lastFirstRange + countEmojiBefore - (2*countRemoveItalicSign), length: 1))
+//                    finalText.mutableString.replaceOccurrences(of: "\(italicSign)", with: "", options: .literal, range: NSRange(location: rangeItalic[i].endIndex + totalEmoji - (2*countRemoveItalicSign) - 1, length: 1))
+//                    countRemoveItalicSign += 1
+//                } else {
+//                    finalText.addAttribute(.foregroundColor, value: UIColor.gray, range: NSRange(location: lastFirstRange + countEmojiBefore, length: 1))
+//                    finalText.addAttribute(.foregroundColor, value: UIColor.gray, range: NSRange(location: rangeItalic[i].endIndex + totalEmoji, length: 1))
+//                }
+//                lastFirstRange = rangeItalic[i].endIndex
+//                continueCheckingItalic = false
+//            }
+//        }
+//        
+//        //Underline
+//        let textAfterItalic = finalText.string
+//        let rangeUnderline = getRangeOfWordWithSign(sentence: textAfterItalic, sign: underlineSign)
+//        if rangeUnderline.count > 0 {
+//            var lastFirstRange = -1
+//            var countRemoveUnderlineSign = 0
+//            var continueCheckingUnderline = false
+//            var totalEmoji = 0
+//            for i in 0..<rangeUnderline.count {
+//                if rangeUnderline[i].startIndex > lastFirstRange {
+//                    let charStart: Character = rangeUnderline[i].startIndex != 0 ? Array(textAfterItalic.substring(from: rangeUnderline[i].startIndex - 1, to: rangeUnderline[i].startIndex - 1))[0] : Array("0")[0]
+//                    if (rangeUnderline[i].startIndex == 0 || (!charStart.isLetter && !charStart.isNumber)) {
+//                        lastFirstRange = rangeUnderline[i].startIndex
+//                        continueCheckingUnderline = true
+//                    } else {
+//                        continueCheckingUnderline = false
+//                    }
+//                }
+//                if !continueCheckingUnderline {
+//                    continue
+//                }
+//                if rangeUnderline[i].endIndex != (textAfterItalic.count-1) {
+//                    let char: Character = Array(textAfterItalic.substring(from: rangeUnderline[i].endIndex + 1, to: rangeUnderline[i].endIndex + 1))[0]
+//                    if char.isLetter || char.isNumber {
+//                        continue
+//                    }
+//                }
+//                let countEmojiBefore = finalText.string.substring(from: 0, to: lastFirstRange - (2*countRemoveUnderlineSign)).countEmojiCharacter()
+//                let countEmoji = finalText.string.substring(from: lastFirstRange - (2*countRemoveUnderlineSign), to: rangeUnderline[i].endIndex - (2*countRemoveUnderlineSign)).countEmojiCharacter()
+//                totalEmoji = countEmoji + countEmojiBefore
+//                finalText.addAttribute(.underlineStyle, value: NSUnderlineStyle.thick.rawValue, range: NSRange(location: lastFirstRange - (2*countRemoveUnderlineSign) + countEmojiBefore + 1, length: (rangeUnderline[i].endIndex + countEmoji - 1) - lastFirstRange))
+//                if !isEditing{
+//                    finalText.mutableString.replaceOccurrences(of: "\(underlineSign)", with: "", options: .literal, range: NSRange(location: lastFirstRange + countEmojiBefore - (2*countRemoveUnderlineSign), length: 1))
+//                    finalText.mutableString.replaceOccurrences(of: "\(underlineSign)", with: "", options: .literal, range: NSRange(location: rangeUnderline[i].endIndex + totalEmoji - (2*countRemoveUnderlineSign) - 1, length: 1))
+//                    countRemoveUnderlineSign += 1
+//                } else {
+//                    finalText.addAttribute(.foregroundColor, value: UIColor.gray, range: NSRange(location: lastFirstRange + countEmojiBefore, length: 1))
+//                    finalText.addAttribute(.foregroundColor, value: UIColor.gray, range: NSRange(location: rangeUnderline[i].endIndex + totalEmoji, length: 1))
+//                }
+//                lastFirstRange = rangeUnderline[i].endIndex
+//                continueCheckingUnderline = false
+//            }
+//        }
+//        
+//        //Strikethrough
+//        let textAfterUnderline = finalText.string
+//        let rangeStrikethrough = getRangeOfWordWithSign(sentence: textAfterUnderline, sign: strikethroughSign)
+//        if rangeStrikethrough.count > 0 {
+//            var lastFirstRange = -1
+//            var countRemoveStrikethroughSign = 0
+//            var continueCheckingStrikethrough = false
+//            var totalEmoji = 0
+//            for i in 0..<rangeStrikethrough.count {
+//                if rangeStrikethrough[i].startIndex > lastFirstRange {
+//                    let charStart: Character = rangeStrikethrough[i].startIndex != 0 ? Array(textAfterUnderline.substring(from: rangeStrikethrough[i].startIndex - 1, to: rangeStrikethrough[i].startIndex - 1))[0] : Array("0")[0]
+//                    if (rangeStrikethrough[i].startIndex == 0 || (!charStart.isLetter && !charStart.isNumber)) {
+//                        lastFirstRange = rangeStrikethrough[i].startIndex
+//                        continueCheckingStrikethrough = true
+//                    } else {
+//                        continueCheckingStrikethrough = false
+//                    }
+//                }
+//                if !continueCheckingStrikethrough {
+//                    continue
+//                }
+//                if rangeStrikethrough[i].endIndex != (textAfterUnderline.count-1) {
+//                    let char: Character = Array(textAfterUnderline.substring(from: rangeStrikethrough[i].endIndex + 1, to: rangeStrikethrough[i].endIndex + 1))[0]
+//                    if char.isLetter || char.isNumber {
+//                        continue
+//                    }
+//                }
+//                let countEmojiBefore = finalText.string.substring(from: 0, to: lastFirstRange - (2*countRemoveStrikethroughSign)).countEmojiCharacter()
+//                let countEmoji = finalText.string.substring(from: lastFirstRange - (2*countRemoveStrikethroughSign), to: rangeStrikethrough[i].endIndex - (2*countRemoveStrikethroughSign)).countEmojiCharacter()
+//                totalEmoji = countEmoji + countEmojiBefore
+//                finalText.addAttribute(.strikethroughStyle, value: 2, range: NSRange(location: lastFirstRange - (2*countRemoveStrikethroughSign) + countEmojiBefore + 1, length: (rangeStrikethrough[i].endIndex + countEmoji - 1) - lastFirstRange))
+//                if !isEditing{
+//                    finalText.mutableString.replaceOccurrences(of: "\(strikethroughSign)", with: "", options: .literal, range: NSRange(location: lastFirstRange + countEmojiBefore - (2*countRemoveStrikethroughSign), length: 1))
+//                    finalText.mutableString.replaceOccurrences(of: "\(strikethroughSign)", with: "", options: .literal, range: NSRange(location: rangeStrikethrough[i].endIndex + totalEmoji - (2*countRemoveStrikethroughSign) - 1, length: 1))
+//                    countRemoveStrikethroughSign += 1
+//                } else {
+//                    finalText.addAttribute(.foregroundColor, value: UIColor.gray, range: NSRange(location: lastFirstRange + countEmojiBefore, length: 1))
+//                    finalText.addAttribute(.foregroundColor, value: UIColor.gray, range: NSRange(location: rangeStrikethrough[i].endIndex + totalEmoji, length: 1))
+//                }
+//                lastFirstRange = rangeStrikethrough[i].endIndex
+//                continueCheckingStrikethrough = false
+//            }
+//        }
+//        
+//        //Check Mention
+//        let finalTextAfterRichText = finalText.string
+//        if finalTextAfterRichText.contains("@") {
+//            let listTextEnter = finalText.string.split(separator: "\n")
+//            for j in 0...listTextEnter.count - 1 {
+//                let listText = listTextEnter[j].split(separator: " ")
+//                let listMention = listText.filter({ $0.starts(with: "@")})
+//                if listMention.count > 0 {
+//                    for i in 0..<listMention.count {
+//                        let f_pin = (String(listMention[i])).substring(from: 1, to: listMention[i].count)
+//                        let member = Member.getMember(f_pin: f_pin)
+//                        if member != nil {
+//                            let name = (member!.firstName + " " + member!.lastName).trimmingCharacters(in: .whitespaces)
+//                            finalText.mutableString.replaceOccurrences(of: f_pin, with: name, options: .literal, range: NSString(string: finalText.string).range(of: f_pin))
+//                            if !group_id.isEmpty && Member.getMemberInGroup(f_pin: f_pin, group_id: group_id) != nil {
+//                                finalText.addAttribute(.foregroundColor, value: UIColor.mentionColor, range: NSString(string: finalText.string).range(of: "@\(name)"))
+//                            }
+//                        }
+//                    }
+//                }
+//            }
+//        }
+//        if isSearching {
+//            let range = NSString(string: finalText.string).range(of: textSearch, options: .caseInsensitive) // 2
+//            let highlightColor = UIColor.systemYellow // 3
+//            let highlightedAttributes: [NSAttributedString.Key: Any] = [NSAttributedString.Key.backgroundColor: highlightColor] // 4
+//            
+//            finalText.addAttributes(highlightedAttributes, range: range) // 5
+//        }
+//        
+//        return finalText
+//    }
+    
+    func isIntInRangeList(_ intValue: Int, rangeList: [NSRange]) -> Bool {
+        for range in rangeList {
+            if intValue >= range.location && intValue < range.location + range.length {
+                return true
+            }
+        }
+        return false
+    }
+    
+    func checkCharBefore(char: String) -> Bool {
+        return char == " " || char == "\n"
+    }
+    
+    func checkCharRich(char: String) -> Bool {
+        return char == "*" || char == "_" || char == "^" || char == "~"
+    }
+    
+    func checkStartWithLink() -> Bool {
+        return self.starts(with: "https://") || self.starts(with: "http://") || self.starts(with: "www.")
+        //|| self.starts(with: "*https://") || self.starts(with: "*http://") || self.starts(with: "*www.") || self.starts(with: "_https://") || self.starts(with: "_http://") || self.starts(with: "_www.") || self.starts(with: "^https://") || self.starts(with: "^http://") || self.starts(with: "^www.") || self.starts(with: "~https://") || self.starts(with: "~http://") || self.starts(with: "~www.")
+    }
+    
+    func getRangeOfWordWithSign(sentence: String, sign: Character) -> [Range<Int>] {
+        let asterisk: Character = sign
+        var ranges = [Range<Int>]()
+        
+        var startIndex = sentence.startIndex
+        
+        while let startRange = sentence[startIndex...].firstIndex(of: asterisk),
+              let endRange = sentence[startRange...].dropFirst().firstIndex(of: asterisk) {
+            
+            let range = startRange..<endRange
+            let word = sentence[range].replacingOccurrences(of: "\(sign)", with: "")
+            
+            if !word.isEmpty {
+                let lower = sentence.distance(from: sentence.startIndex, to: startRange)
+                let upper = sentence.distance(from: sentence.startIndex, to: endRange)
+                ranges.append(Range(uncheckedBounds: (lower: lower, upper: upper)))
+            }
+            
+            startIndex = endRange
+        }
+        
+        return ranges
+    }
+    
+}
+
+extension UIFont {
+    var bold: UIFont {
+        return with(traits: .traitBold)
+    } // bold
+    
+    var italic: UIFont {
+        return with(traits: .traitItalic)
+    } // italic
+    
+    func with(traits: UIFontDescriptor.SymbolicTraits) -> UIFont {
+        guard let descriptor = self.fontDescriptor.withSymbolicTraits(traits) else {
+            return self
+        } // guard
+        
+        return UIFont(descriptor: descriptor, size: 0)
+    } // with(traits:)
+}
+
+extension UILabel {
+    public func set(image: UIImage, with text: String, size: CGFloat, y: CGFloat) {
+        let attachment = NSTextAttachment()
+        attachment.image = image
+        attachment.bounds = CGRect(x: 0, y: y, width: size, height: size)
+        let attachmentStr = NSAttributedString(attachment: attachment)
+        
+        let mutableAttributedString = NSMutableAttributedString()
+        mutableAttributedString.append(attachmentStr)
+        
+        let textString = NSAttributedString(string: text, attributes: [.font: self.font!])
+        mutableAttributedString.append(textString)
+        
+        self.attributedText = mutableAttributedString
+    }
+    
+    public func setAttributeText(image: UIImage, with textMutable: NSAttributedString, size: CGFloat, y: CGFloat) {
+        let attachment = NSTextAttachment()
+        attachment.image = image
+        attachment.bounds = CGRect(x: 0, y: y, width: size, height: size)
+        let attachmentStr = NSAttributedString(attachment: attachment)
+        
+        let mutableAttributedString = NSMutableAttributedString()
+        mutableAttributedString.append(attachmentStr)
+        
+        mutableAttributedString.append(textMutable)
+        
+        self.attributedText = mutableAttributedString
+    }
+}
+
+extension Bundle {
+
+    public static func resourceBundle(for frameworkClass: AnyClass) -> Bundle {
+        let frameworkBundle = Bundle(for: frameworkClass)
+        guard let resourceBundleURL = frameworkBundle.url(forResource: "NexilisLite", withExtension: "bundle"),
+              let resourceBundle = Bundle(url: resourceBundleURL) else {
+            return frameworkBundle
+        }
+        return resourceBundle
+    }
+    
+    public static func resourcesMediaBundle(for frameworkClass: AnyClass) -> Bundle {
+        let frameworkBundle = Bundle(for: frameworkClass)
+
+        guard let resourceBundleURL = frameworkBundle.url(forResource: "NexilisLiteResources", withExtension: "bundle"),
+              let resourceBundle = Bundle(url: resourceBundleURL) else {
+            return frameworkBundle
+        }
+
+        return resourceBundle
+    }
+    
+}
+
+//extension UIFont {
+//
+//    static func register(from url: URL) throws {
+//        guard let fontDataProvider = CGDataProvider(url: url as CFURL) else {
+//            throw fatalError("Could not create font data provider for \(url).")
+//        }
+//        let font = CGFont(fontDataProvider)
+//        var error: Unmanaged<CFError>?
+//        guard CTFontManagerRegisterGraphicsFont(font!, &error) else {
+//            throw error!.takeUnretainedValue()
+//        }
+//    }
+//
+//}
+
+extension UIButton {
+    private func actionHandleBlock(action:(() -> Void)? = nil) {
+        struct __ {
+            static var action :(() -> Void)?
+        }
+        if action != nil {
+            __.action = action
+        } else {
+            __.action?()
+        }
+    }
+    
+    @objc private func triggerActionHandleBlock() {
+        self.actionHandleBlock()
+    }
+    
+    public func actionHandle(controlEvents control :UIControl.Event, ForAction action:@escaping () -> Void) {
+        self.actionHandleBlock(action: action)
+        self.addTarget(self, action: #selector(self.triggerActionHandleBlock), for: control)
+    }
+    
+    public func setImageRightOfText(image: UIImage?, for state: UIControl.State) {
+        self.setImage(image, for: state)
+        self.titleEdgeInsets = UIEdgeInsets(top: 0, left: -((image?.size.width ?? 0) + 5), bottom: 0, right: (image?.size.width ?? 0))
+        self.imageEdgeInsets = UIEdgeInsets(top: 10, left: (self.titleLabel?.frame.size.width ?? 0) + 90, bottom: 10, right: -((self.titleLabel?.frame.size.width ?? 0) + 5))
+    }
+}
+
+extension UINavigationController {
+    func replaceAllViewController(with viewController: UIViewController, animated: Bool) {
+        pushViewController(viewController, animated: animated)
+        viewControllers.removeSubrange(1...viewControllers.count - 2)
+    }
+    
+    var rootViewController : UIViewController? {
+        return viewControllers.first
+    }
+    
+    func popViewController(animated: Bool, completion: @escaping () -> Void) {
+        popViewController(animated: animated)
+
+        if animated, let coordinator = transitionCoordinator {
+            coordinator.animate(alongsideTransition: nil) { _ in
+                completion()
+            }
+        } else {
+            completion()
+        }
+    }
+}
+
+//extension UIImageView {
+//
+//    private static var taskKey = 0
+//    private static var urlKey = 0
+//
+//    private var currentTask: URLSessionTask? {
+//        get { return objc_getAssociatedObject(self, &UIImageView.taskKey) as? URLSessionTask }
+//        set { objc_setAssociatedObject(self, &UIImageView.taskKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) }
+//    }
+//
+//    private var currentURL: URL? {
+//        get { return objc_getAssociatedObject(self, &UIImageView.urlKey) as? URL }
+//        set { objc_setAssociatedObject(self, &UIImageView.urlKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) }
+//    }
+//
+//    func loadImageAsync(with urlString: String?, isGif: Bool = false) {
+//        // cancel prior task, if any
+//
+//        weak var oldTask = currentTask
+//        currentTask = nil
+//        oldTask?.cancel()
+//
+//        // reset imageview's image
+//
+//        self.image = nil
+//
+//        // allow supplying of `nil` to remove old image and then return immediately
+//
+//        guard let urlString = urlString else { return }
+//
+//        // check cache
+//        
+//        if isGif, let cachedImageGif = ImageCache.shared.imageGif(forKey: urlString) {
+//            guard let gifImage = UIImage.gifImageWithData(Data(referencing: cachedImageGif)) else {
+//                print("Failed to create the GIF image.")
+//                return
+//            }
+//            self.image = gifImage
+//            return
+//        }
+//
+//        if let cachedImage = ImageCache.shared.image(forKey: urlString) {
+//            self.image = cachedImage
+//            return
+//        }
+//
+//        // download
+//
+//        let url = URL(string: urlString)!
+//        currentURL = url
+//        let urlConfig = URLSessionConfiguration.default
+//        let sessionDelegate = SelfSignedURLSessionDelegate()
+//        let session = URLSession(configuration: urlConfig, delegate: sessionDelegate, delegateQueue: nil)
+//        let task = session.dataTask(with: url) { [weak self] data, response, error in
+//            self?.currentTask = nil
+//
+//            //error handling
+//
+//            if let error = error {
+//                // don't bother reporting cancelation errors
+//
+//                if (error as NSError).domain == NSURLErrorDomain && (error as NSError).code == NSURLErrorCancelled {
+//                    return
+//                }
+//
+//                //print(error)
+//                return
+//            }
+//
+//            guard let data = data else {
+//                //print("unable to extract image")
+//                return
+//            }
+//            
+//            let downloadedImage = UIImage(data: data)
+//            if isGif {
+//                ImageCache.shared.saveGif(data: NSData(data: data), forKey: urlString)
+//            } else {
+//                if downloadedImage != nil {
+//                    ImageCache.shared.save(image: downloadedImage!, forKey: urlString)
+//                }
+//            }
+//
+//            if url == self?.currentURL {
+//                DispatchQueue.main.async {
+//                    if isGif {
+//                        guard let gifImage = UIImage.gifImageWithData(data) else {
+//                            print("Failed to create the GIF image.")
+//                            return
+//                        }
+//                        self?.image = gifImage
+//                    } else {
+//                        self?.image = downloadedImage
+//                    }
+//                }
+//            }
+//        }
+//
+//        // save and start new task
+//
+//        currentTask = task
+//        task.resume()
+//    }
+//    
+//    private func actionHandleBlock(action:(() -> Void)? = nil) {
+//        struct __ {
+//            static var action :(() -> Void)?
+//        }
+//        if action != nil {
+//            __.action = action
+//        } else {
+//            __.action?()
+//        }
+//    }
+//    
+//    @objc private func triggerActionHandleBlock() {
+//        self.actionHandleBlock()
+//    }
+//    
+//    func actionHandle(controlEvents control :UIControl.Event, ForAction action:@escaping () -> Void) {
+//        self.actionHandleBlock(action: action)
+//        self.isUserInteractionEnabled = true
+//        self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.triggerActionHandleBlock)))
+//    }
+//
+//}
+
+extension UITextField {
+
+    public enum PaddingSide {
+        case left(CGFloat)
+        case right(CGFloat)
+        case both(CGFloat)
+    }
+
+    public func addPadding(_ padding: PaddingSide) {
+
+        self.leftViewMode = .always
+        self.layer.masksToBounds = true
+
+
+        switch padding {
+
+        case .left(let spacing):
+            let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: spacing, height: self.frame.height))
+            self.leftView = paddingView
+            self.rightViewMode = .always
+
+        case .right(let spacing):
+            let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: spacing, height: self.frame.height))
+            self.rightView = paddingView
+            self.rightViewMode = .always
+
+        case .both(let spacing):
+            let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: spacing, height: self.frame.height))
+            // left
+            self.leftView = paddingView
+            self.leftViewMode = .always
+            // right
+            self.rightView = paddingView
+            self.rightViewMode = .always
+        }
+    }
+}
+
+public class ImageCache {
+    public static let shared = ImageCache()
+    private let cache = NSCache<NSString, UIImage>()
+    private let cacheGif = NSCache<NSString, NSData>()
+
+    private init() {
+        loadCache()
+//        UserDefaults.standard.removeObject(forKey: "imageCache")
+        NotificationCenter.default.addObserver(self, selector: #selector(saveCache), name: UIApplication.didEnterBackgroundNotification, object: nil)
+    }
+
+    public func save(image: UIImage, forKey key: String) {
+        cache.setObject(image, forKey: key as NSString)
+        cacheKeys.append(key)
+        saveCache()
+    }
+    
+    public func saveGif(data: NSData, forKey key: String) {
+        cacheGif.setObject(data, forKey: key as NSString)
+        cacheKeys.append(key)
+        saveCache()
+    }
+
+    public func image(forKey key: String) -> UIImage? {
+        return cache.object(forKey: key as NSString)
+    }
+    public func imageGif(forKey key: String) -> NSData? {
+        return cacheGif.object(forKey: key as NSString)
+    }
+    
+    private var cacheKeys: [String] = []
+    private func loadCache() {
+        if let cachedData = UserDefaults.standard.object(forKey: "imageCache") as? Data {
+            if let decodedCache = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(cachedData) as? [String: Data] {
+                for (key, valueData) in decodedCache {
+                    if let image = UIImage(data: valueData) {
+                        cache.setObject(image, forKey: key as NSString)
+                        cacheKeys.append(key)
+                    }
+                    let dataGif = NSData(data: valueData)
+                    cacheGif.setObject(dataGif, forKey: key as NSString)
+                    cacheKeys.append(key)
+                }
+            }
+        }
+    }
+
+    @objc private func saveCache() {
+        var cacheDictionary = [String: Data]()
+        for key in cacheKeys {
+            if let dataGif = cacheGif.object(forKey: key as NSString) {
+                cacheDictionary[key] = Data(referencing: dataGif)
+            } else {
+                if let image = cache.object(forKey: key as NSString) {
+                    if let imageData = image.pngData() {
+                        cacheDictionary[key] = imageData
+                    }
+                }
+            }
+        }
+        let encodedData = try? NSKeyedArchiver.archivedData(withRootObject: cacheDictionary, requiringSecureCoding: false)
+        UserDefaults.standard.set(encodedData, forKey: "imageCache")
+    }
+}
+
+public class LibAlertController: UIAlertController {
+    public override func viewWillAppear(_ animated: Bool) {
+        super.viewWillAppear(animated)
+        
+        // Customize the title's font
+        let titleFont = UIFont.boldSystemFont(ofSize: 16)
+        let titleAttributes = [NSAttributedString.Key.font: titleFont]
+        setValue(NSAttributedString(string: self.title ?? "", attributes: titleAttributes), forKey: "attributedTitle")
+        
+        // Change the font for the message
+        let messageFont = UIFont.systemFont(ofSize: 14)
+        let messageAttributes = [NSAttributedString.Key.font: messageFont]
+        setValue(NSAttributedString(string: self.message ?? "", attributes: messageAttributes), forKey: "attributedMessage")
+        
+        for i in self.actions {
+            let attributedText = NSAttributedString(string: i.title ?? "", attributes: [NSAttributedString.Key.font : UIFont.systemFont(ofSize: 16)])
+
+            guard let label = (i.value(forKey: "__representer") as AnyObject).value(forKey: "label") as? UILabel else { return }
+            label.attributedText = attributedText
+        }
+
+    }
+}
+
+
+extension UISearchBar
+{
+
+    public func setMagnifyingGlassColorTo(color: UIColor)
+    {
+        // Search Icon
+        let textFieldInsideSearchBar = self.value(forKey: "searchField") as? UITextField
+        let glassIconView = textFieldInsideSearchBar?.leftView as? UIImageView
+        glassIconView?.image = glassIconView?.image?.withRenderingMode(.alwaysTemplate)
+        glassIconView?.tintColor = color
+    }
+
+    func setClearButtonColorTo(color: UIColor)
+    {
+        // Clear Button
+        let textFieldInsideSearchBar = self.value(forKey: "searchField") as? UITextField
+        let crossIconView = textFieldInsideSearchBar?.value(forKey: "clearButton") as? UIButton
+        crossIconView?.setImage(crossIconView?.currentImage?.withRenderingMode(.alwaysTemplate), for: .normal)
+        crossIconView?.tintColor = color
+    }
+
+    func setPlaceholderTextColorTo(color: UIColor)
+    {
+        let textFieldInsideSearchBar = self.value(forKey: "searchField") as? UITextField
+        textFieldInsideSearchBar?.textColor = color
+        let textFieldInsideSearchBarLabel = textFieldInsideSearchBar!.value(forKey: "placeholderLabel") as? UILabel
+        textFieldInsideSearchBarLabel?.textColor = color
+    }
+    
+    public func setCustomBackgroundImage(image: UIImage)
+    {
+        setSearchFieldBackgroundImage(resizeImage(image: image, targetHeight: 30), for: .normal)
+    }
+    
+    func resizeImage(image: UIImage, targetHeight: CGFloat) -> UIImage? {
+        let scaleFactor = targetHeight / image.size.height
+        let targetWidth = image.size.width * scaleFactor
+        let newSize = CGSize(width: targetWidth, height: targetHeight)
+        
+        UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
+        defer { UIGraphicsEndImageContext() }
+        
+        image.draw(in: CGRect(origin: .zero, size: newSize))
+        guard let newImage = UIGraphicsGetImageFromCurrentImageContext() else { return nil }
+        
+        return newImage
+    }
+    
+    public func updateHeight(height: CGFloat, radius: CGFloat = 8.0, borderColor: CGColor = UIColor.white.cgColor) {
+            let image: UIImage? = UIImage.imageWithColor(color: UIColor.clear, size: CGSize(width: 1, height: height))
+            setSearchFieldBackgroundImage(image, for: .normal)
+            for subview in self.subviews {
+                for subSubViews in subview.subviews {
+                    if #available(iOS 13.0, *) {
+                        for child in subSubViews.subviews {
+                            if let textField = child as? UISearchTextField {
+                                textField.layer.cornerRadius = radius
+                                textField.clipsToBounds = true
+                                textField.layer.borderColor = borderColor
+                                textField.layer.borderWidth = 1.0
+                            }
+                        }
+                        continue
+                    }
+                    if let textField = subSubViews as? UITextField {
+                        textField.layer.cornerRadius = radius
+                        textField.clipsToBounds = true
+                        textField.layer.borderColor = borderColor
+                        textField.layer.borderWidth = 1.0
+                    }
+                }
+            }
+        }
+}
+
+extension String {
+    init(unicodeScalar: UnicodeScalar) {
+        self.init(Character(unicodeScalar))
+    }
+
+
+    init?(unicodeCodepoint: Int) {
+        if let unicodeScalar = UnicodeScalar(unicodeCodepoint) {
+            self.init(unicodeScalar: unicodeScalar)
+        } else {
+            return nil
+        }
+    }
+
+
+    static func +(lhs: String, rhs: Int) -> String {
+        return lhs + String(unicodeCodepoint: rhs)!
+    }
+
+
+    static func +=(lhs: inout String, rhs: Int) {
+        lhs = lhs + rhs
+    }
+}
+
+extension UIGraphicsRenderer {
+    static func renderImagesAt(urls: [NSURL], size: CGSize, scale: CGFloat = 1) -> UIImage {
+        let renderer = UIGraphicsImageRenderer(size: size)
+
+        let options: [NSString: Any] = [
+            kCGImageSourceThumbnailMaxPixelSize: max(size.width * scale, size.height * scale),
+            kCGImageSourceCreateThumbnailFromImageAlways: true
+        ]
+
+        let thumbnails = try urls.map { url -> CGImage in
+            let imageSource = CGImageSourceCreateWithURL(url, nil)
+
+            let scaledImage = CGImageSourceCreateThumbnailAtIndex(imageSource!, 0, options as CFDictionary)
+            
+            return scaledImage!
+        }
+
+        // Translate Y-axis down because cg images are flipped and it falls out of the frame (see bellow)
+        let rect = CGRect(x: 0,
+                          y: -size.height,
+                          width: size.width,
+                          height: size.height)
+
+        let resizedImage = renderer.image { ctx in
+
+            let context = ctx.cgContext
+            context.scaleBy(x: 1, y: -1) //Flip it ( cg y-axis is flipped)
+
+            for image in thumbnails {
+                context.draw(image, in: rect)
+            }
+        }
+
+        return resizedImage
+    }
+    
+    static func renderImageAt(url: NSURL, size: CGSize, scale: CGFloat = 1) -> UIImage {
+            return renderImagesAt(urls: [url], size: size, scale: scale)
+        }
+}
+
+extension NSAttributedString {
+    convenience init(html: String) throws {
+        let options: [NSAttributedString.DocumentReadingOptionKey: Any] = [
+            .documentType: NSAttributedString.DocumentType.html,
+            .characterEncoding: String.Encoding.utf8.rawValue
+        ]
+        guard let data = html.data(using: .utf8) else {
+            throw NSError(domain: "Invalid HTML", code: 0, userInfo: nil)
+        }
+        try self.init(data: data, options: options, documentAttributes: nil)
+    }
+}

+ 2515 - 0
appbuilder-ios/NexilisUC/NexilisUC/Source/Message/CoreMessage_TMessageBank.swift

@@ -0,0 +1,2515 @@
+//
+//  CoreMessage_TMessageBank.swift
+//  NexilisUC
+//
+//  Created by Maronakins on 04/11/24.
+//
+
+import Foundation
+
+public class CoreMessage_TMessageBank {
+    
+    public static func endCall(pin: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.END_CALL
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = pin
+        return tmessage
+    }
+    
+    public static func checkCallStatus(pin: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.ASKING_FOR_END_CALL
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = pin
+        return tmessage
+    }
+    
+    public static func getSignUpApi(api: String, p_pin: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SIGN_UP_API
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.API] = api
+        tmessage.mBodies[CoreMessage_TMessageKey.ANDROID_APP_NAME] = UCUtils.getAppNm()
+        tmessage.mBodies[CoreMessage_TMessageKey.CPAAS_VERSION] = UCUtils.CPAAS_VERSION
+        tmessage.mPIN = p_pin
+        return tmessage
+    }
+    
+    public static func getSignIn(p_name: String, p_password: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEND_SIGNIN
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.NAME] = p_name
+        tmessage.mBodies[CoreMessage_TMessageKey.PSWD] = p_password
+        tmessage.mBodies[CoreMessage_TMessageKey.ANDROID_ID] = UCUtils.M_USER_ANDROID_ID
+        tmessage.mBodies[CoreMessage_TMessageKey.ANDROID_APP_NAME] = UCUtils.getAppNm()
+        tmessage.mBodies[CoreMessage_TMessageKey.CPAAS_VERSION] = UCUtils.CPAAS_VERSION
+//        tmessage.mBodies[CoreMessage_TMessageKey.BUSINESS_ENTITY] = "74"
+        return tmessage
+    }
+    
+    public static func getChangeConnectionID(p_pin: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.CHANGE_CONNECTION_ID
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = p_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = p_pin
+        return tmessage
+    }
+    
+    public static func getPostRegistration(p_pin: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.POST_REGISTRATION_IOS
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = p_pin
+        return tmessage
+    }
+    
+    public static func getBatchBuddiesInfos(p_f_pin: String, last_update: Int, l_pin: String? = nil) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_BATCH_BUDDY_INFO
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = p_f_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.LAST_UPDATE] = "\(last_update)"
+        if(l_pin != nil){
+            tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        }
+        return tmessage
+    }
+    
+    public static func getSendSignup(p_pin: String, p_name: String, p_last_name: String, p_msisdn: String, p_card_type: String, p_card_id: String, p_email: String, p_thumb_id: String, flag: String, imei: String, imsi: String,password:String) -> TMessage {
+        // flag 0 = register biasa, 1 = dengan google, 2 = dengan facebook
+        let tMessage = TMessage()
+        tMessage.mCode = CoreMessage_TMessageCode.SEND_SIGNUP_DATA
+        tMessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tMessage.mPIN = p_pin
+        tMessage.mBodies[CoreMessage_TMessageKey.FIRST_NAME] =         p_name
+        tMessage.mBodies[CoreMessage_TMessageKey.LAST_NAME] = p_last_name
+        tMessage.mBodies[CoreMessage_TMessageKey.MSISDN] =     p_msisdn
+        tMessage.mBodies[CoreMessage_TMessageKey.CARD_TYPE] =     p_card_type
+        tMessage.mBodies[CoreMessage_TMessageKey.CARD_ID] =     p_card_id
+        tMessage.mBodies[CoreMessage_TMessageKey.EMAIL] =     p_email
+        tMessage.mBodies[CoreMessage_TMessageKey.THUMB_ID] =     p_thumb_id
+//        tMessage.mBodies[CoreMessage_TMessageKey.BUSINESS_ENTITY] = "74"
+        tMessage.mBodies[CoreMessage_TMessageKey.TYPE_REGISTER] = flag
+        tMessage.mBodies[CoreMessage_TMessageKey.IMEI] = imei
+        tMessage.mBodies[CoreMessage_TMessageKey.IMSI] = imsi
+        tMessage.mBodies[CoreMessage_TMessageKey.PSWD] = password
+        return tMessage
+    }
+    
+    public static func getSendSignupOTP(p_pin: String, p_name: String, p_last_name: String, p_msisdn: String, p_card_type: String, p_card_id: String, p_email: String, p_thumb_id: String, flag: String, imei: String, imsi: String,password:String) -> TMessage {
+        // flag 0 = register biasa, 1 = dengan google, 2 = dengan facebook
+        let tMessage = TMessage()
+        tMessage.mCode = CoreMessage_TMessageCode.SEND_SIGNUP_OTP
+        tMessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tMessage.mPIN = p_pin
+        tMessage.mBodies[CoreMessage_TMessageKey.FIRST_NAME] =         p_name
+        tMessage.mBodies[CoreMessage_TMessageKey.LAST_NAME] = p_last_name
+        tMessage.mBodies[CoreMessage_TMessageKey.MSISDN] =     p_msisdn
+        tMessage.mBodies[CoreMessage_TMessageKey.CARD_TYPE] =     p_card_type
+        tMessage.mBodies[CoreMessage_TMessageKey.CARD_ID] =     p_card_id
+        tMessage.mBodies[CoreMessage_TMessageKey.EMAIL] =     p_email
+        tMessage.mBodies[CoreMessage_TMessageKey.THUMB_ID] =     p_thumb_id
+//        tMessage.mBodies[CoreMessage_TMessageKey.BUSINESS_ENTITY] = "74"
+        tMessage.mBodies[CoreMessage_TMessageKey.TYPE_REGISTER] = flag
+        tMessage.mBodies[CoreMessage_TMessageKey.IMEI] = imei
+        tMessage.mBodies[CoreMessage_TMessageKey.IMSI] = imsi
+        tMessage.mBodies[CoreMessage_TMessageKey.PSWD] = password
+        return tMessage
+    }
+    
+    public static func getAddBuddy(p_f_pin: String, p_l_pin: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.ADD_BUDDY
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = p_f_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = p_f_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = p_l_pin
+        return tmessage
+    }
+    
+    public static func pullChannelList(offset: String, filter_account: String, filter_category: String, search: String, shr: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.PULL_CHANNEL_LIST
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.OFFSET] = offset
+        tmessage.mBodies[CoreMessage_TMessageKey.FILTER_ACCOUNT] = filter_account
+        tmessage.mBodies[CoreMessage_TMessageKey.FILTER_CATEGORY] = filter_category
+        tmessage.mBodies[CoreMessage_TMessageKey.MESSAGE_TEXT] = search
+        tmessage.mBodies[CoreMessage_TMessageKey.SHARING_FLAG] = shr
+        return tmessage
+    }
+    
+    public static func sendMessage(message_id: String = "", l_pin: String, message_scope_id: String, status: String, message_text: String, credential: String, attachment_flag: String, ex_blog_id: String, message_large_text: String, ex_format: String, image_id: String, audio_id: String, video_id: String, file_id: String, thumb_id: String, reff_id: String, read_receipts: String, chat_id: String, is_call_center: String, call_center_id: String, opposite_pin: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEND_CHAT
+        tmessage.mStatus = me + CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mL_PIN = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.MESSAGE_ID] = message_id.isEmpty ? me + CoreMessage_TMessageUtil.getTID() : message_id
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.SERVER_DATE] = String(Date().currentTimeMillis())
+        tmessage.mBodies[CoreMessage_TMessageKey.LOCAL_TIMESTAMP] = String(Date().currentTimeMillis())
+        tmessage.mBodies[CoreMessage_TMessageKey.MESSAGE_SCOPE_ID] = message_scope_id
+        tmessage.mBodies[CoreMessage_TMessageKey.STATUS] = status
+        tmessage.mBodies[CoreMessage_TMessageKey.MESSAGE_TEXT] = message_text.toStupidString()
+        tmessage.mBodies[CoreMessage_TMessageKey.CREDENTIAL] = credential
+        tmessage.mBodies[CoreMessage_TMessageKey.ATTACHMENT_FLAG] = attachment_flag
+        tmessage.mBodies[CoreMessage_TMessageKey.BLOG_ID] = ex_blog_id
+        tmessage.mBodies[CoreMessage_TMessageKey.BODY] = message_large_text
+        tmessage.mBodies[CoreMessage_TMessageKey.CONNECTED] = "1"
+        tmessage.mBodies[CoreMessage_TMessageKey.FORMAT] = ex_format
+        tmessage.mBodies[CoreMessage_TMessageKey.IS_CALL_CENTER] = is_call_center
+        tmessage.mBodies[CoreMessage_TMessageKey.CALL_CENTER_ID] = call_center_id
+        tmessage.mBodies[CoreMessage_TMessageKey.F_USER_ID] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.QUANTITY] = "1"
+        if !opposite_pin.isEmpty {
+            tmessage.mBodies[CoreMessage_TMessageKey.OPPOSITE_PIN] = opposite_pin
+        }
+        
+        if !image_id.isEmpty {
+            tmessage.mBodies[CoreMessage_TMessageKey.IMAGE_ID] = image_id
+        }
+        if !audio_id.isEmpty {
+            tmessage.mBodies[CoreMessage_TMessageKey.AUDIO_ID] = audio_id
+        }
+        if !video_id.isEmpty {
+            tmessage.mBodies[CoreMessage_TMessageKey.VIDEO_ID] = video_id
+        }
+        if !file_id.isEmpty {
+            tmessage.mBodies[CoreMessage_TMessageKey.FILE_ID] = file_id
+        }
+        if !thumb_id.isEmpty {
+            tmessage.mBodies[CoreMessage_TMessageKey.THUMB_ID] = thumb_id
+        }
+        if !reff_id.isEmpty {
+            tmessage.mBodies[CoreMessage_TMessageKey.REF_ID] = reff_id
+        }
+        tmessage.mBodies[CoreMessage_TMessageKey.READ_RECEIPTS] = read_receipts
+        if !chat_id.isEmpty {
+            tmessage.mBodies[CoreMessage_TMessageKey.CHAT_ID] = chat_id
+        }
+        return tmessage
+    }
+    
+    public static func getUpdateRead(p_chat_id: String, p_f_pin: String, p_scope_id: String, qty: Int) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEND_UPDATE_READ
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.CHAT_ID] = p_chat_id
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = p_f_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.MESSAGE_SCOPE_ID] = p_scope_id
+        tmessage.mBodies[CoreMessage_TMessageKey.QUANTITY] = "\(qty)"
+        return tmessage
+    }
+    
+    public static func getUploadFile(p_image_id: String, file_size: String, part_of: String, part_size: String, p_file: [UInt8] ) -> TMessage {
+        var me: String = ""
+        if UserDefaults.standard.string(forKey: "me") != nil {
+            me = UserDefaults.standard.string(forKey: "me")!
+        }
+        //        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.UPLOAD_FILE
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.FILE_UPLOAD] = p_image_id
+        tmessage.mBodies[CoreMessage_TMessageKey.FILE_SIZE] = file_size
+        tmessage.mBodies[CoreMessage_TMessageKey.PART_OF] = part_of
+        tmessage.mBodies[CoreMessage_TMessageKey.PART_SIZE] = part_size
+        tmessage.setMedia(media: p_file)
+        return tmessage
+    }
+    
+    public static func getAcknowledgment(p_id: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.ACKNOWLEDGMENT
+        tmessage.mStatus = p_id
+        tmessage.mPIN = "-1"
+        tmessage.mBodies[CoreMessage_TMessageKey._ID] = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.MESSAGE_ID] = p_id
+        return tmessage
+    }
+    
+    public static func getCreateGroup(p_group_id: String, p_group_name: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.CREATE_GROUP
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.GROUP_ID] = p_group_id
+        tmessage.mBodies[CoreMessage_TMessageKey.GROUP_NAME] = p_group_name
+        return tmessage
+    }
+    
+    public static func getCreateChat(chat_id: String, title: String, group_id: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.CREATE_CHAT
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.CHAT_ID] = chat_id
+        tmessage.mBodies[CoreMessage_TMessageKey.TITLE] = title
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = group_id
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = ""
+        tmessage.mBodies[CoreMessage_TMessageKey.SCOPE_ID] = "4"
+        return tmessage
+    }
+    
+    public static func getDeleteChat(chat_id: String, f_pin: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.DELETE_CHAT
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.CHAT_ID] = chat_id
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = f_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.SCOPE_ID] = "4"
+        return tmessage
+    }
+    
+    public static func getUpdateChat(p_chat_id: String, p_f_pin: String, p_title: String, p_anonym: String, p_image: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.UPDATE_CHAT
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.CHAT_ID] = p_chat_id
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = p_f_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.SCOPE_ID] = "4"
+        tmessage.mBodies[CoreMessage_TMessageKey.TITLE] = p_title
+        tmessage.mBodies[CoreMessage_TMessageKey.ANONYMOUS] = p_anonym
+        tmessage.mBodies[CoreMessage_TMessageKey.IMAGE] = p_image
+        return tmessage
+    }
+    
+    public static func getAddGroupMember(p_group_id: String, p_member_pin: String, p_position: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.ADD_MEMBER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.GROUP_ID] = p_group_id
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = p_member_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.POSITION] = p_position
+        return tmessage
+    }
+    
+    public static func getAddChatMember(groupId: String, chatId: String, pin: String, status: String = "1") -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.JOIN_CHAT
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.GROUP_ID] = groupId
+        tmessage.mBodies[CoreMessage_TMessageKey.CHAT_ID] = chatId
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = pin
+        tmessage.mBodies[CoreMessage_TMessageKey.STATUS] = status
+        return tmessage
+    }
+    
+    public static func getChangeGroupMemberPosition(p_group_id: String, p_pin: String, p_position: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.CHANGE_GROUP_MEMBER_POSITION
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.GROUP_ID] = p_group_id
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = p_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.POSITION] = p_position
+        return tmessage
+    }
+    
+    public static func getExitGroup(p_group_id: String, p_pin: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.EXIT_GROUP
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.GROUP_ID] = p_group_id
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = p_pin
+        return tmessage
+    }
+    
+    public static func getChangeGroupInfo(p_group_id: String, p_name: String = "", p_open: String? = nil, p_thumb_id: String = "", p_quote: String = "") -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.CHANGE_GROUP_INFO
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.GROUP_ID] = p_group_id
+        if !p_name.isEmpty { tmessage.mBodies[CoreMessage_TMessageKey.GROUP_NAME] = p_name }
+        if p_open != nil { tmessage.mBodies[CoreMessage_TMessageKey.IS_OPEN] = p_open }
+        if !p_thumb_id.isEmpty { tmessage.mBodies[CoreMessage_TMessageKey.THUMB_ID] = p_thumb_id }
+        if !p_quote.isEmpty { tmessage.mBodies[CoreMessage_TMessageKey.QUOTE] = p_quote }
+        return tmessage
+    }
+    
+    public static func getImageDownload(p_image_id: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.IMAGE_DOWNLOAD
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.IMAGE_ID] = p_image_id
+        return tmessage
+    }
+    
+    public static func retrievePostTimeline(score: String, last_last_update: String, filter_account: String, filter_category: String, search: String, type: String = "", shr: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tMessage = TMessage()
+        tMessage.mCode = CoreMessage_TMessageCode.POST_RETRIEVE_TIMELINE
+        tMessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tMessage.mPIN = me
+        tMessage.mBodies[CoreMessage_TMessageKey.SCORE] = score
+        tMessage.mBodies[CoreMessage_TMessageKey.LAST_UPDATE] = last_last_update
+        tMessage.mBodies[CoreMessage_TMessageKey.FILTER_ACCOUNT] = filter_account
+        tMessage.mBodies[CoreMessage_TMessageKey.FILTER_CATEGORY] = filter_category
+        tMessage.mBodies[CoreMessage_TMessageKey.MESSAGE_TEXT] = "%" + search.trimmingCharacters(in: .whitespacesAndNewlines).replacingOccurrences(of: " ", with: "%") + "%"
+        tMessage.mBodies[CoreMessage_TMessageKey.SHARING_FLAG] = shr
+        if !type.isEmpty { tMessage.mBodies[CoreMessage_TMessageKey.TYPE] = type }
+        return tMessage
+    }
+    
+    public static func retrievePostProfile(f_pin: String, merchant_id: String, last_created_date: String, type: String, storyId: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tMessage = TMessage()
+        tMessage.mCode = CoreMessage_TMessageCode.POST_RETRIEVE_PROFILE
+        tMessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tMessage.mPIN = me
+        tMessage.mBodies[CoreMessage_TMessageKey.F_PIN] = f_pin
+        tMessage.mBodies[CoreMessage_TMessageKey.MERCHANT_ID] = merchant_id
+        tMessage.mBodies[CoreMessage_TMessageKey.CREATED_DATE] = last_created_date
+        tMessage.mBodies[CoreMessage_TMessageKey.TYPE] = type
+        tMessage.mBodies[CoreMessage_TMessageKey.STORY_ID] = storyId
+        return tMessage
+    }
+    
+    public static func getReport(post_id: String, report_date: String, reason: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tMessage = TMessage()
+        tMessage.mCode = CoreMessage_TMessageCode.POST_REPORT
+        tMessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tMessage.mPIN = me
+        tMessage.mBodies[CoreMessage_TMessageKey.POST_ID] = post_id
+        tMessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tMessage.mBodies[CoreMessage_TMessageKey.REPORT_DATE] = report_date
+        tMessage.mBodies[CoreMessage_TMessageKey.REASON] = reason
+        return tMessage
+    }
+    
+    public static func getReaction(post_id: String, flag_reaction: String, last_update: String, beforeFlagChanged: String, lac: String, cid: String, mcc: String, mnc: String, pci: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tMessage = TMessage()
+        tMessage.mCode = CoreMessage_TMessageCode.POST_REACTION
+        tMessage.mStatus  = CoreMessage_TMessageUtil.getTID()
+        tMessage.mPIN = me
+        tMessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tMessage.mBodies[CoreMessage_TMessageKey.POST_ID] = post_id
+        tMessage.mBodies[CoreMessage_TMessageKey.FLAG_REACTION] = flag_reaction
+        tMessage.mBodies[CoreMessage_TMessageKey.LAST_UPDATE] = last_update
+        tMessage.mBodies[CoreMessage_TMessageKey.BEFORE_FLAG_CHANGED] = beforeFlagChanged
+        tMessage.mBodies[CoreMessage_TMessageKey.LAC_ID] = lac
+        tMessage.mBodies[CoreMessage_TMessageKey.CELL_ID] = cid
+        tMessage.mBodies[CoreMessage_TMessageKey.MCC_ID] = mcc
+        tMessage.mBodies[CoreMessage_TMessageKey.MNC_ID] = mnc
+        tMessage.mBodies[CoreMessage_TMessageKey.PCI_ID] = pci
+        return tMessage
+    }
+    
+    public static func getComment(post_id: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_COMMENTS
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = tmessage.mPIN
+        tmessage.mBodies["post_id"] = post_id
+        return tmessage
+    }
+    
+    public static func sendComment(image: String, name: String, comment_id: String, post_id: String, ref_comment_id: String, comment: String, commentDate: String, lac: String, cid: String, mcc: String, mnc: String, pci: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEND_COMMENTS
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies["name"] = name
+        tmessage.mBodies["image"] = image
+        tmessage.mBodies[CoreMessage_TMessageKey.COMMENT_ID] = comment_id
+        tmessage.mBodies[CoreMessage_TMessageKey.COMMENT] = comment
+        tmessage.mBodies[CoreMessage_TMessageKey.COMMENT_DATE] = commentDate
+        tmessage.mBodies[CoreMessage_TMessageKey.REF_COMMENT_ID] = ref_comment_id
+        tmessage.mBodies[CoreMessage_TMessageKey.LAC_ID] = lac
+        tmessage.mBodies[CoreMessage_TMessageKey.CELL_ID] = cid
+        tmessage.mBodies[CoreMessage_TMessageKey.MCC_ID] = mcc
+        tmessage.mBodies[CoreMessage_TMessageKey.MNC_ID] = mnc
+        tmessage.mBodies[CoreMessage_TMessageKey.PCI_ID] = pci
+        tmessage.mBodies["post_id"] = post_id
+        return tmessage
+    }
+    
+    public static func getFollow(post_id: String, l_pin: String, followDate: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_FOLLOW
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.POST_ID] = post_id
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.FOLLOW_DATE] = followDate
+        tmessage.mBodies[CoreMessage_TMessageKey.UNFOLLOW_DATE] = "253402102800000"
+        return tmessage
+    }
+    
+    public static func getUnFollow(post_id: String, l_pin: String) -> TMessage{
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_UNFOLLOW
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.POST_ID] = post_id
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.UNFOLLOW_DATE] = String(Date().currentTimeMillis())
+        return tmessage
+    }
+    
+    public static func deleteComment(comment_id: String, post_id: String, ref_comment_id: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.DELETE_COMMENTS
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.COMMENT_ID] = comment_id
+        tmessage.mBodies[CoreMessage_TMessageKey.REF_COMMENT_ID] = ref_comment_id
+        tmessage.mBodies["post_id"] = post_id
+        return tmessage
+    }
+    
+    public static func getUpadateComment(post_id: String, status: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.ON_EDITOR_COMMENT
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies["post_id"] = post_id
+        tmessage.mBodies[CoreMessage_TMessageKey.STATUS] = status
+        return tmessage
+    }
+    
+    public static func startScreenSharing(device_id: String, title: String?) -> TMessage{
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tMessage = TMessage()
+        tMessage.mCode = CoreMessage_TMessageCode.SCREEN_SHARING
+        tMessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tMessage.mPIN = me
+        tMessage.mBodies[CoreMessage_TMessageKey.TITLE] = title ?? device_id
+        tMessage.mBodies[CoreMessage_TMessageKey.L_PIN] = device_id
+        return tMessage
+    }
+    
+    public static func terminateScreenSharing(device_id: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tMessage = TMessage()
+        tMessage.mCode = CoreMessage_TMessageCode.SCREEN_SHARING_STOP
+        tMessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tMessage.mPIN = me
+        tMessage.mBodies[CoreMessage_TMessageKey.L_PIN] = device_id
+        return tMessage
+    }
+    
+    public static func getAddFriendQRCode(fpin: String) -> TMessage {
+        let tMessage = TMessage()
+        tMessage.mCode = CoreMessage_TMessageCode.ADD_FRIEND_QR
+        tMessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tMessage.mBodies[CoreMessage_TMessageKey.FRIEND_FPIN] = fpin
+        return tMessage
+    }
+    
+    public static func getAddFriendQRCodeSilent(fpin: String) -> TMessage {
+        let tMessage = TMessage()
+        tMessage.mCode = CoreMessage_TMessageCode.ADD_FRIEND_QR
+        tMessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tMessage.mBodies[CoreMessage_TMessageKey.FRIEND_FPIN] = fpin
+        tMessage.mBodies["is_silent"] = "1"
+        return tMessage
+    }
+    
+    public static func removeFriend(lpin: String) -> TMessage {
+        let tMessage = TMessage()
+        tMessage.mCode = CoreMessage_TMessageCode.REMOVE_FRIEND
+        tMessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tMessage.mBodies[CoreMessage_TMessageKey.L_PIN] = lpin
+        return tMessage;
+    }
+    
+    public static func requestNearbyPerson(latitude: String, longitude: String, radius: String = "1000") -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_PERSON_NEARBY
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.LATITUDE] = latitude
+        tmessage.mBodies[CoreMessage_TMessageKey.LONGITUDE] = longitude
+        tmessage.mBodies[CoreMessage_TMessageKey.RADIUS] = radius
+        return tmessage
+    }
+    
+    public static func searchPerson(name: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_PERSON_BY_NAME
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.NAME] = name
+        return tmessage
+    }
+    
+    public static func trackPerson(pin: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_PERSON_BY_PIN
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = pin
+        return tmessage
+    }
+    
+    public static func getSituasiCovid() -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_SITUASI_COVID
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        return tmessage
+    }
+    
+    public static func getDoctorNearby(latitude: String, longitude: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_DOCTOR_NEARBY
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.LONGITUDE] = longitude
+        tmessage.mBodies[CoreMessage_TMessageKey.LATITUDE] = latitude
+        return tmessage
+    }
+    
+    public static func getPersonSuggestion(p_last_seq: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.RETRIEVE_PERSON_SUGGESTION
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.LAST_SEQUENCE] = p_last_seq
+        return tmessage
+    }
+    
+    public static func getSearchFriend(search_keyword: String, limit: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.RETRIEVE_PERSON_BY_NAME
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.NAME] = search_keyword
+        tmessage.mBodies[CoreMessage_TMessageKey.N_LIMIT] = limit
+        return tmessage
+    }
+    
+    public static func pullStoryList(offset: String, filter: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.PULL_STORY_LIST
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.OFFSET] = offset
+        tmessage.mBodies[CoreMessage_TMessageKey.FILTER_ACCOUNT] = filter
+        return tmessage
+    }
+    
+    public static func pullMainContent() -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.PULL_MAIN_CONTENT
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        return tmessage
+    }
+    
+    public static func pullStoryListPersonal(offset: String, filter: String, l_pin:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.PULL_STORY_LIST_PERSONAL
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.OFFSET] = offset
+        tmessage.mBodies[CoreMessage_TMessageKey.FILTER_ACCOUNT] = filter
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        return tmessage
+    }
+    
+    public static func postCreateStory(post_id: String, title: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.POST_UPDATE_STORY
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.POST_ID] = post_id
+        tmessage.mBodies[CoreMessage_TMessageKey.TITLE] = title
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = "1"
+        return tmessage
+    }
+    
+    public static func postUpdateStory(story_id: String, post_id: String, title: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.POST_UPDATE_STORY
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.STORY_ID] = story_id
+        tmessage.mBodies[CoreMessage_TMessageKey.POST_ID] = post_id
+        tmessage.mBodies[CoreMessage_TMessageKey.TITLE] = title
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = "2"
+        return tmessage
+    }
+    
+    public static func submitKuisioner(data: String, latitude: String, longitude: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SUBMIT_SURVEY_COVID
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.LONGITUDE] = longitude
+        tmessage.mBodies[CoreMessage_TMessageKey.LATITUDE] = latitude
+        tmessage.mBodies[CoreMessage_TMessageKey.DATA] = data
+        return tmessage
+    }
+    
+    public static func submitKuisionerAdditional(data: String, survey_id: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SUBMIT_SURVEY_COVID_ADDITIONAL
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID();
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.SURVEY_ID] = survey_id
+        return tmessage
+    }
+    
+    public static func sendLSBroadcast(title: String, type:String, typeValue: String, category: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.CREATE_LIVE_VIDEO
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.TITLE] = title
+        tmessage.mBodies[CoreMessage_TMessageKey.BROADCAST_FLAG] = type
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.VALUE] = typeValue
+        tmessage.mBodies[CoreMessage_TMessageKey.CATEGORY_ID] = category
+        return tmessage
+    }
+    
+    public static func createLS(title: String, type:String, typeValue: String = "", category: String, tagline: String, notifType: String, blogId: String, data: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.CREATE_LS
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.TITLE] = title
+        tmessage.mBodies[CoreMessage_TMessageKey.BROADCAST_FLAG] = type
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.VALUE] = typeValue
+        tmessage.mBodies[CoreMessage_TMessageKey.CATEGORY_ID] = category
+        tmessage.mBodies[CoreMessage_TMessageKey.BLOG_ID] = blogId
+        tmessage.mBodies[CoreMessage_TMessageKey.TAGLINE] = tagline
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = notifType
+        tmessage.mBodies[CoreMessage_TMessageKey.DATA] = data
+        tmessage.mBodies[CoreMessage_TMessageKey.BUSINESS_ENTITY] = ""
+        return tmessage
+    }
+    
+    public static func createSeminar(title: String, type:String, typeValue: String = "", category: String, notifType: String, blogId: String, data: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEMINAR_CREATE
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.TITLE] = title
+        tmessage.mBodies[CoreMessage_TMessageKey.BROADCAST_FLAG] = type
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.VALUE] = typeValue
+        tmessage.mBodies[CoreMessage_TMessageKey.CATEGORY_ID] = category
+        tmessage.mBodies[CoreMessage_TMessageKey.BLOG_ID] = blogId
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = notifType
+        tmessage.mBodies[CoreMessage_TMessageKey.DATA] = data
+        tmessage.mBodies[CoreMessage_TMessageKey.BUSINESS_ENTITY] = ""
+        return tmessage
+    }
+    
+    public static func getUploadTimeline(post_id: String, title: String, description: String, link: String, type: String, created_date: String, audition_date: String, thumb_id: String, privacy: String, file_id: String, video_duration: String, category: String, file_type: String, ads_type: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.UPLOAD_TIMELINE
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.POST_ID] = post_id
+        tmessage.mBodies[CoreMessage_TMessageKey.TITLE] = title
+        tmessage.mBodies[CoreMessage_TMessageKey.DESCRIPTION] = description
+        tmessage.mBodies[CoreMessage_TMessageKey.LINK] = link
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = type
+        tmessage.mBodies[CoreMessage_TMessageKey.CREATED_DATE] = created_date
+        tmessage.mBodies[CoreMessage_TMessageKey.AUDITION_DATE] = audition_date
+        tmessage.mBodies[CoreMessage_TMessageKey.THUMB_ID] = thumb_id
+        tmessage.mBodies[CoreMessage_TMessageKey.PRIVACY_FLAG] = privacy
+        tmessage.mBodies[CoreMessage_TMessageKey.FILE_ID] = file_id
+        tmessage.mBodies[CoreMessage_TMessageKey.DURATION] = video_duration
+        tmessage.mBodies[CoreMessage_TMessageKey.CATEGORY_ID] = category
+        tmessage.mBodies[CoreMessage_TMessageKey.MEDIA_TYPE] = file_type
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE_ADS] = ads_type
+        return tmessage
+    }
+    
+    public static func getUploadTimelineInvitation(post_id: String, title: String, description: String, link: String, type: String, created_date: String, audition_date: String, thumb_id: String, privacy: String, file_id: String, video_duration: String, category: String, file_type: String, ads_type: String,target: String, members: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.UPLOAD_TIMELINE
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.POST_ID] = post_id
+        tmessage.mBodies[CoreMessage_TMessageKey.TITLE] = title
+        tmessage.mBodies[CoreMessage_TMessageKey.DESCRIPTION] = description
+        tmessage.mBodies[CoreMessage_TMessageKey.LINK] = link
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = type
+        tmessage.mBodies[CoreMessage_TMessageKey.CREATED_DATE] = created_date
+        tmessage.mBodies[CoreMessage_TMessageKey.AUDITION_DATE] = audition_date
+        tmessage.mBodies[CoreMessage_TMessageKey.THUMB_ID] = thumb_id
+        tmessage.mBodies[CoreMessage_TMessageKey.PRIVACY_FLAG] = privacy
+        tmessage.mBodies[CoreMessage_TMessageKey.FILE_ID] = file_id
+        tmessage.mBodies[CoreMessage_TMessageKey.DURATION] = video_duration
+        tmessage.mBodies[CoreMessage_TMessageKey.CATEGORY_ID] = category
+        tmessage.mBodies[CoreMessage_TMessageKey.MEDIA_TYPE] = file_type
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE_ADS] = ads_type
+        tmessage.mBodies[CoreMessage_TMessageKey.TARGET_CONTENT] = target
+        tmessage.mBodies["members"] = members
+        return tmessage
+    }
+    
+    public static func getUploadTimelineGroup(post_id: String, title: String, description: String, link: String, type: String, created_date: String, audition_date: String, thumb_id: String, privacy: String, file_id: String, video_duration: String, category: String, file_type: String, ads_type: String,target: String, groups: String, topics: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.UPLOAD_TIMELINE
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.POST_ID] = post_id
+        tmessage.mBodies[CoreMessage_TMessageKey.TITLE] = title
+        tmessage.mBodies[CoreMessage_TMessageKey.DESCRIPTION] = description
+        tmessage.mBodies[CoreMessage_TMessageKey.LINK] = link
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = type
+        tmessage.mBodies[CoreMessage_TMessageKey.CREATED_DATE] = created_date
+        tmessage.mBodies[CoreMessage_TMessageKey.AUDITION_DATE] = audition_date
+        tmessage.mBodies[CoreMessage_TMessageKey.THUMB_ID] = thumb_id
+        tmessage.mBodies[CoreMessage_TMessageKey.PRIVACY_FLAG] = privacy
+        tmessage.mBodies[CoreMessage_TMessageKey.FILE_ID] = file_id
+        tmessage.mBodies[CoreMessage_TMessageKey.DURATION] = video_duration
+        tmessage.mBodies[CoreMessage_TMessageKey.CATEGORY_ID] = category
+        tmessage.mBodies[CoreMessage_TMessageKey.MEDIA_TYPE] = file_type
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE_ADS] = ads_type
+        tmessage.mBodies[CoreMessage_TMessageKey.TARGET_CONTENT] = target
+        tmessage.mBodies["groups"] = groups
+        tmessage.mBodies["topics"] = topics
+        return tmessage
+    }
+    
+    public static func getUploadTimelineEdu(post_id: String, title: String, description: String, link: String, type: String, created_date: String, audition_date: String, thumb_id: String, privacy: String, file_id: String, video_duration: String, category: String, file_type: String, ads_type: String, level_edu: String, materi_edu: String, finaltest_edu: String, target: String, pricing:String, pricing_money:String, question:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.UPLOAD_TIMELINE
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.POST_ID] = post_id
+        tmessage.mBodies[CoreMessage_TMessageKey.TITLE] = title
+        tmessage.mBodies[CoreMessage_TMessageKey.DESCRIPTION] = description
+        tmessage.mBodies[CoreMessage_TMessageKey.LINK] = link
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = type
+        tmessage.mBodies[CoreMessage_TMessageKey.CREATED_DATE] = created_date
+        tmessage.mBodies[CoreMessage_TMessageKey.AUDITION_DATE] = audition_date
+        tmessage.mBodies[CoreMessage_TMessageKey.THUMB_ID] = thumb_id
+        tmessage.mBodies[CoreMessage_TMessageKey.PRIVACY_FLAG] = privacy
+        tmessage.mBodies[CoreMessage_TMessageKey.FILE_ID] = file_id
+        tmessage.mBodies[CoreMessage_TMessageKey.DURATION] = video_duration
+        tmessage.mBodies[CoreMessage_TMessageKey.CATEGORY_ID] = category
+        tmessage.mBodies[CoreMessage_TMessageKey.MEDIA_TYPE] = file_type
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE_ADS] = ads_type
+        tmessage.mBodies[CoreMessage_TMessageKey.LEVEL_EDU] = level_edu
+        tmessage.mBodies[CoreMessage_TMessageKey.MATERI_EDU] = materi_edu
+        tmessage.mBodies[CoreMessage_TMessageKey.FINALTEST_EDU] = finaltest_edu
+        tmessage.mBodies[CoreMessage_TMessageKey.TARGET_CONTENT] = target
+        tmessage.mBodies[CoreMessage_TMessageKey.PRICING] = pricing
+        tmessage.mBodies[CoreMessage_TMessageKey.PRICING_MONEY] = pricing_money
+        tmessage.mBodies[CoreMessage_TMessageKey.QUESTION_QUIZ] = question
+        return tmessage
+    }
+    
+    public static func getUploadTimelineEduInvitation(post_id: String, title: String, description: String, link: String, type: String, created_date: String, audition_date: String, thumb_id: String, privacy: String, file_id: String, video_duration: String, category: String, file_type: String, ads_type: String, level_edu: String, materi_edu: String, finaltest_edu: String, target: String, pricing:String, pricing_money:String, members: String, question:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.UPLOAD_TIMELINE
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.POST_ID] = post_id
+        tmessage.mBodies[CoreMessage_TMessageKey.TITLE] = title
+        tmessage.mBodies[CoreMessage_TMessageKey.DESCRIPTION] = description
+        tmessage.mBodies[CoreMessage_TMessageKey.LINK] = link
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = type
+        tmessage.mBodies[CoreMessage_TMessageKey.CREATED_DATE] = created_date
+        tmessage.mBodies[CoreMessage_TMessageKey.AUDITION_DATE] = audition_date
+        tmessage.mBodies[CoreMessage_TMessageKey.THUMB_ID] = thumb_id
+        tmessage.mBodies[CoreMessage_TMessageKey.PRIVACY_FLAG] = privacy
+        tmessage.mBodies[CoreMessage_TMessageKey.FILE_ID] = file_id
+        tmessage.mBodies[CoreMessage_TMessageKey.DURATION] = video_duration
+        tmessage.mBodies[CoreMessage_TMessageKey.CATEGORY_ID] = category
+        tmessage.mBodies[CoreMessage_TMessageKey.MEDIA_TYPE] = file_type
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE_ADS] = ads_type
+        tmessage.mBodies[CoreMessage_TMessageKey.LEVEL_EDU] = level_edu
+        tmessage.mBodies[CoreMessage_TMessageKey.MATERI_EDU] = materi_edu
+        tmessage.mBodies[CoreMessage_TMessageKey.FINALTEST_EDU] = finaltest_edu
+        tmessage.mBodies[CoreMessage_TMessageKey.TARGET_CONTENT] = target
+        tmessage.mBodies[CoreMessage_TMessageKey.PRICING] = pricing
+        tmessage.mBodies[CoreMessage_TMessageKey.PRICING_MONEY] = pricing_money
+        tmessage.mBodies[CoreMessage_TMessageKey.QUESTION_QUIZ] = question
+        tmessage.mBodies["members"] = members
+        return tmessage
+    }
+    
+    public static func getUploadTimelineEduClass(post_id: String, title: String, description: String, link: String, type: String, created_date: String, audition_date: String, thumb_id: String, privacy: String, file_id: String, video_duration: String, category: String, file_type: String, ads_type: String, level_edu: String, materi_edu: String, finaltest_edu: String, target: String, pricing:String, pricing_money:String, groups: String, topics: String, question:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.UPLOAD_TIMELINE
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.POST_ID] = post_id
+        tmessage.mBodies[CoreMessage_TMessageKey.TITLE] = title
+        tmessage.mBodies[CoreMessage_TMessageKey.DESCRIPTION] = description
+        tmessage.mBodies[CoreMessage_TMessageKey.LINK] = link
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = type
+        tmessage.mBodies[CoreMessage_TMessageKey.CREATED_DATE] = created_date
+        tmessage.mBodies[CoreMessage_TMessageKey.AUDITION_DATE] = audition_date
+        tmessage.mBodies[CoreMessage_TMessageKey.THUMB_ID] = thumb_id
+        tmessage.mBodies[CoreMessage_TMessageKey.PRIVACY_FLAG] = privacy
+        tmessage.mBodies[CoreMessage_TMessageKey.FILE_ID] = file_id
+        tmessage.mBodies[CoreMessage_TMessageKey.DURATION] = video_duration
+        tmessage.mBodies[CoreMessage_TMessageKey.CATEGORY_ID] = category
+        tmessage.mBodies[CoreMessage_TMessageKey.MEDIA_TYPE] = file_type
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE_ADS] = ads_type
+        tmessage.mBodies[CoreMessage_TMessageKey.LEVEL_EDU] = level_edu
+        tmessage.mBodies[CoreMessage_TMessageKey.MATERI_EDU] = materi_edu
+        tmessage.mBodies[CoreMessage_TMessageKey.FINALTEST_EDU] = finaltest_edu
+        tmessage.mBodies[CoreMessage_TMessageKey.TARGET_CONTENT] = target
+        tmessage.mBodies[CoreMessage_TMessageKey.PRICING] = pricing
+        tmessage.mBodies[CoreMessage_TMessageKey.PRICING_MONEY] = pricing_money
+        tmessage.mBodies[CoreMessage_TMessageKey.QUESTION_QUIZ] = question
+        tmessage.mBodies["groups"] = groups
+        tmessage.mBodies["topics"] = topics
+        return tmessage
+    }
+    
+    public static func joinLiveVideo(broadcast_id: String, request_id:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.JOIN_LIVE_VIDEO
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.BROADCAST_ID] = broadcast_id
+        tmessage.mBodies[CoreMessage_TMessageKey.REQUEST_ID] = request_id
+        return tmessage
+    }
+    public static func removeLiveVideo(broadcast_id: String, request_id:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.REMOVE_LIVE_VIDEO
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.BROADCAST_ID] = broadcast_id
+        tmessage.mBodies[CoreMessage_TMessageKey.REQUEST_ID] = request_id
+        return tmessage
+    }
+    public static func leftLiveVideo(broadcast_id: String, request_id:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.LEFT_LIVE_VIDEO
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.BROADCAST_ID] = broadcast_id
+        tmessage.mBodies[CoreMessage_TMessageKey.REQUEST_ID] = request_id
+        return tmessage
+    }
+    public static func joinSeminar(broadcast_id: String, request_id:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEMINAR_JOIN
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.BROADCAST_ID] = broadcast_id
+        tmessage.mBodies[CoreMessage_TMessageKey.REQUEST_ID] = request_id
+        return tmessage
+    }
+    public static func removeSeminar(broadcast_id: String, request_id:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEMINAR_REMOVE
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.BROADCAST_ID] = broadcast_id
+        tmessage.mBodies[CoreMessage_TMessageKey.REQUEST_ID] = request_id
+        return tmessage
+    }
+    public static func leftSeminar(broadcast_id: String, request_id:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEMINAR_LEFT
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.BROADCAST_ID] = broadcast_id
+        tmessage.mBodies[CoreMessage_TMessageKey.REQUEST_ID] = request_id
+        return tmessage
+    }
+    
+    public static func getSeminarRaiseHand(p_pin: String, l_pin: String, status: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEMINAR_PUSH_RAISE_HAND
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = p_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] =  p_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.STATUS] = status
+        return tmessage
+    }
+    
+    public static func getSeminarDraw(broadcaster: String, flag: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEMINAR_DRAW
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = tmessage.mPIN
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = broadcaster
+        tmessage.mBodies[CoreMessage_TMessageKey.INDEX] = flag
+        return tmessage
+    }
+    
+    public static func getSeminarFaceDetection(p_pin: String, l_pin: String, flag: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEMINAR_FACE_DETECTION
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = p_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = p_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.STATUS] = flag
+        return tmessage
+    }
+    
+    public static func getSendLSChat(l_pin: String, message_text:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.LIVE_PROFILE_PUSH_CHAT
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.MESSAGE_TEXT] = message_text
+        return tmessage
+    }
+    public static func getSendSeminarChat(l_pin: String, message_text:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEMINAR_PUSH_CHAT
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.MESSAGE_TEXT] = message_text
+        return tmessage
+    }
+    public static func getSendLSEmotion(l_pin: String, emotion_type:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.LIVE_PROFILE_EMOTION_SEND
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = emotion_type
+        return tmessage
+    }
+    public static func getUpdateLSTitle(title:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.UPDATE_LIVE_VIDEO
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.TITLE] = title
+        return tmessage
+    }
+    public static func getChangePersonInfoName(firstname:String,lastname:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.CHANGE_PERSON_INFO
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.FIRST_NAME] = firstname
+        tmessage.mBodies[CoreMessage_TMessageKey.LAST_NAME] = lastname
+        return tmessage
+    }
+    public static func getChangePersonInfoEmail(email:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.CHANGE_PERSON_INFO
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.EMAIL] = email
+        return tmessage
+    }
+    public static func getChangePersonInfoPassword(password:String,oldpassword:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.CHANGE_PERSON_INFO
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.PSWD] = password
+        tmessage.mBodies[CoreMessage_TMessageKey.PSWD_OLD] = oldpassword
+        return tmessage
+    }
+    
+    public static func getChangePersonInfoQuote(quote: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tMessage = TMessage()
+        tMessage.mCode = CoreMessage_TMessageCode.CHANGE_PERSON_INFO
+        tMessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tMessage.mPIN = me
+        tMessage.mBodies[CoreMessage_TMessageKey.QUOTE] = quote
+        return tMessage
+    }
+    
+    public static func getChangePersonPrivacy(privacy: Bool) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.CHANGE_PERSON_INFO
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.PRIVACY_FLAG] = privacy ? "1" : "0"
+        return tmessage
+    }
+    
+    public static func getChangePersonOfflineMode(offline: Bool) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.CHANGE_PERSON_INFO
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.OFFLINE_MODE] = offline ? "1" : "0"
+        return tmessage
+    }
+    
+    public static func getChangePersonImage(thumb_id: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.CHANGE_PERSON_INFO
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.THUMB_ID] = thumb_id
+        return tmessage
+    }
+    
+    public static func getLSData(l_pin:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.LIVE_PROFILE_EMOTION_GET
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        return tmessage
+    }
+    
+    public static func deleteMessage(l_pin: String, messageId: String, scope: String, type: String, chat: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.DELETE_CTEXT
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.MESSAGE_ID] = messageId
+        tmessage.mBodies["message_id"] = messageId // message_id separated with coma
+        tmessage.mBodies[CoreMessage_TMessageKey.CHAT_ID] = chat
+        tmessage.mBodies[CoreMessage_TMessageKey.MESSAGE_SCOPE_ID] = scope
+        if type == "2" { // delete for everyone
+            tmessage.mBodies[CoreMessage_TMessageKey.DELETE_MESSAGE_FLAG] = "1"
+        }
+        return tmessage
+    }
+    public static func getRequestLiveVideo(f_pin:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.REQUEST_LIVE_VIDEO
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = f_pin
+        return tmessage
+    }
+    public static func createVCallConference(blog_id:String, data:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.VC_ROOM_CREATE
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.BLOG_ID] = blog_id
+        tmessage.mBodies[CoreMessage_TMessageKey.DATA] = data
+        return tmessage
+    }
+    public static func startVCallConference(blog_id:String,time:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.VC_ROOM_START
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.BROADCAST_ID] = blog_id
+        tmessage.mBodies[CoreMessage_TMessageKey.START_DATE] = time
+        return tmessage
+    }
+    public static func joinVCallConference(blog_id:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.VC_ROOM_JOIN;
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.BROADCAST_ID] = blog_id
+        return tmessage
+    }
+    public static func endVCallConference(blog_id:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.VC_ROOM_END;
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.BROADCAST_ID] = blog_id
+        return tmessage
+    }
+    public static func getVersionCheck() -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.VERSION_CHECK;
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        return tmessage
+    }
+    
+    public static func getUpdateTypingStatus(p_opposite: String, p_scope: String, p_status: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEND_UPDATE_TYPING;
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = p_opposite
+        tmessage.mBodies[CoreMessage_TMessageKey.STATUS] = p_status
+        tmessage.mBodies[CoreMessage_TMessageKey.SCOPE_ID] = p_scope
+        return tmessage
+    }
+    
+    public static func getBuddyInfo(l_pin: String, last_update: Int) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_BUDDY_INFO;
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.LAST_UPDATE] = "\(last_update)"
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        return tmessage
+    }
+    
+    public static func getAckLocationMessage(f_pin: String, message_id: String, l_pin: String, server_date: String, message_scope_id: String, longitude: String, latitude: String, description: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.UPDATE_CTEXT;
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.MESSAGE_ID] = message_id
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = f_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.SERVER_DATE] = server_date
+        tmessage.mBodies[CoreMessage_TMessageKey.MESSAGE_SCOPE_ID] = message_scope_id
+        tmessage.mBodies[CoreMessage_TMessageKey.STATUS] = "8"
+        tmessage.mBodies[CoreMessage_TMessageKey.LATITUDE] = latitude
+        tmessage.mBodies[CoreMessage_TMessageKey.LONGITUDE] = longitude
+        tmessage.mBodies[CoreMessage_TMessageKey.DESCRIPTION] = description
+        return tmessage
+    }
+    
+    public static func getListFollowing(l_pin: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_LIST_FOLLOWING
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        return tmessage
+    }
+    
+    public static func getBlock(l_pin: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_BLOCK
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        return tmessage
+    }
+    
+    public static func getUnBlock(l_pin: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_UNBLOCK
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        return tmessage
+    }
+    
+    public static func getOpenGroups(p_account: String, offset:String, search:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_OPEN_GROUPS
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.FILTER_ACCOUNT] = p_account
+        tmessage.mBodies[CoreMessage_TMessageKey.OFFSET] = offset
+        tmessage.mBodies[CoreMessage_TMessageKey.MESSAGE_TEXT] = search
+        return tmessage
+    }
+    
+    public static func sendOTPMSISDN(p_pin: String, msisdn: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEND_SIGNUP_MSISDN
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = p_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.MSISDN] = msisdn
+        return tmessage
+    }
+    
+    public static func verifyOTP(p_pin: String, msisdn: String, otp: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.VERIFY_OTP
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = p_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.MSISDN] = msisdn
+        tmessage.mBodies[CoreMessage_TMessageKey.OTP] = otp
+        return tmessage
+    }
+    
+    public static func signInOTP(p_pin: String, f_name: String, l_name: String, thumb_id: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEND_SIGNIN_OTP
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = p_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = p_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.FIRST_NAME] = f_name
+        tmessage.mBodies[CoreMessage_TMessageKey.LAST_NAME] = l_name
+        tmessage.mBodies[CoreMessage_TMessageKey.THUMB_ID] = thumb_id
+        return tmessage
+    }
+    
+    public static func getSendOTPLogin(p_email: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEND_OTP_LOGIN
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.EMAIL] = p_email
+        tmessage.mBodies[CoreMessage_TMessageKey.ANDROID_APP_NAME] = UCUtils.getAppNm()
+        tmessage.mBodies[CoreMessage_TMessageKey.CPAAS_VERSION] = UCUtils.CPAAS_VERSION
+        return tmessage
+    }
+
+    public static func getSendVerifyChangeDevice(p_email: String, p_vercode: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEND_VERIFY_LOGIN
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.EMAIL] = p_email
+        tmessage.mBodies[CoreMessage_TMessageKey.OTP] = p_vercode
+        return tmessage;
+    }
+    
+    public static func getChangePersonMSISDN(msisdn: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.CHANGE_PERSON_INFO
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.MSISDN] = msisdn
+        return tmessage
+    }
+    
+    public static func sendOTPChangeMSISDN(msisdn: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEND_CHANGE_MSISDN
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.MSISDN] = msisdn
+        return tmessage
+    }
+    
+    public static func drawWhiteboard(l_pin: String, x: String, y: String, w: String, h: String, fc: String, sw: String, xo: String, yo: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.DRAW_WHITEBOARD
+        tmessage.mPIN = me
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies["x"] = x
+        tmessage.mBodies["y"] = y
+        tmessage.mBodies["w"] = w
+        tmessage.mBodies["h"] = h
+        tmessage.mBodies["fc"] = fc
+        tmessage.mBodies["sw"] = sw
+        tmessage.mBodies["xo"] = xo
+        tmessage.mBodies["yo"] = yo
+        return tmessage
+    }
+    
+    public static func getApnToken(token: String, callToken: String, fPin: String) -> TMessage {
+        let tmessage = TMessage();
+        tmessage.mCode = CoreMessage_TMessageCode.APN_TOKEN;
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID();
+        tmessage.mPIN = fPin
+        tmessage.mBodies[CoreMessage_TMessageKey.APN_TOKEN] = token;
+        tmessage.mBodies[CoreMessage_TMessageKey.CALL_TOKEN] = callToken;
+        return tmessage;
+    }
+    
+    public static func getCreateSubGroup(group_id: String, group_name: String, parent_id: String, level: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.CREATE_SUB_GROUP
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.GROUP_ID] = group_id
+        tmessage.mBodies[CoreMessage_TMessageKey.GROUP_NAME] = group_name
+        tmessage.mBodies[CoreMessage_TMessageKey.PARENT_ID] = parent_id
+        tmessage.mBodies[CoreMessage_TMessageKey.LEVEL] = level
+        return tmessage
+    }
+    
+    public static func checkPassword(password: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.CHECK_PSWD
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.PSWD] = password
+        return tmessage
+    }
+    
+    public static func getSendLoginEmail(email: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEND_LOGIN_EMAIL
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.EMAIL] = email
+        return tmessage
+    }
+    
+    public static func getVerificationEmail(email: String, token:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEND_VERIFICATION
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.EMAIL] = email
+        tmessage.mBodies[CoreMessage_TMessageKey.TOKEN] = token
+        return tmessage
+    }
+    
+    public static func getListSchool(keyword: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_LIST_SCHOOL
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.NAME] = keyword
+        return tmessage
+    }
+    public static func getUpdateUser(msisdn: String,email: String,name: String, image:String, role: String,password:String,data:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.UPDATE_USER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.MSISDN] = msisdn
+        tmessage.mBodies[CoreMessage_TMessageKey.EMAIL] = email
+        tmessage.mBodies[CoreMessage_TMessageKey.FIRST_NAME] = name
+        tmessage.mBodies[CoreMessage_TMessageKey.THUMB_ID] = image
+        tmessage.mBodies[CoreMessage_TMessageKey.CATEGORY_FLAG] = role
+        tmessage.mBodies[CoreMessage_TMessageKey.PSWD] = password
+        if (role != "1"){
+            tmessage.mBodies[CoreMessage_TMessageKey.DATA] = data
+        }
+        return tmessage
+    }
+    public static func getRequestStudent(form_id: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_REQUEST_STUDENT
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.FORM_ID] = form_id
+        return tmessage
+    }
+    public static func getRequestTeacher(form_id: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_REQUEST_TEACHER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.FORM_ID] = form_id
+        return tmessage
+    }
+    public static func getApproveRequestStudent(form_id: String, l_pin:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.APPROVE_REQUEST_STUDENT
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.FORM_ID] = form_id
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        return tmessage
+    }
+    public static func getApproveRequestTeacher(form_id: String, l_pin:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.APPROVE_REQUEST_TEACHER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.FORM_ID] = form_id
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        return tmessage
+    }
+    
+    public static func requestStudent(f_pin:String,school_id: String,group_id:String,email: String,name: String, l_pin:String, msisdn: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.REQUEST_STUDENT
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = f_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.SCHOOL_ID] = school_id
+        tmessage.mBodies[CoreMessage_TMessageKey.GROUP_ID] = group_id
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.REAL_NAME] = name
+        tmessage.mBodies[CoreMessage_TMessageKey.EMAIL] = email
+        tmessage.mBodies[CoreMessage_TMessageKey.MSISDN] = msisdn
+        return tmessage
+    }
+    
+    public static func requestApprovalTeacher(f_pin: String,l_pin: String, school_id:String, level: String,stage:String,major:String, type:String, className:String,email:String,name:String, msisdn: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.REQUEST_TEACHER_SCHOOL
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = f_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.MSISDN] = msisdn
+        tmessage.mBodies[CoreMessage_TMessageKey.EMAIL] = email
+        tmessage.mBodies[CoreMessage_TMessageKey.REAL_NAME] = name
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.SCHOOL_ID] = school_id
+        tmessage.mBodies[CoreMessage_TMessageKey.LEVEL] = level
+        tmessage.mBodies[CoreMessage_TMessageKey.EDU_STAGE] = stage
+        tmessage.mBodies[CoreMessage_TMessageKey.MAJOR_EDU] = major
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = type
+        tmessage.mBodies[CoreMessage_TMessageKey.ANDROID_CLASS_NAME] = className
+        return tmessage
+    }
+    public static func getListSchool() -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_LIST_SCHOOL
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        return tmessage
+    }
+    public static func getListClassName(school_id: String,level: String, major:String, class_type: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_LIST_CLASS_NAME
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.SCHOOL_ID] = school_id
+        tmessage.mBodies[CoreMessage_TMessageKey.LEVEL] = level
+        tmessage.mBodies[CoreMessage_TMessageKey.MAJOR_EDU] = major
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = class_type
+        return tmessage
+    }
+    
+    public static func updateUser(msisdn: String,email: String,name: String, image:String, role: Int, password: String, data: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.UPDATE_USER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.MSISDN] = msisdn
+        tmessage.mBodies[CoreMessage_TMessageKey.EMAIL] = email
+        tmessage.mBodies[CoreMessage_TMessageKey.FIRST_NAME] = name
+        tmessage.mBodies[CoreMessage_TMessageKey.THUMB_ID] = image
+        tmessage.mBodies[CoreMessage_TMessageKey.CATEGORY_FLAG] = "\(role)"
+        tmessage.mBodies[CoreMessage_TMessageKey.PSWD] = password
+        if(role != 1){
+            tmessage.mBodies[CoreMessage_TMessageKey.DATA] = data
+        }
+        return tmessage
+    }
+    
+    public static func submitSchool(f_pin: String,schoolId: String, schoolName:String, level: String, eduStage: String, p_class_type: String, major: String, p_class_name: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SUBMIT_SCHOOL
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = f_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = f_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.SCHOOL_ID] = schoolId
+        tmessage.mBodies[CoreMessage_TMessageKey.SCHOOL_DESC] = schoolName
+        tmessage.mBodies[CoreMessage_TMessageKey.LEVEL] = level
+        tmessage.mBodies[CoreMessage_TMessageKey.EDU_STAGE] = eduStage
+        tmessage.mBodies[CoreMessage_TMessageKey.MAJOR_EDU] = major
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = p_class_type
+        tmessage.mBodies[CoreMessage_TMessageKey.ANDROID_CLASS_NAME] = p_class_name
+        return tmessage
+    }
+    
+    public static func deletePost(post_id:String, last_update:String, ec_date:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.DELETE_POST
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.LAST_UPDATE] = last_update
+        tmessage.mBodies[CoreMessage_TMessageKey.EC_DATE] = ec_date
+        tmessage.mBodies[CoreMessage_TMessageKey.POST_ID] = post_id
+        return tmessage
+    }
+    
+    public static func getIsInitiatorJoin(p_broadcaster:String, p_category:String, blog_id:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.IS_INITIATOR_JOIN
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.BROADCAST_ID] = p_broadcaster
+        tmessage.mBodies[CoreMessage_TMessageKey.CATEGORY_ID] = p_category
+        tmessage.mBodies[CoreMessage_TMessageKey.BLOG_ID] = blog_id
+        return tmessage
+    }
+    
+    public static func getStartLPInvited(title:String, type:String,typeValue:String,category:String,blog_id:String, tagline: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.START_LP_INVITED
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.TITLE] = title
+        tmessage.mBodies[CoreMessage_TMessageKey.BROADCAST_FLAG] = type
+        tmessage.mBodies[CoreMessage_TMessageKey.VALUE] = type
+        tmessage.mBodies[CoreMessage_TMessageKey.CATEGORY_ID] = category
+        tmessage.mBodies[CoreMessage_TMessageKey.BLOG_ID] = blog_id
+        tmessage.mBodies[CoreMessage_TMessageKey.TAGLINE] = tagline
+        return tmessage
+    }
+    
+    public static func getStartSeminarInvited(title:String, type:String,typeValue:String,category:String,blog_id:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEMINAR_START_INVITED
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.TITLE] = title
+        tmessage.mBodies[CoreMessage_TMessageKey.BROADCAST_FLAG] = type
+        tmessage.mBodies[CoreMessage_TMessageKey.VALUE] = type
+        tmessage.mBodies[CoreMessage_TMessageKey.CATEGORY_ID] = category
+        tmessage.mBodies[CoreMessage_TMessageKey.BLOG_ID] = blog_id
+        return tmessage
+    }
+    
+    public static func getListSubAccount() -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SUB_ACCOUNT_LIST
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        return tmessage
+    }
+    public static func getQuizDetail(post_id:String,lpin:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.QUIZ_DETAIL
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = lpin
+        tmessage.mBodies[CoreMessage_TMessageKey.POST_ID] = post_id
+        return tmessage
+    }
+    
+    public static func getQuizAnswer(post_id:String,data:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.QUIZ_ANSWER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.DATA] = data
+        tmessage.mBodies[CoreMessage_TMessageKey.POST_ID] = post_id
+        return tmessage
+    }
+    
+    public static func getQuizScoring(score:String,post_id:String,lpin:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.QUIZ_SCORING
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = lpin
+        tmessage.mBodies[CoreMessage_TMessageKey.POST_ID] = post_id
+        tmessage.mBodies[CoreMessage_TMessageKey.SCORE] = score
+        return tmessage
+    }
+    
+    public static func getRequestCallCenter(p_channel:Int, category_id: String = "") -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.REQUEST_CALL_CENTER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.CHANNEL] = "\(p_channel)"
+        tmessage.mBodies[CoreMessage_TMessageKey.BUSINESS_ENTITY] = ""
+        if !category_id.isEmpty{
+            tmessage.mBodies[CoreMessage_TMessageKey.CATEGORY_ID] = category_id
+        }
+        return tmessage
+    }
+    
+    public static func getRequestEmailCallCenter(p_channel:Int) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.EMAIL_CONTACT_CENTER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.CHANNEL] = "\(p_channel)"
+        return tmessage
+    }
+    
+    public static func acceptRequestCallCenter(channel:String, l_pin: String, complaint_id: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.ACCEPT_CALL_CENTER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.CHANNEL] = channel
+        tmessage.mBodies[CoreMessage_TMessageKey.CALL_CENTER_ID] = complaint_id
+        return tmessage
+    }
+    
+    public static func endCallCenter(complaint_id:String, l_pin: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.END_CALL_CENTER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.DATA] = complaint_id
+        return tmessage
+    }
+    
+    public static func getFeatureAccess(key: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.FEATURE_ACCESS
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.KEY] = key
+        return tmessage
+    }
+    
+    public static func getListLS() -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageKey.GET_LIST_LS
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        return tmessage
+    }
+    
+    public static func broadcastMessage(title:String, broadcast_flag: String, message:String, starting_date: Int64, ending_date: Int64, destination:String, data: String, category_flag:String, notification_type: String, link:String, thumb_id: String, file_id:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.BROADCAST_MESSAGE
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.TITLE] = title
+        tmessage.mBodies[CoreMessage_TMessageKey.BROADCAST_FLAG] = broadcast_flag
+        tmessage.mBodies[CoreMessage_TMessageKey.MESSAGE_TEXT_ENG] = message
+        tmessage.mBodies[CoreMessage_TMessageKey.MESSAGE_TEXT] = message
+        tmessage.mBodies[CoreMessage_TMessageKey.START_DATE] = "\(starting_date)"
+        tmessage.mBodies[CoreMessage_TMessageKey.END_DATE] = "\(ending_date)"
+        tmessage.mBodies[CoreMessage_TMessageKey.TARGET_CONTENT] = destination
+        tmessage.mBodies[CoreMessage_TMessageKey.DATA] = data
+        tmessage.mBodies[CoreMessage_TMessageKey.CATEGORY_FLAG] = category_flag
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = notification_type
+        tmessage.mBodies[CoreMessage_TMessageKey.LINK] = link
+        if (!thumb_id.isEmpty) {
+            tmessage.mBodies[CoreMessage_TMessageKey.THUMB_ID] = thumb_id
+        }
+        if (!file_id.isEmpty) {
+            tmessage.mBodies[CoreMessage_TMessageKey.FILE_ID] = file_id
+        }
+        return tmessage
+    }
+    
+    public static func timeOutRequestCallCenter(channel:String, l_pin: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.TIMEOUT_CONTACT_CENTER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.CHANNEL] = channel
+        return tmessage
+    }
+    
+    public static func getManagementContactCenter(user_type:String, l_pin: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.MANAGEMENT_CONTACT_CENTER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = user_type
+        return tmessage
+    }
+    
+    public static func getManagementContactCenterBNI(l_pin: String, type: String, category_id: String, area_id: String, is_second_layer: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.MANAGEMENT_CONTACT_CENTER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = tmessage.mPIN
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = type
+        tmessage.mBodies[CoreMessage_TMessageKey.CATEGORY_ID] = category_id
+        tmessage.mBodies[CoreMessage_TMessageKey.WORKING_AREA] = area_id
+        tmessage.mBodies[CoreMessage_TMessageKey.IS_SECOND_LAYER] = is_second_layer
+        return tmessage
+    }
+    
+    public static func getSignInApiCreator(p_name:String, p_password: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SIGN_IN_API_CREATOR
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.NAME] = p_name
+        tmessage.mBodies[CoreMessage_TMessageKey.PSWD] = p_password
+        tmessage.mBodies[CoreMessage_TMessageKey.ANDROID_ID] = UCUtils.M_USER_ANDROID_ID
+        return tmessage
+    }
+    
+    public static func getSignInApiAdmin(p_name:String, p_password: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SIGN_IN_API_ADMIN
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.NAME] = p_name
+        tmessage.mBodies[CoreMessage_TMessageKey.PSWD] = p_password
+        tmessage.mBodies[CoreMessage_TMessageKey.ANDROID_ID] = UCUtils.M_USER_ANDROID_ID
+        return tmessage
+    }
+    
+    public static func getSignInApiInternal(p_name:String, p_password: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SIGN_IN_API_INTERNAL
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.NAME] = p_name
+        tmessage.mBodies[CoreMessage_TMessageKey.PSWD] = p_password
+        tmessage.mBodies[CoreMessage_TMessageKey.ANDROID_ID] = UCUtils.M_USER_ANDROID_ID
+        return tmessage
+    }
+    
+    public static func getChangePasswordAdmin(p_f_pin:String, pwd_en: String, pwd_old: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.CHANGE_PSWD_ADMIN
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = p_f_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.PSWD] = pwd_en
+        tmessage.mBodies[CoreMessage_TMessageKey.PSWD_OLD] = pwd_old
+        return tmessage
+    }
+    
+    public static func getChangePasswordInternal(p_f_pin:String, pwd_en: String, pwd_old: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.CHANGE_PSWD_INTERNAL
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = p_f_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.PSWD] = pwd_en
+        tmessage.mBodies[CoreMessage_TMessageKey.PSWD_OLD] = pwd_old
+        return tmessage
+    }
+    
+    public static func getQueuingCallCenter(p_channel:Int) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.QUEUING_CONTACT_CENTER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.CHANNEL] = "\(p_channel)"
+        return tmessage
+    }
+    
+    public static func getStatusContactCenter(p_complaint_id:String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.STATUS_CONTACT_CENTER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.DATA] = p_complaint_id
+        return tmessage
+    }
+    
+    public static func getListDiscussion(p_last_seq: String, keyword: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_LIST_DISCUSSION
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.LAST_SEQUENCE] = p_last_seq
+        tmessage.mBodies[CoreMessage_TMessageKey.DESCRIPTION] = keyword
+        return tmessage
+    }
+    
+    public static func getDiscussionComment(p_discussion_id: String) -> TMessage {
+        let me = UserDefaults.standard.string(forKey: "me")!
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_DISCUSSION_COMMENT
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey._ID] = p_discussion_id
+        return tmessage
+    }
+    
+    public static func getSendDiscussionComment(p_pin: String, discussion_id: String, comment: String, comment_id: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SEND_DISCUSSION_COMMENT
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = p_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = p_pin
+        tmessage.mBodies[CoreMessage_TMessageKey._ID] = discussion_id
+        tmessage.mBodies[CoreMessage_TMessageKey.COMMENT] = comment
+        tmessage.mBodies[CoreMessage_TMessageKey.COMMENT_ID] = comment_id
+        return tmessage
+    }
+    
+    public static func getSendLeaveComment(discussion_id: String) -> TMessage {
+        let tmessage = TMessage()
+        let me = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mCode = CoreMessage_TMessageCode.LEAVE_DISCUSSION_COMMENT
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey._ID] = discussion_id
+        return tmessage
+    }
+    
+    // FORM
+    
+    public static func getFormList(p_pin: String, p_last_id: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.REQUEST_FORM_LIST
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = p_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.FORM_ID] = p_last_id
+        tmessage.mBodies[CoreMessage_TMessageKey.ACTVITY_SUB] = "0"
+//        tmessage.mBodies[CoreMessage_TMessageKey.BUSINESS_ENTITY] = "74"
+        return tmessage
+    }
+    
+//    public static TMessage getFormList(String p_pin, String p_last_id) {
+//            TMessage tmessage = new TMessage();
+//            tmessage.mCode = CoreMessage_TMessageCode.REQUEST_FORM_LIST;
+//            tmessage.mStatus = CoreMessage_TMessageUtil.getTID();
+//            tmessage.mPIN = p_pin;
+//            tmessage.mBodies.put(CoreMessage_TMessageKey.FORM_ID, p_last_id);
+//            tmessage.mBodies.put(CoreMessage_TMessageKey.ACTVITY_SUB, CoreDataSqlite_PullDB.getLastPull(CoreDataSqlite_PullDB.PULL_TYPE_SUB_ACTIVITY));
+//            tmessage.mBodies.put(CoreMessage_TMessageKey.BUSINESS_ENTITY, SharedObj.getCurrentlyMerchant(Qmera.getContext()));
+//            return tmessage;
+//        }
+    
+    public static func getSendOTPChangeProfile(name: String, type: String) -> TMessage {
+        let tmessage = TMessage()
+        let me = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mCode = CoreMessage_TMessageCode.SEND_OTP_CHANGE_PROFILE
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.OTP] = "99"
+        tmessage.mBodies[CoreMessage_TMessageKey.EMAIL] = "nexiilis_email"
+        tmessage.mBodies[CoreMessage_TMessageKey.NAME] = name
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = type
+        return tmessage
+    }
+    
+    public static func getSendOTPChangeDeviceGaspol(p_email: String, p_idnumber: String, p_vercode: String) -> TMessage {
+        let tmessage = TMessage()
+        let me = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mCode = CoreMessage_TMessageCode.SEND_OTP_CHANGE_DEVICE_GASPOL
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.OTP] = p_vercode
+        tmessage.mBodies[CoreMessage_TMessageKey.EMAIL] = p_email
+        tmessage.mBodies[CoreMessage_TMessageKey.USER_ID] = p_idnumber
+        return tmessage
+    }
+    
+    public static func getSendVerifyChangeDevice(p_pin: String) -> TMessage {
+        let tmessage = TMessage()
+        let me = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mCode = CoreMessage_TMessageCode.SEND_VERIFY_CHANGE_DEVICE
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = p_pin
+        return tmessage
+    }
+    
+    public static func getChangePersonInfo_New(p_f_pin: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.CHANGE_PERSON_INFO
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = p_f_pin
+        return tmessage
+    }
+    
+    public static func getSendEmotionLP(p_pin: String, l_pin: String, emotion_type: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.LIVE_PROFILE_EMOTION_SEND
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = p_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = p_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = emotion_type
+        return tmessage;
+    }
+    
+    public static func getCCRoomIsActive(ticket_id: String) -> TMessage {
+        let tmessage = TMessage()
+        let me = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mCode = CoreMessage_TMessageCode.IS_ACTIVE_CALL_CONTACT_CENTER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.CALL_CENTER_ID] = ticket_id
+        return tmessage
+    }
+
+    public static func getCCRoomInvite(l_pin: String, ticket_id: String, channel: String) -> TMessage {
+        let tmessage = TMessage()
+        let me = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mCode = CoreMessage_TMessageCode.INVITE_TO_ROOM_CONTACT_CENTER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.CALL_CENTER_ID] = ticket_id
+        tmessage.mBodies[CoreMessage_TMessageKey.CHANNEL] = channel
+        return tmessage
+    }
+
+    public static func acceptCCRoomInvite(l_pin: String, type: Int, ticket_id: String) -> TMessage {
+        let tmessage = TMessage()
+        let me = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mCode = CoreMessage_TMessageCode.ACCEPT_CONTACT_CENTER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = "\(type)"
+        tmessage.mBodies[CoreMessage_TMessageKey.CALL_CENTER_ID] = ticket_id
+        return tmessage
+    }
+
+    public static func leaveCCRoomInvite(ticket_id: String) -> TMessage {
+        let tmessage = TMessage()
+        let me = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mCode = CoreMessage_TMessageCode.INVITE_EXIT_CONTACT_CENTER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.CALL_CENTER_ID] = ticket_id
+        return tmessage
+    }
+
+    public static func getCallCenterDraw(ticket_id: String) -> TMessage {
+        let tmessage = TMessage()
+        let me = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mCode = CoreMessage_TMessageCode.DRAW_CONTACT_CENTER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = tmessage.mPIN
+        tmessage.mBodies[CoreMessage_TMessageKey.CALL_CENTER_ID] = ticket_id
+        return tmessage
+    }
+    
+    public static func getWebLoginQRCode(f_qrcode: String) -> TMessage {
+        let tmessage = TMessage()
+        let me = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mCode = CoreMessage_TMessageCode.WEB_LOGIN_QR
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = me
+        tmessage.mBodies[CoreMessage_TMessageKey.KEY] = f_qrcode
+        return tmessage
+    }
+    
+    public static func getFormApproval(p_f_pin: String, p_ref_id: String, p_approve: String, p_note: String, p_sign: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.APPROVE_FORM
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID();
+        tmessage.mPIN = p_f_pin;
+        tmessage.mBodies[CoreMessage_TMessageKey.REF_ID] = p_ref_id
+        tmessage.mBodies[CoreMessage_TMessageKey.STATUS] = p_approve
+        tmessage.mBodies[CoreMessage_TMessageKey.NOTE] = p_note
+        tmessage.mBodies[CoreMessage_TMessageKey.SIGN] = p_sign
+        return tmessage
+    }
+    
+    public static func pullGroupCategory() -> TMessage {
+        let tmessage = TMessage()
+        let me = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mCode = CoreMessage_TMessageCode.PULL_GROUP_CATEGORY
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        return tmessage
+    }
+    
+    public static func pullFloatingButton() -> TMessage {
+        let tmessage = TMessage()
+        let me = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mCode = CoreMessage_TMessageCode.PULL_FLOATING_BUTTON
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        return tmessage
+    }
+    
+    public static func getServiceBNI(p_pin: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_SERVICE_BNI
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = p_pin
+        return tmessage
+    }
+
+    public static func queueBNI(service_id: String) -> TMessage {
+        let tmessage = TMessage()
+        let me = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mCode = CoreMessage_TMessageCode.REQUEST_TICKET_BNI
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.CATEGORY_ID] = service_id
+        return tmessage
+    }
+
+    public static func isiPulsaBNI(value: String) -> TMessage {
+        let tmessage = TMessage()
+        let me = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mCode = CoreMessage_TMessageCode.REQUEST_TOP_UP_BNI
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.VALUE] = value
+        return tmessage
+    }
+    
+    public static func getCustomerInfo(rek: String) -> TMessage {
+        let tmessage = TMessage()
+        let me = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mCode = CoreMessage_TMessageCode.GET_CUSTOMER_INFO
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.CARD_ID] = rek
+        return tmessage
+    }
+    
+    public static func getRequestSecondContactCenter(p_channel: String, category_id: String, area_id: String) -> TMessage {
+        let tmessage = TMessage()
+        let me = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mCode = CoreMessage_TMessageCode.REQUEST_SECOND_CONTACT_CENTER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.CHANNEL] = p_channel
+        tmessage.mBodies[CoreMessage_TMessageKey.BUSINESS_ENTITY] = ""
+        tmessage.mBodies[CoreMessage_TMessageKey.CATEGORY_ID] = category_id
+        tmessage.mBodies[CoreMessage_TMessageKey.WORKING_AREA] = area_id
+        return tmessage;
+    }
+
+    public static func respondSecondContactCenter(l_pin: String, type: String, ticket_id: String) -> TMessage {
+        let tmessage = TMessage()
+        let me = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mCode = CoreMessage_TMessageCode.RESPOND_SECOND_CONTACT_CENTER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = type
+        tmessage.mBodies[CoreMessage_TMessageKey.CALL_CENTER_ID] = ticket_id
+        return tmessage;
+    }
+
+    public static func getWorkingAreaContactCenter() -> TMessage {
+        let tmessage = TMessage()
+        let me = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mCode = CoreMessage_TMessageCode.GET_WORKING_AREA_CONTACT_CENTER
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = me
+        return tmessage
+    }
+    
+    public static func getInquiry(message_id: String, error_code: String, data: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.INQUIRY
+        tmessage.mStatus = message_id
+        tmessage.mPIN = "-1"
+        tmessage.mBodies[CoreMessage_TMessageKey._ID] = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.MESSAGE_ID] = message_id
+        tmessage.mBodies[CoreMessage_TMessageKey.ERRCOD] = error_code
+        tmessage.mBodies[CoreMessage_TMessageKey.DATA] = data
+        return tmessage
+    }
+
+    public static func getMobileInquiry(message_id: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.MOBILE_INQUIRY;
+        tmessage.mStatus = message_id
+        tmessage.mPIN = "-1";
+        tmessage.mBodies[CoreMessage_TMessageKey._ID] = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.MESSAGE_ID] = message_id
+        return tmessage
+    }
+    
+    public static func getSignUpSignInAPI(p_name: String, p_password: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SIGN_UP_AND_SIGN_IN_API
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.NAME] = p_name
+        tmessage.mBodies[CoreMessage_TMessageKey.PSWD] = p_password
+        tmessage.mBodies[CoreMessage_TMessageKey.ANDROID_ID] = UCUtils.M_USER_ANDROID_ID
+        tmessage.mBodies[CoreMessage_TMessageKey.ANDROID_APP_NAME] = UCUtils.getAppNm()
+        tmessage.mBodies[CoreMessage_TMessageKey.CPAAS_VERSION] = UCUtils.CPAAS_VERSION
+        return tmessage
+    }
+    
+    public static func getBackupAvailability() -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode    = CoreMessage_TMessageCode.BACKUP_AVAILABILITY
+        tmessage.mStatus  = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN     = UserDefaults.standard.string(forKey: "me")!
+        return tmessage
+    }
+    
+    public static func getBackupUploaded(option: String, fileid: String, filesize: String, recordSize: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode    = CoreMessage_TMessageCode.BACKUP_UPLOADED
+        tmessage.mStatus  = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN     = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] =  option
+        tmessage.mBodies[CoreMessage_TMessageKey.FILE_ID] = fileid
+        tmessage.mBodies[CoreMessage_TMessageKey.FILE_SIZE] = filesize
+        tmessage.mBodies[CoreMessage_TMessageKey.CREATED_DATE] = "\(Date().currentTimeMillis())"
+        tmessage.mBodies[CoreMessage_TMessageKey.RECORD_SIZE] = recordSize
+        return tmessage
+    }
+    
+    public static func getBackupRestored(option: String , fileid: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode    = CoreMessage_TMessageCode.BACKUP_RESTORED
+        tmessage.mStatus  = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN     = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = option
+        tmessage.mBodies[CoreMessage_TMessageKey.FILE_ID] = fileid
+        return tmessage
+    }
+    
+    public static func wbCreate(l_pin: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.FORWARD_MESSAGE
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = "wb"
+        tmessage.mBodies[CoreMessage_TMessageKey.STATUS] = "\(CoreMessage_TMessageCode.WB_INCOMING)"
+        return tmessage;
+    }
+    
+    public static func wbAccept(l_pin: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.FORWARD_MESSAGE
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = "wb"
+        tmessage.mBodies[CoreMessage_TMessageKey.STATUS] = "\(CoreMessage_TMessageCode.WB_ACCEPT_INCOMING)"
+        return tmessage;
+    }
+    
+    public static func wbReject(l_pin: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.FORWARD_MESSAGE
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = "wb"
+        tmessage.mBodies[CoreMessage_TMessageKey.STATUS] = "\(CoreMessage_TMessageCode.WB_REJECT_INCOMING)"
+        return tmessage;
+    }
+    
+    public static func wbOffhook(l_pin: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.FORWARD_MESSAGE
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = "wb"
+        tmessage.mBodies[CoreMessage_TMessageKey.STATUS] = "\(CoreMessage_TMessageCode.WB_OFFHOOK)"
+        return tmessage;
+    }
+    
+    public static func wbEnded(l_pin: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.FORWARD_MESSAGE
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = "wb"
+        tmessage.mBodies[CoreMessage_TMessageKey.STATUS] = "\(CoreMessage_TMessageCode.WB_END)"
+        return tmessage;
+    }
+    
+    public static func ssCreate(l_pin: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.FORWARD_MESSAGE
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = "ss"
+        tmessage.mBodies[CoreMessage_TMessageKey.STATUS] = "\(CoreMessage_TMessageCode.SS_INCOMING)"
+        return tmessage;
+    }
+    
+    public static func ssAccept(l_pin: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.FORWARD_MESSAGE
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = "ss"
+        tmessage.mBodies[CoreMessage_TMessageKey.STATUS] = "\(CoreMessage_TMessageCode.SS_ACCEPT_INCOMING)"
+        return tmessage;
+    }
+    
+    public static func ssReject(l_pin: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.FORWARD_MESSAGE
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = "ss"
+        tmessage.mBodies[CoreMessage_TMessageKey.STATUS] = "\(CoreMessage_TMessageCode.SS_REJECT_INCOMING)"
+        return tmessage;
+    }
+    
+    public static func ssOffhook(l_pin: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.FORWARD_MESSAGE
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = "ss"
+        tmessage.mBodies[CoreMessage_TMessageKey.STATUS] = "\(CoreMessage_TMessageCode.SS_OFFHOOK)"
+        return tmessage;
+    }
+    
+    public static func ssEnded(l_pin: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.FORWARD_MESSAGE
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = l_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = "ss"
+        tmessage.mBodies[CoreMessage_TMessageKey.STATUS] = "\(CoreMessage_TMessageCode.SS_END)"
+        return tmessage;
+    }
+    
+    public static func getSimplePersonInfoWA(f_pin: String) -> TMessage{
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_SIMPLE_PERSON_INFO
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = f_pin
+        tmessage.mBodies[CoreMessage_TMessageKey.STATUS] = "1"
+        return tmessage
+    }
+    
+    public static func getServiceBank() -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_SERVICE_BNI
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.PLATFORM] = "0"
+        return tmessage
+    }
+    
+    public static func getIncomingCallCS(f_pin_opposite: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.INCOMING_CALL_CC
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = f_pin_opposite
+        return tmessage
+    }
+
+    public static func getEndCall(f_pin_opposite: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.END_CALL
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = f_pin_opposite
+        return tmessage;
+    }
+    
+    public static func pullGroupNoMember() -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_BATCH_GROUP_NO_MEMBERS
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        return tmessage
+    }
+    
+    public static func getCalling(fPin: String, type: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.CALLING
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UCUtils.getMyPin() ?? ""
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = fPin
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = type
+        return tmessage
+    }
+
+    public static func getNotifyCalling(fPin: String, lPin: String, type: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.NOTIFY_TO_CALLING
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UCUtils.getMyPin() ?? ""
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = fPin
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = type
+        tmessage.mBodies[CoreMessage_TMessageKey.L_PIN] = lPin
+        return tmessage
+    }
+
+    public static func getCancelCall(fPin: String, type: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.CANCEL_CALL_NOTIFICATION
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UCUtils.getMyPin() ?? ""
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = fPin
+        tmessage.mBodies[CoreMessage_TMessageKey.TYPE] = type
+        return tmessage
+    }
+    
+    public static func getFeatureAccessAll() -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.FEATURE_ACCESS_ALL
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UCUtils.getMyPin() ?? ""
+        return tmessage
+    }
+    
+    public static func getAlertNewSignIn(brand: String, latitude: String, longitude: String ) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.ALERT_NEW_SIGN_IN
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UCUtils.getMyPin() ?? ""
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = UCUtils.getLoginMultipleFPin()
+        tmessage.mBodies[CoreMessage_TMessageKey.DEVICE_BRAND] = brand
+        tmessage.mBodies[CoreMessage_TMessageKey.LATITUDE] = latitude
+        tmessage.mBodies[CoreMessage_TMessageKey.LONGITUDE] = longitude
+        tmessage.mBodies[CoreMessage_TMessageKey.LOCAL_TIMESTAMP] = "\(Date().currentTimeMillis())"
+        return tmessage
+    }
+    
+    public static func getBlockAccess(userId: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.BLOCK_ACCESS
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UCUtils.getMyPin() ?? ""
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = userId
+        return tmessage
+    }
+    
+    public static func getShieldSecurityValidateToken(token: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SHIELD_SECURITY_VALIDATE_TOKEN
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UCUtils.getMyPin() ?? ""
+        tmessage.mBodies[CoreMessage_TMessageKey.F_PIN] = UCUtils.getLoginMultipleFPin()
+        tmessage.mBodies[CoreMessage_TMessageKey.TOKEN] = token
+        return tmessage
+    }
+    
+    public static func getUpdateLiveVideo(pTitle: String, pTagline: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.UPDATE_LIVE_VIDEO
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UCUtils.getMyPin() ?? ""
+        tmessage.mBodies[CoreMessage_TMessageKey.TITLE] = pTitle
+        tmessage.mBodies[CoreMessage_TMessageKey.TAGLINE] = pTagline
+        return tmessage
+    }
+    
+    public static func backToSuperApp() -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.RESET_SUPER_APP
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UCUtils.getMyPin() ?? ""
+        return tmessage
+    }
+    
+    public static func requestGPTBot(message: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GPT
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UCUtils.getMyPin() ?? ""
+        tmessage.mBodies[CoreMessage_TMessageKey.MESSAGE_TEXT] = message
+        return tmessage
+    }
+    
+}

+ 783 - 0
appbuilder-ios/NexilisUC/NexilisUC/Source/Message/CoreMessage_TMessageCode.swift

@@ -0,0 +1,783 @@
+//
+//  CoreMessage_TMessageCode.swift
+//  NexilisUC
+//
+//  Created by Maronakins on 04/11/24.
+//
+
+import Foundation
+
+public class CoreMessage_TMessageCode {
+    
+    public static let HEART_BEAT = "H";
+    
+    public static let PUSH_INCOMING_EMAIL      = "PIM";
+    
+    public static let WEB_LOGIN_QR = "WLQR";
+    
+    public static let REQUEST_NPM                        = "B0";
+    public static let PUSH_NPM                           = "B1";
+    public static let CHANGE_USER_ID                   = "B2";
+    public static let REQUEST_BUDDIES                     = "B3";
+    public static let REQUEST_GROUPS                   = "B4";
+    public static let REQUEST_GROUP                    = "B4A";
+    public static let REQUEST_GROUPS_WITHOUT_MEMBER    = "B4B";
+    public static let REQUEST_GROUP_MEMBERZ            = "B5";
+    public static let SUBMIT_FRESH_REGISTRATION        = "B6";
+    public static let SUBMIT_EMAIL_REGISTRATION        = "B7";
+    public static let SEND_EMAIL_LOGIN_CODE             = "IH8";
+    public static let SEND_LOGIN_CODE_SIGNUP             = "B8A";
+    public static let RETRIEVE_LOGIN_SUGGEST             = "B8B";
+    public static let REQUEST_BLOGS_AT_PLACE              = "B9";
+    public static let SUBMIT_BACKDOR_REGISTRATION      = "Ba";
+    public static let SEND_EMAIL_CHANGE_CODE              = "Bb";
+    public static let PUSH_COIN                          = "Bc";
+    public static let UPDATE_TICKER                    = "Bd";
+    public static let DELETE_TICKER                    = "Be";
+    public static let DELETE_ALL_TICKER                = "Bf";
+    public static let REQUEST_STICKER_SET_LIST         = "Bg";
+    public static let REQUEST_STICKER_SET_DETAIL         = "Bh";
+    public static let REQUEST_STICKER                     = "Bi";
+    public static let PUSH_STICKER_SET_SIMPLE_DETAIL     = "Bj";
+    public static let PUSH_STICKER_SET_DETAIL             = "Bk";
+    public static let PUSH_STICKER                     = "Bl";
+    public static let REQUEST_OFFICIAL_LIST        = "Bm";
+    public static let REQUEST_OFFICIAL_DETAIL        = "Bn";
+    public static let REQUEST_OFFICIAL_BLOG        = "Bo";
+    public static let PUSH_OFFICIAL_SIMPLE_DETAIL    = "Bp";
+    public static let PUSH_OFFICIAL_DETAIL            = "Bq";
+    public static let PUSH_OFFICIAL_BLOG            = "Br";
+    public static let PUSH_TICKER_V2                 = "Bs";
+    public static let DELETE_CHATROOM                 = "Bt";
+    public static let PROFILE_VOIP                 = "Bu";
+    public static let PROFILE_VCALL                 = "Bv";
+    public static let SEND_COMMUNITY_MESSAGE        = "Bw";
+    public static let REQUEST_N_COMMUNITY_USERS    = "Bx";
+    public static let JOIN_APP                      = "By";
+    public static let LEAVE_APP                     = "Bz";
+    public static let UPDATE_EVENT                   = "BA";
+    public static let RESET_EVENT                   = "BB";
+    public static let CREATE_CHAT                   = "BC";
+    public static let UPDATE_CHAT                   = "BD";
+    public static let CHANGE_BATCH_TOPIC_INFO      = "BD01";
+    public static let CHANGE_BATCH_TOPIC_MEMBER    = "BD02";
+    public static let DELETE_CHAT                   = "BE";
+    public static let PUSH_CHAT                       = "BF";
+    public static let PUSH_DISCUSSION              = "DFR";
+    public static let PUSH_CLIENT_ADDRESS          = "PCA";
+    public static let UPLOAD_BLOG_COMMENT_V2        = "BG";
+    public static let UPDATE_BLOG_COMMENT_STATUS   = "BH";
+    public static let REQUEST_BLOG_COMMENT         = "BI";
+    public static let REQUEST_USER_ACHIEVEMENTS       = "BJ";
+    public static let PUSH_USER_ACHIEVEMENT           = "BK";
+    public static let UPDATE_USER_ACHIEVEMENTS       = "BL";
+    public static let UPLOAD_BLOG_LIKE                   = "BM";
+    public static let PUSH_BLOG_LIKE                   = "BN";
+    public static let REQUEST_SERVER_NOTIFICATION  = "BO";
+    public static let PUSH_SERVER_NOTIFICATION     = "BP";
+    public static let REQUEST_LIVE_TV              = "BQ";
+    public static let PUSH_LIVE_TV                 = "BR";
+    public static let REQUEST_LIVE_TV_LIST         = "BS";
+    public static let PUSH_CREATE_LIVEVIDEO_NOTIFICATION
+        = "BT";
+    public static let REQUEST_VOD                  = "BU";
+    public static let PUSH_CANCEL_LIVEVIDEO_NOTIFICATION
+        = "BV";
+    public static let REQUEST_SUGGESTION_LIST      = "BW";
+    public static let PUSH_SUGGESTION              = "BX";
+    public static let CHANGE_PRIVACY_FLAG          = "BY";
+    
+    public static let REQUEST_SUGGESTION_BUNDLE_LIST
+        = "BZ";
+    public static let PUSH_SUGGESTION_BUNDLE       = "C0";
+    
+    public static let SEND_UPDATE_TYPING           = "C1";
+    public static let OPEN_CLOSE_EDITOR           = "C1X";
+    public static let REQUEST_PERSON_BY_NAME       = "C11";
+    public static let SUBMIT_NAME_REGISTRATION     = "C12";
+    public static let SUBMIT_LOGIN_PIN             = "IH13";
+    public static let CHANGE_CONNECTION_ID         = "CCI";
+    public static let SUBMIT_MEMBER_REGISTRATION   = "C14";
+    public static let REQUEST_GROUPS_BY_AREA       = "C15";
+    public static let REQUEST_JOIN_GROUP             = "C16";
+    public static let SUBMIT_WISHLIST              = "C17";
+    public static let RETRIEVE_WISHLIST            = "C18";
+    public static let WALLET_TRANSFER              = "C19";
+    public static let WALLET_PUSH                  = "C20";
+    public static let JOIN_CHAT                    = "C21";
+    public static let GET_TRENDING_TOPIK           = "C22";
+    public static let DELETE_WISHLIST              = "C25";
+    public static let RETRIEVE_WISHLIST_SELF       = "C26";
+    public static let SEND_EXCEPTION = "C28";
+    public static let SEND_UPDATE_READ = "C29";
+    public static let SEND_UPDATE_READ_SINGLE = "SURS";
+    public static let PUSH_GROUP_MEMBER_BATCH = "A009A";
+    
+    
+    public static let CONNECTION_CHECK     = "A";
+    public static let CONNECTED            = "A00";
+    public static let ENTER_CELL           = "A01";
+    public static let ACKNOWLEDGMENT        = "A02";
+    public static let DISABLE_LOCATION     = "A03";
+    public static let ENABLE_LOCATION      = "A03A";
+    public static let INVALID_PIN          = "A04";
+    public static let DISCONNECTED         = "A05";
+    public static let PROCESS_NOK          = "A06";
+    public static let SEND_IPC_MESSAGE        = "A07";
+    public static let MOVED                   = "A08";
+    public static let NCKNOWLEDGMENT          = "A09";
+    public static let ONLINE                  = "A000";
+    public static let OFFLINE                 = "A999";
+    public static let AWAKE                  = "A0000";
+    public static let SLEEP                 = "A9999";
+    
+    public static let UPDATE_CTEXT              = "A002";
+    public static let DELETE_CTEXT              = "S0D";
+    public static let DELETE_CONVERSATION      = "A0021A";
+    public static let UPDATE_MESSAGE              = "A0022";
+    public static let CHANGE_PERSON_INFO       = "A003";
+    public static let ADD_BUDDY                = "A005";
+    public static let REQUEST_BUDDY               = "A0051";
+    public static let PUSH_BUDDY               = "A0052";
+    public static let REQUEST_ONLINE_BUDDIES     = "A0053";
+    public static let PUSH_ONLINE_BUDDIES         = "A0054";
+    public static let ACCEPT_BUDDY             = "A0055";
+    public static let DELETE_BUDDY                = "A006";
+    public static let CREATE_GROUP                = "A007";
+    public static let EXIT_GROUP                = "A008";
+    public static let PUSH_GROUP_MEMBER         = "A009";
+    public static let CHANGE_GROUP_INFO        = "A010";
+    public static let LOAD_MESSAGE_CACHE        = "LMC";
+    
+    public static let ADD_MEMBER             = "A011";
+    public static let PUSH_GROUP           = "A012";
+    public static let PUSH_GROUP_A         = "A012A";
+    public static let CHANGE_LOCATION      = "A013";
+    public static let SUBMIT_REGISTRATION  = "A014";
+    public static let UPLOAD_TICKER        = "A015";
+    public static let PUSH_TICKER          = "A016";
+    public static let INIT_PAYMENT         = "A017";
+    public static let PUSH_PAYMENT         = "A018";
+    public static let CHOOSE_PAYMENT       = "A019";
+    public static let UPLOAD_SVIDEO        = "A020";
+    
+    //    public static let FOLLOW_BUDDY         = "A021";
+    //    public static let UNFOLLOW_BUDDY       = "A022";
+    public static let UPLOAD_IMAGE_TICKER  = "A023";
+    public static let CHANGE_TIMEZONE      = "A024";
+    public static let UPLOAD_BLOG              = "A025";
+    public static let ADD_INVITATION          = "A026";
+    public static let REQUEST_REFERRERS    = "A027";
+    public static let PUSH_REFERRER          = "A028";
+    public static let CHOOSE_REFERRER      = "A029";
+    
+    public static let CHANGE_OFFMP            = "A030";
+    public static let UPLOAD_NETWORK_TYPE     = "A031";
+    public static let PUSH_CHATROOM        = "A032";
+    public static let EXIT_CHATROOM        = "A033";
+    public static let ENTER_CHATROOM        = "A034";
+    public static let UPLOAD_FILE          = "A035";
+    public static let UPLOAD_FILE_PROGRESS = "A0351";
+    public static let PUSH_IMAGE           = "A036";
+    public static let PUSH_MYSELF            = "A037";
+    public static let PUSH_MYSELF_ACK       = "A037A";
+    public static let CREATE_PLACE            = "A038";
+    public static let PUSH_PLACE            = "A039";
+    
+    public static let CREATE_CHATROOM        = "A040";
+    public static let REQUEST_PLACE        = "A041";
+    public static let REQUEST_CHATROOM     = "A042";
+    public static let PUSH_TICKER_QUEUE    = "A043";
+    public static let INIT_TICKER_ON_PLACE = "A044";
+    public static let SHUTDOWN             = "A045";
+    public static let TRIAL_VERSION        = "A046";
+    public static let INIT_BLOG_COMMENT    = "A047";
+    public static let PUSH_BLOG_COMMENT    = "A048";
+    public static let UPLOAD_BLOG_COMMENT    = "A049";
+    
+    public static let POST_REGISTRATION     = "A050";
+    public static let POST_REGISTRATION_IOS     = "A050S";
+    public static let ACTIVATE_TAXI           = "A051";
+    public static let DEACTIVATE_TAXI         = "A052";
+    public static let START_TAXI              = "A053";
+    public static let STOP_TAXI             = "A054";
+    public static let FIND_TAXI               = "A055";
+    public static let PUSH_TAXI               = "A056";
+    public static let PUSH_PASSENGER          = "A057";
+    public static let UPDATE_TAXI           = "A059";
+    
+    public static let PUSH_BLOG     = "A060";
+    public static let INIT_BLOG     = "A061";
+    public static let ENTER_BLOG     = "A062";
+    public static let SHARE_VIDEO     = "A063";
+    public static let BLOCK_BUDDY   = "A064";
+    public static let UNBLOCK_BUDDY = "A065";
+    public static let PUSH_SVIDEO   = "A066";
+    public static let UPLOAD_VIDEO     = "A067";
+    public static let NOTIFY_BLOG     = "A068";
+    public static let NOTIFY_SVIDEO = "A069";
+    
+    public static let INIT_SVIDEO                = "A070";
+    public static let BLOCK_GROUP                = "A071";
+    public static let UNBLOCK_GROUP            = "A072";
+    public static let UPLOAD_AUDIO                = "A073";
+    public static let PUSH_VIDEO               = "A074";
+    public static let PUSH_AUDIO               = "A075";
+    public static let PUSH_PLACE_ON_CELL     = "A076";
+    public static let ENTER_PLACE              = "A077";
+    public static let RETRIEVE_PLACE_ON_CELL = "Aa";
+    public static let EXIT_PLACE               = "A078";
+    public static let PUSH_CHATROOM_ON_PLACE = "A079";
+    
+    //  public static let REQUEST_CHATROOM             = "A080";
+    public static let INIT_SIMAGE                 = "A081";
+    public static let UPLOAD_MYIMAGE               = "A082";
+    public static let PUSH_MYIMAGE                 = "A083";
+    public static let NOTIFY_SIMAGE               = "A084";
+    public static let CHANGE_HLOCATION_STATUS     = "A085";
+    public static let CHANGE_OFFLINE_MODE         = "A086";
+    public static let UPLOAD_THUMB                 = "A087";
+    public static let PUSH_THUMB                = "A088";
+    public static let UPDATE_BLOG_STATUS         = "A089";
+    
+    public static let UPDATE_MYIMAGE_STATUS         = "A090";
+    public static let CHANGE_GROUP_MEMBER_POSITION = "A091";
+    public static let CHANGE_PLACE_INFO            = "A092";
+    public static let DELETE_PLACE                 = "A093";
+    public static let ADD_MULTIPLE_BUDDIES            = "A094";
+    public static let CANCEL_INVITATION            = "A095";
+    public static let REMOVE_REFERRER                  = "A096";
+    public static let DECLINE_DOWNLINE                  = "A097";
+    public static let REFRESH_GROUP                = "A098";
+    public static let ADD_FRIEND                   = "A099";
+    public static let ADD_FRIEND_QR                = "A100";
+    public static let ADD_FRIEND_IMEI              = "A100A";
+    public static let REMOVE_FRIEND                = "A100B";
+    public static let CHECK_FRIEND                 = "A100C";
+    public static let CONTACT_LIST                 = "CL";
+    
+    //    public static let REQUEST_APPS          = "A100";
+    //    public static let PUSH_APP_PREVIEW      = "A101";
+    //    public static let PUSH_APP_DETAIL       = "A102";
+    //    public static let JOIN_APP              = "A103";
+    //    public static let LEAVE_APP               = "A104";
+    //    public static let PUSH_APP              = "A105";
+    //    public static let REQUEST_APP_DETAIL    = "A106";
+    public static let ADD_MULTIPLE_BUDDIES_BY_EMAIL = "A108";
+    public static let IMAGE_DOWNLOAD = "A109";
+    
+    public static let REQUEST_FORM_LIST = "A112";
+    public static let FORM_PUSH = "A113";
+    public static let FORM_PUSH_UPDATE = "A113A";
+    public static let FORM_PIC_SUBMIT = "A114";
+    public static let SUBMIT_FORM    = "A115";
+    public static let APPROVE_FORM   = "A115A";
+    public static let FOLLOW_FORM = "A115B";
+    public static let SUB_ACTIVITY_UPDATE = "A115C";
+    public static let APPROVE_SUBMIT_STATUS   = "A115D";
+    
+    public static let FOLLOW_PERSON         = "B01";
+    public static let UNFOLLOW_PERSON       = "B02";
+    public static let PUSH_FOLLOW           = "B03";
+    public static let REQUEST_FOLLOWER_SIZE = "B04";
+    public static let PUSH_FOLLOWER_SIZE     = "B05";
+    
+    public static let INIT_SCREEN_DRAW      = "B06";
+    public static let START_DRAW            = "B07";
+    public static let ON_DRAW               = "B08";
+    public static let END_DRAW              = "B09";
+    public static let CLOSE_SCREEN_DRAW     = "B10";
+    public static let CLEAR_SCREEN_DRAW     = "B11";
+    
+    public static let REQUEST_FAMILY        = "B12";
+    public static let PUSH_FAMILY           = "B13";
+    public static let PUSH_FAMILY_MEMBER    = "B14";
+    public static let CREATE_FAMILY         = "B15";
+    public static let ADD_FAMILY_MEMBER     = "B16";
+    public static let PUSH_PARENT           = "B17";
+    public static let REQUEST_PARENT        = "B18";
+    public static let CHANGE_FAMILY_INFO    = "B19";
+    public static let REQUEST_CHILD         = "B20";
+    public static let PUSH_CHILD            = "B21";
+    public static let PUSH_EMAIL_USED       = "B22";
+    
+    public static let PUSH_ITEM             = "B23";
+    public static let SEND_ITEM             = "B24";
+    
+    public static let REQUEST_VOD_LIST         = "B25";
+    public static let REQUEST_VOD_LIST_BY_LAST_UPDATE = "B251";
+    public static let PUSH_VOD                 = "B26";
+    public static let UPDATE_VIDEO_VIEWS       = "B27";
+    
+    public static let CREATE_LIVE_VIDEO    = "B28";
+    public static let CREATE_LS = "B28a";
+    public static let START_LP_INVITED = "B28b";
+    public static let UPDATE_LIVE_VIDEO    = "ULV";
+    public static let REMOVE_LIVE_VIDEO    = "B29";
+    public static let JOIN_LIVE_VIDEO      = "B30";
+    public static let REQUEST_N_LIVE_VIDEO = "B31";
+    public static let REQUEST_LIVE_VIDEO   = "B32";
+    public static let REQUEST_LIVE_VIDEO_PUBLIC   = "B32B";
+    public static let PUSH_LIVE_VIDEO      = "B33";
+    public static let PUSH_LIVE_VIDEO_LIST = "B33A";
+    public static let PUSH_LIVE_VIDEO_LIST_PUBLIC = "B33B";
+    public static let PULL_FRIEND_LIST_INFO = "B33C";
+    public static let LEFT_LIVE_VIDEO      = "B34";
+    public static let START_LIVE_VIDEO      = "SLV";
+    public static let REQUEST_START_LIVE_VIDEO = "RLV";
+    public static let OUT_FROM_STREAMING_TAB   = "OLS";
+    
+    public static let SEMINAR_START_INVITED = "CSR0";
+    public static let SEMINAR_CREATE = "CSR1";
+    public static let SEMINAR_PUSH_CHAT = "CSR2";
+    public static let SEMINAR_PUSH_JOIN = "CSR3";
+    public static let SEMINAR_JOIN = "CSR4";
+    public static let SEMINAR_REMOVE = "CSR5";
+    public static let SEMINAR_LEFT = "CSR6";
+    public static let SEMINAR_PUSH_LEFT = "CSR7";
+    public static let SEMINAR_PUSH_RAISE_HAND = "CSR8";
+    public static let SEMINAR_DRAW = "CSR10";
+    public static let SEMINAR_FACE_DETECTION = "CSR11";
+    
+    public static let GET_BATCH_BUDDIES_BASED_SCROLL     = "C70";
+    public static let CHANGE_BATCH_PERSON_INFO_BASED_SCROLL = "A00X4";
+    
+    
+    public static let REQUEST_BUDDY_INFO     = "B35";
+    
+    public static let REQUEST_GROUP_MEMBER = "A107";
+    public static let REQUEST_OFFLINE_BUDDIES = "A108";
+    
+    public static let REQUEST_RSS = "C4";
+    public static let NEARBY_VISIBLE = "C5";
+    public static let NEARBY_INVISIBLE = "C6";
+    public static let TENDER = "C7";
+    public static let NOTIFICATION = "C8";
+    public static let LAUNCH_APP = "C9";
+    
+    public static let GET_QUOTES = "C32";
+    public static let SET_AUTO_QUOTE = "C33";
+    
+    public static let SEND_CHAT = "S0";
+    public static let SEND_CHAT_WEB = "Z10";
+    public static let NOTIFICATION_UPDATE = "NTF"; //S
+    public static let REQUEST_PERSON_BY_USERID     = "C27";
+    public static let REQUEST_PERSON_BY_DEVICEID       = "C44";
+    public static let UPDATE_PENDING_SID       = "C45";
+    public static let CHECKIN       = "C46";
+    public static let SEND_VERSION_STATE = "VRS"; //S
+    
+    
+    public static let GET_BALANCE   = "C35";
+    public static let GET_TOPUP     = "TPU";
+    public static let WALLET_GET   = "";
+    public static let WALLET_LOCK_UPDATE  = "C36";
+    public static let WALLET_LOCK_GET  = "C37";
+    public static let PUSH_PRODUCT                 = "C40";
+    public static let PUSH_STOCK       = "C41";
+    public static let WALLET_BUY       = "C42";
+    public static let QUERY_GET        = "C43";
+    public static let WALLET_BALANCE   = "C47";
+    
+    public static let CHANGE_BATCH_PERSON_INFO = "A004"; //S
+    public static let GET_BATCH_BUDDY_INFO     = "C48";
+    public static let PUSH_OFFICE     = "C49";
+    public static let GET_BUDDY_INFO = "C34";
+    public static let CHECKIN_POS = "C50";
+    public static let CHECKOUT_POS = "C51";
+    public static let REPLACE_OFFICE     = "RPO";
+    public static let REPLACE_BUDDIES = "RPP";
+    
+    public static let INIT_BATCH_BUDDY = "IBB";
+    public static let INIT_FOLLOW = "IBF";
+    public static let INIT_BATCH_GROUP = "IBG";
+    public static let INIT_BATCH_GROUP_NO_MEMBERS = "GNM";
+    public static let INIT_BATCH_TOPIC = "IBT";
+    public static let INIT_PREFS = "ITT";
+    public static let INIT_FLAG_FINISH = "IFF";
+    public static let INIT_FLAG_RESET  = "IFR";
+    
+    public static let GET_POS_TRANS_HISTORY = "C52";
+    public static let GET_POS_TRANS_HISTORY_DETAIL = "C53";
+    public static let CANCEL_TRANSACTION             = "C54";
+    public static let GET_COMMENTS             = "C55";
+    public static let SEND_COMMENTS             = "C56";
+    public static let ON_EDITOR_COMMENT         = "C57";
+    public static let DELETE_COMMENTS          = "C58";
+    public static let DELETE_POST          = "C59";
+    public static let GET_FOLLOW               = "A101";
+    public static let GET_UNFOLLOW               = "A102";
+    
+    public static let UPDATE_RUNNING_TEXT      = "URR";
+    public static let INCOMING_EMAIL      = "IE";
+    public static let INCOMING_SMS        = "ISMS";
+    public static let INCOMING_LOCATION      = "IL";
+    public static let INCOMING_GPS_STATE      = "IG";
+    public static let SHARE_FORUM      = "SFR";
+    public static let FOLLOW_FORUM      = "FLF";
+    public static let TASK_PROGRESS_DASHBOARD      = "DBD";
+    public static let TASK_PROGRESS_RETRIEVE      = "A117";
+    public static let TASK_PROGRESS_RETRIEVE_SUB_ACTIVITY      = "RPT_LV1";
+    public static let TASK_PROGRESS_RETRIEVE_TASK_TITLE      = "RPT_LV2";
+    public static let INCOMING_AUTO_MESSAGE  = "IAM";
+    public static let SCREEN_SHARING              = "SS";
+    public static let SCREEN_SHARING_STOP              = "SS1";
+    
+    public static let GET_FROM_SERVER = "GFS";
+    public static let CALL_SUGGESTION = "CSG";
+    
+    public static let LIVE_CONFERENCE_START = "LC01";
+    public static let LIVE_CONFERENCE_JOIN = "LC02";
+    public static let LIVE_CONFERENCE_TOA = "LC03";
+    public static let LIVE_CONFERENCE_ZOOM = "LC04";
+    public static let LIVE_CONFERENCE_MESSAGE_END = "LC05";
+    public static let LIVE_CONFERENCE_END = "LC99";
+    
+    public static let RESET_1 = "RST1";
+    public static let RESET_2 = "RST2";
+    public static let RESET_3 = "RST3";
+    
+    public static let SUBMIT_LOGIN_PAY = "BAA";
+    public static let SUBMIT_REGISTER_PAY = "BAB";
+    public static let SEND_EMAIL_LOGIN_CODE_PAY = "BAC";
+    public static let GET_PRODUCT_INFO = "BAD";
+    public static let VALIDATE_PAY = "BAE";
+    public static let CONFIRM_PAY = "BAF";
+    public static let CONFIRM_PAY_RESPONSE = "BAG";
+    
+    public static let SEND_SIGNUP_DATA = "SSU01";
+    public static let SEND_SIGNIN = "SSI01";
+    public static let RETRIEVE_TPS = "SSU02";
+    public static let RETRIEVE_REAL_COUNT = "SSU23";
+    public static let RETRIEVE_PERSON_BY_NAME = "SSU24";
+    public static let RETRIEVE_PERSON_SUGGESTION = "SSS24";
+    public static let RETRIEVE_PERSON_BY_PHOTO = "SSU27";
+    public static let UPLOAD_TIMELINE = "SSU03";
+    public static let PUSH_VGT = "SSU04";
+    public static let UPDATE_VGT_VIEWS       = "SSU05";
+    public static let CHANGE_PRIVACY = "SSU07";
+    public static let CHANGE_PUBLISH = "SSU08";
+    public static let PULL_MYSELF = "SSU09";
+    public static let EDIT_TIMELINE       = "SSU10";
+    public static let PARTICIPATE_TIMELINE       = "SSU11";
+    public static let GET_LIST_PARTICIPANT        = "SSU13";
+    public static let GET_CONTENT_PARTICIPATE        = "SSU14";
+    
+    public static let SEND_POST_SHARE="SSU12";
+    
+    public static let BILLING_TRANS_WARUNG             = "SSU20";
+    public static let BILLING_TRANS_WARUNG_CANCEL      = "SSU30";
+    public static let SCAN_PAY_TRANS_WARUNG        = "SSU21";
+    public static let PUSH_DATA_TRANS_WARUNG       = "SSU22";
+    
+    public static let GET_ADS = "GAD";
+    public static let TYPE_ADS = "A30";
+    
+    public static let GET_COUNT_POST_FOLLOWERS_FOLLOWING = "C60";
+    
+    
+    /**
+     * Web
+     */
+    public static let CONNECTED_FROM_WEB = "CFW";
+    public static let DISCONNECTED_FROM_WEB = "DFW";
+    public static let GET_INFO_MESSAGE_FROM_WEB = "Z07";
+    public static let RETRIEVE_UC_LIST = "Z08";
+    public static let LOAD_MORE_MESSAGE_FROM_WEB = "Z09";
+    
+    public static let SEND_CHAT_FROM_WEB = "Z10";
+    public static let SEND_UPDATE_READ_FROM_WEB = "Z11";
+    public static let DELETE_CHAT_FROM_WEB = "Z12";
+    public static let SEARCH_CHAT_FROM_WEB = "Z13";
+    public static let ADD_TAG_MESSAGE_FROM_WEB = "Z14";
+    public static let DELETE_CONVERSATION_FROM_WEB = "Z15";
+    public static let SEND_UPDATE_READ_SINGLE_FROM_WEB = "Z16";
+    public static let CONFIRMATION_IM_FROM_WEB = "Z18";
+    
+    public static let CHANGE_PERSON_INFO_FROM_WEB = "Z25";
+    public static let MARK_ALL_AS_READ_FROM_WEB = "Z26";
+    public static let UPDATE_MESSAGES_FROM_WEB = "Z27";
+    public static let LOAD_FAVORITE_MESSAGES_FROM_WEB = "Z28";
+    public static let GET_MESSAGE_OBJECT_FROM_WEB = "Z29";
+    public static let CREATE_GROUP_FROM_WEB = "Z30";
+    public static let DELETE_GROUP_FROM_WEB = "Z31";
+    public static let LEAVE_GROUP_FROM_WEB = "Z32";
+    public static let CHANGE_GROUP_INFO_FROM_WEB = "Z33";
+    public static let ADD_TOPIC_FROM_WEB = "Z36";
+    public static let REMOVE_TOPIC_FROM_WEB = "Z37";
+    public static let UPDATE_TOPIC_FROM_WEB = "Z38";
+    public static let CHANGE_GROUP_MEMBER_POSITION_FROM_WEB = "Z41";
+    public static let ADD_MEMBER_FROM_WEB = "Z39";
+    public static let REMOVE_MEMBER_FROM_WEB = "Z40";
+    public static let LOAD_EMAIL_FROM_WEB = "Z51";
+    public static let ADD_EMAIL_FROM_WEB = "Z52";
+    public static let CONNECT_DISCONNECT_EMAIL_FROM_WEB = "Z53";
+    public static let REMOVE_EMAIL_FROM_WEB = "Z54";
+    
+    public static let GET_DATA_CALENDAR_FROM_WEB = "Z58";
+    public static let VIEW_MEDIA_FROM_WEB = "Z59";
+    public static let POST_REACTION = "Z60";
+    public static let POST_RETRIEVE = "PSR";
+    public static let POST_INCOMING = "PSI";
+    
+    public static let POST_RETRIEVE_STRUCTURE = "PRS";
+    public static let POST_RETRIEVE_CONTENT = "PRC";
+    
+    public static let POST_RETRIEVE_STRUCTURE_NEWEST = "PRSa";
+    public static let POST_RETRIEVE_STRUCTURE_PREVIOUS = "PRSz";
+    
+    public static let POST_INCOMING_STRUCTURE = "PIS";
+    public static let POST_INCOMING_CONTENT = "PIC";
+    public static let POST_REMOVE_CONTENT = "PRC";
+    
+    public static let FACE_RECOGNITION = "FAE";
+    public static let FACE_RECOGNITION_KTP = "FAEQ";
+    public static let FACE_RECOGNITION_TWOFACE = "FAET";
+    public static let FACE_RECOGNITION_COMPARE = "FRC";
+    
+    public static let LIVE_PROFILE_PUSH_JOIN = "LPJ";
+    public static let LIVE_PROFILE_PUSH_LEAVE = "LPL";
+    public static let LIVE_PROFILE_PUSH_CHAT = "LPC";
+    public static let LIVE_PROFILE_EMOTION_SEND = "LPES";
+    public static let LIVE_PROFILE_EMOTION_GET = "LPEG";
+    
+    public static let POST_REPORT = "Z61";
+    public static let SAVE_CALL_HISTORY = "CH";
+    public static let CONCALL_INVITATING = "IV";
+    
+    public static let POST_INCREASE_VIEWER = "PIV";
+    
+    public static let GET_LIST_FOLLOWER = "GLF";
+    public static let GET_LIST_LIKE = "GLL";
+    public static let GET_LIST_FOLLOWING = "GLG";
+    
+    public static let GET_OFFLINE_MESSAGES = "GOM";
+    public static let GET_OFFLINE_MESSAGES_COUNTER = "GOC";
+    public static let LOGIN_FILE = "LF";
+    public static let INIT_BATCH_NEW_DF = "IDF";
+    public static let INIT_BATCH_NEW_DF_FORM = "IDO";
+    public static let RESET_UPGRADE = "RSU";
+    public static let RESET_FORCE   = "RSF";
+    public static let VERSION_CHECK   = "VC";
+    
+    public static let GET_LOGIN_BY_SMS_ENABLED = "SMSE";
+    public static let UPDATE_IP_ADDRESS = "UIP";
+    public static let UNKNOWN_MESSAGE = "UNKM";
+    public static let DIF_OPEN   = "DFO";
+    public static let SEND_UPDATE_UNREAD = "C30";
+    public static let SEND_UPDATE_READ_WEB = "Z11";
+    public static let SEND_UPDATE_READ_SINGLE_WEB = "Z16";
+    public static let DELETE_IM_WEB = "Z12";
+    public static let UPDATE_MESSAGES_WEB = "Z27";
+    public static let CONFIRMATION_IM_WEB = "Z18";
+    public static let ADD_TAG_IM_WEB = "Z14";
+    public static let SEND_UPDATE_READ_BY_TIME = "C29T";
+    
+    public static let GET_TRANS_HISTORY   = "SSU25";
+    public static let GET_TRANS_DETAIL   = "SSU26";
+    
+    public static let GET_BLOCK = "A120";
+    public static let GET_UNBLOCK = "A121";
+    
+    public static let VIDEO_CALL_PUSH_CHAT = "VCC";
+    
+    public static let ASKING_FOR_END_CALL = "ASKE";
+    
+    public static let END_CALL = "ENCL";
+    public static let INCOMING_CALL_CC = "ICS";
+    
+    public static let POST_RETRIEVE_PROFILE = "PIP";
+    public static let POST_RETRIEVE_TIMELINE = "PIT";
+    public static let POST_RETRIEVE_BY_ID = "PID";
+    public static let POST_UPDATE_STORY      = "PUS";
+    
+    public static let GET_SIMPLE_PERSON_INFO = "CP5";
+    
+    public static let PULL_MESSAGE = "PMS";
+    public static let PULL_MESSAGE_PREVIEW = "PMP";
+    public static let PULL_STORY_LIST      = "PSL";
+    public static let PULL_STORY_LIST_PERSONAL = "PSLP";
+    public static let PULL_MAIN_CONTENT    = "PMC";
+    public static let PULL_CHANNEL_LIST    = "PCL";
+    public static let SUSPEND_USER    = "SPU";
+    public static let GET_OPEN_GROUPS = "GOG";
+    public static let CHAT_FILTER     = "CFL";
+    
+    public static let ASKING_RESPONSE = "AKR";
+    public static let TRX = "TRX";
+    public static let FETCH_LINK = "FLI";
+    public static let GET_PERSON_NEARBY = "NRB";
+    
+    public static let SUBMIT_SURVEY_COVID = "SCV";
+    public static let SUBMIT_SURVEY_COVID_ADDITIONAL = "SCVA";
+    public static let NOTIFICATION_COVID = "NTFC";
+    public static let GET_FRM_DATA_COVID = "GFRM1";
+    public static let SUBMIT_FRM_DATA_COVID = "SFRM1";
+    public static let GET_FRM_PENERIMAAN_APD_COVID = "GFRM2";
+    public static let SUBMIT_FRM_PENERIMAAN_APD_COVID = "SFRM2";
+    public static let GET_FRM_USAGE_COVID = "GFRM3";
+    public static let SUBMIT_FRM_USAGE_COVID = "SFRM3";
+    public static let GET_FRM_RESEP = "GFRM4";
+    public static let SUBMIT_FRM_RESEP = "SFRM4";
+    
+    
+    public static let GET_PERSON_BY_NAME = "USR";
+    public static let GET_PERSON_BY_PIN  = "TRC";
+    public static let GET_SITUASI_COVID  = "CVS";
+    public static let GET_DOCTOR_NEARBY  = "GDN";
+    
+    public static let GET_BLE_NEARBY  = "BLN";
+    public static let CHANGE_USER_TYPE  = "CUT";
+    
+    public static let GET_LS_INFO = "LS01";
+    public static let VC_ROOM_CREATE = "VCR";
+    public static let VC_ROOM_START = "VCR1";
+    public static let VC_ROOM_JOIN = "VCR2";
+    public static let VC_ROOM_END = "VCR2";
+    public static let VC_ROOM_WHITEBOARD_IMAGE = "VCR3";
+    public static let VC_ROOM_DRAW = "VCR4";
+    
+    //Signup-Signin MSISDN dan OTP
+    public static let VERIFY_OTP = "VOTP";
+    public static let SEND_SIGNUP_MSISDN = "B8C";
+    public static let SEND_CHANGE_MSISDN = "B8D";
+    public static let SEND_SIGNIN_OTP = "SSI01A";
+    public static let SEND_SIGNUP_OTP = "SSU01O";
+    public static let SEND_VERIFY_LOGIN = "SVL";
+    public static let SEND_OTP_LOGIN = "SOTL";
+    
+    //Whiteboard
+    public static let DRAW_WHITEBOARD = "DWB";
+    
+    //APN
+    public static let APN_TOKEN   = "ATO";
+    
+    //sub group
+    public static let CREATE_SUB_GROUP   = "A007A";
+    
+    
+    //REGISTER VS
+    public static let SEND_LOGIN_EMAIL = "SLE";
+    public static let SEND_VERIFICATION = "SVE";
+    
+    public static let GET_LIST_SCHOOL = "GLS";
+    
+    public static let UPDATE_USER = "RQJU";
+    public static let REQUEST_TEACHER_SCHOOL = "GLS8";
+    public static let REQUEST_STUDENT = "GLS7";
+    public static let APPROVE_REQUEST_STUDENT = "GLS4";
+    public static let GET_REQUEST_TEACHER = "GLS5";
+    public static let APPROVE_REQUEST_TEACHER = "GLS6";
+    public static let GET_REQUEST_STUDENT = "GLS3";
+    public static let GET_LIST_CLASS_NAME = "GLC";
+    public static let SUBMIT_SCHOOL = "GLS2";
+    
+    public static let SUB_ACCOUNT_DETAIL = "SAD";
+    public static let SUB_ACCOUNT_LIST = "SAL";
+    public static let SUB_ACCOUNT_SUBMIT = "SAS";
+    public static let SUB_ACCOUNT_CHANGE = "SAC";
+    public static let SUB_ACCOUNT_PUSH_FILTERING = "SAF";
+    
+    public static let IS_INITIATOR_JOIN = "CSR9";
+    public static let QUIZ_DETAIL = "QZD";
+    public static let QUIZ_ANSWER = "QZA";
+    public static let QUIZ_SCORING = "QZS";
+    
+    public static let REQUEST_CALL_CENTER = "CC01"; // sync
+    public static let PUSH_CALL_CENTER = "CC02"; // async
+    public static let ACCEPT_CALL_CENTER = "CC03"; // sync
+    public static let END_CALL_CENTER = "CC04"; // sync
+    public static let MANAGEMENT_CONTACT_CENTER = "CC05";
+    public static let FEATURE_ACCESS = "FA01";
+    public static let BROADCAST_MESSAGE = "BM01";
+
+    public static let SIGN_IN_API_CREATOR = "SIA02";
+    public static let SIGN_IN_API_ADMIN = "SIA03";
+    public static let SIGN_IN_API_INTERNAL = "SIA04";
+    public static let TIMEOUT_CONTACT_CENTER = "CC06";
+
+    public static let CHANGE_PSWD_ADMIN = "CP01";
+    public static let CHANGE_PSWD_INTERNAL = "CP02";
+    public static let EMAIL_CONTACT_CENTER = "CC07";
+    public static let QUEUING_CONTACT_CENTER = "CC08";
+    public static let STATUS_CONTACT_CENTER = "CC09";
+    public static let DRAW_CONTACT_CENTER = "CC10";
+    public static let ADD_CALL_CONTACT_CENTER = "CC11";
+    public static let END_CALL_CONTACT_CENTER = "CC12";
+    public static let IS_ACTIVE_CALL_CONTACT_CENTER = "CC13";
+    public static let INVITE_TO_ROOM_CONTACT_CENTER = "CC14";
+    public static let ACCEPT_CONTACT_CENTER = "CC15";
+    public static let PUSH_MEMBER_ROOM_CONTACT_CENTER = "CC16";
+    public static let INVITE_END_CONTACT_CENTER = "CC17";
+    public static let INVITE_EXIT_CONTACT_CENTER = "CC18";
+    public static let REQUEST_SECOND_CONTACT_CENTER = "CC19"; // sync
+    public static let PUSH_SECOND_CONTACT_CENTER = "CC20";
+    public static let RESPOND_SECOND_CONTACT_CENTER = "CC21"; // sync
+    public static let GET_WORKING_AREA_CONTACT_CENTER = "CC22"; // sync
+    public static let PUSH_SUBSCRIPTION_SIZE = "PS01";
+    
+    public static let SIGN_UP_API = "SUA01";
+    public static let CHECK_PSWD = "CPW";
+    
+    public static let GET_LIST_DISCUSSION = "GLD";
+    public static let GET_DISCUSSION_COMMENT = "GDC";
+    public static let LEAVE_DISCUSSION_COMMENT = "LDC";
+    public static let SEND_DISCUSSION_COMMENT = "SDC";
+    public static let PUSH_DISCUSSION_COMMENT = "PDC";
+    
+    public static let SEND_OTP_CHANGE_DEVICE = "SOTD";
+    public static let SEND_OTP_CHANGE_DEVICE_GASPOL = "SOTG";
+    public static let SEND_OTP_CHANGE_PROFILE = "SOTP";
+    public static let SEND_VERIFY_CHANGE_DEVICE = "SVTD";
+    
+    public static let PULL_GROUP_CATEGORY = "PGC";
+    public static let GET_SERVICE_BNI = "GBNI";
+    public static let PUSH_SERVICE_BNI = "PBNI";
+    public static let REQUEST_TICKET_BNI = "RTB";
+    public static let REQUEST_TOP_UP_BNI = "RTP";
+    public static let PULL_FLOATING_BUTTON = "PFB";
+    
+    public static let GET_CUSTOMER_INFO = "GCI"; // sync
+    public static let INQUIRY = "INQ";
+    public static let MOBILE_INQUIRY = "MINQ";
+    
+    public static let SIGN_UP_AND_SIGN_IN_API = "SUAI01";
+    public static let BACKUP_AVAILABILITY = "BUA2";
+    public static let BACKUP_UPLOADED = "BUU2";
+    public static let BACKUP_RESTORED = "BUR2";
+    
+    public static let LOGOUT = "LGT";
+    
+    public static let FORWARD_MESSAGE = "C2";
+    public static let WB_INCOMING = 101;
+    public static let WB_OFFHOOK = 102;
+    public static let WB_RINGING = 103;
+    public static let WB_ACCEPT_INCOMING = 104;
+    public static let WB_REJECT_INCOMING = 105;
+    public static let WB_END = 108;
+
+    public static let SS_INCOMING = 121;
+    public static let SS_OFFHOOK = 122;
+    public static let SS_RINGING = 123;
+    public static let SS_ACCEPT_INCOMING = 124;
+    public static let SS_REJECT_INCOMING = 125;
+    public static let SS_END = 128;
+    
+    public static let GET_BATCH_GROUP_NO_MEMBERS = "GGNM";
+    
+    public static let CALLING = "CALL";
+    public static let NOTIFY_TO_CALLING = "NTC";
+    public static let CANCEL_CALL_NOTIFICATION = "CCN";
+    
+    public static let FEATURE_ACCESS_ALL = "FA02";
+    
+    public static let PAYMENT_NOTIFICATION = "PAY";
+    
+    public static let ALERT_NEW_SIGN_IN = "ANSI";
+
+    public static let SHIELD_SECURITY_VALIDATE_TOKEN = "SSVT";
+    public static let BLOCK_ACCESS = "BLK";
+    
+    public static let RESET_SUPER_APP = "RSA";
+    public static let GPT = "GPT";
+}

+ 499 - 0
appbuilder-ios/NexilisUC/NexilisUC/Source/Message/CoreMessage_TMessageKey.swift

@@ -0,0 +1,499 @@
+//
+//  CoreMessage_TMessageKey.swift
+//  NexilisUC
+//
+//  Created by Maronakins on 04/11/24.
+//
+
+import Foundation
+
+public class CoreMessage_TMessageKey {
+    
+    public static let SIM_OPERATOR = "B0"
+    public static let CELL_SECTION   = "B1"
+    public static let SIGNAL_LEVEL   = "B2"
+    public static let SIGNAL_TYPE    = "B3"
+    public static let BROADCAST_FLAG = "B4"
+    public static let BROADCAST_ID   = "B40"
+    public static let MSISDN           = "B5"
+    public static let EMAIL           = "B6"
+    public static let USER_ID           = "B7"
+    public static let USER_TYPE       = "B7T"
+    public static let F_USER_ID       = "B8"
+    public static let L_USER_ID       = "B9"
+    
+    public static let WEB_ADDRESS       = "Ba"
+    public static let IMEI           = "Bb"
+    public static let IMSI           = "Im"
+    public static let N_COMMENTS     = "Bc"
+    public static let VERCOD         = "Bd"
+    public static let VERIFY         = "Bdv"
+    public static let N_LIMIT           = "Be"
+    public static let READ_RECEIPTS  = "Bf"
+    public static let N_COINS          = "Bg"
+    public static let STICKER_ID     = "Bh"
+    public static let STICKER_SET_ID = "Bi"
+    public static let PRICE             = "Bj"
+    public static let DELIVERY       = "Dv"
+    public static let LINK              = "Bk"
+    public static let N_MEMBERS      = "Bl"
+    public static let PSWD            = "Bm"
+    public static let PSWD_OLD      = "Bm0";
+    public static let N_DOWNLOADS    = "Bn"
+    public static let DEVICE_BRAND   = "Bo"
+    public static let DEVICE_MODEL   = "Bp"
+    public static let SDK_INT        = "Bq"
+    public static let WIFI_STATUS    = "Br"
+    public static let AUTO_QUOTE     = "Bw"
+    public static let KEY               = "Bt"
+    public static let VALUE           = "Bu"
+    public static let PLATFORM       = "BX"
+    public static let VB_STATUS        = "Bx"
+    public static let OPPOSITE_PIN   = "OP1"
+    public static let CHAT_ID        = "BA"
+    public static let BLOG_COMMENT_ID = "BB"
+    public static let QUANTITY       = "BC"
+    public static let ACHIEVEMENT_ID = "BD"
+    
+    public static let SEQUENCE       = "BE"
+    public static let LAST_SEQUENCE  = "BF"
+    
+    public static let LAST_BLOG_ID   = "BG"
+    public static let DURATION       = "BH"
+    public static let STREAM_ID      = "BI"
+    public static let LABEL          = "BJ"
+    public static let VOD_ID         = "BK"
+    public static let COMMENTS       = "BL"
+    public static let TV_ID          = "BM"
+    public static let FILE_ID        = "BN"
+    public static let FILE_TYPE = "BN2"
+    public static let FILE_THUMB = "BN3"
+    public static let FILE_SUMMARIZATION   = "BN4";
+    public static let CHAT_MODIFIER  = "BO"
+    public static let EXTENDED       = "BP"
+    public static let F_DISPLAY_NAME  = "BR"
+    public static let L_DISPLAY_NAME  = "BS"
+    public static let ANDROID_VERSION = "BT"
+    public static let VGT_ID         = "BY"
+    
+    public static let F_PIN             = "A00"
+    public static let F_PIN_REAL = "A00real"
+    public static let L_PIN             = "A01"
+    public static let FIRST_NAME        = "A02"
+    public static let LAST_NAME        = "A03"
+    public static let GROUP_ID         = "A04"
+    public static let IS_OPEN             = "IOP"
+    public static let GROUP_NAME         = "A05"
+    public static let MESSAGE_SCOPE_ID = "A06"
+    public static let MESSAGE_TEXT     = "A07"
+    public static let MESSAGE_TEXT_ENG     = "A07_eng"
+    public static let MESSAGE_IMAGE     = "A08"
+    //    public static let MESSAGE_STATUS     = "A09"
+    public static let CONNECTED         = "A10"
+    public static let LAST_UPDATE         = "A11"
+    public static let LATITUDE         = "A12"
+    public static let LONGITUDE         = "A13"
+    public static let ALTITUDE         = "A14"
+    public static let STATUS             = "A15"
+    public static let QUOTE             = "A16"
+    public static let IMAGE             = "A17"
+    public static let MESSAGE_ID        = "A18"
+    public static let SERVER_DATE        = "A19"
+    
+    public static let _ID                = "A20"
+    public static let CELL                = "A21"
+    public static let LAST_LOC_UPDATE    = "A22"
+    public static let UPLINE_PIN        = "A23"
+    public static let EMPTY_1            = "A24"
+    public static let EMPTY_2            = "A25"
+    public static let TIMEZONE            = "A26"
+    public static let PRIVACY_FLAG        = "A27"
+    public static let CREATED_BY         = "A28"
+    public static let CREATED_DATE     = "A29"
+    
+    public static let MEDIA_TYPE          = "A30"
+    public static let MESSAGE_IMAGE_NAME = "A31"
+    public static let MESSAGE_VIDEO      = "A32"
+    public static let MESSAGE_VIDEO_NAME = "A33"
+    public static let EMPTY_3               = "A34"
+    public static let TICKER_ID          = "A35"
+    public static let BODY                    = "A36"
+    public static let TITLE              = "A37"
+    public static let TYPE               = "A38"
+    public static let PAYMENT_ID           = "A39"
+    public static let STORY_ID           = "STI"
+    
+    public static let DESCRIPTION   = "A40"
+    public static let DESCRIPTION_2 = "A41"
+    public static let REG_STATUS    = "A42"
+    public static let BLOCK         = "A43"
+    public static let PATH          = "A44"
+    public static let VIDEO          = "A45"
+    public static let VIDEO_TITLE     = "A46"
+    public static let VIDEO_ID        = "A47"
+    public static let OFFLINE_MODE     = "A48"
+    //    public static let FOLLOW          = "A49"
+    
+    public static let TICKER_ICON_NAME  = "A50"
+    public static let TICKER_IMAGE_NAME = "A51"
+    public static let BLOG_ID              = "A52"
+    public static let FILE_NAME          = "A53"
+    public static let PART_SIZE         = "A53A"
+    public static let PART_OF           = "A53B"
+    public static let FILE_SIZE         = "A53C"
+    public static let RECORD_SIZE       = "A53D"
+    public static let OFFMP              = "A54"
+    public static let NETWORK_TYPE         = "A55"
+    public static let RADIUS             = "A56"
+    public static let IMAGE_ID             = "A57"
+    public static let PLACE_ID              = "A58"
+    public static let PLACE_NAME          = "A59"
+    
+    public static let CHATROOM_ID         = "A60"
+    public static let CHATROOM_NAME    = "A61"
+    public static let SEND_BACK         = "A62"
+    public static let AUDIO_ID            = "A63"
+    public static let OLD_CELL            = "A64"
+    public static let NEW_CELL            = "A65"
+    public static let TAXI_COMPANY_ID    = "A66"
+    
+    public static let AREA_ID         = "A67"
+    public static let FORMAT         = "A68"
+    public static let SVIDEO_ID     = "A69"
+    
+    public static let CATEGORY_ID             = "A70"
+    public static let CATEGORY_FLAG         = "A70A"
+    public static let N_VIEWS                 = "A71"
+    public static let VIEWERS    = "VIEWERS"
+    public static let MYIMAGE_ID             = "A72"
+    public static let EX_STATUS             = "A73"
+    public static let THUMB_ID             = "A74"
+    public static let CELL_CONFIGURATION     = "A75"
+    public static let SCOPE_ID             = "A76"
+    public static let FOLLOWER_SIZE         = "A77"
+    public static let FOLLOW_STATUS         = "A78"
+    public static let IMAGE_DOWNLOAD_PATH     = "A79"
+    
+    public static let POSITION             = "A80"
+    public static let PLUGIN_DOWNLOAD_PATH    = "A81"
+    public static let VIDEO_DOWNLOAD_PATH     = "A82"
+    public static let VIDEO_FORMAT         = "A83"
+    public static let APP_CODE             = "A84"
+    public static let DRAW_POINT           = "A85"
+    public static let DRAW_SCREEN_WIDTH     = "A86"
+    public static let DRAW_SCREEN_HEIGHT     = "A87"
+    public static let N_SHOWS                 = "A88"
+    public static let TEXT_PREVIEW            = "A89"
+    
+    public static let START_DATE             = "A90"
+    public static let END_DATE             = "A91"
+    public static let NAME                 = "A92"
+    public static let ALLOW_COMMENTS         = "A93"
+    public static let APP_DOWNLOAD_PATH     = "A94"
+    public static let ANDROID_PACKAGE_NAME = "A95"
+    public static let ANDROID_CLASS_NAME     = "A96"
+    public static let ERRCOD                 = "A97"
+    public static let REQUEST_ID             = "A98"
+    
+    public static let FAMILY_ID            = "A99"
+    public static let FAMILY_NAME          = "A100"
+    public static let MEMBER_QTY           = "A101"
+    public static let MAX_LEVEL            = "A102"
+    public static let LEVEL                = "A103"
+    public static let POINT                = "A104"
+    public static let PARENT_PIN           = "A105"
+    public static let N_CHILDREN           = "A106"
+    
+    public static let ITEM_CODE            = "A107"
+    public static let ITEM_QTY             = "A108"
+    public static let ITEM_SERIAL_NUMBER   = "A109"
+    public static let ITEM_END_DATE        = "A110"
+    public static let ITEM_LAST_UPDATE     = "A111"
+    public static let ITEM_PRICE_BUY       = "A112"
+    public static let ITEM_PRICE_SELL      = "A113"
+    public static let ITEM_ABILITY         = "A114"
+    public static let ITEM_REQUIREMENT     = "A115"
+    
+    public static let CONTACT                = "A116"
+    public static let BUSINESS_CATEGORY         = "A117"
+    public static let CREDENTIAL           = "A118"
+    
+    public static let WISHLIST_ID          = "A119"
+    
+    public static let RSS_ID               = "A109"
+    public static let EXT_TEXT_1           = "A111"
+    public static let DATA                 = "A112"
+    public static let BALANCE              = "A114"
+    public static let VOUCHER              = "A138"
+    public static let TRANSACTION_LIMIT = "A147"
+    public static let DISCOUNT = "A148"
+    public static let PARENT_ID          = "BP"
+    public static let IS_ORGANIZATION          = "A122"
+    
+    public static let FORM_ID    = "A120"
+    public static let REF_ID     = "A121"
+    public static let RATE       = "A122"
+    public static let FILE_UPLOAD  = "A123"
+    
+    
+    public static let AUTO_QUOTE_TYPE = "A129"
+    public static let IS_PULL = "A130"
+    public static let PENDING_SID       = "BU"
+    public static let BUSINESS_ENTITY = "BZ1"
+    
+    
+    public static let POS_FLAG = "A131"
+    public static let SHOP = "A132"
+    public static let SHOP_CODE = "A133"
+    public static let STOCK_ID = "A134"
+    public static let STOCK_CODE = "A135"
+    public static let STOCK_NAME = "A136"
+    public static let SHOP_NAME = "A137"
+    
+    
+    public static let WALLET_CODE    = "A139"
+    public static let WALLET_QTY    = "A140"
+    public static let WALLET_AMOUNT    = "A141"
+    public static let WALLET_EXPIRED    = "A142"
+    public static let WALLET_TYPE_    = "A143"
+    public static let BITSET    = "BIT"
+    
+    public static let EXTENSION    = "A144"
+    public static let ANONYMOUS = "A145"
+    public static let ATTACHMENT_FLAG = "A149"
+    public static let INDEX = "A150"
+    public static let OTP = "OTP"
+    public static let AC = "AC"
+    public static let AC_DESC = "AC_DESC"
+    public static let BE_INFO = "BE_INFO"
+    public static let PACKET_ID = "BQ"
+    
+    public static let SCHEME_ID = "A150"
+    public static let TV_SCHEME_ID = "A151"
+    
+    public static let GENDER = "A154"
+    public static let BIRTHDATE = "A155"
+    public static let CARD_TYPE = "A156"
+    public static let CARD_ID = "A157"
+    public static let REAL_NAME = "RNAM"
+    
+    public static let REF_COMMENT_ID = "A159"
+    public static let COMMENT_DATE = "A160"
+    public static let COMMENT = "A161"
+    public static let COMMENT_ID = "A162"
+    
+    public static let EC_DATE = "A163"
+    
+    public static let FOLLOW_DATE = "FD01"
+    public static let UNFOLLOW_DATE = "UD01"
+    
+    public static let TRANS_ID = "Bs"
+    public static let NOTE = "nt"
+    public static let SIGN = "sg"
+    public static let ORG_ID    = "ogi"
+    public static let ORG_NAME  = "ogn"
+    public static let ORG_THUMB = "ogt"
+    public static let UNIQ_CODE = "uqc"
+    public static let ACTVITY = "act"
+    public static let ACTVITY_SUB = "acts"
+    public static let SHARING_FLAG = "srf"
+    public static let CLIENTS = "cln"
+    public static let TAG_FORUM = "tgf"
+    public static let TAG_CLIENT = "tgc"
+    public static let TAG_ACTIVITY = "tga"
+    public static let TAG_SUBACTIVITY = "tgsa"
+    public static let DEFAULT_OFFICE = "dfo"
+    public static let WIFI_LIST = "wfi"
+    
+    public static let TPS_NAME = "tps_name"
+    public static let TPS_KELURAHAN = "tps_klh"
+    public static let TPS_SUB_DISTRICT = "tps_sdt"
+    public static let TPS_DISTRICT = "tps_dtt"
+    public static let TPS_PROVINCE = "tps_prv"
+    
+    public static let RACI_R = "racir"
+    public static let RACI_A = "racia"
+    public static let RACI_C = "racic"
+    public static let RACI_I = "racii"
+    
+    public static let THUMBNAIL_ACTIVITY = "thumb_act"
+    public static let THUMBNAIL_CLIENT = "thumb_client"
+    public static let CONTACT_LIST = "contact_number"
+    public static let FRIEND_MSISDN = "fmdn"
+    public static let FRIEND_FPIN = "ffpin"
+    public static let FRIEND_FIMEI = "fimei"
+    
+    
+    public static let LAC_ID = "lac"
+    public static let CELL_ID = "cid"
+    public static let MCC_ID = "mcc"
+    public static let MNC_ID = "mnc"
+    public static let PCI_ID = "pci"
+    
+    public static let ROC_DATE = "ROD"
+    public static let ROC_SIZE = "ROS"
+    public static let IS_EDUCATION = "IED"
+    public static let IS_SUB_ACCOUNT = "ISA"
+    public static let IS_CHANGE_PROFILE = "ICP";
+    public static let LEVEL_EDU = "lvledu"
+    public static let MATERI_EDU = "mtredu"
+    public static let FINALTEST_EDU = "tstedu"
+    
+    public static let MIX_CATEGORY_POST = "mcp"
+    
+    
+    /**
+     * For CUB Web
+     */
+    public static let DELETE_MESSAGE_FLAG = "D01"
+    public static let CHANGE_PERSON_FLAG = "C01"
+    public static let CHANGE_GROUP_INFO_FLAG = "C02"
+    public static let CHANGE_MEMBER_POSITION_GROUP_FLAG = "C03"
+    public static let CHANGE_TOPIC_FLAG = "C04"
+    public static let SEARCH_MESSAGE_FLAG = "C05"
+    public static let VIEW_MEDIA_FLAG = "C06"
+    public static let IS_STARED_MESSAGE = "IS1"
+    public static let FROM_WEB = "W01"
+    public static let STATUS_FORM = "SF"
+    public static let POP_HOST = "EM1"
+    public static let POP_PORT = "EM2"
+    public static let SMTP_HOST = "EM3"
+    public static let SMTP_PORT = "EM4"
+    public static let DOMAIN = "EM5"
+    public static let EX_LOCK = "EX1"
+    public static let PARTICIPATE_ID = "PTI"
+    public static let PARTICIPATE_SIZE = "PTZ"
+    public static let POST_ID = "PO1"
+    public static let POST_ID_PARTICIPATE = "PO2"
+    public static let PARTICIPATE_DATE = "PO3"
+    public static let BEFORE_FLAG_CHANGED = "BC1"
+    public static let LIKES       = "like"
+    public static let DISLIKES       = "dislike"
+    public static let FLAG_REACTION = "FL1"
+    public static let AUDITION_DATE = "FL2"
+    public static let TYPE_ADS = "FL4"
+    public static let TYPE_LP = "FL5"
+    public static let TYPE_POST = "FL6"
+    public static let ADDRESS = "A158"
+    
+    public static let TYPE_REGISTER = "reg"
+    
+    
+    public static let FLAG_REPORT="rpt"
+    public static let REPORT_DATE = "report_date"
+    public static let REASON = "reason"
+    public static let  LAST_EDIT         = "l_ed"
+    
+    public static let BIDANG_INDUSTRI = "A164"
+    public static let VISI = "A165"
+    public static let MISI = "A166"
+    public static let COMPANY_LAT = "A167"
+    public static let COMPANY_LNG = "A168"
+    public static let COMPANY_WEB = "A169"
+    public static let COMPANY_CERTIFICATE = "certf"
+    public static let OFFICIAL_ACCOUNT = "oacc"
+    public static let TOTAL_FOLLOWERS = "tflr"
+    
+    public static let OFFSET = "ofs"
+    public static let URL = "url"
+    
+    public static let COUNT_POST = "A170"
+    public static let COUNT_FOLLOWER = "A171"
+    public static let COUNT_FOLLOWING = "A172"
+    public static let NEW_RACI_R = "new_r"
+    public static let NEW_RACI_A = "new_a"
+    public static let NEW_RACI_C = "new_c"
+    public static let NEW_RACI_I = "new_i"
+    public static let VERSION = "V01"
+    public static let PROJECT_REF = "prr"
+    public static let PROJECT = "prj"
+    public static let OWNER = "own"
+    public static let PRODUCT = "prd"
+    public static let LOCAL_TIMESTAMP = "lcltm"
+    public static let IS_CONSULT = "ics"
+    public static let ACK_QTY = "ACQ"
+    public static let SENT_QTY = "STQ"
+    public static let MAIL_ACCOUNT = "mla"
+    public static let TEXT_PLAIN = "tpl"
+    public static let TOTAL = "ttl"
+    public static let SUB_TOTAL = "A150"
+    public static let IS_CALL_CENTER = "icc"
+    public static let CALL_CENTER_ID = "ccid"
+    
+    public static let MERCHANT_ID = "MERID"
+    public static let MERCHANT_IMAGE = "MERIMG"
+    public static let MERCHANT_DESCRIPTION = "MERDSC"
+    public static let MERCHANT_ADDRESS = "MERADD"
+    public static let MERCHANT_OPENTIME = "MEROPT"
+    public static let MERCHANT_CLOSETIME = "MERCLT"
+    public static let MERCHANT_NAME = "MERNAM"
+    
+    public static let SCORE = "SC"
+    public static let FILTER = "FL"
+    public static let FILTER_ACCOUNT  = "FLA"
+    public static let FILTER_CATEGORY = "FLC"
+    
+    public static let NOTIF = "NTF"
+    
+    public static let PROCESS_ID      = "PID"
+    public static let RESPONSE_LABEL  = "RLB"
+    public static let RESPONSE_TYPE   = "RTY"
+    public static let RESPONSE_PARAM  = "RPR"
+    
+    public static let TOKEN = "TKN"
+    
+    public static let MEDIA_LENGTH = "ML"
+    
+    public static let SURVEY_ID = "SVI"
+    
+    
+
+    public static let TARGET_CONTENT   = "TTC";
+    public static let PRICING   = "PRC";
+    public static let PRICING_MONEY   = "PRM";
+    public static let ACCESS            = "ACS";
+    public static let SOCIAL_ACCESS  = "ACS1";
+    public static let MEDICAL_ACCESS  = "ACS2";
+    public static let HANDYCRAFT_ACCESS  = "ACS3";
+    
+    public static let APN_TOKEN = "apt"
+    public static let CALL_TOKEN = "cpt"
+    
+    public static let SCHOOL_STUDENT_NAME = "SCH1";
+    public static let SCHOOL_STUDENT_PARENT_NAME = "SCH2";
+    public static let SCHOOL_STUDENT_EMAIL = "SCH3";
+    
+    public static let LAST_SIGN = "LSG";
+    public static let ANDROID_ID = "AID";
+    public static let ANDROID_APP_NAME = "AAN";
+    public static let CPAAS_VERSION = "CPN";
+    
+    public static let MAJOR_EDU = "majoredu";
+    public static let SCHOOL_ID = "schoolid";
+    public static let SCHOOL_DESC = "schooldesc";
+    public static let EDU_STAGE = "edustage";
+    public static let QUESTION_QUIZ = "question";
+
+    public static let API = "Api";
+    public static let CHANNEL = "channel";
+    public static let TAGLINE = "tagline";
+    
+    public static let MEMBER_DATA = "MDT";
+    public static let GET_LIST_LS = "GTS";
+    
+    public static let PHONE_NUMBER = "PHN";
+    public static let WORKING_AREA = "WKA";
+    public static let IS_SECOND_LAYER = "ISL";
+    
+    public static let IS_ENABLED_ANONYMOUS = "A999";
+    
+    public static let TOTAL_PAYMENT = "TPM";
+    
+    public static let IS_ANIMATION = "ISN";
+    public static let START_ANIMATION = "SANI";
+    public static let LOOP_ANIMATION = "LANI";
+    public static let SCALE = "SCL";
+    public static let STYLE = "STL";
+    public static let GIF_ID = "GF";
+    
+}

+ 50 - 0
appbuilder-ios/NexilisUC/NexilisUC/Source/Message/CoreMessage_TMessageUtil.swift

@@ -0,0 +1,50 @@
+//
+//  CoreMessage_TMessageUtil.swift
+//  NexilisUC
+//
+//  Created by Maronakins on 04/11/24.
+//
+
+import Foundation
+
+public class CoreMessage_TMessageUtil {
+        
+    private static var mTID = NSDate().timeIntervalSince1970 * 1000
+    
+    public static func getTID() -> String {
+        mTID = Double(Int(mTID) + Int(1))
+        return String(Int(mTID))
+    }
+    
+    public static func getString(json: Any, key: String) -> String {
+        return getString(json: json, key: key, def: "")
+    }
+    
+    public static func getString(json: Any, key: String, def: String) -> String {
+        if let dict = json as? [String: Any], let value = dict[key] as? String {
+            if !value.isEmpty {
+                return value
+            }
+        }
+        return def
+    }
+    
+    public static func getInt(json: Any, key: String, def: Int) -> Int {
+        if let dict = json as? [String: Any], let value = dict[key] as? Int {
+            return value
+        }
+        return def
+    }
+    
+    public static func getIntAsString(json: Any, key: String, def: Int) -> String {
+        return String(getInt(json: json, key: key, def: def))
+    }
+    
+    public static func getLong(json: Any, key: String, def: CLong) -> CLong {
+        if let dict = json as? [String: Any], let value = dict[key] as? CLong {
+            return value
+        }
+        return def
+    }
+    
+}

+ 331 - 0
appbuilder-ios/NexilisUC/NexilisUC/Source/Message/TMessage.swift

@@ -0,0 +1,331 @@
+//
+//  TMessage.swift
+//  NexilisUC
+//
+//  Created by Maronakins on 04/11/24.
+//
+
+import Foundation
+
+public class TMessage {
+    public var mType: String = ""
+    public var mVersion: String = ""
+    public var mCode: String = ""
+    public var mStatus: String = ""
+    public var mPIN: String = ""
+    public var mL_PIN: String = ""
+    public var mBodies: [String: String] = [String: String]()
+    private var mMedia:[UInt8] = [UInt8]()
+    
+    let C_HEADER:UnicodeScalar = UnicodeScalar(0x01)
+    let C_ENTRY:UnicodeScalar = UnicodeScalar(0x02)
+    let C_KEYVAL:UnicodeScalar = UnicodeScalar(0x03)
+    let C_ARRAY:UnicodeScalar = UnicodeScalar(0x04)
+    
+    var S_HEADER: String = ""
+    var S_ENTRY: String = ""
+    var S_KEYVAL: String = ""
+    var S_ARRAY: String = ""
+    
+    
+    public static let TYPE_SQLITE_ONLY =  "1"
+    public static let TYPE_ALL         =  "2"
+    public static let TYPE_NEED_ACK    =  "3"
+    
+    public init() {
+        mVersion = "1.0.111"
+        mBodies[CoreMessage_TMessageKey.IMEI] = TMessage.getCLMUserId()
+//        mBodies[CoreMessage_TMessageKey.VERCOD] = UIApplication.appVersion
+        mBodies[CoreMessage_TMessageKey.VERCOD] = "2.2.177"
+    }
+    
+    public init(data : String) {
+        _ = unpack(data: data)
+    }
+    
+    init(type: String, version: String, code: String,status: String, pin: String, l_pin: String, bodies:[String: String], media:  [UInt8]) {
+        mType = type
+        mVersion = version
+        mCode = code
+        mStatus = status
+        mPIN = pin
+        mL_PIN = l_pin
+        mBodies = bodies
+        mMedia = media
+        mBodies[CoreMessage_TMessageKey.IMEI] = TMessage.getCLMUserId()
+//        mBodies[CoreMessage_TMessageKey.VERCOD] = UIApplication.appVersion
+        mBodies[CoreMessage_TMessageKey.VERCOD] = "2.2.177"
+    }
+    
+    static func getCLMUserId() -> String {
+        guard let me = UserDefaults.standard.string(forKey: "me") else {
+            return ""
+        }
+        return me
+    }
+    
+    public func clone(p_tmessage:TMessage) -> TMessage {
+        return TMessage(
+            type: p_tmessage.mType,
+            version: p_tmessage.mVersion,
+            code: p_tmessage.mCode,
+            status: p_tmessage.mStatus,
+            pin: p_tmessage.mPIN,
+            l_pin: p_tmessage.mL_PIN,
+            bodies: p_tmessage.mBodies,
+            media: p_tmessage.mMedia
+        )
+    }
+    
+    public func setMedia(media: [UInt8]) {
+        mMedia = media
+        mBodies[CoreMessage_TMessageKey.MEDIA_LENGTH] = String(media.count)
+    }
+    
+    public func getCode() -> String {
+        return mCode
+    }
+    public func getStatus() -> String {
+        return mStatus
+    }
+    public func getPIN() -> String {
+        return mPIN
+    }
+    public func getType() -> String {
+        return mType
+    }
+    public func getL_PIN() -> String {
+        return mL_PIN
+    }
+    public func getMedia() -> [UInt8] {
+        return mMedia
+    }
+    public func getBody(key : String) -> String {
+        if let data = mBodies[key] {
+            return data
+        }
+        else {
+            return ""
+        }
+    }
+    public func getBody(key : String, default_value: String) -> String {
+        if ((mBodies[key] == nil)) {
+            return default_value
+        } else if mBodies[key] == "null" {
+            return default_value
+        } else {
+            return mBodies[key]!
+        }
+    }
+    
+    public func getBodyAsInteger(key : String, default_value: Int) -> Int {
+        if ((mBodies[key] == nil)) {
+            return default_value
+        } else if mBodies[key] == "null" {
+            return default_value
+        } else {
+            return Int(mBodies[key]!)!
+        }
+    }
+    public func getBodyAsLong(key : String, default_value: CLong) -> CLong {
+        if let body = mBodies[key] {
+            if (body == "null") {
+                return default_value
+            }
+            if (body == "nil") {
+                return default_value
+            }
+            return (body as NSString).integerValue
+            
+        }
+        else {
+            return default_value
+        }
+    }
+    
+    public func pack() -> String {
+        if (S_HEADER.isEmpty) { S_HEADER.append(Character(C_HEADER)) }
+        
+        var data = ""
+        data.append(mType)
+        data.append(Character(C_HEADER))
+        data.append(mVersion)
+        data.append(Character(C_HEADER))
+        data.append(mCode)
+        data.append(Character(C_HEADER))
+        data.append(mStatus)
+        data.append(Character(C_HEADER))
+        data.append(mPIN)
+        data.append(Character(C_HEADER))
+        data.append(mL_PIN)
+        data.append(Character(C_HEADER))
+        data.append(toString(body: mBodies))
+        data.append(Character(C_HEADER))
+        if let media = String(data: Data(getMedia()), encoding: .windowsCP1250) {
+            data.append(media)
+        }
+        return data
+        
+    }
+    
+    
+    public func toBytes() -> [UInt8] {
+        let data:String = pack()
+        var result: [UInt8] = Array(data.utf8)
+        //print("[bytes_processing] build bytes data:" + String(result.count) + ", media:" + String(getMedia().count))
+        if (!getMedia().isEmpty) {
+            for index in 0...getMedia().count - 1 {
+                result.append(getMedia()[index])
+            }
+        }
+        return result
+        
+    }
+    
+    private func toString(body : [String: String]) -> String {
+        if (S_ENTRY.isEmpty) { S_ENTRY.append(Character(C_ENTRY)) }
+        if (S_KEYVAL.isEmpty) { S_KEYVAL.append(Character(C_KEYVAL)) }
+        
+        var result = ""
+        for (key, value) in body {
+            result += key + S_KEYVAL + value + S_ENTRY
+        }
+        if (!result.isEmpty) {
+            result = String(result.prefix(result.count - 1))
+        }
+        return result
+    }
+    
+    private func toMediaBytes(image: String) ->  [UInt8] {
+        if (image == "null") {
+            return [UInt8]()
+        }
+        if let data = NSData(base64Encoded: image, options: .ignoreUnknownCharacters) {
+            var buffer = [UInt8](repeating: 0, count: data.length)
+            data.getBytes(&buffer, length: data.length)
+            return buffer
+        }
+        return [UInt8]()
+    }
+    
+    public func unpack(data: String) -> Bool {
+        var result  = false
+        if (S_HEADER.isEmpty) { S_HEADER.append(Character(C_HEADER)) }
+        let headers = data.split(separator: Character(C_HEADER), maxSplits: 8, omittingEmptySubsequences: false)
+        if (headers.count == 8) {
+            mType    = String(headers[0])
+            mVersion = String(headers[1])
+            mCode    = String(headers[2])
+            mStatus  = String(headers[3])
+            mPIN     = String(headers[4])
+            mL_PIN   = String(headers[5])
+            mBodies  = toBodies(data: String(headers[6]))
+            mMedia   = toMediaBytes(image: String(headers[7]))
+            result   = true
+        }
+        return result
+    }
+    
+    public func unpack(bytes_data: [UInt8]) -> Bool {
+        var result  = false
+        let data = getData(bytes_data: bytes_data)
+        let headers = data.split(separator: Character(C_HEADER), maxSplits: 8, omittingEmptySubsequences: false)
+        if (headers.count >= 8) {
+            mType    = String(headers[0])
+            mVersion = String(headers[1])
+            mCode    = String(headers[2])
+            mStatus  = String(headers[3])
+            mPIN     = String(headers[4])
+            mL_PIN   = String(headers[5])
+            mBodies  = toBodies(data: String(headers[6]))
+            mMedia   = getMedia(bytes_data: bytes_data)
+            result   = true
+        }
+        else {
+            //print("[bytes_processing] Invalid header length: " + String(headers.count))
+        }
+        return result
+    }
+    
+    private func toBodies(data: String) -> [String: String]  {
+        var cvalues = [String: String]()
+        
+        if (data.isEmpty || data == "") {
+            return cvalues
+        }
+        if (S_ENTRY.isEmpty) { S_ENTRY.append(Character(C_ENTRY)) }
+        if (S_KEYVAL.isEmpty) { S_KEYVAL.append(Character(C_KEYVAL)) }
+        
+        let elements = data.split(separator: Character(C_ENTRY), omittingEmptySubsequences: false)
+        
+        for element in elements {
+            let keyval = element.split(separator: Character(C_KEYVAL), omittingEmptySubsequences: false)
+            cvalues[String(keyval[0])] = String(keyval[1])
+        }
+        return cvalues
+    }
+    
+    private func getData(bytes_data : [UInt8]) -> String {
+        var result = ""
+        if (S_HEADER.isEmpty) { S_HEADER.append(Character(C_HEADER)) }
+        
+        var iLength = 0
+        for bData in bytes_data {
+            let chr = Character(UnicodeScalar(bData))
+            
+            if (chr == Character(C_HEADER)) {
+                iLength = iLength + 1
+                if (iLength == 8) {
+                    break
+                }
+            }
+            result.append(chr)
+        }
+        return result
+    }
+    
+    private func getMedia(bytes_data:  [UInt8]) ->  [UInt8] {
+        var result:[UInt8] = [UInt8]()
+        if bytes_data.count > 0 {
+            var ml = getBodyAsInteger(key: CoreMessage_TMessageKey.MEDIA_LENGTH, default_value: 0)
+            if ml == 0 {
+                ml = getBodyAsInteger(key: CoreMessage_TMessageKey.FILE_SIZE, default_value: 0)
+            }
+            if ml > 0 {
+                let start = bytes_data.count - ml
+                for index in start...bytes_data.count - 1 {
+                    result.append(bytes_data[index])
+                }
+            }
+        }
+        return result
+    }
+    
+    public func toLogString() -> String {
+        var result = ""
+        result += ("[" + mType + "]")
+        result += ("[" + mVersion + "]")
+        result += ("[" + mCode + "]")
+        result += ("[" + mStatus + "]")
+        result += ("[" + mPIN + "]")
+        result += ("[" + mL_PIN + "]")
+        result += ("[" + toBodyLogString() + "]")
+        result += ("[" + String(mMedia.count) + "]")
+        return result
+    }
+    
+    private func toBodyLogString() -> String {
+        if (S_ENTRY.isEmpty) { S_ENTRY.append(Character(C_ENTRY)) }
+        if (S_KEYVAL.isEmpty) { S_KEYVAL.append(Character(C_KEYVAL)) }
+        
+        var result = ""
+        for (key, value) in mBodies {
+            result += "{" + key + "=" + value + "}"
+        }
+        return result
+    }
+    
+    public func isOk() -> Bool {
+        return getBody(key: CoreMessage_TMessageKey.ERRCOD, default_value: "99") == "00"
+    }
+}

+ 114 - 0
appbuilder-ios/NexilisUC/NexilisUC/Source/Prefs.swift

@@ -0,0 +1,114 @@
+//
+//  Prefs.swift
+//  NexilisUC
+//
+//  Created by Maronakins on 04/11/24.
+//
+
+import Foundation
+
+
+class Prefs {
+    static let CPAAS_MODE_FLOATING = 0
+    static let CPAAS_MODE_DOCKED = 1
+    static let CPAAS_MODE_BURGER = 2
+    static let CPAAS_MODE_MIX = 4
+    static let DEFAULT_CPAAS_MODE = CPAAS_MODE_DOCKED
+    
+    static func getCpaasMode() -> Int {
+        let mode = UserDefaults.standard.integer(forKey: "cpaas_mode")
+        if(mode != 0) {
+            return mode - 1
+        }
+        return Prefs.DEFAULT_CPAAS_MODE
+    }
+    
+    static func setCpaasMode(mode: Int){
+        UserDefaults.standard.set(mode+1, forKey: "cpaas_mode")
+    }
+    
+    static var CUSTOM_TAB = "1,2,3,4"
+    
+    static func getCustomTab() -> String {
+        if let cust = UserDefaults.standard.string(forKey: "custom_tab"){
+            if(!cust.isEmpty){
+                return cust
+            }
+        }
+        return Prefs.CUSTOM_TAB
+    }
+    
+    static func getURLFirstTab() -> String? {
+        return UserDefaults.standard.string(forKey: "app_builder_url_first_tab")
+    }
+    
+    static func getURLThirdTab() -> String? {
+        return UserDefaults.standard.string(forKey: "app_builder_url_third_tab")
+    }
+    static func getURLBase() -> String {
+        return UserDefaults.standard.string(forKey: "app_builder_url_base") ?? "https://nexilis.io/"
+    }
+    static func getURLQMS() -> String? {
+        return UserDefaults.standard.string(forKey: "app_builder_url_qms")
+    }
+    static func getIconDock() -> String {
+        return UserDefaults.standard.string(forKey: "app_builder_icon_dock") ?? ""
+    }
+    static func getIconSS() -> String? {
+        return UserDefaults.standard.string(forKey: "app_builder_icon_ss")
+    }
+    static func getBackground() -> String {
+        return UserDefaults.standard.string(forKey: "app_builder_background") ?? ""
+    }
+    
+    static func getBackgroundLight() -> String {
+        UserDefaults.standard.string(forKey: "app_builder_background_light") ?? ""
+    }
+
+    static func getBackgroundDark() -> String {
+        UserDefaults.standard.string(forKey: "app_builder_background_dark") ?? ""
+    }
+    
+    static func getUrlSS() -> String? {
+        return Prefs.getURLBase() + "get_file_from_path?img=" + Prefs.getIconSS()!
+    }
+    static func getUrlDock() -> String? {
+        return Prefs.getURLBase() + "get_file_from_path?img=" + Prefs.getIconDock()
+    }
+    
+    static func getURLPrivacyPolicy() -> String {
+        return UserDefaults.standard.string(forKey: "app_builder_url_privacy_policy") ?? "https://nexilis.io/privacypolicy"
+    }
+    
+    static func getEnablePrivacyPolicy() -> Bool {
+        return UserDefaults.standard.bool(forKey: "app_builder_enable_privacy_policy")
+    }
+    
+    static func getAgreePrivacyPolicy() -> Bool {
+        return UserDefaults.standard.bool(forKey: "agree_privacy_policy")
+    }
+    
+    static func setAgreePrivacyPolicy(value: Bool){
+        UserDefaults.standard.set(value, forKey: "agree_privacy_policy")
+    }
+    static func getTerms() -> Bool {
+        return UserDefaults.standard.bool(forKey: "terms_app")
+    }
+    
+    static func setTerms(value: Bool){
+        UserDefaults.standard.set(value, forKey: "terms_app")
+    }
+    
+    static func getCustomButtons() -> String {
+        UserDefaults.standard.string(forKey: "app_builder_custom_buttons") ?? ""
+    }
+    
+    static func getCustomFBIcon() -> String {
+        UserDefaults.standard.string(forKey: "app_builder_button_icon") ?? ""
+    }
+    
+    static func getIconCenterAnim() -> String? {
+        UserDefaults.standard.string(forKey: "fb_icon_center_anim")
+    }
+    
+}

+ 24 - 0
appbuilder-ios/NexilisUC/NexilisUC/Source/Services/AudioCallService.swift

@@ -0,0 +1,24 @@
+//
+//  AudioCallService.swift
+//  NexilisUC
+//
+//  Created by Maronakins on 04/11/24.
+//
+
+import nuSDKService
+
+public class AudioCallService {
+    
+    public static func apiInitiateAudioCall(destination: String) {
+        API.initiateCCall(sParty: destination)
+    }
+    
+    public static func apiReceiveAudioCall(destination: String) {
+        API.receiveCCall(sParty: destination)
+    }
+    
+    public static func apiEndAudioCall() {
+        API.terminateCall(sParty: nil)
+    }
+    
+}

+ 25 - 0
appbuilder-ios/NexilisUC/NexilisUC/Source/Services/LiveStreamingService.swift

@@ -0,0 +1,25 @@
+//
+//  LiveStreamingService.swift
+//  NexilisUC
+//
+//  Created by Maronakins on 04/11/24.
+//
+
+import UIKit
+import nuSDKService
+
+public class LiveStreamingService {
+    
+    public static func apiInitiateStreaming(localView: UIImageView, titleStream: String = "", backCamera: Bool = false) {
+        API.initiateBC(sTitle: titleStream, nCamIdx: backCamera ? 0 : 1, nResIdx: 2, nVQuality: 4, ivLocalView: localView)
+    }
+    
+    public static func apiJoinStreaming(streamerId: String, remoteView: UIImageView) {
+        API.joinBC(sBroadcasterID: streamerId, ivRemoteView: remoteView)
+    }
+    
+    public static func apiTerminateStreaming(streamerId: String?) {
+        API.terminateBC(sBroadcasterID: streamerId)
+    }
+    
+}

+ 25 - 0
appbuilder-ios/NexilisUC/NexilisUC/Source/Services/VideoCallService.swift

@@ -0,0 +1,25 @@
+//
+//  VideoCallService.swift
+//  NexilisUC
+//
+//  Created by Maronakins on 04/11/24.
+//
+
+import UIKit
+import nuSDKService
+
+public class VideoCallService {
+    
+    public static func apiInitiateVideoCall(destination: String, backCamera: Bool = false, listRemoteViews: [UIImageView], localView: UIImageView, remoteViewSpeaker: UIImageView) {
+        API.initiateCCall(sParty: destination, nCamIdx: backCamera ? 0 : 1, nResIdx: 2, nVQuality: 4, ivRemoteView: listRemoteViews, ivLocalView: localView, ivRemoteZ: remoteViewSpeaker)
+    }
+    
+    public static func apiReceiveVideoCall(destination: String, backCamera: Bool = false, listRemoteViews: [UIImageView], localView: UIImageView, remoteViewSpeaker: UIImageView) {
+        API.receiveCCall(sParty: destination, nCamIdx: backCamera ? 0 : 1, nResIdx: 2, nVQuality: 4, ivRemoteView: listRemoteViews, ivLocalView: localView, ivRemoteZ: remoteViewSpeaker)
+    }
+    
+    public static func apiEndVideoCall() {
+        API.terminateCall(sParty: nil)
+    }
+    
+}

+ 31 - 0
appbuilder-ios/NexilisUC/NexilisUC/Source/UCUtils.swift

@@ -0,0 +1,31 @@
+//
+//  UCUtils.swift
+//  NexilisUC
+//
+//  Created by Maronakins on 04/11/24.
+//
+
+class UCUtils {
+    
+    public static let M_USER_ANDROID_ID = "UNK"
+    public static let CPAAS_VERSION = "UCPaaS-Nexilis.3.2.8"
+    
+    private static var appNm = ""
+    
+    public static func getAppNm() -> String {
+        return appNm
+    }
+    
+    public static func getMyPin() -> String? {
+        return UserDefaults.standard.string(forKey: "me")
+    }
+    
+    public static func setLoginMultipleFPin(value: String) {
+        UserDefaults.standard.set(value, forKey: "pb_login_multiple_f_pin")
+    }
+
+    public static func getLoginMultipleFPin() -> String {
+        UserDefaults.standard.string(forKey: "pb_login_multiple_f_pin") ?? ""
+    }
+    
+}