//********************************************************
//
// Assignment 7 - Structures and Strings
//
// Name: Seth Hin
//
// Class: C Programming, Spring 2026
//
// Date: March 29, 2026
//
// Description: Program which determines overtime, gross pay,
// state tax, federal tax, and net pay for a set of employees.
// It also calculates totals, averages, minimum, and maximum
// values for all floating point employee data.
//
//********************************************************
#include <stdio.h>
#include <string.h>
#include <ctype.h>
//---------------- CONSTANTS ----------------//
#define SIZE 5
#define STD_HOURS 40.0
#define OT_RATE 1.5
#define MA_TAX_RATE 0.05
#define NH_TAX_RATE 0.0
#define VT_TAX_RATE 0.06
#define CA_TAX_RATE 0.07
#define DEFAULT_TAX_RATE 0.08
#define TAX_STATE_SIZE 3
#define FED_TAX_RATE 0.25
#define FIRST_NAME_SIZE 10
#define LAST_NAME_SIZE 10
//---------------- STRUCTURES ----------------//
struct name
{
char firstName[ FIRST_NAME_SIZE] ;
char lastName[ LAST_NAME_SIZE] ;
} ;
struct employee
{
struct name empName;
char taxState[ TAX_STATE_SIZE] ;
long int clockNumber;
float wageRate;
float hours;
float overtimeHrs;
float grossPay;
float stateTax;
float fedTax;
float netPay;
} ;
struct totals
{
float total_wageRate;
float total_hours;
float total_overtimeHrs;
float total_grossPay;
float total_stateTax;
float total_fedTax;
float total_netPay;
} ;
struct min_max
{
float min_wageRate, min_hours, min_overtimeHrs, min_grossPay, min_stateTax, min_fedTax, min_netPay;
float max_wageRate, max_hours, max_overtimeHrs, max_grossPay, max_stateTax, max_fedTax, max_netPay;
} ;
//---------------- FUNCTION PROTOTYPES ----------------//
void getHours( struct employee *, int ) ;
void calcOvertimeHrs( struct employee *, int ) ;
void calcGrossPay( struct employee *, int ) ;
void calcStateTax( struct employee *, int ) ;
void calcFedTax( struct employee *, int ) ;
void calcNetPay( struct employee *, int ) ;
void printHeader( void ) ;
void printEmp( struct employee *, int ) ;
void calcEmployeeTotals( struct employee *, struct totals *, int ) ;
void calcEmployeeMinMax( struct employee *, struct min_max *, int ) ;
void printEmpStatistics( struct totals *, struct min_max *, int ) ;
//---------------- MAIN ----------------//
int main( )
{
struct employee employeeData[ SIZE] = {
{ { "Connie" , "Cobol" } , "MA" , 98401 , 10.60 } ,
{ { "Mary" , "Apl" } , "NH" , 526488 , 9.75 } ,
{ { "Frank" , "Fortran" } , "VT" , 765349 , 10.50 } ,
{ { "Jeff" , "Ada" } , "NY" , 34645 , 12.25 } ,
{ { "Anton" , "Pascal" } , "CA" , 127615 , 8.35 }
} ;
struct employee * emp_ptr = employeeData;
struct totals employeeTotals = { 0 } ;
struct totals * emp_totals_ptr = & employeeTotals;
struct min_max employeeMinMax = { 0 } ;
struct min_max * emp_minMax_ptr = & employeeMinMax;
getHours( emp_ptr, SIZE) ;
calcOvertimeHrs( emp_ptr, SIZE) ;
calcGrossPay( emp_ptr, SIZE) ;
calcStateTax( emp_ptr, SIZE) ;
calcFedTax( emp_ptr, SIZE) ;
calcNetPay( emp_ptr, SIZE) ;
calcEmployeeTotals( emp_ptr, emp_totals_ptr, SIZE) ;
calcEmployeeMinMax( emp_ptr, emp_minMax_ptr, SIZE) ;
printHeader( ) ;
printEmp( emp_ptr, SIZE) ;
printEmpStatistics( emp_totals_ptr, emp_minMax_ptr, SIZE) ;
return 0 ;
}
//---------------- FUNCTIONS ----------------//
void getHours( struct employee * emp_ptr, int size)
{
for ( int i = 0 ; i < size; i++ )
{
printf ( "\n Enter hours worked by emp # %06li: " , ( emp_ptr
+ i
) -> clockNumber
) ; scanf ( "%f" , & ( emp_ptr
+ i
) -> hours
) ; }
}
void calcOvertimeHrs( struct employee * emp_ptr, int size)
{
for ( int i = 0 ; i < size; i++ )
{
if ( ( emp_ptr + i) -> hours > STD_HOURS)
( emp_ptr + i) -> overtimeHrs = ( emp_ptr + i) -> hours - STD_HOURS;
else
( emp_ptr + i) -> overtimeHrs = 0 ;
}
}
void calcGrossPay( struct employee * emp_ptr, int size)
{
for ( int i = 0 ; i < size; i++ )
{
float normal = ( ( emp_ptr + i) -> hours - ( emp_ptr + i) -> overtimeHrs) * ( emp_ptr + i) -> wageRate;
float overtime = ( emp_ptr + i) -> overtimeHrs * OT_RATE * ( emp_ptr + i) -> wageRate;
( emp_ptr + i) -> grossPay = normal + overtime;
}
}
void calcStateTax( struct employee * emp_ptr, int size)
{
for ( int i = 0 ; i < size; i++ )
{
if ( strcmp ( ( emp_ptr
+ i
) -> taxState
, "MA" ) == 0 ) ( emp_ptr + i) -> stateTax = ( emp_ptr + i) -> grossPay * MA_TAX_RATE;
else if ( strcmp ( ( emp_ptr
+ i
) -> taxState
, "NH" ) == 0 ) ( emp_ptr + i) -> stateTax = ( emp_ptr + i) -> grossPay * NH_TAX_RATE;
else if ( strcmp ( ( emp_ptr
+ i
) -> taxState
, "VT" ) == 0 ) ( emp_ptr + i) -> stateTax = ( emp_ptr + i) -> grossPay * VT_TAX_RATE;
else if ( strcmp ( ( emp_ptr
+ i
) -> taxState
, "CA" ) == 0 ) ( emp_ptr + i) -> stateTax = ( emp_ptr + i) -> grossPay * CA_TAX_RATE;
else
( emp_ptr + i) -> stateTax = ( emp_ptr + i) -> grossPay * DEFAULT_TAX_RATE;
}
}
void calcFedTax( struct employee * emp_ptr, int size)
{
for ( int i = 0 ; i < size; i++ )
{
( emp_ptr + i) -> fedTax = ( emp_ptr + i) -> grossPay * FED_TAX_RATE;
}
}
void calcNetPay( struct employee * emp_ptr, int size)
{
for ( int i = 0 ; i < size; i++ )
{
float totalTax = ( emp_ptr + i) -> stateTax + ( emp_ptr + i) -> fedTax;
( emp_ptr + i) -> netPay = ( emp_ptr + i) -> grossPay - totalTax;
}
}
void printHeader( void )
{
printf ( "\n \n *** Pay Calculator ***\n " ) ; printf ( "\n ---------------------------------------------------------------------------------" ) ; printf ( "\n Name Tax Clock# Wage Hours OT Gross State Fed Net" ) ; printf ( "\n State Pay Tax Tax Pay" ) ; printf ( "\n ---------------------------------------------------------------------------------" ) ; }
void printEmp( struct employee * emp_ptr, int size)
{
char name[ 25 ] ;
for ( int i = 0 ; i < size; i++ )
{
strcpy ( name
, ( emp_ptr
+ i
) -> empName.
firstName ) ; strcat ( name
, ( emp_ptr
+ i
) -> empName.
lastName ) ;
printf ( "\n %-20s %-2s %06li %6.2f %6.1f %5.1f %7.2f %6.2f %7.2f %8.2f" , name,
( emp_ptr + i) -> taxState,
( emp_ptr + i) -> clockNumber,
( emp_ptr + i) -> wageRate,
( emp_ptr + i) -> hours,
( emp_ptr + i) -> overtimeHrs,
( emp_ptr + i) -> grossPay,
( emp_ptr + i) -> stateTax,
( emp_ptr + i) -> fedTax,
( emp_ptr + i) -> netPay) ;
}
}
void calcEmployeeTotals( struct employee * emp_ptr, struct totals * tot_ptr, int size)
{
for ( int i = 0 ; i < size; i++ )
{
tot_ptr-> total_wageRate += ( emp_ptr + i) -> wageRate;
tot_ptr-> total_hours += ( emp_ptr + i) -> hours;
tot_ptr-> total_overtimeHrs += ( emp_ptr + i) -> overtimeHrs;
tot_ptr-> total_grossPay += ( emp_ptr + i) -> grossPay;
tot_ptr-> total_stateTax += ( emp_ptr + i) -> stateTax;
tot_ptr-> total_fedTax += ( emp_ptr + i) -> fedTax;
tot_ptr-> total_netPay += ( emp_ptr + i) -> netPay;
}
}
void calcEmployeeMinMax( struct employee * emp_ptr, struct min_max * minmax_ptr, int size)
{
minmax_ptr-> min_wageRate = minmax_ptr-> max_wageRate = ( emp_ptr + 0 ) -> wageRate;
minmax_ptr-> min_hours = minmax_ptr-> max_hours = ( emp_ptr + 0 ) -> hours;
minmax_ptr-> min_overtimeHrs = minmax_ptr-> max_overtimeHrs = ( emp_ptr + 0 ) -> overtimeHrs;
minmax_ptr-> min_grossPay = minmax_ptr-> max_grossPay = ( emp_ptr + 0 ) -> grossPay;
minmax_ptr-> min_stateTax = minmax_ptr-> max_stateTax = ( emp_ptr + 0 ) -> stateTax;
minmax_ptr-> min_fedTax = minmax_ptr-> max_fedTax = ( emp_ptr + 0 ) -> fedTax;
minmax_ptr-> min_netPay = minmax_ptr-> max_netPay = ( emp_ptr + 0 ) -> netPay;
for ( int i = 1 ; i < size; i++ )
{
if ( ( emp_ptr + i) -> hours < minmax_ptr-> min_hours)
minmax_ptr-> min_hours = ( emp_ptr + i) -> hours;
if ( ( emp_ptr + i) -> hours > minmax_ptr-> max_hours)
minmax_ptr-> max_hours = ( emp_ptr + i) -> hours;
}
}
void printEmpStatistics( struct totals * tot_ptr,
struct min_max * minmax_ptr,
int size)
{
printf ( "\n ---------------------------------------------------------------------------------" ) ;
printf ( "\n Totals: %5.2f %5.1f %5.1f %7.2f %6.2f %7.2f %8.2f" , tot_ptr-> total_wageRate,
tot_ptr-> total_hours,
tot_ptr-> total_overtimeHrs,
tot_ptr-> total_grossPay,
tot_ptr-> total_stateTax,
tot_ptr-> total_fedTax,
tot_ptr-> total_netPay) ;
printf ( "\n Averages: %5.2f %5.1f %5.1f %7.2f %6.2f %7.2f %8.2f" , tot_ptr-> total_wageRate / size,
tot_ptr-> total_hours / size,
tot_ptr-> total_overtimeHrs / size,
tot_ptr-> total_grossPay / size,
tot_ptr-> total_stateTax / size,
tot_ptr-> total_fedTax / size,
tot_ptr-> total_netPay / size) ;
}
Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLwovLyBBc3NpZ25tZW50IDcgLSBTdHJ1Y3R1cmVzIGFuZCBTdHJpbmdzCi8vCi8vIE5hbWU6IFNldGggSGluCi8vCi8vIENsYXNzOiBDIFByb2dyYW1taW5nLCBTcHJpbmcgMjAyNgovLwovLyBEYXRlOiBNYXJjaCAyOSwgMjAyNgovLwovLyBEZXNjcmlwdGlvbjogUHJvZ3JhbSB3aGljaCBkZXRlcm1pbmVzIG92ZXJ0aW1lLCBncm9zcyBwYXksCi8vIHN0YXRlIHRheCwgZmVkZXJhbCB0YXgsIGFuZCBuZXQgcGF5IGZvciBhIHNldCBvZiBlbXBsb3llZXMuCi8vIEl0IGFsc28gY2FsY3VsYXRlcyB0b3RhbHMsIGF2ZXJhZ2VzLCBtaW5pbXVtLCBhbmQgbWF4aW11bQovLyB2YWx1ZXMgZm9yIGFsbCBmbG9hdGluZyBwb2ludCBlbXBsb3llZSBkYXRhLgovLwovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KCi8vLS0tLS0tLS0tLS0tLS0tLSBDT05TVEFOVFMgLS0tLS0tLS0tLS0tLS0tLS8vCiNkZWZpbmUgU0laRSA1CiNkZWZpbmUgU1REX0hPVVJTIDQwLjAKI2RlZmluZSBPVF9SQVRFIDEuNQojZGVmaW5lIE1BX1RBWF9SQVRFIDAuMDUKI2RlZmluZSBOSF9UQVhfUkFURSAwLjAKI2RlZmluZSBWVF9UQVhfUkFURSAwLjA2CiNkZWZpbmUgQ0FfVEFYX1JBVEUgMC4wNwojZGVmaW5lIERFRkFVTFRfVEFYX1JBVEUgMC4wOAojZGVmaW5lIFRBWF9TVEFURV9TSVpFIDMKI2RlZmluZSBGRURfVEFYX1JBVEUgMC4yNQojZGVmaW5lIEZJUlNUX05BTUVfU0laRSAxMAojZGVmaW5lIExBU1RfTkFNRV9TSVpFIDEwCgovLy0tLS0tLS0tLS0tLS0tLS0gU1RSVUNUVVJFUyAtLS0tLS0tLS0tLS0tLS0tLy8Kc3RydWN0IG5hbWUKewogICAgY2hhciBmaXJzdE5hbWVbRklSU1RfTkFNRV9TSVpFXTsKICAgIGNoYXIgbGFzdE5hbWVbTEFTVF9OQU1FX1NJWkVdOwp9OwoKc3RydWN0IGVtcGxveWVlCnsKICAgIHN0cnVjdCBuYW1lIGVtcE5hbWU7CiAgICBjaGFyIHRheFN0YXRlW1RBWF9TVEFURV9TSVpFXTsKICAgIGxvbmcgaW50IGNsb2NrTnVtYmVyOwogICAgZmxvYXQgd2FnZVJhdGU7CiAgICBmbG9hdCBob3VyczsKICAgIGZsb2F0IG92ZXJ0aW1lSHJzOwogICAgZmxvYXQgZ3Jvc3NQYXk7CiAgICBmbG9hdCBzdGF0ZVRheDsKICAgIGZsb2F0IGZlZFRheDsKICAgIGZsb2F0IG5ldFBheTsKfTsKCnN0cnVjdCB0b3RhbHMKewogICAgZmxvYXQgdG90YWxfd2FnZVJhdGU7CiAgICBmbG9hdCB0b3RhbF9ob3VyczsKICAgIGZsb2F0IHRvdGFsX292ZXJ0aW1lSHJzOwogICAgZmxvYXQgdG90YWxfZ3Jvc3NQYXk7CiAgICBmbG9hdCB0b3RhbF9zdGF0ZVRheDsKICAgIGZsb2F0IHRvdGFsX2ZlZFRheDsKICAgIGZsb2F0IHRvdGFsX25ldFBheTsKfTsKCnN0cnVjdCBtaW5fbWF4CnsKICAgIGZsb2F0IG1pbl93YWdlUmF0ZSwgbWluX2hvdXJzLCBtaW5fb3ZlcnRpbWVIcnMsIG1pbl9ncm9zc1BheSwgbWluX3N0YXRlVGF4LCBtaW5fZmVkVGF4LCBtaW5fbmV0UGF5OwogICAgZmxvYXQgbWF4X3dhZ2VSYXRlLCBtYXhfaG91cnMsIG1heF9vdmVydGltZUhycywgbWF4X2dyb3NzUGF5LCBtYXhfc3RhdGVUYXgsIG1heF9mZWRUYXgsIG1heF9uZXRQYXk7Cn07CgovLy0tLS0tLS0tLS0tLS0tLS0gRlVOQ1RJT04gUFJPVE9UWVBFUyAtLS0tLS0tLS0tLS0tLS0tLy8Kdm9pZCBnZXRIb3VycyhzdHJ1Y3QgZW1wbG95ZWUgKiwgaW50KTsKdm9pZCBjYWxjT3ZlcnRpbWVIcnMoc3RydWN0IGVtcGxveWVlICosIGludCk7CnZvaWQgY2FsY0dyb3NzUGF5KHN0cnVjdCBlbXBsb3llZSAqLCBpbnQpOwp2b2lkIGNhbGNTdGF0ZVRheChzdHJ1Y3QgZW1wbG95ZWUgKiwgaW50KTsKdm9pZCBjYWxjRmVkVGF4KHN0cnVjdCBlbXBsb3llZSAqLCBpbnQpOwp2b2lkIGNhbGNOZXRQYXkoc3RydWN0IGVtcGxveWVlICosIGludCk7CnZvaWQgcHJpbnRIZWFkZXIodm9pZCk7CnZvaWQgcHJpbnRFbXAoc3RydWN0IGVtcGxveWVlICosIGludCk7CnZvaWQgY2FsY0VtcGxveWVlVG90YWxzKHN0cnVjdCBlbXBsb3llZSAqLCBzdHJ1Y3QgdG90YWxzICosIGludCk7CnZvaWQgY2FsY0VtcGxveWVlTWluTWF4KHN0cnVjdCBlbXBsb3llZSAqLCBzdHJ1Y3QgbWluX21heCAqLCBpbnQpOwp2b2lkIHByaW50RW1wU3RhdGlzdGljcyhzdHJ1Y3QgdG90YWxzICosIHN0cnVjdCBtaW5fbWF4ICosIGludCk7CgovLy0tLS0tLS0tLS0tLS0tLS0gTUFJTiAtLS0tLS0tLS0tLS0tLS0tLy8KaW50IG1haW4oKQp7CiAgICBzdHJ1Y3QgZW1wbG95ZWUgZW1wbG95ZWVEYXRhW1NJWkVdID0gewogICAgICAgIHsgeyJDb25uaWUiLCAiQ29ib2wifSwgIk1BIiwgOTg0MDEsIDEwLjYwfSwKICAgICAgICB7IHsiTWFyeSIsICJBcGwifSwgIk5IIiwgNTI2NDg4LCA5Ljc1IH0sCiAgICAgICAgeyB7IkZyYW5rIiwgIkZvcnRyYW4ifSwgIlZUIiwgNzY1MzQ5LCAxMC41MCB9LAogICAgICAgIHsgeyJKZWZmIiwgIkFkYSJ9LCAiTlkiLCAzNDY0NSwgMTIuMjUgfSwKICAgICAgICB7IHsiQW50b24iLCAiUGFzY2FsIn0sIkNBIiwxMjc2MTUsIDguMzUgfQogICAgfTsKCiAgICBzdHJ1Y3QgZW1wbG95ZWUgKmVtcF9wdHIgPSBlbXBsb3llZURhdGE7CgogICAgc3RydWN0IHRvdGFscyBlbXBsb3llZVRvdGFscyA9IHswfTsKICAgIHN0cnVjdCB0b3RhbHMgKmVtcF90b3RhbHNfcHRyID0gJmVtcGxveWVlVG90YWxzOwoKICAgIHN0cnVjdCBtaW5fbWF4IGVtcGxveWVlTWluTWF4ID0gezB9OwogICAgc3RydWN0IG1pbl9tYXggKmVtcF9taW5NYXhfcHRyID0gJmVtcGxveWVlTWluTWF4OwoKICAgIGdldEhvdXJzKGVtcF9wdHIsIFNJWkUpOwogICAgY2FsY092ZXJ0aW1lSHJzKGVtcF9wdHIsIFNJWkUpOwogICAgY2FsY0dyb3NzUGF5KGVtcF9wdHIsIFNJWkUpOwogICAgY2FsY1N0YXRlVGF4KGVtcF9wdHIsIFNJWkUpOwogICAgY2FsY0ZlZFRheChlbXBfcHRyLCBTSVpFKTsKICAgIGNhbGNOZXRQYXkoZW1wX3B0ciwgU0laRSk7CgogICAgY2FsY0VtcGxveWVlVG90YWxzKGVtcF9wdHIsIGVtcF90b3RhbHNfcHRyLCBTSVpFKTsKICAgIGNhbGNFbXBsb3llZU1pbk1heChlbXBfcHRyLCBlbXBfbWluTWF4X3B0ciwgU0laRSk7CgogICAgcHJpbnRIZWFkZXIoKTsKICAgIHByaW50RW1wKGVtcF9wdHIsIFNJWkUpOwogICAgcHJpbnRFbXBTdGF0aXN0aWNzKGVtcF90b3RhbHNfcHRyLCBlbXBfbWluTWF4X3B0ciwgU0laRSk7CgogICAgcmV0dXJuIDA7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLSBGVU5DVElPTlMgLS0tLS0tLS0tLS0tLS0tLS8vCgp2b2lkIGdldEhvdXJzKHN0cnVjdCBlbXBsb3llZSAqZW1wX3B0ciwgaW50IHNpemUpCnsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgewogICAgICAgIHByaW50ZigiXG5FbnRlciBob3VycyB3b3JrZWQgYnkgZW1wICMgJTA2bGk6ICIsIChlbXBfcHRyICsgaSktPmNsb2NrTnVtYmVyKTsKICAgICAgICBzY2FuZigiJWYiLCAmKGVtcF9wdHIgKyBpKS0+aG91cnMpOwogICAgfQp9Cgp2b2lkIGNhbGNPdmVydGltZUhycyhzdHJ1Y3QgZW1wbG95ZWUgKmVtcF9wdHIsIGludCBzaXplKQp7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKICAgIHsKICAgICAgICBpZiAoKGVtcF9wdHIgKyBpKS0+aG91cnMgPiBTVERfSE9VUlMpCiAgICAgICAgICAgIChlbXBfcHRyICsgaSktPm92ZXJ0aW1lSHJzID0gKGVtcF9wdHIgKyBpKS0+aG91cnMgLSBTVERfSE9VUlM7CiAgICAgICAgZWxzZQogICAgICAgICAgICAoZW1wX3B0ciArIGkpLT5vdmVydGltZUhycyA9IDA7CiAgICB9Cn0KCnZvaWQgY2FsY0dyb3NzUGF5KHN0cnVjdCBlbXBsb3llZSAqZW1wX3B0ciwgaW50IHNpemUpCnsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgewogICAgICAgIGZsb2F0IG5vcm1hbCA9ICgoZW1wX3B0ciArIGkpLT5ob3VycyAtIChlbXBfcHRyICsgaSktPm92ZXJ0aW1lSHJzKSAqIChlbXBfcHRyICsgaSktPndhZ2VSYXRlOwogICAgICAgIGZsb2F0IG92ZXJ0aW1lID0gKGVtcF9wdHIgKyBpKS0+b3ZlcnRpbWVIcnMgKiBPVF9SQVRFICogKGVtcF9wdHIgKyBpKS0+d2FnZVJhdGU7CiAgICAgICAgKGVtcF9wdHIgKyBpKS0+Z3Jvc3NQYXkgPSBub3JtYWwgKyBvdmVydGltZTsKICAgIH0KfQoKdm9pZCBjYWxjU3RhdGVUYXgoc3RydWN0IGVtcGxveWVlICplbXBfcHRyLCBpbnQgc2l6ZSkKewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCiAgICB7CiAgICAgICAgaWYgKHN0cmNtcCgoZW1wX3B0ciArIGkpLT50YXhTdGF0ZSwgIk1BIikgPT0gMCkKICAgICAgICAgICAgKGVtcF9wdHIgKyBpKS0+c3RhdGVUYXggPSAoZW1wX3B0ciArIGkpLT5ncm9zc1BheSAqIE1BX1RBWF9SQVRFOwogICAgICAgIGVsc2UgaWYgKHN0cmNtcCgoZW1wX3B0ciArIGkpLT50YXhTdGF0ZSwgIk5IIikgPT0gMCkKICAgICAgICAgICAgKGVtcF9wdHIgKyBpKS0+c3RhdGVUYXggPSAoZW1wX3B0ciArIGkpLT5ncm9zc1BheSAqIE5IX1RBWF9SQVRFOwogICAgICAgIGVsc2UgaWYgKHN0cmNtcCgoZW1wX3B0ciArIGkpLT50YXhTdGF0ZSwgIlZUIikgPT0gMCkKICAgICAgICAgICAgKGVtcF9wdHIgKyBpKS0+c3RhdGVUYXggPSAoZW1wX3B0ciArIGkpLT5ncm9zc1BheSAqIFZUX1RBWF9SQVRFOwogICAgICAgIGVsc2UgaWYgKHN0cmNtcCgoZW1wX3B0ciArIGkpLT50YXhTdGF0ZSwgIkNBIikgPT0gMCkKICAgICAgICAgICAgKGVtcF9wdHIgKyBpKS0+c3RhdGVUYXggPSAoZW1wX3B0ciArIGkpLT5ncm9zc1BheSAqIENBX1RBWF9SQVRFOwogICAgICAgIGVsc2UKICAgICAgICAgICAgKGVtcF9wdHIgKyBpKS0+c3RhdGVUYXggPSAoZW1wX3B0ciArIGkpLT5ncm9zc1BheSAqIERFRkFVTFRfVEFYX1JBVEU7CiAgICB9Cn0KCnZvaWQgY2FsY0ZlZFRheChzdHJ1Y3QgZW1wbG95ZWUgKmVtcF9wdHIsIGludCBzaXplKQp7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKICAgIHsKICAgICAgICAoZW1wX3B0ciArIGkpLT5mZWRUYXggPSAoZW1wX3B0ciArIGkpLT5ncm9zc1BheSAqIEZFRF9UQVhfUkFURTsKICAgIH0KfQoKdm9pZCBjYWxjTmV0UGF5KHN0cnVjdCBlbXBsb3llZSAqZW1wX3B0ciwgaW50IHNpemUpCnsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgewogICAgICAgIGZsb2F0IHRvdGFsVGF4ID0gKGVtcF9wdHIgKyBpKS0+c3RhdGVUYXggKyAoZW1wX3B0ciArIGkpLT5mZWRUYXg7CiAgICAgICAgKGVtcF9wdHIgKyBpKS0+bmV0UGF5ID0gKGVtcF9wdHIgKyBpKS0+Z3Jvc3NQYXkgLSB0b3RhbFRheDsKICAgIH0KfQoKdm9pZCBwcmludEhlYWRlcih2b2lkKQp7CiAgICBwcmludGYoIlxuXG4qKiogUGF5IENhbGN1bGF0b3IgKioqXG4iKTsKICAgIHByaW50ZigiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKICAgIHByaW50ZigiXG5OYW1lICAgICAgICAgICAgICAgIFRheCAgQ2xvY2sjICBXYWdlICAgSG91cnMgIE9UICAgR3Jvc3MgICBTdGF0ZSAgRmVkICAgICAgTmV0Iik7CiAgICBwcmludGYoIlxuICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBheSAgICAgVGF4ICAgIFRheCAgICAgIFBheSIpOwogICAgcHJpbnRmKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwp9Cgp2b2lkIHByaW50RW1wKHN0cnVjdCBlbXBsb3llZSAqZW1wX3B0ciwgaW50IHNpemUpCnsKICAgIGNoYXIgbmFtZVsyNV07CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCiAgICB7CiAgICAgICAgc3RyY3B5KG5hbWUsIChlbXBfcHRyICsgaSktPmVtcE5hbWUuZmlyc3ROYW1lKTsKICAgICAgICBzdHJjYXQobmFtZSwgIiAiKTsKICAgICAgICBzdHJjYXQobmFtZSwgKGVtcF9wdHIgKyBpKS0+ZW1wTmFtZS5sYXN0TmFtZSk7CgogICAgICAgIHByaW50ZigiXG4lLTIwcyAlLTJzICUwNmxpICU2LjJmICU2LjFmICU1LjFmICU3LjJmICU2LjJmICU3LjJmICU4LjJmIiwKICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgKGVtcF9wdHIgKyBpKS0+dGF4U3RhdGUsCiAgICAgICAgICAgICAgIChlbXBfcHRyICsgaSktPmNsb2NrTnVtYmVyLAogICAgICAgICAgICAgICAoZW1wX3B0ciArIGkpLT53YWdlUmF0ZSwKICAgICAgICAgICAgICAgKGVtcF9wdHIgKyBpKS0+aG91cnMsCiAgICAgICAgICAgICAgIChlbXBfcHRyICsgaSktPm92ZXJ0aW1lSHJzLAogICAgICAgICAgICAgICAoZW1wX3B0ciArIGkpLT5ncm9zc1BheSwKICAgICAgICAgICAgICAgKGVtcF9wdHIgKyBpKS0+c3RhdGVUYXgsCiAgICAgICAgICAgICAgIChlbXBfcHRyICsgaSktPmZlZFRheCwKICAgICAgICAgICAgICAgKGVtcF9wdHIgKyBpKS0+bmV0UGF5KTsKICAgIH0KfQoKdm9pZCBjYWxjRW1wbG95ZWVUb3RhbHMoc3RydWN0IGVtcGxveWVlICplbXBfcHRyLCBzdHJ1Y3QgdG90YWxzICp0b3RfcHRyLCBpbnQgc2l6ZSkKewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCiAgICB7CiAgICAgICAgdG90X3B0ci0+dG90YWxfd2FnZVJhdGUgKz0gKGVtcF9wdHIgKyBpKS0+d2FnZVJhdGU7CiAgICAgICAgdG90X3B0ci0+dG90YWxfaG91cnMgKz0gKGVtcF9wdHIgKyBpKS0+aG91cnM7CiAgICAgICAgdG90X3B0ci0+dG90YWxfb3ZlcnRpbWVIcnMgKz0gKGVtcF9wdHIgKyBpKS0+b3ZlcnRpbWVIcnM7CiAgICAgICAgdG90X3B0ci0+dG90YWxfZ3Jvc3NQYXkgKz0gKGVtcF9wdHIgKyBpKS0+Z3Jvc3NQYXk7CiAgICAgICAgdG90X3B0ci0+dG90YWxfc3RhdGVUYXggKz0gKGVtcF9wdHIgKyBpKS0+c3RhdGVUYXg7CiAgICAgICAgdG90X3B0ci0+dG90YWxfZmVkVGF4ICs9IChlbXBfcHRyICsgaSktPmZlZFRheDsKICAgICAgICB0b3RfcHRyLT50b3RhbF9uZXRQYXkgKz0gKGVtcF9wdHIgKyBpKS0+bmV0UGF5OwogICAgfQp9Cgp2b2lkIGNhbGNFbXBsb3llZU1pbk1heChzdHJ1Y3QgZW1wbG95ZWUgKmVtcF9wdHIsIHN0cnVjdCBtaW5fbWF4ICptaW5tYXhfcHRyLCBpbnQgc2l6ZSkKewogICAgbWlubWF4X3B0ci0+bWluX3dhZ2VSYXRlID0gbWlubWF4X3B0ci0+bWF4X3dhZ2VSYXRlID0gKGVtcF9wdHIgKyAwKS0+d2FnZVJhdGU7CiAgICBtaW5tYXhfcHRyLT5taW5faG91cnMgPSBtaW5tYXhfcHRyLT5tYXhfaG91cnMgPSAoZW1wX3B0ciArIDApLT5ob3VyczsKICAgIG1pbm1heF9wdHItPm1pbl9vdmVydGltZUhycyA9IG1pbm1heF9wdHItPm1heF9vdmVydGltZUhycyA9IChlbXBfcHRyICsgMCktPm92ZXJ0aW1lSHJzOwogICAgbWlubWF4X3B0ci0+bWluX2dyb3NzUGF5ID0gbWlubWF4X3B0ci0+bWF4X2dyb3NzUGF5ID0gKGVtcF9wdHIgKyAwKS0+Z3Jvc3NQYXk7CiAgICBtaW5tYXhfcHRyLT5taW5fc3RhdGVUYXggPSBtaW5tYXhfcHRyLT5tYXhfc3RhdGVUYXggPSAoZW1wX3B0ciArIDApLT5zdGF0ZVRheDsKICAgIG1pbm1heF9wdHItPm1pbl9mZWRUYXggPSBtaW5tYXhfcHRyLT5tYXhfZmVkVGF4ID0gKGVtcF9wdHIgKyAwKS0+ZmVkVGF4OwogICAgbWlubWF4X3B0ci0+bWluX25ldFBheSA9IG1pbm1heF9wdHItPm1heF9uZXRQYXkgPSAoZW1wX3B0ciArIDApLT5uZXRQYXk7CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzaXplOyBpKyspCiAgICB7CiAgICAgICAgaWYgKChlbXBfcHRyICsgaSktPmhvdXJzIDwgbWlubWF4X3B0ci0+bWluX2hvdXJzKQogICAgICAgICAgICBtaW5tYXhfcHRyLT5taW5faG91cnMgPSAoZW1wX3B0ciArIGkpLT5ob3VyczsKICAgICAgICBpZiAoKGVtcF9wdHIgKyBpKS0+aG91cnMgPiBtaW5tYXhfcHRyLT5tYXhfaG91cnMpCiAgICAgICAgICAgIG1pbm1heF9wdHItPm1heF9ob3VycyA9IChlbXBfcHRyICsgaSktPmhvdXJzOwogICAgfQp9Cgp2b2lkIHByaW50RW1wU3RhdGlzdGljcyhzdHJ1Y3QgdG90YWxzICp0b3RfcHRyLAogICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbWluX21heCAqbWlubWF4X3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpCnsKICAgIHByaW50ZigiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKCiAgICBwcmludGYoIlxuVG90YWxzOiAgICAgICAgICAgICAgICAgICAgICAgICAlNS4yZiAlNS4xZiAlNS4xZiAlNy4yZiAlNi4yZiAlNy4yZiAlOC4yZiIsCiAgICAgICAgICAgdG90X3B0ci0+dG90YWxfd2FnZVJhdGUsCiAgICAgICAgICAgdG90X3B0ci0+dG90YWxfaG91cnMsCiAgICAgICAgICAgdG90X3B0ci0+dG90YWxfb3ZlcnRpbWVIcnMsCiAgICAgICAgICAgdG90X3B0ci0+dG90YWxfZ3Jvc3NQYXksCiAgICAgICAgICAgdG90X3B0ci0+dG90YWxfc3RhdGVUYXgsCiAgICAgICAgICAgdG90X3B0ci0+dG90YWxfZmVkVGF4LAogICAgICAgICAgIHRvdF9wdHItPnRvdGFsX25ldFBheSk7CgogICAgcHJpbnRmKCJcbkF2ZXJhZ2VzOiAgICAgICAgICAgICAgICAgICAgICAgJTUuMmYgJTUuMWYgJTUuMWYgJTcuMmYgJTYuMmYgJTcuMmYgJTguMmYiLAogICAgICAgICAgIHRvdF9wdHItPnRvdGFsX3dhZ2VSYXRlIC8gc2l6ZSwKICAgICAgICAgICB0b3RfcHRyLT50b3RhbF9ob3VycyAvIHNpemUsCiAgICAgICAgICAgdG90X3B0ci0+dG90YWxfb3ZlcnRpbWVIcnMgLyBzaXplLAogICAgICAgICAgIHRvdF9wdHItPnRvdGFsX2dyb3NzUGF5IC8gc2l6ZSwKICAgICAgICAgICB0b3RfcHRyLT50b3RhbF9zdGF0ZVRheCAvIHNpemUsCiAgICAgICAgICAgdG90X3B0ci0+dG90YWxfZmVkVGF4IC8gc2l6ZSwKICAgICAgICAgICB0b3RfcHRyLT50b3RhbF9uZXRQYXkgLyBzaXplKTsKfQ==