Built motion from commit 10af8726.|2.6.34
[motion2.git] / server / api / whatsappApplication / whatsappApplication.controller.js
index 6449ce1..768caf4 100644 (file)
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                        *
 // *                                                                       *
 // *************************************************************************
-var _0xd7c6=['name','send','index','map','WhatsappApplication','rawAttributes','fieldName','type','key','model','query','keys','filters','intersection','attributes','sort','pick','filter','where','merge','VIRTUAL','options','count','rows','catch','show','fields','length','find','create','body','params','html-pdf','eml-format','zip-dir','request-promise','moment','bluebird','util','path','sox','to-csv','ejs','lodash','squel','querystring','papaparse','ioredis','../../config/license/hardware','../../config/logger','api','../../config/utils','../../mysqldb','sendStatus','status','end','json','offset','limit','set','Content-Range','apply','update','then','destroy','error','stack'];(function(_0xdb759b,_0x145a8a){var _0x32caff=function(_0x32bfdb){while(--_0x32bfdb){_0xdb759b['push'](_0xdb759b['shift']());}};_0x32caff(++_0x145a8a);}(_0xd7c6,0xa6));var _0x6d7c=function(_0x4dba9b,_0xbbe9ee){_0x4dba9b=_0x4dba9b-0x0;var _0x6790a8=_0xd7c6[_0x4dba9b];return _0x6790a8;};'use strict';var pdf=require(_0x6d7c('0x0'));var emlformat=require(_0x6d7c('0x1'));var rimraf=require('rimraf');var zipdir=require(_0x6d7c('0x2'));var jsonpatch=require('fast-json-patch');var rp=require(_0x6d7c('0x3'));var moment=require(_0x6d7c('0x4'));var BPromise=require(_0x6d7c('0x5'));var Mustache=require('mustache');var util=require(_0x6d7c('0x6'));var path=require(_0x6d7c('0x7'));var sox=require(_0x6d7c('0x8'));var csv=require(_0x6d7c('0x9'));var ejs=require(_0x6d7c('0xa'));var fs=require('fs');var _=require(_0x6d7c('0xb'));var squel=require(_0x6d7c('0xc'));var crypto=require('crypto');var jsforce=require('jsforce');var deskjs=require('desk.js');var toCsv=require(_0x6d7c('0x9'));var querystring=require(_0x6d7c('0xd'));var Papa=require(_0x6d7c('0xe'));var Redis=require(_0x6d7c('0xf'));var authService=require('../../components/auth/service');var qs=require('../../components/parsers/qs');var as=require('../../components/parsers/advancedSearch');var hardwareService=require(_0x6d7c('0x10'));var logger=require(_0x6d7c('0x11'))(_0x6d7c('0x12'));var utils=require(_0x6d7c('0x13'));var config=require('../../config/environment');var db=require(_0x6d7c('0x14'))['db'];function respondWithStatusCode(_0x4fa201,_0x3aeb4f){_0x3aeb4f=_0x3aeb4f||0xcc;return function(_0x4414fa){if(_0x4414fa){return _0x4fa201[_0x6d7c('0x15')](_0x3aeb4f);}return _0x4fa201[_0x6d7c('0x16')](_0x3aeb4f)[_0x6d7c('0x17')]();};}function respondWithResult(_0x29e30e,_0xef84f9){_0xef84f9=_0xef84f9||0xc8;return function(_0x2c50e1){if(_0x2c50e1){return _0x29e30e[_0x6d7c('0x16')](_0xef84f9)[_0x6d7c('0x18')](_0x2c50e1);}};}function respondWithFilteredResult(_0x2c3efc,_0x2cb08a){return function(_0x347829){if(_0x347829){var _0x122760=_0x347829['count'],_0x371a44=_0x2cb08a[_0x6d7c('0x19')],_0x1ec0c3=_0x2cb08a[_0x6d7c('0x19')]+_0x2cb08a[_0x6d7c('0x1a')],_0x1d48e8;if(_0x1ec0c3>=_0x122760){_0x1ec0c3=_0x122760;_0x1d48e8=0xc8;}else{_0x1d48e8=0xce;}_0x2c3efc[_0x6d7c('0x16')](_0x1d48e8);return _0x2c3efc[_0x6d7c('0x1b')](_0x6d7c('0x1c'),_0x371a44+'-'+_0x1ec0c3+'/'+_0x122760)['json'](_0x347829);}return null;};}function patchUpdates(_0x357441){return function(_0x5f13ee){try{jsonpatch[_0x6d7c('0x1d')](_0x5f13ee,_0x357441,!![]);}catch(_0x33a691){return BPromise['reject'](_0x33a691);}return _0x5f13ee['save']();};}function saveUpdates(_0x1c3ee8,_0x103b39){return function(_0x12eefc){if(_0x12eefc){return _0x12eefc[_0x6d7c('0x1e')](_0x1c3ee8)[_0x6d7c('0x1f')](function(_0x429ee5){return _0x429ee5;});}return null;};}function removeEntity(_0x10a2d8,_0x3d5086){return function(_0x4977d7){if(_0x4977d7){return _0x4977d7[_0x6d7c('0x20')]()[_0x6d7c('0x1f')](function(){_0x10a2d8[_0x6d7c('0x16')](0xcc)['end']();});}};}function handleEntityNotFound(_0x1ada3b,_0x18607c){return function(_0x6be526){if(!_0x6be526){_0x1ada3b[_0x6d7c('0x15')](0x194);}return _0x6be526;};}function handleError(_0x5745d9,_0x2fd868){_0x2fd868=_0x2fd868||0x1f4;return function(_0x56d1e6){logger[_0x6d7c('0x21')](_0x56d1e6[_0x6d7c('0x22')]);if(_0x56d1e6[_0x6d7c('0x23')]){delete _0x56d1e6['name'];}_0x5745d9[_0x6d7c('0x16')](_0x2fd868)[_0x6d7c('0x24')](_0x56d1e6);};}exports[_0x6d7c('0x25')]=function(_0x6cfa7b,_0x21a3c4){var _0x58a34a={},_0x4929bc={},_0x57ce94={'count':0x0,'rows':[]};var _0x45a826=_[_0x6d7c('0x26')](db[_0x6d7c('0x27')][_0x6d7c('0x28')],function(_0x17e3e1){return{'name':_0x17e3e1[_0x6d7c('0x29')],'type':_0x17e3e1[_0x6d7c('0x2a')][_0x6d7c('0x2b')]};});_0x4929bc[_0x6d7c('0x2c')]=_[_0x6d7c('0x26')](_0x45a826,_0x6d7c('0x23'));_0x4929bc[_0x6d7c('0x2d')]=_[_0x6d7c('0x2e')](_0x6cfa7b['query']);_0x4929bc[_0x6d7c('0x2f')]=_[_0x6d7c('0x30')](_0x4929bc['model'],_0x4929bc[_0x6d7c('0x2d')]);_0x58a34a[_0x6d7c('0x31')]=_[_0x6d7c('0x30')](_0x4929bc[_0x6d7c('0x2c')],qs['fields'](_0x6cfa7b[_0x6d7c('0x2d')]['fields']));_0x58a34a['attributes']=_0x58a34a[_0x6d7c('0x31')]['length']?_0x58a34a[_0x6d7c('0x31')]:_0x4929bc[_0x6d7c('0x2c')];if(!_0x6cfa7b[_0x6d7c('0x2d')]['hasOwnProperty']('nolimit')){_0x58a34a[_0x6d7c('0x1a')]=qs[_0x6d7c('0x1a')](_0x6cfa7b[_0x6d7c('0x2d')][_0x6d7c('0x1a')]);_0x58a34a[_0x6d7c('0x19')]=qs['offset'](_0x6cfa7b[_0x6d7c('0x2d')][_0x6d7c('0x19')]);}_0x58a34a['order']=qs[_0x6d7c('0x32')](_0x6cfa7b[_0x6d7c('0x2d')][_0x6d7c('0x32')]);_0x58a34a['where']=qs[_0x6d7c('0x2f')](_[_0x6d7c('0x33')](_0x6cfa7b[_0x6d7c('0x2d')],_0x4929bc['filters']),_0x45a826);if(_0x6cfa7b[_0x6d7c('0x2d')][_0x6d7c('0x34')]){_0x58a34a[_0x6d7c('0x35')]=_[_0x6d7c('0x36')](_0x58a34a[_0x6d7c('0x35')],{'$or':_[_0x6d7c('0x26')](_0x45a826,function(_0x46215a){if(_0x46215a[_0x6d7c('0x2a')]!==_0x6d7c('0x37')){var _0x25ad1b={};_0x25ad1b[_0x46215a[_0x6d7c('0x23')]]={'$like':'%'+_0x6cfa7b[_0x6d7c('0x2d')][_0x6d7c('0x34')]+'%'};return _0x25ad1b;}})});}_0x58a34a=_[_0x6d7c('0x36')]({},_0x58a34a,_0x6cfa7b[_0x6d7c('0x38')]);var _0x4c4569={'where':_0x58a34a['where']};return db[_0x6d7c('0x27')][_0x6d7c('0x39')](_0x4c4569)[_0x6d7c('0x1f')](function(_0x556743){_0x57ce94['count']=_0x556743;if(_0x6cfa7b[_0x6d7c('0x2d')]['includeAll']){_0x58a34a['include']=[{'all':!![]}];}return db[_0x6d7c('0x27')]['findAll'](_0x58a34a);})[_0x6d7c('0x1f')](function(_0x37dd29){_0x57ce94[_0x6d7c('0x3a')]=_0x37dd29;return _0x57ce94;})[_0x6d7c('0x1f')](respondWithFilteredResult(_0x21a3c4,_0x58a34a))[_0x6d7c('0x3b')](handleError(_0x21a3c4,null));};exports[_0x6d7c('0x3c')]=function(_0x55d130,_0x4187bd){var _0x5a061c={'raw':!![],'where':{'id':_0x55d130['params']['id']}},_0x5de871={};_0x5de871['model']=_[_0x6d7c('0x2e')](db[_0x6d7c('0x27')][_0x6d7c('0x28')]);_0x5de871[_0x6d7c('0x2d')]=_[_0x6d7c('0x2e')](_0x55d130['query']);_0x5de871[_0x6d7c('0x2f')]=_[_0x6d7c('0x30')](_0x5de871['model'],_0x5de871[_0x6d7c('0x2d')]);_0x5a061c[_0x6d7c('0x31')]=_[_0x6d7c('0x30')](_0x5de871[_0x6d7c('0x2c')],qs[_0x6d7c('0x3d')](_0x55d130['query'][_0x6d7c('0x3d')]));_0x5a061c['attributes']=_0x5a061c[_0x6d7c('0x31')][_0x6d7c('0x3e')]?_0x5a061c[_0x6d7c('0x31')]:_0x5de871[_0x6d7c('0x2c')];if(_0x55d130['query']['includeAll']){_0x5a061c['include']=[{'all':!![]}];}_0x5a061c=_[_0x6d7c('0x36')]({},_0x5a061c,_0x55d130['options']);return db['WhatsappApplication'][_0x6d7c('0x3f')](_0x5a061c)['then'](handleEntityNotFound(_0x4187bd,null))[_0x6d7c('0x1f')](respondWithResult(_0x4187bd,null))[_0x6d7c('0x3b')](handleError(_0x4187bd,null));};exports['create']=function(_0x1d25ff,_0xf28373){return db[_0x6d7c('0x27')][_0x6d7c('0x40')](_0x1d25ff[_0x6d7c('0x41')],{})['then'](respondWithResult(_0xf28373,0xc9))[_0x6d7c('0x3b')](handleError(_0xf28373,null));};exports[_0x6d7c('0x1e')]=function(_0x546dc6,_0x3ec48b){if(_0x546dc6[_0x6d7c('0x41')]['id']){delete _0x546dc6[_0x6d7c('0x41')]['id'];}return db['WhatsappApplication'][_0x6d7c('0x3f')]({'where':{'id':_0x546dc6[_0x6d7c('0x42')]['id']}})[_0x6d7c('0x1f')](handleEntityNotFound(_0x3ec48b,null))['then'](saveUpdates(_0x546dc6[_0x6d7c('0x41')],null))[_0x6d7c('0x1f')](respondWithResult(_0x3ec48b,null))[_0x6d7c('0x3b')](handleError(_0x3ec48b,null));};exports[_0x6d7c('0x20')]=function(_0x96e464,_0x5da5e7){return db[_0x6d7c('0x27')][_0x6d7c('0x3f')]({'where':{'id':_0x96e464[_0x6d7c('0x42')]['id']}})['then'](handleEntityNotFound(_0x5da5e7,null))['then'](removeEntity(_0x5da5e7,null))[_0x6d7c('0x3b')](handleError(_0x5da5e7,null));};
\ No newline at end of file
+var _0x62cf=['desk.js','querystring','papaparse','ioredis','../../components/auth/service','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/license/hardware','../../config/logger','api','../../config/utils','../../config/environment','../../mysqldb','sendStatus','end','json','undefined','limit','count','offset','status','apply','update','then','destroy','stack','name','send','map','WhatsappApplication','rawAttributes','type','key','query','keys','intersection','model','attributes','fields','length','hasOwnProperty','nolimit','order','sort','where','filters','pick','filter','merge','VIRTUAL','includeAll','include','rows','catch','params','create','body','find','eml-format','zip-dir','request-promise','moment','util','path','sox','to-csv','ejs','fs-extra','lodash','squel','crypto'];(function(_0x4c64b3,_0x3c234b){var _0x5e5a5e=function(_0x228c87){while(--_0x228c87){_0x4c64b3['push'](_0x4c64b3['shift']());}};_0x5e5a5e(++_0x3c234b);}(_0x62cf,0x81));var _0xf62c=function(_0x46a201,_0x340824){_0x46a201=_0x46a201-0x0;var _0x5a7937=_0x62cf[_0x46a201];return _0x5a7937;};'use strict';var emlformat=require(_0xf62c('0x0'));var rimraf=require('rimraf');var zipdir=require(_0xf62c('0x1'));var jsonpatch=require('fast-json-patch');var rp=require(_0xf62c('0x2'));var moment=require(_0xf62c('0x3'));var BPromise=require('bluebird');var Mustache=require('mustache');var util=require(_0xf62c('0x4'));var path=require(_0xf62c('0x5'));var sox=require(_0xf62c('0x6'));var csv=require(_0xf62c('0x7'));var ejs=require(_0xf62c('0x8'));var fs=require('fs');var fs_extra=require(_0xf62c('0x9'));var _=require(_0xf62c('0xa'));var squel=require(_0xf62c('0xb'));var crypto=require(_0xf62c('0xc'));var jsforce=require('jsforce');var deskjs=require(_0xf62c('0xd'));var toCsv=require('to-csv');var querystring=require(_0xf62c('0xe'));var Papa=require(_0xf62c('0xf'));var Redis=require(_0xf62c('0x10'));var authService=require(_0xf62c('0x11'));var qs=require(_0xf62c('0x12'));var as=require(_0xf62c('0x13'));var hardwareService=require(_0xf62c('0x14'));var logger=require(_0xf62c('0x15'))(_0xf62c('0x16'));var utils=require(_0xf62c('0x17'));var config=require(_0xf62c('0x18'));var licenseUtil=require('../../config/license/util');var db=require(_0xf62c('0x19'))['db'];function respondWithStatusCode(_0x5c07d3,_0x4ead27){_0x4ead27=_0x4ead27||0xcc;return function(_0x5a62bd){if(_0x5a62bd){return _0x5c07d3[_0xf62c('0x1a')](_0x4ead27);}return _0x5c07d3['status'](_0x4ead27)[_0xf62c('0x1b')]();};}function respondWithResult(_0xc52899,_0x4983d3){_0x4983d3=_0x4983d3||0xc8;return function(_0x1c47fa){if(_0x1c47fa){return _0xc52899['status'](_0x4983d3)[_0xf62c('0x1c')](_0x1c47fa);}};}function respondWithFilteredResult(_0x3f123d,_0x5a4ca9){return function(_0x3c748a){if(_0x3c748a){var _0x3ffb03=typeof _0x5a4ca9['offset']===_0xf62c('0x1d')&&typeof _0x5a4ca9[_0xf62c('0x1e')]===_0xf62c('0x1d');var _0x5c087b=_0x3c748a[_0xf62c('0x1f')];var _0xc7da63=_0x3ffb03?0x0:_0x5a4ca9[_0xf62c('0x20')];var _0x329c3c=_0x3ffb03?_0x3c748a[_0xf62c('0x1f')]:_0x5a4ca9['offset']+_0x5a4ca9[_0xf62c('0x1e')];var _0xad689c;if(_0x329c3c>=_0x5c087b){_0x329c3c=_0x5c087b;_0xad689c=0xc8;}else{_0xad689c=0xce;}_0x3f123d[_0xf62c('0x21')](_0xad689c);return _0x3f123d['set']('Content-Range',_0xc7da63+'-'+_0x329c3c+'/'+_0x5c087b)[_0xf62c('0x1c')](_0x3c748a);}return null;};}function patchUpdates(_0x3c3624){return function(_0x279439){try{jsonpatch[_0xf62c('0x22')](_0x279439,_0x3c3624,!![]);}catch(_0x23bf2b){return BPromise['reject'](_0x23bf2b);}return _0x279439['save']();};}function saveUpdates(_0x5dc7ec,_0x11fda3){return function(_0x1c883c){if(_0x1c883c){return _0x1c883c[_0xf62c('0x23')](_0x5dc7ec)[_0xf62c('0x24')](function(_0x34bf70){return _0x34bf70;});}return null;};}function removeEntity(_0x2f5670,_0x5c048f){return function(_0x33b572){if(_0x33b572){return _0x33b572[_0xf62c('0x25')]()[_0xf62c('0x24')](function(){_0x2f5670['status'](0xcc)['end']();});}};}function handleEntityNotFound(_0x48541f,_0x496992){return function(_0x2165ae){if(!_0x2165ae){_0x48541f['sendStatus'](0x194);}return _0x2165ae;};}function handleError(_0x44979b,_0x4973a8){_0x4973a8=_0x4973a8||0x1f4;return function(_0x2e2e54){logger['error'](_0x2e2e54[_0xf62c('0x26')]);if(_0x2e2e54[_0xf62c('0x27')]){delete _0x2e2e54[_0xf62c('0x27')];}_0x44979b[_0xf62c('0x21')](_0x4973a8)[_0xf62c('0x28')](_0x2e2e54);};}exports['index']=function(_0x1ecd60,_0x1d441a){var _0x269222={},_0x358036={},_0x9dde25={'count':0x0,'rows':[]};var _0x20fdff=_[_0xf62c('0x29')](db[_0xf62c('0x2a')][_0xf62c('0x2b')],function(_0x1862eb){return{'name':_0x1862eb['fieldName'],'type':_0x1862eb[_0xf62c('0x2c')][_0xf62c('0x2d')]};});_0x358036['model']=_[_0xf62c('0x29')](_0x20fdff,'name');_0x358036[_0xf62c('0x2e')]=_[_0xf62c('0x2f')](_0x1ecd60['query']);_0x358036['filters']=_[_0xf62c('0x30')](_0x358036[_0xf62c('0x31')],_0x358036['query']);_0x269222[_0xf62c('0x32')]=_['intersection'](_0x358036[_0xf62c('0x31')],qs[_0xf62c('0x33')](_0x1ecd60[_0xf62c('0x2e')][_0xf62c('0x33')]));_0x269222['attributes']=_0x269222['attributes'][_0xf62c('0x34')]?_0x269222['attributes']:_0x358036[_0xf62c('0x31')];if(!_0x1ecd60['query'][_0xf62c('0x35')](_0xf62c('0x36'))){_0x269222[_0xf62c('0x1e')]=qs[_0xf62c('0x1e')](_0x1ecd60['query'][_0xf62c('0x1e')]);_0x269222[_0xf62c('0x20')]=qs[_0xf62c('0x20')](_0x1ecd60[_0xf62c('0x2e')]['offset']);}_0x269222[_0xf62c('0x37')]=qs[_0xf62c('0x38')](_0x1ecd60['query'][_0xf62c('0x38')]);_0x269222[_0xf62c('0x39')]=qs[_0xf62c('0x3a')](_[_0xf62c('0x3b')](_0x1ecd60[_0xf62c('0x2e')],_0x358036[_0xf62c('0x3a')]),_0x20fdff);if(_0x1ecd60[_0xf62c('0x2e')][_0xf62c('0x3c')]){_0x269222[_0xf62c('0x39')]=_[_0xf62c('0x3d')](_0x269222[_0xf62c('0x39')],{'$or':_[_0xf62c('0x29')](_0x20fdff,function(_0x409e0d){if(_0x409e0d[_0xf62c('0x2c')]!==_0xf62c('0x3e')){var _0xc7e21c={};_0xc7e21c[_0x409e0d[_0xf62c('0x27')]]={'$like':'%'+_0x1ecd60[_0xf62c('0x2e')][_0xf62c('0x3c')]+'%'};return _0xc7e21c;}})});}_0x269222=_[_0xf62c('0x3d')]({},_0x269222,_0x1ecd60['options']);var _0x117984={'where':_0x269222[_0xf62c('0x39')]};return db[_0xf62c('0x2a')][_0xf62c('0x1f')](_0x117984)['then'](function(_0x244d12){_0x9dde25[_0xf62c('0x1f')]=_0x244d12;if(_0x1ecd60[_0xf62c('0x2e')][_0xf62c('0x3f')]){_0x269222[_0xf62c('0x40')]=[{'all':!![]}];}return db['WhatsappApplication']['findAll'](_0x269222);})[_0xf62c('0x24')](function(_0x588ad1){_0x9dde25[_0xf62c('0x41')]=_0x588ad1;return _0x9dde25;})[_0xf62c('0x24')](respondWithFilteredResult(_0x1d441a,_0x269222))[_0xf62c('0x42')](handleError(_0x1d441a,null));};exports['show']=function(_0x22f082,_0x35931b){var _0x27218d={'raw':!![],'where':{'id':_0x22f082[_0xf62c('0x43')]['id']}},_0x3a550c={};_0x3a550c[_0xf62c('0x31')]=_['keys'](db[_0xf62c('0x2a')]['rawAttributes']);_0x3a550c[_0xf62c('0x2e')]=_[_0xf62c('0x2f')](_0x22f082[_0xf62c('0x2e')]);_0x3a550c[_0xf62c('0x3a')]=_[_0xf62c('0x30')](_0x3a550c[_0xf62c('0x31')],_0x3a550c[_0xf62c('0x2e')]);_0x27218d[_0xf62c('0x32')]=_[_0xf62c('0x30')](_0x3a550c['model'],qs[_0xf62c('0x33')](_0x22f082[_0xf62c('0x2e')]['fields']));_0x27218d['attributes']=_0x27218d[_0xf62c('0x32')]['length']?_0x27218d[_0xf62c('0x32')]:_0x3a550c[_0xf62c('0x31')];if(_0x22f082['query'][_0xf62c('0x3f')]){_0x27218d['include']=[{'all':!![]}];}_0x27218d=_[_0xf62c('0x3d')]({},_0x27218d,_0x22f082['options']);return db[_0xf62c('0x2a')]['find'](_0x27218d)[_0xf62c('0x24')](handleEntityNotFound(_0x35931b,null))[_0xf62c('0x24')](respondWithResult(_0x35931b,null))[_0xf62c('0x42')](handleError(_0x35931b,null));};exports[_0xf62c('0x44')]=function(_0x535b2d,_0x390155){return db[_0xf62c('0x2a')][_0xf62c('0x44')](_0x535b2d[_0xf62c('0x45')],{})[_0xf62c('0x24')](respondWithResult(_0x390155,0xc9))['catch'](handleError(_0x390155,null));};exports[_0xf62c('0x23')]=function(_0x2d8e15,_0x41efdf){if(_0x2d8e15[_0xf62c('0x45')]['id']){delete _0x2d8e15[_0xf62c('0x45')]['id'];}return db[_0xf62c('0x2a')][_0xf62c('0x46')]({'where':{'id':_0x2d8e15[_0xf62c('0x43')]['id']}})['then'](handleEntityNotFound(_0x41efdf,null))[_0xf62c('0x24')](saveUpdates(_0x2d8e15[_0xf62c('0x45')],null))['then'](respondWithResult(_0x41efdf,null))[_0xf62c('0x42')](handleError(_0x41efdf,null));};exports['destroy']=function(_0x484a40,_0x3aa103){return db[_0xf62c('0x2a')]['find']({'where':{'id':_0x484a40[_0xf62c('0x43')]['id']}})['then'](handleEntityNotFound(_0x3aa103,null))[_0xf62c('0x24')](removeEntity(_0x3aa103,null))[_0xf62c('0x42')](handleError(_0x3aa103,null));};
\ No newline at end of file