#define _CRT_SECURE_NO_DEPRECATE
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <conio.h>
using namespace std;
const int n = 4000;
const int B = 256;
struct record2 {
char a[30];
union {
unsigned short int b;
unsigned char Digit[2];
};
char c[10];
char d[22];
};
struct Vertex {
record2 *Data;
int Bal;
Vertex *left;
Vertex *right;
};
bool Rost;
bool Decrease;
struct list {
list *next;
record2 *Data;
};
typedef struct queue {
list *head;
list *tail;
};
void PrintList(list *p) {
int i = 1;
char c = 'y';
while (c == 'y') {
for (int j = 0; j < 20; j++) {
printf("%d %s %d %s %s \n", i
, p
->Data
->a
, p
->Data
->b
, p
->Data
->c
, p
->Data
->d
); p = p->next;
i++;
}
c = '0';
while ((c != 'y') && (c != 'n')) {
c = '0';
printf("\n\nPrint next 20 records? y/n\n"); if ((c
!= 'y') && (c
!= 'n')) printf("Invalid input\n"); }
}
if (c == 'n') {
do {
while ((_kbhit() != 1) && (p != NULL)) {
printf("%d %s %d %s %s \n", i
, p
->Data
->a
, p
->Data
->b
, p
->Data
->c
, p
->Data
->d
); p = p->next;
i++;
}
} while (p != NULL);
}
}
void DigitalSort2(list *&head) {
queue Q[257];
for (int i = 0; i < 257; i++) {
Q[i].tail = (list *) &(Q[i].head);
}
list *p;
for (int j = 30; j >= 0; j--) {
for (int i = 0; i < 256; i++) {
Q[i].tail = Q[i].head = NULL;
}
while (head) {
int d;
d = head->Data->a[j] + 129;
p = Q[d].tail;
if (Q[d].head == NULL) {
Q[d].head = head;
} else {
p->next = head;
}
p = Q[d].tail = head;
head = head->next;
p->next = NULL;
}
head = NULL;
int i;
for (i = 0; i < 256; i++) {
if (Q[i].head != NULL) {
break;
}
}
head = Q[i].head;
p = Q[i].tail;
for (int k = i + 1; k < 256; k++) {
if (Q[k].head != NULL) {
p->next = Q[k].head;
p = Q[k].tail;
}
}
}
}
void deleteList(list *head) {
do {
list *q;
q = head;
head = q->next;
delete (q);
} while (head != NULL);
}
void DigitalSort(queue *S, int L) {
queue Q[B];
list *p;
for (int j = 0; j < L; j++) {
for (int i = 0; i < B; i++) Q[i].tail = (list *) &Q[i].head;
p = S->head;
while (p) {
int d = p->Data->Digit[j];
Q[d].tail->next = p;
Q[d].tail = p;
p = p->next;
}
p = (list *) &S->head;
for (int i = 0; i < B; i++) {
if (Q[i].tail != (list *) &Q[i].head) {
p->next = Q[i].head;
p = Q[i].tail;
}
}
p->next = NULL;
}
}
void RL(Vertex *&p, Vertex *&r, Vertex *&q) {
q = p->right;//RL
r = q->left;
if (r->Bal < 0) p->Bal = 1;
else p->Bal = 0;
if (r->Bal > 0) q->Bal = -1;
else {
q->Bal = 0;
r->Bal = 0;
q->left = r->right;
p->right = r->left;
r->right = q;
r->left = p;
p = r;
Rost = false;
}
}
void RR(Vertex *&p, Vertex *&r, Vertex *&q) {
q = p->right;//RR
p->Bal = 0;
q->Bal = 0;
p->right = q->left;
q->left = p;
p = q;
Rost = false;
}
void LR(Vertex *&p, Vertex *&r, Vertex *&q) {
q = p->left;//LR
r = q->right;
if (r->Bal < 0) p->Bal = 1;
else p->Bal = 0;
if (r->Bal > 0) q->Bal = -1;
else {
q->Bal = 0;
r->Bal = 0;
q->right = r->left;
p->left = r->right;
r->left = q;
r->right = p;
p = r;
Rost = false;
}
}
void LL(Vertex *&p, Vertex *&r, Vertex *&q) {
q = p->left;//LL
p->Bal = 0;
q->Bal = 0;
p->left = q->right;
q->right = p;
p = q;
Rost = false;
}
Vertex *AVL(list *k, Vertex *&p) {
Vertex *q = NULL, *r = NULL;
if (p == NULL) {
p = new Vertex;
p->Data = (k->Data);
p->left = p->right = NULL;
p->Bal = 0;
Rost = true;
} else if (p->Data->d > k->Data->d) {
AVL(k, p->left);
if (Rost) {
if (p->Bal > 0) {
p->Bal = 0;
Rost = false;
} else if (p->Bal == 0) {
p->Bal = -1;
Rost = true;
} else if (p->left->Bal < 0)
LL(p, r, q);
else LR(p, r, q);
}
} else if (p->Data->d < k->Data->d) {
AVL(k, p->right);
if (Rost) {
if (p->Bal < 0) {
p->Bal = 0;
Rost = false;
} else if (p->Bal == 0) {
p->Bal = 1;
Rost = true;
} else if (p->right->Bal > 0) RR(p, r, q);
else
RL(p, r, q);
}
} else return p;
}
void obhod(Vertex *p) {
if (p != NULL) {
obhod(p->left);
cout<<" "<<p->Data->d;
obhod(p->right);
}
}
int main() {
FILE *input;
queue q;
Vertex *root = NULL;
input
= fopen("testBase3.dat", "rb"); record2 *mas2;
mas2 = new record2[n];
int i = 0;
list *head, *p, *r;
q.head = p = new list;
p->Data = new record2;
fread((record2
*) p
->Data
, sizeof(record2
), 1, input
);
for (i = 1; i < n; i++) {
p = p->next = new list;
p->Data = new record2;
fread((record2
*) p
->Data
, sizeof(record2
), 1, input
); }
p->next = NULL;
q.tail = p;
int *key = new int[3];
/*for (i = 0; i < 3; i++) {
char my_key = 0;
scanf("%c", &my_key);
key[i]=(int)my_key;
}*/
DigitalSort(&q, 2);
DigitalSort2(q.head);
// PrintList(q.head);
r=q.head;
i=0;
while(i<1000)
{
i++;
AVL(r,root);
r=r->next;
}
obhod(root);
delete (mas2);
deleteList(q.head);
return 0;
}
I2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKCiNpbmNsdWRlIDxjc3RyaW5nPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y29uaW8uaD4KCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjb25zdCBpbnQgbiA9IDQwMDA7CmNvbnN0IGludCBCID0gMjU2OwpzdHJ1Y3QgcmVjb3JkMiB7CiAgICBjaGFyIGFbMzBdOwogICAgdW5pb24gewogICAgICAgIHVuc2lnbmVkIHNob3J0IGludCBiOwogICAgICAgIHVuc2lnbmVkIGNoYXIgRGlnaXRbMl07CiAgICB9OwoKICAgIGNoYXIgY1sxMF07CiAgICBjaGFyIGRbMjJdOwp9OwoKc3RydWN0IFZlcnRleCB7CiAgICByZWNvcmQyICpEYXRhOwogICAgaW50IEJhbDsKICAgIFZlcnRleCAqbGVmdDsKICAgIFZlcnRleCAqcmlnaHQ7Cn07CmJvb2wgUm9zdDsKYm9vbCBEZWNyZWFzZTsKCgoKc3RydWN0IGxpc3QgewogICAgbGlzdCAqbmV4dDsKICAgIHJlY29yZDIgKkRhdGE7Cn07Cgp0eXBlZGVmIHN0cnVjdCBxdWV1ZSB7CiAgICBsaXN0ICpoZWFkOwogICAgbGlzdCAqdGFpbDsKfTsKCnZvaWQgUHJpbnRMaXN0KGxpc3QgKnApIHsKICAgIGludCBpID0gMTsKICAgIGNoYXIgYyA9ICd5JzsKCiAgICB3aGlsZSAoYyA9PSAneScpIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDIwOyBqKyspIHsKICAgICAgICAgICAgcHJpbnRmKCIlZCAlcyAlZCAlcyAlcyBcbiIsIGksIHAtPkRhdGEtPmEsIHAtPkRhdGEtPmIsIHAtPkRhdGEtPmMsIHAtPkRhdGEtPmQpOwogICAgICAgICAgICBwID0gcC0+bmV4dDsKICAgICAgICAgICAgaSsrOwogICAgICAgIH0KCiAgICAgICAgYyA9ICcwJzsKICAgICAgICB3aGlsZSAoKGMgIT0gJ3knKSAmJiAoYyAhPSAnbicpKSB7CiAgICAgICAgICAgIGMgPSAnMCc7CiAgICAgICAgICAgIHByaW50ZigiXG5cblByaW50IG5leHQgMjAgcmVjb3Jkcz8geS9uXG4iKTsKICAgICAgICAgICAgc2NhbmYoIiVzIiwgJmMpOwogICAgICAgICAgICBpZiAoKGMgIT0gJ3knKSAmJiAoYyAhPSAnbicpKSBwcmludGYoIkludmFsaWQgaW5wdXRcbiIpOwogICAgICAgIH0KCiAgICB9CgoKICAgIGlmIChjID09ICduJykgewogICAgICAgIGRvIHsKICAgICAgICAgICAgd2hpbGUgKChfa2JoaXQoKSAhPSAxKSAmJiAocCAhPSBOVUxMKSkgewogICAgICAgICAgICAgICAgcHJpbnRmKCIlZCAlcyAlZCAlcyAlcyBcbiIsIGksIHAtPkRhdGEtPmEsIHAtPkRhdGEtPmIsIHAtPkRhdGEtPmMsIHAtPkRhdGEtPmQpOwogICAgICAgICAgICAgICAgcCA9IHAtPm5leHQ7CiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3lzdGVtKCJQQVVTRSIpOwogICAgICAgIH0gd2hpbGUgKHAgIT0gTlVMTCk7CiAgICB9CgoKfQoKCnZvaWQgRGlnaXRhbFNvcnQyKGxpc3QgKiZoZWFkKSB7CgogICAgcXVldWUgUVsyNTddOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU3OyBpKyspIHsKICAgICAgICBRW2ldLnRhaWwgPSAobGlzdCAqKSAmKFFbaV0uaGVhZCk7CiAgICB9CgogICAgbGlzdCAqcDsKCgogICAgZm9yIChpbnQgaiA9IDMwOyBqID49IDA7IGotLSkgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKICAgICAgICAgICAgUVtpXS50YWlsID0gUVtpXS5oZWFkID0gTlVMTDsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKGhlYWQpIHsKICAgICAgICAgICAgaW50IGQ7CiAgICAgICAgICAgIGQgPSBoZWFkLT5EYXRhLT5hW2pdICsgMTI5OwogICAgICAgICAgICBwID0gUVtkXS50YWlsOwogICAgICAgICAgICBpZiAoUVtkXS5oZWFkID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIFFbZF0uaGVhZCA9IGhlYWQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwLT5uZXh0ID0gaGVhZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBwID0gUVtkXS50YWlsID0gaGVhZDsKICAgICAgICAgICAgaGVhZCA9IGhlYWQtPm5leHQ7CiAgICAgICAgICAgIHAtPm5leHQgPSBOVUxMOwogICAgICAgIH0KICAgICAgICBoZWFkID0gTlVMTDsKICAgICAgICBpbnQgaTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKICAgICAgICAgICAgaWYgKFFbaV0uaGVhZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBoZWFkID0gUVtpXS5oZWFkOwogICAgICAgIHAgPSBRW2ldLnRhaWw7CiAgICAgICAgZm9yIChpbnQgayA9IGkgKyAxOyBrIDwgMjU2OyBrKyspIHsKICAgICAgICAgICAgaWYgKFFba10uaGVhZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwLT5uZXh0ID0gUVtrXS5oZWFkOwogICAgICAgICAgICAgICAgcCA9IFFba10udGFpbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKdm9pZCBkZWxldGVMaXN0KGxpc3QgKmhlYWQpIHsKICAgIGRvIHsKICAgICAgICBsaXN0ICpxOwogICAgICAgIHEgPSBoZWFkOwogICAgICAgIGhlYWQgPSBxLT5uZXh0OwogICAgICAgIGRlbGV0ZSAocSk7CiAgICB9IHdoaWxlIChoZWFkICE9IE5VTEwpOwoKfQoKCnZvaWQgRGlnaXRhbFNvcnQocXVldWUgKlMsIGludCBMKSB7CiAgICBxdWV1ZSBRW0JdOwogICAgbGlzdCAqcDsKCiAgICBmb3IgKGludCBqID0gMDsgaiA8IEw7IGorKykgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQjsgaSsrKSBRW2ldLnRhaWwgPSAobGlzdCAqKSAmUVtpXS5oZWFkOwogICAgICAgIHAgPSBTLT5oZWFkOwogICAgICAgIHdoaWxlIChwKSB7CiAgICAgICAgICAgIGludCBkID0gcC0+RGF0YS0+RGlnaXRbal07CiAgICAgICAgICAgIFFbZF0udGFpbC0+bmV4dCA9IHA7CiAgICAgICAgICAgIFFbZF0udGFpbCA9IHA7CiAgICAgICAgICAgIHAgPSBwLT5uZXh0OwogICAgICAgIH0KICAgICAgICBwID0gKGxpc3QgKikgJlMtPmhlYWQ7CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChRW2ldLnRhaWwgIT0gKGxpc3QgKikgJlFbaV0uaGVhZCkgewogICAgICAgICAgICAgICAgcC0+bmV4dCA9IFFbaV0uaGVhZDsKICAgICAgICAgICAgICAgIHAgPSBRW2ldLnRhaWw7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHAtPm5leHQgPSBOVUxMOwogICAgfQp9Cgp2b2lkIFJMKFZlcnRleCAqJnAsIFZlcnRleCAqJnIsIFZlcnRleCAqJnEpIHsKCiAgICBxID0gcC0+cmlnaHQ7Ly9STAogICAgciA9IHEtPmxlZnQ7CiAgICBpZiAoci0+QmFsIDwgMCkgcC0+QmFsID0gMTsKICAgIGVsc2UgcC0+QmFsID0gMDsKICAgIGlmIChyLT5CYWwgPiAwKSBxLT5CYWwgPSAtMTsKICAgIGVsc2UgewogICAgICAgIHEtPkJhbCA9IDA7CiAgICAgICAgci0+QmFsID0gMDsKICAgICAgICBxLT5sZWZ0ID0gci0+cmlnaHQ7CiAgICAgICAgcC0+cmlnaHQgPSByLT5sZWZ0OwogICAgICAgIHItPnJpZ2h0ID0gcTsKICAgICAgICByLT5sZWZ0ID0gcDsKICAgICAgICBwID0gcjsKICAgICAgICBSb3N0ID0gZmFsc2U7CiAgICB9Cn0KCgp2b2lkIFJSKFZlcnRleCAqJnAsIFZlcnRleCAqJnIsIFZlcnRleCAqJnEpIHsKICAgIHEgPSBwLT5yaWdodDsvL1JSCiAgICBwLT5CYWwgPSAwOwogICAgcS0+QmFsID0gMDsKICAgIHAtPnJpZ2h0ID0gcS0+bGVmdDsKICAgIHEtPmxlZnQgPSBwOwogICAgcCA9IHE7CiAgICBSb3N0ID0gZmFsc2U7Cn0KCnZvaWQgTFIoVmVydGV4IComcCwgVmVydGV4IComciwgVmVydGV4IComcSkgewogICAgcSA9IHAtPmxlZnQ7Ly9MUgogICAgciA9IHEtPnJpZ2h0OwogICAgaWYgKHItPkJhbCA8IDApIHAtPkJhbCA9IDE7CiAgICBlbHNlIHAtPkJhbCA9IDA7CiAgICBpZiAoci0+QmFsID4gMCkgcS0+QmFsID0gLTE7CiAgICBlbHNlIHsKICAgICAgICBxLT5CYWwgPSAwOwogICAgICAgIHItPkJhbCA9IDA7CiAgICAgICAgcS0+cmlnaHQgPSByLT5sZWZ0OwogICAgICAgIHAtPmxlZnQgPSByLT5yaWdodDsKICAgICAgICByLT5sZWZ0ID0gcTsKICAgICAgICByLT5yaWdodCA9IHA7CiAgICAgICAgcCA9IHI7CiAgICAgICAgUm9zdCA9IGZhbHNlOwogICAgfQp9Cgp2b2lkIExMKFZlcnRleCAqJnAsIFZlcnRleCAqJnIsIFZlcnRleCAqJnEpIHsKICAgIHEgPSBwLT5sZWZ0Oy8vTEwKICAgIHAtPkJhbCA9IDA7CiAgICBxLT5CYWwgPSAwOwogICAgcC0+bGVmdCA9IHEtPnJpZ2h0OwogICAgcS0+cmlnaHQgPSBwOwogICAgcCA9IHE7CiAgICBSb3N0ID0gZmFsc2U7Cn0KClZlcnRleCAqQVZMKGxpc3QgKmssIFZlcnRleCAqJnApIHsKCiAgICAgICAgVmVydGV4ICpxID0gTlVMTCwgKnIgPSBOVUxMOwoKICAgICAgICBpZiAocCA9PSBOVUxMKSB7CiAgICAgICAgICAgIHAgPSBuZXcgVmVydGV4OwogICAgICAgICAgICBwLT5EYXRhID0gKGstPkRhdGEpOwogICAgICAgICAgICBwLT5sZWZ0ID0gcC0+cmlnaHQgPSBOVUxMOwogICAgICAgICAgICBwLT5CYWwgPSAwOwogICAgICAgICAgICBSb3N0ID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKHAtPkRhdGEtPmQgPiBrLT5EYXRhLT5kKSB7CiAgICAgICAgICAgIEFWTChrLCBwLT5sZWZ0KTsKICAgICAgICAgICAgaWYgKFJvc3QpIHsKICAgICAgICAgICAgICAgIGlmIChwLT5CYWwgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcC0+QmFsID0gMDsKICAgICAgICAgICAgICAgICAgICBSb3N0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHAtPkJhbCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcC0+QmFsID0gLTE7CiAgICAgICAgICAgICAgICAgICAgUm9zdCA9IHRydWU7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHAtPmxlZnQtPkJhbCA8IDApCiAgICAgICAgICAgICAgICAgICAgTEwocCwgciwgcSk7CiAgICAgICAgICAgICAgICBlbHNlIExSKHAsIHIsIHEpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChwLT5EYXRhLT5kIDwgay0+RGF0YS0+ZCkgewogICAgICAgICAgICBBVkwoaywgcC0+cmlnaHQpOwogICAgICAgICAgICBpZiAoUm9zdCkgewogICAgICAgICAgICAgICAgaWYgKHAtPkJhbCA8IDApIHsKICAgICAgICAgICAgICAgICAgICBwLT5CYWwgPSAwOwogICAgICAgICAgICAgICAgICAgIFJvc3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocC0+QmFsID09IDApIHsKICAgICAgICAgICAgICAgICAgICBwLT5CYWwgPSAxOwogICAgICAgICAgICAgICAgICAgIFJvc3QgPSB0cnVlOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwLT5yaWdodC0+QmFsID4gMCkgUlIocCwgciwgcSk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgUkwocCwgciwgcSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgcmV0dXJuIHA7CiAgICB9CgoKCnZvaWQgb2Job2QoVmVydGV4ICpwKSB7CiAgICBpZiAocCAhPSBOVUxMKSB7CiAgICAgICAgb2Job2QocC0+bGVmdCk7CiAgICAgICAgY291dDw8IiAiPDxwLT5EYXRhLT5kOwogICAgICAgIG9iaG9kKHAtPnJpZ2h0KTsKICAgIH0KfQoKCmludCBtYWluKCkgewoKICAgIEZJTEUgKmlucHV0OwogICAgcXVldWUgcTsKICAgIFZlcnRleCAqcm9vdCA9IE5VTEw7CiAgICBpbnB1dCA9IGZvcGVuKCJ0ZXN0QmFzZTMuZGF0IiwgInJiIik7CiAgICByZWNvcmQyICptYXMyOwogICAgbWFzMiA9IG5ldyByZWNvcmQyW25dOwogICAgaW50IGkgPSAwOwoKICAgIGxpc3QgKmhlYWQsICpwLCAqcjsKICAgIHEuaGVhZCA9IHAgPSBuZXcgbGlzdDsKCiAgICBwLT5EYXRhID0gbmV3IHJlY29yZDI7CiAgICBmcmVhZCgocmVjb3JkMiAqKSBwLT5EYXRhLCBzaXplb2YocmVjb3JkMiksIDEsIGlucHV0KTsKCiAgICBmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgcCA9IHAtPm5leHQgPSBuZXcgbGlzdDsKICAgICAgICBwLT5EYXRhID0gbmV3IHJlY29yZDI7CiAgICAgICAgZnJlYWQoKHJlY29yZDIgKikgcC0+RGF0YSwgc2l6ZW9mKHJlY29yZDIpLCAxLCBpbnB1dCk7CiAgICB9CiAgICBwLT5uZXh0ID0gTlVMTDsKICAgIHEudGFpbCA9IHA7CiAgICBpbnQgKmtleSA9IG5ldyBpbnRbM107CiAgICAvKmZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICAgICBjaGFyIG15X2tleSA9IDA7CiAgICAgICAgc2NhbmYoIiVjIiwgJm15X2tleSk7CiAgICAgICAga2V5W2ldPShpbnQpbXlfa2V5OwogICAgfSovCgoKICAgIERpZ2l0YWxTb3J0KCZxLCAyKTsKICAgIERpZ2l0YWxTb3J0MihxLmhlYWQpOwogICAvLyBQcmludExpc3QocS5oZWFkKTsKICAgICAgcj1xLmhlYWQ7Cmk9MDsKICAgICAgIHdoaWxlKGk8MTAwMCkKICAgICAgewogICAgICAgICAgaSsrOwogICAgICAgICAgQVZMKHIscm9vdCk7CiAgICAgICAgICByPXItPm5leHQ7CgogICAgICB9CiAgICAgb2Job2Qocm9vdCk7CgogICAgZGVsZXRlIChtYXMyKTsKICAgIGRlbGV0ZUxpc3QocS5oZWFkKTsKICAgIHJldHVybiAwOwp9