Bläddra i källkod

Merge branch '订阅流程优化' into 合并分支

# Conflicts:
#	Podfile
#	Podfile.lock
#	Pods/Manifest.lock
#	Pods/Pods.xcodeproj/project.pbxproj
#	Pods/Pods.xcodeproj/xcuserdata/100years.xcuserdatad/xcschemes/BSText.xcscheme
#	Pods/Pods.xcodeproj/xcuserdata/100years.xcuserdatad/xcschemes/SVProgressHUD.xcscheme
#	Pods/Pods.xcodeproj/xcuserdata/100years.xcuserdatad/xcschemes/xcschememanagement.plist
#	Pods/SVProgressHUD/SVProgressHUD/PrivacyInfo.xcprivacy
#	Pods/Target Support Files/BSText/BSText-Info.plist
#	Pods/Target Support Files/BSText/BSText-prefix.pch
#	Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-acknowledgements.markdown
#	Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-acknowledgements.plist
#	Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-frameworks-Debug-input-files.xcfilelist
#	Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-frameworks-Debug-output-files.xcfilelist
#	Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-frameworks-Release-input-files.xcfilelist
#	Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-frameworks-Release-output-files.xcfilelist
#	Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-frameworks.sh
#	Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper.debug.xcconfig
#	Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper.release.xcconfig
#	Pods/Target Support Files/SVProgressHUD/SVProgressHUD.debug.xcconfig
#	Pods/Target Support Files/SVProgressHUD/SVProgressHUD.release.xcconfig
#	Pods/Target Support Files/YYImage/YYImage-Info.plist
#	Pods/Target Support Files/YYImage/YYImage-prefix.pch
#	TSLiveWallpaper.xcodeproj/project.pbxproj
#	TSLiveWallpaper/AppDelegate.swift
100Years 3 månader sedan
förälder
incheckning
b5cf50aec5
94 ändrade filer med 8587 tillägg och 118 borttagningar
  1. BIN
      .DS_Store
  2. 1 6
      Podfile
  3. 10 12
      Podfile.lock
  4. 46 0
      Pods/Manifest.lock
  5. 3166 0
      Pods/Pods.xcodeproj/project.pbxproj
  6. 58 0
      Pods/Pods.xcodeproj/xcuserdata/100years.xcuserdatad/xcschemes/SVProgressHUD.xcscheme
  7. 76 0
      Pods/Pods.xcodeproj/xcuserdata/100years.xcuserdatad/xcschemes/xcschememanagement.plist
  8. 21 0
      Pods/SVProgressHUD/LICENSE
  9. 221 0
      Pods/SVProgressHUD/README.md
  10. 14 0
      Pods/SVProgressHUD/SVProgressHUD/PrivacyInfo.xcprivacy
  11. 17 0
      Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h
  12. 142 0
      Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.m
  13. 17 0
      Pods/SVProgressHUD/SVProgressHUD/SVProgressAnimatedView.h
  14. 96 0
      Pods/SVProgressHUD/SVProgressHUD/SVProgressAnimatedView.m
  15. BIN
      Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask.png
  16. BIN
      Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@2x.png
  17. BIN
      Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@3x.png
  18. BIN
      Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error.png
  19. BIN
      Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@2x.png
  20. BIN
      Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@3x.png
  21. BIN
      Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info.png
  22. BIN
      Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@2x.png
  23. BIN
      Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@3x.png
  24. BIN
      Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success.png
  25. BIN
      Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@2x.png
  26. BIN
      Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@3x.png
  27. 392 0
      Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h
  28. 1524 0
      Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.m
  29. 14 0
      Pods/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.h
  30. 25 0
      Pods/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.m
  31. 145 0
      Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-acknowledgements.markdown
  32. 219 0
      Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-acknowledgements.plist
  33. 7 0
      Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-frameworks-Debug-input-files.xcfilelist
  34. 6 0
      Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-frameworks-Debug-output-files.xcfilelist
  35. 7 0
      Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-frameworks-Release-input-files.xcfilelist
  36. 6 0
      Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-frameworks-Release-output-files.xcfilelist
  37. 196 0
      Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-frameworks.sh
  38. 17 0
      Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper.debug.xcconfig
  39. 17 0
      Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper.release.xcconfig
  40. 26 0
      Pods/Target Support Files/SVProgressHUD/SVProgressHUD-Info.plist
  41. 5 0
      Pods/Target Support Files/SVProgressHUD/SVProgressHUD-dummy.m
  42. 12 0
      Pods/Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch
  43. 20 0
      Pods/Target Support Files/SVProgressHUD/SVProgressHUD-umbrella.h
  44. 13 0
      Pods/Target Support Files/SVProgressHUD/SVProgressHUD.debug.xcconfig
  45. 6 0
      Pods/Target Support Files/SVProgressHUD/SVProgressHUD.modulemap
  46. 13 0
      Pods/Target Support Files/SVProgressHUD/SVProgressHUD.release.xcconfig
  47. 65 7
      TSLiveWallpaper.xcodeproj/project.pbxproj
  48. 9 2
      TSLiveWallpaper/AppDelegate.swift
  49. 22 0
      TSLiveWallpaper/Assets.xcassets/Common/check.imageset/Contents.json
  50. BIN
      TSLiveWallpaper/Assets.xcassets/Common/check.imageset/check@2x.png
  51. BIN
      TSLiveWallpaper/Assets.xcassets/Common/check.imageset/check@3x.png
  52. 6 0
      TSLiveWallpaper/Assets.xcassets/Vip/Contents.json
  53. 22 0
      TSLiveWallpaper/Assets.xcassets/Vip/close_gray.imageset/Contents.json
  54. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/close_gray.imageset/close_gray@2x.png
  55. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/close_gray.imageset/close_gray@3x.png
  56. 22 0
      TSLiveWallpaper/Assets.xcassets/Vip/lIvelivepro.imageset/Contents.json
  57. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/lIvelivepro.imageset/lIvelivepro@2x.png
  58. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/lIvelivepro.imageset/lIvelivepro@3x.png
  59. 22 0
      TSLiveWallpaper/Assets.xcassets/Vip/livelive.imageset/Contents.json
  60. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/livelive.imageset/livelive@2x.png
  61. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/livelive.imageset/livelive@3x.png
  62. 22 0
      TSLiveWallpaper/Assets.xcassets/Vip/noVip_big_bg.imageset/Contents.json
  63. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/noVip_big_bg.imageset/noVip_big_bg@2x.png
  64. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/noVip_big_bg.imageset/noVip_big_bg@3x.png
  65. 22 0
      TSLiveWallpaper/Assets.xcassets/Vip/vip_big_bg.imageset/Contents.json
  66. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/vip_big_bg.imageset/vip_big_bg@2x.png
  67. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/vip_big_bg.imageset/vip_big_bg@3x.png
  68. 22 0
      TSLiveWallpaper/Assets.xcassets/Vip/vip_big_icon.imageset/Contents.json
  69. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/vip_big_icon.imageset/vip_big_icon@2x.png
  70. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/vip_big_icon.imageset/vip_big_icon@3x.png
  71. 22 0
      TSLiveWallpaper/Assets.xcassets/Vip/vip_icon.imageset/Contents.json
  72. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/vip_icon.imageset/vip_icon@2x.png
  73. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/vip_icon.imageset/vip_icon@3x.png
  74. 32 11
      TSLiveWallpaper/Business/TSEditLiveVC/TSEditLiveEidtCell.swift
  75. 27 7
      TSLiveWallpaper/Business/TSEditLiveVC/TSEditLiveVC.swift
  76. 48 6
      TSLiveWallpaper/Business/TSHomeVC/TSLiveWallpaperBrowseVC/TSLiveWallpaperBrowseVC.swift
  77. 92 2
      TSLiveWallpaper/Business/TSMineVC/TSMineVC.swift
  78. 426 0
      TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSPurchaseMembershipVC.swift
  79. 327 0
      TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSPurchaseVC.swift
  80. 41 0
      TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSViewTool/PhotoManager.swift
  81. 24 9
      TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSViewTool/TSViewTool.swift
  82. 17 4
      TSLiveWallpaper/Business/TSRandomWallpaperVC/TSRandomWallpaperBrowseVC/TSRandomWallpaperBrowseVC.swift
  83. 5 0
      TSLiveWallpaper/Common/BaseClass/TSBaseCollectionCell.swift
  84. 47 0
      TSLiveWallpaper/Common/Ex/SwiftUI/Color+Ex.swift
  85. 16 0
      TSLiveWallpaper/Common/Ex/SwiftUI/Font+Ex.swift
  86. 6 1
      TSLiveWallpaper/Common/Ex/UIColor+Ex.swift
  87. 43 0
      TSLiveWallpaper/Common/NetworkManager/TSNetworkManager.swift
  88. 550 0
      TSLiveWallpaper/Common/Purchase/TSPurchaseManager.swift
  89. 12 23
      TSLiveWallpaper/Common/Tool/TSToastTool.swift
  90. 3 3
      TSLiveWallpaper/DataManger/Config/TSConfig.swift
  91. 2 2
      TSLiveWallpaper/DataManger/TSHomeDataModel.swift
  92. 4 2
      TSLiveWallpaper/DataManger/TSImageDataCenter.swift
  93. 2 2
      TSLiveWallpaper/DataManger/TSRandomWallpaperModel.swift
  94. 52 19
      TSLiveWallpaper/Resource/Json/response.json

BIN
.DS_Store


+ 1 - 6
Podfile

@@ -11,16 +11,11 @@ target 'TSLiveWallpaper' do
 
   pod 'ObjectMapper', '4.2'
   pod 'SnapKit'
-
-  pod 'Toast-Swift'
+  pod 'SVProgressHUD'
   pod 'Kingfisher', '7.10.0'
-#  pod 'Alamofire', '5.6.4'
-
   pod 'MJRefresh', '3.7.5'
-  pod 'IQKeyboardManagerSwift', '6.5.12'
   pod 'TYCyclePagerView'
   pod 'Google-Mobile-Ads-SDK'
-
 end
 
 

+ 10 - 12
Podfile.lock

@@ -1,48 +1,46 @@
 PODS:
-  - Google-Mobile-Ads-SDK (11.12.0):
+  - Google-Mobile-Ads-SDK (11.13.0):
     - GoogleUserMessagingPlatform (>= 1.1)
   - GoogleUserMessagingPlatform (2.7.0)
-  - IQKeyboardManagerSwift (6.5.12)
   - Kingfisher (7.10.0)
   - MJRefresh (3.7.5)
   - ObjectMapper (4.2.0)
   - SnapKit (5.7.1)
-  - Toast-Swift (5.1.1)
+  - SVProgressHUD (2.3.1):
+    - SVProgressHUD/Core (= 2.3.1)
+  - SVProgressHUD/Core (2.3.1)
   - TYCyclePagerView (1.2.0)
 
 DEPENDENCIES:
   - Google-Mobile-Ads-SDK
-  - IQKeyboardManagerSwift (= 6.5.12)
   - Kingfisher (= 7.10.0)
   - MJRefresh (= 3.7.5)
   - ObjectMapper (= 4.2)
   - SnapKit
-  - Toast-Swift
+  - SVProgressHUD
   - TYCyclePagerView
 
 SPEC REPOS:
   trunk:
     - Google-Mobile-Ads-SDK
     - GoogleUserMessagingPlatform
-    - IQKeyboardManagerSwift
     - Kingfisher
     - MJRefresh
     - ObjectMapper
     - SnapKit
-    - Toast-Swift
+    - SVProgressHUD
     - TYCyclePagerView
 
 SPEC CHECKSUMS:
-  Google-Mobile-Ads-SDK: 3a76704456669fbed2057efc8bdb99050ad0e3fb
+  Google-Mobile-Ads-SDK: 14f57f2dc33532a24db288897e26494640810407
   GoogleUserMessagingPlatform: a8b56893477f67212fbc8411c139e61d463349f5
-  IQKeyboardManagerSwift: 371b08cb39664fb56030f5345c815a4ffc74bbc0
   Kingfisher: a18f05d3b6d37d8650ee4a3e61d57a28fc6207f6
   MJRefresh: fdf5e979eb406a0341468932d1dfc8b7f9fce961
   ObjectMapper: 1eb41f610210777375fa806bf161dc39fb832b81
   SnapKit: d612e99e678a2d3b95bf60b0705ed0a35c03484a
-  Toast-Swift: 7a03a532afe3a560d4044bc7c237e2864d295173
+  SVProgressHUD: 4837c74bdfe2e51e8821c397825996a8d7de6e22
   TYCyclePagerView: 2b051dade0615c70784aa34f40c646feeddb7344
 
-PODFILE CHECKSUM: 83fae2a44d318b5c7d1ccdbcb7062e74c4932ec2
+PODFILE CHECKSUM: 1390eb969d4ab2d2a69b497b7c91dc05d039b28a
 
-COCOAPODS: 1.15.2
+COCOAPODS: 1.16.2

+ 46 - 0
Pods/Manifest.lock

@@ -0,0 +1,46 @@
+PODS:
+  - Google-Mobile-Ads-SDK (11.13.0):
+    - GoogleUserMessagingPlatform (>= 1.1)
+  - GoogleUserMessagingPlatform (2.7.0)
+  - Kingfisher (7.10.0)
+  - MJRefresh (3.7.5)
+  - ObjectMapper (4.2.0)
+  - SnapKit (5.7.1)
+  - SVProgressHUD (2.3.1):
+    - SVProgressHUD/Core (= 2.3.1)
+  - SVProgressHUD/Core (2.3.1)
+  - TYCyclePagerView (1.2.0)
+
+DEPENDENCIES:
+  - Google-Mobile-Ads-SDK
+  - Kingfisher (= 7.10.0)
+  - MJRefresh (= 3.7.5)
+  - ObjectMapper (= 4.2)
+  - SnapKit
+  - SVProgressHUD
+  - TYCyclePagerView
+
+SPEC REPOS:
+  trunk:
+    - Google-Mobile-Ads-SDK
+    - GoogleUserMessagingPlatform
+    - Kingfisher
+    - MJRefresh
+    - ObjectMapper
+    - SnapKit
+    - SVProgressHUD
+    - TYCyclePagerView
+
+SPEC CHECKSUMS:
+  Google-Mobile-Ads-SDK: 14f57f2dc33532a24db288897e26494640810407
+  GoogleUserMessagingPlatform: a8b56893477f67212fbc8411c139e61d463349f5
+  Kingfisher: a18f05d3b6d37d8650ee4a3e61d57a28fc6207f6
+  MJRefresh: fdf5e979eb406a0341468932d1dfc8b7f9fce961
+  ObjectMapper: 1eb41f610210777375fa806bf161dc39fb832b81
+  SnapKit: d612e99e678a2d3b95bf60b0705ed0a35c03484a
+  SVProgressHUD: 4837c74bdfe2e51e8821c397825996a8d7de6e22
+  TYCyclePagerView: 2b051dade0615c70784aa34f40c646feeddb7344
+
+PODFILE CHECKSUM: 1390eb969d4ab2d2a69b497b7c91dc05d039b28a
+
+COCOAPODS: 1.16.2

+ 3166 - 0
Pods/Pods.xcodeproj/project.pbxproj

@@ -0,0 +1,3166 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 63;
+	objects = {
+
+/* Begin PBXAggregateTarget section */
+		458B188365A307B3C128ABF524D1A3E3 /* GoogleUserMessagingPlatform */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = DC84AF93961DBCB285D9DE89BA2EC756 /* Build configuration list for PBXAggregateTarget "GoogleUserMessagingPlatform" */;
+			buildPhases = (
+				D8CE6773DA3A928A26838B55A50686FD /* [CP] Copy XCFrameworks */,
+			);
+			dependencies = (
+				85444D31F01ADA8C240C82E01A967B7C /* PBXTargetDependency */,
+			);
+			name = GoogleUserMessagingPlatform;
+		};
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+		00789924F6FF8825AF75A2776BFA015F /* ISO8601DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72620E6CC24AD85B1DA6818937B2942C /* ISO8601DateTransform.swift */; };
+		0114B8F5F20574BB892ACFE2B202D95C /* MJRefreshTrailer.h in Headers */ = {isa = PBXBuildFile; fileRef = DC375425FC3A5266DFB33E00794ADAA5 /* MJRefreshTrailer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		02B7416CC6A9582F83E0952ADA012AE9 /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F85A1085F6E3578726D9EBA1B318563E /* SessionDelegate.swift */; };
+		0481F9824059F400F094445B6CE1F07A /* DictionaryTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E8A070E55423DB45C71FBB622910DF5 /* DictionaryTransform.swift */; };
+		056A1447967A759C17639EB5AEDA9C3E /* KFImageProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B980123DB78E9E9689E5DD230A4E2CFC /* KFImageProtocol.swift */; };
+		0618948593929F3BA22D724508AB26D5 /* ExtensionHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E013F5B25E40EFDBEE0F8807FF165C7 /* ExtensionHelpers.swift */; };
+		0623CEAC99F6629041AD3CFB1DAA6348 /* MJRefreshTrailer.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DE8CF9BA328B3C92047EC89C38F2AD0 /* MJRefreshTrailer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		064D909CD827405E8DCC309DB1B7775A /* ConstraintLayoutSupportDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 569CB4290F07D6618235288636620737 /* ConstraintLayoutSupportDSL.swift */; };
+		09E1F569A93FAD4B9149E30B9301F44A /* ConstraintPriority.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A03838EF90968EC3890E5B75807DE76 /* ConstraintPriority.swift */; };
+		0A8E3C4B23DEE792B723A539DCBBFC23 /* TYCyclePagerTransformLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = F1F3D58187DBAACA10DD0873FC7EE0BA /* TYCyclePagerTransformLayout.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		0BD80D0BA5C72ACE2C5D5E18F1E7C517 /* DateFormatterTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF1BF5600489BB9D5D4C9894971610E1 /* DateFormatterTransform.swift */; };
+		0CA7A132ABE7018DE9295456732F38BB /* ConstraintAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = D949E4A6CD4FB8F9CF624858E96D2CB1 /* ConstraintAttributes.swift */; };
+		0CD18E278D46019A0260030BA7880D65 /* UIScrollView+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B792222193C3597FB1A968FD4E23ABB /* UIScrollView+MJRefresh.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		0DE5DB9C6227B3416778D8417DD95EA9 /* ConstraintView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 117776ABEE88633280D920326B53ACE7 /* ConstraintView+Extensions.swift */; };
+		1084DEDFE125E20BCD4BC1CEB4984828 /* CallbackQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E52F29EAAEBBACB099D95F3F2825A42 /* CallbackQueue.swift */; };
+		1194E62AA3F6F506799B1A43B16942B5 /* ConstraintDirectionalInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42075ED0F4D281FF1164BB1ADE4A306F /* ConstraintDirectionalInsets.swift */; };
+		1493DD91336DE7675C83360B987057DD /* GoogleMobileAdsPlaceholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5906052A0BDBA1CEE1662E980D1BAB0 /* GoogleMobileAdsPlaceholder.swift */; };
+		14F6602F47FF59347CB6807CE217EDC5 /* SVProgressAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = 03DAC16752F2285063CC395430DCC9BD /* SVProgressAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1739C4B63D12177E58B7110F21E939EB /* SVIndefiniteAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = D34D725E9B182F60DA17677D545A6912 /* SVIndefiniteAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		181E5F4343C6D3625AE04C1B0D70F0C7 /* MJRefreshAutoStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 2EDB0E73C598F39976ED284DB941FC0C /* MJRefreshAutoStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1863245AE4FA028973E98A8E87F49EFE /* Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7562916F682197E0D145D51A42ACE9CB /* Kingfisher.swift */; };
+		191FEC18B72117CEB8984C99DCB07CF6 /* ImageDownloaderDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5382673445F3F24283C635C97855194 /* ImageDownloaderDelegate.swift */; };
+		19C1E5D99ABCBAF3E50A980AD50BEE23 /* Kingfisher-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FDD1AAD8907D0DA4B94BE5340313E4A3 /* Kingfisher-dummy.m */; };
+		19FC9097A32E37FA54EC7E0019E71BAB /* WKInterfaceImage+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE031B2E442E3E5DA09FFB5AEE5E85E1 /* WKInterfaceImage+Kingfisher.swift */; };
+		1B7776278FEC24E87B699C7CE063B6E0 /* KFImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5B37D1644A0E8B42A83516F3B447D37 /* KFImage.swift */; };
+		1BF246E34478750D399B09645820D163 /* SVProgressHUD-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 486B1CD13E324DFFE8880EB716ABAEA3 /* SVProgressHUD-dummy.m */; };
+		1C223175AEB10BEB2B143CF995E8C956 /* ImageBinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B4AB73695E4F4BA8AE801955F8AC42B /* ImageBinder.swift */; };
+		1C503D444798F1298C6B6C59F8E845B7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93C1F2AB798562AF39FE348F051A446C /* Foundation.framework */; };
+		1CDB03419D31CB46D2DDA3BDBFE54FA0 /* MJRefreshAutoFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1575B14E98FEB3102624BB354AC695BF /* MJRefreshAutoFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1EE625CD87BF3ECFF0513FB072749EAD /* MJRefreshConst.m in Sources */ = {isa = PBXBuildFile; fileRef = D00AB603790D645168584B22A580A71E /* MJRefreshConst.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		205EB01AED14BB574DD54EAFE26E4786 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93C1F2AB798562AF39FE348F051A446C /* Foundation.framework */; };
+		20EB33A4E3293236A23180A08E36B3B3 /* ImageContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABF6DB8877AC9F036CEAC0C5F7D49976 /* ImageContext.swift */; };
+		219F221FF0713B5F920B403F8838F1EF /* RedirectHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF644ED8C1DC3DA38D08EB8274DFC654 /* RedirectHandler.swift */; };
+		227689457853D692C621E35159D90E0F /* SVProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CCB23816455F92B4A0E4B12C290662F /* SVProgressHUD.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		22BFD40CE7D7C51ED1353F3D9E81103F /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6F5FFDC24FD3C56061FFE1533481810 /* Image.swift */; };
+		2444AAB65C64CE9F376FE3859D1C1026 /* MemoryStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3400E96BD5FDE7E65619F5F5463D5E85 /* MemoryStorage.swift */; };
+		247957E28FB69E9B4E5775456516CF6F /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = F181C97D7C7F130D7149AD2A196E73F8 /* Result.swift */; };
+		25563554339AB6EF1C771ACCF0641CC5 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 109719F21622CAB10C24560B1CD88A8F /* PrivacyInfo.xcprivacy */; };
+		2B2EB369550CE92CEEFCBFD3D32B8A3F /* ConstraintInsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BC10B2297049F49CB48E81F7773F720 /* ConstraintInsetTarget.swift */; };
+		2CC335A4FA15A2B3254109561D8D3B52 /* CustomDateFormatTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6478A9062152B3EABF0C1AE52EA6DAA /* CustomDateFormatTransform.swift */; };
+		2D0B359292A970DBCFCEA10E753788CE /* AuthenticationChallengeResponsable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 008BA1F9DE782AF6A5BDE84FFB3F3988 /* AuthenticationChallengeResponsable.swift */; };
+		3051B194B166E36A3564CA607EBD7589 /* Mapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8976F649DFD66CB233B9B975047F677 /* Mapper.swift */; };
+		30A56A3897BBCB69E8CCF9BF317D58A8 /* Kingfisher-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 97E2BB35975B78FA5E7A453910BBD476 /* Kingfisher-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3255C72E0498D901382FCE9AE5BBE7C7 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03B95B2EEACD0C5CA7E31072FCE699EA /* Accelerate.framework */; };
+		3317DC9751692475C7BF6CA18EE999CE /* Google-Mobile-Ads-SDK-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E658AD49AC96E97CEDAE40FC265A917 /* Google-Mobile-Ads-SDK-dummy.m */; };
+		34E3A0CEF1DF0EF6C3F747CB73B711A2 /* ObjectMapper-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B34FF616FC55EE370A6A03521DF76EEB /* ObjectMapper-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3577F172FA68CBAE47CFEE6FE25C5404 /* ConstraintOffsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4887762950D6631638E32653A89849E8 /* ConstraintOffsetTarget.swift */; };
+		3769DDC469C4CECA0F9883481E631CC2 /* MJRefreshGifHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = B827A9BBA3643BEDD8B4F1D33FF1D557 /* MJRefreshGifHeader.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		37AC1ECC6C59A21CAFB5369AD74345EA /* SizeExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBB189A644E7A4CB22D7E72FB21D9053 /* SizeExtensions.swift */; };
+		39E0E6446BA7506FD60899B82736AA3B /* DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BBF9E09855C23F3398645798DDCD1E7 /* DateTransform.swift */; };
+		3B0F6667924D326702F319AAEECDFCBE /* MJRefreshStateHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BEE646A39C3D6CBFD38B4AE6F33BE16 /* MJRefreshStateHeader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		3D06924F0E274E28A3985B54E658A49E /* Resource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51EC4E247A4627550E3A4DFC4DB3EB5D /* Resource.swift */; };
+		3D3B646B4988314275B40E97BEB16C7F /* ConstraintLayoutGuideDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = D95BFC374DD09039C245B45143FA6B53 /* ConstraintLayoutGuideDSL.swift */; };
+		3D7C7FC21E4496EF860BF84959DD5369 /* RequestModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1DE8BB21F7FF3798401D638E7AFC62F /* RequestModifier.swift */; };
+		3DA5FE69B2722A2B9FC979B6C806C904 /* UICollectionViewLayout+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A0B0BF6D7AA8DE109C139D5E04D1F94 /* UICollectionViewLayout+MJRefresh.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		3FC41EE174BEAC4799EC3DF4FFDBEDA5 /* MJRefreshBackFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E1565A5D095F52AAF9537EA921A7C12 /* MJRefreshBackFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		40251EE765FD8660BC2867F07D2753A7 /* DiskStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 931137DB47CFD761A117E68086D0217D /* DiskStorage.swift */; };
+		40C30C41381B48585CA4E919C7E8F97F /* KF.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9604163F654974588BDC7B1524BCEC0 /* KF.swift */; };
+		424435B35F2591B77429269BDAFEB077 /* HexColorTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF6E8F2CFD13819AE6138BA4BFAAFB71 /* HexColorTransform.swift */; };
+		440CDB9679BB987D372F43B5A4328122 /* ImageDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614B5EE6FE23207ABBFB1AEE843E52DE /* ImageDownloader.swift */; };
+		44C9B5D2765C71F13094D8B335D45118 /* Indicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 199CA14134D9876770126A0051E041E9 /* Indicator.swift */; };
+		47FFC4DADAFC4D661A22AED52CB8CB8D /* ImageProgressive.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE24EF88457FE9162EA909F6E2B519BF /* ImageProgressive.swift */; };
+		4BF85A95BFA6ED352C220750718B2054 /* AnimatedImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9E7AFC9FC46BE415C83A303AABC7036 /* AnimatedImageView.swift */; };
+		4C80D1E1033262E0C7A3C0E4B5D4B879 /* GIFAnimatedImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF41D623B9CC1A85C401E955068D30A7 /* GIFAnimatedImage.swift */; };
+		4F4DEB687C0E4834A5B291DEE0651D6A /* ConstraintMaker.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6ADEB10A6CC0E326DB2E09E6D035BDE /* ConstraintMaker.swift */; };
+		4FC485A749A8AD5CB5135B86A7422103 /* IntegerOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4915351A0B077ADECF2E5D08B5A77E13 /* IntegerOperators.swift */; };
+		510E3750BD2A8E80DD85CF7549003D38 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93C1F2AB798562AF39FE348F051A446C /* Foundation.framework */; };
+		517F7F319A053766D1CE3C3E7A57EB7A /* EnumOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D313831315E975A84CB0359CFF86232 /* EnumOperators.swift */; };
+		528D9579B7D4144571011680B7C948AE /* MJRefreshAutoGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 93EBDF0C81E73FE8F063AF364FCB94D7 /* MJRefreshAutoGifFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		52B245FBAA75650F25877AB89AAAEE83 /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50FB7C00F5D31CF2EF1224D1BE95B3C5 /* Storage.swift */; };
+		56DD427110264C5120B1645F896AE5A0 /* ImageDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 693DF413E70DB0BA154C6CE76DEB51FA /* ImageDataProvider.swift */; };
+		57C4F6EFB30DDD14E960AC2D6B34F904 /* SnapKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F7241B544AEE0A5CB6F970EBEBA6BEE3 /* SnapKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		586892B5976E38B71FCD6841816F568E /* TYCyclePagerView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 03A2BBF58DD72D668FE9A1B678C20735 /* TYCyclePagerView-dummy.m */; };
+		58B1051758A1FA76C2B9F8C07AC1E55C /* MJRefreshBackNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 07BAF99D048575D80C266DC967F49F98 /* MJRefreshBackNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		5901084F0039F17126684A022E5F84B5 /* MJRefreshConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E990C2560189884EBE94B6B173B5C3A /* MJRefreshConfig.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		5922A6A0AE7152CF436356B3556F1835 /* ConstraintItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCAF93D16E6A8D0B02ED7314A2FE15B2 /* ConstraintItem.swift */; };
+		593FBBC2A00CC20738DF20DD72F95716 /* TYCyclePagerView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 94388666B10E7A5B2C7871D30D26F405 /* TYCyclePagerView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		59F34874DA4ABB2F5C4E09EA6865936B /* ConstraintLayoutGuide.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9116595B9BB0262B36F7AABC6D5FD38 /* ConstraintLayoutGuide.swift */; };
+		5A6E2A1B8B7F1A3DF7C29F5052E21B94 /* TYCyclePagerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5AEA0F568EB28A8DE17929677DAD06E1 /* TYCyclePagerView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		5B8EEB396F66172C10168511A111BAEA /* ImmutableMappable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C755FB4B0D26371AABEB583517BC9BCF /* ImmutableMappable.swift */; };
+		5C50F36F9CB20A20396364C601DB40B0 /* MJRefreshBackStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = EB6BE2EECD05E003A95BE63BDA6A147D /* MJRefreshBackStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		5D4AD372E92E5EACC7BB6961F139E7CF /* Placeholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 792B3BD253325A9FB373CAFCD6C14BFE /* Placeholder.swift */; };
+		5E499E1F34F0337CBA679BDEBEE13AFF /* SVProgressAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D80BDF9CDFBB26A39C5A900867C53D4 /* SVProgressAnimatedView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		5F2622E174BFC945E9C40B8BFFC9BC82 /* MJRefresh.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 31EF154EF8D60F5A7972D59273D5EC48 /* MJRefresh.bundle */; };
+		5FF1C3AF7672F55437688FC35E2E6A71 /* MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 15A6DC355D7202F38913F711B28C27CE /* MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		6037BA6633BDFF4F63D6C8B7C70D6160 /* SVProgressHUD-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7F5A0C00FBB95691845ACAD5D3E0DE27 /* SVProgressHUD-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		61D98B283CE925046B10319E0084EB47 /* CodableTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = D703D6AB6E1F1CFE2FB5AFAAEA896215 /* CodableTransform.swift */; };
+		638821550E992E4B6834C48468336743 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 487A3EF03C8C68A1444BDC5DF26BCC26 /* PrivacyInfo.xcprivacy */; };
+		6569B2EB2A065A6DAE052C96FF24048B /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 05B7C7934BE84D598229153377544E33 /* PrivacyInfo.xcprivacy */; };
+		65FCE0BF7B6F6710C5025D5F722B555B /* MJRefreshConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 54B834F25B43F75D7C5375CCE2EDE4A0 /* MJRefreshConfig.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		6667B9B21D09664BA9720313CC684C35 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17FFD459722D7EE2E10AD7B28AA29D90 /* Filter.swift */; };
+		6680C3C8924C7503A6A54CF7A66BFF2F /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BB11601B66E6CE1B46FD3A8A5752CC40 /* QuartzCore.framework */; };
+		69D747DF6653B804F8FC83A034BD27D9 /* CacheSerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3FE7B757E5EAE17A0D74241DC0FC30F /* CacheSerializer.swift */; };
+		6C2495648ACE8166A673D54F82E701A7 /* GraphicsContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D9D2C951AC12BB75E30C064071B59BD /* GraphicsContext.swift */; };
+		6E1A710F60FF319B7609A69CC4E318DF /* NSBundle+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D2D2AE277B824AAB456055EC33FE0C1 /* NSBundle+MJRefresh.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		6E39129FC8643A70C276801FEF4C280D /* Constraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABB2558CF332395BFE5FC70D755389F3 /* Constraint.swift */; };
+		6EB8DB7E0B46D8D212C632E7F18F45D0 /* EnumTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 685F5BFF05AC11DC7385B1E92E507948 /* EnumTransform.swift */; };
+		705227AC0D2868E0C0452B6B2F13E7AA /* UIScrollView+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 1473D193E24EEE8125E71A693002F933 /* UIScrollView+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		742025AB277967D7DCA2DCF54450C636 /* UIButton+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 645BAD837B3E5AD79E417803B84CA918 /* UIButton+Kingfisher.swift */; };
+		7636EAA22DF6CDFBA7CE2BA339753CD7 /* ImageDataProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D78C19FC513762DB6DA31E72ED78966 /* ImageDataProcessor.swift */; };
+		76870D9A6571AFCA2C12FE58825C5F65 /* TYPageControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 02E63CCDBB4348AFB3A4A9CB50804A21 /* TYPageControl.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		7750AEDBA3A2CA3CB301624B2D41203C /* Pods-TSLiveWallpaper-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F001A8E4D6F9CB1701C8EB0618069BCA /* Pods-TSLiveWallpaper-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		7804E0B3C98A2FE1E98AF544E88C9C3C /* SVRadialGradientLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4204A52717236829F318CA39A3CE9356 /* SVRadialGradientLayer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		7AE947D892D6535316D7704251FAB8E7 /* ImageDrawing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97F9630E5F4311CAF023680F24DC9FD6 /* ImageDrawing.swift */; };
+		7AF516B98D45391B909D507D0244104C /* ConstraintDescription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86EC8DCBD0FC3810D2694B2989E2D8F1 /* ConstraintDescription.swift */; };
+		7B0DD32902633C7FF95B5745D8322BC3 /* SVProgressHUD.bundle in Resources */ = {isa = PBXBuildFile; fileRef = B9C46CD572EE304E35942429F841EF68 /* SVProgressHUD.bundle */; };
+		7B621C6E37AB3F94E2081A93883D0EE9 /* MJRefresh-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BFC01080AAE49C0643BED03FD188CA35 /* MJRefresh-dummy.m */; };
+		7BCFF35E5AEFB2CF255E0C9F482AC9EB /* TYPageControl.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E33D66937E22F62E40786160FCCBC7C /* TYPageControl.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		7C5679B6B27E7454F3757D1D33080DEB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93C1F2AB798562AF39FE348F051A446C /* Foundation.framework */; };
+		7D42390CDB4FA147504B03DA2A174A0C /* ConstraintViewDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 557E0428F9B36B97FCCCAB692B892FB4 /* ConstraintViewDSL.swift */; };
+		7D81692987F9DB3AFA07F174C9CA2950 /* KFImageOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A72357EE306E9D4DEC7BFA9524C281 /* KFImageOptions.swift */; };
+		7E78FFFDB62A42993493D619C089DC54 /* UIScrollView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = BC3748FB414F15B1B2C3BE1E11DC8DAF /* UIScrollView+MJExtension.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		8077A41ACD375F4384A97031D20DA8C2 /* MJRefreshAutoGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 887107269FA2138D9AD9197016CCEC90 /* MJRefreshAutoGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		8235263A2FD63EFCFBC7D4B796F16869 /* MJRefreshHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EA8F04A9489818026454CA06998DF56 /* MJRefreshHeader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		83D42F8922509324A1C3437B1B457203 /* RetryStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9F1682DCFB4DDDFC35AB767FFFEC2CE /* RetryStrategy.swift */; };
+		863265A549BF19D79A4EBB25C183DC7F /* MJRefreshAutoNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EF78676DEEEF51F2612962C4DA5CC3F /* MJRefreshAutoNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		866E636E0A9BA91E115C0484A2D4626D /* Kingfisher-Kingfisher in Resources */ = {isa = PBXBuildFile; fileRef = C298ABB78D9B05529B89D8322DB2E7B0 /* Kingfisher-Kingfisher */; };
+		868A9F524A7985BDA1EA124D9BF4CA63 /* ConstraintDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D2730569D14635EBFB843CDD582510D /* ConstraintDSL.swift */; };
+		86CAB01D950C8BC35EDE0BDC01A2500B /* ConstraintView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F8FB555C8ED9C880ABFEBF47AAFDF39 /* ConstraintView.swift */; };
+		86F6786CAD5710E8B4A8C0D23C6632E4 /* ImageTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5142E24DC056DBA693836F65E6BD57B /* ImageTransition.swift */; };
+		8730086F6B396B34ABD63AEECB1A6607 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5807456ED7E78F213957CEC2E7DE468 /* CFNetwork.framework */; };
+		883EDEE1C699497CF2A77C3B8A32A790 /* ConstraintMultiplierTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66AD72DD5196D9563E6C3C665A7DA897 /* ConstraintMultiplierTarget.swift */; };
+		89235D5EC1FA4F0FD6165B17B542D714 /* MJRefreshConst.h in Headers */ = {isa = PBXBuildFile; fileRef = ABF2CF8A063638CABC43B38AD0F57C08 /* MJRefreshConst.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		89717EC07E6324D3405867E754AE9131 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = E54A4918A66DD9A5CB757E32AF12F4C7 /* PrivacyInfo.xcprivacy */; };
+		8BABA32F7B94A25D8E9208C0A8D90B2E /* ConstraintMakerRelatable+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86FA8CDA1A18D8678B19706722589D79 /* ConstraintMakerRelatable+Extensions.swift */; };
+		8C40DB2375972F4F65E2334D44B4C1E4 /* MJRefreshBackStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = ED2D264409F6AB7D03B65FB725A08C00 /* MJRefreshBackStateFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		8E2704A6AF675A59F00B43A82F3BCE43 /* ObjectMapper-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B5B46615B29A84C72637FA9A1617A61D /* ObjectMapper-dummy.m */; };
+		90312430AF84DF8634BBA3ECD3384F3F /* ToJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 000E8D38E4CC6A39F5D9E29F462EB58E /* ToJSON.swift */; };
+		907570F9F5649F88474BFFA57A7D933B /* MJRefreshGifHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E386830D5B491CD9719E1579148C5E4 /* MJRefreshGifHeader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		90E507866B4E821929820B880A8B58F4 /* NSTextAttachment+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C174E6ACE8A752DE7CCD70905C8406A /* NSTextAttachment+Kingfisher.swift */; };
+		91930FDB4F9CCBBA9789806D1611AE6F /* SVProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = 294E333DB9CAF2F3A3C27215C3545333 /* SVProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		92AA3DBDE64690329EAC5FA951322BC2 /* Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B3F260FABE17AA57CB42936B9027E40 /* Box.swift */; };
+		935E1A06219078F1ED5BDAAF05D73BEB /* MJRefreshNormalTrailer.m in Sources */ = {isa = PBXBuildFile; fileRef = 36F611C142E9F0C6F2439DAAA1440C01 /* MJRefreshNormalTrailer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		9476A49325A5E54CEE0CB3F7BD51A5C4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93C1F2AB798562AF39FE348F051A446C /* Foundation.framework */; };
+		95055C33416D816EA0B23842DE71C613 /* ImageProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6176A446233F46492D6424EFB0EB3925 /* ImageProcessor.swift */; };
+		951EF9AF7676766D0DBF9602F2B197DC /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB62CFA3FB3C117609EB1C2FD6984099 /* Operators.swift */; };
+		9521E95A58EA4E0B000929E1892E28C5 /* ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = F999BC1843FF5C0C4DD408F79A99B38C /* ImageCache.swift */; };
+		964927DD2B3D53189B3C70FE431B88CC /* ImagePrefetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC4267BCAD3E2B90A89853C4D14C8FA0 /* ImagePrefetcher.swift */; };
+		98091388004946D1B9924D793C22D136 /* MJRefreshAutoFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = B82DB6D8807F125AA481400BD4FF6935 /* MJRefreshAutoFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		98F3E3E30CB29B6D33FEC344656DE2B1 /* MJRefreshBackGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 985B8E0C489AEBC6765DA6F664E8E60C /* MJRefreshBackGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		9AA5D28C987CD4EEE600AA7EB499CDA9 /* SVIndefiniteAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0197502A9B6FBBAB81F41D678DE309C1 /* SVIndefiniteAnimatedView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		9DE8973DF17F32EE4BD1444FFDF18AB5 /* TYCyclePagerTransformLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = DE1500F7DD43EA75DD335C4802AB1DDB /* TYCyclePagerTransformLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		9E0045B41BFE697DB4ADE151228024D2 /* SnapKit-SnapKit_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = B9DCB5EC0B1CDADD221717CADDF62359 /* SnapKit-SnapKit_Privacy */; };
+		9EAAD483EB2A44D532B4CD50F332F157 /* UIView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = 6EE463BE70E3F0B8FF0A488E035F64DA /* UIView+MJExtension.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		A0E6269FA22F1B4D8094F9C331C2ADD6 /* TVMonogramView+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D519BA9A7D292A33C23750C3409317F /* TVMonogramView+Kingfisher.swift */; };
+		A0F3EEBC06B869A742CB426869EAE141 /* KingfisherError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 397DFB6CC586331960857A7D4BCC3E42 /* KingfisherError.swift */; };
+		A22B9612D1D5192FDB98F54AEBD502F2 /* MJRefreshAutoNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B09B77DD2EB9C47372C622D7A165455 /* MJRefreshAutoNormalFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		A251EE3CE93F32A54196F35C23756357 /* MapError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AA5E66075BFA3596D2D94204547A21C /* MapError.swift */; };
+		A32C79A703440A6FD893D2EC99C8A50B /* MJRefreshBackFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = F2258E72C40BF58DF9933569035274AE /* MJRefreshBackFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		A91F68941F8C394B21ECDD13D0FEB36C /* MJRefreshAutoStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 73850F909F31CD264F78B8915725DE0D /* MJRefreshAutoStateFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		A9E8A84602E96F0255E09313F70BF79E /* KingfisherOptionsInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E915B029FDB07AB7DDB269D9A7A49F2 /* KingfisherOptionsInfo.swift */; };
+		AABEF13464BA7F4621BD94736C1D057C /* ConstraintMakerPrioritizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BE48E808F985110D54DD91227271A26 /* ConstraintMakerPrioritizable.swift */; };
+		AE224EDB6D044C0FE86B086E950FC2F9 /* Debugging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D47357AC588E78F39154031F03936EA /* Debugging.swift */; };
+		AF760C78F1C7E11BF7CB9E9B29903530 /* ConstraintInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5273338E50E1316828084B9BF7515975 /* ConstraintInsets.swift */; };
+		AFA29E3803265741A4E7B485450B59A3 /* MJRefreshNormalHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F732F460B4A8EDC4DD87E49AE2D3930 /* MJRefreshNormalHeader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		AFAAE42DF4585633FA1A217A0E811856 /* MJRefreshHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E00CA670F8E7507B820E199E41F7838 /* MJRefreshHeader.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		B0875E3AB8718E7DFE5C53497C02A15E /* ConstraintLayoutSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD1DA0A576D520DA304C44836BB7FF07 /* ConstraintLayoutSupport.swift */; };
+		B11D964D81D0EF31D61552C5631E7A3F /* NSBundle+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 03FB476E286B86B85F5752570C344C1E /* NSBundle+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		B1307BCEFA623FF242109620B14A08BA /* MJRefresh-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3FBCAD574071AEA7B9F078F70263675D /* MJRefresh-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		B29BC196744CCC2D226A5227CE616D5E /* FromJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9464D0A1B731A7E3EA2550947112248F /* FromJSON.swift */; };
+		B2A6C2397B8ADAE4D7D64B09FF82570E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93C1F2AB798562AF39FE348F051A446C /* Foundation.framework */; };
+		B4DBF8BFB50F5248FEBE4AF4ABED2F8C /* Pods-TSLiveWallpaper-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B2738402DD2AF2607E811ADACC7659D /* Pods-TSLiveWallpaper-dummy.m */; };
+		B80260866E7DB576715BFC25005D235D /* MJRefreshFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CC91D7579A41D4761ECABC0D6F7195C /* MJRefreshFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		B903049E7C1BED7918DAB208754107C7 /* ConstraintMakerFinalizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9843B40591C91C6EEA8461991ECACF39 /* ConstraintMakerFinalizable.swift */; };
+		B9F3C53028DDF38F363901AF8EFCEB77 /* Runtime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A60CCD0BA216D38D63E43541D1A9C76 /* Runtime.swift */; };
+		BA2FB695DEB0D179253EEB8DFCE3578B /* SnapKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = ECE5E8628EFBEC485DBC3858CF662477 /* SnapKit-dummy.m */; };
+		BD90468037AC7AC384A68A4EABE27F84 /* Google-Mobile-Ads-SDK-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 961A5BDB21CAA6BC2E13AF7336C7A330 /* Google-Mobile-Ads-SDK-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		BDA5C7CC91E86448237CF40954FAC5AF /* ConstraintMakerRelatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ECD6425C5A8108826B6C11428DDEDB0 /* ConstraintMakerRelatable.swift */; };
+		BE9BF6434883ABB53C2073B7C29FFC7E /* TYCyclePagerView.h in Headers */ = {isa = PBXBuildFile; fileRef = 94BE7C9CB90826FA569B88BD6D10B914 /* TYCyclePagerView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		BF1AE4D97E813B95C43EA4A298B973D1 /* LayoutConstraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB98E6F28426E7B288FD23EFA1F545A1 /* LayoutConstraint.swift */; };
+		C07CB3E9A4D1BF00F841E4285629A2B2 /* ConstraintRelatableTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12A946B381B51247096EC0382E20D47B /* ConstraintRelatableTarget.swift */; };
+		C0FA2C1047CC5B7990287846862A9FD5 /* KFImageRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02EE2348707D9396878281B8A36E0DE8 /* KFImageRenderer.swift */; };
+		C14F10B663FE2898EACAB90C202B3F50 /* ConstraintMakerEditable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95ADBA2D97AEF421AB7A6C7306754DCF /* ConstraintMakerEditable.swift */; };
+		C1D4F3F11F5189CAE0EB1B18562BD16F /* KFOptionsSetter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ADD825C4CFFC5B05678E278E81EE0D6 /* KFOptionsSetter.swift */; };
+		C2667A6393A22577C16D8E3A6FA12B00 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93C1F2AB798562AF39FE348F051A446C /* Foundation.framework */; };
+		C29B494B7C33F701E66731BFDD6F1AE5 /* AVAssetImageDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3EFD6CA7692A6D8AE8C9CF4613D5C56 /* AVAssetImageDataProvider.swift */; };
+		C322F5826528BB94E87B84B66CDF65A6 /* MJRefreshComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = D2AFCCA8DA4FB5CDBA8829A1292EAB3D /* MJRefreshComponent.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		C3BA3764B05748426F7972178E25064F /* MJRefreshStateTrailer.m in Sources */ = {isa = PBXBuildFile; fileRef = A7B75C0556EF9B83C4712181A275C26B /* MJRefreshStateTrailer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		C5C8B4E9B398A09C20AD3191B687A4A9 /* Mappable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CC4EA66F3C8CF80302D5662D7FB7191 /* Mappable.swift */; };
+		C6A4302ACE006C4E2CDD481287E2916B /* Typealiases.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F4D4C3F21F3D1A8FBB01372978FB97F /* Typealiases.swift */; };
+		C6F45595676957ADBEC18EB3F23EAEC4 /* LayoutConstraintItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 680D84FA6AF67AF4EAE5E91EFA173C8B /* LayoutConstraintItem.swift */; };
+		C74A57B9D0D3D8CE03CA6E0779BB0B4D /* DataTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20B61F1A6A28E9EEAF1ECE43E9D9775A /* DataTransform.swift */; };
+		CB69A73073036445EA7F67524ECD6D69 /* URLTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 925F1A2936277CCF3331D00D52B08977 /* URLTransform.swift */; };
+		CC4F11DE003A880456411027726DC0F4 /* MJRefreshComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F37A4998BD20D69027E2274E8D2443 /* MJRefreshComponent.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		CC8DBBFECBD1CDC823E6AC6920B472DB /* TransformOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00F1FD628E16979FB6282F6A38FDA703 /* TransformOf.swift */; };
+		CCCB6AC4BD17F2251527413CEB698DE9 /* NSDecimalNumberTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5ABE29B09D7FC7E25E6FB43A29A3BC /* NSDecimalNumberTransform.swift */; };
+		CDF453A98D6F8E4D4DED29434F865129 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 68C4C17FC05B79BC6B7F38F28E9F74BA /* PrivacyInfo.xcprivacy */; };
+		CE593943A9E7CF83822CF60304BCAD43 /* ConstraintConstantTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B13B7CED68EE7F15ED639D935DE224 /* ConstraintConstantTarget.swift */; };
+		CE9BCBAD24F7170954A9C7C0B9CB762F /* MJRefreshStateHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = F3E301E70868FB6893BCBF144EB9F90C /* MJRefreshStateHeader.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		D4218DA55B2BA45937589200CC0DF1FB /* ConstraintMakerExtendable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FF302BDEA8C5A2475341CC76C9EBC65 /* ConstraintMakerExtendable.swift */; };
+		D5B5FEC098AD312EE618C3E4010806F0 /* TransformType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 144BE2B30733005092844347AD8F767D /* TransformType.swift */; };
+		D8BF0A209615C68229B7BA8BD91324FB /* ImageView+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC4EFBE9E14C6AE3853C0051798A684 /* ImageView+Kingfisher.swift */; };
+		D98A76939BDF2369CD43DBB47DA23B1E /* TransformOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 878E3387B36CF20715D42B6EE2F3352B /* TransformOperators.swift */; };
+		D9B27D96F94EBFB5B287C3077AA8139D /* SessionDataTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = D27BDA58787228FEBD2F1742A9FF52DA /* SessionDataTask.swift */; };
+		DB7B14E36C5289FEE02C0FD5A804748F /* SVRadialGradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = BA0BA1215B9790C0DC01C0D022213A84 /* SVRadialGradientLayer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		DBA4803F4765E1650B8C6841157F5D73 /* ConstraintPriorityTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CCF6C2DD577C867146D24E8084FB977 /* ConstraintPriorityTarget.swift */; };
+		DBF52ABB59F21E5C73F8FA83CA84A5B2 /* String+MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 410C6DF346FA68E88E0D4E1965FD6A88 /* String+MD5.swift */; };
+		DF5BEBB952B0E2A2B7FAE2B0DD2CBA0C /* Source.swift in Sources */ = {isa = PBXBuildFile; fileRef = B469285D099A48ABE5C6734216CDD50D /* Source.swift */; };
+		E2E9D99A82475E8D56D2B031323C3A4D /* KingfisherManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B326AB87B7F507FB019553D0D7F044C1 /* KingfisherManager.swift */; };
+		E3073CA98E00E91598591BB39A850397 /* UIView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 09D540991797D2A2610AAAA543C89300 /* UIView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		E37671A03B4C17A1CF3766A6125833BB /* ConstraintDirectionalInsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC3E005996CA159F3D04393452BBC6BD /* ConstraintDirectionalInsetTarget.swift */; };
+		E3D779DEE753C0B0D33BA8E73A980265 /* ConstraintLayoutGuide+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA69560930F0FAA366E52EA8AD8800E /* ConstraintLayoutGuide+Extensions.swift */; };
+		E700ED58AE0D304ED95FEAB65A48E48B /* MJRefreshBackNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 28CDC0AD5340C2E7F45CCE68B06F8E4B /* MJRefreshBackNormalFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		E8ADC0A3B759EC22493DA74065E4BD28 /* ImageFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50FF7DDFB677EC0BDFEE26ECB9CD2AED /* ImageFormat.swift */; };
+		ECBC215883D3DF3A4E9971487E4DB260 /* MJRefreshFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 7D087118DAF2A388056ABD41FDA5987E /* MJRefreshFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		ECC5C2ADC2682F9171FEA22AF10DCE53 /* ConstraintRelation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D63F4D763252E56A576EE6E105E79DCD /* ConstraintRelation.swift */; };
+		ED9C51A66341A9C0224E9E07AB1F38D7 /* UICollectionViewLayout+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 05E6B0AE18E936228D8E819D928306F0 /* UICollectionViewLayout+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		EDD151562D6D83032C0BC185A88C8521 /* FormatIndicatedCacheSerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE3ECA8133AC5D44D5C76641C4CB62BA /* FormatIndicatedCacheSerializer.swift */; };
+		EDD901F1A986C33AADF3E5BD4425E353 /* MJRefreshBackGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = F772EF4DFB4F2C584769ED11B189038B /* MJRefreshBackGifFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		F01B23DF9E2024507AC80E0F4BA033C5 /* NSButton+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = E63140F2B1F0566C0AE3AD13EDDAC650 /* NSButton+Kingfisher.swift */; };
+		F264318171CCF6EAFDDF19D4E6C87D08 /* Delegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF029ABD5F395D531DE38DAC4AD36930 /* Delegate.swift */; };
+		F3FD816689C78EE6C4D0B8BA058573B9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93C1F2AB798562AF39FE348F051A446C /* Foundation.framework */; };
+		F514EA78D136755D0BC0C5D2778A4B73 /* MJRefreshStateTrailer.h in Headers */ = {isa = PBXBuildFile; fileRef = 32B843697B4F6EDE929CFA57666F0CC0 /* MJRefreshStateTrailer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F52A27FAA0646504F274F1224366E858 /* MJRefreshNormalHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 02E9C76BD8940414E8F9D74B6C7AD67A /* MJRefreshNormalHeader.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		F6F33E8B268F3D41075374D95B8088DC /* UILayoutSupport+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D21D2B8670A42905809CB90186A08E8D /* UILayoutSupport+Extensions.swift */; };
+		F74CA6BD365AAE00E6FCBB731E274BF0 /* KFAnimatedImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEB3B79A657F3A78582B569C280D0335 /* KFAnimatedImage.swift */; };
+		F9EBA65892D78A31C068D727D84BCB88 /* ConstraintConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA49719D587553BE182BA07993C1A1BD /* ConstraintConfig.swift */; };
+		FBC75920AE7D76A487212A14113E90C2 /* CPListItem+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 671FE497C5EAAE216B08AB35D30E5C38 /* CPListItem+Kingfisher.swift */; };
+		FD7662803D266AB3603053D653FA601D /* UIScrollView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C9136C6B8744ED43003515F37FFFDEC /* UIScrollView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		FDDC72BE57E702EE9E1A7EF7D9B817D4 /* ImageModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 027A8E09E75B6839F3853A1730F116CA /* ImageModifier.swift */; };
+		FF5D09270B5A2A00D0E459592002D1F2 /* MJRefreshNormalTrailer.h in Headers */ = {isa = PBXBuildFile; fileRef = AC76DB04FF373A56156CDB98DB54D493 /* MJRefreshNormalTrailer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		FF9E6D072563A0209EE8D525BE50041E /* Map.swift in Sources */ = {isa = PBXBuildFile; fileRef = F26BA4298204B74B4561706C1EF5A83E /* Map.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+		230638980FE1210BBC9877861C293356 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 162E649F50FEC62B61BDD87D1BD422B4;
+			remoteInfo = ObjectMapper;
+		};
+		374336381BCC8FE0D356114B5E0CCBFC /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 416BCB647D16D0ED89A6729B14DD54D2;
+			remoteInfo = TYCyclePagerView;
+		};
+		43790EA13E13EA600C2E1DF273704219 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 6868056D761E163D10FDAF8CF1C4D9B8;
+			remoteInfo = MJRefresh;
+		};
+		54F0FBAACA4FB6E9677BE4638151A1B1 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 458B188365A307B3C128ABF524D1A3E3;
+			remoteInfo = GoogleUserMessagingPlatform;
+		};
+		5C530A1CC307B67A93D15B5AF4561A8A /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 63A7C675C13F87669AF56006D943998B;
+			remoteInfo = "GoogleUserMessagingPlatform-UserMessagingPlatformResources";
+		};
+		85299249F026ACE9378C387E4FA6C81E /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 9828BBC09E9FB1238624113D7456E59E;
+			remoteInfo = "Kingfisher-Kingfisher";
+		};
+		89F20CE439397A27CBCC248A24EE06DC /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 19622742EBA51E823D6DAE3F8CDBFAD4;
+			remoteInfo = SnapKit;
+		};
+		9AB6F4B9E142575F6D36B68F98E90690 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 458B188365A307B3C128ABF524D1A3E3;
+			remoteInfo = GoogleUserMessagingPlatform;
+		};
+		B6F0042BCA638429BAA62EE3C406F433 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = E8022D22FAA6690B5E1C379C1BCE1491;
+			remoteInfo = Kingfisher;
+		};
+		D3857C0CC9E296CF5A523FEFE09B9CEB /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 8A8DB685241263AFDF5E6B20FE67B93A;
+			remoteInfo = "SnapKit-SnapKit_Privacy";
+		};
+		E20EFE0F2E0E6DDDAB02D9B48352DB75 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 36FD0958A0EC4A0FCF599E9B22719B03;
+			remoteInfo = "Google-Mobile-Ads-SDK-GoogleMobileAdsResources";
+		};
+		F6D293229E38D1DDD8AC9ABC55EF6D10 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 1C8D67D8B72D6BA42CCEDB648537A340;
+			remoteInfo = SVProgressHUD;
+		};
+		FDA02C07DF3742CFA465515F65BA238F /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = FEA3B3A570634836C0457F3D7CEF1699;
+			remoteInfo = "Google-Mobile-Ads-SDK";
+		};
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+		000E8D38E4CC6A39F5D9E29F462EB58E /* ToJSON.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ToJSON.swift; path = Sources/ToJSON.swift; sourceTree = "<group>"; };
+		008BA1F9DE782AF6A5BDE84FFB3F3988 /* AuthenticationChallengeResponsable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AuthenticationChallengeResponsable.swift; path = Sources/Networking/AuthenticationChallengeResponsable.swift; sourceTree = "<group>"; };
+		00F1FD628E16979FB6282F6A38FDA703 /* TransformOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformOf.swift; path = Sources/TransformOf.swift; sourceTree = "<group>"; };
+		0197502A9B6FBBAB81F41D678DE309C1 /* SVIndefiniteAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVIndefiniteAnimatedView.m; path = SVProgressHUD/SVIndefiniteAnimatedView.m; sourceTree = "<group>"; };
+		027A8E09E75B6839F3853A1730F116CA /* ImageModifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageModifier.swift; path = Sources/Networking/ImageModifier.swift; sourceTree = "<group>"; };
+		02E63CCDBB4348AFB3A4A9CB50804A21 /* TYPageControl.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TYPageControl.m; path = TYCyclePagerViewDemo/TYCyclePagerView/TYPageControl.m; sourceTree = "<group>"; };
+		02E9C76BD8940414E8F9D74B6C7AD67A /* MJRefreshNormalHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshNormalHeader.h; path = MJRefresh/Custom/Header/MJRefreshNormalHeader.h; sourceTree = "<group>"; };
+		02EE2348707D9396878281B8A36E0DE8 /* KFImageRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KFImageRenderer.swift; path = Sources/SwiftUI/KFImageRenderer.swift; sourceTree = "<group>"; };
+		031AD5884F4BA1B1BE7CBCE38B7D6760 /* UserMessagingPlatform.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = UserMessagingPlatform.xcframework; path = Frameworks/Release/UserMessagingPlatform.xcframework; sourceTree = "<group>"; };
+		03A2BBF58DD72D668FE9A1B678C20735 /* TYCyclePagerView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "TYCyclePagerView-dummy.m"; sourceTree = "<group>"; };
+		03B95B2EEACD0C5CA7E31072FCE699EA /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; };
+		03DAC16752F2285063CC395430DCC9BD /* SVProgressAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressAnimatedView.h; path = SVProgressHUD/SVProgressAnimatedView.h; sourceTree = "<group>"; };
+		03FB476E286B86B85F5752570C344C1E /* NSBundle+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBundle+MJRefresh.h"; path = "MJRefresh/NSBundle+MJRefresh.h"; sourceTree = "<group>"; };
+		0554236318AB08E21E50CFE77A256AFA /* SVProgressHUD-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SVProgressHUD-Info.plist"; sourceTree = "<group>"; };
+		05B7C7934BE84D598229153377544E33 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Sources/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
+		05E6B0AE18E936228D8E819D928306F0 /* UICollectionViewLayout+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UICollectionViewLayout+MJRefresh.h"; path = "MJRefresh/UICollectionViewLayout+MJRefresh.h"; sourceTree = "<group>"; };
+		05F0BE5C3ABFC2B4B0D4E13EBB0A52D3 /* TYCyclePagerView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TYCyclePagerView-prefix.pch"; sourceTree = "<group>"; };
+		07BAF99D048575D80C266DC967F49F98 /* MJRefreshBackNormalFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackNormalFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h; sourceTree = "<group>"; };
+		09D540991797D2A2610AAAA543C89300 /* UIView+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+MJExtension.h"; path = "MJRefresh/UIView+MJExtension.h"; sourceTree = "<group>"; };
+		0ADD825C4CFFC5B05678E278E81EE0D6 /* KFOptionsSetter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KFOptionsSetter.swift; path = Sources/General/KFOptionsSetter.swift; sourceTree = "<group>"; };
+		0C9136C6B8744ED43003515F37FFFDEC /* UIScrollView+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+MJExtension.h"; path = "MJRefresh/UIScrollView+MJExtension.h"; sourceTree = "<group>"; };
+		0CE3CA37D6C7DA8C116731FF2553A8FE /* SnapKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SnapKit-Info.plist"; sourceTree = "<group>"; };
+		0D313831315E975A84CB0359CFF86232 /* EnumOperators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EnumOperators.swift; path = Sources/EnumOperators.swift; sourceTree = "<group>"; };
+		0E2B59D91DBA47C83FA348692189F164 /* Pods-TSLiveWallpaper-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TSLiveWallpaper-acknowledgements.plist"; sourceTree = "<group>"; };
+		0EA8F04A9489818026454CA06998DF56 /* MJRefreshHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshHeader.m; path = MJRefresh/Base/MJRefreshHeader.m; sourceTree = "<group>"; };
+		0FF24B33BAC805F1FBCF9CD6C50C8669 /* Kingfisher.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Kingfisher.debug.xcconfig; sourceTree = "<group>"; };
+		109719F21622CAB10C24560B1CD88A8F /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = "Frameworks/GoogleMobileAdsFramework/GoogleMobileAds.xcframework/ios-arm64/GoogleMobileAds.framework/PrivacyInfo.xcprivacy"; sourceTree = "<group>"; };
+		117776ABEE88633280D920326B53ACE7 /* ConstraintView+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ConstraintView+Extensions.swift"; path = "Sources/ConstraintView+Extensions.swift"; sourceTree = "<group>"; };
+		12A946B381B51247096EC0382E20D47B /* ConstraintRelatableTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintRelatableTarget.swift; path = Sources/ConstraintRelatableTarget.swift; sourceTree = "<group>"; };
+		144BE2B30733005092844347AD8F767D /* TransformType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformType.swift; path = Sources/TransformType.swift; sourceTree = "<group>"; };
+		1473D193E24EEE8125E71A693002F933 /* UIScrollView+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+MJRefresh.h"; path = "MJRefresh/UIScrollView+MJRefresh.h"; sourceTree = "<group>"; };
+		1575B14E98FEB3102624BB354AC695BF /* MJRefreshAutoFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoFooter.h; path = MJRefresh/Base/MJRefreshAutoFooter.h; sourceTree = "<group>"; };
+		15A6DC355D7202F38913F711B28C27CE /* MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefresh.h; path = MJRefresh/MJRefresh.h; sourceTree = "<group>"; };
+		16A13729A37ECDD17EAD0D9A2A931B97 /* Kingfisher.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Kingfisher.release.xcconfig; sourceTree = "<group>"; };
+		177E465A4BABFC5B56E52DFC109CE085 /* GoogleUserMessagingPlatform.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleUserMessagingPlatform.debug.xcconfig; sourceTree = "<group>"; };
+		17E7CA5C20BDC607D41C39BFA2BA5A99 /* GoogleUserMessagingPlatform.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleUserMessagingPlatform.release.xcconfig; sourceTree = "<group>"; };
+		17FFD459722D7EE2E10AD7B28AA29D90 /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = Sources/Image/Filter.swift; sourceTree = "<group>"; };
+		199CA14134D9876770126A0051E041E9 /* Indicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Indicator.swift; path = Sources/Views/Indicator.swift; sourceTree = "<group>"; };
+		1A0B0BF6D7AA8DE109C139D5E04D1F94 /* UICollectionViewLayout+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UICollectionViewLayout+MJRefresh.m"; path = "MJRefresh/UICollectionViewLayout+MJRefresh.m"; sourceTree = "<group>"; };
+		1A60CCD0BA216D38D63E43541D1A9C76 /* Runtime.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Runtime.swift; path = Sources/Utility/Runtime.swift; sourceTree = "<group>"; };
+		1B3F260FABE17AA57CB42936B9027E40 /* Box.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Box.swift; path = Sources/Utility/Box.swift; sourceTree = "<group>"; };
+		1B4356D90078FB04053011C7D93FC7AA /* TYCyclePagerView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = TYCyclePagerView.modulemap; sourceTree = "<group>"; };
+		1BBF9E09855C23F3398645798DDCD1E7 /* DateTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateTransform.swift; path = Sources/DateTransform.swift; sourceTree = "<group>"; };
+		1BC10B2297049F49CB48E81F7773F720 /* ConstraintInsetTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintInsetTarget.swift; path = Sources/ConstraintInsetTarget.swift; sourceTree = "<group>"; };
+		1D47357AC588E78F39154031F03936EA /* Debugging.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debugging.swift; path = Sources/Debugging.swift; sourceTree = "<group>"; };
+		1E33D66937E22F62E40786160FCCBC7C /* TYPageControl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TYPageControl.h; path = TYCyclePagerViewDemo/TYCyclePagerView/TYPageControl.h; sourceTree = "<group>"; };
+		1E990C2560189884EBE94B6B173B5C3A /* MJRefreshConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshConfig.h; path = MJRefresh/MJRefreshConfig.h; sourceTree = "<group>"; };
+		1F732F460B4A8EDC4DD87E49AE2D3930 /* MJRefreshNormalHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshNormalHeader.m; path = MJRefresh/Custom/Header/MJRefreshNormalHeader.m; sourceTree = "<group>"; };
+		20B61F1A6A28E9EEAF1ECE43E9D9775A /* DataTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataTransform.swift; path = Sources/DataTransform.swift; sourceTree = "<group>"; };
+		20D9D6BC14F7E83677E262494E4B68C6 /* SnapKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SnapKit.release.xcconfig; sourceTree = "<group>"; };
+		2615A809B8DB81C89D79182F90CAD12D /* SnapKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SnapKit.modulemap; sourceTree = "<group>"; };
+		28CDC0AD5340C2E7F45CCE68B06F8E4B /* MJRefreshBackNormalFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackNormalFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m; sourceTree = "<group>"; };
+		294E333DB9CAF2F3A3C27215C3545333 /* SVProgressHUD.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressHUD.h; path = SVProgressHUD/SVProgressHUD.h; sourceTree = "<group>"; };
+		2B792222193C3597FB1A968FD4E23ABB /* UIScrollView+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+MJRefresh.m"; path = "MJRefresh/UIScrollView+MJRefresh.m"; sourceTree = "<group>"; };
+		2CCB23816455F92B4A0E4B12C290662F /* SVProgressHUD.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressHUD.m; path = SVProgressHUD/SVProgressHUD.m; sourceTree = "<group>"; };
+		2D2730569D14635EBFB843CDD582510D /* ConstraintDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDSL.swift; path = Sources/ConstraintDSL.swift; sourceTree = "<group>"; };
+		2D9D2C951AC12BB75E30C064071B59BD /* GraphicsContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GraphicsContext.swift; path = Sources/Image/GraphicsContext.swift; sourceTree = "<group>"; };
+		2E00CA670F8E7507B820E199E41F7838 /* MJRefreshHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshHeader.h; path = MJRefresh/Base/MJRefreshHeader.h; sourceTree = "<group>"; };
+		2E915B029FDB07AB7DDB269D9A7A49F2 /* KingfisherOptionsInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KingfisherOptionsInfo.swift; path = Sources/General/KingfisherOptionsInfo.swift; sourceTree = "<group>"; };
+		2ECD6425C5A8108826B6C11428DDEDB0 /* ConstraintMakerRelatable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerRelatable.swift; path = Sources/ConstraintMakerRelatable.swift; sourceTree = "<group>"; };
+		2EDB0E73C598F39976ED284DB941FC0C /* MJRefreshAutoStateFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoStateFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.h; sourceTree = "<group>"; };
+		2F4D4C3F21F3D1A8FBB01372978FB97F /* Typealiases.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Typealiases.swift; path = Sources/Typealiases.swift; sourceTree = "<group>"; };
+		31EF154EF8D60F5A7972D59273D5EC48 /* MJRefresh.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = MJRefresh.bundle; path = MJRefresh/MJRefresh.bundle; sourceTree = "<group>"; };
+		32B843697B4F6EDE929CFA57666F0CC0 /* MJRefreshStateTrailer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshStateTrailer.h; path = MJRefresh/Custom/Trailer/MJRefreshStateTrailer.h; sourceTree = "<group>"; };
+		3400E96BD5FDE7E65619F5F5463D5E85 /* MemoryStorage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MemoryStorage.swift; path = Sources/Cache/MemoryStorage.swift; sourceTree = "<group>"; };
+		3576C8AE3222D51FA74787A2BEE1656D /* MJRefresh.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJRefresh.release.xcconfig; sourceTree = "<group>"; };
+		36F611C142E9F0C6F2439DAAA1440C01 /* MJRefreshNormalTrailer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshNormalTrailer.m; path = MJRefresh/Custom/Trailer/MJRefreshNormalTrailer.m; sourceTree = "<group>"; };
+		397DFB6CC586331960857A7D4BCC3E42 /* KingfisherError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KingfisherError.swift; path = Sources/General/KingfisherError.swift; sourceTree = "<group>"; };
+		3998091512768CD07733CB4F02B4BD9F /* Google-Mobile-Ads-SDK-GoogleMobileAdsResources */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "Google-Mobile-Ads-SDK-GoogleMobileAdsResources"; path = GoogleMobileAdsResources.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+		3B2738402DD2AF2607E811ADACC7659D /* Pods-TSLiveWallpaper-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-TSLiveWallpaper-dummy.m"; sourceTree = "<group>"; };
+		3BDABA963C0C4D6766F7CFBC7A6652A9 /* MJRefresh-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "MJRefresh-Info.plist"; sourceTree = "<group>"; };
+		3C174E6ACE8A752DE7CCD70905C8406A /* NSTextAttachment+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSTextAttachment+Kingfisher.swift"; path = "Sources/Extensions/NSTextAttachment+Kingfisher.swift"; sourceTree = "<group>"; };
+		3CC4EA66F3C8CF80302D5662D7FB7191 /* Mappable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Mappable.swift; path = Sources/Mappable.swift; sourceTree = "<group>"; };
+		3CCF6C2DD577C867146D24E8084FB977 /* ConstraintPriorityTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintPriorityTarget.swift; path = Sources/ConstraintPriorityTarget.swift; sourceTree = "<group>"; };
+		3E1565A5D095F52AAF9537EA921A7C12 /* MJRefreshBackFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackFooter.m; path = MJRefresh/Base/MJRefreshBackFooter.m; sourceTree = "<group>"; };
+		3FB927B5CAEB209CFBBE88C04C0C5292 /* SVProgressHUD.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SVProgressHUD.debug.xcconfig; sourceTree = "<group>"; };
+		3FBCAD574071AEA7B9F078F70263675D /* MJRefresh-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJRefresh-umbrella.h"; sourceTree = "<group>"; };
+		410C6DF346FA68E88E0D4E1965FD6A88 /* String+MD5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+MD5.swift"; path = "Sources/Utility/String+MD5.swift"; sourceTree = "<group>"; };
+		4204A52717236829F318CA39A3CE9356 /* SVRadialGradientLayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVRadialGradientLayer.h; path = SVProgressHUD/SVRadialGradientLayer.h; sourceTree = "<group>"; };
+		42075ED0F4D281FF1164BB1ADE4A306F /* ConstraintDirectionalInsets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDirectionalInsets.swift; path = Sources/ConstraintDirectionalInsets.swift; sourceTree = "<group>"; };
+		486B1CD13E324DFFE8880EB716ABAEA3 /* SVProgressHUD-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SVProgressHUD-dummy.m"; sourceTree = "<group>"; };
+		487A3EF03C8C68A1444BDC5DF26BCC26 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Sources/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
+		4887762950D6631638E32653A89849E8 /* ConstraintOffsetTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintOffsetTarget.swift; path = Sources/ConstraintOffsetTarget.swift; sourceTree = "<group>"; };
+		4915351A0B077ADECF2E5D08B5A77E13 /* IntegerOperators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IntegerOperators.swift; path = Sources/IntegerOperators.swift; sourceTree = "<group>"; };
+		4B4AB73695E4F4BA8AE801955F8AC42B /* ImageBinder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageBinder.swift; path = Sources/SwiftUI/ImageBinder.swift; sourceTree = "<group>"; };
+		50FB7C00F5D31CF2EF1224D1BE95B3C5 /* Storage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Storage.swift; path = Sources/Cache/Storage.swift; sourceTree = "<group>"; };
+		50FF7DDFB677EC0BDFEE26ECB9CD2AED /* ImageFormat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageFormat.swift; path = Sources/Image/ImageFormat.swift; sourceTree = "<group>"; };
+		51EC4E247A4627550E3A4DFC4DB3EB5D /* Resource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Resource.swift; path = Sources/General/ImageSource/Resource.swift; sourceTree = "<group>"; };
+		5273338E50E1316828084B9BF7515975 /* ConstraintInsets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintInsets.swift; path = Sources/ConstraintInsets.swift; sourceTree = "<group>"; };
+		54B834F25B43F75D7C5375CCE2EDE4A0 /* MJRefreshConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshConfig.m; path = MJRefresh/MJRefreshConfig.m; sourceTree = "<group>"; };
+		55318970A511F1980B0A0753BA6DB73E /* ResourceBundle-UserMessagingPlatformResources-GoogleUserMessagingPlatform-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-UserMessagingPlatformResources-GoogleUserMessagingPlatform-Info.plist"; sourceTree = "<group>"; };
+		557E0428F9B36B97FCCCAB692B892FB4 /* ConstraintViewDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintViewDSL.swift; path = Sources/ConstraintViewDSL.swift; sourceTree = "<group>"; };
+		569CB4290F07D6618235288636620737 /* ConstraintLayoutSupportDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutSupportDSL.swift; path = Sources/ConstraintLayoutSupportDSL.swift; sourceTree = "<group>"; };
+		5A45001FC79ED0DBB161B8DEA2A61ED6 /* GoogleUserMessagingPlatform-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "GoogleUserMessagingPlatform-xcframeworks.sh"; sourceTree = "<group>"; };
+		5AEA0F568EB28A8DE17929677DAD06E1 /* TYCyclePagerView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TYCyclePagerView.m; path = TYCyclePagerViewDemo/TYCyclePagerView/TYCyclePagerView.m; sourceTree = "<group>"; };
+		614B5EE6FE23207ABBFB1AEE843E52DE /* ImageDownloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageDownloader.swift; path = Sources/Networking/ImageDownloader.swift; sourceTree = "<group>"; };
+		6176A446233F46492D6424EFB0EB3925 /* ImageProcessor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageProcessor.swift; path = Sources/Image/ImageProcessor.swift; sourceTree = "<group>"; };
+		645BAD837B3E5AD79E417803B84CA918 /* UIButton+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIButton+Kingfisher.swift"; path = "Sources/Extensions/UIButton+Kingfisher.swift"; sourceTree = "<group>"; };
+		64BA39514E7C734D43A97C2DD4A1D772 /* ObjectMapper-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ObjectMapper-Info.plist"; sourceTree = "<group>"; };
+		65465F2749923096C80F987845F35116 /* TYCyclePagerView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TYCyclePagerView.release.xcconfig; sourceTree = "<group>"; };
+		66AD72DD5196D9563E6C3C665A7DA897 /* ConstraintMultiplierTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMultiplierTarget.swift; path = Sources/ConstraintMultiplierTarget.swift; sourceTree = "<group>"; };
+		671FE497C5EAAE216B08AB35D30E5C38 /* CPListItem+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CPListItem+Kingfisher.swift"; path = "Sources/Extensions/CPListItem+Kingfisher.swift"; sourceTree = "<group>"; };
+		6731C6C64303FDC41CF9EDC4DF0C415C /* ObjectMapper.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = ObjectMapper.modulemap; sourceTree = "<group>"; };
+		679364E2A7268C58ACABD3FAB7064183 /* ObjectMapper.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ObjectMapper.release.xcconfig; sourceTree = "<group>"; };
+		680D84FA6AF67AF4EAE5E91EFA173C8B /* LayoutConstraintItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LayoutConstraintItem.swift; path = Sources/LayoutConstraintItem.swift; sourceTree = "<group>"; };
+		685F5BFF05AC11DC7385B1E92E507948 /* EnumTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EnumTransform.swift; path = Sources/EnumTransform.swift; sourceTree = "<group>"; };
+		68C4C17FC05B79BC6B7F38F28E9F74BA /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = "Frameworks/Release/UserMessagingPlatform.xcframework/ios-arm64/UserMessagingPlatform.framework/PrivacyInfo.xcprivacy"; sourceTree = "<group>"; };
+		693DF413E70DB0BA154C6CE76DEB51FA /* ImageDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageDataProvider.swift; path = Sources/General/ImageSource/ImageDataProvider.swift; sourceTree = "<group>"; };
+		6B1A21536A55542D19E4E3C7277DFFAC /* TYCyclePagerView */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = TYCyclePagerView; path = TYCyclePagerView.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		6CB762166AF45A6B6E3637EF51D86213 /* MJRefresh.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJRefresh.debug.xcconfig; sourceTree = "<group>"; };
+		6D80BDF9CDFBB26A39C5A900867C53D4 /* SVProgressAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressAnimatedView.m; path = SVProgressHUD/SVProgressAnimatedView.m; sourceTree = "<group>"; };
+		6E013F5B25E40EFDBEE0F8807FF165C7 /* ExtensionHelpers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExtensionHelpers.swift; path = Sources/Utility/ExtensionHelpers.swift; sourceTree = "<group>"; };
+		6EE463BE70E3F0B8FF0A488E035F64DA /* UIView+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+MJExtension.m"; path = "MJRefresh/UIView+MJExtension.m"; sourceTree = "<group>"; };
+		6EF78676DEEEF51F2612962C4DA5CC3F /* MJRefreshAutoNormalFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoNormalFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.h; sourceTree = "<group>"; };
+		71F37A4998BD20D69027E2274E8D2443 /* MJRefreshComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshComponent.h; path = MJRefresh/Base/MJRefreshComponent.h; sourceTree = "<group>"; };
+		72620E6CC24AD85B1DA6818937B2942C /* ISO8601DateTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ISO8601DateTransform.swift; path = Sources/ISO8601DateTransform.swift; sourceTree = "<group>"; };
+		73850F909F31CD264F78B8915725DE0D /* MJRefreshAutoStateFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoStateFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m; sourceTree = "<group>"; };
+		73A77F1BAF99E21DD9994E772C9C975E /* SVProgressHUD.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SVProgressHUD.release.xcconfig; sourceTree = "<group>"; };
+		7562916F682197E0D145D51A42ACE9CB /* Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Kingfisher.swift; path = Sources/General/Kingfisher.swift; sourceTree = "<group>"; };
+		7607EF0B4C5143FBADC0E7C3329E4BD2 /* Google-Mobile-Ads-SDK.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Google-Mobile-Ads-SDK.modulemap"; sourceTree = "<group>"; };
+		792B3BD253325A9FB373CAFCD6C14BFE /* Placeholder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Placeholder.swift; path = Sources/Image/Placeholder.swift; sourceTree = "<group>"; };
+		7B09B77DD2EB9C47372C622D7A165455 /* MJRefreshAutoNormalFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoNormalFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m; sourceTree = "<group>"; };
+		7BCE4EF2678943C4FFE78363B3A02C3B /* TYCyclePagerView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "TYCyclePagerView-Info.plist"; sourceTree = "<group>"; };
+		7BE48E808F985110D54DD91227271A26 /* ConstraintMakerPrioritizable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerPrioritizable.swift; path = Sources/ConstraintMakerPrioritizable.swift; sourceTree = "<group>"; };
+		7C9D5682618AB1CC545F36EB46334A49 /* Pods-TSLiveWallpaper-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TSLiveWallpaper-frameworks.sh"; sourceTree = "<group>"; };
+		7CC91D7579A41D4761ECABC0D6F7195C /* MJRefreshFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshFooter.m; path = MJRefresh/Base/MJRefreshFooter.m; sourceTree = "<group>"; };
+		7D087118DAF2A388056ABD41FDA5987E /* MJRefreshFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshFooter.h; path = MJRefresh/Base/MJRefreshFooter.h; sourceTree = "<group>"; };
+		7D10A9DB8535B94D40E7084027EE60EB /* Google-Mobile-Ads-SDK-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Google-Mobile-Ads-SDK-Info.plist"; sourceTree = "<group>"; };
+		7D519BA9A7D292A33C23750C3409317F /* TVMonogramView+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "TVMonogramView+Kingfisher.swift"; path = "Sources/Extensions/TVMonogramView+Kingfisher.swift"; sourceTree = "<group>"; };
+		7D78C19FC513762DB6DA31E72ED78966 /* ImageDataProcessor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageDataProcessor.swift; path = Sources/Networking/ImageDataProcessor.swift; sourceTree = "<group>"; };
+		7DD87A9B2C4BF1FC4705BEA299F7644C /* Google-Mobile-Ads-SDK-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Google-Mobile-Ads-SDK-prefix.pch"; sourceTree = "<group>"; };
+		7E658AD49AC96E97CEDAE40FC265A917 /* Google-Mobile-Ads-SDK-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Google-Mobile-Ads-SDK-dummy.m"; sourceTree = "<group>"; };
+		7F1DD9366A421CC21F0E60C238A43FB2 /* SVProgressHUD-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-prefix.pch"; sourceTree = "<group>"; };
+		7F5A0C00FBB95691845ACAD5D3E0DE27 /* SVProgressHUD-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-umbrella.h"; sourceTree = "<group>"; };
+		7FF302BDEA8C5A2475341CC76C9EBC65 /* ConstraintMakerExtendable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerExtendable.swift; path = Sources/ConstraintMakerExtendable.swift; sourceTree = "<group>"; };
+		82A72357EE306E9D4DEC7BFA9524C281 /* KFImageOptions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KFImageOptions.swift; path = Sources/SwiftUI/KFImageOptions.swift; sourceTree = "<group>"; };
+		84546F3549EC4A77A710C5495D78F8E8 /* Kingfisher.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Kingfisher.modulemap; sourceTree = "<group>"; };
+		86EC8DCBD0FC3810D2694B2989E2D8F1 /* ConstraintDescription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDescription.swift; path = Sources/ConstraintDescription.swift; sourceTree = "<group>"; };
+		86FA8CDA1A18D8678B19706722589D79 /* ConstraintMakerRelatable+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ConstraintMakerRelatable+Extensions.swift"; path = "Sources/ConstraintMakerRelatable+Extensions.swift"; sourceTree = "<group>"; };
+		873906F6066A6EED1BDA485F54DCD0D4 /* MJRefresh-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJRefresh-prefix.pch"; sourceTree = "<group>"; };
+		878E3387B36CF20715D42B6EE2F3352B /* TransformOperators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformOperators.swift; path = Sources/TransformOperators.swift; sourceTree = "<group>"; };
+		887107269FA2138D9AD9197016CCEC90 /* MJRefreshAutoGifFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoGifFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.h; sourceTree = "<group>"; };
+		8A377C18F92A8A511869ADA54B5652D2 /* GoogleUserMessagingPlatform-UserMessagingPlatformResources */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "GoogleUserMessagingPlatform-UserMessagingPlatformResources"; path = UserMessagingPlatformResources.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+		8AA5E66075BFA3596D2D94204547A21C /* MapError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MapError.swift; path = Sources/MapError.swift; sourceTree = "<group>"; };
+		8C4D05A6B08E18EC99D9CEABD1F40B4D /* Kingfisher-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Kingfisher-prefix.pch"; sourceTree = "<group>"; };
+		8C7401ED72E5005551D3F9C0FA068A5D /* Kingfisher-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Kingfisher-Info.plist"; sourceTree = "<group>"; };
+		8D2D2AE277B824AAB456055EC33FE0C1 /* NSBundle+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBundle+MJRefresh.m"; path = "MJRefresh/NSBundle+MJRefresh.m"; sourceTree = "<group>"; };
+		8E52F29EAAEBBACB099D95F3F2825A42 /* CallbackQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CallbackQueue.swift; path = Sources/Utility/CallbackQueue.swift; sourceTree = "<group>"; };
+		8E8A070E55423DB45C71FBB622910DF5 /* DictionaryTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DictionaryTransform.swift; path = Sources/DictionaryTransform.swift; sourceTree = "<group>"; };
+		8F5830AA3FDB91D4B85BE76EF072A3EA /* GoogleMobileAds.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = GoogleMobileAds.xcframework; path = Frameworks/GoogleMobileAdsFramework/GoogleMobileAds.xcframework; sourceTree = "<group>"; };
+		925F1A2936277CCF3331D00D52B08977 /* URLTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLTransform.swift; path = Sources/URLTransform.swift; sourceTree = "<group>"; };
+		931137DB47CFD761A117E68086D0217D /* DiskStorage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DiskStorage.swift; path = Sources/Cache/DiskStorage.swift; sourceTree = "<group>"; };
+		93C1F2AB798562AF39FE348F051A446C /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
+		93EBDF0C81E73FE8F063AF364FCB94D7 /* MJRefreshAutoGifFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoGifFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m; sourceTree = "<group>"; };
+		94388666B10E7A5B2C7871D30D26F405 /* TYCyclePagerView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TYCyclePagerView-umbrella.h"; sourceTree = "<group>"; };
+		9464D0A1B731A7E3EA2550947112248F /* FromJSON.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FromJSON.swift; path = Sources/FromJSON.swift; sourceTree = "<group>"; };
+		94BE7C9CB90826FA569B88BD6D10B914 /* TYCyclePagerView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TYCyclePagerView.h; path = TYCyclePagerViewDemo/TYCyclePagerView/TYCyclePagerView.h; sourceTree = "<group>"; };
+		95ADBA2D97AEF421AB7A6C7306754DCF /* ConstraintMakerEditable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerEditable.swift; path = Sources/ConstraintMakerEditable.swift; sourceTree = "<group>"; };
+		961A5BDB21CAA6BC2E13AF7336C7A330 /* Google-Mobile-Ads-SDK-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Google-Mobile-Ads-SDK-umbrella.h"; sourceTree = "<group>"; };
+		979486118B3E90C08386079D57962701 /* SnapKit */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SnapKit; path = SnapKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		97E2BB35975B78FA5E7A453910BBD476 /* Kingfisher-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Kingfisher-umbrella.h"; sourceTree = "<group>"; };
+		97F9630E5F4311CAF023680F24DC9FD6 /* ImageDrawing.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageDrawing.swift; path = Sources/Image/ImageDrawing.swift; sourceTree = "<group>"; };
+		9843B40591C91C6EEA8461991ECACF39 /* ConstraintMakerFinalizable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerFinalizable.swift; path = Sources/ConstraintMakerFinalizable.swift; sourceTree = "<group>"; };
+		985B8E0C489AEBC6765DA6F664E8E60C /* MJRefreshBackGifFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackGifFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.h; sourceTree = "<group>"; };
+		9A03838EF90968EC3890E5B75807DE76 /* ConstraintPriority.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintPriority.swift; path = Sources/ConstraintPriority.swift; sourceTree = "<group>"; };
+		9B08856589AE4C1AD03CF61621D0F7B5 /* ResourceBundle-GoogleMobileAdsResources-Google-Mobile-Ads-SDK-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-GoogleMobileAdsResources-Google-Mobile-Ads-SDK-Info.plist"; sourceTree = "<group>"; };
+		9BEE646A39C3D6CBFD38B4AE6F33BE16 /* MJRefreshStateHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshStateHeader.m; path = MJRefresh/Custom/Header/MJRefreshStateHeader.m; 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; };
+		9DE8CF9BA328B3C92047EC89C38F2AD0 /* MJRefreshTrailer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshTrailer.m; path = MJRefresh/Base/MJRefreshTrailer.m; sourceTree = "<group>"; };
+		9E386830D5B491CD9719E1579148C5E4 /* MJRefreshGifHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshGifHeader.m; path = MJRefresh/Custom/Header/MJRefreshGifHeader.m; sourceTree = "<group>"; };
+		9F8FB555C8ED9C880ABFEBF47AAFDF39 /* ConstraintView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintView.swift; path = Sources/ConstraintView.swift; sourceTree = "<group>"; };
+		A248EBD2D8125DA820C892FDA4F7B146 /* SVProgressHUD.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SVProgressHUD.modulemap; sourceTree = "<group>"; };
+		A3EFD6CA7692A6D8AE8C9CF4613D5C56 /* AVAssetImageDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AVAssetImageDataProvider.swift; path = Sources/General/ImageSource/AVAssetImageDataProvider.swift; sourceTree = "<group>"; };
+		A5142E24DC056DBA693836F65E6BD57B /* ImageTransition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageTransition.swift; path = Sources/Image/ImageTransition.swift; sourceTree = "<group>"; };
+		A6478A9062152B3EABF0C1AE52EA6DAA /* CustomDateFormatTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CustomDateFormatTransform.swift; path = Sources/CustomDateFormatTransform.swift; sourceTree = "<group>"; };
+		A7B75C0556EF9B83C4712181A275C26B /* MJRefreshStateTrailer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshStateTrailer.m; path = MJRefresh/Custom/Trailer/MJRefreshStateTrailer.m; sourceTree = "<group>"; };
+		A9604163F654974588BDC7B1524BCEC0 /* KF.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KF.swift; path = Sources/General/KF.swift; sourceTree = "<group>"; };
+		ABB2558CF332395BFE5FC70D755389F3 /* Constraint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Constraint.swift; path = Sources/Constraint.swift; sourceTree = "<group>"; };
+		ABEB5F6B5164E3489B1399762508B6A1 /* Google-Mobile-Ads-SDK.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Google-Mobile-Ads-SDK.debug.xcconfig"; sourceTree = "<group>"; };
+		ABF2CF8A063638CABC43B38AD0F57C08 /* MJRefreshConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshConst.h; path = MJRefresh/MJRefreshConst.h; sourceTree = "<group>"; };
+		ABF6DB8877AC9F036CEAC0C5F7D49976 /* ImageContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageContext.swift; path = Sources/SwiftUI/ImageContext.swift; sourceTree = "<group>"; };
+		AC76DB04FF373A56156CDB98DB54D493 /* MJRefreshNormalTrailer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshNormalTrailer.h; path = MJRefresh/Custom/Trailer/MJRefreshNormalTrailer.h; sourceTree = "<group>"; };
+		AF029ABD5F395D531DE38DAC4AD36930 /* Delegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Delegate.swift; path = Sources/Utility/Delegate.swift; sourceTree = "<group>"; };
+		B326AB87B7F507FB019553D0D7F044C1 /* KingfisherManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KingfisherManager.swift; path = Sources/General/KingfisherManager.swift; sourceTree = "<group>"; };
+		B34FF616FC55EE370A6A03521DF76EEB /* ObjectMapper-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ObjectMapper-umbrella.h"; sourceTree = "<group>"; };
+		B469285D099A48ABE5C6734216CDD50D /* Source.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Source.swift; path = Sources/General/ImageSource/Source.swift; sourceTree = "<group>"; };
+		B5382673445F3F24283C635C97855194 /* ImageDownloaderDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageDownloaderDelegate.swift; path = Sources/Networking/ImageDownloaderDelegate.swift; sourceTree = "<group>"; };
+		B5906052A0BDBA1CEE1662E980D1BAB0 /* GoogleMobileAdsPlaceholder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GoogleMobileAdsPlaceholder.swift; path = Sources/GoogleMobileAdsPlaceholder.swift; sourceTree = "<group>"; };
+		B5B37D1644A0E8B42A83516F3B447D37 /* KFImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KFImage.swift; path = Sources/SwiftUI/KFImage.swift; sourceTree = "<group>"; };
+		B5B46615B29A84C72637FA9A1617A61D /* ObjectMapper-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ObjectMapper-dummy.m"; sourceTree = "<group>"; };
+		B6ADEB10A6CC0E326DB2E09E6D035BDE /* ConstraintMaker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMaker.swift; path = Sources/ConstraintMaker.swift; sourceTree = "<group>"; };
+		B6F5FFDC24FD3C56061FFE1533481810 /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.swift; path = Sources/Image/Image.swift; sourceTree = "<group>"; };
+		B827A9BBA3643BEDD8B4F1D33FF1D557 /* MJRefreshGifHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshGifHeader.h; path = MJRefresh/Custom/Header/MJRefreshGifHeader.h; sourceTree = "<group>"; };
+		B82DB6D8807F125AA481400BD4FF6935 /* MJRefreshAutoFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoFooter.m; path = MJRefresh/Base/MJRefreshAutoFooter.m; sourceTree = "<group>"; };
+		B8B13B7CED68EE7F15ED639D935DE224 /* ConstraintConstantTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintConstantTarget.swift; path = Sources/ConstraintConstantTarget.swift; sourceTree = "<group>"; };
+		B9084FE779702931E8DF1D00A2D725FB /* ObjectMapper */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = ObjectMapper; path = ObjectMapper.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		B980123DB78E9E9689E5DD230A4E2CFC /* KFImageProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KFImageProtocol.swift; path = Sources/SwiftUI/KFImageProtocol.swift; sourceTree = "<group>"; };
+		B9C46CD572EE304E35942429F841EF68 /* SVProgressHUD.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = SVProgressHUD.bundle; path = SVProgressHUD/SVProgressHUD.bundle; sourceTree = "<group>"; };
+		B9DCB5EC0B1CDADD221717CADDF62359 /* SnapKit-SnapKit_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "SnapKit-SnapKit_Privacy"; path = SnapKit_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+		BA0BA1215B9790C0DC01C0D022213A84 /* SVRadialGradientLayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVRadialGradientLayer.m; path = SVProgressHUD/SVRadialGradientLayer.m; sourceTree = "<group>"; };
+		BB11601B66E6CE1B46FD3A8A5752CC40 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };
+		BC3748FB414F15B1B2C3BE1E11DC8DAF /* UIScrollView+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+MJExtension.m"; path = "MJRefresh/UIScrollView+MJExtension.m"; sourceTree = "<group>"; };
+		BCA69560930F0FAA366E52EA8AD8800E /* ConstraintLayoutGuide+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ConstraintLayoutGuide+Extensions.swift"; path = "Sources/ConstraintLayoutGuide+Extensions.swift"; sourceTree = "<group>"; };
+		BCAF93D16E6A8D0B02ED7314A2FE15B2 /* ConstraintItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintItem.swift; path = Sources/ConstraintItem.swift; sourceTree = "<group>"; };
+		BCC4EFBE9E14C6AE3853C0051798A684 /* ImageView+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ImageView+Kingfisher.swift"; path = "Sources/Extensions/ImageView+Kingfisher.swift"; sourceTree = "<group>"; };
+		BD0EC70CC5DE8269E2891909C46EC55D /* Pods-TSLiveWallpaper.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TSLiveWallpaper.release.xcconfig"; sourceTree = "<group>"; };
+		BE618849E22EC4685CC70C3CB6FF55C1 /* Pods-TSLiveWallpaper-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-TSLiveWallpaper-acknowledgements.markdown"; sourceTree = "<group>"; };
+		BFC01080AAE49C0643BED03FD188CA35 /* MJRefresh-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MJRefresh-dummy.m"; sourceTree = "<group>"; };
+		C1DE8BB21F7FF3798401D638E7AFC62F /* RequestModifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestModifier.swift; path = Sources/Networking/RequestModifier.swift; sourceTree = "<group>"; };
+		C298ABB78D9B05529B89D8322DB2E7B0 /* Kingfisher-Kingfisher */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "Kingfisher-Kingfisher"; path = Kingfisher.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+		C3F44C782D64D7EB20B61CE3844EBFAD /* Kingfisher */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Kingfisher; path = Kingfisher.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		C4627876158440289F1DD5306859627F /* Pods-TSLiveWallpaper.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-TSLiveWallpaper.modulemap"; sourceTree = "<group>"; };
+		C5807456ED7E78F213957CEC2E7DE468 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; };
+		C617D4E7006B811E28B6D7A541AC71C4 /* Google-Mobile-Ads-SDK-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Google-Mobile-Ads-SDK-xcframeworks.sh"; sourceTree = "<group>"; };
+		C755FB4B0D26371AABEB583517BC9BCF /* ImmutableMappable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImmutableMappable.swift; path = Sources/ImmutableMappable.swift; sourceTree = "<group>"; };
+		C8CC13916187C131BCFE5678F2D16E7B /* Pods-TSLiveWallpaper-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TSLiveWallpaper-Info.plist"; sourceTree = "<group>"; };
+		C9E7AFC9FC46BE415C83A303AABC7036 /* AnimatedImageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedImageView.swift; path = Sources/Views/AnimatedImageView.swift; sourceTree = "<group>"; };
+		CC4267BCAD3E2B90A89853C4D14C8FA0 /* ImagePrefetcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImagePrefetcher.swift; path = Sources/Networking/ImagePrefetcher.swift; sourceTree = "<group>"; };
+		CD1DA0A576D520DA304C44836BB7FF07 /* ConstraintLayoutSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutSupport.swift; path = Sources/ConstraintLayoutSupport.swift; sourceTree = "<group>"; };
+		CE031B2E442E3E5DA09FFB5AEE5E85E1 /* WKInterfaceImage+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "WKInterfaceImage+Kingfisher.swift"; path = "Sources/Extensions/WKInterfaceImage+Kingfisher.swift"; sourceTree = "<group>"; };
+		CE24EF88457FE9162EA909F6E2B519BF /* ImageProgressive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageProgressive.swift; path = Sources/Image/ImageProgressive.swift; sourceTree = "<group>"; };
+		CE5ABE29B09D7FC7E25E6FB43A29A3BC /* NSDecimalNumberTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NSDecimalNumberTransform.swift; path = Sources/NSDecimalNumberTransform.swift; sourceTree = "<group>"; };
+		CEA8737C1EF5CE0831D7F9691AA2FDBB /* TYCyclePagerView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TYCyclePagerView.debug.xcconfig; sourceTree = "<group>"; };
+		D00AB603790D645168584B22A580A71E /* MJRefreshConst.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshConst.m; path = MJRefresh/MJRefreshConst.m; sourceTree = "<group>"; };
+		D144881982CE17C8D19DBEBE14A6C383 /* ResourceBundle-Kingfisher-Kingfisher-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-Kingfisher-Kingfisher-Info.plist"; sourceTree = "<group>"; };
+		D21D2B8670A42905809CB90186A08E8D /* UILayoutSupport+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UILayoutSupport+Extensions.swift"; path = "Sources/UILayoutSupport+Extensions.swift"; sourceTree = "<group>"; };
+		D27BDA58787228FEBD2F1742A9FF52DA /* SessionDataTask.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDataTask.swift; path = Sources/Networking/SessionDataTask.swift; sourceTree = "<group>"; };
+		D2AFCCA8DA4FB5CDBA8829A1292EAB3D /* MJRefreshComponent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshComponent.m; path = MJRefresh/Base/MJRefreshComponent.m; sourceTree = "<group>"; };
+		D34D725E9B182F60DA17677D545A6912 /* SVIndefiniteAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVIndefiniteAnimatedView.h; path = SVProgressHUD/SVIndefiniteAnimatedView.h; sourceTree = "<group>"; };
+		D3B462DC3BD0FA83BA9FC5288541DF5F /* Pods-TSLiveWallpaper */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-TSLiveWallpaper"; path = Pods_TSLiveWallpaper.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		D3FE7B757E5EAE17A0D74241DC0FC30F /* CacheSerializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CacheSerializer.swift; path = Sources/Cache/CacheSerializer.swift; sourceTree = "<group>"; };
+		D63F4D763252E56A576EE6E105E79DCD /* ConstraintRelation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintRelation.swift; path = Sources/ConstraintRelation.swift; sourceTree = "<group>"; };
+		D703D6AB6E1F1CFE2FB5AFAAEA896215 /* CodableTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CodableTransform.swift; path = Sources/CodableTransform.swift; sourceTree = "<group>"; };
+		D949E4A6CD4FB8F9CF624858E96D2CB1 /* ConstraintAttributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintAttributes.swift; path = Sources/ConstraintAttributes.swift; sourceTree = "<group>"; };
+		D95BFC374DD09039C245B45143FA6B53 /* ConstraintLayoutGuideDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutGuideDSL.swift; path = Sources/ConstraintLayoutGuideDSL.swift; sourceTree = "<group>"; };
+		DA49719D587553BE182BA07993C1A1BD /* ConstraintConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintConfig.swift; path = Sources/ConstraintConfig.swift; sourceTree = "<group>"; };
+		DC375425FC3A5266DFB33E00794ADAA5 /* MJRefreshTrailer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshTrailer.h; path = MJRefresh/Base/MJRefreshTrailer.h; sourceTree = "<group>"; };
+		DE1500F7DD43EA75DD335C4802AB1DDB /* TYCyclePagerTransformLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TYCyclePagerTransformLayout.m; path = TYCyclePagerViewDemo/TYCyclePagerView/TYCyclePagerTransformLayout.m; sourceTree = "<group>"; };
+		DF41D623B9CC1A85C401E955068D30A7 /* GIFAnimatedImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GIFAnimatedImage.swift; path = Sources/Image/GIFAnimatedImage.swift; sourceTree = "<group>"; };
+		E49D6D248DD1CEE584E6776B9164A1B2 /* MJRefresh */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = MJRefresh; path = MJRefresh.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		E54A4918A66DD9A5CB757E32AF12F4C7 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = SVProgressHUD/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
+		E63140F2B1F0566C0AE3AD13EDDAC650 /* NSButton+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSButton+Kingfisher.swift"; path = "Sources/Extensions/NSButton+Kingfisher.swift"; sourceTree = "<group>"; };
+		E7056DE585C90B0D580E4198B98AB56E /* SnapKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SnapKit.debug.xcconfig; sourceTree = "<group>"; };
+		E7BDCE2B7D02BAC54139BBDDB8E706FD /* ObjectMapper-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ObjectMapper-prefix.pch"; sourceTree = "<group>"; };
+		E8976F649DFD66CB233B9B975047F677 /* Mapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Mapper.swift; path = Sources/Mapper.swift; sourceTree = "<group>"; };
+		E9116595B9BB0262B36F7AABC6D5FD38 /* ConstraintLayoutGuide.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutGuide.swift; path = Sources/ConstraintLayoutGuide.swift; sourceTree = "<group>"; };
+		E97D43C46A45EE515A4DA3AF94398441 /* SVProgressHUD */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SVProgressHUD; path = SVProgressHUD.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		E9F1682DCFB4DDDFC35AB767FFFEC2CE /* RetryStrategy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RetryStrategy.swift; path = Sources/Networking/RetryStrategy.swift; sourceTree = "<group>"; };
+		EB62CFA3FB3C117609EB1C2FD6984099 /* Operators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Operators.swift; path = Sources/Operators.swift; sourceTree = "<group>"; };
+		EB6BE2EECD05E003A95BE63BDA6A147D /* MJRefreshBackStateFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackStateFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.h; sourceTree = "<group>"; };
+		EBDF994F65B6B46AA6A0164AB0F64E78 /* Pods-TSLiveWallpaper.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TSLiveWallpaper.debug.xcconfig"; sourceTree = "<group>"; };
+		ECE5E8628EFBEC485DBC3858CF662477 /* SnapKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SnapKit-dummy.m"; sourceTree = "<group>"; };
+		ED2D264409F6AB7D03B65FB725A08C00 /* MJRefreshBackStateFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackStateFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m; sourceTree = "<group>"; };
+		EEB3B79A657F3A78582B569C280D0335 /* KFAnimatedImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KFAnimatedImage.swift; path = Sources/SwiftUI/KFAnimatedImage.swift; sourceTree = "<group>"; };
+		EF445674B9042D9ADDAD25843BAAE37F /* ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist"; sourceTree = "<group>"; };
+		EF6E8F2CFD13819AE6138BA4BFAAFB71 /* HexColorTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HexColorTransform.swift; path = Sources/HexColorTransform.swift; sourceTree = "<group>"; };
+		F001A8E4D6F9CB1701C8EB0618069BCA /* Pods-TSLiveWallpaper-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-TSLiveWallpaper-umbrella.h"; sourceTree = "<group>"; };
+		F1285D1042211A4F2937CBAF6B5EBF51 /* ObjectMapper.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ObjectMapper.debug.xcconfig; sourceTree = "<group>"; };
+		F17107AAE1273387AF697AA2D5FC1F71 /* MJRefresh.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MJRefresh.modulemap; sourceTree = "<group>"; };
+		F181C97D7C7F130D7149AD2A196E73F8 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Sources/Utility/Result.swift; sourceTree = "<group>"; };
+		F1F3D58187DBAACA10DD0873FC7EE0BA /* TYCyclePagerTransformLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TYCyclePagerTransformLayout.h; path = TYCyclePagerViewDemo/TYCyclePagerView/TYCyclePagerTransformLayout.h; sourceTree = "<group>"; };
+		F2258E72C40BF58DF9933569035274AE /* MJRefreshBackFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackFooter.h; path = MJRefresh/Base/MJRefreshBackFooter.h; sourceTree = "<group>"; };
+		F26BA4298204B74B4561706C1EF5A83E /* Map.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Map.swift; path = Sources/Map.swift; sourceTree = "<group>"; };
+		F3E301E70868FB6893BCBF144EB9F90C /* MJRefreshStateHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshStateHeader.h; path = MJRefresh/Custom/Header/MJRefreshStateHeader.h; sourceTree = "<group>"; };
+		F4E8FE9135F9A92BA6A42E3A402DED7C /* SnapKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SnapKit-prefix.pch"; sourceTree = "<group>"; };
+		F7241B544AEE0A5CB6F970EBEBA6BEE3 /* SnapKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SnapKit-umbrella.h"; sourceTree = "<group>"; };
+		F772EF4DFB4F2C584769ED11B189038B /* MJRefreshBackGifFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackGifFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m; sourceTree = "<group>"; };
+		F85A1085F6E3578726D9EBA1B318563E /* SessionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDelegate.swift; path = Sources/Networking/SessionDelegate.swift; sourceTree = "<group>"; };
+		F8ECCB3B4E33C0FDD00B394CC2C7EA2E /* Google-Mobile-Ads-SDK */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Google-Mobile-Ads-SDK"; path = Google_Mobile_Ads_SDK.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		F999BC1843FF5C0C4DD408F79A99B38C /* ImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageCache.swift; path = Sources/Cache/ImageCache.swift; sourceTree = "<group>"; };
+		FA765821C690D0B3024D4F28E5C11968 /* Pods-TSLiveWallpaper-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TSLiveWallpaper-resources.sh"; sourceTree = "<group>"; };
+		FB98E6F28426E7B288FD23EFA1F545A1 /* LayoutConstraint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LayoutConstraint.swift; path = Sources/LayoutConstraint.swift; sourceTree = "<group>"; };
+		FBB189A644E7A4CB22D7E72FB21D9053 /* SizeExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SizeExtensions.swift; path = Sources/Utility/SizeExtensions.swift; sourceTree = "<group>"; };
+		FC3E005996CA159F3D04393452BBC6BD /* ConstraintDirectionalInsetTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDirectionalInsetTarget.swift; path = Sources/ConstraintDirectionalInsetTarget.swift; sourceTree = "<group>"; };
+		FCB263C648A3C71018D0489C3F30D5CE /* Google-Mobile-Ads-SDK.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Google-Mobile-Ads-SDK.release.xcconfig"; sourceTree = "<group>"; };
+		FDD1AAD8907D0DA4B94BE5340313E4A3 /* Kingfisher-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Kingfisher-dummy.m"; sourceTree = "<group>"; };
+		FE3ECA8133AC5D44D5C76641C4CB62BA /* FormatIndicatedCacheSerializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FormatIndicatedCacheSerializer.swift; path = Sources/Cache/FormatIndicatedCacheSerializer.swift; sourceTree = "<group>"; };
+		FF1BF5600489BB9D5D4C9894971610E1 /* DateFormatterTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateFormatterTransform.swift; path = Sources/DateFormatterTransform.swift; sourceTree = "<group>"; };
+		FF644ED8C1DC3DA38D08EB8274DFC654 /* RedirectHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RedirectHandler.swift; path = Sources/Networking/RedirectHandler.swift; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		0774A43B68FD389A2BFB18B5F1712D73 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		10D41E11AD154FAA46DA55FB2F9C558D /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1B18565C99F773591619C6C3FCD28ECA /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				7C5679B6B27E7454F3757D1D33080DEB /* Foundation.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		327D7CCC8583EFF9DEA7DEA59CD7FAA0 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				F3FD816689C78EE6C4D0B8BA058573B9 /* Foundation.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		33428AC36668E3ED52DB70316F843FB8 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				205EB01AED14BB574DD54EAFE26E4786 /* Foundation.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		3EAA16936EA86A26110DB450DA88CEC3 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				C2667A6393A22577C16D8E3A6FA12B00 /* Foundation.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		58634B2196876B07B5310C7EACCF921E /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				B2A6C2397B8ADAE4D7D64B09FF82570E /* Foundation.framework in Frameworks */,
+				6680C3C8924C7503A6A54CF7A66BFF2F /* QuartzCore.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		6ABEBC472A0E7CC3D453061E0B979556 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		7C0484294DFD76ED8B0DB0FE5592764F /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		AAD84B30E2C97051DCF74675A166BD94 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				510E3750BD2A8E80DD85CF7549003D38 /* Foundation.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		C521EC02541323D19C562D09F6BA63CD /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				3255C72E0498D901382FCE9AE5BBE7C7 /* Accelerate.framework in Frameworks */,
+				8730086F6B396B34ABD63AEECB1A6607 /* CFNetwork.framework in Frameworks */,
+				9476A49325A5E54CEE0CB3F7BD51A5C4 /* Foundation.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		ECAFCE38012AEE12CA13B562814D66BE /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1C503D444798F1298C6B6C59F8E845B7 /* Foundation.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		06FE28578CD14DDE997F40F82D6D6915 /* Pods-TSLiveWallpaper */ = {
+			isa = PBXGroup;
+			children = (
+				C4627876158440289F1DD5306859627F /* Pods-TSLiveWallpaper.modulemap */,
+				BE618849E22EC4685CC70C3CB6FF55C1 /* Pods-TSLiveWallpaper-acknowledgements.markdown */,
+				0E2B59D91DBA47C83FA348692189F164 /* Pods-TSLiveWallpaper-acknowledgements.plist */,
+				3B2738402DD2AF2607E811ADACC7659D /* Pods-TSLiveWallpaper-dummy.m */,
+				7C9D5682618AB1CC545F36EB46334A49 /* Pods-TSLiveWallpaper-frameworks.sh */,
+				C8CC13916187C131BCFE5678F2D16E7B /* Pods-TSLiveWallpaper-Info.plist */,
+				FA765821C690D0B3024D4F28E5C11968 /* Pods-TSLiveWallpaper-resources.sh */,
+				F001A8E4D6F9CB1701C8EB0618069BCA /* Pods-TSLiveWallpaper-umbrella.h */,
+				EBDF994F65B6B46AA6A0164AB0F64E78 /* Pods-TSLiveWallpaper.debug.xcconfig */,
+				BD0EC70CC5DE8269E2891909C46EC55D /* Pods-TSLiveWallpaper.release.xcconfig */,
+			);
+			name = "Pods-TSLiveWallpaper";
+			path = "Target Support Files/Pods-TSLiveWallpaper";
+			sourceTree = "<group>";
+		};
+		174A6E5D76107F0993A76EC9A4230EA5 /* Support Files */ = {
+			isa = PBXGroup;
+			children = (
+				7607EF0B4C5143FBADC0E7C3329E4BD2 /* Google-Mobile-Ads-SDK.modulemap */,
+				7E658AD49AC96E97CEDAE40FC265A917 /* Google-Mobile-Ads-SDK-dummy.m */,
+				7D10A9DB8535B94D40E7084027EE60EB /* Google-Mobile-Ads-SDK-Info.plist */,
+				7DD87A9B2C4BF1FC4705BEA299F7644C /* Google-Mobile-Ads-SDK-prefix.pch */,
+				961A5BDB21CAA6BC2E13AF7336C7A330 /* Google-Mobile-Ads-SDK-umbrella.h */,
+				C617D4E7006B811E28B6D7A541AC71C4 /* Google-Mobile-Ads-SDK-xcframeworks.sh */,
+				ABEB5F6B5164E3489B1399762508B6A1 /* Google-Mobile-Ads-SDK.debug.xcconfig */,
+				FCB263C648A3C71018D0489C3F30D5CE /* Google-Mobile-Ads-SDK.release.xcconfig */,
+				9B08856589AE4C1AD03CF61621D0F7B5 /* ResourceBundle-GoogleMobileAdsResources-Google-Mobile-Ads-SDK-Info.plist */,
+			);
+			name = "Support Files";
+			path = "../Target Support Files/Google-Mobile-Ads-SDK";
+			sourceTree = "<group>";
+		};
+		25DD0D1ACE5D0A68C4C7BB53167E3E2B /* iOS */ = {
+			isa = PBXGroup;
+			children = (
+				03B95B2EEACD0C5CA7E31072FCE699EA /* Accelerate.framework */,
+				C5807456ED7E78F213957CEC2E7DE468 /* CFNetwork.framework */,
+				93C1F2AB798562AF39FE348F051A446C /* Foundation.framework */,
+				BB11601B66E6CE1B46FD3A8A5752CC40 /* QuartzCore.framework */,
+			);
+			name = iOS;
+			sourceTree = "<group>";
+		};
+		2BF0385FE7603A4D972D46D6B136B6AB /* Support Files */ = {
+			isa = PBXGroup;
+			children = (
+				F17107AAE1273387AF697AA2D5FC1F71 /* MJRefresh.modulemap */,
+				BFC01080AAE49C0643BED03FD188CA35 /* MJRefresh-dummy.m */,
+				3BDABA963C0C4D6766F7CFBC7A6652A9 /* MJRefresh-Info.plist */,
+				873906F6066A6EED1BDA485F54DCD0D4 /* MJRefresh-prefix.pch */,
+				3FBCAD574071AEA7B9F078F70263675D /* MJRefresh-umbrella.h */,
+				6CB762166AF45A6B6E3637EF51D86213 /* MJRefresh.debug.xcconfig */,
+				3576C8AE3222D51FA74787A2BEE1656D /* MJRefresh.release.xcconfig */,
+			);
+			name = "Support Files";
+			path = "../Target Support Files/MJRefresh";
+			sourceTree = "<group>";
+		};
+		31B69E37807540C1AF900152EE08C0B4 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				8F5830AA3FDB91D4B85BE76EF072A3EA /* GoogleMobileAds.xcframework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+		3B29E8DBF00525F45F7480BCEF098AAE /* Support Files */ = {
+			isa = PBXGroup;
+			children = (
+				84546F3549EC4A77A710C5495D78F8E8 /* Kingfisher.modulemap */,
+				FDD1AAD8907D0DA4B94BE5340313E4A3 /* Kingfisher-dummy.m */,
+				8C7401ED72E5005551D3F9C0FA068A5D /* Kingfisher-Info.plist */,
+				8C4D05A6B08E18EC99D9CEABD1F40B4D /* Kingfisher-prefix.pch */,
+				97E2BB35975B78FA5E7A453910BBD476 /* Kingfisher-umbrella.h */,
+				0FF24B33BAC805F1FBCF9CD6C50C8669 /* Kingfisher.debug.xcconfig */,
+				16A13729A37ECDD17EAD0D9A2A931B97 /* Kingfisher.release.xcconfig */,
+				D144881982CE17C8D19DBEBE14A6C383 /* ResourceBundle-Kingfisher-Kingfisher-Info.plist */,
+			);
+			name = "Support Files";
+			path = "../Target Support Files/Kingfisher";
+			sourceTree = "<group>";
+		};
+		3F0F3AD8E2609974A0ACB356D5BA2C0D /* Support Files */ = {
+			isa = PBXGroup;
+			children = (
+				1B4356D90078FB04053011C7D93FC7AA /* TYCyclePagerView.modulemap */,
+				03A2BBF58DD72D668FE9A1B678C20735 /* TYCyclePagerView-dummy.m */,
+				7BCE4EF2678943C4FFE78363B3A02C3B /* TYCyclePagerView-Info.plist */,
+				05F0BE5C3ABFC2B4B0D4E13EBB0A52D3 /* TYCyclePagerView-prefix.pch */,
+				94388666B10E7A5B2C7871D30D26F405 /* TYCyclePagerView-umbrella.h */,
+				CEA8737C1EF5CE0831D7F9691AA2FDBB /* TYCyclePagerView.debug.xcconfig */,
+				65465F2749923096C80F987845F35116 /* TYCyclePagerView.release.xcconfig */,
+			);
+			name = "Support Files";
+			path = "../Target Support Files/TYCyclePagerView";
+			sourceTree = "<group>";
+		};
+		42A70147ED30FD70D11862A6B589CAA3 /* Resources */ = {
+			isa = PBXGroup;
+			children = (
+				109719F21622CAB10C24560B1CD88A8F /* PrivacyInfo.xcprivacy */,
+			);
+			name = Resources;
+			sourceTree = "<group>";
+		};
+		434DCA3DDB2AC9B7539882C34F559EDC /* TYCyclePagerView */ = {
+			isa = PBXGroup;
+			children = (
+				F1F3D58187DBAACA10DD0873FC7EE0BA /* TYCyclePagerTransformLayout.h */,
+				DE1500F7DD43EA75DD335C4802AB1DDB /* TYCyclePagerTransformLayout.m */,
+				94BE7C9CB90826FA569B88BD6D10B914 /* TYCyclePagerView.h */,
+				5AEA0F568EB28A8DE17929677DAD06E1 /* TYCyclePagerView.m */,
+				1E33D66937E22F62E40786160FCCBC7C /* TYPageControl.h */,
+				02E63CCDBB4348AFB3A4A9CB50804A21 /* TYPageControl.m */,
+				3F0F3AD8E2609974A0ACB356D5BA2C0D /* Support Files */,
+			);
+			name = TYCyclePagerView;
+			path = TYCyclePagerView;
+			sourceTree = "<group>";
+		};
+		4B4C9C7A96728D4D7BAB15AA3B4549CE /* GoogleUserMessagingPlatform */ = {
+			isa = PBXGroup;
+			children = (
+				A0E6BEAA4FBC6F49CED6C1E0DFCC4150 /* Frameworks */,
+				85527AD08C8162983ADAC51806A452C8 /* Resources */,
+				A4766F91B8769E65F91AD79D8927D472 /* Support Files */,
+			);
+			name = GoogleUserMessagingPlatform;
+			path = GoogleUserMessagingPlatform;
+			sourceTree = "<group>";
+		};
+		4E101CBB523368F5B05A5DC1059E0812 /* Resources */ = {
+			isa = PBXGroup;
+			children = (
+				31EF154EF8D60F5A7972D59273D5EC48 /* MJRefresh.bundle */,
+			);
+			name = Resources;
+			sourceTree = "<group>";
+		};
+		67512F87AF3B7A2A6A8EBC8246CF0C21 /* Core */ = {
+			isa = PBXGroup;
+			children = (
+				D34D725E9B182F60DA17677D545A6912 /* SVIndefiniteAnimatedView.h */,
+				0197502A9B6FBBAB81F41D678DE309C1 /* SVIndefiniteAnimatedView.m */,
+				03DAC16752F2285063CC395430DCC9BD /* SVProgressAnimatedView.h */,
+				6D80BDF9CDFBB26A39C5A900867C53D4 /* SVProgressAnimatedView.m */,
+				294E333DB9CAF2F3A3C27215C3545333 /* SVProgressHUD.h */,
+				2CCB23816455F92B4A0E4B12C290662F /* SVProgressHUD.m */,
+				4204A52717236829F318CA39A3CE9356 /* SVRadialGradientLayer.h */,
+				BA0BA1215B9790C0DC01C0D022213A84 /* SVRadialGradientLayer.m */,
+				8305250F74C6D8B6DEC06D55F49B605F /* Resources */,
+			);
+			name = Core;
+			sourceTree = "<group>";
+		};
+		718E62BB7DC2D4B8AE75F4D47D4F86C1 /* Kingfisher */ = {
+			isa = PBXGroup;
+			children = (
+				C9E7AFC9FC46BE415C83A303AABC7036 /* AnimatedImageView.swift */,
+				008BA1F9DE782AF6A5BDE84FFB3F3988 /* AuthenticationChallengeResponsable.swift */,
+				A3EFD6CA7692A6D8AE8C9CF4613D5C56 /* AVAssetImageDataProvider.swift */,
+				1B3F260FABE17AA57CB42936B9027E40 /* Box.swift */,
+				D3FE7B757E5EAE17A0D74241DC0FC30F /* CacheSerializer.swift */,
+				8E52F29EAAEBBACB099D95F3F2825A42 /* CallbackQueue.swift */,
+				671FE497C5EAAE216B08AB35D30E5C38 /* CPListItem+Kingfisher.swift */,
+				AF029ABD5F395D531DE38DAC4AD36930 /* Delegate.swift */,
+				931137DB47CFD761A117E68086D0217D /* DiskStorage.swift */,
+				6E013F5B25E40EFDBEE0F8807FF165C7 /* ExtensionHelpers.swift */,
+				17FFD459722D7EE2E10AD7B28AA29D90 /* Filter.swift */,
+				FE3ECA8133AC5D44D5C76641C4CB62BA /* FormatIndicatedCacheSerializer.swift */,
+				DF41D623B9CC1A85C401E955068D30A7 /* GIFAnimatedImage.swift */,
+				2D9D2C951AC12BB75E30C064071B59BD /* GraphicsContext.swift */,
+				B6F5FFDC24FD3C56061FFE1533481810 /* Image.swift */,
+				4B4AB73695E4F4BA8AE801955F8AC42B /* ImageBinder.swift */,
+				F999BC1843FF5C0C4DD408F79A99B38C /* ImageCache.swift */,
+				ABF6DB8877AC9F036CEAC0C5F7D49976 /* ImageContext.swift */,
+				7D78C19FC513762DB6DA31E72ED78966 /* ImageDataProcessor.swift */,
+				693DF413E70DB0BA154C6CE76DEB51FA /* ImageDataProvider.swift */,
+				614B5EE6FE23207ABBFB1AEE843E52DE /* ImageDownloader.swift */,
+				B5382673445F3F24283C635C97855194 /* ImageDownloaderDelegate.swift */,
+				97F9630E5F4311CAF023680F24DC9FD6 /* ImageDrawing.swift */,
+				50FF7DDFB677EC0BDFEE26ECB9CD2AED /* ImageFormat.swift */,
+				027A8E09E75B6839F3853A1730F116CA /* ImageModifier.swift */,
+				CC4267BCAD3E2B90A89853C4D14C8FA0 /* ImagePrefetcher.swift */,
+				6176A446233F46492D6424EFB0EB3925 /* ImageProcessor.swift */,
+				CE24EF88457FE9162EA909F6E2B519BF /* ImageProgressive.swift */,
+				A5142E24DC056DBA693836F65E6BD57B /* ImageTransition.swift */,
+				BCC4EFBE9E14C6AE3853C0051798A684 /* ImageView+Kingfisher.swift */,
+				199CA14134D9876770126A0051E041E9 /* Indicator.swift */,
+				A9604163F654974588BDC7B1524BCEC0 /* KF.swift */,
+				EEB3B79A657F3A78582B569C280D0335 /* KFAnimatedImage.swift */,
+				B5B37D1644A0E8B42A83516F3B447D37 /* KFImage.swift */,
+				82A72357EE306E9D4DEC7BFA9524C281 /* KFImageOptions.swift */,
+				B980123DB78E9E9689E5DD230A4E2CFC /* KFImageProtocol.swift */,
+				02EE2348707D9396878281B8A36E0DE8 /* KFImageRenderer.swift */,
+				0ADD825C4CFFC5B05678E278E81EE0D6 /* KFOptionsSetter.swift */,
+				7562916F682197E0D145D51A42ACE9CB /* Kingfisher.swift */,
+				397DFB6CC586331960857A7D4BCC3E42 /* KingfisherError.swift */,
+				B326AB87B7F507FB019553D0D7F044C1 /* KingfisherManager.swift */,
+				2E915B029FDB07AB7DDB269D9A7A49F2 /* KingfisherOptionsInfo.swift */,
+				3400E96BD5FDE7E65619F5F5463D5E85 /* MemoryStorage.swift */,
+				E63140F2B1F0566C0AE3AD13EDDAC650 /* NSButton+Kingfisher.swift */,
+				3C174E6ACE8A752DE7CCD70905C8406A /* NSTextAttachment+Kingfisher.swift */,
+				792B3BD253325A9FB373CAFCD6C14BFE /* Placeholder.swift */,
+				FF644ED8C1DC3DA38D08EB8274DFC654 /* RedirectHandler.swift */,
+				C1DE8BB21F7FF3798401D638E7AFC62F /* RequestModifier.swift */,
+				51EC4E247A4627550E3A4DFC4DB3EB5D /* Resource.swift */,
+				F181C97D7C7F130D7149AD2A196E73F8 /* Result.swift */,
+				E9F1682DCFB4DDDFC35AB767FFFEC2CE /* RetryStrategy.swift */,
+				1A60CCD0BA216D38D63E43541D1A9C76 /* Runtime.swift */,
+				D27BDA58787228FEBD2F1742A9FF52DA /* SessionDataTask.swift */,
+				F85A1085F6E3578726D9EBA1B318563E /* SessionDelegate.swift */,
+				FBB189A644E7A4CB22D7E72FB21D9053 /* SizeExtensions.swift */,
+				B469285D099A48ABE5C6734216CDD50D /* Source.swift */,
+				50FB7C00F5D31CF2EF1224D1BE95B3C5 /* Storage.swift */,
+				410C6DF346FA68E88E0D4E1965FD6A88 /* String+MD5.swift */,
+				7D519BA9A7D292A33C23750C3409317F /* TVMonogramView+Kingfisher.swift */,
+				645BAD837B3E5AD79E417803B84CA918 /* UIButton+Kingfisher.swift */,
+				CE031B2E442E3E5DA09FFB5AEE5E85E1 /* WKInterfaceImage+Kingfisher.swift */,
+				CB784BFDB6335FF2B6A04B105457C5BB /* Resources */,
+				3B29E8DBF00525F45F7480BCEF098AAE /* Support Files */,
+			);
+			name = Kingfisher;
+			path = Kingfisher;
+			sourceTree = "<group>";
+		};
+		810D6ED9775C95093095C2BC90CE0855 /* Google-Mobile-Ads-SDK */ = {
+			isa = PBXGroup;
+			children = (
+				B5906052A0BDBA1CEE1662E980D1BAB0 /* GoogleMobileAdsPlaceholder.swift */,
+				31B69E37807540C1AF900152EE08C0B4 /* Frameworks */,
+				42A70147ED30FD70D11862A6B589CAA3 /* Resources */,
+				174A6E5D76107F0993A76EC9A4230EA5 /* Support Files */,
+			);
+			name = "Google-Mobile-Ads-SDK";
+			path = "Google-Mobile-Ads-SDK";
+			sourceTree = "<group>";
+		};
+		829B2752F5AD353725601C9ABAD72D8C /* SVProgressHUD */ = {
+			isa = PBXGroup;
+			children = (
+				67512F87AF3B7A2A6A8EBC8246CF0C21 /* Core */,
+				BF39961586688BA10EE5F5DA048C00B7 /* Support Files */,
+			);
+			name = SVProgressHUD;
+			path = SVProgressHUD;
+			sourceTree = "<group>";
+		};
+		8305250F74C6D8B6DEC06D55F49B605F /* Resources */ = {
+			isa = PBXGroup;
+			children = (
+				E54A4918A66DD9A5CB757E32AF12F4C7 /* PrivacyInfo.xcprivacy */,
+				B9C46CD572EE304E35942429F841EF68 /* SVProgressHUD.bundle */,
+			);
+			name = Resources;
+			sourceTree = "<group>";
+		};
+		85527AD08C8162983ADAC51806A452C8 /* Resources */ = {
+			isa = PBXGroup;
+			children = (
+				68C4C17FC05B79BC6B7F38F28E9F74BA /* PrivacyInfo.xcprivacy */,
+			);
+			name = Resources;
+			sourceTree = "<group>";
+		};
+		97DBDD05E65C075D4D87B158C346F41F /* SnapKit */ = {
+			isa = PBXGroup;
+			children = (
+				ABB2558CF332395BFE5FC70D755389F3 /* Constraint.swift */,
+				D949E4A6CD4FB8F9CF624858E96D2CB1 /* ConstraintAttributes.swift */,
+				DA49719D587553BE182BA07993C1A1BD /* ConstraintConfig.swift */,
+				B8B13B7CED68EE7F15ED639D935DE224 /* ConstraintConstantTarget.swift */,
+				86EC8DCBD0FC3810D2694B2989E2D8F1 /* ConstraintDescription.swift */,
+				42075ED0F4D281FF1164BB1ADE4A306F /* ConstraintDirectionalInsets.swift */,
+				FC3E005996CA159F3D04393452BBC6BD /* ConstraintDirectionalInsetTarget.swift */,
+				2D2730569D14635EBFB843CDD582510D /* ConstraintDSL.swift */,
+				5273338E50E1316828084B9BF7515975 /* ConstraintInsets.swift */,
+				1BC10B2297049F49CB48E81F7773F720 /* ConstraintInsetTarget.swift */,
+				BCAF93D16E6A8D0B02ED7314A2FE15B2 /* ConstraintItem.swift */,
+				E9116595B9BB0262B36F7AABC6D5FD38 /* ConstraintLayoutGuide.swift */,
+				BCA69560930F0FAA366E52EA8AD8800E /* ConstraintLayoutGuide+Extensions.swift */,
+				D95BFC374DD09039C245B45143FA6B53 /* ConstraintLayoutGuideDSL.swift */,
+				CD1DA0A576D520DA304C44836BB7FF07 /* ConstraintLayoutSupport.swift */,
+				569CB4290F07D6618235288636620737 /* ConstraintLayoutSupportDSL.swift */,
+				B6ADEB10A6CC0E326DB2E09E6D035BDE /* ConstraintMaker.swift */,
+				95ADBA2D97AEF421AB7A6C7306754DCF /* ConstraintMakerEditable.swift */,
+				7FF302BDEA8C5A2475341CC76C9EBC65 /* ConstraintMakerExtendable.swift */,
+				9843B40591C91C6EEA8461991ECACF39 /* ConstraintMakerFinalizable.swift */,
+				7BE48E808F985110D54DD91227271A26 /* ConstraintMakerPrioritizable.swift */,
+				2ECD6425C5A8108826B6C11428DDEDB0 /* ConstraintMakerRelatable.swift */,
+				86FA8CDA1A18D8678B19706722589D79 /* ConstraintMakerRelatable+Extensions.swift */,
+				66AD72DD5196D9563E6C3C665A7DA897 /* ConstraintMultiplierTarget.swift */,
+				4887762950D6631638E32653A89849E8 /* ConstraintOffsetTarget.swift */,
+				9A03838EF90968EC3890E5B75807DE76 /* ConstraintPriority.swift */,
+				3CCF6C2DD577C867146D24E8084FB977 /* ConstraintPriorityTarget.swift */,
+				12A946B381B51247096EC0382E20D47B /* ConstraintRelatableTarget.swift */,
+				D63F4D763252E56A576EE6E105E79DCD /* ConstraintRelation.swift */,
+				9F8FB555C8ED9C880ABFEBF47AAFDF39 /* ConstraintView.swift */,
+				117776ABEE88633280D920326B53ACE7 /* ConstraintView+Extensions.swift */,
+				557E0428F9B36B97FCCCAB692B892FB4 /* ConstraintViewDSL.swift */,
+				1D47357AC588E78F39154031F03936EA /* Debugging.swift */,
+				FB98E6F28426E7B288FD23EFA1F545A1 /* LayoutConstraint.swift */,
+				680D84FA6AF67AF4EAE5E91EFA173C8B /* LayoutConstraintItem.swift */,
+				2F4D4C3F21F3D1A8FBB01372978FB97F /* Typealiases.swift */,
+				D21D2B8670A42905809CB90186A08E8D /* UILayoutSupport+Extensions.swift */,
+				D8DCB567783BA6D7BCE2B24DA13FBB68 /* Resources */,
+				B044FE67FDDF17B0473CEBC005F0A947 /* Support Files */,
+			);
+			name = SnapKit;
+			path = SnapKit;
+			sourceTree = "<group>";
+		};
+		9C612D51C9D1DA323260F2A4BDC4079A /* Pods */ = {
+			isa = PBXGroup;
+			children = (
+				810D6ED9775C95093095C2BC90CE0855 /* Google-Mobile-Ads-SDK */,
+				4B4C9C7A96728D4D7BAB15AA3B4549CE /* GoogleUserMessagingPlatform */,
+				718E62BB7DC2D4B8AE75F4D47D4F86C1 /* Kingfisher */,
+				DC0AFABE60512D7B4EDFE0CEBCD0AF84 /* MJRefresh */,
+				AF31F16E3F0515595D879DB45D0C949B /* ObjectMapper */,
+				97DBDD05E65C075D4D87B158C346F41F /* SnapKit */,
+				829B2752F5AD353725601C9ABAD72D8C /* SVProgressHUD */,
+				434DCA3DDB2AC9B7539882C34F559EDC /* TYCyclePagerView */,
+			);
+			name = Pods;
+			sourceTree = "<group>";
+		};
+		A0E6BEAA4FBC6F49CED6C1E0DFCC4150 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				031AD5884F4BA1B1BE7CBCE38B7D6760 /* UserMessagingPlatform.xcframework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+		A4766F91B8769E65F91AD79D8927D472 /* Support Files */ = {
+			isa = PBXGroup;
+			children = (
+				5A45001FC79ED0DBB161B8DEA2A61ED6 /* GoogleUserMessagingPlatform-xcframeworks.sh */,
+				177E465A4BABFC5B56E52DFC109CE085 /* GoogleUserMessagingPlatform.debug.xcconfig */,
+				17E7CA5C20BDC607D41C39BFA2BA5A99 /* GoogleUserMessagingPlatform.release.xcconfig */,
+				55318970A511F1980B0A0753BA6DB73E /* ResourceBundle-UserMessagingPlatformResources-GoogleUserMessagingPlatform-Info.plist */,
+			);
+			name = "Support Files";
+			path = "../Target Support Files/GoogleUserMessagingPlatform";
+			sourceTree = "<group>";
+		};
+		AF31F16E3F0515595D879DB45D0C949B /* ObjectMapper */ = {
+			isa = PBXGroup;
+			children = (
+				D703D6AB6E1F1CFE2FB5AFAAEA896215 /* CodableTransform.swift */,
+				A6478A9062152B3EABF0C1AE52EA6DAA /* CustomDateFormatTransform.swift */,
+				20B61F1A6A28E9EEAF1ECE43E9D9775A /* DataTransform.swift */,
+				FF1BF5600489BB9D5D4C9894971610E1 /* DateFormatterTransform.swift */,
+				1BBF9E09855C23F3398645798DDCD1E7 /* DateTransform.swift */,
+				8E8A070E55423DB45C71FBB622910DF5 /* DictionaryTransform.swift */,
+				0D313831315E975A84CB0359CFF86232 /* EnumOperators.swift */,
+				685F5BFF05AC11DC7385B1E92E507948 /* EnumTransform.swift */,
+				9464D0A1B731A7E3EA2550947112248F /* FromJSON.swift */,
+				EF6E8F2CFD13819AE6138BA4BFAAFB71 /* HexColorTransform.swift */,
+				C755FB4B0D26371AABEB583517BC9BCF /* ImmutableMappable.swift */,
+				4915351A0B077ADECF2E5D08B5A77E13 /* IntegerOperators.swift */,
+				72620E6CC24AD85B1DA6818937B2942C /* ISO8601DateTransform.swift */,
+				F26BA4298204B74B4561706C1EF5A83E /* Map.swift */,
+				8AA5E66075BFA3596D2D94204547A21C /* MapError.swift */,
+				3CC4EA66F3C8CF80302D5662D7FB7191 /* Mappable.swift */,
+				E8976F649DFD66CB233B9B975047F677 /* Mapper.swift */,
+				CE5ABE29B09D7FC7E25E6FB43A29A3BC /* NSDecimalNumberTransform.swift */,
+				EB62CFA3FB3C117609EB1C2FD6984099 /* Operators.swift */,
+				000E8D38E4CC6A39F5D9E29F462EB58E /* ToJSON.swift */,
+				00F1FD628E16979FB6282F6A38FDA703 /* TransformOf.swift */,
+				878E3387B36CF20715D42B6EE2F3352B /* TransformOperators.swift */,
+				144BE2B30733005092844347AD8F767D /* TransformType.swift */,
+				925F1A2936277CCF3331D00D52B08977 /* URLTransform.swift */,
+				F781D7E425E4853E1F74411379BE860F /* Support Files */,
+			);
+			name = ObjectMapper;
+			path = ObjectMapper;
+			sourceTree = "<group>";
+		};
+		B044FE67FDDF17B0473CEBC005F0A947 /* Support Files */ = {
+			isa = PBXGroup;
+			children = (
+				EF445674B9042D9ADDAD25843BAAE37F /* ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist */,
+				2615A809B8DB81C89D79182F90CAD12D /* SnapKit.modulemap */,
+				ECE5E8628EFBEC485DBC3858CF662477 /* SnapKit-dummy.m */,
+				0CE3CA37D6C7DA8C116731FF2553A8FE /* SnapKit-Info.plist */,
+				F4E8FE9135F9A92BA6A42E3A402DED7C /* SnapKit-prefix.pch */,
+				F7241B544AEE0A5CB6F970EBEBA6BEE3 /* SnapKit-umbrella.h */,
+				E7056DE585C90B0D580E4198B98AB56E /* SnapKit.debug.xcconfig */,
+				20D9D6BC14F7E83677E262494E4B68C6 /* SnapKit.release.xcconfig */,
+			);
+			name = "Support Files";
+			path = "../Target Support Files/SnapKit";
+			sourceTree = "<group>";
+		};
+		BA4F31F07263C99FC76E66D632A59F09 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				25DD0D1ACE5D0A68C4C7BB53167E3E2B /* iOS */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+		BF39961586688BA10EE5F5DA048C00B7 /* Support Files */ = {
+			isa = PBXGroup;
+			children = (
+				A248EBD2D8125DA820C892FDA4F7B146 /* SVProgressHUD.modulemap */,
+				486B1CD13E324DFFE8880EB716ABAEA3 /* SVProgressHUD-dummy.m */,
+				0554236318AB08E21E50CFE77A256AFA /* SVProgressHUD-Info.plist */,
+				7F1DD9366A421CC21F0E60C238A43FB2 /* SVProgressHUD-prefix.pch */,
+				7F5A0C00FBB95691845ACAD5D3E0DE27 /* SVProgressHUD-umbrella.h */,
+				3FB927B5CAEB209CFBBE88C04C0C5292 /* SVProgressHUD.debug.xcconfig */,
+				73A77F1BAF99E21DD9994E772C9C975E /* SVProgressHUD.release.xcconfig */,
+			);
+			name = "Support Files";
+			path = "../Target Support Files/SVProgressHUD";
+			sourceTree = "<group>";
+		};
+		CB784BFDB6335FF2B6A04B105457C5BB /* Resources */ = {
+			isa = PBXGroup;
+			children = (
+				487A3EF03C8C68A1444BDC5DF26BCC26 /* PrivacyInfo.xcprivacy */,
+			);
+			name = Resources;
+			sourceTree = "<group>";
+		};
+		CF1408CF629C7361332E53B88F7BD30C = {
+			isa = PBXGroup;
+			children = (
+				9D940727FF8FB9C785EB98E56350EF41 /* Podfile */,
+				BA4F31F07263C99FC76E66D632A59F09 /* Frameworks */,
+				9C612D51C9D1DA323260F2A4BDC4079A /* Pods */,
+				FB8CFBC89CD386495182EB6D9D2742D5 /* Products */,
+				DC429A8A2B93E2961BDEEA610A1DF3BF /* Targets Support Files */,
+			);
+			sourceTree = "<group>";
+		};
+		D8DCB567783BA6D7BCE2B24DA13FBB68 /* Resources */ = {
+			isa = PBXGroup;
+			children = (
+				05B7C7934BE84D598229153377544E33 /* PrivacyInfo.xcprivacy */,
+			);
+			name = Resources;
+			sourceTree = "<group>";
+		};
+		DC0AFABE60512D7B4EDFE0CEBCD0AF84 /* MJRefresh */ = {
+			isa = PBXGroup;
+			children = (
+				15A6DC355D7202F38913F711B28C27CE /* MJRefresh.h */,
+				1575B14E98FEB3102624BB354AC695BF /* MJRefreshAutoFooter.h */,
+				B82DB6D8807F125AA481400BD4FF6935 /* MJRefreshAutoFooter.m */,
+				887107269FA2138D9AD9197016CCEC90 /* MJRefreshAutoGifFooter.h */,
+				93EBDF0C81E73FE8F063AF364FCB94D7 /* MJRefreshAutoGifFooter.m */,
+				6EF78676DEEEF51F2612962C4DA5CC3F /* MJRefreshAutoNormalFooter.h */,
+				7B09B77DD2EB9C47372C622D7A165455 /* MJRefreshAutoNormalFooter.m */,
+				2EDB0E73C598F39976ED284DB941FC0C /* MJRefreshAutoStateFooter.h */,
+				73850F909F31CD264F78B8915725DE0D /* MJRefreshAutoStateFooter.m */,
+				F2258E72C40BF58DF9933569035274AE /* MJRefreshBackFooter.h */,
+				3E1565A5D095F52AAF9537EA921A7C12 /* MJRefreshBackFooter.m */,
+				985B8E0C489AEBC6765DA6F664E8E60C /* MJRefreshBackGifFooter.h */,
+				F772EF4DFB4F2C584769ED11B189038B /* MJRefreshBackGifFooter.m */,
+				07BAF99D048575D80C266DC967F49F98 /* MJRefreshBackNormalFooter.h */,
+				28CDC0AD5340C2E7F45CCE68B06F8E4B /* MJRefreshBackNormalFooter.m */,
+				EB6BE2EECD05E003A95BE63BDA6A147D /* MJRefreshBackStateFooter.h */,
+				ED2D264409F6AB7D03B65FB725A08C00 /* MJRefreshBackStateFooter.m */,
+				71F37A4998BD20D69027E2274E8D2443 /* MJRefreshComponent.h */,
+				D2AFCCA8DA4FB5CDBA8829A1292EAB3D /* MJRefreshComponent.m */,
+				1E990C2560189884EBE94B6B173B5C3A /* MJRefreshConfig.h */,
+				54B834F25B43F75D7C5375CCE2EDE4A0 /* MJRefreshConfig.m */,
+				ABF2CF8A063638CABC43B38AD0F57C08 /* MJRefreshConst.h */,
+				D00AB603790D645168584B22A580A71E /* MJRefreshConst.m */,
+				7D087118DAF2A388056ABD41FDA5987E /* MJRefreshFooter.h */,
+				7CC91D7579A41D4761ECABC0D6F7195C /* MJRefreshFooter.m */,
+				B827A9BBA3643BEDD8B4F1D33FF1D557 /* MJRefreshGifHeader.h */,
+				9E386830D5B491CD9719E1579148C5E4 /* MJRefreshGifHeader.m */,
+				2E00CA670F8E7507B820E199E41F7838 /* MJRefreshHeader.h */,
+				0EA8F04A9489818026454CA06998DF56 /* MJRefreshHeader.m */,
+				02E9C76BD8940414E8F9D74B6C7AD67A /* MJRefreshNormalHeader.h */,
+				1F732F460B4A8EDC4DD87E49AE2D3930 /* MJRefreshNormalHeader.m */,
+				AC76DB04FF373A56156CDB98DB54D493 /* MJRefreshNormalTrailer.h */,
+				36F611C142E9F0C6F2439DAAA1440C01 /* MJRefreshNormalTrailer.m */,
+				F3E301E70868FB6893BCBF144EB9F90C /* MJRefreshStateHeader.h */,
+				9BEE646A39C3D6CBFD38B4AE6F33BE16 /* MJRefreshStateHeader.m */,
+				32B843697B4F6EDE929CFA57666F0CC0 /* MJRefreshStateTrailer.h */,
+				A7B75C0556EF9B83C4712181A275C26B /* MJRefreshStateTrailer.m */,
+				DC375425FC3A5266DFB33E00794ADAA5 /* MJRefreshTrailer.h */,
+				9DE8CF9BA328B3C92047EC89C38F2AD0 /* MJRefreshTrailer.m */,
+				03FB476E286B86B85F5752570C344C1E /* NSBundle+MJRefresh.h */,
+				8D2D2AE277B824AAB456055EC33FE0C1 /* NSBundle+MJRefresh.m */,
+				05E6B0AE18E936228D8E819D928306F0 /* UICollectionViewLayout+MJRefresh.h */,
+				1A0B0BF6D7AA8DE109C139D5E04D1F94 /* UICollectionViewLayout+MJRefresh.m */,
+				0C9136C6B8744ED43003515F37FFFDEC /* UIScrollView+MJExtension.h */,
+				BC3748FB414F15B1B2C3BE1E11DC8DAF /* UIScrollView+MJExtension.m */,
+				1473D193E24EEE8125E71A693002F933 /* UIScrollView+MJRefresh.h */,
+				2B792222193C3597FB1A968FD4E23ABB /* UIScrollView+MJRefresh.m */,
+				09D540991797D2A2610AAAA543C89300 /* UIView+MJExtension.h */,
+				6EE463BE70E3F0B8FF0A488E035F64DA /* UIView+MJExtension.m */,
+				4E101CBB523368F5B05A5DC1059E0812 /* Resources */,
+				2BF0385FE7603A4D972D46D6B136B6AB /* Support Files */,
+			);
+			name = MJRefresh;
+			path = MJRefresh;
+			sourceTree = "<group>";
+		};
+		DC429A8A2B93E2961BDEEA610A1DF3BF /* Targets Support Files */ = {
+			isa = PBXGroup;
+			children = (
+				06FE28578CD14DDE997F40F82D6D6915 /* Pods-TSLiveWallpaper */,
+			);
+			name = "Targets Support Files";
+			sourceTree = "<group>";
+		};
+		F781D7E425E4853E1F74411379BE860F /* Support Files */ = {
+			isa = PBXGroup;
+			children = (
+				6731C6C64303FDC41CF9EDC4DF0C415C /* ObjectMapper.modulemap */,
+				B5B46615B29A84C72637FA9A1617A61D /* ObjectMapper-dummy.m */,
+				64BA39514E7C734D43A97C2DD4A1D772 /* ObjectMapper-Info.plist */,
+				E7BDCE2B7D02BAC54139BBDDB8E706FD /* ObjectMapper-prefix.pch */,
+				B34FF616FC55EE370A6A03521DF76EEB /* ObjectMapper-umbrella.h */,
+				F1285D1042211A4F2937CBAF6B5EBF51 /* ObjectMapper.debug.xcconfig */,
+				679364E2A7268C58ACABD3FAB7064183 /* ObjectMapper.release.xcconfig */,
+			);
+			name = "Support Files";
+			path = "../Target Support Files/ObjectMapper";
+			sourceTree = "<group>";
+		};
+		FB8CFBC89CD386495182EB6D9D2742D5 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				F8ECCB3B4E33C0FDD00B394CC2C7EA2E /* Google-Mobile-Ads-SDK */,
+				3998091512768CD07733CB4F02B4BD9F /* Google-Mobile-Ads-SDK-GoogleMobileAdsResources */,
+				8A377C18F92A8A511869ADA54B5652D2 /* GoogleUserMessagingPlatform-UserMessagingPlatformResources */,
+				C3F44C782D64D7EB20B61CE3844EBFAD /* Kingfisher */,
+				C298ABB78D9B05529B89D8322DB2E7B0 /* Kingfisher-Kingfisher */,
+				E49D6D248DD1CEE584E6776B9164A1B2 /* MJRefresh */,
+				B9084FE779702931E8DF1D00A2D725FB /* ObjectMapper */,
+				D3B462DC3BD0FA83BA9FC5288541DF5F /* Pods-TSLiveWallpaper */,
+				979486118B3E90C08386079D57962701 /* SnapKit */,
+				B9DCB5EC0B1CDADD221717CADDF62359 /* SnapKit-SnapKit_Privacy */,
+				E97D43C46A45EE515A4DA3AF94398441 /* SVProgressHUD */,
+				6B1A21536A55542D19E4E3C7277DFFAC /* TYCyclePagerView */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+		32DA342B1D689C26633F73C784830CFD /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				7750AEDBA3A2CA3CB301624B2D41203C /* Pods-TSLiveWallpaper-umbrella.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		3C671E74EE990CC2845FACBE9BF760DE /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				5FF1C3AF7672F55437688FC35E2E6A71 /* MJRefresh.h in Headers */,
+				B1307BCEFA623FF242109620B14A08BA /* MJRefresh-umbrella.h in Headers */,
+				1CDB03419D31CB46D2DDA3BDBFE54FA0 /* MJRefreshAutoFooter.h in Headers */,
+				8077A41ACD375F4384A97031D20DA8C2 /* MJRefreshAutoGifFooter.h in Headers */,
+				863265A549BF19D79A4EBB25C183DC7F /* MJRefreshAutoNormalFooter.h in Headers */,
+				181E5F4343C6D3625AE04C1B0D70F0C7 /* MJRefreshAutoStateFooter.h in Headers */,
+				A32C79A703440A6FD893D2EC99C8A50B /* MJRefreshBackFooter.h in Headers */,
+				98F3E3E30CB29B6D33FEC344656DE2B1 /* MJRefreshBackGifFooter.h in Headers */,
+				58B1051758A1FA76C2B9F8C07AC1E55C /* MJRefreshBackNormalFooter.h in Headers */,
+				5C50F36F9CB20A20396364C601DB40B0 /* MJRefreshBackStateFooter.h in Headers */,
+				CC4F11DE003A880456411027726DC0F4 /* MJRefreshComponent.h in Headers */,
+				5901084F0039F17126684A022E5F84B5 /* MJRefreshConfig.h in Headers */,
+				89235D5EC1FA4F0FD6165B17B542D714 /* MJRefreshConst.h in Headers */,
+				ECBC215883D3DF3A4E9971487E4DB260 /* MJRefreshFooter.h in Headers */,
+				3769DDC469C4CECA0F9883481E631CC2 /* MJRefreshGifHeader.h in Headers */,
+				AFAAE42DF4585633FA1A217A0E811856 /* MJRefreshHeader.h in Headers */,
+				F52A27FAA0646504F274F1224366E858 /* MJRefreshNormalHeader.h in Headers */,
+				FF5D09270B5A2A00D0E459592002D1F2 /* MJRefreshNormalTrailer.h in Headers */,
+				CE9BCBAD24F7170954A9C7C0B9CB762F /* MJRefreshStateHeader.h in Headers */,
+				F514EA78D136755D0BC0C5D2778A4B73 /* MJRefreshStateTrailer.h in Headers */,
+				0114B8F5F20574BB892ACFE2B202D95C /* MJRefreshTrailer.h in Headers */,
+				B11D964D81D0EF31D61552C5631E7A3F /* NSBundle+MJRefresh.h in Headers */,
+				ED9C51A66341A9C0224E9E07AB1F38D7 /* UICollectionViewLayout+MJRefresh.h in Headers */,
+				FD7662803D266AB3603053D653FA601D /* UIScrollView+MJExtension.h in Headers */,
+				705227AC0D2868E0C0452B6B2F13E7AA /* UIScrollView+MJRefresh.h in Headers */,
+				E3073CA98E00E91598591BB39A850397 /* UIView+MJExtension.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		5B1500FE995B9224E0AF0B42CE93C03B /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				57C4F6EFB30DDD14E960AC2D6B34F904 /* SnapKit-umbrella.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		5FCC64FF5D39D0EC2156A041B07C3E33 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				34E3A0CEF1DF0EF6C3F747CB73B711A2 /* ObjectMapper-umbrella.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		B23F9353E3148B809D4BA25A333D0F47 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				BD90468037AC7AC384A68A4EABE27F84 /* Google-Mobile-Ads-SDK-umbrella.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		C7441981289409FB60F9BF205F3F4F64 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				0A8E3C4B23DEE792B723A539DCBBFC23 /* TYCyclePagerTransformLayout.h in Headers */,
+				BE9BF6434883ABB53C2073B7C29FFC7E /* TYCyclePagerView.h in Headers */,
+				593FBBC2A00CC20738DF20DD72F95716 /* TYCyclePagerView-umbrella.h in Headers */,
+				7BCFF35E5AEFB2CF255E0C9F482AC9EB /* TYPageControl.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		D453A0517CB1FEE5E93A899DD87912B9 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				30A56A3897BBCB69E8CCF9BF317D58A8 /* Kingfisher-umbrella.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		FADE750CFF2C806685AE314EE7FF71B1 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1739C4B63D12177E58B7110F21E939EB /* SVIndefiniteAnimatedView.h in Headers */,
+				14F6602F47FF59347CB6807CE217EDC5 /* SVProgressAnimatedView.h in Headers */,
+				91930FDB4F9CCBBA9789806D1611AE6F /* SVProgressHUD.h in Headers */,
+				6037BA6633BDFF4F63D6C8B7C70D6160 /* SVProgressHUD-umbrella.h in Headers */,
+				7804E0B3C98A2FE1E98AF544E88C9C3C /* SVRadialGradientLayer.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+		162E649F50FEC62B61BDD87D1BD422B4 /* ObjectMapper */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 1D33C0E8AF073F3821E2C60FBD5451DB /* Build configuration list for PBXNativeTarget "ObjectMapper" */;
+			buildPhases = (
+				5FCC64FF5D39D0EC2156A041B07C3E33 /* Headers */,
+				A9C198DBC90FE93D1F6609B66EFFBF60 /* Sources */,
+				1B18565C99F773591619C6C3FCD28ECA /* Frameworks */,
+				817B41C0A26278448641364EC3D4E8F8 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = ObjectMapper;
+			productName = ObjectMapper;
+			productReference = B9084FE779702931E8DF1D00A2D725FB /* ObjectMapper */;
+			productType = "com.apple.product-type.framework";
+		};
+		19622742EBA51E823D6DAE3F8CDBFAD4 /* SnapKit */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 80CE967CAA1D35721519F892BAF7A19B /* Build configuration list for PBXNativeTarget "SnapKit" */;
+			buildPhases = (
+				5B1500FE995B9224E0AF0B42CE93C03B /* Headers */,
+				F7AC6792C89443C7B212A06E810BAB97 /* Sources */,
+				33428AC36668E3ED52DB70316F843FB8 /* Frameworks */,
+				1DEDF411E550D85A1218E1655456A9CD /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				5A9D99552EB9AC468A3686D0587D7B21 /* PBXTargetDependency */,
+			);
+			name = SnapKit;
+			productName = SnapKit;
+			productReference = 979486118B3E90C08386079D57962701 /* SnapKit */;
+			productType = "com.apple.product-type.framework";
+		};
+		1C8D67D8B72D6BA42CCEDB648537A340 /* SVProgressHUD */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 69444753864BFEE93D93DCEABA3746A1 /* Build configuration list for PBXNativeTarget "SVProgressHUD" */;
+			buildPhases = (
+				FADE750CFF2C806685AE314EE7FF71B1 /* Headers */,
+				64C08EC1725AD96D4816E78A9498AED6 /* Sources */,
+				58634B2196876B07B5310C7EACCF921E /* Frameworks */,
+				240039A2FB82D44B5CE5DB05D41F6BA9 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = SVProgressHUD;
+			productName = SVProgressHUD;
+			productReference = E97D43C46A45EE515A4DA3AF94398441 /* SVProgressHUD */;
+			productType = "com.apple.product-type.framework";
+		};
+		36FD0958A0EC4A0FCF599E9B22719B03 /* Google-Mobile-Ads-SDK-GoogleMobileAdsResources */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 3F3B2F91C7ABE05E64374EB5A20EBCC0 /* Build configuration list for PBXNativeTarget "Google-Mobile-Ads-SDK-GoogleMobileAdsResources" */;
+			buildPhases = (
+				61F26EB0B738A4A79F1BB59F96C4C34E /* Sources */,
+				0774A43B68FD389A2BFB18B5F1712D73 /* Frameworks */,
+				C5C8C4AF1C03B3841B6783836860EF40 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = "Google-Mobile-Ads-SDK-GoogleMobileAdsResources";
+			productName = GoogleMobileAdsResources;
+			productReference = 3998091512768CD07733CB4F02B4BD9F /* Google-Mobile-Ads-SDK-GoogleMobileAdsResources */;
+			productType = "com.apple.product-type.bundle";
+		};
+		416BCB647D16D0ED89A6729B14DD54D2 /* TYCyclePagerView */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 54482BEF8A2446AF2C2C80F2F446F13C /* Build configuration list for PBXNativeTarget "TYCyclePagerView" */;
+			buildPhases = (
+				C7441981289409FB60F9BF205F3F4F64 /* Headers */,
+				494EBF383D1E1F7AB880AFDE5A27D1D7 /* Sources */,
+				ECAFCE38012AEE12CA13B562814D66BE /* Frameworks */,
+				F40A112E96980E201F3537A660F311A7 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = TYCyclePagerView;
+			productName = TYCyclePagerView;
+			productReference = 6B1A21536A55542D19E4E3C7277DFFAC /* TYCyclePagerView */;
+			productType = "com.apple.product-type.framework";
+		};
+		63A7C675C13F87669AF56006D943998B /* GoogleUserMessagingPlatform-UserMessagingPlatformResources */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = D0FA975C9FFB1F3884737E061F7BD52D /* Build configuration list for PBXNativeTarget "GoogleUserMessagingPlatform-UserMessagingPlatformResources" */;
+			buildPhases = (
+				31D45D3171229FC0231E3E0C8FB54BC8 /* Sources */,
+				7C0484294DFD76ED8B0DB0FE5592764F /* Frameworks */,
+				0957AD4858C6E68FBC7F6F48FA6FA84C /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = "GoogleUserMessagingPlatform-UserMessagingPlatformResources";
+			productName = UserMessagingPlatformResources;
+			productReference = 8A377C18F92A8A511869ADA54B5652D2 /* GoogleUserMessagingPlatform-UserMessagingPlatformResources */;
+			productType = "com.apple.product-type.bundle";
+		};
+		6868056D761E163D10FDAF8CF1C4D9B8 /* MJRefresh */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 0E7E0F60830A86D70533E72AE5DA33D1 /* Build configuration list for PBXNativeTarget "MJRefresh" */;
+			buildPhases = (
+				3C671E74EE990CC2845FACBE9BF760DE /* Headers */,
+				40CED5BE9DA5C4C485C923B93C2E26D3 /* Sources */,
+				3EAA16936EA86A26110DB450DA88CEC3 /* Frameworks */,
+				4FFE6EAC99DFE8941FFB61B891AB92B9 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = MJRefresh;
+			productName = MJRefresh;
+			productReference = E49D6D248DD1CEE584E6776B9164A1B2 /* MJRefresh */;
+			productType = "com.apple.product-type.framework";
+		};
+		7D2F86550B0DC3975806CCC87595350D /* Pods-TSLiveWallpaper */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 999B2FE7F8CA8C4BFB786D13928108A1 /* Build configuration list for PBXNativeTarget "Pods-TSLiveWallpaper" */;
+			buildPhases = (
+				32DA342B1D689C26633F73C784830CFD /* Headers */,
+				F3A6A6FF4A52FEBCEEDE0740918C2699 /* Sources */,
+				327D7CCC8583EFF9DEA7DEA59CD7FAA0 /* Frameworks */,
+				411D130A1B484C8AFB9AC50FE8DB848E /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				2D62355561AE4F305C38100C1990030F /* PBXTargetDependency */,
+				872F2A056BF5E0514AAB54186C4EF9CD /* PBXTargetDependency */,
+				03AA7F5768DAD7B0C58972B4F410CF3B /* PBXTargetDependency */,
+				D91170AECBB2BDCB4704984FCDB11A91 /* PBXTargetDependency */,
+				5BE2D732B6B818329013ADEB58E2EDDA /* PBXTargetDependency */,
+				8EBF369E9B53559F1131C34069C33E3C /* PBXTargetDependency */,
+				4E7B585C932F46EBA7EE1933A48D5855 /* PBXTargetDependency */,
+				E19E5450A3DEEFA98C69C8A576C17553 /* PBXTargetDependency */,
+			);
+			name = "Pods-TSLiveWallpaper";
+			productName = Pods_TSLiveWallpaper;
+			productReference = D3B462DC3BD0FA83BA9FC5288541DF5F /* Pods-TSLiveWallpaper */;
+			productType = "com.apple.product-type.framework";
+		};
+		8A8DB685241263AFDF5E6B20FE67B93A /* SnapKit-SnapKit_Privacy */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = F979D9403F00AB57DBEAAE7F6E511A7C /* Build configuration list for PBXNativeTarget "SnapKit-SnapKit_Privacy" */;
+			buildPhases = (
+				1E20A753CFC5E2857D9E1F43E5C69DB9 /* Sources */,
+				6ABEBC472A0E7CC3D453061E0B979556 /* Frameworks */,
+				0F3E25BBB60D722E72D0FE2FA4471EAF /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = "SnapKit-SnapKit_Privacy";
+			productName = SnapKit_Privacy;
+			productReference = B9DCB5EC0B1CDADD221717CADDF62359 /* SnapKit-SnapKit_Privacy */;
+			productType = "com.apple.product-type.bundle";
+		};
+		9828BBC09E9FB1238624113D7456E59E /* Kingfisher-Kingfisher */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = A46FC6A4C0DEF24502B8FD1F7965E0EF /* Build configuration list for PBXNativeTarget "Kingfisher-Kingfisher" */;
+			buildPhases = (
+				E4B2E504C40EC81660272D2583376869 /* Sources */,
+				10D41E11AD154FAA46DA55FB2F9C558D /* Frameworks */,
+				39672BE20EABD0387A4337A34B223023 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = "Kingfisher-Kingfisher";
+			productName = Kingfisher;
+			productReference = C298ABB78D9B05529B89D8322DB2E7B0 /* Kingfisher-Kingfisher */;
+			productType = "com.apple.product-type.bundle";
+		};
+		E8022D22FAA6690B5E1C379C1BCE1491 /* Kingfisher */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = B73E6A6D0321D9CF4C64784B9A87541E /* Build configuration list for PBXNativeTarget "Kingfisher" */;
+			buildPhases = (
+				D453A0517CB1FEE5E93A899DD87912B9 /* Headers */,
+				DCD73A5341AD125BB21DADA1EF872BD6 /* Sources */,
+				C521EC02541323D19C562D09F6BA63CD /* Frameworks */,
+				BED329C341E94BB899D3B6282FA194C6 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				9E14C70A7C80BD256DC9ED8C6B89F47B /* PBXTargetDependency */,
+			);
+			name = Kingfisher;
+			productName = Kingfisher;
+			productReference = C3F44C782D64D7EB20B61CE3844EBFAD /* Kingfisher */;
+			productType = "com.apple.product-type.framework";
+		};
+		FEA3B3A570634836C0457F3D7CEF1699 /* Google-Mobile-Ads-SDK */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 0133F7ACE4F2664542B16D7BCEF4D52E /* Build configuration list for PBXNativeTarget "Google-Mobile-Ads-SDK" */;
+			buildPhases = (
+				B23F9353E3148B809D4BA25A333D0F47 /* Headers */,
+				62A1CB4E7755DF23F645AE7F4B214347 /* [CP] Copy XCFrameworks */,
+				DCEEB9F8EA09BB4BFEBDBD7594F8545D /* Sources */,
+				AAD84B30E2C97051DCF74675A166BD94 /* Frameworks */,
+				1CF44B3B9ECB7DB1FE1C8B3C244E4EAD /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				12797A4AE6B7AD8E3D6E795DE7E8CF0F /* PBXTargetDependency */,
+				72ED309E3BCDA3BC694551BF9088637B /* PBXTargetDependency */,
+			);
+			name = "Google-Mobile-Ads-SDK";
+			productName = Google_Mobile_Ads_SDK;
+			productReference = F8ECCB3B4E33C0FDD00B394CC2C7EA2E /* Google-Mobile-Ads-SDK */;
+			productType = "com.apple.product-type.framework";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		BFDFE7DC352907FC980B868725387E98 /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastSwiftUpdateCheck = 1600;
+				LastUpgradeCheck = 1600;
+			};
+			buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */;
+			compatibilityVersion = "Xcode 15.3";
+			developmentRegion = en;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				Base,
+				en,
+			);
+			mainGroup = CF1408CF629C7361332E53B88F7BD30C;
+			minimizedProjectReferenceProxies = 0;
+			preferredProjectObjectVersion = 77;
+			productRefGroup = FB8CFBC89CD386495182EB6D9D2742D5 /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				FEA3B3A570634836C0457F3D7CEF1699 /* Google-Mobile-Ads-SDK */,
+				36FD0958A0EC4A0FCF599E9B22719B03 /* Google-Mobile-Ads-SDK-GoogleMobileAdsResources */,
+				458B188365A307B3C128ABF524D1A3E3 /* GoogleUserMessagingPlatform */,
+				63A7C675C13F87669AF56006D943998B /* GoogleUserMessagingPlatform-UserMessagingPlatformResources */,
+				E8022D22FAA6690B5E1C379C1BCE1491 /* Kingfisher */,
+				9828BBC09E9FB1238624113D7456E59E /* Kingfisher-Kingfisher */,
+				6868056D761E163D10FDAF8CF1C4D9B8 /* MJRefresh */,
+				162E649F50FEC62B61BDD87D1BD422B4 /* ObjectMapper */,
+				7D2F86550B0DC3975806CCC87595350D /* Pods-TSLiveWallpaper */,
+				19622742EBA51E823D6DAE3F8CDBFAD4 /* SnapKit */,
+				8A8DB685241263AFDF5E6B20FE67B93A /* SnapKit-SnapKit_Privacy */,
+				1C8D67D8B72D6BA42CCEDB648537A340 /* SVProgressHUD */,
+				416BCB647D16D0ED89A6729B14DD54D2 /* TYCyclePagerView */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		0957AD4858C6E68FBC7F6F48FA6FA84C /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				CDF453A98D6F8E4D4DED29434F865129 /* PrivacyInfo.xcprivacy in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		0F3E25BBB60D722E72D0FE2FA4471EAF /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				6569B2EB2A065A6DAE052C96FF24048B /* PrivacyInfo.xcprivacy in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1CF44B3B9ECB7DB1FE1C8B3C244E4EAD /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		1DEDF411E550D85A1218E1655456A9CD /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				9E0045B41BFE697DB4ADE151228024D2 /* SnapKit-SnapKit_Privacy in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		240039A2FB82D44B5CE5DB05D41F6BA9 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				89717EC07E6324D3405867E754AE9131 /* PrivacyInfo.xcprivacy in Resources */,
+				7B0DD32902633C7FF95B5745D8322BC3 /* SVProgressHUD.bundle in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		39672BE20EABD0387A4337A34B223023 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				638821550E992E4B6834C48468336743 /* PrivacyInfo.xcprivacy in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		411D130A1B484C8AFB9AC50FE8DB848E /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		4FFE6EAC99DFE8941FFB61B891AB92B9 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				5F2622E174BFC945E9C40B8BFFC9BC82 /* MJRefresh.bundle in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		817B41C0A26278448641364EC3D4E8F8 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		BED329C341E94BB899D3B6282FA194C6 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				866E636E0A9BA91E115C0484A2D4626D /* Kingfisher-Kingfisher in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		C5C8C4AF1C03B3841B6783836860EF40 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				25563554339AB6EF1C771ACCF0641CC5 /* PrivacyInfo.xcprivacy in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		F40A112E96980E201F3537A660F311A7 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		62A1CB4E7755DF23F645AE7F4B214347 /* [CP] Copy XCFrameworks */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Google-Mobile-Ads-SDK/Google-Mobile-Ads-SDK-xcframeworks-input-files.xcfilelist",
+			);
+			name = "[CP] Copy XCFrameworks";
+			outputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Google-Mobile-Ads-SDK/Google-Mobile-Ads-SDK-xcframeworks-output-files.xcfilelist",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Google-Mobile-Ads-SDK/Google-Mobile-Ads-SDK-xcframeworks.sh\"\n";
+			showEnvVarsInLog = 0;
+		};
+		D8CE6773DA3A928A26838B55A50686FD /* [CP] Copy XCFrameworks */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/GoogleUserMessagingPlatform/GoogleUserMessagingPlatform-xcframeworks-input-files.xcfilelist",
+			);
+			name = "[CP] Copy XCFrameworks";
+			outputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/GoogleUserMessagingPlatform/GoogleUserMessagingPlatform-xcframeworks-output-files.xcfilelist",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"${PODS_ROOT}/Target Support Files/GoogleUserMessagingPlatform/GoogleUserMessagingPlatform-xcframeworks.sh\"\n";
+			showEnvVarsInLog = 0;
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		1E20A753CFC5E2857D9E1F43E5C69DB9 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		31D45D3171229FC0231E3E0C8FB54BC8 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		40CED5BE9DA5C4C485C923B93C2E26D3 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				7B621C6E37AB3F94E2081A93883D0EE9 /* MJRefresh-dummy.m in Sources */,
+				98091388004946D1B9924D793C22D136 /* MJRefreshAutoFooter.m in Sources */,
+				528D9579B7D4144571011680B7C948AE /* MJRefreshAutoGifFooter.m in Sources */,
+				A22B9612D1D5192FDB98F54AEBD502F2 /* MJRefreshAutoNormalFooter.m in Sources */,
+				A91F68941F8C394B21ECDD13D0FEB36C /* MJRefreshAutoStateFooter.m in Sources */,
+				3FC41EE174BEAC4799EC3DF4FFDBEDA5 /* MJRefreshBackFooter.m in Sources */,
+				EDD901F1A986C33AADF3E5BD4425E353 /* MJRefreshBackGifFooter.m in Sources */,
+				E700ED58AE0D304ED95FEAB65A48E48B /* MJRefreshBackNormalFooter.m in Sources */,
+				8C40DB2375972F4F65E2334D44B4C1E4 /* MJRefreshBackStateFooter.m in Sources */,
+				C322F5826528BB94E87B84B66CDF65A6 /* MJRefreshComponent.m in Sources */,
+				65FCE0BF7B6F6710C5025D5F722B555B /* MJRefreshConfig.m in Sources */,
+				1EE625CD87BF3ECFF0513FB072749EAD /* MJRefreshConst.m in Sources */,
+				B80260866E7DB576715BFC25005D235D /* MJRefreshFooter.m in Sources */,
+				907570F9F5649F88474BFFA57A7D933B /* MJRefreshGifHeader.m in Sources */,
+				8235263A2FD63EFCFBC7D4B796F16869 /* MJRefreshHeader.m in Sources */,
+				AFA29E3803265741A4E7B485450B59A3 /* MJRefreshNormalHeader.m in Sources */,
+				935E1A06219078F1ED5BDAAF05D73BEB /* MJRefreshNormalTrailer.m in Sources */,
+				3B0F6667924D326702F319AAEECDFCBE /* MJRefreshStateHeader.m in Sources */,
+				C3BA3764B05748426F7972178E25064F /* MJRefreshStateTrailer.m in Sources */,
+				0623CEAC99F6629041AD3CFB1DAA6348 /* MJRefreshTrailer.m in Sources */,
+				6E1A710F60FF319B7609A69CC4E318DF /* NSBundle+MJRefresh.m in Sources */,
+				3DA5FE69B2722A2B9FC979B6C806C904 /* UICollectionViewLayout+MJRefresh.m in Sources */,
+				7E78FFFDB62A42993493D619C089DC54 /* UIScrollView+MJExtension.m in Sources */,
+				0CD18E278D46019A0260030BA7880D65 /* UIScrollView+MJRefresh.m in Sources */,
+				9EAAD483EB2A44D532B4CD50F332F157 /* UIView+MJExtension.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		494EBF383D1E1F7AB880AFDE5A27D1D7 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				9DE8973DF17F32EE4BD1444FFDF18AB5 /* TYCyclePagerTransformLayout.m in Sources */,
+				5A6E2A1B8B7F1A3DF7C29F5052E21B94 /* TYCyclePagerView.m in Sources */,
+				586892B5976E38B71FCD6841816F568E /* TYCyclePagerView-dummy.m in Sources */,
+				76870D9A6571AFCA2C12FE58825C5F65 /* TYPageControl.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		61F26EB0B738A4A79F1BB59F96C4C34E /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		64C08EC1725AD96D4816E78A9498AED6 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				9AA5D28C987CD4EEE600AA7EB499CDA9 /* SVIndefiniteAnimatedView.m in Sources */,
+				5E499E1F34F0337CBA679BDEBEE13AFF /* SVProgressAnimatedView.m in Sources */,
+				227689457853D692C621E35159D90E0F /* SVProgressHUD.m in Sources */,
+				1BF246E34478750D399B09645820D163 /* SVProgressHUD-dummy.m in Sources */,
+				DB7B14E36C5289FEE02C0FD5A804748F /* SVRadialGradientLayer.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		A9C198DBC90FE93D1F6609B66EFFBF60 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				61D98B283CE925046B10319E0084EB47 /* CodableTransform.swift in Sources */,
+				2CC335A4FA15A2B3254109561D8D3B52 /* CustomDateFormatTransform.swift in Sources */,
+				C74A57B9D0D3D8CE03CA6E0779BB0B4D /* DataTransform.swift in Sources */,
+				0BD80D0BA5C72ACE2C5D5E18F1E7C517 /* DateFormatterTransform.swift in Sources */,
+				39E0E6446BA7506FD60899B82736AA3B /* DateTransform.swift in Sources */,
+				0481F9824059F400F094445B6CE1F07A /* DictionaryTransform.swift in Sources */,
+				517F7F319A053766D1CE3C3E7A57EB7A /* EnumOperators.swift in Sources */,
+				6EB8DB7E0B46D8D212C632E7F18F45D0 /* EnumTransform.swift in Sources */,
+				B29BC196744CCC2D226A5227CE616D5E /* FromJSON.swift in Sources */,
+				424435B35F2591B77429269BDAFEB077 /* HexColorTransform.swift in Sources */,
+				5B8EEB396F66172C10168511A111BAEA /* ImmutableMappable.swift in Sources */,
+				4FC485A749A8AD5CB5135B86A7422103 /* IntegerOperators.swift in Sources */,
+				00789924F6FF8825AF75A2776BFA015F /* ISO8601DateTransform.swift in Sources */,
+				FF9E6D072563A0209EE8D525BE50041E /* Map.swift in Sources */,
+				A251EE3CE93F32A54196F35C23756357 /* MapError.swift in Sources */,
+				C5C8B4E9B398A09C20AD3191B687A4A9 /* Mappable.swift in Sources */,
+				3051B194B166E36A3564CA607EBD7589 /* Mapper.swift in Sources */,
+				CCCB6AC4BD17F2251527413CEB698DE9 /* NSDecimalNumberTransform.swift in Sources */,
+				8E2704A6AF675A59F00B43A82F3BCE43 /* ObjectMapper-dummy.m in Sources */,
+				951EF9AF7676766D0DBF9602F2B197DC /* Operators.swift in Sources */,
+				90312430AF84DF8634BBA3ECD3384F3F /* ToJSON.swift in Sources */,
+				CC8DBBFECBD1CDC823E6AC6920B472DB /* TransformOf.swift in Sources */,
+				D98A76939BDF2369CD43DBB47DA23B1E /* TransformOperators.swift in Sources */,
+				D5B5FEC098AD312EE618C3E4010806F0 /* TransformType.swift in Sources */,
+				CB69A73073036445EA7F67524ECD6D69 /* URLTransform.swift in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		DCD73A5341AD125BB21DADA1EF872BD6 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				4BF85A95BFA6ED352C220750718B2054 /* AnimatedImageView.swift in Sources */,
+				2D0B359292A970DBCFCEA10E753788CE /* AuthenticationChallengeResponsable.swift in Sources */,
+				C29B494B7C33F701E66731BFDD6F1AE5 /* AVAssetImageDataProvider.swift in Sources */,
+				92AA3DBDE64690329EAC5FA951322BC2 /* Box.swift in Sources */,
+				69D747DF6653B804F8FC83A034BD27D9 /* CacheSerializer.swift in Sources */,
+				1084DEDFE125E20BCD4BC1CEB4984828 /* CallbackQueue.swift in Sources */,
+				FBC75920AE7D76A487212A14113E90C2 /* CPListItem+Kingfisher.swift in Sources */,
+				F264318171CCF6EAFDDF19D4E6C87D08 /* Delegate.swift in Sources */,
+				40251EE765FD8660BC2867F07D2753A7 /* DiskStorage.swift in Sources */,
+				0618948593929F3BA22D724508AB26D5 /* ExtensionHelpers.swift in Sources */,
+				6667B9B21D09664BA9720313CC684C35 /* Filter.swift in Sources */,
+				EDD151562D6D83032C0BC185A88C8521 /* FormatIndicatedCacheSerializer.swift in Sources */,
+				4C80D1E1033262E0C7A3C0E4B5D4B879 /* GIFAnimatedImage.swift in Sources */,
+				6C2495648ACE8166A673D54F82E701A7 /* GraphicsContext.swift in Sources */,
+				22BFD40CE7D7C51ED1353F3D9E81103F /* Image.swift in Sources */,
+				1C223175AEB10BEB2B143CF995E8C956 /* ImageBinder.swift in Sources */,
+				9521E95A58EA4E0B000929E1892E28C5 /* ImageCache.swift in Sources */,
+				20EB33A4E3293236A23180A08E36B3B3 /* ImageContext.swift in Sources */,
+				7636EAA22DF6CDFBA7CE2BA339753CD7 /* ImageDataProcessor.swift in Sources */,
+				56DD427110264C5120B1645F896AE5A0 /* ImageDataProvider.swift in Sources */,
+				440CDB9679BB987D372F43B5A4328122 /* ImageDownloader.swift in Sources */,
+				191FEC18B72117CEB8984C99DCB07CF6 /* ImageDownloaderDelegate.swift in Sources */,
+				7AE947D892D6535316D7704251FAB8E7 /* ImageDrawing.swift in Sources */,
+				E8ADC0A3B759EC22493DA74065E4BD28 /* ImageFormat.swift in Sources */,
+				FDDC72BE57E702EE9E1A7EF7D9B817D4 /* ImageModifier.swift in Sources */,
+				964927DD2B3D53189B3C70FE431B88CC /* ImagePrefetcher.swift in Sources */,
+				95055C33416D816EA0B23842DE71C613 /* ImageProcessor.swift in Sources */,
+				47FFC4DADAFC4D661A22AED52CB8CB8D /* ImageProgressive.swift in Sources */,
+				86F6786CAD5710E8B4A8C0D23C6632E4 /* ImageTransition.swift in Sources */,
+				D8BF0A209615C68229B7BA8BD91324FB /* ImageView+Kingfisher.swift in Sources */,
+				44C9B5D2765C71F13094D8B335D45118 /* Indicator.swift in Sources */,
+				40C30C41381B48585CA4E919C7E8F97F /* KF.swift in Sources */,
+				F74CA6BD365AAE00E6FCBB731E274BF0 /* KFAnimatedImage.swift in Sources */,
+				1B7776278FEC24E87B699C7CE063B6E0 /* KFImage.swift in Sources */,
+				7D81692987F9DB3AFA07F174C9CA2950 /* KFImageOptions.swift in Sources */,
+				056A1447967A759C17639EB5AEDA9C3E /* KFImageProtocol.swift in Sources */,
+				C0FA2C1047CC5B7990287846862A9FD5 /* KFImageRenderer.swift in Sources */,
+				C1D4F3F11F5189CAE0EB1B18562BD16F /* KFOptionsSetter.swift in Sources */,
+				1863245AE4FA028973E98A8E87F49EFE /* Kingfisher.swift in Sources */,
+				19C1E5D99ABCBAF3E50A980AD50BEE23 /* Kingfisher-dummy.m in Sources */,
+				A0F3EEBC06B869A742CB426869EAE141 /* KingfisherError.swift in Sources */,
+				E2E9D99A82475E8D56D2B031323C3A4D /* KingfisherManager.swift in Sources */,
+				A9E8A84602E96F0255E09313F70BF79E /* KingfisherOptionsInfo.swift in Sources */,
+				2444AAB65C64CE9F376FE3859D1C1026 /* MemoryStorage.swift in Sources */,
+				F01B23DF9E2024507AC80E0F4BA033C5 /* NSButton+Kingfisher.swift in Sources */,
+				90E507866B4E821929820B880A8B58F4 /* NSTextAttachment+Kingfisher.swift in Sources */,
+				5D4AD372E92E5EACC7BB6961F139E7CF /* Placeholder.swift in Sources */,
+				219F221FF0713B5F920B403F8838F1EF /* RedirectHandler.swift in Sources */,
+				3D7C7FC21E4496EF860BF84959DD5369 /* RequestModifier.swift in Sources */,
+				3D06924F0E274E28A3985B54E658A49E /* Resource.swift in Sources */,
+				247957E28FB69E9B4E5775456516CF6F /* Result.swift in Sources */,
+				83D42F8922509324A1C3437B1B457203 /* RetryStrategy.swift in Sources */,
+				B9F3C53028DDF38F363901AF8EFCEB77 /* Runtime.swift in Sources */,
+				D9B27D96F94EBFB5B287C3077AA8139D /* SessionDataTask.swift in Sources */,
+				02B7416CC6A9582F83E0952ADA012AE9 /* SessionDelegate.swift in Sources */,
+				37AC1ECC6C59A21CAFB5369AD74345EA /* SizeExtensions.swift in Sources */,
+				DF5BEBB952B0E2A2B7FAE2B0DD2CBA0C /* Source.swift in Sources */,
+				52B245FBAA75650F25877AB89AAAEE83 /* Storage.swift in Sources */,
+				DBF52ABB59F21E5C73F8FA83CA84A5B2 /* String+MD5.swift in Sources */,
+				A0E6269FA22F1B4D8094F9C331C2ADD6 /* TVMonogramView+Kingfisher.swift in Sources */,
+				742025AB277967D7DCA2DCF54450C636 /* UIButton+Kingfisher.swift in Sources */,
+				19FC9097A32E37FA54EC7E0019E71BAB /* WKInterfaceImage+Kingfisher.swift in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		DCEEB9F8EA09BB4BFEBDBD7594F8545D /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				3317DC9751692475C7BF6CA18EE999CE /* Google-Mobile-Ads-SDK-dummy.m in Sources */,
+				1493DD91336DE7675C83360B987057DD /* GoogleMobileAdsPlaceholder.swift in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		E4B2E504C40EC81660272D2583376869 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		F3A6A6FF4A52FEBCEEDE0740918C2699 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				B4DBF8BFB50F5248FEBE4AF4ABED2F8C /* Pods-TSLiveWallpaper-dummy.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		F7AC6792C89443C7B212A06E810BAB97 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				6E39129FC8643A70C276801FEF4C280D /* Constraint.swift in Sources */,
+				0CA7A132ABE7018DE9295456732F38BB /* ConstraintAttributes.swift in Sources */,
+				F9EBA65892D78A31C068D727D84BCB88 /* ConstraintConfig.swift in Sources */,
+				CE593943A9E7CF83822CF60304BCAD43 /* ConstraintConstantTarget.swift in Sources */,
+				7AF516B98D45391B909D507D0244104C /* ConstraintDescription.swift in Sources */,
+				1194E62AA3F6F506799B1A43B16942B5 /* ConstraintDirectionalInsets.swift in Sources */,
+				E37671A03B4C17A1CF3766A6125833BB /* ConstraintDirectionalInsetTarget.swift in Sources */,
+				868A9F524A7985BDA1EA124D9BF4CA63 /* ConstraintDSL.swift in Sources */,
+				AF760C78F1C7E11BF7CB9E9B29903530 /* ConstraintInsets.swift in Sources */,
+				2B2EB369550CE92CEEFCBFD3D32B8A3F /* ConstraintInsetTarget.swift in Sources */,
+				5922A6A0AE7152CF436356B3556F1835 /* ConstraintItem.swift in Sources */,
+				59F34874DA4ABB2F5C4E09EA6865936B /* ConstraintLayoutGuide.swift in Sources */,
+				E3D779DEE753C0B0D33BA8E73A980265 /* ConstraintLayoutGuide+Extensions.swift in Sources */,
+				3D3B646B4988314275B40E97BEB16C7F /* ConstraintLayoutGuideDSL.swift in Sources */,
+				B0875E3AB8718E7DFE5C53497C02A15E /* ConstraintLayoutSupport.swift in Sources */,
+				064D909CD827405E8DCC309DB1B7775A /* ConstraintLayoutSupportDSL.swift in Sources */,
+				4F4DEB687C0E4834A5B291DEE0651D6A /* ConstraintMaker.swift in Sources */,
+				C14F10B663FE2898EACAB90C202B3F50 /* ConstraintMakerEditable.swift in Sources */,
+				D4218DA55B2BA45937589200CC0DF1FB /* ConstraintMakerExtendable.swift in Sources */,
+				B903049E7C1BED7918DAB208754107C7 /* ConstraintMakerFinalizable.swift in Sources */,
+				AABEF13464BA7F4621BD94736C1D057C /* ConstraintMakerPrioritizable.swift in Sources */,
+				BDA5C7CC91E86448237CF40954FAC5AF /* ConstraintMakerRelatable.swift in Sources */,
+				8BABA32F7B94A25D8E9208C0A8D90B2E /* ConstraintMakerRelatable+Extensions.swift in Sources */,
+				883EDEE1C699497CF2A77C3B8A32A790 /* ConstraintMultiplierTarget.swift in Sources */,
+				3577F172FA68CBAE47CFEE6FE25C5404 /* ConstraintOffsetTarget.swift in Sources */,
+				09E1F569A93FAD4B9149E30B9301F44A /* ConstraintPriority.swift in Sources */,
+				DBA4803F4765E1650B8C6841157F5D73 /* ConstraintPriorityTarget.swift in Sources */,
+				C07CB3E9A4D1BF00F841E4285629A2B2 /* ConstraintRelatableTarget.swift in Sources */,
+				ECC5C2ADC2682F9171FEA22AF10DCE53 /* ConstraintRelation.swift in Sources */,
+				86CAB01D950C8BC35EDE0BDC01A2500B /* ConstraintView.swift in Sources */,
+				0DE5DB9C6227B3416778D8417DD95EA9 /* ConstraintView+Extensions.swift in Sources */,
+				7D42390CDB4FA147504B03DA2A174A0C /* ConstraintViewDSL.swift in Sources */,
+				AE224EDB6D044C0FE86B086E950FC2F9 /* Debugging.swift in Sources */,
+				BF1AE4D97E813B95C43EA4A298B973D1 /* LayoutConstraint.swift in Sources */,
+				C6F45595676957ADBEC18EB3F23EAEC4 /* LayoutConstraintItem.swift in Sources */,
+				BA2FB695DEB0D179253EEB8DFCE3578B /* SnapKit-dummy.m in Sources */,
+				C6A4302ACE006C4E2CDD481287E2916B /* Typealiases.swift in Sources */,
+				F6F33E8B268F3D41075374D95B8088DC /* UILayoutSupport+Extensions.swift in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+		03AA7F5768DAD7B0C58972B4F410CF3B /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = Kingfisher;
+			target = E8022D22FAA6690B5E1C379C1BCE1491 /* Kingfisher */;
+			targetProxy = B6F0042BCA638429BAA62EE3C406F433 /* PBXContainerItemProxy */;
+		};
+		12797A4AE6B7AD8E3D6E795DE7E8CF0F /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = "Google-Mobile-Ads-SDK-GoogleMobileAdsResources";
+			target = 36FD0958A0EC4A0FCF599E9B22719B03 /* Google-Mobile-Ads-SDK-GoogleMobileAdsResources */;
+			targetProxy = E20EFE0F2E0E6DDDAB02D9B48352DB75 /* PBXContainerItemProxy */;
+		};
+		2D62355561AE4F305C38100C1990030F /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = "Google-Mobile-Ads-SDK";
+			target = FEA3B3A570634836C0457F3D7CEF1699 /* Google-Mobile-Ads-SDK */;
+			targetProxy = FDA02C07DF3742CFA465515F65BA238F /* PBXContainerItemProxy */;
+		};
+		4E7B585C932F46EBA7EE1933A48D5855 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = SnapKit;
+			target = 19622742EBA51E823D6DAE3F8CDBFAD4 /* SnapKit */;
+			targetProxy = 89F20CE439397A27CBCC248A24EE06DC /* PBXContainerItemProxy */;
+		};
+		5A9D99552EB9AC468A3686D0587D7B21 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = "SnapKit-SnapKit_Privacy";
+			target = 8A8DB685241263AFDF5E6B20FE67B93A /* SnapKit-SnapKit_Privacy */;
+			targetProxy = D3857C0CC9E296CF5A523FEFE09B9CEB /* PBXContainerItemProxy */;
+		};
+		5BE2D732B6B818329013ADEB58E2EDDA /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = ObjectMapper;
+			target = 162E649F50FEC62B61BDD87D1BD422B4 /* ObjectMapper */;
+			targetProxy = 230638980FE1210BBC9877861C293356 /* PBXContainerItemProxy */;
+		};
+		72ED309E3BCDA3BC694551BF9088637B /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = GoogleUserMessagingPlatform;
+			target = 458B188365A307B3C128ABF524D1A3E3 /* GoogleUserMessagingPlatform */;
+			targetProxy = 54F0FBAACA4FB6E9677BE4638151A1B1 /* PBXContainerItemProxy */;
+		};
+		85444D31F01ADA8C240C82E01A967B7C /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = "GoogleUserMessagingPlatform-UserMessagingPlatformResources";
+			target = 63A7C675C13F87669AF56006D943998B /* GoogleUserMessagingPlatform-UserMessagingPlatformResources */;
+			targetProxy = 5C530A1CC307B67A93D15B5AF4561A8A /* PBXContainerItemProxy */;
+		};
+		872F2A056BF5E0514AAB54186C4EF9CD /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = GoogleUserMessagingPlatform;
+			target = 458B188365A307B3C128ABF524D1A3E3 /* GoogleUserMessagingPlatform */;
+			targetProxy = 9AB6F4B9E142575F6D36B68F98E90690 /* PBXContainerItemProxy */;
+		};
+		8EBF369E9B53559F1131C34069C33E3C /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = SVProgressHUD;
+			target = 1C8D67D8B72D6BA42CCEDB648537A340 /* SVProgressHUD */;
+			targetProxy = F6D293229E38D1DDD8AC9ABC55EF6D10 /* PBXContainerItemProxy */;
+		};
+		9E14C70A7C80BD256DC9ED8C6B89F47B /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = "Kingfisher-Kingfisher";
+			target = 9828BBC09E9FB1238624113D7456E59E /* Kingfisher-Kingfisher */;
+			targetProxy = 85299249F026ACE9378C387E4FA6C81E /* PBXContainerItemProxy */;
+		};
+		D91170AECBB2BDCB4704984FCDB11A91 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = MJRefresh;
+			target = 6868056D761E163D10FDAF8CF1C4D9B8 /* MJRefresh */;
+			targetProxy = 43790EA13E13EA600C2E1DF273704219 /* PBXContainerItemProxy */;
+		};
+		E19E5450A3DEEFA98C69C8A576C17553 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = TYCyclePagerView;
+			target = 416BCB647D16D0ED89A6729B14DD54D2 /* TYCyclePagerView */;
+			targetProxy = 374336381BCC8FE0D356114B5E0CCBFC /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+		1258D3B1EBE9AAA43CACFEDC880BB7E7 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 177E465A4BABFC5B56E52DFC109CE085 /* GoogleUserMessagingPlatform.debug.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+				CLANG_ENABLE_OBJC_WEAK = NO;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+				);
+				SDKROOT = iphoneos;
+				TARGETED_DEVICE_FAMILY = "1,2";
+			};
+			name = Debug;
+		};
+		1B46BA71E3C0EBB94A5CD305666B9F1D /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 16A13729A37ECDD17EAD0D9A2A931B97 /* Kingfisher.release.xcconfig */;
+			buildSettings = {
+				CODE_SIGNING_ALLOWED = NO;
+				CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Kingfisher";
+				IBSC_MODULE = Kingfisher;
+				INFOPLIST_FILE = "Target Support Files/Kingfisher/ResourceBundle-Kingfisher-Kingfisher-Info.plist";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				PRODUCT_NAME = Kingfisher;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				WRAPPER_EXTENSION = bundle;
+			};
+			name = Release;
+		};
+		2B1F42F08F2B53D503A5BB90F55813A8 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 3FB927B5CAEB209CFBBE88C04C0C5292 /* SVProgressHUD.debug.xcconfig */;
+			buildSettings = {
+				CLANG_ENABLE_OBJC_WEAK = NO;
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				CURRENT_PROJECT_VERSION = 1;
+				DEFINES_MODULE = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				ENABLE_MODULE_VERIFIER = NO;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
+				GCC_PREFIX_HEADER = "Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch";
+				GENERATE_INFOPLIST_FILE = NO;
+				INFOPLIST_FILE = "Target Support Files/SVProgressHUD/SVProgressHUD-Info.plist";
+				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				MODULEMAP_FILE = "Target Support Files/SVProgressHUD/SVProgressHUD.modulemap";
+				PRODUCT_MODULE_NAME = SVProgressHUD;
+				PRODUCT_NAME = SVProgressHUD;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+				SWIFT_INSTALL_OBJC_HEADER = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VERSIONING_SYSTEM = "apple-generic";
+				VERSION_INFO_PREFIX = "";
+			};
+			name = Debug;
+		};
+		4AD9788F911BF2AAA9EE1ADE6216AFA9 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 65465F2749923096C80F987845F35116 /* TYCyclePagerView.release.xcconfig */;
+			buildSettings = {
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				CURRENT_PROJECT_VERSION = 1;
+				DEFINES_MODULE = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				ENABLE_MODULE_VERIFIER = NO;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
+				GCC_PREFIX_HEADER = "Target Support Files/TYCyclePagerView/TYCyclePagerView-prefix.pch";
+				GENERATE_INFOPLIST_FILE = NO;
+				INFOPLIST_FILE = "Target Support Files/TYCyclePagerView/TYCyclePagerView-Info.plist";
+				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				MODULEMAP_FILE = "Target Support Files/TYCyclePagerView/TYCyclePagerView.modulemap";
+				PRODUCT_MODULE_NAME = TYCyclePagerView;
+				PRODUCT_NAME = TYCyclePagerView;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+				SWIFT_INSTALL_OBJC_HEADER = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+				VERSIONING_SYSTEM = "apple-generic";
+				VERSION_INFO_PREFIX = "";
+			};
+			name = Release;
+		};
+		4BC7450F9457737EE3E637BA155B56F7 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_ENABLE_OBJC_WEAK = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"POD_CONFIGURATION_DEBUG=1",
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+				MTL_FAST_MATH = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				STRIP_INSTALLED_PRODUCT = NO;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+				SWIFT_VERSION = 5.0;
+				SYMROOT = "${SRCROOT}/../build";
+			};
+			name = Debug;
+		};
+		4EA702F8C316BD67E58FDA9ACE0DC3A6 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 0FF24B33BAC805F1FBCF9CD6C50C8669 /* Kingfisher.debug.xcconfig */;
+			buildSettings = {
+				CODE_SIGNING_ALLOWED = NO;
+				CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Kingfisher";
+				IBSC_MODULE = Kingfisher;
+				INFOPLIST_FILE = "Target Support Files/Kingfisher/ResourceBundle-Kingfisher-Kingfisher-Info.plist";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				PRODUCT_NAME = Kingfisher;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				WRAPPER_EXTENSION = bundle;
+			};
+			name = Debug;
+		};
+		510A118D00A136D8992EE9985E4E0996 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 679364E2A7268C58ACABD3FAB7064183 /* ObjectMapper.release.xcconfig */;
+			buildSettings = {
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				CURRENT_PROJECT_VERSION = 1;
+				DEFINES_MODULE = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				ENABLE_MODULE_VERIFIER = NO;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
+				GCC_PREFIX_HEADER = "Target Support Files/ObjectMapper/ObjectMapper-prefix.pch";
+				GENERATE_INFOPLIST_FILE = NO;
+				INFOPLIST_FILE = "Target Support Files/ObjectMapper/ObjectMapper-Info.plist";
+				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				MODULEMAP_FILE = "Target Support Files/ObjectMapper/ObjectMapper.modulemap";
+				PRODUCT_MODULE_NAME = ObjectMapper;
+				PRODUCT_NAME = ObjectMapper;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+				SWIFT_INSTALL_OBJC_HEADER = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+				VERSIONING_SYSTEM = "apple-generic";
+				VERSION_INFO_PREFIX = "";
+			};
+			name = Release;
+		};
+		582D8BE9FF67E28F066014AD19994EEE /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = E7056DE585C90B0D580E4198B98AB56E /* SnapKit.debug.xcconfig */;
+			buildSettings = {
+				CODE_SIGNING_ALLOWED = NO;
+				CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SnapKit";
+				IBSC_MODULE = SnapKit;
+				INFOPLIST_FILE = "Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				PRODUCT_NAME = SnapKit_Privacy;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				WRAPPER_EXTENSION = bundle;
+			};
+			name = Debug;
+		};
+		5BE506DDC8B0C32817B8E2A344F6D779 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = EBDF994F65B6B46AA6A0164AB0F64E78 /* Pods-TSLiveWallpaper.debug.xcconfig */;
+			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
+				CLANG_ENABLE_OBJC_WEAK = NO;
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				CURRENT_PROJECT_VERSION = 1;
+				DEFINES_MODULE = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				ENABLE_MODULE_VERIFIER = NO;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
+				INFOPLIST_FILE = "Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-Info.plist";
+				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				MACH_O_TYPE = staticlib;
+				MODULEMAP_FILE = "Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper.modulemap";
+				OTHER_LDFLAGS = "";
+				OTHER_LIBTOOLFLAGS = "";
+				PODS_ROOT = "$(SRCROOT)";
+				PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
+				PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VERSIONING_SYSTEM = "apple-generic";
+				VERSION_INFO_PREFIX = "";
+			};
+			name = Debug;
+		};
+		612A771FEC74E5BC5C4888D1C8CEEDAF /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = ABEB5F6B5164E3489B1399762508B6A1 /* Google-Mobile-Ads-SDK.debug.xcconfig */;
+			buildSettings = {
+				CLANG_ENABLE_OBJC_WEAK = NO;
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				CURRENT_PROJECT_VERSION = 1;
+				DEFINES_MODULE = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				ENABLE_MODULE_VERIFIER = NO;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
+				GCC_PREFIX_HEADER = "Target Support Files/Google-Mobile-Ads-SDK/Google-Mobile-Ads-SDK-prefix.pch";
+				GENERATE_INFOPLIST_FILE = NO;
+				INFOPLIST_FILE = "Target Support Files/Google-Mobile-Ads-SDK/Google-Mobile-Ads-SDK-Info.plist";
+				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				MACH_O_TYPE = staticlib;
+				MODULEMAP_FILE = "Target Support Files/Google-Mobile-Ads-SDK/Google-Mobile-Ads-SDK.modulemap";
+				PRODUCT_MODULE_NAME = Google_Mobile_Ads_SDK;
+				PRODUCT_NAME = Google_Mobile_Ads_SDK;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+				SWIFT_INSTALL_OBJC_HEADER = YES;
+				SWIFT_VERSION = 5.3;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VERSIONING_SYSTEM = "apple-generic";
+				VERSION_INFO_PREFIX = "";
+			};
+			name = Debug;
+		};
+		6FA063640D2EB107770982231FEB6191 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 3576C8AE3222D51FA74787A2BEE1656D /* MJRefresh.release.xcconfig */;
+			buildSettings = {
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				CURRENT_PROJECT_VERSION = 1;
+				DEFINES_MODULE = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				ENABLE_MODULE_VERIFIER = NO;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
+				GCC_PREFIX_HEADER = "Target Support Files/MJRefresh/MJRefresh-prefix.pch";
+				GENERATE_INFOPLIST_FILE = NO;
+				INFOPLIST_FILE = "Target Support Files/MJRefresh/MJRefresh-Info.plist";
+				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				MODULEMAP_FILE = "Target Support Files/MJRefresh/MJRefresh.modulemap";
+				PRODUCT_MODULE_NAME = MJRefresh;
+				PRODUCT_NAME = MJRefresh;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+				SWIFT_INSTALL_OBJC_HEADER = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+				VERSIONING_SYSTEM = "apple-generic";
+				VERSION_INFO_PREFIX = "";
+			};
+			name = Release;
+		};
+		7F1B26EE8EDA785415278EB756B30F2C /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 17E7CA5C20BDC607D41C39BFA2BA5A99 /* GoogleUserMessagingPlatform.release.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+				CLANG_ENABLE_OBJC_WEAK = NO;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+				);
+				SDKROOT = iphoneos;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		81343A44163F4C127988EBAB75121219 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 6CB762166AF45A6B6E3637EF51D86213 /* MJRefresh.debug.xcconfig */;
+			buildSettings = {
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				CURRENT_PROJECT_VERSION = 1;
+				DEFINES_MODULE = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				ENABLE_MODULE_VERIFIER = NO;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
+				GCC_PREFIX_HEADER = "Target Support Files/MJRefresh/MJRefresh-prefix.pch";
+				GENERATE_INFOPLIST_FILE = NO;
+				INFOPLIST_FILE = "Target Support Files/MJRefresh/MJRefresh-Info.plist";
+				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				MODULEMAP_FILE = "Target Support Files/MJRefresh/MJRefresh.modulemap";
+				PRODUCT_MODULE_NAME = MJRefresh;
+				PRODUCT_NAME = MJRefresh;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+				SWIFT_INSTALL_OBJC_HEADER = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VERSIONING_SYSTEM = "apple-generic";
+				VERSION_INFO_PREFIX = "";
+			};
+			name = Debug;
+		};
+		8B5A46FF8D3C1289CDEE3BAFACABCD2A /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_ENABLE_OBJC_WEAK = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"POD_CONFIGURATION_RELEASE=1",
+					"$(inherited)",
+				);
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				MTL_FAST_MATH = YES;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				STRIP_INSTALLED_PRODUCT = NO;
+				SWIFT_COMPILATION_MODE = wholemodule;
+				SWIFT_OPTIMIZATION_LEVEL = "-O";
+				SWIFT_VERSION = 5.0;
+				SYMROOT = "${SRCROOT}/../build";
+			};
+			name = Release;
+		};
+		8D3B4ECAA5F0B158C8806DB0AE618218 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = CEA8737C1EF5CE0831D7F9691AA2FDBB /* TYCyclePagerView.debug.xcconfig */;
+			buildSettings = {
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				CURRENT_PROJECT_VERSION = 1;
+				DEFINES_MODULE = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				ENABLE_MODULE_VERIFIER = NO;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
+				GCC_PREFIX_HEADER = "Target Support Files/TYCyclePagerView/TYCyclePagerView-prefix.pch";
+				GENERATE_INFOPLIST_FILE = NO;
+				INFOPLIST_FILE = "Target Support Files/TYCyclePagerView/TYCyclePagerView-Info.plist";
+				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				MODULEMAP_FILE = "Target Support Files/TYCyclePagerView/TYCyclePagerView.modulemap";
+				PRODUCT_MODULE_NAME = TYCyclePagerView;
+				PRODUCT_NAME = TYCyclePagerView;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+				SWIFT_INSTALL_OBJC_HEADER = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VERSIONING_SYSTEM = "apple-generic";
+				VERSION_INFO_PREFIX = "";
+			};
+			name = Debug;
+		};
+		941A6E9C04698419ED0B5A3555A0DC9C /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 0FF24B33BAC805F1FBCF9CD6C50C8669 /* Kingfisher.debug.xcconfig */;
+			buildSettings = {
+				CLANG_ENABLE_OBJC_WEAK = NO;
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				CURRENT_PROJECT_VERSION = 1;
+				DEFINES_MODULE = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				ENABLE_MODULE_VERIFIER = NO;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
+				GCC_PREFIX_HEADER = "Target Support Files/Kingfisher/Kingfisher-prefix.pch";
+				GENERATE_INFOPLIST_FILE = NO;
+				INFOPLIST_FILE = "Target Support Files/Kingfisher/Kingfisher-Info.plist";
+				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				MODULEMAP_FILE = "Target Support Files/Kingfisher/Kingfisher.modulemap";
+				PRODUCT_MODULE_NAME = Kingfisher;
+				PRODUCT_NAME = Kingfisher;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+				SWIFT_INSTALL_OBJC_HEADER = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VERSIONING_SYSTEM = "apple-generic";
+				VERSION_INFO_PREFIX = "";
+			};
+			name = Debug;
+		};
+		9B52ED9D38CF8FD37D657F2D4F54AAD4 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 16A13729A37ECDD17EAD0D9A2A931B97 /* Kingfisher.release.xcconfig */;
+			buildSettings = {
+				CLANG_ENABLE_OBJC_WEAK = NO;
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				CURRENT_PROJECT_VERSION = 1;
+				DEFINES_MODULE = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				ENABLE_MODULE_VERIFIER = NO;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
+				GCC_PREFIX_HEADER = "Target Support Files/Kingfisher/Kingfisher-prefix.pch";
+				GENERATE_INFOPLIST_FILE = NO;
+				INFOPLIST_FILE = "Target Support Files/Kingfisher/Kingfisher-Info.plist";
+				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				MODULEMAP_FILE = "Target Support Files/Kingfisher/Kingfisher.modulemap";
+				PRODUCT_MODULE_NAME = Kingfisher;
+				PRODUCT_NAME = Kingfisher;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+				SWIFT_INSTALL_OBJC_HEADER = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+				VERSIONING_SYSTEM = "apple-generic";
+				VERSION_INFO_PREFIX = "";
+			};
+			name = Release;
+		};
+		9D0D7572FEDA4CC9E75E7387846AFE57 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = E7056DE585C90B0D580E4198B98AB56E /* SnapKit.debug.xcconfig */;
+			buildSettings = {
+				CLANG_ENABLE_OBJC_WEAK = NO;
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				CURRENT_PROJECT_VERSION = 1;
+				DEFINES_MODULE = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				ENABLE_MODULE_VERIFIER = NO;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
+				GCC_PREFIX_HEADER = "Target Support Files/SnapKit/SnapKit-prefix.pch";
+				GENERATE_INFOPLIST_FILE = NO;
+				INFOPLIST_FILE = "Target Support Files/SnapKit/SnapKit-Info.plist";
+				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				MODULEMAP_FILE = "Target Support Files/SnapKit/SnapKit.modulemap";
+				PRODUCT_MODULE_NAME = SnapKit;
+				PRODUCT_NAME = SnapKit;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+				SWIFT_INSTALL_OBJC_HEADER = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VERSIONING_SYSTEM = "apple-generic";
+				VERSION_INFO_PREFIX = "";
+			};
+			name = Debug;
+		};
+		A0CC5E1320B0BA29F6FB3BF3E0B639B5 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 17E7CA5C20BDC607D41C39BFA2BA5A99 /* GoogleUserMessagingPlatform.release.xcconfig */;
+			buildSettings = {
+				CODE_SIGNING_ALLOWED = NO;
+				CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/GoogleUserMessagingPlatform";
+				IBSC_MODULE = GoogleUserMessagingPlatform;
+				INFOPLIST_FILE = "Target Support Files/GoogleUserMessagingPlatform/ResourceBundle-UserMessagingPlatformResources-GoogleUserMessagingPlatform-Info.plist";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				PRODUCT_NAME = UserMessagingPlatformResources;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				WRAPPER_EXTENSION = bundle;
+			};
+			name = Release;
+		};
+		A155B1AD39E3761B430032619AD97572 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 20D9D6BC14F7E83677E262494E4B68C6 /* SnapKit.release.xcconfig */;
+			buildSettings = {
+				CODE_SIGNING_ALLOWED = NO;
+				CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SnapKit";
+				IBSC_MODULE = SnapKit;
+				INFOPLIST_FILE = "Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				PRODUCT_NAME = SnapKit_Privacy;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				WRAPPER_EXTENSION = bundle;
+			};
+			name = Release;
+		};
+		B1CC6DA48CBDF86D73AD5C256AE18E7F /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 73A77F1BAF99E21DD9994E772C9C975E /* SVProgressHUD.release.xcconfig */;
+			buildSettings = {
+				CLANG_ENABLE_OBJC_WEAK = NO;
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				CURRENT_PROJECT_VERSION = 1;
+				DEFINES_MODULE = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				ENABLE_MODULE_VERIFIER = NO;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
+				GCC_PREFIX_HEADER = "Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch";
+				GENERATE_INFOPLIST_FILE = NO;
+				INFOPLIST_FILE = "Target Support Files/SVProgressHUD/SVProgressHUD-Info.plist";
+				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				MODULEMAP_FILE = "Target Support Files/SVProgressHUD/SVProgressHUD.modulemap";
+				PRODUCT_MODULE_NAME = SVProgressHUD;
+				PRODUCT_NAME = SVProgressHUD;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+				SWIFT_INSTALL_OBJC_HEADER = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+				VERSIONING_SYSTEM = "apple-generic";
+				VERSION_INFO_PREFIX = "";
+			};
+			name = Release;
+		};
+		BA2AB6FB0451A4F73DDA8150E1858BF7 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = FCB263C648A3C71018D0489C3F30D5CE /* Google-Mobile-Ads-SDK.release.xcconfig */;
+			buildSettings = {
+				CLANG_ENABLE_OBJC_WEAK = NO;
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				CURRENT_PROJECT_VERSION = 1;
+				DEFINES_MODULE = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				ENABLE_MODULE_VERIFIER = NO;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
+				GCC_PREFIX_HEADER = "Target Support Files/Google-Mobile-Ads-SDK/Google-Mobile-Ads-SDK-prefix.pch";
+				GENERATE_INFOPLIST_FILE = NO;
+				INFOPLIST_FILE = "Target Support Files/Google-Mobile-Ads-SDK/Google-Mobile-Ads-SDK-Info.plist";
+				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				MACH_O_TYPE = staticlib;
+				MODULEMAP_FILE = "Target Support Files/Google-Mobile-Ads-SDK/Google-Mobile-Ads-SDK.modulemap";
+				PRODUCT_MODULE_NAME = Google_Mobile_Ads_SDK;
+				PRODUCT_NAME = Google_Mobile_Ads_SDK;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+				SWIFT_INSTALL_OBJC_HEADER = YES;
+				SWIFT_VERSION = 5.3;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+				VERSIONING_SYSTEM = "apple-generic";
+				VERSION_INFO_PREFIX = "";
+			};
+			name = Release;
+		};
+		BACEEBE82272754AFEE2CAE47AFFF1B0 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = F1285D1042211A4F2937CBAF6B5EBF51 /* ObjectMapper.debug.xcconfig */;
+			buildSettings = {
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				CURRENT_PROJECT_VERSION = 1;
+				DEFINES_MODULE = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				ENABLE_MODULE_VERIFIER = NO;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
+				GCC_PREFIX_HEADER = "Target Support Files/ObjectMapper/ObjectMapper-prefix.pch";
+				GENERATE_INFOPLIST_FILE = NO;
+				INFOPLIST_FILE = "Target Support Files/ObjectMapper/ObjectMapper-Info.plist";
+				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				MODULEMAP_FILE = "Target Support Files/ObjectMapper/ObjectMapper.modulemap";
+				PRODUCT_MODULE_NAME = ObjectMapper;
+				PRODUCT_NAME = ObjectMapper;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+				SWIFT_INSTALL_OBJC_HEADER = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VERSIONING_SYSTEM = "apple-generic";
+				VERSION_INFO_PREFIX = "";
+			};
+			name = Debug;
+		};
+		BAD20131EC29650C6737E66854A3A9FD /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 20D9D6BC14F7E83677E262494E4B68C6 /* SnapKit.release.xcconfig */;
+			buildSettings = {
+				CLANG_ENABLE_OBJC_WEAK = NO;
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				CURRENT_PROJECT_VERSION = 1;
+				DEFINES_MODULE = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				ENABLE_MODULE_VERIFIER = NO;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
+				GCC_PREFIX_HEADER = "Target Support Files/SnapKit/SnapKit-prefix.pch";
+				GENERATE_INFOPLIST_FILE = NO;
+				INFOPLIST_FILE = "Target Support Files/SnapKit/SnapKit-Info.plist";
+				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				MODULEMAP_FILE = "Target Support Files/SnapKit/SnapKit.modulemap";
+				PRODUCT_MODULE_NAME = SnapKit;
+				PRODUCT_NAME = SnapKit;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+				SWIFT_INSTALL_OBJC_HEADER = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+				VERSIONING_SYSTEM = "apple-generic";
+				VERSION_INFO_PREFIX = "";
+			};
+			name = Release;
+		};
+		BC02A6CA5F467AFA2C6A997EF9084CC4 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = FCB263C648A3C71018D0489C3F30D5CE /* Google-Mobile-Ads-SDK.release.xcconfig */;
+			buildSettings = {
+				CODE_SIGNING_ALLOWED = NO;
+				CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Google-Mobile-Ads-SDK";
+				IBSC_MODULE = Google_Mobile_Ads_SDK;
+				INFOPLIST_FILE = "Target Support Files/Google-Mobile-Ads-SDK/ResourceBundle-GoogleMobileAdsResources-Google-Mobile-Ads-SDK-Info.plist";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				PRODUCT_NAME = GoogleMobileAdsResources;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				WRAPPER_EXTENSION = bundle;
+			};
+			name = Release;
+		};
+		C4F1ED251670815A79FF65B0B39440E3 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = ABEB5F6B5164E3489B1399762508B6A1 /* Google-Mobile-Ads-SDK.debug.xcconfig */;
+			buildSettings = {
+				CODE_SIGNING_ALLOWED = NO;
+				CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Google-Mobile-Ads-SDK";
+				IBSC_MODULE = Google_Mobile_Ads_SDK;
+				INFOPLIST_FILE = "Target Support Files/Google-Mobile-Ads-SDK/ResourceBundle-GoogleMobileAdsResources-Google-Mobile-Ads-SDK-Info.plist";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				PRODUCT_NAME = GoogleMobileAdsResources;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				WRAPPER_EXTENSION = bundle;
+			};
+			name = Debug;
+		};
+		D969CC745A7CBA2B0880709CCDDA9372 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 177E465A4BABFC5B56E52DFC109CE085 /* GoogleUserMessagingPlatform.debug.xcconfig */;
+			buildSettings = {
+				CODE_SIGNING_ALLOWED = NO;
+				CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/GoogleUserMessagingPlatform";
+				IBSC_MODULE = GoogleUserMessagingPlatform;
+				INFOPLIST_FILE = "Target Support Files/GoogleUserMessagingPlatform/ResourceBundle-UserMessagingPlatformResources-GoogleUserMessagingPlatform-Info.plist";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				PRODUCT_NAME = UserMessagingPlatformResources;
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				WRAPPER_EXTENSION = bundle;
+			};
+			name = Debug;
+		};
+		F23917E55E1138F088308D912D03CFD6 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = BD0EC70CC5DE8269E2891909C46EC55D /* Pods-TSLiveWallpaper.release.xcconfig */;
+			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
+				CLANG_ENABLE_OBJC_WEAK = NO;
+				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+				CURRENT_PROJECT_VERSION = 1;
+				DEFINES_MODULE = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				ENABLE_MODULE_VERIFIER = NO;
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
+				INFOPLIST_FILE = "Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-Info.plist";
+				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				MACH_O_TYPE = staticlib;
+				MODULEMAP_FILE = "Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper.modulemap";
+				OTHER_LDFLAGS = "";
+				OTHER_LIBTOOLFLAGS = "";
+				PODS_ROOT = "$(SRCROOT)";
+				PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
+				PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+				SDKROOT = iphoneos;
+				SKIP_INSTALL = YES;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+				VERSIONING_SYSTEM = "apple-generic";
+				VERSION_INFO_PREFIX = "";
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		0133F7ACE4F2664542B16D7BCEF4D52E /* Build configuration list for PBXNativeTarget "Google-Mobile-Ads-SDK" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				612A771FEC74E5BC5C4888D1C8CEEDAF /* Debug */,
+				BA2AB6FB0451A4F73DDA8150E1858BF7 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		0E7E0F60830A86D70533E72AE5DA33D1 /* Build configuration list for PBXNativeTarget "MJRefresh" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				81343A44163F4C127988EBAB75121219 /* Debug */,
+				6FA063640D2EB107770982231FEB6191 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1D33C0E8AF073F3821E2C60FBD5451DB /* Build configuration list for PBXNativeTarget "ObjectMapper" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				BACEEBE82272754AFEE2CAE47AFFF1B0 /* Debug */,
+				510A118D00A136D8992EE9985E4E0996 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		3F3B2F91C7ABE05E64374EB5A20EBCC0 /* Build configuration list for PBXNativeTarget "Google-Mobile-Ads-SDK-GoogleMobileAdsResources" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				C4F1ED251670815A79FF65B0B39440E3 /* Debug */,
+				BC02A6CA5F467AFA2C6A997EF9084CC4 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				4BC7450F9457737EE3E637BA155B56F7 /* Debug */,
+				8B5A46FF8D3C1289CDEE3BAFACABCD2A /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		54482BEF8A2446AF2C2C80F2F446F13C /* Build configuration list for PBXNativeTarget "TYCyclePagerView" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				8D3B4ECAA5F0B158C8806DB0AE618218 /* Debug */,
+				4AD9788F911BF2AAA9EE1ADE6216AFA9 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		69444753864BFEE93D93DCEABA3746A1 /* Build configuration list for PBXNativeTarget "SVProgressHUD" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				2B1F42F08F2B53D503A5BB90F55813A8 /* Debug */,
+				B1CC6DA48CBDF86D73AD5C256AE18E7F /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		80CE967CAA1D35721519F892BAF7A19B /* Build configuration list for PBXNativeTarget "SnapKit" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				9D0D7572FEDA4CC9E75E7387846AFE57 /* Debug */,
+				BAD20131EC29650C6737E66854A3A9FD /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		999B2FE7F8CA8C4BFB786D13928108A1 /* Build configuration list for PBXNativeTarget "Pods-TSLiveWallpaper" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				5BE506DDC8B0C32817B8E2A344F6D779 /* Debug */,
+				F23917E55E1138F088308D912D03CFD6 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		A46FC6A4C0DEF24502B8FD1F7965E0EF /* Build configuration list for PBXNativeTarget "Kingfisher-Kingfisher" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				4EA702F8C316BD67E58FDA9ACE0DC3A6 /* Debug */,
+				1B46BA71E3C0EBB94A5CD305666B9F1D /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		B73E6A6D0321D9CF4C64784B9A87541E /* Build configuration list for PBXNativeTarget "Kingfisher" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				941A6E9C04698419ED0B5A3555A0DC9C /* Debug */,
+				9B52ED9D38CF8FD37D657F2D4F54AAD4 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		D0FA975C9FFB1F3884737E061F7BD52D /* Build configuration list for PBXNativeTarget "GoogleUserMessagingPlatform-UserMessagingPlatformResources" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				D969CC745A7CBA2B0880709CCDDA9372 /* Debug */,
+				A0CC5E1320B0BA29F6FB3BF3E0B639B5 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		DC84AF93961DBCB285D9DE89BA2EC756 /* Build configuration list for PBXAggregateTarget "GoogleUserMessagingPlatform" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1258D3B1EBE9AAA43CACFEDC880BB7E7 /* Debug */,
+				7F1B26EE8EDA785415278EB756B30F2C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		F979D9403F00AB57DBEAAE7F6E511A7C /* Build configuration list for PBXNativeTarget "SnapKit-SnapKit_Privacy" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				582D8BE9FF67E28F066014AD19994EEE /* Debug */,
+				A155B1AD39E3761B430032619AD97572 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+}

+ 58 - 0
Pods/Pods.xcodeproj/xcuserdata/100years.xcuserdatad/xcschemes/SVProgressHUD.xcscheme

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1600"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "1C8D67D8B72D6BA42CCEDB648537A340"
+               BuildableName = "SVProgressHUD.framework"
+               BlueprintName = "SVProgressHUD"
+               ReferencedContainer = "container:Pods.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+      </Testables>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>

+ 76 - 0
Pods/Pods.xcodeproj/xcuserdata/100years.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>SchemeUserState</key>
+	<dict>
+		<key>Google-Mobile-Ads-SDK-GoogleMobileAdsResources.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+		</dict>
+		<key>Google-Mobile-Ads-SDK.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+		</dict>
+		<key>GoogleUserMessagingPlatform-UserMessagingPlatformResources.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+		</dict>
+		<key>GoogleUserMessagingPlatform.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+		</dict>
+		<key>Kingfisher-Kingfisher.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+		</dict>
+		<key>Kingfisher.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+		</dict>
+		<key>MJRefresh.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+		</dict>
+		<key>ObjectMapper.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+		</dict>
+		<key>Pods-TSLiveWallpaper.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+		</dict>
+		<key>SVProgressHUD.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+		</dict>
+		<key>SnapKit-SnapKit_Privacy.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+		</dict>
+		<key>SnapKit.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+		</dict>
+		<key>TYCyclePagerView.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+		</dict>
+	</dict>
+	<key>SuppressBuildableAutocreation</key>
+	<dict/>
+</dict>
+</plist>

+ 21 - 0
Pods/SVProgressHUD/LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2011-2023 Sam Vermette, Tobias Totzek and contributors.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 221 - 0
Pods/SVProgressHUD/README.md

@@ -0,0 +1,221 @@
+# SVProgressHUD
+
+![Pod Version](https://img.shields.io/cocoapods/v/SVProgressHUD.svg?style=flat)
+![Pod Platform](https://img.shields.io/cocoapods/p/SVProgressHUD.svg?style=flat)
+![Pod License](https://img.shields.io/cocoapods/l/SVProgressHUD.svg?style=flat)
+[![SwiftPM compatible](https://img.shields.io/badge/SwiftPM-compatible-brightgreen.svg)](https://swift.org/package-manager/)
+[![CocoaPods compatible](https://img.shields.io/badge/CocoaPods-compatible-green.svg?style=flat)](https://cocoapods.org)
+[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-green.svg?style=flat)](https://github.com/Carthage/Carthage)
+
+`SVProgressHUD` is a clean and easy-to-use HUD meant to display the progress of an ongoing task on iOS and tvOS.
+
+![SVProgressHUD](https://raw.githubusercontent.com/SVProgressHUD/SVProgressHUD/master/Images/SVProgressHUD.png)
+
+## Installation
+
+### Swift Package Manager
+
+[Swift Package Manager](https://swift.org/package-manager/) (SwiftPM) is a tool for managing the distribution of Swift code. It simplifies the process of managing Swift package dependencies.
+
+To integrate `SVProgressHUD` into your project using SwiftPM:
+
+1. In Xcode, select **File > Add Package Dependency**.
+2. Enter the following package repository URL: https://github.com/SVProgressHUD/SVProgressHUD.git
+3. Choose the appropriate version (e.g. a specific version, branch, or commit).
+4. Add `SVProgressHUD` to your target dependencies.
+
+`SVProgressHUD` requires at least Swift tools version 5.3.
+
+### From CocoaPods
+
+[CocoaPods](http://cocoapods.org) is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries like `SVProgressHUD` in your projects. First, add the following line to your [Podfile](http://guides.cocoapods.org/using/using-cocoapods.html):
+
+```ruby
+pod 'SVProgressHUD'
+```
+
+If you want to use the latest features of `SVProgressHUD` use normal external source dependencies.
+
+```ruby
+pod 'SVProgressHUD', :git => 'https://github.com/SVProgressHUD/SVProgressHUD.git'
+```
+
+This pulls from the `master` branch directly.
+
+Second, install `SVProgressHUD` into your project:
+
+```ruby
+pod install
+```
+
+### Carthage
+
+[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. To integrate `SVProgressHUD` into your Xcode project using Carthage, specify it in your `Cartfile`:
+
+```ogdl
+github "SVProgressHUD/SVProgressHUD"
+```
+
+Run `carthage bootstrap` to build the framework in your repository's Carthage directory. You can then include it in your target's `carthage copy-frameworks` build phase. For more information on this, please see [Carthage's documentation](https://github.com/carthage/carthage#if-youre-building-for-ios-tvos-or-watchos).
+
+### Manually
+
+* Drag the `SVProgressHUD/SVProgressHUD` folder into your project.
+* Take care that `SVProgressHUD.bundle` is added to `Targets->Build Phases->Copy Bundle Resources`.
+* Add the **QuartzCore** framework to your project.
+
+## Swift
+
+Even though `SVProgressHUD` is written in Objective-C, it can be used in Swift with no hassle.
+
+If you use [CocoaPods](http://cocoapods.org) add the following line to your [Podfile](http://guides.cocoapods.org/using/using-cocoapods.html):
+
+```ruby
+use_frameworks!
+```
+
+If you added `SVProgressHUD` manually, just add a [bridging header](https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html) file to your project with the `SVProgressHUD` header included.
+
+## Usage
+
+(see sample Xcode project in `/Demo`)
+
+`SVProgressHUD` is created as a singleton (i.e. it doesn't need to be explicitly allocated and instantiated; you directly call `[SVProgressHUD method]` / `SVProgressHUD.method()`).
+
+**Use `SVProgressHUD` wisely! Only use it if you absolutely need to perform a task before taking the user forward. Bad use case examples: pull to refresh, infinite scrolling, sending message.**
+
+Using `SVProgressHUD` in your app will usually look as simple as this.
+
+**Objective-C:**
+
+```objective-c
+[SVProgressHUD show];
+dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+    // time-consuming task
+    dispatch_async(dispatch_get_main_queue(), ^{
+        [SVProgressHUD dismiss];
+    });
+});
+```
+
+**Swift:**
+
+```swift
+SVProgressHUD.show()
+DispatchQueue.global(qos: .default).async {
+    // time-consuming task
+    DispatchQueue.main.async {
+        SVProgressHUD.dismiss()
+    }
+}
+```
+
+### Showing the HUD
+
+You can show the status of indeterminate tasks using one of the following:
+
+```objective-c
++ (void)show;
++ (void)showWithStatus:(NSString*)string;
+```
+
+If you'd like the HUD to reflect the progress of a task, use one of these:
+
+```objective-c
++ (void)showProgress:(CGFloat)progress;
++ (void)showProgress:(CGFloat)progress status:(NSString*)status;
+```
+
+### Dismissing the HUD
+
+The HUD can be dismissed using:
+
+```objective-c
++ (void)dismiss;
++ (void)dismissWithDelay:(NSTimeInterval)delay;
+```
+
+If you'd like to stack HUDs, you can balance out every show call using:
+
+```
++ (void)popActivity;
+```
+
+The HUD will get dismissed once the `popActivity` calls will match the number of show calls.
+
+Or show an image with status before getting dismissed a little bit later. The display time depends on `minimumDismissTimeInterval` and the length of the given string.
+
+```objective-c
++ (void)showInfoWithStatus:(NSString*)string;
++ (void)showSuccessWithStatus:(NSString*)string;
++ (void)showErrorWithStatus:(NSString*)string;
++ (void)showImage:(UIImage*)image status:(NSString*)string;
+```
+
+## Customization
+
+`SVProgressHUD` is designed with flexibility in mind, providing a myriad of customization options to fit the look and feel of your application seamlessly.
+
+* Appearance: Make use of the `UI_APPEARANCE_SELECTOR` to adjust styles, colors, fonts, size, and images app-wide.
+* Behavior: Control visibility durations, display delays, and animation speeds.
+* Feedback: Enhance the user experience with options for haptic feedback and motion effects.
+
+For a comprehensive list of properties and detailed explanations, refer to the `SVProgressHUD.h` file in the API documentation.
+
+### Hint
+
+As standard `SVProgressHUD` offers three preconfigured styles:
+
+* `SVProgressHUDStyleAutomatic`: Automatically switch between the light and dark style
+* `SVProgressHUDStyleLight`: White background with black spinner and text
+* `SVProgressHUDStyleDark`: Black background with white spinner and text
+
+If you want to use custom colors use `setForegroundColor:` and/or `setBackgroundColor:`. These implicitly set the HUD's style to `SVProgressHUDStyleCustom`.
+
+## Haptic Feedback
+
+Available on iPhone 7 and newer, `SVProgressHUD` can automatically trigger haptic feedback depending on which HUD is being displayed. The feedback maps as follows:
+
+* `showSuccessWithStatus:` <-> `UINotificationFeedbackTypeSuccess`
+* `showInfoWithStatus:` <-> `UINotificationFeedbackTypeWarning`
+* `showErrorWithStatus:` <-> `UINotificationFeedbackTypeError`
+
+To enable this functionality, use `setHapticsEnabled:`.
+
+## Notifications
+
+`SVProgressHUD` posts four notifications via `NSNotificationCenter` in response to being shown/dismissed:
+
+* `SVProgressHUDWillAppearNotification` when the show animation starts
+* `SVProgressHUDDidAppearNotification` when the show animation completes
+* `SVProgressHUDWillDisappearNotification` when the dismiss animation starts
+* `SVProgressHUDDidDisappearNotification` when the dismiss animation completes
+
+Each notification passes a `userInfo` dictionary holding the HUD's status string (if any), retrievable via `SVProgressHUDStatusUserInfoKey`.
+
+`SVProgressHUD` also posts `SVProgressHUDDidReceiveTouchEventNotification` when users touch on the overall screen or `SVProgressHUDDidTouchDownInsideNotification` when a user touches on the HUD directly. For these notifications `userInfo` is not passed but the object parameter contains the `UIEvent` that related to the touch.
+
+## App Extensions
+
+When using `SVProgressHUD` in an App Extension, `#define SV_APP_EXTENSIONS` to avoid using unavailable APIs. This will be done automatically when using the `AppExtension` CocoaPods subspec. Additionally, call `setViewForExtension:` from your extensions view controller with `self.view`.
+
+## Contributing to this project
+
+If you have feature requests or bug reports, feel free to help out by sending pull requests or by [creating new issues](https://github.com/SVProgressHUD/SVProgressHUD/issues/new). Please take a moment to
+review the guidelines written by [Nicolas Gallagher](https://github.com/necolas):
+
+* [Bug reports](https://github.com/necolas/issue-guidelines/blob/master/CONTRIBUTING.md#bugs)
+* [Feature requests](https://github.com/necolas/issue-guidelines/blob/master/CONTRIBUTING.md#features)
+* [Pull requests](https://github.com/necolas/issue-guidelines/blob/master/CONTRIBUTING.md#pull-requests)
+
+## License
+
+`SVProgressHUD` is distributed under the terms and conditions of the [MIT license](https://github.com/SVProgressHUD/SVProgressHUD/blob/master/LICENSE). The success, error and info icons used on iOS 12 are made by [Freepik](http://www.freepik.com) from [Flaticon](https://www.flaticon.com) and are licensed under [Creative Commons BY 3.0](https://creativecommons.org/licenses/by/3.0/).
+
+## Privacy
+
+`SVProgressHUD` does not collect any data. A [privacy manifest file](https://developer.apple.com/documentation/bundleresources/privacy_manifest_files) is [provided](SVProgressHUD/PrivacyInfo.xcprivacy).
+
+## Credits
+
+`SVProgressHUD` is brought to you by Sam Vermette, [Tobias Totzek](https://totzek.me) and [contributors to the project](https://github.com/SVProgressHUD/SVProgressHUD/contributors). If you're using `SVProgressHUD` in your project, attribution would be very appreciated.

+ 14 - 0
Pods/SVProgressHUD/SVProgressHUD/PrivacyInfo.xcprivacy

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>NSPrivacyTracking</key>
+	<false/>
+	<key>NSPrivacyCollectedDataTypes</key>
+	<array/>
+	<key>NSPrivacyTrackingDomains</key>
+	<array/>
+	<key>NSPrivacyAccessedAPITypes</key>
+	<array/>
+</dict>
+</plist>

+ 17 - 0
Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h

@@ -0,0 +1,17 @@
+//
+//  SVIndefiniteAnimatedView.h
+//  SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD
+//
+//  Copyright (c) 2014-2023 Guillaume Campagna and contributors. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface SVIndefiniteAnimatedView : UIView
+
+@property (nonatomic, assign) CGFloat strokeThickness;
+@property (nonatomic, assign) CGFloat radius;
+@property (nonatomic, strong) UIColor *strokeColor;
+
+@end
+

+ 142 - 0
Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.m

@@ -0,0 +1,142 @@
+//
+//  SVIndefiniteAnimatedView.m
+//  SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD
+//
+//  Copyright (c) 2014-2023 Guillaume Campagna and contributors. All rights reserved.
+//
+
+#import "SVIndefiniteAnimatedView.h"
+#import "SVProgressHUD.h"
+
+@interface SVIndefiniteAnimatedView ()
+
+@property (nonatomic, strong) CAShapeLayer *indefiniteAnimatedLayer;
+
+@end
+
+@implementation SVIndefiniteAnimatedView
+
+- (void)willMoveToSuperview:(UIView*)newSuperview {
+    if (newSuperview) {
+        [self layoutAnimatedLayer];
+    } else {
+        [_indefiniteAnimatedLayer removeFromSuperlayer];
+        _indefiniteAnimatedLayer = nil;
+    }
+}
+
+- (void)layoutSubviews {
+    [super layoutSubviews];
+
+    [self layoutAnimatedLayer];
+}
+
+- (void)layoutAnimatedLayer {
+    CALayer *layer = self.indefiniteAnimatedLayer;
+
+    if (!layer.superlayer) {
+        [self.layer addSublayer:layer];
+    }
+    
+    CGFloat widthDiff = CGRectGetWidth(self.bounds) - CGRectGetWidth(layer.bounds);
+    CGFloat heightDiff = CGRectGetHeight(self.bounds) - CGRectGetHeight(layer.bounds);
+    layer.position = CGPointMake(CGRectGetWidth(self.bounds) - CGRectGetWidth(layer.bounds) / 2 - widthDiff / 2, CGRectGetHeight(self.bounds) - CGRectGetHeight(layer.bounds) / 2 - heightDiff / 2);
+}
+
+- (CAShapeLayer*)indefiniteAnimatedLayer {
+    if(!_indefiniteAnimatedLayer) {
+        CGPoint arcCenter = CGPointMake(self.radius+self.strokeThickness/2+5, self.radius+self.strokeThickness/2+5);
+        UIBezierPath* smoothedPath = [UIBezierPath bezierPathWithArcCenter:arcCenter radius:self.radius startAngle:(CGFloat) (M_PI*3/2) endAngle:(CGFloat) (M_PI/2+M_PI*5) clockwise:YES];
+        
+        _indefiniteAnimatedLayer = [CAShapeLayer layer];
+        _indefiniteAnimatedLayer.contentsScale = [[UIScreen mainScreen] scale];
+        _indefiniteAnimatedLayer.frame = CGRectMake(0.0f, 0.0f, arcCenter.x*2, arcCenter.y*2);
+        _indefiniteAnimatedLayer.fillColor = [UIColor clearColor].CGColor;
+        _indefiniteAnimatedLayer.strokeColor = self.strokeColor.CGColor;
+        _indefiniteAnimatedLayer.lineWidth = self.strokeThickness;
+        _indefiniteAnimatedLayer.lineCap = kCALineCapRound;
+        _indefiniteAnimatedLayer.lineJoin = kCALineJoinBevel;
+        _indefiniteAnimatedLayer.path = smoothedPath.CGPath;
+        
+        CALayer *maskLayer = [CALayer layer];
+        
+        NSBundle *imageBundle = [SVProgressHUD imageBundle];
+        
+        maskLayer.contents = (__bridge id)[[UIImage imageNamed:@"angle-mask.png" inBundle:imageBundle compatibleWithTraitCollection:nil] CGImage];
+        maskLayer.frame = _indefiniteAnimatedLayer.bounds;
+        _indefiniteAnimatedLayer.mask = maskLayer;
+        
+        NSTimeInterval animationDuration = 1;
+        CAMediaTimingFunction *linearCurve = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
+        
+        CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
+        animation.fromValue = (id) 0;
+        animation.toValue = @(M_PI*2);
+        animation.duration = animationDuration;
+        animation.timingFunction = linearCurve;
+        animation.removedOnCompletion = NO;
+        animation.repeatCount = INFINITY;
+        animation.fillMode = kCAFillModeForwards;
+        animation.autoreverses = NO;
+        [_indefiniteAnimatedLayer.mask addAnimation:animation forKey:@"rotate"];
+        
+        CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
+        animationGroup.duration = animationDuration;
+        animationGroup.repeatCount = INFINITY;
+        animationGroup.removedOnCompletion = NO;
+        animationGroup.timingFunction = linearCurve;
+        
+        CABasicAnimation *strokeStartAnimation = [CABasicAnimation animationWithKeyPath:@"strokeStart"];
+        strokeStartAnimation.fromValue = @0.015;
+        strokeStartAnimation.toValue = @0.515;
+        
+        CABasicAnimation *strokeEndAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
+        strokeEndAnimation.fromValue = @0.485;
+        strokeEndAnimation.toValue = @0.985;
+        
+        animationGroup.animations = @[strokeStartAnimation, strokeEndAnimation];
+        [_indefiniteAnimatedLayer addAnimation:animationGroup forKey:@"progress"];
+        
+    }
+    return _indefiniteAnimatedLayer;
+}
+
+- (void)setFrame:(CGRect)frame {
+    if(!CGRectEqualToRect(frame, super.frame)) {
+        [super setFrame:frame];
+        
+        if(self.superview) {
+            [self layoutAnimatedLayer];
+        }
+    }
+    
+}
+
+- (void)setRadius:(CGFloat)radius {
+    if(radius != _radius) {
+        _radius = radius;
+        
+        [_indefiniteAnimatedLayer removeFromSuperlayer];
+        _indefiniteAnimatedLayer = nil;
+        
+        if(self.superview) {
+            [self layoutAnimatedLayer];
+        }
+    }
+}
+
+- (void)setStrokeColor:(UIColor*)strokeColor {
+    _strokeColor = strokeColor;
+    _indefiniteAnimatedLayer.strokeColor = strokeColor.CGColor;
+}
+
+- (void)setStrokeThickness:(CGFloat)strokeThickness {
+    _strokeThickness = strokeThickness;
+    _indefiniteAnimatedLayer.lineWidth = _strokeThickness;
+}
+
+- (CGSize)sizeThatFits:(CGSize)size {
+    return CGSizeMake((self.radius+self.strokeThickness/2+5)*2, (self.radius+self.strokeThickness/2+5)*2);
+}
+
+@end

+ 17 - 0
Pods/SVProgressHUD/SVProgressHUD/SVProgressAnimatedView.h

@@ -0,0 +1,17 @@
+//
+//  SVProgressAnimatedView.h
+//  SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD
+//
+//  Copyright (c) 2017-2023 Tobias Totzek and contributors. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface SVProgressAnimatedView : UIView
+
+@property (nonatomic, assign) CGFloat radius;
+@property (nonatomic, assign) CGFloat strokeThickness;
+@property (nonatomic, strong) UIColor *strokeColor;
+@property (nonatomic, assign) CGFloat strokeEnd;
+
+@end

+ 96 - 0
Pods/SVProgressHUD/SVProgressHUD/SVProgressAnimatedView.m

@@ -0,0 +1,96 @@
+//
+//  SVProgressAnimatedView.m
+//  SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD
+//
+//  Copyright (c) 2017-2023 Tobias Totzek and contributors. All rights reserved.
+//
+
+#import "SVProgressAnimatedView.h"
+
+@interface SVProgressAnimatedView ()
+
+@property (nonatomic, strong) CAShapeLayer *ringAnimatedLayer;
+
+@end
+
+@implementation SVProgressAnimatedView
+
+- (void)willMoveToSuperview:(UIView*)newSuperview {
+    if (newSuperview) {
+        [self layoutAnimatedLayer];
+    } else {
+        [_ringAnimatedLayer removeFromSuperlayer];
+        _ringAnimatedLayer = nil;
+    }
+}
+
+- (void)layoutAnimatedLayer {
+    CALayer *layer = self.ringAnimatedLayer;
+    [self.layer addSublayer:layer];
+    
+    CGFloat widthDiff = CGRectGetWidth(self.bounds) - CGRectGetWidth(layer.bounds);
+    CGFloat heightDiff = CGRectGetHeight(self.bounds) - CGRectGetHeight(layer.bounds);
+    layer.position = CGPointMake(CGRectGetWidth(self.bounds) - CGRectGetWidth(layer.bounds) / 2 - widthDiff / 2, CGRectGetHeight(self.bounds) - CGRectGetHeight(layer.bounds) / 2 - heightDiff / 2);
+}
+
+- (CAShapeLayer*)ringAnimatedLayer {
+    if(!_ringAnimatedLayer) {
+        CGPoint arcCenter = CGPointMake(self.radius+self.strokeThickness/2+5, self.radius+self.strokeThickness/2+5);
+        UIBezierPath* smoothedPath = [UIBezierPath bezierPathWithArcCenter:arcCenter radius:self.radius startAngle:(CGFloat)-M_PI_2 endAngle:(CGFloat) (M_PI + M_PI_2) clockwise:YES];
+        
+        _ringAnimatedLayer = [CAShapeLayer layer];
+        _ringAnimatedLayer.contentsScale = [[UIScreen mainScreen] scale];
+        _ringAnimatedLayer.frame = CGRectMake(0.0f, 0.0f, arcCenter.x*2, arcCenter.y*2);
+        _ringAnimatedLayer.fillColor = [UIColor clearColor].CGColor;
+        _ringAnimatedLayer.strokeColor = self.strokeColor.CGColor;
+        _ringAnimatedLayer.lineWidth = self.strokeThickness;
+        _ringAnimatedLayer.lineCap = kCALineCapRound;
+        _ringAnimatedLayer.lineJoin = kCALineJoinBevel;
+        _ringAnimatedLayer.path = smoothedPath.CGPath;
+    }
+    return _ringAnimatedLayer;
+}
+
+- (void)setFrame:(CGRect)frame {
+    if(!CGRectEqualToRect(frame, super.frame)) {
+        [super setFrame:frame];
+        
+        if(self.superview) {
+            [self layoutAnimatedLayer];
+        }
+    }
+}
+
+- (void)setRadius:(CGFloat)radius {
+    if(radius != _radius) {
+        _radius = radius;
+        
+        [_ringAnimatedLayer removeFromSuperlayer];
+        _ringAnimatedLayer = nil;
+        
+        if(self.superview) {
+            [self layoutAnimatedLayer];
+        }
+    }
+}
+
+- (void)setStrokeColor:(UIColor*)strokeColor {
+    _strokeColor = strokeColor;
+    _ringAnimatedLayer.strokeColor = strokeColor.CGColor;
+}
+
+- (void)setStrokeThickness:(CGFloat)strokeThickness {
+    _strokeThickness = strokeThickness;
+    _ringAnimatedLayer.lineWidth = _strokeThickness;
+}
+
+- (void)setStrokeEnd:(CGFloat)strokeEnd {
+    _strokeEnd = strokeEnd;
+    _ringAnimatedLayer.strokeEnd = _strokeEnd;
+}
+
+- (CGSize)sizeThatFits:(CGSize)size {
+    return CGSizeMake((self.radius+self.strokeThickness/2+5)*2, (self.radius+self.strokeThickness/2+5)*2);
+}
+
+@end

BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask.png


BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@2x.png


BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@3x.png


BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error.png


BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@2x.png


BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@3x.png


BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info.png


BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@2x.png


BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@3x.png


BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success.png


BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@2x.png


BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@3x.png


+ 392 - 0
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h

@@ -0,0 +1,392 @@
+//
+//  SVProgressHUD.h
+//  SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD
+//
+//  Copyright (c) 2011-2023 Sam Vermette and contributors. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+#import <AvailabilityMacros.h>
+
+extern NSString * _Nonnull const SVProgressHUDDidReceiveTouchEventNotification;
+extern NSString * _Nonnull const SVProgressHUDDidTouchDownInsideNotification;
+extern NSString * _Nonnull const SVProgressHUDWillDisappearNotification;
+extern NSString * _Nonnull const SVProgressHUDDidDisappearNotification;
+extern NSString * _Nonnull const SVProgressHUDWillAppearNotification;
+extern NSString * _Nonnull const SVProgressHUDDidAppearNotification;
+
+extern NSString * _Nonnull const SVProgressHUDStatusUserInfoKey;
+
+/// Represents the appearance style of the HUD.
+typedef NS_ENUM(NSInteger, SVProgressHUDStyle) {
+    /// White HUD with black text. HUD background will be blurred.
+    SVProgressHUDStyleLight NS_SWIFT_NAME(light),
+    
+    /// Black HUD with white text. HUD background will be blurred.
+    SVProgressHUDStyleDark NS_SWIFT_NAME(dark),
+    
+    /// Uses the fore- and background color properties.
+    SVProgressHUDStyleCustom NS_SWIFT_NAME(custom),
+    
+    /// Automatically switch between light or dark mode appearance.
+    SVProgressHUDStyleAutomatic NS_SWIFT_NAME(automatic)
+};
+
+/// Represents the type of mask to be applied when the HUD is displayed.
+typedef NS_ENUM(NSUInteger, SVProgressHUDMaskType) {
+    /// Allow user interactions while HUD is displayed.
+    SVProgressHUDMaskTypeNone NS_SWIFT_NAME(none) = 1,
+    
+    /// Don't allow user interactions with background objects.
+    SVProgressHUDMaskTypeClear NS_SWIFT_NAME(clear),
+    
+    /// Don't allow user interactions and dim the UI behind the HUD (as in iOS 7+).
+    SVProgressHUDMaskTypeBlack NS_SWIFT_NAME(black),
+    
+    /// Don't allow user interactions and dim the UI with an UIAlertView-like background gradient (as in iOS 6).
+    SVProgressHUDMaskTypeGradient NS_SWIFT_NAME(gradient),
+    
+    /// Don't allow user interactions and dim the UI behind the HUD with a custom color.
+    SVProgressHUDMaskTypeCustom NS_SWIFT_NAME(custom)
+};
+
+/// Represents the animation type of the HUD when it's shown or hidden.
+typedef NS_ENUM(NSUInteger, SVProgressHUDAnimationType) {
+    /// Custom flat animation (indefinite animated ring).
+    SVProgressHUDAnimationTypeFlat NS_SWIFT_NAME(flat),
+    
+    /// iOS native UIActivityIndicatorView.
+    SVProgressHUDAnimationTypeNative NS_SWIFT_NAME(native)
+};
+
+typedef void (^SVProgressHUDShowCompletion)(void);
+typedef void (^SVProgressHUDDismissCompletion)(void);
+
+@interface SVProgressHUD : UIView
+
+#pragma mark - Customization
+
+/// Represents the default style for the HUD.
+/// @discussion Default: SVProgressHUDStyleAutomatic.
+@property (assign, nonatomic) SVProgressHUDStyle defaultStyle UI_APPEARANCE_SELECTOR;
+
+/// Represents the type of mask applied when the HUD is displayed.
+/// @discussion Default: SVProgressHUDMaskTypeNone.
+@property (assign, nonatomic) SVProgressHUDMaskType defaultMaskType UI_APPEARANCE_SELECTOR;
+
+/// Defines the animation type used when the HUD is displayed.
+/// @discussion Default: SVProgressHUDAnimationTypeFlat.
+@property (assign, nonatomic) SVProgressHUDAnimationType defaultAnimationType UI_APPEARANCE_SELECTOR;
+
+/// The container view used for displaying the HUD. If nil, the default window level is used.
+@property (strong, nonatomic, nullable) UIView *containerView;
+
+/// The minimum size for the HUD. Useful for maintaining a consistent size when the message might cause resizing.
+/// @discussion Default: CGSizeZero.
+@property (assign, nonatomic) CGSize minimumSize UI_APPEARANCE_SELECTOR;
+
+/// Thickness of the ring shown in the HUD.
+/// @discussion Default: 2 pt.
+@property (assign, nonatomic) CGFloat ringThickness UI_APPEARANCE_SELECTOR;
+
+/// Radius of the ring shown in the HUD when there's associated text.
+/// @discussion Default: 18 pt.
+@property (assign, nonatomic) CGFloat ringRadius UI_APPEARANCE_SELECTOR;
+
+/// Radius of the ring shown in the HUD when there's no associated text.
+/// @discussion Default: 24 pt.
+@property (assign, nonatomic) CGFloat ringNoTextRadius UI_APPEARANCE_SELECTOR;
+
+/// Corner radius of the HUD view.
+/// @discussion Default: 14 pt.
+@property (assign, nonatomic) CGFloat cornerRadius UI_APPEARANCE_SELECTOR;
+
+/// Font used for text within the HUD.
+/// @discussion Default: [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline].
+@property (strong, nonatomic, nonnull) UIFont *font UI_APPEARANCE_SELECTOR;
+
+/// Background color of the HUD.
+/// @discussion Default: [UIColor whiteColor].
+@property (strong, nonatomic, nonnull) UIColor *backgroundColor UI_APPEARANCE_SELECTOR;
+
+/// Foreground color used for content in the HUD.
+/// @discussion Default: [UIColor blackColor].
+@property (strong, nonatomic, nonnull) UIColor *foregroundColor UI_APPEARANCE_SELECTOR;
+
+/// Color for any foreground images in the HUD.
+/// @discussion Default: same as foregroundColor.
+@property (strong, nonatomic, nullable) UIColor *foregroundImageColor UI_APPEARANCE_SELECTOR;
+
+/// Color for the background layer behind the HUD.
+/// @discussion Default: [UIColor colorWithWhite:0 alpha:0.4].
+@property (strong, nonatomic, nonnull) UIColor *backgroundLayerColor UI_APPEARANCE_SELECTOR;
+
+/// Size of any images displayed within the HUD.
+/// @discussion Default: 28x28 pt.
+@property (assign, nonatomic) CGSize imageViewSize UI_APPEARANCE_SELECTOR;
+
+/// Indicates whether images within the HUD should be tinted.
+/// @discussion Default: YES.
+@property (assign, nonatomic) BOOL shouldTintImages UI_APPEARANCE_SELECTOR;
+
+/// The image displayed when showing informational messages.
+/// @discussion Default: info.circle from SF Symbols (iOS 13+) or the bundled info image provided by Freepik.
+@property (strong, nonatomic, nonnull) UIImage *infoImage UI_APPEARANCE_SELECTOR;
+
+/// The image displayed when showing success messages.
+/// @discussion Default: checkmark from SF Symbols (iOS 13+) or the bundled success image provided by Freepik.
+@property (strong, nonatomic, nonnull) UIImage *successImage UI_APPEARANCE_SELECTOR;
+
+/// The image displayed when showing error messages.
+/// @discussion Default: xmark from SF Symbols (iOS 13+) or the bundled error image provided by Freepik.
+@property (strong, nonatomic, nonnull) UIImage *errorImage UI_APPEARANCE_SELECTOR;
+
+/// A specific view for extensions. This property is only used if #define SV_APP_EXTENSIONS is set.
+/// @discussion Default: nil.
+@property (strong, nonatomic, nonnull) UIView *viewForExtension UI_APPEARANCE_SELECTOR;
+
+/// The interval in seconds to wait before displaying the HUD. If the HUD is displayed before this time elapses, this timer is reset.
+/// @discussion Default: 0 seconds.
+@property (assign, nonatomic) NSTimeInterval graceTimeInterval;
+
+/// The minimum amount of time in seconds the HUD will display.
+/// @discussion Default: 5.0 seconds.
+@property (assign, nonatomic) NSTimeInterval minimumDismissTimeInterval;
+
+/// The maximum amount of time in seconds the HUD will display.
+/// @discussion Default: CGFLOAT_MAX.
+@property (assign, nonatomic) NSTimeInterval maximumDismissTimeInterval;
+
+/// Offset from the center position, can be used to adjust the HUD position.
+/// @discussion Default: 0, 0.
+@property (assign, nonatomic) UIOffset offsetFromCenter UI_APPEARANCE_SELECTOR;
+
+/// Duration of the fade-in animation when showing the HUD.
+/// @discussion Default: 0.15.
+@property (assign, nonatomic) NSTimeInterval fadeInAnimationDuration UI_APPEARANCE_SELECTOR;
+
+/// Duration of the fade-out animation when hiding the HUD.
+/// @discussion Default: 0.15.
+@property (assign, nonatomic) NSTimeInterval fadeOutAnimationDuration UI_APPEARANCE_SELECTOR;
+
+/// The maximum window level on which the HUD can be displayed.
+/// @discussion Default: UIWindowLevelNormal.
+@property (assign, nonatomic) UIWindowLevel maxSupportedWindowLevel;
+
+/// Indicates if haptic feedback should be used.
+/// @discussion Default: NO.
+@property (assign, nonatomic) BOOL hapticsEnabled;
+
+/// Indicates if motion effects should be applied to the HUD.
+/// @discussion Default: YES.
+@property (assign, nonatomic) BOOL motionEffectEnabled;
+
+@property (class, strong, nonatomic, readonly, nonnull) NSBundle *imageBundle;
+
+/// Sets the default style for the HUD.
+/// @param style The desired style for the HUD.
++ (void)setDefaultStyle:(SVProgressHUDStyle)style;
+
+/// Sets the default mask type for the HUD.
+/// @param maskType The mask type to apply.
++ (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType;
+
+/// Sets the default animation type for the HUD.
+/// @param type The desired animation type.
++ (void)setDefaultAnimationType:(SVProgressHUDAnimationType)type;
+
+/// Sets the container view for the HUD.
+/// @param containerView The view to contain the HUD.
++ (void)setContainerView:(nullable UIView*)containerView;
+
+/// Sets the minimum size for the HUD.
+/// @param minimumSize The minimum size for the HUD.
++ (void)setMinimumSize:(CGSize)minimumSize;
+
+/// Sets the ring thickness for the HUD.
+/// @param ringThickness Thickness of the ring.
++ (void)setRingThickness:(CGFloat)ringThickness;
+
+/// Sets the ring radius for the HUD.
+/// @param radius Radius of the ring.
++ (void)setRingRadius:(CGFloat)radius;
+
+/// Sets the no text ring radius for the HUD.
+/// @param radius Radius of the ring when no text is displayed.
++ (void)setRingNoTextRadius:(CGFloat)radius;
+
+/// Sets the corner radius for the HUD.
+/// @param cornerRadius Desired corner radius.
++ (void)setCornerRadius:(CGFloat)cornerRadius;
+
+/// Sets the border color for the HUD.
+/// @param color Desired border color.
++ (void)setBorderColor:(nonnull UIColor*)color;
+
+/// Sets the border width for the HUD.
+/// @param width Desired border width.
++ (void)setBorderWidth:(CGFloat)width;
+
+/// Sets the font for the HUD's text.
+/// @param font Desired font for the text.
++ (void)setFont:(nonnull UIFont*)font;
+
+/// Sets the foreground color for the HUD.
+/// @param color Desired foreground color.
+/// @discussion These implicitly set the HUD's style to `SVProgressHUDStyleCustom`.
++ (void)setForegroundColor:(nonnull UIColor*)color;
+
+/// Sets the foreground image color for the HUD.
+/// @param color Desired color for the image.
+/// @discussion These implicitly set the HUD's style to `SVProgressHUDStyleCustom`.
++ (void)setForegroundImageColor:(nullable UIColor*)color;
+
+/// Sets the background color for the HUD.
+/// @param color Desired background color.
+/// @discussion These implicitly set the HUD's style to `SVProgressHUDStyleCustom`.
++ (void)setBackgroundColor:(nonnull UIColor*)color;
+
+/// Sets a custom blur effect for the HUD view.
+/// @param blurEffect Desired blur effect.
+/// @discussion These implicitly set the HUD's style to `SVProgressHUDStyleCustom`.
++ (void)setHudViewCustomBlurEffect:(nullable UIBlurEffect*)blurEffect;
+
+/// Sets the background layer color for the HUD.
+/// @param color Desired color for the background layer.
++ (void)setBackgroundLayerColor:(nonnull UIColor*)color;
+
+/// Sets the size for the HUD's image view.
+/// @param size Desired size for the image view.
++ (void)setImageViewSize:(CGSize)size;
+
+/// Determines if images should be tinted in the HUD.
+/// @param shouldTintImages Whether images should be tinted.
++ (void)setShouldTintImages:(BOOL)shouldTintImages;
+
+/// Sets the info image for the HUD.
+/// @param image The desired info image.
++ (void)setInfoImage:(nonnull UIImage*)image;
+
+/// Sets the success image for the HUD.
+/// @param image The desired success image.
++ (void)setSuccessImage:(nonnull UIImage*)image;
+
+/// Sets the error image for the HUD.
+/// @param image The desired error image.
++ (void)setErrorImage:(nonnull UIImage*)image;
+
+/// Sets the view for extensions.
+/// @param view The desired view for extensions.
++ (void)setViewForExtension:(nonnull UIView*)view;
+
+/// Sets the grace time interval for the HUD.
+/// @param interval Desired grace time interval.
++ (void)setGraceTimeInterval:(NSTimeInterval)interval;
+
+/// Sets the minimum dismiss time interval.
+/// @param interval The minimum time interval, in seconds, that the HUD should be displayed.
++ (void)setMinimumDismissTimeInterval:(NSTimeInterval)interval;
+
+/// Sets the maximum dismiss time interval.
+/// @param interval The maximum time interval, in seconds, that the HUD should be displayed.
++ (void)setMaximumDismissTimeInterval:(NSTimeInterval)interval;
+
+/// Sets the fade-in animation duration.
+/// @param duration The duration, in seconds, for the fade-in animation.
++ (void)setFadeInAnimationDuration:(NSTimeInterval)duration;
+
+/// Sets the fade-out animation duration.
+/// @param duration The duration, in seconds, for the fade-out animation.
++ (void)setFadeOutAnimationDuration:(NSTimeInterval)duration;
+
+/// Sets the max supported window level.
+/// @param windowLevel The UIWindowLevel to which the HUD should be displayed.
++ (void)setMaxSupportedWindowLevel:(UIWindowLevel)windowLevel;
+
+/// Determines if haptics are enabled.
+/// @param hapticsEnabled A boolean that determines if haptic feedback is enabled.
++ (void)setHapticsEnabled:(BOOL)hapticsEnabled;
+
+/// Determines if motion effect is enabled.
+/// @param motionEffectEnabled A boolean that determines if motion effects are enabled.
++ (void)setMotionEffectEnabled:(BOOL)motionEffectEnabled;
+
+
+#pragma mark - Show Methods
+
+/// Shows the HUD without any additional status message.
++ (void)show;
+
+/// Shows the HUD with a provided status message.
+/// @param status The message to be displayed alongside the HUD.
++ (void)showWithStatus:(nullable NSString*)status;
+
+/// Display methods to show progress on the HUD.
+
+/// Shows the HUD with a progress indicator.
+/// @param progress A float value between 0.0 and 1.0 indicating the progress.
++ (void)showProgress:(float)progress;
+
+/// Shows the HUD with a progress indicator and a provided status message.
+/// @param progress A float value between 0.0 and 1.0 indicating the progress.
+/// @param status The message to be displayed alongside the progress indicator.
++ (void)showProgress:(float)progress status:(nullable NSString*)status;
+
+/// Updates the current status of the loading HUD.
+/// @param status The new status message to update the HUD with.
++ (void)setStatus:(nullable NSString*)status;
+
+/// Shows an info status with the provided message.
+/// @param status The info message to be displayed.
++ (void)showInfoWithStatus:(nullable NSString*)status;
+
+/// Shows a success status with the provided message.
+/// @param status The success message to be displayed.
++ (void)showSuccessWithStatus:(nullable NSString*)status;
+
+/// Shows an error status with the provided message.
+/// @param status The error message to be displayed.
++ (void)showErrorWithStatus:(nullable NSString*)status;
+
+/// Shows a custom image with the provided status message.
+/// @param image The custom image to be displayed.
+/// @param status The message to accompany the custom image.
++ (void)showImage:(nonnull UIImage*)image status:(nullable NSString*)status;
+
+/// Sets the offset from the center for the HUD.
+/// @param offset The UIOffset value indicating how much the HUD should be offset from its center position.
++ (void)setOffsetFromCenter:(UIOffset)offset;
+
+/// Resets the offset to center the HUD.
++ (void)resetOffsetFromCenter;
+
+/// Decreases the activity count, dismissing the HUD if count reaches 0.
++ (void)popActivity;
+
+/// Dismisses the HUD immediately.
++ (void)dismiss;
+
+/// Dismisses the HUD and triggers a completion block.
+/// @param completion A block that gets executed after the HUD is dismissed.
++ (void)dismissWithCompletion:(nullable SVProgressHUDDismissCompletion)completion;
+
+/// Dismisses the HUD after a specified delay.
+/// @param delay The time in seconds after which the HUD should be dismissed.
++ (void)dismissWithDelay:(NSTimeInterval)delay;
+
+/// Dismisses the HUD after a specified delay and triggers a completion block.
+/// @param delay The time in seconds after which the HUD should be dismissed.
+/// @param completion A block that gets executed after the HUD is dismissed.
++ (void)dismissWithDelay:(NSTimeInterval)delay completion:(nullable SVProgressHUDDismissCompletion)completion;
+
+/// Checks if the HUD is currently visible.
+/// @return A boolean value indicating whether the HUD is visible.
++ (BOOL)isVisible;
+
+/// Calculates the display duration based on a given string's length.
+/// @param string The string whose length determines the display duration.
+/// @return A time interval representing the display duration.
++ (NSTimeInterval)displayDurationForString:(nullable NSString*)string;
+
+@end
+

+ 1524 - 0
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.m

@@ -0,0 +1,1524 @@
+//
+//  SVProgressHUD.h
+//  SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD
+//
+//  Copyright (c) 2011-2023 Sam Vermette and contributors. All rights reserved.
+//
+
+#if !__has_feature(objc_arc)
+#error SVProgressHUD is ARC only. Either turn on ARC for the project or use -fobjc-arc flag
+#endif
+
+#import "SVProgressHUD.h"
+#import "SVIndefiniteAnimatedView.h"
+#import "SVProgressAnimatedView.h"
+#import "SVRadialGradientLayer.h"
+
+NSString * const SVProgressHUDDidReceiveTouchEventNotification = @"SVProgressHUDDidReceiveTouchEventNotification";
+NSString * const SVProgressHUDDidTouchDownInsideNotification = @"SVProgressHUDDidTouchDownInsideNotification";
+NSString * const SVProgressHUDWillDisappearNotification = @"SVProgressHUDWillDisappearNotification";
+NSString * const SVProgressHUDDidDisappearNotification = @"SVProgressHUDDidDisappearNotification";
+NSString * const SVProgressHUDWillAppearNotification = @"SVProgressHUDWillAppearNotification";
+NSString * const SVProgressHUDDidAppearNotification = @"SVProgressHUDDidAppearNotification";
+
+NSString * const SVProgressHUDStatusUserInfoKey = @"SVProgressHUDStatusUserInfoKey";
+
+static const CGFloat SVProgressHUDParallaxDepthPoints = 10.0f;
+static const CGFloat SVProgressHUDUndefinedProgress = -1;
+static const CGFloat SVProgressHUDDefaultAnimationDuration = 0.15f;
+static const CGFloat SVProgressHUDVerticalSpacing = 12.0f;
+static const CGFloat SVProgressHUDHorizontalSpacing = 12.0f;
+static const CGFloat SVProgressHUDLabelSpacing = 8.0f;
+
+
+@interface SVProgressHUD ()
+
+@property (nonatomic, strong) NSTimer *graceTimer;
+@property (nonatomic, strong) NSTimer *fadeOutTimer;
+
+@property (nonatomic, strong) UIControl *controlView;
+@property (nonatomic, strong) UIView *backgroundView;
+@property (nonatomic, strong) SVRadialGradientLayer *backgroundRadialGradientLayer;
+@property (nonatomic, strong) UIVisualEffectView *hudView;
+@property (nonatomic, strong) UIBlurEffect *hudViewCustomBlurEffect;
+@property (nonatomic, strong) UILabel *statusLabel;
+@property (nonatomic, strong) UIImageView *imageView;
+
+@property (nonatomic, strong) UIView *indefiniteAnimatedView;
+@property (nonatomic, strong) SVProgressAnimatedView *ringView;
+@property (nonatomic, strong) SVProgressAnimatedView *backgroundRingView;
+
+@property (nonatomic, readwrite) CGFloat progress;
+@property (nonatomic, readwrite) NSUInteger activityCount;
+
+@property (nonatomic, readonly) CGFloat visibleKeyboardHeight;
+@property (nonatomic, readonly) UIWindow *frontWindow;
+
+#if TARGET_OS_IOS
+@property (nonatomic, strong) UINotificationFeedbackGenerator *hapticGenerator;
+#endif
+
+@end
+
+@implementation SVProgressHUD {
+    BOOL _isInitializing;
+}
+
++ (SVProgressHUD*)sharedView {
+    static dispatch_once_t once;
+    
+    static SVProgressHUD *sharedView;
+#if !defined(SV_APP_EXTENSIONS)
+     dispatch_once(&once, ^{ sharedView = [[self alloc] initWithFrame:[SVProgressHUD mainWindow].bounds]; });
+#else
+    dispatch_once(&once, ^{ sharedView = [[self alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; });
+#endif
+    return sharedView;
+}
+
++ (UIWindow *)mainWindow {
+    if (@available(iOS 13.0, *)) {
+        for (UIWindowScene* windowScene in [UIApplication sharedApplication].connectedScenes) {
+            if (windowScene.activationState == UISceneActivationStateForegroundActive) {
+                return windowScene.windows.firstObject;
+            }
+        }
+        // If a window has not been returned by now, the first scene's window is returned (regardless of activationState).
+        UIWindowScene *windowScene = (UIWindowScene *)[[UIApplication sharedApplication].connectedScenes allObjects].firstObject;
+        return windowScene.windows.firstObject;
+    } else {
+#if TARGET_OS_IOS
+        return [[[UIApplication sharedApplication] delegate] window];
+#else
+        return [UIApplication sharedApplication].keyWindow;
+#endif
+    }
+}
+
++ (NSBundle *)imageBundle {
+#if defined(SWIFTPM_MODULE_BUNDLE)
+     NSBundle *bundle = SWIFTPM_MODULE_BUNDLE;
+#else
+     NSBundle *bundle = [NSBundle bundleForClass:[SVProgressHUD class]];
+#endif
+     NSURL *url = [bundle URLForResource:@"SVProgressHUD" withExtension:@"bundle"];
+     return [NSBundle bundleWithURL:url];
+ }
+
+#pragma mark - Setters
+
++ (void)setStatus:(NSString*)status {
+    [[self sharedView] setStatus:status];
+}
+
++ (void)setDefaultStyle:(SVProgressHUDStyle)style {
+    [self sharedView].defaultStyle = style;
+}
+
++ (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType {
+    [self sharedView].defaultMaskType = maskType;
+}
+
++ (void)setDefaultAnimationType:(SVProgressHUDAnimationType)type {
+    [self sharedView].defaultAnimationType = type;
+}
+
++ (void)setContainerView:(nullable UIView*)containerView {
+    [self sharedView].containerView = containerView;
+}
+
++ (void)setMinimumSize:(CGSize)minimumSize {
+    [self sharedView].minimumSize = minimumSize;
+}
+
++ (void)setRingThickness:(CGFloat)ringThickness {
+    [self sharedView].ringThickness = ringThickness;
+}
+
++ (void)setRingRadius:(CGFloat)radius {
+    [self sharedView].ringRadius = radius;
+}
+
++ (void)setRingNoTextRadius:(CGFloat)radius {
+    [self sharedView].ringNoTextRadius = radius;
+}
+
++ (void)setCornerRadius:(CGFloat)cornerRadius {
+    [self sharedView].cornerRadius = cornerRadius;
+}
+
++ (void)setBorderColor:(nonnull UIColor*)color {
+    [self sharedView].hudView.layer.borderColor = color.CGColor;
+}
+
++ (void)setBorderWidth:(CGFloat)width {
+    [self sharedView].hudView.layer.borderWidth = width;
+}
+
++ (void)setFont:(UIFont*)font {
+    [self sharedView].font = font;
+}
+
++ (void)setForegroundColor:(UIColor*)color {
+    [self sharedView].foregroundColor = color;
+    [self setDefaultStyle:SVProgressHUDStyleCustom];
+}
+
++ (void)setForegroundImageColor:(UIColor *)color {
+    [self sharedView].foregroundImageColor = color;
+    [self setDefaultStyle:SVProgressHUDStyleCustom];
+}
+
++ (void)setBackgroundColor:(UIColor*)color {
+    [self sharedView].backgroundColor = color;
+    [self setDefaultStyle:SVProgressHUDStyleCustom];
+}
+
++ (void)setHudViewCustomBlurEffect:(UIBlurEffect*)blurEffect {
+    [self sharedView].hudViewCustomBlurEffect = blurEffect;
+    [self setDefaultStyle:SVProgressHUDStyleCustom];
+}
+
++ (void)setBackgroundLayerColor:(UIColor*)color {
+    [self sharedView].backgroundLayerColor = color;
+}
+
++ (void)setImageViewSize:(CGSize)size {
+    [self sharedView].imageViewSize = size;
+}
+
++ (void)setShouldTintImages:(BOOL)shouldTintImages {
+    [self sharedView].shouldTintImages = shouldTintImages;
+}
+
++ (void)setInfoImage:(UIImage*)image {
+    [self sharedView].infoImage = image;
+}
+
++ (void)setSuccessImage:(UIImage*)image {
+    [self sharedView].successImage = image;
+}
+
++ (void)setErrorImage:(UIImage*)image {
+    [self sharedView].errorImage = image;
+}
+
++ (void)setViewForExtension:(UIView*)view {
+    [self sharedView].viewForExtension = view;
+}
+
++ (void)setGraceTimeInterval:(NSTimeInterval)interval {
+    [self sharedView].graceTimeInterval = interval;
+}
+
++ (void)setMinimumDismissTimeInterval:(NSTimeInterval)interval {
+    [self sharedView].minimumDismissTimeInterval = interval;
+}
+
++ (void)setMaximumDismissTimeInterval:(NSTimeInterval)interval {
+    [self sharedView].maximumDismissTimeInterval = interval;
+}
+
++ (void)setFadeInAnimationDuration:(NSTimeInterval)duration {
+    [self sharedView].fadeInAnimationDuration = duration;
+}
+
++ (void)setFadeOutAnimationDuration:(NSTimeInterval)duration {
+    [self sharedView].fadeOutAnimationDuration = duration;
+}
+
++ (void)setMaxSupportedWindowLevel:(UIWindowLevel)windowLevel {
+    [self sharedView].maxSupportedWindowLevel = windowLevel;
+}
+
++ (void)setHapticsEnabled:(BOOL)hapticsEnabled {
+    [self sharedView].hapticsEnabled = hapticsEnabled;
+}
+
++ (void)setMotionEffectEnabled:(BOOL)motionEffectEnabled {
+    [self sharedView].motionEffectEnabled = motionEffectEnabled;
+}
+
+#pragma mark - Show Methods
+
++ (void)show {
+    [self showWithStatus:nil];
+}
+
++ (void)showWithStatus:(NSString*)status {
+    [self showProgress:SVProgressHUDUndefinedProgress status:status];
+}
+
++ (void)showProgress:(float)progress {
+    [self showProgress:progress status:nil];
+}
+
++ (void)showProgress:(float)progress status:(NSString*)status {
+    [[self sharedView] showProgress:progress status:status];
+}
+
+
+#pragma mark - Show, then automatically dismiss methods
+
++ (void)showInfoWithStatus:(NSString*)status {
+    [self showImage:[self sharedView].infoImage status:status];
+    
+#if TARGET_OS_IOS
+    dispatch_async(dispatch_get_main_queue(), ^{
+        [[self sharedView].hapticGenerator notificationOccurred:UINotificationFeedbackTypeWarning];
+    });
+#endif
+}
+
++ (void)showSuccessWithStatus:(NSString*)status {
+    [self showImage:[self sharedView].successImage status:status];
+
+#if TARGET_OS_IOS
+    dispatch_async(dispatch_get_main_queue(), ^{
+        [[self sharedView].hapticGenerator notificationOccurred:UINotificationFeedbackTypeSuccess];
+    });
+#endif
+}
+
++ (void)showErrorWithStatus:(NSString*)status {
+    [self showImage:[self sharedView].errorImage status:status];
+    
+#if TARGET_OS_IOS
+    dispatch_async(dispatch_get_main_queue(), ^{
+        [[self sharedView].hapticGenerator notificationOccurred:UINotificationFeedbackTypeError];
+    });
+#endif
+}
+
++ (void)showImage:(UIImage*)image status:(NSString*)status {
+    NSTimeInterval displayInterval = [self displayDurationForString:status];
+    [[self sharedView] showImage:image status:status duration:displayInterval];
+}
+
+
+#pragma mark - Dismiss Methods
+
++ (void)popActivity {
+    if([self sharedView].activityCount > 0) {
+        [self sharedView].activityCount--;
+    }
+    if([self sharedView].activityCount == 0) {
+        [[self sharedView] dismiss];
+    }
+}
+
++ (void)dismiss {
+    [self dismissWithDelay:0.0 completion:nil];
+}
+
++ (void)dismissWithCompletion:(SVProgressHUDDismissCompletion)completion {
+    [self dismissWithDelay:0.0 completion:completion];
+}
+
++ (void)dismissWithDelay:(NSTimeInterval)delay {
+    [self dismissWithDelay:delay completion:nil];
+}
+
++ (void)dismissWithDelay:(NSTimeInterval)delay completion:(SVProgressHUDDismissCompletion)completion {
+    [[self sharedView] dismissWithDelay:delay completion:completion];
+}
+
+
+#pragma mark - Offset
+
++ (void)setOffsetFromCenter:(UIOffset)offset {
+    [self sharedView].offsetFromCenter = offset;
+}
+
++ (void)resetOffsetFromCenter {
+    [self setOffsetFromCenter:UIOffsetZero];
+}
+
+
+#pragma mark - Instance Methods
+
+- (instancetype)initWithFrame:(CGRect)frame {
+    if((self = [super initWithFrame:frame])) {
+        _isInitializing = YES;
+        
+        self.userInteractionEnabled = NO;
+        self.activityCount = 0;
+        
+        self.backgroundView.alpha = 0.0f;
+        self.imageView.alpha = 0.0f;
+        self.statusLabel.alpha = 0.0f;
+        self.indefiniteAnimatedView.alpha = 0.0f;
+        self.ringView.alpha = self.backgroundRingView.alpha = 0.0f;
+        
+
+        _backgroundColor = [UIColor whiteColor];
+        _foregroundColor = [UIColor blackColor];
+        _backgroundLayerColor = [UIColor colorWithWhite:0 alpha:0.4];
+        
+        // Set default values
+        _defaultMaskType = SVProgressHUDMaskTypeNone;
+        _defaultStyle = SVProgressHUDStyleAutomatic;
+        _defaultAnimationType = SVProgressHUDAnimationTypeFlat;
+        _minimumSize = CGSizeZero;
+        _font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline];
+        
+        _imageViewSize = CGSizeMake(28.0f, 28.0f);
+        _shouldTintImages = YES;
+        
+        NSBundle *imageBundle = [SVProgressHUD imageBundle];
+        
+        if (@available(iOS 13.0, *)) {
+            _infoImage = [UIImage systemImageNamed:@"info.circle"];
+            _successImage = [UIImage systemImageNamed:@"checkmark"];
+            _errorImage = [UIImage systemImageNamed:@"xmark"];
+        } else {
+            _infoImage = [UIImage imageWithContentsOfFile:[imageBundle pathForResource:@"info" ofType:@"png"]];
+            _successImage = [UIImage imageWithContentsOfFile:[imageBundle pathForResource:@"success" ofType:@"png"]];
+            _errorImage = [UIImage imageWithContentsOfFile:[imageBundle pathForResource:@"error" ofType:@"png"]];
+        }
+        
+        _ringThickness = 2.0f;
+        _ringRadius = 18.0f;
+        _ringNoTextRadius = 24.0f;
+        
+        _cornerRadius = 14.0f;
+		
+        _graceTimeInterval = 0.0f;
+        _minimumDismissTimeInterval = 5.0;
+        _maximumDismissTimeInterval = CGFLOAT_MAX;
+
+        _fadeInAnimationDuration = SVProgressHUDDefaultAnimationDuration;
+        _fadeOutAnimationDuration = SVProgressHUDDefaultAnimationDuration;
+        
+        _maxSupportedWindowLevel = UIWindowLevelNormal;
+        
+        _hapticsEnabled = NO;
+        _motionEffectEnabled = YES;
+        
+        // Accessibility support
+        self.accessibilityIdentifier = @"SVProgressHUD";
+        self.isAccessibilityElement = YES;
+        
+        _isInitializing = NO;
+    }
+    return self;
+}
+
+- (void)updateHUDFrame {
+    // Check if an image or progress ring is displayed
+    BOOL imageUsed = (self.imageView.image) && !(self.imageView.hidden) && (self.imageViewSize.height > 0 && self.imageViewSize.width > 0);
+    BOOL progressUsed = self.imageView.hidden;
+    
+    // Calculate size of string
+    CGRect labelRect = CGRectZero;
+    CGFloat labelHeight = 0.0f;
+    CGFloat labelWidth = 0.0f;
+    
+    if(self.statusLabel.text) {
+        CGSize constraintSize = CGSizeMake(200.0f, 300.0f);
+        labelRect = [self.statusLabel.text boundingRectWithSize:constraintSize
+                                                        options:(NSStringDrawingOptions)(NSStringDrawingUsesFontLeading | NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin)
+                                                     attributes:@{NSFontAttributeName: self.statusLabel.font}
+                                                        context:NULL];
+        labelHeight = ceilf(CGRectGetHeight(labelRect));
+        labelWidth = ceilf(CGRectGetWidth(labelRect));
+    }
+    
+    // Calculate hud size based on content
+    // For the beginning use default values, these
+    // might get update if string is too large etc.
+    CGFloat hudWidth;
+    CGFloat hudHeight;
+    
+    CGFloat contentWidth = 0.0f;
+    CGFloat contentHeight = 0.0f;
+    
+    if(imageUsed || progressUsed) {
+        contentWidth = CGRectGetWidth(imageUsed ? self.imageView.frame : self.indefiniteAnimatedView.frame);
+        contentHeight = CGRectGetHeight(imageUsed ? self.imageView.frame : self.indefiniteAnimatedView.frame);
+    }
+    
+    // |-spacing-content-spacing-|
+    hudWidth = SVProgressHUDHorizontalSpacing + MAX(labelWidth, contentWidth) + SVProgressHUDHorizontalSpacing;
+    
+    // |-spacing-content-(labelSpacing-label-)spacing-|
+    hudHeight = SVProgressHUDVerticalSpacing + labelHeight + contentHeight + SVProgressHUDVerticalSpacing;
+    if(self.statusLabel.text && (imageUsed || progressUsed)){
+        // Add spacing if both content and label are used
+        hudHeight += SVProgressHUDLabelSpacing;
+    }
+    
+    // Update values on subviews
+    self.hudView.bounds = CGRectMake(0.0f, 0.0f, MAX(self.minimumSize.width, hudWidth), MAX(self.minimumSize.height, hudHeight));
+    
+    // Animate value update
+    [CATransaction begin];
+    [CATransaction setDisableActions:YES];
+    
+    // Spinner and image view
+    CGFloat centerY;
+    if(self.statusLabel.text) {
+        CGFloat yOffset = MAX(SVProgressHUDVerticalSpacing, (self.minimumSize.height - contentHeight - SVProgressHUDLabelSpacing - labelHeight) / 2.0f);
+        centerY = yOffset + contentHeight / 2.0f;
+    } else {
+        centerY = CGRectGetMidY(self.hudView.bounds);
+    }
+    self.indefiniteAnimatedView.center = CGPointMake(CGRectGetMidX(self.hudView.bounds), centerY);
+    if(self.progress != SVProgressHUDUndefinedProgress) {
+        self.backgroundRingView.center = self.ringView.center = CGPointMake(CGRectGetMidX(self.hudView.bounds), centerY);
+    }
+    self.imageView.center = CGPointMake(CGRectGetMidX(self.hudView.bounds), centerY);
+
+    // Label
+    if(imageUsed || progressUsed) {
+        centerY = CGRectGetMaxY(imageUsed ? self.imageView.frame : self.indefiniteAnimatedView.frame) + SVProgressHUDLabelSpacing + labelHeight / 2.0f;
+    } else {
+        centerY = CGRectGetMidY(self.hudView.bounds);
+    }
+    self.statusLabel.frame = labelRect;
+    self.statusLabel.center = CGPointMake(CGRectGetMidX(self.hudView.bounds), centerY);
+    
+    [CATransaction commit];
+}
+
+#if TARGET_OS_IOS
+- (void)updateMotionEffectForOrientation:(UIInterfaceOrientation)orientation {
+    bool isPortrait = UIInterfaceOrientationIsPortrait(orientation);
+    UIInterpolatingMotionEffectType xMotionEffectType = isPortrait ? UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis : UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis;
+    UIInterpolatingMotionEffectType yMotionEffectType = isPortrait ? UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis : UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis;
+    [self updateMotionEffectForXMotionEffectType:xMotionEffectType yMotionEffectType:yMotionEffectType];
+}
+#endif
+
+- (void)updateMotionEffectForXMotionEffectType:(UIInterpolatingMotionEffectType)xMotionEffectType yMotionEffectType:(UIInterpolatingMotionEffectType)yMotionEffectType {
+    UIInterpolatingMotionEffect *effectX = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x" type:xMotionEffectType];
+    effectX.minimumRelativeValue = @(-SVProgressHUDParallaxDepthPoints);
+    effectX.maximumRelativeValue = @(SVProgressHUDParallaxDepthPoints);
+    
+    UIInterpolatingMotionEffect *effectY = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y" type:yMotionEffectType];
+    effectY.minimumRelativeValue = @(-SVProgressHUDParallaxDepthPoints);
+    effectY.maximumRelativeValue = @(SVProgressHUDParallaxDepthPoints);
+    
+    UIMotionEffectGroup *effectGroup = [UIMotionEffectGroup new];
+    effectGroup.motionEffects = @[effectX, effectY];
+    
+    // Clear old motion effect, then add new motion effects
+    self.hudView.motionEffects = @[];
+    [self.hudView addMotionEffect:effectGroup];
+}
+
+- (void)updateViewHierarchy {
+    // Add the overlay to the application window if necessary
+    if(!self.controlView.superview) {
+        if(self.containerView){
+            [self.containerView addSubview:self.controlView];
+        } else {
+#if !defined(SV_APP_EXTENSIONS)
+            [self.frontWindow addSubview:self.controlView];
+#else
+            // If SVProgressHUD is used inside an app extension add it to the given view
+            if(self.viewForExtension) {
+                [self.viewForExtension addSubview:self.controlView];
+            }
+#endif
+        }
+    } else {
+        // The HUD is already on screen, but maybe not in front. Therefore
+        // ensure that overlay will be on top of rootViewController (which may
+        // be changed during runtime).
+        [self.controlView.superview bringSubviewToFront:self.controlView];
+    }
+    
+    // Add self to the overlay view
+    if(!self.superview) {
+        [self.controlView addSubview:self];
+    }
+}
+
+- (void)setStatus:(NSString*)status {
+    self.statusLabel.text = status;
+    self.statusLabel.hidden = status.length == 0;
+    [self updateHUDFrame];
+}
+
+- (void)setGraceTimer:(NSTimer*)timer {
+    if(_graceTimer) {
+        [_graceTimer invalidate];
+        _graceTimer = nil;
+    }
+    if(timer) {
+        _graceTimer = timer;
+    }
+}
+
+- (void)setFadeOutTimer:(NSTimer*)timer {
+    if(_fadeOutTimer) {
+        [_fadeOutTimer invalidate];
+        _fadeOutTimer = nil;
+    }
+    if(timer) {
+        _fadeOutTimer = timer;
+    }
+}
+
+
+#pragma mark - Notifications and their handling
+
+- (void)registerNotifications {
+#if TARGET_OS_IOS
+    [[NSNotificationCenter defaultCenter] addObserver:self
+                                             selector:@selector(positionHUD:)
+                                                 name:UIApplicationDidChangeStatusBarOrientationNotification
+                                               object:nil];
+    
+    [[NSNotificationCenter defaultCenter] addObserver:self
+                                             selector:@selector(positionHUD:)
+                                                 name:UIKeyboardWillHideNotification
+                                               object:nil];
+    
+    [[NSNotificationCenter defaultCenter] addObserver:self
+                                             selector:@selector(positionHUD:)
+                                                 name:UIKeyboardDidHideNotification
+                                               object:nil];
+    
+    [[NSNotificationCenter defaultCenter] addObserver:self
+                                             selector:@selector(positionHUD:)
+                                                 name:UIKeyboardWillShowNotification
+                                               object:nil];
+    
+    [[NSNotificationCenter defaultCenter] addObserver:self
+                                             selector:@selector(positionHUD:)
+                                                 name:UIKeyboardDidShowNotification
+                                               object:nil];
+#endif
+    [[NSNotificationCenter defaultCenter] addObserver:self
+                                             selector:@selector(positionHUD:)
+                                                 name:UIApplicationDidBecomeActiveNotification
+                                               object:nil];
+}
+
+- (NSDictionary*)notificationUserInfo {
+    return (self.statusLabel.text ? @{SVProgressHUDStatusUserInfoKey : self.statusLabel.text} : nil);
+}
+
+- (void)positionHUD:(NSNotification*)notification {
+    CGFloat keyboardHeight = 0.0f;
+    double animationDuration = 0.0;
+
+#if !defined(SV_APP_EXTENSIONS) && TARGET_OS_IOS
+    self.frame =  [SVProgressHUD mainWindow].bounds;
+    UIInterfaceOrientation orientation = UIApplication.sharedApplication.statusBarOrientation;
+#elif !defined(SV_APP_EXTENSIONS) && !TARGET_OS_IOS
+    self.frame = [SVProgressHUD mainWindow].bounds;
+#else
+    if (self.viewForExtension) {
+        self.frame = self.viewForExtension.frame;
+    } else {
+        self.frame = UIScreen.mainScreen.bounds;
+    }
+#if TARGET_OS_IOS
+    UIInterfaceOrientation orientation = CGRectGetWidth(self.frame) > CGRectGetHeight(self.frame) ? UIInterfaceOrientationLandscapeLeft : UIInterfaceOrientationPortrait;
+#endif
+#endif
+    
+#if TARGET_OS_IOS
+    // Get keyboardHeight in regard to current state
+    if(notification) {
+        NSDictionary* keyboardInfo = [notification userInfo];
+        CGRect keyboardFrame = [keyboardInfo[UIKeyboardFrameBeginUserInfoKey] CGRectValue];
+        animationDuration = [keyboardInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
+        
+        if(notification.name == UIKeyboardWillShowNotification || notification.name == UIKeyboardDidShowNotification) {
+            keyboardHeight = CGRectGetWidth(keyboardFrame);
+            
+            if(UIInterfaceOrientationIsPortrait(orientation)) {
+                keyboardHeight = CGRectGetHeight(keyboardFrame);
+            }
+        }
+    } else {
+        keyboardHeight = self.visibleKeyboardHeight;
+    }
+#endif
+    
+    // Get the currently active frame of the display (depends on orientation)
+    CGRect orientationFrame = self.bounds;
+
+#if !defined(SV_APP_EXTENSIONS) && TARGET_OS_IOS
+    CGRect statusBarFrame = UIApplication.sharedApplication.statusBarFrame;
+#else
+    CGRect statusBarFrame = CGRectZero;
+#endif
+    
+    if (_motionEffectEnabled) {
+#if TARGET_OS_IOS
+        // Update the motion effects in regard to orientation
+        [self updateMotionEffectForOrientation:orientation];
+#else
+        [self updateMotionEffectForXMotionEffectType:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis yMotionEffectType:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];
+#endif
+    }
+    
+    // Calculate available height for display
+    CGFloat activeHeight = CGRectGetHeight(orientationFrame);
+    if(keyboardHeight > 0) {
+        activeHeight += CGRectGetHeight(statusBarFrame) * 2;
+    }
+    activeHeight -= keyboardHeight;
+    
+    CGFloat posX = CGRectGetMidX(orientationFrame);
+    CGFloat posY = floorf(activeHeight*0.45f);
+
+    CGFloat rotateAngle = 0.0;
+    CGPoint newCenter = CGPointMake(posX, posY);
+    
+    if(notification) {
+        // Animate update if notification was present
+        [UIView animateWithDuration:animationDuration
+                              delay:0
+                            options:(UIViewAnimationOptions) (UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionBeginFromCurrentState)
+                         animations:^{
+                             [self moveToPoint:newCenter rotateAngle:rotateAngle];
+                             [self.hudView setNeedsDisplay];
+                         } completion:nil];
+    } else {
+        [self moveToPoint:newCenter rotateAngle:rotateAngle];
+    }
+}
+
+- (void)moveToPoint:(CGPoint)newCenter rotateAngle:(CGFloat)angle {
+    self.hudView.transform = CGAffineTransformMakeRotation(angle);
+    if (self.containerView) {
+        self.hudView.center = CGPointMake(self.containerView.center.x + self.offsetFromCenter.horizontal, self.containerView.center.y + self.offsetFromCenter.vertical);
+    } else {
+        self.hudView.center = CGPointMake(newCenter.x + self.offsetFromCenter.horizontal, newCenter.y + self.offsetFromCenter.vertical);
+    }
+}
+
+
+#pragma mark - Event handling
+
+- (void)controlViewDidReceiveTouchEvent:(id)sender forEvent:(UIEvent*)event {
+    [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDDidReceiveTouchEventNotification
+                                                        object:self
+                                                      userInfo:[self notificationUserInfo]];
+    
+    UITouch *touch = event.allTouches.anyObject;
+    CGPoint touchLocation = [touch locationInView:self];
+    
+    if(CGRectContainsPoint(self.hudView.frame, touchLocation)) {
+        [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDDidTouchDownInsideNotification
+                                                            object:self
+                                                          userInfo:[self notificationUserInfo]];
+    }
+}
+
+
+#pragma mark - Master show/dismiss methods
+
+- (void)showProgress:(float)progress status:(NSString*)status {
+    __weak SVProgressHUD *weakSelf = self;
+    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
+        __strong SVProgressHUD *strongSelf = weakSelf;
+        if(strongSelf){
+            if(strongSelf.fadeOutTimer) {
+                strongSelf.activityCount = 0;
+            }
+            
+            // Stop timer
+            strongSelf.fadeOutTimer = nil;
+            strongSelf.graceTimer = nil;
+            
+            // Update / Check view hierarchy to ensure the HUD is visible
+            [strongSelf updateViewHierarchy];
+            
+            // Reset imageView and fadeout timer if an image is currently displayed
+            strongSelf.imageView.hidden = YES;
+            strongSelf.imageView.image = nil;
+            
+            // Update text and set progress to the given value
+            strongSelf.statusLabel.hidden = status.length == 0;
+            strongSelf.statusLabel.text = status;
+            strongSelf.progress = progress;
+            
+            // Choose the "right" indicator depending on the progress
+            if(progress >= 0) {
+                // Cancel the indefiniteAnimatedView, then show the ringLayer
+                [strongSelf cancelIndefiniteAnimatedViewAnimation];
+                
+                // Add ring to HUD
+                if(!strongSelf.ringView.superview){
+                    [strongSelf.hudView.contentView addSubview:strongSelf.ringView];
+                }
+                if(!strongSelf.backgroundRingView.superview){
+                    [strongSelf.hudView.contentView addSubview:strongSelf.backgroundRingView];
+                }
+                
+                // Set progress animated
+                [CATransaction begin];
+                [CATransaction setDisableActions:YES];
+                strongSelf.ringView.strokeEnd = progress;
+                [CATransaction commit];
+                
+                // Update the activity count
+                if(progress == 0) {
+                    strongSelf.activityCount++;
+                }
+            } else {
+                // Cancel the ringLayer animation, then show the indefiniteAnimatedView
+                [strongSelf cancelRingLayerAnimation];
+                
+                // Add indefiniteAnimatedView to HUD
+                [strongSelf.hudView.contentView addSubview:strongSelf.indefiniteAnimatedView];
+                if([strongSelf.indefiniteAnimatedView respondsToSelector:@selector(startAnimating)]) {
+                    [(id)strongSelf.indefiniteAnimatedView startAnimating];
+                }
+                
+                // Update the activity count
+                strongSelf.activityCount++;
+            }
+            
+            // Fade in delayed if a grace time is set
+            if (self.graceTimeInterval > 0.0 && self.backgroundView.alpha == 0.0f) {
+                strongSelf.graceTimer = [NSTimer timerWithTimeInterval:self.graceTimeInterval target:strongSelf selector:@selector(fadeIn:) userInfo:nil repeats:NO];
+                [[NSRunLoop mainRunLoop] addTimer:strongSelf.graceTimer forMode:NSRunLoopCommonModes];
+            } else {
+                [strongSelf fadeIn:nil];
+            }
+            
+            // Tell the Haptics Generator to prepare for feedback, which may come soon
+#if TARGET_OS_IOS
+            [strongSelf.hapticGenerator prepare];
+#endif
+        }
+    }];
+}
+
+- (void)showImage:(UIImage*)image status:(NSString*)status duration:(NSTimeInterval)duration {
+    __weak SVProgressHUD *weakSelf = self;
+    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
+        __strong SVProgressHUD *strongSelf = weakSelf;
+        if(strongSelf){
+            // Stop timer
+            strongSelf.fadeOutTimer = nil;
+            strongSelf.graceTimer = nil;
+            
+            // Update / Check view hierarchy to ensure the HUD is visible
+            [strongSelf updateViewHierarchy];
+            
+            // Reset progress and cancel any running animation
+            strongSelf.progress = SVProgressHUDUndefinedProgress;
+            [strongSelf cancelRingLayerAnimation];
+            [strongSelf cancelIndefiniteAnimatedViewAnimation];
+            
+            // Update imageView
+            if (self.shouldTintImages) {
+                if (image.renderingMode != UIImageRenderingModeAlwaysTemplate) {
+                    strongSelf.imageView.image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
+                } else {
+                    strongSelf.imageView.image = image;
+                }
+                strongSelf.imageView.tintColor = strongSelf.foregroundImageColorForStyle;
+            } else {
+                strongSelf.imageView.image = image;
+            }
+            strongSelf.imageView.hidden = NO;
+            
+            // Update text
+            strongSelf.statusLabel.hidden = status.length == 0;
+            strongSelf.statusLabel.text = status;
+            
+            // Fade in delayed if a grace time is set
+            // An image will be dismissed automatically. Thus pass the duration as userInfo.
+            if (self.graceTimeInterval > 0.0 && self.backgroundView.alpha == 0.0f) {
+                strongSelf.graceTimer = [NSTimer timerWithTimeInterval:self.graceTimeInterval target:strongSelf selector:@selector(fadeIn:) userInfo:@(duration) repeats:NO];
+                [[NSRunLoop mainRunLoop] addTimer:strongSelf.graceTimer forMode:NSRunLoopCommonModes];
+            } else {
+                [strongSelf fadeIn:@(duration)];
+            }
+        }
+    }];
+}
+
+- (void)fadeIn:(id)data {
+    // Update the HUDs frame to the new content and position HUD
+    [self updateHUDFrame];
+    [self positionHUD:nil];
+    
+    // Update accessibility as well as user interaction
+    // \n cause to read text twice so remove "\n" new line character before setting up accessiblity label
+    NSString *accessibilityString = [[self.statusLabel.text componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]] componentsJoinedByString:@" "];
+    if(self.defaultMaskType != SVProgressHUDMaskTypeNone) {
+        self.controlView.userInteractionEnabled = YES;
+        self.accessibilityLabel =  accessibilityString ?: NSLocalizedString(@"Loading", nil);
+        self.isAccessibilityElement = YES;
+        self.controlView.accessibilityViewIsModal = YES;
+    } else {
+        self.controlView.userInteractionEnabled = NO;
+        self.hudView.accessibilityLabel = accessibilityString ?: NSLocalizedString(@"Loading", nil);
+        self.isAccessibilityElement = NO;
+        self.hudView.isAccessibilityElement = YES;
+        self.controlView.accessibilityViewIsModal = NO;
+    }
+    
+    // Get duration
+    id duration = [data isKindOfClass:[NSTimer class]] ? ((NSTimer *)data).userInfo : data;
+    
+    // Show if not already visible
+    if(self.backgroundView.alpha != 1.0f) {
+        // Post notification to inform user
+        [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDWillAppearNotification
+                                                            object:self
+                                                          userInfo:[self notificationUserInfo]];
+        
+        // Zoom HUD a little to to make a nice appear / pop up animation
+        self.hudView.transform = self.hudView.transform = CGAffineTransformScale(self.hudView.transform, 1.3f, 1.3f);
+        
+        __block void (^animationsBlock)(void) = ^{
+            // Zoom HUD a little to make a nice appear / pop up animation
+            self.hudView.transform = CGAffineTransformIdentity;
+            
+            // Fade in all effects (colors, blur, etc.)
+            [self fadeInEffects];
+        };
+        
+        __block void (^completionBlock)(void) = ^{
+            // Check if we really achieved to show the HUD (<=> alpha)
+            // and the change of these values has not been cancelled in between e.g. due to a dismissal
+            if(self.backgroundView.alpha == 1.0f){
+                // Register observer <=> we now have to handle orientation changes etc.
+                [self registerNotifications];
+                
+                // Post notification to inform user
+                [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDDidAppearNotification
+                                                                    object:self
+                                                                  userInfo:[self notificationUserInfo]];
+                
+                // Update accessibility
+                UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil);
+                UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, self.statusLabel.text);
+                
+                // Dismiss automatically if a duration was passed as userInfo. We start a timer
+                // which then will call dismiss after the predefined duration
+                if(duration){
+                    self.fadeOutTimer = [NSTimer timerWithTimeInterval:[(NSNumber *)duration doubleValue] target:self selector:@selector(dismiss) userInfo:nil repeats:NO];
+                    [[NSRunLoop mainRunLoop] addTimer:self.fadeOutTimer forMode:NSRunLoopCommonModes];
+                }
+            }
+        };
+        
+        // Animate appearance
+        if (self.fadeInAnimationDuration > 0) {
+            // Animate appearance
+            [UIView animateWithDuration:self.fadeInAnimationDuration
+                                  delay:0
+                                options:(UIViewAnimationOptions) (UIViewAnimationOptionAllowUserInteraction | UIViewAnimationCurveEaseIn | UIViewAnimationOptionBeginFromCurrentState)
+                             animations:^{
+                                 animationsBlock();
+                             } completion:^(BOOL finished) {
+                                 completionBlock();
+                             }];
+        } else {
+            animationsBlock();
+            completionBlock();
+        }
+        
+        // Inform iOS to redraw the view hierarchy
+        [self setNeedsDisplay];
+    } else {
+        // Update accessibility
+        UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil);
+        UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, self.statusLabel.text);
+        
+        // Dismiss automatically if a duration was passed as userInfo. We start a timer
+        // which then will call dismiss after the predefined duration
+        if(duration){
+            self.fadeOutTimer = [NSTimer timerWithTimeInterval:[(NSNumber *)duration doubleValue] target:self selector:@selector(dismiss) userInfo:nil repeats:NO];
+            [[NSRunLoop mainRunLoop] addTimer:self.fadeOutTimer forMode:NSRunLoopCommonModes];
+        }
+    }
+}
+
+- (void)dismiss {
+    [self dismissWithDelay:0.0 completion:nil];
+}
+
+- (void)dismissWithDelay:(NSTimeInterval)delay completion:(SVProgressHUDDismissCompletion)completion {
+    __weak SVProgressHUD *weakSelf = self;
+    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
+        __strong SVProgressHUD *strongSelf = weakSelf;
+        if(strongSelf){
+            
+            // Post notification to inform user
+            [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDWillDisappearNotification
+                                                                object:nil
+                                                              userInfo:[strongSelf notificationUserInfo]];
+            
+            // Reset activity count
+            strongSelf.activityCount = 0;
+            
+            __block void (^animationsBlock)(void) = ^{
+                // Shrink HUD a little to make a nice disappear animation
+                strongSelf.hudView.transform = CGAffineTransformScale(strongSelf.hudView.transform, 1/1.3f, 1/1.3f);
+                
+                // Fade out all effects (colors, blur, etc.)
+                [strongSelf fadeOutEffects];
+            };
+            
+            __block void (^completionBlock)(void) = ^{
+                // Check if we really achieved to dismiss the HUD (<=> alpha values are applied)
+                // and the change of these values has not been cancelled in between e.g. due to a new show
+                if(self.backgroundView.alpha == 0.0f){
+                    // Clean up view hierarchy (overlays)
+                    [strongSelf.controlView removeFromSuperview];
+                    [strongSelf.backgroundView removeFromSuperview];
+                    [strongSelf.hudView removeFromSuperview];
+                    [strongSelf removeFromSuperview];
+                    
+                    // Reset progress and cancel any running animation
+                    strongSelf.progress = SVProgressHUDUndefinedProgress;
+                    [strongSelf cancelRingLayerAnimation];
+                    [strongSelf cancelIndefiniteAnimatedViewAnimation];
+                    
+                    // Remove observer <=> we do not have to handle orientation changes etc.
+                    [[NSNotificationCenter defaultCenter] removeObserver:strongSelf];
+                    
+                    // Post notification to inform user
+                    [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDDidDisappearNotification
+                                                                        object:strongSelf
+                                                                      userInfo:[strongSelf notificationUserInfo]];
+                    
+                    // Tell the rootViewController to update the StatusBar appearance
+#if !defined(SV_APP_EXTENSIONS) && TARGET_OS_IOS
+                    UIViewController *rootController = [SVProgressHUD mainWindow].rootViewController;
+                    [rootController setNeedsStatusBarAppearanceUpdate];
+#endif
+                    
+                    // Run an (optional) completionHandler
+                    if (completion) {
+                        completion();
+                    }
+                }
+            };
+            
+            // UIViewAnimationOptionBeginFromCurrentState AND a delay doesn't always work as expected
+            // When UIViewAnimationOptionBeginFromCurrentState is set, animateWithDuration: evaluates the current
+            // values to check if an animation is necessary. The evaluation happens at function call time and not
+            // after the delay => the animation is sometimes skipped. Therefore we delay using dispatch_after.
+            
+            dispatch_time_t dipatchTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC));
+            dispatch_after(dipatchTime, dispatch_get_main_queue(), ^{
+                
+                // Stop timer
+                strongSelf.graceTimer = nil;
+                
+                if (strongSelf.fadeOutAnimationDuration > 0) {
+                    // Animate appearance
+                    [UIView animateWithDuration:strongSelf.fadeOutAnimationDuration
+                                          delay:0
+                                        options:(UIViewAnimationOptions) (UIViewAnimationOptionAllowUserInteraction | UIViewAnimationCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState)
+                                     animations:^{
+                                         animationsBlock();
+                                     } completion:^(BOOL finished) {
+                                         completionBlock();
+                                     }];
+                } else {
+                    animationsBlock();
+                    completionBlock();
+                }
+            });
+            
+            // Inform iOS to redraw the view hierarchy
+            [strongSelf setNeedsDisplay];
+        }
+    }];
+}
+
+
+#pragma mark - Ring progress animation
+
+- (UIView*)indefiniteAnimatedView {
+    // Get the correct spinner for defaultAnimationType
+    if(self.defaultAnimationType == SVProgressHUDAnimationTypeFlat){
+        // Check if spinner exists and is an object of different class
+        if(_indefiniteAnimatedView && ![_indefiniteAnimatedView isKindOfClass:[SVIndefiniteAnimatedView class]]){
+            [_indefiniteAnimatedView removeFromSuperview];
+            _indefiniteAnimatedView = nil;
+        }
+        
+        if(!_indefiniteAnimatedView){
+            _indefiniteAnimatedView = [[SVIndefiniteAnimatedView alloc] initWithFrame:CGRectZero];
+        }
+        
+        // Update styling
+        SVIndefiniteAnimatedView *indefiniteAnimatedView = (SVIndefiniteAnimatedView*)_indefiniteAnimatedView;
+        indefiniteAnimatedView.strokeColor = self.foregroundImageColorForStyle;
+        indefiniteAnimatedView.strokeThickness = self.ringThickness;
+        indefiniteAnimatedView.radius = self.statusLabel.text ? self.ringRadius : self.ringNoTextRadius;
+    } else {
+        // Check if spinner exists and is an object of different class
+        if(_indefiniteAnimatedView && ![_indefiniteAnimatedView isKindOfClass:[UIActivityIndicatorView class]]){
+            [_indefiniteAnimatedView removeFromSuperview];
+            _indefiniteAnimatedView = nil;
+        }
+        
+        if(!_indefiniteAnimatedView){
+            _indefiniteAnimatedView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
+        }
+        
+        // Update styling
+        UIActivityIndicatorView *activityIndicatorView = (UIActivityIndicatorView*)_indefiniteAnimatedView;
+        activityIndicatorView.color = self.foregroundImageColorForStyle;
+    }
+    [_indefiniteAnimatedView sizeToFit];
+    
+    return _indefiniteAnimatedView;
+}
+
+- (SVProgressAnimatedView*)ringView {
+    if(!_ringView) {
+        _ringView = [[SVProgressAnimatedView alloc] initWithFrame:CGRectZero];
+    }
+    
+    // Update styling
+    _ringView.strokeColor = self.foregroundImageColorForStyle;
+    _ringView.strokeThickness = self.ringThickness;
+    _ringView.radius = self.statusLabel.text ? self.ringRadius : self.ringNoTextRadius;
+    
+    return _ringView;
+}
+
+- (SVProgressAnimatedView*)backgroundRingView {
+    if(!_backgroundRingView) {
+        _backgroundRingView = [[SVProgressAnimatedView alloc] initWithFrame:CGRectZero];
+        _backgroundRingView.strokeEnd = 1.0f;
+    }
+    
+    // Update styling
+    _backgroundRingView.strokeColor = [self.foregroundImageColorForStyle colorWithAlphaComponent:0.1f];
+    _backgroundRingView.strokeThickness = self.ringThickness;
+    _backgroundRingView.radius = self.statusLabel.text ? self.ringRadius : self.ringNoTextRadius;
+    
+    return _backgroundRingView;
+}
+
+- (void)cancelRingLayerAnimation {
+    // Animate value update, stop animation
+    [CATransaction begin];
+    [CATransaction setDisableActions:YES];
+    
+    [self.hudView.layer removeAllAnimations];
+    self.ringView.strokeEnd = 0.0f;
+    
+    [CATransaction commit];
+    
+    // Remove from view
+    [self.ringView removeFromSuperview];
+    [self.backgroundRingView removeFromSuperview];
+}
+
+- (void)cancelIndefiniteAnimatedViewAnimation {
+    // Stop animation
+    if([self.indefiniteAnimatedView respondsToSelector:@selector(stopAnimating)]) {
+        [(id)self.indefiniteAnimatedView stopAnimating];
+    }
+    // Remove from view
+    [self.indefiniteAnimatedView removeFromSuperview];
+}
+
+
+#pragma mark - Utilities
+
++ (BOOL)isVisible {
+    // Checking one alpha value is sufficient as they are all the same
+    return [self sharedView].backgroundView.alpha > 0.0f;
+}
+
+
+#pragma mark - Getters
+
++ (NSTimeInterval)displayDurationForString:(NSString*)string {
+    CGFloat minimum = MAX((CGFloat)string.length * 0.06 + 0.5, [self sharedView].minimumDismissTimeInterval);
+    return MIN(minimum, [self sharedView].maximumDismissTimeInterval);
+}
+
+- (UIColor*)foregroundColorForStyle {
+    SVProgressHUDStyle style = [self defaultStyleResolvingAutomatic];
+    
+    if(style == SVProgressHUDStyleLight) {
+        return [UIColor blackColor];
+    } else if(style == SVProgressHUDStyleDark) {
+        return [UIColor whiteColor];
+    } else {
+        return self.foregroundColor;
+    }
+}
+
+- (UIColor*)foregroundImageColorForStyle {
+    if (self.foregroundImageColor) {
+        return self.foregroundImageColor;
+    } else {
+        return [self foregroundColorForStyle];
+    }
+}
+
+- (UIColor*)backgroundColorForStyle {
+    SVProgressHUDStyle style = [self defaultStyleResolvingAutomatic];
+
+    if(style == SVProgressHUDStyleLight) {
+        return [UIColor whiteColor];
+    } else if(style == SVProgressHUDStyleDark) {
+        return [UIColor blackColor];
+    } else {
+        return self.backgroundColor;
+    }
+}
+
+- (UIControl*)controlView {
+    if(!_controlView) {
+        _controlView = [UIControl new];
+        _controlView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+        _controlView.backgroundColor = [UIColor clearColor];
+        _controlView.userInteractionEnabled = YES;
+        [_controlView addTarget:self action:@selector(controlViewDidReceiveTouchEvent:forEvent:) forControlEvents:UIControlEventTouchDown];
+    }
+    
+    // Update frame
+#if !defined(SV_APP_EXTENSIONS)
+    _controlView.frame = [SVProgressHUD mainWindow].bounds;
+#else
+    _controlView.frame = [UIScreen mainScreen].bounds;
+#endif
+    
+    return _controlView;
+}
+
+-(UIView *)backgroundView {
+    if(!_backgroundView){
+        _backgroundView = [UIView new];
+        _backgroundView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+    }
+    if(!_backgroundView.superview){
+        [self insertSubview:_backgroundView belowSubview:self.hudView];
+    }
+    
+    // Update styling
+    if(self.defaultMaskType == SVProgressHUDMaskTypeGradient){
+        if(!_backgroundRadialGradientLayer){
+            _backgroundRadialGradientLayer = [SVRadialGradientLayer layer];
+        }
+        if(!_backgroundRadialGradientLayer.superlayer){
+            [_backgroundView.layer insertSublayer:_backgroundRadialGradientLayer atIndex:0];
+        }
+        _backgroundView.backgroundColor = [UIColor clearColor];
+    } else {
+        if(_backgroundRadialGradientLayer && _backgroundRadialGradientLayer.superlayer){
+            [_backgroundRadialGradientLayer removeFromSuperlayer];
+        }
+        if(self.defaultMaskType == SVProgressHUDMaskTypeBlack){
+            _backgroundView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.4];
+        } else if(self.defaultMaskType == SVProgressHUDMaskTypeCustom){
+            _backgroundView.backgroundColor = self.backgroundLayerColor;
+        } else {
+            _backgroundView.backgroundColor = [UIColor clearColor];
+        }
+    }
+
+    // Update frame
+    if(_backgroundView){
+        _backgroundView.frame = self.bounds;
+    }
+    if(_backgroundRadialGradientLayer){
+        _backgroundRadialGradientLayer.frame = self.bounds;
+        
+        // Calculate the new center of the gradient, it may change if keyboard is visible
+        CGPoint gradientCenter = self.center;
+        gradientCenter.y = (self.bounds.size.height - self.visibleKeyboardHeight)/2;
+        _backgroundRadialGradientLayer.gradientCenter = gradientCenter;
+        [_backgroundRadialGradientLayer setNeedsDisplay];
+    }
+    
+    return _backgroundView;
+}
+- (UIVisualEffectView*)hudView {
+    if(!_hudView) {
+        _hudView = [UIVisualEffectView new];
+        _hudView.layer.masksToBounds = YES;
+        _hudView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin;
+    }
+    if(!_hudView.superview) {
+        [self addSubview:_hudView];
+    }
+    
+    // Update styling
+    _hudView.layer.cornerRadius = self.cornerRadius;
+    
+    return _hudView;
+}
+
+- (UILabel*)statusLabel {
+    if(!_statusLabel) {
+        _statusLabel = [[UILabel alloc] initWithFrame:CGRectZero];
+        _statusLabel.backgroundColor = [UIColor clearColor];
+        _statusLabel.adjustsFontSizeToFitWidth = YES;
+        _statusLabel.adjustsFontForContentSizeCategory = YES;
+        _statusLabel.textAlignment = NSTextAlignmentCenter;
+        _statusLabel.baselineAdjustment = UIBaselineAdjustmentAlignCenters;
+        _statusLabel.numberOfLines = 0;
+    }
+    if(!_statusLabel.superview) {
+      [self.hudView.contentView addSubview:_statusLabel];
+    }
+    
+    // Update styling
+    _statusLabel.textColor = self.foregroundColorForStyle;
+    _statusLabel.font = self.font;
+
+    return _statusLabel;
+}
+
+- (UIImageView*)imageView {
+    if(_imageView && !CGSizeEqualToSize(_imageView.bounds.size, _imageViewSize)) {
+        [_imageView removeFromSuperview];
+        _imageView = nil;
+    }
+    
+    if(!_imageView) {
+        _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, _imageViewSize.width, _imageViewSize.height)];
+    }
+    if(!_imageView.superview) {
+        [self.hudView.contentView addSubview:_imageView];
+    }
+    
+    return _imageView;
+}
+
+
+#pragma mark - Helper
+
+- (SVProgressHUDStyle) defaultStyleResolvingAutomatic {
+    if(self.defaultStyle == SVProgressHUDStyleAutomatic) {
+        return self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark ? SVProgressHUDStyleDark : SVProgressHUDStyleLight;
+    }
+    
+    return self.defaultStyle;
+}
+
+- (CGFloat)visibleKeyboardHeight {
+#if !defined(SV_APP_EXTENSIONS)
+    UIWindow *keyboardWindow = nil;
+    for (UIWindow *testWindow in UIApplication.sharedApplication.windows) {
+        if(![testWindow.class isEqual:UIWindow.class]) {
+            keyboardWindow = testWindow;
+            break;
+        }
+    }
+    
+    for (__strong UIView *possibleKeyboard in keyboardWindow.subviews) {
+        NSString *viewName = NSStringFromClass(possibleKeyboard.class);
+        if([viewName hasPrefix:@"UI"]){
+            if([viewName hasSuffix:@"PeripheralHostView"] || [viewName hasSuffix:@"Keyboard"]){
+                return CGRectGetHeight(possibleKeyboard.bounds);
+            } else if ([viewName hasSuffix:@"InputSetContainerView"]){
+                for (__strong UIView *possibleKeyboardSubview in possibleKeyboard.subviews) {
+                    viewName = NSStringFromClass(possibleKeyboardSubview.class);
+                    if([viewName hasPrefix:@"UI"] && [viewName hasSuffix:@"InputSetHostView"]) {
+                        CGRect convertedRect = [possibleKeyboard convertRect:possibleKeyboardSubview.frame toView:self];
+                        CGRect intersectedRect = CGRectIntersection(convertedRect, self.bounds);
+                        if (!CGRectIsNull(intersectedRect)) {
+                            return CGRectGetHeight(intersectedRect);
+                        }
+                    }
+                }
+            }
+        }
+    }
+#endif
+    return 0;
+}
+    
+- (UIWindow *)frontWindow {
+#if !defined(SV_APP_EXTENSIONS)
+    NSEnumerator *frontToBackWindows = [UIApplication.sharedApplication.windows reverseObjectEnumerator];
+    for (UIWindow *window in frontToBackWindows) {
+        BOOL windowOnMainScreen = window.screen == UIScreen.mainScreen;
+        BOOL windowIsVisible = !window.hidden && window.alpha > 0;
+        BOOL windowLevelSupported = (window.windowLevel >= UIWindowLevelNormal && window.windowLevel <= self.maxSupportedWindowLevel);
+        BOOL windowKeyWindow = window.isKeyWindow;
+			
+        if(windowOnMainScreen && windowIsVisible && windowLevelSupported && windowKeyWindow) {
+            return window;
+        }
+    }
+#endif
+    return nil;
+}
+    
+- (void)fadeInEffects {
+    if(self.defaultStyle != SVProgressHUDStyleCustom) {
+        // Add blur effect
+        UIBlurEffectStyle blurEffectStyle;
+#if TARGET_OS_IOS
+        if (@available(iOS 13.0, *)) {
+            blurEffectStyle = [self defaultStyleResolvingAutomatic] == SVProgressHUDStyleLight ? UIBlurEffectStyleSystemMaterial : UIBlurEffectStyleSystemMaterialDark;
+        } else {
+            blurEffectStyle = [self defaultStyleResolvingAutomatic] == SVProgressHUDStyleLight ? UIBlurEffectStyleLight : UIBlurEffectStyleDark;
+        }
+#else
+        blurEffectStyle = [self defaultStyleResolvingAutomatic] == SVProgressHUDStyleLight ? UIBlurEffectStyleLight : UIBlurEffectStyleDark;
+#endif
+        
+        UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:blurEffectStyle];
+        self.hudView.effect = blurEffect;
+        
+        // We omit UIVibrancy effect and use a suitable background color as an alternative.
+        // This will make everything more readable. See the following for details:
+        // https://www.omnigroup.com/developer/how-to-make-text-in-a-uivisualeffectview-readable-on-any-background
+        
+        self.hudView.backgroundColor = [self.backgroundColorForStyle colorWithAlphaComponent:0.6f];
+    } else {
+        self.hudView.effect = self.hudViewCustomBlurEffect;
+        self.hudView.backgroundColor =  self.backgroundColorForStyle;
+    }
+
+    // Fade in views
+    self.backgroundView.alpha = 1.0f;
+    
+    self.imageView.alpha = 1.0f;
+    self.statusLabel.alpha = 1.0f;
+    self.indefiniteAnimatedView.alpha = 1.0f;
+    self.ringView.alpha = self.backgroundRingView.alpha = 1.0f;
+}
+
+- (void)fadeOutEffects
+{
+    if(self.defaultStyle != SVProgressHUDStyleCustom) {
+        // Remove blur effect
+        self.hudView.effect = nil;
+    }
+
+    // Remove background color
+    self.hudView.backgroundColor = [UIColor clearColor];
+    
+    // Fade out views
+    self.backgroundView.alpha = 0.0f;
+    
+    self.imageView.alpha = 0.0f;
+    self.statusLabel.alpha = 0.0f;
+    self.indefiniteAnimatedView.alpha = 0.0f;
+    self.ringView.alpha = self.backgroundRingView.alpha = 0.0f;
+}
+
+#if TARGET_OS_IOS
+- (UINotificationFeedbackGenerator *)hapticGenerator {
+	// Only return if haptics are enabled
+	if(!self.hapticsEnabled) {
+		return nil;
+	}
+	
+	if(!_hapticGenerator) {
+		_hapticGenerator = [[UINotificationFeedbackGenerator alloc] init];
+	}
+	return _hapticGenerator;
+}
+#endif
+
+    
+#pragma mark - UIAppearance Setters
+
+- (void)setDefaultStyle:(SVProgressHUDStyle)style {
+    if (!_isInitializing) _defaultStyle = style;
+}
+
+- (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType {
+    if (!_isInitializing) _defaultMaskType = maskType;
+}
+
+- (void)setDefaultAnimationType:(SVProgressHUDAnimationType)animationType {
+    if (!_isInitializing) _defaultAnimationType = animationType;
+}
+
+- (void)setContainerView:(UIView *)containerView {
+    if (!_isInitializing) _containerView = containerView;
+}
+
+- (void)setMinimumSize:(CGSize)minimumSize {
+    if (!_isInitializing) _minimumSize = minimumSize;
+}
+
+- (void)setRingThickness:(CGFloat)ringThickness {
+    if (!_isInitializing) _ringThickness = ringThickness;
+}
+
+- (void)setRingRadius:(CGFloat)ringRadius {
+    if (!_isInitializing) _ringRadius = ringRadius;
+}
+
+- (void)setRingNoTextRadius:(CGFloat)ringNoTextRadius {
+    if (!_isInitializing) _ringNoTextRadius = ringNoTextRadius;
+}
+
+- (void)setCornerRadius:(CGFloat)cornerRadius {
+    if (!_isInitializing) _cornerRadius = cornerRadius;
+}
+
+- (void)setFont:(UIFont*)font {
+    if (!_isInitializing) _font = font;
+}
+
+- (void)setForegroundColor:(UIColor*)color {
+    if (!_isInitializing) _foregroundColor = color;
+}
+
+- (void)setForegroundImageColor:(UIColor *)color {
+    if (!_isInitializing) _foregroundImageColor = color;
+}
+
+- (void)setBackgroundColor:(UIColor*)color {
+    if (!_isInitializing) _backgroundColor = color;
+}
+
+- (void)setBackgroundLayerColor:(UIColor*)color {
+    if (!_isInitializing) _backgroundLayerColor = color;
+}
+
+- (void)setShouldTintImages:(BOOL)shouldTintImages {
+    if (!_isInitializing) _shouldTintImages = shouldTintImages;
+}
+
+- (void)setInfoImage:(UIImage*)image {
+    if (!_isInitializing) _infoImage = image;
+}
+
+- (void)setSuccessImage:(UIImage*)image {
+    if (!_isInitializing) _successImage = image;
+}
+
+- (void)setErrorImage:(UIImage*)image {
+    if (!_isInitializing) _errorImage = image;
+}
+
+- (void)setViewForExtension:(UIView*)view {
+    if (!_isInitializing) _viewForExtension = view;
+}
+
+- (void)setOffsetFromCenter:(UIOffset)offset {
+    if (!_isInitializing) _offsetFromCenter = offset;
+}
+
+- (void)setMinimumDismissTimeInterval:(NSTimeInterval)minimumDismissTimeInterval {
+    if (!_isInitializing) _minimumDismissTimeInterval = minimumDismissTimeInterval;
+}
+
+- (void)setFadeInAnimationDuration:(NSTimeInterval)duration {
+    if (!_isInitializing) _fadeInAnimationDuration = duration;
+}
+
+- (void)setFadeOutAnimationDuration:(NSTimeInterval)duration {
+    if (!_isInitializing) _fadeOutAnimationDuration = duration;
+}
+
+- (void)setMaxSupportedWindowLevel:(UIWindowLevel)maxSupportedWindowLevel {
+    if (!_isInitializing) _maxSupportedWindowLevel = maxSupportedWindowLevel;
+}
+
+@end

+ 14 - 0
Pods/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.h

@@ -0,0 +1,14 @@
+//
+//  SVRadialGradientLayer.h
+//  SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD
+//
+//  Copyright (c) 2014-2023 Tobias Totzek and contributors. All rights reserved.
+//
+
+#import <QuartzCore/QuartzCore.h>
+
+@interface SVRadialGradientLayer : CALayer
+
+@property (nonatomic) CGPoint gradientCenter;
+
+@end

+ 25 - 0
Pods/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.m

@@ -0,0 +1,25 @@
+//
+//  SVRadialGradientLayer.m
+//  SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD
+//
+//  Copyright (c) 2014-2023 Tobias Totzek and contributors. All rights reserved.
+//
+
+#import "SVRadialGradientLayer.h"
+
+@implementation SVRadialGradientLayer
+
+- (void)drawInContext:(CGContextRef)context {
+    size_t locationsCount = 2;
+    CGFloat locations[2] = {0.0f, 1.0f};
+    CGFloat colors[8] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.75f};
+    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
+    CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, locations, locationsCount);
+    CGColorSpaceRelease(colorSpace);
+
+    float radius = MIN(self.bounds.size.width , self.bounds.size.height);
+    CGContextDrawRadialGradient (context, gradient, self.gradientCenter, 0, self.gradientCenter, radius, kCGGradientDrawsAfterEndLocation);
+    CGGradientRelease(gradient);
+}
+
+@end

+ 145 - 0
Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-acknowledgements.markdown

@@ -0,0 +1,145 @@
+# Acknowledgements
+This application makes use of the following third party libraries:
+
+## Google-Mobile-Ads-SDK
+
+Copyright 2024 Google LLC
+
+## GoogleUserMessagingPlatform
+
+Copyright 2024 Google LLC
+
+## Kingfisher
+
+The MIT License (MIT)
+
+Copyright (c) 2019 Wei Wang
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+
+## MJRefresh
+
+Copyright (c) 2013-2015 MJRefresh (https://github.com/CoderMJLee/MJRefresh)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+
+## ObjectMapper
+
+The MIT License (MIT)
+Copyright (c) 2014 Hearst
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+## SVProgressHUD
+
+MIT License
+
+Copyright (c) 2011-2023 Sam Vermette, Tobias Totzek and contributors.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+## SnapKit
+
+Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+
+## TYCyclePagerView
+
+MIT License
+
+Copyright (c) 2017 yeBlueColor
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+Generated by CocoaPods - https://cocoapods.org

+ 219 - 0
Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-acknowledgements.plist

@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>PreferenceSpecifiers</key>
+	<array>
+		<dict>
+			<key>FooterText</key>
+			<string>This application makes use of the following third party libraries:</string>
+			<key>Title</key>
+			<string>Acknowledgements</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>Copyright 2024 Google LLC</string>
+			<key>License</key>
+			<string>Copyright</string>
+			<key>Title</key>
+			<string>Google-Mobile-Ads-SDK</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>Copyright 2024 Google LLC</string>
+			<key>License</key>
+			<string>Copyright</string>
+			<key>Title</key>
+			<string>GoogleUserMessagingPlatform</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>The MIT License (MIT)
+
+Copyright (c) 2019 Wei Wang
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+</string>
+			<key>License</key>
+			<string>MIT</string>
+			<key>Title</key>
+			<string>Kingfisher</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>Copyright (c) 2013-2015 MJRefresh (https://github.com/CoderMJLee/MJRefresh)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+</string>
+			<key>License</key>
+			<string>MIT</string>
+			<key>Title</key>
+			<string>MJRefresh</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>The MIT License (MIT)
+Copyright (c) 2014 Hearst
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+</string>
+			<key>License</key>
+			<string>MIT</string>
+			<key>Title</key>
+			<string>ObjectMapper</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>MIT License
+
+Copyright (c) 2011-2023 Sam Vermette, Tobias Totzek and contributors.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+</string>
+			<key>License</key>
+			<string>MIT</string>
+			<key>Title</key>
+			<string>SVProgressHUD</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+</string>
+			<key>License</key>
+			<string>MIT</string>
+			<key>Title</key>
+			<string>SnapKit</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>MIT License
+
+Copyright (c) 2017 yeBlueColor
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+</string>
+			<key>License</key>
+			<string>MIT</string>
+			<key>Title</key>
+			<string>TYCyclePagerView</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>Generated by CocoaPods - https://cocoapods.org</string>
+			<key>Title</key>
+			<string></string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+	</array>
+	<key>StringsTable</key>
+	<string>Acknowledgements</string>
+	<key>Title</key>
+	<string>Acknowledgements</string>
+</dict>
+</plist>

+ 7 - 0
Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-frameworks-Debug-input-files.xcfilelist

@@ -0,0 +1,7 @@
+${PODS_ROOT}/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-frameworks.sh
+${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework
+${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework
+${BUILT_PRODUCTS_DIR}/ObjectMapper/ObjectMapper.framework
+${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework
+${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework
+${BUILT_PRODUCTS_DIR}/TYCyclePagerView/TYCyclePagerView.framework

+ 6 - 0
Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-frameworks-Debug-output-files.xcfilelist

@@ -0,0 +1,6 @@
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Kingfisher.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJRefresh.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ObjectMapper.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SVProgressHUD.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TYCyclePagerView.framework

+ 7 - 0
Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-frameworks-Release-input-files.xcfilelist

@@ -0,0 +1,7 @@
+${PODS_ROOT}/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-frameworks.sh
+${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework
+${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework
+${BUILT_PRODUCTS_DIR}/ObjectMapper/ObjectMapper.framework
+${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework
+${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework
+${BUILT_PRODUCTS_DIR}/TYCyclePagerView/TYCyclePagerView.framework

+ 6 - 0
Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-frameworks-Release-output-files.xcfilelist

@@ -0,0 +1,6 @@
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Kingfisher.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJRefresh.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ObjectMapper.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SVProgressHUD.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TYCyclePagerView.framework

+ 196 - 0
Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper-frameworks.sh

@@ -0,0 +1,196 @@
+#!/bin/sh
+set -e
+set -u
+set -o pipefail
+
+function on_error {
+  echo "$(realpath -mq "${0}"):$1: error: Unexpected failure"
+}
+trap 'on_error $LINENO' ERR
+
+if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then
+  # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy
+  # frameworks to, so exit 0 (signalling the script phase was successful).
+  exit 0
+fi
+
+echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
+mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
+
+COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}"
+SWIFT_STDLIB_PATH="${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}"
+BCSYMBOLMAP_DIR="BCSymbolMaps"
+
+
+# This protects against multiple targets copying the same framework dependency at the same time. The solution
+# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
+RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
+
+# Copies and strips a vendored framework
+install_framework()
+{
+  if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then
+    local source="${BUILT_PRODUCTS_DIR}/$1"
+  elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then
+    local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")"
+  elif [ -r "$1" ]; then
+    local source="$1"
+  fi
+
+  local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
+
+  if [ -L "${source}" ]; then
+    echo "Symlinked..."
+    source="$(readlink -f "${source}")"
+  fi
+
+  if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then
+    # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied
+    find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do
+      echo "Installing $f"
+      install_bcsymbolmap "$f" "$destination"
+      rm "$f"
+    done
+    rmdir "${source}/${BCSYMBOLMAP_DIR}"
+  fi
+
+  # Use filter instead of exclude so missing patterns don't throw errors.
+  echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\""
+  rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}"
+
+  local basename
+  basename="$(basename -s .framework "$1")"
+  binary="${destination}/${basename}.framework/${basename}"
+
+  if ! [ -r "$binary" ]; then
+    binary="${destination}/${basename}"
+  elif [ -L "${binary}" ]; then
+    echo "Destination binary is symlinked..."
+    dirname="$(dirname "${binary}")"
+    binary="${dirname}/$(readlink "${binary}")"
+  fi
+
+  # Strip invalid architectures so "fat" simulator / device frameworks work on device
+  if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then
+    strip_invalid_archs "$binary"
+  fi
+
+  # Resign the code if required by the build settings to avoid unstable apps
+  code_sign_if_enabled "${destination}/$(basename "$1")"
+
+  # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.
+  if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then
+    local swift_runtime_libs
+    swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u)
+    for lib in $swift_runtime_libs; do
+      echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\""
+      rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}"
+      code_sign_if_enabled "${destination}/${lib}"
+    done
+  fi
+}
+# Copies and strips a vendored dSYM
+install_dsym() {
+  local source="$1"
+  warn_missing_arch=${2:-true}
+  if [ -r "$source" ]; then
+    # Copy the dSYM into the targets temp dir.
+    echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\""
+    rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}"
+
+    local basename
+    basename="$(basename -s .dSYM "$source")"
+    binary_name="$(ls "$source/Contents/Resources/DWARF")"
+    binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}"
+
+    # Strip invalid architectures from the dSYM.
+    if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then
+      strip_invalid_archs "$binary" "$warn_missing_arch"
+    fi
+    if [[ $STRIP_BINARY_RETVAL == 0 ]]; then
+      # Move the stripped file into its final destination.
+      echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\""
+      rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}"
+    else
+      # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing.
+      mkdir -p "${DWARF_DSYM_FOLDER_PATH}"
+      touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM"
+    fi
+  fi
+}
+
+# Used as a return value for each invocation of `strip_invalid_archs` function.
+STRIP_BINARY_RETVAL=0
+
+# Strip invalid architectures
+strip_invalid_archs() {
+  binary="$1"
+  warn_missing_arch=${2:-true}
+  # Get architectures for current target binary
+  binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)"
+  # Intersect them with the architectures we are building for
+  intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)"
+  # If there are no archs supported by this binary then warn the user
+  if [[ -z "$intersected_archs" ]]; then
+    if [[ "$warn_missing_arch" == "true" ]]; then
+      echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)."
+    fi
+    STRIP_BINARY_RETVAL=1
+    return
+  fi
+  stripped=""
+  for arch in $binary_archs; do
+    if ! [[ "${ARCHS}" == *"$arch"* ]]; then
+      # Strip non-valid architectures in-place
+      lipo -remove "$arch" -output "$binary" "$binary"
+      stripped="$stripped $arch"
+    fi
+  done
+  if [[ "$stripped" ]]; then
+    echo "Stripped $binary of architectures:$stripped"
+  fi
+  STRIP_BINARY_RETVAL=0
+}
+
+# Copies the bcsymbolmap files of a vendored framework
+install_bcsymbolmap() {
+    local bcsymbolmap_path="$1"
+    local destination="${BUILT_PRODUCTS_DIR}"
+    echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}""
+    rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"
+}
+
+# Signs a framework with the provided identity
+code_sign_if_enabled() {
+  if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then
+    # Use the current code_sign_identity
+    echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
+    local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'"
+
+    if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
+      code_sign_cmd="$code_sign_cmd &"
+    fi
+    echo "$code_sign_cmd"
+    eval "$code_sign_cmd"
+  fi
+}
+
+if [[ "$CONFIGURATION" == "Debug" ]]; then
+  install_framework "${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/ObjectMapper/ObjectMapper.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/TYCyclePagerView/TYCyclePagerView.framework"
+fi
+if [[ "$CONFIGURATION" == "Release" ]]; then
+  install_framework "${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/ObjectMapper/ObjectMapper.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/TYCyclePagerView/TYCyclePagerView.framework"
+fi
+if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
+  wait
+fi

+ 17 - 0
Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper.debug.xcconfig

@@ -0,0 +1,17 @@
+ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Google-Mobile-Ads-SDK" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_CONFIGURATION_BUILD_DIR}/ObjectMapper" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/TYCyclePagerView" "${PODS_ROOT}/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework" "${PODS_ROOT}/GoogleUserMessagingPlatform/Frameworks/Release" "${PODS_XCFRAMEWORKS_BUILD_DIR}/Google-Mobile-Ads-SDK" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleUserMessagingPlatform"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Google-Mobile-Ads-SDK/Google_Mobile_Ads_SDK.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher/Kingfisher.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ObjectMapper/ObjectMapper.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/TYCyclePagerView/TYCyclePagerView.framework/Headers"
+LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SDKROOT)/usr/lib/swift
+OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Google-Mobile-Ads-SDK/Google_Mobile_Ads_SDK.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher/Kingfisher.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/ObjectMapper/ObjectMapper.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/TYCyclePagerView/TYCyclePagerView.framework/Headers" -iframework "${PODS_ROOT}/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework" -iframework "${PODS_XCFRAMEWORKS_BUILD_DIR}/Google-Mobile-Ads-SDK" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Google-Mobile-Ads-SDK" -iframework "${PODS_ROOT}/GoogleUserMessagingPlatform/Frameworks/Release" -iframework "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleUserMessagingPlatform" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/ObjectMapper" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/TYCyclePagerView"
+OTHER_LDFLAGS = $(inherited) -ObjC -l"sqlite3" -l"swiftCoreGraphics" -l"z" -framework "AVFoundation" -framework "Accelerate" -framework "AudioToolbox" -framework "CFNetwork" -framework "CoreGraphics" -framework "CoreMedia" -framework "CoreTelephony" -framework "CoreVideo" -framework "GoogleMobileAds" -framework "Google_Mobile_Ads_SDK" -framework "JavaScriptCore" -framework "Kingfisher" -framework "MJRefresh" -framework "MediaPlayer" -framework "MessageUI" -framework "MobileCoreServices" -framework "Network" -framework "ObjectMapper" -framework "QuartzCore" -framework "SVProgressHUD" -framework "Security" -framework "SnapKit" -framework "StoreKit" -framework "SystemConfiguration" -framework "TYCyclePagerView" -framework "UserMessagingPlatform" -framework "WebKit" -weak_framework "AdSupport" -weak_framework "Combine" -weak_framework "JavaScriptCore" -weak_framework "SafariServices" -weak_framework "SwiftUI" -weak_framework "WebKit"
+OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/Google-Mobile-Ads-SDK" "-F${PODS_CONFIGURATION_BUILD_DIR}/GoogleUserMessagingPlatform" "-F${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" "-F${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "-F${PODS_CONFIGURATION_BUILD_DIR}/ObjectMapper" "-F${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "-F${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "-F${PODS_CONFIGURATION_BUILD_DIR}/TYCyclePagerView"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
+PODS_ROOT = ${SRCROOT}/Pods
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES

+ 17 - 0
Pods/Target Support Files/Pods-TSLiveWallpaper/Pods-TSLiveWallpaper.release.xcconfig

@@ -0,0 +1,17 @@
+ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Google-Mobile-Ads-SDK" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_CONFIGURATION_BUILD_DIR}/ObjectMapper" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/TYCyclePagerView" "${PODS_ROOT}/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework" "${PODS_ROOT}/GoogleUserMessagingPlatform/Frameworks/Release" "${PODS_XCFRAMEWORKS_BUILD_DIR}/Google-Mobile-Ads-SDK" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleUserMessagingPlatform"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Google-Mobile-Ads-SDK/Google_Mobile_Ads_SDK.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher/Kingfisher.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ObjectMapper/ObjectMapper.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/TYCyclePagerView/TYCyclePagerView.framework/Headers"
+LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SDKROOT)/usr/lib/swift
+OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Google-Mobile-Ads-SDK/Google_Mobile_Ads_SDK.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher/Kingfisher.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/ObjectMapper/ObjectMapper.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/TYCyclePagerView/TYCyclePagerView.framework/Headers" -iframework "${PODS_ROOT}/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework" -iframework "${PODS_XCFRAMEWORKS_BUILD_DIR}/Google-Mobile-Ads-SDK" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Google-Mobile-Ads-SDK" -iframework "${PODS_ROOT}/GoogleUserMessagingPlatform/Frameworks/Release" -iframework "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleUserMessagingPlatform" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/ObjectMapper" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/TYCyclePagerView"
+OTHER_LDFLAGS = $(inherited) -ObjC -l"sqlite3" -l"swiftCoreGraphics" -l"z" -framework "AVFoundation" -framework "Accelerate" -framework "AudioToolbox" -framework "CFNetwork" -framework "CoreGraphics" -framework "CoreMedia" -framework "CoreTelephony" -framework "CoreVideo" -framework "GoogleMobileAds" -framework "Google_Mobile_Ads_SDK" -framework "JavaScriptCore" -framework "Kingfisher" -framework "MJRefresh" -framework "MediaPlayer" -framework "MessageUI" -framework "MobileCoreServices" -framework "Network" -framework "ObjectMapper" -framework "QuartzCore" -framework "SVProgressHUD" -framework "Security" -framework "SnapKit" -framework "StoreKit" -framework "SystemConfiguration" -framework "TYCyclePagerView" -framework "UserMessagingPlatform" -framework "WebKit" -weak_framework "AdSupport" -weak_framework "Combine" -weak_framework "JavaScriptCore" -weak_framework "SafariServices" -weak_framework "SwiftUI" -weak_framework "WebKit"
+OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/Google-Mobile-Ads-SDK" "-F${PODS_CONFIGURATION_BUILD_DIR}/GoogleUserMessagingPlatform" "-F${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" "-F${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "-F${PODS_CONFIGURATION_BUILD_DIR}/ObjectMapper" "-F${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "-F${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "-F${PODS_CONFIGURATION_BUILD_DIR}/TYCyclePagerView"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
+PODS_ROOT = ${SRCROOT}/Pods
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES

+ 26 - 0
Pods/Target Support Files/SVProgressHUD/SVProgressHUD-Info.plist

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleExecutable</key>
+  <string>${EXECUTABLE_NAME}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>FMWK</string>
+  <key>CFBundleShortVersionString</key>
+  <string>2.3.1</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>${CURRENT_PROJECT_VERSION}</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>

+ 5 - 0
Pods/Target Support Files/SVProgressHUD/SVProgressHUD-dummy.m

@@ -0,0 +1,5 @@
+#import <Foundation/Foundation.h>
+@interface PodsDummy_SVProgressHUD : NSObject
+@end
+@implementation PodsDummy_SVProgressHUD
+@end

+ 12 - 0
Pods/Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch

@@ -0,0 +1,12 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+

+ 20 - 0
Pods/Target Support Files/SVProgressHUD/SVProgressHUD-umbrella.h

@@ -0,0 +1,20 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
+#import "SVIndefiniteAnimatedView.h"
+#import "SVProgressAnimatedView.h"
+#import "SVProgressHUD.h"
+#import "SVRadialGradientLayer.h"
+
+FOUNDATION_EXPORT double SVProgressHUDVersionNumber;
+FOUNDATION_EXPORT const unsigned char SVProgressHUDVersionString[];
+

+ 13 - 0
Pods/Target Support Files/SVProgressHUD/SVProgressHUD.debug.xcconfig

@@ -0,0 +1,13 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+OTHER_LDFLAGS = $(inherited) -framework "QuartzCore"
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/SVProgressHUD
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES

+ 6 - 0
Pods/Target Support Files/SVProgressHUD/SVProgressHUD.modulemap

@@ -0,0 +1,6 @@
+framework module SVProgressHUD {
+  umbrella header "SVProgressHUD-umbrella.h"
+
+  export *
+  module * { export * }
+}

+ 13 - 0
Pods/Target Support Files/SVProgressHUD/SVProgressHUD.release.xcconfig

@@ -0,0 +1,13 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+OTHER_LDFLAGS = $(inherited) -framework "QuartzCore"
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/SVProgressHUD
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES

+ 65 - 7
TSLiveWallpaper.xcodeproj/project.pbxproj

@@ -95,6 +95,12 @@
 		A8E56BF62D1520EC003C54AF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8E56BEC2D1520EC003C54AF /* AppDelegate.swift */; };
 		A8E56BF92D1520EC003C54AF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A8E56BED2D1520EC003C54AF /* Assets.xcassets */; };
 		A8E56BFB2D1520EC003C54AF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A8E56BF02D1520EC003C54AF /* LaunchScreen.storyboard */; };
+		A8F76C3C2D35026200AA6E93 /* TSPurchaseMembershipVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F76C3B2D35026100AA6E93 /* TSPurchaseMembershipVC.swift */; };
+		A8F76C422D350A9600AA6E93 /* TSPurchaseManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F76C3E2D350A9600AA6E93 /* TSPurchaseManager.swift */; };
+		A8F76C472D3510FE00AA6E93 /* TSNetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F76C462D3510FA00AA6E93 /* TSNetworkManager.swift */; };
+		A8F76C4D2D3747B400AA6E93 /* TSPurchaseVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F76C4C2D3747AB00AA6E93 /* TSPurchaseVC.swift */; };
+		A8F774522D3757E700AA6E93 /* Color+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774512D3757DF00AA6E93 /* Color+Ex.swift */; };
+		A8F774542D37581F00AA6E93 /* Font+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774532D37581700AA6E93 /* Font+Ex.swift */; };
 		A8F778AE2D1AC12400BF55D5 /* TSRandomWallpaperBrowseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F778AD2D1AC12100BF55D5 /* TSRandomWallpaperBrowseView.swift */; };
 		A8F778B02D1AC17500BF55D5 /* TSBaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F778AF2D1AC16F00BF55D5 /* TSBaseView.swift */; };
 		A8F778B22D1BA07200BF55D5 /* TSRandomWallpaperBrowseSelectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F778B12D1BA07000BF55D5 /* TSRandomWallpaperBrowseSelectView.swift */; };
@@ -195,6 +201,12 @@
 		A8E56BED2D1520EC003C54AF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
 		A8E56BEE2D1520EC003C54AF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		A8E56BEF2D1520EC003C54AF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
+		A8F76C3B2D35026100AA6E93 /* TSPurchaseMembershipVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSPurchaseMembershipVC.swift; sourceTree = "<group>"; };
+		A8F76C3E2D350A9600AA6E93 /* TSPurchaseManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSPurchaseManager.swift; sourceTree = "<group>"; };
+		A8F76C462D3510FA00AA6E93 /* TSNetworkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSNetworkManager.swift; sourceTree = "<group>"; };
+		A8F76C4C2D3747AB00AA6E93 /* TSPurchaseVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSPurchaseVC.swift; sourceTree = "<group>"; };
+		A8F774512D3757DF00AA6E93 /* Color+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Ex.swift"; sourceTree = "<group>"; };
+		A8F774532D37581700AA6E93 /* Font+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Font+Ex.swift"; sourceTree = "<group>"; };
 		A8F778AD2D1AC12100BF55D5 /* TSRandomWallpaperBrowseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSRandomWallpaperBrowseView.swift; sourceTree = "<group>"; };
 		A8F778AF2D1AC16F00BF55D5 /* TSBaseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSBaseView.swift; sourceTree = "<group>"; };
 		A8F778B12D1BA07000BF55D5 /* TSRandomWallpaperBrowseSelectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSRandomWallpaperBrowseSelectView.swift; sourceTree = "<group>"; };
@@ -236,6 +248,8 @@
 		A81CA4662D156A8100A3AAC8 /* Common */ = {
 			isa = PBXGroup;
 			children = (
+				A8F76C452D3510E700AA6E93 /* NetworkManager */,
+				A8F76C402D350A9600AA6E93 /* Purchase */,
 				A878331D2D293E9300E47F2C /* View */,
 				A858EE182D1CF635004B680F /* ThirdParty */,
 				A81CA4882D15840F00A3AAC8 /* Tool */,
@@ -272,6 +286,7 @@
 		A81CA4752D15778800A3AAC8 /* Ex */ = {
 			isa = PBXGroup;
 			children = (
+				A8F774502D3757D300AA6E93 /* SwiftUI */,
 				A8C4C01C2D2397B4003C46FC /* UIViewController+Ex.swift */,
 				A8477C982D2291F100DF0B93 /* UserDefault+Ex.swift */,
 				A81F5B4E2D19673500740085 /* AVAsset+Ex.swift */,
@@ -339,8 +354,8 @@
 		A81CA48C2D15855300A3AAC8 /* Business */ = {
 			isa = PBXGroup;
 			children = (
+				A8F76C3A2D35022300AA6E93 /* TSPurchaseMembershipVC */,
 				A8477C952D2272FB00DF0B93 /* TSBusinessWebVC */,
-				A81CA4A22D16747900A3AAC8 /* TSViewTool */,
 				A81CA4932D16527E00A3AAC8 /* TSEditLiveVC */,
 				A81CA4922D16525C00A3AAC8 /* TSRandomWallpaperVC */,
 				A81CA4912D16521300A3AAC8 /* TSMineVC */,
@@ -624,6 +639,41 @@
 			path = TSLiveWallpaper;
 			sourceTree = "<group>";
 		};
+		A8F76C3A2D35022300AA6E93 /* TSPurchaseMembershipVC */ = {
+			isa = PBXGroup;
+			children = (
+				A8F76C4C2D3747AB00AA6E93 /* TSPurchaseVC.swift */,
+				A8F76C3B2D35026100AA6E93 /* TSPurchaseMembershipVC.swift */,
+				A81CA4A22D16747900A3AAC8 /* TSViewTool */,
+			);
+			path = TSPurchaseMembershipVC;
+			sourceTree = "<group>";
+		};
+		A8F76C402D350A9600AA6E93 /* Purchase */ = {
+			isa = PBXGroup;
+			children = (
+				A8F76C3E2D350A9600AA6E93 /* TSPurchaseManager.swift */,
+			);
+			path = Purchase;
+			sourceTree = "<group>";
+		};
+		A8F76C452D3510E700AA6E93 /* NetworkManager */ = {
+			isa = PBXGroup;
+			children = (
+				A8F76C462D3510FA00AA6E93 /* TSNetworkManager.swift */,
+			);
+			path = NetworkManager;
+			sourceTree = "<group>";
+		};
+		A8F774502D3757D300AA6E93 /* SwiftUI */ = {
+			isa = PBXGroup;
+			children = (
+				A8F774512D3757DF00AA6E93 /* Color+Ex.swift */,
+				A8F774532D37581700AA6E93 /* Font+Ex.swift */,
+			);
+			path = SwiftUI;
+			sourceTree = "<group>";
+		};
 		A8F778B52D1BE98D00BF55D5 /* TSLiveWallpaperBrowseVC */ = {
 			isa = PBXGroup;
 			children = (
@@ -690,6 +740,8 @@
 			);
 			mainGroup = A8E56BCB2D1520DD003C54AF;
 			minimizedProjectReferenceProxies = 1;
+			packageReferences = (
+			);
 			productRefGroup = A8E56BD52D1520DD003C54AF /* Products */;
 			projectDirPath = "";
 			projectRoot = "";
@@ -782,8 +834,10 @@
 				A81CA4992D1652C400A3AAC8 /* TSMineVC.swift in Sources */,
 				A8477C992D2291F800DF0B93 /* UserDefault+Ex.swift in Sources */,
 				A8C4C0EF2D27BFF7003C46FC /* TSNetworkTool.swift in Sources */,
+				A8F76C3C2D35026200AA6E93 /* TSPurchaseMembershipVC.swift in Sources */,
 				A81CA46E2D156C7000A3AAC8 /* GlobalImports.swift in Sources */,
 				A87833202D293EEC00E47F2C /* TSSimpleTableView.swift in Sources */,
+				A8F774522D3757E700AA6E93 /* Color+Ex.swift in Sources */,
 				A81F5B4D2D1965F800740085 /* UIImage+Ex.swift in Sources */,
 				A81CA4832D157F5C00A3AAC8 /* UIImageView+Ex.swift in Sources */,
 				A81F5B322D18FA2E00740085 /* Component.swift in Sources */,
@@ -792,6 +846,7 @@
 				A8C4C0E62D268D02003C46FC /* LivePhotoCreater.swift in Sources */,
 				A8C4C0E72D268D02003C46FC /* VideoRecorder.swift in Sources */,
 				A81F5B342D18FA2E00740085 /* CollectionViewComponent.swift in Sources */,
+				A8F76C4D2D3747B400AA6E93 /* TSPurchaseVC.swift in Sources */,
 				A81CA4722D1575B900A3AAC8 /* TSBaseNavigationBarView.swift in Sources */,
 				A81F5B5B2D1A5F2300740085 /* TSHomeTopBannerCell.swift in Sources */,
 				A83946312D1D66A000ABFF0D /* TSTermsServiceVC.swift in Sources */,
@@ -809,6 +864,7 @@
 				A8F778B02D1AC17500BF55D5 /* TSBaseView.swift in Sources */,
 				A81CA49B2D1652CA00A3AAC8 /* TSHomeVC.swift in Sources */,
 				A81CA4B82D16A6BD00A3AAC8 /* View+Ex.swift in Sources */,
+				A8F76C422D350A9600AA6E93 /* TSPurchaseManager.swift in Sources */,
 				A81CA4792D1577E800A3AAC8 /* NSString+Ex.swift in Sources */,
 				A81CA4852D1582A600A3AAC8 /* UIButton+Ex.swift in Sources */,
 				A81CA46B2D156BDC00A3AAC8 /* TSBaseNavigationC.swift in Sources */,
@@ -828,6 +884,7 @@
 				A81CA48B2D15843700A3AAC8 /* TSCommonTool.swift in Sources */,
 				A81CA4AD2D16944B00A3AAC8 /* TSBaseTabViewCell.swift in Sources */,
 				A84C239A2D1E3A4300B61B55 /* GPVideoPlayerView.swift in Sources */,
+				A8F76C472D3510FE00AA6E93 /* TSNetworkManager.swift in Sources */,
 				A84C239B2D1E3A4300B61B55 /* GPVideoClipperController.swift in Sources */,
 				A84C239C2D1E3A4300B61B55 /* GPVideoClipperView.swift in Sources */,
 				A84C239D2D1E3A4300B61B55 /* GPVideoConfigMaker.swift in Sources */,
@@ -859,6 +916,7 @@
 				A8C4C0A72D24218A003C46FC /* LivePhotoUtil.m in Sources */,
 				A8C4C0A82D24218A003C46FC /* Converter4Image.swift in Sources */,
 				A83946432D1D701500ABFF0D /* TSLiveWallpaperCopyrightVC.swift in Sources */,
+				A8F774542D37581F00AA6E93 /* Font+Ex.swift in Sources */,
 				A8C4C0AB2D2427E7003C46FC /* LivePhotoConverter.swift in Sources */,
 				A81F5B3C2D19087100740085 /* TSRandomWallpaperCell.swift in Sources */,
 				A81F5B442D19559C00740085 /* EditorVideoControlViewCell.swift in Sources */,
@@ -890,7 +948,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 12;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_APP_SANDBOX = NO;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
@@ -901,12 +959,12 @@
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
 				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
 				INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
-				IPHONEOS_DEPLOYMENT_TARGET = 15.6;
+				IPHONEOS_DEPLOYMENT_TARGET = 15.0;
 				LD_RUNPATH_SEARCH_PATHS = (
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.0.0;
+				MARKETING_VERSION = 1.2;
 				PRODUCT_BUNDLE_IDENTIFIER = musicplayer.offline.com;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";
@@ -929,7 +987,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 12;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_APP_SANDBOX = NO;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
@@ -940,12 +998,12 @@
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
 				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
 				INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
-				IPHONEOS_DEPLOYMENT_TARGET = 15.6;
+				IPHONEOS_DEPLOYMENT_TARGET = 15.0;
 				LD_RUNPATH_SEARCH_PATHS = (
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.0.0;
+				MARKETING_VERSION = 1.2;
 				PRODUCT_BUNDLE_IDENTIFIER = musicplayer.offline.com;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";

+ 9 - 2
TSLiveWallpaper/AppDelegate.swift

@@ -16,9 +16,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
         window = UIWindow(frame: UIScreen.main.bounds)
         window?.backgroundColor = UIColor.white
         window?.makeKeyAndVisible()
-
         initAdMob()
-
+        addNetListener()
         goToTab()
         return true
     }
@@ -37,6 +36,14 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
         _ = TSImageDataCenter.shared
         window?.rootViewController = TSLaunchVC()
     }
+    
+    func addNetListener(){
+        TSNetworkShard.monitorNetworkPermission { success in
+            if success {
+                PurchaseManager.default.requestProducts()
+            }
+        }
+    }
 }
 
 extension AppDelegate {

+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Common/check.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "check@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "check@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Common/check.imageset/check@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Common/check.imageset/check@3x.png


+ 6 - 0
TSLiveWallpaper/Assets.xcassets/Vip/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Vip/close_gray.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "close_gray@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "close_gray@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Vip/close_gray.imageset/close_gray@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/close_gray.imageset/close_gray@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Vip/lIvelivepro.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "lIvelivepro@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "lIvelivepro@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Vip/lIvelivepro.imageset/lIvelivepro@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/lIvelivepro.imageset/lIvelivepro@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Vip/livelive.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "livelive@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "livelive@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Vip/livelive.imageset/livelive@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/livelive.imageset/livelive@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Vip/noVip_big_bg.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "noVip_big_bg@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "noVip_big_bg@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Vip/noVip_big_bg.imageset/noVip_big_bg@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/noVip_big_bg.imageset/noVip_big_bg@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Vip/vip_big_bg.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "vip_big_bg@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "vip_big_bg@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Vip/vip_big_bg.imageset/vip_big_bg@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/vip_big_bg.imageset/vip_big_bg@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Vip/vip_big_icon.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "vip_big_icon@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "vip_big_icon@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Vip/vip_big_icon.imageset/vip_big_icon@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/vip_big_icon.imageset/vip_big_icon@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Vip/vip_icon.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "vip_icon@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "vip_icon@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Vip/vip_icon.imageset/vip_icon@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/vip_icon.imageset/vip_icon@3x.png


+ 32 - 11
TSLiveWallpaper/Business/TSEditLiveVC/TSEditLiveEidtCell.swift

@@ -49,6 +49,18 @@ class TSEditLiveItemModel: CollectionViewCellComponent {
 class TSEditLiveEidtCell : TSBaseCollectionCell , ComponentView{
     
     var component:CollectionViewComponent?
+    lazy var diyBtn: UIButton = {
+        let diyBtn: UIButton = TSViewTool.createNormalSubmitBtn(title: getVipText(), imageNamed: "edit_black") { [weak self]  in
+            guard let self = self else { return }
+            if let component = self.component {
+                if let itemActionHandler = component.itemActionHandler {
+                    itemActionHandler(self, IndexPath(row: 0, section: 0))
+                }
+            }
+        }
+        diyBtn.cornerRadius = 30
+        return diyBtn
+    }()
     
     override func creatUI() {
         let topEditView = creatTopEditVideoView()
@@ -59,6 +71,9 @@ class TSEditLiveEidtCell : TSBaseCollectionCell , ComponentView{
         }
     }
     
+    override func dealThings() {
+        NotificationCenter.default.addObserver(self, selector: #selector(vipInfoChanged), name: .kPurchaseDidChanged, object: nil)
+    }
     
     func creatTopEditVideoView() -> UIView {
         
@@ -81,17 +96,6 @@ class TSEditLiveEidtCell : TSBaseCollectionCell , ComponentView{
             make.height.equalTo(16)
         }
         
-        let diyBtn: UIButton = TSViewTool.createNormalSubmitBtn(title: "DIY Live Wallpaper".localized, imageNamed: "edit_black") { [weak self]  in
-            guard let self = self else { return }
-  
-            if let component = self.component {
-                if let itemActionHandler = component.itemActionHandler {
-                    itemActionHandler(self, IndexPath(row: 0, section: 0))
-                }
-            }
-        }
-        
-        diyBtn.cornerRadius = 30
         bgView.addSubview(diyBtn)
         diyBtn.snp.makeConstraints { make in
             make.leading.equalTo(16)
@@ -105,7 +109,24 @@ class TSEditLiveEidtCell : TSBaseCollectionCell , ComponentView{
     
     func renderView(with object: Any?, component: CollectionViewComponent, attributes: [String : Any]?) {
         self.component = component
+        diyBtn.setTitle(getVipText(), for: .normal)
     }
     
+    
+    func getVipText()->String{
+        if kPurchaseDefault.isVip {
+            return "DIY Live Wallpaper"
+        }
+        return "DIY Live Wallpaper (\(kPurchaseDefault.freeNum))"
+    }
 
+    deinit {
+        NotificationCenter.default.removeObserver(self)
+    }
+    
+    @objc func vipInfoChanged() {
+        kExecuteOnMainThread {
+            self.diyBtn.setTitle(self.getVipText(), for: .normal)
+        }
+    }
 }

+ 27 - 7
TSLiveWallpaper/Business/TSEditLiveVC/TSEditLiveVC.swift

@@ -44,6 +44,17 @@ class TSEditLiveVC: TSBaseVC, UINavigationControllerDelegate {
         
         cp.itemActionHandler = { [weak self] cellCp, indexPath in
             guard let self = self else { return }
+            
+            //判断 vip
+            if kPurchaseDefault.freeNumAvailable() == false{
+                TSPurchaseVC.show(target: self) {[weak self] in
+                    guard let self = self else { return }
+                    reloadView()
+                }
+                return
+            }
+            
+            //生成视频
             self.openVideoPicker()
         }
         
@@ -103,7 +114,7 @@ class TSEditLiveVC: TSBaseVC, UINavigationControllerDelegate {
 import UniformTypeIdentifiers
 extension TSEditLiveVC: UIImagePickerControllerDelegate {
     func openVideoPicker() {
-        TSToastShared.showLoading(in: self.view)
+        TSToastShared.showLoading()
         let picker = UIImagePickerController()
         picker.sourceType = .photoLibrary
         picker.mediaTypes =  [UTType.movie.identifier] // 仅允许选择视频
@@ -111,13 +122,13 @@ extension TSEditLiveVC: UIImagePickerControllerDelegate {
         picker.delegate = self
         picker.videoMaximumDuration = 3.0
         present(picker, animated: true) {
-            TSToastShared.hideLoading()
+            self.hideLoading()
         }
     }
     // 用户完成选择
     func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
         
-        TSToastShared.hideLoading()
+        hideLoading()
         if let editedURL = info[.mediaURL] as? URL {
             debugPrint("Selected video: \(editedURL)")
             // 在这里处理选中的视频(例如上传或保存)
@@ -142,9 +153,18 @@ extension TSEditLiveVC: UIImagePickerControllerDelegate {
 
     // 用户取消选择
     func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
-        TSToastShared.hideLoading()
+        hideLoading()
         picker.dismiss(animated: true, completion: nil)
     }
+    
+    
+    func hideLoading(){
+        
+        kDelayMainShort {
+            TSToastShared.hideLoading()
+        }
+    
+    }
 }
 
 extension TSEditLiveVC{
@@ -180,7 +200,7 @@ extension TSEditLiveVC{
                     LivePhotoConverter.saveToLibrary(videoURL: videoURL, imageURL: imageURL) { success in
                         kSavePhotoSuccesswShared.show(atView: self.view,text: "DIY Successfully".localized)
                     }
-                    
+                    kPurchaseDefault.useOnceForFree()
                     
                     let saveURL = TSFileManagerTool.saveLiveVideoPathURL
                     let timestampString = Date.timestampString
@@ -222,7 +242,7 @@ extension TSEditLiveVC{
 //                if let resources = resources {
 //                    LivePhoto.saveToLibrary(resources, completion: { (success) in
 //                        kExecuteOnMainThread {
-//                            TSToastShared.hideLoading()
+//                            hideLoading()
 //                            if success {
 //                                debugPrint("Live Photo Saved,The live photo was successfully saved to Photos.")
 //                                kSavePhotoSuccesswShared.show(atView: self.view)
@@ -250,7 +270,7 @@ extension TSEditLiveVC{
 //                    if let resources = resources {
 //                        LivePhoto.saveToLibrary(resources, completion: { (success) in
 //                            kExecuteOnMainThread {
-//                                TSToastShared.hideLoading()
+//                                hideLoading()
 //                                if success {
 //                                    debugPrint("Live Photo Saved,The live photo was successfully saved to Photos.")
 //                                    kSavePhotoSuccesswShared.show(atView: self.view)

+ 48 - 6
TSLiveWallpaper/Business/TSHomeVC/TSLiveWallpaperBrowseVC/TSLiveWallpaperBrowseVC.swift

@@ -15,6 +15,7 @@ class TSLiveWallpaperBrowseItemModel {
     var style:ImageDataStyple = .homeLiveList
     var imageUrl:String = ""
     var videoUrl:String = ""
+    var vip:Bool = false
     
     var livePhoto:PHLivePhoto? = nil
     var livePhotoResources:(pairedImage: URL, pairedVideo: URL)?
@@ -35,16 +36,21 @@ class TSLiveWallpaperBrowseVC: TSBaseVC {
     }
     
     private var dataModelArray = [TSLiveWallpaperBrowseItemModel]()
-    var currentIndex:Int
+    var currentIndex:Int {
+        didSet{
+            reloadUI()
+        }
+    }
     init(itemModels: [TSImageDataItemModel],currentIndex:Int) {
-        self.currentIndex = currentIndex
         for itemModel in itemModels {
             let model = TSLiveWallpaperBrowseItemModel()
             model.style = itemModel.style
             model.imageUrl = itemModel.imageUrl
             model.videoUrl = itemModel.videoUrl
+            model.vip = itemModel.vip
             dataModelArray.append(model)
         }
+        self.currentIndex = currentIndex
         super.init()
     }
     
@@ -73,16 +79,36 @@ class TSLiveWallpaperBrowseVC: TSBaseVC {
     lazy var saveBtn: UIButton = {
         let saveBtn = TSViewTool.createNormalSubmitBtn(title: "Save".localized) { [weak self]  in
             guard let self = self else { return }
+            
+            let cell = collectionView.cellForItem(at: IndexPath(item: currentIndex, section: 0)) as? TSLiveWallpaperBrowseCell
+            
+            //判断 vip
+            if let itemModel = self.dataModelArray.safeObj(At: currentIndex),
+               itemModel.vip == true,
+               PurchaseManager.default.isVip == false
+            {
+                cell?.stopPlayLive()
+                TSPurchaseVC.show(target: self) {[weak self]  in
+                    guard let self = self else { return }
+                    cell?.stratPlayLive()
+                }
+                return
+            }
+            
+            
+            //保存图片
             if let cell = collectionView.cellForItem(at: IndexPath(item: currentIndex, section: 0)) as? TSLiveWallpaperBrowseCell {
                 cell.saveLivePhoto { [weak self]  success in
                      guard let self = self else { return }
                     if success {
                         kSavePhotoSuccesswShared.show(atView: self.view)
                     }else{
-                        TSToastShared.showToast(message: "Save Fail".localized)
+                        TSToastShared.showToast(text: "Save Fail".localized)
                     }
                 }
             }
+            
+            
 
         }
         saveBtn.cornerRadius = 24
@@ -232,8 +258,16 @@ class TSLiveWallpaperBrowseVC: TSBaseVC {
         
         kDelayMainShort {
             self.collectionView.setContentOffset(CGPoint(x: CGFloat(self.currentIndex) * self.collectionView.frame.size.width, y: 0), animated: false)
+            
         }
         
+        self.reloadUI()
+    }
+    
+    func reloadUI() {
+        if let itemModel = self.dataModelArray.safeObj(At: currentIndex) {
+            TSViewTool.setNormalSubmitBtn(btn: saveBtn, showVip: itemModel.vip)
+        }
     }
 }
 
@@ -395,6 +429,7 @@ class TSLiveWallpaperBrowseCell : TSBaseCollectionCell,PHLivePhotoViewDelegate{
     
     private let showImageViewW = k_ScreenWidth - 32
     private let livePhotoTool = LivePhoto()
+    private var isCanPlay = true
     lazy var livePhotoView: PHLivePhotoView = {
         let liveIv = PHLivePhotoView()
         liveIv.delegate = self
@@ -540,7 +575,9 @@ class TSLiveWallpaperBrowseCell : TSBaseCollectionCell,PHLivePhotoViewDelegate{
     }
     
     func livePhotoView(_ livePhotoView: PHLivePhotoView, didEndPlaybackWith playbackStyle: PHLivePhotoViewPlaybackStyle) {
-        if !livePhotoView.isHidden {
+//        if !livePhotoView.isHidden {
+        if self.isCanPlay {
+            debugPrint("startPlayback")
             kDelayOnMainThread(1.0) {
                 livePhotoView.startPlayback(with: .full)
             }
@@ -577,11 +614,11 @@ class TSLiveWallpaperBrowseCell : TSBaseCollectionCell,PHLivePhotoViewDelegate{
 //        }
 
         guard let videoCacheUrl = itemModel?.videoCacheUrl, let imageCacheUrl = itemModel?.imageCacheUrl else{
-            TSToastShared.showToast(message: "save fail")
+            TSToastShared.showToast(text: "save fail")
             return
         }
         
-        TSToastShared.showLoading(in: self.contentView)
+        TSToastShared.showLoading()
         if videoCacheUrl.path.contains("/saveVideo/") {
             LivePhotoConverter.saveToLibrary(videoURL: videoCacheUrl, imageURL: imageCacheUrl) { success in
                 kExecuteOnMainThread {
@@ -622,13 +659,18 @@ class TSLiveWallpaperBrowseCell : TSBaseCollectionCell,PHLivePhotoViewDelegate{
     }
     
     func stopPlayLive() {
+        debugPrint("stopPlayLive")
+        self.isCanPlay = false
         livePhotoView.isHidden = true
         livePhotoView.stopPlayback()
     }
     
     func stratPlayLive() {
+        debugPrint("stratPlayLive")
+        self.isCanPlay = true
         self.livePhotoView.isHidden = false
         self.livePhotoView.startPlayback(with: .full)
+        
     }
     
 

+ 92 - 2
TSLiveWallpaper/Business/TSMineVC/TSMineVC.swift

@@ -20,10 +20,73 @@ class TSMineVC: TSBaseVC {
     }()
     
     
+    
+    lazy var vipBgImageView: UIImageView = {
+        let vipBgImageView = UIImageView.createImageView(imageName: "noVip_big_bg",contentMode:.scaleToFill)
+        vipBgImageView.isUserInteractionEnabled = true
+        return vipBgImageView
+    }()
+    
+    
+    lazy var vipTimeLabel: UILabel = {
+        let vipTimeLabel = UILabel.createLabel(text: "Limited Time Discount",font: .font(size: 14),textColor: .lesserText)
+        return vipTimeLabel
+    }()
+    
+    lazy var upgradeBtn: UIButton = {
+        let upgradeBtn = TSViewTool.createNormalSubmitBtn(title: "Upgrade".localized) { [weak self]  in
+            guard let self = self else { return }
+            TSPurchaseVC.show(target: self) {[weak self]  in
+                guard let self = self else { return }
+                updateVipView()
+            }
+        }
+        upgradeBtn.cornerRadius = 13
+        upgradeBtn.titleLabel?.font = .font(size: 14)
+        return upgradeBtn
+    }()
+    
+    lazy var headerView: UIView = {
+        let headerView = UIView()
+        headerView.frame = CGRect(x: 0, y: 0, width: k_ScreenWidth, height: 88)
+        headerView.addSubview(vipBgImageView)
+        vipBgImageView.snp.makeConstraints { make in
+            make.top.equalTo(0)
+            make.leading.trailing.bottom.equalTo(0)
+        }
+        
+        let liveImageView = UIImageView.createImageView(imageName: "livelive")
+        vipBgImageView.addSubview(liveImageView)
+        liveImageView.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.top.equalTo(19)
+        }
+        
+        vipBgImageView.addSubview(vipTimeLabel)
+        vipTimeLabel.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.bottom.equalTo(-19)
+            make.height.equalTo(14.0)
+        }
+        
+        vipBgImageView.addSubview(upgradeBtn)
+        upgradeBtn.snp.makeConstraints { make in
+            make.width.equalTo(86)
+            make.height.equalTo(26)
+            make.trailing.equalTo(-29)
+            make.centerY.equalToSuperview()
+        }
+        
+
+        return headerView
+    }()
+    
+    
     lazy var simpleTableView:TSSimpleTableView = {
         let simpleTableView = TSSimpleTableView()
         simpleTableView.reuseClass = ["TSMineCell"]
         simpleTableView.dataArray = dataArray
+        simpleTableView.tableView.tableHeaderView = headerView
         return simpleTableView
     }()
     
@@ -63,7 +126,7 @@ class TSMineVC: TSBaseVC {
                 guard let self = self else { return }
 
                 let httpAppStoreLink = "https://apps.apple.com/app/id\(TSConfig.appid)"
-                let text = "I'm using Sweeter to decorate my phone, there are not only themes, wallpapers, widgets, but also dynamic island and super useful tools, come and try with me!".localized
+                let text = ""
                 let url = URL(string: httpAppStoreLink)!
                 let image = UIImage(named: "App-Icon")!
                 let vc = UIActivityViewController(activityItems: [image, text, url], applicationActivities: nil)
@@ -124,7 +187,14 @@ class TSMineVC: TSBaseVC {
             height: 80,
             rectCorner:.allCorners,
             tapBlock: {[weak self] itemModel, index, view  in
+                guard let self = self else { return }
 
+#if DEBUG
+                let vc = TSPurchaseVC()
+                vc.hidesBottomBarWhenPushed = true
+                kPresentModalVC(target: self, modelVC: vc)
+#endif
+                
             }))
         
         return dataArray
@@ -144,7 +214,27 @@ class TSMineVC: TSBaseVC {
         simpleTableView.tableView.snp.makeConstraints { make in
             make.leading.equalTo(16)
             make.trailing.equalTo(-16)
-            make.top.bottom.equalTo(0)
+            make.top.equalTo(16)
+            make.bottom.equalTo(0)
+        }
+    }
+    
+    override func viewWillAppear(_ animated: Bool) {
+        updateVipView()
+    }
+    
+    func updateVipView(){
+        vipTimeLabel.text = PurchaseManager.default.expiredDateString
+        vipBgImageView.image =  UIImage(named: PurchaseManager.default.isVip ? "vip_big_bg" : "noVip_big_bg")
+        
+        if PurchaseManager.default.isVip {
+            vipTimeLabel.text = "Due Date: \(PurchaseManager.default.expiredDateString)"
+            vipBgImageView.image =  UIImage(named: "vip_big_bg")
+            upgradeBtn.isHidden = true
+        }else{
+            vipTimeLabel.text = "Limited Time Discount"
+            vipBgImageView.image =  UIImage(named:"noVip_big_bg")
+            upgradeBtn.isHidden = false
         }
     }
 }

+ 426 - 0
TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSPurchaseMembershipVC.swift

@@ -0,0 +1,426 @@
+//
+//  TSPurchaseMembershipVC.swift
+//  TSLiveWallpaper
+//
+//  Created by 100Years on 2025/1/13.
+//
+
+class TSPurchaseMembership111VC: TSBaseVC {
+    
+    var closePageBlock:(()->Void)?
+    var buyPeriod:PremiumPeriod = .year
+    lazy var purchaseManager: PurchaseManager = {
+        let purchaseManager = PurchaseManager.default
+        return purchaseManager
+    }()
+    
+    lazy var yearCell: TSPurchaseMembershipCell = {
+        let yearCell = TSPurchaseMembershipCell()
+        yearCell.titleLabel.text = "Year".localized
+        yearCell.priceLabel.text = purchaseManager.price(for: .year)
+        yearCell.selectedImageView.isHidden = false
+        yearCell.onTapd = { [weak self]  in
+            guard let self = self else { return }
+            monthCell.selectedImageView.isHidden = true
+            buyPeriod = .year
+        }
+        return yearCell
+    }()
+    
+    lazy var monthCell: TSPurchaseMembershipCell = {
+        let monthCell = TSPurchaseMembershipCell()
+        monthCell.titleLabel.text = "Month".localized
+        monthCell.priceLabel.text = purchaseManager.price(for: .month)
+        monthCell.onTapd = { [weak self]  in
+            guard let self = self else { return }
+            yearCell.selectedImageView.isHidden = true
+            buyPeriod = .month
+        }
+        return monthCell
+    }()
+    
+    lazy var submitBtn: UIButton = {
+        let submitBtn = TSViewTool.createNormalSubmitBtn(title: "Continue") { [weak self]  in
+            guard let self = self else { return }
+            
+            purchaseManager.pay(for: buyPeriod)
+            
+        }
+        submitBtn.cornerRadius = 24.0
+        return submitBtn
+    }()
+
+    lazy var textLabel: UILabel = {
+        let label = UILabel()
+        label.numberOfLines = 0
+        label.textAlignment = .center
+        label.font = .font(size: 8)
+        label.textColor = UIColor.fromHex("#FFFFFF",alpha: 0.4)
+        let fullText = "Recurring billing, cancel anytime. Payment will be charged to your iTunes account at confirmation of purchase. Subscriptions automatically renew for the same applicable term and price, unless auto-renew is turned off at least 24 hours before the end of the current period."
+        let highlightedText = "Recurring billing, cancel anytime."
+        let attributedString = NSMutableAttributedString(string: fullText)
+        if let range = fullText.range(of: highlightedText) {
+            let nsRange = NSRange(range, in: fullText)
+            attributedString.addAttributes([
+                .foregroundColor: UIColor.fromHex("#12FFF7"), // 高亮颜色
+            ], range: nsRange)
+        }
+        label.attributedText = attributedString
+        return label
+    }()
+    
+    override func createView() {
+        addNormalNavBarView()
+        _ = setNavigationItem("", imageName: "close_gray", direction: .left, action: #selector(closePage))
+    
+    
+        
+        let topView = creatTopView()
+        contentView.addSubview(topView)
+        topView.snp.makeConstraints { make in
+            make.leading.equalTo(0)
+            make.trailing.equalTo(0)
+            make.top.equalTo(20)
+        }
+        
+        
+        contentView.addSubview(yearCell)
+        contentView.addSubview(monthCell)
+        contentView.addSubview(submitBtn)
+        
+        yearCell.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.trailing.equalTo(-16)
+            make.height.equalTo(74)
+            make.top.equalTo(topView.snp.bottom).offset(72)
+        }
+        
+        monthCell.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.trailing.equalTo(-16)
+            make.height.equalTo(74)
+            make.top.equalTo(yearCell.snp.bottom).offset(12)
+        }
+        
+        submitBtn.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.trailing.equalTo(-16)
+            make.height.equalTo(48)
+            make.top.equalTo(monthCell.snp.bottom).offset(28)
+        }
+        
+        contentView.addSubview(textLabel)
+        textLabel.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.trailing.equalTo(-16)
+            make.height.equalTo(48)
+            make.top.equalTo(submitBtn.snp.bottom).offset(12)
+        }
+        
+        let bottomView = creatBottomLabel()
+        contentView.addSubview(bottomView)
+        bottomView.snp.makeConstraints { make in
+            make.height.equalTo(17)
+            make.centerX.equalToSuperview()
+            make.top.equalTo(textLabel.snp.bottom).offset(8)
+        }
+  
+    }
+    
+    override func dealThings() {
+        purchaseManager.onPurchaseStateChanged = { [weak self] manager,state,object in
+            guard let self = self else { return }
+        
+            DispatchQueue.main.async {
+                switch state {
+                case .none:
+                    break
+                case .loading:
+                    TSToastShared.showLoading(text: "Getting price".localized)
+                case .loadSuccess:
+                    TSToastShared.hideLoading()
+                case .loadFail:
+                    TSToastShared.hideLoading()
+                    let message = "Get price failure, Will automatically retry in 5 seconds".localized
+                    TSToastShared.showToast(text: message)
+                    DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
+                        PurchaseManager.default.requestProducts()
+                    }
+                case .paying:
+                    TSToastShared.showLoading(text: "Purchasing now".localized)
+                case .paySuccess:
+                    TSToastShared.hideLoading()
+                    let loadingText = manager.isVip ? "Congratulation you have become VIP".localized : "Finish".localized
+                    TSToastShared.showToast(text:loadingText)
+                    if manager.isVip {
+                        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
+                            self.closePage()
+                        }
+                    }
+
+                case .payFail:
+                    TSToastShared.hideLoading()
+                    if let str = object as? String {
+                        TSToastShared.showToast(text: str)
+                    }
+                    
+                case .restoreing:
+                    TSToastShared.showLoading(text: "Restoring now".localized)
+                case .restoreSuccess:
+                    TSToastShared.hideLoading()
+                    let loadingText = manager.isVip ? "Congratulation you have become VIP".localized : "Couldn't Restore Subscription".localized
+                    debugPrint(loadingText)
+                    TSToastShared.showToast(text:loadingText)
+                    if manager.isVip {
+                        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
+                            self.closePage()
+                        }
+                    }
+
+                case .restoreFail:
+                    TSToastShared.hideLoading()
+                    let loadingText = (object as? String) ?? "Failed to restore subscribe, please try again".localized
+                    debugPrint(loadingText)
+                    TSToastShared.showToast(text: loadingText)
+                case .verifying:
+                    #if DEBUG
+                    TSToastShared.showLoading(text: "Verifying receipt...".localized)
+                    #endif
+                case .verifySuccess:
+                    break
+                case .verifyFail:
+                #if DEBUG
+                    TSToastShared.hideLoading()
+                    let message = (object as? String) ?? "Verify receipt failed"
+                    TSToastShared.showToast(text:message)
+
+                #endif
+                }
+            }
+            debugPrint("PurchaseManager onPurchaseStateChanged=\(String(describing: state))")
+        }
+        
+
+    }
+    
+    @objc func closePage(){
+        closePageBlock?()
+        TSToastShared.hideLoading()
+        self.dismiss(animated: true)
+    }
+}
+
+
+extension TSPurchaseMembership111VC {
+    
+
+    func creatTopView() -> UIView {
+        
+        let topView = UIView()
+        
+        let vipImageView = UIImageView.createImageView(imageName: "vip_big_icon")
+        topView.addSubview(vipImageView)
+        
+        let liveImageView = UIImageView.createImageView(imageName: "livelive")
+        topView.addSubview(liveImageView)
+        
+        let cell0 = creatCell(text: "All Premium Wallpapers")
+        topView.addSubview(cell0)
+        
+        let cell1 = creatCell(text: "Unlimited Video To Live")
+        topView.addSubview(cell1)
+        
+        let cell2 = creatCell(text: "100% No Ads")
+        topView.addSubview(cell2)
+        
+        
+        
+        vipImageView.snp.makeConstraints { make in
+            make.top.equalTo(0)
+            make.centerX.equalToSuperview()
+            make.width.equalTo(124)
+            make.height.equalTo(102)
+        }
+        
+        liveImageView.snp.makeConstraints { make in
+            make.top.equalTo(vipImageView.snp.bottom).offset(12)
+            make.centerX.equalToSuperview()
+        }
+        
+        cell0.snp.makeConstraints { make in
+            make.top.equalTo(liveImageView.snp.bottom).offset(40)
+            make.leading.equalTo(76)
+            make.trailing.equalTo(-10)
+            make.height.equalTo(24)
+        }
+        
+        cell1.snp.makeConstraints { make in
+            make.top.equalTo(cell0.snp.bottom).offset(18)
+            make.leading.equalTo(76)
+            make.trailing.equalTo(-10)
+            make.height.equalTo(24)
+        }
+        
+        cell2.snp.makeConstraints { make in
+            make.top.equalTo(cell1.snp.bottom).offset(18)
+            make.leading.equalTo(76)
+            make.trailing.equalTo(-10)
+            make.height.equalTo(24)
+            make.bottom.equalToSuperview()
+        }
+        
+        return topView
+    }
+    
+ 
+    func creatCell(text:String) -> UIView {
+        let cellView = UIView()
+        
+        let vipImageView = UIImageView.createImageView(imageName: "check")
+        cellView.addSubview(vipImageView)
+        
+        
+        let label = UILabel.createLabel(text: text,font: .font(size: 16),textColor: .lesserText)
+        cellView.addSubview(label)
+        
+        vipImageView.snp.makeConstraints { make in
+            make.width.height.equalTo(24)
+            make.leading.top.bottom.equalTo(0)
+        }
+        
+        label.snp.makeConstraints { make in
+            make.trailing.top.bottom.equalTo(0)
+            make.leading.equalTo(vipImageView.snp.trailing).offset(8)
+        }
+        
+        return cellView
+    }
+    
+    
+    func creatBottomLabel() -> UIView {
+        let bgView = UIView()
+        
+        let termsLable = UILabel.createLabel(text: " Terms of us  ".localized,font: .font(size: 12),textColor: .textAssist)
+        termsLable.isUserInteractionEnabled = true
+        termsLable.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(clickTermsLabel)))
+        let privacyLable = UILabel.createLabel(text: "|  Privacy Policy  ".localized,font: .font(size: 12),textColor: .textAssist)
+        privacyLable.isUserInteractionEnabled = true
+        privacyLable.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(clickPrivacyLable)))
+        let restoreLable = UILabel.createLabel(text: "|  Restore   ".localized,font: .font(size: 12),textColor: .textAssist)
+        restoreLable.isUserInteractionEnabled = true
+        restoreLable.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(clickRestoreLable)))
+        
+        bgView.addSubview(termsLable)
+        termsLable.snp.makeConstraints { make in
+            make.leading.top.bottom.equalTo(0)
+        }
+        
+        bgView.addSubview(privacyLable)
+        privacyLable.snp.makeConstraints { make in
+            make.leading.equalTo(termsLable.snp.trailing)
+            make.top.bottom.equalTo(0)
+        }
+        
+        bgView.addSubview(restoreLable)
+        restoreLable.snp.makeConstraints { make in
+            make.leading.equalTo(privacyLable.snp.trailing)
+            make.top.bottom.trailing.equalTo(0)
+        }
+        
+        return bgView
+    }
+    
+    
+    @objc func clickTermsLabel() {
+        
+        let vc = TSBusinessWebVC(urlType: .terms)
+        vc.hidesBottomBarWhenPushed = true
+        kPresentModalVC(target: self, modelVC: vc)
+    }
+    
+    @objc func clickPrivacyLable() {
+        let vc = TSBusinessWebVC(urlType: .privacy)
+        vc.hidesBottomBarWhenPushed = true
+        kPresentModalVC(target: self, modelVC: vc)
+    }
+    
+    @objc func clickRestoreLable() {
+        purchaseManager.restorePremium()
+    }
+    
+}
+
+
+
+
+
+class TSPurchaseMembershipCell: TSBaseView {
+    
+    
+    var onTapd:(()->Void)?
+    
+    
+    lazy var titleLabel: UILabel = {
+        let titleLabel = UILabel.createLabel(font: .font(size: 14),textColor: .textAssist)
+        return titleLabel
+    }()
+    
+    lazy var priceLabel: UILabel = {
+        let titleLabel = UILabel.createLabel(font: .font(size: 18,weight: .medium),textColor: .mainText)
+        return titleLabel
+    }()
+    
+    
+    lazy var selectedImageView: UIImageView = {
+        let selectedImageView = UIImageView.createImageView(imageName: "radiobox_selected")
+        selectedImageView.isHidden = true
+        return selectedImageView
+    }()
+    
+    override func creatUI() {
+        contentView.backgroundColor = .fromHex("FFFFFF", alpha: 0.1)
+        contentView.layer.cornerRadius = 16.0
+        contentView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(clickBg)))
+        contentView.addSubview(titleLabel)
+        contentView.addSubview(priceLabel)
+        contentView.addSubview(selectedImageView)
+        
+        titleLabel.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.top.equalTo(15)
+            make.height.equalTo(14)
+        }
+        
+        priceLabel.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.bottom.equalTo(-15)
+            make.height.equalTo(18)
+        }
+        
+        selectedImageView.snp.makeConstraints { make in
+            make.trailing.equalTo(-16)
+            make.centerY.equalToSuperview()
+            make.width.height.equalTo(24)
+        }
+    }
+    
+    @objc func clickBg(){
+        selectedImageView.isHidden = false
+        onTapd?()
+    }
+    
+}
+
+extension TSPurchaseMembership111VC{
+    
+    static func show(target:UIViewController,closePageBlock:(()->Void)?){
+//        let vc = TSPurchaseMembershipVC()
+//        vc.closePageBlock = closePageBlock
+//        let navi = TSBaseNavigationC(rootViewController: vc)
+//        navi.modalPresentationStyle = .overFullScreen
+//        target.present(navi, animated: true)
+    }
+
+}
+
+

+ 327 - 0
TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSPurchaseVC.swift

@@ -0,0 +1,327 @@
+//
+//  TSPurchaseVC.swift
+//  TSLiveWallpaper
+//
+//  Created by 100Years on 2025/1/14.
+//
+
+import Combine
+import SwiftUI
+
+class PurchaseViewModel : ObservableObject{
+    
+    @Published var selectedType: PremiumPeriod = .lifetime
+    
+    /// 订阅publisher
+    let buyPublisher  = PassthroughSubject<Bool,Never>()
+    /// 隐私
+    let privacyPublisher = PassthroughSubject<Bool, Never>()
+    /// term
+    let termPublisher = PassthroughSubject<Bool, Never>()
+    /// restore
+    let restorePublisher = PassthroughSubject<Bool, Never>()
+}
+
+
+class TSPurchaseVC: TSBaseVC {
+    
+    var closePageBlock:(()->Void)?
+    
+    var viewModel: PurchaseViewModel = .init()
+    var cancellabel: [AnyCancellable] = []
+    var buyPeriod:PremiumPeriod = .year
+    lazy var purchaseManager: PurchaseManager = {
+        let purchaseManager = PurchaseManager.default
+        return purchaseManager
+    }()
+    
+    lazy var hostVc: UIHostingController<PurchaseView> = {
+        let vc = UIHostingController(rootView: PurchaseView(viewModel: viewModel))
+        vc.view.backgroundColor = .clear
+        return vc
+    }()
+    
+    override func createView() {
+        addNormalNavBarView()
+        _ = setNavigationItem("", imageName: "close_gray", direction: .left, action: #selector(closePage))
+        setViewBgImageNamed(named: "view_main_bg")
+        
+        contentView.addSubview(hostVc.view)
+        hostVc.view.snp.makeConstraints { make in
+            make.leading.trailing.bottom.top.equalToSuperview()
+        }
+    }
+    
+    override func dealThings() {
+        addNotifaction()
+        onPurchaseStateChanged()
+    }
+    
+    
+    func addNotifaction() {
+
+        viewModel.buyPublisher.receive(on: DispatchQueue.main).sink { [weak self] _ in
+            guard let self = self else {
+                return
+            }
+            PurchaseManager.default.pay(for: self.viewModel.selectedType)
+        }.store(in: &cancellabel)
+
+        viewModel.privacyPublisher.receive(on: DispatchQueue.main).sink { [weak self] _ in
+            guard let self = self else {
+                return
+            }
+            
+            let vc = TSBusinessWebVC(urlType: .privacy)
+            vc.hidesBottomBarWhenPushed = true
+            kPresentModalVC(target: self, modelVC: vc)
+            
+        }.store(in: &cancellabel)
+
+        viewModel.termPublisher.receive(on: DispatchQueue.main).sink { [weak self] _ in
+            guard let self = self else {
+                return
+            }
+            
+            let vc = TSBusinessWebVC(urlType: .terms)
+            vc.hidesBottomBarWhenPushed = true
+            kPresentModalVC(target: self, modelVC: vc)
+
+        }.store(in: &cancellabel)
+
+        viewModel.restorePublisher.receive(on: DispatchQueue.main).sink { _ in
+            PurchaseManager.default.restorePremium()
+        }.store(in: &cancellabel)
+    }
+    
+    
+    func onPurchaseStateChanged(){
+        purchaseManager.onPurchaseStateChanged = { [weak self] manager,state,object in
+            guard let self = self else { return }
+        
+            DispatchQueue.main.async {
+                switch state {
+                case .none:
+                    break
+                case .loading:
+                    TSToastShared.showLoading(text: "Getting price".localized)
+                case .loadSuccess:
+                    TSToastShared.hideLoading()
+                case .loadFail:
+                    TSToastShared.hideLoading()
+                    let message = "Get price failure, Will automatically retry in 5 seconds".localized
+                    TSToastShared.showToast(text: message)
+                    DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
+                        PurchaseManager.default.requestProducts()
+                    }
+                case .paying:
+                    TSToastShared.showLoading(text: "Purchasing now".localized)
+                case .paySuccess:
+                    TSToastShared.hideLoading()
+                    let loadingText = manager.isVip ? "Congratulation you have become VIP".localized : "Finish".localized
+                    TSToastShared.showToast(text:loadingText)
+                    if manager.isVip {
+                        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
+                            self.closePage()
+                        }
+                    }
+
+                case .payFail:
+                    TSToastShared.hideLoading()
+                    if let str = object as? String {
+                        TSToastShared.showToast(text: str)
+                    }
+                    
+                case .restoreing:
+                    TSToastShared.showLoading(text: "Restoring now".localized)
+                case .restoreSuccess:
+                    TSToastShared.hideLoading()
+                    let loadingText = manager.isVip ? "Congratulation you have become VIP".localized : "Couldn't Restore Subscription".localized
+                    debugPrint(loadingText)
+                    TSToastShared.showToast(text:loadingText)
+                    if manager.isVip {
+                        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
+                            self.closePage()
+                        }
+                    }
+
+                case .restoreFail:
+                    TSToastShared.hideLoading()
+                    let loadingText = (object as? String) ?? "Failed to restore subscribe, please try again".localized
+                    debugPrint(loadingText)
+                    TSToastShared.showToast(text: loadingText)
+                case .verifying:
+                    #if DEBUG
+                    TSToastShared.showLoading(text: "Verifying receipt...".localized)
+                    #endif
+                case .verifySuccess:
+                    break
+                case .verifyFail:
+                #if DEBUG
+                    TSToastShared.hideLoading()
+                    let message = (object as? String) ?? "Verify receipt failed"
+                    TSToastShared.showToast(text:message)
+
+                #endif
+                }
+            }
+            debugPrint("PurchaseManager onPurchaseStateChanged=\(String(describing: state))")
+        }
+    }
+    
+    @objc func closePage(){
+        closePageBlock?()
+        TSToastShared.hideLoading()
+        self.dismiss(animated: true)
+    }
+    
+    
+    deinit {
+        cancellabel.removeAll()
+    }
+}
+
+
+
+
+
+
+
+extension TSPurchaseVC{
+    
+    static func show(target:UIViewController,closePageBlock:(()->Void)?){
+        let vc = TSPurchaseVC()
+        vc.closePageBlock = closePageBlock
+        let navi = TSBaseNavigationC(rootViewController: vc)
+        navi.modalPresentationStyle = .overFullScreen
+        target.present(navi, animated: true)
+    }
+
+}
+
+
+struct PurchaseView :View {
+    
+    @ObservedObject var viewModel: PurchaseViewModel
+    
+    var body: some View {
+        ScrollView {
+            Spacer().frame(height: 20)
+            
+            VStack {
+                Image("vip_big_icon").resizable().frame(width: 124, height: 102)
+                Spacer().frame(height: 12)
+                Image("lIvelivepro")
+                
+                Spacer().frame(height: 40)
+                
+                ZStack {
+                    VStack(alignment: .leading,spacing: 8) {
+                        HStack(spacing: 8) {
+                            Image("check").resizable().frame(width: 24, height: 24)
+                            Text("All Premium Wallpapers")
+                        }
+                        HStack(spacing: 8) {
+                            Image("check").resizable().frame(width: 24, height: 24)
+                            Text("Unlimited Video To Live")
+                        }
+                        
+                        HStack(spacing: 8) {
+                            Image("check").resizable().frame(width: 24, height: 24)
+                            Text("100% No Ads").multilineTextAlignment(.leading)
+                        }
+                    }.font(.font(size: 16)).foregroundColor(UIColor.lesserText.color)
+                }
+         
+            }
+            
+            Spacer().frame(height: 72)
+            
+            
+            VStack(spacing: 12) {
+                PurchaseItemView(title: "Lifetime", type: .lifetime, selectedType: $viewModel.selectedType).onTapGesture {
+                    viewModel.selectedType = .lifetime
+                }
+                HStack {
+                    PurchaseItemView(title: "Yearly", type: .year, selectedType: $viewModel.selectedType).onTapGesture {
+                        viewModel.selectedType = .year
+                    }
+                    
+                    PurchaseItemView(title: "Monthly", type: .month, selectedType: $viewModel.selectedType).onTapGesture {
+                        viewModel.selectedType = .month
+                    }
+                }
+                
+                Button {
+                    viewModel.buyPublisher.send(true)
+                } label: {
+                    ZStack {
+                        Image("normal_submit_bg").resizable().aspectRatio(contentMode: .fill)
+                        Text("Continue")
+                            .font(.system(size: 16))
+                            .foregroundColor(.hex("#010101"))
+                            
+                    }.frame(maxWidth: .infinity ,maxHeight: 48.0)
+                        .cornerRadius(24.0)
+                }
+            
+                HStack {
+                    Text("Recurring billing, cancel anytime")
+                        .foregroundColor(Color.hex("#12FFF7")) +
+                        Text(", Payment will be charged to your iTunes account at confirmation of purchase. Subscriptions automatically renew for the same applicable term and price, unless auto-renew is turned off at least 24 hours before the end of the current period.")
+                        .foregroundColor(UIColor.lesserText.color)
+                }
+                .multilineTextAlignment(.center).font(.font(size: 8))
+                .onTapGesture {
+                    viewModel.privacyPublisher.send(true)
+                }
+
+                HStack(spacing: 8) {
+                    Text("Term of us")
+                        .onTapGesture {
+                            viewModel.termPublisher.send(true)
+                        }
+                    Text("|")
+                    Text("Privacy Policy")
+                        .onTapGesture {
+                            viewModel.privacyPublisher.send(true)
+                        }
+                    Text("|")
+                    Text("Restore")
+                        .onTapGesture {
+                            viewModel.restorePublisher.send(true)
+                        }
+                }.font(.system(size: 12)).foregroundColor(.hex("#999999"))
+            }.padding(.horizontal)
+        }
+    }
+}
+
+
+struct PurchaseItemView: View {
+    var title: String
+    var type: PremiumPeriod
+    @Binding var selectedType: PremiumPeriod
+
+    var body: some View {
+        ZStack {
+            Color.white.opacity(0.1)
+            HStack {
+                VStack(alignment: .leading, spacing: 8) {
+                    Text(title).font(.font(size: 14)).foregroundColor(UIColor.textAssist.color)
+                    Text(PurchaseManager.default.price(for: type) ?? "--").font(.font(size: 18,weight: .medium)).foregroundColor(UIColor.mainText.color)
+                }
+                Spacer()
+                if type == selectedType {
+                    Image(.radioboxSelected)
+                }
+            }.padding(.horizontal)
+        }
+        .frame(height: 74) // 设置高度
+        .cornerRadius(16.0) // 圆角
+//        .overlay(
+//            RoundedRectangle(cornerRadius: 12)
+//                .stroke(Color.hex("#6EF4F4"), lineWidth: type == selectedType ? 1 : 0) // 边框
+//        )
+    }
+}

+ 41 - 0
TSLiveWallpaper/Business/TSViewTool/PhotoManager.swift → TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSViewTool/PhotoManager.swift

@@ -103,4 +103,45 @@ class PhotoManager {
             completion(success, error)
         }
     }
+    
+    
+    
+    /// 保存图片到相册
+    /// - Parameters:
+    ///   - image: 要保存的 UIImage
+    ///   - completion: 保存结果的回调,返回成功与否和错误信息
+    func saveImageToAlbum(_ image: UIImage, completion: @escaping (Bool, Error?) -> Void) {
+        // 检查相册权限
+        PHPhotoLibrary.requestAuthorization { status in
+            DispatchQueue.main.async {
+                switch status {
+                case .authorized:
+                    // 权限已授权,保存图片
+                    self.save(image: image, completion: completion)
+                case .limited:
+                    // 在受限权限下保存图片
+                    self.save(image: image, completion: completion)
+                case .denied, .restricted:
+                    // 权限被拒绝或受限
+                    completion(false, NSError(domain: "PhotoSaver", code: 1, userInfo: [NSLocalizedDescriptionKey: "Photo Library access is denied."]))
+                case .notDetermined:
+                    // 不会进入这个分支,因为已经请求了权限
+                    completion(false, NSError(domain: "PhotoSaver", code: 2, userInfo: [NSLocalizedDescriptionKey: "Photo Library access not determined."]))
+                @unknown default:
+                    completion(false, NSError(domain: "PhotoSaver", code: 3, userInfo: [NSLocalizedDescriptionKey: "Unknown authorization status."]))
+                }
+            }
+        }
+    }
+
+    /// 保存图片到相册的具体实现
+    private func save(image: UIImage, completion: @escaping (Bool, Error?) -> Void) {
+        PHPhotoLibrary.shared().performChanges({
+            PHAssetChangeRequest.creationRequestForAsset(from: image)
+        }) { success, error in
+            DispatchQueue.main.async {
+                completion(success, error)
+            }
+        }
+    }
 }

+ 24 - 9
TSLiveWallpaper/Business/TSViewTool/TSViewTool.swift → TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSViewTool/TSViewTool.swift

@@ -8,25 +8,40 @@
 class TSViewTool: UIView {
     
     static func createNormalSubmitBtn(title:String, imageNamed:String? = nil, action: (() -> Void)? = nil) -> UIButton {
-        let btn = UIButton.createButton(title:title,image: UIImage(named:imageNamed ?? ""),font: UIFont.font(size: 18,weight: .medium),titleColor:"#010101".color,action: action)
+        let image = UIImage(named:imageNamed ?? "")
+        let btn = UIButton.createButton(title:title,image: image,font: UIFont.font(size: 18,weight: .medium),titleColor:"#010101".color,action: action)
    
-//        var buttonBgImage = UIImage(named: "normal_submit_bg")!
+        var buttonBgImage = UIImage(named: "normal_submit_bg")!
 //        if UIDevice.isPad {
 //            buttonBgImage = buttonBgImage.resizableImage(withCapInsets: UIEdgeInsets(top:24, left: 24, bottom: 24, right: 24), resizingMode: .stretch)
 //        }
-//          btn.setBackgroundImage(buttonBgImage, for: .normal)
+          btn.setBackgroundImage(buttonBgImage, for: .normal)
         
-        kDelayMainShort {
-            btn.addGradientBg(colors: ["#B3FFAB".color.cgColor,"12FFF7".color.cgColor],startPoint: CGPoint(x: 0, y: 1),endPoint: CGPoint(x: 1, y: 0))
-        }
+//        kDelayMainShort {
+//            btn.addGradientBg(colors: ["#B3FFAB".color.cgColor,"12FFF7".color.cgColor],startPoint: CGPoint(x: 0, y: 1),endPoint: CGPoint(x: 1, y: 0))
+//        }
 
-        if imageNamed != nil {
-            //saveBtn.imageEdgeInsets = UIEdgeInsets(top: 0, left: -8, bottom: 0, right: 0)
-            btn.titleEdgeInsets = UIEdgeInsets(top: 0, left: 12, bottom: 0, right: 0)
+        
+        if image != nil {
+            btn.imageEdgeInsets = UIEdgeInsets(top: 0, left: -8, bottom: 0, right: 0)
+            btn.titleEdgeInsets = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 0)
         }
         return btn
     }
     
+    
+    static func setNormalSubmitBtn(btn:UIButton,showVip:Bool) {
+        if showVip{
+            btn.setImage(UIImage(named: "vip_icon"), for: .normal)
+            btn.imageEdgeInsets = UIEdgeInsets(top: 0, left: -8, bottom: 0, right: 0)
+            btn.titleEdgeInsets = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 0)
+        }else{
+            btn.setImage(nil, for: .normal)
+            btn.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
+            btn.titleEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
+        }
+    }
+    
     static func createBlurEffectView(style:UIBlurEffect.Style,backgroundColor:UIColor? = nil) -> UIVisualEffectView {
         let blurEffect = UIBlurEffect(style: style)
         let blurEffectView = UIVisualEffectView(effect: blurEffect)

+ 17 - 4
TSLiveWallpaper/Business/TSRandomWallpaperVC/TSRandomWallpaperBrowseVC/TSRandomWallpaperBrowseVC.swift

@@ -117,9 +117,18 @@ class TSRandomWallpaperBrowseVC: TSBaseVC {
     
     
     lazy var saveBtn: UIButton = {
-        let saveBtn = TSViewTool.createNormalSubmitBtn(title: "Save All".localized) { [weak self]  in
+        let imageNamed = isShowVip() ? "vip_icon" : ""
+        let saveBtn = TSViewTool.createNormalSubmitBtn(title: "Save All".localized,imageNamed: imageNamed) { [weak self]  in
             guard let self = self else { return }
-
+            //判断 vip
+            if self.dataModel.vip == true,PurchaseManager.default.isVip == false{
+                TSPurchaseVC.show(target: self) {[weak self]  in
+                    guard let self = self else { return }
+                }
+                return
+            }
+            
+            //保存图片
             var imageUrlSting:[String] = [String]()
             
             if let indexArray = self.thumbnailView.collectionView.indexPathsForSelectedItems {
@@ -134,7 +143,7 @@ class TSRandomWallpaperBrowseVC: TSBaseVC {
                 return
             }
             
-            TSToastShared.showLoading(in: self.view)
+            TSToastShared.showLoading()
             
             let group = DispatchGroup()
             
@@ -156,7 +165,7 @@ class TSRandomWallpaperBrowseVC: TSBaseVC {
                         if success {
                             kSavePhotoSuccesswShared.show(atView: self.view)
                         } else {
-                            TSToastShared.showToast(message: error?.localizedDescription ?? "Save Failure")
+                            TSToastShared.showToast(text: error?.localizedDescription ?? "Save Failure")
                         }
                     }
                 }
@@ -270,6 +279,10 @@ class TSRandomWallpaperBrowseVC: TSBaseVC {
         let pan = UIPanGestureRecognizer(target: self, action: #selector(onPanGesture(_:)))
         view.addGestureRecognizer(pan)
     }
+    
+    func isShowVip() -> Bool {
+        return self.dataModel.vip
+    }
 }
 
 //MARK: 点击操作

+ 5 - 0
TSLiveWallpaper/Common/BaseClass/TSBaseCollectionCell.swift

@@ -22,6 +22,7 @@ class TSBaseCollectionCell: UICollectionViewCell {
             make.top.leading.trailing.bottom.equalTo(0)
         }
         creatUI()
+        dealThings()
     }
     
     required init?(coder: NSCoder) {
@@ -32,6 +33,10 @@ class TSBaseCollectionCell: UICollectionViewCell {
         
     }
     
+    func dealThings(){
+        
+    }
+    
     deinit {
         debugPrint("<---deinit \(String(describing: self))")
     }

+ 47 - 0
TSLiveWallpaper/Common/Ex/SwiftUI/Color+Ex.swift

@@ -0,0 +1,47 @@
+//
+//  Color+Ex.swift
+//  TSLiveWallpaper
+//
+//  Created by 100Years on 2025/1/14.
+//
+
+import SwiftUI
+
+extension Color {
+    static func hex(_ hex: String) -> Color {
+        let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
+        var int: UInt64 = 0
+        Scanner(string: hex).scanHexInt64(&int)
+
+        let a, r, g, b: UInt64
+        switch hex.count {
+        case 3: // RGB (12-bit)
+            (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)
+        case 6: // RGB (24-bit)
+            (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
+        case 8: // ARGB (32-bit)
+            (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
+        default:
+            (a, r, g, b) = (255, 0, 0, 0)
+        }
+
+        return Self(
+            .sRGB,
+            red: Double(r) / 255,
+            green: Double(g) / 255,
+            blue: Double(b) / 255,
+            opacity: Double(a) / 255
+        )
+    }
+
+    // 随机生成一个颜色
+    static var randomColor: Color {
+        // 随机生成 R, G, B 和 alpha(透明度)值
+        let red = Double.random(in: 0 ... 1)
+        let green = Double.random(in: 0 ... 1)
+        let blue = Double.random(in: 0 ... 1)
+        let alpha = Double.random(in: 0.5 ... 1) // 可选,透明度的范围
+
+        return Color(red: red, green: green, blue: blue, opacity: alpha)
+    }
+}

+ 16 - 0
TSLiveWallpaper/Common/Ex/SwiftUI/Font+Ex.swift

@@ -0,0 +1,16 @@
+//
+//  Font+Ex.swift
+//  TSLiveWallpaper
+//
+//  Created by 100Years on 2025/1/14.
+//
+
+
+import SwiftUI
+extension Font {
+    static func font(name: FontName = .PingFangSC, size: CGFloat, weight: UIFont.Weight = .regular) -> Font {
+        let uiFont =  UIFont.font(name: name,size: size,weight: weight)
+        return Font(uiFont as CTFont)
+    }
+}
+

+ 6 - 1
TSLiveWallpaper/Common/Ex/UIColor+Ex.swift

@@ -6,7 +6,7 @@
 //
 
 import UIKit
-
+import SwiftUI
 extension UIColor {
     /// 返回一个随机颜色
     static var random: UIColor {
@@ -41,4 +41,9 @@ extension UIColor {
         
         return UIColor(red: red, green: green, blue: blue, alpha: alpha)
     }
+    
+    var color: Color {
+        return Color(self)
+    }
+
 }

+ 43 - 0
TSLiveWallpaper/Common/NetworkManager/TSNetworkManager.swift

@@ -0,0 +1,43 @@
+//
+//  TSNetworkManager.swift
+//  TSLiveWallpaper
+//
+//  Created by 100Years on 2025/1/13.
+//
+
+class TSNetworkManager {
+
+    /// 发送 POST 请求
+    /// - Parameters:
+    ///   - urlString: 请求的 URL 字符串
+    ///   - parameters: 请求的参数字典(将自动转换为 JSON)
+    ///   - timeout: 超时时间(默认 30 秒)
+    ///   - completion: 请求完成的回调,返回 `Data?` 和 `Error?`
+    static func postRequest(
+        urlString: String,
+        httpBody: Data?,
+        timeout: TimeInterval = 90,
+        completion: @escaping (Data?, Error?) -> Void
+    ) {
+        // 确保 URL 有效
+        guard let url = URL(string: urlString) else {
+            completion(nil, NSError(domain: "Invalid URL", code: -1, userInfo: nil))
+            return
+        }
+        debugPrint("postRequest urlString=",urlString)
+        // 创建请求
+        var request = URLRequest(url: url)
+        request.httpMethod = "POST"
+        request.timeoutInterval = timeout
+        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
+        request.httpBody = httpBody
+  
+        // 创建数据任务
+        let task = URLSession.shared.dataTask(with: request) { data, response, error in
+            completion(data, error)
+        }
+        
+        // 启动任务
+        task.resume()
+    }
+}

+ 550 - 0
TSLiveWallpaper/Common/Purchase/TSPurchaseManager.swift

@@ -0,0 +1,550 @@
+//
+//  TSPurchaseManager.swift
+//  TSLiveWallpaper
+//
+//  Created by 100Years on 2025/1/13.
+//
+
+import Foundation
+import StoreKit
+
+public enum PremiumPeriod: String, CaseIterable {
+    case none           = ""
+    case month          = "Monthly"
+    case year           = "Yearly"
+    case lifetime       = "Lifetime"
+}
+
+public struct PurchaseProduct {
+    public let productId: String
+    public let period: PremiumPeriod
+    
+    public init(productId: String, period: PremiumPeriod) {
+        self.productId = productId
+        self.period = period
+    }
+}
+
+public enum PremiumRequestState {
+    case none
+    
+    case loading
+    case loadSuccess
+    case loadFail
+    
+    case paying
+    case paySuccess
+    case payFail
+    
+    case restoreing
+    case restoreSuccess
+    case restoreFail
+    
+    case verifying
+    case verifySuccess
+    case verifyFail
+}
+
+
+public extension Notification.Name {
+    static let kPurchasePrepared = Self.init("kPurchaseProductPrepared")
+    static let kPurchaseDidChanged = Self.init("kPurchaseDidChanged")
+}
+
+private let kFreeNumKey = "kFreeNumKey"
+private let kPremiumExpiredInfoKey = "premiumExpiredInfoKey"
+
+
+typealias PurchaseStateChangeHandler = (_ manager: PurchaseManager, _ state: PremiumRequestState, _ object: Any?) -> Void
+
+let kPurchaseDefault = PurchaseManager.default
+public class PurchaseManager: NSObject {
+    @objc public static let `default` = PurchaseManager()
+
+    //苹果共享密钥
+    private let AppleSharedKey:String = "155c8104e2b041c0abae43ace199124c"
+    
+    //商品信息
+    public lazy var purchaseProducts:[PurchaseProduct] = {
+        return [PurchaseProduct(productId: "1001", period:.month),
+                PurchaseProduct(productId: "1002", period: .year),
+                PurchaseProduct(productId: "003", period: .lifetime),
+        ]
+    }()
+
+    struct Config {
+        static let verifyUrl = "https://buy.itunes.apple.com/verifyReceipt"
+        static let sandBoxUrl = "https://sandbox.itunes.apple.com/verifyReceipt"
+    }
+
+    lazy var products: [SKProduct] = []
+
+    var onPurchaseStateChanged: PurchaseStateChangeHandler?
+
+    // 会员信息
+    var vipInformation: [String: Any] = [:]
+
+    
+    // 免费使用会员转 livew的次数
+    var freeNum:Int = 0
+    
+    //原始订单交易id dict
+    var originalTransactionIdentifierDict:[String:String] = [:]
+    
+    override init() {
+        super.init()
+
+        SKPaymentQueue.default().add(self)
+
+        if let info = UserDefaults.standard.object(forKey: kPremiumExpiredInfoKey) as? [String: Any] {
+            vipInformation = info
+        }
+        
+        initializeForFree()
+    }
+
+    public var expiredDate: Date? {
+        guard let time = vipInformation["expireTime"] as? String else {
+            return nil
+        }
+        return convertExpireDate(from: time)
+    }
+
+    public var expiredDateString: String {
+        if vipType == .lifetime{
+            return "Life Time"
+        } else {
+            if let expDate = expiredDate {
+                let format = DateFormatter()
+                format.locale = .current
+                format.dateFormat = "yyyy-MM-dd"
+                return format.string(from: expDate)
+            } else {
+                return "--"
+            }
+        }
+    }
+
+    private func convertExpireDate(from string: String) -> Date? {
+        if let ts = TimeInterval(string) {
+            let date = Date(timeIntervalSince1970: ts / 1000)
+            return date
+        }
+        return nil
+    }
+
+    @objc public var isVip: Bool {
+//        #if DEBUG
+//        return true
+//        #endif
+        guard let expiresDate = expiredDate else {
+            return false
+        }
+        let todayStart = Calendar.current.startOfDay(for: Date())
+        let todayStartTs = todayStart.timeIntervalSince1970
+        let expiresTs = expiresDate.timeIntervalSince1970
+
+        return expiresTs > todayStartTs
+    }
+
+    public var vipType: PremiumPeriod {
+        guard isVip, let type = vipInformation["type"] as? String else {
+            return .none
+        }
+        return PremiumPeriod(rawValue: type) ?? .none
+    }
+
+    /// 过期时间: 1683277585000 毫秒
+    func updateExpireTime(_ timeInterval: String,
+                          for productId: String) {
+        vipInformation.removeAll()
+        vipInformation["expireTime"] = timeInterval
+        vipInformation["productId"] = productId
+        vipInformation["type"] = period(for: productId).rawValue
+
+        UserDefaults.standard.set(vipInformation, forKey: kPremiumExpiredInfoKey)
+        UserDefaults.standard.synchronize()
+
+        NotificationCenter.default.post(name: .kPurchaseDidChanged, object: nil)
+    }
+
+    // 商品id对应的时间周期
+    func period(for productId: String) -> PremiumPeriod {
+        return purchaseProducts.first(where: { $0.productId == productId })?.period ?? .none
+    }
+
+    // 时间周期对应的商品id
+    func productId(for period: PremiumPeriod) -> String? {
+        return purchaseProducts.first(where: { $0.period == period })?.productId
+    }
+}
+
+// MARK: 商品信息
+
+extension PurchaseManager {
+    public func product(for period: PremiumPeriod) -> SKProduct? {
+        return products.first(where: { $0.productIdentifier == productId(for: period) })
+    }
+
+    // 商品价格
+    public func price(for period: PremiumPeriod) -> String? {
+        guard let product = product(for: period) else {
+            return nil
+        }
+        let formatter = NumberFormatter()
+        formatter.formatterBehavior = NumberFormatter.Behavior.behavior10_4
+        formatter.numberStyle = .currency
+        formatter.locale = product.priceLocale
+        return formatter.string(from: product.price)
+    }
+
+    
+//    public func originalPrice(for period: PremiumPeriod) -> String? {
+//        guard let product = product(for: period) else {
+//            return nil
+//        }
+//        switch period {
+//        case .year, .lifetime:
+//            // 5折
+//            let price = product.price.doubleValue
+//            let calculatePrice = price * 2
+//            let originStr = String(format: "%.2f", calculatePrice)
+//            let originPrice = NSDecimalNumber(string: originStr, locale: product.priceLocale)
+//
+//            let formatter = NumberFormatter()
+//            formatter.formatterBehavior = NumberFormatter.Behavior.behavior10_4
+//            formatter.numberStyle = .currency
+//            formatter.locale = product.priceLocale
+//            return formatter.string(from: originPrice)
+//        default:
+//            return nil
+//        }
+//    }
+}
+
+// MARK: 商品 & 订阅请求
+
+extension PurchaseManager {
+    ///请求商品
+    public func requestProducts() {
+        if !products.isEmpty {
+            purchase(self, didChaged: .loadSuccess, object: nil)
+        }
+
+        purchase(self, didChaged: .loading, object: nil)
+        let productIdentifiers = Set(purchaseProducts.map({ $0.productId }))
+        debugPrint("PurchaseManager requestProducts = \(productIdentifiers)")
+        let request = SKProductsRequest(productIdentifiers: productIdentifiers)
+        request.delegate = self
+        request.start()
+    }
+
+    public func restorePremium() {
+        purchase(self, didChaged: .restoreing, object: nil)
+        SKPaymentQueue.default().restoreCompletedTransactions()
+        debugPrint("PurchaseManager restoreCompletedTransactions")
+    }
+
+    /// 购买支付
+    public func pay(for period: PremiumPeriod) {
+        guard SKPaymentQueue.canMakePayments() else {
+            purchase(self, didChaged: .payFail, object: "Payment failed, please check your payment account")
+            return
+        }
+
+        guard SKPaymentQueue.default().transactions.count <= 0 else {
+            purchase(self, didChaged: .payFail, object: "You have outstanding orders that must be paid for before a new subscription can be placed.")
+            restorePremium()
+            return
+        }
+        if let product = product(for: period) {
+            purchase(self, didChaged: .paying, object: nil)
+            let payment = SKPayment(product: product)
+            SKPaymentQueue.default().add(payment)
+            debugPrint("PurchaseManager pay period = \(period)")
+        }else{
+            purchase(self, didChaged: .payFail, object: "Payment failed, no this item")
+        }
+    }
+}
+
+// MARK: 商品回调
+
+extension PurchaseManager: SKProductsRequestDelegate {
+    public func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
+        let products = response.products
+        self.products = products
+        purchase(self, didChaged: .loadSuccess, object: nil)
+        NotificationCenter.default.post(name: .kPurchasePrepared, object: nil)
+        debugPrint("PurchaseManager productsRequest didReceive = \(products)")
+    }
+
+    public func request(_ request: SKRequest, didFailWithError error: Error) {
+        debugPrint("PurchaseManager productsRequest error = \(error)")
+        purchase(self, didChaged: .loadFail, object: error.localizedDescription)
+    }
+}
+
+// MARK: 订阅回调
+
+extension PurchaseManager: SKPaymentTransactionObserver {
+    public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
+        debugPrint("PurchaseManager paymentQueue transactions.count = \(transactions.count)")
+//        debugPrint("PurchaseManager paymentQueue transactions = \(transactions)")
+        
+        originalTransactionIdentifierDict.removeAll()
+        // 因为只有订阅类的购买项
+        for transaction in transactions {
+
+//            debugPrint("PurchaseManager paymentQueue transactions transactionIdentifier original= \(transaction.original?.transactionIdentifier)")
+//            debugPrint("PurchaseManager paymentQueue transactions transactionIdentifier = \(transaction.transactionIdentifier)")
+//            debugPrint("PurchaseManager paymentQueue transactions transactionIdentifier productIdentifier = \(transaction.payment.productIdentifier)")
+            
+            switch transaction.transactionState {
+            case .purchasing:
+                // Transaction is being added to the server queue.
+                purchase(self, didChaged: .paying, object: nil)
+
+            case .purchased:
+                SKPaymentQueue.default().finishTransaction(transaction)
+                //同样的原始订单,只处理一次.
+                guard judgeWhether(transaction: transaction) else {
+                    break
+                }
+                
+                // Transaction is in queue, user has been charged.  Client should complete the transaction.
+                #if DEBUG
+                    verifyPayResult(transaction: transaction, useSandBox: true)
+                #else
+                    verifyPayResult(transaction: transaction, useSandBox: false)
+                #endif
+                
+                
+            case .failed:
+                
+                SKPaymentQueue.default().finishTransaction(transaction)
+                // Transaction was cancelled or failed before being added to the server queue.
+                var message = "Payment Failed"
+                if let error = transaction.error as? SKError,
+                   error.code == SKError.paymentCancelled {
+                    message = "The subscription was canceled"
+                }
+                purchase(self, didChaged: .payFail, object: message)
+
+            case .restored:
+                SKPaymentQueue.default().finishTransaction(transaction)
+                //同样的原始订单,只处理一次.
+                guard judgeWhether(transaction: transaction) else {
+                    break
+                }
+                
+                // Transaction was restored from user's purchase history.  Client should complete the transaction.
+                if let original = transaction.original,
+                   original.transactionState == .purchased {
+                    #if DEBUG
+                        verifyPayResult(transaction: transaction, useSandBox: true)
+                    #else
+                        verifyPayResult(transaction: transaction, useSandBox: false)
+                    #endif
+                } else {
+                    purchase(self, didChaged: .restoreFail, object: "Failed to restore subscribe, please try again")
+                }
+                
+            case .deferred: // The transaction is in the queue, but its final status is pending external action.
+                break
+            @unknown default:
+                SKPaymentQueue.default().finishTransaction(transaction)
+            }
+        }
+    }
+
+    public func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error) {
+        purchase(self, didChaged: .restoreFail, object: nil)
+    }
+
+    public func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {
+        if let trans = queue.transactions.first(where: { $0.transactionState == .purchased }) {
+            verifyPayResult(transaction: trans, useSandBox: false)
+        } else if queue.transactions.isEmpty {
+            purchase(self, didChaged: .restoreFail, object: "You don't have an active subscription")
+        }
+    }
+    
+    func judgeWhether(transaction:SKPaymentTransaction) -> Bool {
+        let id = transaction.original?.transactionIdentifier
+        if let id = id {
+            if let value = originalTransactionIdentifierDict[id] {
+                return false
+            }
+            originalTransactionIdentifierDict[id] = "1"
+        }
+        return true
+    }
+}
+
+extension PurchaseManager {
+    func verifyPayResult(transaction: SKPaymentTransaction, useSandBox: Bool) {
+        purchase(self, didChaged: .verifying, object: nil)
+
+        guard let url = Bundle.main.appStoreReceiptURL,
+              let receiptData = try? Data(contentsOf: url) else {
+            purchase(self, didChaged: .verifyFail, object: "凭证文件为空")
+            return
+        }
+
+        let requestContents = [
+            "receipt-data": receiptData.base64EncodedString(),
+            "password": AppleSharedKey,
+        ]
+        guard let requestData = try? JSONSerialization.data(withJSONObject: requestContents) else {
+            purchase(self, didChaged: .verifyFail, object: "凭证文件为空")
+            return
+        }
+
+        let verifyUrlString = useSandBox ? Config.sandBoxUrl : Config.verifyUrl
+        TSNetworkManager.postRequest(urlString: verifyUrlString, httpBody: requestData) { [weak self] data, error in
+            guard let self = self else { return }
+            if let data = data,
+               let jsonResponse = try? JSONSerialization.jsonObject(with: data) as? [String: Any] {
+//                debugPrint("PurchaseManager verifyPayResult = \(jsonResponse)")
+                let status = jsonResponse["status"]
+                if let status = status as? String, status == "21007" {
+                    self.verifyPayResult(transaction: transaction, useSandBox: true)
+                } else if let status = status as? Int, status == 21007 {
+                    self.verifyPayResult(transaction: transaction, useSandBox: true)
+                } else if let status = status as? String, status == "0" {
+                    self.handlerPayResult(transaction: transaction, resp: jsonResponse)
+                } else if let status = status as? Int, status == 0 {
+                    self.handlerPayResult(transaction: transaction, resp: jsonResponse)
+                } else {
+                    self.purchase(self, didChaged: .verifyFail, object: "验证结果状态码错误:\(status.debugDescription)")
+                }
+            } else {
+                self.purchase(self, didChaged: .verifyFail, object: "验证结果为空")
+                debugPrint("PurchaseManager 验证结果为空")
+            }
+        }
+        
+        /*
+          21000 App Store无法读取你提供的JSON数据
+          21002 收据数据不符合格式
+          21003 收据无法被验证
+          21004 你提供的共享密钥和账户的共享密钥不一致
+          21005 收据服务器当前不可用
+          21006 收据是有效的,但订阅服务已经过期。当收到这个信息时,解码后的收据信息也包含在返回内容中
+          21007 收据信息是测试用(sandbox),但却被发送到产品环境中验证
+          21008 收据信息是产品环境中使用,但却被发送到测试环境中验证
+          */
+    }
+
+    func handlerPayResult(transaction: SKPaymentTransaction, resp: [String: Any]) {
+        var isLifetime = false
+        // 终生会员
+        if let receipt = resp["receipt"] as? [String: Any],
+           let in_app = receipt["in_app"] as? [[String: Any]] {
+            if let lifetimeProductId = purchaseProducts.first(where: { $0.period == .lifetime })?.productId,
+               let _ = in_app.filter({ ($0["product_id"] as? String) == lifetimeProductId }).first(where: { item in
+                   if let purchase_date = item["purchase_date"] as? String,
+                      !purchase_date.isEmpty {
+                       return true
+                   } else if let purchase_date_ms = item["purchase_date_ms"] as? String,
+                             !purchase_date_ms.isEmpty {
+                       return true
+                   }
+                   return false
+               }) {
+                updateExpireTime(lifetimeExpireTime, for: lifetimeProductId)
+                isLifetime = true
+            }
+        }
+
+        if !isLifetime {
+            let info = resp["latest_receipt_info"] as? [[String: Any]]
+            if let firstItem = info?.first,
+               let expires_date_ms = firstItem["expires_date_ms"] as? String,
+               let productId = firstItem["product_id"] as? String {
+                updateExpireTime(expires_date_ms, for: productId)
+            }
+        }
+
+        DispatchQueue.main.async {
+            if transaction.transactionState == .restored {
+                self.purchase(self, didChaged: .restoreSuccess, object: nil)
+            } else {
+                self.purchase(self, didChaged: .paySuccess, object: nil)
+            }
+        }
+    }
+    
+    // 终生会员过期时间:100年
+    var lifetimeExpireTime: String {
+        let date = Date().addingTimeInterval(100 * 365 * 24 * 60 * 60)
+        return "\(date.timeIntervalSince1970 * 1000)"
+    }
+
+}
+
+public extension PurchaseManager {
+    func canContinue(_ requireVip: Bool) -> Bool {
+        guard requireVip else {
+            return true
+        }
+        return isVip
+    }
+    
+    func purchase(_ manager: PurchaseManager, didChaged state: PremiumRequestState, object: Any?){
+        onPurchaseStateChanged?(manager,state,object)
+    }
+}
+
+
+/// 免费次数
+extension PurchaseManager {
+    /// 使用一次免费次数
+    func useOnceForFree(){
+        if freeNum > 0 {
+            freeNum-=1
+        }else{
+            freeNum=0
+        }
+        saveForFree()
+    }
+    
+    
+    func saveForFree(){
+        UserDefaults.standard.set(String(freeNum), forKey: kFreeNumKey)
+        UserDefaults.standard.synchronize()
+    }
+    
+    func initializeForFree(){
+        if let num = UserDefaults.standard.string(forKey: kFreeNumKey) {
+            freeNum = Int(num) ?? 3
+        }else{
+            freeNum = 3
+            saveForFree()
+        }
+    }
+    
+    /// 免费次数是否可用
+    func freeNumAvailable() -> Bool{
+        if isVip == true {
+            return true
+        }else{
+            if freeNum <= 0 {
+                return false
+            }else{
+                return true
+            }
+        }
+    }
+}
+
+/*
+ 
+ 首先,创建SKProductsRequest对象并使用init(productIdentifiers:)初始化,传入要查询的产品标识符。
+ 然后,调用start()方法开始请求产品信息。
+ 当请求成功时,productsRequest(_:didReceive:)方法会被调用,在这里可以获取产品详细信息并展示给用户(如在界面上显示产品价格、名称等)。如果请求失败,productsRequest(_:didFailWithError:)方法会被调用来处理错误。
+ 当用户决定购买某个产品后,根据产品信息(SKProduct对象)创建SKPayment对象,然后使用SKPaymentQueue的add(_:)方法将支付请求添加到支付队列。
+ 同时,在应用启动等合适的时机,通过SKPaymentQueue的addTransactionObserver(_:)方法添加交易观察者。当支付状态发生变化时,paymentQueue(_:updatedTransactions:)方法会被调用,在这里可以根据交易状态(如购买成功、失败、恢复等)进行相应的处理。
+ 
+ */

+ 12 - 23
TSLiveWallpaper/Common/Tool/TSToastTool.swift

@@ -6,48 +6,37 @@
 //
 
 
-import Toast_Swift
+import SVProgressHUD
 
 let TSToastShared = TSToastTool.shared
 
 class TSToastTool {
     static let shared = TSToastTool()
-    private var activityView: UIView?
 
-    private init() {}
+    private init() {
+        SVProgressHUD.setDefaultStyle(.dark)
+        //如果您想要堆叠 HUD,您可以使用以下方法平衡每个节目通话:
+        //[SVProgressHUD popActivity];
+    }
 
     /// 显示文字提示
-    func showToast(message: String, duration: TimeInterval = 2.0, in view: UIView? = nil) {
+    func showToast(text: String, duration: TimeInterval = 3.0) {
         kExecuteOnMainThread {
-            WindowHelper.getCurrentWindow()?.makeToast(message, duration: duration, position: .center, style: self.defaultStyle())
+            SVProgressHUD.showInfo(withStatus: text)
         }
     }
 
     /// 显示加载动画
-    func showLoading(in view: UIView? = nil) {
+    func showLoading(text:String? = nil) {
         kExecuteOnMainThread {
-            self.hideLoading()
-            WindowHelper.getCurrentWindow()?.makeToastActivity(.center)
+            SVProgressHUD.show(withStatus: text)
         }
     }
 
     /// 隐藏加载动画
     func hideLoading() {
-        kDelayMainShort {
-            WindowHelper.getCurrentWindow()?.hideToastActivity()
+        kExecuteOnMainThread {
+            SVProgressHUD.dismiss()
         }
     }
-
-    /// Toast 默认样式
-    private func defaultStyle() -> ToastStyle {
-       var style = ToastStyle()
-       style.backgroundColor = UIColor.black.withAlphaComponent(0.7)
-       style.messageColor = .white
-       style.messageFont = UIFont.systemFont(ofSize: 14, weight: .medium)
-       style.cornerRadius = 8
-       return style
-    }
-    
-
-    
 }

+ 3 - 3
TSLiveWallpaper/DataManger/Config/TSConfig.swift

@@ -76,16 +76,16 @@ extension UIColor {
     static let sepaLine = UIColor(named: "c_sepa_line")!
     
     /// 主要文字
-    static let mainText = "#010101".toColor()!
+    static let mainText = UIColor.white
     
     /// 次要文字
-    static let lesserText = "#010101".toColor()!
+    static let lesserText = UIColor.fromHex("#FFFFFF", alpha: 0.6)
     
     /// 弱文字
     static let textDisable = "#010101".toColor()!
     
     /// 辅助文字
-    static let textAssist = "#010101".toColor()!
+    static let textAssist = UIColor.fromHex("#FFFFFF", alpha: 0.4)
     
     /// 成功
     static let success = UIColor(named: "c_success")!

+ 2 - 2
TSLiveWallpaper/DataManger/TSHomeDataModel.swift

@@ -59,11 +59,11 @@ class TSHomeBannerDataItemModel: TSBaseModel {
     
     var type:String = ""
     var items:[TSImageDataItemModel] = [TSImageDataItemModel]()
-    
+    var vip:Bool = false
     override func mapping(map: ObjectMapper.Map) {
         type    <- map["type"]
         items   <- map["items"]
-        
+        vip     <- map["vip"]
         style    <- map["style"]
     }
     

+ 4 - 2
TSLiveWallpaper/DataManger/TSImageDataCenter.swift

@@ -252,10 +252,11 @@ class TSImageDataSectionModel: TSBaseModel {
     var type:String = ""
     var items:[TSImageDataItemModel] = [TSImageDataItemModel]()
     var name:String = "Recommend"
+    var vip:Bool = false
     override func mapping(map: ObjectMapper.Map) {
         type    <- map["type"]
         items   <- map["items"]
-        
+        vip     <- map["vip"]
         style    <- map["style"]
     }
     
@@ -294,10 +295,11 @@ class TSImageDataItemModel: TSBaseModel {
     
     var imageUrl:String = ""
     var videoUrl:String = ""
-    
+    var vip:Bool = false
     override func mapping(map: ObjectMapper.Map) {
         imageUrl    <- map["imageUrl"]
         videoUrl    <- map["videoUrl"]
+        vip         <- map["vip"]
         
         style    <- map["style"]
     }

+ 2 - 2
TSLiveWallpaper/DataManger/TSRandomWallpaperModel.swift

@@ -60,11 +60,11 @@ class TSRandomWallpaperDataItemModel: TSBaseModel {
     
     var type:String = ""
     var items:[TSImageDataItemModel] = [TSImageDataItemModel]()
-    
+    var vip:Bool = false
     override func mapping(map: ObjectMapper.Map) {
         type    <- map["type"]
         items   <- map["items"]
-        
+        vip     <- map["vip"]
         style    <- map["style"]
     }
     

+ 52 - 19
TSLiveWallpaper/Resource/Json/response.json

@@ -8,11 +8,13 @@
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/0453f913eb8c0afe69b56d30689f692f.jpg",
-        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/66f4e8863ad8763f656b127d8615b928.mp4"
+        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/66f4e8863ad8763f656b127d8615b928.mp4",
+        "vip":true
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/b24fc7adacecd80dd6456e1507abbdbb.jpg",
-        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/d2da8be0c4fd491d5bdbf5fc1b699007.mp4"
+        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/d2da8be0c4fd491d5bdbf5fc1b699007.mp4",
+        "vip":true
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/832f322e660087c974458503fb84494c.jpg",
@@ -20,7 +22,8 @@
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/233ea1859c998b4f323c494775bdd606.jpg",
-        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/46fbcb6c1497319ee58d66ca3e00ee2a.mp4"
+        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/46fbcb6c1497319ee58d66ca3e00ee2a.mp4",
+        "vip":true
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/80afa89ac595ba4b6733734603b087a8.jpg",
@@ -28,7 +31,8 @@
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/53c50d8f651029c4695f3cd59576fc51.jpg",
-        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/0390d88ddcebc799b346145ac322b4a6.mp4"
+        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/0390d88ddcebc799b346145ac322b4a6.mp4",
+        "vip":true
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/556fba376e4ec189187a40b369ad1e7a.jpg",
@@ -48,7 +52,8 @@
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/2d1ddc459d5e9997809c47dc441142ad.jpg",
-        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/9d4c03374bc65102684c64d477a41350.mp4"
+        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/9d4c03374bc65102684c64d477a41350.mp4",
+        "vip":true
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/2578aa403a91ab81668e5fefd167552a.jpg",
@@ -64,7 +69,8 @@
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/dd114e5f7e38833ff087e97b7c5a41aa.jpg",
-        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/9cb543c68da1ab84d21b83e879d40975.mp4"
+        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/9cb543c68da1ab84d21b83e879d40975.mp4",
+        "vip":true
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/511e9731879efb2bdee06ad6da6c6bfd.jpg",
@@ -84,7 +90,8 @@
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/9ac7b2a300a41fdb5038ad6d9abb9ff9.jpg",
-        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/c08eb9ad5d6d21b9f9fcd056cd479d74.mp4"
+        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/c08eb9ad5d6d21b9f9fcd056cd479d74.mp4",
+        "vip":true
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/93cf27b25fe5e139a1cee645a2b6162f.jpg",
@@ -92,7 +99,8 @@
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/917b1bf83c2f5d2237f1420f0fc1b14a.jpg",
-        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/65c63839ea49bed5e9c13f64e9d1bc57.mp4"
+        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/65c63839ea49bed5e9c13f64e9d1bc57.mp4",
+        "vip":true
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/de3d70e4889cda2de7a3187b022cd07e.jpg",
@@ -116,7 +124,8 @@
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/a2fdf60550e51778dfed6b56ccdc2472.jpg",
-        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/326eea334f1cd48477b2cc1bb1c4ed25.mp4"
+        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/326eea334f1cd48477b2cc1bb1c4ed25.mp4",
+        "vip":true
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/afcd78262bc66652a4ab2bc112dd5a00.jpg",
@@ -140,7 +149,8 @@
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/cb9cf0498a850d5f63d3d03e18e257b7.jpg",
-        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/eb10f29451f8d26f417d83ecddc7b12c.mp4"
+        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/eb10f29451f8d26f417d83ecddc7b12c.mp4",
+        "vip":true
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/18dbf52ae81a62a86f47bd916e9b981a.jpg",
@@ -172,7 +182,8 @@
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/11585873a0e67b0e4a749c44ce24570c.jpg",
-        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/ab281392175b90c31b11d3dcf21276cb.mp4"
+        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/ab281392175b90c31b11d3dcf21276cb.mp4",
+        "vip":true
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/229d6fa2ecb82def7897627dc68e0ec5.jpg",
@@ -196,7 +207,8 @@
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/0fb1c0873cb41f53782f72dbdec1c7c6.jpg",
-        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/1db810521a6dc0a6fdd9fb6aed03b796.mp4"
+        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/1db810521a6dc0a6fdd9fb6aed03b796.mp4",
+        "vip":true
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/5e7a4a06123f42f221ce4f8a8b7307f8.jpg",
@@ -220,7 +232,8 @@
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/670dfeefdffcfe138f829dc8f6bd35a8.jpg",
-        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/ac522e3e72300dd68e8d273dbf06bc38.mp4"
+        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/ac522e3e72300dd68e8d273dbf06bc38.mp4",
+        "vip":true
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/08872d805f0cf437ccbc4f85cd71c870.jpg",
@@ -248,7 +261,8 @@
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/3a023ef033dec8c633ecf4f0a6096c9c.jpg",
-        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/96370c9496fe9d2fad10c2770d6d5700.mp4"
+        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/96370c9496fe9d2fad10c2770d6d5700.mp4",
+        "vip":true
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/e4f73f158359c3bfaed40c236461fbfb.jpg",
@@ -256,7 +270,8 @@
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/b5870c4e1e4a6c848800a4f7d81fe460.jpg",
-        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/3ed09d184b8e7136934f18cc0ccdaa54.mp4"
+        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/3ed09d184b8e7136934f18cc0ccdaa54.mp4",
+        "vip":true
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/bfc6f00ea88a6ec2715bd84dbd729470.jpg",
@@ -280,7 +295,8 @@
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/ee0b63fdc364c842636dec97a5f0030f.jpg",
-        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/9fecd03b121fe73c00649493cb44d821.mp4"
+        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/9fecd03b121fe73c00649493cb44d821.mp4",
+        "vip":true
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/75e46fe93785459522f3143bea9e9e0f.jpg",
@@ -288,7 +304,8 @@
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/e3b221cf3dfd2e806761db342c8f19b8.jpg",
-        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/0bb284d59152f9ace0f26b092730f63f.mp4"
+        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/0bb284d59152f9ace0f26b092730f63f.mp4",
+        "vip":true
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/66df37cd07ff78f72f0532037f8026f6.jpg",
@@ -300,7 +317,8 @@
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/f53763a068908a7c6dc9282402a5b033.jpg",
-        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/d2bf89e9eebbb42b7eeae15f4f86e7c5.mp4"
+        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/d2bf89e9eebbb42b7eeae15f4f86e7c5.mp4",
+        "vip":true
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/c66823ad9454cf400339717ee53165d1.jpg",
@@ -312,7 +330,8 @@
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/21a4a8eb25168c634e1b52066ecaa5e3.jpg",
-        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/98c9d72c5ca37d007fece7a0c69e661b.mp4"
+        "videoUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/98c9d72c5ca37d007fece7a0c69e661b.mp4",
+        "vip":true
       },
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/e58b403c386da300d50c6dc15ee52b0d.jpg",
@@ -393,6 +412,7 @@
   },
   {
     "type": "dog6",
+    "vip": true,
     "items": [
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/b042e132b5e130333136aac3d771221f.jpg"
@@ -495,6 +515,7 @@
   },
   {
     "type": "Sun",
+    "vip": true,
     "items": [
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/0ba953f70a301bb4afdf2f53a85bf9fd.jpg"
@@ -565,6 +586,7 @@
   },
   {
     "type": "cat6",
+    "vip": true,
     "items": [
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/73f43b630f68417b34006467652856f0.jpg"
@@ -635,6 +657,7 @@
   },
   {
     "type": "cat7",
+    "vip": true,
     "items": [
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/e77e940d72f5d768e22d8d57638c676b.jpg"
@@ -705,6 +728,7 @@
   },
   {
     "type": "dog",
+    "vip": true,
     "items": [
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/81beb681d9ffc50406ad34c1616c5e73.jpg"
@@ -772,6 +796,7 @@
   },
   {
     "type": "Flower Sea",
+    "vip": true,
     "items": [
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/549bac645fa30cefdb22d10defb3c929.jpg"
@@ -944,6 +969,7 @@
   },
   {
     "type": "ins5",
+    "vip": true,
     "items": [
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/3808ac8c0c1e341706253abfff6265e5.jpg"
@@ -1046,6 +1072,7 @@
   },
   {
     "type": "flower1",
+    "vip": true,
     "items": [
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/b166203d3ed7697767f21220cb2bb25f.jpg"
@@ -1206,6 +1233,7 @@
   },
   {
     "type": "Christmas Tree",
+    "vip": true,
     "items": [
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/566d69532bb80767f874fb9c28e8a138.jpg"
@@ -1346,6 +1374,7 @@
   },
   {
     "type": "lake",
+    "vip": true,
     "items": [
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/9079fa8fff45d8da44e307e84415c4f6.jpg"
@@ -1556,6 +1585,7 @@
   },
   {
     "type": "cat5",
+    "vip": true,
     "items": [
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/fcc131079612cab7cd9614ed88715bf6.jpg"
@@ -1661,6 +1691,7 @@
   },
   {
     "type": "Cat3",
+    "vip": true,
     "items": [
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/8664b8c97d31ea0694297321f6454625.jpg"
@@ -1763,6 +1794,7 @@
   },
   {
     "type": "heimao2",
+    "vip": true,
     "items": [
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/4c8b6cb6a664aee59aea8f2dc46e1558.jpg"
@@ -1900,6 +1932,7 @@
   },
   {
     "type": "Fish",
+    "vip": true,
     "items": [
       {
         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20241223/34518da0bcedee84fd35681f01459ba5.jpg"