//********************************************************
//
// Assignment 10 - Linked Lists, Typedef, and Macros
//
// Name: Hans Solo
//
// Class: C Programming, Spring 2026
//
// Date: April 18, 2026
//
// Description: Program which determines overtime and
// gross pay for a set of employees with outputs sent
// to standard output (the screen).
//
// This assignment also adds the employee name, their tax state,
// and calculates the state tax, federal tax, and net pay. It
// also calculates totals, averages, minimum, and maximum values.
//
// Array and Structure references have all been replaced with
// pointer references to speed up the processing of this code.
// A linked list has been created and deployed to dynamically
// allocate and process employees as needed.
//
// It will also take advantage of the C Preprocessor features,
// in particular with using macros, and will replace all
// struct type references in the code with a typedef alias
// reference.
//
// Call by Reference design (using pointers)
//
//********************************************************
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
//---------------- CONSTANTS ----------------
#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_STATE_TAX_RATE 0.08
#define FED_TAX_RATE 0.25
#define FIRST_NAME_SIZE 10
#define LAST_NAME_SIZE 10
#define TAX_STATE_SIZE 3
//---------------- MACROS ----------------
#define CALC_OT_HOURS(h) ((h > STD_HOURS) ? (h - STD_HOURS) : 0)
#define CALC_STATE_TAX(pay, rate) (pay * rate)
#define CALC_FED_TAX(pay) (pay * FED_TAX_RATE)
#define CALC_NET_PAY(pay, st, ft) (pay - (st + ft))
#define CALC_NORMAL_PAY(w, h, ot) (w * (h - ot))
#define CALC_OT_PAY(w, ot) (ot * (w * OT_RATE))
#define CALC_MIN(val, min) ((val < min) ? val : min)
#define CALC_MAX(val, max) ((val > max) ? val : max)
//---------------- STRUCTURES ----------------
struct name {
char firstName[ FIRST_NAME_SIZE] ;
char lastName[ FIRST_NAME_SIZE] ;
} ;
typedef struct employee {
struct name empName;
char taxState[ TAX_STATE_SIZE] ;
long clockNumber;
float wageRate;
float hours;
float overtimeHrs;
float grossPay;
float stateTax;
float fedTax;
float netPay;
struct employee * next;
} EMPLOYEE;
typedef struct totals {
float total_wageRate;
float total_hours;
float total_overtimeHrs;
float total_grossPay;
float total_stateTax;
float total_fedTax;
float total_netPay;
} TOTALS;
typedef struct min_max {
float min_wageRate;
float min_hours;
float min_overtimeHrs;
float min_grossPay;
float min_stateTax;
float min_fedTax;
float min_netPay;
float max_wageRate;
float max_hours;
float max_overtimeHrs;
float max_grossPay;
float max_stateTax;
float max_fedTax;
float max_netPay;
} MIN_MAX;
//---------------- PROTOTYPES ----------------
EMPLOYEE * getEmpData( void ) ;
int isEmployeeSize( EMPLOYEE * head_ptr) ;
void calcOvertimeHrs( EMPLOYEE * head_ptr) ;
void calcGrossPay( EMPLOYEE * head_ptr) ;
void calcStateTax( EMPLOYEE * head_ptr) ;
void calcFedTax( EMPLOYEE * head_ptr) ;
void calcNetPay( EMPLOYEE * head_ptr) ;
void calcEmployeeTotals( EMPLOYEE * head_ptr, TOTALS * totals) ;
void calcEmployeeMinMax( EMPLOYEE * head_ptr, MIN_MAX * mm) ;
void printHeader( void ) ;
void printEmp( EMPLOYEE * head_ptr) ;
void printEmpStatistics( TOTALS * totals, MIN_MAX * mm, int size) ;
//---------------- MAIN ----------------
int main( ) {
EMPLOYEE * head_ptr;
int size;
TOTALS totals = { 0 } ;
MIN_MAX mm = { 0 } ;
head_ptr = getEmpData( ) ;
size = isEmployeeSize( head_ptr) ;
if ( size > 0 ) {
calcOvertimeHrs( head_ptr) ;
calcGrossPay( head_ptr) ;
calcStateTax( head_ptr) ;
calcFedTax( head_ptr) ;
calcNetPay( head_ptr) ;
calcEmployeeTotals( head_ptr, & totals) ;
calcEmployeeMinMax( head_ptr, & mm) ;
printHeader( ) ;
printEmp( head_ptr) ;
printEmpStatistics( & totals, & mm, size) ;
}
printf ( "\n \n *** End of Program *** \n " ) ; return 0 ;
}
//---------------- INPUT ----------------
EMPLOYEE * getEmpData( void ) {
EMPLOYEE * head = NULL, * current = NULL;
char ans;
while ( 1 ) {
EMPLOYEE
* node
= malloc ( sizeof ( EMPLOYEE
) ) ;
scanf ( "%s" , node
-> empName.
firstName ) ; scanf ( "%s" , node
-> empName.
lastName ) ; scanf ( "%s" , node
-> taxState
) ; scanf ( "%ld" , & node
-> clockNumber
) ; scanf ( "%f" , & node
-> wageRate
) ; scanf ( "%f" , & node
-> hours
) ;
node-> next = NULL;
if ( ! head)
head = node;
else
current-> next = node;
current = node;
break ;
}
return head;
}
//---------------- SIZE ----------------
int isEmployeeSize( EMPLOYEE * head_ptr) {
int count = 0 ;
while ( head_ptr) {
count++;
head_ptr = head_ptr-> next;
}
return count;
}
//---------------- CALCULATIONS ----------------
void calcOvertimeHrs( EMPLOYEE * h) {
while ( h) {
h-> overtimeHrs = CALC_OT_HOURS( h-> hours) ;
h = h-> next;
}
}
void calcGrossPay( EMPLOYEE * h) {
while ( h) {
float normal = CALC_NORMAL_PAY( h-> wageRate, h-> hours, h-> overtimeHrs) ;
float ot = CALC_OT_PAY( h-> wageRate, h-> overtimeHrs) ;
h-> grossPay = normal + ot;
h = h-> next;
}
}
void calcStateTax( EMPLOYEE * h) {
while ( h) {
if ( strcmp ( h
-> taxState
, "MA" ) == 0 ) h-> stateTax = CALC_STATE_TAX( h-> grossPay, MA_TAX_RATE) ;
else if ( strcmp ( h
-> taxState
, "NH" ) == 0 ) h-> stateTax = CALC_STATE_TAX( h-> grossPay, NH_TAX_RATE) ;
else if ( strcmp ( h
-> taxState
, "VT" ) == 0 ) h-> stateTax = CALC_STATE_TAX( h-> grossPay, VT_TAX_RATE) ;
else if ( strcmp ( h
-> taxState
, "CA" ) == 0 ) h-> stateTax = CALC_STATE_TAX( h-> grossPay, CA_TAX_RATE) ;
else
h-> stateTax = CALC_STATE_TAX( h-> grossPay, DEFAULT_STATE_TAX_RATE) ;
h = h-> next;
}
}
void calcFedTax( EMPLOYEE * h) {
while ( h) {
h-> fedTax = CALC_FED_TAX( h-> grossPay) ;
h = h-> next;
}
}
void calcNetPay( EMPLOYEE * h) {
while ( h) {
h-> netPay = CALC_NET_PAY( h-> grossPay, h-> stateTax, h-> fedTax) ;
h = h-> next;
}
}
//---------------- TOTALS ----------------
void calcEmployeeTotals( EMPLOYEE * h, TOTALS * t) {
while ( h) {
t-> total_wageRate += h-> wageRate;
t-> total_hours += h-> hours;
t-> total_overtimeHrs += h-> overtimeHrs;
t-> total_grossPay += h-> grossPay;
t-> total_stateTax += h-> stateTax;
t-> total_fedTax += h-> fedTax;
t-> total_netPay += h-> netPay;
h = h-> next;
}
}
//---------------- MIN/MAX ----------------
void calcEmployeeMinMax( EMPLOYEE * h, MIN_MAX * m) {
EMPLOYEE * p = h;
m-> min_wageRate = m-> max_wageRate = p-> wageRate;
m-> min_hours = m-> max_hours = p-> hours;
m-> min_overtimeHrs = m-> max_overtimeHrs = p-> overtimeHrs;
m-> min_grossPay = m-> max_grossPay = p-> grossPay;
m-> min_stateTax = m-> max_stateTax = p-> stateTax;
m-> min_fedTax = m-> max_fedTax = p-> fedTax;
m-> min_netPay = m-> max_netPay = p-> netPay;
p = p-> next;
while ( p) {
m-> min_wageRate = CALC_MIN( p-> wageRate, m-> min_wageRate) ;
m-> max_wageRate = CALC_MAX( p-> wageRate, m-> max_wageRate) ;
m-> min_hours = CALC_MIN( p-> hours, m-> min_hours) ;
m-> max_hours = CALC_MAX( p-> hours, m-> max_hours) ;
m-> min_overtimeHrs = CALC_MIN( p-> overtimeHrs, m-> min_overtimeHrs) ;
m-> max_overtimeHrs = CALC_MAX( p-> overtimeHrs, m-> max_overtimeHrs) ;
m-> min_grossPay = CALC_MIN( p-> grossPay, m-> min_grossPay) ;
m-> max_grossPay = CALC_MAX( p-> grossPay, m-> max_grossPay) ;
m-> min_stateTax = CALC_MIN( p-> stateTax, m-> min_stateTax) ;
m-> max_stateTax = CALC_MAX( p-> stateTax, m-> max_stateTax) ;
m-> min_fedTax = CALC_MIN( p-> fedTax, m-> min_fedTax) ;
m-> max_fedTax = CALC_MAX( p-> fedTax, m-> max_fedTax) ;
m-> min_netPay = CALC_MIN( p-> netPay, m-> min_netPay) ;
m-> max_netPay = CALC_MAX( p-> netPay, m-> max_netPay) ;
p = p-> next;
}
}
//---------------- OUTPUT ----------------
void printHeader( void ) {
printf ( "\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( EMPLOYEE * h) {
while ( h) {
char name[ 25 ] ;
strcpy ( name
, h
-> empName.
firstName ) ; strcat ( name
, h
-> empName.
lastName ) ;
printf ( "\n %-20s %-2s %06ld %5.2f %5.1f %4.1f %7.2f %6.2f %7.2f %8.2f" , name,
h-> taxState,
h-> clockNumber,
h-> wageRate,
h-> hours,
h-> overtimeHrs,
h-> grossPay,
h-> stateTax,
h-> fedTax,
h-> netPay) ;
h = h-> next;
}
}
void printEmpStatistics( TOTALS * t, MIN_MAX * m, int size) {
printf ( "\n ---------------------------------------------------------------------------------" ) ;
printf ( "\n Totals: %5.2f %5.1f %5.1f %7.2f %6.2f %7.2f %8.2f" , t-> total_wageRate,
t-> total_hours,
t-> total_overtimeHrs,
t-> total_grossPay,
t-> total_stateTax,
t-> total_fedTax,
t-> total_netPay) ;
printf ( "\n Averages: %5.2f %5.1f %5.1f %7.2f %6.2f %7.2f %8.2f" , t-> total_wageRate/ size,
t-> total_hours/ size,
t-> total_overtimeHrs/ size,
t-> total_grossPay/ size,
t-> total_stateTax/ size,
t-> total_fedTax/ size,
t-> total_netPay/ size) ;
printf ( "\n Minimum: %5.2f %5.1f %5.1f %7.2f %6.2f %7.2f %8.2f" , m-> min_wageRate,
m-> min_hours,
m-> min_overtimeHrs,
m-> min_grossPay,
m-> min_stateTax,
m-> min_fedTax,
m-> min_netPay) ;
printf ( "\n Maximum: %5.2f %5.1f %5.1f %7.2f %6.2f %7.2f %8.2f" , m-> max_wageRate,
m-> max_hours,
m-> max_overtimeHrs,
m-> max_grossPay,
m-> max_stateTax,
m-> max_fedTax,
m-> max_netPay) ;
printf ( "\n \n The total employees processed was: %d\n " , size
) ; }
Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLwovLyBBc3NpZ25tZW50IDEwIC0gTGlua2VkIExpc3RzLCBUeXBlZGVmLCBhbmQgTWFjcm9zCi8vCi8vIE5hbWU6IEhhbnMgU29sbwovLwovLyBDbGFzczogQyBQcm9ncmFtbWluZywgU3ByaW5nIDIwMjYKLy8KLy8gRGF0ZTogQXByaWwgMTgsIDIwMjYKLy8KLy8gRGVzY3JpcHRpb246IFByb2dyYW0gd2hpY2ggZGV0ZXJtaW5lcyBvdmVydGltZSBhbmQgCi8vIGdyb3NzIHBheSBmb3IgYSBzZXQgb2YgZW1wbG95ZWVzIHdpdGggb3V0cHV0cyBzZW50IAovLyB0byBzdGFuZGFyZCBvdXRwdXQgKHRoZSBzY3JlZW4pLgovLwovLyBUaGlzIGFzc2lnbm1lbnQgYWxzbyBhZGRzIHRoZSBlbXBsb3llZSBuYW1lLCB0aGVpciB0YXggc3RhdGUsCi8vIGFuZCBjYWxjdWxhdGVzIHRoZSBzdGF0ZSB0YXgsIGZlZGVyYWwgdGF4LCBhbmQgbmV0IHBheS4gICBJdAovLyBhbHNvIGNhbGN1bGF0ZXMgdG90YWxzLCBhdmVyYWdlcywgbWluaW11bSwgYW5kIG1heGltdW0gdmFsdWVzLgovLwovLyBBcnJheSBhbmQgU3RydWN0dXJlIHJlZmVyZW5jZXMgaGF2ZSBhbGwgYmVlbiByZXBsYWNlZCB3aXRoCi8vIHBvaW50ZXIgcmVmZXJlbmNlcyB0byBzcGVlZCB1cCB0aGUgcHJvY2Vzc2luZyBvZiB0aGlzIGNvZGUuCi8vIEEgbGlua2VkIGxpc3QgaGFzIGJlZW4gY3JlYXRlZCBhbmQgZGVwbG95ZWQgdG8gZHluYW1pY2FsbHkKLy8gYWxsb2NhdGUgYW5kIHByb2Nlc3MgZW1wbG95ZWVzIGFzIG5lZWRlZC4KLy8KLy8gSXQgd2lsbCBhbHNvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBDIFByZXByb2Nlc3NvciBmZWF0dXJlcywKLy8gaW4gcGFydGljdWxhciB3aXRoIHVzaW5nIG1hY3JvcywgYW5kIHdpbGwgcmVwbGFjZSBhbGwgCi8vIHN0cnVjdCB0eXBlIHJlZmVyZW5jZXMgaW4gdGhlIGNvZGUgd2l0aCBhIHR5cGVkZWYgYWxpYXMKLy8gcmVmZXJlbmNlLgovLwovLyBDYWxsIGJ5IFJlZmVyZW5jZSBkZXNpZ24gKHVzaW5nIHBvaW50ZXJzKQovLwovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKLy8tLS0tLS0tLS0tLS0tLS0tIENPTlNUQU5UUyAtLS0tLS0tLS0tLS0tLS0tCgojZGVmaW5lIFNURF9IT1VSUyA0MC4wCiNkZWZpbmUgT1RfUkFURSAxLjUKCiNkZWZpbmUgTUFfVEFYX1JBVEUgMC4wNQojZGVmaW5lIE5IX1RBWF9SQVRFIDAuMAojZGVmaW5lIFZUX1RBWF9SQVRFIDAuMDYKI2RlZmluZSBDQV9UQVhfUkFURSAwLjA3CiNkZWZpbmUgREVGQVVMVF9TVEFURV9UQVhfUkFURSAwLjA4CgojZGVmaW5lIEZFRF9UQVhfUkFURSAwLjI1CgojZGVmaW5lIEZJUlNUX05BTUVfU0laRSAxMAojZGVmaW5lIExBU1RfTkFNRV9TSVpFIDEwCiNkZWZpbmUgVEFYX1NUQVRFX1NJWkUgMwoKLy8tLS0tLS0tLS0tLS0tLS0tIE1BQ1JPUyAtLS0tLS0tLS0tLS0tLS0tCgojZGVmaW5lIENBTENfT1RfSE9VUlMoaCkgKChoID4gU1REX0hPVVJTKSA/IChoIC0gU1REX0hPVVJTKSA6IDApCiNkZWZpbmUgQ0FMQ19TVEFURV9UQVgocGF5LCByYXRlKSAocGF5ICogcmF0ZSkKI2RlZmluZSBDQUxDX0ZFRF9UQVgocGF5KSAocGF5ICogRkVEX1RBWF9SQVRFKQoKI2RlZmluZSBDQUxDX05FVF9QQVkocGF5LCBzdCwgZnQpIChwYXkgLSAoc3QgKyBmdCkpCiNkZWZpbmUgQ0FMQ19OT1JNQUxfUEFZKHcsIGgsIG90KSAodyAqIChoIC0gb3QpKQojZGVmaW5lIENBTENfT1RfUEFZKHcsIG90KSAob3QgKiAodyAqIE9UX1JBVEUpKQoKI2RlZmluZSBDQUxDX01JTih2YWwsIG1pbikgKCh2YWwgPCBtaW4pID8gdmFsIDogbWluKQojZGVmaW5lIENBTENfTUFYKHZhbCwgbWF4KSAoKHZhbCA+IG1heCkgPyB2YWwgOiBtYXgpCgovLy0tLS0tLS0tLS0tLS0tLS0gU1RSVUNUVVJFUyAtLS0tLS0tLS0tLS0tLS0tCgpzdHJ1Y3QgbmFtZSB7CiAgICBjaGFyIGZpcnN0TmFtZVtGSVJTVF9OQU1FX1NJWkVdOwogICAgY2hhciBsYXN0TmFtZVtGSVJTVF9OQU1FX1NJWkVdOwp9OwoKdHlwZWRlZiBzdHJ1Y3QgZW1wbG95ZWUgewogICAgc3RydWN0IG5hbWUgZW1wTmFtZTsKICAgIGNoYXIgdGF4U3RhdGVbVEFYX1NUQVRFX1NJWkVdOwogICAgbG9uZyBjbG9ja051bWJlcjsKICAgIGZsb2F0IHdhZ2VSYXRlOwogICAgZmxvYXQgaG91cnM7CiAgICBmbG9hdCBvdmVydGltZUhyczsKICAgIGZsb2F0IGdyb3NzUGF5OwogICAgZmxvYXQgc3RhdGVUYXg7CiAgICBmbG9hdCBmZWRUYXg7CiAgICBmbG9hdCBuZXRQYXk7CiAgICBzdHJ1Y3QgZW1wbG95ZWUgKm5leHQ7Cn0gRU1QTE9ZRUU7Cgp0eXBlZGVmIHN0cnVjdCB0b3RhbHMgewogICAgZmxvYXQgdG90YWxfd2FnZVJhdGU7CiAgICBmbG9hdCB0b3RhbF9ob3VyczsKICAgIGZsb2F0IHRvdGFsX292ZXJ0aW1lSHJzOwogICAgZmxvYXQgdG90YWxfZ3Jvc3NQYXk7CiAgICBmbG9hdCB0b3RhbF9zdGF0ZVRheDsKICAgIGZsb2F0IHRvdGFsX2ZlZFRheDsKICAgIGZsb2F0IHRvdGFsX25ldFBheTsKfSBUT1RBTFM7Cgp0eXBlZGVmIHN0cnVjdCBtaW5fbWF4IHsKICAgIGZsb2F0IG1pbl93YWdlUmF0ZTsKICAgIGZsb2F0IG1pbl9ob3VyczsKICAgIGZsb2F0IG1pbl9vdmVydGltZUhyczsKICAgIGZsb2F0IG1pbl9ncm9zc1BheTsKICAgIGZsb2F0IG1pbl9zdGF0ZVRheDsKICAgIGZsb2F0IG1pbl9mZWRUYXg7CiAgICBmbG9hdCBtaW5fbmV0UGF5OwoKICAgIGZsb2F0IG1heF93YWdlUmF0ZTsKICAgIGZsb2F0IG1heF9ob3VyczsKICAgIGZsb2F0IG1heF9vdmVydGltZUhyczsKICAgIGZsb2F0IG1heF9ncm9zc1BheTsKICAgIGZsb2F0IG1heF9zdGF0ZVRheDsKICAgIGZsb2F0IG1heF9mZWRUYXg7CiAgICBmbG9hdCBtYXhfbmV0UGF5Owp9IE1JTl9NQVg7CgovLy0tLS0tLS0tLS0tLS0tLS0gUFJPVE9UWVBFUyAtLS0tLS0tLS0tLS0tLS0tCgpFTVBMT1lFRSAqZ2V0RW1wRGF0YSh2b2lkKTsKaW50IGlzRW1wbG95ZWVTaXplKEVNUExPWUVFICpoZWFkX3B0cik7Cgp2b2lkIGNhbGNPdmVydGltZUhycyhFTVBMT1lFRSAqaGVhZF9wdHIpOwp2b2lkIGNhbGNHcm9zc1BheShFTVBMT1lFRSAqaGVhZF9wdHIpOwp2b2lkIGNhbGNTdGF0ZVRheChFTVBMT1lFRSAqaGVhZF9wdHIpOwp2b2lkIGNhbGNGZWRUYXgoRU1QTE9ZRUUgKmhlYWRfcHRyKTsKdm9pZCBjYWxjTmV0UGF5KEVNUExPWUVFICpoZWFkX3B0cik7Cgp2b2lkIGNhbGNFbXBsb3llZVRvdGFscyhFTVBMT1lFRSAqaGVhZF9wdHIsIFRPVEFMUyAqdG90YWxzKTsKdm9pZCBjYWxjRW1wbG95ZWVNaW5NYXgoRU1QTE9ZRUUgKmhlYWRfcHRyLCBNSU5fTUFYICptbSk7Cgp2b2lkIHByaW50SGVhZGVyKHZvaWQpOwp2b2lkIHByaW50RW1wKEVNUExPWUVFICpoZWFkX3B0cik7CnZvaWQgcHJpbnRFbXBTdGF0aXN0aWNzKFRPVEFMUyAqdG90YWxzLCBNSU5fTUFYICptbSwgaW50IHNpemUpOwoKLy8tLS0tLS0tLS0tLS0tLS0tIE1BSU4gLS0tLS0tLS0tLS0tLS0tLQoKaW50IG1haW4oKSB7CgogICAgRU1QTE9ZRUUgKmhlYWRfcHRyOwogICAgaW50IHNpemU7CgogICAgVE9UQUxTIHRvdGFscyA9IHswfTsKICAgIE1JTl9NQVggbW0gPSB7MH07CgogICAgaGVhZF9wdHIgPSBnZXRFbXBEYXRhKCk7CiAgICBzaXplID0gaXNFbXBsb3llZVNpemUoaGVhZF9wdHIpOwoKICAgIGlmIChzaXplID4gMCkgewoKICAgICAgICBjYWxjT3ZlcnRpbWVIcnMoaGVhZF9wdHIpOwogICAgICAgIGNhbGNHcm9zc1BheShoZWFkX3B0cik7CiAgICAgICAgY2FsY1N0YXRlVGF4KGhlYWRfcHRyKTsKICAgICAgICBjYWxjRmVkVGF4KGhlYWRfcHRyKTsKICAgICAgICBjYWxjTmV0UGF5KGhlYWRfcHRyKTsKCiAgICAgICAgY2FsY0VtcGxveWVlVG90YWxzKGhlYWRfcHRyLCAmdG90YWxzKTsKICAgICAgICBjYWxjRW1wbG95ZWVNaW5NYXgoaGVhZF9wdHIsICZtbSk7CgogICAgICAgIHByaW50SGVhZGVyKCk7CiAgICAgICAgcHJpbnRFbXAoaGVhZF9wdHIpOwogICAgICAgIHByaW50RW1wU3RhdGlzdGljcygmdG90YWxzLCAmbW0sIHNpemUpOwogICAgfQoKICAgIHByaW50ZigiXG5cbiAqKiogRW5kIG9mIFByb2dyYW0gKioqIFxuIik7CiAgICByZXR1cm4gMDsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tIElOUFVUIC0tLS0tLS0tLS0tLS0tLS0KCkVNUExPWUVFICpnZXRFbXBEYXRhKHZvaWQpIHsKCiAgICBFTVBMT1lFRSAqaGVhZCA9IE5VTEwsICpjdXJyZW50ID0gTlVMTDsKICAgIGNoYXIgYW5zOwoKICAgIHdoaWxlICgxKSB7CgogICAgICAgIEVNUExPWUVFICpub2RlID0gbWFsbG9jKHNpemVvZihFTVBMT1lFRSkpOwoKICAgICAgICBzY2FuZigiJXMiLCBub2RlLT5lbXBOYW1lLmZpcnN0TmFtZSk7CiAgICAgICAgc2NhbmYoIiVzIiwgbm9kZS0+ZW1wTmFtZS5sYXN0TmFtZSk7CiAgICAgICAgc2NhbmYoIiVzIiwgbm9kZS0+dGF4U3RhdGUpOwogICAgICAgIHNjYW5mKCIlbGQiLCAmbm9kZS0+Y2xvY2tOdW1iZXIpOwogICAgICAgIHNjYW5mKCIlZiIsICZub2RlLT53YWdlUmF0ZSk7CiAgICAgICAgc2NhbmYoIiVmIiwgJm5vZGUtPmhvdXJzKTsKCiAgICAgICAgbm9kZS0+bmV4dCA9IE5VTEw7CgogICAgICAgIGlmICghaGVhZCkKICAgICAgICAgICAgaGVhZCA9IG5vZGU7CiAgICAgICAgZWxzZQogICAgICAgICAgICBjdXJyZW50LT5uZXh0ID0gbm9kZTsKCiAgICAgICAgY3VycmVudCA9IG5vZGU7CgogICAgICAgIHNjYW5mKCIgJWMiLCAmYW5zKTsKICAgICAgICBpZiAodG91cHBlcihhbnMpICE9ICdZJykKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIGhlYWQ7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLSBTSVpFIC0tLS0tLS0tLS0tLS0tLS0KCmludCBpc0VtcGxveWVlU2l6ZShFTVBMT1lFRSAqaGVhZF9wdHIpIHsKICAgIGludCBjb3VudCA9IDA7CiAgICB3aGlsZSAoaGVhZF9wdHIpIHsKICAgICAgICBjb3VudCsrOwogICAgICAgIGhlYWRfcHRyID0gaGVhZF9wdHItPm5leHQ7CiAgICB9CiAgICByZXR1cm4gY291bnQ7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLSBDQUxDVUxBVElPTlMgLS0tLS0tLS0tLS0tLS0tLQoKdm9pZCBjYWxjT3ZlcnRpbWVIcnMoRU1QTE9ZRUUgKmgpIHsKICAgIHdoaWxlIChoKSB7CiAgICAgICAgaC0+b3ZlcnRpbWVIcnMgPSBDQUxDX09UX0hPVVJTKGgtPmhvdXJzKTsKICAgICAgICBoID0gaC0+bmV4dDsKICAgIH0KfQoKdm9pZCBjYWxjR3Jvc3NQYXkoRU1QTE9ZRUUgKmgpIHsKICAgIHdoaWxlIChoKSB7CiAgICAgICAgZmxvYXQgbm9ybWFsID0gQ0FMQ19OT1JNQUxfUEFZKGgtPndhZ2VSYXRlLCBoLT5ob3VycywgaC0+b3ZlcnRpbWVIcnMpOwogICAgICAgIGZsb2F0IG90ID0gQ0FMQ19PVF9QQVkoaC0+d2FnZVJhdGUsIGgtPm92ZXJ0aW1lSHJzKTsKICAgICAgICBoLT5ncm9zc1BheSA9IG5vcm1hbCArIG90OwogICAgICAgIGggPSBoLT5uZXh0OwogICAgfQp9Cgp2b2lkIGNhbGNTdGF0ZVRheChFTVBMT1lFRSAqaCkgewogICAgd2hpbGUgKGgpIHsKCiAgICAgICAgaWYgKHN0cmNtcChoLT50YXhTdGF0ZSwgIk1BIikgPT0gMCkKICAgICAgICAgICAgaC0+c3RhdGVUYXggPSBDQUxDX1NUQVRFX1RBWChoLT5ncm9zc1BheSwgTUFfVEFYX1JBVEUpOwogICAgICAgIGVsc2UgaWYgKHN0cmNtcChoLT50YXhTdGF0ZSwgIk5IIikgPT0gMCkKICAgICAgICAgICAgaC0+c3RhdGVUYXggPSBDQUxDX1NUQVRFX1RBWChoLT5ncm9zc1BheSwgTkhfVEFYX1JBVEUpOwogICAgICAgIGVsc2UgaWYgKHN0cmNtcChoLT50YXhTdGF0ZSwgIlZUIikgPT0gMCkKICAgICAgICAgICAgaC0+c3RhdGVUYXggPSBDQUxDX1NUQVRFX1RBWChoLT5ncm9zc1BheSwgVlRfVEFYX1JBVEUpOwogICAgICAgIGVsc2UgaWYgKHN0cmNtcChoLT50YXhTdGF0ZSwgIkNBIikgPT0gMCkKICAgICAgICAgICAgaC0+c3RhdGVUYXggPSBDQUxDX1NUQVRFX1RBWChoLT5ncm9zc1BheSwgQ0FfVEFYX1JBVEUpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgaC0+c3RhdGVUYXggPSBDQUxDX1NUQVRFX1RBWChoLT5ncm9zc1BheSwgREVGQVVMVF9TVEFURV9UQVhfUkFURSk7CgogICAgICAgIGggPSBoLT5uZXh0OwogICAgfQp9Cgp2b2lkIGNhbGNGZWRUYXgoRU1QTE9ZRUUgKmgpIHsKICAgIHdoaWxlIChoKSB7CiAgICAgICAgaC0+ZmVkVGF4ID0gQ0FMQ19GRURfVEFYKGgtPmdyb3NzUGF5KTsKICAgICAgICBoID0gaC0+bmV4dDsKICAgIH0KfQoKdm9pZCBjYWxjTmV0UGF5KEVNUExPWUVFICpoKSB7CiAgICB3aGlsZSAoaCkgewogICAgICAgIGgtPm5ldFBheSA9IENBTENfTkVUX1BBWShoLT5ncm9zc1BheSwgaC0+c3RhdGVUYXgsIGgtPmZlZFRheCk7CiAgICAgICAgaCA9IGgtPm5leHQ7CiAgICB9Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLSBUT1RBTFMgLS0tLS0tLS0tLS0tLS0tLQoKdm9pZCBjYWxjRW1wbG95ZWVUb3RhbHMoRU1QTE9ZRUUgKmgsIFRPVEFMUyAqdCkgewoKICAgIHdoaWxlIChoKSB7CiAgICAgICAgdC0+dG90YWxfd2FnZVJhdGUgKz0gaC0+d2FnZVJhdGU7CiAgICAgICAgdC0+dG90YWxfaG91cnMgKz0gaC0+aG91cnM7CiAgICAgICAgdC0+dG90YWxfb3ZlcnRpbWVIcnMgKz0gaC0+b3ZlcnRpbWVIcnM7CiAgICAgICAgdC0+dG90YWxfZ3Jvc3NQYXkgKz0gaC0+Z3Jvc3NQYXk7CiAgICAgICAgdC0+dG90YWxfc3RhdGVUYXggKz0gaC0+c3RhdGVUYXg7CiAgICAgICAgdC0+dG90YWxfZmVkVGF4ICs9IGgtPmZlZFRheDsKICAgICAgICB0LT50b3RhbF9uZXRQYXkgKz0gaC0+bmV0UGF5OwogICAgICAgIGggPSBoLT5uZXh0OwogICAgfQp9CgovLy0tLS0tLS0tLS0tLS0tLS0gTUlOL01BWCAtLS0tLS0tLS0tLS0tLS0tCgp2b2lkIGNhbGNFbXBsb3llZU1pbk1heChFTVBMT1lFRSAqaCwgTUlOX01BWCAqbSkgewoKICAgIEVNUExPWUVFICpwID0gaDsKCiAgICBtLT5taW5fd2FnZVJhdGUgPSBtLT5tYXhfd2FnZVJhdGUgPSBwLT53YWdlUmF0ZTsKICAgIG0tPm1pbl9ob3VycyA9IG0tPm1heF9ob3VycyA9IHAtPmhvdXJzOwogICAgbS0+bWluX292ZXJ0aW1lSHJzID0gbS0+bWF4X292ZXJ0aW1lSHJzID0gcC0+b3ZlcnRpbWVIcnM7CiAgICBtLT5taW5fZ3Jvc3NQYXkgPSBtLT5tYXhfZ3Jvc3NQYXkgPSBwLT5ncm9zc1BheTsKICAgIG0tPm1pbl9zdGF0ZVRheCA9IG0tPm1heF9zdGF0ZVRheCA9IHAtPnN0YXRlVGF4OwogICAgbS0+bWluX2ZlZFRheCA9IG0tPm1heF9mZWRUYXggPSBwLT5mZWRUYXg7CiAgICBtLT5taW5fbmV0UGF5ID0gbS0+bWF4X25ldFBheSA9IHAtPm5ldFBheTsKCiAgICBwID0gcC0+bmV4dDsKCiAgICB3aGlsZSAocCkgewoKICAgICAgICBtLT5taW5fd2FnZVJhdGUgPSBDQUxDX01JTihwLT53YWdlUmF0ZSwgbS0+bWluX3dhZ2VSYXRlKTsKICAgICAgICBtLT5tYXhfd2FnZVJhdGUgPSBDQUxDX01BWChwLT53YWdlUmF0ZSwgbS0+bWF4X3dhZ2VSYXRlKTsKCiAgICAgICAgbS0+bWluX2hvdXJzID0gQ0FMQ19NSU4ocC0+aG91cnMsIG0tPm1pbl9ob3Vycyk7CiAgICAgICAgbS0+bWF4X2hvdXJzID0gQ0FMQ19NQVgocC0+aG91cnMsIG0tPm1heF9ob3Vycyk7CgogICAgICAgIG0tPm1pbl9vdmVydGltZUhycyA9IENBTENfTUlOKHAtPm92ZXJ0aW1lSHJzLCBtLT5taW5fb3ZlcnRpbWVIcnMpOwogICAgICAgIG0tPm1heF9vdmVydGltZUhycyA9IENBTENfTUFYKHAtPm92ZXJ0aW1lSHJzLCBtLT5tYXhfb3ZlcnRpbWVIcnMpOwoKICAgICAgICBtLT5taW5fZ3Jvc3NQYXkgPSBDQUxDX01JTihwLT5ncm9zc1BheSwgbS0+bWluX2dyb3NzUGF5KTsKICAgICAgICBtLT5tYXhfZ3Jvc3NQYXkgPSBDQUxDX01BWChwLT5ncm9zc1BheSwgbS0+bWF4X2dyb3NzUGF5KTsKCiAgICAgICAgbS0+bWluX3N0YXRlVGF4ID0gQ0FMQ19NSU4ocC0+c3RhdGVUYXgsIG0tPm1pbl9zdGF0ZVRheCk7CiAgICAgICAgbS0+bWF4X3N0YXRlVGF4ID0gQ0FMQ19NQVgocC0+c3RhdGVUYXgsIG0tPm1heF9zdGF0ZVRheCk7CgogICAgICAgIG0tPm1pbl9mZWRUYXggPSBDQUxDX01JTihwLT5mZWRUYXgsIG0tPm1pbl9mZWRUYXgpOwogICAgICAgIG0tPm1heF9mZWRUYXggPSBDQUxDX01BWChwLT5mZWRUYXgsIG0tPm1heF9mZWRUYXgpOwoKICAgICAgICBtLT5taW5fbmV0UGF5ID0gQ0FMQ19NSU4ocC0+bmV0UGF5LCBtLT5taW5fbmV0UGF5KTsKICAgICAgICBtLT5tYXhfbmV0UGF5ID0gQ0FMQ19NQVgocC0+bmV0UGF5LCBtLT5tYXhfbmV0UGF5KTsKCiAgICAgICAgcCA9IHAtPm5leHQ7CiAgICB9Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLSBPVVRQVVQgLS0tLS0tLS0tLS0tLS0tLQoKdm9pZCBwcmludEhlYWRlcih2b2lkKSB7CgogICAgcHJpbnRmKCJcbioqKiBQYXkgQ2FsY3VsYXRvciAqKipcbiIpOwogICAgcHJpbnRmKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwogICAgcHJpbnRmKCJcbk5hbWUgICAgICAgICAgICAgICAgVGF4ICBDbG9jayMgIFdhZ2UgICBIb3VycyAgT1QgICBHcm9zcyAgIFN0YXRlICBGZWQgICAgICBOZXQiKTsKICAgIHByaW50ZigiXG4gICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF5ICAgICBUYXggICAgVGF4ICAgICAgUGF5Iik7CiAgICBwcmludGYoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Cn0KCnZvaWQgcHJpbnRFbXAoRU1QTE9ZRUUgKmgpIHsKCiAgICB3aGlsZSAoaCkgewoKICAgICAgICBjaGFyIG5hbWVbMjVdOwogICAgICAgIHN0cmNweShuYW1lLCBoLT5lbXBOYW1lLmZpcnN0TmFtZSk7CiAgICAgICAgc3RyY2F0KG5hbWUsICIgIik7CiAgICAgICAgc3RyY2F0KG5hbWUsIGgtPmVtcE5hbWUubGFzdE5hbWUpOwoKICAgICAgICBwcmludGYoIlxuJS0yMHMgJS0ycyAgJTA2bGQgICU1LjJmICAlNS4xZiAgJTQuMWYgICU3LjJmICU2LjJmICU3LjJmICU4LjJmIiwKICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgaC0+dGF4U3RhdGUsCiAgICAgICAgICAgIGgtPmNsb2NrTnVtYmVyLAogICAgICAgICAgICBoLT53YWdlUmF0ZSwKICAgICAgICAgICAgaC0+aG91cnMsCiAgICAgICAgICAgIGgtPm92ZXJ0aW1lSHJzLAogICAgICAgICAgICBoLT5ncm9zc1BheSwKICAgICAgICAgICAgaC0+c3RhdGVUYXgsCiAgICAgICAgICAgIGgtPmZlZFRheCwKICAgICAgICAgICAgaC0+bmV0UGF5KTsKCiAgICAgICAgaCA9IGgtPm5leHQ7CiAgICB9Cn0KCnZvaWQgcHJpbnRFbXBTdGF0aXN0aWNzKFRPVEFMUyAqdCwgTUlOX01BWCAqbSwgaW50IHNpemUpIHsKCiAgICBwcmludGYoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CgogICAgcHJpbnRmKCJcblRvdGFsczogICAgICAgICAgICAgICAgICAgICAgICAgJTUuMmYgJTUuMWYgJTUuMWYgJTcuMmYgJTYuMmYgJTcuMmYgJTguMmYiLAogICAgICAgIHQtPnRvdGFsX3dhZ2VSYXRlLAogICAgICAgIHQtPnRvdGFsX2hvdXJzLAogICAgICAgIHQtPnRvdGFsX292ZXJ0aW1lSHJzLAogICAgICAgIHQtPnRvdGFsX2dyb3NzUGF5LAogICAgICAgIHQtPnRvdGFsX3N0YXRlVGF4LAogICAgICAgIHQtPnRvdGFsX2ZlZFRheCwKICAgICAgICB0LT50b3RhbF9uZXRQYXkpOwoKICAgIHByaW50ZigiXG5BdmVyYWdlczogICAgICAgICAgICAgICAgICAgICAgICU1LjJmICU1LjFmICU1LjFmICU3LjJmICU2LjJmICU3LjJmICU4LjJmIiwKICAgICAgICB0LT50b3RhbF93YWdlUmF0ZS9zaXplLAogICAgICAgIHQtPnRvdGFsX2hvdXJzL3NpemUsCiAgICAgICAgdC0+dG90YWxfb3ZlcnRpbWVIcnMvc2l6ZSwKICAgICAgICB0LT50b3RhbF9ncm9zc1BheS9zaXplLAogICAgICAgIHQtPnRvdGFsX3N0YXRlVGF4L3NpemUsCiAgICAgICAgdC0+dG90YWxfZmVkVGF4L3NpemUsCiAgICAgICAgdC0+dG90YWxfbmV0UGF5L3NpemUpOwoKICAgIHByaW50ZigiXG5NaW5pbXVtOiAgICAgICAgICAgICAgICAgICAgICAgICU1LjJmICU1LjFmICU1LjFmICU3LjJmICU2LjJmICU3LjJmICU4LjJmIiwKICAgICAgICBtLT5taW5fd2FnZVJhdGUsCiAgICAgICAgbS0+bWluX2hvdXJzLAogICAgICAgIG0tPm1pbl9vdmVydGltZUhycywKICAgICAgICBtLT5taW5fZ3Jvc3NQYXksCiAgICAgICAgbS0+bWluX3N0YXRlVGF4LAogICAgICAgIG0tPm1pbl9mZWRUYXgsCiAgICAgICAgbS0+bWluX25ldFBheSk7CgogICAgcHJpbnRmKCJcbk1heGltdW06ICAgICAgICAgICAgICAgICAgICAgICAgJTUuMmYgJTUuMWYgJTUuMWYgJTcuMmYgJTYuMmYgJTcuMmYgJTguMmYiLAogICAgICAgIG0tPm1heF93YWdlUmF0ZSwKICAgICAgICBtLT5tYXhfaG91cnMsCiAgICAgICAgbS0+bWF4X292ZXJ0aW1lSHJzLAogICAgICAgIG0tPm1heF9ncm9zc1BheSwKICAgICAgICBtLT5tYXhfc3RhdGVUYXgsCiAgICAgICAgbS0+bWF4X2ZlZFRheCwKICAgICAgICBtLT5tYXhfbmV0UGF5KTsKCiAgICBwcmludGYoIlxuXG5UaGUgdG90YWwgZW1wbG95ZWVzIHByb2Nlc3NlZCB3YXM6ICVkXG4iLCBzaXplKTsKfQ==