#include <fstream> 
#include <optional> 
#include <sstream> 
#include <string> 
#include <vector> 
 
#include "/Users/me/Applications/fmt/include/fmt/core.h" 
 
 
constexpr std:: size_t  minfields{ 33 } ; 
 
std:: optional < std:: vector < std:: string >>  splitStr( const  std:: string  & line,
                                                 const  char  delimiter =  ',' ) 
{ 
  std:: vector < std:: string >  splitLine; 
  splitLine.reserve ( minfields) ; 
  std:: istringstream  ss( line) ; 
  std:: string  buf; 
  unsigned  field{ 0 } ; 
  while  ( std:: getline ( ss, buf, delimiter) )  { 
    splitLine.push_back ( buf) ; 
    if  ( field ==  3  &&  buf[ 0 ]  ! =  'E'  &&  buf[ 0 ]  ! =  'T' )  { 
      return  std:: nullopt ; 
    } 
    ++ field; 
  } 
  if  ( splitLine.size ( )  <  minfields) 
    return  std:: nullopt ; 
  return  splitLine; 
} 
 
void  copy_selective( std:: istream  & in, FILE  * out) 
{ 
  std:: string  line; 
  while  ( std:: getline ( in, line) )  { 
    auto  split =  splitStr( line, ';' ) ; 
    if  ( split)  { 
      const  std:: vector < std:: string >  & vec =  split.value ( ) ; 
      fmt:: print ( out,
                 "{},{},{},{},{},{},{},{},{},{},{}\n " ,
                 vec[ 0 ] ,
                 vec[ 1 ] ,
                 vec[ 3 ] ,
                 vec[ 4 ] ,
                 vec[ 5 ] ,
                 vec[ 6 ] ,
                 vec[ 10 ] ,
                 vec[ 9 ] ,
                 vec[ 11 ] ,
                 vec[ 7 ] ,
                 vec[ 32 ] ) ; 
    } 
  } 
} 
 
int  main( int  argc, char  * argv[ ] ) 
{ 
  if  ( argc >=  3 )  { 
    std:: ifstream  inFile( argv[ 1 ] ) ; 
    FILE  * outFile{ fopen ( argv[ 2 ] , "w" ) } ; 
    copy_selective( inFile, outFile) ; 
  } 
} 
 
I2luY2x1ZGUgPGZzdHJlYW0+CiNpbmNsdWRlIDxvcHRpb25hbD4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx2ZWN0b3I+CgojaW5jbHVkZSAiL1VzZXJzL21lL0FwcGxpY2F0aW9ucy9mbXQvaW5jbHVkZS9mbXQvY29yZS5oIgoKCmNvbnN0ZXhwciBzdGQ6OnNpemVfdCBtaW5maWVsZHN7MzN9OwoKc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+IHNwbGl0U3RyKGNvbnN0IHN0ZDo6c3RyaW5nICZsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBkZWxpbWl0ZXIgPSAnLCcpCnsKICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3BsaXRMaW5lOwogIHNwbGl0TGluZS5yZXNlcnZlKG1pbmZpZWxkcyk7CiAgc3RkOjppc3RyaW5nc3RyZWFtIHNzKGxpbmUpOwogIHN0ZDo6c3RyaW5nIGJ1ZjsKICB1bnNpZ25lZCBmaWVsZHswfTsKICB3aGlsZSAoc3RkOjpnZXRsaW5lKHNzLCBidWYsIGRlbGltaXRlcikpIHsKICAgIHNwbGl0TGluZS5wdXNoX2JhY2soYnVmKTsKICAgIGlmIChmaWVsZCA9PSAzICYmIGJ1ZlswXSAhPSAnRScgJiYgYnVmWzBdICE9ICdUJykgewogICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwogICAgfQogICAgKytmaWVsZDsKICB9CiAgaWYgKHNwbGl0TGluZS5zaXplKCkgPCBtaW5maWVsZHMpCiAgICByZXR1cm4gc3RkOjpudWxsb3B0OwogIHJldHVybiBzcGxpdExpbmU7Cn0KCnZvaWQgY29weV9zZWxlY3RpdmUoc3RkOjppc3RyZWFtICZpbiwgRklMRSAqb3V0KQp7CiAgc3RkOjpzdHJpbmcgbGluZTsKICB3aGlsZSAoc3RkOjpnZXRsaW5lKGluLCBsaW5lKSkgewogICAgYXV0byBzcGxpdCA9IHNwbGl0U3RyKGxpbmUsICc7Jyk7CiAgICBpZiAoc3BsaXQpIHsKICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZ2ZWMgPSBzcGxpdC52YWx1ZSgpOwogICAgICBmbXQ6OnByaW50KG91dCwKICAgICAgICAgICAgICAgICAie30se30se30se30se30se30se30se30se30se30se31cbiIsCiAgICAgICAgICAgICAgICAgdmVjWzBdLAogICAgICAgICAgICAgICAgIHZlY1sxXSwKICAgICAgICAgICAgICAgICB2ZWNbM10sCiAgICAgICAgICAgICAgICAgdmVjWzRdLAogICAgICAgICAgICAgICAgIHZlY1s1XSwKICAgICAgICAgICAgICAgICB2ZWNbNl0sCiAgICAgICAgICAgICAgICAgdmVjWzEwXSwKICAgICAgICAgICAgICAgICB2ZWNbOV0sCiAgICAgICAgICAgICAgICAgdmVjWzExXSwKICAgICAgICAgICAgICAgICB2ZWNbN10sCiAgICAgICAgICAgICAgICAgdmVjWzMyXSk7CiAgICB9CiAgfQp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CiAgaWYgKGFyZ2MgPj0gMykgewogICAgc3RkOjppZnN0cmVhbSBpbkZpbGUoYXJndlsxXSk7CiAgICBGSUxFICpvdXRGaWxle2ZvcGVuKGFyZ3ZbMl0sICJ3Iil9OwogICAgY29weV9zZWxlY3RpdmUoaW5GaWxlLCBvdXRGaWxlKTsKICB9Cn0K