--------------------------------------------------------------------------------------------------------------- INITIALIZING VIDBOT, v1.7.1... --------------------------------------------------------------------------------------------------------------- [23:38:29.087] Vidbot :: start() [23:38:29.087] Vidbot :: _next(), _stepIndex:0 of 4 [23:38:29.088] index :: _onStepStarted_vidbot(), step: 1 [23:38:29.089] Vidbot :: step[0], label:Initializing Core [23:38:29.098] index :: _onStepProgress_vidbot(), percent: 20 [23:38:29.098] Vidbot :: _parse() [23:38:29.099] index :: _onStepProgress_vidbot(), percent: 40 [23:38:29.100] Vidbot :: _validate() [23:38:29.100] index :: _onStepProgress_vidbot(), percent: 60 [23:38:29.101] Vidbot :: _fonts() [23:38:29.101] FabricFontManager :: add(), id: SourceSansPro-Bold [23:38:29.101] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Bold.ttf [23:38:29.109] FabricFontManager :: add(), id: SourceSansPro-Light [23:38:29.110] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Light.ttf [23:38:29.110] FabricFontManager :: add(), id: DINOT-Bold [23:38:29.111] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Bold.otf [23:38:29.111] FabricFontManager :: add(), id: DINOT-Light [23:38:29.111] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Light.otf [23:38:29.112] FabricFontManager :: add(), id: TradeGothicLTStd-Regular [23:38:29.112] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Regular.otf [23:38:29.113] FabricFontManager :: add(), id: TradeGothicLTStd-Bold [23:38:29.113] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Bold.otf [23:38:29.114] index :: _onStepProgress_vidbot(), percent: 80 [23:38:29.114] Vidbot :: _clips() [23:38:29.115] StreamManager :: add(), id:audio_vo, type:audio [23:38:29.115] AudioClip[audio_vo] :: constructor() [23:38:29.115] InputStream[audio_vo] :: constructor() [23:38:29.116] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'audio_vo', clipId: null } [23:38:29.118] StreamManager :: add(), id:bg_music, type:audio [23:38:29.118] AudioClip[bg_music] :: constructor() [23:38:29.118] InputStream[bg_music] :: constructor() [23:38:29.119] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'bg_music', clipId: null } [23:38:29.119] StreamManager :: add(), id:simplefadedisplay, type:canvas [23:38:29.119] CanvasStream[canvas_1043695419431] :: constructor() [23:38:29.119] InputStream[canvas_1043695419431] :: constructor() [23:38:29.205] KenBurnsSlideshow[simplefadedisplay] :: constructor() [23:38:29.205] Overlay[simplefadedisplay] :: constructor() [23:38:29.205] CanvasClip[simplefadedisplay] :: constructor() [23:38:29.205] Clip[simplefadedisplay] :: constructor() [23:38:29.205] clip:"simplefadedisplay" added to stream:"canvas_1043695419431" [23:38:29.206] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_1043695419431', clipId: 'simplefadedisplay' } [23:38:29.206] StreamManager :: add(), id:caption, type:canvas [23:38:29.206] RenCaption[caption] :: constructor() [23:38:29.206] Ren[caption] :: constructor() [23:38:29.206] Overlay[caption] :: constructor() [23:38:29.206] CanvasClip[caption] :: constructor() [23:38:29.206] Clip[caption] :: constructor() [23:38:29.206] clip:"caption" added to stream:"canvas_1043695419431" [23:38:29.206] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_1043695419431', clipId: 'caption' } [23:38:29.207] all added... [23:38:29.207] Vidbot :: _next(), _stepIndex:1 of 4 [23:38:29.207] index :: _onStepCompleted_vidbot(), step: 1 [23:38:29.207] index :: _onStepStarted_vidbot(), step: 2 [23:38:29.207] Vidbot :: step[1], label:Initializing Input Streams [23:38:29.208] StreamManager :: init() [23:38:29.208] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'audio_vo', progress: 0.3333333333333333 } [23:38:29.208] index :: _onStepProgress_vidbot(), percent: 33 [23:38:29.209] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'bg_music', progress: 0.6666666666666666 } [23:38:29.209] index :: _onStepProgress_vidbot(), percent: 67 [23:38:29.209] CanvasStream[canvas_1043695419431] :: _init(), BEGIN [23:38:29.209] i:0, c.id:simplefadedisplay [23:38:29.210] KenBurnsSlideshow[simplefadedisplay] :: _init(), BEGIN [23:38:29.210] KenBurnsSlideshow[simplefadedisplay] :: _validate() [23:38:29.210] KenBurnsSlideshow[undefined] :: _validateAnim() [23:38:29.211] KenBurnsSlideshow[undefined] :: _validateTheme() [23:38:29.212] i:1, c.id:caption [23:38:29.212] RenCaption[caption] :: _init() [23:38:29.213] RenCaption[caption] :: _validate() [23:38:29.214] KenBurnsSlideshow[simplefadedisplay] :: _build() [23:38:29.220] AnimatedImageFrame[aif] :: constructor() [23:38:29.221] AnimatedImageFrame[aif] :: _init(), BEGIN [23:38:29.222] CanvasClip :: LoadImageWithPromise(), src: 44141B5E-FED3-4101-3D5F-8642FBDDBA44_1.jpg [23:38:29.234] RenCaption[caption] :: _build() [23:38:29.252] Overlay[caption] :: _animate() [23:38:29.254] CanvasStream[caption] :: _init(), p.then() [23:38:29.281] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [23:38:29.285] AnimatedImageFrame[aif] :: _init(), END [23:38:29.287] AnimatedImageFrame[aif] :: constructor() [23:38:29.287] AnimatedImageFrame[aif] :: _init(), BEGIN [23:38:29.287] CanvasClip :: LoadImageWithPromise(), src: 44141B5E-FED3-4101-3D5F-8642FBDDBA44_2.jpg [23:38:29.312] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [23:38:29.313] AnimatedImageFrame[aif] :: _init(), END [23:38:29.314] AnimatedImageFrame[aif] :: constructor() [23:38:29.314] AnimatedImageFrame[aif] :: _init(), BEGIN [23:38:29.315] CanvasClip :: LoadImageWithPromise(), src: 44141B5E-FED3-4101-3D5F-8642FBDDBA44_3.jpg [23:38:29.338] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [23:38:29.340] AnimatedImageFrame[aif] :: _init(), END [23:38:29.340] AnimatedImageFrame[aif] :: constructor() [23:38:29.341] AnimatedImageFrame[aif] :: _init(), BEGIN [23:38:29.341] CanvasClip :: LoadImageWithPromise(), src: 44141B5E-FED3-4101-3D5F-8642FBDDBA44_4.jpg [23:38:29.363] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [23:38:29.364] AnimatedImageFrame[aif] :: _init(), END [23:38:29.365] AnimatedImageFrame[aif] :: constructor() [23:38:29.365] AnimatedImageFrame[aif] :: _init(), BEGIN [23:38:29.365] CanvasClip :: LoadImageWithPromise(), src: 44141B5E-FED3-4101-3D5F-8642FBDDBA44_5.jpg [23:38:29.388] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [23:38:29.390] AnimatedImageFrame[aif] :: _init(), END [23:38:29.390] AnimatedImageFrame[aif] :: constructor() [23:38:29.391] AnimatedImageFrame[aif] :: _init(), BEGIN [23:38:29.391] CanvasClip :: LoadImageWithPromise(), src: 44141B5E-FED3-4101-3D5F-8642FBDDBA44_6.jpg [23:38:29.414] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [23:38:29.415] AnimatedImageFrame[aif] :: _init(), END [23:38:29.416] AnimatedImageFrame[aif] :: constructor() [23:38:29.416] AnimatedImageFrame[aif] :: _init(), BEGIN [23:38:29.416] CanvasClip :: LoadImageWithPromise(), src: 44141B5E-FED3-4101-3D5F-8642FBDDBA44_7.jpg [23:38:29.439] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [23:38:29.440] AnimatedImageFrame[aif] :: _init(), END [23:38:29.440] AnimatedImageFrame[aif] :: constructor() [23:38:29.440] AnimatedImageFrame[aif] :: _init(), BEGIN [23:38:29.440] CanvasClip :: LoadImageWithPromise(), src: 44141B5E-FED3-4101-3D5F-8642FBDDBA44_8.jpg [23:38:29.462] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [23:38:29.463] AnimatedImageFrame[aif] :: _init(), END [23:38:29.464] AnimatedImageFrame[aif] :: constructor() [23:38:29.464] AnimatedImageFrame[aif] :: _init(), BEGIN [23:38:29.464] CanvasClip :: LoadImageWithPromise(), src: 44141B5E-FED3-4101-3D5F-8642FBDDBA44_9.jpg [23:38:29.485] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [23:38:29.486] AnimatedImageFrame[aif] :: _init(), END [23:38:29.487] AnimatedImageFrame[aif] :: constructor() [23:38:29.487] AnimatedImageFrame[aif] :: _init(), BEGIN [23:38:29.487] CanvasClip :: LoadImageWithPromise(), src: 44141B5E-FED3-4101-3D5F-8642FBDDBA44_10.jpg [23:38:29.511] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [23:38:29.512] AnimatedImageFrame[aif] :: _init(), END [23:38:29.513] AnimatedImageFrame[aif] :: constructor() [23:38:29.513] AnimatedImageFrame[aif] :: _init(), BEGIN [23:38:29.513] CanvasClip :: LoadImageWithPromise(), src: 44141B5E-FED3-4101-3D5F-8642FBDDBA44_11.jpg [23:38:29.539] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [23:38:29.540] AnimatedImageFrame[aif] :: _init(), END [23:38:29.541] AnimatedImageFrame[aif] :: constructor() [23:38:29.541] AnimatedImageFrame[aif] :: _init(), BEGIN [23:38:29.541] CanvasClip :: LoadImageWithPromise(), src: 44141B5E-FED3-4101-3D5F-8642FBDDBA44_12.jpg [23:38:29.559] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [23:38:29.560] AnimatedImageFrame[aif] :: _init(), END [23:38:29.561] AnimatedImageFrame[aif] :: constructor() [23:38:29.561] AnimatedImageFrame[aif] :: _init(), BEGIN [23:38:29.561] CanvasClip :: LoadImageWithPromise(), src: 44141B5E-FED3-4101-3D5F-8642FBDDBA44_13.jpg [23:38:29.582] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [23:38:29.583] AnimatedImageFrame[aif] :: _init(), END [23:38:29.584] AnimatedImageFrame[aif] :: constructor() [23:38:29.584] AnimatedImageFrame[aif] :: _init(), BEGIN [23:38:29.584] CanvasClip :: LoadImageWithPromise(), src: 44141B5E-FED3-4101-3D5F-8642FBDDBA44_14.jpg [23:38:29.603] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [23:38:29.604] AnimatedImageFrame[aif] :: _init(), END [23:38:29.604] AnimatedImageFrame[aif] :: constructor() [23:38:29.605] AnimatedImageFrame[aif] :: _init(), BEGIN [23:38:29.605] CanvasClip :: LoadImageWithPromise(), src: 44141B5E-FED3-4101-3D5F-8642FBDDBA44_15.jpg [23:38:29.624] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [23:38:29.625] AnimatedImageFrame[aif] :: _init(), END [23:38:29.626] AnimatedImageFrame[aif] :: constructor() [23:38:29.626] AnimatedImageFrame[aif] :: _init(), BEGIN [23:38:29.626] CanvasClip :: LoadImageWithPromise(), src: 44141B5E-FED3-4101-3D5F-8642FBDDBA44_16.jpg [23:38:29.651] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [23:38:29.652] AnimatedImageFrame[aif] :: _init(), END [23:38:29.653] AnimatedImageFrame[aif] :: constructor() [23:38:29.653] AnimatedImageFrame[aif] :: _init(), BEGIN [23:38:29.653] CanvasClip :: LoadImageWithPromise(), src: 44141B5E-FED3-4101-3D5F-8642FBDDBA44_17.jpg [23:38:29.671] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [23:38:29.672] AnimatedImageFrame[aif] :: _init(), END [23:38:29.673] AnimatedImageFrame[aif] :: constructor() [23:38:29.673] AnimatedImageFrame[aif] :: _init(), BEGIN [23:38:29.673] CanvasClip :: LoadImageWithPromise(), src: 44141B5E-FED3-4101-3D5F-8642FBDDBA44_18.jpg [23:38:29.691] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [23:38:29.692] AnimatedImageFrame[aif] :: _init(), END [23:38:29.692] AnimatedImageFrame[aif] :: constructor() [23:38:29.692] AnimatedImageFrame[aif] :: _init(), BEGIN [23:38:29.692] CanvasClip :: LoadImageWithPromise(), src: 44141B5E-FED3-4101-3D5F-8642FBDDBA44_19.jpg [23:38:29.713] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [23:38:29.714] AnimatedImageFrame[aif] :: _init(), END [23:38:29.715] AnimatedImageFrame[aif] :: constructor() [23:38:29.715] AnimatedImageFrame[aif] :: _init(), BEGIN [23:38:29.715] CanvasClip :: LoadImageWithPromise(), src: 44141B5E-FED3-4101-3D5F-8642FBDDBA44_20.jpg [23:38:29.730] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [23:38:29.730] AnimatedImageFrame[aif] :: _init(), END [23:38:29.731] AnimatedImageFrame[aif] :: constructor() [23:38:29.731] AnimatedImageFrame[aif] :: _init(), BEGIN [23:38:29.731] CanvasClip :: LoadImageWithPromise(), src: 44141B5E-FED3-4101-3D5F-8642FBDDBA44_1.jpg [23:38:29.754] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [23:38:29.755] AnimatedImageFrame[aif] :: _init(), END [23:38:29.755] Overlay[simplefadedisplay] :: _animate() [23:38:29.756] KenBurnsSlideshow[simplefadedisplay] :: _init(), END [23:38:29.756] CanvasStream[simplefadedisplay] :: _init(), p.then() [23:38:29.756] CanvasStream[canvas_1043695419431] :: _init(), promise.all.then() [23:38:29.758] CanvasStream[canvas_1043695419431] :: _init(), END [23:38:29.758] StreamMangaer :: init(), stream[canvas_1043695419431].then() [23:38:29.758] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'canvas_1043695419431', progress: 1 } [23:38:29.759] index :: _onStepProgress_vidbot(), percent: 100 [23:38:29.759] StreamManager :: init(), promise.all.then... [23:38:29.759] Vidbot :: StreamMgr.on( 'INITED' ) [23:38:29.759] Vidbot :: _next(), _stepIndex:2 of 4 [23:38:29.759] index :: _onStepCompleted_vidbot(), step: 2 [23:38:29.759] index :: _onStepStarted_vidbot(), step: 3 [23:38:29.760] Vidbot :: step[2], label:Rendering Canvas Streams [23:38:29.760] Vidbot :: StreamMgr.on( 'RENDER_STARTED' ), data: undefined [23:38:29.760] StreamManager :: render() [23:38:29.761] CanvasStream[canvas_1043695419431] :: render() [23:38:29.792] index :: _onStepProgress_vidbot(), percent: 0 [23:38:49.337] index :: _onStepProgress_vidbot(), percent: 5 [23:39:10.777] index :: _onStepProgress_vidbot(), percent: 10 [23:39:31.994] index :: _onStepProgress_vidbot(), percent: 15 [23:39:54.528] index :: _onStepProgress_vidbot(), percent: 20 [23:40:16.439] index :: _onStepProgress_vidbot(), percent: 25 [23:40:38.139] index :: _onStepProgress_vidbot(), percent: 30 [23:40:58.610] index :: _onStepProgress_vidbot(), percent: 35 [23:41:19.311] index :: _onStepProgress_vidbot(), percent: 40 [23:41:40.410] index :: _onStepProgress_vidbot(), percent: 45 [23:42:03.238] index :: _onStepProgress_vidbot(), percent: 50 [23:42:26.447] index :: _onStepProgress_vidbot(), percent: 55 [23:42:48.626] index :: _onStepProgress_vidbot(), percent: 60 [23:43:10.062] index :: _onStepProgress_vidbot(), percent: 65 [23:43:31.825] index :: _onStepProgress_vidbot(), percent: 70 [23:43:53.292] index :: _onStepProgress_vidbot(), percent: 75 [23:44:15.066] index :: _onStepProgress_vidbot(), percent: 80 [23:44:35.736] index :: _onStepProgress_vidbot(), percent: 85 [23:44:56.042] index :: _onStepProgress_vidbot(), percent: 90 [23:45:14.097] index :: _onStepProgress_vidbot(), percent: 95 [23:45:33.017] index :: _onStepProgress_vidbot(), percent: 100 [23:45:35.151] StreamManager :: render(), Promise.all.then... [23:45:35.151] Vidbot :: StreamMgr.on( 'RENDER_COMPLETED' ), data: undefined [23:45:35.152] Vidbot :: _next(), _stepIndex:3 of 4 [23:45:35.152] index :: _onStepCompleted_vidbot(), step: 3 [23:45:35.153] index :: _onStepStarted_vidbot(), step: 4 [23:45:35.154] Vidbot :: step[3], label:Encoding Media [23:45:35.157] CanvasFilters :: Overlay() [23:45:35.157] AudioStream[audio_vo] :: inputOptions() [23:45:35.158] AudioFilters :: Volume() [23:45:35.158] filter: [2:a]volume=1[2_vol] [23:45:35.158] AudioFilters :: Delay() [23:45:35.158] filter: [2_vol]adelay=0|0[2_del] [23:45:35.158] AudioStream[bg_music] :: inputOptions() [23:45:35.158] AudioFilters :: Volume() [23:45:35.158] filter: [3:a]volume=0.25[3_vol] [23:45:35.159] AudioFilters :: FadeOut() [23:45:35.159] filter: [3_vol]afade=t=out:st=60.17:d=1[3_fadeout] [23:45:35.159] AudioFilters :: Delay() [23:45:35.159] filter: [3_fadeout]adelay=0|0[3_del] [23:45:35.159] AudioFilters :: Mix() [23:45:35.159] filter: [2_del][3_del]amix=inputs=2:duration=longest[a_out] [23:45:35.159] mixed filter: [2_del][3_del]amix=inputs=2:duration=longest[a_out] [23:45:35.163] hang.time: 60 [23:45:35.277] Vidbot :: ffmpeg.on( 'start' ) [23:45:35.278] ffmpeg -f lavfi -i color=c=000000:s=640x360:r=30:duration=60.17 -r 30 -i ./tmp/canvas_1043695419431_%05d.png -to 00:01:00.170 -i file:///var/www/html/ [23:45:35.278] clients/13759/audio/44141B5E-FED3-4101-3D5F-8642FBDDBA44.mp3 -to 00:01:00.170 -i file:///var/app/video_pre_processor/assets/vidbot/_files/audio/Hip Ho [23:45:35.278] p.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.25[3_vol];[3_vol]afade=t=out:st= [23:45:35.278] 60.17: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 [23:45:35.278] _out] -map [1_out] -preset veryfast -crf 18 -movflags frag_keyframe+empty_moov -pix_fmt yuv420p /var/www/html/clients/13759/video/44141B5E-FED3-4101-3 [23:45:35.278] D5F-8642FBDDBA44.mp4 [23:45:35.420] index :: _onStepProgress_vidbot(), percent: -3452299248 [23:45:35.868] index :: _onStepProgress_vidbot(), percent: 2 [23:45:36.873] index :: _onStepProgress_vidbot(), percent: 7 [23:45:37.375] index :: _onStepProgress_vidbot(), percent: 10 [23:45:38.386] index :: _onStepProgress_vidbot(), percent: 15 [23:45:39.409] index :: _onStepProgress_vidbot(), percent: 20 [23:45:40.412] index :: _onStepProgress_vidbot(), percent: 25 [23:45:41.420] index :: _onStepProgress_vidbot(), percent: 30 [23:45:42.450] index :: _onStepProgress_vidbot(), percent: 37 [23:45:42.945] index :: _onStepProgress_vidbot(), percent: 40 [23:45:43.955] index :: _onStepProgress_vidbot(), percent: 46 [23:45:44.959] index :: _onStepProgress_vidbot(), percent: 51 [23:45:45.960] index :: _onStepProgress_vidbot(), percent: 57 [23:45:46.464] index :: _onStepProgress_vidbot(), percent: 60 [23:45:47.477] index :: _onStepProgress_vidbot(), percent: 66 [23:45:48.481] index :: _onStepProgress_vidbot(), percent: 72 [23:45:48.990] index :: _onStepProgress_vidbot(), percent: 75 [23:45:49.998] index :: _onStepProgress_vidbot(), percent: 80 [23:45:51.007] index :: _onStepProgress_vidbot(), percent: 86 [23:45:52.013] index :: _onStepProgress_vidbot(), percent: 91 [23:45:53.024] index :: _onStepProgress_vidbot(), percent: 97 [23:45:53.477] index :: _onStepProgress_vidbot(), percent: 100 [23:45:53.499] Vidbot :: ffmpeg.on( 'end' ), Done! [23:45:53.499] StreamManager :: dispose() [23:45:53.500] CanvasStream[canvas_1043695419431] :: dispose() [23:45:53.505] Vidbot :: fflog.on( 'finish' ) [23:45:53.505] fflog.path: /var/www/html/clients/13759/video/44141B5E-FED3-4101-3D5F-8642FBDDBA44.mp4.fflog [23:45:53.505] Vidbot :: _next(), _stepIndex:4 of 4 [23:45:53.505] index :: _onStepCompleted_vidbot(), step: 4 [23:45:53.505] index :: _onComplete_vidbot(), data: { stepTime: 0, appTime: 444.438, output: '/var/www/html/clients/13759/video/44141B5E-FED3-4101-3D5F-8642FBDDBA44.mp4', duration: 60.17 } --------------------------------------------------------------------------------------------------------------- Output File : /var/app/video_pre_processor/jobs/postp//var/www/html/clients/13759/video/44141B5E-FED3-4101-3D5F-8642FBDDBA44.mp4 Media Duration : 00:01:00.170 Generation Time : 00:07:24.437 ---------------------------------------------------------------------------------------------------------------