Built motion from commit 092f8824.|2.5.49
[motion2.git] / server / api / whatsappTransferReport / whatsappTransferReport.controller.js
index 94a79cb..0beb96a 100644 (file)
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                        *
 // *                                                                       *
 // *************************************************************************
-var _0xb153=['jsforce','papaparse','ioredis','../../components/auth/service','../../components/parsers/advancedSearch','../../config/logger','api','../../config/environment','../../mysqldb','sendStatus','status','end','offset','limit','Content-Range','json','reject','save','update','destroy','then','error','stack','name','send','index','map','rawAttributes','key','model','query','keys','filters','intersection','fields','attributes','length','hasOwnProperty','order','sort','where','pick','filter','merge','type','VIRTUAL','count','includeAll','findAll','rows','catch','show','params','options','WhatsappTransferReport','find','create','body','describe','html-pdf','eml-format','rimraf','fast-json-patch','request-promise','moment','mustache','util','path','to-csv','ejs','crypto'];(function(_0x17d177,_0x255a28){var _0x42a394=function(_0x4b1bba){while(--_0x4b1bba){_0x17d177['push'](_0x17d177['shift']());}};_0x42a394(++_0x255a28);}(_0xb153,0x110));var _0x3b15=function(_0x24355d,_0x4bba3f){_0x24355d=_0x24355d-0x0;var _0x557858=_0xb153[_0x24355d];return _0x557858;};'use strict';var pdf=require(_0x3b15('0x0'));var emlformat=require(_0x3b15('0x1'));var rimraf=require(_0x3b15('0x2'));var zipdir=require('zip-dir');var jsonpatch=require(_0x3b15('0x3'));var rp=require(_0x3b15('0x4'));var moment=require(_0x3b15('0x5'));var BPromise=require('bluebird');var Mustache=require(_0x3b15('0x6'));var util=require(_0x3b15('0x7'));var path=require(_0x3b15('0x8'));var sox=require('sox');var csv=require(_0x3b15('0x9'));var ejs=require(_0x3b15('0xa'));var fs=require('fs');var _=require('lodash');var squel=require('squel');var crypto=require(_0x3b15('0xb'));var jsforce=require(_0x3b15('0xc'));var deskjs=require('desk.js');var toCsv=require(_0x3b15('0x9'));var querystring=require('querystring');var Papa=require(_0x3b15('0xd'));var Redis=require(_0x3b15('0xe'));var authService=require(_0x3b15('0xf'));var qs=require('../../components/parsers/qs');var as=require(_0x3b15('0x10'));var hardwareService=require('../../config/license/hardware');var logger=require(_0x3b15('0x11'))(_0x3b15('0x12'));var utils=require('../../config/utils');var config=require(_0x3b15('0x13'));var db=require(_0x3b15('0x14'))['db'];function respondWithStatusCode(_0x14ac9c,_0x54f3ee){_0x54f3ee=_0x54f3ee||0xcc;return function(_0x151379){if(_0x151379){return _0x14ac9c[_0x3b15('0x15')](_0x54f3ee);}return _0x14ac9c[_0x3b15('0x16')](_0x54f3ee)[_0x3b15('0x17')]();};}function respondWithResult(_0x34e698,_0x4f1f4f){_0x4f1f4f=_0x4f1f4f||0xc8;return function(_0x52d287){if(_0x52d287){return _0x34e698['status'](_0x4f1f4f)['json'](_0x52d287);}};}function respondWithFilteredResult(_0x58c790,_0x1514d7){return function(_0x5d66a7){if(_0x5d66a7){var _0x23b83d=_0x5d66a7['count'],_0x262829=_0x1514d7[_0x3b15('0x18')],_0x43e97b=_0x1514d7[_0x3b15('0x18')]+_0x1514d7[_0x3b15('0x19')],_0x9ad880;if(_0x43e97b>=_0x23b83d){_0x43e97b=_0x23b83d;_0x9ad880=0xc8;}else{_0x9ad880=0xce;}_0x58c790[_0x3b15('0x16')](_0x9ad880);return _0x58c790['set'](_0x3b15('0x1a'),_0x262829+'-'+_0x43e97b+'/'+_0x23b83d)[_0x3b15('0x1b')](_0x5d66a7);}return null;};}function patchUpdates(_0x4113b9){return function(_0x2498b5){try{jsonpatch['apply'](_0x2498b5,_0x4113b9,!![]);}catch(_0x2c3294){return BPromise[_0x3b15('0x1c')](_0x2c3294);}return _0x2498b5[_0x3b15('0x1d')]();};}function saveUpdates(_0x2cef1c,_0xb23c00){return function(_0x11883c){if(_0x11883c){return _0x11883c[_0x3b15('0x1e')](_0x2cef1c)['then'](function(_0x4d7d98){return _0x4d7d98;});}return null;};}function removeEntity(_0x45abba,_0x20fe22){return function(_0x449a7b){if(_0x449a7b){return _0x449a7b[_0x3b15('0x1f')]()[_0x3b15('0x20')](function(){_0x45abba[_0x3b15('0x16')](0xcc)[_0x3b15('0x17')]();});}};}function handleEntityNotFound(_0x2af225,_0x409680){return function(_0xf413c8){if(!_0xf413c8){_0x2af225['sendStatus'](0x194);}return _0xf413c8;};}function handleError(_0xe33ddd,_0x1ffd75){_0x1ffd75=_0x1ffd75||0x1f4;return function(_0xea79a){logger[_0x3b15('0x21')](_0xea79a[_0x3b15('0x22')]);if(_0xea79a['name']){delete _0xea79a[_0x3b15('0x23')];}_0xe33ddd[_0x3b15('0x16')](_0x1ffd75)[_0x3b15('0x24')](_0xea79a);};}exports[_0x3b15('0x25')]=function(_0x507ec8,_0x533bc3){var _0x7ce4dd={},_0x5596ea={},_0x2b30e8={'count':0x0,'rows':[]};var _0x25c8de=_[_0x3b15('0x26')](db['WhatsappTransferReport'][_0x3b15('0x27')],function(_0x3c7018){return{'name':_0x3c7018['fieldName'],'type':_0x3c7018['type'][_0x3b15('0x28')]};});_0x5596ea[_0x3b15('0x29')]=_[_0x3b15('0x26')](_0x25c8de,_0x3b15('0x23'));_0x5596ea[_0x3b15('0x2a')]=_[_0x3b15('0x2b')](_0x507ec8[_0x3b15('0x2a')]);_0x5596ea[_0x3b15('0x2c')]=_[_0x3b15('0x2d')](_0x5596ea[_0x3b15('0x29')],_0x5596ea[_0x3b15('0x2a')]);_0x7ce4dd['attributes']=_['intersection'](_0x5596ea[_0x3b15('0x29')],qs[_0x3b15('0x2e')](_0x507ec8['query'][_0x3b15('0x2e')]));_0x7ce4dd[_0x3b15('0x2f')]=_0x7ce4dd[_0x3b15('0x2f')][_0x3b15('0x30')]?_0x7ce4dd[_0x3b15('0x2f')]:_0x5596ea[_0x3b15('0x29')];if(!_0x507ec8[_0x3b15('0x2a')][_0x3b15('0x31')]('nolimit')){_0x7ce4dd[_0x3b15('0x19')]=qs['limit'](_0x507ec8[_0x3b15('0x2a')][_0x3b15('0x19')]);_0x7ce4dd[_0x3b15('0x18')]=qs['offset'](_0x507ec8['query'][_0x3b15('0x18')]);}_0x7ce4dd[_0x3b15('0x32')]=qs['sort'](_0x507ec8[_0x3b15('0x2a')][_0x3b15('0x33')]);_0x7ce4dd[_0x3b15('0x34')]=qs[_0x3b15('0x2c')](_[_0x3b15('0x35')](_0x507ec8[_0x3b15('0x2a')],_0x5596ea[_0x3b15('0x2c')]),_0x25c8de);if(_0x507ec8['query'][_0x3b15('0x36')]){_0x7ce4dd[_0x3b15('0x34')]=_[_0x3b15('0x37')](_0x7ce4dd[_0x3b15('0x34')],{'$or':_[_0x3b15('0x26')](_0x25c8de,function(_0x29a4d4){if(_0x29a4d4[_0x3b15('0x38')]!==_0x3b15('0x39')){var _0x2b5303={};_0x2b5303[_0x29a4d4['name']]={'$like':'%'+_0x507ec8[_0x3b15('0x2a')]['filter']+'%'};return _0x2b5303;}})});}_0x7ce4dd=_[_0x3b15('0x37')]({},_0x7ce4dd,_0x507ec8['options']);var _0x2d425e={'where':_0x7ce4dd['where']};return db['WhatsappTransferReport'][_0x3b15('0x3a')](_0x2d425e)['then'](function(_0x3621cc){_0x2b30e8[_0x3b15('0x3a')]=_0x3621cc;if(_0x507ec8[_0x3b15('0x2a')][_0x3b15('0x3b')]){_0x7ce4dd['include']=[{'all':!![]}];}return db['WhatsappTransferReport'][_0x3b15('0x3c')](_0x7ce4dd);})['then'](function(_0x16c368){_0x2b30e8[_0x3b15('0x3d')]=_0x16c368;return _0x2b30e8;})[_0x3b15('0x20')](respondWithFilteredResult(_0x533bc3,_0x7ce4dd))[_0x3b15('0x3e')](handleError(_0x533bc3,null));};exports[_0x3b15('0x3f')]=function(_0x5ce562,_0x235aac){var _0x33ba94={'raw':!![],'where':{'id':_0x5ce562[_0x3b15('0x40')]['id']}},_0x571998={};_0x571998[_0x3b15('0x29')]=_['keys'](db['WhatsappTransferReport'][_0x3b15('0x27')]);_0x571998['query']=_[_0x3b15('0x2b')](_0x5ce562[_0x3b15('0x2a')]);_0x571998[_0x3b15('0x2c')]=_[_0x3b15('0x2d')](_0x571998[_0x3b15('0x29')],_0x571998[_0x3b15('0x2a')]);_0x33ba94[_0x3b15('0x2f')]=_[_0x3b15('0x2d')](_0x571998[_0x3b15('0x29')],qs[_0x3b15('0x2e')](_0x5ce562['query']['fields']));_0x33ba94[_0x3b15('0x2f')]=_0x33ba94[_0x3b15('0x2f')]['length']?_0x33ba94['attributes']:_0x571998['model'];if(_0x5ce562[_0x3b15('0x2a')]['includeAll']){_0x33ba94['include']=[{'all':!![]}];}_0x33ba94=_[_0x3b15('0x37')]({},_0x33ba94,_0x5ce562[_0x3b15('0x41')]);return db[_0x3b15('0x42')][_0x3b15('0x43')](_0x33ba94)['then'](handleEntityNotFound(_0x235aac,null))[_0x3b15('0x20')](respondWithResult(_0x235aac,null))['catch'](handleError(_0x235aac,null));};exports['create']=function(_0x5af815,_0x16fb58){return db['WhatsappTransferReport'][_0x3b15('0x44')](_0x5af815[_0x3b15('0x45')],{})[_0x3b15('0x20')](respondWithResult(_0x16fb58,0xc9))[_0x3b15('0x3e')](handleError(_0x16fb58,null));};exports[_0x3b15('0x1e')]=function(_0xccde03,_0x515653){if(_0xccde03['body']['id']){delete _0xccde03[_0x3b15('0x45')]['id'];}return db['WhatsappTransferReport'][_0x3b15('0x43')]({'where':{'id':_0xccde03[_0x3b15('0x40')]['id']}})[_0x3b15('0x20')](handleEntityNotFound(_0x515653,null))[_0x3b15('0x20')](saveUpdates(_0xccde03[_0x3b15('0x45')],null))[_0x3b15('0x20')](respondWithResult(_0x515653,null))[_0x3b15('0x3e')](handleError(_0x515653,null));};exports[_0x3b15('0x1f')]=function(_0x34db3b,_0x179c3c){return db['WhatsappTransferReport'][_0x3b15('0x43')]({'where':{'id':_0x34db3b[_0x3b15('0x40')]['id']}})[_0x3b15('0x20')](handleEntityNotFound(_0x179c3c,null))[_0x3b15('0x20')](removeEntity(_0x179c3c,null))[_0x3b15('0x3e')](handleError(_0x179c3c,null));};exports[_0x3b15('0x46')]=function(_0x28f369,_0x3ec0c7){return db['WhatsappTransferReport'][_0x3b15('0x46')]()[_0x3b15('0x20')](respondWithResult(_0x3ec0c7,null))['catch'](handleError(_0x3ec0c7,null));};
\ No newline at end of file
+var _0x3717=['then','include','findAll','params','rawAttributes','find','create','catch','body','describe','eml-format','zip-dir','fast-json-patch','request-promise','moment','util','path','to-csv','ejs','fs-extra','lodash','squel','crypto','jsforce','desk.js','querystring','papaparse','../../components/auth/service','../../components/parsers/advancedSearch','../../config/license/hardware','api','../../config/utils','../../config/environment','../../config/license/util','../../mysqldb','sendStatus','status','end','json','offset','undefined','limit','count','set','Content-Range','apply','reject','save','update','destroy','stack','name','send','index','WhatsappTransferReport','fieldName','type','query','keys','filters','intersection','model','attributes','fields','length','hasOwnProperty','nolimit','order','sort','where','merge','map','VIRTUAL','filter','options'];(function(_0x234a89,_0x2326c5){var _0x228046=function(_0x59288d){while(--_0x59288d){_0x234a89['push'](_0x234a89['shift']());}};_0x228046(++_0x2326c5);}(_0x3717,0xeb));var _0x7371=function(_0x2b63c9,_0x9b77ef){_0x2b63c9=_0x2b63c9-0x0;var _0x5928c6=_0x3717[_0x2b63c9];return _0x5928c6;};'use strict';var emlformat=require(_0x7371('0x0'));var rimraf=require('rimraf');var zipdir=require(_0x7371('0x1'));var jsonpatch=require(_0x7371('0x2'));var rp=require(_0x7371('0x3'));var moment=require(_0x7371('0x4'));var BPromise=require('bluebird');var Mustache=require('mustache');var util=require(_0x7371('0x5'));var path=require(_0x7371('0x6'));var sox=require('sox');var csv=require(_0x7371('0x7'));var ejs=require(_0x7371('0x8'));var fs=require('fs');var fs_extra=require(_0x7371('0x9'));var _=require(_0x7371('0xa'));var squel=require(_0x7371('0xb'));var crypto=require(_0x7371('0xc'));var jsforce=require(_0x7371('0xd'));var deskjs=require(_0x7371('0xe'));var toCsv=require(_0x7371('0x7'));var querystring=require(_0x7371('0xf'));var Papa=require(_0x7371('0x10'));var Redis=require('ioredis');var authService=require(_0x7371('0x11'));var qs=require('../../components/parsers/qs');var as=require(_0x7371('0x12'));var hardwareService=require(_0x7371('0x13'));var logger=require('../../config/logger')(_0x7371('0x14'));var utils=require(_0x7371('0x15'));var config=require(_0x7371('0x16'));var licenseUtil=require(_0x7371('0x17'));var db=require(_0x7371('0x18'))['db'];function respondWithStatusCode(_0x3dde04,_0x48c3fc){_0x48c3fc=_0x48c3fc||0xcc;return function(_0x4616e8){if(_0x4616e8){return _0x3dde04[_0x7371('0x19')](_0x48c3fc);}return _0x3dde04[_0x7371('0x1a')](_0x48c3fc)[_0x7371('0x1b')]();};}function respondWithResult(_0x33867d,_0x5a41c7){_0x5a41c7=_0x5a41c7||0xc8;return function(_0x55ad64){if(_0x55ad64){return _0x33867d[_0x7371('0x1a')](_0x5a41c7)[_0x7371('0x1c')](_0x55ad64);}};}function respondWithFilteredResult(_0x3725dc,_0x29501d){return function(_0x28f416){if(_0x28f416){var _0x37914c=typeof _0x29501d[_0x7371('0x1d')]===_0x7371('0x1e')&&typeof _0x29501d[_0x7371('0x1f')]===_0x7371('0x1e');var _0x3189e1=_0x28f416[_0x7371('0x20')];var _0x37f8d4=_0x37914c?0x0:_0x29501d[_0x7371('0x1d')];var _0x9e3965=_0x37914c?_0x28f416['count']:_0x29501d['offset']+_0x29501d[_0x7371('0x1f')];var _0x35b420;if(_0x9e3965>=_0x3189e1){_0x9e3965=_0x3189e1;_0x35b420=0xc8;}else{_0x35b420=0xce;}_0x3725dc['status'](_0x35b420);return _0x3725dc[_0x7371('0x21')](_0x7371('0x22'),_0x37f8d4+'-'+_0x9e3965+'/'+_0x3189e1)['json'](_0x28f416);}return null;};}function patchUpdates(_0xb535c0){return function(_0x16c134){try{jsonpatch[_0x7371('0x23')](_0x16c134,_0xb535c0,!![]);}catch(_0x30e83c){return BPromise[_0x7371('0x24')](_0x30e83c);}return _0x16c134[_0x7371('0x25')]();};}function saveUpdates(_0x19c0d1,_0x15401d){return function(_0x1b506c){if(_0x1b506c){return _0x1b506c[_0x7371('0x26')](_0x19c0d1)['then'](function(_0x272956){return _0x272956;});}return null;};}function removeEntity(_0x38aa53,_0x1d4722){return function(_0x25eb51){if(_0x25eb51){return _0x25eb51[_0x7371('0x27')]()['then'](function(){_0x38aa53[_0x7371('0x1a')](0xcc)[_0x7371('0x1b')]();});}};}function handleEntityNotFound(_0x302b8b,_0xb6a1dd){return function(_0x2f3dc3){if(!_0x2f3dc3){_0x302b8b[_0x7371('0x19')](0x194);}return _0x2f3dc3;};}function handleError(_0x2c69c4,_0x1aa2c0){_0x1aa2c0=_0x1aa2c0||0x1f4;return function(_0x3d2479){logger['error'](_0x3d2479[_0x7371('0x28')]);if(_0x3d2479['name']){delete _0x3d2479[_0x7371('0x29')];}_0x2c69c4[_0x7371('0x1a')](_0x1aa2c0)[_0x7371('0x2a')](_0x3d2479);};}exports[_0x7371('0x2b')]=function(_0x3ff9f0,_0x290f41){var _0x5e70e3={},_0x4ca8a3={},_0x460779={'count':0x0,'rows':[]};var _0x1db61f=_['map'](db[_0x7371('0x2c')]['rawAttributes'],function(_0x309e62){return{'name':_0x309e62[_0x7371('0x2d')],'type':_0x309e62[_0x7371('0x2e')]['key']};});_0x4ca8a3['model']=_['map'](_0x1db61f,_0x7371('0x29'));_0x4ca8a3[_0x7371('0x2f')]=_[_0x7371('0x30')](_0x3ff9f0[_0x7371('0x2f')]);_0x4ca8a3[_0x7371('0x31')]=_[_0x7371('0x32')](_0x4ca8a3[_0x7371('0x33')],_0x4ca8a3[_0x7371('0x2f')]);_0x5e70e3[_0x7371('0x34')]=_[_0x7371('0x32')](_0x4ca8a3['model'],qs['fields'](_0x3ff9f0[_0x7371('0x2f')][_0x7371('0x35')]));_0x5e70e3[_0x7371('0x34')]=_0x5e70e3[_0x7371('0x34')][_0x7371('0x36')]?_0x5e70e3[_0x7371('0x34')]:_0x4ca8a3['model'];if(!_0x3ff9f0[_0x7371('0x2f')][_0x7371('0x37')](_0x7371('0x38'))){_0x5e70e3[_0x7371('0x1f')]=qs[_0x7371('0x1f')](_0x3ff9f0[_0x7371('0x2f')][_0x7371('0x1f')]);_0x5e70e3[_0x7371('0x1d')]=qs['offset'](_0x3ff9f0[_0x7371('0x2f')]['offset']);}_0x5e70e3[_0x7371('0x39')]=qs[_0x7371('0x3a')](_0x3ff9f0['query'][_0x7371('0x3a')]);_0x5e70e3[_0x7371('0x3b')]=qs['filters'](_['pick'](_0x3ff9f0[_0x7371('0x2f')],_0x4ca8a3[_0x7371('0x31')]),_0x1db61f);if(_0x3ff9f0['query']['filter']){_0x5e70e3[_0x7371('0x3b')]=_[_0x7371('0x3c')](_0x5e70e3['where'],{'$or':_[_0x7371('0x3d')](_0x1db61f,function(_0x5a6085){if(_0x5a6085[_0x7371('0x2e')]!==_0x7371('0x3e')){var _0x516006={};_0x516006[_0x5a6085[_0x7371('0x29')]]={'$like':'%'+_0x3ff9f0['query'][_0x7371('0x3f')]+'%'};return _0x516006;}})});}_0x5e70e3=_[_0x7371('0x3c')]({},_0x5e70e3,_0x3ff9f0[_0x7371('0x40')]);var _0x207706={'where':_0x5e70e3[_0x7371('0x3b')]};return db[_0x7371('0x2c')]['count'](_0x207706)[_0x7371('0x41')](function(_0x1980b9){_0x460779[_0x7371('0x20')]=_0x1980b9;if(_0x3ff9f0[_0x7371('0x2f')]['includeAll']){_0x5e70e3[_0x7371('0x42')]=[{'all':!![]}];}return db['WhatsappTransferReport'][_0x7371('0x43')](_0x5e70e3);})[_0x7371('0x41')](function(_0xff6b2e){_0x460779['rows']=_0xff6b2e;return _0x460779;})[_0x7371('0x41')](respondWithFilteredResult(_0x290f41,_0x5e70e3))['catch'](handleError(_0x290f41,null));};exports['show']=function(_0x50188d,_0x632da8){var _0x530f5b={'raw':!![],'where':{'id':_0x50188d[_0x7371('0x44')]['id']}},_0xc0315b={};_0xc0315b['model']=_['keys'](db['WhatsappTransferReport'][_0x7371('0x45')]);_0xc0315b['query']=_['keys'](_0x50188d[_0x7371('0x2f')]);_0xc0315b[_0x7371('0x31')]=_[_0x7371('0x32')](_0xc0315b[_0x7371('0x33')],_0xc0315b[_0x7371('0x2f')]);_0x530f5b['attributes']=_[_0x7371('0x32')](_0xc0315b[_0x7371('0x33')],qs[_0x7371('0x35')](_0x50188d[_0x7371('0x2f')][_0x7371('0x35')]));_0x530f5b[_0x7371('0x34')]=_0x530f5b[_0x7371('0x34')][_0x7371('0x36')]?_0x530f5b[_0x7371('0x34')]:_0xc0315b[_0x7371('0x33')];if(_0x50188d[_0x7371('0x2f')]['includeAll']){_0x530f5b['include']=[{'all':!![]}];}_0x530f5b=_['merge']({},_0x530f5b,_0x50188d[_0x7371('0x40')]);return db[_0x7371('0x2c')][_0x7371('0x46')](_0x530f5b)[_0x7371('0x41')](handleEntityNotFound(_0x632da8,null))[_0x7371('0x41')](respondWithResult(_0x632da8,null))['catch'](handleError(_0x632da8,null));};exports[_0x7371('0x47')]=function(_0xdff6aa,_0x144a5a){return db[_0x7371('0x2c')][_0x7371('0x47')](_0xdff6aa['body'],{})[_0x7371('0x41')](respondWithResult(_0x144a5a,0xc9))[_0x7371('0x48')](handleError(_0x144a5a,null));};exports[_0x7371('0x26')]=function(_0x3166ee,_0x39adb5){if(_0x3166ee['body']['id']){delete _0x3166ee[_0x7371('0x49')]['id'];}return db['WhatsappTransferReport'][_0x7371('0x46')]({'where':{'id':_0x3166ee[_0x7371('0x44')]['id']}})[_0x7371('0x41')](handleEntityNotFound(_0x39adb5,null))['then'](saveUpdates(_0x3166ee['body'],null))[_0x7371('0x41')](respondWithResult(_0x39adb5,null))[_0x7371('0x48')](handleError(_0x39adb5,null));};exports[_0x7371('0x27')]=function(_0x5de46c,_0x17a238){return db[_0x7371('0x2c')][_0x7371('0x46')]({'where':{'id':_0x5de46c[_0x7371('0x44')]['id']}})['then'](handleEntityNotFound(_0x17a238,null))[_0x7371('0x41')](removeEntity(_0x17a238,null))[_0x7371('0x48')](handleError(_0x17a238,null));};exports[_0x7371('0x4a')]=function(_0xc0be27,_0x56296a){return db[_0x7371('0x2c')]['describe']()['then'](respondWithResult(_0x56296a,null))['catch'](handleError(_0x56296a,null));};
\ No newline at end of file