@revideo/ffmpeg 0.2.4-alpha.894 → 0.2.4-alpha.897

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.
@@ -1,316 +1,294 @@
1
- 'use strict';
2
- Object.defineProperty(exports, '__esModule', {value: true});
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.FFmpegExporterServer = exports.getCurrentVersion = void 0;
4
- const ffmpeg_1 = require('@ffmpeg-installer/ffmpeg');
5
- const ffprobe_1 = require('@ffprobe-installer/ffprobe');
6
- const ffmpeg = require('fluent-ffmpeg');
7
- const fs = require('fs');
8
- const os = require('os');
9
- const path = require('path');
10
- const uuid_1 = require('uuid');
11
- const ImageStream_1 = require('./ImageStream');
12
- const posthog_1 = require('./telemetry/posthog');
13
- const fsPromises = require('fs/promises');
4
+ const ffmpeg_1 = require("@ffmpeg-installer/ffmpeg");
5
+ const ffprobe_1 = require("@ffprobe-installer/ffprobe");
6
+ const ffmpeg = require("fluent-ffmpeg");
7
+ const fs = require("fs");
8
+ const os = require("os");
9
+ const path = require("path");
10
+ const uuid_1 = require("uuid");
11
+ const ImageStream_1 = require("./ImageStream");
12
+ const posthog_1 = require("./telemetry/posthog");
13
+ const fsPromises = require("fs/promises");
14
14
  const SAMPLE_RATE = 48000;
15
15
  ffmpeg.setFfmpegPath(ffmpeg_1.path);
16
16
  ffmpeg.setFfprobePath(ffprobe_1.path);
17
17
  async function getCurrentVersion() {
18
- try {
19
- const packageData = JSON.parse(
20
- await fsPromises.readFile(
21
- path.join(__dirname, '..', '..', 'package.json'),
22
- 'utf-8',
23
- ),
24
- );
25
- return packageData.version;
26
- } catch (e) {
27
- return 'ERROR';
28
- }
18
+ try {
19
+ const packageData = JSON.parse(await fsPromises.readFile(path.join(__dirname, '..', '..', 'package.json'), 'utf-8'));
20
+ return packageData.version;
21
+ }
22
+ catch (e) {
23
+ return 'ERROR';
24
+ }
29
25
  }
30
26
  exports.getCurrentVersion = getCurrentVersion;
31
27
  /**
32
28
  * The server-side implementation of the FFmpeg video exporter.
33
29
  */
34
30
  class FFmpegExporterServer {
35
- constructor(settings, config) {
36
- this.config = config;
37
- this.settings = settings;
38
- this.jobFolder = path.join(os.tmpdir(), `revideo-${(0, uuid_1.v4)()}`);
39
- this.stream = new ImageStream_1.ImageStream();
40
- this.command = ffmpeg();
41
- // Input image sequence
42
- this.command
43
- .input(this.stream)
44
- .inputFormat('image2pipe')
45
- .inputFps(settings.fps);
46
- // Input audio file
47
- if (settings.includeAudio && settings.audio) {
48
- this.command
49
- .input(settings.audio.slice(1))
50
- // FIXME Offset only works for negative values.
51
- .inputOptions([`-itsoffset ${settings.audioOffset ?? 0}`]);
52
- }
53
- // Output settings
54
- const size = {
55
- x: Math.round(settings.size.x * settings.resolutionScale),
56
- y: Math.round(settings.size.y * settings.resolutionScale),
57
- };
58
- this.command
59
- .output(path.join(this.jobFolder, `visuals.mp4`))
60
- .outputOptions(['-pix_fmt yuv420p', '-shortest'])
61
- .outputFps(settings.fps)
62
- .size(`${size.x}x${size.y}`);
63
- if (settings.fastStart) {
64
- this.command.outputOptions(['-movflags +faststart']);
31
+ constructor(settings, config) {
32
+ this.config = config;
33
+ this.settings = settings;
34
+ this.jobFolder = path.join(os.tmpdir(), `revideo-${(0, uuid_1.v4)()}`);
35
+ this.stream = new ImageStream_1.ImageStream();
36
+ this.command = ffmpeg();
37
+ // Input image sequence
38
+ this.command
39
+ .input(this.stream)
40
+ .inputFormat('image2pipe')
41
+ .inputFps(settings.fps);
42
+ // Input audio file
43
+ if (settings.includeAudio && settings.audio) {
44
+ this.command
45
+ .input(settings.audio.slice(1))
46
+ // FIXME Offset only works for negative values.
47
+ .inputOptions([`-itsoffset ${settings.audioOffset ?? 0}`]);
48
+ }
49
+ // Output settings
50
+ const size = {
51
+ x: Math.round(settings.size.x * settings.resolutionScale),
52
+ y: Math.round(settings.size.y * settings.resolutionScale),
53
+ };
54
+ this.command
55
+ .output(path.join(this.jobFolder, `visuals.mp4`))
56
+ .outputOptions(['-pix_fmt yuv420p', '-shortest'])
57
+ .outputFps(settings.fps)
58
+ .size(`${size.x}x${size.y}`);
59
+ if (settings.fastStart) {
60
+ this.command.outputOptions(['-movflags +faststart']);
61
+ }
62
+ this.promise = new Promise((resolve, reject) => {
63
+ this.command.on('end', resolve).on('error', reject);
64
+ });
65
65
  }
66
- this.promise = new Promise((resolve, reject) => {
67
- this.command.on('end', resolve).on('error', reject);
68
- });
69
- }
70
- async start() {
71
- const version = await getCurrentVersion();
72
- (0, posthog_1.sendEvent)(posthog_1.EventName.RenderStarted, {version});
73
- if (!fs.existsSync(this.config.output)) {
74
- await fs.promises.mkdir(this.config.output, {recursive: true});
66
+ async start() {
67
+ const version = await getCurrentVersion();
68
+ (0, posthog_1.sendEvent)(posthog_1.EventName.RenderStarted, { version });
69
+ if (!fs.existsSync(this.config.output)) {
70
+ await fs.promises.mkdir(this.config.output, { recursive: true });
71
+ }
72
+ if (!fs.existsSync(this.jobFolder)) {
73
+ await fs.promises.mkdir(this.jobFolder, { recursive: true });
74
+ }
75
+ this.command.run();
75
76
  }
76
- if (!fs.existsSync(this.jobFolder)) {
77
- await fs.promises.mkdir(this.jobFolder, {recursive: true});
77
+ async handleFrame({ data }) {
78
+ const base64Data = data.slice(data.indexOf(',') + 1);
79
+ this.stream.pushImage(Buffer.from(base64Data, 'base64'));
78
80
  }
79
- this.command.run();
80
- }
81
- async handleFrame({data}) {
82
- const base64Data = data.slice(data.indexOf(',') + 1);
83
- this.stream.pushImage(Buffer.from(base64Data, 'base64'));
84
- }
85
- async generateAudio({assets, endFrame}) {
86
- const assetPositions = getAssetPlacement(assets);
87
- const audioFilenames = [];
88
- for (const asset of assetPositions) {
89
- let hasAudioStream = true;
90
- if (asset.type !== 'audio') {
91
- hasAudioStream = await this.checkForAudioStream(asset);
92
- }
93
- if (asset.playbackRate !== 0 && asset.volume !== 0 && hasAudioStream) {
94
- const filename = await this.prepareAudio(asset, endFrame);
95
- audioFilenames.push(filename);
96
- }
81
+ async generateAudio({ assets, endFrame, }) {
82
+ const assetPositions = getAssetPlacement(assets);
83
+ const audioFilenames = [];
84
+ for (const asset of assetPositions) {
85
+ let hasAudioStream = true;
86
+ if (asset.type !== 'audio') {
87
+ hasAudioStream = await this.checkForAudioStream(asset);
88
+ }
89
+ if (asset.playbackRate !== 0 && asset.volume !== 0 && hasAudioStream) {
90
+ const filename = await this.prepareAudio(asset, endFrame);
91
+ audioFilenames.push(filename);
92
+ }
93
+ }
94
+ if (audioFilenames.length > 0) {
95
+ await this.mergeAudioTracks(audioFilenames);
96
+ await this.mergeAudioWithVideo(path.join(this.jobFolder, `audio.wav`), path.join(this.jobFolder, `visuals.mp4`));
97
+ }
98
+ else {
99
+ const destination = path.join(this.config.output, `${this.settings.name}.mp4`);
100
+ await fs.promises.copyFile(path.join(this.jobFolder, `visuals.mp4`), destination);
101
+ console.log(`Rendered successfully! Video saved to: ${destination}`);
102
+ }
97
103
  }
98
- if (audioFilenames.length > 0) {
99
- await this.mergeAudioTracks(audioFilenames);
100
- await this.mergeAudioWithVideo(
101
- path.join(this.jobFolder, `audio.wav`),
102
- path.join(this.jobFolder, `visuals.mp4`),
103
- );
104
- } else {
105
- const destination = path.join(
106
- this.config.output,
107
- `${this.settings.name}.mp4`,
108
- );
109
- await fs.promises.copyFile(
110
- path.join(this.jobFolder, `visuals.mp4`),
111
- destination,
112
- );
113
- console.log(`Rendered successfully! Video saved to: ${destination}`);
104
+ async checkForAudioStream(asset) {
105
+ return new Promise((resolve, reject) => {
106
+ ffmpeg.ffprobe(asset.src, (err, metadata) => {
107
+ if (err) {
108
+ console.error('error checking for audioStream for asset', asset.key, err);
109
+ reject(err);
110
+ return;
111
+ }
112
+ const audioStreams = metadata.streams.filter(s => s.codec_type === 'audio');
113
+ resolve(audioStreams.length > 0);
114
+ });
115
+ });
114
116
  }
115
- }
116
- async checkForAudioStream(asset) {
117
- return new Promise((resolve, reject) => {
118
- ffmpeg.ffprobe(asset.src, (err, metadata) => {
119
- if (err) {
120
- console.error(
121
- 'error checking for audioStream for asset',
122
- asset.key,
123
- err,
124
- );
125
- reject(err);
126
- return;
117
+ async end(result) {
118
+ this.stream.pushImage(null);
119
+ if (result === 1) {
120
+ try {
121
+ this.command.kill('SIGKILL');
122
+ await this.promise;
123
+ }
124
+ catch (_) {
125
+ // do nothing
126
+ }
127
+ }
128
+ else {
129
+ await this.promise;
127
130
  }
128
- const audioStreams = metadata.streams.filter(
129
- s => s.codec_type === 'audio',
130
- );
131
- resolve(audioStreams.length > 0);
132
- });
133
- });
134
- }
135
- async end(result) {
136
- this.stream.pushImage(null);
137
- if (result === 1) {
138
- try {
139
- this.command.kill('SIGKILL');
140
- await this.promise;
141
- } catch (_) {
142
- // do nothing
143
- }
144
- } else {
145
- await this.promise;
146
- }
147
- }
148
- async kill() {
149
- try {
150
- await fs.promises.rm(this.jobFolder, {recursive: true, force: true}); // cleanup
151
- this.command.kill('SIGKILL');
152
- await this.promise;
153
- } catch (_) {
154
- return;
155
131
  }
156
- }
157
- async prepareAudio(asset, endFrame) {
158
- // Construct the output path
159
- const sanitizedKey = asset.key.replace(/[/[\]]/g, '-');
160
- const outputPath = path.join(this.jobFolder, `${sanitizedKey}.wav`);
161
- const trimLeft = asset.trimLeftInSeconds / asset.playbackRate;
162
- const trimRight = Math.min(
163
- trimLeft + asset.duration / this.settings.fps,
164
- trimLeft + endFrame / this.settings.fps,
165
- );
166
- const padStart = (asset.startInVideo / this.settings.fps) * 1000;
167
- const padEnd = Math.max(
168
- 0,
169
- (SAMPLE_RATE * endFrame) / this.settings.fps -
170
- (SAMPLE_RATE * asset.duration) / this.settings.fps -
171
- (SAMPLE_RATE * padStart) / 1000,
172
- );
173
- const atempoFilters = await this.calculateAtempoFilters(asset.playbackRate); // atempo filter value must be >=0.5 and <=100. If the value is higher or lower, this function sets multiple atempo filters
174
- let resolvedPath;
175
- if (asset.src.startsWith('/@fs')) {
176
- resolvedPath = asset.src.replace('/@fs', '');
177
- } else if (asset.src.startsWith('http')) {
178
- resolvedPath = asset.src;
179
- } else if (asset.src.startsWith('/')) {
180
- resolvedPath = path.join(this.config.output, '../public', asset.src);
181
- } else {
182
- resolvedPath = path.join(this.config.output, '..', asset.src);
132
+ async kill() {
133
+ try {
134
+ await fs.promises.rm(this.jobFolder, { recursive: true, force: true }); // cleanup
135
+ this.command.kill('SIGKILL');
136
+ await this.promise;
137
+ }
138
+ catch (_) {
139
+ return;
140
+ }
183
141
  }
184
- await new Promise((resolve, reject) => {
185
- const audioFilters = [
186
- ...atempoFilters,
187
- `atrim=start=${trimLeft}:end=${trimRight}`,
188
- `apad=pad_len=${padEnd}`,
189
- `adelay=${padStart}|${padStart}|${padStart}`,
190
- `volume=${asset.volume}`,
191
- ].join(',');
192
- ffmpeg(resolvedPath)
193
- .audioChannels(2)
194
- .audioCodec('pcm_s16le')
195
- .audioFrequency(SAMPLE_RATE)
196
- .outputOptions([`-af`, audioFilters])
197
- .on('end', () => {
198
- resolve();
199
- })
200
- .on('error', err => {
201
- console.error(
202
- `Error processing audio for asset key: ${asset.key}`,
203
- err,
204
- );
205
- reject(err);
206
- })
207
- .save(outputPath);
208
- });
209
- return outputPath;
210
- }
211
- async mergeAudioTracks(audioFilenames) {
212
- return new Promise((resolve, reject) => {
213
- const command = ffmpeg();
214
- audioFilenames.forEach(filename => {
215
- command.input(filename);
216
- });
217
- command
218
- .complexFilter([
219
- `amix=inputs=${audioFilenames.length}:duration=longest`,
220
- ])
221
- .outputOptions(['-c:a', 'pcm_s16le'])
222
- .on('end', () => {
223
- resolve();
224
- })
225
- .on('error', err => {
226
- console.error(`Error merging audio tracks: ${err.message}`);
227
- reject(err);
228
- })
229
- .save(path.join(this.jobFolder, `audio.wav`));
230
- });
231
- }
232
- async calculateAtempoFilters(playbackRate) {
233
- const atempoFilters = [];
234
- // Calculate how many times we need to 100x the speed
235
- let rate = playbackRate;
236
- while (rate > 100.0) {
237
- atempoFilters.push('atempo=100.0');
238
- rate /= 100.0;
142
+ async prepareAudio(asset, endFrame) {
143
+ // Construct the output path
144
+ const sanitizedKey = asset.key.replace(/[/[\]]/g, '-');
145
+ const outputPath = path.join(this.jobFolder, `${sanitizedKey}.wav`);
146
+ const trimLeft = asset.trimLeftInSeconds / asset.playbackRate;
147
+ const trimRight = Math.min(trimLeft + asset.duration / this.settings.fps, trimLeft + endFrame / this.settings.fps);
148
+ const padStart = (asset.startInVideo / this.settings.fps) * 1000;
149
+ const padEnd = Math.max(0, (SAMPLE_RATE * endFrame) / this.settings.fps -
150
+ (SAMPLE_RATE * asset.duration) / this.settings.fps -
151
+ (SAMPLE_RATE * padStart) / 1000);
152
+ const atempoFilters = await this.calculateAtempoFilters(asset.playbackRate); // atempo filter value must be >=0.5 and <=100. If the value is higher or lower, this function sets multiple atempo filters
153
+ let resolvedPath;
154
+ if (asset.src.startsWith('/@fs')) {
155
+ resolvedPath = asset.src.replace('/@fs', '');
156
+ }
157
+ else if (asset.src.startsWith('http')) {
158
+ resolvedPath = asset.src;
159
+ }
160
+ else if (asset.src.startsWith('/')) {
161
+ resolvedPath = path.join(this.config.output, '../public', asset.src);
162
+ }
163
+ else {
164
+ resolvedPath = path.join(this.config.output, '..', asset.src);
165
+ }
166
+ await new Promise((resolve, reject) => {
167
+ const audioFilters = [
168
+ ...atempoFilters,
169
+ `atrim=start=${trimLeft}:end=${trimRight}`,
170
+ `apad=pad_len=${padEnd}`,
171
+ `adelay=${padStart}|${padStart}|${padStart}`,
172
+ `volume=${asset.volume}`,
173
+ ].join(',');
174
+ ffmpeg(resolvedPath)
175
+ .audioChannels(2)
176
+ .audioCodec('pcm_s16le')
177
+ .audioFrequency(SAMPLE_RATE)
178
+ .outputOptions([`-af`, audioFilters])
179
+ .on('end', () => {
180
+ resolve();
181
+ })
182
+ .on('error', err => {
183
+ console.error(`Error processing audio for asset key: ${asset.key}`, err);
184
+ reject(err);
185
+ })
186
+ .save(outputPath);
187
+ });
188
+ return outputPath;
239
189
  }
240
- // Add the last atempo filter with the remaining rate
241
- if (rate > 1.0) {
242
- atempoFilters.push(`atempo=${rate}`);
190
+ async mergeAudioTracks(audioFilenames) {
191
+ return new Promise((resolve, reject) => {
192
+ const command = ffmpeg();
193
+ audioFilenames.forEach(filename => {
194
+ command.input(filename);
195
+ });
196
+ command
197
+ .complexFilter([
198
+ `amix=inputs=${audioFilenames.length}:duration=longest`,
199
+ ])
200
+ .outputOptions(['-c:a', 'pcm_s16le'])
201
+ .on('end', () => {
202
+ resolve();
203
+ })
204
+ .on('error', err => {
205
+ console.error(`Error merging audio tracks: ${err.message}`);
206
+ reject(err);
207
+ })
208
+ .save(path.join(this.jobFolder, `audio.wav`));
209
+ });
243
210
  }
244
- // Calculate how many times we need to halve the speed
245
- rate = playbackRate;
246
- while (rate < 0.5) {
247
- atempoFilters.push('atempo=0.5');
248
- rate *= 2.0;
211
+ async calculateAtempoFilters(playbackRate) {
212
+ const atempoFilters = [];
213
+ // Calculate how many times we need to 100x the speed
214
+ let rate = playbackRate;
215
+ while (rate > 100.0) {
216
+ atempoFilters.push('atempo=100.0');
217
+ rate /= 100.0;
218
+ }
219
+ // Add the last atempo filter with the remaining rate
220
+ if (rate > 1.0) {
221
+ atempoFilters.push(`atempo=${rate}`);
222
+ }
223
+ // Calculate how many times we need to halve the speed
224
+ rate = playbackRate;
225
+ while (rate < 0.5) {
226
+ atempoFilters.push('atempo=0.5');
227
+ rate *= 2.0;
228
+ }
229
+ // Add the last atempo filter with the remaining rate
230
+ if (rate < 1.0) {
231
+ atempoFilters.push(`atempo=${rate}`);
232
+ }
233
+ return atempoFilters;
249
234
  }
250
- // Add the last atempo filter with the remaining rate
251
- if (rate < 1.0) {
252
- atempoFilters.push(`atempo=${rate}`);
235
+ async mergeAudioWithVideo(audioPath, videoPath) {
236
+ return new Promise((resolve, reject) => {
237
+ ffmpeg()
238
+ .input(videoPath)
239
+ .input(audioPath)
240
+ .outputOptions([
241
+ '-c:v',
242
+ 'copy',
243
+ '-c:a',
244
+ 'aac',
245
+ '-strict',
246
+ 'experimental',
247
+ ])
248
+ .on('end', () => {
249
+ resolve();
250
+ console.log(`Rendered successfully! Video saved to: ${path.join(this.config.output, `${this.settings.name}.mp4`)}`);
251
+ })
252
+ .on('error', err => {
253
+ console.error(`Error merging video and audio: ${err.message}`);
254
+ reject(err);
255
+ })
256
+ .save(path.join(this.config.output, `${this.settings.name}.mp4`));
257
+ });
253
258
  }
254
- return atempoFilters;
255
- }
256
- async mergeAudioWithVideo(audioPath, videoPath) {
257
- return new Promise((resolve, reject) => {
258
- ffmpeg()
259
- .input(videoPath)
260
- .input(audioPath)
261
- .outputOptions([
262
- '-c:v',
263
- 'copy',
264
- '-c:a',
265
- 'aac',
266
- '-strict',
267
- 'experimental',
268
- ])
269
- .on('end', () => {
270
- resolve();
271
- console.log(
272
- `Rendered successfully! Video saved to: ${path.join(this.config.output, `${this.settings.name}.mp4`)}`,
273
- );
274
- })
275
- .on('error', err => {
276
- console.error(`Error merging video and audio: ${err.message}`);
277
- reject(err);
278
- })
279
- .save(path.join(this.config.output, `${this.settings.name}.mp4`));
280
- });
281
- }
282
259
  }
283
260
  exports.FFmpegExporterServer = FFmpegExporterServer;
284
261
  function getAssetPlacement(frames) {
285
- const assets = [];
286
- // A map to keep track of when each asset starts.
287
- const assetStartMap = new Map();
288
- for (let frame = 0; frame < frames.length; frame++) {
289
- for (const asset of frames[frame]) {
290
- if (!assetStartMap.has(asset.key)) {
291
- assetStartMap.set(asset.key, frame);
292
- assets.push({
293
- key: asset.key,
294
- src: asset.src,
295
- type: asset.type,
296
- startInVideo: frame,
297
- endInVideo: frame,
298
- duration: asset.duration,
299
- playbackRate: asset.playbackRate,
300
- volume: asset.volume,
301
- trimLeftInSeconds: asset.currentTime,
302
- });
303
- } else {
304
- const existingAsset = assets.find(a => a.key === asset.key);
305
- if (existingAsset) {
306
- existingAsset.endInVideo = frame;
262
+ const assets = [];
263
+ // A map to keep track of when each asset starts.
264
+ const assetStartMap = new Map();
265
+ for (let frame = 0; frame < frames.length; frame++) {
266
+ for (const asset of frames[frame]) {
267
+ if (!assetStartMap.has(asset.key)) {
268
+ assetStartMap.set(asset.key, frame);
269
+ assets.push({
270
+ key: asset.key,
271
+ src: asset.src,
272
+ type: asset.type,
273
+ startInVideo: frame,
274
+ endInVideo: frame,
275
+ duration: asset.duration,
276
+ playbackRate: asset.playbackRate,
277
+ volume: asset.volume,
278
+ trimLeftInSeconds: asset.currentTime,
279
+ });
280
+ }
281
+ else {
282
+ const existingAsset = assets.find(a => a.key === asset.key);
283
+ if (existingAsset) {
284
+ existingAsset.endInVideo = frame;
285
+ }
286
+ }
307
287
  }
308
- }
309
288
  }
310
- }
311
- assets.forEach(asset => {
312
- asset.duration = asset.endInVideo - asset.startInVideo + 1;
313
- });
314
- return assets;
289
+ assets.forEach(asset => {
290
+ asset.duration = asset.endInVideo - asset.startInVideo + 1;
291
+ });
292
+ return assets;
315
293
  }
316
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRkZtcGVnRXhwb3J0ZXJTZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zZXJ2ZXIvRkZtcGVnRXhwb3J0ZXJTZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQTREO0FBQzVELHdEQUErRDtBQVEvRCx3Q0FBd0M7QUFDeEMseUJBQXlCO0FBQ3pCLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsK0JBQWtDO0FBQ2xDLCtDQUEwQztBQUMxQyxpREFBeUQ7QUFFekQsMENBQTBDO0FBQzFDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQztBQUUxQixNQUFNLENBQUMsYUFBYSxDQUFDLGFBQVUsQ0FBQyxDQUFDO0FBQ2pDLE1BQU0sQ0FBQyxjQUFjLENBQUMsY0FBVyxDQUFDLENBQUM7QUFFNUIsS0FBSyxVQUFVLGlCQUFpQjtJQUNyQyxJQUFJLENBQUM7UUFDSCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUM1QixNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLEVBQ2hELE9BQU8sQ0FDUixDQUNGLENBQUM7UUFFRixPQUFPLFdBQVcsQ0FBQyxPQUFPLENBQUM7SUFDN0IsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0FBQ0gsQ0FBQztBQWJELDhDQWFDO0FBcUJEOztHQUVHO0FBQ0gsTUFBYSxvQkFBb0I7SUFPL0IsWUFDRSxRQUFnQyxFQUNmLE1BQW9CO1FBQXBCLFdBQU0sR0FBTixNQUFNLENBQWM7UUFFckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxXQUFXLElBQUEsU0FBTSxHQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSx5QkFBVyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQztRQUV4Qix1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLE9BQU87YUFDVCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUNsQixXQUFXLENBQUMsWUFBWSxDQUFDO2FBQ3pCLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFMUIsbUJBQW1CO1FBQ25CLElBQUksUUFBUSxDQUFDLFlBQVksSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLE9BQU87aUJBQ1QsS0FBSyxDQUFFLFFBQVEsQ0FBQyxLQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0MsK0NBQStDO2lCQUM5QyxZQUFZLENBQUMsQ0FBQyxjQUFjLFFBQVEsQ0FBQyxXQUFXLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFFRCxrQkFBa0I7UUFDbEIsTUFBTSxJQUFJLEdBQUc7WUFDWCxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO1lBQ3pELENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUM7U0FDMUQsQ0FBQztRQUNGLElBQUksQ0FBQyxPQUFPO2FBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQzthQUNoRCxhQUFhLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxXQUFXLENBQUMsQ0FBQzthQUNoRCxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQzthQUN2QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLElBQUksUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ25ELElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLE1BQU0sT0FBTyxHQUFHLE1BQU0saUJBQWlCLEVBQUUsQ0FBQztRQUMxQyxJQUFBLG1CQUFTLEVBQUMsbUJBQVMsQ0FBQyxhQUFhLEVBQUUsRUFBQyxPQUFPLEVBQUMsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ25DLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUMsSUFBSSxFQUFpQjtRQUM3QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU0sS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUN6QixNQUFNLEVBQ04sUUFBUSxHQUlUO1FBQ0MsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFakQsTUFBTSxjQUFjLEdBQWEsRUFBRSxDQUFDO1FBQ3BDLEtBQUssTUFBTSxLQUFLLElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkMsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQzFCLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDM0IsY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pELENBQUM7WUFFRCxJQUFJLEtBQUssQ0FBQyxZQUFZLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNyRSxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUMxRCxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2hDLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzVDLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLEVBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FDekMsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQ2xCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FDNUIsQ0FBQztZQUNGLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsRUFDeEMsV0FBVyxDQUNaLENBQUM7WUFDRixPQUFPLENBQUMsR0FBRyxDQUFDLDBDQUEwQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7SUFDSCxDQUFDO0lBRU0sS0FBSyxDQUFDLG1CQUFtQixDQUFDLEtBQWlCO1FBQ2hELE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUMxQyxJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUNSLE9BQU8sQ0FBQyxLQUFLLENBQ1gsMENBQTBDLEVBQzFDLEtBQUssQ0FBQyxHQUFHLEVBQ1QsR0FBRyxDQUNKLENBQUM7b0JBQ0YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNaLE9BQU87Z0JBQ1QsQ0FBQztnQkFFRCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDMUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxLQUFLLE9BQU8sQ0FDOUIsQ0FBQztnQkFDRixPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNuQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBc0I7UUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDO2dCQUNILElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM3QixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDckIsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsYUFBYTtZQUNmLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJO1FBQ2YsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVU7WUFDaEYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDN0IsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3JCLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTztRQUNULENBQUM7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVksQ0FDeEIsS0FBaUIsRUFDakIsUUFBZ0I7UUFFaEIsNEJBQTRCO1FBQzVCLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN2RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxZQUFZLE1BQU0sQ0FBQyxDQUFDO1FBRXBFLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQzlELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ3hCLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUM3QyxRQUFRLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUN4QyxDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2pFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ3JCLENBQUMsRUFDRCxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUc7WUFDMUMsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRztZQUNsRCxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQ2xDLENBQUM7UUFFRixNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQywySEFBMkg7UUFFeE0sSUFBSSxZQUFvQixDQUFDO1FBQ3pCLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxZQUFZLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLENBQUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDeEMsWUFBWSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDM0IsQ0FBQzthQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7YUFBTSxDQUFDO1lBQ04sWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBRUQsTUFBTSxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMxQyxNQUFNLFlBQVksR0FBRztnQkFDbkIsR0FBRyxhQUFhO2dCQUNoQixlQUFlLFFBQVEsUUFBUSxTQUFTLEVBQUU7Z0JBQzFDLGdCQUFnQixNQUFNLEVBQUU7Z0JBQ3hCLFVBQVUsUUFBUSxJQUFJLFFBQVEsSUFBSSxRQUFRLEVBQUU7Z0JBQzVDLFVBQVUsS0FBSyxDQUFDLE1BQU0sRUFBRTthQUN6QixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVaLE1BQU0sQ0FBQyxZQUFZLENBQUM7aUJBQ2pCLGFBQWEsQ0FBQyxDQUFDLENBQUM7aUJBQ2hCLFVBQVUsQ0FBQyxXQUFXLENBQUM7aUJBQ3ZCLGNBQWMsQ0FBQyxXQUFXLENBQUM7aUJBQzNCLGFBQWEsQ0FBQyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztpQkFDcEMsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ2QsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDLENBQUM7aUJBQ0QsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDakIsT0FBTyxDQUFDLEtBQUssQ0FDWCx5Q0FBeUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUNwRCxHQUFHLENBQ0osQ0FBQztnQkFDRixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZCxDQUFDLENBQUM7aUJBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVPLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxjQUF3QjtRQUNyRCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLE1BQU0sT0FBTyxHQUFHLE1BQU0sRUFBRSxDQUFDO1lBRXpCLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ2hDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUIsQ0FBQyxDQUFDLENBQUM7WUFFSCxPQUFPO2lCQUNKLGFBQWEsQ0FBQztnQkFDYixlQUFlLGNBQWMsQ0FBQyxNQUFNLG1CQUFtQjthQUN4RCxDQUFDO2lCQUNELGFBQWEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztpQkFDcEMsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ2QsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDLENBQUM7aUJBQ0QsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDakIsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQzVELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLENBQUMsQ0FBQztpQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sS0FBSyxDQUFDLHNCQUFzQixDQUFDLFlBQW9CO1FBQ3ZELE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUV6QixxREFBcUQ7UUFDckQsSUFBSSxJQUFJLEdBQUcsWUFBWSxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQ3BCLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDbkMsSUFBSSxJQUFJLEtBQUssQ0FBQztRQUNoQixDQUFDO1FBQ0QscURBQXFEO1FBQ3JELElBQUksSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2YsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUVELHNEQUFzRDtRQUN0RCxJQUFJLEdBQUcsWUFBWSxDQUFDO1FBQ3BCLE9BQU8sSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2xCLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDakMsSUFBSSxJQUFJLEdBQUcsQ0FBQztRQUNkLENBQUM7UUFDRCxxREFBcUQ7UUFDckQsSUFBSSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDZixhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBRUQsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVPLEtBQUssQ0FBQyxtQkFBbUIsQ0FDL0IsU0FBaUIsRUFDakIsU0FBaUI7UUFFakIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxNQUFNLEVBQUU7aUJBQ0wsS0FBSyxDQUFDLFNBQVMsQ0FBQztpQkFDaEIsS0FBSyxDQUFDLFNBQVMsQ0FBQztpQkFDaEIsYUFBYSxDQUFDO2dCQUNiLE1BQU07Z0JBQ04sTUFBTTtnQkFDTixNQUFNO2dCQUNOLEtBQUs7Z0JBQ0wsU0FBUztnQkFDVCxjQUFjO2FBQ2YsQ0FBQztpQkFDRCxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRTtnQkFDZCxPQUFPLEVBQUUsQ0FBQztnQkFDVixPQUFPLENBQUMsR0FBRyxDQUNULDBDQUEwQyxJQUFJLENBQUMsSUFBSSxDQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFDbEIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksTUFBTSxDQUM1QixFQUFFLENBQ0osQ0FBQztZQUNKLENBQUMsQ0FBQztpQkFDRCxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNqQixPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDL0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsQ0FBQyxDQUFDO2lCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDdEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUE1U0Qsb0RBNFNDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxNQUFxQjtJQUM5QyxNQUFNLE1BQU0sR0FBaUIsRUFBRSxDQUFDO0lBRWhDLGlEQUFpRDtJQUNqRCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUVoRCxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ25ELEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDVixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUc7b0JBQ2QsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO29CQUNkLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtvQkFDaEIsWUFBWSxFQUFFLEtBQUs7b0JBQ25CLFVBQVUsRUFBRSxLQUFLO29CQUNqQixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7b0JBQ3hCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtvQkFDaEMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO29CQUNwQixpQkFBaUIsRUFBRSxLQUFLLENBQUMsV0FBVztpQkFDckMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDNUQsSUFBSSxhQUFhLEVBQUUsQ0FBQztvQkFDbEIsYUFBYSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7Z0JBQ25DLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3JCLEtBQUssQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUM3RCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMifQ==
294
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRkZtcGVnRXhwb3J0ZXJTZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zZXJ2ZXIvRkZtcGVnRXhwb3J0ZXJTZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQTREO0FBQzVELHdEQUErRDtBQVEvRCx3Q0FBd0M7QUFDeEMseUJBQXlCO0FBQ3pCLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsK0JBQWtDO0FBQ2xDLCtDQUEwQztBQUMxQyxpREFBeUQ7QUFFekQsMENBQTBDO0FBQzFDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQztBQUUxQixNQUFNLENBQUMsYUFBYSxDQUFDLGFBQVUsQ0FBQyxDQUFDO0FBQ2pDLE1BQU0sQ0FBQyxjQUFjLENBQUMsY0FBVyxDQUFDLENBQUM7QUFFNUIsS0FBSyxVQUFVLGlCQUFpQjtJQUNyQyxJQUFJLENBQUM7UUFDSCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUM1QixNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLEVBQ2hELE9BQU8sQ0FDUixDQUNGLENBQUM7UUFFRixPQUFPLFdBQVcsQ0FBQyxPQUFPLENBQUM7SUFDN0IsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0FBQ0gsQ0FBQztBQWJELDhDQWFDO0FBcUJEOztHQUVHO0FBQ0gsTUFBYSxvQkFBb0I7SUFPL0IsWUFDRSxRQUFnQyxFQUNmLE1BQW9CO1FBQXBCLFdBQU0sR0FBTixNQUFNLENBQWM7UUFFckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxXQUFXLElBQUEsU0FBTSxHQUFF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