#include <bits/stdc++.h>
using namespace std;
#define MASK(i) (1LL<<(i)) // Trả về giá trị 2^i
#define BIT(n,i) ((n>>i)&1) // Kiểm tra Bit thứ i của trạng thái n
const int INF = 1e9+7; // Giá trị dương vô cùng
// Kiểm tra và Cập nhật giá trị nhỏ hơn cho x từ y
template<class _, class __>
bool minimize(_ &x, const __ y){
if(x > y){
x = y;
return true;
} else return false;
}
// Kiểm tra và Cập nhật giá trị lớn hơn cho x từ y
template<class _, class __>
bool maximize(_ &x, const __ y){
if(x < y){
x = y;
return true;
} else return false;
}
const int N = 63; // Số lượng tỉnh ở Việt Nam
const int Log = 16; // Số lượng tỉnh cần quản lí trong một trạng thái
const long long Min_Population = 1200000; // Dân số thấp nhất của một tỉnh sau khi sáp nhập
const int Min_Area = 6500; // Diện tích nhỏ nhất của một tỉnh sau khi sáp nhập
// Tên các tỉnh theo thứ tự chúng tôi sắp xếp
string Province[N] = {
"Lang Son", "Quang Ninh", "Hai Duong", "Hai Phong", "Cao Bang",
"Bac Kan", "Thai Nguyen", "Bac Giang", "Bac Ninh", "Hung Yen",
"Thai Binh", "Ha Giang", "Tuyen Quang", "Vinh Phuc", "Ha Noi",
"Ha Nam", "Nam Dinh", "Lao Cai", "Yen Bai", "Phu Tho",
"Hoa Binh", "Ninh Binh", "Lai Chau", "Dien Bien", "Son La",
"Thanh Hoa","Nghe An", "Ha Tinh", "Quang Binh", "Quang Tri",
"Hue", "Da Nang", "Quang Nam", "Kom Tum", "Quang Ngai",
"Gia Lai", "Binh Dinh", "Dak Lak", "Phu Yen", "Khanh Hoa",
"Ninh Thuan", "Lam Dong", "Dak Nong", "Binh Phuoc", "Binh Thuan",
"Dong Nai", "Binh Duong", "Tay Ninh", "Sai Gon", "BRVT",
"Long An", "Tien Giang", "Dong Thap", "Ben Tre", "Tra Vinh",
"Vinh Long", "Can Tho", "An Giang", "Kien Giang", "Hau Giang",
"Soc Trang", "Bac Lieu", "Ca Mau"};
// Số thứ tự do đề bài ra
int Real_ID[N] = {
35, 47, 25, 26, 13, 3, 53, 2, 5, 29, 52, 21, 59, 61, 23, 22, 38, 36, 62, 42,
28, 40, 33, 17, 50, 54, 39, 24, 44, 48, 55, 14, 45, 32, 46, 20, 10, 15, 43, 30,
41, 34, 16, 8, 9, 18, 7, 51, 57, 1, 37, 56, 19, 6, 58, 60, 12, 0, 31, 27,
49, 4, 11
};
// Danh sách các tỉnh lân cận của từng tỉnh
vector<int> Edge[N] = {
{1, 7, 6, 5, 4}, // 0 - Lang Son
{3, 2, 7, 0}, // 1 - Quang Ninh
{1, 3, 7, 8, 9, 10}, // 2 - Hai Duong
{1, 2, 10}, // 3 - Hai Phong
{0, 5, 12, 11}, // 4 - Cao Bang
{0, 6, 12,11,4}, // 5 - Bac Kan
{0,7,14,13,12,5}, // 6 - Thai Nguyen
{0,1,2,8,14,6}, // 7 - Bac Giang
{7,2,9,14}, // 8 - Bac Ninh
{8,2,10,15,14}, // 9 - Hung Yen
{3,2,9,15,16}, // 10 - Thai Binh
{4,12,18,17}, // 11 - Ha Giang
{4,5,6,13,19,18,11}, // 12 - Tuyen Quang
{6,14,19,12}, // 13 - Vinh Phuc
{6,7,8,9,15,20,19,13}, // 14 - Ha Noi
{9,10,16,21,20,14}, // 15 - Ha Nam
{10,15,21}, // 16 - Nam Dinh
{11,18,22}, // 17 - Lao Cai
{11,12,19,24,22}, // 18 - Yen Bai
{12,13,14,20,24,18}, // 19 - Phu Tho
{14,15,21,25,24,19}, // 20 - Hoa Binh
{15,16,20,25}, // 21 - Ninh Binh
{17,18,25,23}, // 22 - Lai Chau
{22,24}, // 23 - Dien Bien
{23,22,18,19,20,25}, // 24 - Son La
{21,20,24}, // 25 - Thanh Hoa
{25,27}, // 26 - Nghe An
{26, 28}, // 27 - Ha Tinh
{27, 29}, // 28 - Quang Binh
{28, 30}, // 29 - Quang Tri
{29, 31, 32}, // 30 - Hue
{30, 32}, // 31 - Da Nang
{30, 31, 33, 34}, // 32 - Quang Nam
{32, 34, 35}, // 33 - Kom Tum
{32, 33, 35, 36}, // 34 - Quang Ngai
{33, 34, 36, 37, 38}, // 35 - Gia Lai
{34, 35, 38}, // 36 - Binh Dinh
{35, 38, 39, 41, 42}, // 37 - Dak Lak
{35, 36, 37, 39}, // 38 - Phu Yen
{37, 38, 40, 41}, // 39 - Khanh Hoa
{39, 41, 44}, // 40 - Ninh Thuan
{37, 39, 40, 42, 44, 43, 45}, // 41 - Lam Dong
{37, 41, 43}, // 42 - Dak Nong
{41, 42, 45, 46, 47}, // 43 - Binh Phuoc
{40, 41, 45, 49}, // 44 - Binh Thuan
{44,41,43,49,48,46}, // 45 - Dong Nai
{43,47,48,45}, // 46 - Binh Duong
{43, 46, 48, 50}, // 47 - Tay Ninh
{47,46,45,49,50,51}, // 48 - Sai Gon
{44, 45, 48}, // 49 - BRVT
{47, 48, 51, 52}, // 50 - Long An
{53, 55, 52, 50, 48}, // 51 - Tien Giang
{50, 51, 55, 56, 57}, // 52 - Dong Thap
{51, 54, 55}, // 53 - Ben Tre
{53, 55, 60}, // 54 - Tra Vinh
{53, 51, 52, 54, 56, 59, 60}, // 55 - Vinh Long
{52, 55, 57, 58, 59}, // 56 - Can Tho
{52, 56, 58}, // 57 - An Giang
{56, 57, 59, 61, 62}, // 58 - Kien Giang
{55, 56, 60, 61, 58}, // 59 - Hau Giang
{54, 55, 59, 61}, // 60 - Soc Trang
{60, 59, 58, 62}, // 61 - Bac Lieu
{58, 61} // 62 - Ca Mau
};
// Diện tích các tỉnh
int Area[N] = {
8310, // Lang Son
6208, // Quang Ninh
1668, // Hai Duong
1527, // Hai Phong
6700, // Cao Bang
4860, // Bac Kan
3522, // Thai Nguyen
3896, // Bac Giang
823, // Bac Ninh
930, // Hung Yen
1585, // Thai Binh
7928, // Ha Giang
5868, // Tuyen Quang
1236, // Vinh Phuc
3360, // Ha Noi
862, // Ha Nam
1669, // Nam Dinh
6364, // Lao Cai
6893, // Yen Bai
3535, // Phu Tho
4590, // Hoa Binh
1412, // Ninh Binh
9069, // Lai Chau
9540, // Dien Bien
14110, // Son La
11115, // Thanh Hoa
16486, // Nghe An
5994, // Ha Tinh
7999, // Quang Binh
4701, // Quang Tri
4947, // Hue
1285, // Da Nang
10575, // Quang Nam
9677, // Kom Tum
5155, // Quang Ngai
15510, // Gia Lai
6066, // Binh Dinh
13070, // Dak Lak
5026, // Phu Yen
5200, // Khanh Hoa
3356, // Ninh Thuan
9781, // Lam Dong
6509, // Dak Nong
6874, // Binh Phuoc
7943, // Binh Thuan
5864, // Dong Nai
2695, // Binh Duong
4042, // Tay Ninh
2095, // Sai Gon
1983, // BRVT
4495, // Long An
2556, // Tien Giang
3382, // Dong Thap
2380, // Ben Tre
2391, // Tra Vinh
1526, // Vinh Long
1440, // Can Tho
3537, // An Giang
6353, // Kien Giang
1622, // Hau Giang
3298, // Soc Trang
2668, // Bac Lieu
5275 // Ca Mau
};
// Dân số các tỉnh
int Population[N] = {
813978, // Lang Son
1393702, // Quang Ninh
1971326, // Hai Duong
2121841, // Hai Phong
555809, // Cao Bang
328609, // Bac Kan
1361474, // Thai Nguyen
1950615, // Bac Giang
1543529, // Bac Ninh
1313798, // Hung Yen
1888184, // Thai Binh
908263, // Ha Giang
820054, // Tuyen Quang
1221803, // Vinh Phuc
8685607, // Ha Noi
892755, // Ha Nam
1892427, // Nam Dinh
787066, // Lao Cai
863338, // Yen Bai
1540608, // Phu Tho
892373, // Hoa Binh
1027030, // Ninh Binh
494626, // Lai Chau
653422, // Dien Bien
1327430, // Son La
3760650, // Thanh Hoa
3470988, // Nghe An
1329365, // Ha Tinh
924169, // Quang Binh
658619, // Quang Tri
1177624, // Hue
1269070, // Da Nang
1539468, // Quang Nam
598201, // Kom Tum
1256952, // Quang Ngai
1630311, // Gia Lai
1515422, // Binh Dinh
1944821, // Dak Lak
883298, // Phu Yen
1267443, // Khanh Hoa
609820, // Ninh Thuan
1361129, // Lam Dong
692896, // Dak Nong
1060448, // Binh Phuoc
1266240, // Binh Thuan
3341716, // Dong Nai
2858815, // Binh Duong
1201736, // Tay Ninh
9521886, // Sai Gon (TP. HCM)
1192863, // BRVT
1753041, // Long An
1795251, // Tien Giang
1600963, // Dong Thap
1305281, // Ben Tre
1022887, // Tra Vinh
1035362, // Vinh Long
1268514, // Can Tho
1911002, // An Giang
1763826, // Kien Giang
728924, // Hau Giang
1203705, // Soc Trang
929439, // Bac Lieu
1210843 // Ca Mau
};
int trace[N][MASK(Log)]; // Mảng truy vết
int f[N][MASK(Log)]; // Hàm mục tiêu
void prepare() {
// Bài toán cơ sở
for (int i=0;i<N;i++) {
for (int j=0;j<MASK(Log);j++) {
f[i][j] = INF;
// Dương vô cùng nếu hàm mục tiêu cần tìm MIN
// Âm vô cùng nếu hàm mục tiêu cần tìm MAX
trace[i][j] = 0;
}
}
f[0][0] = 0; // Giá trị của trạng trái 0000...0
}
bool Check_Population_Area(vector<int> ds) {
// Kiểm tra điều kiện về dân số và diện tích của cụm tỉnh mới [ds]
int Sum_Area = 0;
long long Sum_Population = 0;
for (int x : ds) {
Sum_Area += Area[x];
Sum_Population += Population[x];
}
return Sum_Area >= Min_Area && Sum_Population >= Min_Population;
}
void Push(int pos,int OldMask,vector<int> ds) {
//Cập nhật giá trị tối ưu và lưu vết cho trạng thái mới khi sáp nhập cụm tỉnh [ds]
// Xét dân số và diện tích của cụm tỉnh [ds]
if (!Check_Population_Area(ds)) return;
// Xét các tỉnh trong [ds] đã được sáp nhập hay chưa
for (int x : ds) if (BIT(OldMask,x - pos)) return;
// Tạo ra trạng thái mới từ trạng thái cũ sau khi sáp nhập cụm tỉnh [ds]
int NewMask = OldMask;
for (int x : ds) NewMask |= MASK(x - pos);
// Cập nhập giá trị tối ưu cho trạng thái mới
if (minimize(f[pos][NewMask],f[pos][OldMask] + (ds.size() == 3))) {
// Lưu vết cho trạng thái mới
trace[pos][NewMask] = 0;
for (int x : ds) trace[pos][NewMask] |= MASK(x - pos);
}
}
void Update_To_Next_Province(int pos) {
// Cập nhật cửa sổ để xét đỉnh tiếp theo
for (int mask=0;mask < MASK(Log);mask++) {
if (BIT(mask,0)) minimize(f[pos+1][mask>>1],f[pos][mask]);
// minimize nếu hàm mục tiêu là MIN
// maximize nếu hàm mục tiêu là MAX
}
}
void sol() {
// Quy hoạch động bitmask
for (int x=0;x<N;x++) {
for (int mask=0;mask<MASK(Log);mask++) {
if (BIT(mask,0) == 0 && f[x][mask] < INF) {
Push(x,mask,{x}); // Xét tỉnh mới chỉ gồm một tỉnh x
for (int y : Edge[x]) {
if (y <= x) continue;
Push(x,mask,{x,y}); // Xét tỉnh mới gồm 2 tỉnh x và một đỉnh kề x
for (int z:Edge[y]) {
if (z <= x) continue;
Push(x,mask,{x,y,z}); /*Xét cụm tỉnh mới gồm 3 tỉnh :
tỉnh x
tỉnh y giáp với tỉnh x
tỉnh z giáp với tỉnh y
*/
}
for (int z:Edge[x]) {
if (z <= x || z == y) continue;
Push(x,mask,{x,y,z}); /*Xét cụm tỉnh mới gồm 3 tỉnh:
tỉnh x
tỉnh y giáp với tỉnh x
tỉnh z giáp với tỉnh x
*/
}
}
}
}
if (x == N - 1) continue;
// cập nhật cửa sổ để xét đỉnh tiếp theo
Update_To_Next_Province(x);
}
// Truy vết
int pos = N-1;
int mask = 1;
while (pos != 0 || mask != 0) {
if (trace[pos][mask] == 0) {
pos--;
mask = mask << 1 | 1;
}
else {
int tmp = trace[pos][mask];
for (int i=0;i<Log;i++) {
if (BIT(tmp,i)) {
cout << Real_ID[pos+i] << ' ';
mask ^= MASK(i);
}
}
cout << '\n';
}
}
}
int main() {
// freopen("ketqua.out","w",stdout);
prepare();
sol();
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIE1BU0soaSkgKDFMTDw8KGkpKSAvLyBUcuG6oyB24buBIGdpw6EgdHLhu4sgMl5pCiNkZWZpbmUgQklUKG4saSkgKChuPj5pKSYxKSAvLyBLaeG7g20gdHJhIEJpdCB0aOG7qSBpIGPhu6dhIHRy4bqhbmcgdGjDoWkgbgoKY29uc3QgaW50IElORiA9IDFlOSs3OyAvLyBHacOhIHRy4buLIGTGsMahbmcgdsO0IGPDuW5nCgovLyBLaeG7g20gdHJhIHbDoCBD4bqtcCBuaOG6rXQgZ2nDoSB0cuG7iyBuaOG7jyBoxqFuIGNobyB4IHThu6sgeQp0ZW1wbGF0ZTxjbGFzcyBfLCBjbGFzcyBfXz4KICAgIGJvb2wgbWluaW1pemUoXyAmeCwgY29uc3QgX18geSl7CiAgICAgICAgaWYoeCA+IHkpewogICAgICAgICAgICB4ID0geTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHJldHVybiBmYWxzZTsKICAgIH0KCi8vIEtp4buDbSB0cmEgdsOgIEPhuq1wIG5o4bqtdCBnacOhIHRy4buLIGzhu5tuIGjGoW4gY2hvIHggdOG7qyB5CnRlbXBsYXRlPGNsYXNzIF8sIGNsYXNzIF9fPgogICAgYm9vbCBtYXhpbWl6ZShfICZ4LCBjb25zdCBfXyB5KXsKICAgICAgICBpZih4IDwgeSl7CiAgICAgICAgICAgIHggPSB5OwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgcmV0dXJuIGZhbHNlOwogICAgfQoKY29uc3QgaW50IE4gPSA2MzsgLy8gU+G7kSBsxrDhu6NuZyB04buJbmgg4bufIFZp4buHdCBOYW0KY29uc3QgaW50IExvZyA9IDE2OyAvLyBT4buRIGzGsOG7o25nIHThu4luaCBj4bqnbiBxdeG6o24gbMOtIHRyb25nIG3hu5l0IHRy4bqhbmcgdGjDoWkKY29uc3QgbG9uZyBsb25nIE1pbl9Qb3B1bGF0aW9uID0gMTIwMDAwMDsgLy8gRMOibiBz4buRIHRo4bqlcCBuaOG6pXQgY+G7p2EgbeG7mXQgdOG7iW5oIHNhdSBraGkgc8OhcCBuaOG6rXAKY29uc3QgaW50IE1pbl9BcmVhID0gNjUwMDsgLy8gRGnhu4duIHTDrWNoIG5o4buPIG5o4bqldCBj4bunYSBt4buZdCB04buJbmggc2F1IGtoaSBzw6FwIG5o4bqtcAoKLy8gVMOqbiBjw6FjIHThu4luaCB0aGVvIHRo4bupIHThu7EgY2jDum5nIHTDtGkgc+G6r3AgeOG6v3AKc3RyaW5nIFByb3ZpbmNlW05dID0gewogICAgICAgICAgICAgICAgIkxhbmcgU29uIiwgIlF1YW5nIE5pbmgiLCAiSGFpIER1b25nIiwgIkhhaSBQaG9uZyIsICJDYW8gQmFuZyIsCiAgICAgICAgICAgICAgICAiQmFjIEthbiIsICJUaGFpIE5ndXllbiIsICJCYWMgR2lhbmciLCAiQmFjIE5pbmgiLCAiSHVuZyBZZW4iLAogICAgICAgICAgICAgICAgIlRoYWkgQmluaCIsICJIYSBHaWFuZyIsICJUdXllbiBRdWFuZyIsICJWaW5oIFBodWMiLCAiSGEgTm9pIiwKICAgICAgICAgICAgICAgICJIYSBOYW0iLCAiTmFtIERpbmgiLCAiTGFvIENhaSIsICJZZW4gQmFpIiwgIlBodSBUaG8iLAogICAgICAgICAgICAgICAgIkhvYSBCaW5oIiwgIk5pbmggQmluaCIsICJMYWkgQ2hhdSIsICJEaWVuIEJpZW4iLCAiU29uIExhIiwKICAgICAgICAgICAgICAgICJUaGFuaCBIb2EiLCJOZ2hlIEFuIiwgIkhhIFRpbmgiLCAiUXVhbmcgQmluaCIsICJRdWFuZyBUcmkiLAogICAgICAgICAgICAgICAgIkh1ZSIsICJEYSBOYW5nIiwgIlF1YW5nIE5hbSIsICJLb20gVHVtIiwgIlF1YW5nIE5nYWkiLAogICAgICAgICAgICAgICAgIkdpYSBMYWkiLCAiQmluaCBEaW5oIiwgIkRhayBMYWsiLCAiUGh1IFllbiIsICJLaGFuaCBIb2EiLAogICAgICAgICAgICAgICAgIk5pbmggVGh1YW4iLCAiTGFtIERvbmciLCAiRGFrIE5vbmciLCAiQmluaCBQaHVvYyIsICJCaW5oIFRodWFuIiwKICAgICAgICAgICAgICAgICJEb25nIE5haSIsICJCaW5oIER1b25nIiwgIlRheSBOaW5oIiwgIlNhaSBHb24iLCAiQlJWVCIsCiAgICAgICAgICAgICAgICAiTG9uZyBBbiIsICJUaWVuIEdpYW5nIiwgIkRvbmcgVGhhcCIsICJCZW4gVHJlIiwgIlRyYSBWaW5oIiwKICAgICAgICAgICAgICAgICJWaW5oIExvbmciLCAiQ2FuIFRobyIsICJBbiBHaWFuZyIsICJLaWVuIEdpYW5nIiwgIkhhdSBHaWFuZyIsCiAgICAgICAgICAgICAgICAiU29jIFRyYW5nIiwgIkJhYyBMaWV1IiwgIkNhIE1hdSJ9OwoKLy8gU+G7kSB0aOG7qSB04buxIGRvIMSR4buBIGLDoGkgcmEKaW50IFJlYWxfSURbTl0gPSB7CiAgICAzNSwgNDcsIDI1LCAyNiwgMTMsIDMsIDUzLCAyLCA1LCAyOSwgNTIsIDIxLCA1OSwgNjEsIDIzLCAyMiwgMzgsIDM2LCA2MiwgNDIsCiAgICAyOCwgNDAsIDMzLCAxNywgNTAsIDU0LCAzOSwgMjQsIDQ0LCA0OCwgNTUsIDE0LCA0NSwgMzIsIDQ2LCAyMCwgMTAsIDE1LCA0MywgMzAsCiAgICA0MSwgMzQsIDE2LCA4LCA5LCAxOCwgNywgNTEsIDU3LCAxLCAzNywgNTYsIDE5LCA2LCA1OCwgNjAsIDEyLCAwLCAzMSwgMjcsCiAgICA0OSwgNCwgMTEKfTsKCi8vIERhbmggc8OhY2ggY8OhYyB04buJbmggbMOibiBj4bqtbiBj4bunYSB04burbmcgdOG7iW5oCnZlY3RvcjxpbnQ+IEVkZ2VbTl0gPSB7CiAgICB7MSwgNywgNiwgNSwgNH0sICAgICAgICAgICAgIC8vIDAgLSBMYW5nIFNvbgogICAgezMsIDIsIDcsIDB9LCAgICAgICAgICAgICAgICAvLyAxIC0gUXVhbmcgTmluaAogICAgezEsIDMsIDcsIDgsIDksIDEwfSwgICAgICAgICAgICAgLy8gMiAtIEhhaSBEdW9uZwogICAgezEsIDIsIDEwfSwgICAgICAgICAgICAgLy8gMyAtIEhhaSBQaG9uZwogICAgezAsIDUsIDEyLCAxMX0sICAgICAgICAgICAgICAgICAgIC8vIDQgLSBDYW8gQmFuZwogICAgezAsIDYsIDEyLDExLDR9LCAgICAgIC8vIDUgLSBCYWMgS2FuCiAgICB7MCw3LDE0LDEzLDEyLDV9LCAvLyA2IC0gVGhhaSBOZ3V5ZW4KICAgIHswLDEsMiw4LDE0LDZ9LCAgICAgICAgICAgIC8vIDcgLSBCYWMgR2lhbmcKICAgIHs3LDIsOSwxNH0sICAgICAgIC8vIDggLSBCYWMgTmluaAogICAgezgsMiwxMCwxNSwxNH0sICAgIC8vIDkgLSBIdW5nIFllbgogICAgezMsMiw5LDE1LDE2fSwgICAgLy8gMTAgLSBUaGFpIEJpbmgKICAgIHs0LDEyLDE4LDE3fSwgICAgICAgICAgLy8gMTEgLSBIYSBHaWFuZwogICAgezQsNSw2LDEzLDE5LDE4LDExfSwgICAgLy8gMTIgLSBUdXllbiBRdWFuZwogICAgezYsMTQsMTksMTJ9LCAgLy8gMTMgLSBWaW5oIFBodWMKICAgIHs2LDcsOCw5LDE1LDIwLDE5LDEzfSwgICAgICAgICAgLy8gMTQgLSBIYSBOb2kKICAgIHs5LDEwLDE2LDIxLDIwLDE0fSwgIC8vIDE1IC0gSGEgTmFtCiAgICB7MTAsMTUsMjF9LCAvLyAxNiAtIE5hbSBEaW5oCiAgICB7MTEsMTgsMjJ9LCAgICAgICAgIC8vIDE3IC0gTGFvIENhaQogICAgezExLDEyLDE5LDI0LDIyfSwgICAgIC8vIDE4IC0gWWVuIEJhaQogICAgezEyLDEzLDE0LDIwLDI0LDE4fSwgLy8gMTkgLSBQaHUgVGhvCiAgICB7MTQsMTUsMjEsMjUsMjQsMTl9LCAgICAgICAgIC8vIDIwIC0gSG9hIEJpbmgKICAgIHsxNSwxNiwyMCwyNX0sICAgICAgICAgICAgIC8vIDIxIC0gTmluaCBCaW5oCiAgICB7MTcsMTgsMjUsMjN9LCAgICAgLy8gMjIgLSBMYWkgQ2hhdQogICAgezIyLDI0fSwgICAgICAgICAgICAgLy8gMjMgLSBEaWVuIEJpZW4KICAgIHsyMywyMiwxOCwxOSwyMCwyNX0sIC8vIDI0IC0gU29uIExhCiAgICB7MjEsMjAsMjR9LCAgICAgICAgICAvLyAyNSAtIFRoYW5oIEhvYQogICAgezI1LDI3fSwgICAgICAgICAgICAgICAgICAgIC8vIDI2IC0gTmdoZSBBbgogICAgezI2LCAyOH0sICAgICAgICAgICAgICAgIC8vIDI3IC0gSGEgVGluaAogICAgezI3LCAyOX0sICAgICAgICAgICAgICAgIC8vIDI4IC0gUXVhbmcgQmluaAogICAgezI4LCAzMH0sICAgICAgICAgICAgICAgIC8vIDI5IC0gUXVhbmcgVHJpCiAgICB7MjksIDMxLCAzMn0sICAgICAgICAgICAgLy8gMzAgLSBIdWUKICAgIHszMCwgMzJ9LCAgICAgICAgICAgICAgICAvLyAzMSAtIERhIE5hbmcKICAgIHszMCwgMzEsIDMzLCAzNH0sICAgICAgICAgICAgLy8gMzIgLSBRdWFuZyBOYW0KICAgIHszMiwgMzQsIDM1fSwgICAgICAgICAgICAvLyAzMyAtIEtvbSBUdW0KICAgIHszMiwgMzMsIDM1LCAzNn0sICAgICAgICAvLyAzNCAtIFF1YW5nIE5nYWkKICAgIHszMywgMzQsIDM2LCAzNywgMzh9LCAgICAvLyAzNSAtIEdpYSBMYWkKICAgIHszNCwgMzUsIDM4fSwgICAgICAgICAgICAvLyAzNiAtIEJpbmggRGluaAogICAgezM1LCAzOCwgMzksIDQxLCA0Mn0sICAgIC8vIDM3IC0gRGFrIExhawogICAgezM1LCAzNiwgMzcsIDM5fSwgICAgICAgIC8vIDM4IC0gUGh1IFllbgogICAgezM3LCAzOCwgNDAsIDQxfSwgICAgICAgIC8vIDM5IC0gS2hhbmggSG9hCiAgICB7MzksIDQxLCA0NH0sICAgICAgICAgICAgLy8gNDAgLSBOaW5oIFRodWFuCiAgICB7MzcsIDM5LCA0MCwgNDIsIDQ0LCA0MywgNDV9LCAgICAvLyA0MSAtIExhbSBEb25nCiAgICB7MzcsIDQxLCA0M30sICAgICAgICAgICAgLy8gNDIgLSBEYWsgTm9uZwogICAgezQxLCA0MiwgNDUsIDQ2LCA0N30sICAgIC8vIDQzIC0gQmluaCBQaHVvYwogICAgezQwLCA0MSwgNDUsIDQ5fSwgICAgLy8gNDQgLSBCaW5oIFRodWFuCiAgICB7NDQsNDEsNDMsNDksNDgsNDZ9LCAgICAgICAgLy8gNDUgLSBEb25nIE5haQogICAgezQzLDQ3LDQ4LDQ1fSwgLy8gNDYgLSBCaW5oIER1b25nCiAgICB7NDMsIDQ2LCA0OCwgNTB9LCAgICAgICAgLy8gNDcgLSBUYXkgTmluaAogICAgezQ3LDQ2LDQ1LDQ5LDUwLDUxfSwgICAgICAgIC8vIDQ4IC0gU2FpIEdvbgogICAgezQ0LCA0NSwgNDh9LCAgICAvLyA0OSAtIEJSVlQKICAgIHs0NywgNDgsIDUxLCA1Mn0sICAgICAgICAgICAgLy8gNTAgLSBMb25nIEFuCiAgICB7NTMsIDU1LCA1MiwgNTAsIDQ4fSwgICAgICAgIC8vIDUxIC0gVGllbiBHaWFuZwogICAgezUwLCA1MSwgNTUsIDU2LCA1N30sICAgICAgICAvLyA1MiAtIERvbmcgVGhhcAogICAgezUxLCA1NCwgNTV9LCAgICAvLyA1MyAtIEJlbiBUcmUKICAgIHs1MywgNTUsIDYwfSwgICAgICAgICAgICAvLyA1NCAtIFRyYSBWaW5oCiAgICB7NTMsIDUxLCA1MiwgNTQsIDU2LCA1OSwgNjB9LCAgICAgICAgICAgIC8vIDU1IC0gVmluaCBMb25nCiAgICB7NTIsIDU1LCA1NywgNTgsIDU5fSwgLy8gNTYgLSBDYW4gVGhvCiAgICB7NTIsIDU2LCA1OH0sICAgIC8vIDU3IC0gQW4gR2lhbmcKICAgIHs1NiwgNTcsIDU5LCA2MSwgNjJ9LCAgICAgICAgICAgIC8vIDU4IC0gS2llbiBHaWFuZwogICAgezU1LCA1NiwgNjAsIDYxLCA1OH0sICAgIC8vIDU5IC0gSGF1IEdpYW5nCiAgICB7NTQsIDU1LCA1OSwgNjF9LCAgICAvLyA2MCAtIFNvYyBUcmFuZwogICAgezYwLCA1OSwgNTgsIDYyfSwgICAgICAgIC8vIDYxIC0gQmFjIExpZXUKICAgIHs1OCwgNjF9ICAgICAgICAgICAgICAgICAvLyA2MiAtIENhIE1hdQp9OwoKLy8gRGnhu4duIHTDrWNoIGPDoWMgdOG7iW5oCmludCBBcmVhW05dID0gewogICAgODMxMCwgICAvLyBMYW5nIFNvbgogICAgNjIwOCwgICAvLyBRdWFuZyBOaW5oCiAgICAxNjY4LCAgIC8vIEhhaSBEdW9uZwogICAgMTUyNywgICAvLyBIYWkgUGhvbmcKICAgIDY3MDAsICAgLy8gQ2FvIEJhbmcKICAgIDQ4NjAsICAgLy8gQmFjIEthbgogICAgMzUyMiwgICAvLyBUaGFpIE5ndXllbgogICAgMzg5NiwgICAvLyBCYWMgR2lhbmcKICAgIDgyMywgICAgLy8gQmFjIE5pbmgKICAgIDkzMCwgICAgLy8gSHVuZyBZZW4KICAgIDE1ODUsICAgLy8gVGhhaSBCaW5oCiAgICA3OTI4LCAgIC8vIEhhIEdpYW5nCiAgICA1ODY4LCAgIC8vIFR1eWVuIFF1YW5nCiAgICAxMjM2LCAgIC8vIFZpbmggUGh1YwogICAgMzM2MCwgICAvLyBIYSBOb2kKICAgIDg2MiwgICAgLy8gSGEgTmFtCiAgICAxNjY5LCAgIC8vIE5hbSBEaW5oCiAgICA2MzY0LCAgIC8vIExhbyBDYWkKICAgIDY4OTMsICAgLy8gWWVuIEJhaQogICAgMzUzNSwgICAvLyBQaHUgVGhvCiAgICA0NTkwLCAgIC8vIEhvYSBCaW5oCiAgICAxNDEyLCAgIC8vIE5pbmggQmluaAogICAgOTA2OSwgICAvLyBMYWkgQ2hhdQogICAgOTU0MCwgICAvLyBEaWVuIEJpZW4KICAgIDE0MTEwLCAgLy8gU29uIExhCiAgICAxMTExNSwgIC8vIFRoYW5oIEhvYQogICAgMTY0ODYsICAvLyBOZ2hlIEFuCiAgICA1OTk0LCAgIC8vIEhhIFRpbmgKICAgIDc5OTksICAgLy8gUXVhbmcgQmluaAogICAgNDcwMSwgICAvLyBRdWFuZyBUcmkKICAgIDQ5NDcsICAgLy8gSHVlCiAgICAxMjg1LCAgIC8vIERhIE5hbmcKICAgIDEwNTc1LCAgLy8gUXVhbmcgTmFtCiAgICA5Njc3LCAgIC8vIEtvbSBUdW0KICAgIDUxNTUsICAgLy8gUXVhbmcgTmdhaQogICAgMTU1MTAsICAvLyBHaWEgTGFpCiAgICA2MDY2LCAgIC8vIEJpbmggRGluaAogICAgMTMwNzAsICAvLyBEYWsgTGFrCiAgICA1MDI2LCAgIC8vIFBodSBZZW4KICAgIDUyMDAsICAgLy8gS2hhbmggSG9hCiAgICAzMzU2LCAgIC8vIE5pbmggVGh1YW4KICAgIDk3ODEsICAgLy8gTGFtIERvbmcKICAgIDY1MDksICAgLy8gRGFrIE5vbmcKICAgIDY4NzQsICAgLy8gQmluaCBQaHVvYwogICAgNzk0MywgICAvLyBCaW5oIFRodWFuCiAgICA1ODY0LCAgIC8vIERvbmcgTmFpCiAgICAyNjk1LCAgIC8vIEJpbmggRHVvbmcKICAgIDQwNDIsICAgLy8gVGF5IE5pbmgKICAgIDIwOTUsICAgLy8gU2FpIEdvbgogICAgMTk4MywgICAvLyBCUlZUCiAgICA0NDk1LCAgIC8vIExvbmcgQW4KICAgIDI1NTYsICAgLy8gVGllbiBHaWFuZwogICAgMzM4MiwgICAvLyBEb25nIFRoYXAKICAgIDIzODAsICAgLy8gQmVuIFRyZQogICAgMjM5MSwgICAvLyBUcmEgVmluaAogICAgMTUyNiwgICAvLyBWaW5oIExvbmcKICAgIDE0NDAsICAgLy8gQ2FuIFRobwogICAgMzUzNywgICAvLyBBbiBHaWFuZwogICAgNjM1MywgICAvLyBLaWVuIEdpYW5nCiAgICAxNjIyLCAgIC8vIEhhdSBHaWFuZwogICAgMzI5OCwgICAvLyBTb2MgVHJhbmcKICAgIDI2NjgsICAgLy8gQmFjIExpZXUKICAgIDUyNzUgICAgLy8gQ2EgTWF1Cn07CgovLyBEw6JuIHPhu5EgY8OhYyB04buJbmgKaW50IFBvcHVsYXRpb25bTl0gPSB7CiAgICA4MTM5NzgsICAgICAvLyBMYW5nIFNvbgogICAgMTM5MzcwMiwgICAgLy8gUXVhbmcgTmluaAogICAgMTk3MTMyNiwgICAgLy8gSGFpIER1b25nCiAgICAyMTIxODQxLCAgICAvLyBIYWkgUGhvbmcKICAgIDU1NTgwOSwgICAgIC8vIENhbyBCYW5nCiAgICAzMjg2MDksICAgICAvLyBCYWMgS2FuCiAgICAxMzYxNDc0LCAgICAvLyBUaGFpIE5ndXllbgogICAgMTk1MDYxNSwgICAgLy8gQmFjIEdpYW5nCiAgICAxNTQzNTI5LCAgICAvLyBCYWMgTmluaAogICAgMTMxMzc5OCwgICAgLy8gSHVuZyBZZW4KICAgIDE4ODgxODQsICAgIC8vIFRoYWkgQmluaAogICAgOTA4MjYzLCAgICAgLy8gSGEgR2lhbmcKICAgIDgyMDA1NCwgICAgIC8vIFR1eWVuIFF1YW5nCiAgICAxMjIxODAzLCAgICAvLyBWaW5oIFBodWMKICAgIDg2ODU2MDcsICAgIC8vIEhhIE5vaQogICAgODkyNzU1LCAgICAgLy8gSGEgTmFtCiAgICAxODkyNDI3LCAgICAvLyBOYW0gRGluaAogICAgNzg3MDY2LCAgICAgLy8gTGFvIENhaQogICAgODYzMzM4LCAgICAgLy8gWWVuIEJhaQogICAgMTU0MDYwOCwgICAgLy8gUGh1IFRobwogICAgODkyMzczLCAgICAgLy8gSG9hIEJpbmgKICAgIDEwMjcwMzAsICAgIC8vIE5pbmggQmluaAogICAgNDk0NjI2LCAgICAgLy8gTGFpIENoYXUKICAgIDY1MzQyMiwgICAgIC8vIERpZW4gQmllbgogICAgMTMyNzQzMCwgICAgLy8gU29uIExhCiAgICAzNzYwNjUwLCAgICAvLyBUaGFuaCBIb2EKICAgIDM0NzA5ODgsICAgIC8vIE5naGUgQW4KICAgIDEzMjkzNjUsICAgIC8vIEhhIFRpbmgKICAgIDkyNDE2OSwgICAgIC8vIFF1YW5nIEJpbmgKICAgIDY1ODYxOSwgICAgIC8vIFF1YW5nIFRyaQogICAgMTE3NzYyNCwgICAgLy8gSHVlCiAgICAxMjY5MDcwLCAgICAvLyBEYSBOYW5nCiAgICAxNTM5NDY4LCAgICAvLyBRdWFuZyBOYW0KICAgIDU5ODIwMSwgICAgIC8vIEtvbSBUdW0KICAgIDEyNTY5NTIsICAgIC8vIFF1YW5nIE5nYWkKICAgIDE2MzAzMTEsICAgIC8vIEdpYSBMYWkKICAgIDE1MTU0MjIsICAgIC8vIEJpbmggRGluaAogICAgMTk0NDgyMSwgICAgLy8gRGFrIExhawogICAgODgzMjk4LCAgICAgLy8gUGh1IFllbgogICAgMTI2NzQ0MywgICAgLy8gS2hhbmggSG9hCiAgICA2MDk4MjAsICAgICAvLyBOaW5oIFRodWFuCiAgICAxMzYxMTI5LCAgICAvLyBMYW0gRG9uZwogICAgNjkyODk2LCAgICAgLy8gRGFrIE5vbmcKICAgIDEwNjA0NDgsICAgIC8vIEJpbmggUGh1b2MKICAgIDEyNjYyNDAsICAgIC8vIEJpbmggVGh1YW4KICAgIDMzNDE3MTYsICAgIC8vIERvbmcgTmFpCiAgICAyODU4ODE1LCAgICAvLyBCaW5oIER1b25nCiAgICAxMjAxNzM2LCAgICAvLyBUYXkgTmluaAogICAgOTUyMTg4NiwgICAgLy8gU2FpIEdvbiAoVFAuIEhDTSkKICAgIDExOTI4NjMsICAgIC8vIEJSVlQKICAgIDE3NTMwNDEsICAgIC8vIExvbmcgQW4KICAgIDE3OTUyNTEsICAgIC8vIFRpZW4gR2lhbmcKICAgIDE2MDA5NjMsICAgIC8vIERvbmcgVGhhcAogICAgMTMwNTI4MSwgICAgLy8gQmVuIFRyZQogICAgMTAyMjg4NywgICAgLy8gVHJhIFZpbmgKICAgIDEwMzUzNjIsICAgIC8vIFZpbmggTG9uZwogICAgMTI2ODUxNCwgICAgLy8gQ2FuIFRobwogICAgMTkxMTAwMiwgICAgLy8gQW4gR2lhbmcKICAgIDE3NjM4MjYsICAgIC8vIEtpZW4gR2lhbmcKICAgIDcyODkyNCwgICAgIC8vIEhhdSBHaWFuZwogICAgMTIwMzcwNSwgICAgLy8gU29jIFRyYW5nCiAgICA5Mjk0MzksICAgICAvLyBCYWMgTGlldQogICAgMTIxMDg0MyAgICAgLy8gQ2EgTWF1Cn07CgppbnQgdHJhY2VbTl1bTUFTSyhMb2cpXTsgLy8gTeG6o25nIHRydXkgduG6v3QKCmludCBmW05dW01BU0soTG9nKV07IC8vIEjDoG0gbeG7pWMgdGnDqnUKCnZvaWQgcHJlcGFyZSgpIHsKICAgIC8vIELDoGkgdG/DoW4gY8ahIHPhu58KICAgIGZvciAoaW50IGk9MDtpPE47aSsrKSB7CiAgICAgICAgZm9yIChpbnQgaj0wO2o8TUFTSyhMb2cpO2orKykgewogICAgICAgICAgICBmW2ldW2pdID0gSU5GOwogICAgICAgICAgICAvLyBExrDGoW5nIHbDtCBjw7luZyBu4bq/dSBow6BtIG3hu6VjIHRpw6p1IGPhuqduIHTDrG0gTUlOCiAgICAgICAgICAgIC8vIMOCbSB2w7QgY8O5bmcgbuG6v3UgaMOgbSBt4bulYyB0acOqdSBj4bqnbiB0w6xtIE1BWAogICAgICAgICAgICB0cmFjZVtpXVtqXSA9IDA7CiAgICAgICAgfQogICAgfQogICAgZlswXVswXSA9IDA7IC8vIEdpw6EgdHLhu4sgY+G7p2EgdHLhuqFuZyB0csOhaSAwMDAwLi4uMAp9Cgpib29sIENoZWNrX1BvcHVsYXRpb25fQXJlYSh2ZWN0b3I8aW50PiBkcykgewogICAgLy8gS2nhu4NtIHRyYSDEkWnhu4F1IGtp4buHbiB24buBIGTDom4gc+G7kSB2w6AgZGnhu4duIHTDrWNoIGPhu6dhIGPhu6VtIHThu4luaCBt4bubaSBbZHNdCiAgICBpbnQgU3VtX0FyZWEgPSAwOwogICAgbG9uZyBsb25nIFN1bV9Qb3B1bGF0aW9uID0gMDsKICAgIGZvciAoaW50IHggOiBkcykgewogICAgICAgIFN1bV9BcmVhICs9IEFyZWFbeF07CiAgICAgICAgU3VtX1BvcHVsYXRpb24gKz0gUG9wdWxhdGlvblt4XTsKICAgIH0KICAgIHJldHVybiBTdW1fQXJlYSA+PSBNaW5fQXJlYSAmJiBTdW1fUG9wdWxhdGlvbiA+PSBNaW5fUG9wdWxhdGlvbjsKfQoKdm9pZCBQdXNoKGludCBwb3MsaW50IE9sZE1hc2ssdmVjdG9yPGludD4gZHMpIHsKLy9D4bqtcCBuaOG6rXQgZ2nDoSB0cuG7iyB04buRaSDGsHUgdsOgIGzGsHUgduG6v3QgY2hvIHRy4bqhbmcgdGjDoWkgbeG7m2kga2hpIHPDoXAgbmjhuq1wIGPhu6VtIHThu4luaCBbZHNdCgogICAgLy8gWMOpdCBkw6JuIHPhu5EgdsOgIGRp4buHbiB0w61jaCBj4bunYSBj4bulbSB04buJbmggW2RzXQogICAgaWYgKCFDaGVja19Qb3B1bGF0aW9uX0FyZWEoZHMpKSByZXR1cm47CgogICAgLy8gWMOpdCBjw6FjIHThu4luaCB0cm9uZyBbZHNdIMSRw6MgxJHGsOG7o2Mgc8OhcCBuaOG6rXAgaGF5IGNoxrBhCiAgICBmb3IgKGludCB4IDogZHMpIGlmIChCSVQoT2xkTWFzayx4IC0gcG9zKSkgcmV0dXJuOwoKICAgIC8vIFThuqFvIHJhIHRy4bqhbmcgdGjDoWkgbeG7m2kgdOG7qyB0cuG6oW5nIHRow6FpIGPFqSBzYXUga2hpIHPDoXAgbmjhuq1wIGPhu6VtIHThu4luaCBbZHNdCiAgICBpbnQgTmV3TWFzayA9IE9sZE1hc2s7CiAgICBmb3IgKGludCB4IDogZHMpIE5ld01hc2sgfD0gTUFTSyh4IC0gcG9zKTsKCiAgICAvLyBD4bqtcCBuaOG6rXAgZ2nDoSB0cuG7iyB04buRaSDGsHUgY2hvIHRy4bqhbmcgdGjDoWkgbeG7m2kKICAgIGlmIChtaW5pbWl6ZShmW3Bvc11bTmV3TWFza10sZltwb3NdW09sZE1hc2tdICsgKGRzLnNpemUoKSA9PSAzKSkpIHsKICAgICAgICAvLyBMxrB1IHbhur90IGNobyB0cuG6oW5nIHRow6FpIG3hu5tpCiAgICAgICAgdHJhY2VbcG9zXVtOZXdNYXNrXSA9IDA7CiAgICAgICAgZm9yIChpbnQgeCA6IGRzKSB0cmFjZVtwb3NdW05ld01hc2tdIHw9IE1BU0soeCAtIHBvcyk7CiAgICB9Cn0KCnZvaWQgVXBkYXRlX1RvX05leHRfUHJvdmluY2UoaW50IHBvcykgewogICAgLy8gQ+G6rXAgbmjhuq10IGPhu61hIHPhu5UgxJHhu4MgeMOpdCDEkeG7iW5oIHRp4bq/cCB0aGVvCiAgICBmb3IgKGludCBtYXNrPTA7bWFzayA8IE1BU0soTG9nKTttYXNrKyspIHsKICAgICAgICBpZiAoQklUKG1hc2ssMCkpIG1pbmltaXplKGZbcG9zKzFdW21hc2s+PjFdLGZbcG9zXVttYXNrXSk7CiAgICAgICAgLy8gbWluaW1pemUgbuG6v3UgaMOgbSBt4bulYyB0acOqdSBsw6AgTUlOCiAgICAgICAgLy8gbWF4aW1pemUgbuG6v3UgaMOgbSBt4bulYyB0acOqdSBsw6AgTUFYCiAgICB9Cn0KCnZvaWQgc29sKCkgewogICAgLy8gUXV5IGhv4bqhY2ggxJHhu5luZyBiaXRtYXNrCiAgICBmb3IgKGludCB4PTA7eDxOO3grKykgewogICAgICAgIGZvciAoaW50IG1hc2s9MDttYXNrPE1BU0soTG9nKTttYXNrKyspIHsKICAgICAgICAgICAgaWYgKEJJVChtYXNrLDApID09IDAgJiYgZlt4XVttYXNrXSA8IElORikgewogICAgICAgICAgICAgICAgUHVzaCh4LG1hc2sse3h9KTsgLy8gWMOpdCB04buJbmggbeG7m2kgY2jhu4kgZ+G7k20gbeG7mXQgdOG7iW5oIHgKICAgICAgICAgICAgICAgIGZvciAoaW50IHkgOiBFZGdlW3hdKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPD0geCkgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgUHVzaCh4LG1hc2sse3gseX0pOyAvLyBYw6l0IHThu4luaCBt4bubaSBn4buTbSAyIHThu4luaCB4IHbDoCBt4buZdCDEkeG7iW5oIGvhu4EgeAogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHo6RWRnZVt5XSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoeiA8PSB4KSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgUHVzaCh4LG1hc2sse3gseSx6fSk7ICAgLypYw6l0IGPhu6VtIHThu4luaCBt4bubaSBn4buTbSAzIHThu4luaCA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB04buJbmggeAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdOG7iW5oIHkgZ2nDoXAgduG7m2kgdOG7iW5oIHgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHThu4luaCB6IGdpw6FwIHbhu5tpIHThu4luaCB5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHo6RWRnZVt4XSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoeiA8PSB4IHx8IHogPT0geSkgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIFB1c2goeCxtYXNrLHt4LHksen0pOyAvKljDqXQgY+G7pW0gdOG7iW5oIG3hu5tpIGfhu5NtIDMgdOG7iW5oOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdOG7iW5oIHgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHThu4luaCB5IGdpw6FwIHbhu5tpIHThu4luaCB4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB04buJbmggeiBnacOhcCB24bubaSB04buJbmggeAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoeCA9PSBOIC0gMSkgY29udGludWU7CiAgICAgICAgLy8gY+G6rXAgbmjhuq10IGPhu61hIHPhu5UgxJHhu4MgeMOpdCDEkeG7iW5oIHRp4bq/cCB0aGVvCiAgICAgICAgVXBkYXRlX1RvX05leHRfUHJvdmluY2UoeCk7CiAgICB9CiAgICAvLyBUcnV5IHbhur90CiAgICBpbnQgcG9zID0gTi0xOwogICAgaW50IG1hc2sgPSAxOwogICAgd2hpbGUgKHBvcyAhPSAwIHx8IG1hc2sgIT0gMCkgewogICAgICAgIGlmICh0cmFjZVtwb3NdW21hc2tdID09IDApIHsKICAgICAgICAgICAgcG9zLS07CiAgICAgICAgICAgIG1hc2sgPSBtYXNrIDw8IDEgfCAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaW50IHRtcCA9IHRyYWNlW3Bvc11bbWFza107CiAgICAgICAgICAgIGZvciAoaW50IGk9MDtpPExvZztpKyspIHsKICAgICAgICAgICAgICAgIGlmIChCSVQodG1wLGkpKSB7CiAgICAgICAgICAgICAgICAgICAgY291dCA8PCBSZWFsX0lEW3BvcytpXSA8PCAnICc7CiAgICAgICAgICAgICAgICAgICAgbWFzayBePSBNQVNLKGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvdXQgPDwgJ1xuJzsKICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKCkgewovLyAgICBmcmVvcGVuKCJrZXRxdWEub3V0IiwidyIsc3Rkb3V0KTsKICAgIHByZXBhcmUoKTsKICAgIHNvbCgpOwp9Cg==