#include <iostream>
#include <locale.h>
#include <fstream>
#include <string>
#include <conio.h>
#include <cstdio>
#include <windows.h>
using namespace std;
class client{
protected :
string name;
int bMonth, bDay, bYear,
eMonth, eDay, eYear;
int cost, amount;
int id;
static int n;
public :
client:: client ( int fbMonth, int fbDay, int fbYear, int feMonth, int feDay, int feYear, int fcost, int fid, string fname) ;
virtual void fAmount( ) = 0 ;
void printId( ) { printf ( "%2d" ,id) ; } ; //2
void printName( ) { //printf("%s",name);
for ( int i= 0 ; i< 40 - name.length ( ) ; i++ ) cout << " " ;
cout << name; } ;
void printAmount( ) { printf ( "%6d" ,amount) ; } ; //6
void printCost( ) { printf ( "%5d" ,cost) ; } ; //5
void printPeriod( ) { printf ( "%2.2d.%2.2d.%4d-%2.2d.%2.2d.%4d" ,bDay,bMonth,bYear,eDay,eMonth,eYear) ; } ; //21
static void printTitle( ) { SetCaretPos( 0 ,5 ) ;
printf ( " № Ф.И.О. Период страхования Упл. Страх. сумма сумма --------------------------------------------------------------------------------" ) ; } ;
void printAll( ) ;
void changeName( string newName) { name= newName; } ;
void changeCost( int newCost) { cost= newCost; } ;
void changeAmount( int newAmount) { amount= newAmount; } ;
void changeBDay( int newBDay ) { bDay= newBDay; } ;
void changeBMonth( int newBMonth ) { bMonth= newBMonth; } ;
void changeBYear( int newBYear) { bYear= newBYear; } ;
void changeEDay( int newEDay) { eDay= newEDay; } ;
void changeEMonth( int newEMonth) { eMonth= newEMonth; } ;
void changeEYear( int newEMonth) { eYear= newEMonth; } ;
static void changeN( int newN) { n= newN; } ;
static int getN( ) { return n; } ;
int getId( ) { return id; } ;
} ;
int client:: n = 0 ;
void client:: printAll ( ) {
SetCursorPos( 0 ,0 ) ;
printId( ) ; cout << " " ;
printName( ) ; cout << " " ;
printPeriod( ) ; cout << " " ;
printCost( ) ; cout << " " ;
printAmount( ) ; cout << " " ;
cout << endl;
} ;
class adult : public client{
public :
adult( int fbMonth, int fbDay, int fbYear, int feMonth, int feDay, int feYear, int fcost, int fid, string fname) : client( fbMonth, fbDay, fbYear, feMonth, feDay, feYear, fcost, fid, fname) { fAmount( ) ; } ;
void fAmount( ) { amount= cost* 5 ; } ;
} ;
class underage : public client{
public :
underage( int fbMonth, int fbDay, int fbYear, int feMonth, int feDay, int feYear, int fcost, int fid, string fname) : client( fbMonth, fbDay, fbYear, feMonth, feDay, feYear, fcost, fid, fname) { fAmount( ) ; } ;
void fAmount( ) { amount= cost* 7 ; } ;
} ;
class pensioner : public client{
public :
pensioner( int fbMonth, int fbDay, int fbYear, int feMonth, int feDay, int feYear, int fcost, int fid, string fname) : client( fbMonth, fbDay, fbYear, feMonth, feDay, feYear, fcost, fid, fname) { fAmount( ) ; } ;
void fAmount( ) { amount= cost* 10 ; } ;
} ;
client:: client ( int fbMonth, int fbDay, int fbYear, int feMonth, int feDay, int feYear, int fcost, int fid, string fname) {
bMonth= fbMonth; bDay= fbDay; bYear= fbYear;
eMonth= feMonth; eDay= feDay; eYear= feYear;
cost= fcost;
id= fid;
name= fname;
} ;
int main( )
{
setlocale( LC_CTYPE,"Russian" ) ;
client * p[ 100 ] ; for ( int i= 0 ; i< 100 ; i++ ) * p= NULL ;
client:: changeN ( 0 ) ;
int client_type, t_id, t_amount, t_cost, t_bMonth, t_bDay, t_bYear, t_eMonth, t_eDay, t_eYear;
string s;
string t_name;
ifstream infile( "clients.txt" ) ;
while ( ! infile.eof ( ) ) {
s= " " ;
t_name= " " ;
client_type= t_id= t_amount= t_cost= t_bMonth= t_bDay= t_bYear= t_eMonth= t_eDay= t_eYear= 0 ;
infile>> t_name; t_name+ = " " ;
infile>> s; t_name+ = s; t_name+ = " " ;
infile>> s; t_name+ = s;
infile>> t_bDay; infile>> t_bMonth; infile>> t_bYear;
infile>> t_eDay; infile>> t_eMonth; infile>> t_eYear;
infile>> t_cost; infile>> client_type;
switch ( client_type) {
case 1 : p[ client:: getN ( ) ] = new adult( t_bMonth,t_bDay,t_bYear,t_eMonth,t_eDay,t_eYear,t_cost, client:: getN ( ) , t_name) ;
break ;
case 2 : p[ client:: getN ( ) ] = new underage( t_bMonth,t_bDay,t_bYear,t_eMonth,t_eDay,t_eYear,t_cost, client:: getN ( ) , t_name) ;
break ;
case 3 : p[ client:: getN ( ) ] = new pensioner( t_bMonth,t_bDay,t_bYear,t_eMonth,t_eDay,t_eYear,t_cost, client:: getN ( ) , t_name) ;
break ;
default : cout << "ERROR" ;
}
client:: changeN ( client:: getN ( ) + 1 ) ;
}
infile.close ( ) ;
int choice= 0 ;
while ( choice! = 5 ) {
system ( "cls" ) ;
client:: printTitle ( ) ;
for ( int i= 0 ; i< client:: getN ( ) ; i++ ) p[ i] - > printAll( ) ;
cout << endl<< "1 - изменить, 2 - добавить, 3 - удалить, 4 - сохранить, 5 - выйти" << endl<< "Выберите действие:" ; cin >> choice;
switch ( choice) {
//ВЫБОР КЛИЕТА//
case 1 : int num;
cout << "Введите номер клиента:" ; cin >> num;
{
int choice= 0 ;
while ( choice! = 5 ) {
system ( "cls" ) ;
client:: printTitle ( ) ;
p[ num] - > printAll( ) ;
cout << endl<< "Что редактировать?" << endl<< "1 - ФИО, 2 - уплаченная сумма, 3 -сумма страховки, 4 - период, 5 - ничего" << endl<< "Выберите действие:" ; cin >> choice;
switch ( choice) {
case 1 : { string newName;
cout << "Введите новые ФИО клиента:" ; cin >> newName;
p[ num] - > changeName( newName) ; } ;
break ;
case 2 : { int newCost;
cout << "Введите новую уплаченную сумму:" ; cin >> newCost;
p[ num] - > changeCost( newCost) ;
p[ num] - > fAmount( ) ; } ;
break ;
case 3 : { int newAmount;
cout << "Введите новую сумму страховки:" ; cin >> newAmount;
p[ num] - > changeAmount( newAmount) ; } ;
break ;
case 4 : cout << "Что именно изменить?" << endl<< "1 - начало страховки, 2- конец страховки" ;
int choice;
cin >> choice;
switch ( choice) {
case 1 : int newBDay, newBMonth, newBYear;
cout << "Введите новый день начала страховки:" ; cin >> newBDay;
p[ num] - > changeBDay( newBDay) ;
cout << "Введите новый месяц начала страховки:" ; cin >> newBMonth;
p[ num] - > changeBMonth( newBMonth) ;
cout << "Введите новый год начала страховки:" ; cin >> newBYear;
p[ num] - > changeBYear( newBYear) ;
break ;
case 2 : int newEDay, newEMonth, newEYear;
cout << "Введите новый день конца страховки:" ; cin >> newEDay;
p[ num] - > changeEDay( newEDay) ;
cout << "Введите новый месяц конца страховки:" ; cin >> newEMonth;
p[ num] - > changeEMonth( newEMonth) ;
cout << "Введите новый год конца страховки:" ; cin >> newEYear;
p[ num] - > changeEYear( newEYear) ;
break ;
default : break ;
}
break ;
case 5 : break ;
default : break ;
}
}
}
break ;
//ДОБАВЛЕНИЕ КЛИЕНТА//
case 2 : client:: changeN ( client:: getN ( ) + 1 ) ; {
int client_type;
string name;
int bDay, bMonth,bYear,
eDay, eMonth,eYear;
int cost;
cout << "Выберите тип клиента(1 - взрослый, 2 - несовершеннолетний, 3 - пенсионер):" ;
cin >> client_type;
cout << "Введите ФИО клиента:" ; cin >> name;
cout << "Введите дату начала страховки(в формате дд.мм.гггг)" ;
cin >> bDay>> bMonth>> bYear;
cout << "Введите дату конца страховки(в формате дд.мм.гггг)" ;
cin >> eDay>> eMonth>> eYear;
cout << "Введите уплаченную сумму:" ; cin >> cost;
switch ( client_type) {
case 1 : p[ client:: getN ( ) ] = new adult( bMonth,bDay,bYear,eMonth,eDay,eYear,cost, client:: getN ( ) , name) ;
break ;
case 2 : p[ client:: getN ( ) ] = new underage( bMonth,bDay,bYear,eMonth,eDay,eYear,cost, client:: getN ( ) , name) ;
break ;
case 3 : p[ client:: getN ( ) ] = new pensioner( bMonth,bDay,bYear,eMonth,eDay,eYear,cost, client:: getN ( ) , name) ;
break ;
default : break ;
}
p[ 15 ] - > printCost( ) ;
}
break ;
case 3 : //delClient();
break ;
case 4 : //save();
break ;
case 5 : break ;
}
}
getch( ) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bG9jYWxlLmg+CiNpbmNsdWRlIDxmc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Y29uaW8uaD4KI2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPHdpbmRvd3MuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBjbGllbnR7CnByb3RlY3RlZDoKICBzdHJpbmcgbmFtZTsgCiAgaW50IGJNb250aCwgYkRheSwgYlllYXIsCgkgICAgZU1vbnRoLCBlRGF5LCBlWWVhcjsKICBpbnQgY29zdCwgYW1vdW50OwogIGludCBpZDsKICBzdGF0aWMgaW50IG47CnB1YmxpYzoKICBjbGllbnQ6OmNsaWVudChpbnQgZmJNb250aCwgaW50IGZiRGF5LCBpbnQgZmJZZWFyLCBpbnQgZmVNb250aCwgaW50IGZlRGF5LCBpbnQgZmVZZWFyLCBpbnQgZmNvc3QsIGludCBmaWQsIHN0cmluZyBmbmFtZSk7CiAgdmlydHVhbCB2b2lkIGZBbW91bnQoKT0wOwoJdm9pZCBwcmludElkKCl7cHJpbnRmKCIlMmQiLGlkKTt9Oy8vMgogIHZvaWQgcHJpbnROYW1lKCl7Ly9wcmludGYoIiVzIixuYW1lKTsKCQlmb3IoaW50IGk9MDtpPDQwLW5hbWUubGVuZ3RoKCk7aSsrKSBjb3V0PDwiICI7CgkJY291dDw8bmFtZTt9OwoJdm9pZCBwcmludEFtb3VudCgpe3ByaW50ZigiJTZkIixhbW91bnQpO307Ly82CiAgdm9pZCBwcmludENvc3QoKXtwcmludGYoIiU1ZCIsY29zdCk7fTsvLzUKICB2b2lkIHByaW50UGVyaW9kKCl7cHJpbnRmKCIlMi4yZC4lMi4yZC4lNGQtJTIuMmQuJTIuMmQuJTRkIixiRGF5LGJNb250aCxiWWVhcixlRGF5LGVNb250aCxlWWVhcik7fTsvLzIxCglzdGF0aWMgdm9pZCBwcmludFRpdGxlKCl7U2V0Q2FyZXRQb3MoMCw1KTsKCSAgICAgICAgICAgICAgICAgIHByaW50ZigiIOKEliAgICAgICAgICAgICAgICAgICAgICAgICDQpC7QmC7Qni4gICAgICAgICAgICDQn9C10YDQuNC+0LQg0YHRgtGA0LDRhdC+0LLQsNC90LjRjyAgICDQo9C/0LsuICDQodGC0YDQsNGFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDRgdGD0LzQvNCwICDRgdGD0LzQvNCwICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpO307Cgl2b2lkIHByaW50QWxsKCk7Cgl2b2lkIGNoYW5nZU5hbWUoc3RyaW5nIG5ld05hbWUpe25hbWU9bmV3TmFtZTt9OwoJdm9pZCBjaGFuZ2VDb3N0KGludCBuZXdDb3N0KXtjb3N0PW5ld0Nvc3Q7fTsKCXZvaWQgY2hhbmdlQW1vdW50KGludCBuZXdBbW91bnQpe2Ftb3VudD1uZXdBbW91bnQ7fTsKCXZvaWQgY2hhbmdlQkRheShpbnQgbmV3QkRheSApe2JEYXk9bmV3QkRheTt9OwogIHZvaWQgY2hhbmdlQk1vbnRoKGludCBuZXdCTW9udGggKXtiTW9udGg9bmV3Qk1vbnRoO307Cgl2b2lkIGNoYW5nZUJZZWFyKGludCBuZXdCWWVhcil7YlllYXI9bmV3QlllYXI7fTsKCXZvaWQgY2hhbmdlRURheShpbnQgbmV3RURheSl7ZURheT1uZXdFRGF5O307Cgl2b2lkIGNoYW5nZUVNb250aChpbnQgbmV3RU1vbnRoKXtlTW9udGg9bmV3RU1vbnRoO307Cgl2b2lkIGNoYW5nZUVZZWFyKGludCBuZXdFTW9udGgpe2VZZWFyPW5ld0VNb250aDt9OwoJc3RhdGljIHZvaWQgY2hhbmdlTihpbnQgbmV3Til7bj1uZXdOO307CglzdGF0aWMgaW50IGdldE4oKXtyZXR1cm4gbjt9OwoJaW50IGdldElkKCl7cmV0dXJuIGlkO307Cn07CgppbnQgY2xpZW50OjpuPTA7Cgp2b2lkIGNsaWVudDo6cHJpbnRBbGwoKXsKICBTZXRDdXJzb3JQb3MoMCwwKTsKICBwcmludElkKCk7IGNvdXQ8PCIgIjsKCXByaW50TmFtZSgpOyBjb3V0PDwiICI7CglwcmludFBlcmlvZCgpOyBjb3V0PDwiICI7CglwcmludENvc3QoKTsgY291dDw8IiAiOwoJcHJpbnRBbW91bnQoKTsgY291dDw8IiAiOwoJY291dDw8ZW5kbDsKfTsKCmNsYXNzIGFkdWx0IDogcHVibGljIGNsaWVudHsKcHVibGljOgogIGFkdWx0KGludCBmYk1vbnRoLCBpbnQgZmJEYXksIGludCBmYlllYXIsIGludCBmZU1vbnRoLCBpbnQgZmVEYXksIGludCBmZVllYXIsIGludCBmY29zdCwgaW50IGZpZCwgc3RyaW5nIGZuYW1lKTpjbGllbnQoZmJNb250aCwgZmJEYXksIGZiWWVhciwgZmVNb250aCwgZmVEYXksIGZlWWVhciwgZmNvc3QsIGZpZCwgZm5hbWUpe2ZBbW91bnQoKTt9OwogIHZvaWQgZkFtb3VudCgpe2Ftb3VudD1jb3N0KjU7fTsKfTsKCmNsYXNzIHVuZGVyYWdlIDogcHVibGljIGNsaWVudHsKcHVibGljOgogIHVuZGVyYWdlKGludCBmYk1vbnRoLCBpbnQgZmJEYXksIGludCBmYlllYXIsIGludCBmZU1vbnRoLCBpbnQgZmVEYXksIGludCBmZVllYXIsIGludCBmY29zdCwgaW50IGZpZCwgc3RyaW5nIGZuYW1lKTpjbGllbnQoZmJNb250aCwgZmJEYXksIGZiWWVhciwgZmVNb250aCwgZmVEYXksIGZlWWVhciwgZmNvc3QsIGZpZCwgZm5hbWUpe2ZBbW91bnQoKTt9OwogIHZvaWQgZkFtb3VudCgpe2Ftb3VudD1jb3N0Kjc7fTsKfTsKCmNsYXNzIHBlbnNpb25lciA6IHB1YmxpYyBjbGllbnR7CnB1YmxpYzoKICBwZW5zaW9uZXIoaW50IGZiTW9udGgsIGludCBmYkRheSwgaW50IGZiWWVhciwgaW50IGZlTW9udGgsIGludCBmZURheSwgaW50IGZlWWVhciwgaW50IGZjb3N0LCBpbnQgZmlkLCBzdHJpbmcgZm5hbWUpOmNsaWVudChmYk1vbnRoLCBmYkRheSwgZmJZZWFyLCBmZU1vbnRoLCBmZURheSwgZmVZZWFyLCBmY29zdCwgZmlkLCBmbmFtZSl7ZkFtb3VudCgpO307CiAgdm9pZCBmQW1vdW50KCl7YW1vdW50PWNvc3QqMTA7fTsKfTsKCmNsaWVudDo6Y2xpZW50KGludCBmYk1vbnRoLCBpbnQgZmJEYXksIGludCBmYlllYXIsIGludCBmZU1vbnRoLCBpbnQgZmVEYXksIGludCBmZVllYXIsIGludCBmY29zdCwgaW50IGZpZCwgc3RyaW5nIGZuYW1lKXsKCSBiTW9udGg9ZmJNb250aDsgYkRheT1mYkRheTsgIGJZZWFyPWZiWWVhcjsgIAoJIGVNb250aD1mZU1vbnRoOyBlRGF5PWZlRGF5OyAgZVllYXI9ZmVZZWFyOyAKCSBjb3N0PWZjb3N0OwoJIGlkPWZpZDsgCgkgbmFtZT1mbmFtZTsKfTsKCgoKCmludCBtYWluKCkKewoJc2V0bG9jYWxlKExDX0NUWVBFLCJSdXNzaWFuIik7CiAgY2xpZW50ICpwWzEwMF07IGZvcihpbnQgaT0wOyBpPDEwMDsgaSsrKSAqcD1OVUxMOyAgCgljbGllbnQ6OmNoYW5nZU4oMCk7CiAgaW50IGNsaWVudF90eXBlLCB0X2lkLCB0X2Ftb3VudCwgdF9jb3N0LCB0X2JNb250aCwgdF9iRGF5LCB0X2JZZWFyLCB0X2VNb250aCwgdF9lRGF5LCB0X2VZZWFyOwogIHN0cmluZyBzOwogIHN0cmluZyB0X25hbWU7CiAgCiAgaWZzdHJlYW0gaW5maWxlKCJjbGllbnRzLnR4dCIpOwogIHdoaWxlKCFpbmZpbGUuZW9mKCkpewogICAgcz0iICI7CiAgICB0X25hbWU9IiAiOwogICAgY2xpZW50X3R5cGU9dF9pZD10X2Ftb3VudD10X2Nvc3Q9dF9iTW9udGg9dF9iRGF5PXRfYlllYXI9dF9lTW9udGg9dF9lRGF5PXRfZVllYXI9MDsKICAgIGluZmlsZT4+dF9uYW1lOyB0X25hbWUrPSIgIjsKICAgIGluZmlsZT4+czsgdF9uYW1lKz1zOyB0X25hbWUrPSIgIjsKICAgIGluZmlsZT4+czsgdF9uYW1lKz1zOwoJICBpbmZpbGU+PnRfYkRheTsgaW5maWxlPj50X2JNb250aDsgaW5maWxlPj50X2JZZWFyOwogICAgaW5maWxlPj50X2VEYXk7IGluZmlsZT4+dF9lTW9udGg7IGluZmlsZT4+dF9lWWVhcjsKICAgIGluZmlsZT4+dF9jb3N0OyBpbmZpbGU+PmNsaWVudF90eXBlOwoKCSAgc3dpdGNoKGNsaWVudF90eXBlKXsKICAgCSAgY2FzZSAxOiBwW2NsaWVudDo6Z2V0TigpXT1uZXcgYWR1bHQodF9iTW9udGgsdF9iRGF5LHRfYlllYXIsdF9lTW9udGgsdF9lRGF5LHRfZVllYXIsdF9jb3N0LCBjbGllbnQ6OmdldE4oKSwgdF9uYW1lKTsKCQkgICAgICBicmVhazsKICAJICBjYXNlIDI6IHBbY2xpZW50OjpnZXROKCldPW5ldyB1bmRlcmFnZSh0X2JNb250aCx0X2JEYXksdF9iWWVhcix0X2VNb250aCx0X2VEYXksdF9lWWVhcix0X2Nvc3QsIGNsaWVudDo6Z2V0TigpLCB0X25hbWUpOwoJCSAgICAgIGJyZWFrOwogICAgICBjYXNlIDM6IHBbY2xpZW50OjpnZXROKCldPW5ldyBwZW5zaW9uZXIodF9iTW9udGgsdF9iRGF5LHRfYlllYXIsdF9lTW9udGgsdF9lRGF5LHRfZVllYXIsdF9jb3N0LCBjbGllbnQ6OmdldE4oKSwgdF9uYW1lKTsKCQkgICAgICBicmVhazsKICAJICBkZWZhdWx0OiBjb3V0PDwiRVJST1IiOwogICAgfQogICAgY2xpZW50OjpjaGFuZ2VOKGNsaWVudDo6Z2V0TigpKzEpOwogIH0KCWluZmlsZS5jbG9zZSgpOwoKCgoKCWludCBjaG9pY2U9MDsKCXdoaWxlKGNob2ljZSE9NSl7CgkJc3lzdGVtKCJjbHMiKTsKICAgIGNsaWVudDo6cHJpbnRUaXRsZSgpOwogICAgZm9yKGludCBpPTA7aTxjbGllbnQ6OmdldE4oKTtpKyspIHBbaV0tPnByaW50QWxsKCk7CgkJY291dDw8ZW5kbDw8IjEgLSDQuNC30LzQtdC90LjRgtGMLCAyIC0g0LTQvtCx0LDQstC40YLRjCwgMyAtINGD0LTQsNC70LjRgtGMLCA0IC0g0YHQvtGF0YDQsNC90LjRgtGMLCA1IC0g0LLRi9C50YLQuCI8PGVuZGw8PCLQktGL0LHQtdGA0LjRgtC1INC00LXQudGB0YLQstC40LU6IjsgY2luPj5jaG9pY2U7CgkJc3dpdGNoKGNob2ljZSl7CgoKCQkJLy/QktCr0JHQntCgINCa0JvQmNCV0KLQkC8vCgkJICBjYXNlIDE6IGludCBudW07CgkJCQkgICAgICBjb3V0PDwi0JLQstC10LTQuNGC0LUg0L3QvtC80LXRgCDQutC70LjQtdC90YLQsDoiOyBjaW4+Pm51bTsKCQkJCQkJCXsKCQkJCQkJCQlpbnQgY2hvaWNlPTA7CgkJCQkJCQkJd2hpbGUoY2hvaWNlIT01KXsKCQkJCQkJCQkJc3lzdGVtKCJjbHMiKTsKCQkJCQkJCQkJY2xpZW50OjpwcmludFRpdGxlKCk7CgkJCQkJCQkJCXBbbnVtXS0+cHJpbnRBbGwoKTsKCgkJCQkJCQkJCWNvdXQ8PGVuZGw8PCLQp9GC0L4g0YDQtdC00LDQutGC0LjRgNC+0LLQsNGC0Yw/Ijw8ZW5kbDw8IjEgLSDQpNCY0J4sIDIgLSDRg9C/0LvQsNGH0LXQvdC90LDRjyDRgdGD0LzQvNCwLCAzIC3RgdGD0LzQvNCwINGB0YLRgNCw0YXQvtCy0LrQuCwgNCAtINC/0LXRgNC40L7QtCwgNSAtINC90LjRh9C10LPQviI8PGVuZGw8PCLQktGL0LHQtdGA0LjRgtC1INC00LXQudGB0YLQstC40LU6IjsgY2luPj5jaG9pY2U7CgkJCQkJCQkJCXN3aXRjaChjaG9pY2UpewoJCQkJCQkJCQkJY2FzZSAxOiB7c3RyaW5nIG5ld05hbWU7CgkJCQkJCQkJCQkJCQkJY291dDw8ItCS0LLQtdC00LjRgtC1INC90L7QstGL0LUg0KTQmNCeINC60LvQuNC10L3RgtCwOiI7IGNpbj4+bmV3TmFtZTsgCgkJCQkJCQkJCQkJCQkJcFtudW1dLT5jaGFuZ2VOYW1lKG5ld05hbWUpO307CgkJCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQljYXNlIDI6IHtpbnQgbmV3Q29zdDsKCQkJCQkJCQkJCQkJCQljb3V0PDwi0JLQstC10LTQuNGC0LUg0L3QvtCy0YPRjiDRg9C/0LvQsNGH0LXQvdC90YPRjiDRgdGD0LzQvNGDOiI7IGNpbj4+bmV3Q29zdDsKCQkJCQkJCQkJCQkJCQlwW251bV0tPmNoYW5nZUNvc3QobmV3Q29zdCk7CgkJCQkJCQkJCQkJCQkJcFtudW1dLT5mQW1vdW50KCk7fTsKCQkJCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCWNhc2UgMzoge2ludCBuZXdBbW91bnQ7CgkJCQkJCQkJCQkJCQkJY291dDw8ItCS0LLQtdC00LjRgtC1INC90L7QstGD0Y4g0YHRg9C80LzRgyDRgdGC0YDQsNGF0L7QstC60Lg6IjsgY2luPj5uZXdBbW91bnQ7CgkJCQkJCQkJCQkJCQkJcFtudW1dLT5jaGFuZ2VBbW91bnQobmV3QW1vdW50KTt9OwoJCQkJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJY2FzZSA0OiBjb3V0PDwi0KfRgtC+INC40LzQtdC90L3QviDQuNC30LzQtdC90LjRgtGMPyI8PGVuZGw8PCIxIC0g0L3QsNGH0LDQu9C+INGB0YLRgNCw0YXQvtCy0LrQuCwgMi0g0LrQvtC90LXRhiDRgdGC0YDQsNGF0L7QstC60LgiOwoJCQkJCQkJCQkJCQkJCWludCBjaG9pY2U7CgkJCQkJCQkJCQkJCQkJY2luPj5jaG9pY2U7CgkJCQkJCQkJCQkJCQkJc3dpdGNoKGNob2ljZSl7CgkJCQkJCQkJCQkJCQkJCWNhc2UgMTppbnQgbmV3QkRheSwgbmV3Qk1vbnRoLCBuZXdCWWVhcjsKCQkJCQkJCQkJCQkJCQkJCQkJIGNvdXQ8PCLQktCy0LXQtNC40YLQtSDQvdC+0LLRi9C5INC00LXQvdGMINC90LDRh9Cw0LvQsCDRgdGC0YDQsNGF0L7QstC60Lg6IjsgY2luPj5uZXdCRGF5OwoJCQkJCQkJCQkJCQkJCQkJCQkgcFtudW1dLT5jaGFuZ2VCRGF5KG5ld0JEYXkpOwoJCQkJCQkJCQkJCQkJCQkJCQkgY291dDw8ItCS0LLQtdC00LjRgtC1INC90L7QstGL0Lkg0LzQtdGB0Y/RhiDQvdCw0YfQsNC70LAg0YHRgtGA0LDRhdC+0LLQutC4OiI7IGNpbj4+bmV3Qk1vbnRoOwoJCQkJCQkJCQkJCQkJCQkJCQkgcFtudW1dLT5jaGFuZ2VCTW9udGgobmV3Qk1vbnRoKTsKCQkJCQkJCQkJCQkJCQkJCQkJIGNvdXQ8PCLQktCy0LXQtNC40YLQtSDQvdC+0LLRi9C5INCz0L7QtCDQvdCw0YfQsNC70LAg0YHRgtGA0LDRhdC+0LLQutC4OiI7IGNpbj4+bmV3QlllYXI7CgkJCQkJCQkJCQkJCQkJCQkJCSBwW251bV0tPmNoYW5nZUJZZWFyKG5ld0JZZWFyKTsKCQkJCQkJCQkJCQkJCQkJCQkJIGJyZWFrOwkKCQkJCQkJCQkJCQkJCQkJY2FzZSAyOmludCBuZXdFRGF5LCBuZXdFTW9udGgsIG5ld0VZZWFyOwoJCQkJCQkJCQkJCQkJCQkJCQkgY291dDw8ItCS0LLQtdC00LjRgtC1INC90L7QstGL0Lkg0LTQtdC90Ywg0LrQvtC90YbQsCDRgdGC0YDQsNGF0L7QstC60Lg6IjsgY2luPj5uZXdFRGF5OwoJCQkJCQkJCQkJCQkJCQkJCQkgcFtudW1dLT5jaGFuZ2VFRGF5KG5ld0VEYXkpOwoJCQkJCQkJCQkJCQkJCQkJCQkgY291dDw8ItCS0LLQtdC00LjRgtC1INC90L7QstGL0Lkg0LzQtdGB0Y/RhiDQutC+0L3RhtCwINGB0YLRgNCw0YXQvtCy0LrQuDoiOyBjaW4+Pm5ld0VNb250aDsKCQkJCQkJCQkJCQkJCQkJCQkJIHBbbnVtXS0+Y2hhbmdlRU1vbnRoKG5ld0VNb250aCk7CgkJCQkJCQkJCQkJCQkJCQkJCSBjb3V0PDwi0JLQstC10LTQuNGC0LUg0L3QvtCy0YvQuSDQs9C+0LQg0LrQvtC90YbQsCDRgdGC0YDQsNGF0L7QstC60Lg6IjsgY2luPj5uZXdFWWVhcjsKCQkJCQkJCQkJCQkJCQkJCQkJIHBbbnVtXS0+Y2hhbmdlRVllYXIobmV3RVllYXIpOwoJCQkJCQkJCQkJCQkJCQkJCQkgYnJlYWs7CgkJCQkJCQkJCQkJCQkJCWRlZmF1bHQ6IGJyZWFrOwoJCQkJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCWNhc2UgNTogYnJlYWs7CgkJCQkJCQkJCQlkZWZhdWx0OmJyZWFrOwoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkgICAgICAgIGJyZWFrOwoKCgkJCS8v0JTQntCR0JDQktCb0JXQndCY0JUg0JrQm9CY0JXQndCi0JAvLwoJCQljYXNlIDI6ICAgY2xpZW50OjpjaGFuZ2VOKGNsaWVudDo6Z2V0TigpKzEpO3sKCQkJCQkJCQlpbnQgY2xpZW50X3R5cGU7CgkJCQkJCQkJc3RyaW5nIG5hbWU7CgkJCQkJCQkJaW50IGJEYXksIGJNb250aCxiWWVhciwKCQkJCQkJCQkJCWVEYXksIGVNb250aCxlWWVhcjsKCQkJCQkJCQlpbnQgY29zdDsKCQkJCQkJCQljb3V0PDwi0JLRi9Cx0LXRgNC40YLQtSDRgtC40L8g0LrQu9C40LXQvdGC0LAoMSAtINCy0LfRgNC+0YHQu9GL0LksIDIgLSDQvdC10YHQvtCy0LXRgNGI0LXQvdC90L7Qu9C10YLQvdC40LksIDMgLSDQv9C10L3RgdC40L7QvdC10YApOiI7CgkJCQkJCQkJY2luPj5jbGllbnRfdHlwZTsKCQkJCQkJCQljb3V0PDwi0JLQstC10LTQuNGC0LUg0KTQmNCeINC60LvQuNC10L3RgtCwOiI7IGNpbj4+bmFtZTsKCQkJCQkJCQljb3V0PDwi0JLQstC10LTQuNGC0LUg0LTQsNGC0YMg0L3QsNGH0LDQu9CwINGB0YLRgNCw0YXQvtCy0LrQuCjQsiDRhNC+0YDQvNCw0YLQtSDQtNC0LtC80Lwu0LPQs9Cz0LMpIjsKCQkJCQkJCQljaW4+PmJEYXk+PmJNb250aD4+YlllYXI7CgkJCQkJCQkJY291dDw8ItCS0LLQtdC00LjRgtC1INC00LDRgtGDINC60L7QvdGG0LAg0YHRgtGA0LDRhdC+0LLQutC4KNCyINGE0L7RgNC80LDRgtC1INC00LQu0LzQvC7Qs9Cz0LPQsykiOwoJCQkJCQkJCWNpbj4+ZURheT4+ZU1vbnRoPj5lWWVhcjsKCQkJCQkJCQljb3V0PDwi0JLQstC10LTQuNGC0LUg0YPQv9C70LDRh9C10L3QvdGD0Y4g0YHRg9C80LzRgzoiOyBjaW4+PmNvc3Q7CgkJCQkJCQkJc3dpdGNoKGNsaWVudF90eXBlKXsKCQkJCQkJCQkJY2FzZSAxOiBwW2NsaWVudDo6Z2V0TigpXT1uZXcgYWR1bHQoYk1vbnRoLGJEYXksYlllYXIsZU1vbnRoLGVEYXksZVllYXIsY29zdCwgY2xpZW50OjpnZXROKCksIG5hbWUpOwoJCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCWNhc2UgMjogcFtjbGllbnQ6OmdldE4oKV09bmV3IHVuZGVyYWdlKGJNb250aCxiRGF5LGJZZWFyLGVNb250aCxlRGF5LGVZZWFyLGNvc3QsIGNsaWVudDo6Z2V0TigpLCBuYW1lKTsKCQkJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQljYXNlIDM6IHBbY2xpZW50OjpnZXROKCldPW5ldyBwZW5zaW9uZXIoYk1vbnRoLGJEYXksYlllYXIsZU1vbnRoLGVEYXksZVllYXIsY29zdCwgY2xpZW50OjpnZXROKCksIG5hbWUpOwoJCQkJCQkJCQkJCQkJYnJlYWs7CiAgCQkJCQkJCQlkZWZhdWx0OiBicmVhazsKCQkJCQkJCQl9CgkJCQkJCQkJcFsxNV0tPnByaW50Q29zdCgpOwoJCQkgICAgICAgIH0KCQkJCQkJCWJyZWFrOwoKCgkJCWNhc2UgMzogLy9kZWxDbGllbnQoKTsKCQkJICAgICAgICBicmVhazsKCgoJCQljYXNlIDQ6IC8vc2F2ZSgpOwoJCQkgICAgICAgIGJyZWFrOwoKCgkJCWNhc2UgNTogYnJlYWs7CgkJfQoJfQoKCQoKICBnZXRjaCgpOwp9