--------------------------------------------------------------------------------------------------------------- INITIALIZING VIDBOT, v1.7.1... --------------------------------------------------------------------------------------------------------------- [06:38:08.950] Vidbot :: start() [06:38:08.950] Vidbot :: _next(), _stepIndex:0 of 4 [06:38:08.951] index :: _onStepStarted_vidbot(), step: 1 [06:38:08.952] Vidbot :: step[0], label:Initializing Core [06:38:08.961] index :: _onStepProgress_vidbot(), percent: 20 [06:38:08.961] Vidbot :: _parse() [06:38:08.963] index :: _onStepProgress_vidbot(), percent: 40 [06:38:08.963] Vidbot :: _validate() [06:38:08.964] index :: _onStepProgress_vidbot(), percent: 60 [06:38:08.964] Vidbot :: _fonts() [06:38:08.964] FabricFontManager :: add(), id: SourceSansPro-Bold [06:38:08.964] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Bold.ttf [06:38:08.973] FabricFontManager :: add(), id: SourceSansPro-Light [06:38:08.973] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Light.ttf [06:38:08.974] FabricFontManager :: add(), id: DINOT-Bold [06:38:08.974] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Bold.otf [06:38:08.975] FabricFontManager :: add(), id: DINOT-Light [06:38:08.975] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Light.otf [06:38:08.976] FabricFontManager :: add(), id: TradeGothicLTStd-Regular [06:38:08.976] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Regular.otf [06:38:08.977] FabricFontManager :: add(), id: TradeGothicLTStd-Bold [06:38:08.977] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Bold.otf [06:38:08.978] index :: _onStepProgress_vidbot(), percent: 80 [06:38:08.978] Vidbot :: _clips() [06:38:08.979] StreamManager :: add(), id:audio_vo, type:audio [06:38:08.979] AudioClip[audio_vo] :: constructor() [06:38:08.979] InputStream[audio_vo] :: constructor() [06:38:08.979] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'audio_vo', clipId: null } [06:38:08.982] StreamManager :: add(), id:bg_music, type:audio [06:38:08.982] AudioClip[bg_music] :: constructor() [06:38:08.982] InputStream[bg_music] :: constructor() [06:38:08.983] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'bg_music', clipId: null } [06:38:08.983] StreamManager :: add(), id:mira, type:canvas [06:38:08.983] CanvasStream[canvas_1670861923733] :: constructor() [06:38:08.983] InputStream[canvas_1670861923733] :: constructor() [06:38:09.062] MiraSlideshow[mira] :: constructor() [06:38:09.062] Mira[mira] :: constructor() [06:38:09.062] Overlay[mira] :: constructor() [06:38:09.063] CanvasClip[mira] :: constructor() [06:38:09.063] Clip[mira] :: constructor() [06:38:09.063] clip:"mira" added to stream:"canvas_1670861923733" [06:38:09.063] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_1670861923733', clipId: 'mira' } [06:38:09.063] all added... [06:38:09.063] Vidbot :: _next(), _stepIndex:1 of 4 [06:38:09.063] index :: _onStepCompleted_vidbot(), step: 1 [06:38:09.064] index :: _onStepStarted_vidbot(), step: 2 [06:38:09.064] Vidbot :: step[1], label:Initializing Input Streams [06:38:09.064] StreamManager :: init() [06:38:09.065] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'audio_vo', progress: 0.3333333333333333 } [06:38:09.065] index :: _onStepProgress_vidbot(), percent: 33 [06:38:09.065] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'bg_music', progress: 0.6666666666666666 } [06:38:09.065] index :: _onStepProgress_vidbot(), percent: 67 [06:38:09.065] CanvasStream[canvas_1670861923733] :: _init(), BEGIN [06:38:09.066] i:0, c.id:mira [06:38:09.066] MiraSlideshow[mira] :: _init(), BEGIN [06:38:09.066] MiraSlideshow[mira] :: _validate() [06:38:09.068] MiraSlideshow :: _validateSlides() [06:38:09.068] i:0, s.type: title [06:38:09.068] i:1, s.type: info [06:38:09.068] i:2, s.type: image [06:38:09.068] i:3, s.type: image [06:38:09.068] i:4, s.type: image [06:38:09.068] i:5, s.type: image [06:38:09.069] i:6, s.type: image [06:38:09.069] i:7, s.type: image [06:38:09.069] i:8, s.type: image [06:38:09.069] i:9, s.type: image [06:38:09.069] i:10, s.type: image [06:38:09.069] i:11, s.type: image [06:38:09.069] i:12, s.type: image [06:38:09.069] i:13, s.type: image [06:38:09.069] i:14, s.type: image [06:38:09.069] i:15, s.type: image [06:38:09.069] i:16, s.type: image [06:38:09.073] MiraSlideshow[mira] :: _build(), BEGIN [06:38:09.077] MiraTitlecard[titlecard] :: constructor() [06:38:09.077] Mira[titlecard] :: constructor() [06:38:09.077] Overlay[titlecard] :: constructor() [06:38:09.077] CanvasClip[titlecard] :: constructor() [06:38:09.077] Clip[titlecard] :: constructor() [06:38:09.078] MiraTitlecard[titlecard] :: _init() [06:38:09.078] MiraTitlecard[titlecard] :: _validate() [06:38:09.079] MiraTitlecard[titlecard] :: _build() [06:38:09.103] Overlay[titlecard] :: _animate() [06:38:09.105] MiraTitlecard[titlecard] :: _animate() [06:38:09.107] AnimatedImageFrame[aiftitle] :: constructor() [06:38:09.108] AnimatedImageFrame[aiftitle] :: _init(), BEGIN [06:38:09.108] CanvasClip :: LoadImageWithPromise(), src: 2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C_1.jpg [06:38:09.170] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [06:38:09.174] AnimatedImageFrame[aiftitle] :: _init(), END [06:38:09.178] MiraInfosheet[info] :: constructor() [06:38:09.179] Mira[info] :: constructor() [06:38:09.179] Overlay[info] :: constructor() [06:38:09.179] CanvasClip[info] :: constructor() [06:38:09.179] Clip[info] :: constructor() [06:38:09.179] MiraInfosheet[info] :: _init() [06:38:09.179] MiraInfosheet[info] :: _validate() [06:38:09.181] MiraInfosheet[info] :: _build() [06:38:09.191] RenOptions[info] :: _animate() [06:38:09.191] Overlay[info] :: _animate() [06:38:09.193] AnimatedImageFrame[info1] :: constructor() [06:38:09.193] AnimatedImageFrame[info2] :: constructor() [06:38:09.194] AnimatedImageFrame[info3] :: constructor() [06:38:09.194] AnimatedImageFrame[info1] :: _init(), BEGIN [06:38:09.194] CanvasClip :: LoadImageWithPromise(), src: 2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C_5.jpg [06:38:09.228] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [06:38:09.230] AnimatedImageFrame[info1] :: _init(), END [06:38:09.230] AnimatedImageFrame[info2] :: _init(), BEGIN [06:38:09.230] CanvasClip :: LoadImageWithPromise(), src: 2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C_6.jpg [06:38:09.262] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [06:38:09.264] AnimatedImageFrame[info2] :: _init(), END [06:38:09.264] AnimatedImageFrame[info3] :: _init(), BEGIN [06:38:09.264] CanvasClip :: LoadImageWithPromise(), src: 2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C_13.jpg [06:38:09.291] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [06:38:09.292] AnimatedImageFrame[info3] :: _init(), END [06:38:09.293] AnimatedImageFrame[image] :: constructor() [06:38:09.294] AnimatedImageFrame[image] :: _init(), BEGIN [06:38:09.294] CanvasClip :: LoadImageWithPromise(), src: 2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C_1.jpg [06:38:09.335] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [06:38:09.336] AnimatedImageFrame[image] :: _init(), END [06:38:09.336] AnimatedImageFrame[image] :: constructor() [06:38:09.336] AnimatedImageFrame[image] :: _init(), BEGIN [06:38:09.337] CanvasClip :: LoadImageWithPromise(), src: 2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C_2.jpg [06:38:09.371] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [06:38:09.372] AnimatedImageFrame[image] :: _init(), END [06:38:09.372] AnimatedImageFrame[image] :: constructor() [06:38:09.372] AnimatedImageFrame[image] :: _init(), BEGIN [06:38:09.372] CanvasClip :: LoadImageWithPromise(), src: 2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C_3.jpg [06:38:09.407] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [06:38:09.409] AnimatedImageFrame[image] :: _init(), END [06:38:09.409] AnimatedImageFrame[image] :: constructor() [06:38:09.409] AnimatedImageFrame[image] :: _init(), BEGIN [06:38:09.409] CanvasClip :: LoadImageWithPromise(), src: 2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C_4.jpg [06:38:09.453] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [06:38:09.454] AnimatedImageFrame[image] :: _init(), END [06:38:09.455] AnimatedImageFrame[image] :: constructor() [06:38:09.455] AnimatedImageFrame[image] :: _init(), BEGIN [06:38:09.455] CanvasClip :: LoadImageWithPromise(), src: 2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C_5.jpg [06:38:09.486] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [06:38:09.488] AnimatedImageFrame[image] :: _init(), END [06:38:09.488] AnimatedImageFrame[image] :: constructor() [06:38:09.488] AnimatedImageFrame[image] :: _init(), BEGIN [06:38:09.488] CanvasClip :: LoadImageWithPromise(), src: 2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C_6.jpg [06:38:09.518] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [06:38:09.518] AnimatedImageFrame[image] :: _init(), END [06:38:09.519] AnimatedImageFrame[image] :: constructor() [06:38:09.519] AnimatedImageFrame[image] :: _init(), BEGIN [06:38:09.519] CanvasClip :: LoadImageWithPromise(), src: 2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C_7.jpg [06:38:09.556] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [06:38:09.557] AnimatedImageFrame[image] :: _init(), END [06:38:09.558] AnimatedImageFrame[image] :: constructor() [06:38:09.558] AnimatedImageFrame[image] :: _init(), BEGIN [06:38:09.558] CanvasClip :: LoadImageWithPromise(), src: 2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C_8.jpg [06:38:09.588] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [06:38:09.589] AnimatedImageFrame[image] :: _init(), END [06:38:09.590] AnimatedImageFrame[image] :: constructor() [06:38:09.590] AnimatedImageFrame[image] :: _init(), BEGIN [06:38:09.590] CanvasClip :: LoadImageWithPromise(), src: 2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C_9.jpg [06:38:09.617] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [06:38:09.618] AnimatedImageFrame[image] :: _init(), END [06:38:09.618] AnimatedImageFrame[image] :: constructor() [06:38:09.618] AnimatedImageFrame[image] :: _init(), BEGIN [06:38:09.618] CanvasClip :: LoadImageWithPromise(), src: 2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C_10.jpg [06:38:09.654] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [06:38:09.655] AnimatedImageFrame[image] :: _init(), END [06:38:09.655] AnimatedImageFrame[image] :: constructor() [06:38:09.655] AnimatedImageFrame[image] :: _init(), BEGIN [06:38:09.655] CanvasClip :: LoadImageWithPromise(), src: 2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C_11.jpg [06:38:09.687] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [06:38:09.688] AnimatedImageFrame[image] :: _init(), END [06:38:09.688] AnimatedImageFrame[image] :: constructor() [06:38:09.688] AnimatedImageFrame[image] :: _init(), BEGIN [06:38:09.688] CanvasClip :: LoadImageWithPromise(), src: 2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C_12.jpg [06:38:09.714] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [06:38:09.715] AnimatedImageFrame[image] :: _init(), END [06:38:09.715] AnimatedImageFrame[image] :: constructor() [06:38:09.715] AnimatedImageFrame[image] :: _init(), BEGIN [06:38:09.715] CanvasClip :: LoadImageWithPromise(), src: 2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C_13.jpg [06:38:09.739] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [06:38:09.740] AnimatedImageFrame[image] :: _init(), END [06:38:09.740] AnimatedImageFrame[image] :: constructor() [06:38:09.740] AnimatedImageFrame[image] :: _init(), BEGIN [06:38:09.741] CanvasClip :: LoadImageWithPromise(), src: 2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C_14.jpg [06:38:09.773] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [06:38:09.778] AnimatedImageFrame[image] :: _init(), END [06:38:09.779] AnimatedImageFrame[image] :: constructor() [06:38:09.779] AnimatedImageFrame[image] :: _init(), BEGIN [06:38:09.779] CanvasClip :: LoadImageWithPromise(), src: 2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C_15.jpg [06:38:09.813] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [06:38:09.814] AnimatedImageFrame[image] :: _init(), END [06:38:09.815] MiraSlideshow[mira] :: _build(), END [06:38:09.815] Overlay[mira] :: _animate() [06:38:09.815] MiraSlideshow[mira] :: _init(), END [06:38:09.815] CanvasStream[mira] :: _init(), p.then() [06:38:09.816] CanvasStream[canvas_1670861923733] :: _init(), promise.all.then() [06:38:09.817] CanvasStream[canvas_1670861923733] :: _init(), END [06:38:09.817] StreamMangaer :: init(), stream[canvas_1670861923733].then() [06:38:09.817] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'canvas_1670861923733', progress: 1 } [06:38:09.817] index :: _onStepProgress_vidbot(), percent: 100 [06:38:09.818] StreamManager :: init(), promise.all.then... [06:38:09.818] Vidbot :: StreamMgr.on( 'INITED' ) [06:38:09.818] Vidbot :: _next(), _stepIndex:2 of 4 [06:38:09.818] index :: _onStepCompleted_vidbot(), step: 2 [06:38:09.818] index :: _onStepStarted_vidbot(), step: 3 [06:38:09.818] Vidbot :: step[2], label:Rendering Canvas Streams [06:38:09.819] Vidbot :: StreamMgr.on( 'RENDER_STARTED' ), data: undefined [06:38:09.819] StreamManager :: render() [06:38:09.819] CanvasStream[canvas_1670861923733] :: render() [06:38:09.878] index :: _onStepProgress_vidbot(), percent: 0 [06:38:39.018] index :: _onStepProgress_vidbot(), percent: 5 [06:39:02.360] index :: _onStepProgress_vidbot(), percent: 10 [06:39:41.720] index :: _onStepProgress_vidbot(), percent: 15 [06:40:22.985] index :: _onStepProgress_vidbot(), percent: 20 [06:40:59.596] index :: _onStepProgress_vidbot(), percent: 25 [06:41:45.542] index :: _onStepProgress_vidbot(), percent: 30 [06:42:24.016] index :: _onStepProgress_vidbot(), percent: 35 [06:43:00.882] index :: _onStepProgress_vidbot(), percent: 40 [06:43:32.475] index :: _onStepProgress_vidbot(), percent: 45 [06:44:02.689] index :: _onStepProgress_vidbot(), percent: 50 [06:44:40.613] index :: _onStepProgress_vidbot(), percent: 55 [06:45:09.793] index :: _onStepProgress_vidbot(), percent: 60 [06:45:33.778] index :: _onStepProgress_vidbot(), percent: 65 [06:46:02.868] index :: _onStepProgress_vidbot(), percent: 70 [06:46:42.069] index :: _onStepProgress_vidbot(), percent: 75 [06:47:12.548] index :: _onStepProgress_vidbot(), percent: 80 [06:47:37.759] index :: _onStepProgress_vidbot(), percent: 85 [06:48:00.548] index :: _onStepProgress_vidbot(), percent: 90 [06:48:23.069] index :: _onStepProgress_vidbot(), percent: 95 [06:48:47.943] index :: _onStepProgress_vidbot(), percent: 100 [06:48:50.362] StreamManager :: render(), Promise.all.then... [06:48:50.362] Vidbot :: StreamMgr.on( 'RENDER_COMPLETED' ), data: undefined [06:48:50.363] Vidbot :: _next(), _stepIndex:3 of 4 [06:48:50.363] index :: _onStepCompleted_vidbot(), step: 3 [06:48:50.363] index :: _onStepStarted_vidbot(), step: 4 [06:48:50.364] Vidbot :: step[3], label:Encoding Media [06:48:50.367] CanvasFilters :: Overlay() [06:48:50.367] AudioStream[audio_vo] :: inputOptions() [06:48:50.367] AudioFilters :: Volume() [06:48:50.367] filter: [2:a]volume=1[2_vol] [06:48:50.368] AudioFilters :: Delay() [06:48:50.368] filter: [2_vol]adelay=0|0[2_del] [06:48:50.368] AudioStream[bg_music] :: inputOptions() [06:48:50.368] AudioFilters :: Volume() [06:48:50.368] filter: [3:a]volume=0.15[3_vol] [06:48:50.368] AudioFilters :: FadeOut() [06:48:50.368] filter: [3_vol]afade=t=out:st=60:d=1[3_fadeout] [06:48:50.368] AudioFilters :: Delay() [06:48:50.368] filter: [3_fadeout]adelay=0|0[3_del] [06:48:50.368] AudioFilters :: Mix() [06:48:50.369] filter: [2_del][3_del]amix=inputs=2:duration=longest[a_out] [06:48:50.369] mixed filter: [2_del][3_del]amix=inputs=2:duration=longest[a_out] [06:48:50.371] hang.time: 60 [06:48:50.508] Vidbot :: ffmpeg.on( 'start' ) [06:48:50.509] ffmpeg -f lavfi -i color=c=000000:s=960x540:r=30:duration=60 -r 30 -i ./tmp/canvas_1670861923733_%05d.png -to 00:01:00.000 -i file:///var/www/html/cli [06:48:50.509] ents/21560/audio/2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C.mp3 -to 00:01:00.000 -i file:///var/app/video_pre_processor/assets/vidbot/_files/audio/Groove-4. [06:48:50.509] mp3 -y -filter_complex [0:v][1:v]overlay=x=0:y=0[1_out];[2:a]volume=1[2_vol];[2_vol]adelay=0|0[2_del];[3:a]volume=0.15[3_vol];[3_vol]afade=t=out:st=60 [06:48:50.509] :d=1[3_fadeout];[3_fadeout]adelay=0|0[3_del];[2_del][3_del]amix=inputs=2:duration=longest[a_out] -acodec aac -vcodec libx264 -r 30 -f mp4 -map [a_out] [06:48:50.509] -map [1_out] -preset veryfast -crf 18 -movflags frag_keyframe+empty_moov -pix_fmt yuv420p /var/www/html/clients/21560/video/2ED9FCB8-3CDA-3F62-6319-7 [06:48:50.509] 84E2ECA0D6C.mp4 [06:48:50.714] index :: _onStepProgress_vidbot(), percent: -3462080762 [06:48:51.135] index :: _onStepProgress_vidbot(), percent: 1 [06:48:52.648] index :: _onStepProgress_vidbot(), percent: 7 [06:48:53.661] index :: _onStepProgress_vidbot(), percent: 11 [06:48:54.970] index :: _onStepProgress_vidbot(), percent: 15 [06:48:56.494] index :: _onStepProgress_vidbot(), percent: 21 [06:48:57.513] index :: _onStepProgress_vidbot(), percent: 26 [06:48:58.531] index :: _onStepProgress_vidbot(), percent: 30 [06:49:00.058] index :: _onStepProgress_vidbot(), percent: 36 [06:49:01.567] index :: _onStepProgress_vidbot(), percent: 41 [06:49:02.570] index :: _onStepProgress_vidbot(), percent: 46 [06:49:03.582] index :: _onStepProgress_vidbot(), percent: 51 [06:49:04.588] index :: _onStepProgress_vidbot(), percent: 56 [06:49:05.597] index :: _onStepProgress_vidbot(), percent: 61 [06:49:06.608] index :: _onStepProgress_vidbot(), percent: 66 [06:49:07.624] index :: _onStepProgress_vidbot(), percent: 71 [06:49:09.166] index :: _onStepProgress_vidbot(), percent: 77 [06:49:09.669] index :: _onStepProgress_vidbot(), percent: 80 [06:49:11.192] index :: _onStepProgress_vidbot(), percent: 86 [06:49:12.197] index :: _onStepProgress_vidbot(), percent: 90 [06:49:13.202] index :: _onStepProgress_vidbot(), percent: 95 [06:49:14.131] index :: _onStepProgress_vidbot(), percent: 100 [06:49:14.164] Vidbot :: ffmpeg.on( 'end' ), Done! [06:49:14.164] StreamManager :: dispose() [06:49:14.164] CanvasStream[canvas_1670861923733] :: dispose() [06:49:14.169] Vidbot :: fflog.on( 'finish' ) [06:49:14.169] fflog.path: /var/www/html/clients/21560/video/2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C.mp4.fflog [06:49:14.169] Vidbot :: _next(), _stepIndex:4 of 4 [06:49:14.169] index :: _onStepCompleted_vidbot(), step: 4 [06:49:14.170] index :: _onComplete_vidbot(), data: { stepTime: 0, appTime: 665.239, output: '/var/www/html/clients/21560/video/2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C.mp4', duration: 60 } --------------------------------------------------------------------------------------------------------------- Output File : /var/app/video_pre_processor/jobs/postp//var/www/html/clients/21560/video/2ED9FCB8-3CDA-3F62-6319-784E2ECA0D6C.mp4 Media Duration : 00:01:00.000 Generation Time : 00:11:05.239 ---------------------------------------------------------------------------------------------------------------