native-update 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/CapacitorNativeUpdate.podspec +18 -0
  2. package/LICENSE +21 -0
  3. package/Readme.md +451 -0
  4. package/android/build.gradle +92 -0
  5. package/android/gradle/wrapper/gradle-wrapper.properties +8 -0
  6. package/android/gradle.properties +17 -0
  7. package/android/proguard-rules.pro +29 -0
  8. package/android/settings.gradle +2 -0
  9. package/android/src/main/AndroidManifest.xml +34 -0
  10. package/android/src/main/java/com/aoneahsan/nativeupdate/AppReviewPlugin.kt +153 -0
  11. package/android/src/main/java/com/aoneahsan/nativeupdate/AppUpdatePlugin.kt +275 -0
  12. package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundNotificationManager.kt +390 -0
  13. package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundUpdateManager.kt +46 -0
  14. package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundUpdatePlugin.kt +333 -0
  15. package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundUpdateWorker.kt +251 -0
  16. package/android/src/main/java/com/aoneahsan/nativeupdate/CapacitorNativeUpdatePlugin.kt +265 -0
  17. package/android/src/main/java/com/aoneahsan/nativeupdate/LiveUpdatePlugin.kt +526 -0
  18. package/android/src/main/java/com/aoneahsan/nativeupdate/NotificationActionReceiver.kt +99 -0
  19. package/android/src/main/java/com/aoneahsan/nativeupdate/SecurityManager.kt +249 -0
  20. package/dist/esm/__tests__/bundle-manager.test.d.ts +1 -0
  21. package/dist/esm/__tests__/bundle-manager.test.js +123 -0
  22. package/dist/esm/__tests__/bundle-manager.test.js.map +1 -0
  23. package/dist/esm/__tests__/config.test.d.ts +1 -0
  24. package/dist/esm/__tests__/config.test.js +69 -0
  25. package/dist/esm/__tests__/config.test.js.map +1 -0
  26. package/dist/esm/__tests__/integration.test.d.ts +1 -0
  27. package/dist/esm/__tests__/integration.test.js +78 -0
  28. package/dist/esm/__tests__/integration.test.js.map +1 -0
  29. package/dist/esm/__tests__/security.test.d.ts +1 -0
  30. package/dist/esm/__tests__/security.test.js +54 -0
  31. package/dist/esm/__tests__/security.test.js.map +1 -0
  32. package/dist/esm/__tests__/version-manager.test.d.ts +1 -0
  33. package/dist/esm/__tests__/version-manager.test.js +45 -0
  34. package/dist/esm/__tests__/version-manager.test.js.map +1 -0
  35. package/dist/esm/app-review/app-review-manager.d.ts +24 -0
  36. package/dist/esm/app-review/app-review-manager.js +195 -0
  37. package/dist/esm/app-review/app-review-manager.js.map +1 -0
  38. package/dist/esm/app-review/index.d.ts +5 -0
  39. package/dist/esm/app-review/index.js +6 -0
  40. package/dist/esm/app-review/index.js.map +1 -0
  41. package/dist/esm/app-review/platform-review-handler.d.ts +20 -0
  42. package/dist/esm/app-review/platform-review-handler.js +138 -0
  43. package/dist/esm/app-review/platform-review-handler.js.map +1 -0
  44. package/dist/esm/app-review/review-conditions-checker.d.ts +22 -0
  45. package/dist/esm/app-review/review-conditions-checker.js +155 -0
  46. package/dist/esm/app-review/review-conditions-checker.js.map +1 -0
  47. package/dist/esm/app-review/review-rate-limiter.d.ts +23 -0
  48. package/dist/esm/app-review/review-rate-limiter.js +164 -0
  49. package/dist/esm/app-review/review-rate-limiter.js.map +1 -0
  50. package/dist/esm/app-review/types.d.ts +41 -0
  51. package/dist/esm/app-review/types.js +2 -0
  52. package/dist/esm/app-review/types.js.map +1 -0
  53. package/dist/esm/app-update/app-update-checker.d.ts +13 -0
  54. package/dist/esm/app-update/app-update-checker.js +104 -0
  55. package/dist/esm/app-update/app-update-checker.js.map +1 -0
  56. package/dist/esm/app-update/app-update-installer.d.ts +19 -0
  57. package/dist/esm/app-update/app-update-installer.js +123 -0
  58. package/dist/esm/app-update/app-update-installer.js.map +1 -0
  59. package/dist/esm/app-update/app-update-manager.d.ts +28 -0
  60. package/dist/esm/app-update/app-update-manager.js +199 -0
  61. package/dist/esm/app-update/app-update-manager.js.map +1 -0
  62. package/dist/esm/app-update/app-update-notifier.d.ts +14 -0
  63. package/dist/esm/app-update/app-update-notifier.js +100 -0
  64. package/dist/esm/app-update/app-update-notifier.js.map +1 -0
  65. package/dist/esm/app-update/index.d.ts +6 -0
  66. package/dist/esm/app-update/index.js +7 -0
  67. package/dist/esm/app-update/index.js.map +1 -0
  68. package/dist/esm/app-update/platform-app-update.d.ts +19 -0
  69. package/dist/esm/app-update/platform-app-update.js +129 -0
  70. package/dist/esm/app-update/platform-app-update.js.map +1 -0
  71. package/dist/esm/app-update/types.d.ts +58 -0
  72. package/dist/esm/app-update/types.js +12 -0
  73. package/dist/esm/app-update/types.js.map +1 -0
  74. package/dist/esm/background-update/background-scheduler.d.ts +17 -0
  75. package/dist/esm/background-update/background-scheduler.js +195 -0
  76. package/dist/esm/background-update/background-scheduler.js.map +1 -0
  77. package/dist/esm/background-update/index.d.ts +3 -0
  78. package/dist/esm/background-update/index.js +3 -0
  79. package/dist/esm/background-update/index.js.map +1 -0
  80. package/dist/esm/background-update/notification-manager.d.ts +29 -0
  81. package/dist/esm/background-update/notification-manager.js +89 -0
  82. package/dist/esm/background-update/notification-manager.js.map +1 -0
  83. package/dist/esm/core/analytics.d.ts +70 -0
  84. package/dist/esm/core/analytics.js +137 -0
  85. package/dist/esm/core/analytics.js.map +1 -0
  86. package/dist/esm/core/cache-manager.d.ts +72 -0
  87. package/dist/esm/core/cache-manager.js +275 -0
  88. package/dist/esm/core/cache-manager.js.map +1 -0
  89. package/dist/esm/core/config.d.ts +48 -0
  90. package/dist/esm/core/config.js +83 -0
  91. package/dist/esm/core/config.js.map +1 -0
  92. package/dist/esm/core/errors.d.ts +51 -0
  93. package/dist/esm/core/errors.js +80 -0
  94. package/dist/esm/core/errors.js.map +1 -0
  95. package/dist/esm/core/logger.d.ts +21 -0
  96. package/dist/esm/core/logger.js +109 -0
  97. package/dist/esm/core/logger.js.map +1 -0
  98. package/dist/esm/core/performance.d.ts +53 -0
  99. package/dist/esm/core/performance.js +140 -0
  100. package/dist/esm/core/performance.js.map +1 -0
  101. package/dist/esm/core/plugin-manager.d.ts +66 -0
  102. package/dist/esm/core/plugin-manager.js +148 -0
  103. package/dist/esm/core/plugin-manager.js.map +1 -0
  104. package/dist/esm/core/security.d.ts +93 -0
  105. package/dist/esm/core/security.js +315 -0
  106. package/dist/esm/core/security.js.map +1 -0
  107. package/dist/esm/definitions.d.ts +639 -0
  108. package/dist/esm/definitions.js +103 -0
  109. package/dist/esm/definitions.js.map +1 -0
  110. package/dist/esm/index.d.ts +12 -0
  111. package/dist/esm/index.js +16 -0
  112. package/dist/esm/index.js.map +1 -0
  113. package/dist/esm/live-update/bundle-manager.d.ts +94 -0
  114. package/dist/esm/live-update/bundle-manager.js +310 -0
  115. package/dist/esm/live-update/bundle-manager.js.map +1 -0
  116. package/dist/esm/live-update/certificate-pinning.d.ts +38 -0
  117. package/dist/esm/live-update/certificate-pinning.js +78 -0
  118. package/dist/esm/live-update/certificate-pinning.js.map +1 -0
  119. package/dist/esm/live-update/download-manager.d.ts +67 -0
  120. package/dist/esm/live-update/download-manager.js +319 -0
  121. package/dist/esm/live-update/download-manager.js.map +1 -0
  122. package/dist/esm/live-update/update-manager.d.ts +52 -0
  123. package/dist/esm/live-update/update-manager.js +294 -0
  124. package/dist/esm/live-update/update-manager.js.map +1 -0
  125. package/dist/esm/live-update/version-manager.d.ts +84 -0
  126. package/dist/esm/live-update/version-manager.js +335 -0
  127. package/dist/esm/live-update/version-manager.js.map +1 -0
  128. package/dist/esm/plugin.d.ts +6 -0
  129. package/dist/esm/plugin.js +283 -0
  130. package/dist/esm/plugin.js.map +1 -0
  131. package/dist/esm/security/crypto.d.ts +25 -0
  132. package/dist/esm/security/crypto.js +70 -0
  133. package/dist/esm/security/crypto.js.map +1 -0
  134. package/dist/esm/security/validator.d.ts +60 -0
  135. package/dist/esm/security/validator.js +143 -0
  136. package/dist/esm/security/validator.js.map +1 -0
  137. package/dist/esm/web.d.ts +74 -0
  138. package/dist/esm/web.js +595 -0
  139. package/dist/esm/web.js.map +1 -0
  140. package/dist/plugin.cjs.js +2 -0
  141. package/dist/plugin.cjs.js.map +1 -0
  142. package/dist/plugin.esm.js +2 -0
  143. package/dist/plugin.esm.js.map +1 -0
  144. package/dist/plugin.js +3 -0
  145. package/dist/plugin.js.map +1 -0
  146. package/docs/APP_REVIEW_GUIDE.md +768 -0
  147. package/docs/BUNDLE_SIGNING.md +264 -0
  148. package/docs/LIVE_UPDATES_GUIDE.md +650 -0
  149. package/docs/MIGRATION.md +192 -0
  150. package/docs/NATIVE_UPDATES_GUIDE.md +694 -0
  151. package/docs/QUICK_START.md +606 -0
  152. package/docs/README.md +111 -0
  153. package/docs/REMAINING_FEATURES.md +139 -0
  154. package/docs/api/app-review-api.md +259 -0
  155. package/docs/api/app-update-api.md +238 -0
  156. package/docs/api/events-api.md +451 -0
  157. package/docs/api/live-update-api.md +265 -0
  158. package/docs/background-updates.md +392 -0
  159. package/docs/examples/advanced-scenarios.md +410 -0
  160. package/docs/examples/basic-usage.md +185 -0
  161. package/docs/features/app-reviews.md +975 -0
  162. package/docs/features/app-updates.md +785 -0
  163. package/docs/features/live-updates.md +633 -0
  164. package/docs/getting-started/configuration.md +468 -0
  165. package/docs/getting-started/installation.md +209 -0
  166. package/docs/getting-started/quick-start.md +379 -0
  167. package/docs/guides/deployment-guide.md +333 -0
  168. package/docs/guides/migration-from-codepush.md +142 -0
  169. package/docs/guides/security-best-practices.md +1057 -0
  170. package/docs/guides/testing-guide.md +373 -0
  171. package/docs/production-readiness.md +478 -0
  172. package/docs/security/certificate-pinning.md +122 -0
  173. package/docs/server-requirements.md +147 -0
  174. package/ios/Plugin/AppReview/AppReviewPlugin.swift +158 -0
  175. package/ios/Plugin/AppUpdate/AppUpdatePlugin.swift +234 -0
  176. package/ios/Plugin/BackgroundUpdate/BackgroundNotificationManager.swift +329 -0
  177. package/ios/Plugin/BackgroundUpdate/BackgroundUpdatePlugin.swift +396 -0
  178. package/ios/Plugin/CapacitorNativeUpdatePlugin.m +45 -0
  179. package/ios/Plugin/CapacitorNativeUpdatePlugin.swift +190 -0
  180. package/ios/Plugin/Info.plist +43 -0
  181. package/ios/Plugin/LiveUpdate/LiveUpdatePlugin.swift +689 -0
  182. package/ios/Plugin/LiveUpdate/WebViewConfiguration.swift +45 -0
  183. package/ios/Plugin/Security/SecurityManager.swift +289 -0
  184. package/package.json +90 -0
@@ -0,0 +1,595 @@
1
+ import { WebPlugin } from '@capacitor/core';
2
+ import { SyncStatus, BundleStatus, UpdateErrorCode } from './definitions';
3
+ export class NativeUpdateWeb extends WebPlugin {
4
+ constructor() {
5
+ super();
6
+ this.config = {};
7
+ this.currentBundle = null;
8
+ this.bundles = new Map();
9
+ this.lastReviewRequest = 0;
10
+ this.launchCount = 0;
11
+ this.backgroundUpdateStatus = {
12
+ enabled: false,
13
+ isRunning: false,
14
+ checkCount: 0,
15
+ failureCount: 0,
16
+ };
17
+ this.backgroundCheckInterval = null;
18
+ this.loadStoredData();
19
+ this.incrementLaunchCount();
20
+ }
21
+ /**
22
+ * Configuration and Core Methods
23
+ */
24
+ async configure(options) {
25
+ // Store the plugin config
26
+ // In a real implementation, this would configure the plugin properly
27
+ if (options.config) {
28
+ this.saveConfiguration();
29
+ }
30
+ // console.log('CapacitorNativeUpdate configured:', options.config);
31
+ }
32
+ async getSecurityInfo() {
33
+ var _a, _b, _c, _d, _e, _f, _g;
34
+ return {
35
+ enforceHttps: ((_a = this.config.security) === null || _a === void 0 ? void 0 : _a.enforceHttps) !== false,
36
+ certificatePinning: {
37
+ enabled: ((_c = (_b = this.config.security) === null || _b === void 0 ? void 0 : _b.certificatePinning) === null || _c === void 0 ? void 0 : _c.enabled) || false,
38
+ pins: ((_e = (_d = this.config.security) === null || _d === void 0 ? void 0 : _d.certificatePinning) === null || _e === void 0 ? void 0 : _e.pins) || [],
39
+ },
40
+ validateInputs: ((_f = this.config.security) === null || _f === void 0 ? void 0 : _f.validateInputs) !== false,
41
+ secureStorage: ((_g = this.config.security) === null || _g === void 0 ? void 0 : _g.secureStorage) !== false,
42
+ };
43
+ }
44
+ /**
45
+ * Live Update Methods
46
+ */
47
+ async sync(_options) {
48
+ // console.log('Web: Checking for updates...', options);
49
+ var _a;
50
+ try {
51
+ // In web, we can check for service worker updates
52
+ if ('serviceWorker' in navigator) {
53
+ const registration = await navigator.serviceWorker.getRegistration();
54
+ if (registration) {
55
+ await registration.update();
56
+ if (registration.waiting) {
57
+ // There's an update waiting
58
+ registration.waiting.postMessage({ type: 'SKIP_WAITING' });
59
+ return {
60
+ status: SyncStatus.UPDATE_AVAILABLE,
61
+ version: 'web-update',
62
+ description: 'Service worker update available',
63
+ };
64
+ }
65
+ }
66
+ }
67
+ return {
68
+ status: SyncStatus.UP_TO_DATE,
69
+ version: ((_a = this.currentBundle) === null || _a === void 0 ? void 0 : _a.version) || '1.0.0',
70
+ };
71
+ }
72
+ catch (error) {
73
+ return {
74
+ status: SyncStatus.ERROR,
75
+ error: this.createError(UpdateErrorCode.UNKNOWN_ERROR, error.message),
76
+ };
77
+ }
78
+ }
79
+ async download(options) {
80
+ var _a;
81
+ // Validate URL
82
+ if (!options.url.startsWith('https://') &&
83
+ ((_a = this.config.security) === null || _a === void 0 ? void 0 : _a.enforceHttps) !== false) {
84
+ throw this.createError(UpdateErrorCode.INSECURE_URL, 'Download URL must use HTTPS');
85
+ }
86
+ const bundleId = `bundle-${Date.now()}`;
87
+ const bundle = {
88
+ bundleId,
89
+ version: options.version,
90
+ path: options.url,
91
+ downloadTime: Date.now(),
92
+ size: 0, // Would be calculated during actual download
93
+ status: BundleStatus.DOWNLOADING,
94
+ checksum: options.checksum,
95
+ signature: options.signature,
96
+ verified: false,
97
+ };
98
+ this.bundles.set(bundleId, bundle);
99
+ // Simulate download progress
100
+ for (let i = 0; i <= 100; i += 10) {
101
+ await this.notifyListeners('downloadProgress', {
102
+ percent: i,
103
+ bytesDownloaded: i * 1000,
104
+ totalBytes: 10000,
105
+ bundleId,
106
+ });
107
+ await new Promise((resolve) => setTimeout(resolve, 100));
108
+ }
109
+ // Update bundle status
110
+ bundle.status = BundleStatus.READY;
111
+ bundle.verified = true; // In real implementation, would verify checksum/signature
112
+ this.saveStoredData();
113
+ await this.notifyListeners('updateStateChanged', {
114
+ status: bundle.status,
115
+ bundleId: bundle.bundleId,
116
+ version: bundle.version,
117
+ });
118
+ return bundle;
119
+ }
120
+ async set(bundle) {
121
+ if (!this.bundles.has(bundle.bundleId)) {
122
+ throw this.createError(UpdateErrorCode.UNKNOWN_ERROR, 'Bundle not found');
123
+ }
124
+ const previousBundle = this.currentBundle;
125
+ this.currentBundle = bundle;
126
+ this.currentBundle.status = BundleStatus.ACTIVE;
127
+ // Update previous bundle status
128
+ if (previousBundle) {
129
+ previousBundle.status = BundleStatus.READY;
130
+ }
131
+ this.saveStoredData();
132
+ }
133
+ async reload() {
134
+ // console.log('Web: Reloading application...');
135
+ // In web, we can reload the page
136
+ if (typeof window !== 'undefined') {
137
+ window.location.reload();
138
+ }
139
+ }
140
+ async reset() {
141
+ // console.log('Web: Resetting to original bundle...');
142
+ this.currentBundle = null;
143
+ this.bundles.clear();
144
+ this.saveStoredData();
145
+ // Clear service worker cache if available
146
+ if ('caches' in window) {
147
+ const cacheNames = await caches.keys();
148
+ await Promise.all(cacheNames.map((name) => caches.delete(name)));
149
+ }
150
+ }
151
+ async current() {
152
+ return this.currentBundle || this.createDefaultBundle();
153
+ }
154
+ async list() {
155
+ return Array.from(this.bundles.values());
156
+ }
157
+ async delete(options) {
158
+ if (options.bundleId) {
159
+ this.bundles.delete(options.bundleId);
160
+ }
161
+ else if (options.keepVersions !== undefined) {
162
+ const sortedBundles = Array.from(this.bundles.values()).sort((a, b) => b.downloadTime - a.downloadTime);
163
+ const bundlesToDelete = sortedBundles.slice(options.keepVersions);
164
+ bundlesToDelete.forEach((bundle) => this.bundles.delete(bundle.bundleId));
165
+ }
166
+ else if (options.olderThan !== undefined) {
167
+ const cutoffTime = options.olderThan;
168
+ Array.from(this.bundles.values())
169
+ .filter((bundle) => bundle.downloadTime < cutoffTime)
170
+ .forEach((bundle) => this.bundles.delete(bundle.bundleId));
171
+ }
172
+ this.saveStoredData();
173
+ }
174
+ async notifyAppReady() {
175
+ // console.log('Web: App ready notification received');
176
+ if (this.currentBundle) {
177
+ this.currentBundle.verified = true;
178
+ this.saveStoredData();
179
+ }
180
+ }
181
+ async getLatest() {
182
+ // In web, check for service worker updates
183
+ if ('serviceWorker' in navigator) {
184
+ const registration = await navigator.serviceWorker.getRegistration();
185
+ if (registration === null || registration === void 0 ? void 0 : registration.waiting) {
186
+ return {
187
+ available: true,
188
+ version: 'web-update',
189
+ notes: 'Service worker update available',
190
+ };
191
+ }
192
+ }
193
+ return {
194
+ available: false,
195
+ };
196
+ }
197
+ async setChannel(channel) {
198
+ if (!this.config.liveUpdate) {
199
+ this.config.liveUpdate = {};
200
+ }
201
+ this.config.liveUpdate.channel = channel;
202
+ this.saveConfiguration();
203
+ }
204
+ async setUpdateUrl(url) {
205
+ var _a;
206
+ if (!url.startsWith('https://') &&
207
+ ((_a = this.config.security) === null || _a === void 0 ? void 0 : _a.enforceHttps) !== false) {
208
+ throw this.createError(UpdateErrorCode.INSECURE_URL, 'Update URL must use HTTPS');
209
+ }
210
+ if (!this.config.liveUpdate) {
211
+ this.config.liveUpdate = {};
212
+ }
213
+ this.config.liveUpdate.serverUrl = url;
214
+ this.saveConfiguration();
215
+ }
216
+ async validateUpdate(options) {
217
+ // Simulate validation
218
+ const checksumValid = await this.validateChecksum(options.bundlePath, options.checksum);
219
+ const signatureValid = options.signature
220
+ ? await this.validateSignature(options.bundlePath, options.signature)
221
+ : true;
222
+ const sizeValid = options.maxSize ? true : true; // Would check actual size
223
+ const isValid = checksumValid && signatureValid && sizeValid;
224
+ return {
225
+ isValid,
226
+ error: isValid ? undefined : 'Validation failed',
227
+ details: {
228
+ checksumValid,
229
+ signatureValid,
230
+ sizeValid,
231
+ versionValid: true,
232
+ },
233
+ };
234
+ }
235
+ /**
236
+ * App Update Methods
237
+ */
238
+ async getAppUpdateInfo() {
239
+ // console.log('Web: App updates not supported on web platform');
240
+ return {
241
+ updateAvailable: false,
242
+ currentVersion: '1.0.0',
243
+ immediateUpdateAllowed: false,
244
+ flexibleUpdateAllowed: false,
245
+ };
246
+ }
247
+ async performImmediateUpdate() {
248
+ throw this.createError(UpdateErrorCode.PLATFORM_NOT_SUPPORTED, 'App updates are not supported on web platform');
249
+ }
250
+ async startFlexibleUpdate() {
251
+ throw this.createError(UpdateErrorCode.PLATFORM_NOT_SUPPORTED, 'App updates are not supported on web platform');
252
+ }
253
+ async completeFlexibleUpdate() {
254
+ throw this.createError(UpdateErrorCode.PLATFORM_NOT_SUPPORTED, 'App updates are not supported on web platform');
255
+ }
256
+ async openAppStore(_options) {
257
+ // console.log('Web: Opening app store fallback URL', options);
258
+ var _a, _b, _c, _d;
259
+ // Fallback to website or app landing page
260
+ const fallbackUrl = ((_b = (_a = this.config.appUpdate) === null || _a === void 0 ? void 0 : _a.storeUrl) === null || _b === void 0 ? void 0 : _b.android) ||
261
+ ((_d = (_c = this.config.appUpdate) === null || _c === void 0 ? void 0 : _c.storeUrl) === null || _d === void 0 ? void 0 : _d.ios) ||
262
+ 'https://example.com/download';
263
+ window.open(fallbackUrl, '_blank');
264
+ }
265
+ /**
266
+ * App Review Methods
267
+ */
268
+ async requestReview() {
269
+ const canRequest = await this.canRequestReview();
270
+ if (!canRequest.canRequest) {
271
+ return {
272
+ displayed: false,
273
+ error: canRequest.reason,
274
+ };
275
+ }
276
+ // console.log('Web: Showing review request fallback');
277
+ // Update last request time
278
+ this.lastReviewRequest = Date.now();
279
+ localStorage.setItem('native-update-last-review', this.lastReviewRequest.toString());
280
+ // In web, we could show a custom modal or redirect to a review page
281
+ const reviewUrl = 'https://example.com/review';
282
+ const shouldRedirect = confirm('Would you like to leave a review for our app?');
283
+ if (shouldRedirect) {
284
+ window.open(reviewUrl, '_blank');
285
+ }
286
+ return {
287
+ displayed: true,
288
+ };
289
+ }
290
+ async canRequestReview() {
291
+ const config = this.config.appReview;
292
+ const now = Date.now();
293
+ const installDate = this.getInstallDate();
294
+ const daysSinceInstall = (now - installDate) / (1000 * 60 * 60 * 24);
295
+ // Check minimum days since install
296
+ if ((config === null || config === void 0 ? void 0 : config.minimumDaysSinceInstall) &&
297
+ daysSinceInstall < config.minimumDaysSinceInstall) {
298
+ return {
299
+ canRequest: false,
300
+ reason: 'Not enough days since install',
301
+ };
302
+ }
303
+ // Check minimum days since last prompt
304
+ if ((config === null || config === void 0 ? void 0 : config.minimumDaysSinceLastPrompt) && this.lastReviewRequest > 0) {
305
+ const daysSinceLastPrompt = (now - this.lastReviewRequest) / (1000 * 60 * 60 * 24);
306
+ if (daysSinceLastPrompt < config.minimumDaysSinceLastPrompt) {
307
+ return {
308
+ canRequest: false,
309
+ reason: 'Too soon since last review request',
310
+ };
311
+ }
312
+ }
313
+ // Check minimum launch count
314
+ if ((config === null || config === void 0 ? void 0 : config.minimumLaunchCount) &&
315
+ this.launchCount < config.minimumLaunchCount) {
316
+ return {
317
+ canRequest: false,
318
+ reason: 'Not enough app launches',
319
+ };
320
+ }
321
+ return {
322
+ canRequest: true,
323
+ };
324
+ }
325
+ /**
326
+ * Background Update Methods
327
+ */
328
+ async enableBackgroundUpdates(config) {
329
+ // console.log('Web: Enabling background updates', config);
330
+ if (!this.config.backgroundUpdate) {
331
+ this.config.backgroundUpdate = config;
332
+ }
333
+ else {
334
+ this.config.backgroundUpdate = Object.assign(Object.assign({}, this.config.backgroundUpdate), config);
335
+ }
336
+ this.backgroundUpdateStatus.enabled = config.enabled;
337
+ if (config.enabled) {
338
+ await this.scheduleBackgroundCheck(config.checkInterval);
339
+ }
340
+ else {
341
+ await this.disableBackgroundUpdates();
342
+ }
343
+ this.saveConfiguration();
344
+ }
345
+ async disableBackgroundUpdates() {
346
+ // console.log('Web: Disabling background updates');
347
+ if (this.backgroundCheckInterval) {
348
+ clearInterval(this.backgroundCheckInterval);
349
+ this.backgroundCheckInterval = null;
350
+ }
351
+ this.backgroundUpdateStatus.enabled = false;
352
+ this.backgroundUpdateStatus.isRunning = false;
353
+ this.backgroundUpdateStatus.currentTaskId = undefined;
354
+ if (this.config.backgroundUpdate) {
355
+ this.config.backgroundUpdate.enabled = false;
356
+ }
357
+ this.saveConfiguration();
358
+ }
359
+ async getBackgroundUpdateStatus() {
360
+ return Object.assign({}, this.backgroundUpdateStatus);
361
+ }
362
+ async scheduleBackgroundCheck(interval) {
363
+ // console.log('Web: Scheduling background check with interval', interval);
364
+ if (this.backgroundCheckInterval) {
365
+ clearInterval(this.backgroundCheckInterval);
366
+ }
367
+ this.backgroundCheckInterval = setInterval(async () => {
368
+ if (this.backgroundUpdateStatus.enabled &&
369
+ !this.backgroundUpdateStatus.isRunning) {
370
+ await this.triggerBackgroundCheck();
371
+ }
372
+ }, interval);
373
+ this.backgroundUpdateStatus.nextCheckTime = Date.now() + interval;
374
+ }
375
+ async triggerBackgroundCheck() {
376
+ // console.log('Web: Triggering background check');
377
+ if (!this.backgroundUpdateStatus.enabled) {
378
+ return {
379
+ success: false,
380
+ updatesFound: false,
381
+ notificationSent: false,
382
+ error: {
383
+ code: UpdateErrorCode.INVALID_CONFIG,
384
+ message: 'Background updates not enabled',
385
+ },
386
+ };
387
+ }
388
+ this.backgroundUpdateStatus.isRunning = true;
389
+ this.backgroundUpdateStatus.checkCount++;
390
+ this.backgroundUpdateStatus.lastCheckTime = Date.now();
391
+ try {
392
+ const updateInfo = await this.getAppUpdateInfo();
393
+ const liveUpdate = await this.getLatest();
394
+ const updatesFound = updateInfo.updateAvailable || liveUpdate.available;
395
+ let notificationSent = false;
396
+ if (updatesFound) {
397
+ notificationSent = await this.sendWebNotification(updateInfo, liveUpdate);
398
+ }
399
+ this.backgroundUpdateStatus.isRunning = false;
400
+ this.backgroundUpdateStatus.lastUpdateTime = updatesFound
401
+ ? Date.now()
402
+ : undefined;
403
+ this.backgroundUpdateStatus.lastError = undefined;
404
+ return {
405
+ success: true,
406
+ updatesFound,
407
+ appUpdate: updateInfo.updateAvailable ? updateInfo : undefined,
408
+ liveUpdate: liveUpdate.available ? liveUpdate : undefined,
409
+ notificationSent,
410
+ };
411
+ }
412
+ catch (error) {
413
+ this.backgroundUpdateStatus.isRunning = false;
414
+ this.backgroundUpdateStatus.failureCount++;
415
+ this.backgroundUpdateStatus.lastError = {
416
+ code: UpdateErrorCode.UNKNOWN_ERROR,
417
+ message: error instanceof Error ? error.message : 'Unknown error',
418
+ };
419
+ return {
420
+ success: false,
421
+ updatesFound: false,
422
+ notificationSent: false,
423
+ error: this.backgroundUpdateStatus.lastError,
424
+ };
425
+ }
426
+ }
427
+ async setNotificationPreferences(preferences) {
428
+ // console.log('Web: Setting notification preferences', preferences);
429
+ if (!this.config.backgroundUpdate) {
430
+ this.config.backgroundUpdate = {};
431
+ }
432
+ this.config.backgroundUpdate.notificationPreferences = preferences;
433
+ this.saveConfiguration();
434
+ }
435
+ async getNotificationPermissions() {
436
+ if (!('Notification' in window)) {
437
+ return {
438
+ granted: false,
439
+ canRequest: false,
440
+ };
441
+ }
442
+ const permission = Notification.permission;
443
+ return {
444
+ granted: permission === 'granted',
445
+ canRequest: permission === 'default',
446
+ };
447
+ }
448
+ async requestNotificationPermissions() {
449
+ if (!('Notification' in window)) {
450
+ return false;
451
+ }
452
+ if (Notification.permission === 'granted') {
453
+ return true;
454
+ }
455
+ if (Notification.permission === 'denied') {
456
+ return false;
457
+ }
458
+ const permission = await Notification.requestPermission();
459
+ return permission === 'granted';
460
+ }
461
+ async sendWebNotification(appUpdate, liveUpdate) {
462
+ var _a;
463
+ const permissions = await this.getNotificationPermissions();
464
+ if (!permissions.granted) {
465
+ return false;
466
+ }
467
+ const prefs = (_a = this.config.backgroundUpdate) === null || _a === void 0 ? void 0 : _a.notificationPreferences;
468
+ let title = (prefs === null || prefs === void 0 ? void 0 : prefs.title) || 'App Update Available';
469
+ let body = (prefs === null || prefs === void 0 ? void 0 : prefs.description) || 'A new version of the app is available';
470
+ if (appUpdate.updateAvailable && liveUpdate.available) {
471
+ title = 'App Updates Available';
472
+ body = `App version ${appUpdate.availableVersion} and content updates are available`;
473
+ }
474
+ else if (appUpdate.updateAvailable) {
475
+ title = 'App Update Available';
476
+ body = `Version ${appUpdate.availableVersion} is available`;
477
+ }
478
+ else if (liveUpdate.available) {
479
+ title = 'Content Update Available';
480
+ body = `New content version ${liveUpdate.version} is available`;
481
+ }
482
+ try {
483
+ const notification = new Notification(title, {
484
+ body,
485
+ icon: (prefs === null || prefs === void 0 ? void 0 : prefs.iconName) || '/favicon.ico',
486
+ badge: '/favicon.ico',
487
+ silent: !(prefs === null || prefs === void 0 ? void 0 : prefs.soundEnabled),
488
+ data: {
489
+ type: 'update_available',
490
+ appUpdate,
491
+ liveUpdate,
492
+ },
493
+ });
494
+ notification.onclick = () => {
495
+ window.focus();
496
+ notification.close();
497
+ this.notifyListeners('backgroundUpdateNotification', {
498
+ type: appUpdate.updateAvailable ? 'app_update' : 'live_update',
499
+ updateAvailable: true,
500
+ version: appUpdate.availableVersion || liveUpdate.version,
501
+ action: 'tapped',
502
+ });
503
+ };
504
+ return true;
505
+ }
506
+ catch (error) {
507
+ console.error('Web: Failed to send notification', error);
508
+ return false;
509
+ }
510
+ }
511
+ /**
512
+ * Helper Methods
513
+ */
514
+ createError(code, message) {
515
+ return {
516
+ code,
517
+ message,
518
+ };
519
+ }
520
+ createDefaultBundle() {
521
+ return {
522
+ bundleId: 'default',
523
+ version: '1.0.0',
524
+ path: '/',
525
+ downloadTime: Date.now(),
526
+ size: 0,
527
+ status: BundleStatus.ACTIVE,
528
+ checksum: '',
529
+ verified: true,
530
+ };
531
+ }
532
+ async validateChecksum(_data, _expectedChecksum) {
533
+ // In a real implementation, would calculate actual checksum
534
+ // console.log('Web: Validating checksum...', expectedChecksum);
535
+ return true;
536
+ }
537
+ async validateSignature(_data, _signature) {
538
+ // In a real implementation, would verify signature
539
+ // console.log('Web: Validating signature...', signature);
540
+ return true;
541
+ }
542
+ loadStoredData() {
543
+ // Load configuration
544
+ const storedConfig = localStorage.getItem('native-update-config');
545
+ if (storedConfig) {
546
+ this.config = JSON.parse(storedConfig);
547
+ }
548
+ // Load bundles
549
+ const storedBundles = localStorage.getItem('native-update-bundles');
550
+ if (storedBundles) {
551
+ const bundlesArray = JSON.parse(storedBundles);
552
+ bundlesArray.forEach((bundle) => this.bundles.set(bundle.bundleId, bundle));
553
+ }
554
+ // Load current bundle
555
+ const storedCurrent = localStorage.getItem('native-update-current');
556
+ if (storedCurrent) {
557
+ this.currentBundle = JSON.parse(storedCurrent);
558
+ }
559
+ // Load last review request time
560
+ const storedLastReview = localStorage.getItem('capacitor-native-update-last-review');
561
+ if (storedLastReview) {
562
+ this.lastReviewRequest = parseInt(storedLastReview, 10);
563
+ }
564
+ // Load launch count
565
+ const storedLaunchCount = localStorage.getItem('native-update-launch-count');
566
+ if (storedLaunchCount) {
567
+ this.launchCount = parseInt(storedLaunchCount, 10);
568
+ }
569
+ }
570
+ saveStoredData() {
571
+ localStorage.setItem('native-update-bundles', JSON.stringify(Array.from(this.bundles.values())));
572
+ if (this.currentBundle) {
573
+ localStorage.setItem('native-update-current', JSON.stringify(this.currentBundle));
574
+ }
575
+ }
576
+ saveConfiguration() {
577
+ localStorage.setItem('native-update-config', JSON.stringify(this.config));
578
+ }
579
+ getInstallDate() {
580
+ const stored = localStorage.getItem('native-update-install-date');
581
+ if (stored) {
582
+ return parseInt(stored, 10);
583
+ }
584
+ const now = Date.now();
585
+ localStorage.setItem('native-update-install-date', now.toString());
586
+ return now;
587
+ }
588
+ incrementLaunchCount() {
589
+ this.launchCount++;
590
+ localStorage.setItem('native-update-launch-count', this.launchCount.toString());
591
+ }
592
+ }
593
+ // Alias for backward compatibility with tests
594
+ export { NativeUpdateWeb as CapacitorNativeUpdateWeb };
595
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AA4B5C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE1E,MAAM,OAAO,eACX,SAAQ,SAAS;IAgBjB;QACE,KAAK,EAAE,CAAC;QAdF,WAAM,GAAiB,EAAE,CAAC;QAC1B,kBAAa,GAAsB,IAAI,CAAC;QACxC,YAAO,GAA4B,IAAI,GAAG,EAAE,CAAC;QAC7C,sBAAiB,GAAW,CAAC,CAAC;QAC9B,gBAAW,GAAW,CAAC,CAAC;QACxB,2BAAsB,GAA2B;YACvD,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,KAAK;YAChB,UAAU,EAAE,CAAC;YACb,YAAY,EAAE,CAAC;SAChB,CAAC;QACM,4BAAuB,GAA0B,IAAI,CAAC;QAI5D,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,OAAqC;QACnD,0BAA0B;QAC1B,qEAAqE;QACrE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC;QACD,oEAAoE;IACtE,CAAC;IAED,KAAK,CAAC,eAAe;;QACnB,OAAO;YACL,YAAY,EAAE,CAAA,MAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,0CAAE,YAAY,MAAK,KAAK;YAC1D,kBAAkB,EAAE;gBAClB,OAAO,EAAE,CAAA,MAAA,MAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,0CAAE,kBAAkB,0CAAE,OAAO,KAAI,KAAK;gBACnE,IAAI,EACF,CAAA,MAAA,MAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,0CAAE,kBAAkB,0CAAE,IAAI,KAAI,EAAE;aACvD;YACD,cAAc,EAAE,CAAA,MAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,0CAAE,cAAc,MAAK,KAAK;YAC9D,aAAa,EAAE,CAAA,MAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,0CAAE,aAAa,MAAK,KAAK;SAC7D,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,QAAsB;QAC/B,wDAAwD;;QAExD,IAAI,CAAC;YACH,kDAAkD;YAClD,IAAI,eAAe,IAAI,SAAS,EAAE,CAAC;gBACjC,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;gBACrE,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM,YAAY,CAAC,MAAM,EAAE,CAAC;oBAE5B,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;wBACzB,4BAA4B;wBAC5B,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;wBAE3D,OAAO;4BACL,MAAM,EAAE,UAAU,CAAC,gBAAgB;4BACnC,OAAO,EAAE,YAAY;4BACrB,WAAW,EAAE,iCAAiC;yBAC/C,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,UAAU,CAAC,UAAU;gBAC7B,OAAO,EAAE,CAAA,MAAA,IAAI,CAAC,aAAa,0CAAE,OAAO,KAAI,OAAO;aAChD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,MAAM,EAAE,UAAU,CAAC,KAAK;gBACxB,KAAK,EAAE,IAAI,CAAC,WAAW,CACrB,eAAe,CAAC,aAAa,EAC5B,KAAe,CAAC,OAAO,CACzB;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAwB;;QACrC,eAAe;QACf,IACE,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;YACnC,CAAA,MAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,0CAAE,YAAY,MAAK,KAAK,EAC5C,CAAC;YACD,MAAM,IAAI,CAAC,WAAW,CACpB,eAAe,CAAC,YAAY,EAC5B,6BAA6B,CAC9B,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,UAAU,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACxC,MAAM,MAAM,GAAe;YACzB,QAAQ;YACR,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,OAAO,CAAC,GAAG;YACjB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;YACxB,IAAI,EAAE,CAAC,EAAE,6CAA6C;YACtD,MAAM,EAAE,YAAY,CAAC,WAAW;YAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,QAAQ,EAAE,KAAK;SAChB,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAEnC,6BAA6B;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YAClC,MAAM,IAAI,CAAC,eAAe,CAAC,kBAAkB,EAAE;gBAC7C,OAAO,EAAE,CAAC;gBACV,eAAe,EAAE,CAAC,GAAG,IAAI;gBACzB,UAAU,EAAE,KAAK;gBACjB,QAAQ;aACT,CAAC,CAAC;YACH,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,uBAAuB;QACvB,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC;QACnC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,0DAA0D;QAElF,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,MAAM,IAAI,CAAC,eAAe,CAAC,oBAAoB,EAAE;YAC/C,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAkB;QAC1B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;QAC1C,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;QAEhD,gCAAgC;QAChC,IAAI,cAAc,EAAE,CAAC;YACnB,cAAc,CAAC,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC;QAC7C,CAAC;QAED,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,MAAM;QACV,gDAAgD;QAEhD,iCAAiC;QACjC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,uDAAuD;QAEvD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,0CAA0C;QAC1C,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACvC,MAAM,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAsB;QACjC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YAC9C,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAC1D,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAC1C,CAAC;YAEF,MAAM,eAAe,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAClE,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5E,CAAC;aAAM,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAC3C,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;iBAC9B,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,GAAG,UAAU,CAAC;iBACpD,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,uDAAuD;QAEvD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,CAAC,QAAQ,GAAG,IAAI,CAAC;YACnC,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS;QACb,2CAA2C;QAC3C,IAAI,eAAe,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;YACrE,IAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,OAAO,EAAE,CAAC;gBAC1B,OAAO;oBACL,SAAS,EAAE,IAAI;oBACf,OAAO,EAAE,YAAY;oBACrB,KAAK,EAAE,iCAAiC;iBACzC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO;YACL,SAAS,EAAE,KAAK;SACjB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAe;QAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,EAAsB,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,UAAW,CAAC,OAAO,GAAG,OAAO,CAAC;QAC1C,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAW;;QAC5B,IACE,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;YAC3B,CAAA,MAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,0CAAE,YAAY,MAAK,KAAK,EAC5C,CAAC;YACD,MAAM,IAAI,CAAC,WAAW,CACpB,eAAe,CAAC,YAAY,EAC5B,2BAA2B,CAC5B,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,EAAsB,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,UAAW,CAAC,SAAS,GAAG,GAAG,CAAC;QACxC,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAwB;QAC3C,sBAAsB;QACtB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAC/C,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,QAAQ,CACjB,CAAC;QACF,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS;YACtC,CAAC,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC;YACrE,CAAC,CAAC,IAAI,CAAC;QACT,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,0BAA0B;QAE3E,MAAM,OAAO,GAAG,aAAa,IAAI,cAAc,IAAI,SAAS,CAAC;QAE7D,OAAO;YACL,OAAO;YACP,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB;YAChD,OAAO,EAAE;gBACP,aAAa;gBACb,cAAc;gBACd,SAAS;gBACT,YAAY,EAAE,IAAI;aACnB;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB;QACpB,iEAAiE;QAEjE,OAAO;YACL,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,OAAO;YACvB,sBAAsB,EAAE,KAAK;YAC7B,qBAAqB,EAAE,KAAK;SAC7B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,sBAAsB;QAC1B,MAAM,IAAI,CAAC,WAAW,CACpB,eAAe,CAAC,sBAAsB,EACtC,+CAA+C,CAChD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,MAAM,IAAI,CAAC,WAAW,CACpB,eAAe,CAAC,sBAAsB,EACtC,+CAA+C,CAChD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,sBAAsB;QAC1B,MAAM,IAAI,CAAC,WAAW,CACpB,eAAe,CAAC,sBAAsB,EACtC,+CAA+C,CAChD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAA8B;QAC/C,+DAA+D;;QAE/D,0CAA0C;QAC1C,MAAM,WAAW,GACf,CAAA,MAAA,MAAA,IAAI,CAAC,MAAM,CAAC,SAAS,0CAAE,QAAQ,0CAAE,OAAO;aACxC,MAAA,MAAA,IAAI,CAAC,MAAM,CAAC,SAAS,0CAAE,QAAQ,0CAAE,GAAG,CAAA;YACpC,8BAA8B,CAAC;QAEjC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAEjD,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YAC3B,OAAO;gBACL,SAAS,EAAE,KAAK;gBAChB,KAAK,EAAE,UAAU,CAAC,MAAM;aACzB,CAAC;QACJ,CAAC;QAED,uDAAuD;QAEvD,2BAA2B;QAC3B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACpC,YAAY,CAAC,OAAO,CAClB,2BAA2B,EAC3B,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAClC,CAAC;QAEF,oEAAoE;QACpE,MAAM,SAAS,GAAG,4BAA4B,CAAC;QAC/C,MAAM,cAAc,GAAG,OAAO,CAC5B,+CAA+C,CAChD,CAAC;QAEF,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACnC,CAAC;QAED,OAAO;YACL,SAAS,EAAE,IAAI;SAChB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,MAAM,gBAAgB,GAAG,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAErE,mCAAmC;QACnC,IACE,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,uBAAuB;YAC/B,gBAAgB,GAAG,MAAM,CAAC,uBAAuB,EACjD,CAAC;YACD,OAAO;gBACL,UAAU,EAAE,KAAK;gBACjB,MAAM,EAAE,+BAA+B;aACxC,CAAC;QACJ,CAAC;QAED,uCAAuC;QACvC,IAAI,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,0BAA0B,KAAI,IAAI,CAAC,iBAAiB,GAAG,CAAC,EAAE,CAAC;YACrE,MAAM,mBAAmB,GACvB,CAAC,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YACzD,IAAI,mBAAmB,GAAG,MAAM,CAAC,0BAA0B,EAAE,CAAC;gBAC5D,OAAO;oBACL,UAAU,EAAE,KAAK;oBACjB,MAAM,EAAE,oCAAoC;iBAC7C,CAAC;YACJ,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,IACE,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,kBAAkB;YAC1B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,kBAAkB,EAC5C,CAAC;YACD,OAAO;gBACL,UAAU,EAAE,KAAK;gBACjB,MAAM,EAAE,yBAAyB;aAClC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,UAAU,EAAE,IAAI;SACjB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,uBAAuB,CAAC,MAA8B;QAC1D,2DAA2D;QAE3D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,MAAM,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,gBAAgB,mCACvB,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAC5B,MAAM,CACV,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,sBAAsB,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAErD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,wBAAwB,EAAE,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,wBAAwB;QAC5B,oDAAoD;QAEpD,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACjC,aAAa,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAC5C,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;QACtC,CAAC;QAED,IAAI,CAAC,sBAAsB,CAAC,OAAO,GAAG,KAAK,CAAC;QAC5C,IAAI,CAAC,sBAAsB,CAAC,SAAS,GAAG,KAAK,CAAC;QAC9C,IAAI,CAAC,sBAAsB,CAAC,aAAa,GAAG,SAAS,CAAC;QAEtD,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,yBAAyB;QAC7B,yBAAY,IAAI,CAAC,sBAAsB,EAAG;IAC5C,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,QAAgB;QAC5C,2EAA2E;QAE3E,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACjC,aAAa,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,CAAC,uBAAuB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YACpD,IACE,IAAI,CAAC,sBAAsB,CAAC,OAAO;gBACnC,CAAC,IAAI,CAAC,sBAAsB,CAAC,SAAS,EACtC,CAAC;gBACD,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;YACtC,CAAC;QACH,CAAC,EAAE,QAAQ,CAAC,CAAC;QAEb,IAAI,CAAC,sBAAsB,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,sBAAsB;QAC1B,mDAAmD;QAEnD,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,CAAC;YACzC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,KAAK;gBACnB,gBAAgB,EAAE,KAAK;gBACvB,KAAK,EAAE;oBACL,IAAI,EAAE,eAAe,CAAC,cAAc;oBACpC,OAAO,EAAE,gCAAgC;iBAC1C;aACF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,sBAAsB,CAAC,SAAS,GAAG,IAAI,CAAC;QAC7C,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE,CAAC;QACzC,IAAI,CAAC,sBAAsB,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACjD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YAE1C,MAAM,YAAY,GAAG,UAAU,CAAC,eAAe,IAAI,UAAU,CAAC,SAAS,CAAC;YACxE,IAAI,gBAAgB,GAAG,KAAK,CAAC;YAE7B,IAAI,YAAY,EAAE,CAAC;gBACjB,gBAAgB,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAC/C,UAAU,EACV,UAAU,CACX,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,sBAAsB,CAAC,SAAS,GAAG,KAAK,CAAC;YAC9C,IAAI,CAAC,sBAAsB,CAAC,cAAc,GAAG,YAAY;gBACvD,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;gBACZ,CAAC,CAAC,SAAS,CAAC;YACd,IAAI,CAAC,sBAAsB,CAAC,SAAS,GAAG,SAAS,CAAC;YAElD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,YAAY;gBACZ,SAAS,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;gBAC9D,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;gBACzD,gBAAgB;aACjB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,sBAAsB,CAAC,SAAS,GAAG,KAAK,CAAC;YAC9C,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,CAAC;YAC3C,IAAI,CAAC,sBAAsB,CAAC,SAAS,GAAG;gBACtC,IAAI,EAAE,eAAe,CAAC,aAAa;gBACnC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAClE,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,KAAK;gBACnB,gBAAgB,EAAE,KAAK;gBACvB,KAAK,EAAE,IAAI,CAAC,sBAAsB,CAAC,SAAS;aAC7C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,0BAA0B,CAC9B,WAAoC;QAEpC,qEAAqE;QAErE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,EAA4B,CAAC;QAC9D,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,uBAAuB,GAAG,WAAW,CAAC;QACnE,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,0BAA0B;QAC9B,IAAI,CAAC,CAAC,cAAc,IAAI,MAAM,CAAC,EAAE,CAAC;YAChC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,KAAK;aAClB,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;QAE3C,OAAO;YACL,OAAO,EAAE,UAAU,KAAK,SAAS;YACjC,UAAU,EAAE,UAAU,KAAK,SAAS;SACrC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,8BAA8B;QAClC,IAAI,CAAC,CAAC,cAAc,IAAI,MAAM,CAAC,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,YAAY,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,YAAY,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YACzC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,iBAAiB,EAAE,CAAC;QAC1D,OAAO,UAAU,KAAK,SAAS,CAAC;IAClC,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAC/B,SAAwB,EACxB,UAAyB;;QAEzB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAC5D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,KAAK,GAAG,MAAA,IAAI,CAAC,MAAM,CAAC,gBAAgB,0CAAE,uBAAuB,CAAC;QACpE,IAAI,KAAK,GAAG,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,KAAI,sBAAsB,CAAC;QACnD,IAAI,IAAI,GAAG,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,WAAW,KAAI,uCAAuC,CAAC;QAEzE,IAAI,SAAS,CAAC,eAAe,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;YACtD,KAAK,GAAG,uBAAuB,CAAC;YAChC,IAAI,GAAG,eAAe,SAAS,CAAC,gBAAgB,oCAAoC,CAAC;QACvF,CAAC;aAAM,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YACrC,KAAK,GAAG,sBAAsB,CAAC;YAC/B,IAAI,GAAG,WAAW,SAAS,CAAC,gBAAgB,eAAe,CAAC;QAC9D,CAAC;aAAM,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;YAChC,KAAK,GAAG,0BAA0B,CAAC;YACnC,IAAI,GAAG,uBAAuB,UAAU,CAAC,OAAO,eAAe,CAAC;QAClE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,KAAK,EAAE;gBAC3C,IAAI;gBACJ,IAAI,EAAE,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,KAAI,cAAc;gBACvC,KAAK,EAAE,cAAc;gBACrB,MAAM,EAAE,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,YAAY,CAAA;gBAC5B,IAAI,EAAE;oBACJ,IAAI,EAAE,kBAAkB;oBACxB,SAAS;oBACT,UAAU;iBACX;aACF,CAAC,CAAC;YAEH,YAAY,CAAC,OAAO,GAAG,GAAG,EAAE;gBAC1B,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,YAAY,CAAC,KAAK,EAAE,CAAC;gBAErB,IAAI,CAAC,eAAe,CAAC,8BAA8B,EAAE;oBACnD,IAAI,EAAE,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa;oBAC9D,eAAe,EAAE,IAAI;oBACrB,OAAO,EAAE,SAAS,CAAC,gBAAgB,IAAI,UAAU,CAAC,OAAO;oBACzD,MAAM,EAAE,QAAQ;iBACjB,CAAC,CAAC;YACL,CAAC,CAAC;YAEF,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;YACzD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,IAAqB,EAAE,OAAe;QACxD,OAAO;YACL,IAAI;YACJ,OAAO;SACR,CAAC;IACJ,CAAC;IAEO,mBAAmB;QACzB,OAAO;YACL,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,GAAG;YACT,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;YACxB,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,YAAY,CAAC,MAAM;YAC3B,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,IAAI;SACf,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC5B,KAAa,EACb,iBAAyB;QAEzB,4DAA4D;QAC5D,gEAAgE;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC7B,KAAa,EACb,UAAkB;QAElB,mDAAmD;QACnD,0DAA0D;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,cAAc;QACpB,qBAAqB;QACrB,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAClE,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACzC,CAAC;QAED,eAAe;QACf,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CACxC,uBAAuB,CACxB,CAAC;QACF,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,YAAY,GAAiB,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC7D,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAC9B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAC1C,CAAC;QACJ,CAAC;QAED,sBAAsB;QACtB,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CACxC,uBAAuB,CACxB,CAAC;QACF,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACjD,CAAC;QAED,gCAAgC;QAChC,MAAM,gBAAgB,GAAG,YAAY,CAAC,OAAO,CAC3C,qCAAqC,CACtC,CAAC;QACF,IAAI,gBAAgB,EAAE,CAAC;YACrB,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,oBAAoB;QACpB,MAAM,iBAAiB,GAAG,YAAY,CAAC,OAAO,CAC5C,4BAA4B,CAC7B,CAAC;QACF,IAAI,iBAAiB,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,YAAY,CAAC,OAAO,CAClB,uBAAuB,EACvB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAClD,CAAC;QAEF,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,YAAY,CAAC,OAAO,CAClB,uBAAuB,EACvB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CACnC,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,iBAAiB;QACvB,YAAY,CAAC,OAAO,CAClB,sBAAsB,EACtB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAC5B,CAAC;IACJ,CAAC;IAEO,cAAc;QACpB,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAClE,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,YAAY,CAAC,OAAO,CAClB,4BAA4B,EAC5B,GAAG,CAAC,QAAQ,EAAE,CACf,CAAC;QACF,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,oBAAoB;QAC1B,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,YAAY,CAAC,OAAO,CAClB,4BAA4B,EAC5B,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAC5B,CAAC;IACJ,CAAC;CACF;AAED,8CAA8C;AAC9C,OAAO,EAAE,eAAe,IAAI,wBAAwB,EAAE,CAAC"}