wenweiwei 3 lat temu
rodzic
commit
fee400fd13
33 zmienionych plików z 592 dodań i 1940 usunięć
  1. 28 7
      BFCommonKit.podspec
  2. 10 8
      BFCommonKit/Classes/BFCategorys/BFBundle+Ext.swift
  3. 68 2
      BFCommonKit/Classes/BFCategorys/BFColor+Ext.swift
  4. 6 7
      BFCommonKit/Classes/BFCategorys/BFInt+Ext.swift
  5. 33 35
      BFCommonKit/Classes/BFCategorys/BFString+Ext.swift
  6. 2 2
      BFCommonKit/Classes/BFCategorys/BFUIButton+ext.swift
  7. 12 2
      BFCommonKit/Classes/BFCategorys/BFUIImage+Ext.swift
  8. 37 40
      BFCommonKit/Classes/BFCategorys/BFUIView+Ext.swift
  9. 36 40
      BFCommonKit/Classes/BFCategorys/NXFundation+Ext.swift
  10. 118 121
      BFCommonKit/Classes/BFCategorys/NXUI+Ext.swift
  11. 0 77
      BFCommonKit/Classes/BFCategorys/NXUIColor+Ext.swift
  12. 0 114
      BFCommonKit/Classes/BFCustomViews/views/NXBadgeView/NXBadgeControl.swift
  13. 0 28
      BFCommonKit/Classes/BFCustomViews/views/NXBadgeView/NXBadgeView.swift
  14. 0 125
      BFCommonKit/Classes/BFCustomViews/views/NXBadgeView/UIBarButtonItem+NXBadgeView.swift
  15. 0 126
      BFCommonKit/Classes/BFCustomViews/views/NXBadgeView/UITabBarItem+NXBadgeView.swift
  16. 0 260
      BFCommonKit/Classes/BFCustomViews/views/NXBadgeView/UIView+NXBadgeView.swift
  17. 0 166
      BFCommonKit/Classes/BFCustomViews/views/bubbleLayer/NXBubbleLayer.swift
  18. 0 23
      BFCommonKit/Classes/BFCustomViews/views/bubbleLayer/NXContainView.swift
  19. 0 73
      BFCommonKit/Classes/BFCustomViews/views/bubbleLayer/NXInteractiveView.swift
  20. 0 80
      BFCommonKit/Classes/BFCustomViews/views/bubbleLayer/NXNormalBubbleView.swift
  21. 0 40
      BFCommonKit/Classes/BFCustomViews/views/bubbleLayer/NXTextBubbleView.swift
  22. 0 184
      BFCommonKit/Classes/BFCustomViews/views/bubbleLayer/NXVoiceBubbleView.swift
  23. 0 13
      BFCommonKit/Classes/BFMacro/NXConfig.swift
  24. 1 1
      BFCommonKit/Classes/BFUtility/NXAudioRecorder.swift
  25. 38 37
      BFCommonKit/Classes/BFUtility/NXDeviceManager.swift
  26. 22 24
      BFCommonKit/Classes/BFUtility/NXFileManager.swift
  27. 8 8
      BFCommonKit/Classes/BFUtility/PQBFConfig.swift
  28. 22 26
      BFCommonKit/Classes/BFUtility/PQCreateEmptyWAV.swift
  29. 12 12
      BFCommonKit/Classes/BFUtility/PQLZStringUtil.swift
  30. 2 2
      BFCommonKit/Classes/BFUtility/PQPHAssetVideoParaseUtil.swift
  31. 7 7
      BFCommonKit/Classes/BFUtility/PQWeakTimer.swift
  32. 0 11
      BFCommonKit/Classes/Enums/Enums.swift
  33. 130 239
      Example/Pods/Pods.xcodeproj/project.pbxproj

+ 28 - 7
BFCommonKit.podspec

@@ -8,7 +8,7 @@
 
 
 Pod::Spec.new do |s|
 Pod::Spec.new do |s|
   s.name             = 'BFCommonKit'
   s.name             = 'BFCommonKit'
-  s.version          = '0.1.6'
+  s.version          = '0.1.7'
   s.summary          = 'A short description of BFCommonKit.'
   s.summary          = 'A short description of BFCommonKit.'
   s.swift_version    = '5.0'
   s.swift_version    = '5.0'
 # This description is used to generate tags and improve search results.
 # This description is used to generate tags and improve search results.
@@ -32,14 +32,35 @@ TODO: Add long description of the pod here.
 
 
 #  s.source_files = 'Classes/**/*'
 #  s.source_files = 'Classes/**/*'
   # subspec
   # subspec
-  s.subspec 'Base' do |ss|
-    ss.source_files = 'BFCommonKit/Classes/Base/**/*'
-    ss.dependency 'Alamofire','4.9.1'
-    ss.frameworks = 'UIKit', 'WebKit'
+  s.subspec 'Base' do |bb|
+    bb.source_files = 'BFCommonKit/Classes/Base/**/*'
+    bb.frameworks = 'UIKit', 'WebKit'
+    bb.dependency 'Alamofire','4.9.1'
   end
   end
-  s.subspec 'BFCategorys' do |ss|
-    ss.source_files = 'BFCommonKit/Classes/BFCategorys/*'
+  s.subspec 'Enums' do |ee|
+    ee.source_files = 'BFCommonKit/Classes/Enums/*'
+    ee.frameworks = 'Foundation'
   end
   end
+  s.subspec 'BFCategorys' do |cc|
+    cc.source_files = 'BFCommonKit/Classes/BFCategorys/*'
+    cc.frameworks = 'Foundation','UIKit','MobileCoreServices','CommonCrypto'
+    cc.dependency 'KingfisherWebP','1.3.0'
+    cc.dependency 'BFCommonKit/BFUtility'
+  end
+  s.subspec 'BFUtility' do |uu|
+    uu.source_files = 'BFCommonKit/Classes/BFUtility/*'
+    uu.frameworks = 'Foundation','UIKit','AdSupport','Photos','AudioToolbox','AVKit'
+    uu.dependency 'KingfisherWebP','1.3.0'
+    uu.dependency 'Alamofire','4.9.1'
+    uu.dependency 'KeychainAccess','4.2.2'
+    uu.dependency 'Kingfisher','6.3.0'
+    uu.dependency 'Toast_Swift','5.0.1'
+  end
+  s.subspec 'BFDebug' do |dd|
+    dd.source_files = 'BFCommonKit/Classes/BFDebug/*'
+    dd.frameworks = 'UIKit','MessageUI','WebKit'
+  end
+
   # s.resource_bundles = {
   # s.resource_bundles = {
   #   'BFCommonKit' => ['BFCommonKit/Assets/*.png']
   #   'BFCommonKit' => ['BFCommonKit/Assets/*.png']
   # }
   # }

+ 10 - 8
BFCommonKit/Classes/BFCategorys/BFBundle+Ext.swift

@@ -7,16 +7,18 @@
 
 
 import Foundation
 import Foundation
 
 
-extension Bundle {
-    
+public extension Bundle {
     // bf main bundle url
     // bf main bundle url
-   public func BF_mainbundle_URL() -> URL {
-        let bundle:Bundle = Bundle.init(for: PQBaseViewController.self)
-        return bundle.url(forResource: "BFFramework", withExtension: "bundle")!
+    func BF_mainbundle_URL() -> URL {
+        guard let className = NSClassFromString("PQBaseViewController").self else {
+            return Bundle.main.url(forResource: "BFCommonKit", withExtension: "bundle")!
+        }
+        let bundle: Bundle = Bundle(for: className.self)
+        return bundle.url(forResource: "BFCommonKit", withExtension: "bundle")!
     }
     }
+
     // bf main bundle
     // bf main bundle
-    public func BF_mainbundle() -> Bundle {
-        return  Bundle.init(url: BF_mainbundle_URL())!
+    func BF_mainbundle() -> Bundle {
+        return Bundle(url: BF_mainbundle_URL())!
     }
     }
- 
 }
 }

+ 68 - 2
BFCommonKit/Classes/BFCategorys/BFColor+Ext.swift

@@ -9,8 +9,8 @@
 import Foundation
 import Foundation
 import UIKit
 import UIKit
 
 
-extension UIColor {
-    public  class func hexColor(hexadecimal: String) -> UIColor {
+public extension UIColor {
+    class func hexColor(hexadecimal: String) -> UIColor {
         var cstr = hexadecimal.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).uppercased() as NSString
         var cstr = hexadecimal.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).uppercased() as NSString
         if cstr.length < 6 {
         if cstr.length < 6 {
             return UIColor.clear
             return UIColor.clear
@@ -43,4 +43,70 @@ extension UIColor {
         Scanner(string: bStr).scanHexInt32(&b)
         Scanner(string: bStr).scanHexInt32(&b)
         return UIColor(red: CGFloat(r) / 255.0, green: CGFloat(g) / 255.0, blue: CGFloat(b) / 255.0, alpha: 1)
         return UIColor(red: CGFloat(r) / 255.0, green: CGFloat(g) / 255.0, blue: CGFloat(b) / 255.0, alpha: 1)
     }
     }
+
+    // MARK: - hex (0x000000) -> UIColor
+
+    ///
+    /// - Parameter hex (0x000000)
+    /// - Returns: UIColor
+    class func hex(hex: Int) -> UIColor {
+        return UIColor.hex(hex: hex, alpha: 1.0)
+    }
+
+    ///
+    /// - Parameters:
+    /// - Returns: UIColor
+    class func hex(hex: Int, alpha: CGFloat) -> UIColor {
+        return UIColor(red: CGFloat((hex >> 16) & 0xFF) / 255.0, green: CGFloat((hex >> 8) & 0xFF) / 255.0, blue: CGFloat(hex & 0xFF) / 255.0, alpha: alpha)
+    }
+
+    private class func colorComponent(hex: String, start: Int, length: Int) -> CGFloat {
+        let subString = hex.sliceString(start ..< (start + length))
+        let fullHex = length == 2 ? subString : (subString + subString)
+        var val: CUnsignedInt = 0
+        Scanner(string: fullHex).scanHexInt32(&val)
+        return CGFloat(val) / 255.0
+    }
+
+    var hex: String {
+        var color = self
+        if color.cgColor.numberOfComponents < 4 {
+            let components = color.cgColor.components
+
+            color = UIColor(red: components![0], green: components![0], blue: components![0], alpha: components![1])
+        }
+        if color.cgColor.colorSpace?.model != CGColorSpaceModel.rgb {
+            return "#FFFFFF"
+        }
+        return String(format: "#%02X%02X%02X", Int(color.cgColor.components![0] * 255.0), Int(color.cgColor.components![1] * 255.0), Int(color.cgColor.components![2] * 255.0))
+    }
+
+    // MARK: - RGB -> UIColor
+
+    class func rgba(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) -> UIColor {
+        return UIColor(red: red / 255.0, green: green / 255.0, blue: blue / 255.0, alpha: alpha)
+    }
+
+    // MARK: - RGBA -> UIColor
+
+    class func rgb(red: CGFloat, green: CGFloat, blue: CGFloat) -> UIColor {
+        return rgba(red: red, green: green, blue: blue, alpha: 1.0)
+    }
+
+    var rgba: [Int] {
+        var red: CGFloat = 0
+        var green: CGFloat = 0
+        var blue: CGFloat = 0
+        var alpha: CGFloat = 0
+        getRed(&red, green: &green, blue: &blue, alpha: &alpha)
+        return [Int(red * 255.0), Int(green * 255.0), Int(blue * 255.0), Int(alpha)]
+    }
+
+    class func randomColor() -> UIColor {
+        let red = CGFloat(arc4random() % 255)
+        let green = CGFloat(arc4random() % 255)
+        let blue = CGFloat(arc4random() % 255)
+        let color = UIColor(red: red / 255.0, green: green / 255.0, blue: blue / 255.0, alpha: 1.0)
+        return color
+    }
 }
 }

+ 6 - 7
BFCommonKit/Classes/BFCategorys/BFInt+Ext.swift

@@ -8,13 +8,13 @@
 
 
 import Foundation
 import Foundation
 
 
-extension Int {
+public extension Int {
     /// 分数字格式化如413200->4,132.09
     /// 分数字格式化如413200->4,132.09
 
 
     /// 是否保留2位小数
     /// 是否保留2位小数
     /// - Parameter isDecimal: <#isDecimal description#>
     /// - Parameter isDecimal: <#isDecimal description#>
     /// - Returns: <#description#>
     /// - Returns: <#description#>
-   public func paraseDecimalFormatterValue(isDecimal: Bool = false) -> String? {
+    func paraseDecimalFormatterValue(isDecimal: Bool = false) -> String? {
         let decimal = self % 100
         let decimal = self % 100
         let nonDecimal = self / 100
         let nonDecimal = self / 100
         let formatter = NumberFormatter()
         let formatter = NumberFormatter()
@@ -31,7 +31,7 @@ extension Int {
 
 
     /// 改变单位为万
     /// 改变单位为万
     /// @param originUnit <#originUnit description#>
     /// @param originUnit <#originUnit description#>
-    public func changeUnit() -> String {
+    func changeUnit() -> String {
         var unitStr: String = ""
         var unitStr: String = ""
         if self < 10000 {
         if self < 10000 {
             unitStr = "\(self)"
             unitStr = "\(self)"
@@ -42,7 +42,6 @@ extension Int {
         } else {
         } else {
             unitStr = "\(self / 10000)万"
             unitStr = "\(self / 10000)万"
         }
         }
-        BFLog(message: "转化单位:\(self) = \(unitStr)")
         return unitStr
         return unitStr
     }
     }
 }
 }
@@ -51,10 +50,10 @@ extension Int {
 
 
 /// Float64 double类型扩展
 /// Float64 double类型扩展
 
 
-extension Float64 {
+public extension Float64 {
     /// 时长转化为分秒 62'52"
     /// 时长转化为分秒 62'52"
     /// - Returns: <#description#>
     /// - Returns: <#description#>
-    public func formatDurationToMS() -> String {
+    func formatDurationToMS() -> String {
         let duration = lround(self)
         let duration = lround(self)
         var text = ""
         var text = ""
         let min = duration / 60
         let min = duration / 60
@@ -72,7 +71,7 @@ extension Float64 {
     /// 时长转化成时分秒 01:02:52
     /// 时长转化成时分秒 01:02:52
     /// - Parameter value: <#value description#>
     /// - Parameter value: <#value description#>
     /// - Returns: <#description#>
     /// - Returns: <#description#>
-    public  func formatDurationToHMS() -> String {
+    func formatDurationToHMS() -> String {
         var theTime = lround(self)
         var theTime = lround(self)
         var theTime1 = 0 // 分
         var theTime1 = 0 // 分
         var theTime2 = 0 // 小时
         var theTime2 = 0 // 小时

+ 33 - 35
BFCommonKit/Classes/BFCategorys/BFString+Ext.swift

@@ -6,36 +6,36 @@
 //  Copyright © 2020 BytesFlow. All rights reserved.
 //  Copyright © 2020 BytesFlow. All rights reserved.
 //
 //
 
 
+import CommonCrypto
 import Foundation
 import Foundation
 import MobileCoreServices
 import MobileCoreServices
-import CommonCrypto
 
 
-extension String {
+public extension String {
     /// md5加密
     /// md5加密
-   public var md5: String {
+    var md5: String {
         let str = cString(using: String.Encoding.utf8)
         let str = cString(using: String.Encoding.utf8)
         let strLen = CUnsignedInt(lengthOfBytes(using: String.Encoding.utf8))
         let strLen = CUnsignedInt(lengthOfBytes(using: String.Encoding.utf8))
         let digestLen = Int(CC_MD5_DIGEST_LENGTH)
         let digestLen = Int(CC_MD5_DIGEST_LENGTH)
         let result = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: digestLen)
         let result = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: digestLen)
         CC_MD5(str!, strLen, result)
         CC_MD5(str!, strLen, result)
         let hash = NSMutableString()
         let hash = NSMutableString()
-        for i in 0..<digestLen {
+        for i in 0 ..< digestLen {
             hash.appendFormat("%02x", result[i])
             hash.appendFormat("%02x", result[i])
         }
         }
         result.deallocate()
         result.deallocate()
         return hash as String
         return hash as String
     }
     }
-    
+
     // 文件后缀名
     // 文件后缀名
-    public  var pathExtension: String {
+    var pathExtension: String {
         return (self as NSString).pathExtension
         return (self as NSString).pathExtension
     }
     }
 
 
-    public func ga_widthForComment(font: UIFont, height: CGFloat = 15) -> CGFloat {
-
+    func ga_widthForComment(font: UIFont, height: CGFloat = 15) -> CGFloat {
         let rect = NSString(string: self).boundingRect(with: CGSize(width: CGFloat(MAXFLOAT), height: height), options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil)
         let rect = NSString(string: self).boundingRect(with: CGSize(width: CGFloat(MAXFLOAT), height: height), options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil)
         return ceil(rect.width)
         return ceil(rect.width)
     }
     }
+
 //
 //
 //    public  func ga_heightForComment(fontSize: CGFloat, width: CGFloat) -> CGFloat {
 //    public  func ga_heightForComment(fontSize: CGFloat, width: CGFloat) -> CGFloat {
 //        let font = UIFont.systemFont(ofSize: fontSize)
 //        let font = UIFont.systemFont(ofSize: fontSize)
@@ -48,9 +48,8 @@ extension String {
 //        let rect = NSString(string: self).boundingRect(with: CGSize(width: width, height: CGFloat(MAXFLOAT)), options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil)
 //        let rect = NSString(string: self).boundingRect(with: CGSize(width: width, height: CGFloat(MAXFLOAT)), options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil)
 //        return ceil(rect.height)>maxHeight ? maxHeight : ceil(rect.height)
 //        return ceil(rect.height)>maxHeight ? maxHeight : ceil(rect.height)
 //    }
 //    }
- 
 
 
-    public  func enumerateSearchText(searchText: String?, complate: (_ idx: Int, _ range: NSRange) -> Void) {
+    func enumerateSearchText(searchText: String?, complate: (_ idx: Int, _ range: NSRange) -> Void) {
         if searchText == nil || (searchText?.count ?? 0) <= 0 || !contains(searchText!) {
         if searchText == nil || (searchText?.count ?? 0) <= 0 || !contains(searchText!) {
             return
             return
         }
         }
@@ -68,13 +67,12 @@ extension String {
         }
         }
     }
     }
 
 
-    public  func attributedTextWithSearchText(searchText: String?, textColor: UIColor, textFont: UIFont, searchTextColor: UIColor, searchTextFont: UIFont) -> NSMutableAttributedString {
+    func attributedTextWithSearchText(searchText: String?, textColor: UIColor, textFont: UIFont, searchTextColor: UIColor, searchTextFont: UIFont) -> NSMutableAttributedString {
         let attbText = NSMutableAttributedString(string: self, attributes: [NSAttributedString.Key.font: textFont, NSAttributedString.Key.foregroundColor: textColor])
         let attbText = NSMutableAttributedString(string: self, attributes: [NSAttributedString.Key.font: textFont, NSAttributedString.Key.foregroundColor: textColor])
         if count <= 0 || searchText == nil || (searchText?.count ?? 0) <= 0 {
         if count <= 0 || searchText == nil || (searchText?.count ?? 0) <= 0 {
             return attbText
             return attbText
         }
         }
         for tempStr in searchText! {
         for tempStr in searchText! {
-            BFLog(message: "self = \(self),searchText = \(searchText ?? ""),tempStr = \(tempStr)")
             enumerateSearchText(searchText: "\(tempStr)") { _, range in
             enumerateSearchText(searchText: "\(tempStr)") { _, range in
                 attbText.setAttributes([NSAttributedString.Key.font: searchTextFont, NSAttributedString.Key.foregroundColor: searchTextColor], range: range)
                 attbText.setAttributes([NSAttributedString.Key.font: searchTextFont, NSAttributedString.Key.foregroundColor: searchTextColor], range: range)
             }
             }
@@ -83,14 +81,14 @@ extension String {
     }
     }
 
 
     // 判断是否为空
     // 判断是否为空
-    public  var isSpace: Bool {
+    var isSpace: Bool {
         return allSatisfy { $0.isWhitespace }
         return allSatisfy { $0.isWhitespace }
     }
     }
 
 
     /// 通过 文件路径/文件名/文件后缀 获取mimeType(文件媒体类型)
     /// 通过 文件路径/文件名/文件后缀 获取mimeType(文件媒体类型)
     /// - Parameter pathExtension: <#pathExtension description#>
     /// - Parameter pathExtension: <#pathExtension description#>
     /// - Returns: <#description#>
     /// - Returns: <#description#>
-    public func mimeType() -> String {
+    func mimeType() -> String {
         if let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (self as NSString).pathExtension as CFString, nil)?.takeRetainedValue() {
         if let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (self as NSString).pathExtension as CFString, nil)?.takeRetainedValue() {
             if let mimetype = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType)?
             if let mimetype = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType)?
                 .takeRetainedValue()
                 .takeRetainedValue()
@@ -102,19 +100,19 @@ extension String {
     }
     }
 
 
     // 将原始的url编码为合法的url
     // 将原始的url编码为合法的url
-    public  func urlEncoded() -> String {
+    func urlEncoded() -> String {
         let encodeUrlString = addingPercentEncoding(withAllowedCharacters:
         let encodeUrlString = addingPercentEncoding(withAllowedCharacters:
             .urlQueryAllowed)
             .urlQueryAllowed)
         return encodeUrlString ?? ""
         return encodeUrlString ?? ""
     }
     }
 
 
     // 将编码后的url转换回原始的url
     // 将编码后的url转换回原始的url
-    public func urlDecoded() -> String {
+    func urlDecoded() -> String {
         return removingPercentEncoding ?? ""
         return removingPercentEncoding ?? ""
     }
     }
 
 
     // 判断是否包含Emoji表情
     // 判断是否包含Emoji表情
-    public func isEmoji() -> Bool {
+    func isEmoji() -> Bool {
         let numbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
         let numbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
         guard !numbers.contains(self) else {
         guard !numbers.contains(self) else {
             return false
             return false
@@ -135,15 +133,15 @@ extension String {
         return false
         return false
     }
     }
 
 
-    var isContainsEmoji: Bool {
+    internal var isContainsEmoji: Bool {
         for scalar in unicodeScalars {
         for scalar in unicodeScalars {
             switch scalar.value {
             switch scalar.value {
-            case 0x1F600...0x1F64F, // Emoticons
-                 0x1F300...0x1F5FF, // Misc Symbols and Pictographs
-                 0x1F680...0x1F6FF, // Transport and Map
-                 0x2600...0x26FF, // Misc symbols
-                 0x2700...0x27BF, // Dingbats
-                 0xFE00...0xFE0F: // Variation Selectors
+            case 0x1F600 ... 0x1F64F, // Emoticons
+                 0x1F300 ... 0x1F5FF, // Misc Symbols and Pictographs
+                 0x1F680 ... 0x1F6FF, // Transport and Map
+                 0x2600 ... 0x26FF, // Misc symbols
+                 0x2700 ... 0x27BF, // Dingbats
+                 0xFE00 ... 0xFE0F: // Variation Selectors
                 return true
                 return true
             default:
             default:
                 continue
                 continue
@@ -153,16 +151,16 @@ extension String {
     }
     }
 
 
     // 是否包含表情
     // 是否包含表情
-    var containsEmoji: Bool {
+    internal var containsEmoji: Bool {
         for scalar in unicodeScalars {
         for scalar in unicodeScalars {
             switch scalar.value {
             switch scalar.value {
             case
             case
-                0x00A0...0x00AF,
-                0x2030...0x204F,
-                0x2120...0x213F,
-                0x2190...0x21AF,
-                0x2310...0x329F,
-                0x1F000...0x1F9CF:
+                0x00A0 ... 0x00AF,
+                0x2030 ... 0x204F,
+                0x2120 ... 0x213F,
+                0x2190 ... 0x21AF,
+                0x2310 ... 0x329F,
+                0x1F000 ... 0x1F9CF:
                 return true
                 return true
             default:
             default:
                 continue
                 continue
@@ -175,14 +173,14 @@ extension String {
      * 字母、数字、中文正则判断(不包括空格)
      * 字母、数字、中文正则判断(不包括空格)
      *注意: 因为考虑到输入习惯,许多人习惯使用九宫格,这里在正常选择全键盘输入错误的时候,进行九宫格判断,九宫格对应的是下面➋➌➍➎➏➐➑➒的字符
      *注意: 因为考虑到输入习惯,许多人习惯使用九宫格,这里在正常选择全键盘输入错误的时候,进行九宫格判断,九宫格对应的是下面➋➌➍➎➏➐➑➒的字符
      */
      */
-    static func isInputRuleNotBlank(str: String) -> Bool {
+    internal static func isInputRuleNotBlank(str: String) -> Bool {
         let pattern = "^[a-zA-Z\\u4E00-\\u9FA5\\d]*$"
         let pattern = "^[a-zA-Z\\u4E00-\\u9FA5\\d]*$"
         let pred = NSPredicate(format: "SELF MATCHES %@", pattern)
         let pred = NSPredicate(format: "SELF MATCHES %@", pattern)
         let isMatch = pred.evaluate(with: str)
         let isMatch = pred.evaluate(with: str)
         if !isMatch {
         if !isMatch {
             let other = "➋➌➍➎➏➐➑➒"
             let other = "➋➌➍➎➏➐➑➒"
             let len = str.count
             let len = str.count
-            for i in 0..<len {
+            for i in 0 ..< len {
                 let tmpStr = str as NSString
                 let tmpStr = str as NSString
                 let tmpOther = other as NSString
                 let tmpOther = other as NSString
                 let c = tmpStr.character(at: i)
                 let c = tmpStr.character(at: i)
@@ -197,8 +195,8 @@ extension String {
     }
     }
 }
 }
 
 
-extension Optional where Wrapped == String {
-    public var isSpace: Bool {
+public extension Optional where Wrapped == String {
+    var isSpace: Bool {
         return self?.isSpace ?? true
         return self?.isSpace ?? true
     }
     }
 }
 }

+ 2 - 2
BFCommonKit/Classes/BFCategorys/BFUIButton+ext.swift

@@ -18,8 +18,8 @@ public enum PQButtonImageEdgeInsetsStyle {
 }
 }
 
 
 import Foundation
 import Foundation
-extension UIButton {
-    public func imagePosition(at style: PQButtonImageEdgeInsetsStyle, space: CGFloat) {
+public extension UIButton {
+    func imagePosition(at style: PQButtonImageEdgeInsetsStyle, space: CGFloat) {
         guard let imageV = imageView else { return }
         guard let imageV = imageView else { return }
         guard let titleL = titleLabel else { return }
         guard let titleL = titleLabel else { return }
         // 获取图像的宽和高
         // 获取图像的宽和高

+ 12 - 2
BFCommonKit/Classes/BFCategorys/BFUIImage+Ext.swift

@@ -8,6 +8,17 @@
 
 
 import Foundation
 import Foundation
 
 
+// MARK: - 刷新控件类型
+
+/// 刷新控件类型
+public enum moveDirection {
+    case moveDirectionNormal
+    case moveDirectionUp
+    case moveDirectionDown
+    case moveDirectionRight
+    case moveDirectionLeft
+}
+
 public extension UIImage {
 public extension UIImage {
     // 从BFframwork bundle 中取图片
     // 从BFframwork bundle 中取图片
     func BF_Image(named: String) -> UIImage {
     func BF_Image(named: String) -> UIImage {
@@ -214,7 +225,7 @@ public extension UIImage {
 
 
         return scaledImage!
         return scaledImage!
     }
     }
-    
+
     /// 改变图片主题颜色
     /// 改变图片主题颜色
     /// - Parameters:
     /// - Parameters:
     ///   - color: <#color description#>
     ///   - color: <#color description#>
@@ -231,4 +242,3 @@ public extension UIImage {
         return tintedImage
         return tintedImage
     }
     }
 }
 }
-

+ 37 - 40
BFCommonKit/Classes/BFCategorys/BFUIView+Ext.swift

@@ -12,8 +12,8 @@ import UIKit
 // MARK: - UIView的分类扩展
 // MARK: - UIView的分类扩展
 
 
 /// UIView的分类扩展
 /// UIView的分类扩展
-extension UIView {
-      public func addCorner(roundingCorners: UIRectCorner = .allCorners, corner: CGFloat = cDefaultMargin) {
+public extension UIView {
+    func addCorner(roundingCorners: UIRectCorner = .allCorners, corner: CGFloat = 10) {
         if roundingCorners == .allCorners {
         if roundingCorners == .allCorners {
             layer.cornerRadius = corner
             layer.cornerRadius = corner
             layer.masksToBounds = true
             layer.masksToBounds = true
@@ -31,7 +31,7 @@ extension UIView {
     ///   - color: <#color description#>
     ///   - color: <#color description#>
     ///   - offset: <#offset description#>
     ///   - offset: <#offset description#>
     /// - Returns: <#description#>
     /// - Returns: <#description#>
-     public func addShadowLayer(isAll: Bool = false, color: UIColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5), offset: CGSize = CGSize(width: 1, height: 1)) {
+    func addShadowLayer(isAll: Bool = false, color: UIColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5), offset: CGSize = CGSize(width: 1, height: 1)) {
         layer.shadowColor = color.cgColor
         layer.shadowColor = color.cgColor
         layer.shadowOffset = offset
         layer.shadowOffset = offset
         layer.shadowRadius = 0.5
         layer.shadowRadius = 0.5
@@ -48,7 +48,7 @@ extension UIView {
     }
     }
 
 
     /// 添加虚线条
     /// 添加虚线条
-     public func addBorderToLayer(frame: CGRect? = nil) {
+    func addBorderToLayer(frame: CGRect? = nil) {
         // 线条颜色
         // 线条颜色
         let borderLayer: CAShapeLayer = CAShapeLayer()
         let borderLayer: CAShapeLayer = CAShapeLayer()
         borderLayer.strokeColor = UIColor.hexColor(hexadecimal: "#FFFFFF").cgColor
         borderLayer.strokeColor = UIColor.hexColor(hexadecimal: "#FFFFFF").cgColor
@@ -62,7 +62,7 @@ extension UIView {
         layer.addSublayer(borderLayer)
         layer.addSublayer(borderLayer)
     }
     }
 
 
-     public func animateZoom() {
+    func animateZoom() {
         transform = CGAffineTransform(scaleX: 0.4, y: 0.4)
         transform = CGAffineTransform(scaleX: 0.4, y: 0.4)
         UIView.animate(withDuration: 0.5, animations: {
         UIView.animate(withDuration: 0.5, animations: {
             self.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
             self.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
@@ -81,7 +81,7 @@ extension UIView {
     ///   - duration: <#duration description#>
     ///   - duration: <#duration description#>
     ///   - repeatCount: <#repeatCount description#>
     ///   - repeatCount: <#repeatCount description#>
     /// - Returns: <#description#>
     /// - Returns: <#description#>
-     public func shakeAnimation(_ fromValue: Float, _ toValue: Float, _ duration: Float, _: Float) {
+    func shakeAnimation(_ fromValue: Float, _ toValue: Float, _ duration: Float, _: Float) {
         layer.removeAllAnimations()
         layer.removeAllAnimations()
         let shake = CABasicAnimation(keyPath: "transform.rotation.z")
         let shake = CABasicAnimation(keyPath: "transform.rotation.z")
         shake.fromValue = fromValue
         shake.fromValue = fromValue
@@ -101,7 +101,7 @@ extension UIView {
     ///   - isRepeat: <#isRepeat description#>
     ///   - isRepeat: <#isRepeat description#>
     ///   - multiple: <#multiple description#>
     ///   - multiple: <#multiple description#>
     /// - Returns: <#description#>
     /// - Returns: <#description#>
-     public func heartbeatAnimate(duration: TimeInterval, isRepeat: Bool, multiple: CGFloat) {
+    func heartbeatAnimate(duration: TimeInterval, isRepeat: Bool, multiple: CGFloat) {
         UIView.animateKeyframes(withDuration: duration, delay: 0, options: .allowUserInteraction, animations: {
         UIView.animateKeyframes(withDuration: duration, delay: 0, options: .allowUserInteraction, animations: {
             self.transform = CGAffineTransform(scaleX: 1.0 + multiple, y: 1.0 + multiple)
             self.transform = CGAffineTransform(scaleX: 1.0 + multiple, y: 1.0 + multiple)
         }) { _ in
         }) { _ in
@@ -127,7 +127,7 @@ extension UIView {
 
 
     /// 活动心跳动画
     /// 活动心跳动画
     /// - Returns: <#description#>
     /// - Returns: <#description#>
-     public func activityHeartbeatAnimate() {
+    func activityHeartbeatAnimate() {
         layer.removeAllAnimations()
         layer.removeAllAnimations()
         UIView.animateKeyframes(withDuration: 0.45, delay: 0, options: .allowUserInteraction, animations: {
         UIView.animateKeyframes(withDuration: 0.45, delay: 0, options: .allowUserInteraction, animations: {
             self.transform = CGAffineTransform(scaleX: 0.9, y: 0.9)
             self.transform = CGAffineTransform(scaleX: 0.9, y: 0.9)
@@ -142,7 +142,7 @@ extension UIView {
 
 
     /// 活动心跳动画
     /// 活动心跳动画
     /// - Returns: <#description#>
     /// - Returns: <#description#>
-     public func heartbeatAnimate() {
+    func heartbeatAnimate() {
         layer.removeAllAnimations()
         layer.removeAllAnimations()
         UIView.animateKeyframes(withDuration: 1, delay: 0, options: .allowUserInteraction, animations: {
         UIView.animateKeyframes(withDuration: 1, delay: 0, options: .allowUserInteraction, animations: {
             self.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
             self.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
@@ -157,7 +157,7 @@ extension UIView {
         }
         }
     }
     }
 
 
-     public func addScaleBasicAnimation() {
+    func addScaleBasicAnimation() {
         let animation = CABasicAnimation(keyPath: "transform.scale")
         let animation = CABasicAnimation(keyPath: "transform.scale")
         animation.timingFunction = CAMediaTimingFunction(name: .easeOut)
         animation.timingFunction = CAMediaTimingFunction(name: .easeOut)
         animation.duration = 0.5
         animation.duration = 0.5
@@ -168,7 +168,7 @@ extension UIView {
         layer.add(animation, forKey: nil)
         layer.add(animation, forKey: nil)
     }
     }
 
 
-     public func addScaleYBasicAnimation() {
+    func addScaleYBasicAnimation() {
         let animation = CAKeyframeAnimation(keyPath: "transform.translation.y")
         let animation = CAKeyframeAnimation(keyPath: "transform.translation.y")
         animation.duration = 0.5
         animation.duration = 0.5
         animation.repeatCount = 100
         animation.repeatCount = 100
@@ -191,7 +191,7 @@ extension UIView {
 
 
     /// 将view生成一张图片
     /// 将view生成一张图片
     /// - Returns: <#description#>
     /// - Returns: <#description#>
-     public func graphicsGetImage() -> UIImage? {
+    func graphicsGetImage() -> UIImage? {
         UIGraphicsBeginImageContextWithOptions(frame.size, true, 0.0)
         UIGraphicsBeginImageContextWithOptions(frame.size, true, 0.0)
         layer.render(in: UIGraphicsGetCurrentContext()!)
         layer.render(in: UIGraphicsGetCurrentContext()!)
         let newImage = UIGraphicsGetImageFromCurrentImageContext()
         let newImage = UIGraphicsGetImageFromCurrentImageContext()
@@ -201,9 +201,9 @@ extension UIView {
 
 
     /// 动画显示View
     /// 动画显示View
     /// - Returns: <#description#>
     /// - Returns: <#description#>
-     public func showViewAnimate(duration: TimeInterval = 0.3, completion: ((Bool) -> Void)? = nil) {
+    func showViewAnimate(duration: TimeInterval = 0.3, completion: ((Bool) -> Void)? = nil) {
         UIView.animate(withDuration: duration, animations: { [weak self] in
         UIView.animate(withDuration: duration, animations: { [weak self] in
-            self?.frame = CGRect(x: 0, y: cScreenHeigth - self!.frame.height, width: self!.frame.width, height: self!.frame.height)
+            self?.frame = CGRect(x: 0, y: UIScreen.main.bounds.height - self!.frame.height, width: self!.frame.width, height: self!.frame.height)
         }) { isFinished in
         }) { isFinished in
             if completion != nil {
             if completion != nil {
                 completion!(isFinished)
                 completion!(isFinished)
@@ -213,9 +213,9 @@ extension UIView {
 
 
     /// 动画隐藏view
     /// 动画隐藏view
     /// - Returns: <#description#>
     /// - Returns: <#description#>
-     public func dismissViewAnimate(duration: TimeInterval = 0.3, completion: ((Bool) -> Void)? = nil) {
+    func dismissViewAnimate(duration: TimeInterval = 0.3, completion: ((Bool) -> Void)? = nil) {
         UIView.animate(withDuration: duration, animations: { [weak self] in
         UIView.animate(withDuration: duration, animations: { [weak self] in
-            self?.frame = CGRect(x: 0, y: cScreenHeigth, width: self!.frame.width, height: self!.frame.height)
+            self?.frame = CGRect(x: 0, y: UIScreen.main.bounds.height, width: self!.frame.width, height: self!.frame.height)
         }) { isFinished in
         }) { isFinished in
             if completion != nil {
             if completion != nil {
                 completion!(isFinished)
                 completion!(isFinished)
@@ -226,7 +226,7 @@ extension UIView {
     /// add  by ak 添加虚线框
     /// add  by ak 添加虚线框
     /// - Parameter color: 框色
     /// - Parameter color: 框色
     /// - Parameter lineWidth: 框宽
     /// - Parameter lineWidth: 框宽
-     public func addBorderToLayer(color: CGColor, lineWidth: CGFloat) {
+    func addBorderToLayer(color: CGColor, lineWidth: CGFloat) {
         let border = CAShapeLayer()
         let border = CAShapeLayer()
 
 
         //  线条颜色
         //  线条颜色
@@ -248,17 +248,17 @@ extension UIView {
 // MARK: - UICollectionView的分类扩展
 // MARK: - UICollectionView的分类扩展
 
 
 /// UICollectionView的分类扩展
 /// UICollectionView的分类扩展
-extension UICollectionView {
+public extension UICollectionView {
     /// 获取当前cell
     /// 获取当前cell
     /// - Returns: <#description#>
     /// - Returns: <#description#>
-     public func visibleCell() -> UICollectionViewCell? {
+    func visibleCell() -> UICollectionViewCell? {
         let visibleRect = CGRect(origin: contentOffset, size: bounds.size)
         let visibleRect = CGRect(origin: contentOffset, size: bounds.size)
         let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
         let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
         guard let visibleIndexPath = indexPathForItem(at: visiblePoint) else { return nil }
         guard let visibleIndexPath = indexPathForItem(at: visiblePoint) else { return nil }
         return cellForItem(at: visibleIndexPath)
         return cellForItem(at: visibleIndexPath)
     }
     }
 
 
-     public func indexPathsForElements(in rect: CGRect) -> [IndexPath] {
+    func indexPathsForElements(in rect: CGRect) -> [IndexPath] {
         let allLayoutAttributes = collectionViewLayout.layoutAttributesForElements(in: rect)!
         let allLayoutAttributes = collectionViewLayout.layoutAttributesForElements(in: rect)!
         return allLayoutAttributes.map { $0.indexPath }
         return allLayoutAttributes.map { $0.indexPath }
     }
     }
@@ -267,11 +267,11 @@ extension UICollectionView {
 // MARK: - UITabBar的分类扩展
 // MARK: - UITabBar的分类扩展
 
 
 /// UITabBar的分类扩展
 /// UITabBar的分类扩展
-extension UITabBar {
+public extension UITabBar {
     /// 展示小红点
     /// 展示小红点
     /// - Parameter index: <#index description#>
     /// - Parameter index: <#index description#>
     /// - Returns: <#description#>
     /// - Returns: <#description#>
-     public func showPoint(index: Int) {
+    func showPoint(index: Int) {
         let pointW: CGFloat = 8
         let pointW: CGFloat = 8
         let pointView = UIView()
         let pointView = UIView()
         pointView.tag = 11111 + index
         pointView.tag = 11111 + index
@@ -287,7 +287,7 @@ extension UITabBar {
     /// 移除小红点
     /// 移除小红点
     /// - Parameter index: <#index description#>
     /// - Parameter index: <#index description#>
     /// - Returns: <#description#>
     /// - Returns: <#description#>
-     public func removePoint(index: Int) {
+    func removePoint(index: Int) {
         for item in subviews {
         for item in subviews {
             if item.tag == 11111 + index {
             if item.tag == 11111 + index {
                 item.removeFromSuperview()
                 item.removeFromSuperview()
@@ -298,7 +298,7 @@ extension UITabBar {
     /// 展示创作视频引导
     /// 展示创作视频引导
     /// - Parameter index: <#index description#>
     /// - Parameter index: <#index description#>
     /// - Returns: <#description#>
     /// - Returns: <#description#>
-     public func showVideoMakeRemindView() {
+    func showVideoMakeRemindView() {
         let isOldUploadClick: String? = getUserDefaults(key: cIsUploadClick) as? String
         let isOldUploadClick: String? = getUserDefaults(key: cIsUploadClick) as? String
         let isUploadClick: String? = getUserDefaultsForJson(key: cIsUploadClick) as? String
         let isUploadClick: String? = getUserDefaultsForJson(key: cIsUploadClick) as? String
         let isVerticalSlip: String? = getUserDefaults(key: cIsVerticalSlip) as? String
         let isVerticalSlip: String? = getUserDefaults(key: cIsVerticalSlip) as? String
@@ -323,13 +323,11 @@ extension UITabBar {
         }
         }
     }
     }
 
 
-    @objc  public func dismiss() {
-  
-    }
+    @objc func dismiss() {}
 
 
     /// 移除创作视频引导
     /// 移除创作视频引导
     /// - Returns: <#description#>
     /// - Returns: <#description#>
-     public func removeVideoMakeRemindView() {
+    func removeVideoMakeRemindView() {
         viewWithTag(cVideoMakeRemindTag)?.removeFromSuperview()
         viewWithTag(cVideoMakeRemindTag)?.removeFromSuperview()
     }
     }
 }
 }
@@ -367,30 +365,29 @@ extension UILabel {
     ///   - color: <#color description#>
     ///   - color: <#color description#>
     ///   - offset: <#offset description#>
     ///   - offset: <#offset description#>
     /// - Returns: <#description#>
     /// - Returns: <#description#>
-     public func addShadow(color: UIColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5), offset: CGSize = CGSize(width: 1, height: 1)) {
+    public func addShadow(color: UIColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5), offset: CGSize = CGSize(width: 1, height: 1)) {
         shadowColor = color
         shadowColor = color
         shadowOffset = offset
         shadowOffset = offset
     }
     }
 }
 }
 
 
-extension UIImageView {
+public extension UIImageView {
     /// imageView加载网络图片
     /// imageView加载网络图片
     /// - Parameters:
     /// - Parameters:
     ///   - url: 网络url
     ///   - url: 网络url
-     public func setNetImage(url: String?, placeholder: UIImage = UIImage.init().BF_Image(named: "placehold_image")) {
+    func setNetImage(url: String?, placeholder: UIImage = UIImage().BF_Image(named: "placehold_image")) {
         if url == nil || (url?.count ?? 0) <= 0 {
         if url == nil || (url?.count ?? 0) <= 0 {
-            BFLog(message: "设置按钮网络图片地址为空")
             return
             return
         }
         }
         kf.setImage(with: URL(string: url!), placeholder: placeholder, options: url?.suffix(5) == ".webp" ? [.processor(WebPProcessor.default), .cacheSerializer(WebPSerializer.default)] : nil, progressBlock: { _, _ in
         kf.setImage(with: URL(string: url!), placeholder: placeholder, options: url?.suffix(5) == ".webp" ? [.processor(WebPProcessor.default), .cacheSerializer(WebPSerializer.default)] : nil, progressBlock: { _, _ in
 
 
-        }) {  _ in
+        }) { _ in
         }
         }
     }
     }
 
 
     /// 展示加载中动画
     /// 展示加载中动画
     /// - Returns: <#description#>
     /// - Returns: <#description#>
-     public func showLoadingAnimation(duration: Double = 1) {
+    func showLoadingAnimation(duration: Double = 1) {
         let rotationAnim = CABasicAnimation(keyPath: "transform.rotation.z")
         let rotationAnim = CABasicAnimation(keyPath: "transform.rotation.z")
         rotationAnim.fromValue = 0
         rotationAnim.fromValue = 0
         rotationAnim.toValue = Double.pi * 2
         rotationAnim.toValue = Double.pi * 2
@@ -407,7 +404,7 @@ extension UIImageView {
     ///   - repeatCount: 循环次数
     ///   - repeatCount: 循环次数
     ///   - duration: 时长
     ///   - duration: 时长
     /// - Returns: <#description#>
     /// - Returns: <#description#>
-     public func displayGIF(data: Data? = nil, images: [UIImage]? = nil, repeatCount: Int = Int.max, duration: Double = 1) {
+    func displayGIF(data: Data? = nil, images: [UIImage]? = nil, repeatCount: Int = Int.max, duration: Double = 1) {
         if images != nil, (images?.count ?? 0) > 0, !isAnimating {
         if images != nil, (images?.count ?? 0) > 0, !isAnimating {
             layer.removeAllAnimations()
             layer.removeAllAnimations()
             stopAnimating()
             stopAnimating()
@@ -423,19 +420,19 @@ extension UIImageView {
             }
             }
         }
         }
     }
     }
-    
+
     /// 移除
     /// 移除
-    public func removePlayGIF() {
+    func removePlayGIF() {
         layer.removeAllAnimations()
         layer.removeAllAnimations()
         stopAnimating()
         stopAnimating()
     }
     }
 }
 }
 
 
-extension UIButton {
+public extension UIButton {
     /// UIButton加载网络图片
     /// UIButton加载网络图片
     /// - Parameters:
     /// - Parameters:
     ///   - url: 网络url
     ///   - url: 网络url
-     public func setNetImage(url: String?, placeholder: UIImage = UIImage.init().BF_Image(named: "placehold_image")) {
+    func setNetImage(url: String?, placeholder: UIImage = UIImage().BF_Image(named: "placehold_image")) {
         if url == nil || (url?.count ?? 0) <= 0 {
         if url == nil || (url?.count ?? 0) <= 0 {
             BFLog(message: "设置按钮网络图片地址为空")
             BFLog(message: "设置按钮网络图片地址为空")
             return
             return
@@ -449,7 +446,7 @@ extension UIButton {
     /// UIButton加载网络背景图片
     /// UIButton加载网络背景图片
     /// - Parameters:
     /// - Parameters:
     ///   - url: 网络url
     ///   - url: 网络url
-     public func setNetBackgroundImage(url: String, placeholder: UIImage = UIImage.init().BF_Image(named: "placehold_image")) {
+    func setNetBackgroundImage(url: String, placeholder: UIImage = UIImage().BF_Image(named: "placehold_image")) {
         kf.setBackgroundImage(with: URL(string: url), for: .normal, placeholder: placeholder, options: url.suffix(5) == ".webp" ? [.processor(WebPProcessor.default), .cacheSerializer(WebPSerializer.default)] : nil, progressBlock: { _, _ in
         kf.setBackgroundImage(with: URL(string: url), for: .normal, placeholder: placeholder, options: url.suffix(5) == ".webp" ? [.processor(WebPProcessor.default), .cacheSerializer(WebPSerializer.default)] : nil, progressBlock: { _, _ in
 
 
         }) { _ in
         }) { _ in

+ 36 - 40
BFCommonKit/Classes/BFCategorys/NXFundation+Ext.swift

@@ -9,37 +9,35 @@
 import Foundation
 import Foundation
 import UIKit
 import UIKit
 
 
-
 public extension Date {
 public extension Date {
-    var millisecondsSince1970:Int {
-        return Int((self.timeIntervalSince1970 * 1000.0).rounded())
+    var millisecondsSince1970: Int {
+        return Int((timeIntervalSince1970 * 1000.0).rounded())
     }
     }
-    
-    var secondsSince1970:Int {
-        return Int((self.timeIntervalSince1970).rounded())
+
+    var secondsSince1970: Int {
+        return Int(timeIntervalSince1970.rounded())
     }
     }
-    
-    init(milliseconds:Int) {
+
+    init(milliseconds: Int) {
         self = Date(timeIntervalSince1970: TimeInterval(milliseconds / 1000))
         self = Date(timeIntervalSince1970: TimeInterval(milliseconds / 1000))
     }
     }
-    
+
     func getCurrentTimeString(_ format: String = "yyyy-MM-dd HH:mm:ss") -> String {
     func getCurrentTimeString(_ format: String = "yyyy-MM-dd HH:mm:ss") -> String {
         let nowDate = Date()
         let nowDate = Date()
         let formatter = DateFormatter()
         let formatter = DateFormatter()
         formatter.dateFormat = format
         formatter.dateFormat = format
         formatter.locale = Locale(identifier: "en_US_POSIX")
         formatter.locale = Locale(identifier: "en_US_POSIX")
         formatter.timeZone = Foundation.TimeZone(identifier: "UTC")
         formatter.timeZone = Foundation.TimeZone(identifier: "UTC")
-        //formatter.dateStyle = .MediumStyle
-        //formatter.timeStyle = .MediumStyle
+        // formatter.dateStyle = .MediumStyle
+        // formatter.timeStyle = .MediumStyle
         return formatter.string(from: nowDate)
         return formatter.string(from: nowDate)
     }
     }
-    
+
     var iso8601: String {
     var iso8601: String {
         return Formatter.iso8601.string(from: self)
         return Formatter.iso8601.string(from: self)
     }
     }
 }
 }
 
 
-
 public extension Formatter {
 public extension Formatter {
     static let iso8601: DateFormatter = {
     static let iso8601: DateFormatter = {
         let formatter = DateFormatter()
         let formatter = DateFormatter()
@@ -55,11 +53,11 @@ public extension String {
     var dateFromISO8601: Date? {
     var dateFromISO8601: Date? {
         return Formatter.iso8601.date(from: self)
         return Formatter.iso8601.date(from: self)
     }
     }
-    
+
     func appendLineToURL(fileURL: URL) throws {
     func appendLineToURL(fileURL: URL) throws {
         try (self + "\n").appendToURL(fileURL: fileURL)
         try (self + "\n").appendToURL(fileURL: fileURL)
     }
     }
-    
+
     func appendToURL(fileURL: URL) throws {
     func appendToURL(fileURL: URL) throws {
         let data = self.data(using: String.Encoding.utf8)!
         let data = self.data(using: String.Encoding.utf8)!
         try data.append2File(fileURL: fileURL)
         try data.append2File(fileURL: fileURL)
@@ -70,59 +68,62 @@ public extension String {
         guard let end_Index = validEndIndex(original: index) else {
         guard let end_Index = validEndIndex(original: index) else {
             return self
             return self
         }
         }
-        return String(self[startIndex..<end_Index])
+        return String(self[startIndex ..< end_Index])
     }
     }
+
     ///
     ///
     func substring(from index: Int) -> String {
     func substring(from index: Int) -> String {
-        guard let start_index = validStartIndex(original: index)  else {
+        guard let start_index = validStartIndex(original: index) else {
             return self
             return self
         }
         }
-        return String(self[start_index..<endIndex])
+        return String(self[start_index ..< endIndex])
     }
     }
+
     ///
     ///
     func sliceString(_ range: CountableRange<Int>) -> String {
     func sliceString(_ range: CountableRange<Int>) -> String {
         guard
         guard
             let startIndex = validStartIndex(original: range.lowerBound),
             let startIndex = validStartIndex(original: range.lowerBound),
-            let endIndex   = validEndIndex(original: range.upperBound),
+            let endIndex = validEndIndex(original: range.upperBound),
             startIndex <= endIndex
             startIndex <= endIndex
-            else {
-                return ""
+        else {
+            return ""
         }
         }
-        return String(self[startIndex..<endIndex])
+        return String(self[startIndex ..< endIndex])
     }
     }
+
     ///
     ///
     func sliceString(_ range: CountableClosedRange<Int>) -> String {
     func sliceString(_ range: CountableClosedRange<Int>) -> String {
         guard
         guard
             let start_Index = validStartIndex(original: range.lowerBound),
             let start_Index = validStartIndex(original: range.lowerBound),
-            let end_Index   = validEndIndex(original: range.upperBound),
+            let end_Index = validEndIndex(original: range.upperBound),
             startIndex <= endIndex
             startIndex <= endIndex
-            else {
-                return ""
+        else {
+            return ""
         }
         }
         if endIndex.encodedOffset <= end_Index.encodedOffset {
         if endIndex.encodedOffset <= end_Index.encodedOffset {
-            return String(self[start_Index..<endIndex])
+            return String(self[start_Index ..< endIndex])
         }
         }
-        return String(self[start_Index...end_Index])
+        return String(self[start_Index ... end_Index])
     }
     }
-    
+
     private func validIndex(original: Int) -> String.Index {
     private func validIndex(original: Int) -> String.Index {
         switch original {
         switch original {
-        case ...startIndex.encodedOffset : return startIndex
-        case endIndex.encodedOffset...   : return endIndex
-        default                          : return index(startIndex, offsetBy: original)
+        case ...startIndex.encodedOffset: return startIndex
+        case endIndex.encodedOffset...: return endIndex
+        default: return index(startIndex, offsetBy: original)
         }
         }
     }
     }
-    
+
     private func validStartIndex(original: Int) -> String.Index? {
     private func validStartIndex(original: Int) -> String.Index? {
         guard original <= endIndex.encodedOffset else { return nil }
         guard original <= endIndex.encodedOffset else { return nil }
         return validIndex(original: original)
         return validIndex(original: original)
     }
     }
-    
+
     private func validEndIndex(original: Int) -> String.Index? {
     private func validEndIndex(original: Int) -> String.Index? {
         guard original >= startIndex.encodedOffset else { return nil }
         guard original >= startIndex.encodedOffset else { return nil }
         return validIndex(original: original)
         return validIndex(original: original)
     }
     }
-    
+
     ///
     ///
     func toDate(formatter: String) -> Date {
     func toDate(formatter: String) -> Date {
         let dateFormatter = DateFormatter()
         let dateFormatter = DateFormatter()
@@ -131,7 +132,6 @@ public extension String {
         let date = dateFormatter.date(from: self)
         let date = dateFormatter.date(from: self)
         return date!
         return date!
     }
     }
-    
 }
 }
 
 
 extension Data {
 extension Data {
@@ -142,19 +142,16 @@ extension Data {
             }
             }
             fileHandle.seekToEndOfFile()
             fileHandle.seekToEndOfFile()
             fileHandle.write(self)
             fileHandle.write(self)
-        }
-        else {
+        } else {
             try write(to: fileURL, options: .atomic)
             try write(to: fileURL, options: .atomic)
         }
         }
     }
     }
 }
 }
 
 
 public extension UInt32 {
 public extension UInt32 {
-    
     var double: Double {
     var double: Double {
         return Double(self)
         return Double(self)
     }
     }
-    
 }
 }
 
 
 public extension UIApplication {
 public extension UIApplication {
@@ -173,4 +170,3 @@ public extension UIApplication {
         return controller
         return controller
     }
     }
 }
 }
-

+ 118 - 121
BFCommonKit/Classes/BFCategorys/NXUI+Ext.swift

@@ -13,10 +13,10 @@ public extension UIViewController {
         let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
         let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
         let action = UIAlertAction(title: "OK", style: .cancel, handler: nil)
         let action = UIAlertAction(title: "OK", style: .cancel, handler: nil)
         alert.addAction(action)
         alert.addAction(action)
-        
+
         present(alert, animated: true, completion: nil)
         present(alert, animated: true, completion: nil)
     }
     }
-    
+
     var contentViewController: UIViewController {
     var contentViewController: UIViewController {
         if let navcon = self as? UINavigationController {
         if let navcon = self as? UINavigationController {
             return navcon.visibleViewController ?? self
             return navcon.visibleViewController ?? self
@@ -34,36 +34,33 @@ public enum ShakeDirection: Int {
 
 
 public extension UIView {
 public extension UIView {
     func shake(direction: ShakeDirection = .horizontal, times: Int = 5,
     func shake(direction: ShakeDirection = .horizontal, times: Int = 5,
-                      interval: TimeInterval = 0.1, delta: CGFloat = 2,
-                      completion: (() -> Void)? = nil) {
+               interval: TimeInterval = 0.1, delta: CGFloat = 2,
+               completion: (() -> Void)? = nil)
+    {
         UIView.animate(withDuration: interval, animations: { () -> Void in
         UIView.animate(withDuration: interval, animations: { () -> Void in
             switch direction {
             switch direction {
             case .horizontal:
             case .horizontal:
-                self.layer.setAffineTransform( CGAffineTransform(translationX: delta, y: 0))
-                break
+                self.layer.setAffineTransform(CGAffineTransform(translationX: delta, y: 0))
             case .vertical:
             case .vertical:
-                self.layer.setAffineTransform( CGAffineTransform(translationX: 0, y: delta))
-                break
+                self.layer.setAffineTransform(CGAffineTransform(translationX: 0, y: delta))
             }
             }
-        }) { (complete) -> Void in
-            if (times == 0) {
+        }) { (_) -> Void in
+            if times == 0 {
                 // last shaking finish, reset location, callback
                 // last shaking finish, reset location, callback
                 UIView.animate(withDuration: interval, animations: { () -> Void in
                 UIView.animate(withDuration: interval, animations: { () -> Void in
                     self.layer.setAffineTransform(CGAffineTransform.identity)
                     self.layer.setAffineTransform(CGAffineTransform.identity)
-                }, completion: { (complete) -> Void in
+                }, completion: { (_) -> Void in
                     completion?()
                     completion?()
                 })
                 })
-            }
-            else {
+            } else {
                 // not last shaking, continue
                 // not last shaking, continue
-                self.shake(direction: direction, times: times - 1,  interval: interval,
-                           delta: delta * -1, completion:completion)
+                self.shake(direction: direction, times: times - 1, interval: interval,
+                           delta: delta * -1, completion: completion)
             }
             }
         }
         }
     }
     }
 }
 }
 
 
-
 extension UIView {
 extension UIView {
     var x: CGFloat {
     var x: CGFloat {
         set {
         set {
@@ -72,10 +69,10 @@ extension UIView {
             self.frame = frame
             self.frame = frame
         }
         }
         get {
         get {
-            return self.frame.origin.x
+            return frame.origin.x
         }
         }
     }
     }
-    
+
     var y: CGFloat {
     var y: CGFloat {
         set {
         set {
             var frame = self.frame
             var frame = self.frame
@@ -83,10 +80,10 @@ extension UIView {
             self.frame = frame
             self.frame = frame
         }
         }
         get {
         get {
-            return self.frame.origin.y
+            return frame.origin.y
         }
         }
     }
     }
-    
+
     var centerX: CGFloat {
     var centerX: CGFloat {
         set {
         set {
             var center = self.center
             var center = self.center
@@ -94,10 +91,10 @@ extension UIView {
             self.center = center
             self.center = center
         }
         }
         get {
         get {
-            return self.center.x
+            return center.x
         }
         }
     }
     }
-    
+
     var centerY: CGFloat {
     var centerY: CGFloat {
         set {
         set {
             var center = self.center
             var center = self.center
@@ -105,10 +102,10 @@ extension UIView {
             self.center = center
             self.center = center
         }
         }
         get {
         get {
-            return self.center.y
+            return center.y
         }
         }
     }
     }
-    
+
     var width: CGFloat {
     var width: CGFloat {
         set {
         set {
             var frame = self.frame
             var frame = self.frame
@@ -116,10 +113,10 @@ extension UIView {
             self.frame = frame
             self.frame = frame
         }
         }
         get {
         get {
-            return self.frame.size.width
+            return frame.size.width
         }
         }
     }
     }
-    
+
     var height: CGFloat {
     var height: CGFloat {
         set {
         set {
             var frame = self.frame
             var frame = self.frame
@@ -127,10 +124,10 @@ extension UIView {
             self.frame = frame
             self.frame = frame
         }
         }
         get {
         get {
-            return self.frame.size.height
+            return frame.size.height
         }
         }
     }
     }
-    
+
     var size: CGSize {
     var size: CGSize {
         set {
         set {
             var frame = self.frame
             var frame = self.frame
@@ -138,10 +135,10 @@ extension UIView {
             self.frame = frame
             self.frame = frame
         }
         }
         get {
         get {
-            return self.frame.size
+            return frame.size
         }
         }
     }
     }
-    
+
     var origin: CGPoint {
     var origin: CGPoint {
         set {
         set {
             var frame = self.frame
             var frame = self.frame
@@ -149,10 +146,10 @@ extension UIView {
             self.frame = frame
             self.frame = frame
         }
         }
         get {
         get {
-            return self.frame.origin
+            return frame.origin
         }
         }
     }
     }
-    
+
     var bottomY: CGFloat {
     var bottomY: CGFloat {
         set {
         set {
             var frame = self.frame
             var frame = self.frame
@@ -160,10 +157,10 @@ extension UIView {
             self.frame = frame
             self.frame = frame
         }
         }
         get {
         get {
-            return self.height + self.y
+            return height + y
         }
         }
     }
     }
-    
+
     var rightX: CGFloat {
     var rightX: CGFloat {
         set {
         set {
             var frame = self.frame
             var frame = self.frame
@@ -171,41 +168,42 @@ extension UIView {
             self.frame = frame
             self.frame = frame
         }
         }
         get {
         get {
-            return self.width + self.x
+            return width + x
         }
         }
     }
     }
-    
+
     // MARK: - UIView round corner
     // MARK: - UIView round corner
+
     ///
     ///
     /// - Parameter cornerRadius: radius
     /// - Parameter cornerRadius: radius
     func roundedCorners(cornerRadius: CGFloat) {
     func roundedCorners(cornerRadius: CGFloat) {
         roundedCorners(cornerRadius: cornerRadius, borderWidth: 0, borderColor: nil)
         roundedCorners(cornerRadius: cornerRadius, borderWidth: 0, borderColor: nil)
     }
     }
-    
+
     ///
     ///
     /// - Parameters:
     /// - Parameters:
     ///   - cornerRadius:
     ///   - cornerRadius:
     ///   - borderWidth:
     ///   - borderWidth:
     ///   - borderColor:
     ///   - borderColor:
     func roundedCorners(cornerRadius: CGFloat?, borderWidth: CGFloat?, borderColor: UIColor?) {
     func roundedCorners(cornerRadius: CGFloat?, borderWidth: CGFloat?, borderColor: UIColor?) {
-        self.layer.cornerRadius = cornerRadius!
-        self.layer.borderWidth = borderWidth!
-        self.layer.borderColor = borderColor?.cgColor
-        self.layer.masksToBounds = true
+        layer.cornerRadius = cornerRadius!
+        layer.borderWidth = borderWidth!
+        layer.borderColor = borderColor?.cgColor
+        layer.masksToBounds = true
     }
     }
-    
+
     ///
     ///
     /// - Parameters:
     /// - Parameters:
     ///   - cornerRadius:
     ///   - cornerRadius:
     ///   - rectCorner:
     ///   - rectCorner:
     func roundedCorners(cornerRadius: CGFloat?, rectCorner: UIRectCorner?) {
     func roundedCorners(cornerRadius: CGFloat?, rectCorner: UIRectCorner?) {
-        let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: rectCorner!, cornerRadii: CGSize(width: cornerRadius!, height: cornerRadius!))
+        let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: rectCorner!, cornerRadii: CGSize(width: cornerRadius!, height: cornerRadius!))
         let layer = CAShapeLayer()
         let layer = CAShapeLayer()
-        layer.frame = self.bounds
+        layer.frame = bounds
         layer.path = path.cgPath
         layer.path = path.cgPath
         self.layer.mask = layer
         self.layer.mask = layer
     }
     }
-    
+
     ///
     ///
     /// - Parameters:
     /// - Parameters:
     ///   - colors:
     ///   - colors:
@@ -223,50 +221,51 @@ extension UIView {
          */
          */
         gradientLayer.startPoint = startPoint
         gradientLayer.startPoint = startPoint
         gradientLayer.endPoint = endPoint
         gradientLayer.endPoint = endPoint
-        gradientLayer.frame = self.frame
-        self.layer.insertSublayer(gradientLayer, at: 0)
+        gradientLayer.frame = frame
+        layer.insertSublayer(gradientLayer, at: 0)
     }
     }
-    
+
     // MARK: - UIView blur
     // MARK: - UIView blur
+
     ///
     ///
     /// - Parameter style: UIBlurEffectStyle
     /// - Parameter style: UIBlurEffectStyle
-    func addBlurEffect(style: UIBlurEffect.Style) {
+    func addBlurEffect(style _: UIBlurEffect.Style) {
         let effect = UIBlurEffect(style: UIBlurEffect.Style.light)
         let effect = UIBlurEffect(style: UIBlurEffect.Style.light)
         let effectView = UIVisualEffectView(effect: effect)
         let effectView = UIVisualEffectView(effect: effect)
-        effectView.frame = self.bounds
-        self.backgroundColor = .clear
-        self.addSubview(effectView)
-        self.sendSubviewToBack(effectView)
+        effectView.frame = bounds
+        backgroundColor = .clear
+        addSubview(effectView)
+        sendSubviewToBack(effectView)
     }
     }
 }
 }
+
 public extension UIView {
 public extension UIView {
-    
     /// 往当前视图添加一个子视图
     /// 往当前视图添加一个子视图
     /// - Parameters:
     /// - Parameters:
     ///   - rect: 子视图大小
     ///   - rect: 子视图大小
     ///   - bgColor: 子视图背景色
     ///   - bgColor: 子视图背景色
     /// - Returns: 子视图
     /// - Returns: 子视图
-    func nx_addView(rect:CGRect = .zero,bgColor:UIColor = .white) ->UIView{
+    func nx_addView(rect: CGRect = .zero, bgColor: UIColor = .white) -> UIView {
         let view = UIView(frame: rect)
         let view = UIView(frame: rect)
         view.backgroundColor = bgColor
         view.backgroundColor = bgColor
-        self.addSubview(view)
+        addSubview(view)
         return view
         return view
     }
     }
-    
+
     /// 往当前视图添加UIImageView
     /// 往当前视图添加UIImageView
     /// - Parameters:
     /// - Parameters:
     ///   - image: 图片对象
     ///   - image: 图片对象
     ///   - rect: UIImageView
     ///   - rect: UIImageView
     ///   - contentMode: 图片填充模式
     ///   - contentMode: 图片填充模式
     /// - Returns: 图片
     /// - Returns: 图片
-     func nx_addImageView(image:UIImage?,rect:CGRect = .zero, contentMode:ContentMode = .scaleAspectFit)->UIImageView{
-        let imageView = UIImageView(frame: rect);
+    func nx_addImageView(image: UIImage?, rect: CGRect = .zero, contentMode: ContentMode = .scaleAspectFit) -> UIImageView {
+        let imageView = UIImageView(frame: rect)
         imageView.image = image
         imageView.image = image
         imageView.contentMode = contentMode
         imageView.contentMode = contentMode
-        self.addSubview(imageView)
+        addSubview(imageView)
         return imageView
         return imageView
     }
     }
-    
+
     /// 添加文本控件
     /// 添加文本控件
     /// - Parameters:
     /// - Parameters:
     ///   - fontSize: 文本大小
     ///   - fontSize: 文本大小
@@ -276,11 +275,11 @@ public extension UIView {
     /// - Returns: 文本控件
     /// - Returns: 文本控件
     func nx_addLabel(fontSize: CGFloat, text: String, textColor: UIColor, bgColor: UIColor) -> UILabel {
     func nx_addLabel(fontSize: CGFloat, text: String, textColor: UIColor, bgColor: UIColor) -> UILabel {
         return nx_addLabel(font: UIFont.systemFont(ofSize: fontSize),
         return nx_addLabel(font: UIFont.systemFont(ofSize: fontSize),
-                        text: text,
-                        textColor: textColor,
-                        bgColor: bgColor)
+                           text: text,
+                           textColor: textColor,
+                           bgColor: bgColor)
     }
     }
-    
+
     /// 添加文本控件
     /// 添加文本控件
     /// - Parameters:
     /// - Parameters:
     ///   - font: 文本大小
     ///   - font: 文本大小
@@ -294,10 +293,10 @@ public extension UIView {
         label.text = text
         label.text = text
         label.textColor = textColor
         label.textColor = textColor
         label.backgroundColor = bgColor
         label.backgroundColor = bgColor
-        self.addSubview(label)
+        addSubview(label)
         return label
         return label
     }
     }
-    
+
     /// 添加按钮控件
     /// 添加按钮控件
     /// - Parameters:
     /// - Parameters:
     ///   - rect: 控件大小
     ///   - rect: 控件大小
@@ -311,24 +310,24 @@ public extension UIView {
     ///   - event: 响应事件
     ///   - event: 响应事件
     /// - Returns: 按钮
     /// - Returns: 按钮
     func nx_addButton(rect: CGRect, title: String, titleColor: UIColor, font: UIFont, image: UIImage?, bgImg: UIImage?, target: Any?, action: Selector?, event: UIControl.Event?) -> UIButton {
     func nx_addButton(rect: CGRect, title: String, titleColor: UIColor, font: UIFont, image: UIImage?, bgImg: UIImage?, target: Any?, action: Selector?, event: UIControl.Event?) -> UIButton {
-            let btn = UIButton(type: .custom)
-            btn.frame = rect
-            btn.setTitle(title, for: .normal)
-            btn.setTitle(title, for: .highlighted)
-            btn.setTitleColor(titleColor, for: .normal)
-            btn.setTitleColor(titleColor, for: .highlighted)
-            btn.setImage(image, for: .normal)
-            btn.setImage(image, for: .highlighted)
-            btn.setBackgroundImage(bgImg, for: .normal)
-            btn.setBackgroundImage(bgImg, for: .highlighted)
-            btn.titleLabel?.font = font
-            if let sel = action, let e = event {
-                btn.addTarget(target, action: sel, for: e)
-            }
-            addSubview(btn)
-            return btn
+        let btn = UIButton(type: .custom)
+        btn.frame = rect
+        btn.setTitle(title, for: .normal)
+        btn.setTitle(title, for: .highlighted)
+        btn.setTitleColor(titleColor, for: .normal)
+        btn.setTitleColor(titleColor, for: .highlighted)
+        btn.setImage(image, for: .normal)
+        btn.setImage(image, for: .highlighted)
+        btn.setBackgroundImage(bgImg, for: .normal)
+        btn.setBackgroundImage(bgImg, for: .highlighted)
+        btn.titleLabel?.font = font
+        if let sel = action, let e = event {
+            btn.addTarget(target, action: sel, for: e)
         }
         }
-    
+        addSubview(btn)
+        return btn
+    }
+
     /// 添加一个文本类型的按钮控件
     /// 添加一个文本类型的按钮控件
     /// - Parameters:
     /// - Parameters:
     ///   - rect: 按钮大小
     ///   - rect: 按钮大小
@@ -338,18 +337,18 @@ public extension UIView {
     ///   - action: 事件响应方法
     ///   - action: 事件响应方法
     ///   - event:响应事件
     ///   - event:响应事件
     /// - Returns: 按钮控件
     /// - Returns: 按钮控件
-        func nx_addButton(rect: CGRect, title: String, titleColor: UIColor, target: Any?, action: Selector?, event: UIControl.Event?) -> UIButton {
-            return nx_addButton(rect: rect,
-                             title: title,
-                             titleColor: titleColor,
-                             font: UIFont.systemFont(ofSize: 14),
-                             image: nil,
-                             bgImg: nil,
-                             target: target,
-                             action: action,
-                             event: event)
-        }
-    
+    func nx_addButton(rect: CGRect, title: String, titleColor: UIColor, target: Any?, action: Selector?, event: UIControl.Event?) -> UIButton {
+        return nx_addButton(rect: rect,
+                            title: title,
+                            titleColor: titleColor,
+                            font: UIFont.systemFont(ofSize: 14),
+                            image: nil,
+                            bgImg: nil,
+                            target: target,
+                            action: action,
+                            event: event)
+    }
+
     /// 添加图片类型按钮
     /// 添加图片类型按钮
     /// - Parameters:
     /// - Parameters:
     ///   - rect: 按钮大小
     ///   - rect: 按钮大小
@@ -358,35 +357,33 @@ public extension UIView {
     ///   - action: 事件响应方法
     ///   - action: 事件响应方法
     ///   - event: 响应事件
     ///   - event: 响应事件
     /// - Returns: 按钮控件
     /// - Returns: 按钮控件
-        func nx_addButton(rect: CGRect, image: UIImage, target: Any?, action: Selector?, event: UIControl.Event?) -> UIButton {
-            return nx_addButton(rect: rect,
-                             title: "",
-                             titleColor: .white,
-                             font: UIFont.systemFont(ofSize: 14),
-                             image: image,
-                             bgImg: nil,
-                             target: target,
-                             action: action,
-                             event: event)
-        }
-    
+    func nx_addButton(rect: CGRect, image: UIImage, target: Any?, action: Selector?, event: UIControl.Event?) -> UIButton {
+        return nx_addButton(rect: rect,
+                            title: "",
+                            titleColor: .white,
+                            font: UIFont.systemFont(ofSize: 14),
+                            image: image,
+                            bgImg: nil,
+                            target: target,
+                            action: action,
+                            event: event)
+    }
+
     /// 添加tableView
     /// 添加tableView
     /// - Parameters:
     /// - Parameters:
     ///   - rect: 大小
     ///   - rect: 大小
     ///   - delegate: delegate对象
     ///   - delegate: delegate对象
     ///   - dataSource: dataSource 对象
     ///   - dataSource: dataSource 对象
     /// - Returns: 表视图
     /// - Returns: 表视图
-    func nx_addTableView(rect: CGRect, delegate: UITableViewDelegate?,dataSource:UITableViewDataSource?) -> UITableView {
-          let tableView = UITableView(frame: rect)
-          tableView.delegate = delegate
-          tableView.dataSource = dataSource
-          backgroundColor = .white
-          tableView.tableFooterView = UIView()
-          if #available(iOS 11.0, *) {
-              tableView.contentInsetAdjustmentBehavior = .never
-          }
-          return tableView
-      }
-
+    func nx_addTableView(rect: CGRect, delegate: UITableViewDelegate?, dataSource: UITableViewDataSource?) -> UITableView {
+        let tableView = UITableView(frame: rect)
+        tableView.delegate = delegate
+        tableView.dataSource = dataSource
+        backgroundColor = .white
+        tableView.tableFooterView = UIView()
+        if #available(iOS 11.0, *) {
+            tableView.contentInsetAdjustmentBehavior = .never
+        }
+        return tableView
+    }
 }
 }
- 

+ 0 - 77
BFCommonKit/Classes/BFCategorys/NXUIColor+Ext.swift

@@ -1,77 +0,0 @@
-//
-//  NXUIColor+Ext.swift
-//  NXFramework-Swift-Demo
-//
-//  Created by ak on 2020/10/26.
-//  Copyright © 2020 NXFramework-Swift. All rights reserved.
-//
-
-import UIKit
-
-extension UIColor {
-    
-    // MARK: - hex (0x000000) -> UIColor
-    ///
-    /// - Parameter hex (0x000000)
-    /// - Returns: UIColor
-    class func hex(hex: Int) -> UIColor {
-        return UIColor.hex(hex: hex, alpha: 1.0)
-    }
-    ///
-    /// - Parameters:
-    /// - Returns: UIColor
-    class func hex(hex: Int, alpha: CGFloat) -> UIColor {
-        return UIColor(red: CGFloat((hex >> 16) & 0xFF)/255.0, green: CGFloat((hex >> 8) & 0xFF)/255.0, blue: CGFloat(hex & 0xFF)/255.0, alpha: alpha)
-    }
- 
-    private class func colorComponent(hex: String, start: Int, length: Int) -> CGFloat {
-        let subString = hex.sliceString(start..<(start + length))
-        let fullHex = length == 2 ? subString : (subString + subString)
-        var val: CUnsignedInt = 0
-        Scanner(string: fullHex).scanHexInt32(&val)
-        return CGFloat(val) / 255.0
-    }
-    
-    var hex: String {
-        var color = self
-        if color.cgColor.numberOfComponents < 4 {
-            let components = color.cgColor.components
-            
-            color = UIColor(red: components![0], green: components![0], blue: components![0], alpha: components![1])
-        }
-        if color.cgColor.colorSpace?.model != CGColorSpaceModel.rgb {
-            return "#FFFFFF"
-        }
-        return String(format: "#%02X%02X%02X", Int(color.cgColor.components![0]*255.0), Int(color.cgColor.components![1]*255.0), Int(color.cgColor.components![2]*255.0))
-    }
-    
-    // MARK: - RGB -> UIColor
-    class func rgba(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) -> UIColor {
-        return UIColor(red: red/255.0, green: green/255.0, blue: blue/255.0, alpha: alpha)
-    }
-    // MARK: - RGBA -> UIColor
-    class func rgb(red: CGFloat, green: CGFloat, blue: CGFloat) -> UIColor {
-        return rgba(red: red, green: green, blue: blue, alpha: 1.0)
-    }
-    
-    var rgba: [Int] {
-        var red: CGFloat = 0
-        var green: CGFloat = 0
-        var blue: CGFloat = 0
-        var alpha: CGFloat = 0
-        self.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
-        return [Int(red*255.0), Int(green*255.0), Int(blue*255.0), Int(alpha)]
-    }
-    
-    class func randomColor() -> UIColor {
-        let red = CGFloat(arc4random()%255)
-        let green = CGFloat(arc4random()%255)
-        let blue = CGFloat(arc4random()%255)
-        let color = UIColor(red: red/255.0, green: green/255.0, blue: blue/255.0, alpha: 1.0)
-        return color
-    }
-    
-    
-    
-}
-

+ 0 - 114
BFCommonKit/Classes/BFCustomViews/views/NXBadgeView/NXBadgeControl.swift

@@ -1,114 +0,0 @@
-//
-//  NXBadgeControl.swift
-//  NXFramework-Swift
-//
-//  Created by ak on 2020/11/11.
-//
-
-
-import UIKit
-
-
-open class NXBadgeControl: UIControl {
-    
-    /// 记录Badge的偏移量 Record the offset of Badge
-    public var offset: CGPoint = CGPoint(x: 0, y: 0)
-    
-    /// Badge伸缩的方向, Default is NXBadgeViewFlexModeTail
-    public var flexMode: NXBadgeViewFlexMode = .tail
-    
-    private lazy var textLabel: UILabel = UILabel()
-    
-    private lazy var imageView: UIImageView = UIImageView()
-    
-    private var badgeViewColor: UIColor?
-    private var badgeViewHeightConstraint: NSLayoutConstraint?
-    
-    public class func `default`() -> Self {
-        return self.init(frame: .zero)
-    }
-    
-    required override public init(frame: CGRect) {
-        super.init(frame: frame)
-        setupSubviews()
-    }
-    
-    required public init?(coder aDecoder: NSCoder) {
-        super.init(coder: aDecoder)
-        fatalError("init(coder:) has not been implemented")
-    }
-    
-    /// Set Text
-    open var text: String? {
-        didSet {
-            textLabel.text = text
-        }
-    }
-    
-    /// Set AttributedText
-    open var attributedText: NSAttributedString? {
-        didSet {
-            textLabel.attributedText = attributedText
-        }
-    }
-    
-    /// Set Font
-    open var font: UIFont? {
-        didSet {
-            textLabel.font = font
-        }
-    }
-    
-    /// Set background image
-    open var backgroundImage: UIImage? {
-        didSet {
-            imageView.image = backgroundImage
-            if let _ = backgroundImage {
-                if let constraint = heightConstraint() {
-                    badgeViewHeightConstraint = constraint
-                    removeConstraint(constraint)
-                }
-                backgroundColor = UIColor.clear
-            } else {
-                if heightConstraint() == nil, let constraint = badgeViewHeightConstraint {
-                    addConstraint(constraint)
-                }
-                backgroundColor = badgeViewColor
-            }
-        }
-    }
-    
-    open override var backgroundColor: UIColor? {
-        didSet {
-            super.backgroundColor = backgroundColor
-            if let color = backgroundColor, color != .clear {
-                badgeViewColor = backgroundColor
-            }
-        }
-    }
-    
-    private func setupSubviews() {
-        layer.masksToBounds = true
-        layer.cornerRadius = 9.0
-        translatesAutoresizingMaskIntoConstraints = false
-        backgroundColor = UIColor.red
-        textLabel.textColor = UIColor.white
-        textLabel.font = UIFont.systemFont(ofSize: 13)
-        textLabel.textAlignment = .center
-        addSubview(textLabel)
-        addSubview(imageView)
-        addLayout(with: imageView, leading: 0, trailing: 0)
-        addLayout(with: textLabel, leading: 5, trailing: -5)
-    }
-    
-    private func addLayout(with view: UIView, leading: CGFloat, trailing: CGFloat) {
-        view.translatesAutoresizingMaskIntoConstraints = false
-        let topConstraint = NSLayoutConstraint(item: view, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1.0, constant: 0)
-        let leadingConstraint = NSLayoutConstraint(item: view, attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leading, multiplier: 1.0, constant: leading)
-        let bottomConstraint = NSLayoutConstraint(item: view, attribute: .bottom, relatedBy: .equal, toItem: self, attribute: .bottom, multiplier: 1.0, constant: 0)
-        let trailingConstraint = NSLayoutConstraint(item: view, attribute: .trailing, relatedBy: .equal, toItem: self, attribute: .trailing, multiplier: 1.0, constant: trailing)
-        leadingConstraint.priority = UILayoutPriority(rawValue: 999)
-        trailingConstraint.priority = UILayoutPriority(rawValue: 999)
-        addConstraints([topConstraint, leadingConstraint, bottomConstraint, trailingConstraint])
-    }
-}

+ 0 - 28
BFCommonKit/Classes/BFCustomViews/views/NXBadgeView/NXBadgeView.swift

@@ -1,28 +0,0 @@
-//
-//  NXBadgeView.swift.swift
-//  NXFramework-Swift
-//
-//  Created by ak on 2020/11/11.
-//
-
-
-import UIKit
-
-public struct NX<Base> {
-    public let base: Base
-    public init(_ base: Base) {
-        self.base = base
-    }
-}
-
-public extension NSObjectProtocol {
-    var nx: NX<Self> {
-        return NX(self)
-    }
-}
-
-public enum NXBadgeViewFlexMode {
-    case head    // 左伸缩 Head Flex    : <==●
-    case tail    // 右伸缩 Tail Flex    : ●==>
-    case middle  // 左右伸缩 Middle Flex : <=●=>
-}

+ 0 - 125
BFCommonKit/Classes/BFCustomViews/views/NXBadgeView/UIBarButtonItem+NXBadgeView.swift

@@ -1,125 +0,0 @@
-//
-//  UIBarButtonItem+NXBadgeView.swift
-//  NXFramework-Swift
-//
-//  Created by ak on 2020/11/11.
-//
-
-import UIKit
-
-public extension NX where Base: UIBarButtonItem {
-    
-    public var badgeView: NXBadgeControl {
-        return _bottomView.nx.badgeView
-    }
-    
-    /// 添加带文本内容的Badge, 默认右上角, 红色, 18pts
-    ///
-    /// Add Badge with text content, the default upper right corner, red backgroundColor, 18pts
-    ///
-    /// - Parameter text: 文本字符串
-     public  func addBadge(text: String) {
-        _bottomView.nx.addBadge(text: text)
-    }
-    
-    /// 添加带数字的Badge, 默认右上角,红色,18pts
-    ///
-    /// Add the Badge with numbers, the default upper right corner, red backgroundColor, 18pts
-    ///
-    /// - Parameter number: 整形数字
-     public  func addBadge(number: Int) {
-        _bottomView.nx.addBadge(number: number)
-    }
-    
-    /// 添加带颜色的小圆点, 默认右上角, 红色, 8pts
-    ///
-    /// Add small dots with color, the default upper right corner, red backgroundColor, 8pts
-    ///
-    /// - Parameter color: 颜色
-     public  func addDot(color: UIColor?) {
-        _bottomView.nx.addDot(color: color)
-    }
-    
-    /// 设置Badge的偏移量, Badge中心点默认为其父视图的右上角
-    ///
-    /// Set Badge offset, Badge center point defaults to the top right corner of its parent view
-    ///
-    /// - Parameters:
-    ///   - x: X轴偏移量 (x<0: 左移, x>0: 右移) axis offset (x <0: left, x> 0: right)
-    ///   - y: Y轴偏移量 (y<0: 上移, y>0: 下移) axis offset (Y <0: up,   y> 0: down)
-     public  func moveBadge(x: CGFloat, y: CGFloat) {
-        _bottomView.nx.moveBadge(x: x, y: y)
-    }
-    
-    /// 设置Badge伸缩的方向
-    ///
-    /// Setting the direction of Badge expansion
-    ///
-    /// NXBadgeViewFlexModeHead,    左伸缩 Head Flex    : <==●
-    /// NXBadgeViewFlexModeTail,    右伸缩 Tail Flex    : ●==>
-    /// NXBadgeViewFlexModeMiddle   左右伸缩 Middle Flex : <=●=>
-    /// - Parameter flexMode : Default is PPBadgeViewFlexModeTail
-     public  func setBadge(flexMode: NXBadgeViewFlexMode = .tail) {
-        _bottomView.nx.setBadge(flexMode: flexMode)
-    }
-    
-    /// 设置Badge的高度,因为Badge宽度是动态可变的,通过改变Badge高度,其宽度也按比例变化,方便布局
-    ///
-    /// (注意: 此方法需要将Badge添加到控件上后再调用!!!)
-    ///
-    /// Set the height of Badge, because the Badge width is dynamically and  variable.By changing the Badge height in proportion to facilitate the layout.
-    ///
-    /// (Note: this method needs to add Badge to the controls and then use it !!!)
-    ///
-    /// - Parameter points: 高度大小
-     public  func setBadge(height: CGFloat) {
-        _bottomView.nx.setBadge(height: height)
-    }
-    
-    /// 显示Badge
-     public  func showBadge() {
-        _bottomView.nx.showBadge()
-    }
-    
-    /// 隐藏Badge
-     public  func hiddenBadge() {
-        _bottomView.nx.hiddenBadge()
-    }
-    
-    // MARK: - 数字增加/减少, 注意:以下方法只适用于Badge内容为纯数字的情况
-    // MARK: - Digital increase /decrease, note: the following method applies only to cases where the Badge content is purely numeric
-    /// badge数字加1
-     public  func increase() {
-        _bottomView.nx.increase()
-    }
-    
-    /// badge数字加number
-     public  func increaseBy(number: Int) {
-        _bottomView.nx.increaseBy(number: number)
-    }
-    
-    /// badge数字加1
-     public  func decrease() {
-        _bottomView.nx.decrease()
-    }
-    
-    /// badge数字减number
-     public  func decreaseBy(number: Int) {
-        _bottomView.nx.decreaseBy(number: number)
-    }
-
-    /// 通过Xcode视图调试工具找到UIBarButtonItem的Badge所在父视图为:UIImageView
-    private var _bottomView: UIView {
-        let navigationButton = (self.base.value(forKey: "_view") as? UIView) ?? UIView()
-        let systemVersion = (UIDevice.current.systemVersion as NSString).doubleValue
-        let controlName = (systemVersion < 11.0 ? "UIImageView" : "UIButton" )
-        for subView in navigationButton.subviews {
-            if subView.isKind(of: NSClassFromString(controlName)!) {
-                subView.layer.masksToBounds = false
-                return subView
-            }
-        }
-        return navigationButton
-    }
-}
-

+ 0 - 126
BFCommonKit/Classes/BFCustomViews/views/NXBadgeView/UITabBarItem+NXBadgeView.swift

@@ -1,126 +0,0 @@
-
-//
-//  UITabBarItem+NXBadgeView.swift
-//  NXFramework-Swift
-//
-//  Created by ak on 2020/11/11.
-//
-
-import Foundation
-
-public extension NX where Base: UITabBarItem {
-    
-    var badgeView: NXBadgeControl {
-        return _bottomView.nx.badgeView
-    }
-    
-    /// 添加带文本内容的Badge, 默认右上角, 红色, 18pts
-    ///
-    /// Add Badge with text content, the default upper right corner, red backgroundColor, 18pts
-    ///
-    /// - Parameter text: 文本字符串
-    func addBadge(text: String) {
-        _bottomView.nx.addBadge(text: text)
-        _bottomView.nx.moveBadge(x: 4, y: 3)
-    }
-    
-    /// 添加带数字的Badge, 默认右上角,红色,18pts
-    ///
-    /// Add the Badge with numbers, the default upper right corner, red backgroundColor, 18pts
-    ///
-    /// - Parameter number: 整形数字
-    func addBadge(number: Int) {
-        _bottomView.nx.addBadge(number: number)
-        _bottomView.nx.moveBadge(x: 4, y: 3)
-    }
-    
-    /// 添加带颜色的小圆点, 默认右上角, 红色, 8pts
-    ///
-    /// Add small dots with color, the default upper right corner, red backgroundColor, 8pts
-    ///
-    /// - Parameter color: 颜色
-    func addDot(color: UIColor?) {
-        _bottomView.nx.addDot(color: color)
-    }
-    
-    /// 设置Badge的偏移量, Badge中心点默认为其父视图的右上角
-    ///
-    /// Set Badge offset, Badge center point defaults to the top right corner of its parent view
-    ///
-    /// - Parameters:
-    ///   - x: X轴偏移量 (x<0: 左移, x>0: 右移) axis offset (x <0: left, x> 0: right)
-    ///   - y: Y轴偏移量 (y<0: 上移, y>0: 下移) axis offset (Y <0: up,   y> 0: down)
-    func moveBadge(x: CGFloat, y: CGFloat) {
-        _bottomView.nx.moveBadge(x: x, y: y)
-    }
-    
-    /// 设置Badge伸缩的方向
-    ///
-    /// Setting the direction of Badge expansion
-    ///
-    /// PPBadgeViewFlexModeHead,    左伸缩 Head Flex    : <==●
-    /// PPBadgeViewFlexModeTail,    右伸缩 Tail Flex    : ●==>
-    /// PPBadgeViewFlexModeMiddle   左右伸缩 Middle Flex : <=●=>
-    /// - Parameter flexMode : Default is PPBadgeViewFlexModeTail
-    func setBadge(flexMode: NXBadgeViewFlexMode = .tail) {
-        _bottomView.nx.setBadge(flexMode: flexMode)
-    }
-    
-    /// 设置Badge的高度,因为Badge宽度是动态可变的,通过改变Badge高度,其宽度也按比例变化,方便布局
-    ///
-    /// (注意: 此方法需要将Badge添加到控件上后再调用!!!)
-    ///
-    /// Set the height of Badge, because the Badge width is dynamically and  variable.By changing the Badge height in proportion to facilitate the layout.
-    ///
-    /// (Note: this method needs to add Badge to the controls and then use it !!!)
-    ///
-    /// - Parameter height: 高度大小
-    func setBadge(height: CGFloat) {
-        _bottomView.nx.setBadge(height: height)
-    }
-    
-    
-    /// 显示Badge
-    func showBadge() {
-        _bottomView.nx.showBadge()
-    }
-    
-    /// 隐藏Badge
-    func hiddenBadge() {
-        _bottomView.nx.hiddenBadge()
-    }
-    
-    // MARK: - 数字增加/减少, 注意:以下方法只适用于Badge内容为纯数字的情况
-    // MARK: - Digital increase /decrease, note: the following method applies only to cases where the Badge content is purely numeric
-    /// badge数字加1
-    func increase() {
-        _bottomView.nx.increase()
-    }
-    
-    /// badge数字加number
-    func increaseBy(number: Int) {
-        _bottomView.nx.increaseBy(number: number)
-    }
-    
-    /// badge数字加1
-    func decrease() {
-        _bottomView.nx.decrease()
-    }
-    
-    /// badge数字减number
-    func decreaseBy(number: Int) {
-        _bottomView.nx.decreaseBy(number: number)
-    }
-    
-    /// 通过Xcode视图调试工具找到UITabBarItem原生Badge所在父视图
-    private var _bottomView: UIView {
-        let tabBarButton = (self.base.value(forKey: "_view") as? UIView) ?? UIView()
-        for subView in tabBarButton.subviews {
-            guard let superclass = subView.superclass else { return tabBarButton }
-            if superclass == NSClassFromString("UIImageView") {
-                return subView
-            }
-        }
-        return tabBarButton
-    }
-}

+ 0 - 260
BFCommonKit/Classes/BFCustomViews/views/NXBadgeView/UIView+NXBadgeView.swift

@@ -1,260 +0,0 @@
-//
-//  UIView+NXBadgeView.swift
-//  NXFramework-Swift
-//
-//  Created by ak on 2020/11/11.
-//
-
-import UIKit
-
-private var kBadgeView = "kNXBadgeView"
-
-// MARK: - add Badge
-public extension NX where Base: UIView {
-    
-    var badgeView: NXBadgeControl {
-        return base.badgeView
-    }
-    
-    /// 添加带文本内容的Badge, 默认右上角, 红色, 18pts
-    ///
-    /// Add Badge with text content, the default upper right corner, red backgroundColor, 18pts
-    ///
-    /// - Parameter text: 文本字符串
-    func addBadge(text: String?) {
-        showBadge()
-        base.badgeView.text = text
-        setBadge(flexMode: base.badgeView.flexMode)
-        if text == nil {
-            if base.badgeView.widthConstraint()?.relation == .equal { return }
-            base.badgeView.widthConstraint()?.isActive = false
-            let constraint = NSLayoutConstraint(item: base.badgeView, attribute: .width, relatedBy: .equal, toItem: base.badgeView, attribute: .height, multiplier: 1.0, constant: 0)
-            base.badgeView.addConstraint(constraint)
-        } else {
-            if base.badgeView.widthConstraint()?.relation == .greaterThanOrEqual { return }
-            base.badgeView.widthConstraint()?.isActive = false
-            let constraint = NSLayoutConstraint(item: base.badgeView, attribute: .width, relatedBy: .greaterThanOrEqual, toItem: base.badgeView, attribute: .height, multiplier: 1.0, constant: 0)
-            base.badgeView.addConstraint(constraint)
-        }
-    }
-    
-    /// 添加带数字的Badge, 默认右上角,红色,18pts
-    ///
-    /// Add the Badge with numbers, the default upper right corner, red backgroundColor, 18pts
-    ///
-    /// - Parameter number: 整形数字
-    func addBadge(number: Int) {
-        if number <= 0 {
-            addBadge(text: "0")
-            hiddenBadge()
-            return
-        }
-        addBadge(text: "\(number)")
-    }
-    
-    /// 添加带颜色的小圆点, 默认右上角, 红色, 8pts
-    ///
-    /// Add small dots with color, the default upper right corner, red backgroundColor, 8pts
-    ///
-    /// - Parameter color: 颜色
-    func addDot(color: UIColor? = .red) {
-        addBadge(text: nil)
-        setBadge(height: 8.0)
-        base.badgeView.backgroundColor = color
-    }
-    
-    /// 设置Badge的偏移量, Badge中心点默认为其父视图的右上角
-    ///
-    /// Set Badge offset, Badge center point defaults to the top right corner of its parent view
-    ///
-    /// - Parameters:
-    ///   - x: X轴偏移量 (x<0: 左移, x>0: 右移) axis offset (x <0: left, x> 0: right)
-    ///   - y: Y轴偏移量 (y<0: 上移, y>0: 下移) axis offset (Y <0: up,   y> 0: down)
-    func moveBadge(x: CGFloat, y: CGFloat) {
-        base.badgeView.offset = CGPoint(x: x, y: y)
-        base.centerYConstraint(with: base.badgeView)?.constant = y
-        
-        let badgeHeight = base.badgeView.heightConstraint()?.constant ?? 0
-        switch base.badgeView.flexMode {
-        case .head:
-            base.centerXConstraint(with: base.badgeView)?.isActive = false
-            base.leadingConstraint(with: base.badgeView)?.isActive = false
-            if let constraint = base.trailingConstraint(with: base.badgeView) {
-                constraint.constant = badgeHeight * 0.5 + x
-                return
-            }
-            let trailingConstraint = NSLayoutConstraint(item: base.badgeView, attribute: .trailing, relatedBy: .equal, toItem: base, attribute: .trailing, multiplier: 1.0, constant: badgeHeight * 0.5 + x)
-            base.addConstraint(trailingConstraint)
-            
-        case .tail:
-            base.centerXConstraint(with: base.badgeView)?.isActive = false
-            base.trailingConstraint(with: base.badgeView)?.isActive = false
-            if let constraint = base.leadingConstraint(with: base.badgeView) {
-                constraint.constant = x - badgeHeight * 0.5
-                return
-            }
-            let leadingConstraint = NSLayoutConstraint(item: base.badgeView, attribute: .leading, relatedBy: .equal, toItem: base, attribute: .trailing, multiplier: 1.0, constant: x - badgeHeight * 0.5)
-            base.addConstraint(leadingConstraint)
-            
-        case .middle:
-            base.leadingConstraint(with: base.badgeView)?.isActive = false
-            base.trailingConstraint(with: base.badgeView)?.isActive = false
-            base.centerXConstraint(with: base.badgeView)?.constant = x
-            if let constraint = base.centerXConstraint(with: base.badgeView) {
-                constraint.constant = x
-                return
-            }
-            let centerXConstraint = NSLayoutConstraint(item: base.badgeView, attribute: .centerX, relatedBy: .equal, toItem: base, attribute: .centerX, multiplier: 1.0, constant: x)
-            base.addConstraint(centerXConstraint)
-        }
-    }
-    
-    /// 设置Badge伸缩的方向
-    ///
-    /// Setting the direction of Badge expansion
-    ///
-    /// NXBadgeViewFlexModeHead,    左伸缩 Head Flex    : <==●
-    /// NXBadgeViewFlexModeTail,    右伸缩 Tail Flex    : ●==>
-    /// NXBadgeViewFlexModeMiddle   左右伸缩 Middle Flex : <=●=>
-    /// - Parameter flexMode : Default is PPBadgeViewFlexModeTail
-    func setBadge(flexMode: NXBadgeViewFlexMode = .tail) {
-        base.badgeView.flexMode = flexMode
-        moveBadge(x: base.badgeView.offset.x, y: base.badgeView.offset.y)
-    }
-    
-    /// 设置Badge的高度,因为Badge宽度是动态可变的,通过改变Badge高度,其宽度也按比例变化,方便布局
-    ///
-    /// (注意: 此方法需要将Badge添加到控件上后再调用!!!)
-    ///
-    /// Set the height of Badge, because the Badge width is dynamically and  variable.By changing the Badge height in proportion to facilitate the layout.
-    ///
-    /// (Note: this method needs to add Badge to the controls and then use it !!!)
-    ///
-    /// - Parameter height: 高度大小
-    func setBadge(height: CGFloat) {
-        base.badgeView.layer.cornerRadius = height * 0.5
-        base.badgeView.heightConstraint()?.constant = height
-        moveBadge(x: base.badgeView.offset.x, y: base.badgeView.offset.y)
-    }
-    
-    /// 显示Badge
-    func showBadge() {
-        base.badgeView.isHidden = false
-    }
-    
-    /// 隐藏Badge
-    func hiddenBadge() {
-        base.badgeView.isHidden = true
-    }
-    
-    // MARK: - 数字增加/减少, 注意:以下方法只适用于Badge内容为纯数字的情况
-    // MARK: - Digital increase /decrease, note: the following method applies only to cases where the Badge content is purely numeric
-    /// badge数字加1
-    func increase() {
-        increaseBy(number: 1)
-    }
-    
-    /// badge数字加number
-    func increaseBy(number: Int) {
-        let label = base.badgeView
-        let result = (Int(label.text ?? "0") ?? 0) + number
-        if result > 0 {
-            showBadge()
-        }
-        label.text = "\(result)"
-    }
-    
-    /// badge数字加1
-    func decrease() {
-        decreaseBy(number: 1)
-    }
-    
-    /// badge数字减number
-    func decreaseBy(number: Int) {
-        let label = base.badgeView
-        let result = (Int(label.text ?? "0") ?? 0) - number
-        if (result <= 0) {
-            hiddenBadge()
-            label.text = "0"
-            return
-        }
-        label.text = "\(result)"
-    }
-}
-
-extension UIView {
-    
-      public  func addBadgeViewLayoutConstraint() {
-        badgeView.translatesAutoresizingMaskIntoConstraints = false
-        let centerXConstraint = NSLayoutConstraint(item: badgeView, attribute: .centerX, relatedBy: .equal, toItem: self, attribute: .trailing, multiplier: 1.0, constant: 0)
-        let centerYConstraint = NSLayoutConstraint(item: badgeView, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1.0, constant: 0)
-        let widthConstraint = NSLayoutConstraint(item: badgeView, attribute: .width, relatedBy: .greaterThanOrEqual, toItem: badgeView, attribute: .height, multiplier: 1.0, constant: 0)
-        let heightConstraint = NSLayoutConstraint(item: badgeView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 18)
-        addConstraints([centerXConstraint, centerYConstraint])
-        badgeView.addConstraints([widthConstraint, heightConstraint])
-    }
-}
-
-// MARK: - getter/setter
-extension UIView {
-
-    public var badgeView: NXBadgeControl {
-        get {
-            if let aValue = objc_getAssociatedObject(self, &kBadgeView) as? NXBadgeControl {
-                return aValue
-            }
-            else {
-                let badgeControl = NXBadgeControl.default()
-                self.addSubview(badgeControl)
-                self.bringSubviewToFront(badgeControl)
-                self.badgeView = badgeControl
-                self.addBadgeViewLayoutConstraint()
-                return badgeControl
-            }
-        }
-        set {
-            objc_setAssociatedObject(self, &kBadgeView, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
-        }
-    }
-    
-       public  func topConstraint(with item: AnyObject?) -> NSLayoutConstraint? {
-        return constraint(with: item, attribute: .top)
-    }
-    
-       public  func leadingConstraint(with item: AnyObject?) -> NSLayoutConstraint? {
-        return constraint(with: item, attribute: .leading)
-    }
-    
-       public  func bottomConstraint(with item: AnyObject?) -> NSLayoutConstraint? {
-        return constraint(with: item, attribute: .bottom)
-    }
-
-       public  func trailingConstraint(with item: AnyObject?) -> NSLayoutConstraint? {
-        return constraint(with: item, attribute: .trailing)
-    }
-    
-       public  func widthConstraint() -> NSLayoutConstraint? {
-        return constraint(with: self, attribute: .width)
-    }
-    
-       public  func heightConstraint() -> NSLayoutConstraint? {
-        return constraint(with: self, attribute: .height)
-    }
-
-       public  func centerXConstraint(with item: AnyObject?) -> NSLayoutConstraint? {
-        return constraint(with: item, attribute: .centerX)
-    }
-    
-       public  func centerYConstraint(with item: AnyObject?) -> NSLayoutConstraint? {
-        return constraint(with: item, attribute: .centerY)
-    }
-    
-       public  func constraint(with item: AnyObject?, attribute: NSLayoutConstraint.Attribute) -> NSLayoutConstraint? {
-        for constraint in constraints {
-            if let isSame = constraint.firstItem?.isEqual(item), isSame, constraint.firstAttribute == attribute {
-                return constraint
-            }
-        }
-        return nil
-    }
-}

+ 0 - 166
BFCommonKit/Classes/BFCustomViews/views/bubbleLayer/NXBubbleLayer.swift

@@ -1,166 +0,0 @@
-//
-//  NXBubbleLayer.swift
-//  bubbleLayer_swift
-//
-//  Created by liuming on 2020/8/23.
-//  Copyright © 2020 liuming. All rights reserved.
-//
-
-import UIKit
-// 箭头方向枚举
-public enum ArrowDirection: Int {
-    case right = 0 // 指向右边, 即在圆角矩形的右边
-    case bottom = 1 // 指向下边
-    case left = 2 // 指向左边
-    case top = 3 // 指向上边
-}
-
-class NXBubbleLayer: NSObject {
-    // 矩形的圆角的半径
-    var cornerRadius: CGFloat = 8
-    // 箭头位置的圆角半径
-    var arrowRadius: CGFloat = 3
-    // 箭头的高度
-    var arrowHeight: CGFloat = 12
-    // 箭头的宽度
-    var arrowWidth: CGFloat = 30
-    // 箭头方向
-    var arrowDirection: ArrowDirection = .bottom
-    // 箭头的相对位置
-    var arrowPosition: CGFloat = 0.5
-    // 这里的size是需要mask成气泡形状的view的size
-    public var size: CGSize = CGSize.zero
-
-    /// 气泡layer 在视图层的位置
-    public var bubbleLayerRect: CGRect = .zero
-
-    init(originalSize: CGSize) {
-        size = originalSize
-    }
-
-    // 最终拿这个layer去设置mask
-    func layer() -> CAShapeLayer {
-        let layer = CAShapeLayer()
-        layer.path = bubblePath()
-        return layer
-    }
-
-    // 绘制气泡形状,获取path
-    func bubblePath() -> CGPath? {
-        UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
-        let ctx = UIGraphicsGetCurrentContext()
-
-        // 获取绘图所需要的关键点
-        let points = keyPoints()
-
-        // 第一步是要画箭头的“第一个支点”所在的那个角,所以要把“笔”放在这个支点顺时针顺序的上一个点
-        // 所以把“笔”放在最后才画的矩形框的角的位置, 准备开始画箭头
-        let currentPoint = points[6]
-        ctx?.move(to: currentPoint)
-
-        // 用于 CGContextAddArcToPoint函数的变量
-        var pointA = CGPoint.zero
-        var pointB = CGPoint.zero
-        var radius: CGFloat = 0
-        var count: Int = 0
-
-        while count < 7 {
-            // 整个过程需要画七个圆角(矩形框的四个角和箭头处的三个角),所以分为七个步骤
-
-            // 箭头处的三个圆角和矩形框的四个圆角不一样
-            radius = count < 3 ? arrowRadius : cornerRadius
-
-            pointA = points[count]
-            pointB = points[(count + 1) % 7]
-            // 画矩形框最后一个角的时候,pointB就是points[0]
-
-            ctx?.addArc(tangent1End: pointA, tangent2End: pointB, radius: radius)
-
-            count = count + 1
-        }
-
-        ctx?.closePath()
-        UIGraphicsEndImageContext()
-
-        return ctx?.path?.copy()
-    }
-
-    // 关键点: 绘制气泡形状前,需要计算箭头的三个点和矩形的四个角的点的坐标
-    func keyPoints() -> [CGPoint] {
-        // 先确定箭头的三个点
-        var beginPoint = CGPoint.zero // 按顺时针画箭头时的第一个支点,例如箭头向上时的左边的支点
-        var topPoint = CGPoint.zero // 顶点
-        var endPoint = CGPoint.zero // 另外一个支点
-
-        // 箭头顶点topPoint的X坐标(或Y坐标)的范围(用来计算arrowPosition)
-        let tpXRange = size.width - 2 * cornerRadius - arrowWidth
-        let tpYRange = size.height - 2 * cornerRadius - arrowWidth
-
-        // 用于表示矩形框的位置和大小
-        var rX: CGFloat = 0
-        var rY: CGFloat = 0
-        var rWidth = size.width
-        var rHeight = size.height
-
-        // 计算箭头的位置,以及调整矩形框的位置和大小
-        switch arrowDirection {
-        case .right: // 箭头在右时
-            topPoint = CGPoint(x: size.width, y: size.height / 2 + tpYRange * (arrowPosition - 0.5))
-            beginPoint = CGPoint(x: topPoint.x - arrowHeight, y: topPoint.y - arrowWidth / 2)
-            endPoint = CGPoint(x: beginPoint.x, y: beginPoint.y + arrowWidth)
-
-            rWidth = rWidth - arrowHeight // 矩形框右边的位置“腾出”给箭头
-
-        case .bottom: // 箭头在下时
-            topPoint = CGPoint(x: size.width / 2 + tpXRange * (arrowPosition - 0.5), y: size.height)
-            beginPoint = CGPoint(x: topPoint.x + arrowWidth / 2, y: topPoint.y - arrowHeight)
-            endPoint = CGPoint(x: beginPoint.x - arrowWidth, y: beginPoint.y)
-
-            rHeight = rHeight - arrowHeight
-
-        case .left: // 箭头在左时
-            topPoint = CGPoint(x: 0, y: size.height / 2 + tpYRange * (arrowPosition - 0.5))
-            beginPoint = CGPoint(x: topPoint.x + arrowHeight, y: topPoint.y + arrowWidth / 2)
-            endPoint = CGPoint(x: beginPoint.x, y: beginPoint.y - arrowWidth)
-
-            rX = arrowHeight
-            rWidth = rWidth - arrowHeight
-
-        case .top: // 箭头在上时
-            topPoint = CGPoint(x: size.width / 2 + tpXRange * (arrowPosition - 0.5), y: 0)
-            beginPoint = CGPoint(x: topPoint.x - arrowWidth / 2, y: topPoint.y + arrowHeight)
-            endPoint = CGPoint(x: beginPoint.x + arrowWidth, y: beginPoint.y)
-
-            rY = arrowHeight
-            rHeight = rHeight - arrowHeight
-
-        default:
-            ()
-        }
-        bubbleLayerRect = CGRect(x: rX, y: rY, width: rWidth, height: rHeight)
-        // 先把箭头的三个点放进关键点数组中
-        var points = [beginPoint, topPoint, endPoint]
-
-        // 确定圆角矩形的四个点
-        let bottomRight = CGPoint(x: rX + rWidth, y: rY + rHeight) // 右下角的点
-        let bottomLeft = CGPoint(x: rX, y: rY + rHeight)
-        let topLeft = CGPoint(x: rX, y: rY)
-        let topRight = CGPoint(x: rX + rWidth, y: rY)
-
-        // 先放在一个临时数组, 放置顺序跟下面紧接着的操作有关
-        let rectPoints = [bottomRight, bottomLeft, topLeft, topRight]
-
-        // 绘制气泡形状的时候,从箭头开始,顺时针地进行
-        // 箭头向右时,画完箭头之后会先画到矩形框的右下角
-        // 所以此时先把矩形框右下角的点放进关键点数组,其他三个点按顺时针方向添加
-        // 箭头在其他方向时,以此类推
-
-        var rectPointIndex: Int = arrowDirection.rawValue
-        for _ in 0...3 {
-            points.append(rectPoints[rectPointIndex])
-            rectPointIndex = (rectPointIndex + 1) % 4
-        }
-
-        return points
-    }
-}

+ 0 - 23
BFCommonKit/Classes/BFCustomViews/views/bubbleLayer/NXContainView.swift

@@ -1,23 +0,0 @@
-//
-//  NXContainView.swift
-//  bubbleLayer_swift
-//
-//  Created by liuming on 2020/9/1.
-//  Copyright © 2020 liuming. All rights reserved.
-//
-
-import UIKit
-public class NXBubbleContainView: UIView {
-    override public func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
-        var view = super.hitTest(point, with: event)
-        if view == nil {
-            subviews.forEach { subView in
-                let p = subView.convert(point, from: self)
-                if subView.bounds.contains(p) {
-                    view = subView
-                }
-            }
-        }
-        return view
-    }
-}

+ 0 - 73
BFCommonKit/Classes/BFCustomViews/views/bubbleLayer/NXInteractiveView.swift

@@ -1,73 +0,0 @@
-//
-//  NXInteractiveView.swift
-//  bubbleLayer_swift
-//
-//  Created by liuming on 2020/8/23.
-//  Copyright © 2020 liuming. All rights reserved.
-//
-
-import UIKit
-public class NXInteractiveView: UIView {
-    public var tapGestureRecognizer: UITapGestureRecognizer?
-    public var longPressGestureRecognizer: UILongPressGestureRecognizer?
-    // 点击回调
-    public var tapGestureHander: (() -> Void)?
-    // 长按回调
-    public var longPressGestureHander: (() -> Void)?
-
-    override public init(frame: CGRect) {
-        super.init(frame: frame)
-        addTagGestureRecognizer()
-        addLongGestureRecogizer()
-    }
-
-    required init?(coder _: NSCoder) {
-        fatalError("init(coder:) has not been implemented")
-    }
-
-    // 单机方法
-    private func addTagGestureRecognizer() {
-        let tap = UITapGestureRecognizer(target: self, action: #selector(tapGestureRecognizerHandler(sender:)))
-        tap.numberOfTouchesRequired = 1
-        tap.numberOfTapsRequired = 1
-        addGestureRecognizer(tap)
-        tapGestureRecognizer = tap
-    }
-
-    @objc
-    public func tapGestureRecognizerHandler(sender _: UITapGestureRecognizer) {
-        print("---- tapGestureRecognizerHandler -----")
-        if tapGestureHander != nil {
-            tapGestureHander!()
-        }
-    }
-
-    // 长按事件
-    private func addLongGestureRecogizer() {
-        let longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(longGestureRecognizerHandler(sender:)))
-        longPressGestureRecognizer.numberOfTapsRequired = 1
-        longPressGestureRecognizer.numberOfTouchesRequired = 1
-        addGestureRecognizer(longPressGestureRecognizer)
-        self.longPressGestureRecognizer = longPressGestureRecognizer
-    }
-
-    @objc
-    public func longGestureRecognizerHandler(sender _: UILongPressGestureRecognizer) {
-        print("---- longGestureRecognizerHandler -----")
-        if longPressGestureHander != nil {
-            longPressGestureHander!()
-        }
-    }
-
-    public func removeTapGestureRecognizer() {
-        if let tap = tapGestureRecognizer {
-            removeGestureRecognizer(tap)
-        }
-    }
-
-    public func removeLongPressGestureRecognizer() {
-        if let long = longPressGestureRecognizer {
-            removeGestureRecognizer(long)
-        }
-    }
-}

+ 0 - 80
BFCommonKit/Classes/BFCustomViews/views/bubbleLayer/NXNormalBubbleView.swift

@@ -1,80 +0,0 @@
-//
-//  NXBaseBubbleView.swift
-//  bubbleLayer_swift
-//
-//  Created by liuming on 2020/8/23.
-//  Copyright © 2020 liuming. All rights reserved.
-//
-
-import Foundation
-import UIKit
-public class NXNormalBubbleView: NXInteractiveView {
-    let bubbleLayer = NXBubbleLayer(originalSize: .zero)
-    var currentLayer: CALayer?
-    /// 内部内容控件
-    public var containView = NXBubbleContainView(frame: .zero)
-
-    // 矩形的圆角的半径
-    public var cornerRadius: CGFloat = 8
-    // 箭头位置的圆角半径
-    public var arrowRadius: CGFloat = 3
-    // 箭头的高度
-    public var arrowHeight: CGFloat = 12
-    // 箭头的宽度
-    public var arrowWidth: CGFloat = 30
-    // 箭头方向
-    public var arrowDirection: ArrowDirection = .bottom
-    // 箭头的相对位置
-    public var arrowPosition: CGFloat = 0.5
-
-    public var bubbleColor: UIColor = .white {
-        didSet {
-            self.setNeedsLayout()
-            self.layoutIfNeeded()
-        }
-    }
-
-    override public init(frame: CGRect) {
-        super.init(frame: frame)
-        addSubview(containView)
-    }
-
-    required init?(coder _: NSCoder) {
-        fatalError("init(coder:) has not been implemented")
-    }
-
-    override public func layoutSubviews() {
-        super.layoutSubviews()
-        if let layer = currentLayer {
-            layer.removeFromSuperlayer()
-        }
-        bubbleLayer.size = frame.size
-        bubbleLayer.cornerRadius = cornerRadius
-        bubbleLayer.arrowRadius = arrowRadius
-        bubbleLayer.arrowHeight = arrowHeight
-        bubbleLayer.arrowWidth = arrowWidth
-        bubbleLayer.arrowDirection = arrowDirection
-        bubbleLayer.arrowPosition = arrowPosition
-        let layer = bubbleLayer.layer()
-        layer.fillColor = bubbleColor.cgColor
-        self.layer.insertSublayer(layer, at: 0)
-        currentLayer = layer
-        // 调整 contain坐标
-        containView.frame = bubbleLayer.bubbleLayerRect
-
-        backgroundColor = .clear
-        containView.backgroundColor = .clear
-    }
-
-    // MARK: - 重写交互层的长按和点击事件
-
-    override public func tapGestureRecognizerHandler(sender: UITapGestureRecognizer) {
-        super.tapGestureRecognizerHandler(sender: sender)
-        print("点击了普通气泡")
-    }
-
-    override public func longGestureRecognizerHandler(sender: UILongPressGestureRecognizer) {
-        super.longGestureRecognizerHandler(sender: sender)
-        print("长按了 点击了普通气泡")
-    }
-}

+ 0 - 40
BFCommonKit/Classes/BFCustomViews/views/bubbleLayer/NXTextBubbleView.swift

@@ -1,40 +0,0 @@
-//
-//  NXTextBubbleView.swift
-//  bubbleLayer_swift
-//
-//  Created by liuming on 2020/8/23.
-//  Copyright © 2020 liuming. All rights reserved.
-//
-
-import SnapKit
-import UIKit
-
-class NXTextBubbleView: NXNormalBubbleView {
-    public let textLabel = UILabel(frame: .zero)
-
-    override init(frame: CGRect) {
-        super.init(frame: frame)
-        initSubViews()
-    }
-
-    required init?(coder _: NSCoder) {
-        fatalError("init(coder:) has not been implemented")
-    }
-
-    private func initSubViews() {
-        containView.addSubview(textLabel)
-        textLabel.snp.makeConstraints { make in
-            make.edges.equalTo(UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5))
-        }
-    }
-
-    // MARK: - 重写交互层的长按和点击事件
-
-    override public func tapGestureRecognizerHandler(sender _: UITapGestureRecognizer) {
-        print("点击了文字气泡")
-    }
-
-    override public func longGestureRecognizerHandler(sender _: UILongPressGestureRecognizer) {
-        print("长按了 点击了文字气泡")
-    }
-}

+ 0 - 184
BFCommonKit/Classes/BFCustomViews/views/bubbleLayer/NXVoiceBubbleView.swift

@@ -1,184 +0,0 @@
-//
-//  NXVoiceBubbleView.swift
-//  bubbleLayer_swift
-//
-//  Created by liuming on 2020/8/23.
-//  Copyright © 2020 liuming. All rights reserved.
-//
-
-import UIKit
-public class NXVoiceBubbleView: NXNormalBubbleView {
-    /// 关闭按钮
-    private let closeBtn = UIButton(type: .custom)
-    /// 声音图片
-    private let voiceImgView = UIImageView(frame: .zero)
-
-    /// 语音时间文本
-    public let durationLabel = UILabel(frame: .zero)
-    /// 语音图片序列帧动画时间
-    public var animationDuration: TimeInterval = 0.5 {
-        didSet {
-            self.initVoiceAnimation()
-        }
-    }
-
-    // 加载圈
-    lazy var activityIndicator: UIActivityIndicatorView = {
-        let activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView(style:
-            .gray)
-        return activityIndicator
-    }()
-
-    /// 语音图片帧图片
-    public var animationImages: [UIImage] = Array() {
-        didSet {
-            initVoiceAnimation()
-        }
-    }
-
-    /// 语音图片动画重复次数
-    public var animationRepeatCount: Int = 1 {
-        didSet {
-            initVoiceAnimation()
-        }
-    }
-
-    /// 音频显示的总时间
-    public var duration: Float64 = 0 {
-        didSet {
-            showTime()
-            activityIndicatorStop()
-        }
-    }
-
-    public var closeBtnClickedHander: (() -> Void)?
-    override public init(frame: CGRect) {
-        super.init(frame: frame)
-        initSubviews()
-    }
-
-    required init?(coder _: NSCoder) {
-        fatalError("init(coder:) has not been implemented")
-    }
-
-    private func initSubviews() {
-        containView.addSubview(voiceImgView)
-        voiceImgView.image = UIImage(named: "icon_voice")
-
-        containView.addSubview(durationLabel)
-
-        closeBtn.setImage(UIImage(named: "videomk_serach_clear"), for: .normal)
-        closeBtn.setImage(UIImage(named: "videomk_serach_clear"), for: .highlighted)
-        closeBtn.addTarget(self, action: #selector(closeBtnClicked(sender:)), for: .touchUpInside)
-        containView.addSubview(closeBtn)
-
-        containView.addSubview(activityIndicator)
-
-        // 布局
-        voiceImgView.snp.makeConstraints { maker in
-            maker.centerY.equalTo(self.containView)
-            maker.left.equalTo(self.containView).offset(10)
-            maker.width.height.equalTo(20)
-        }
-        durationLabel.snp.makeConstraints { maker in
-            maker.right.equalTo(self.containView).offset(-10)
-            maker.centerY.equalTo(self.containView)
-            maker.height.equalTo(20)
-        }
-        closeBtn.snp.makeConstraints { maker in
-
-            maker.right.equalTo(self.containView).offset(10)
-            maker.top.equalTo(self.containView).offset(-8)
-            maker.width.height.equalTo(20)
-        }
-
-        activityIndicator.snp.makeConstraints { maker in
-
-            maker.right.equalTo(self.containView).offset(-10)
-            maker.centerY.equalTo(self.containView)
-            maker.height.equalTo(20)
-        }
-    }
-
-    private func showTime() {
-        durationLabel.text = duration < 1 ? "1'" : duration.formatDurationToMS()
-    }
-
-    private func initVoiceAnimation() {
-        if animationImages.count > 0 {
-            voiceImgView.animationImages = animationImages
-            voiceImgView.animationDuration = animationDuration
-            voiceImgView.animationRepeatCount = animationRepeatCount
-        }
-    }
-
-    /// 加载圈开始动画
-    public func activityIndicatorStart() {
-        durationLabel.text = ""
-        activityIndicator.startAnimating()
-    }
-
-    /// 加载圈结束动画
-    public func activityIndicatorStop() {
-        activityIndicator.stopAnimating()
-    }
-
-    /// 开始动画
-    public func startAnimation() {
-        voiceImgView.startAnimating()
-    }
-
-    /// 结束动画
-    public func stopAnimation() {
-        voiceImgView.stopAnimating()
-    }
-
-    /// 按照中心点抖动
-    func animation() {
-        let animati = CAKeyframeAnimation(keyPath: "transform.rotation")
-        // rotation 旋转,需要添加弧度值
-        // 角度转弧度
-        animati.values = [angle2Radion(angle: -50), angle2Radion(angle: 50), angle2Radion(angle: -50)]
-        animati.repeatCount = 4
-        layer.add(animati, forKey: nil)
-    }
-
-    // MARK: - 重写交互层的长按和点击事件
-
-    override public func tapGestureRecognizerHandler(sender: UITapGestureRecognizer) {
-        super.tapGestureRecognizerHandler(sender: sender)
-        startAnimation()
-        print("点击了语音气泡")
-    }
-
-    override public func longGestureRecognizerHandler(sender: UILongPressGestureRecognizer) {
-        super.longGestureRecognizerHandler(sender: sender)
-        print("长按了 点击了语音气泡")
-        animation()
-    }
-
-    func angle2Radion(angle: Float) -> Float {
-        return angle / Float(180.0 * Double.pi)
-    }
-
-    // MARK: 关闭按钮点击事件
-
-    @objc
-    func closeBtnClicked(sender _: UIButton) {
-        print("点击了关闭按钮")
-        if let block = closeBtnClickedHander {
-            block()
-        }
-    }
-
-    override public func point(inside point: CGPoint, with _: UIEvent?) -> Bool {
-        if bounds.contains(point) {
-            return true
-        }
-        let p = convert(point, to: closeBtn)
-        if closeBtn.bounds.contains(p) {
-            return true
-        }
-        return false
-    }
-}

+ 0 - 13
BFCommonKit/Classes/BFMacro/NXConfig.swift

@@ -1,13 +0,0 @@
-//
-//  NXConfig.swift
-//  NXFramework-Swift-Demo
-//
-//  Created by ak on 2020/10/26.
-//  Copyright © 2020 NXFramework-Swift. All rights reserved.
-//
-
-import UIKit
-
-class NXConfig: NSObject {
-
-}

+ 1 - 1
BFCommonKit/Classes/BFUtility/NXAudioRecorder.swift

@@ -9,7 +9,7 @@ import Foundation
 //  本类功能:录制声音,并转换成 MP3
 //  本类功能:录制声音,并转换成 MP3
 //  alse see https://www.jianshu.com/p/971fff236881
 //  alse see https://www.jianshu.com/p/971fff236881
 import UIKit
 import UIKit
-
+
 // 录制时长
 // 录制时长
 public typealias  RecorderProgross = (_ time: Float64) -> Void
 public typealias  RecorderProgross = (_ time: Float64) -> Void
 
 

+ 38 - 37
BFCommonKit/Classes/BFUtility/NXDeviceManager.swift

@@ -9,65 +9,66 @@
 import UIKit
 import UIKit
 
 
 class NXDeviceManager: NSObject {
 class NXDeviceManager: NSObject {
-    
     class func info() -> [String] {
     class func info() -> [String] {
         var data: [String] = []
         var data: [String] = []
-        
+
         data.append("Device Name: \(deviceNameAlias())")
         data.append("Device Name: \(deviceNameAlias())")
         if let bundleId = Bundle.main.bundleIdentifier {
         if let bundleId = Bundle.main.bundleIdentifier {
             data.append("Bundle Identifier: \(bundleId)")
             data.append("Bundle Identifier: \(bundleId)")
         }
         }
-        
+
         if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String,
         if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String,
-            let buildNumber = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
-            data.append( "Host App Version: \(version).\(buildNumber)" )
+           let buildNumber = Bundle.main.infoDictionary?["CFBundleVersion"] as? String
+        {
+            data.append("Host App Version: \(version).\(buildNumber)")
         }
         }
-        
+
         if let venderId = UIDevice.current.identifierForVendor {
         if let venderId = UIDevice.current.identifierForVendor {
-            data.append( "Identifier For Vendor: \(venderId)" )
+            data.append("Identifier For Vendor: \(venderId)")
         }
         }
-        
+
         data.append("System Version: \(getSystemVersion())")
         data.append("System Version: \(getSystemVersion())")
         data.append("Model: \(platformModelString())")
         data.append("Model: \(platformModelString())")
-        
+
 //        data.append("Total Disk Space(MB): \(UIDevice.totalDiskSpaceInMB)")
 //        data.append("Total Disk Space(MB): \(UIDevice.totalDiskSpaceInMB)")
 //        data.append("Free Disk Space(MB): \(UIDevice.freeDiskSpaceInMB)")
 //        data.append("Free Disk Space(MB): \(UIDevice.freeDiskSpaceInMB)")
-        
+
         let lastRestarted = Date(timeIntervalSince1970: TimeInterval(Date().timeIntervalSince1970 - Double(uptime())))
         let lastRestarted = Date(timeIntervalSince1970: TimeInterval(Date().timeIntervalSince1970 - Double(uptime())))
         data.append("Uptime: \(uptime())/\(lastRestarted)")
         data.append("Uptime: \(uptime())/\(lastRestarted)")
-        
+
         return data
         return data
     }
     }
-    
-    class var isIpad:Bool {
+
+    class var isIpad: Bool {
         if #available(iOS 8.0, *) {
         if #available(iOS 8.0, *) {
             return UIScreen.main.traitCollection.userInterfaceIdiom == .pad
             return UIScreen.main.traitCollection.userInterfaceIdiom == .pad
         } else {
         } else {
             return UIDevice.current.userInterfaceIdiom == .pad
             return UIDevice.current.userInterfaceIdiom == .pad
         }
         }
     }
     }
-    class var isIphone:Bool {
+
+    class var isIphone: Bool {
         if #available(iOS 8.0, *) {
         if #available(iOS 8.0, *) {
             return UIScreen.main.traitCollection.userInterfaceIdiom == .phone
             return UIScreen.main.traitCollection.userInterfaceIdiom == .phone
         } else {
         } else {
             return UIDevice.current.userInterfaceIdiom == .phone
             return UIDevice.current.userInterfaceIdiom == .phone
         }
         }
     }
     }
-    
-    ///Name of the devices, like Baudins's Iphone
+
+    /// Name of the devices, like Baudins's Iphone
     class func deviceNameAlias() -> String {
     class func deviceNameAlias() -> String {
-        return  UIDevice.current.name
+        return UIDevice.current.name
     }
     }
-    
+
     class func processorCount() -> Int {
     class func processorCount() -> Int {
         return ProcessInfo.processInfo.activeProcessorCount
         return ProcessInfo.processInfo.activeProcessorCount
     }
     }
-    
-    //Verion of the OS, like 9.0.1
-    class func osVersion()-> String {
-        return UIDevice.current.systemVersion;
+
+    // Verion of the OS, like 9.0.1
+    class func osVersion() -> String {
+        return UIDevice.current.systemVersion
     }
     }
-    
+
     class func platformModelString() -> String {
     class func platformModelString() -> String {
         if let key = "hw.machine".cString(using: String.Encoding.utf8) {
         if let key = "hw.machine".cString(using: String.Encoding.utf8) {
             var size: Int = 0
             var size: Int = 0
@@ -78,35 +79,35 @@ class NXDeviceManager: NSObject {
         }
         }
         return "Unknown"
         return "Unknown"
     }
     }
-    
+
     /** uptime in seconds **/
     /** uptime in seconds **/
-    class func uptime()  -> Int {
+    class func uptime() -> Int {
         var currentTime = time_t()
         var currentTime = time_t()
-        var bootTime    = timeval()
-        var mib         = [CTL_KERN, KERN_BOOTTIME]
-        
+        var bootTime = timeval()
+        var mib = [CTL_KERN, KERN_BOOTTIME]
+
         var size = MemoryLayout<timeval>.stride
         var size = MemoryLayout<timeval>.stride
-        
-        if sysctl(&mib, u_int(mib.count), &bootTime, &size, nil, 0) != -1 && bootTime.tv_sec != 0 {
+
+        if sysctl(&mib, u_int(mib.count), &bootTime, &size, nil, 0) != -1, bootTime.tv_sec != 0 {
             time(&currentTime)
             time(&currentTime)
-            
-            if (currentTime < bootTime.tv_sec) {
+
+            if currentTime < bootTime.tv_sec {
                 return 0
                 return 0
             }
             }
-            
-            return  currentTime - bootTime.tv_sec
+
+            return currentTime - bootTime.tv_sec
         }
         }
         return 0
         return 0
     }
     }
-    
+
     class func getScreenBrightness() -> CGFloat {
     class func getScreenBrightness() -> CGFloat {
         return UIScreen.main.brightness
         return UIScreen.main.brightness
     }
     }
-    
+
     class func getPhysicalMemory() -> UInt64 {
     class func getPhysicalMemory() -> UInt64 {
         return ProcessInfo.processInfo.physicalMemory
         return ProcessInfo.processInfo.physicalMemory
     }
     }
-    
+
     class func getSystemVersion() -> String {
     class func getSystemVersion() -> String {
         return UIDevice.current.systemVersion
         return UIDevice.current.systemVersion
     }
     }

+ 22 - 24
BFCommonKit/Classes/BFUtility/NXFileManager.swift

@@ -7,37 +7,35 @@
 //
 //
 /*
 /*
 
 
-本类功能, 文件操作.(ios, mac)
+ 本类功能, 文件操作.(ios, mac)
 
 
-一,iOS目录结构说明
-1,沙盒目录结构
-├── Documents - 存储用户数据或其它应该定期备份的
-├── Library
-│   ├── Caches -
-用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息
-│   │   └── Snapshots
-│   │       └── com.youyouxingyuan.re
-│   │           ├── A85B73F0-26A8-44E4-A761-446CAB8DAB38@2x.png
-│   │           └── BFAD5885-B767-4320-9A4B-555EC881C50D@2x.png
-│   └── Preferences - 偏好设置文件 NSUserDefaults 保存的数据
-└── tmp - 这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息
+ 一,iOS目录结构说明
+ 1,沙盒目录结构
+ ├── Documents - 存储用户数据或其它应该定期备份的
+ ├── Library
+ │   ├── Caches -
+ 用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息
+ │   │   └── Snapshots
+ │   │       └── com.youyouxingyuan.re
+ │   │           ├── A85B73F0-26A8-44E4-A761-446CAB8DAB38@2x.png
+ │   │           └── BFAD5885-B767-4320-9A4B-555EC881C50D@2x.png
+ │   └── Preferences - 偏好设置文件 NSUserDefaults 保存的数据
+ └── tmp - 这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息
 
 
-2,在iOS8之后,应用每一次重启,沙盒路径都动态的发生了变化但不用担心数据问题,苹果会把你上一个路径中的数据转移到你新的路径中。你上一个路径也会被苹果毫无保留的删除,只保留最新的路径。
+ 2,在iOS8之后,应用每一次重启,沙盒路径都动态的发生了变化但不用担心数据问题,苹果会把你上一个路径中的数据转移到你新的路径中。你上一个路径也会被苹果毫无保留的删除,只保留最新的路径。
 
 
-@see  <Foundation/NSPathUtilities.h>
+ @see  <Foundation/NSPathUtilities.h>
 
 
-*/
+ */
 import UIKit
 import UIKit
 
 
 class NXFileManager: NSObject {
 class NXFileManager: NSObject {
-    
     static var documentDirectoryURL: URL {
     static var documentDirectoryURL: URL {
-      return try! FileManager.default.url(
-        for: .documentDirectory,
-        in: .userDomainMask,
-        appropriateFor: nil,
-        create: false
-      )
+        return try! FileManager.default.url(
+            for: .documentDirectory,
+            in: .userDomainMask,
+            appropriateFor: nil,
+            create: false
+        )
     }
     }
-
 }
 }

+ 8 - 8
BFCommonKit/Classes/BFUtility/PQBFConfig.swift

@@ -62,14 +62,14 @@ public class PQBFConfig: NSObject {
     // bugly账号 快乐星球:b7411e0d-f214-433c-9343-366b9ca99a53
     // bugly账号 快乐星球:b7411e0d-f214-433c-9343-366b9ca99a53
     // 闪音:6c481442-aeb4-49ec-a2ae-21359bfef44a
     // 闪音:6c481442-aeb4-49ec-a2ae-21359bfef44a
     public var buglyAppkey: String = "6c481442-aeb4-49ec-a2ae-21359bfef44a"
     public var buglyAppkey: String = "6c481442-aeb4-49ec-a2ae-21359bfef44a"
-    
-    //add by ak 公用参数使用
-    public var appType:String = "15"
-    //苹果后台创建的 APPID
-    public var appId:String = "1570572849"
-    
-    //是否可打印 LOG
-    public var enableBFLog:Bool = false
+
+    // add by ak 公用参数使用
+    public var appType: String = "15"
+    // 苹果后台创建的 APPID
+    public var appId: String = "1570572849"
+
+    // 是否可打印 LOG
+    public var enableBFLog: Bool = false
 
 
     override private init() {
     override private init() {
         super.init()
         super.init()

+ 22 - 26
BFCommonKit/Classes/BFUtility/PQCreateEmptyWAV.swift

@@ -44,7 +44,7 @@ public class PQCreateEmptyWAV {
         BFLog(message: "mSampleRate is\(mSampleRate) mChannel is \(mChannel) mduration is:\(mduration) mbit is \(mbit)")
         BFLog(message: "mSampleRate is\(mSampleRate) mChannel is \(mChannel) mduration is:\(mduration) mbit is \(mbit)")
     }
     }
 
 
-    public  func createEmptyWAVFile(url: URL, completeHander: @escaping (_ fileURL: URL?) -> Void) {
+    public func createEmptyWAVFile(url: URL, completeHander: @escaping (_ fileURL: URL?) -> Void) {
         DispatchQueue.global().async {
         DispatchQueue.global().async {
             // 数字音频文件大小(Byte) = 采样频率(Hz)× 采样时长(S)×(采样位数 / 8)× 声道数(单声道为1,立体声为2)
             // 数字音频文件大小(Byte) = 采样频率(Hz)× 采样时长(S)×(采样位数 / 8)× 声道数(单声道为1,立体声为2)
 //        BFLog(message: "createEmptyWAVFile 1")
 //        BFLog(message: "createEmptyWAVFile 1")
@@ -69,37 +69,33 @@ public class PQCreateEmptyWAV {
             }
             }
         }
         }
     }
     }
-    
-    public  func createEmptyWAVFile(url: URL) {
- 
-            // 数字音频文件大小(Byte) = 采样频率(Hz)× 采样时长(S)×(采样位数 / 8)× 声道数(单声道为1,立体声为2)
+
+    public func createEmptyWAVFile(url: URL) {
+        // 数字音频文件大小(Byte) = 采样频率(Hz)× 采样时长(S)×(采样位数 / 8)× 声道数(单声道为1,立体声为2)
 //        BFLog(message: "createEmptyWAVFile 1")
 //        BFLog(message: "createEmptyWAVFile 1")
-            let size = Int64(self.mSampleRate * self.mduration * (self.mbit / 8) * self.mChannel)
+        let size = Int64(mSampleRate * mduration * (mbit / 8) * mChannel)
 
 
-            let bufer = Array(repeating: 0, count: Int(size))
+        let bufer = Array(repeating: 0, count: Int(size))
 //        BFLog(message: "createEmptyWAVFile 2 \(size)")
 //        BFLog(message: "createEmptyWAVFile 2 \(size)")
-            let data = Data(bytes: bufer, count: Int(size))
-            let totalAudioLen = size
-            let totalDataLen = totalAudioLen + 44
+        let data = Data(bytes: bufer, count: Int(size))
+        let totalAudioLen = size
+        let totalDataLen = totalAudioLen + 44
 //        BFLog(message: "createEmptyWAVFile 3")
 //        BFLog(message: "createEmptyWAVFile 3")
-            self.writewaveFileHeader(output: url,
-                                     totalAudioLen: totalAudioLen,
-                                     totalDataLen: totalDataLen,
-                                     longSampleRate: Int64(self.mSampleRate),
-                                     channels: Int(self.mChannel),
-                                     byteRate: size,
-                                     audioData: data)
-
-        
+        writewaveFileHeader(output: url,
+                            totalAudioLen: totalAudioLen,
+                            totalDataLen: totalDataLen,
+                            longSampleRate: Int64(mSampleRate),
+                            channels: Int(mChannel),
+                            byteRate: size,
+                            audioData: data)
     }
     }
 
 
-
-    public  func writewaveFileHeader(output: URL, totalAudioLen: Int64,
-                             totalDataLen: Int64,
-                             longSampleRate: Int64,
-                             channels: Int,
-                             byteRate: Int64,
-                             audioData: Data)
+    public func writewaveFileHeader(output: URL, totalAudioLen: Int64,
+                                    totalDataLen: Int64,
+                                    longSampleRate: Int64,
+                                    channels: Int,
+                                    byteRate: Int64,
+                                    audioData: Data)
     {
     {
         BFLog(message: "createEmptyWAVFile 4")
         BFLog(message: "createEmptyWAVFile 4")
         var header: [UInt8] = Array(repeating: 0, count: 44)
         var header: [UInt8] = Array(repeating: 0, count: 44)

+ 12 - 12
BFCommonKit/Classes/BFUtility/PQLZStringUtil.swift

@@ -80,7 +80,7 @@ public func compressToUInt8Array(input: String) -> [UInt8] {
     let compressed: Data = compress(input: input)
     let compressed: Data = compress(input: input)
     var buffer = [UInt8](repeating: 0, count: compressed.count)
     var buffer = [UInt8](repeating: 0, count: compressed.count)
 
 
-    for i in 0..<(compressed.count / 2) {
+    for i in 0 ..< (compressed.count / 2) {
         buffer[i * 2] = compressed[i * 2 + 1]
         buffer[i * 2] = compressed[i * 2 + 1]
         buffer[i * 2 + 1] = compressed[i * 2]
         buffer[i * 2 + 1] = compressed[i * 2]
     }
     }
@@ -166,7 +166,7 @@ private func _compress<T: RangeReplaceableCollection>(input: String, bitPerChar:
         } else {
         } else {
             if context.dictCreate.index(forKey: w) != nil {
             if context.dictCreate.index(forKey: w) != nil {
                 if let scalar = w.unicodeScalars.first, scalar.value < 256 {
                 if let scalar = w.unicodeScalars.first, scalar.value < 256 {
-                    for _ in 0..<numBits {
+                    for _ in 0 ..< numBits {
                         context.val <<= 1
                         context.val <<= 1
 
 
                         if context.position == bitPerChar - 1 {
                         if context.position == bitPerChar - 1 {
@@ -180,7 +180,7 @@ private func _compress<T: RangeReplaceableCollection>(input: String, bitPerChar:
 
 
                     value = Int(w.unicodeScalars.first!.value)
                     value = Int(w.unicodeScalars.first!.value)
 
 
-                    for _ in 0..<8 {
+                    for _ in 0 ..< 8 {
                         context.val = (context.val << 1) | (value & 1)
                         context.val = (context.val << 1) | (value & 1)
 
 
                         if context.position == bitPerChar - 1 {
                         if context.position == bitPerChar - 1 {
@@ -196,7 +196,7 @@ private func _compress<T: RangeReplaceableCollection>(input: String, bitPerChar:
                 } else {
                 } else {
                     value = 1
                     value = 1
 
 
-                    for _ in 0..<numBits {
+                    for _ in 0 ..< numBits {
                         context.val = (context.val << 1) | value
                         context.val = (context.val << 1) | value
 
 
                         if context.position == bitPerChar - 1 {
                         if context.position == bitPerChar - 1 {
@@ -211,7 +211,7 @@ private func _compress<T: RangeReplaceableCollection>(input: String, bitPerChar:
 
 
                     value = Int(w.unicodeScalars.first!.value)
                     value = Int(w.unicodeScalars.first!.value)
 
 
-                    for _ in 0..<16 {
+                    for _ in 0 ..< 16 {
                         context.val = (context.val << 1) | (value & 1)
                         context.val = (context.val << 1) | (value & 1)
 
 
                         if context.position == bitPerChar - 1 {
                         if context.position == bitPerChar - 1 {
@@ -237,7 +237,7 @@ private func _compress<T: RangeReplaceableCollection>(input: String, bitPerChar:
             } else {
             } else {
                 value = context.dict[w]!
                 value = context.dict[w]!
 
 
-                for _ in 0..<numBits {
+                for _ in 0 ..< numBits {
                     context.val = (context.val << 1) | (value & 1)
                     context.val = (context.val << 1) | (value & 1)
 
 
                     if context.position == bitPerChar - 1 {
                     if context.position == bitPerChar - 1 {
@@ -266,7 +266,7 @@ private func _compress<T: RangeReplaceableCollection>(input: String, bitPerChar:
     if w != "" {
     if w != "" {
         if context.dictCreate.index(forKey: w) != nil {
         if context.dictCreate.index(forKey: w) != nil {
             if let scalar = w.unicodeScalars.first, scalar.value < 256 {
             if let scalar = w.unicodeScalars.first, scalar.value < 256 {
-                for _ in 0..<numBits {
+                for _ in 0 ..< numBits {
                     context.val <<= 1
                     context.val <<= 1
 
 
                     if context.position == bitPerChar - 1 {
                     if context.position == bitPerChar - 1 {
@@ -280,7 +280,7 @@ private func _compress<T: RangeReplaceableCollection>(input: String, bitPerChar:
 
 
                 value = Int(w.unicodeScalars.first!.value)
                 value = Int(w.unicodeScalars.first!.value)
 
 
-                for _ in 0..<8 {
+                for _ in 0 ..< 8 {
                     context.val = (context.val << 1) | (value & 1)
                     context.val = (context.val << 1) | (value & 1)
 
 
                     if context.position == bitPerChar - 1 {
                     if context.position == bitPerChar - 1 {
@@ -296,7 +296,7 @@ private func _compress<T: RangeReplaceableCollection>(input: String, bitPerChar:
             } else {
             } else {
                 value = 1
                 value = 1
 
 
-                for _ in 0..<numBits {
+                for _ in 0 ..< numBits {
                     context.val = (context.val << 1) | value
                     context.val = (context.val << 1) | value
 
 
                     if context.position == bitPerChar - 1 {
                     if context.position == bitPerChar - 1 {
@@ -312,7 +312,7 @@ private func _compress<T: RangeReplaceableCollection>(input: String, bitPerChar:
 
 
                 value = Int(w.unicodeScalars.first!.value)
                 value = Int(w.unicodeScalars.first!.value)
 
 
-                for _ in 0..<16 {
+                for _ in 0 ..< 16 {
                     context.val = (context.val << 1) | (value & 1)
                     context.val = (context.val << 1) | (value & 1)
 
 
                     if context.position == bitPerChar - 1 {
                     if context.position == bitPerChar - 1 {
@@ -338,7 +338,7 @@ private func _compress<T: RangeReplaceableCollection>(input: String, bitPerChar:
         } else {
         } else {
             value = context.dict[w]!
             value = context.dict[w]!
 
 
-            for _ in 0..<numBits {
+            for _ in 0 ..< numBits {
                 context.val = (context.val << 1) | (value & 1)
                 context.val = (context.val << 1) | (value & 1)
 
 
                 if context.position == bitPerChar - 1 {
                 if context.position == bitPerChar - 1 {
@@ -362,7 +362,7 @@ private func _compress<T: RangeReplaceableCollection>(input: String, bitPerChar:
     }
     }
     value = 2
     value = 2
 
 
-    for _ in 0..<numBits {
+    for _ in 0 ..< numBits {
         context.val = (context.val << 1) | (value & 1)
         context.val = (context.val << 1) | (value & 1)
 
 
         if context.position == bitPerChar - 1 {
         if context.position == bitPerChar - 1 {

+ 2 - 2
BFCommonKit/Classes/BFUtility/PQPHAssetVideoParaseUtil.swift

@@ -125,7 +125,7 @@ open class PQPHAssetVideoParaseUtil: NSObject {
                     }
                     }
                 } else {
                 } else {
 //                    let tempExportSession = PQSingletoMemoryUtil.shared.allExportSession[phAsset]
 //                    let tempExportSession = PQSingletoMemoryUtil.shared.allExportSession[phAsset]
-                    let tempExportSession : AVAssetExportSession? = nil
+                    let tempExportSession: AVAssetExportSession? = nil
                     if tempExportSession != nil {
                     if tempExportSession != nil {
                         BFLog(message: "导出相册视频-正在导出")
                         BFLog(message: "导出相册视频-正在导出")
                         return
                         return
@@ -300,7 +300,7 @@ open class PQPHAssetVideoParaseUtil: NSObject {
                     }
                     }
                 } else {
                 } else {
 //                    let tempExportSession = PQSingletoMemoryUtil.shared.allExportSession[phAsset]
 //                    let tempExportSession = PQSingletoMemoryUtil.shared.allExportSession[phAsset]
-                    let tempExportSession : AVAssetExportSession? = nil
+                    let tempExportSession: AVAssetExportSession? = nil
                     if tempExportSession != nil {
                     if tempExportSession != nil {
                         BFLog(message: "导出相册视频-正在导出")
                         BFLog(message: "导出相册视频-正在导出")
                         return
                         return

+ 7 - 7
BFCommonKit/Classes/BFUtility/PQWeakTimer.swift

@@ -9,14 +9,14 @@
 import Foundation
 import Foundation
 
 
 public class PQWeakTimer {
 public class PQWeakTimer {
-     public weak var timer: Timer?
+    public weak var timer: Timer?
     public weak var target: AnyObject?
     public weak var target: AnyObject?
     public let action: (Timer) -> Void
     public let action: (Timer) -> Void
 
 
     public init(timeInterval: TimeInterval,
     public init(timeInterval: TimeInterval,
-                 target: AnyObject,
-                 repeats: Bool,
-                 action: @escaping (Timer) -> Void)
+                target: AnyObject,
+                repeats: Bool,
+                action: @escaping (Timer) -> Void)
     {
     {
         self.target = target
         self.target = target
         self.action = action
         self.action = action
@@ -28,9 +28,9 @@ public class PQWeakTimer {
     }
     }
 
 
     public class func scheduledTimer(timeInterval: TimeInterval,
     public class func scheduledTimer(timeInterval: TimeInterval,
-                              target: AnyObject,
-                              repeats: Bool,
-                              action: @escaping (Timer) -> Void) -> Timer
+                                     target: AnyObject,
+                                     repeats: Bool,
+                                     action: @escaping (Timer) -> Void) -> Timer
     {
     {
         return PQWeakTimer(timeInterval: timeInterval,
         return PQWeakTimer(timeInterval: timeInterval,
                            target: target,
                            target: target,

+ 0 - 11
BFCommonKit/Classes/Enums/Enums.swift

@@ -481,17 +481,6 @@ public  enum  REFRESH_TYPE {
     case REFRESH_TYPE_FOOTER // 尾部
     case REFRESH_TYPE_FOOTER // 尾部
 }
 }
 
 
-// MARK: - 刷新控件类型
-
-/// 刷新控件类型
-public  enum  moveDirection {
-    case moveDirectionNormal
-    case moveDirectionUp
-    case moveDirectionDown
-    case moveDirectionRight
-    case moveDirectionLeft
-}
-
 // MARK: - 关注跟粉丝cell类型
 // MARK: - 关注跟粉丝cell类型
 
 
 /// 关注跟粉丝cell类型
 /// 关注跟粉丝cell类型

+ 130 - 239
Example/Pods/Pods.xcodeproj/project.pbxproj

@@ -59,7 +59,6 @@
 		19D9F6E37DA18401FF665945966BB646 /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = 42E41F6780C59A8F1A44BDA7E2F46D68 /* dsp.h */; settings = {ATTRIBUTES = (Project, ); }; };
 		19D9F6E37DA18401FF665945966BB646 /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = 42E41F6780C59A8F1A44BDA7E2F46D68 /* dsp.h */; settings = {ATTRIBUTES = (Project, ); }; };
 		1A6947C2C98831BC28C5E7E5F4E82D69 /* quant_levels_utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 2680E31C2E7FF2DB2C2D3C5B9F5B22BC /* quant_levels_utils.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		1A6947C2C98831BC28C5E7E5F4E82D69 /* quant_levels_utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 2680E31C2E7FF2DB2C2D3C5B9F5B22BC /* quant_levels_utils.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		1A7BC1B4C9ACAC90050D54571B6736FC /* cost_enc.c in Sources */ = {isa = PBXBuildFile; fileRef = 1ED6D92DF5356851F1B7908C452438ED /* cost_enc.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		1A7BC1B4C9ACAC90050D54571B6736FC /* cost_enc.c in Sources */ = {isa = PBXBuildFile; fileRef = 1ED6D92DF5356851F1B7908C452438ED /* cost_enc.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
-		1A9D1629BCDA0862744DAB9F95ABD8E5 /* NXTextBubbleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11F937E8952C944CCCB14D50DB3B35F5 /* NXTextBubbleView.swift */; };
 		1BF786F3C0FE995E4ABEE77BCF1BF89C /* ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4C49D847BF184B044133313179DB232 /* ImageCache.swift */; };
 		1BF786F3C0FE995E4ABEE77BCF1BF89C /* ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4C49D847BF184B044133313179DB232 /* ImageCache.swift */; };
 		1C1B7859AE52B7CBFBD3B12345EBBB58 /* enc_msa.c in Sources */ = {isa = PBXBuildFile; fileRef = E2477CC7B73CE0B0E8933AC99223A969 /* enc_msa.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		1C1B7859AE52B7CBFBD3B12345EBBB58 /* enc_msa.c in Sources */ = {isa = PBXBuildFile; fileRef = E2477CC7B73CE0B0E8933AC99223A969 /* enc_msa.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		1C38329B1957F3AF378F375D684822DD /* KFImageOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D153FB259F12854F7216D0507277B2DA /* KFImageOptions.swift */; };
 		1C38329B1957F3AF378F375D684822DD /* KFImageOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D153FB259F12854F7216D0507277B2DA /* KFImageOptions.swift */; };
@@ -71,7 +70,6 @@
 		1FBC511F62AC6D7D461A9F06EE981444 /* GraphicsContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15AB133A9FA3B7013CF0FFCF18DCF3D8 /* GraphicsContext.swift */; };
 		1FBC511F62AC6D7D461A9F06EE981444 /* GraphicsContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15AB133A9FA3B7013CF0FFCF18DCF3D8 /* GraphicsContext.swift */; };
 		1FE8A9453D82CD25FA0E35508A8BD06C /* NXAudioRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC5D506215B08B2EBD79B4D3C6399ABD /* NXAudioRecorder.swift */; };
 		1FE8A9453D82CD25FA0E35508A8BD06C /* NXAudioRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC5D506215B08B2EBD79B4D3C6399ABD /* NXAudioRecorder.swift */; };
 		1FFD3E843984FD9A6E6176DF98B945B3 /* Pods-BFCommonKit_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AF60EEAC121090B9A2331C9DD25A01BA /* Pods-BFCommonKit_Tests-dummy.m */; };
 		1FFD3E843984FD9A6E6176DF98B945B3 /* Pods-BFCommonKit_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AF60EEAC121090B9A2331C9DD25A01BA /* Pods-BFCommonKit_Tests-dummy.m */; };
-		2092A92DA091FCA5B274BB4F3E96FD0C /* NXVoiceBubbleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23688D65051D3AD94F11994EA69F4F64 /* NXVoiceBubbleView.swift */; };
 		20ADE1F287D84EC53F0E75A610B262A2 /* filters_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = EEE37BB9DD08FBF55E620F47A8255EEC /* filters_sse2.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		20ADE1F287D84EC53F0E75A610B262A2 /* filters_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = EEE37BB9DD08FBF55E620F47A8255EEC /* filters_sse2.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		20B01BD33C33216C4391B269684D9F7A /* RetryStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74E8A4DCA27DDAE1CA83DBEE753FD0B7 /* RetryStrategy.swift */; };
 		20B01BD33C33216C4391B269684D9F7A /* RetryStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74E8A4DCA27DDAE1CA83DBEE753FD0B7 /* RetryStrategy.swift */; };
 		20F98512F0058B2ACC60BC7D73643D11 /* PQCommonMethodUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3AB7E15C2F06A2FA4E7B0E18076C65B /* PQCommonMethodUtil.swift */; };
 		20F98512F0058B2ACC60BC7D73643D11 /* PQCommonMethodUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3AB7E15C2F06A2FA4E7B0E18076C65B /* PQCommonMethodUtil.swift */; };
@@ -111,7 +109,6 @@
 		3D5E1B45800FE11A5152C1C93873F8BE /* quant_levels_dec_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 8419D5E0586551DFFA79FF3C32FB4C00 /* quant_levels_dec_utils.h */; settings = {ATTRIBUTES = (Project, ); }; };
 		3D5E1B45800FE11A5152C1C93873F8BE /* quant_levels_dec_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 8419D5E0586551DFFA79FF3C32FB4C00 /* quant_levels_dec_utils.h */; settings = {ATTRIBUTES = (Project, ); }; };
 		3E2FFDF28DF331B259693E083C90CCEE /* common_dec.h in Headers */ = {isa = PBXBuildFile; fileRef = 806716CEC3415304E47A0519426A38CA /* common_dec.h */; settings = {ATTRIBUTES = (Project, ); }; };
 		3E2FFDF28DF331B259693E083C90CCEE /* common_dec.h in Headers */ = {isa = PBXBuildFile; fileRef = 806716CEC3415304E47A0519426A38CA /* common_dec.h */; settings = {ATTRIBUTES = (Project, ); }; };
 		3EDACE04E29354AD4CAE1A28B61F0BE1 /* thread_utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 0708E7C5C61D83333F44152EC5A7445E /* thread_utils.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		3EDACE04E29354AD4CAE1A28B61F0BE1 /* thread_utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 0708E7C5C61D83333F44152EC5A7445E /* thread_utils.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
-		3FC3F0A9DB00D96ACB68A73329E64EA3 /* NXBadgeControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 051ED88A0299670B6BBB492D93929591 /* NXBadgeControl.swift */; };
 		403D1BFC2AA127B00C76FED0058628E1 /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = D7D4895EEADC4BA2478B28E8C9A6D65C /* enc.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		403D1BFC2AA127B00C76FED0058628E1 /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = D7D4895EEADC4BA2478B28E8C9A6D65C /* enc.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		40ED9B99B6A94021E982D7FBC9AF5F3A /* utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E297CF7E30C6CAB7E5D7AD2BDF3C0AB /* utils.h */; settings = {ATTRIBUTES = (Project, ); }; };
 		40ED9B99B6A94021E982D7FBC9AF5F3A /* utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E297CF7E30C6CAB7E5D7AD2BDF3C0AB /* utils.h */; settings = {ATTRIBUTES = (Project, ); }; };
 		41DD5E04919461676D7DA3F5EEFD4E87 /* ConstraintMakerFinalizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ABEFF330D5A5B7D2E87BE2014407255 /* ConstraintMakerFinalizable.swift */; };
 		41DD5E04919461676D7DA3F5EEFD4E87 /* ConstraintMakerFinalizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ABEFF330D5A5B7D2E87BE2014407255 /* ConstraintMakerFinalizable.swift */; };
@@ -183,7 +180,6 @@
 		7133D4F8A593FB09FE4293CAAE65AABF /* Constraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD7F430AF6E6AE6E683DB514632A78E9 /* Constraint.swift */; };
 		7133D4F8A593FB09FE4293CAAE65AABF /* Constraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD7F430AF6E6AE6E683DB514632A78E9 /* Constraint.swift */; };
 		717E099454EDAA6C615F87B4F9D9164B /* ImageView+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33FAA752A21F9E98DE7E0080739CE4E7 /* ImageView+Kingfisher.swift */; };
 		717E099454EDAA6C615F87B4F9D9164B /* ImageView+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33FAA752A21F9E98DE7E0080739CE4E7 /* ImageView+Kingfisher.swift */; };
 		71B02F085A1E41524BF5561D8D781DAA /* rescaler_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 7AB78267AE3899B4F6D416A2D1EE7DE8 /* rescaler_mips_dsp_r2.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		71B02F085A1E41524BF5561D8D781DAA /* rescaler_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 7AB78267AE3899B4F6D416A2D1EE7DE8 /* rescaler_mips_dsp_r2.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
-		71BB5F71CA8689837837CB185670DD6C /* NXContainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8052B6036E8C91AEA308258D0EF5C23B /* NXContainView.swift */; };
 		71EE9E05B721C86BB49542329BFAFD8D /* KingfisherWebP-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E3CE89AAFB31A01CE13EF06ACA01B612 /* KingfisherWebP-dummy.m */; };
 		71EE9E05B721C86BB49542329BFAFD8D /* KingfisherWebP-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E3CE89AAFB31A01CE13EF06ACA01B612 /* KingfisherWebP-dummy.m */; };
 		727C1B9111C2CEBBF7F7A3810835A524 /* ImageBinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27CE6DF20703451AB50E3457D02290E7 /* ImageBinder.swift */; };
 		727C1B9111C2CEBBF7F7A3810835A524 /* ImageBinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27CE6DF20703451AB50E3457D02290E7 /* ImageBinder.swift */; };
 		7334B8E2C03CFA8429A7A43AE3515572 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 10572D1D443ADA18EC63378E8D20D590 /* Foundation.framework */; };
 		7334B8E2C03CFA8429A7A43AE3515572 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 10572D1D443ADA18EC63378E8D20D590 /* Foundation.framework */; };
@@ -198,7 +194,6 @@
 		78FDB3AD88681D4EA89AB94C1B7C6637 /* ConstraintDirectionalInsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63895B27546447ABF75572504C028CC2 /* ConstraintDirectionalInsetTarget.swift */; };
 		78FDB3AD88681D4EA89AB94C1B7C6637 /* ConstraintDirectionalInsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63895B27546447ABF75572504C028CC2 /* ConstraintDirectionalInsetTarget.swift */; };
 		7A778AE49A67263F589B3612055D9834 /* backward_references_cost_enc.c in Sources */ = {isa = PBXBuildFile; fileRef = 98EB380805F78E3D8C1D8F53DEF7FB83 /* backward_references_cost_enc.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		7A778AE49A67263F589B3612055D9834 /* backward_references_cost_enc.c in Sources */ = {isa = PBXBuildFile; fileRef = 98EB380805F78E3D8C1D8F53DEF7FB83 /* backward_references_cost_enc.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		7B439BB7DB891A7424A9ECD0B6BA0742 /* Runtime.swift in Sources */ = {isa = PBXBuildFile; fileRef = C93CDB72FC6371BFDE1B87251C1BB50A /* Runtime.swift */; };
 		7B439BB7DB891A7424A9ECD0B6BA0742 /* Runtime.swift in Sources */ = {isa = PBXBuildFile; fileRef = C93CDB72FC6371BFDE1B87251C1BB50A /* Runtime.swift */; };
-		7C650D6C1F74F50E55F263A3E49BA7A5 /* UIView+NXBadgeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6AB6C0495BDF68D307038D91D9617B4 /* UIView+NXBadgeView.swift */; };
 		7CAC58FCF511B0B51A62BDF150BABB79 /* NXUI+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5EC78DE0E5C7125DDB0C2F91A34363 /* NXUI+Ext.swift */; };
 		7CAC58FCF511B0B51A62BDF150BABB79 /* NXUI+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5EC78DE0E5C7125DDB0C2F91A34363 /* NXUI+Ext.swift */; };
 		7CB13A2AE68055A42D9E019A45B51DE8 /* BFCommonKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C56358C6AB7957C81EB828E97CCA763 /* BFCommonKit-dummy.m */; };
 		7CB13A2AE68055A42D9E019A45B51DE8 /* BFCommonKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C56358C6AB7957C81EB828E97CCA763 /* BFCommonKit-dummy.m */; };
 		7CBD1429F2B83CB5BE59148D691535A3 /* libwebp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C286279CF4DC3493E811FEC95762F0CF /* libwebp.framework */; };
 		7CBD1429F2B83CB5BE59148D691535A3 /* libwebp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C286279CF4DC3493E811FEC95762F0CF /* libwebp.framework */; };
@@ -220,7 +215,6 @@
 		8B188CEEAA93DFBC6DB27DD99CDAD4F4 /* KeychainAccess.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB86938CB2E3635C7F8C1152A2D0BB6E /* KeychainAccess.framework */; };
 		8B188CEEAA93DFBC6DB27DD99CDAD4F4 /* KeychainAccess.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB86938CB2E3635C7F8C1152A2D0BB6E /* KeychainAccess.framework */; };
 		8B3EE0B40DACBE706E0AD2B460594A0B /* lossless_enc_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 3A75FBF18385E3F459DA7CFF1FF4EB46 /* lossless_enc_mips_dsp_r2.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		8B3EE0B40DACBE706E0AD2B460594A0B /* lossless_enc_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 3A75FBF18385E3F459DA7CFF1FF4EB46 /* lossless_enc_mips_dsp_r2.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		8CBD7DC2908904A1262CD9EDFE6F97E6 /* NXLoggerVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E1234C3040AAA5AFB62B03F41417FC0 /* NXLoggerVC.swift */; };
 		8CBD7DC2908904A1262CD9EDFE6F97E6 /* NXLoggerVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E1234C3040AAA5AFB62B03F41417FC0 /* NXLoggerVC.swift */; };
-		8CD2B07E027F7523BCC45BD6345A9DDA /* UIBarButtonItem+NXBadgeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D46E3281B6DFCFF07173A3FE2A0CC22 /* UIBarButtonItem+NXBadgeView.swift */; };
 		8D44EB23ED1B9ACDD541FAD4840AC4A0 /* BFInt+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA0FC5C24A0AF3D6C9FA0BADEE3A89FC /* BFInt+Ext.swift */; };
 		8D44EB23ED1B9ACDD541FAD4840AC4A0 /* BFInt+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA0FC5C24A0AF3D6C9FA0BADEE3A89FC /* BFInt+Ext.swift */; };
 		8DFF1C4FAC546BAD8748F4B9305D8A8C /* yuv_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E6F7D5AAA20628D905389942B3B1714 /* yuv_mips_dsp_r2.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		8DFF1C4FAC546BAD8748F4B9305D8A8C /* yuv_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E6F7D5AAA20628D905389942B3B1714 /* yuv_mips_dsp_r2.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		8F608164DBD02D50164121131C44D55E /* lossless_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = E0C8B9547808EB8A5A896902763ED1CE /* lossless_sse2.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		8F608164DBD02D50164121131C44D55E /* lossless_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = E0C8B9547808EB8A5A896902763ED1CE /* lossless_sse2.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
@@ -239,7 +233,6 @@
 		957DE2802453CD0072275A2E38835490 /* ConstraintConstantTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = E285049FBF9A42DEA97A9FEFC1D17D7A /* ConstraintConstantTarget.swift */; };
 		957DE2802453CD0072275A2E38835490 /* ConstraintConstantTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = E285049FBF9A42DEA97A9FEFC1D17D7A /* ConstraintConstantTarget.swift */; };
 		959DD2D85CEA9086C33502F8B6A0842C /* ConstraintMakerRelatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F0710BFC8B72AC7CD380F9792038102 /* ConstraintMakerRelatable.swift */; };
 		959DD2D85CEA9086C33502F8B6A0842C /* ConstraintMakerRelatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F0710BFC8B72AC7CD380F9792038102 /* ConstraintMakerRelatable.swift */; };
 		961411F29471A39514C644F21125E15C /* PQCreateEmptyWAV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F0C87F2F3A01A6D1F5E2F7235E94EF7 /* PQCreateEmptyWAV.swift */; };
 		961411F29471A39514C644F21125E15C /* PQCreateEmptyWAV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F0C87F2F3A01A6D1F5E2F7235E94EF7 /* PQCreateEmptyWAV.swift */; };
-		96E3F071F3CCB87462E6F9F7DC8D21C4 /* NXNormalBubbleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3066834FD63E09B82CDBECFF75C3C8A /* NXNormalBubbleView.swift */; };
 		976EF9CA5C1CA836A15EF6800A1FDC89 /* NSTextAttachment+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD103FAF58A1E5E036AF91FB052E7C4F /* NSTextAttachment+Kingfisher.swift */; };
 		976EF9CA5C1CA836A15EF6800A1FDC89 /* NSTextAttachment+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD103FAF58A1E5E036AF91FB052E7C4F /* NSTextAttachment+Kingfisher.swift */; };
 		981B40D7F9EACD254B37DCE5BE2FAAB7 /* bit_reader_utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 3894FDD96080FF1AAA08A552A60975C4 /* bit_reader_utils.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		981B40D7F9EACD254B37DCE5BE2FAAB7 /* bit_reader_utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 3894FDD96080FF1AAA08A552A60975C4 /* bit_reader_utils.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		9842AED386255256CC530592EB547B1D /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BEA6A77E1A4AE5ADEE3EB303B694CC8 /* SessionDelegate.swift */; };
 		9842AED386255256CC530592EB547B1D /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BEA6A77E1A4AE5ADEE3EB303B694CC8 /* SessionDelegate.swift */; };
@@ -252,7 +245,6 @@
 		9B92C79E5DEFBD99CB705CBE1F971E5A /* lossless_enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 3F484100064D90B96DDD3DDCD4BD8D3A /* lossless_enc_sse2.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		9B92C79E5DEFBD99CB705CBE1F971E5A /* lossless_enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 3F484100064D90B96DDD3DDCD4BD8D3A /* lossless_enc_sse2.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		9BD9CF2A1066A32FD3DE35EBA585A73C /* Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83BE7EC954E17F17E80B5F7328E9578B /* Box.swift */; };
 		9BD9CF2A1066A32FD3DE35EBA585A73C /* Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83BE7EC954E17F17E80B5F7328E9578B /* Box.swift */; };
 		9BDDA10198D6B5CEC23C03E4450C4F9B /* huffman_encode_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 9698521838352448FEC7A86C3CBA6245 /* huffman_encode_utils.h */; settings = {ATTRIBUTES = (Project, ); }; };
 		9BDDA10198D6B5CEC23C03E4450C4F9B /* huffman_encode_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 9698521838352448FEC7A86C3CBA6245 /* huffman_encode_utils.h */; settings = {ATTRIBUTES = (Project, ); }; };
-		9C43E895F93541305452255143106541 /* UITabBarItem+NXBadgeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAB924A6B5A3843BD917E0AC118C4E34 /* UITabBarItem+NXBadgeView.swift */; };
 		9D2D3D20E2EC0AF529505E73B73FC3A7 /* mips_macro.h in Headers */ = {isa = PBXBuildFile; fileRef = 57DF9C3138C41668207FCD3D9B695B6E /* mips_macro.h */; settings = {ATTRIBUTES = (Project, ); }; };
 		9D2D3D20E2EC0AF529505E73B73FC3A7 /* mips_macro.h in Headers */ = {isa = PBXBuildFile; fileRef = 57DF9C3138C41668207FCD3D9B695B6E /* mips_macro.h */; settings = {ATTRIBUTES = (Project, ); }; };
 		9EF6FF914CFF0BBEAFF6C641D561E143 /* neon.h in Headers */ = {isa = PBXBuildFile; fileRef = 82B2D8220A391607BF497EF0CB4C0486 /* neon.h */; settings = {ATTRIBUTES = (Project, ); }; };
 		9EF6FF914CFF0BBEAFF6C641D561E143 /* neon.h in Headers */ = {isa = PBXBuildFile; fileRef = 82B2D8220A391607BF497EF0CB4C0486 /* neon.h */; settings = {ATTRIBUTES = (Project, ); }; };
 		9F8FDFCD67CEBF5F993ACA855A0208C3 /* ConstraintInsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79351304C923DC9C6A74560057133798 /* ConstraintInsetTarget.swift */; };
 		9F8FDFCD67CEBF5F993ACA855A0208C3 /* ConstraintInsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79351304C923DC9C6A74560057133798 /* ConstraintInsetTarget.swift */; };
@@ -262,7 +254,6 @@
 		A01629B25B29BA18A42A3E30D1DB5BF1 /* ConstraintDescription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07A2B1A8DBD1405B4C8FCE1CC27CDCC1 /* ConstraintDescription.swift */; };
 		A01629B25B29BA18A42A3E30D1DB5BF1 /* ConstraintDescription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07A2B1A8DBD1405B4C8FCE1CC27CDCC1 /* ConstraintDescription.swift */; };
 		A05124F6CD4D4AFF5A1042D6DDDB5F9F /* String+MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E8C6C27647B48A34F49FD7A002144E1 /* String+MD5.swift */; };
 		A05124F6CD4D4AFF5A1042D6DDDB5F9F /* String+MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E8C6C27647B48A34F49FD7A002144E1 /* String+MD5.swift */; };
 		A20A5C6B45CE3A9F8F4A292777ECA573 /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = B6AD164242AFC127C6FF6835F5C1F40B /* dec.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		A20A5C6B45CE3A9F8F4A292777ECA573 /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = B6AD164242AFC127C6FF6835F5C1F40B /* dec.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
-		A28A71B3E8FC9BDF768DEEC18C97F2C4 /* NXConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF796D08FE333264DAE32E5DA16AB1DD /* NXConfig.swift */; };
 		A354B6CE0979C27F49466884C8ADE5D1 /* ImageModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6185F4EFAA7051D762CC0BD6E725BE49 /* ImageModifier.swift */; };
 		A354B6CE0979C27F49466884C8ADE5D1 /* ImageModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6185F4EFAA7051D762CC0BD6E725BE49 /* ImageModifier.swift */; };
 		A3719B1B12719F5B57DCB1EBB70D09CA /* rescaler_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 5CAF8C3309ABB43F473CDD6773F20424 /* rescaler_mips32.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		A3719B1B12719F5B57DCB1EBB70D09CA /* rescaler_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 5CAF8C3309ABB43F473CDD6773F20424 /* rescaler_mips32.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		A3B26BAFF93B54B0C9D793DF436F8FB5 /* ConstraintLayoutSupportDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA441EC2D48403C9380C37160F6B4485 /* ConstraintLayoutSupportDSL.swift */; };
 		A3B26BAFF93B54B0C9D793DF436F8FB5 /* ConstraintLayoutSupportDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA441EC2D48403C9380C37160F6B4485 /* ConstraintLayoutSupportDSL.swift */; };
@@ -283,7 +274,6 @@
 		B13CB08E35DBF25CFC2AC5EF01D518A0 /* huffman_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 9946A90C4BD2B96E3E3FCD7F8907D22D /* huffman_utils.h */; settings = {ATTRIBUTES = (Project, ); }; };
 		B13CB08E35DBF25CFC2AC5EF01D518A0 /* huffman_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 9946A90C4BD2B96E3E3FCD7F8907D22D /* huffman_utils.h */; settings = {ATTRIBUTES = (Project, ); }; };
 		B16FAB9656B846AA7B496C014E06AB13 /* dec_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = FA10A0FA13F640A94A7D91225540D567 /* dec_mips32.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		B16FAB9656B846AA7B496C014E06AB13 /* dec_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = FA10A0FA13F640A94A7D91225540D567 /* dec_mips32.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		B320BCA1054EFA577B3C91DBD7EA1088 /* alpha_processing_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 5290ADEA2A65A2391FD44220682660A7 /* alpha_processing_sse41.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		B320BCA1054EFA577B3C91DBD7EA1088 /* alpha_processing_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 5290ADEA2A65A2391FD44220682660A7 /* alpha_processing_sse41.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
-		B34F82B9EFED4ADA71E1F1B4D2C1D391 /* NXBadgeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01D03F761A6A0996EE06280B58E787C0 /* NXBadgeView.swift */; };
 		B3CDB43B8E52FBEB0D4418F7183AAD18 /* dec_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 39F42806706A41C09A2BEE3C12EE060E /* dec_mips_dsp_r2.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		B3CDB43B8E52FBEB0D4418F7183AAD18 /* dec_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 39F42806706A41C09A2BEE3C12EE060E /* dec_mips_dsp_r2.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		B42B8BE8DF76C54E8F2A91CCE381DC92 /* ConstraintMultiplierTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A79A64DDC179B12F4D1E6301EB6CFF7 /* ConstraintMultiplierTarget.swift */; };
 		B42B8BE8DF76C54E8F2A91CCE381DC92 /* ConstraintMultiplierTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A79A64DDC179B12F4D1E6301EB6CFF7 /* ConstraintMultiplierTarget.swift */; };
 		B56A4D9E2F9C944885F91E2EA80C1C23 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 10572D1D443ADA18EC63378E8D20D590 /* Foundation.framework */; };
 		B56A4D9E2F9C944885F91E2EA80C1C23 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 10572D1D443ADA18EC63378E8D20D590 /* Foundation.framework */; };
@@ -292,7 +282,6 @@
 		BBBFA483FD2CAB26DC2F68B428A07000 /* yuv_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 5CB2612C73EC7A3FA03CE2548321480F /* yuv_sse2.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		BBBFA483FD2CAB26DC2F68B428A07000 /* yuv_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 5CB2612C73EC7A3FA03CE2548321480F /* yuv_sse2.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		BD77973442CF783F7A3533C37602A600 /* anim_decode.c in Sources */ = {isa = PBXBuildFile; fileRef = 627E8A164F35A59446A7B20AA0653AC3 /* anim_decode.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		BD77973442CF783F7A3533C37602A600 /* anim_decode.c in Sources */ = {isa = PBXBuildFile; fileRef = 627E8A164F35A59446A7B20AA0653AC3 /* anim_decode.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		BD8BB3CCD6558C561AEDD156475BE120 /* SizeExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C5F2013194ECB2100A193D29FEFA871 /* SizeExtensions.swift */; };
 		BD8BB3CCD6558C561AEDD156475BE120 /* SizeExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C5F2013194ECB2100A193D29FEFA871 /* SizeExtensions.swift */; };
-		BE75613B5002D66F441003972A414789 /* NXInteractiveView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A93F50324468F8CAC9DB0025AF9C0F3B /* NXInteractiveView.swift */; };
 		BEE6B677416CA71C981D1D3F60B18C96 /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4459E1929C77DB0C8D99B482409EC5E5 /* Alamofire.swift */; };
 		BEE6B677416CA71C981D1D3F60B18C96 /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4459E1929C77DB0C8D99B482409EC5E5 /* Alamofire.swift */; };
 		C01C0AF4FF1C2CC2E2FF7CA4BFA81958 /* PQBaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D43A61076D45DE223B53A009D84A52E7 /* PQBaseViewController.swift */; };
 		C01C0AF4FF1C2CC2E2FF7CA4BFA81958 /* PQBaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D43A61076D45DE223B53A009D84A52E7 /* PQBaseViewController.swift */; };
 		C03F05DE42FCD0CA7A23AE81C44043D6 /* ConstraintPriorityTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A68B18323BB1FBE83B875F4BCFB7F6F /* ConstraintPriorityTarget.swift */; };
 		C03F05DE42FCD0CA7A23AE81C44043D6 /* ConstraintPriorityTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A68B18323BB1FBE83B875F4BCFB7F6F /* ConstraintPriorityTarget.swift */; };
@@ -309,7 +298,6 @@
 		C85BF40E51D9D98E6C15B28DF0D440AC /* enc_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = CE089B52CCB306BB9D2D92C4B96F38A1 /* enc_mips_dsp_r2.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		C85BF40E51D9D98E6C15B28DF0D440AC /* enc_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = CE089B52CCB306BB9D2D92C4B96F38A1 /* enc_mips_dsp_r2.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		C868179D0F871B6390C95031E8428DDA /* Placeholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 959FC8AC1F8BBAF564F070310D0EF7BD /* Placeholder.swift */; };
 		C868179D0F871B6390C95031E8428DDA /* Placeholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 959FC8AC1F8BBAF564F070310D0EF7BD /* Placeholder.swift */; };
 		C8CEEE73BCF56AD7022B4AEEED5C8335 /* lossless_enc.c in Sources */ = {isa = PBXBuildFile; fileRef = F3E86DD8487DC88A6EA9CD6947D0C6E4 /* lossless_enc.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		C8CEEE73BCF56AD7022B4AEEED5C8335 /* lossless_enc.c in Sources */ = {isa = PBXBuildFile; fileRef = F3E86DD8487DC88A6EA9CD6947D0C6E4 /* lossless_enc.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
-		C8FC8A13AFBF06CBC22BE75E60253939 /* NXBubbleLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB5DB9820955BB833895EB80A80B92D /* NXBubbleLayer.swift */; };
 		C9CC5199EB43AD7AA41E2D89766BF223 /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = 6998EBC4C4C88113916F0EBA59CB7D70 /* yuv.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		C9CC5199EB43AD7AA41E2D89766BF223 /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = 6998EBC4C4C88113916F0EBA59CB7D70 /* yuv.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		CA35EE46197B967C7FBDD866F3F7D19E /* RedirectHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949F021A70576256839F4150C1375CA4 /* RedirectHandler.swift */; };
 		CA35EE46197B967C7FBDD866F3F7D19E /* RedirectHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949F021A70576256839F4150C1375CA4 /* RedirectHandler.swift */; };
 		CA67FB18F8B451D2E85EF3AB9CF32E4C /* UILayoutSupport+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0F39B64CB2D0CBB15EA051BD583B29F /* UILayoutSupport+Extensions.swift */; };
 		CA67FB18F8B451D2E85EF3AB9CF32E4C /* UILayoutSupport+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0F39B64CB2D0CBB15EA051BD583B29F /* UILayoutSupport+Extensions.swift */; };
@@ -361,7 +349,6 @@
 		EEA419D2EF6B2CC88977F12BAA9AEBCC /* lossless_enc_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 2BE0CB623DD660B8CEBC1842E03BA666 /* lossless_enc_sse41.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		EEA419D2EF6B2CC88977F12BAA9AEBCC /* lossless_enc_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 2BE0CB623DD660B8CEBC1842E03BA666 /* lossless_enc_sse41.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		EECA81269DD15FE06BA2B0F1309C97AA /* demux.c in Sources */ = {isa = PBXBuildFile; fileRef = 1998C87D07FFB4E9E885B643EEB95775 /* demux.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		EECA81269DD15FE06BA2B0F1309C97AA /* demux.c in Sources */ = {isa = PBXBuildFile; fileRef = 1998C87D07FFB4E9E885B643EEB95775 /* demux.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		EEFD414BD41C8DD512FE126AF08E82FF /* enc_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 23DB1F409133CB7B789A66F648891468 /* enc_sse41.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
 		EEFD414BD41C8DD512FE126AF08E82FF /* enc_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 23DB1F409133CB7B789A66F648891468 /* enc_sse41.c */; settings = {COMPILER_FLAGS = "-D_THREAD_SAFE -fno-objc-arc"; }; };
-		EFBDC1DB78C182FAC805959CBD630FF5 /* NXUIColor+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EE9B9B4ADC4E1057D411B22D69B8D11 /* NXUIColor+Ext.swift */; };
 		F13F2AA7F2E6D95A181CAB99B900D531 /* ServerTrustPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E4055755BF6329E9A559C63239D4EAC /* ServerTrustPolicy.swift */; };
 		F13F2AA7F2E6D95A181CAB99B900D531 /* ServerTrustPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E4055755BF6329E9A559C63239D4EAC /* ServerTrustPolicy.swift */; };
 		F24E1EF07333C64635D333ABFDA35E9D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 10572D1D443ADA18EC63378E8D20D590 /* Foundation.framework */; };
 		F24E1EF07333C64635D333ABFDA35E9D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 10572D1D443ADA18EC63378E8D20D590 /* Foundation.framework */; };
 		F2B80DBEA320D67A3B1E97E1528F05B9 /* PQNavigatinController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DABDE4AFF05333E07A855505EE55DAA4 /* PQNavigatinController.swift */; };
 		F2B80DBEA320D67A3B1E97E1528F05B9 /* PQNavigatinController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DABDE4AFF05333E07A855505EE55DAA4 /* PQNavigatinController.swift */; };
@@ -526,71 +513,67 @@
 /* End PBXContainerItemProxy section */
 /* End PBXContainerItemProxy section */
 
 
 /* Begin PBXFileReference section */
 /* Begin PBXFileReference section */
-		01D03F761A6A0996EE06280B58E787C0 /* NXBadgeView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NXBadgeView.swift; sourceTree = "<group>"; };
-		03AB27C43FD1FE578A15CB925FFD1AE0 /* filters_neon.c */ = {isa = PBXFileReference; includeInIndex = 1; name = filters_neon.c; path = src/dsp/filters_neon.c; sourceTree = "<group>"; };
+		03AB27C43FD1FE578A15CB925FFD1AE0 /* filters_neon.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = filters_neon.c; path = src/dsp/filters_neon.c; sourceTree = "<group>"; };
 		0407DEDD681E242B1BBC995C2ADD596C /* yuv.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = yuv.h; path = src/dsp/yuv.h; sourceTree = "<group>"; };
 		0407DEDD681E242B1BBC995C2ADD596C /* yuv.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = yuv.h; path = src/dsp/yuv.h; sourceTree = "<group>"; };
 		046400D68DBC88A9997B00749125A557 /* ConstraintLayoutSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutSupport.swift; path = Source/ConstraintLayoutSupport.swift; sourceTree = "<group>"; };
 		046400D68DBC88A9997B00749125A557 /* ConstraintLayoutSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutSupport.swift; path = Source/ConstraintLayoutSupport.swift; sourceTree = "<group>"; };
-		051ED88A0299670B6BBB492D93929591 /* NXBadgeControl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NXBadgeControl.swift; sourceTree = "<group>"; };
 		05935B678482EFCA16D1A7F595B0692F /* Alamofire-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Alamofire-Info.plist"; sourceTree = "<group>"; };
 		05935B678482EFCA16D1A7F595B0692F /* Alamofire-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Alamofire-Info.plist"; sourceTree = "<group>"; };
 		0615EB42245DDCDE31CFC56483F68634 /* ConstraintMakerExtendable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerExtendable.swift; path = Source/ConstraintMakerExtendable.swift; sourceTree = "<group>"; };
 		0615EB42245DDCDE31CFC56483F68634 /* ConstraintMakerExtendable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerExtendable.swift; path = Source/ConstraintMakerExtendable.swift; sourceTree = "<group>"; };
 		0678E53A69384CB115123D13A7FF5D9C /* mux_types.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = mux_types.h; path = src/webp/mux_types.h; sourceTree = "<group>"; };
 		0678E53A69384CB115123D13A7FF5D9C /* mux_types.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = mux_types.h; path = src/webp/mux_types.h; sourceTree = "<group>"; };
 		06F0A23B7599045805489A1918386A5F /* libwebp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = libwebp.debug.xcconfig; sourceTree = "<group>"; };
 		06F0A23B7599045805489A1918386A5F /* libwebp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = libwebp.debug.xcconfig; sourceTree = "<group>"; };
 		06F4EB929AE031D388EFB366A5DCF1E2 /* KeychainAccess-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "KeychainAccess-dummy.m"; sourceTree = "<group>"; };
 		06F4EB929AE031D388EFB366A5DCF1E2 /* KeychainAccess-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "KeychainAccess-dummy.m"; sourceTree = "<group>"; };
-		0708E7C5C61D83333F44152EC5A7445E /* thread_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; name = thread_utils.c; path = src/utils/thread_utils.c; sourceTree = "<group>"; };
+		0708E7C5C61D83333F44152EC5A7445E /* thread_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = thread_utils.c; path = src/utils/thread_utils.c; sourceTree = "<group>"; };
 		070F83CE2B2C59EE08E9ADFFCB049FB6 /* vp8li_enc.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = vp8li_enc.h; path = src/enc/vp8li_enc.h; sourceTree = "<group>"; };
 		070F83CE2B2C59EE08E9ADFFCB049FB6 /* vp8li_enc.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = vp8li_enc.h; path = src/enc/vp8li_enc.h; sourceTree = "<group>"; };
 		07A2B1A8DBD1405B4C8FCE1CC27CDCC1 /* ConstraintDescription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDescription.swift; path = Source/ConstraintDescription.swift; sourceTree = "<group>"; };
 		07A2B1A8DBD1405B4C8FCE1CC27CDCC1 /* ConstraintDescription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDescription.swift; path = Source/ConstraintDescription.swift; sourceTree = "<group>"; };
 		08E989CAD84F1F09C6C947D5574BDA49 /* Toast-Swift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Toast-Swift.modulemap"; sourceTree = "<group>"; };
 		08E989CAD84F1F09C6C947D5574BDA49 /* Toast-Swift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Toast-Swift.modulemap"; sourceTree = "<group>"; };
 		09DF88D5B9CA345020E31EE7129AFDFF /* PQBFConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQBFConfig.swift; sourceTree = "<group>"; };
 		09DF88D5B9CA345020E31EE7129AFDFF /* PQBFConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQBFConfig.swift; sourceTree = "<group>"; };
 		0B697896B80F3AA6B94D9C5CE6A74397 /* animi.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = animi.h; path = src/mux/animi.h; sourceTree = "<group>"; };
 		0B697896B80F3AA6B94D9C5CE6A74397 /* animi.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = animi.h; path = src/mux/animi.h; sourceTree = "<group>"; };
 		0BD80491DEAE40B85A42E503E4A79F38 /* Storage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Storage.swift; path = Sources/Cache/Storage.swift; sourceTree = "<group>"; };
 		0BD80491DEAE40B85A42E503E4A79F38 /* Storage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Storage.swift; path = Sources/Cache/Storage.swift; sourceTree = "<group>"; };
-		0C0E917D4DDD7CB17F8D3593503F7EA2 /* lossless_neon.c */ = {isa = PBXFileReference; includeInIndex = 1; name = lossless_neon.c; path = src/dsp/lossless_neon.c; sourceTree = "<group>"; };
+		0C0E917D4DDD7CB17F8D3593503F7EA2 /* lossless_neon.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = lossless_neon.c; path = src/dsp/lossless_neon.c; sourceTree = "<group>"; };
 		0C415D7BDC0DF20310E532A5581CD10D /* ImagePrefetcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImagePrefetcher.swift; path = Sources/Networking/ImagePrefetcher.swift; sourceTree = "<group>"; };
 		0C415D7BDC0DF20310E532A5581CD10D /* ImagePrefetcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImagePrefetcher.swift; path = Sources/Networking/ImagePrefetcher.swift; sourceTree = "<group>"; };
 		0C9E73B50BE1B87C0E8131617E7DC268 /* bit_reader_inl_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = bit_reader_inl_utils.h; path = src/utils/bit_reader_inl_utils.h; sourceTree = "<group>"; };
 		0C9E73B50BE1B87C0E8131617E7DC268 /* bit_reader_inl_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = bit_reader_inl_utils.h; path = src/utils/bit_reader_inl_utils.h; sourceTree = "<group>"; };
-		0CFEE30E199FF81C5DD2DB1CEE26A051 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = "<group>"; };
+		0CFEE30E199FF81C5DD2DB1CEE26A051 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
 		0DE055E23F27B6A7695CC06ECF8F6921 /* SnapKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SnapKit-Info.plist"; sourceTree = "<group>"; };
 		0DE055E23F27B6A7695CC06ECF8F6921 /* SnapKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SnapKit-Info.plist"; sourceTree = "<group>"; };
 		0E0EBB986ABE6DFB91250BD8989DF417 /* Pods-BFCommonKit_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-BFCommonKit_Example-frameworks.sh"; sourceTree = "<group>"; };
 		0E0EBB986ABE6DFB91250BD8989DF417 /* Pods-BFCommonKit_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-BFCommonKit_Example-frameworks.sh"; sourceTree = "<group>"; };
 		0E1773767052E702F88EDAE86607A4DF /* PQVideoSnapshotUtil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQVideoSnapshotUtil.swift; sourceTree = "<group>"; };
 		0E1773767052E702F88EDAE86607A4DF /* PQVideoSnapshotUtil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQVideoSnapshotUtil.swift; sourceTree = "<group>"; };
 		0E72B82292D26CF2FC4728FDA1786E19 /* Toast-Swift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-Swift-umbrella.h"; sourceTree = "<group>"; };
 		0E72B82292D26CF2FC4728FDA1786E19 /* Toast-Swift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-Swift-umbrella.h"; sourceTree = "<group>"; };
 		10572D1D443ADA18EC63378E8D20D590 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
 		10572D1D443ADA18EC63378E8D20D590 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
 		11B1B7408FBD7CD30D01DF9F5D107121 /* PQTabBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQTabBar.swift; sourceTree = "<group>"; };
 		11B1B7408FBD7CD30D01DF9F5D107121 /* PQTabBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQTabBar.swift; sourceTree = "<group>"; };
-		11F937E8952C944CCCB14D50DB3B35F5 /* NXTextBubbleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NXTextBubbleView.swift; sourceTree = "<group>"; };
 		125E8F85151D68919B9C17F952D2FABA /* Pods-BFCommonKit_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-BFCommonKit_Example-acknowledgements.markdown"; sourceTree = "<group>"; };
 		125E8F85151D68919B9C17F952D2FABA /* Pods-BFCommonKit_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-BFCommonKit_Example-acknowledgements.markdown"; sourceTree = "<group>"; };
 		149E067C2A4FDBC508AD5BA32F4E4BEE /* quant_levels_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = quant_levels_utils.h; path = src/utils/quant_levels_utils.h; sourceTree = "<group>"; };
 		149E067C2A4FDBC508AD5BA32F4E4BEE /* quant_levels_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = quant_levels_utils.h; path = src/utils/quant_levels_utils.h; sourceTree = "<group>"; };
-		1579D1CE8965D19735C16F7F505136EF /* lossless.c */ = {isa = PBXFileReference; includeInIndex = 1; name = lossless.c; path = src/dsp/lossless.c; sourceTree = "<group>"; };
+		1579D1CE8965D19735C16F7F505136EF /* lossless.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = lossless.c; path = src/dsp/lossless.c; sourceTree = "<group>"; };
 		15AB133A9FA3B7013CF0FFCF18DCF3D8 /* GraphicsContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GraphicsContext.swift; path = Sources/Image/GraphicsContext.swift; sourceTree = "<group>"; };
 		15AB133A9FA3B7013CF0FFCF18DCF3D8 /* GraphicsContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GraphicsContext.swift; path = Sources/Image/GraphicsContext.swift; sourceTree = "<group>"; };
 		16564BD85EBE26963FCA07F535EB8393 /* KF.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KF.swift; path = Sources/General/KF.swift; sourceTree = "<group>"; };
 		16564BD85EBE26963FCA07F535EB8393 /* KF.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KF.swift; path = Sources/General/KF.swift; sourceTree = "<group>"; };
 		169916AB83C3BB9BB71734657DC09065 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/CoreMedia.framework; sourceTree = DEVELOPER_DIR; };
 		169916AB83C3BB9BB71734657DC09065 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/CoreMedia.framework; sourceTree = DEVELOPER_DIR; };
-		170EBF11B2B7EC526309D259D16401E1 /* yuv_sse41.c */ = {isa = PBXFileReference; includeInIndex = 1; name = yuv_sse41.c; path = src/dsp/yuv_sse41.c; sourceTree = "<group>"; };
+		170EBF11B2B7EC526309D259D16401E1 /* yuv_sse41.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = yuv_sse41.c; path = src/dsp/yuv_sse41.c; sourceTree = "<group>"; };
 		18D1C787761826AF297B54D0C41A08BD /* NXLoggerManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NXLoggerManager.swift; sourceTree = "<group>"; };
 		18D1C787761826AF297B54D0C41A08BD /* NXLoggerManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NXLoggerManager.swift; sourceTree = "<group>"; };
 		18EA155D21A53DAA222EB42D65C68031 /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = "<group>"; };
 		18EA155D21A53DAA222EB42D65C68031 /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = "<group>"; };
-		1998C87D07FFB4E9E885B643EEB95775 /* demux.c */ = {isa = PBXFileReference; includeInIndex = 1; name = demux.c; path = src/demux/demux.c; sourceTree = "<group>"; };
+		1998C87D07FFB4E9E885B643EEB95775 /* demux.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = demux.c; path = src/demux/demux.c; sourceTree = "<group>"; };
 		1A47ABAC8ACBD62753B75EF4EF537D6C /* NXLogger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NXLogger.swift; sourceTree = "<group>"; };
 		1A47ABAC8ACBD62753B75EF4EF537D6C /* NXLogger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NXLogger.swift; sourceTree = "<group>"; };
 		1C5F2013194ECB2100A193D29FEFA871 /* SizeExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SizeExtensions.swift; path = Sources/Utility/SizeExtensions.swift; sourceTree = "<group>"; };
 		1C5F2013194ECB2100A193D29FEFA871 /* SizeExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SizeExtensions.swift; path = Sources/Utility/SizeExtensions.swift; sourceTree = "<group>"; };
-		1EB59F8D47A852B95ECF2E6281811261 /* dec_clip_tables.c */ = {isa = PBXFileReference; includeInIndex = 1; name = dec_clip_tables.c; path = src/dsp/dec_clip_tables.c; sourceTree = "<group>"; };
-		1ED6D92DF5356851F1B7908C452438ED /* cost_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = cost_enc.c; path = src/enc/cost_enc.c; sourceTree = "<group>"; };
+		1EB59F8D47A852B95ECF2E6281811261 /* dec_clip_tables.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = dec_clip_tables.c; path = src/dsp/dec_clip_tables.c; sourceTree = "<group>"; };
+		1ED6D92DF5356851F1B7908C452438ED /* cost_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = cost_enc.c; path = src/enc/cost_enc.c; sourceTree = "<group>"; };
 		1EFAC179C755C5DC5E7F33E4B200F78E /* ConstraintLayoutGuide+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ConstraintLayoutGuide+Extensions.swift"; path = "Source/ConstraintLayoutGuide+Extensions.swift"; sourceTree = "<group>"; };
 		1EFAC179C755C5DC5E7F33E4B200F78E /* ConstraintLayoutGuide+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ConstraintLayoutGuide+Extensions.swift"; path = "Source/ConstraintLayoutGuide+Extensions.swift"; sourceTree = "<group>"; };
 		2002756892B520DACD484506D3082DB4 /* FDFullscreenPopGesture.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FDFullscreenPopGesture.release.xcconfig; sourceTree = "<group>"; };
 		2002756892B520DACD484506D3082DB4 /* FDFullscreenPopGesture.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FDFullscreenPopGesture.release.xcconfig; sourceTree = "<group>"; };
-		21CE9D4367BAC983C84878AFCD709D7D /* dec_neon.c */ = {isa = PBXFileReference; includeInIndex = 1; name = dec_neon.c; path = src/dsp/dec_neon.c; sourceTree = "<group>"; };
+		21CE9D4367BAC983C84878AFCD709D7D /* dec_neon.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = dec_neon.c; path = src/dsp/dec_neon.c; sourceTree = "<group>"; };
 		222F35C21FB2E3CCC2757E8611FF18BA /* BFUIButton+ext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BFUIButton+ext.swift"; sourceTree = "<group>"; };
 		222F35C21FB2E3CCC2757E8611FF18BA /* BFUIButton+ext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BFUIButton+ext.swift"; sourceTree = "<group>"; };
 		226D31B06954E07C57CAF8871286C517 /* AVAssetImageDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AVAssetImageDataProvider.swift; path = Sources/General/ImageSource/AVAssetImageDataProvider.swift; sourceTree = "<group>"; };
 		226D31B06954E07C57CAF8871286C517 /* AVAssetImageDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AVAssetImageDataProvider.swift; path = Sources/General/ImageSource/AVAssetImageDataProvider.swift; sourceTree = "<group>"; };
 		231929331EC4972FD1439BC7D8238918 /* ConstraintRelatableTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintRelatableTarget.swift; path = Source/ConstraintRelatableTarget.swift; sourceTree = "<group>"; };
 		231929331EC4972FD1439BC7D8238918 /* ConstraintRelatableTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintRelatableTarget.swift; path = Source/ConstraintRelatableTarget.swift; sourceTree = "<group>"; };
-		23688D65051D3AD94F11994EA69F4F64 /* NXVoiceBubbleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NXVoiceBubbleView.swift; sourceTree = "<group>"; };
-		23DB1F409133CB7B789A66F648891468 /* enc_sse41.c */ = {isa = PBXFileReference; includeInIndex = 1; name = enc_sse41.c; path = src/dsp/enc_sse41.c; sourceTree = "<group>"; };
-		240B5513E01A6270C28267AD12E51789 /* yuv_neon.c */ = {isa = PBXFileReference; includeInIndex = 1; name = yuv_neon.c; path = src/dsp/yuv_neon.c; sourceTree = "<group>"; };
+		23DB1F409133CB7B789A66F648891468 /* enc_sse41.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = enc_sse41.c; path = src/dsp/enc_sse41.c; sourceTree = "<group>"; };
+		240B5513E01A6270C28267AD12E51789 /* yuv_neon.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = yuv_neon.c; path = src/dsp/yuv_neon.c; sourceTree = "<group>"; };
 		24D2090AE6EB8ABB51A9F3BE4D2F12C9 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Source/Result.swift; sourceTree = "<group>"; };
 		24D2090AE6EB8ABB51A9F3BE4D2F12C9 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Source/Result.swift; sourceTree = "<group>"; };
-		2680E31C2E7FF2DB2C2D3C5B9F5B22BC /* quant_levels_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; name = quant_levels_utils.c; path = src/utils/quant_levels_utils.c; sourceTree = "<group>"; };
-		273E57AEE717D502CC3C3478A46F5A70 /* lossless_enc_msa.c */ = {isa = PBXFileReference; includeInIndex = 1; name = lossless_enc_msa.c; path = src/dsp/lossless_enc_msa.c; sourceTree = "<group>"; };
+		2680E31C2E7FF2DB2C2D3C5B9F5B22BC /* quant_levels_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = quant_levels_utils.c; path = src/utils/quant_levels_utils.c; sourceTree = "<group>"; };
+		273E57AEE717D502CC3C3478A46F5A70 /* lossless_enc_msa.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = lossless_enc_msa.c; path = src/dsp/lossless_enc_msa.c; sourceTree = "<group>"; };
 		27CE6DF20703451AB50E3457D02290E7 /* ImageBinder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageBinder.swift; path = Sources/SwiftUI/ImageBinder.swift; sourceTree = "<group>"; };
 		27CE6DF20703451AB50E3457D02290E7 /* ImageBinder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageBinder.swift; path = Sources/SwiftUI/ImageBinder.swift; sourceTree = "<group>"; };
 		27DBE049A5AB23A158B65A5368B22980 /* RequestModifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestModifier.swift; path = Sources/Networking/RequestModifier.swift; sourceTree = "<group>"; };
 		27DBE049A5AB23A158B65A5368B22980 /* RequestModifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestModifier.swift; path = Sources/Networking/RequestModifier.swift; sourceTree = "<group>"; };
 		282FB458ECB9BA7CD80F505282ECA4CD /* WKInterfaceImage+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "WKInterfaceImage+Kingfisher.swift"; path = "Sources/Extensions/WKInterfaceImage+Kingfisher.swift"; sourceTree = "<group>"; };
 		282FB458ECB9BA7CD80F505282ECA4CD /* WKInterfaceImage+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "WKInterfaceImage+Kingfisher.swift"; path = "Sources/Extensions/WKInterfaceImage+Kingfisher.swift"; sourceTree = "<group>"; };
-		2925208EAA413ADAFFF9D43BA54FF3AB /* anim_encode.c */ = {isa = PBXFileReference; includeInIndex = 1; name = anim_encode.c; path = src/mux/anim_encode.c; sourceTree = "<group>"; };
-		2A00D77E7C363E200C7D174904ACCCFE /* upsampling_sse41.c */ = {isa = PBXFileReference; includeInIndex = 1; name = upsampling_sse41.c; path = src/dsp/upsampling_sse41.c; sourceTree = "<group>"; };
+		2925208EAA413ADAFFF9D43BA54FF3AB /* anim_encode.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = anim_encode.c; path = src/mux/anim_encode.c; sourceTree = "<group>"; };
+		2A00D77E7C363E200C7D174904ACCCFE /* upsampling_sse41.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = upsampling_sse41.c; path = src/dsp/upsampling_sse41.c; sourceTree = "<group>"; };
 		2A2A2E73E84270CC6C48012B20839BE0 /* WebPSerializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WebPSerializer.swift; path = Sources/WebPSerializer.swift; sourceTree = "<group>"; };
 		2A2A2E73E84270CC6C48012B20839BE0 /* WebPSerializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WebPSerializer.swift; path = Sources/WebPSerializer.swift; sourceTree = "<group>"; };
 		2ABEFF330D5A5B7D2E87BE2014407255 /* ConstraintMakerFinalizable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerFinalizable.swift; path = Source/ConstraintMakerFinalizable.swift; sourceTree = "<group>"; };
 		2ABEFF330D5A5B7D2E87BE2014407255 /* ConstraintMakerFinalizable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerFinalizable.swift; path = Source/ConstraintMakerFinalizable.swift; sourceTree = "<group>"; };
 		2ACD67CB0F739025FD4258F7618861F6 /* alphai_dec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = alphai_dec.h; path = src/dec/alphai_dec.h; sourceTree = "<group>"; };
 		2ACD67CB0F739025FD4258F7618861F6 /* alphai_dec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = alphai_dec.h; path = src/dec/alphai_dec.h; sourceTree = "<group>"; };
 		2AE3940E19441FE6755E5388C49411C0 /* Image+WebP.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Image+WebP.swift"; path = "Sources/Image+WebP.swift"; sourceTree = "<group>"; };
 		2AE3940E19441FE6755E5388C49411C0 /* Image+WebP.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Image+WebP.swift"; path = "Sources/Image+WebP.swift"; sourceTree = "<group>"; };
 		2B610FEC03E63C7221D2B8E229DB5CB5 /* PQConstant.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQConstant.swift; sourceTree = "<group>"; };
 		2B610FEC03E63C7221D2B8E229DB5CB5 /* PQConstant.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQConstant.swift; sourceTree = "<group>"; };
-		2BE0CB623DD660B8CEBC1842E03BA666 /* lossless_enc_sse41.c */ = {isa = PBXFileReference; includeInIndex = 1; name = lossless_enc_sse41.c; path = src/dsp/lossless_enc_sse41.c; sourceTree = "<group>"; };
+		2BE0CB623DD660B8CEBC1842E03BA666 /* lossless_enc_sse41.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = lossless_enc_sse41.c; path = src/dsp/lossless_enc_sse41.c; sourceTree = "<group>"; };
 		2C1F20E7E6B03FCCCCC8EAC96CB4CFEF /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		2C1F20E7E6B03FCCCCC8EAC96CB4CFEF /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		2C6A304A3C08382551F1F29DD057201F /* ConstraintLayoutGuide.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutGuide.swift; path = Source/ConstraintLayoutGuide.swift; sourceTree = "<group>"; };
 		2C6A304A3C08382551F1F29DD057201F /* ConstraintLayoutGuide.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutGuide.swift; path = Source/ConstraintLayoutGuide.swift; sourceTree = "<group>"; };
 		2DF0E2D38666005FF7133776BB9D4946 /* KingfisherWebP.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = KingfisherWebP.modulemap; sourceTree = "<group>"; };
 		2DF0E2D38666005FF7133776BB9D4946 /* KingfisherWebP.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = KingfisherWebP.modulemap; sourceTree = "<group>"; };
@@ -600,14 +583,14 @@
 		2ED6E86513642AF92E6F6FD1957D2653 /* BFCommonKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = BFCommonKit.debug.xcconfig; sourceTree = "<group>"; };
 		2ED6E86513642AF92E6F6FD1957D2653 /* BFCommonKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = BFCommonKit.debug.xcconfig; sourceTree = "<group>"; };
 		2F8A34870AD501A653EFD70A9D4E2BF8 /* ConstraintDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDSL.swift; path = Source/ConstraintDSL.swift; sourceTree = "<group>"; };
 		2F8A34870AD501A653EFD70A9D4E2BF8 /* ConstraintDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDSL.swift; path = Source/ConstraintDSL.swift; sourceTree = "<group>"; };
 		2F9E6AA6C40BBCF36B1FBF5CFE4BBEBE /* SWNetRequest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SWNetRequest.swift; sourceTree = "<group>"; };
 		2F9E6AA6C40BBCF36B1FBF5CFE4BBEBE /* SWNetRequest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SWNetRequest.swift; sourceTree = "<group>"; };
-		2FC7D0890A2DCAA85AFA92E9014FBB85 /* KingfisherWebP.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = KingfisherWebP.framework; path = KingfisherWebP.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-		3023BE974519C3DE5F01C2E222D46337 /* filters.c */ = {isa = PBXFileReference; includeInIndex = 1; name = filters.c; path = src/dsp/filters.c; sourceTree = "<group>"; };
+		2FC7D0890A2DCAA85AFA92E9014FBB85 /* KingfisherWebP.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KingfisherWebP.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		3023BE974519C3DE5F01C2E222D46337 /* filters.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = filters.c; path = src/dsp/filters.c; sourceTree = "<group>"; };
 		311C4EB90EC26319DDF46025390416B6 /* SessionDataTask.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDataTask.swift; path = Sources/Networking/SessionDataTask.swift; sourceTree = "<group>"; };
 		311C4EB90EC26319DDF46025390416B6 /* SessionDataTask.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDataTask.swift; path = Sources/Networking/SessionDataTask.swift; sourceTree = "<group>"; };
 		3134DF6C7C50C681045659AFA53E8057 /* Kingfisher-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Kingfisher-umbrella.h"; sourceTree = "<group>"; };
 		3134DF6C7C50C681045659AFA53E8057 /* Kingfisher-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Kingfisher-umbrella.h"; sourceTree = "<group>"; };
 		32116B9381F4458EA0C5682C96502A5A /* PQBridgeObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PQBridgeObject.h; sourceTree = "<group>"; };
 		32116B9381F4458EA0C5682C96502A5A /* PQBridgeObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PQBridgeObject.h; sourceTree = "<group>"; };
 		326DA8D042B3B7811948F034D18345CA /* NXDeviceManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NXDeviceManager.swift; sourceTree = "<group>"; };
 		326DA8D042B3B7811948F034D18345CA /* NXDeviceManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NXDeviceManager.swift; sourceTree = "<group>"; };
 		33593903EB7321AA74E7866F00CBA8C9 /* PQGIFImageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQGIFImageView.swift; sourceTree = "<group>"; };
 		33593903EB7321AA74E7866F00CBA8C9 /* PQGIFImageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQGIFImageView.swift; sourceTree = "<group>"; };
-		33739A281CF33C0BF0E93857A6367E97 /* BFCommonKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = BFCommonKit.framework; path = BFCommonKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		33739A281CF33C0BF0E93857A6367E97 /* BFCommonKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BFCommonKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		33C25AB892E842E0C495A8DB852CF115 /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.swift; path = Sources/Image/Image.swift; sourceTree = "<group>"; };
 		33C25AB892E842E0C495A8DB852CF115 /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.swift; path = Sources/Image/Image.swift; sourceTree = "<group>"; };
 		33FAA752A21F9E98DE7E0080739CE4E7 /* ImageView+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ImageView+Kingfisher.swift"; path = "Sources/Extensions/ImageView+Kingfisher.swift"; sourceTree = "<group>"; };
 		33FAA752A21F9E98DE7E0080739CE4E7 /* ImageView+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ImageView+Kingfisher.swift"; path = "Sources/Extensions/ImageView+Kingfisher.swift"; sourceTree = "<group>"; };
 		345A7FD58ABA8B39E2CD2EF5E62243E7 /* Alamofire.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.release.xcconfig; sourceTree = "<group>"; };
 		345A7FD58ABA8B39E2CD2EF5E62243E7 /* Alamofire.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.release.xcconfig; sourceTree = "<group>"; };
@@ -617,60 +600,60 @@
 		373571CD08DB219DF5F14C3C97E58E50 /* common_sse41.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = common_sse41.h; path = src/dsp/common_sse41.h; sourceTree = "<group>"; };
 		373571CD08DB219DF5F14C3C97E58E50 /* common_sse41.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = common_sse41.h; path = src/dsp/common_sse41.h; sourceTree = "<group>"; };
 		378683E5E4F0CB330A5A2AE4EE90ED01 /* BFCommonKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "BFCommonKit-prefix.pch"; sourceTree = "<group>"; };
 		378683E5E4F0CB330A5A2AE4EE90ED01 /* BFCommonKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "BFCommonKit-prefix.pch"; sourceTree = "<group>"; };
 		37FD865E699505708C87804EC38195E0 /* bit_reader_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = bit_reader_utils.h; path = src/utils/bit_reader_utils.h; sourceTree = "<group>"; };
 		37FD865E699505708C87804EC38195E0 /* bit_reader_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = bit_reader_utils.h; path = src/utils/bit_reader_utils.h; sourceTree = "<group>"; };
-		3894FDD96080FF1AAA08A552A60975C4 /* bit_reader_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; name = bit_reader_utils.c; path = src/utils/bit_reader_utils.c; sourceTree = "<group>"; };
-		39C86FB18316F8DA09D41004E0654317 /* upsampling_mips_dsp_r2.c */ = {isa = PBXFileReference; includeInIndex = 1; name = upsampling_mips_dsp_r2.c; path = src/dsp/upsampling_mips_dsp_r2.c; sourceTree = "<group>"; };
-		39F42806706A41C09A2BEE3C12EE060E /* dec_mips_dsp_r2.c */ = {isa = PBXFileReference; includeInIndex = 1; name = dec_mips_dsp_r2.c; path = src/dsp/dec_mips_dsp_r2.c; sourceTree = "<group>"; };
+		3894FDD96080FF1AAA08A552A60975C4 /* bit_reader_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = bit_reader_utils.c; path = src/utils/bit_reader_utils.c; sourceTree = "<group>"; };
+		39C86FB18316F8DA09D41004E0654317 /* upsampling_mips_dsp_r2.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = upsampling_mips_dsp_r2.c; path = src/dsp/upsampling_mips_dsp_r2.c; sourceTree = "<group>"; };
+		39F42806706A41C09A2BEE3C12EE060E /* dec_mips_dsp_r2.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = dec_mips_dsp_r2.c; path = src/dsp/dec_mips_dsp_r2.c; sourceTree = "<group>"; };
 		39F471D9E24292AC303891A185766068 /* bit_writer_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = bit_writer_utils.h; path = src/utils/bit_writer_utils.h; sourceTree = "<group>"; };
 		39F471D9E24292AC303891A185766068 /* bit_writer_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = bit_writer_utils.h; path = src/utils/bit_writer_utils.h; sourceTree = "<group>"; };
 		3A5AECCB226482B478B0AE61AA9F34F2 /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = "<group>"; };
 		3A5AECCB226482B478B0AE61AA9F34F2 /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = "<group>"; };
-		3A75FBF18385E3F459DA7CFF1FF4EB46 /* lossless_enc_mips_dsp_r2.c */ = {isa = PBXFileReference; includeInIndex = 1; name = lossless_enc_mips_dsp_r2.c; path = src/dsp/lossless_enc_mips_dsp_r2.c; sourceTree = "<group>"; };
+		3A75FBF18385E3F459DA7CFF1FF4EB46 /* lossless_enc_mips_dsp_r2.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = lossless_enc_mips_dsp_r2.c; path = src/dsp/lossless_enc_mips_dsp_r2.c; sourceTree = "<group>"; };
 		3A79A64DDC179B12F4D1E6301EB6CFF7 /* ConstraintMultiplierTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMultiplierTarget.swift; path = Source/ConstraintMultiplierTarget.swift; sourceTree = "<group>"; };
 		3A79A64DDC179B12F4D1E6301EB6CFF7 /* ConstraintMultiplierTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMultiplierTarget.swift; path = Source/ConstraintMultiplierTarget.swift; sourceTree = "<group>"; };
 		3AB525A0263C1383193F7D2B0F04F86C /* cost_enc.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cost_enc.h; path = src/enc/cost_enc.h; sourceTree = "<group>"; };
 		3AB525A0263C1383193F7D2B0F04F86C /* cost_enc.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cost_enc.h; path = src/enc/cost_enc.h; sourceTree = "<group>"; };
-		3B36E1C6B2CC889390110A5C12DE9D69 /* ssim_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; name = ssim_sse2.c; path = src/dsp/ssim_sse2.c; sourceTree = "<group>"; };
+		3B36E1C6B2CC889390110A5C12DE9D69 /* ssim_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = ssim_sse2.c; path = src/dsp/ssim_sse2.c; sourceTree = "<group>"; };
 		3CEDDB95B60195040A8760F446C8A46A /* Enums.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Enums.swift; sourceTree = "<group>"; };
 		3CEDDB95B60195040A8760F446C8A46A /* Enums.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Enums.swift; sourceTree = "<group>"; };
 		3D6FB0AABD9E964080FE8223D27D649D /* BFUIImage+Ext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BFUIImage+Ext.swift"; sourceTree = "<group>"; };
 		3D6FB0AABD9E964080FE8223D27D649D /* BFUIImage+Ext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BFUIImage+Ext.swift"; sourceTree = "<group>"; };
 		3E4055755BF6329E9A559C63239D4EAC /* ServerTrustPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustPolicy.swift; path = Source/ServerTrustPolicy.swift; sourceTree = "<group>"; };
 		3E4055755BF6329E9A559C63239D4EAC /* ServerTrustPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustPolicy.swift; path = Source/ServerTrustPolicy.swift; sourceTree = "<group>"; };
 		3E56CCF2004C6CFA88B6C8507E987FD2 /* Pods-BFCommonKit_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-BFCommonKit_Tests-acknowledgements.plist"; sourceTree = "<group>"; };
 		3E56CCF2004C6CFA88B6C8507E987FD2 /* Pods-BFCommonKit_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-BFCommonKit_Tests-acknowledgements.plist"; sourceTree = "<group>"; };
 		3E8C6C27647B48A34F49FD7A002144E1 /* String+MD5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+MD5.swift"; path = "Sources/Utility/String+MD5.swift"; sourceTree = "<group>"; };
 		3E8C6C27647B48A34F49FD7A002144E1 /* String+MD5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+MD5.swift"; path = "Sources/Utility/String+MD5.swift"; sourceTree = "<group>"; };
 		3F0710BFC8B72AC7CD380F9792038102 /* ConstraintMakerRelatable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerRelatable.swift; path = Source/ConstraintMakerRelatable.swift; sourceTree = "<group>"; };
 		3F0710BFC8B72AC7CD380F9792038102 /* ConstraintMakerRelatable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerRelatable.swift; path = Source/ConstraintMakerRelatable.swift; sourceTree = "<group>"; };
-		3F484100064D90B96DDD3DDCD4BD8D3A /* lossless_enc_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; name = lossless_enc_sse2.c; path = src/dsp/lossless_enc_sse2.c; sourceTree = "<group>"; };
+		3F484100064D90B96DDD3DDCD4BD8D3A /* lossless_enc_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = lossless_enc_sse2.c; path = src/dsp/lossless_enc_sse2.c; sourceTree = "<group>"; };
 		3F62A2E59B78CDFB8AF24E21E1CC74CE /* ConstraintView+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ConstraintView+Extensions.swift"; path = "Source/ConstraintView+Extensions.swift"; sourceTree = "<group>"; };
 		3F62A2E59B78CDFB8AF24E21E1CC74CE /* ConstraintView+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ConstraintView+Extensions.swift"; path = "Source/ConstraintView+Extensions.swift"; sourceTree = "<group>"; };
-		3F7337B7DD57C1E45B183FF4ACA44F91 /* enc_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; name = enc_sse2.c; path = src/dsp/enc_sse2.c; sourceTree = "<group>"; };
+		3F7337B7DD57C1E45B183FF4ACA44F91 /* enc_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = enc_sse2.c; path = src/dsp/enc_sse2.c; sourceTree = "<group>"; };
 		3FD45A76700AA1E923B17E2E73AFD0A1 /* Toast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Toast.swift; path = Toast/Toast.swift; sourceTree = "<group>"; };
 		3FD45A76700AA1E923B17E2E73AFD0A1 /* Toast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Toast.swift; path = Toast/Toast.swift; sourceTree = "<group>"; };
-		419F10004338593623C8FFB62E14D540 /* analysis_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = analysis_enc.c; path = src/enc/analysis_enc.c; sourceTree = "<group>"; };
+		419F10004338593623C8FFB62E14D540 /* analysis_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = analysis_enc.c; path = src/enc/analysis_enc.c; sourceTree = "<group>"; };
 		42150849455DEFED1356F578067008E2 /* ConstraintInsets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintInsets.swift; path = Source/ConstraintInsets.swift; sourceTree = "<group>"; };
 		42150849455DEFED1356F578067008E2 /* ConstraintInsets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintInsets.swift; path = Source/ConstraintInsets.swift; sourceTree = "<group>"; };
-		4233612145BDB7326C069BC833EC9E9A /* alpha_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = alpha_enc.c; path = src/enc/alpha_enc.c; sourceTree = "<group>"; };
+		4233612145BDB7326C069BC833EC9E9A /* alpha_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = alpha_enc.c; path = src/enc/alpha_enc.c; sourceTree = "<group>"; };
 		42E41F6780C59A8F1A44BDA7E2F46D68 /* dsp.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = dsp.h; path = src/dsp/dsp.h; sourceTree = "<group>"; };
 		42E41F6780C59A8F1A44BDA7E2F46D68 /* dsp.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = dsp.h; path = src/dsp/dsp.h; sourceTree = "<group>"; };
 		42E55C8880ACDBA504F8D9323A30DA6E /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = "<group>"; };
 		42E55C8880ACDBA504F8D9323A30DA6E /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = "<group>"; };
-		42F2DBC89C1E86B4ADC051732D22FA2C /* yuv_mips32.c */ = {isa = PBXFileReference; includeInIndex = 1; name = yuv_mips32.c; path = src/dsp/yuv_mips32.c; sourceTree = "<group>"; };
-		4377F14708F955645D0646534BB3832D /* webp_dec.c */ = {isa = PBXFileReference; includeInIndex = 1; name = webp_dec.c; path = src/dec/webp_dec.c; sourceTree = "<group>"; };
+		42F2DBC89C1E86B4ADC051732D22FA2C /* yuv_mips32.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = yuv_mips32.c; path = src/dsp/yuv_mips32.c; sourceTree = "<group>"; };
+		4377F14708F955645D0646534BB3832D /* webp_dec.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = webp_dec.c; path = src/dec/webp_dec.c; sourceTree = "<group>"; };
 		43E69CE4425FC37EFE92592089FFBF24 /* SnapKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SnapKit.release.xcconfig; sourceTree = "<group>"; };
 		43E69CE4425FC37EFE92592089FFBF24 /* SnapKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SnapKit.release.xcconfig; sourceTree = "<group>"; };
 		4459E1929C77DB0C8D99B482409EC5E5 /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = "<group>"; };
 		4459E1929C77DB0C8D99B482409EC5E5 /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = "<group>"; };
-		452B3E1D522F8B0F9ADA515FCCF3249D /* buffer_dec.c */ = {isa = PBXFileReference; includeInIndex = 1; name = buffer_dec.c; path = src/dec/buffer_dec.c; sourceTree = "<group>"; };
+		452B3E1D522F8B0F9ADA515FCCF3249D /* buffer_dec.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = buffer_dec.c; path = src/dec/buffer_dec.c; sourceTree = "<group>"; };
 		4591E5B72B1A6999B6C7347257FD177C /* NXFundation+Ext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "NXFundation+Ext.swift"; sourceTree = "<group>"; };
 		4591E5B72B1A6999B6C7347257FD177C /* NXFundation+Ext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "NXFundation+Ext.swift"; sourceTree = "<group>"; };
 		4630178810DCF26E5947357D25BC1999 /* ConstraintMakerPriortizable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerPriortizable.swift; path = Source/ConstraintMakerPriortizable.swift; sourceTree = "<group>"; };
 		4630178810DCF26E5947357D25BC1999 /* ConstraintMakerPriortizable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerPriortizable.swift; path = Source/ConstraintMakerPriortizable.swift; sourceTree = "<group>"; };
 		466D1EEB4D9C9A2015CE924DCF6B4D0F /* Pods-BFCommonKit_Tests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-BFCommonKit_Tests-Info.plist"; sourceTree = "<group>"; };
 		466D1EEB4D9C9A2015CE924DCF6B4D0F /* Pods-BFCommonKit_Tests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-BFCommonKit_Tests-Info.plist"; sourceTree = "<group>"; };
 		46BA3F7287CBE981D4D953C2919A48B3 /* Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Kingfisher.swift; path = Sources/General/Kingfisher.swift; sourceTree = "<group>"; };
 		46BA3F7287CBE981D4D953C2919A48B3 /* Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Kingfisher.swift; path = Sources/General/Kingfisher.swift; sourceTree = "<group>"; };
 		473B8BF9A0C0C4FECAE8497519355E92 /* Pods-BFCommonKit_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-BFCommonKit_Example.release.xcconfig"; sourceTree = "<group>"; };
 		473B8BF9A0C0C4FECAE8497519355E92 /* Pods-BFCommonKit_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-BFCommonKit_Example.release.xcconfig"; sourceTree = "<group>"; };
 		477C6C34595B96D987949FF373D5909B /* UIButton+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIButton+Kingfisher.swift"; path = "Sources/Extensions/UIButton+Kingfisher.swift"; sourceTree = "<group>"; };
 		477C6C34595B96D987949FF373D5909B /* UIButton+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIButton+Kingfisher.swift"; path = "Sources/Extensions/UIButton+Kingfisher.swift"; sourceTree = "<group>"; };
-		4822E958960CDEBD59E18312A3511144 /* upsampling.c */ = {isa = PBXFileReference; includeInIndex = 1; name = upsampling.c; path = src/dsp/upsampling.c; sourceTree = "<group>"; };
+		4822E958960CDEBD59E18312A3511144 /* upsampling.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = upsampling.c; path = src/dsp/upsampling.c; sourceTree = "<group>"; };
 		48744298DA792243FAA0B26A55B9DA12 /* ConstraintDirectionalInsets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDirectionalInsets.swift; path = Source/ConstraintDirectionalInsets.swift; sourceTree = "<group>"; };
 		48744298DA792243FAA0B26A55B9DA12 /* ConstraintDirectionalInsets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDirectionalInsets.swift; path = Source/ConstraintDirectionalInsets.swift; sourceTree = "<group>"; };
-		490574DE30BBA9094E09FA9309D6A4EB /* picture_csp_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = picture_csp_enc.c; path = src/enc/picture_csp_enc.c; sourceTree = "<group>"; };
+		490574DE30BBA9094E09FA9309D6A4EB /* picture_csp_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = picture_csp_enc.c; path = src/enc/picture_csp_enc.c; sourceTree = "<group>"; };
 		4993BD4F829FA57DB1F1CD88F94DEFBE /* SnapKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SnapKit.modulemap; sourceTree = "<group>"; };
 		4993BD4F829FA57DB1F1CD88F94DEFBE /* SnapKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SnapKit.modulemap; sourceTree = "<group>"; };
 		4A5188F91FC651F638FB3AB19A5659F2 /* KeychainAccess.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = KeychainAccess.release.xcconfig; sourceTree = "<group>"; };
 		4A5188F91FC651F638FB3AB19A5659F2 /* KeychainAccess.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = KeychainAccess.release.xcconfig; sourceTree = "<group>"; };
 		4A663BAD27B366D114FBCC7D8661D1A6 /* PQPHAssetVideoParaseUtil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQPHAssetVideoParaseUtil.swift; sourceTree = "<group>"; };
 		4A663BAD27B366D114FBCC7D8661D1A6 /* PQPHAssetVideoParaseUtil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQPHAssetVideoParaseUtil.swift; sourceTree = "<group>"; };
 		4B260C9C0A700770669176B01EAF941C /* Indicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Indicator.swift; path = Sources/Views/Indicator.swift; sourceTree = "<group>"; };
 		4B260C9C0A700770669176B01EAF941C /* Indicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Indicator.swift; path = Sources/Views/Indicator.swift; sourceTree = "<group>"; };
 		4B4354D72C0199C63AEA0E0528BB14BE /* NXFileManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NXFileManager.swift; sourceTree = "<group>"; };
 		4B4354D72C0199C63AEA0E0528BB14BE /* NXFileManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NXFileManager.swift; sourceTree = "<group>"; };
-		4B5BDD8458FBA460C3678D04CA69DC99 /* iterator_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = iterator_enc.c; path = src/enc/iterator_enc.c; sourceTree = "<group>"; };
-		4BBECC1911EE702B97BF6894F18F369B /* vp8l_dec.c */ = {isa = PBXFileReference; includeInIndex = 1; name = vp8l_dec.c; path = src/dec/vp8l_dec.c; sourceTree = "<group>"; };
+		4B5BDD8458FBA460C3678D04CA69DC99 /* iterator_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = iterator_enc.c; path = src/enc/iterator_enc.c; sourceTree = "<group>"; };
+		4BBECC1911EE702B97BF6894F18F369B /* vp8l_dec.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = vp8l_dec.c; path = src/dec/vp8l_dec.c; sourceTree = "<group>"; };
 		4C869D5230E71D86A91C11A2353810AC /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = "<group>"; };
 		4C869D5230E71D86A91C11A2353810AC /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = "<group>"; };
 		4D45108AE1FD02A97C3C12807CE04273 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
 		4D45108AE1FD02A97C3C12807CE04273 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
-		4DBDDCD3BB9F1A42CAB3FDE9160F7D2C /* random_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; name = random_utils.c; path = src/utils/random_utils.c; sourceTree = "<group>"; };
+		4DBDDCD3BB9F1A42CAB3FDE9160F7D2C /* random_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = random_utils.c; path = src/utils/random_utils.c; sourceTree = "<group>"; };
 		4FBBB58770C3EE344814BE26ED4710D2 /* KingfisherWebP-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "KingfisherWebP-Info.plist"; sourceTree = "<group>"; };
 		4FBBB58770C3EE344814BE26ED4710D2 /* KingfisherWebP-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "KingfisherWebP-Info.plist"; sourceTree = "<group>"; };
-		50D0C7CFFCF7A7E2ACA5BC3D463E120E /* config_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = config_enc.c; path = src/enc/config_enc.c; sourceTree = "<group>"; };
+		50D0C7CFFCF7A7E2ACA5BC3D463E120E /* config_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = config_enc.c; path = src/enc/config_enc.c; sourceTree = "<group>"; };
 		51F3A404066D06E662FD1EA5FA6AB6EC /* UINavigationController+FDFullscreenPopGesture.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UINavigationController+FDFullscreenPopGesture.m"; path = "FDFullscreenPopGesture/UINavigationController+FDFullscreenPopGesture.m"; sourceTree = "<group>"; };
 		51F3A404066D06E662FD1EA5FA6AB6EC /* UINavigationController+FDFullscreenPopGesture.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UINavigationController+FDFullscreenPopGesture.m"; path = "FDFullscreenPopGesture/UINavigationController+FDFullscreenPopGesture.m"; sourceTree = "<group>"; };
-		52068D6F1A61F6773F770D9474FDFE46 /* picture_psnr_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = picture_psnr_enc.c; path = src/enc/picture_psnr_enc.c; sourceTree = "<group>"; };
+		52068D6F1A61F6773F770D9474FDFE46 /* picture_psnr_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = picture_psnr_enc.c; path = src/enc/picture_psnr_enc.c; sourceTree = "<group>"; };
 		52768FDFE19C089F63CB5F2A7CCAD4FA /* Pods-BFCommonKit_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-BFCommonKit_Example-umbrella.h"; sourceTree = "<group>"; };
 		52768FDFE19C089F63CB5F2A7CCAD4FA /* Pods-BFCommonKit_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-BFCommonKit_Example-umbrella.h"; sourceTree = "<group>"; };
-		5290ADEA2A65A2391FD44220682660A7 /* alpha_processing_sse41.c */ = {isa = PBXFileReference; includeInIndex = 1; name = alpha_processing_sse41.c; path = src/dsp/alpha_processing_sse41.c; sourceTree = "<group>"; };
+		5290ADEA2A65A2391FD44220682660A7 /* alpha_processing_sse41.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = alpha_processing_sse41.c; path = src/dsp/alpha_processing_sse41.c; sourceTree = "<group>"; };
 		52DF92F5EBD4354CDAFC28BBC2FF6DC3 /* encode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = encode.h; path = src/webp/encode.h; sourceTree = "<group>"; };
 		52DF92F5EBD4354CDAFC28BBC2FF6DC3 /* encode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = encode.h; path = src/webp/encode.h; sourceTree = "<group>"; };
 		5316053FCFB02763FA8A102914B6472F /* lossless.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = lossless.h; path = src/dsp/lossless.h; sourceTree = "<group>"; };
 		5316053FCFB02763FA8A102914B6472F /* lossless.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = lossless.h; path = src/dsp/lossless.h; sourceTree = "<group>"; };
 		54FB80DF8638A25FC4D2AF0ED8B53BC8 /* Notifications.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Notifications.swift; path = Source/Notifications.swift; sourceTree = "<group>"; };
 		54FB80DF8638A25FC4D2AF0ED8B53BC8 /* Notifications.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Notifications.swift; path = Source/Notifications.swift; sourceTree = "<group>"; };
@@ -679,26 +662,24 @@
 		58DE899647FA2769148FCB4467419CC3 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Sources/Utility/Result.swift; sourceTree = "<group>"; };
 		58DE899647FA2769148FCB4467419CC3 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Sources/Utility/Result.swift; sourceTree = "<group>"; };
 		5923C49FB1BCF8AF6D87F9B059D7D246 /* Toast-Swift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-Swift-prefix.pch"; sourceTree = "<group>"; };
 		5923C49FB1BCF8AF6D87F9B059D7D246 /* Toast-Swift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-Swift-prefix.pch"; sourceTree = "<group>"; };
 		59ECB1326213851F41C0F7919BE3B5F1 /* CacheSerializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CacheSerializer.swift; path = Sources/Cache/CacheSerializer.swift; sourceTree = "<group>"; };
 		59ECB1326213851F41C0F7919BE3B5F1 /* CacheSerializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CacheSerializer.swift; path = Sources/Cache/CacheSerializer.swift; sourceTree = "<group>"; };
-		5B25F54666FFD53D68FF7788740EC207 /* token_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = token_enc.c; path = src/enc/token_enc.c; sourceTree = "<group>"; };
-		5B46F9C1E5238BDBC3A3B5912DEA207F /* filters_msa.c */ = {isa = PBXFileReference; includeInIndex = 1; name = filters_msa.c; path = src/dsp/filters_msa.c; sourceTree = "<group>"; };
-		5B88AC9F4D87D5B660D3F0DAE4381E4E /* syntax_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = syntax_enc.c; path = src/enc/syntax_enc.c; sourceTree = "<group>"; };
+		5B25F54666FFD53D68FF7788740EC207 /* token_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = token_enc.c; path = src/enc/token_enc.c; sourceTree = "<group>"; };
+		5B46F9C1E5238BDBC3A3B5912DEA207F /* filters_msa.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = filters_msa.c; path = src/dsp/filters_msa.c; sourceTree = "<group>"; };
+		5B88AC9F4D87D5B660D3F0DAE4381E4E /* syntax_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = syntax_enc.c; path = src/enc/syntax_enc.c; sourceTree = "<group>"; };
 		5C133822557573F3C4990EEAF7B52F32 /* mux.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = mux.h; path = src/webp/mux.h; sourceTree = "<group>"; };
 		5C133822557573F3C4990EEAF7B52F32 /* mux.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = mux.h; path = src/webp/mux.h; sourceTree = "<group>"; };
 		5C7264DA9C882E0865EB695ACFBD2994 /* FDFullscreenPopGesture-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FDFullscreenPopGesture-umbrella.h"; sourceTree = "<group>"; };
 		5C7264DA9C882E0865EB695ACFBD2994 /* FDFullscreenPopGesture-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FDFullscreenPopGesture-umbrella.h"; sourceTree = "<group>"; };
-		5CAF8C3309ABB43F473CDD6773F20424 /* rescaler_mips32.c */ = {isa = PBXFileReference; includeInIndex = 1; name = rescaler_mips32.c; path = src/dsp/rescaler_mips32.c; sourceTree = "<group>"; };
-		5CB2612C73EC7A3FA03CE2548321480F /* yuv_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; name = yuv_sse2.c; path = src/dsp/yuv_sse2.c; sourceTree = "<group>"; };
-		5CB5DB9820955BB833895EB80A80B92D /* NXBubbleLayer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NXBubbleLayer.swift; sourceTree = "<group>"; };
-		5D797E9A5C5782CE845840781FA1CC81 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Alamofire.framework; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		5CAF8C3309ABB43F473CDD6773F20424 /* rescaler_mips32.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = rescaler_mips32.c; path = src/dsp/rescaler_mips32.c; sourceTree = "<group>"; };
+		5CB2612C73EC7A3FA03CE2548321480F /* yuv_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = yuv_sse2.c; path = src/dsp/yuv_sse2.c; sourceTree = "<group>"; };
+		5D797E9A5C5782CE845840781FA1CC81 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		5E1234C3040AAA5AFB62B03F41417FC0 /* NXLoggerVC.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NXLoggerVC.swift; sourceTree = "<group>"; };
 		5E1234C3040AAA5AFB62B03F41417FC0 /* NXLoggerVC.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NXLoggerVC.swift; sourceTree = "<group>"; };
-		5E4674603A5D5B9215FFA0F8E69F8B71 /* libwebp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = libwebp.framework; path = libwebp.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		5E4674603A5D5B9215FFA0F8E69F8B71 /* libwebp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = libwebp.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		5E467FB8A2B2F21FE7E1B0FCE52D7DA5 /* FDFullscreenPopGesture-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FDFullscreenPopGesture-dummy.m"; sourceTree = "<group>"; };
 		5E467FB8A2B2F21FE7E1B0FCE52D7DA5 /* FDFullscreenPopGesture-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FDFullscreenPopGesture-dummy.m"; sourceTree = "<group>"; };
-		5EE9B9B4ADC4E1057D411B22D69B8D11 /* NXUIColor+Ext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "NXUIColor+Ext.swift"; sourceTree = "<group>"; };
 		5F0C87F2F3A01A6D1F5E2F7235E94EF7 /* PQCreateEmptyWAV.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQCreateEmptyWAV.swift; sourceTree = "<group>"; };
 		5F0C87F2F3A01A6D1F5E2F7235E94EF7 /* PQCreateEmptyWAV.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQCreateEmptyWAV.swift; sourceTree = "<group>"; };
-		5FAAD96EBF51CE69B6E4C358E8FFF028 /* near_lossless_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = near_lossless_enc.c; path = src/enc/near_lossless_enc.c; sourceTree = "<group>"; };
+		5FAAD96EBF51CE69B6E4C358E8FFF028 /* near_lossless_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = near_lossless_enc.c; path = src/enc/near_lossless_enc.c; sourceTree = "<group>"; };
 		5FEFFB0DD69342CBD356028A3F018E7A /* vp8i_dec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = vp8i_dec.h; path = src/dec/vp8i_dec.h; sourceTree = "<group>"; };
 		5FEFFB0DD69342CBD356028A3F018E7A /* vp8i_dec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = vp8i_dec.h; path = src/dec/vp8i_dec.h; sourceTree = "<group>"; };
 		6185F4EFAA7051D762CC0BD6E725BE49 /* ImageModifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageModifier.swift; path = Sources/Networking/ImageModifier.swift; sourceTree = "<group>"; };
 		6185F4EFAA7051D762CC0BD6E725BE49 /* ImageModifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageModifier.swift; path = Sources/Networking/ImageModifier.swift; sourceTree = "<group>"; };
 		624D7ACD9DFF04AC2A0230F56F49AFEB /* Kingfisher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Kingfisher.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		624D7ACD9DFF04AC2A0230F56F49AFEB /* Kingfisher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Kingfisher.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-		627E8A164F35A59446A7B20AA0653AC3 /* anim_decode.c */ = {isa = PBXFileReference; includeInIndex = 1; name = anim_decode.c; path = src/demux/anim_decode.c; sourceTree = "<group>"; };
-		634763B09B7499D412F9C30643299C1A /* enc_mips32.c */ = {isa = PBXFileReference; includeInIndex = 1; name = enc_mips32.c; path = src/dsp/enc_mips32.c; sourceTree = "<group>"; };
+		627E8A164F35A59446A7B20AA0653AC3 /* anim_decode.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = anim_decode.c; path = src/demux/anim_decode.c; sourceTree = "<group>"; };
+		634763B09B7499D412F9C30643299C1A /* enc_mips32.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = enc_mips32.c; path = src/dsp/enc_mips32.c; sourceTree = "<group>"; };
 		6350F8DC39B6A8B84C883A64506BCC60 /* AuthenticationChallengeResponsable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AuthenticationChallengeResponsable.swift; path = Sources/Networking/AuthenticationChallengeResponsable.swift; sourceTree = "<group>"; };
 		6350F8DC39B6A8B84C883A64506BCC60 /* AuthenticationChallengeResponsable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AuthenticationChallengeResponsable.swift; path = Sources/Networking/AuthenticationChallengeResponsable.swift; sourceTree = "<group>"; };
 		635409611EEB8AAFA083B1B0F606FFA1 /* KingfisherWebP-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KingfisherWebP-umbrella.h"; sourceTree = "<group>"; };
 		635409611EEB8AAFA083B1B0F606FFA1 /* KingfisherWebP-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KingfisherWebP-umbrella.h"; sourceTree = "<group>"; };
 		636FFA124511A92A6E475F99CB18E5AB /* libwebp.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = libwebp.modulemap; sourceTree = "<group>"; };
 		636FFA124511A92A6E475F99CB18E5AB /* libwebp.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = libwebp.modulemap; sourceTree = "<group>"; };
@@ -711,20 +692,20 @@
 		673C07BD3E74EA714FB0A8F493A2EA1A /* PQBaseModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQBaseModel.swift; sourceTree = "<group>"; };
 		673C07BD3E74EA714FB0A8F493A2EA1A /* PQBaseModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQBaseModel.swift; sourceTree = "<group>"; };
 		67D93330147AE8D9BB05E2E543DE47DF /* Alamofire.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.debug.xcconfig; sourceTree = "<group>"; };
 		67D93330147AE8D9BB05E2E543DE47DF /* Alamofire.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.debug.xcconfig; sourceTree = "<group>"; };
 		67FDCC809072812E15AD5B65D24ACDBE /* ConstraintView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintView.swift; path = Source/ConstraintView.swift; sourceTree = "<group>"; };
 		67FDCC809072812E15AD5B65D24ACDBE /* ConstraintView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintView.swift; path = Source/ConstraintView.swift; sourceTree = "<group>"; };
-		6998EBC4C4C88113916F0EBA59CB7D70 /* yuv.c */ = {isa = PBXFileReference; includeInIndex = 1; name = yuv.c; path = src/dsp/yuv.c; sourceTree = "<group>"; };
+		6998EBC4C4C88113916F0EBA59CB7D70 /* yuv.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = yuv.c; path = src/dsp/yuv.c; sourceTree = "<group>"; };
 		6A68B18323BB1FBE83B875F4BCFB7F6F /* ConstraintPriorityTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintPriorityTarget.swift; path = Source/ConstraintPriorityTarget.swift; sourceTree = "<group>"; };
 		6A68B18323BB1FBE83B875F4BCFB7F6F /* ConstraintPriorityTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintPriorityTarget.swift; path = Source/ConstraintPriorityTarget.swift; sourceTree = "<group>"; };
-		6A88BCA4B7A3998846787E779A88471C /* muxread.c */ = {isa = PBXFileReference; includeInIndex = 1; name = muxread.c; path = src/mux/muxread.c; sourceTree = "<group>"; };
-		6B4814B4FE07621FFC9AAEEB64C7884A /* upsampling_msa.c */ = {isa = PBXFileReference; includeInIndex = 1; name = upsampling_msa.c; path = src/dsp/upsampling_msa.c; sourceTree = "<group>"; };
+		6A88BCA4B7A3998846787E779A88471C /* muxread.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = muxread.c; path = src/mux/muxread.c; sourceTree = "<group>"; };
+		6B4814B4FE07621FFC9AAEEB64C7884A /* upsampling_msa.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = upsampling_msa.c; path = src/dsp/upsampling_msa.c; sourceTree = "<group>"; };
 		6B680B7C57D08DC7760361D1144EC092 /* common_sse2.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = common_sse2.h; path = src/dsp/common_sse2.h; sourceTree = "<group>"; };
 		6B680B7C57D08DC7760361D1144EC092 /* common_sse2.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = common_sse2.h; path = src/dsp/common_sse2.h; sourceTree = "<group>"; };
 		6BCFB4FC07A839C1491A7D6E3B569D17 /* UIControl+NXCategory.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "UIControl+NXCategory.h"; sourceTree = "<group>"; };
 		6BCFB4FC07A839C1491A7D6E3B569D17 /* UIControl+NXCategory.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "UIControl+NXCategory.h"; sourceTree = "<group>"; };
 		6C01FEB2B5994C82E37EC0FEEDF25DD9 /* PQBaseWebViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQBaseWebViewController.swift; sourceTree = "<group>"; };
 		6C01FEB2B5994C82E37EC0FEEDF25DD9 /* PQBaseWebViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQBaseWebViewController.swift; sourceTree = "<group>"; };
 		6C2043D3195A491E181D7AC42D70E59F /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = "<group>"; };
 		6C2043D3195A491E181D7AC42D70E59F /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = "<group>"; };
 		6C579C176D5BCEB5A10989C70D71DA6E /* endian_inl_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = endian_inl_utils.h; path = src/utils/endian_inl_utils.h; sourceTree = "<group>"; };
 		6C579C176D5BCEB5A10989C70D71DA6E /* endian_inl_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = endian_inl_utils.h; path = src/utils/endian_inl_utils.h; sourceTree = "<group>"; };
 		6D4F220D3E0DF7A705E3E338E019E4C2 /* Kingfisher-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Kingfisher-dummy.m"; sourceTree = "<group>"; };
 		6D4F220D3E0DF7A705E3E338E019E4C2 /* Kingfisher-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Kingfisher-dummy.m"; sourceTree = "<group>"; };
-		6D63D6580564D22697EA6289B28CC1B4 /* muxinternal.c */ = {isa = PBXFileReference; includeInIndex = 1; name = muxinternal.c; path = src/mux/muxinternal.c; sourceTree = "<group>"; };
+		6D63D6580564D22697EA6289B28CC1B4 /* muxinternal.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = muxinternal.c; path = src/mux/muxinternal.c; sourceTree = "<group>"; };
 		6D8914A94D91CDFD8C337F598A6C1A27 /* UIControl+NXCategory.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "UIControl+NXCategory.m"; sourceTree = "<group>"; };
 		6D8914A94D91CDFD8C337F598A6C1A27 /* UIControl+NXCategory.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "UIControl+NXCategory.m"; sourceTree = "<group>"; };
-		6EA4860949F06572594B85EDBA84AFE3 /* alpha_processing_mips_dsp_r2.c */ = {isa = PBXFileReference; includeInIndex = 1; name = alpha_processing_mips_dsp_r2.c; path = src/dsp/alpha_processing_mips_dsp_r2.c; sourceTree = "<group>"; };
-		6F4C3081D9C525DBD07F3D5B93A4E53B /* cost_neon.c */ = {isa = PBXFileReference; includeInIndex = 1; name = cost_neon.c; path = src/dsp/cost_neon.c; sourceTree = "<group>"; };
+		6EA4860949F06572594B85EDBA84AFE3 /* alpha_processing_mips_dsp_r2.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = alpha_processing_mips_dsp_r2.c; path = src/dsp/alpha_processing_mips_dsp_r2.c; sourceTree = "<group>"; };
+		6F4C3081D9C525DBD07F3D5B93A4E53B /* cost_neon.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = cost_neon.c; path = src/dsp/cost_neon.c; sourceTree = "<group>"; };
 		71DA2416604A781ADF8C84247CE0D533 /* Pods-BFCommonKit_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-BFCommonKit_Example.debug.xcconfig"; sourceTree = "<group>"; };
 		71DA2416604A781ADF8C84247CE0D533 /* Pods-BFCommonKit_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-BFCommonKit_Example.debug.xcconfig"; sourceTree = "<group>"; };
 		7384C5F5ACA01C2032D645478E4405F6 /* BFCommonKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = BFCommonKit.modulemap; sourceTree = "<group>"; };
 		7384C5F5ACA01C2032D645478E4405F6 /* BFCommonKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = BFCommonKit.modulemap; sourceTree = "<group>"; };
 		74911E88E860C247D7D019A3BD17E344 /* KeychainAccess-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KeychainAccess-prefix.pch"; sourceTree = "<group>"; };
 		74911E88E860C247D7D019A3BD17E344 /* KeychainAccess-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KeychainAccess-prefix.pch"; sourceTree = "<group>"; };
@@ -735,15 +716,14 @@
 		79351304C923DC9C6A74560057133798 /* ConstraintInsetTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintInsetTarget.swift; path = Source/ConstraintInsetTarget.swift; sourceTree = "<group>"; };
 		79351304C923DC9C6A74560057133798 /* ConstraintInsetTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintInsetTarget.swift; path = Source/ConstraintInsetTarget.swift; sourceTree = "<group>"; };
 		7993E45EE7692F88703B4A1A91FA4F9D /* KeychainAccess-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KeychainAccess-umbrella.h"; sourceTree = "<group>"; };
 		7993E45EE7692F88703B4A1A91FA4F9D /* KeychainAccess-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KeychainAccess-umbrella.h"; sourceTree = "<group>"; };
 		79D21237F8008C74198FC59B497B99F4 /* FDFullscreenPopGesture-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "FDFullscreenPopGesture-Info.plist"; sourceTree = "<group>"; };
 		79D21237F8008C74198FC59B497B99F4 /* FDFullscreenPopGesture-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "FDFullscreenPopGesture-Info.plist"; sourceTree = "<group>"; };
-		7A072627D3F2089AF43ECD6EA869EA89 /* rescaler.c */ = {isa = PBXFileReference; includeInIndex = 1; name = rescaler.c; path = src/dsp/rescaler.c; sourceTree = "<group>"; };
+		7A072627D3F2089AF43ECD6EA869EA89 /* rescaler.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = rescaler.c; path = src/dsp/rescaler.c; sourceTree = "<group>"; };
 		7A32EF432CA0FD5D446BF79ACF145E9E /* UINavigationController+FDFullscreenPopGesture.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UINavigationController+FDFullscreenPopGesture.h"; path = "FDFullscreenPopGesture/UINavigationController+FDFullscreenPopGesture.h"; sourceTree = "<group>"; };
 		7A32EF432CA0FD5D446BF79ACF145E9E /* UINavigationController+FDFullscreenPopGesture.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UINavigationController+FDFullscreenPopGesture.h"; path = "FDFullscreenPopGesture/UINavigationController+FDFullscreenPopGesture.h"; sourceTree = "<group>"; };
-		7AB78267AE3899B4F6D416A2D1EE7DE8 /* rescaler_mips_dsp_r2.c */ = {isa = PBXFileReference; includeInIndex = 1; name = rescaler_mips_dsp_r2.c; path = src/dsp/rescaler_mips_dsp_r2.c; sourceTree = "<group>"; };
+		7AB78267AE3899B4F6D416A2D1EE7DE8 /* rescaler_mips_dsp_r2.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = rescaler_mips_dsp_r2.c; path = src/dsp/rescaler_mips_dsp_r2.c; sourceTree = "<group>"; };
 		7AE52C4497A5BBAE36B95A4FDC3559C0 /* Typealiases.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Typealiases.swift; path = Source/Typealiases.swift; sourceTree = "<group>"; };
 		7AE52C4497A5BBAE36B95A4FDC3559C0 /* Typealiases.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Typealiases.swift; path = Source/Typealiases.swift; sourceTree = "<group>"; };
 		7D49A8224C7BF67BE84A75DACDA0EBB2 /* WebPProcessor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WebPProcessor.swift; path = Sources/WebPProcessor.swift; sourceTree = "<group>"; };
 		7D49A8224C7BF67BE84A75DACDA0EBB2 /* WebPProcessor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WebPProcessor.swift; path = Sources/WebPProcessor.swift; sourceTree = "<group>"; };
-		7D53DF0520CD7D1F96C796256E6A1846 /* dec_msa.c */ = {isa = PBXFileReference; includeInIndex = 1; name = dec_msa.c; path = src/dsp/dec_msa.c; sourceTree = "<group>"; };
-		7E7238F3B7316616AD4F664622C182B9 /* lossless_enc_mips32.c */ = {isa = PBXFileReference; includeInIndex = 1; name = lossless_enc_mips32.c; path = src/dsp/lossless_enc_mips32.c; sourceTree = "<group>"; };
+		7D53DF0520CD7D1F96C796256E6A1846 /* dec_msa.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = dec_msa.c; path = src/dsp/dec_msa.c; sourceTree = "<group>"; };
+		7E7238F3B7316616AD4F664622C182B9 /* lossless_enc_mips32.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = lossless_enc_mips32.c; path = src/dsp/lossless_enc_mips32.c; sourceTree = "<group>"; };
 		7EBBD7360531B2A79E9CA7345B9BBF44 /* PQLZStringUtil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQLZStringUtil.swift; sourceTree = "<group>"; };
 		7EBBD7360531B2A79E9CA7345B9BBF44 /* PQLZStringUtil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQLZStringUtil.swift; sourceTree = "<group>"; };
-		8052B6036E8C91AEA308258D0EF5C23B /* NXContainView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NXContainView.swift; sourceTree = "<group>"; };
 		806716CEC3415304E47A0519426A38CA /* common_dec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = common_dec.h; path = src/dec/common_dec.h; sourceTree = "<group>"; };
 		806716CEC3415304E47A0519426A38CA /* common_dec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = common_dec.h; path = src/dec/common_dec.h; sourceTree = "<group>"; };
 		80B8D81E637FCF58C60C327B5DEEF13C /* GIFAnimatedImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GIFAnimatedImage.swift; path = Sources/Image/GIFAnimatedImage.swift; sourceTree = "<group>"; };
 		80B8D81E637FCF58C60C327B5DEEF13C /* GIFAnimatedImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GIFAnimatedImage.swift; path = Sources/Image/GIFAnimatedImage.swift; sourceTree = "<group>"; };
 		80BFB5CE4AD3B893CF871E00C466E469 /* FDFullscreenPopGesture-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FDFullscreenPopGesture-prefix.pch"; sourceTree = "<group>"; };
 		80BFB5CE4AD3B893CF871E00C466E469 /* FDFullscreenPopGesture-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FDFullscreenPopGesture-prefix.pch"; sourceTree = "<group>"; };
@@ -754,79 +734,76 @@
 		829EE17310CAB9BF834665C397F16B69 /* AFError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AFError.swift; path = Source/AFError.swift; sourceTree = "<group>"; };
 		829EE17310CAB9BF834665C397F16B69 /* AFError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AFError.swift; path = Source/AFError.swift; sourceTree = "<group>"; };
 		82B2D8220A391607BF497EF0CB4C0486 /* neon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = neon.h; path = src/dsp/neon.h; sourceTree = "<group>"; };
 		82B2D8220A391607BF497EF0CB4C0486 /* neon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = neon.h; path = src/dsp/neon.h; sourceTree = "<group>"; };
 		82F2E5F15605A1BDC3A77A8FDFDD5702 /* demux.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = demux.h; path = src/webp/demux.h; sourceTree = "<group>"; };
 		82F2E5F15605A1BDC3A77A8FDFDD5702 /* demux.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = demux.h; path = src/webp/demux.h; sourceTree = "<group>"; };
-		8363025F75273B2690E0073B137AE4CC /* cost.c */ = {isa = PBXFileReference; includeInIndex = 1; name = cost.c; path = src/dsp/cost.c; sourceTree = "<group>"; };
+		8363025F75273B2690E0073B137AE4CC /* cost.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = cost.c; path = src/dsp/cost.c; sourceTree = "<group>"; };
 		837043F4CE7B733D1AA143486B263C41 /* BFCommonKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = BFCommonKit.release.xcconfig; sourceTree = "<group>"; };
 		837043F4CE7B733D1AA143486B263C41 /* BFCommonKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = BFCommonKit.release.xcconfig; sourceTree = "<group>"; };
 		83BE7EC954E17F17E80B5F7328E9578B /* Box.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Box.swift; path = Sources/Utility/Box.swift; sourceTree = "<group>"; };
 		83BE7EC954E17F17E80B5F7328E9578B /* Box.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Box.swift; path = Sources/Utility/Box.swift; sourceTree = "<group>"; };
 		8419D5E0586551DFFA79FF3C32FB4C00 /* quant_levels_dec_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = quant_levels_dec_utils.h; path = src/utils/quant_levels_dec_utils.h; sourceTree = "<group>"; };
 		8419D5E0586551DFFA79FF3C32FB4C00 /* quant_levels_dec_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = quant_levels_dec_utils.h; path = src/utils/quant_levels_dec_utils.h; sourceTree = "<group>"; };
-		85D03BEC2CA9B2DB28398618379E7744 /* FDFullscreenPopGesture.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FDFullscreenPopGesture.framework; path = FDFullscreenPopGesture.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		85D03BEC2CA9B2DB28398618379E7744 /* FDFullscreenPopGesture.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FDFullscreenPopGesture.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		865855CB28F2F8200F5AFE03F1CCEC99 /* Pods-BFCommonKit_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-BFCommonKit_Tests.release.xcconfig"; sourceTree = "<group>"; };
 		865855CB28F2F8200F5AFE03F1CCEC99 /* Pods-BFCommonKit_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-BFCommonKit_Tests.release.xcconfig"; sourceTree = "<group>"; };
-		86714F820A64827796A86BDEB1B1BD8E /* bit_writer_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; name = bit_writer_utils.c; path = src/utils/bit_writer_utils.c; sourceTree = "<group>"; };
+		86714F820A64827796A86BDEB1B1BD8E /* bit_writer_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = bit_writer_utils.c; path = src/utils/bit_writer_utils.c; sourceTree = "<group>"; };
 		87EDDD12BF6BA1D0BA30B5DE088D189F /* KeychainAccess-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "KeychainAccess-Info.plist"; sourceTree = "<group>"; };
 		87EDDD12BF6BA1D0BA30B5DE088D189F /* KeychainAccess-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "KeychainAccess-Info.plist"; sourceTree = "<group>"; };
 		88FD77DE06D0C22DFE729C49E508A027 /* ConstraintPriority.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintPriority.swift; path = Source/ConstraintPriority.swift; sourceTree = "<group>"; };
 		88FD77DE06D0C22DFE729C49E508A027 /* ConstraintPriority.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintPriority.swift; path = Source/ConstraintPriority.swift; sourceTree = "<group>"; };
-		89BCA371B6CD42BCD13724CD709034E2 /* muxedit.c */ = {isa = PBXFileReference; includeInIndex = 1; name = muxedit.c; path = src/mux/muxedit.c; sourceTree = "<group>"; };
+		89BCA371B6CD42BCD13724CD709034E2 /* muxedit.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = muxedit.c; path = src/mux/muxedit.c; sourceTree = "<group>"; };
 		89DB98D231E8A154C420112247FBD123 /* Pods-BFCommonKit_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-BFCommonKit_Example-dummy.m"; sourceTree = "<group>"; };
 		89DB98D231E8A154C420112247FBD123 /* Pods-BFCommonKit_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-BFCommonKit_Example-dummy.m"; sourceTree = "<group>"; };
 		8A362C228552C4FE829431453579AE2E /* muxi.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = muxi.h; path = src/mux/muxi.h; sourceTree = "<group>"; };
 		8A362C228552C4FE829431453579AE2E /* muxi.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = muxi.h; path = src/mux/muxi.h; sourceTree = "<group>"; };
-		8A38EBF913BC1EF385882EA1CBD411C8 /* lossless_mips_dsp_r2.c */ = {isa = PBXFileReference; includeInIndex = 1; name = lossless_mips_dsp_r2.c; path = src/dsp/lossless_mips_dsp_r2.c; sourceTree = "<group>"; };
-		8A5962A53FD61BA45D1F2B0C6D571057 /* quant_dec.c */ = {isa = PBXFileReference; includeInIndex = 1; name = quant_dec.c; path = src/dec/quant_dec.c; sourceTree = "<group>"; };
+		8A38EBF913BC1EF385882EA1CBD411C8 /* lossless_mips_dsp_r2.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = lossless_mips_dsp_r2.c; path = src/dsp/lossless_mips_dsp_r2.c; sourceTree = "<group>"; };
+		8A5962A53FD61BA45D1F2B0C6D571057 /* quant_dec.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = quant_dec.c; path = src/dec/quant_dec.c; sourceTree = "<group>"; };
 		8B1797E974628692230F493C6AF05525 /* types.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = types.h; path = src/webp/types.h; sourceTree = "<group>"; };
 		8B1797E974628692230F493C6AF05525 /* types.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = types.h; path = src/webp/types.h; sourceTree = "<group>"; };
 		8BD78168762166449530321182103D28 /* Toast-Swift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Toast-Swift-Info.plist"; sourceTree = "<group>"; };
 		8BD78168762166449530321182103D28 /* Toast-Swift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Toast-Swift-Info.plist"; sourceTree = "<group>"; };
 		8BEA6A77E1A4AE5ADEE3EB303B694CC8 /* SessionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDelegate.swift; path = Sources/Networking/SessionDelegate.swift; sourceTree = "<group>"; };
 		8BEA6A77E1A4AE5ADEE3EB303B694CC8 /* SessionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDelegate.swift; path = Sources/Networking/SessionDelegate.swift; sourceTree = "<group>"; };
 		8C14636BE41AF33D0AB1C194294AC524 /* ImageTransition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageTransition.swift; path = Sources/Image/ImageTransition.swift; sourceTree = "<group>"; };
 		8C14636BE41AF33D0AB1C194294AC524 /* ImageTransition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageTransition.swift; path = Sources/Image/ImageTransition.swift; sourceTree = "<group>"; };
-		8C7E4C8D11C98476585FD152FAA8D507 /* alpha_processing.c */ = {isa = PBXFileReference; includeInIndex = 1; name = alpha_processing.c; path = src/dsp/alpha_processing.c; sourceTree = "<group>"; };
+		8C7E4C8D11C98476585FD152FAA8D507 /* alpha_processing.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = alpha_processing.c; path = src/dsp/alpha_processing.c; sourceTree = "<group>"; };
 		8CA24F888E76227018FB111CB0AF6B29 /* lossless_common.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = lossless_common.h; path = src/dsp/lossless_common.h; sourceTree = "<group>"; };
 		8CA24F888E76227018FB111CB0AF6B29 /* lossless_common.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = lossless_common.h; path = src/dsp/lossless_common.h; sourceTree = "<group>"; };
-		8E6F7D5AAA20628D905389942B3B1714 /* yuv_mips_dsp_r2.c */ = {isa = PBXFileReference; includeInIndex = 1; name = yuv_mips_dsp_r2.c; path = src/dsp/yuv_mips_dsp_r2.c; sourceTree = "<group>"; };
+		8E6F7D5AAA20628D905389942B3B1714 /* yuv_mips_dsp_r2.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = yuv_mips_dsp_r2.c; path = src/dsp/yuv_mips_dsp_r2.c; sourceTree = "<group>"; };
 		8F93D1EE8E93C058737C563A9878BBAE /* Pods-BFCommonKit_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-BFCommonKit_Example-Info.plist"; sourceTree = "<group>"; };
 		8F93D1EE8E93C058737C563A9878BBAE /* Pods-BFCommonKit_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-BFCommonKit_Example-Info.plist"; sourceTree = "<group>"; };
 		922C8C198B5079E06CDAFCED9E7952C9 /* NSButton+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSButton+Kingfisher.swift"; path = "Sources/Extensions/NSButton+Kingfisher.swift"; sourceTree = "<group>"; };
 		922C8C198B5079E06CDAFCED9E7952C9 /* NSButton+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSButton+Kingfisher.swift"; path = "Sources/Extensions/NSButton+Kingfisher.swift"; sourceTree = "<group>"; };
 		949F021A70576256839F4150C1375CA4 /* RedirectHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RedirectHandler.swift; path = Sources/Networking/RedirectHandler.swift; sourceTree = "<group>"; };
 		949F021A70576256839F4150C1375CA4 /* RedirectHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RedirectHandler.swift; path = Sources/Networking/RedirectHandler.swift; sourceTree = "<group>"; };
-		94C52CCFFB12CA7F14C3F39991EB5A9E /* BFCommonKit.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = BFCommonKit.podspec; sourceTree = "<group>"; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
+		94C52CCFFB12CA7F14C3F39991EB5A9E /* BFCommonKit.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; path = BFCommonKit.podspec; sourceTree = "<group>"; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
 		959FC8AC1F8BBAF564F070310D0EF7BD /* Placeholder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Placeholder.swift; path = Sources/Image/Placeholder.swift; sourceTree = "<group>"; };
 		959FC8AC1F8BBAF564F070310D0EF7BD /* Placeholder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Placeholder.swift; path = Sources/Image/Placeholder.swift; sourceTree = "<group>"; };
 		95A120E0758D40C755B4FCA800808228 /* libwebp-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "libwebp-dummy.m"; sourceTree = "<group>"; };
 		95A120E0758D40C755B4FCA800808228 /* libwebp-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "libwebp-dummy.m"; sourceTree = "<group>"; };
 		963EF1814C4DB5825DAD003E5743AFB2 /* KingfisherWebP.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = KingfisherWebP.release.xcconfig; sourceTree = "<group>"; };
 		963EF1814C4DB5825DAD003E5743AFB2 /* KingfisherWebP.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = KingfisherWebP.release.xcconfig; sourceTree = "<group>"; };
 		9698521838352448FEC7A86C3CBA6245 /* huffman_encode_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = huffman_encode_utils.h; path = src/utils/huffman_encode_utils.h; sourceTree = "<group>"; };
 		9698521838352448FEC7A86C3CBA6245 /* huffman_encode_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = huffman_encode_utils.h; path = src/utils/huffman_encode_utils.h; sourceTree = "<group>"; };
 		97148DD3B4D45ED5ABC4BC5A4DD390CE /* PQFollowButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQFollowButton.swift; sourceTree = "<group>"; };
 		97148DD3B4D45ED5ABC4BC5A4DD390CE /* PQFollowButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQFollowButton.swift; sourceTree = "<group>"; };
-		979486118B3E90C08386079D57962701 /* SnapKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SnapKit.framework; path = SnapKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		979486118B3E90C08386079D57962701 /* SnapKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SnapKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		98441C01B0BFDAE854E81DAEB6AAA829 /* BFUIView+Ext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BFUIView+Ext.swift"; sourceTree = "<group>"; };
 		98441C01B0BFDAE854E81DAEB6AAA829 /* BFUIView+Ext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BFUIView+Ext.swift"; sourceTree = "<group>"; };
 		985E1DCD92DE20ACAF0A873F2CA5CD5A /* Source.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Source.swift; path = Sources/General/ImageSource/Source.swift; sourceTree = "<group>"; };
 		985E1DCD92DE20ACAF0A873F2CA5CD5A /* Source.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Source.swift; path = Sources/General/ImageSource/Source.swift; sourceTree = "<group>"; };
 		987E5E323106DEACE37229D2BD4E1A11 /* ImageDataProcessor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageDataProcessor.swift; path = Sources/Networking/ImageDataProcessor.swift; sourceTree = "<group>"; };
 		987E5E323106DEACE37229D2BD4E1A11 /* ImageDataProcessor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageDataProcessor.swift; path = Sources/Networking/ImageDataProcessor.swift; sourceTree = "<group>"; };
-		98EB380805F78E3D8C1D8F53DEF7FB83 /* backward_references_cost_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = backward_references_cost_enc.c; path = src/enc/backward_references_cost_enc.c; sourceTree = "<group>"; };
+		98EB380805F78E3D8C1D8F53DEF7FB83 /* backward_references_cost_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = backward_references_cost_enc.c; path = src/enc/backward_references_cost_enc.c; sourceTree = "<group>"; };
 		9946A90C4BD2B96E3E3FCD7F8907D22D /* huffman_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = huffman_utils.h; path = src/utils/huffman_utils.h; sourceTree = "<group>"; };
 		9946A90C4BD2B96E3E3FCD7F8907D22D /* huffman_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = huffman_utils.h; path = src/utils/huffman_utils.h; sourceTree = "<group>"; };
 		99521FEE666BCF0642ED992E0EB7B47E /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Alamofire.modulemap; sourceTree = "<group>"; };
 		99521FEE666BCF0642ED992E0EB7B47E /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Alamofire.modulemap; sourceTree = "<group>"; };
 		9A42283074C850BADC31E222B2047909 /* LayoutConstraint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LayoutConstraint.swift; path = Source/LayoutConstraint.swift; sourceTree = "<group>"; };
 		9A42283074C850BADC31E222B2047909 /* LayoutConstraint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LayoutConstraint.swift; path = Source/LayoutConstraint.swift; sourceTree = "<group>"; };
 		9BB3BFE6337BD0BEB88DF9C5AE9D02DB /* KingfisherWebP.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KingfisherWebP.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		9BB3BFE6337BD0BEB88DF9C5AE9D02DB /* KingfisherWebP.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KingfisherWebP.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		9C56358C6AB7957C81EB828E97CCA763 /* BFCommonKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "BFCommonKit-dummy.m"; sourceTree = "<group>"; };
 		9C56358C6AB7957C81EB828E97CCA763 /* BFCommonKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "BFCommonKit-dummy.m"; sourceTree = "<group>"; };
 		9CD0CBB4447866884C95EC515A835FDF /* BFCommonKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "BFCommonKit-umbrella.h"; sourceTree = "<group>"; };
 		9CD0CBB4447866884C95EC515A835FDF /* BFCommonKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "BFCommonKit-umbrella.h"; sourceTree = "<group>"; };
-		9D46E3281B6DFCFF07173A3FE2A0CC22 /* UIBarButtonItem+NXBadgeView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIBarButtonItem+NXBadgeView.swift"; sourceTree = "<group>"; };
 		9D52E7D66C311575011C9ED038BAD193 /* decode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = decode.h; path = src/webp/decode.h; sourceTree = "<group>"; };
 		9D52E7D66C311575011C9ED038BAD193 /* decode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = decode.h; path = src/webp/decode.h; sourceTree = "<group>"; };
-		9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
+		9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
 		9E297CF7E30C6CAB7E5D7AD2BDF3C0AB /* utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = utils.h; path = src/utils/utils.h; sourceTree = "<group>"; };
 		9E297CF7E30C6CAB7E5D7AD2BDF3C0AB /* utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = utils.h; path = src/utils/utils.h; sourceTree = "<group>"; };
-		9E4EA651FA5597212E350D91A1C106EA /* histogram_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = histogram_enc.c; path = src/enc/histogram_enc.c; sourceTree = "<group>"; };
+		9E4EA651FA5597212E350D91A1C106EA /* histogram_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = histogram_enc.c; path = src/enc/histogram_enc.c; sourceTree = "<group>"; };
 		9E632779DE312A06570449DC2A8F66D8 /* libwebp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = libwebp.release.xcconfig; sourceTree = "<group>"; };
 		9E632779DE312A06570449DC2A8F66D8 /* libwebp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = libwebp.release.xcconfig; sourceTree = "<group>"; };
-		9EA0384B58F8FC381EFCAA84B87BD4B8 /* dec_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; name = dec_sse2.c; path = src/dsp/dec_sse2.c; sourceTree = "<group>"; };
-		9EEA32C0629A73023CBFCAE6EC2172CF /* io_dec.c */ = {isa = PBXFileReference; includeInIndex = 1; name = io_dec.c; path = src/dec/io_dec.c; sourceTree = "<group>"; };
+		9EA0384B58F8FC381EFCAA84B87BD4B8 /* dec_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = dec_sse2.c; path = src/dsp/dec_sse2.c; sourceTree = "<group>"; };
+		9EEA32C0629A73023CBFCAE6EC2172CF /* io_dec.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = io_dec.c; path = src/dec/io_dec.c; sourceTree = "<group>"; };
 		9F4B212B6B42F27C5A176FD5B1BE36C7 /* format_constants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = format_constants.h; path = src/webp/format_constants.h; sourceTree = "<group>"; };
 		9F4B212B6B42F27C5A176FD5B1BE36C7 /* format_constants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = format_constants.h; path = src/webp/format_constants.h; sourceTree = "<group>"; };
 		9FD058C866A354018E4D88BBA10523F8 /* random_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = random_utils.h; path = src/utils/random_utils.h; sourceTree = "<group>"; };
 		9FD058C866A354018E4D88BBA10523F8 /* random_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = random_utils.h; path = src/utils/random_utils.h; sourceTree = "<group>"; };
 		9FDF55309BDBBE199BFD467FE1DE1F32 /* Pods-BFCommonKit_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-BFCommonKit_Tests.modulemap"; sourceTree = "<group>"; };
 		9FDF55309BDBBE199BFD467FE1DE1F32 /* Pods-BFCommonKit_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-BFCommonKit_Tests.modulemap"; sourceTree = "<group>"; };
 		A0D4D1F93C59AF2ACDEDEA5C1B89562C /* TVMonogramView+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "TVMonogramView+Kingfisher.swift"; path = "Sources/Extensions/TVMonogramView+Kingfisher.swift"; sourceTree = "<group>"; };
 		A0D4D1F93C59AF2ACDEDEA5C1B89562C /* TVMonogramView+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "TVMonogramView+Kingfisher.swift"; path = "Sources/Extensions/TVMonogramView+Kingfisher.swift"; sourceTree = "<group>"; };
 		A0E48CE9DCEDD76F6B4E04BBDDF98BE4 /* BFBundle+Ext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BFBundle+Ext.swift"; sourceTree = "<group>"; };
 		A0E48CE9DCEDD76F6B4E04BBDDF98BE4 /* BFBundle+Ext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BFBundle+Ext.swift"; sourceTree = "<group>"; };
-		A18E259465A6802D1475622F563ED0C2 /* cost_mips32.c */ = {isa = PBXFileReference; includeInIndex = 1; name = cost_mips32.c; path = src/dsp/cost_mips32.c; sourceTree = "<group>"; };
+		A18E259465A6802D1475622F563ED0C2 /* cost_mips32.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = cost_mips32.c; path = src/dsp/cost_mips32.c; sourceTree = "<group>"; };
 		A1926E2140C442379006B5003C960A27 /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = "<group>"; };
 		A1926E2140C442379006B5003C960A27 /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = "<group>"; };
 		A447EC9EA2E76B6D85609D0813F4F734 /* libwebp-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "libwebp-umbrella.h"; sourceTree = "<group>"; };
 		A447EC9EA2E76B6D85609D0813F4F734 /* libwebp-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "libwebp-umbrella.h"; sourceTree = "<group>"; };
 		A477A8E60512EF78B7A86E5A38252E89 /* Toast-Swift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Toast-Swift.release.xcconfig"; sourceTree = "<group>"; };
 		A477A8E60512EF78B7A86E5A38252E89 /* Toast-Swift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Toast-Swift.release.xcconfig"; sourceTree = "<group>"; };
-		A58A51D0C960E7D8699DB1B5E80DEAA0 /* huffman_encode_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; name = huffman_encode_utils.c; path = src/utils/huffman_encode_utils.c; sourceTree = "<group>"; };
+		A58A51D0C960E7D8699DB1B5E80DEAA0 /* huffman_encode_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = huffman_encode_utils.c; path = src/utils/huffman_encode_utils.c; sourceTree = "<group>"; };
 		A88A0448BFB7C0A9D32A79BF1627CC14 /* Kingfisher.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Kingfisher.release.xcconfig; sourceTree = "<group>"; };
 		A88A0448BFB7C0A9D32A79BF1627CC14 /* Kingfisher.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Kingfisher.release.xcconfig; sourceTree = "<group>"; };
-		A93F50324468F8CAC9DB0025AF9C0F3B /* NXInteractiveView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NXInteractiveView.swift; sourceTree = "<group>"; };
 		A9BA7A22AC662F52C1C2EC1AAE727F1B /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/AVFoundation.framework; sourceTree = DEVELOPER_DIR; };
 		A9BA7A22AC662F52C1C2EC1AAE727F1B /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/AVFoundation.framework; sourceTree = DEVELOPER_DIR; };
 		AA441EC2D48403C9380C37160F6B4485 /* ConstraintLayoutSupportDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutSupportDSL.swift; path = Source/ConstraintLayoutSupportDSL.swift; sourceTree = "<group>"; };
 		AA441EC2D48403C9380C37160F6B4485 /* ConstraintLayoutSupportDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutSupportDSL.swift; path = Source/ConstraintLayoutSupportDSL.swift; sourceTree = "<group>"; };
-		AAB924A6B5A3843BD917E0AC118C4E34 /* UITabBarItem+NXBadgeView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UITabBarItem+NXBadgeView.swift"; sourceTree = "<group>"; };
 		AB2E0CC7424DD1BBF93E4D97610A1CA3 /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = "<group>"; };
 		AB2E0CC7424DD1BBF93E4D97610A1CA3 /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = "<group>"; };
-		ABDA54B354E5381F4A9BBDF1BCD6D95A /* upsampling_neon.c */ = {isa = PBXFileReference; includeInIndex = 1; name = upsampling_neon.c; path = src/dsp/upsampling_neon.c; sourceTree = "<group>"; };
-		ABEA34DF78A2697287FDA5C44E5EC593 /* alpha_processing_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; name = alpha_processing_sse2.c; path = src/dsp/alpha_processing_sse2.c; sourceTree = "<group>"; };
+		ABDA54B354E5381F4A9BBDF1BCD6D95A /* upsampling_neon.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = upsampling_neon.c; path = src/dsp/upsampling_neon.c; sourceTree = "<group>"; };
+		ABEA34DF78A2697287FDA5C44E5EC593 /* alpha_processing_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = alpha_processing_sse2.c; path = src/dsp/alpha_processing_sse2.c; sourceTree = "<group>"; };
 		AC608D55C6A6C588A9B899258A51DDA8 /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkReachabilityManager.swift; path = Source/NetworkReachabilityManager.swift; sourceTree = "<group>"; };
 		AC608D55C6A6C588A9B899258A51DDA8 /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkReachabilityManager.swift; path = Source/NetworkReachabilityManager.swift; sourceTree = "<group>"; };
 		AE6C1F3CEA6035ACFD047D55DE2B7DF8 /* color_cache_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = color_cache_utils.h; path = src/utils/color_cache_utils.h; sourceTree = "<group>"; };
 		AE6C1F3CEA6035ACFD047D55DE2B7DF8 /* color_cache_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = color_cache_utils.h; path = src/utils/color_cache_utils.h; sourceTree = "<group>"; };
 		AF5C4C84A8010561CE6F6ACA79642069 /* BFColor+Ext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BFColor+Ext.swift"; sourceTree = "<group>"; };
 		AF5C4C84A8010561CE6F6ACA79642069 /* BFColor+Ext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BFColor+Ext.swift"; sourceTree = "<group>"; };
 		AF60EEAC121090B9A2331C9DD25A01BA /* Pods-BFCommonKit_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-BFCommonKit_Tests-dummy.m"; sourceTree = "<group>"; };
 		AF60EEAC121090B9A2331C9DD25A01BA /* Pods-BFCommonKit_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-BFCommonKit_Tests-dummy.m"; sourceTree = "<group>"; };
 		AF886E8B4A9A41F848EFFF38E7526338 /* SessionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDelegate.swift; path = Source/SessionDelegate.swift; sourceTree = "<group>"; };
 		AF886E8B4A9A41F848EFFF38E7526338 /* SessionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDelegate.swift; path = Source/SessionDelegate.swift; sourceTree = "<group>"; };
-		AFDF0803F6103934877C01B71FD5DD02 /* tree_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = tree_enc.c; path = src/enc/tree_enc.c; sourceTree = "<group>"; };
+		AFDF0803F6103934877C01B71FD5DD02 /* tree_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = tree_enc.c; path = src/enc/tree_enc.c; sourceTree = "<group>"; };
 		AFF4A2E8A54BDB22430CEB3BD6F2B75E /* MemoryStorage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MemoryStorage.swift; path = Sources/Cache/MemoryStorage.swift; sourceTree = "<group>"; };
 		AFF4A2E8A54BDB22430CEB3BD6F2B75E /* MemoryStorage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MemoryStorage.swift; path = Sources/Cache/MemoryStorage.swift; sourceTree = "<group>"; };
 		B05A73C532BC4BBE4E5D83B51433AB74 /* CallbackQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CallbackQueue.swift; path = Sources/Utility/CallbackQueue.swift; sourceTree = "<group>"; };
 		B05A73C532BC4BBE4E5D83B51433AB74 /* CallbackQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CallbackQueue.swift; path = Sources/Utility/CallbackQueue.swift; sourceTree = "<group>"; };
 		B0A5CDE26D8D04E6BCB74657D9DD1E89 /* Kingfisher-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Kingfisher-Info.plist"; sourceTree = "<group>"; };
 		B0A5CDE26D8D04E6BCB74657D9DD1E89 /* Kingfisher-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Kingfisher-Info.plist"; sourceTree = "<group>"; };
@@ -834,10 +811,10 @@
 		B1D899692CA7975B0FCAFAE2232F3F82 /* FormatIndicatedCacheSerializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FormatIndicatedCacheSerializer.swift; path = Sources/Cache/FormatIndicatedCacheSerializer.swift; sourceTree = "<group>"; };
 		B1D899692CA7975B0FCAFAE2232F3F82 /* FormatIndicatedCacheSerializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FormatIndicatedCacheSerializer.swift; path = Sources/Cache/FormatIndicatedCacheSerializer.swift; sourceTree = "<group>"; };
 		B2C63F38A6A6BB4F16C84ED6F9BBD5CA /* ImageFormat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageFormat.swift; path = Sources/Image/ImageFormat.swift; sourceTree = "<group>"; };
 		B2C63F38A6A6BB4F16C84ED6F9BBD5CA /* ImageFormat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageFormat.swift; path = Sources/Image/ImageFormat.swift; sourceTree = "<group>"; };
 		B3AB7E15C2F06A2FA4E7B0E18076C65B /* PQCommonMethodUtil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQCommonMethodUtil.swift; sourceTree = "<group>"; };
 		B3AB7E15C2F06A2FA4E7B0E18076C65B /* PQCommonMethodUtil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQCommonMethodUtil.swift; sourceTree = "<group>"; };
-		B3CD7C74BE5B1DD1CA9BC0A103C05A1E /* huffman_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; name = huffman_utils.c; path = src/utils/huffman_utils.c; sourceTree = "<group>"; };
-		B652677D0B1A9FCF1B0B35D1E5EE425B /* filters_mips_dsp_r2.c */ = {isa = PBXFileReference; includeInIndex = 1; name = filters_mips_dsp_r2.c; path = src/dsp/filters_mips_dsp_r2.c; sourceTree = "<group>"; };
+		B3CD7C74BE5B1DD1CA9BC0A103C05A1E /* huffman_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = huffman_utils.c; path = src/utils/huffman_utils.c; sourceTree = "<group>"; };
+		B652677D0B1A9FCF1B0B35D1E5EE425B /* filters_mips_dsp_r2.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = filters_mips_dsp_r2.c; path = src/dsp/filters_mips_dsp_r2.c; sourceTree = "<group>"; };
 		B69EBF91DF379858CACF4C5DD57B9CC8 /* ConstraintViewDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintViewDSL.swift; path = Source/ConstraintViewDSL.swift; sourceTree = "<group>"; };
 		B69EBF91DF379858CACF4C5DD57B9CC8 /* ConstraintViewDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintViewDSL.swift; path = Source/ConstraintViewDSL.swift; sourceTree = "<group>"; };
-		B6AD164242AFC127C6FF6835F5C1F40B /* dec.c */ = {isa = PBXFileReference; includeInIndex = 1; name = dec.c; path = src/dsp/dec.c; sourceTree = "<group>"; };
+		B6AD164242AFC127C6FF6835F5C1F40B /* dec.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = dec.c; path = src/dsp/dec.c; sourceTree = "<group>"; };
 		B6BDF02147B3C2E19A4EE7562CBFA68C /* Kingfisher.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Kingfisher.modulemap; sourceTree = "<group>"; };
 		B6BDF02147B3C2E19A4EE7562CBFA68C /* Kingfisher.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Kingfisher.modulemap; sourceTree = "<group>"; };
 		B7596889F6EB1BAA135442DB6F4D8EF3 /* PQRemindView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQRemindView.swift; sourceTree = "<group>"; };
 		B7596889F6EB1BAA135442DB6F4D8EF3 /* PQRemindView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQRemindView.swift; sourceTree = "<group>"; };
 		B75C07162780756C9DDC3D197F96074E /* ImageProgressive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageProgressive.swift; path = Sources/Image/ImageProgressive.swift; sourceTree = "<group>"; };
 		B75C07162780756C9DDC3D197F96074E /* ImageProgressive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageProgressive.swift; path = Sources/Image/ImageProgressive.swift; sourceTree = "<group>"; };
@@ -846,126 +823,123 @@
 		BA2D7346F8F7AA960CDC602ACE01EF2B /* PQBridgeObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = PQBridgeObject.m; sourceTree = "<group>"; };
 		BA2D7346F8F7AA960CDC602ACE01EF2B /* PQBridgeObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = PQBridgeObject.m; sourceTree = "<group>"; };
 		BA2E0663DF6CB9F56112D0569D224F95 /* FDFullscreenPopGesture.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FDFullscreenPopGesture.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		BA2E0663DF6CB9F56112D0569D224F95 /* FDFullscreenPopGesture.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FDFullscreenPopGesture.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		BA7ABCA97770D0019CFB6D96CE199258 /* KingfisherOptionsInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KingfisherOptionsInfo.swift; path = Sources/General/KingfisherOptionsInfo.swift; sourceTree = "<group>"; };
 		BA7ABCA97770D0019CFB6D96CE199258 /* KingfisherOptionsInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KingfisherOptionsInfo.swift; path = Sources/General/KingfisherOptionsInfo.swift; sourceTree = "<group>"; };
-		BB37A5C397F9E65D636113C6C491915D /* rescaler_neon.c */ = {isa = PBXFileReference; includeInIndex = 1; name = rescaler_neon.c; path = src/dsp/rescaler_neon.c; sourceTree = "<group>"; };
-		BBB00595ED23C181E708319697387F69 /* dec_sse41.c */ = {isa = PBXFileReference; includeInIndex = 1; name = dec_sse41.c; path = src/dsp/dec_sse41.c; sourceTree = "<group>"; };
+		BB37A5C397F9E65D636113C6C491915D /* rescaler_neon.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = rescaler_neon.c; path = src/dsp/rescaler_neon.c; sourceTree = "<group>"; };
+		BBB00595ED23C181E708319697387F69 /* dec_sse41.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = dec_sse41.c; path = src/dsp/dec_sse41.c; sourceTree = "<group>"; };
 		BBD98AB34EEDE61819E9F1564F0E6A68 /* SnapKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SnapKit-umbrella.h"; sourceTree = "<group>"; };
 		BBD98AB34EEDE61819E9F1564F0E6A68 /* SnapKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SnapKit-umbrella.h"; sourceTree = "<group>"; };
-		BC6C17D3EE34A3E4BEC268E69C27C358 /* rescaler_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; name = rescaler_sse2.c; path = src/dsp/rescaler_sse2.c; sourceTree = "<group>"; };
+		BC6C17D3EE34A3E4BEC268E69C27C358 /* rescaler_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = rescaler_sse2.c; path = src/dsp/rescaler_sse2.c; sourceTree = "<group>"; };
 		BD103FAF58A1E5E036AF91FB052E7C4F /* NSTextAttachment+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSTextAttachment+Kingfisher.swift"; path = "Sources/Extensions/NSTextAttachment+Kingfisher.swift"; sourceTree = "<group>"; };
 		BD103FAF58A1E5E036AF91FB052E7C4F /* NSTextAttachment+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSTextAttachment+Kingfisher.swift"; path = "Sources/Extensions/NSTextAttachment+Kingfisher.swift"; sourceTree = "<group>"; };
 		BF8F1FB5E564AAC2702E4E2AF140D13F /* ImageDownloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageDownloader.swift; path = Sources/Networking/ImageDownloader.swift; sourceTree = "<group>"; };
 		BF8F1FB5E564AAC2702E4E2AF140D13F /* ImageDownloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageDownloader.swift; path = Sources/Networking/ImageDownloader.swift; sourceTree = "<group>"; };
 		BFEF02B0839126B567460185605EA363 /* ExtensionHelpers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExtensionHelpers.swift; path = Sources/Utility/ExtensionHelpers.swift; sourceTree = "<group>"; };
 		BFEF02B0839126B567460185605EA363 /* ExtensionHelpers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExtensionHelpers.swift; path = Sources/Utility/ExtensionHelpers.swift; sourceTree = "<group>"; };
 		C05DEF2E68353158AA77409C2A5BD2EC /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = Sources/Image/Filter.swift; sourceTree = "<group>"; };
 		C05DEF2E68353158AA77409C2A5BD2EC /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = Sources/Image/Filter.swift; sourceTree = "<group>"; };
-		C0C5FB8AE6AAD9F95CE52C1E89DF4DD6 /* enc_neon.c */ = {isa = PBXFileReference; includeInIndex = 1; name = enc_neon.c; path = src/dsp/enc_neon.c; sourceTree = "<group>"; };
+		C0C5FB8AE6AAD9F95CE52C1E89DF4DD6 /* enc_neon.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = enc_neon.c; path = src/dsp/enc_neon.c; sourceTree = "<group>"; };
 		C0F39B64CB2D0CBB15EA051BD583B29F /* UILayoutSupport+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UILayoutSupport+Extensions.swift"; path = "Source/UILayoutSupport+Extensions.swift"; sourceTree = "<group>"; };
 		C0F39B64CB2D0CBB15EA051BD583B29F /* UILayoutSupport+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UILayoutSupport+Extensions.swift"; path = "Source/UILayoutSupport+Extensions.swift"; sourceTree = "<group>"; };
 		C2723D2BABBB1AD78CC41A83BDDF6AA5 /* FDFullscreenPopGesture.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FDFullscreenPopGesture.modulemap; sourceTree = "<group>"; };
 		C2723D2BABBB1AD78CC41A83BDDF6AA5 /* FDFullscreenPopGesture.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FDFullscreenPopGesture.modulemap; sourceTree = "<group>"; };
 		C286279CF4DC3493E811FEC95762F0CF /* libwebp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = libwebp.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		C286279CF4DC3493E811FEC95762F0CF /* libwebp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = libwebp.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-		C3F44C782D64D7EB20B61CE3844EBFAD /* Kingfisher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Kingfisher.framework; path = Kingfisher.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		C3F44C782D64D7EB20B61CE3844EBFAD /* Kingfisher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Kingfisher.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		C436AF4DD0884E3268C1088546A08150 /* histogram_enc.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = histogram_enc.h; path = src/enc/histogram_enc.h; sourceTree = "<group>"; };
 		C436AF4DD0884E3268C1088546A08150 /* histogram_enc.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = histogram_enc.h; path = src/enc/histogram_enc.h; sourceTree = "<group>"; };
 		C44A56B5C27265EDFEF832F846BDB479 /* Timeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeline.swift; path = Source/Timeline.swift; sourceTree = "<group>"; };
 		C44A56B5C27265EDFEF832F846BDB479 /* Timeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeline.swift; path = Source/Timeline.swift; sourceTree = "<group>"; };
 		C48838B1283E74DDADC4BFD0C9ECAD08 /* PQLoadingHUB.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQLoadingHUB.swift; sourceTree = "<group>"; };
 		C48838B1283E74DDADC4BFD0C9ECAD08 /* PQLoadingHUB.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQLoadingHUB.swift; sourceTree = "<group>"; };
 		C4E419E7A5BD1EC765F20DB04E8B4399 /* LayoutConstraintItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LayoutConstraintItem.swift; path = Source/LayoutConstraintItem.swift; sourceTree = "<group>"; };
 		C4E419E7A5BD1EC765F20DB04E8B4399 /* LayoutConstraintItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LayoutConstraintItem.swift; path = Source/LayoutConstraintItem.swift; sourceTree = "<group>"; };
 		C88B745407356FC4080AD8462FAD97A2 /* Resource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Resource.swift; path = Sources/General/ImageSource/Resource.swift; sourceTree = "<group>"; };
 		C88B745407356FC4080AD8462FAD97A2 /* Resource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Resource.swift; path = Sources/General/ImageSource/Resource.swift; sourceTree = "<group>"; };
 		C93CDB72FC6371BFDE1B87251C1BB50A /* Runtime.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Runtime.swift; path = Sources/Utility/Runtime.swift; sourceTree = "<group>"; };
 		C93CDB72FC6371BFDE1B87251C1BB50A /* Runtime.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Runtime.swift; path = Sources/Utility/Runtime.swift; sourceTree = "<group>"; };
-		CA833533D8AF8D3019E59F42B4F9ABE9 /* Pods_BFCommonKit_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_BFCommonKit_Tests.framework; path = "Pods-BFCommonKit_Tests.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
+		CA833533D8AF8D3019E59F42B4F9ABE9 /* Pods_BFCommonKit_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_BFCommonKit_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		CBA1BC2639F6E33ED25C9C7DCAEA3C13 /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = "<group>"; };
 		CBA1BC2639F6E33ED25C9C7DCAEA3C13 /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = "<group>"; };
-		CBB950A81D4B5AB62547403DA55DCB9F /* rescaler_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; name = rescaler_utils.c; path = src/utils/rescaler_utils.c; sourceTree = "<group>"; };
+		CBB950A81D4B5AB62547403DA55DCB9F /* rescaler_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = rescaler_utils.c; path = src/utils/rescaler_utils.c; sourceTree = "<group>"; };
 		CBBDB04DBD2FC99DBD0C953C9404BD1B /* libwebp-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "libwebp-Info.plist"; sourceTree = "<group>"; };
 		CBBDB04DBD2FC99DBD0C953C9404BD1B /* libwebp-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "libwebp-Info.plist"; sourceTree = "<group>"; };
-		CCDBA86540F8420ADC4A6BE7B61C0A52 /* picture_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = picture_enc.c; path = src/enc/picture_enc.c; sourceTree = "<group>"; };
-		CE089B52CCB306BB9D2D92C4B96F38A1 /* enc_mips_dsp_r2.c */ = {isa = PBXFileReference; includeInIndex = 1; name = enc_mips_dsp_r2.c; path = src/dsp/enc_mips_dsp_r2.c; sourceTree = "<group>"; };
+		CCDBA86540F8420ADC4A6BE7B61C0A52 /* picture_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = picture_enc.c; path = src/enc/picture_enc.c; sourceTree = "<group>"; };
+		CE089B52CCB306BB9D2D92C4B96F38A1 /* enc_mips_dsp_r2.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = enc_mips_dsp_r2.c; path = src/dsp/enc_mips_dsp_r2.c; sourceTree = "<group>"; };
 		CE5EC78DE0E5C7125DDB0C2F91A34363 /* NXUI+Ext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "NXUI+Ext.swift"; sourceTree = "<group>"; };
 		CE5EC78DE0E5C7125DDB0C2F91A34363 /* NXUI+Ext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "NXUI+Ext.swift"; sourceTree = "<group>"; };
 		CE88D79F9B0CE98FECBC0D88ED973B7B /* KingfisherWebP-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KingfisherWebP-prefix.pch"; sourceTree = "<group>"; };
 		CE88D79F9B0CE98FECBC0D88ED973B7B /* KingfisherWebP-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KingfisherWebP-prefix.pch"; sourceTree = "<group>"; };
 		CF4D6AACF76179CB30B005204F7C4666 /* TaskDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TaskDelegate.swift; path = Source/TaskDelegate.swift; sourceTree = "<group>"; };
 		CF4D6AACF76179CB30B005204F7C4666 /* TaskDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TaskDelegate.swift; path = Source/TaskDelegate.swift; sourceTree = "<group>"; };
-		CF796D08FE333264DAE32E5DA16AB1DD /* NXConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NXConfig.swift; sourceTree = "<group>"; };
 		D153FB259F12854F7216D0507277B2DA /* KFImageOptions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KFImageOptions.swift; path = Sources/SwiftUI/KFImageOptions.swift; sourceTree = "<group>"; };
 		D153FB259F12854F7216D0507277B2DA /* KFImageOptions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KFImageOptions.swift; path = Sources/SwiftUI/KFImageOptions.swift; sourceTree = "<group>"; };
-		D17E052BAD1FE2428108B8D7A5C4D412 /* frame_dec.c */ = {isa = PBXFileReference; includeInIndex = 1; name = frame_dec.c; path = src/dec/frame_dec.c; sourceTree = "<group>"; };
+		D17E052BAD1FE2428108B8D7A5C4D412 /* frame_dec.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = frame_dec.c; path = src/dec/frame_dec.c; sourceTree = "<group>"; };
 		D25D6AD87DBFCACD9AA256889E383492 /* Pods-BFCommonKit_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-BFCommonKit_Tests.debug.xcconfig"; sourceTree = "<group>"; };
 		D25D6AD87DBFCACD9AA256889E383492 /* Pods-BFCommonKit_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-BFCommonKit_Tests.debug.xcconfig"; sourceTree = "<group>"; };
 		D2B5F0F21CC33BEE123B15EA50988FAD /* SessionManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionManager.swift; path = Source/SessionManager.swift; sourceTree = "<group>"; };
 		D2B5F0F21CC33BEE123B15EA50988FAD /* SessionManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionManager.swift; path = Source/SessionManager.swift; sourceTree = "<group>"; };
-		D2C11CE0F48C255E4085CCE0996A74F4 /* quant_levels_dec_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; name = quant_levels_dec_utils.c; path = src/utils/quant_levels_dec_utils.c; sourceTree = "<group>"; };
+		D2C11CE0F48C255E4085CCE0996A74F4 /* quant_levels_dec_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = quant_levels_dec_utils.c; path = src/utils/quant_levels_dec_utils.c; sourceTree = "<group>"; };
 		D3EE16B62E9C069FB1806AA2E4509765 /* libwebp-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "libwebp-prefix.pch"; sourceTree = "<group>"; };
 		D3EE16B62E9C069FB1806AA2E4509765 /* libwebp-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "libwebp-prefix.pch"; sourceTree = "<group>"; };
 		D43A61076D45DE223B53A009D84A52E7 /* PQBaseViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQBaseViewController.swift; sourceTree = "<group>"; };
 		D43A61076D45DE223B53A009D84A52E7 /* PQBaseViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQBaseViewController.swift; sourceTree = "<group>"; };
 		D471CE3F64337F6FC7E11683ABD96F07 /* AnimatedImageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedImageView.swift; path = Sources/Views/AnimatedImageView.swift; sourceTree = "<group>"; };
 		D471CE3F64337F6FC7E11683ABD96F07 /* AnimatedImageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedImageView.swift; path = Sources/Views/AnimatedImageView.swift; sourceTree = "<group>"; };
 		D4932692C18EF30C7870B7C24039669A /* ConstraintRelation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintRelation.swift; path = Source/ConstraintRelation.swift; sourceTree = "<group>"; };
 		D4932692C18EF30C7870B7C24039669A /* ConstraintRelation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintRelation.swift; path = Source/ConstraintRelation.swift; sourceTree = "<group>"; };
 		D4ED637DAF6B95A621C94D0A71FF7CD8 /* webpi_dec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = webpi_dec.h; path = src/dec/webpi_dec.h; sourceTree = "<group>"; };
 		D4ED637DAF6B95A621C94D0A71FF7CD8 /* webpi_dec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = webpi_dec.h; path = src/dec/webpi_dec.h; sourceTree = "<group>"; };
-		D5389D9FEF4D4561B7431E0348B6B046 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = "<group>"; };
-		D5E6A2B51A0101CD8B9ED75FF5D9ACDD /* alpha_dec.c */ = {isa = PBXFileReference; includeInIndex = 1; name = alpha_dec.c; path = src/dec/alpha_dec.c; sourceTree = "<group>"; };
-		D6043471C96F93DC41F7DD1E0D7D8B35 /* Toast_Swift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Toast_Swift.framework; path = "Toast-Swift.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
+		D5389D9FEF4D4561B7431E0348B6B046 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
+		D5E6A2B51A0101CD8B9ED75FF5D9ACDD /* alpha_dec.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = alpha_dec.c; path = src/dec/alpha_dec.c; sourceTree = "<group>"; };
+		D6043471C96F93DC41F7DD1E0D7D8B35 /* Toast_Swift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Toast_Swift.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		D60B2EA78D8725DED7EABCE75EBA9742 /* ConstraintItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintItem.swift; path = Source/ConstraintItem.swift; sourceTree = "<group>"; };
 		D60B2EA78D8725DED7EABCE75EBA9742 /* ConstraintItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintItem.swift; path = Source/ConstraintItem.swift; sourceTree = "<group>"; };
-		D6FF2267C2D3C328469D0B88B463A504 /* tree_dec.c */ = {isa = PBXFileReference; includeInIndex = 1; name = tree_dec.c; path = src/dec/tree_dec.c; sourceTree = "<group>"; };
-		D7D4895EEADC4BA2478B28E8C9A6D65C /* enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = enc.c; path = src/dsp/enc.c; sourceTree = "<group>"; };
+		D6FF2267C2D3C328469D0B88B463A504 /* tree_dec.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = tree_dec.c; path = src/dec/tree_dec.c; sourceTree = "<group>"; };
+		D7D4895EEADC4BA2478B28E8C9A6D65C /* enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = enc.c; path = src/dsp/enc.c; sourceTree = "<group>"; };
 		D7D692CB58EBB63A20D55672A94AA56C /* BFCommonKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "BFCommonKit-Info.plist"; sourceTree = "<group>"; };
 		D7D692CB58EBB63A20D55672A94AA56C /* BFCommonKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "BFCommonKit-Info.plist"; sourceTree = "<group>"; };
 		D835C81EFB4FF5737761DB21ABF987DE /* vp8_dec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = vp8_dec.h; path = src/dec/vp8_dec.h; sourceTree = "<group>"; };
 		D835C81EFB4FF5737761DB21ABF987DE /* vp8_dec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = vp8_dec.h; path = src/dec/vp8_dec.h; sourceTree = "<group>"; };
 		D8739A9361AC45EF6783AD5BC787905E /* FDFullscreenPopGesture.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FDFullscreenPopGesture.debug.xcconfig; sourceTree = "<group>"; };
 		D8739A9361AC45EF6783AD5BC787905E /* FDFullscreenPopGesture.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FDFullscreenPopGesture.debug.xcconfig; sourceTree = "<group>"; };
 		D877CB63449DB1F9E6BFE7034424EB1E /* msa_macro.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = msa_macro.h; path = src/dsp/msa_macro.h; sourceTree = "<group>"; };
 		D877CB63449DB1F9E6BFE7034424EB1E /* msa_macro.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = msa_macro.h; path = src/dsp/msa_macro.h; sourceTree = "<group>"; };
-		D8ACFAC9698AA118A1B7123E16FDB1AA /* picture_tools_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = picture_tools_enc.c; path = src/enc/picture_tools_enc.c; sourceTree = "<group>"; };
+		D8ACFAC9698AA118A1B7123E16FDB1AA /* picture_tools_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = picture_tools_enc.c; path = src/enc/picture_tools_enc.c; sourceTree = "<group>"; };
 		D937D1FDA9F4419E23A994AF3B6F5914 /* quant.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = quant.h; path = src/dsp/quant.h; sourceTree = "<group>"; };
 		D937D1FDA9F4419E23A994AF3B6F5914 /* quant.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = quant.h; path = src/dsp/quant.h; sourceTree = "<group>"; };
-		D9D5089CB9F75EF0A2AA63CA010FDA40 /* picture_rescale_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = picture_rescale_enc.c; path = src/enc/picture_rescale_enc.c; sourceTree = "<group>"; };
+		D9D5089CB9F75EF0A2AA63CA010FDA40 /* picture_rescale_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = picture_rescale_enc.c; path = src/enc/picture_rescale_enc.c; sourceTree = "<group>"; };
 		DA68C1AE62A5FDCD8AC14813F22854BB /* SnapKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SnapKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		DA68C1AE62A5FDCD8AC14813F22854BB /* SnapKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SnapKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		DA7587B7B2DA54E7FED20BDCB2980091 /* KingfisherManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KingfisherManager.swift; path = Sources/General/KingfisherManager.swift; sourceTree = "<group>"; };
 		DA7587B7B2DA54E7FED20BDCB2980091 /* KingfisherManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KingfisherManager.swift; path = Sources/General/KingfisherManager.swift; sourceTree = "<group>"; };
 		DAAA2963BFA737586F22B959CE48DFB5 /* backward_references_enc.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = backward_references_enc.h; path = src/enc/backward_references_enc.h; sourceTree = "<group>"; };
 		DAAA2963BFA737586F22B959CE48DFB5 /* backward_references_enc.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = backward_references_enc.h; path = src/enc/backward_references_enc.h; sourceTree = "<group>"; };
 		DABDE4AFF05333E07A855505EE55DAA4 /* PQNavigatinController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQNavigatinController.swift; sourceTree = "<group>"; };
 		DABDE4AFF05333E07A855505EE55DAA4 /* PQNavigatinController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQNavigatinController.swift; sourceTree = "<group>"; };
-		DBAC9E81AADE915993CB058C7F2670C2 /* frame_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = frame_enc.c; path = src/enc/frame_enc.c; sourceTree = "<group>"; };
+		DBAC9E81AADE915993CB058C7F2670C2 /* frame_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = frame_enc.c; path = src/enc/frame_enc.c; sourceTree = "<group>"; };
 		DBD53670FCB797218999C16080105CF1 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; };
 		DBD53670FCB797218999C16080105CF1 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; };
-		DCD35758106CBDBADD67B7E88E184F48 /* cpu.c */ = {isa = PBXFileReference; includeInIndex = 1; name = cpu.c; path = src/dsp/cpu.c; sourceTree = "<group>"; };
+		DCD35758106CBDBADD67B7E88E184F48 /* cpu.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = cpu.c; path = src/dsp/cpu.c; sourceTree = "<group>"; };
 		DD5452B7F57FA4106A7EEA6256422BEC /* filters_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = filters_utils.h; path = src/utils/filters_utils.h; sourceTree = "<group>"; };
 		DD5452B7F57FA4106A7EEA6256422BEC /* filters_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = filters_utils.h; path = src/utils/filters_utils.h; sourceTree = "<group>"; };
 		DD7F430AF6E6AE6E683DB514632A78E9 /* Constraint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Constraint.swift; path = Source/Constraint.swift; sourceTree = "<group>"; };
 		DD7F430AF6E6AE6E683DB514632A78E9 /* Constraint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Constraint.swift; path = Source/Constraint.swift; sourceTree = "<group>"; };
 		DFCBCA983B780E29A5CBA6BF90B7DCE9 /* ConstraintOffsetTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintOffsetTarget.swift; path = Source/ConstraintOffsetTarget.swift; sourceTree = "<group>"; };
 		DFCBCA983B780E29A5CBA6BF90B7DCE9 /* ConstraintOffsetTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintOffsetTarget.swift; path = Source/ConstraintOffsetTarget.swift; sourceTree = "<group>"; };
 		E051E7F7DB3166AF814DAFF06055881B /* thread_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = thread_utils.h; path = src/utils/thread_utils.h; sourceTree = "<group>"; };
 		E051E7F7DB3166AF814DAFF06055881B /* thread_utils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = thread_utils.h; path = src/utils/thread_utils.h; sourceTree = "<group>"; };
-		E0C8B9547808EB8A5A896902763ED1CE /* lossless_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; name = lossless_sse2.c; path = src/dsp/lossless_sse2.c; sourceTree = "<group>"; };
+		E0C8B9547808EB8A5A896902763ED1CE /* lossless_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = lossless_sse2.c; path = src/dsp/lossless_sse2.c; sourceTree = "<group>"; };
 		E0F0B4086583A29D3E391DEC69B5EB8B /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; };
 		E0F0B4086583A29D3E391DEC69B5EB8B /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; };
-		E1ADAF5DA36C31037755FBB79F14CD96 /* vp8_dec.c */ = {isa = PBXFileReference; includeInIndex = 1; name = vp8_dec.c; path = src/dec/vp8_dec.c; sourceTree = "<group>"; };
-		E208743D5B80E28438F0CF2960C8BFF3 /* cost_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; name = cost_sse2.c; path = src/dsp/cost_sse2.c; sourceTree = "<group>"; };
-		E2477CC7B73CE0B0E8933AC99223A969 /* enc_msa.c */ = {isa = PBXFileReference; includeInIndex = 1; name = enc_msa.c; path = src/dsp/enc_msa.c; sourceTree = "<group>"; };
+		E1ADAF5DA36C31037755FBB79F14CD96 /* vp8_dec.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = vp8_dec.c; path = src/dec/vp8_dec.c; sourceTree = "<group>"; };
+		E208743D5B80E28438F0CF2960C8BFF3 /* cost_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = cost_sse2.c; path = src/dsp/cost_sse2.c; sourceTree = "<group>"; };
+		E2477CC7B73CE0B0E8933AC99223A969 /* enc_msa.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = enc_msa.c; path = src/dsp/enc_msa.c; sourceTree = "<group>"; };
 		E25D43F9215D7863EEE82EBFF7415ADE /* SnapKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SnapKit-prefix.pch"; sourceTree = "<group>"; };
 		E25D43F9215D7863EEE82EBFF7415ADE /* SnapKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SnapKit-prefix.pch"; sourceTree = "<group>"; };
 		E285049FBF9A42DEA97A9FEFC1D17D7A /* ConstraintConstantTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintConstantTarget.swift; path = Source/ConstraintConstantTarget.swift; sourceTree = "<group>"; };
 		E285049FBF9A42DEA97A9FEFC1D17D7A /* ConstraintConstantTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintConstantTarget.swift; path = Source/ConstraintConstantTarget.swift; sourceTree = "<group>"; };
-		E2863DE85F4CF51AFBF99E42EDB7B1CA /* filter_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = filter_enc.c; path = src/enc/filter_enc.c; sourceTree = "<group>"; };
-		E362A82AEB9EF3318FEA21999E4563A5 /* lossless_msa.c */ = {isa = PBXFileReference; includeInIndex = 1; name = lossless_msa.c; path = src/dsp/lossless_msa.c; sourceTree = "<group>"; };
+		E2863DE85F4CF51AFBF99E42EDB7B1CA /* filter_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = filter_enc.c; path = src/enc/filter_enc.c; sourceTree = "<group>"; };
+		E362A82AEB9EF3318FEA21999E4563A5 /* lossless_msa.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = lossless_msa.c; path = src/dsp/lossless_msa.c; sourceTree = "<group>"; };
 		E3CE89AAFB31A01CE13EF06ACA01B612 /* KingfisherWebP-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "KingfisherWebP-dummy.m"; sourceTree = "<group>"; };
 		E3CE89AAFB31A01CE13EF06ACA01B612 /* KingfisherWebP-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "KingfisherWebP-dummy.m"; sourceTree = "<group>"; };
-		E5F2998F8075B23ABA45124756159CD8 /* rescaler_msa.c */ = {isa = PBXFileReference; includeInIndex = 1; name = rescaler_msa.c; path = src/dsp/rescaler_msa.c; sourceTree = "<group>"; };
-		E739367D383F53103352CDB8AC34801C /* color_cache_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; name = color_cache_utils.c; path = src/utils/color_cache_utils.c; sourceTree = "<group>"; };
-		E7811DB0A3D07B8C9A53F143B0C1C5C4 /* lossless_enc_neon.c */ = {isa = PBXFileReference; includeInIndex = 1; name = lossless_enc_neon.c; path = src/dsp/lossless_enc_neon.c; sourceTree = "<group>"; };
+		E5F2998F8075B23ABA45124756159CD8 /* rescaler_msa.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = rescaler_msa.c; path = src/dsp/rescaler_msa.c; sourceTree = "<group>"; };
+		E739367D383F53103352CDB8AC34801C /* color_cache_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = color_cache_utils.c; path = src/utils/color_cache_utils.c; sourceTree = "<group>"; };
+		E7811DB0A3D07B8C9A53F143B0C1C5C4 /* lossless_enc_neon.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = lossless_enc_neon.c; path = src/dsp/lossless_enc_neon.c; sourceTree = "<group>"; };
 		E83AFAE81A87918446EA49B22BC95395 /* CGImage+WebP.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CGImage+WebP.m"; path = "Sources/CGImage+WebP.m"; sourceTree = "<group>"; };
 		E83AFAE81A87918446EA49B22BC95395 /* CGImage+WebP.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CGImage+WebP.m"; path = "Sources/CGImage+WebP.m"; sourceTree = "<group>"; };
 		E850BC70ADFED8E0C203981FEE9CE33A /* Kingfisher-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Kingfisher-prefix.pch"; sourceTree = "<group>"; };
 		E850BC70ADFED8E0C203981FEE9CE33A /* Kingfisher-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Kingfisher-prefix.pch"; sourceTree = "<group>"; };
-		E884B2D8CE16B9B42D41A02195B0E697 /* upsampling_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; name = upsampling_sse2.c; path = src/dsp/upsampling_sse2.c; sourceTree = "<group>"; };
-		E8EE7F078656FABB8F6821D10FF994BB /* KeychainAccess.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = KeychainAccess.framework; path = KeychainAccess.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		E884B2D8CE16B9B42D41A02195B0E697 /* upsampling_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = upsampling_sse2.c; path = src/dsp/upsampling_sse2.c; sourceTree = "<group>"; };
+		E8EE7F078656FABB8F6821D10FF994BB /* KeychainAccess.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KeychainAccess.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		E9A28D7EA7562ADF1F29331BB8168165 /* DispatchQueue+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Alamofire.swift"; path = "Source/DispatchQueue+Alamofire.swift"; sourceTree = "<group>"; };
 		E9A28D7EA7562ADF1F29331BB8168165 /* DispatchQueue+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Alamofire.swift"; path = "Source/DispatchQueue+Alamofire.swift"; sourceTree = "<group>"; };
 		EA0FC5C24A0AF3D6C9FA0BADEE3A89FC /* BFInt+Ext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BFInt+Ext.swift"; sourceTree = "<group>"; };
 		EA0FC5C24A0AF3D6C9FA0BADEE3A89FC /* BFInt+Ext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BFInt+Ext.swift"; sourceTree = "<group>"; };
 		EAF2768C50BE4004BEDE4D499AEB04FF /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };
 		EAF2768C50BE4004BEDE4D499AEB04FF /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };
 		EBBC8E38ED83C5433AE67AE813C923C0 /* KFImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KFImage.swift; path = Sources/SwiftUI/KFImage.swift; sourceTree = "<group>"; };
 		EBBC8E38ED83C5433AE67AE813C923C0 /* KFImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KFImage.swift; path = Sources/SwiftUI/KFImage.swift; sourceTree = "<group>"; };
-		EC7351154FA55557FE314EB17DD6FB76 /* ssim.c */ = {isa = PBXFileReference; includeInIndex = 1; name = ssim.c; path = src/dsp/ssim.c; sourceTree = "<group>"; };
-		EC94F4BE5962392C1F00F1B599A361AD /* idec_dec.c */ = {isa = PBXFileReference; includeInIndex = 1; name = idec_dec.c; path = src/dec/idec_dec.c; sourceTree = "<group>"; };
-		ECAA019067BEB81303ADB97F87A0EF20 /* alpha_processing_neon.c */ = {isa = PBXFileReference; includeInIndex = 1; name = alpha_processing_neon.c; path = src/dsp/alpha_processing_neon.c; sourceTree = "<group>"; };
+		EC7351154FA55557FE314EB17DD6FB76 /* ssim.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = ssim.c; path = src/dsp/ssim.c; sourceTree = "<group>"; };
+		EC94F4BE5962392C1F00F1B599A361AD /* idec_dec.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = idec_dec.c; path = src/dec/idec_dec.c; sourceTree = "<group>"; };
+		ECAA019067BEB81303ADB97F87A0EF20 /* alpha_processing_neon.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = alpha_processing_neon.c; path = src/dsp/alpha_processing_neon.c; sourceTree = "<group>"; };
 		ECF3F980615AC1B089DDCE40464DCB39 /* vp8li_dec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = vp8li_dec.h; path = src/dec/vp8li_dec.h; sourceTree = "<group>"; };
 		ECF3F980615AC1B089DDCE40464DCB39 /* vp8li_dec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = vp8li_dec.h; path = src/dec/vp8li_dec.h; sourceTree = "<group>"; };
-		EEE37BB9DD08FBF55E620F47A8255EEC /* filters_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; name = filters_sse2.c; path = src/dsp/filters_sse2.c; sourceTree = "<group>"; };
+		EEE37BB9DD08FBF55E620F47A8255EEC /* filters_sse2.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = filters_sse2.c; path = src/dsp/filters_sse2.c; sourceTree = "<group>"; };
 		EFE6E753243A728F8D49E2ED8B1DE276 /* PQHeartAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQHeartAnimation.swift; sourceTree = "<group>"; };
 		EFE6E753243A728F8D49E2ED8B1DE276 /* PQHeartAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PQHeartAnimation.swift; sourceTree = "<group>"; };
 		F07F0F76979768EBF490251F27AE638B /* Toast_Swift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Toast_Swift.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		F07F0F76979768EBF490251F27AE638B /* Toast_Swift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Toast_Swift.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		F094D1D0B7DBDA6EA87C8BFAA1038945 /* ConstraintConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintConfig.swift; path = Source/ConstraintConfig.swift; sourceTree = "<group>"; };
 		F094D1D0B7DBDA6EA87C8BFAA1038945 /* ConstraintConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintConfig.swift; path = Source/ConstraintConfig.swift; sourceTree = "<group>"; };
 		F0AF075B74C62B0F32E1E7EACB22407B /* DiskStorage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DiskStorage.swift; path = Sources/Cache/DiskStorage.swift; sourceTree = "<group>"; };
 		F0AF075B74C62B0F32E1E7EACB22407B /* DiskStorage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DiskStorage.swift; path = Sources/Cache/DiskStorage.swift; sourceTree = "<group>"; };
 		F14AAD583EDE8E5ED1A04BDF2B6E8776 /* ConstraintLayoutGuideDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutGuideDSL.swift; path = Source/ConstraintLayoutGuideDSL.swift; sourceTree = "<group>"; };
 		F14AAD583EDE8E5ED1A04BDF2B6E8776 /* ConstraintLayoutGuideDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutGuideDSL.swift; path = Source/ConstraintLayoutGuideDSL.swift; sourceTree = "<group>"; };
-		F3066834FD63E09B82CDBECFF75C3C8A /* NXNormalBubbleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NXNormalBubbleView.swift; sourceTree = "<group>"; };
-		F34C85ADF22F11474C365F03EAE57D27 /* quant_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = quant_enc.c; path = src/enc/quant_enc.c; sourceTree = "<group>"; };
+		F34C85ADF22F11474C365F03EAE57D27 /* quant_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = quant_enc.c; path = src/enc/quant_enc.c; sourceTree = "<group>"; };
 		F3717055653D3FDE638479059FBA383B /* Pods-BFCommonKit_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-BFCommonKit_Example-acknowledgements.plist"; sourceTree = "<group>"; };
 		F3717055653D3FDE638479059FBA383B /* Pods-BFCommonKit_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-BFCommonKit_Example-acknowledgements.plist"; sourceTree = "<group>"; };
-		F3E28B78A41D5B863F309F689C732A79 /* webp_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = webp_enc.c; path = src/enc/webp_enc.c; sourceTree = "<group>"; };
-		F3E86DD8487DC88A6EA9CD6947D0C6E4 /* lossless_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = lossless_enc.c; path = src/dsp/lossless_enc.c; sourceTree = "<group>"; };
-		F46DED6FE39EE3E8439655E79C07B587 /* backward_references_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = backward_references_enc.c; path = src/enc/backward_references_enc.c; sourceTree = "<group>"; };
+		F3E28B78A41D5B863F309F689C732A79 /* webp_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = webp_enc.c; path = src/enc/webp_enc.c; sourceTree = "<group>"; };
+		F3E86DD8487DC88A6EA9CD6947D0C6E4 /* lossless_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = lossless_enc.c; path = src/dsp/lossless_enc.c; sourceTree = "<group>"; };
+		F46DED6FE39EE3E8439655E79C07B587 /* backward_references_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = backward_references_enc.c; path = src/enc/backward_references_enc.c; sourceTree = "<group>"; };
 		F4C49D847BF184B044133313179DB232 /* ImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageCache.swift; path = Sources/Cache/ImageCache.swift; sourceTree = "<group>"; };
 		F4C49D847BF184B044133313179DB232 /* ImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageCache.swift; path = Sources/Cache/ImageCache.swift; sourceTree = "<group>"; };
-		F51497D7B4EFE124DF374231989F2F74 /* filters_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; name = filters_utils.c; path = src/utils/filters_utils.c; sourceTree = "<group>"; };
+		F51497D7B4EFE124DF374231989F2F74 /* filters_utils.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = filters_utils.c; path = src/utils/filters_utils.c; sourceTree = "<group>"; };
 		F5DB1F6A3014AC72E1247806BFE0E1C8 /* Pods-BFCommonKit_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-BFCommonKit_Tests-acknowledgements.markdown"; sourceTree = "<group>"; };
 		F5DB1F6A3014AC72E1247806BFE0E1C8 /* Pods-BFCommonKit_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-BFCommonKit_Tests-acknowledgements.markdown"; sourceTree = "<group>"; };
-		F6AB6C0495BDF68D307038D91D9617B4 /* UIView+NXBadgeView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIView+NXBadgeView.swift"; sourceTree = "<group>"; };
-		F760A326E4AA13539B20F63EC98FAF10 /* utils.c */ = {isa = PBXFileReference; includeInIndex = 1; name = utils.c; path = src/utils/utils.c; sourceTree = "<group>"; };
+		F760A326E4AA13539B20F63EC98FAF10 /* utils.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = utils.c; path = src/utils/utils.c; sourceTree = "<group>"; };
 		F78EB9D303298DDDB29A7F6817B2BF25 /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = "<group>"; };
 		F78EB9D303298DDDB29A7F6817B2BF25 /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = "<group>"; };
 		F8836A0D924978B9AEE586D536B621CB /* BFString+Ext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BFString+Ext.swift"; sourceTree = "<group>"; };
 		F8836A0D924978B9AEE586D536B621CB /* BFString+Ext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "BFString+Ext.swift"; sourceTree = "<group>"; };
-		FA04FD815E1912F167CBDD3007B2A248 /* Pods_BFCommonKit_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_BFCommonKit_Example.framework; path = "Pods-BFCommonKit_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
-		FA10A0FA13F640A94A7D91225540D567 /* dec_mips32.c */ = {isa = PBXFileReference; includeInIndex = 1; name = dec_mips32.c; path = src/dsp/dec_mips32.c; sourceTree = "<group>"; };
+		FA04FD815E1912F167CBDD3007B2A248 /* Pods_BFCommonKit_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_BFCommonKit_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		FA10A0FA13F640A94A7D91225540D567 /* dec_mips32.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = dec_mips32.c; path = src/dsp/dec_mips32.c; sourceTree = "<group>"; };
 		FB208C0542903520E60B16D4B05A9145 /* Toast-Swift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Toast-Swift-dummy.m"; sourceTree = "<group>"; };
 		FB208C0542903520E60B16D4B05A9145 /* Toast-Swift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Toast-Swift-dummy.m"; sourceTree = "<group>"; };
 		FB3961923CB170D970E08D16997951AB /* KFOptionsSetter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KFOptionsSetter.swift; path = Sources/General/KFOptionsSetter.swift; sourceTree = "<group>"; };
 		FB3961923CB170D970E08D16997951AB /* KFOptionsSetter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KFOptionsSetter.swift; path = Sources/General/KFOptionsSetter.swift; sourceTree = "<group>"; };
 		FB55B31505A2D4CC70E1C7E7C34CEBEE /* Debugging.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debugging.swift; path = Source/Debugging.swift; sourceTree = "<group>"; };
 		FB55B31505A2D4CC70E1C7E7C34CEBEE /* Debugging.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debugging.swift; path = Source/Debugging.swift; sourceTree = "<group>"; };
 		FB86938CB2E3635C7F8C1152A2D0BB6E /* KeychainAccess.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KeychainAccess.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		FB86938CB2E3635C7F8C1152A2D0BB6E /* KeychainAccess.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KeychainAccess.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-		FBA69579339FCCC9B0EAAD7EC25D4F54 /* cost_mips_dsp_r2.c */ = {isa = PBXFileReference; includeInIndex = 1; name = cost_mips_dsp_r2.c; path = src/dsp/cost_mips_dsp_r2.c; sourceTree = "<group>"; };
+		FBA69579339FCCC9B0EAAD7EC25D4F54 /* cost_mips_dsp_r2.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = cost_mips_dsp_r2.c; path = src/dsp/cost_mips_dsp_r2.c; sourceTree = "<group>"; };
 		FC45085D89A1D53C9C6242DF0F680E15 /* SnapKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SnapKit.debug.xcconfig; sourceTree = "<group>"; };
 		FC45085D89A1D53C9C6242DF0F680E15 /* SnapKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SnapKit.debug.xcconfig; sourceTree = "<group>"; };
 		FC5D506215B08B2EBD79B4D3C6399ABD /* NXAudioRecorder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NXAudioRecorder.swift; sourceTree = "<group>"; };
 		FC5D506215B08B2EBD79B4D3C6399ABD /* NXAudioRecorder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NXAudioRecorder.swift; sourceTree = "<group>"; };
 		FDFC93F8BA041B197E5216704A8EF24B /* Delegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Delegate.swift; path = Sources/Utility/Delegate.swift; sourceTree = "<group>"; };
 		FDFC93F8BA041B197E5216704A8EF24B /* Delegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Delegate.swift; path = Sources/Utility/Delegate.swift; sourceTree = "<group>"; };
-		FEA85F203F8885F44229062D11AEE6E5 /* vp8l_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = vp8l_enc.c; path = src/enc/vp8l_enc.c; sourceTree = "<group>"; };
+		FEA85F203F8885F44229062D11AEE6E5 /* vp8l_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = vp8l_enc.c; path = src/enc/vp8l_enc.c; sourceTree = "<group>"; };
 		FEE5658A1B78F459401BF5C7D8121C31 /* KeychainAccess.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = KeychainAccess.debug.xcconfig; sourceTree = "<group>"; };
 		FEE5658A1B78F459401BF5C7D8121C31 /* KeychainAccess.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = KeychainAccess.debug.xcconfig; sourceTree = "<group>"; };
-		FF13A49D9E2493714DF080ED2550100F /* predictor_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; name = predictor_enc.c; path = src/enc/predictor_enc.c; sourceTree = "<group>"; };
+		FF13A49D9E2493714DF080ED2550100F /* predictor_enc.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = predictor_enc.c; path = src/enc/predictor_enc.c; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 /* End PBXFileReference section */
 
 
 /* Begin PBXFrameworksBuildPhase section */
 /* Begin PBXFrameworksBuildPhase section */
@@ -1247,27 +1221,12 @@
 			name = webp;
 			name = webp;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
-		13F1DE009696242274E3773B95C2A858 /* bubbleLayer */ = {
-			isa = PBXGroup;
-			children = (
-				5CB5DB9820955BB833895EB80A80B92D /* NXBubbleLayer.swift */,
-				8052B6036E8C91AEA308258D0EF5C23B /* NXContainView.swift */,
-				A93F50324468F8CAC9DB0025AF9C0F3B /* NXInteractiveView.swift */,
-				F3066834FD63E09B82CDBECFF75C3C8A /* NXNormalBubbleView.swift */,
-				11F937E8952C944CCCB14D50DB3B35F5 /* NXTextBubbleView.swift */,
-				23688D65051D3AD94F11994EA69F4F64 /* NXVoiceBubbleView.swift */,
-			);
-			name = bubbleLayer;
-			path = bubbleLayer;
-			sourceTree = "<group>";
-		};
 		1B2A12B696EFD84BF36546DAD21775C0 /* KeychainAccess */ = {
 		1B2A12B696EFD84BF36546DAD21775C0 /* KeychainAccess */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
 				66933D567B5503082996F8B4B3AE0BB0 /* Keychain.swift */,
 				66933D567B5503082996F8B4B3AE0BB0 /* Keychain.swift */,
 				1BEB0FA535592BE2A6A8636277D6A795 /* Support Files */,
 				1BEB0FA535592BE2A6A8636277D6A795 /* Support Files */,
 			);
 			);
-			name = KeychainAccess;
 			path = KeychainAccess;
 			path = KeychainAccess;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
@@ -1342,7 +1301,6 @@
 				11B1B7408FBD7CD30D01DF9F5D107121 /* PQTabBar.swift */,
 				11B1B7408FBD7CD30D01DF9F5D107121 /* PQTabBar.swift */,
 				63C363FE4DFA2E1FAB3D8C39CBD8D2CE /* PQTextView.swift */,
 				63C363FE4DFA2E1FAB3D8C39CBD8D2CE /* PQTextView.swift */,
 			);
 			);
-			name = View;
 			path = View;
 			path = View;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
@@ -1369,7 +1327,6 @@
 				3FD45A76700AA1E923B17E2E73AFD0A1 /* Toast.swift */,
 				3FD45A76700AA1E923B17E2E73AFD0A1 /* Toast.swift */,
 				2D5C47DE9D54227D7BD7B873CB8BCDF4 /* Support Files */,
 				2D5C47DE9D54227D7BD7B873CB8BCDF4 /* Support Files */,
 			);
 			);
-			name = "Toast-Swift";
 			path = "Toast-Swift";
 			path = "Toast-Swift";
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
@@ -1385,7 +1342,6 @@
 				98441C01B0BFDAE854E81DAEB6AAA829 /* BFUIView+Ext.swift */,
 				98441C01B0BFDAE854E81DAEB6AAA829 /* BFUIView+Ext.swift */,
 				4591E5B72B1A6999B6C7347257FD177C /* NXFundation+Ext.swift */,
 				4591E5B72B1A6999B6C7347257FD177C /* NXFundation+Ext.swift */,
 				CE5EC78DE0E5C7125DDB0C2F91A34363 /* NXUI+Ext.swift */,
 				CE5EC78DE0E5C7125DDB0C2F91A34363 /* NXUI+Ext.swift */,
-				5EE9B9B4ADC4E1057D411B22D69B8D11 /* NXUIColor+Ext.swift */,
 				6BCFB4FC07A839C1491A7D6E3B569D17 /* UIControl+NXCategory.h */,
 				6BCFB4FC07A839C1491A7D6E3B569D17 /* UIControl+NXCategory.h */,
 				6D8914A94D91CDFD8C337F598A6C1A27 /* UIControl+NXCategory.m */,
 				6D8914A94D91CDFD8C337F598A6C1A27 /* UIControl+NXCategory.m */,
 			);
 			);
@@ -1440,7 +1396,6 @@
 				3A5AECCB226482B478B0AE61AA9F34F2 /* Validation.swift */,
 				3A5AECCB226482B478B0AE61AA9F34F2 /* Validation.swift */,
 				0469B79F8F71925F1DBC9F351415981F /* Support Files */,
 				0469B79F8F71925F1DBC9F351415981F /* Support Files */,
 			);
 			);
-			name = Alamofire;
 			path = Alamofire;
 			path = Alamofire;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
@@ -1494,7 +1449,6 @@
 				2A2A2E73E84270CC6C48012B20839BE0 /* WebPSerializer.swift */,
 				2A2A2E73E84270CC6C48012B20839BE0 /* WebPSerializer.swift */,
 				E54B89AC9C1040A0548BD8915DD2A6B1 /* Support Files */,
 				E54B89AC9C1040A0548BD8915DD2A6B1 /* Support Files */,
 			);
 			);
-			name = KingfisherWebP;
 			path = KingfisherWebP;
 			path = KingfisherWebP;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
@@ -1521,7 +1475,6 @@
 				E3673B0B53D1392D35B7814979FDA00F /* Support Files */,
 				E3673B0B53D1392D35B7814979FDA00F /* Support Files */,
 				0BA6A0FA7115484D04B19F2222E3FB41 /* webp */,
 				0BA6A0FA7115484D04B19F2222E3FB41 /* webp */,
 			);
 			);
-			name = libwebp;
 			path = libwebp;
 			path = libwebp;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
@@ -1530,9 +1483,7 @@
 			children = (
 			children = (
 				A85A9DE64F370615679CD8F58BCB01AD /* Base */,
 				A85A9DE64F370615679CD8F58BCB01AD /* Base */,
 				43E6E17C31911FDA6981DBFB7477E6BE /* BFCategorys */,
 				43E6E17C31911FDA6981DBFB7477E6BE /* BFCategorys */,
-				DE07FA69D0DC973CF995F695F0FA42C4 /* BFCustomViews */,
 				AD70EB56404BCB9A37BC8FEEB48331C3 /* BFDebug */,
 				AD70EB56404BCB9A37BC8FEEB48331C3 /* BFDebug */,
-				9962F5C9982C13A1B789E1F51CBE66A0 /* BFMacro */,
 				1F3A03EA046435CFA4AD3F4687AF1D26 /* BFUtility */,
 				1F3A03EA046435CFA4AD3F4687AF1D26 /* BFUtility */,
 				7E99DAB86372C45874783184B2116A09 /* Enums */,
 				7E99DAB86372C45874783184B2116A09 /* Enums */,
 				5DC09C1B0FD6955BBFC420268473FC29 /* Pod */,
 				5DC09C1B0FD6955BBFC420268473FC29 /* Pod */,
@@ -1558,7 +1509,6 @@
 				51F3A404066D06E662FD1EA5FA6AB6EC /* UINavigationController+FDFullscreenPopGesture.m */,
 				51F3A404066D06E662FD1EA5FA6AB6EC /* UINavigationController+FDFullscreenPopGesture.m */,
 				BF9669DC5C4B1137C959FD04A8965524 /* Support Files */,
 				BF9669DC5C4B1137C959FD04A8965524 /* Support Files */,
 			);
 			);
-			name = FDFullscreenPopGesture;
 			path = FDFullscreenPopGesture;
 			path = FDFullscreenPopGesture;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
@@ -1592,15 +1542,6 @@
 			name = Frameworks;
 			name = Frameworks;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
-		9962F5C9982C13A1B789E1F51CBE66A0 /* BFMacro */ = {
-			isa = PBXGroup;
-			children = (
-				CF796D08FE333264DAE32E5DA16AB1DD /* NXConfig.swift */,
-			);
-			name = BFMacro;
-			path = BFCommonKit/Classes/BFMacro;
-			sourceTree = "<group>";
-		};
 		9CB3FE7989D048C6E5B9D0311E36DEA5 /* SnapKit */ = {
 		9CB3FE7989D048C6E5B9D0311E36DEA5 /* SnapKit */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
@@ -1642,7 +1583,6 @@
 				C0F39B64CB2D0CBB15EA051BD583B29F /* UILayoutSupport+Extensions.swift */,
 				C0F39B64CB2D0CBB15EA051BD583B29F /* UILayoutSupport+Extensions.swift */,
 				6949275752305343A5BCCA84E67DB713 /* Support Files */,
 				6949275752305343A5BCCA84E67DB713 /* Support Files */,
 			);
 			);
-			name = SnapKit;
 			path = SnapKit;
 			path = SnapKit;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
@@ -1653,7 +1593,6 @@
 				6C01FEB2B5994C82E37EC0FEEDF25DD9 /* PQBaseWebViewController.swift */,
 				6C01FEB2B5994C82E37EC0FEEDF25DD9 /* PQBaseWebViewController.swift */,
 				DABDE4AFF05333E07A855505EE55DAA4 /* PQNavigatinController.swift */,
 				DABDE4AFF05333E07A855505EE55DAA4 /* PQNavigatinController.swift */,
 			);
 			);
-			name = Controller;
 			path = Controller;
 			path = Controller;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
@@ -1662,7 +1601,6 @@
 			children = (
 			children = (
 				673C07BD3E74EA714FB0A8F493A2EA1A /* PQBaseModel.swift */,
 				673C07BD3E74EA714FB0A8F493A2EA1A /* PQBaseModel.swift */,
 			);
 			);
-			name = Model;
 			path = Model;
 			path = Model;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
@@ -1759,7 +1697,6 @@
 				282FB458ECB9BA7CD80F505282ECA4CD /* WKInterfaceImage+Kingfisher.swift */,
 				282FB458ECB9BA7CD80F505282ECA4CD /* WKInterfaceImage+Kingfisher.swift */,
 				5DAD2F3359C5E955EB8B6C697A66277A /* Support Files */,
 				5DAD2F3359C5E955EB8B6C697A66277A /* Support Files */,
 			);
 			);
-			name = Kingfisher;
 			path = Kingfisher;
 			path = Kingfisher;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
@@ -1790,16 +1727,6 @@
 			);
 			);
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
-		D3614985C26DAB835F9809D21D506214 /* views */ = {
-			isa = PBXGroup;
-			children = (
-				13F1DE009696242274E3773B95C2A858 /* bubbleLayer */,
-				E11BF00F071D4F0E2F9E9823227E069C /* NXBadgeView */,
-			);
-			name = views;
-			path = views;
-			sourceTree = "<group>";
-		};
 		D88579BD201EEBC5E2F18AE72963A1ED /* Products */ = {
 		D88579BD201EEBC5E2F18AE72963A1ED /* Products */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
@@ -1818,28 +1745,6 @@
 			name = Products;
 			name = Products;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
-		DE07FA69D0DC973CF995F695F0FA42C4 /* BFCustomViews */ = {
-			isa = PBXGroup;
-			children = (
-				D3614985C26DAB835F9809D21D506214 /* views */,
-			);
-			name = BFCustomViews;
-			path = BFCommonKit/Classes/BFCustomViews;
-			sourceTree = "<group>";
-		};
-		E11BF00F071D4F0E2F9E9823227E069C /* NXBadgeView */ = {
-			isa = PBXGroup;
-			children = (
-				051ED88A0299670B6BBB492D93929591 /* NXBadgeControl.swift */,
-				01D03F761A6A0996EE06280B58E787C0 /* NXBadgeView.swift */,
-				9D46E3281B6DFCFF07173A3FE2A0CC22 /* UIBarButtonItem+NXBadgeView.swift */,
-				AAB924A6B5A3843BD917E0AC118C4E34 /* UITabBarItem+NXBadgeView.swift */,
-				F6AB6C0495BDF68D307038D91D9617B4 /* UIView+NXBadgeView.swift */,
-			);
-			name = NXBadgeView;
-			path = NXBadgeView;
-			sourceTree = "<group>";
-		};
 		E2BBDFED5E8D7E6FC820BF8102B54814 /* Pods */ = {
 		E2BBDFED5E8D7E6FC820BF8102B54814 /* Pods */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
@@ -2392,23 +2297,13 @@
 				5DD1267F059579CD66FB374D86857953 /* BFUIView+Ext.swift in Sources */,
 				5DD1267F059579CD66FB374D86857953 /* BFUIView+Ext.swift in Sources */,
 				172AE7247A817A8A6B4FCEC0B95602BC /* Enums.swift in Sources */,
 				172AE7247A817A8A6B4FCEC0B95602BC /* Enums.swift in Sources */,
 				1FE8A9453D82CD25FA0E35508A8BD06C /* NXAudioRecorder.swift in Sources */,
 				1FE8A9453D82CD25FA0E35508A8BD06C /* NXAudioRecorder.swift in Sources */,
-				3FC3F0A9DB00D96ACB68A73329E64EA3 /* NXBadgeControl.swift in Sources */,
-				B34F82B9EFED4ADA71E1F1B4D2C1D391 /* NXBadgeView.swift in Sources */,
-				C8FC8A13AFBF06CBC22BE75E60253939 /* NXBubbleLayer.swift in Sources */,
-				A28A71B3E8FC9BDF768DEEC18C97F2C4 /* NXConfig.swift in Sources */,
-				71BB5F71CA8689837837CB185670DD6C /* NXContainView.swift in Sources */,
 				1F4DCF7B73621DB172E65C81D8B49886 /* NXDeviceManager.swift in Sources */,
 				1F4DCF7B73621DB172E65C81D8B49886 /* NXDeviceManager.swift in Sources */,
 				32664FCDA2DE67E8CB9536D3FC431BBC /* NXFileManager.swift in Sources */,
 				32664FCDA2DE67E8CB9536D3FC431BBC /* NXFileManager.swift in Sources */,
 				DFC649C65476B56BFE0A0467F8FF81F6 /* NXFundation+Ext.swift in Sources */,
 				DFC649C65476B56BFE0A0467F8FF81F6 /* NXFundation+Ext.swift in Sources */,
-				BE75613B5002D66F441003972A414789 /* NXInteractiveView.swift in Sources */,
 				91601706CE459E6EDAE65C34EE87D893 /* NXLogger.swift in Sources */,
 				91601706CE459E6EDAE65C34EE87D893 /* NXLogger.swift in Sources */,
 				941ED2A1B032803113E20386089E029D /* NXLoggerManager.swift in Sources */,
 				941ED2A1B032803113E20386089E029D /* NXLoggerManager.swift in Sources */,
 				8CBD7DC2908904A1262CD9EDFE6F97E6 /* NXLoggerVC.swift in Sources */,
 				8CBD7DC2908904A1262CD9EDFE6F97E6 /* NXLoggerVC.swift in Sources */,
-				96E3F071F3CCB87462E6F9F7DC8D21C4 /* NXNormalBubbleView.swift in Sources */,
-				1A9D1629BCDA0862744DAB9F95ABD8E5 /* NXTextBubbleView.swift in Sources */,
 				7CAC58FCF511B0B51A62BDF150BABB79 /* NXUI+Ext.swift in Sources */,
 				7CAC58FCF511B0B51A62BDF150BABB79 /* NXUI+Ext.swift in Sources */,
-				EFBDC1DB78C182FAC805959CBD630FF5 /* NXUIColor+Ext.swift in Sources */,
-				2092A92DA091FCA5B274BB4F3E96FD0C /* NXVoiceBubbleView.swift in Sources */,
 				C6629C51BCC7304A88173E50FB879A58 /* PQBaseModel.swift in Sources */,
 				C6629C51BCC7304A88173E50FB879A58 /* PQBaseModel.swift in Sources */,
 				C01C0AF4FF1C2CC2E2FF7CA4BFA81958 /* PQBaseViewController.swift in Sources */,
 				C01C0AF4FF1C2CC2E2FF7CA4BFA81958 /* PQBaseViewController.swift in Sources */,
 				151DAB6DBD1DBDF848479316B8F5C7CB /* PQBaseWebViewController.swift in Sources */,
 				151DAB6DBD1DBDF848479316B8F5C7CB /* PQBaseWebViewController.swift in Sources */,
@@ -2430,10 +2325,7 @@
 				82B564A452C4E704076FF4476614EE30 /* PQVideoSnapshotUtil.swift in Sources */,
 				82B564A452C4E704076FF4476614EE30 /* PQVideoSnapshotUtil.swift in Sources */,
 				0239F77D0AA0DCAD0687D8C8D713AB4E /* PQWeakTimer.swift in Sources */,
 				0239F77D0AA0DCAD0687D8C8D713AB4E /* PQWeakTimer.swift in Sources */,
 				58D60D57014E21DBEC30A9304D910CF1 /* SWNetRequest.swift in Sources */,
 				58D60D57014E21DBEC30A9304D910CF1 /* SWNetRequest.swift in Sources */,
-				8CD2B07E027F7523BCC45BD6345A9DDA /* UIBarButtonItem+NXBadgeView.swift in Sources */,
 				FACDC3740A66DBA01C5992A0B4220F93 /* UIControl+NXCategory.m in Sources */,
 				FACDC3740A66DBA01C5992A0B4220F93 /* UIControl+NXCategory.m in Sources */,
-				9C43E895F93541305452255143106541 /* UITabBarItem+NXBadgeView.swift in Sources */,
-				7C650D6C1F74F50E55F263A3E49BA7A5 /* UIView+NXBadgeView.swift in Sources */,
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		};
@@ -3304,8 +3196,7 @@
 				MTL_FAST_MATH = YES;
 				MTL_FAST_MATH = YES;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				STRIP_INSTALLED_PRODUCT = NO;
 				STRIP_INSTALLED_PRODUCT = NO;
-				SWIFT_COMPILATION_MODE = wholemodule;
-				SWIFT_OPTIMIZATION_LEVEL = "-O";
+				SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
 				SWIFT_VERSION = 5.0;
 				SWIFT_VERSION = 5.0;
 				SYMROOT = "${SRCROOT}/../build";
 				SYMROOT = "${SRCROOT}/../build";
 			};
 			};