webcodecs-node 0.5.0 → 0.5.1

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 (185) hide show
  1. package/package.json +1 -1
  2. package/dist/AudioData.d.ts +0 -6
  3. package/dist/AudioData.d.ts.map +0 -1
  4. package/dist/AudioData.js +0 -6
  5. package/dist/AudioData.js.map +0 -1
  6. package/dist/AudioDecoder.d.ts +0 -6
  7. package/dist/AudioDecoder.d.ts.map +0 -1
  8. package/dist/AudioDecoder.js +0 -6
  9. package/dist/AudioDecoder.js.map +0 -1
  10. package/dist/AudioEncoder.d.ts +0 -6
  11. package/dist/AudioEncoder.d.ts.map +0 -1
  12. package/dist/AudioEncoder.js +0 -6
  13. package/dist/AudioEncoder.js.map +0 -1
  14. package/dist/EncodedAudioChunk.d.ts +0 -6
  15. package/dist/EncodedAudioChunk.d.ts.map +0 -1
  16. package/dist/EncodedAudioChunk.js +0 -6
  17. package/dist/EncodedAudioChunk.js.map +0 -1
  18. package/dist/EncodedVideoChunk.d.ts +0 -6
  19. package/dist/EncodedVideoChunk.d.ts.map +0 -1
  20. package/dist/EncodedVideoChunk.js +0 -6
  21. package/dist/EncodedVideoChunk.js.map +0 -1
  22. package/dist/FFmpegProcess.d.ts +0 -6
  23. package/dist/FFmpegProcess.d.ts.map +0 -1
  24. package/dist/FFmpegProcess.js +0 -6
  25. package/dist/FFmpegProcess.js.map +0 -1
  26. package/dist/HardwareAcceleration.d.ts +0 -6
  27. package/dist/HardwareAcceleration.d.ts.map +0 -1
  28. package/dist/HardwareAcceleration.js +0 -6
  29. package/dist/HardwareAcceleration.js.map +0 -1
  30. package/dist/ImageDecoder.d.ts +0 -6
  31. package/dist/ImageDecoder.d.ts.map +0 -1
  32. package/dist/ImageDecoder.js +0 -6
  33. package/dist/ImageDecoder.js.map +0 -1
  34. package/dist/Logger.d.ts +0 -6
  35. package/dist/Logger.d.ts.map +0 -1
  36. package/dist/Logger.js +0 -6
  37. package/dist/Logger.js.map +0 -1
  38. package/dist/MediaCapabilities.d.ts +0 -9
  39. package/dist/MediaCapabilities.d.ts.map +0 -1
  40. package/dist/MediaCapabilities.js +0 -8
  41. package/dist/MediaCapabilities.js.map +0 -1
  42. package/dist/VideoDecoder.d.ts +0 -6
  43. package/dist/VideoDecoder.d.ts.map +0 -1
  44. package/dist/VideoDecoder.js +0 -6
  45. package/dist/VideoDecoder.js.map +0 -1
  46. package/dist/VideoEncoder.d.ts +0 -6
  47. package/dist/VideoEncoder.d.ts.map +0 -1
  48. package/dist/VideoEncoder.js +0 -6
  49. package/dist/VideoEncoder.js.map +0 -1
  50. package/dist/VideoFrame.d.ts +0 -10
  51. package/dist/VideoFrame.d.ts.map +0 -1
  52. package/dist/VideoFrame.js +0 -9
  53. package/dist/VideoFrame.js.map +0 -1
  54. package/dist/__tests__/AudioData.test.d.ts +0 -5
  55. package/dist/__tests__/AudioData.test.d.ts.map +0 -1
  56. package/dist/__tests__/AudioData.test.js +0 -180
  57. package/dist/__tests__/AudioData.test.js.map +0 -1
  58. package/dist/__tests__/AudioDecoder.test.d.ts +0 -5
  59. package/dist/__tests__/AudioDecoder.test.d.ts.map +0 -1
  60. package/dist/__tests__/AudioDecoder.test.js +0 -733
  61. package/dist/__tests__/AudioDecoder.test.js.map +0 -1
  62. package/dist/__tests__/AudioEncoder.test.d.ts +0 -5
  63. package/dist/__tests__/AudioEncoder.test.d.ts.map +0 -1
  64. package/dist/__tests__/AudioEncoder.test.js +0 -247
  65. package/dist/__tests__/AudioEncoder.test.js.map +0 -1
  66. package/dist/__tests__/EncodedChunks.test.d.ts +0 -5
  67. package/dist/__tests__/EncodedChunks.test.d.ts.map +0 -1
  68. package/dist/__tests__/EncodedChunks.test.js +0 -100
  69. package/dist/__tests__/EncodedChunks.test.js.map +0 -1
  70. package/dist/__tests__/HardwareAcceleration.test.d.ts +0 -5
  71. package/dist/__tests__/HardwareAcceleration.test.d.ts.map +0 -1
  72. package/dist/__tests__/HardwareAcceleration.test.js +0 -85
  73. package/dist/__tests__/HardwareAcceleration.test.js.map +0 -1
  74. package/dist/__tests__/ImageDecoder.test.d.ts +0 -5
  75. package/dist/__tests__/ImageDecoder.test.d.ts.map +0 -1
  76. package/dist/__tests__/ImageDecoder.test.js +0 -558
  77. package/dist/__tests__/ImageDecoder.test.js.map +0 -1
  78. package/dist/__tests__/ImageDecoder.wpt.test.d.ts +0 -8
  79. package/dist/__tests__/ImageDecoder.wpt.test.d.ts.map +0 -1
  80. package/dist/__tests__/ImageDecoder.wpt.test.js +0 -135
  81. package/dist/__tests__/ImageDecoder.wpt.test.js.map +0 -1
  82. package/dist/__tests__/MediaCapabilities.test.d.ts +0 -5
  83. package/dist/__tests__/MediaCapabilities.test.d.ts.map +0 -1
  84. package/dist/__tests__/MediaCapabilities.test.js +0 -346
  85. package/dist/__tests__/MediaCapabilities.test.js.map +0 -1
  86. package/dist/__tests__/NodeAvDecoder.test.d.ts +0 -2
  87. package/dist/__tests__/NodeAvDecoder.test.d.ts.map +0 -1
  88. package/dist/__tests__/NodeAvDecoder.test.js +0 -206
  89. package/dist/__tests__/NodeAvDecoder.test.js.map +0 -1
  90. package/dist/__tests__/NodeAvEncoder.test.d.ts +0 -2
  91. package/dist/__tests__/NodeAvEncoder.test.d.ts.map +0 -1
  92. package/dist/__tests__/NodeAvEncoder.test.js +0 -176
  93. package/dist/__tests__/NodeAvEncoder.test.js.map +0 -1
  94. package/dist/__tests__/VideoDecoder.test.d.ts +0 -5
  95. package/dist/__tests__/VideoDecoder.test.d.ts.map +0 -1
  96. package/dist/__tests__/VideoDecoder.test.js +0 -675
  97. package/dist/__tests__/VideoDecoder.test.js.map +0 -1
  98. package/dist/__tests__/VideoEncoder.test.d.ts +0 -5
  99. package/dist/__tests__/VideoEncoder.test.d.ts.map +0 -1
  100. package/dist/__tests__/VideoEncoder.test.js +0 -468
  101. package/dist/__tests__/VideoEncoder.test.js.map +0 -1
  102. package/dist/__tests__/VideoFrame.test.d.ts +0 -5
  103. package/dist/__tests__/VideoFrame.test.d.ts.map +0 -1
  104. package/dist/__tests__/VideoFrame.test.js +0 -246
  105. package/dist/__tests__/VideoFrame.test.js.map +0 -1
  106. package/dist/__tests__/aac-utils.test.d.ts +0 -2
  107. package/dist/__tests__/aac-utils.test.d.ts.map +0 -1
  108. package/dist/__tests__/aac-utils.test.js +0 -37
  109. package/dist/__tests__/aac-utils.test.js.map +0 -1
  110. package/dist/__tests__/avc-utils.test.d.ts +0 -2
  111. package/dist/__tests__/avc-utils.test.d.ts.map +0 -1
  112. package/dist/__tests__/avc-utils.test.js +0 -63
  113. package/dist/__tests__/avc-utils.test.js.map +0 -1
  114. package/dist/__tests__/hevc-utils.test.d.ts +0 -2
  115. package/dist/__tests__/hevc-utils.test.d.ts.map +0 -1
  116. package/dist/__tests__/hevc-utils.test.js +0 -78
  117. package/dist/__tests__/hevc-utils.test.js.map +0 -1
  118. package/dist/demos/demo-conversion.d.ts +0 -13
  119. package/dist/demos/demo-conversion.d.ts.map +0 -1
  120. package/dist/demos/demo-conversion.js +0 -301
  121. package/dist/demos/demo-conversion.js.map +0 -1
  122. package/dist/demos/demo-hwaccel-conversion.d.ts +0 -8
  123. package/dist/demos/demo-hwaccel-conversion.d.ts.map +0 -1
  124. package/dist/demos/demo-hwaccel-conversion.js +0 -161
  125. package/dist/demos/demo-hwaccel-conversion.js.map +0 -1
  126. package/dist/demos/demo-mediabunny.d.ts +0 -7
  127. package/dist/demos/demo-mediabunny.d.ts.map +0 -1
  128. package/dist/demos/demo-mediabunny.js +0 -78
  129. package/dist/demos/demo-mediabunny.js.map +0 -1
  130. package/dist/ffmpeg/FFmpegProcess.d.ts +0 -111
  131. package/dist/ffmpeg/FFmpegProcess.d.ts.map +0 -1
  132. package/dist/ffmpeg/FFmpegProcess.js +0 -543
  133. package/dist/ffmpeg/FFmpegProcess.js.map +0 -1
  134. package/dist/ffmpeg/audio-codecs.d.ts +0 -59
  135. package/dist/ffmpeg/audio-codecs.d.ts.map +0 -1
  136. package/dist/ffmpeg/audio-codecs.js +0 -99
  137. package/dist/ffmpeg/audio-codecs.js.map +0 -1
  138. package/dist/ffmpeg/formats.d.ts +0 -42
  139. package/dist/ffmpeg/formats.d.ts.map +0 -1
  140. package/dist/ffmpeg/formats.js +0 -147
  141. package/dist/ffmpeg/formats.js.map +0 -1
  142. package/dist/ffmpeg/index.d.ts +0 -10
  143. package/dist/ffmpeg/index.d.ts.map +0 -1
  144. package/dist/ffmpeg/index.js +0 -13
  145. package/dist/ffmpeg/index.js.map +0 -1
  146. package/dist/ffmpeg/parsers/annexb.d.ts +0 -88
  147. package/dist/ffmpeg/parsers/annexb.d.ts.map +0 -1
  148. package/dist/ffmpeg/parsers/annexb.js +0 -201
  149. package/dist/ffmpeg/parsers/annexb.js.map +0 -1
  150. package/dist/ffmpeg/parsers/index.d.ts +0 -6
  151. package/dist/ffmpeg/parsers/index.d.ts.map +0 -1
  152. package/dist/ffmpeg/parsers/index.js +0 -8
  153. package/dist/ffmpeg/parsers/index.js.map +0 -1
  154. package/dist/ffmpeg/parsers/ivf.d.ts +0 -54
  155. package/dist/ffmpeg/parsers/ivf.d.ts.map +0 -1
  156. package/dist/ffmpeg/parsers/ivf.js +0 -109
  157. package/dist/ffmpeg/parsers/ivf.js.map +0 -1
  158. package/dist/ffmpeg/types.d.ts +0 -85
  159. package/dist/ffmpeg/types.d.ts.map +0 -1
  160. package/dist/ffmpeg/types.js +0 -8
  161. package/dist/ffmpeg/types.js.map +0 -1
  162. package/dist/mediabunny/FFmpegAudioDecoder.d.ts +0 -24
  163. package/dist/mediabunny/FFmpegAudioDecoder.d.ts.map +0 -1
  164. package/dist/mediabunny/FFmpegAudioDecoder.js +0 -126
  165. package/dist/mediabunny/FFmpegAudioDecoder.js.map +0 -1
  166. package/dist/mediabunny/FFmpegAudioEncoder.d.ts +0 -44
  167. package/dist/mediabunny/FFmpegAudioEncoder.d.ts.map +0 -1
  168. package/dist/mediabunny/FFmpegAudioEncoder.js +0 -221
  169. package/dist/mediabunny/FFmpegAudioEncoder.js.map +0 -1
  170. package/dist/mediabunny/FFmpegVideoDecoder.d.ts +0 -25
  171. package/dist/mediabunny/FFmpegVideoDecoder.d.ts.map +0 -1
  172. package/dist/mediabunny/FFmpegVideoDecoder.js +0 -122
  173. package/dist/mediabunny/FFmpegVideoDecoder.js.map +0 -1
  174. package/dist/mediabunny/FFmpegVideoEncoder.d.ts +0 -49
  175. package/dist/mediabunny/FFmpegVideoEncoder.d.ts.map +0 -1
  176. package/dist/mediabunny/FFmpegVideoEncoder.js +0 -264
  177. package/dist/mediabunny/FFmpegVideoEncoder.js.map +0 -1
  178. package/dist/mediabunny/index.d.ts +0 -21
  179. package/dist/mediabunny/index.d.ts.map +0 -1
  180. package/dist/mediabunny/index.js +0 -33
  181. package/dist/mediabunny/index.js.map +0 -1
  182. package/dist/types.d.ts +0 -6
  183. package/dist/types.d.ts.map +0 -1
  184. package/dist/types.js +0 -6
  185. package/dist/types.js.map +0 -1
@@ -1,558 +0,0 @@
1
- /**
2
- * Tests for ImageDecoder class - including animated image support
3
- */
4
- import { describe, it, expect } from 'vitest';
5
- import { ImageDecoder } from '../ImageDecoder.js';
6
- import * as fs from 'fs';
7
- import * as path from 'path';
8
- import { fileURLToPath } from 'url';
9
- const __filename = fileURLToPath(import.meta.url);
10
- const __dirname = path.dirname(__filename);
11
- const TEST_IMAGES_DIR = '/tmp/webcodecs-test-images';
12
- const FIXTURE_IMAGES_DIR = path.join(__dirname, 'fixtures');
13
- /**
14
- * Helper to convert Node.js Buffer to ArrayBuffer properly.
15
- * Node.js Buffer.buffer may be larger than the actual data.
16
- */
17
- function bufferToArrayBuffer(buffer) {
18
- const ab = new ArrayBuffer(buffer.length);
19
- new Uint8Array(ab).set(buffer);
20
- return ab;
21
- }
22
- describe('ImageDecoder', () => {
23
- describe('static images', () => {
24
- it('should decode a static PNG image', async () => {
25
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
26
- if (!fs.existsSync(pngPath)) {
27
- console.log('Skipping test: test.png not found');
28
- return;
29
- }
30
- const data = fs.readFileSync(pngPath);
31
- const decoder = new ImageDecoder({
32
- data: bufferToArrayBuffer(data),
33
- type: 'image/png',
34
- });
35
- await decoder.completed;
36
- expect(decoder.tracks.length).toBeGreaterThan(0);
37
- const track = decoder.tracks.selectedTrack;
38
- expect(track).toBeDefined();
39
- expect(track.frameCount).toBe(1);
40
- expect(track.animated).toBe(false);
41
- const result = await decoder.decode({ frameIndex: 0 });
42
- expect(result.image).toBeDefined();
43
- expect(result.image.codedWidth).toBeGreaterThan(0);
44
- expect(result.image.codedHeight).toBeGreaterThan(0);
45
- result.image.close();
46
- decoder.close();
47
- });
48
- it('should decode a static JPEG image', async () => {
49
- const jpgPath = path.join(TEST_IMAGES_DIR, 'test.jpg');
50
- if (!fs.existsSync(jpgPath)) {
51
- console.log('Skipping test: test.jpg not found');
52
- return;
53
- }
54
- const data = fs.readFileSync(jpgPath);
55
- const decoder = new ImageDecoder({
56
- data: bufferToArrayBuffer(data),
57
- type: 'image/jpeg',
58
- });
59
- await decoder.completed;
60
- const track = decoder.tracks.selectedTrack;
61
- expect(track.animated).toBe(false);
62
- expect(track.frameCount).toBe(1);
63
- decoder.close();
64
- });
65
- it('should decode a static WebP image', async () => {
66
- const webpPath = path.join(TEST_IMAGES_DIR, 'test.webp');
67
- if (!fs.existsSync(webpPath)) {
68
- console.log('Skipping test: test.webp not found');
69
- return;
70
- }
71
- const data = fs.readFileSync(webpPath);
72
- const decoder = new ImageDecoder({
73
- data: bufferToArrayBuffer(data),
74
- type: 'image/webp',
75
- });
76
- await decoder.completed;
77
- const track = decoder.tracks.selectedTrack;
78
- expect(track.animated).toBe(false);
79
- decoder.close();
80
- });
81
- it('should decode an AVIF image', async () => {
82
- const avifPath = path.join(TEST_IMAGES_DIR, 'test.avif');
83
- if (!fs.existsSync(avifPath)) {
84
- console.log('Skipping test: test.avif not found');
85
- return;
86
- }
87
- const data = fs.readFileSync(avifPath);
88
- const decoder = new ImageDecoder({
89
- data: bufferToArrayBuffer(data),
90
- type: 'image/avif',
91
- });
92
- await decoder.completed;
93
- const track = decoder.tracks.selectedTrack;
94
- expect(track).toBeDefined();
95
- expect(track.frameCount).toBeGreaterThanOrEqual(1);
96
- const result = await decoder.decode({ frameIndex: 0 });
97
- expect(result.image).toBeDefined();
98
- expect(result.image.codedWidth).toBeGreaterThan(0);
99
- expect(result.image.codedHeight).toBeGreaterThan(0);
100
- result.image.close();
101
- decoder.close();
102
- });
103
- it('should decode a BMP image', async () => {
104
- const bmpPath = path.join(TEST_IMAGES_DIR, 'test.bmp');
105
- if (!fs.existsSync(bmpPath)) {
106
- console.log('Skipping test: test.bmp not found');
107
- return;
108
- }
109
- const data = fs.readFileSync(bmpPath);
110
- const decoder = new ImageDecoder({
111
- data: bufferToArrayBuffer(data),
112
- type: 'image/bmp',
113
- });
114
- await decoder.completed;
115
- const track = decoder.tracks.selectedTrack;
116
- expect(track).toBeDefined();
117
- expect(track.animated).toBe(false);
118
- const result = await decoder.decode({ frameIndex: 0 });
119
- expect(result.image.codedWidth).toBeGreaterThan(0);
120
- result.image.close();
121
- decoder.close();
122
- });
123
- });
124
- describe('animated images', () => {
125
- it('should decode an animated GIF with multiple frames', async () => {
126
- const gifPath = path.join(TEST_IMAGES_DIR, 'animated_multi.gif');
127
- if (!fs.existsSync(gifPath)) {
128
- console.log('Skipping test: animated_multi.gif not found');
129
- return;
130
- }
131
- const data = fs.readFileSync(gifPath);
132
- const decoder = new ImageDecoder({
133
- data: bufferToArrayBuffer(data),
134
- type: 'image/gif',
135
- });
136
- await decoder.completed;
137
- const track = decoder.tracks.selectedTrack;
138
- if (!track || !track.animated || track.frameCount <= 1) {
139
- console.log('Skipping test: FFmpeg could not detect GIF animation');
140
- decoder.close();
141
- return;
142
- }
143
- // Decode first frame
144
- const result1 = await decoder.decode({ frameIndex: 0 });
145
- expect(result1.image).toBeDefined();
146
- expect(result1.image.timestamp).toBe(0);
147
- // Decode second frame - should have a later timestamp
148
- const result2 = await decoder.decode({ frameIndex: 1 });
149
- expect(result2.image).toBeDefined();
150
- expect(result2.image.timestamp).toBeGreaterThan(0);
151
- result1.image.close();
152
- result2.image.close();
153
- decoder.close();
154
- });
155
- it('should parse frame durations from animated GIF', async () => {
156
- const gifPath = path.join(TEST_IMAGES_DIR, 'animated_multi.gif');
157
- if (!fs.existsSync(gifPath)) {
158
- console.log('Skipping test: animated_multi.gif not found');
159
- return;
160
- }
161
- const data = fs.readFileSync(gifPath);
162
- const decoder = new ImageDecoder({
163
- data: bufferToArrayBuffer(data),
164
- type: 'image/gif',
165
- });
166
- await decoder.completed;
167
- const track = decoder.tracks.selectedTrack;
168
- expect(track.frameCount).toBeGreaterThan(1);
169
- // Each frame should have a duration
170
- const frame0 = await decoder.decode({ frameIndex: 0 });
171
- const frame1 = await decoder.decode({ frameIndex: 1 });
172
- // Duration should be in microseconds (40ms = 40000 microseconds)
173
- expect(frame0.image.duration).toBeGreaterThan(0);
174
- expect(frame1.image.duration).toBeGreaterThan(0);
175
- // Timestamp of frame 1 should be >= duration of frame 0
176
- expect(frame1.image.timestamp).toBeGreaterThanOrEqual(frame0.image.duration);
177
- frame0.image.close();
178
- frame1.image.close();
179
- decoder.close();
180
- });
181
- it('should report correct repetitionCount for animated GIF', async () => {
182
- const gifPath = path.join(TEST_IMAGES_DIR, 'animated_multi.gif');
183
- if (!fs.existsSync(gifPath)) {
184
- console.log('Skipping test: animated_multi.gif not found');
185
- return;
186
- }
187
- const data = fs.readFileSync(gifPath);
188
- const decoder = new ImageDecoder({
189
- data: bufferToArrayBuffer(data),
190
- type: 'image/gif',
191
- });
192
- await decoder.completed;
193
- const track = decoder.tracks.selectedTrack;
194
- // GIF with loop 0 should be Infinity
195
- expect(track.repetitionCount).toBeDefined();
196
- // For a looping GIF, repetitionCount is typically Infinity
197
- expect(track.repetitionCount).toBeGreaterThanOrEqual(0);
198
- decoder.close();
199
- });
200
- it('should decode frames sequentially with correct timestamps', async () => {
201
- const gifPath = path.join(TEST_IMAGES_DIR, 'animated_multi.gif');
202
- if (!fs.existsSync(gifPath)) {
203
- console.log('Skipping test: animated_multi.gif not found');
204
- return;
205
- }
206
- const data = fs.readFileSync(gifPath);
207
- const decoder = new ImageDecoder({
208
- data: bufferToArrayBuffer(data),
209
- type: 'image/gif',
210
- });
211
- await decoder.completed;
212
- const track = decoder.tracks.selectedTrack;
213
- const frameCount = track.frameCount;
214
- // Decode all frames and verify timestamps are increasing
215
- let lastTimestamp = -1;
216
- const frames = [];
217
- for (let i = 0; i < Math.min(frameCount, 5); i++) {
218
- const result = await decoder.decode({ frameIndex: i });
219
- expect(result.image.timestamp).toBeGreaterThan(lastTimestamp);
220
- lastTimestamp = result.image.timestamp;
221
- frames.push(result.image);
222
- }
223
- // Cleanup
224
- frames.forEach((f) => f.close());
225
- decoder.close();
226
- });
227
- // Animated WebP decoding has known issues due to FFmpeg's webp demuxer
228
- // skipping ANIM/ANMF chunks, resulting in "image data not found" errors.
229
- // This is a fundamental FFmpeg limitation that affects both node-av and CLI.
230
- it.skip('should decode an animated WebP with multiple frames', async () => {
231
- const candidatePath = path.join(TEST_IMAGES_DIR, 'animated_multi.webp');
232
- const fallbackPath = path.join(FIXTURE_IMAGES_DIR, 'animated_multi.webp');
233
- const webpPath = fs.existsSync(fallbackPath) ? fallbackPath : candidatePath;
234
- if (!fs.existsSync(webpPath)) {
235
- console.log('Skipping test: animated_multi.webp not found');
236
- return;
237
- }
238
- const data = fs.readFileSync(webpPath);
239
- const decoder = new ImageDecoder({
240
- data: bufferToArrayBuffer(data),
241
- type: 'image/webp',
242
- });
243
- try {
244
- await decoder.completed;
245
- }
246
- catch {
247
- // FFmpeg's webp demuxer fails with "image data not found" on animated WebP
248
- console.log('Skipping test: FFmpeg cannot decode animated WebP (known limitation)');
249
- decoder.close();
250
- return;
251
- }
252
- const track = decoder.tracks.selectedTrack;
253
- if (!track || !track.animated || track.frameCount <= 1) {
254
- console.log('Skipping test: FFmpeg could not decode animated WebP frames (known limitation)');
255
- decoder.close();
256
- return;
257
- }
258
- // Decode first frame
259
- const result1 = await decoder.decode({ frameIndex: 0 });
260
- expect(result1.image).toBeDefined();
261
- expect(result1.image.codedWidth).toBeGreaterThan(0);
262
- // Decode second frame
263
- const result2 = await decoder.decode({ frameIndex: 1 });
264
- expect(result2.image).toBeDefined();
265
- expect(result2.image.timestamp).toBeGreaterThan(0);
266
- result1.image.close();
267
- result2.image.close();
268
- decoder.close();
269
- });
270
- it('should handle static GIF as non-animated', async () => {
271
- const gifPath = path.join(TEST_IMAGES_DIR, 'test.gif');
272
- if (!fs.existsSync(gifPath)) {
273
- console.log('Skipping test: test.gif not found');
274
- return;
275
- }
276
- const data = fs.readFileSync(gifPath);
277
- const decoder = new ImageDecoder({
278
- data: bufferToArrayBuffer(data),
279
- type: 'image/gif',
280
- });
281
- await decoder.completed;
282
- const track = decoder.tracks.selectedTrack;
283
- // A single-frame GIF should not be marked as animated
284
- if (track.frameCount === 1) {
285
- expect(track.animated).toBe(false);
286
- }
287
- decoder.close();
288
- });
289
- });
290
- describe('isTypeSupported', () => {
291
- it('should support common image formats', async () => {
292
- expect(await ImageDecoder.isTypeSupported('image/png')).toBe(true);
293
- expect(await ImageDecoder.isTypeSupported('image/jpeg')).toBe(true);
294
- expect(await ImageDecoder.isTypeSupported('image/gif')).toBe(true);
295
- expect(await ImageDecoder.isTypeSupported('image/webp')).toBe(true);
296
- expect(await ImageDecoder.isTypeSupported('image/bmp')).toBe(true);
297
- expect(await ImageDecoder.isTypeSupported('image/avif')).toBe(true);
298
- expect(await ImageDecoder.isTypeSupported('image/tiff')).toBe(true);
299
- expect(await ImageDecoder.isTypeSupported('image/apng')).toBe(true);
300
- });
301
- it('should return false for unsupported types', async () => {
302
- expect(await ImageDecoder.isTypeSupported('image/unknownformat')).toBe(false);
303
- expect(await ImageDecoder.isTypeSupported('video/mp4')).toBe(false);
304
- });
305
- });
306
- describe('error handling', () => {
307
- it('should reject for invalid image data', async () => {
308
- const decoder = new ImageDecoder({
309
- data: new ArrayBuffer(100), // Invalid image data
310
- type: 'image/png',
311
- });
312
- await expect(decoder.completed).rejects.toThrow();
313
- });
314
- it('should reject for unsupported image type', async () => {
315
- const decoder = new ImageDecoder({
316
- data: new ArrayBuffer(100),
317
- type: 'image/unknownformat',
318
- });
319
- await expect(decoder.completed).rejects.toThrow();
320
- });
321
- });
322
- describe('decode options', () => {
323
- it('should decode specific frame by index', async () => {
324
- const gifPath = path.join(TEST_IMAGES_DIR, 'animated_multi.gif');
325
- if (!fs.existsSync(gifPath)) {
326
- console.log('Skipping test: animated_multi.gif not found');
327
- return;
328
- }
329
- const data = fs.readFileSync(gifPath);
330
- const decoder = new ImageDecoder({
331
- data: bufferToArrayBuffer(data),
332
- type: 'image/gif',
333
- });
334
- await decoder.completed;
335
- const track = decoder.tracks.selectedTrack;
336
- if (track.frameCount > 2) {
337
- // Decode frame at index 2 directly
338
- const result = await decoder.decode({ frameIndex: 2 });
339
- expect(result.image).toBeDefined();
340
- // Frame 2 timestamp should be sum of durations of frames 0 and 1
341
- expect(result.image.timestamp).toBeGreaterThan(0);
342
- result.image.close();
343
- }
344
- decoder.close();
345
- });
346
- it('should report completeFramesOnly in decode result', async () => {
347
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
348
- if (!fs.existsSync(pngPath)) {
349
- console.log('Skipping test: test.png not found');
350
- return;
351
- }
352
- const data = fs.readFileSync(pngPath);
353
- const decoder = new ImageDecoder({
354
- data: bufferToArrayBuffer(data),
355
- type: 'image/png',
356
- });
357
- await decoder.completed;
358
- const result = await decoder.decode({ frameIndex: 0 });
359
- expect(result.complete).toBe(true);
360
- result.image.close();
361
- decoder.close();
362
- });
363
- it('should allow decode with completeFramesOnly set to false', async () => {
364
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
365
- if (!fs.existsSync(pngPath)) {
366
- console.log('Skipping test: test.png not found');
367
- return;
368
- }
369
- const data = fs.readFileSync(pngPath);
370
- const decoder = new ImageDecoder({
371
- data: bufferToArrayBuffer(data),
372
- type: 'image/png',
373
- });
374
- await decoder.completed;
375
- const result = await decoder.decode({ frameIndex: 0, completeFramesOnly: false });
376
- expect(result.complete).toBe(true);
377
- result.image.close();
378
- decoder.close();
379
- });
380
- it('should reset and re-decode frames', async () => {
381
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
382
- if (!fs.existsSync(pngPath)) {
383
- console.log('Skipping test: test.png not found');
384
- return;
385
- }
386
- const data = fs.readFileSync(pngPath);
387
- const decoder = new ImageDecoder({
388
- data: bufferToArrayBuffer(data),
389
- type: 'image/png',
390
- });
391
- await decoder.completed;
392
- const first = await decoder.decode({ frameIndex: 0 });
393
- first.image.close();
394
- decoder.reset();
395
- await decoder.completed;
396
- const second = await decoder.decode({ frameIndex: 0 });
397
- expect(second.image.codedWidth).toBeGreaterThan(0);
398
- second.image.close();
399
- decoder.close();
400
- });
401
- });
402
- describe('WebCodecs API compliance', () => {
403
- it('should have type property matching constructor input', async () => {
404
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
405
- if (!fs.existsSync(pngPath)) {
406
- console.log('Skipping test: test.png not found');
407
- return;
408
- }
409
- const data = fs.readFileSync(pngPath);
410
- const decoder = new ImageDecoder({
411
- data: bufferToArrayBuffer(data),
412
- type: 'image/png',
413
- });
414
- expect(decoder.type).toBe('image/png');
415
- decoder.close();
416
- });
417
- it('should have complete property that becomes true after data is loaded', async () => {
418
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
419
- if (!fs.existsSync(pngPath)) {
420
- console.log('Skipping test: test.png not found');
421
- return;
422
- }
423
- const data = fs.readFileSync(pngPath);
424
- const decoder = new ImageDecoder({
425
- data: bufferToArrayBuffer(data),
426
- type: 'image/png',
427
- });
428
- await decoder.completed;
429
- expect(decoder.complete).toBe(true);
430
- decoder.close();
431
- });
432
- it('should have tracks.ready promise that resolves', async () => {
433
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
434
- if (!fs.existsSync(pngPath)) {
435
- console.log('Skipping test: test.png not found');
436
- return;
437
- }
438
- const data = fs.readFileSync(pngPath);
439
- const decoder = new ImageDecoder({
440
- data: bufferToArrayBuffer(data),
441
- type: 'image/png',
442
- });
443
- await decoder.tracks.ready;
444
- expect(decoder.tracks.length).toBeGreaterThan(0);
445
- expect(decoder.tracks.selectedIndex).toBeGreaterThanOrEqual(0);
446
- expect(decoder.tracks.selectedTrack).not.toBeNull();
447
- decoder.close();
448
- });
449
- it('should support transfer parameter for zero-copy', async () => {
450
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
451
- if (!fs.existsSync(pngPath)) {
452
- console.log('Skipping test: test.png not found');
453
- return;
454
- }
455
- const data = fs.readFileSync(pngPath);
456
- const arrayBuffer = bufferToArrayBuffer(data);
457
- // Create decoder with transfer - should take ownership
458
- const decoder = new ImageDecoder({
459
- data: arrayBuffer,
460
- type: 'image/png',
461
- transfer: [arrayBuffer],
462
- });
463
- await decoder.completed;
464
- expect(decoder.complete).toBe(true);
465
- const result = await decoder.decode({ frameIndex: 0 });
466
- expect(result.image.codedWidth).toBeGreaterThan(0);
467
- result.image.close();
468
- decoder.close();
469
- });
470
- it('should throw InvalidStateError when decoding after close', async () => {
471
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
472
- if (!fs.existsSync(pngPath)) {
473
- console.log('Skipping test: test.png not found');
474
- return;
475
- }
476
- const data = fs.readFileSync(pngPath);
477
- const decoder = new ImageDecoder({
478
- data: bufferToArrayBuffer(data),
479
- type: 'image/png',
480
- });
481
- await decoder.completed;
482
- decoder.close();
483
- await expect(decoder.decode({ frameIndex: 0 })).rejects.toThrow('ImageDecoder is closed');
484
- });
485
- it('should throw InvalidStateError for out of range frame index', async () => {
486
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
487
- if (!fs.existsSync(pngPath)) {
488
- console.log('Skipping test: test.png not found');
489
- return;
490
- }
491
- const data = fs.readFileSync(pngPath);
492
- const decoder = new ImageDecoder({
493
- data: bufferToArrayBuffer(data),
494
- type: 'image/png',
495
- });
496
- await decoder.completed;
497
- // PNG has only 1 frame, so index 1 should fail
498
- await expect(decoder.decode({ frameIndex: 1 })).rejects.toThrow();
499
- decoder.close();
500
- });
501
- it('should throw InvalidStateError when reset after close', async () => {
502
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
503
- if (!fs.existsSync(pngPath)) {
504
- console.log('Skipping test: test.png not found');
505
- return;
506
- }
507
- const data = fs.readFileSync(pngPath);
508
- const decoder = new ImageDecoder({
509
- data: bufferToArrayBuffer(data),
510
- type: 'image/png',
511
- });
512
- await decoder.completed;
513
- decoder.close();
514
- expect(() => decoder.reset()).toThrow('ImageDecoder is closed');
515
- });
516
- it('should return ImageTrack with correct properties', async () => {
517
- const gifPath = path.join(TEST_IMAGES_DIR, 'animated_multi.gif');
518
- if (!fs.existsSync(gifPath)) {
519
- console.log('Skipping test: animated_multi.gif not found');
520
- return;
521
- }
522
- const data = fs.readFileSync(gifPath);
523
- const decoder = new ImageDecoder({
524
- data: bufferToArrayBuffer(data),
525
- type: 'image/gif',
526
- });
527
- await decoder.completed;
528
- const track = decoder.tracks.selectedTrack;
529
- // Check all required ImageTrack properties per spec
530
- expect(typeof track.animated).toBe('boolean');
531
- expect(typeof track.frameCount).toBe('number');
532
- expect(typeof track.repetitionCount).toBe('number');
533
- expect(typeof track.selected).toBe('boolean');
534
- expect(track.animated).toBe(true);
535
- expect(track.frameCount).toBeGreaterThan(1);
536
- expect(track.selected).toBe(true);
537
- decoder.close();
538
- });
539
- it('should iterate over tracks with Symbol.iterator', async () => {
540
- const pngPath = path.join(TEST_IMAGES_DIR, 'test.png');
541
- if (!fs.existsSync(pngPath)) {
542
- console.log('Skipping test: test.png not found');
543
- return;
544
- }
545
- const data = fs.readFileSync(pngPath);
546
- const decoder = new ImageDecoder({
547
- data: bufferToArrayBuffer(data),
548
- type: 'image/png',
549
- });
550
- await decoder.completed;
551
- // Should be iterable
552
- const tracks = [...decoder.tracks];
553
- expect(tracks.length).toBe(decoder.tracks.length);
554
- decoder.close();
555
- });
556
- });
557
- });
558
- //# sourceMappingURL=ImageDecoder.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ImageDecoder.test.js","sourceRoot":"","sources":["../../src/__tests__/ImageDecoder.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAuB,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,MAAM,eAAe,GAAG,4BAA4B,CAAC;AACrD,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAE5D;;;GAGG;AACH,SAAS,mBAAmB,CAAC,MAAc;IACzC,MAAM,EAAE,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,SAAS,CAAC;YAExB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,CAAC,KAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEpC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAEpD,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,YAAY;aACnB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,SAAS,CAAC;YAExB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;YAC3C,MAAM,CAAC,KAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,CAAC,KAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAElC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;YACzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,YAAY;aACnB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,SAAS,CAAC;YAExB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;YAC3C,MAAM,CAAC,KAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEpC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;YACzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,YAAY;aACnB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,SAAS,CAAC;YAExB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAM,CAAC,UAAU,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAEpD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAEpD,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,SAAS,CAAC;YAExB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEpC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAEnD,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;YACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;gBAC3D,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,SAAS,CAAC;YAExB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;YAC3C,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;gBACpE,OAAO,CAAC,KAAK,EAAE,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,qBAAqB;YACrB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACxD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAExC,sDAAsD;YACtD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACxD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAEnD,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;YACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;gBAC3D,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,SAAS,CAAC;YAExB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;YAC3C,MAAM,CAAC,KAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAE7C,oCAAoC;YACpC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YAEvD,iEAAiE;YACjE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAEjD,wDAAwD;YACxD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,QAAS,CAAC,CAAC;YAE9E,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACrB,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;YACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;gBAC3D,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,SAAS,CAAC;YAExB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;YAC3C,qCAAqC;YACrC,MAAM,CAAC,KAAM,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7C,2DAA2D;YAC3D,MAAM,CAAC,KAAM,CAAC,eAAe,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAEzD,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;YACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;gBAC3D,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,SAAS,CAAC;YAExB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;YAC3C,MAAM,UAAU,GAAG,KAAM,CAAC,UAAU,CAAC;YAErC,yDAAyD;YACzD,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC;YACvB,MAAM,MAAM,GAAG,EAAE,CAAC;YAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACjD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;gBACvD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;gBAC9D,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;YAED,UAAU;YACV,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACjC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,uEAAuE;QACvE,yEAAyE;QACzE,6EAA6E;QAC7E,EAAE,CAAC,IAAI,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC;YACxE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,CAAC;YAC1E,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC;YAC5E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;gBAC5D,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,YAAY;aACnB,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,SAAS,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACP,2EAA2E;gBAC3E,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;gBACpF,OAAO,CAAC,KAAK,EAAE,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;YAC3C,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC;gBAC9F,OAAO,CAAC,KAAK,EAAE,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,qBAAqB;YACrB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACxD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAEpD,sBAAsB;YACtB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACxD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAEnD,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,SAAS,CAAC;YAExB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;YAC3C,sDAAsD;YACtD,IAAI,KAAM,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,CAAC,KAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtC,CAAC;YAED,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,CAAC,MAAM,YAAY,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,YAAY,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,YAAY,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,YAAY,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,YAAY,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,YAAY,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,YAAY,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,YAAY,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,CAAC,MAAM,YAAY,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9E,MAAM,CAAC,MAAM,YAAY,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,qBAAqB;gBACjD,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,IAAI,WAAW,CAAC,GAAG,CAAC;gBAC1B,IAAI,EAAE,qBAAqB;aAC5B,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;YACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;gBAC3D,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,SAAS,CAAC;YAExB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;YAC3C,IAAI,KAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;gBAC1B,mCAAmC;gBACnC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;gBACvD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;gBACnC,iEAAiE;gBACjE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;gBAClD,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;YAED,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,SAAS,CAAC;YAExB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEnC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,SAAS,CAAC;YAExB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAAC;YAClF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,SAAS,CAAC;YACxB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACtD,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAEpB,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,CAAC,SAAS,CAAC;YACxB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;YAEH,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACvC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;YACpF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,SAAS,CAAC;YACxB,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;YAC3B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAC/D,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACpD,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAE9C,uDAAuD;YACvD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,CAAC,WAAW,CAAC;aACxB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,SAAS,CAAC;YACxB,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEpC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,SAAS,CAAC;YACxB,OAAO,CAAC,KAAK,EAAE,CAAC;YAEhB,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;YAC3E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,SAAS,CAAC;YAExB,+CAA+C;YAC/C,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAClE,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,SAAS,CAAC;YACxB,OAAO,CAAC,KAAK,EAAE,CAAC;YAEhB,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;YACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;gBAC3D,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,SAAS,CAAC;YAExB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,aAAc,CAAC;YAE5C,oDAAoD;YACpD,MAAM,CAAC,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,CAAC,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,KAAK,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,CAAC,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAE9C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAElC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAC/B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,SAAS,CAAC;YAExB,qBAAqB;YACrB,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAElD,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,8 +0,0 @@
1
- /**
2
- * Adapted WebCodecs ImageDecoder tests from WPT assets.
3
- *
4
- * Focuses on verifying JPEG EXIF orientation handling for both RGB and
5
- * 4:2:0 YUV inputs using the four-colors fixtures.
6
- */
7
- export {};
8
- //# sourceMappingURL=ImageDecoder.wpt.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ImageDecoder.wpt.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ImageDecoder.wpt.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}