#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//STRUCTS
struct Books{
int id;
char titulo[31];
char categoria[16];
int num_autores;
char nome_autores[3][100];
float exemplares_totais;
float exemplares_disponiveis;
};
typedef struct Books Livros;
//FIM-STRUCTS
//PROTOTIPOS
void Registrar_Livros(int Livros_Registar, Livros Biblioteca[500]);
void Operacao_Livros(int Numero_Operacoes, Livros Biblioteca[500], int Livros_Registrados);
void Consulta_Livros(int Numero_Consultas, Livros Biblioteca[500], int Livros_Registrados);
void Organizar_Alfabetico(char VetorMsmTitulo[500][31], int TamVetor);
//FIM-PROTITIPOS
//FUNÇÕES
void Registrar_Livros(int Livros_Registar, Livros Biblioteca[500]){
int i, j;
for(i = 0; i < Livros_Registar; i++){
scanf("%i", &Biblioteca
[i
].
id); scanf("%s", Biblioteca
[i
].
titulo); scanf("%s", Biblioteca
[i
].
categoria); scanf("%i", &Biblioteca
[i
].
num_autores); for(j = 0; j<Biblioteca[i].num_autores; j++)
scanf("%s", Biblioteca
[i
].
nome_autores[j
]); scanf("%f", &Biblioteca
[i
].
exemplares_totais); Biblioteca[i].exemplares_disponiveis = Biblioteca[i].exemplares_totais;
}
}
void Operacao_Livros(int Numero_Operacoes, Livros Biblioteca[500], int Livros_Registrados){
char Operacao[20];
int i2, j2;
int Id_Ope;
for(j2 = 0; j2 < Numero_Operacoes; j2++){
if(strcmp(Operacao
, "EMPRESTAR") == 0){ i2 = 0;
while(i2 < Livros_Registrados){
if(Biblioteca[i2].id == Id_Ope && Biblioteca[i2].exemplares_disponiveis != 0){
Biblioteca[i2].exemplares_disponiveis = Biblioteca[i2].exemplares_disponiveis - 1;
i2 = Livros_Registrados;
}
else
i2++;
}
}
else if(strcmp(Operacao
, "DEVOLVER") == 0){ i2 = 0;
while(i2 < Livros_Registrados){
if(Biblioteca[i2].id == Id_Ope && Biblioteca[i2].exemplares_disponiveis != Biblioteca[i2].exemplares_totais){
Biblioteca[i2].exemplares_disponiveis = Biblioteca[i2].exemplares_disponiveis + 1;
i2 = Livros_Registrados;
}
else
i2++;
}
}
}
}
void Consulta_Livros(int Numero_Consultas, Livros Biblioteca[500], int Livros_Registrados){
int i3, i4, i5, i6, ContarTamVetorTitulos, flag, Id_Cons, flag2;
float Porcentagem_Disp;
char Tipo_Cons[50], Categoria_Cons[20], Autor_Cons[100];
char VetorMsmTitulo[500][31], TodosAutores[300];
for(i3 = 0; i3<Numero_Consultas; i3++){
//AQUI SÃO OS TIPOS DE CONSULTAS
if(strcmp(Tipo_Cons
, "DISPONIVEL") == 0){//CONSULTA DISPONÍVEL ContarTamVetorTitulos = 0;
scanf("%s", Categoria_Cons
); for(i4 = 0; i4 < Livros_Registrados; i4++){
if(strcmp(Biblioteca
[i4
].
categoria, Categoria_Cons
) == 0) ++ContarTamVetorTitulos;
}
i6 = i4 = flag2 = 0;
for(i4 = 0; i4 < Livros_Registrados; i4++){
if(ContarTamVetorTitulos
== 1 && strcmp(Biblioteca
[i4
].
categoria, Categoria_Cons
) == 0){ printf("Categoria: %s\n- %s (%i): %.0f/%.0f exemplares", Categoria_Cons
, Biblioteca
[i4
].
titulo, Biblioteca
[i4
].
id, Biblioteca
[i4
].
exemplares_disponiveis, Biblioteca
[i4
].
exemplares_totais); i4 = Livros_Registrados;
flag2 = 1;
}
else if(strcmp(Biblioteca
[i4
].
categoria, Categoria_Cons
) == 0 && ContarTamVetorTitulos
> 1){ strcpy(VetorMsmTitulo
[i6
], Biblioteca
[i4
].
titulo); i6++;
}
}
Organizar_Alfabetico(VetorMsmTitulo, ContarTamVetorTitulos);
i6 = flag = i4 = 0;
for(i4 = 0; i4 < Livros_Registrados; i4++){//ESTE FOR SÓ SERÁ ACESSADO SE VETOR_MSMS_TITULOS TIVER PREENCHIDO
if(strcmp(Biblioteca
[i4
].
titulo, VetorMsmTitulo
[i6
]) == 0 && flag
== 0 && flag2
== 0){ printf("Categoria: %s\n- %s (%i): %.0f/%.0f exemplares", Categoria_Cons
, Biblioteca
[i4
].
titulo, Biblioteca
[i4
].
id, Biblioteca
[i4
].
exemplares_disponiveis, Biblioteca
[i4
].
exemplares_totais); i6++;
flag = 1;
i4 = -1;
}
else if(strcmp(Biblioteca
[i4
].
titulo, VetorMsmTitulo
[i6
]) == 0 && flag
> 0 && flag2
== 0){ printf("\n- %s (%i): %.0f/%.0f exemplares", Biblioteca
[i4
].
titulo, Biblioteca
[i4
].
id, Biblioteca
[i4
].
exemplares_disponiveis, Biblioteca
[i4
].
exemplares_totais); i6++;
i4 = -1;
}
}
if(i3 < Numero_Consultas - 1)
}
else if(strcmp(Tipo_Cons
, "AUTOR") == 0){//CONSULTA AUTORES ContarTamVetorTitulos = 0;
for(i4 = 0; i4 < Livros_Registrados; i4++){
for(i5 = 0; i5 < Biblioteca[i4].num_autores; i5++){
if(strcmp(Biblioteca
[i4
].
nome_autores[i5
], Autor_Cons
) == 0) ++ContarTamVetorTitulos;
}
}
i6 = i4 = flag2 = 0;
for(i4 = 0; i4 < Livros_Registrados; i4++){
for (i5 = 0; i5 < Biblioteca[i4].num_autores; i5++){
if (ContarTamVetorTitulos
== 1 && strcmp(Biblioteca
[i4
].
nome_autores[i5
], Autor_Cons
) == 0){ printf("Autor: %s\n- %s (%s): %.0f/%.0f exemplares", Autor_Cons
, Biblioteca
[i4
].
titulo, Biblioteca
[i4
].
categoria, Biblioteca
[i4
].
exemplares_disponiveis, Biblioteca
[i4
].
exemplares_totais); i6++;
flag2 = 1;
}
else if (strcmp(Biblioteca
[i4
].
nome_autores[i5
], Autor_Cons
) == 0 && ContarTamVetorTitulos
> 1){ strcpy(VetorMsmTitulo
[i6
], Biblioteca
[i4
].
titulo); i6++;
}
}
}
Organizar_Alfabetico(VetorMsmTitulo, ContarTamVetorTitulos);
i6 = flag = i4 = 0;
for(i4 = 0; i4 < Livros_Registrados; i4++){//ESTE FOR SÓ SERÁ ACESSADO SE VETOR_MSMS_TITULOS TIVER PREENCHIDO
if(strcmp(Biblioteca
[i4
].
titulo, VetorMsmTitulo
[i6
]) == 0 && flag
== 0 && flag2
== 0){ printf("Autor: %s\n- %s (%s): %.0f/%.0f exemplares", Autor_Cons
, Biblioteca
[i4
].
titulo, Biblioteca
[i4
].
categoria, Biblioteca
[i4
].
exemplares_disponiveis, Biblioteca
[i4
].
exemplares_totais); i6++;
flag = 1;
i4 = -1;
}
else if(strcmp(Biblioteca
[i4
].
titulo, VetorMsmTitulo
[i6
]) == 0 && flag
> 0 && flag2
== 0){ printf("\n- %s (%s): %.0f/%.0f exemplares", Biblioteca
[i4
].
titulo, Biblioteca
[i4
].
categoria, Biblioteca
[i4
].
exemplares_disponiveis, Biblioteca
[i4
].
exemplares_totais); i6++;
i4 = -1;
}
}
if(i3 < Numero_Consultas - 1)
}
else if(strcmp(Tipo_Cons
, "STATUS") == 0){ for(i4 = 0; i4 < Livros_Registrados; i4++){
if(Biblioteca[i4].id == Id_Cons && Biblioteca[i4].num_autores == 1){
Porcentagem_Disp = (Biblioteca[i4].exemplares_disponiveis / Biblioteca[i4].exemplares_totais) * 100;
printf("Livro: %s\nCategoria: %s\nAutores: %s\nExemplares: %.0f/%.0f (%.0f%% disponibilidade)", Biblioteca
[i4
].
titulo, Biblioteca
[i4
].
categoria, Biblioteca
[i4
].
nome_autores, Biblioteca
[i4
].
exemplares_disponiveis, Biblioteca
[i4
].
exemplares_totais, Porcentagem_Disp
); }
else if(Biblioteca[i4].id == Id_Cons && Biblioteca[i4].num_autores > 1){
Porcentagem_Disp = (Biblioteca[i4].exemplares_disponiveis / Biblioteca[i4].exemplares_totais) * 100;
for(i5 = 0; i5 < Biblioteca[i4].num_autores; i5++){
if(i5 < Biblioteca[i4].num_autores - 1){
strcpy(TodosAutores
, Biblioteca
[i4
].
nome_autores[i5
]); }
else{
strcat(TodosAutores
, Biblioteca
[i4
].
nome_autores[i5
]); }
}
printf("Livro: %s\nCategoria: %s\nAutores: %s\nExemplares: %.0f/%.0f (%.0f%% disponibilidade)", Biblioteca
[i4
].
titulo, Biblioteca
[i4
].
categoria, TodosAutores
, Biblioteca
[i4
].
exemplares_disponiveis, Biblioteca
[i4
].
exemplares_totais, Porcentagem_Disp
); }
}
if(i3 < Numero_Consultas - 1)
}
}
}
void Organizar_Alfabetico(char VetorMsmTitulo[500][31], int TamVetor){
char Aux_Titulo[31];
int i, i2;
for(i = 0; i < TamVetor; i++){
for(i2 = 0; i2 < TamVetor-1; i2++){
if(strcmp(VetorMsmTitulo
[i2
], VetorMsmTitulo
[i2
+1]) > 0){ strcpy(Aux_Titulo
, VetorMsmTitulo
[i2
]); strcpy(VetorMsmTitulo
[i2
], VetorMsmTitulo
[i2
+1]); strcpy(VetorMsmTitulo
[i2
+1], Aux_Titulo
); }
}
}
}
//FIM-FUNÇÕES
int main(){
//VARS
int N, M, Q; //1 ≤ N ≤ 500, 1 ≤ M ≤ 1000, 1 ≤ Q ≤ 100
Livros Biblioteca[500];
//COD
Registrar_Livros(N, Biblioteca);
Operacao_Livros(M, Biblioteca, N);
Consulta_Livros(Q, Biblioteca, N);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKLy9TVFJVQ1RTCnN0cnVjdCBCb29rc3sKICAgIGludCBpZDsKICAgIGNoYXIgdGl0dWxvWzMxXTsKICAgIGNoYXIgY2F0ZWdvcmlhWzE2XTsKICAgIGludCBudW1fYXV0b3JlczsKICAgIGNoYXIgbm9tZV9hdXRvcmVzWzNdWzEwMF07CiAgICBmbG9hdCBleGVtcGxhcmVzX3RvdGFpczsKICAgIGZsb2F0IGV4ZW1wbGFyZXNfZGlzcG9uaXZlaXM7Cn07CnR5cGVkZWYgc3RydWN0IEJvb2tzIExpdnJvczsKLy9GSU0tU1RSVUNUUwoKLy9QUk9UT1RJUE9TCnZvaWQgUmVnaXN0cmFyX0xpdnJvcyhpbnQgTGl2cm9zX1JlZ2lzdGFyLCBMaXZyb3MgQmlibGlvdGVjYVs1MDBdKTsKdm9pZCBPcGVyYWNhb19MaXZyb3MoaW50IE51bWVyb19PcGVyYWNvZXMsIExpdnJvcyBCaWJsaW90ZWNhWzUwMF0sIGludCBMaXZyb3NfUmVnaXN0cmFkb3MpOwp2b2lkIENvbnN1bHRhX0xpdnJvcyhpbnQgTnVtZXJvX0NvbnN1bHRhcywgTGl2cm9zIEJpYmxpb3RlY2FbNTAwXSwgaW50IExpdnJvc19SZWdpc3RyYWRvcyk7CnZvaWQgT3JnYW5pemFyX0FsZmFiZXRpY28oY2hhciBWZXRvck1zbVRpdHVsb1s1MDBdWzMxXSwgaW50IFRhbVZldG9yKTsKLy9GSU0tUFJPVElUSVBPUwoKLy9GVU7Dh8OVRVMKdm9pZCBSZWdpc3RyYXJfTGl2cm9zKGludCBMaXZyb3NfUmVnaXN0YXIsIExpdnJvcyBCaWJsaW90ZWNhWzUwMF0pewogICAgaW50IGksIGo7CiAgICBmb3IoaSA9IDA7IGkgPCBMaXZyb3NfUmVnaXN0YXI7IGkrKyl7CiAgICAgICAgc2NhbmYoIiVpIiwgJkJpYmxpb3RlY2FbaV0uaWQpOwogICAgICAgIGdldGNoYXIoKTsKICAgICAgICBzY2FuZigiJXMiLCBCaWJsaW90ZWNhW2ldLnRpdHVsbyk7CiAgICAgICAgc2NhbmYoIiVzIiwgQmlibGlvdGVjYVtpXS5jYXRlZ29yaWEpOwogICAgICAgIGdldGNoYXIoKTsKICAgICAgICBzY2FuZigiJWkiLCAmQmlibGlvdGVjYVtpXS5udW1fYXV0b3Jlcyk7CiAgICAgICAgZ2V0Y2hhcigpOwogICAgICAgIGZvcihqID0gMDsgajxCaWJsaW90ZWNhW2ldLm51bV9hdXRvcmVzOyBqKyspCiAgICAgICAgICAgIHNjYW5mKCIlcyIsIEJpYmxpb3RlY2FbaV0ubm9tZV9hdXRvcmVzW2pdKTsKICAgICAgICBzY2FuZigiJWYiLCAmQmlibGlvdGVjYVtpXS5leGVtcGxhcmVzX3RvdGFpcyk7CiAgICAgICAgQmlibGlvdGVjYVtpXS5leGVtcGxhcmVzX2Rpc3Bvbml2ZWlzID0gQmlibGlvdGVjYVtpXS5leGVtcGxhcmVzX3RvdGFpczsKICAgIH0KfQp2b2lkIE9wZXJhY2FvX0xpdnJvcyhpbnQgTnVtZXJvX09wZXJhY29lcywgTGl2cm9zIEJpYmxpb3RlY2FbNTAwXSwgaW50IExpdnJvc19SZWdpc3RyYWRvcyl7CiAgICBjaGFyIE9wZXJhY2FvWzIwXTsKICAgIGludCBpMiwgajI7CiAgICBpbnQgSWRfT3BlOwogICAgZm9yKGoyID0gMDsgajIgPCBOdW1lcm9fT3BlcmFjb2VzOyBqMisrKXsKICAgICAgICBnZXRjaGFyKCk7CiAgICAgICAgc2NhbmYoIiVzIiwgT3BlcmFjYW8pOwogICAgICAgIGdldGNoYXIoKTsKICAgICAgICBzY2FuZigiJWkiLCAmSWRfT3BlKTsKICAgICAgICBpZihzdHJjbXAoT3BlcmFjYW8sICJFTVBSRVNUQVIiKSA9PSAwKXsKICAgICAgICAgICAgaTIgPSAwOwogICAgICAgICAgICB3aGlsZShpMiA8IExpdnJvc19SZWdpc3RyYWRvcyl7CiAgICAgICAgICAgICAgICBpZihCaWJsaW90ZWNhW2kyXS5pZCA9PSBJZF9PcGUgJiYgQmlibGlvdGVjYVtpMl0uZXhlbXBsYXJlc19kaXNwb25pdmVpcyAhPSAwKXsKICAgICAgICAgICAgICAgICAgICBCaWJsaW90ZWNhW2kyXS5leGVtcGxhcmVzX2Rpc3Bvbml2ZWlzID0gQmlibGlvdGVjYVtpMl0uZXhlbXBsYXJlc19kaXNwb25pdmVpcyAtIDE7CiAgICAgICAgICAgICAgICAgICAgaTIgPSBMaXZyb3NfUmVnaXN0cmFkb3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgaTIrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmKHN0cmNtcChPcGVyYWNhbywgIkRFVk9MVkVSIikgPT0gMCl7CiAgICAgICAgICAgIGkyID0gMDsKICAgICAgICAgICAgd2hpbGUoaTIgPCBMaXZyb3NfUmVnaXN0cmFkb3MpewogICAgICAgICAgICAgICAgaWYoQmlibGlvdGVjYVtpMl0uaWQgPT0gSWRfT3BlICYmIEJpYmxpb3RlY2FbaTJdLmV4ZW1wbGFyZXNfZGlzcG9uaXZlaXMgIT0gQmlibGlvdGVjYVtpMl0uZXhlbXBsYXJlc190b3RhaXMpewogICAgICAgICAgICAgICAgICAgIEJpYmxpb3RlY2FbaTJdLmV4ZW1wbGFyZXNfZGlzcG9uaXZlaXMgPSBCaWJsaW90ZWNhW2kyXS5leGVtcGxhcmVzX2Rpc3Bvbml2ZWlzICsgMTsKICAgICAgICAgICAgICAgICAgICBpMiA9IExpdnJvc19SZWdpc3RyYWRvczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBpMisrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZ2V0Y2hhcigpOwp9CnZvaWQgQ29uc3VsdGFfTGl2cm9zKGludCBOdW1lcm9fQ29uc3VsdGFzLCBMaXZyb3MgQmlibGlvdGVjYVs1MDBdLCBpbnQgTGl2cm9zX1JlZ2lzdHJhZG9zKXsKICAgIGludCBpMywgaTQsIGk1LCBpNiwgQ29udGFyVGFtVmV0b3JUaXR1bG9zLCBmbGFnLCBJZF9Db25zLCBmbGFnMjsKICAgIGZsb2F0IFBvcmNlbnRhZ2VtX0Rpc3A7CiAgICBjaGFyIFRpcG9fQ29uc1s1MF0sIENhdGVnb3JpYV9Db25zWzIwXSwgQXV0b3JfQ29uc1sxMDBdOwogICAgY2hhciBWZXRvck1zbVRpdHVsb1s1MDBdWzMxXSwgVG9kb3NBdXRvcmVzWzMwMF07CgogICAgZm9yKGkzID0gMDsgaTM8TnVtZXJvX0NvbnN1bHRhczsgaTMrKyl7CiAgICAgICAgc2NhbmYoIiVzIiwgVGlwb19Db25zKTsKCiAgICAgICAgLy9BUVVJIFPDg08gT1MgVElQT1MgREUgQ09OU1VMVEFTCiAgICAgICAgaWYoc3RyY21wKFRpcG9fQ29ucywgIkRJU1BPTklWRUwiKSA9PSAwKXsvL0NPTlNVTFRBIERJU1BPTsONVkVMCiAgICAgICAgICAgIENvbnRhclRhbVZldG9yVGl0dWxvcyA9IDA7CiAgICAgICAgICAgIHNjYW5mKCIlcyIsIENhdGVnb3JpYV9Db25zKTsKICAgICAgICAgICAgZm9yKGk0ID0gMDsgaTQgPCBMaXZyb3NfUmVnaXN0cmFkb3M7IGk0KyspewogICAgICAgICAgICAgICAgaWYoc3RyY21wKEJpYmxpb3RlY2FbaTRdLmNhdGVnb3JpYSwgQ2F0ZWdvcmlhX0NvbnMpID09IDApCiAgICAgICAgICAgICAgICAgICAgKytDb250YXJUYW1WZXRvclRpdHVsb3M7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGk2ID0gaTQgPSBmbGFnMiA9IDA7CiAgICAgICAgICAgIGZvcihpNCA9IDA7IGk0IDwgTGl2cm9zX1JlZ2lzdHJhZG9zOyBpNCsrKXsKICAgICAgICAgICAgICAgIGlmKENvbnRhclRhbVZldG9yVGl0dWxvcyA9PSAxICYmIHN0cmNtcChCaWJsaW90ZWNhW2k0XS5jYXRlZ29yaWEsIENhdGVnb3JpYV9Db25zKSA9PSAwKXsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIkNhdGVnb3JpYTogJXNcbi0gJXMgKCVpKTogJS4wZi8lLjBmIGV4ZW1wbGFyZXMiLCBDYXRlZ29yaWFfQ29ucywgQmlibGlvdGVjYVtpNF0udGl0dWxvLCBCaWJsaW90ZWNhW2k0XS5pZCwgQmlibGlvdGVjYVtpNF0uZXhlbXBsYXJlc19kaXNwb25pdmVpcywgQmlibGlvdGVjYVtpNF0uZXhlbXBsYXJlc190b3RhaXMpOwogICAgICAgICAgICAgICAgICAgIGk0ID0gTGl2cm9zX1JlZ2lzdHJhZG9zOwogICAgICAgICAgICAgICAgICAgIGZsYWcyID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYoc3RyY21wKEJpYmxpb3RlY2FbaTRdLmNhdGVnb3JpYSwgQ2F0ZWdvcmlhX0NvbnMpID09IDAgJiYgQ29udGFyVGFtVmV0b3JUaXR1bG9zID4gMSl7CiAgICAgICAgICAgICAgICAgICAgc3RyY3B5KFZldG9yTXNtVGl0dWxvW2k2XSwgQmlibGlvdGVjYVtpNF0udGl0dWxvKTsKICAgICAgICAgICAgICAgICAgICBpNisrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBPcmdhbml6YXJfQWxmYWJldGljbyhWZXRvck1zbVRpdHVsbywgQ29udGFyVGFtVmV0b3JUaXR1bG9zKTsKICAgICAgICAgICAgaTYgPSBmbGFnID0gaTQgPSAwOwogICAgICAgICAgICBmb3IoaTQgPSAwOyBpNCA8IExpdnJvc19SZWdpc3RyYWRvczsgaTQrKyl7Ly9FU1RFIEZPUiBTw5MgU0VSw4EgQUNFU1NBRE8gU0UgVkVUT1JfTVNNU19USVRVTE9TIFRJVkVSIFBSRUVOQ0hJRE8KICAgICAgICAgICAgICAgIGlmKHN0cmNtcChCaWJsaW90ZWNhW2k0XS50aXR1bG8sIFZldG9yTXNtVGl0dWxvW2k2XSkgPT0gMCAmJiBmbGFnID09IDAgJiYgZmxhZzIgPT0gMCl7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJDYXRlZ29yaWE6ICVzXG4tICVzICglaSk6ICUuMGYvJS4wZiBleGVtcGxhcmVzIiwgQ2F0ZWdvcmlhX0NvbnMsIEJpYmxpb3RlY2FbaTRdLnRpdHVsbywgQmlibGlvdGVjYVtpNF0uaWQsIEJpYmxpb3RlY2FbaTRdLmV4ZW1wbGFyZXNfZGlzcG9uaXZlaXMsIEJpYmxpb3RlY2FbaTRdLmV4ZW1wbGFyZXNfdG90YWlzKTsKICAgICAgICAgICAgICAgICAgICBpNisrOwogICAgICAgICAgICAgICAgICAgIGZsYWcgPSAxOwogICAgICAgICAgICAgICAgICAgIGk0ID0gLTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmKHN0cmNtcChCaWJsaW90ZWNhW2k0XS50aXR1bG8sIFZldG9yTXNtVGl0dWxvW2k2XSkgPT0gMCAmJiBmbGFnID4gMCAmJiBmbGFnMiA9PSAwKXsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuLSAlcyAoJWkpOiAlLjBmLyUuMGYgZXhlbXBsYXJlcyIsIEJpYmxpb3RlY2FbaTRdLnRpdHVsbywgQmlibGlvdGVjYVtpNF0uaWQsIEJpYmxpb3RlY2FbaTRdLmV4ZW1wbGFyZXNfZGlzcG9uaXZlaXMsIEJpYmxpb3RlY2FbaTRdLmV4ZW1wbGFyZXNfdG90YWlzKTsKICAgICAgICAgICAgICAgICAgICBpNisrOwogICAgICAgICAgICAgICAgICAgIGk0ID0gLTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoaTMgPCBOdW1lcm9fQ29uc3VsdGFzIC0gMSkKICAgICAgICAgICAgICAgIHByaW50ZigiXG5cbiIpOwogICAgICAgIH0KCiAgICAgICAgZWxzZSBpZihzdHJjbXAoVGlwb19Db25zLCAiQVVUT1IiKSA9PSAwKXsvL0NPTlNVTFRBIEFVVE9SRVMKICAgICAgICAgICAgQ29udGFyVGFtVmV0b3JUaXR1bG9zID0gMDsKICAgICAgICAgICAgc2NhbmYoIiVzIiwgQXV0b3JfQ29ucyk7CiAgICAgICAgICAgIGZvcihpNCA9IDA7IGk0IDwgTGl2cm9zX1JlZ2lzdHJhZG9zOyBpNCsrKXsKICAgICAgICAgICAgICAgIGZvcihpNSA9IDA7IGk1IDwgQmlibGlvdGVjYVtpNF0ubnVtX2F1dG9yZXM7IGk1KyspewogICAgICAgICAgICAgICAgICAgIGlmKHN0cmNtcChCaWJsaW90ZWNhW2k0XS5ub21lX2F1dG9yZXNbaTVdLCBBdXRvcl9Db25zKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICArK0NvbnRhclRhbVZldG9yVGl0dWxvczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaTYgPSBpNCA9IGZsYWcyID0gMDsKICAgICAgICAgICAgZm9yKGk0ID0gMDsgaTQgPCBMaXZyb3NfUmVnaXN0cmFkb3M7IGk0KyspewogICAgICAgICAgICAgICAgZm9yIChpNSA9IDA7IGk1IDwgQmlibGlvdGVjYVtpNF0ubnVtX2F1dG9yZXM7IGk1KyspewogICAgICAgICAgICAgICAgICAgIGlmIChDb250YXJUYW1WZXRvclRpdHVsb3MgPT0gMSAmJiBzdHJjbXAoQmlibGlvdGVjYVtpNF0ubm9tZV9hdXRvcmVzW2k1XSwgQXV0b3JfQ29ucykgPT0gMCl7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQXV0b3I6ICVzXG4tICVzICglcyk6ICUuMGYvJS4wZiBleGVtcGxhcmVzIiwgQXV0b3JfQ29ucywgQmlibGlvdGVjYVtpNF0udGl0dWxvLCBCaWJsaW90ZWNhW2k0XS5jYXRlZ29yaWEsIEJpYmxpb3RlY2FbaTRdLmV4ZW1wbGFyZXNfZGlzcG9uaXZlaXMsIEJpYmxpb3RlY2FbaTRdLmV4ZW1wbGFyZXNfdG90YWlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgaTYrKzsKICAgICAgICAgICAgICAgICAgICAgICAgZmxhZzIgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoQmlibGlvdGVjYVtpNF0ubm9tZV9hdXRvcmVzW2k1XSwgQXV0b3JfQ29ucykgPT0gMCAmJiBDb250YXJUYW1WZXRvclRpdHVsb3MgPiAxKXsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KFZldG9yTXNtVGl0dWxvW2k2XSwgQmlibGlvdGVjYVtpNF0udGl0dWxvKTsKICAgICAgICAgICAgICAgICAgICAgICAgaTYrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE9yZ2FuaXphcl9BbGZhYmV0aWNvKFZldG9yTXNtVGl0dWxvLCBDb250YXJUYW1WZXRvclRpdHVsb3MpOwogICAgICAgICAgICBpNiA9IGZsYWcgPSBpNCA9IDA7CiAgICAgICAgICAgIGZvcihpNCA9IDA7IGk0IDwgTGl2cm9zX1JlZ2lzdHJhZG9zOyBpNCsrKXsvL0VTVEUgRk9SIFPDkyBTRVLDgSBBQ0VTU0FETyBTRSBWRVRPUl9NU01TX1RJVFVMT1MgVElWRVIgUFJFRU5DSElETwogICAgICAgICAgICAgICAgaWYoc3RyY21wKEJpYmxpb3RlY2FbaTRdLnRpdHVsbywgVmV0b3JNc21UaXR1bG9baTZdKSA9PSAwICYmIGZsYWcgPT0gMCAmJiBmbGFnMiA9PSAwKXsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIkF1dG9yOiAlc1xuLSAlcyAoJXMpOiAlLjBmLyUuMGYgZXhlbXBsYXJlcyIsIEF1dG9yX0NvbnMsIEJpYmxpb3RlY2FbaTRdLnRpdHVsbywgQmlibGlvdGVjYVtpNF0uY2F0ZWdvcmlhLCBCaWJsaW90ZWNhW2k0XS5leGVtcGxhcmVzX2Rpc3Bvbml2ZWlzLCBCaWJsaW90ZWNhW2k0XS5leGVtcGxhcmVzX3RvdGFpcyk7CiAgICAgICAgICAgICAgICAgICAgaTYrKzsKICAgICAgICAgICAgICAgICAgICBmbGFnID0gMTsKICAgICAgICAgICAgICAgICAgICBpNCA9IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZihzdHJjbXAoQmlibGlvdGVjYVtpNF0udGl0dWxvLCBWZXRvck1zbVRpdHVsb1tpNl0pID09IDAgJiYgZmxhZyA+IDAgJiYgZmxhZzIgPT0gMCl7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbi0gJXMgKCVzKTogJS4wZi8lLjBmIGV4ZW1wbGFyZXMiLCBCaWJsaW90ZWNhW2k0XS50aXR1bG8sIEJpYmxpb3RlY2FbaTRdLmNhdGVnb3JpYSwgQmlibGlvdGVjYVtpNF0uZXhlbXBsYXJlc19kaXNwb25pdmVpcywgQmlibGlvdGVjYVtpNF0uZXhlbXBsYXJlc190b3RhaXMpOwogICAgICAgICAgICAgICAgICAgIGk2Kys7CiAgICAgICAgICAgICAgICAgICAgaTQgPSAtMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZihpMyA8IE51bWVyb19Db25zdWx0YXMgLSAxKQogICAgICAgICAgICAgICAgcHJpbnRmKCJcblxuIik7CiAgICAgICAgfQoKICAgICAgICBlbHNlIGlmKHN0cmNtcChUaXBvX0NvbnMsICJTVEFUVVMiKSA9PSAwKXsKICAgICAgICAgICAgZ2V0Y2hhcigpOwogICAgICAgICAgICBzY2FuZigiJWkiLCAmSWRfQ29ucyk7CiAgICAgICAgICAgIGZvcihpNCA9IDA7IGk0IDwgTGl2cm9zX1JlZ2lzdHJhZG9zOyBpNCsrKXsKICAgICAgICAgICAgICAgIGlmKEJpYmxpb3RlY2FbaTRdLmlkID09IElkX0NvbnMgJiYgQmlibGlvdGVjYVtpNF0ubnVtX2F1dG9yZXMgPT0gMSl7CiAgICAgICAgICAgICAgICAgICAgUG9yY2VudGFnZW1fRGlzcCA9IChCaWJsaW90ZWNhW2k0XS5leGVtcGxhcmVzX2Rpc3Bvbml2ZWlzIC8gQmlibGlvdGVjYVtpNF0uZXhlbXBsYXJlc190b3RhaXMpICogMTAwOwogICAgICAgICAgICAgICAgICAgIHByaW50ZigiTGl2cm86ICVzXG5DYXRlZ29yaWE6ICVzXG5BdXRvcmVzOiAlc1xuRXhlbXBsYXJlczogJS4wZi8lLjBmICglLjBmJSUgZGlzcG9uaWJpbGlkYWRlKSIsIEJpYmxpb3RlY2FbaTRdLnRpdHVsbywgQmlibGlvdGVjYVtpNF0uY2F0ZWdvcmlhLCBCaWJsaW90ZWNhW2k0XS5ub21lX2F1dG9yZXMsIEJpYmxpb3RlY2FbaTRdLmV4ZW1wbGFyZXNfZGlzcG9uaXZlaXMsIEJpYmxpb3RlY2FbaTRdLmV4ZW1wbGFyZXNfdG90YWlzLCBQb3JjZW50YWdlbV9EaXNwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYoQmlibGlvdGVjYVtpNF0uaWQgPT0gSWRfQ29ucyAmJiBCaWJsaW90ZWNhW2k0XS5udW1fYXV0b3JlcyA+IDEpewogICAgICAgICAgICAgICAgICAgIFBvcmNlbnRhZ2VtX0Rpc3AgPSAoQmlibGlvdGVjYVtpNF0uZXhlbXBsYXJlc19kaXNwb25pdmVpcyAvIEJpYmxpb3RlY2FbaTRdLmV4ZW1wbGFyZXNfdG90YWlzKSAqIDEwMDsKICAgICAgICAgICAgICAgICAgICBmb3IoaTUgPSAwOyBpNSA8IEJpYmxpb3RlY2FbaTRdLm51bV9hdXRvcmVzOyBpNSsrKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaTUgPCBCaWJsaW90ZWNhW2k0XS5udW1fYXV0b3JlcyAtIDEpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KFRvZG9zQXV0b3JlcywgQmlibGlvdGVjYVtpNF0ubm9tZV9hdXRvcmVzW2k1XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjYXQoVG9kb3NBdXRvcmVzLCAiLCAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY2F0KFRvZG9zQXV0b3JlcywgQmlibGlvdGVjYVtpNF0ubm9tZV9hdXRvcmVzW2k1XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJMaXZybzogJXNcbkNhdGVnb3JpYTogJXNcbkF1dG9yZXM6ICVzXG5FeGVtcGxhcmVzOiAlLjBmLyUuMGYgKCUuMGYlJSBkaXNwb25pYmlsaWRhZGUpIiwgQmlibGlvdGVjYVtpNF0udGl0dWxvLCBCaWJsaW90ZWNhW2k0XS5jYXRlZ29yaWEsIFRvZG9zQXV0b3JlcywgQmlibGlvdGVjYVtpNF0uZXhlbXBsYXJlc19kaXNwb25pdmVpcywgQmlibGlvdGVjYVtpNF0uZXhlbXBsYXJlc190b3RhaXMsIFBvcmNlbnRhZ2VtX0Rpc3ApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKGkzIDwgTnVtZXJvX0NvbnN1bHRhcyAtIDEpCiAgICAgICAgICAgIHByaW50ZigiXG5cbiIpOwogICAgICAgIH0KICAgIH0KfQoKdm9pZCBPcmdhbml6YXJfQWxmYWJldGljbyhjaGFyIFZldG9yTXNtVGl0dWxvWzUwMF1bMzFdLCBpbnQgVGFtVmV0b3IpewogICAgY2hhciBBdXhfVGl0dWxvWzMxXTsKICAgIGludCBpLCBpMjsKICAgIAogICAgZm9yKGkgPSAwOyBpIDwgVGFtVmV0b3I7IGkrKyl7CiAgICAgICAgZm9yKGkyID0gMDsgaTIgPCBUYW1WZXRvci0xOyBpMisrKXsKICAgICAgICAgICAgaWYoc3RyY21wKFZldG9yTXNtVGl0dWxvW2kyXSwgVmV0b3JNc21UaXR1bG9baTIrMV0pID4gMCl7CiAgICAgICAgICAgICAgICBzdHJjcHkoQXV4X1RpdHVsbywgVmV0b3JNc21UaXR1bG9baTJdKTsKICAgICAgICAgICAgICAgIHN0cmNweShWZXRvck1zbVRpdHVsb1tpMl0sIFZldG9yTXNtVGl0dWxvW2kyKzFdKTsKICAgICAgICAgICAgICAgIHN0cmNweShWZXRvck1zbVRpdHVsb1tpMisxXSwgQXV4X1RpdHVsbyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KLy9GSU0tRlVOw4fDlUVTCgppbnQgbWFpbigpewogICAgLy9WQVJTCiAgICBpbnQgTiwgTSwgUTsgLy8xIOKJpCBOIOKJpCA1MDAsIDEg4omkIE0g4omkIDEwMDAsIDEg4omkIFEg4omkIDEwMAogICAgTGl2cm9zIEJpYmxpb3RlY2FbNTAwXTsKCiAgICAvL0NPRAogICAgc2NhbmYoIiVpIiwgJk4pOwogICAgc2NhbmYoIiVpIiwgJk0pOwogICAgc2NhbmYoIiVpIiwgJlEpOwogICAgUmVnaXN0cmFyX0xpdnJvcyhOLCBCaWJsaW90ZWNhKTsKICAgIE9wZXJhY2FvX0xpdnJvcyhNLCBCaWJsaW90ZWNhLCBOKTsKICAgIENvbnN1bHRhX0xpdnJvcyhRLCBCaWJsaW90ZWNhLCBOKTsKCiAgICByZXR1cm4gMDsKfQ==