/*
written by- Piyush Golani
language- c++
country- India
College- N.I.T Jamshedpur
*/
#include <cmath>
#include <ctime>
#include <iostream>
#include <string>
#include <vector>
#include<cstdio>
#include<sstream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<map>
#include<set>
#include<queue>
#include<cctype>
using namespace std;
#define pb push_back
#define all(s) s.begin(),s.end()
#define f(i,a,b) for(int i=a;i<b;i++)
#define F(i,a,b) for(int i=a;i>=b;i--)
#define PI 3.1415926535897932384626433832795
#define INF 2000000000
#define BIG_INF 7000000000000000000LL
#define mp make_pair
#define eps 1e-9
#define si(n) scanf("%d",&n)
#define sll(n) scanf("%lld",&n)
#define mod 1000000007
#define mm 10000000
typedef long long LL;
string inttostring(int n)
{
stringstream a;
a<<n;
return a.str();
}
int stringtoint(string A)
{
istringstream a(A);
int p;
a>>p;
return p;
}
//////////////////////////////////////////////////////
class MagicMoleculeEasy {
public:
vector<int> mp;
int a[1225],b[1225];
int e;
int n,best;
bool used[1225];
int rec(int p,int k)
{
if(p==e)
{
int res=0;
vector<int> x;
f(i,0,n)
{
if(used[i])
{
res+=mp[i];
}
else
{
x.pb(mp[i]);
}
}
sort(all(x),greater<int>() );
f(i,0,k) res+=x[i];
best=max(best,res);
return 0;
}
else
{
if(used[a[p]] || used[b[p]])
{
rec(p+1,k);
}
else if(k>0)
{
used[a[p]]=true;
rec(p+1,k-1);
used[a[p]]=false;
used[b[p]]=true;
rec(p+1,k-1);
used[b[p]]=false;
}
return 0;
}
}
int maxMagicPower( vector <int> magicPower, vector <string> magicBond, int k ) {
this->mp=magicPower;
n=magicPower.size();
e=0;
f(i,0,n)
{
f(j,0,n)
{
if(magicBond[i][j]=='Y')
{
a[e]=i;
b[e++]=j;
}
}
}
fill(used,used+n,false);
best=-1;
rec(0,k);
return best;
}
};
// BEGIN CUT HERE
namespace moj_harness {
int run_test_case(int);
void run_test(int casenum = -1, bool quiet = false) {
if (casenum != -1) {
if (run_test_case(casenum) == -1 && !quiet) {
cerr << "Illegal input! Test case " << casenum << " does not exist." << endl;
}
return;
}
int correct = 0, total = 0;
for (int i=0;; ++i) {
int x = run_test_case(i);
if (x == -1) {
if (i >= 100) break;
continue;
}
correct += x;
++total;
}
if (total == 0) {
cerr << "No test cases run." << endl;
} else if (correct < total) {
cerr << "Some cases FAILED (passed " << correct << " of " << total << ")." << endl;
} else {
cerr << "All " << total << " tests passed!" << endl;
}
}
int verify_case(int casenum, const int &expected, const int &received, clock_t elapsed) {
cerr << "Example " << casenum << "... ";
string verdict;
vector<string> info;
char buf[100];
if (elapsed > CLOCKS_PER_SEC / 200) {
sprintf(buf, "time %.2fs", elapsed * (1.0/CLOCKS_PER_SEC));
info.push_back(buf);
}
if (expected == received) {
verdict = "PASSED";
} else {
verdict = "FAILED";
}
cerr << verdict;
if (!info.empty()) {
cerr << " (";
for (int i=0; i<(int)info.size(); ++i) {
if (i > 0) cerr << ", ";
cerr << info[i];
}
cerr << ")";
}
cerr << endl;
if (verdict == "FAILED") {
cerr << " Expected: " << expected << endl;
cerr << " Received: " << received << endl;
}
return verdict == "PASSED";
}
int run_test_case(int casenum__) {
switch (casenum__) {
case 0: {
int magicPower[] = {1, 2};
string magicBond[] = {"NY",
"YN"};
int k = 1;
int expected__ = 2;
clock_t start__ = clock();
int received__ = MagicMoleculeEasy().maxMagicPower(vector <int>(magicPower, magicPower + (sizeof magicPower / sizeof magicPower[0])), vector <string>(magicBond, magicBond + (sizeof magicBond / sizeof magicBond[0])), k);
return verify_case(casenum__, expected__, received__, clock()-start__);
}
case 1: {
int magicPower[] = {100, 1, 100};
string magicBond[] = {"NYN",
"YNY",
"NYN"};
int k = 1;
int expected__ = 1;
clock_t start__ = clock();
int received__ = MagicMoleculeEasy().maxMagicPower(vector <int>(magicPower, magicPower + (sizeof magicPower / sizeof magicPower[0])), vector <string>(magicBond, magicBond + (sizeof magicBond / sizeof magicBond[0])), k);
return verify_case(casenum__, expected__, received__, clock()-start__);
}
case 2: {
int magicPower[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
string magicBond[] = {"NYYYYYYYYYYYYYYYYYYYYNYYNYYYYYYYYYYYYYYYYY", "YNYYYYYYYYYYYYYYYYYYYYYYYYYYNYYYYYYYYYYYYY", "YYNYYYYYYYYYYYYYYYYYYYYYNYYYYYYYYYYYYYYYYY", "YYYNYYYYYYYYYNYYYYYYYYYYYYYYYYYYYYYYYYYYYN", "YYYYNYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY", "YYYYYNYYYYNYYYYYYYYYYNYYYYYYYYYYYYYYYYYYYY", "YYYYYYNYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY", "YYYYYYYNYYYYYYYYYYNYYYYYYYYYYYYNYYYYYYYYYY", "YYYYYYYYNYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY", "YYYYYYYYYNYYYYYYYYYYYYYYYYYYNYYYYYYYYYYYYY", "YYYYYNYYYYNYYNYYYYYYYYYYYYYYYYYYYNYYYYYYYY", "YYYYYYYYYYYNYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY", "YYYYYYYYYYYYNYYYNYYYYYYYYYYYYNYYNYYYYYYYYY", "YYYNYYYYYYNYYNYYYYYYYYYYYYYYYYYYYYYYYYYYNY", "YYYYYYYYYYYYYYNYYYYYYYYYYYYYYYNYYYYYYYYYYY", "YYYYYYYYYYYYYYYNYYYYYYYYYYYYYYYYYYYYYYYYYY", "YYYYYYYYYYYYNYYYNYYYYYYYYYNNYYYYYYYYYYYYYY", "YYYYYYYYYYYYYYYYYNYYYYYYYYYYYYYYYYYYYYYYYY", "YYYYYYYNYYYYYYYYYYNYYYYYYYYYYYYYYYYYYYYYYY", "YYYYYYYYYYYYYYYYYYYNYYYYYYYYNNYYYYYYYYYYYY", "YYYYYYYYYYYYYYYYYYYYNYYYYYYYYYYYYYYYYYYYYY", "NYYYYNYYYYYYYYYYYYYYYNYYYYYYYYYYYYYYYYYYYY", "YYYYYYYYYYYYYYYYYYYYYYNYYYYYYYYYYYNYYYYYNY", "YYYYYYYYYYYYYYYYYYYYYYYNYYYYYYYYYYYYYYYYYY", "NYNYYYYYYYYYYYYYYYYYYYYYNYYYYYYYYYYYYYYYYY", "YYYYYYYYYYYYYYYYYYYYYYYYYNYYYYYYYYYYYYYYYY", "YYYYYYYYYYYYYYYYNYYYYYYYYYNYYYYYYYYYYYYYYY", "YYYYYYYYYYYYYYYYNYYYYYYYYYYNYYYYYYYYYYYYYY", "YNYYYYYYYNYYYYYYYYYNYYYYYYYYNYYYYYYYYYYNYY", "YYYYYYYYYYYYNYYYYYYNYYYYYYYYYNYYYYNYYYYYYY", "YYYYYYYYYYYYYYNYYYYYYYYYYYYYYYNYYYYYYYYYYY", "YYYYYYYNYYYYYYYYYYYYYYYYYYYYYYYNYYYYYYYYYY", "YYYYYYYYYYYYNYYYYYYYYYYYYYYYYYYYNYYYYYYYNY", "YYYYYYYYYYNYYYYYYYYYYYYYYYYYYYYYYNYYYYYNYY", "YYYYYYYYYYYYYYYYYYYYYYNYYYYYYNYYYYNYYYNYYY", "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYNYYNYYY", "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYNYYYYY", "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYNYYYY", "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYNNYYNYYY", "YYYYYYYYYYYYYYYYYYYYYYYYYYYYNYYYYNYYYYYNNY", "YYYYYYYYYYYYYNYYYYYYYYNYYYYYYYYYNYYYYYYNNY", "YYYNYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYN"};
int k = 13;
int expected__ = -1;
clock_t start__ = clock();
int received__ = MagicMoleculeEasy().maxMagicPower(vector <int>(magicPower, magicPower + (sizeof magicPower / sizeof magicPower[0])), vector <string>(magicBond, magicBond + (sizeof magicBond / sizeof magicBond[0])), k);
return verify_case(casenum__, expected__, received__, clock()-start__);
}
case 3: {
int magicPower[] = {4, 7, 5, 8};
string magicBond[] = {"NYNY",
"YNYN",
"NYNY",
"YNYN"};
int k = 2;
int expected__ = 15;
clock_t start__ = clock();
int received__ = MagicMoleculeEasy().maxMagicPower(vector <int>(magicPower, magicPower + (sizeof magicPower / sizeof magicPower[0])), vector <string>(magicBond, magicBond + (sizeof magicBond / sizeof magicBond[0])), k);
return verify_case(casenum__, expected__, received__, clock()-start__);
}
case 4: {
int magicPower[] = {46474, 60848, 98282, 58073, 42670, 50373};
string magicBond[] = {"NYNNNY", "YNNYNY", "NNNYYY", "NYYNNN", "NNYNNN", "YYYNNN"};
int k = 3;
int expected__ = 209503;
clock_t start__ = clock();
int received__ = MagicMoleculeEasy().maxMagicPower(vector <int>(magicPower, magicPower + (sizeof magicPower / sizeof magicPower[0])), vector <string>(magicBond, magicBond + (sizeof magicBond / sizeof magicBond[0])), k);
return verify_case(casenum__, expected__, received__, clock()-start__);
}
case 5: {
int magicPower[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
string magicBond[] = {"NNYYYNYYNYNNY", "NNYNYYYYYYYNY", "YYNYYNYYYYYYY", "YNYNYYNYYYYYY",
"YYYYNNYYYYYNY", "NYNYNNYYYYYNN", "YYYNYYNYYYYYY", "YYYYYYYNYNYYY",
"NYYYYYYYNYYYY", "YYYYYYYNYNNNN", "NYYYYYYYYNNYN", "NNYYNNYYYNYNN", "YYYYYNYYYNNNN"};
int k = 9;
int expected__ = -1;
clock_t start__ = clock();
int received__ = MagicMoleculeEasy().maxMagicPower(vector <int>(magicPower, magicPower + (sizeof magicPower / sizeof magicPower[0])), vector <string>(magicBond, magicBond + (sizeof magicBond / sizeof magicBond[0])), k);
return verify_case(casenum__, expected__, received__, clock()-start__);
}
case 6: {
int magicPower[] = {1, 1};
string magicBond[] = {"NN", "NN"};
int k = 1;
int expected__ = 1;
clock_t start__ = clock();
int received__ = MagicMoleculeEasy().maxMagicPower(vector <int>(magicPower, magicPower + (sizeof magicPower / sizeof magicPower[0])), vector <string>(magicBond, magicBond + (sizeof magicBond / sizeof magicBond[0])), k);
return verify_case(casenum__, expected__, received__, clock()-start__);
}
case 7: {
int magicPower[] = {1,1,2,5,2,4,2};
string magicBond[] = {"NNNNNNN","NNYNNNN","NYNNNYN","NNNNNNY","NNNNNNN","NNYNNNN","NNNYNNN"};
int k = 3;
int expected__ = 11;
clock_t start__ = clock();
int received__ = MagicMoleculeEasy().maxMagicPower(vector <int>(magicPower, magicPower + (sizeof magicPower / sizeof magicPower[0])), vector <string>(magicBond, magicBond + (sizeof magicBond / sizeof magicBond[0])), k);
return verify_case(casenum__, expected__, received__, clock()-start__);
}
// custom cases
/* case 8: {
int magicPower[] = ;
string magicBond[] = ;
int k = ;
int expected__ = ;
clock_t start__ = clock();
int received__ = MagicMoleculeEasy().maxMagicPower(vector <int>(magicPower, magicPower + (sizeof magicPower / sizeof magicPower[0])), vector <string>(magicBond, magicBond + (sizeof magicBond / sizeof magicBond[0])), k);
return verify_case(casenum__, expected__, received__, clock()-start__);
}*/
/* case 9: {
int magicPower[] = ;
string magicBond[] = ;
int k = ;
int expected__ = ;
clock_t start__ = clock();
int received__ = MagicMoleculeEasy().maxMagicPower(vector <int>(magicPower, magicPower + (sizeof magicPower / sizeof magicPower[0])), vector <string>(magicBond, magicBond + (sizeof magicBond / sizeof magicBond[0])), k);
return verify_case(casenum__, expected__, received__, clock()-start__);
}*/
/* case 10: {
int magicPower[] = ;
string magicBond[] = ;
int k = ;
int expected__ = ;
clock_t start__ = clock();
int received__ = MagicMoleculeEasy().maxMagicPower(vector <int>(magicPower, magicPower + (sizeof magicPower / sizeof magicPower[0])), vector <string>(magicBond, magicBond + (sizeof magicBond / sizeof magicBond[0])), k);
return verify_case(casenum__, expected__, received__, clock()-start__);
}*/
default:
return -1;
}
}
}
int main(int argc, char *argv[]) {
if (argc == 1) {
moj_harness::run_test();
} else {
for (int i=1; i<argc; ++i)
moj_harness::run_test(atoi(argv[i]));
}
}
// END CUT HERE
LyoKd3JpdHRlbiBieS0gUGl5dXNoIEdvbGFuaQpsYW5ndWFnZS0gYysrCmNvdW50cnktIEluZGlhCkNvbGxlZ2UtIE4uSS5UIEphbXNoZWRwdXIKKi8KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8Y3RpbWU+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGU8Y3N0ZGlvPgojaW5jbHVkZTxzc3RyZWFtPgojaW5jbHVkZTxhbGdvcml0aG0+CiNpbmNsdWRlPGNzdGRsaWI+CiNpbmNsdWRlPGNzdHJpbmc+CiNpbmNsdWRlPG1hcD4KI2luY2x1ZGU8c2V0PgojaW5jbHVkZTxxdWV1ZT4KI2luY2x1ZGU8Y2N0eXBlPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGFsbChzKSBzLmJlZ2luKCkscy5lbmQoKQojZGVmaW5lIGYoaSxhLGIpIGZvcihpbnQgaT1hO2k8YjtpKyspCiNkZWZpbmUgRihpLGEsYikgZm9yKGludCBpPWE7aT49YjtpLS0pCiNkZWZpbmUgUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1CiNkZWZpbmUgSU5GIDIwMDAwMDAwMDAKI2RlZmluZSBCSUdfSU5GIDcwMDAwMDAwMDAwMDAwMDAwMDBMTAojZGVmaW5lIG1wIG1ha2VfcGFpcgojZGVmaW5lIGVwcyAxZS05CiNkZWZpbmUgc2kobikgc2NhbmYoIiVkIiwmbikKI2RlZmluZSBzbGwobikgc2NhbmYoIiVsbGQiLCZuKQojZGVmaW5lIG1vZCAxMDAwMDAwMDA3CiNkZWZpbmUgbW0gMTAwMDAwMDAKCnR5cGVkZWYgbG9uZyBsb25nIExMOwoKCnN0cmluZyBpbnR0b3N0cmluZyhpbnQgbikKewogICAgc3RyaW5nc3RyZWFtIGE7CiAgICBhPDxuOwogICAgcmV0dXJuIGEuc3RyKCk7Cn0KCmludCBzdHJpbmd0b2ludChzdHJpbmcgQSkKewogICAgaXN0cmluZ3N0cmVhbSBhKEEpOwogICAgaW50IHA7CiAgICBhPj5wOwogICAgcmV0dXJuIHA7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCmNsYXNzIE1hZ2ljTW9sZWN1bGVFYXN5IHsKcHVibGljOgogICAgdmVjdG9yPGludD4gbXA7CiAgICBpbnQgYVsxMjI1XSxiWzEyMjVdOwogICAgaW50IGU7CiAgICBpbnQgbixiZXN0OwogICAgYm9vbCB1c2VkWzEyMjVdOwogICAgaW50IHJlYyhpbnQgcCxpbnQgaykKICAgIHsKICAgICAgICBpZihwPT1lKQogICAgICAgIHsKICAgICAgICAgICAgaW50IHJlcz0wOwogICAgICAgICAgICB2ZWN0b3I8aW50PiB4OwogICAgICAgICAgICBmKGksMCxuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZih1c2VkW2ldKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcys9bXBbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgeC5wYihtcFtpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc29ydChhbGwoeCksZ3JlYXRlcjxpbnQ+KCkgKTsKICAgICAgICAgICAgZihpLDAsaykgcmVzKz14W2ldOwogICAgICAgICAgICBiZXN0PW1heChiZXN0LHJlcyk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZih1c2VkW2FbcF1dIHx8IHVzZWRbYltwXV0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJlYyhwKzEsayk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZihrPjApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHVzZWRbYVtwXV09dHJ1ZTsKICAgICAgICAgICAgICAgIHJlYyhwKzEsay0xKTsKICAgICAgICAgICAgICAgIHVzZWRbYVtwXV09ZmFsc2U7CiAgICAgICAgICAgICAgICB1c2VkW2JbcF1dPXRydWU7CiAgICAgICAgICAgICAgICByZWMocCsxLGstMSk7CiAgICAgICAgICAgICAgICB1c2VkW2JbcF1dPWZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgaW50IG1heE1hZ2ljUG93ZXIoIHZlY3RvciA8aW50PiBtYWdpY1Bvd2VyLCB2ZWN0b3IgPHN0cmluZz4gbWFnaWNCb25kLCBpbnQgayApIHsKICAgIHRoaXMtPm1wPW1hZ2ljUG93ZXI7CiAgICBuPW1hZ2ljUG93ZXIuc2l6ZSgpOwogICAgZT0wOwogICAgZihpLDAsbikKICAgIHsKICAgICAgICBmKGosMCxuKQogICAgICAgIHsKICAgICAgICAgICAgaWYobWFnaWNCb25kW2ldW2pdPT0nWScpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFbZV09aTsKICAgICAgICAgICAgICAgIGJbZSsrXT1qOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZmlsbCh1c2VkLHVzZWQrbixmYWxzZSk7CiAgICBiZXN0PS0xOwogICAgcmVjKDAsayk7CiAgICByZXR1cm4gYmVzdDsKICAgfQp9OwoKLy8gQkVHSU4gQ1VUIEhFUkUKbmFtZXNwYWNlIG1val9oYXJuZXNzIHsKICAgIGludCBydW5fdGVzdF9jYXNlKGludCk7Cgl2b2lkIHJ1bl90ZXN0KGludCBjYXNlbnVtID0gLTEsIGJvb2wgcXVpZXQgPSBmYWxzZSkgewoJCWlmIChjYXNlbnVtICE9IC0xKSB7CgkJCWlmIChydW5fdGVzdF9jYXNlKGNhc2VudW0pID09IC0xICYmICFxdWlldCkgewoJCQkJY2VyciA8PCAiSWxsZWdhbCBpbnB1dCEgVGVzdCBjYXNlICIgPDwgY2FzZW51bSA8PCAiIGRvZXMgbm90IGV4aXN0LiIgPDwgZW5kbDsKCQkJfQoJCQlyZXR1cm47CgkJfQoKCQlpbnQgY29ycmVjdCA9IDAsIHRvdGFsID0gMDsKCQlmb3IgKGludCBpPTA7OyArK2kpIHsKCQkJaW50IHggPSBydW5fdGVzdF9jYXNlKGkpOwoJCQlpZiAoeCA9PSAtMSkgewoJCQkJaWYgKGkgPj0gMTAwKSBicmVhazsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCWNvcnJlY3QgKz0geDsKCQkJKyt0b3RhbDsKCQl9CgoJCWlmICh0b3RhbCA9PSAwKSB7CgkJCWNlcnIgPDwgIk5vIHRlc3QgY2FzZXMgcnVuLiIgPDwgZW5kbDsKCQl9IGVsc2UgaWYgKGNvcnJlY3QgPCB0b3RhbCkgewoJCQljZXJyIDw8ICJTb21lIGNhc2VzIEZBSUxFRCAocGFzc2VkICIgPDwgY29ycmVjdCA8PCAiIG9mICIgPDwgdG90YWwgPDwgIikuIiA8PCBlbmRsOwoJCX0gZWxzZSB7CgkJCWNlcnIgPDwgIkFsbCAiIDw8IHRvdGFsIDw8ICIgdGVzdHMgcGFzc2VkISIgPDwgZW5kbDsKCQl9Cgl9CgoJaW50IHZlcmlmeV9jYXNlKGludCBjYXNlbnVtLCBjb25zdCBpbnQgJmV4cGVjdGVkLCBjb25zdCBpbnQgJnJlY2VpdmVkLCBjbG9ja190IGVsYXBzZWQpIHsKCQljZXJyIDw8ICJFeGFtcGxlICIgPDwgY2FzZW51bSA8PCAiLi4uICI7CgoJCXN0cmluZyB2ZXJkaWN0OwoJCXZlY3RvcjxzdHJpbmc+IGluZm87CgkJY2hhciBidWZbMTAwXTsKCgkJaWYgKGVsYXBzZWQgPiBDTE9DS1NfUEVSX1NFQyAvIDIwMCkgewoJCQlzcHJpbnRmKGJ1ZiwgInRpbWUgJS4yZnMiLCBlbGFwc2VkICogKDEuMC9DTE9DS1NfUEVSX1NFQykpOwoJCQlpbmZvLnB1c2hfYmFjayhidWYpOwoJCX0KCgkJaWYgKGV4cGVjdGVkID09IHJlY2VpdmVkKSB7CgkJCXZlcmRpY3QgPSAiUEFTU0VEIjsKCQl9IGVsc2UgewoJCQl2ZXJkaWN0ID0gIkZBSUxFRCI7CgkJfQoKCQljZXJyIDw8IHZlcmRpY3Q7CgkJaWYgKCFpbmZvLmVtcHR5KCkpIHsKCQkJY2VyciA8PCAiICgiOwoJCQlmb3IgKGludCBpPTA7IGk8KGludClpbmZvLnNpemUoKTsgKytpKSB7CgkJCQlpZiAoaSA+IDApIGNlcnIgPDwgIiwgIjsKCQkJCWNlcnIgPDwgaW5mb1tpXTsKCQkJfQoJCQljZXJyIDw8ICIpIjsKCQl9CgkJY2VyciA8PCBlbmRsOwoKCQlpZiAodmVyZGljdCA9PSAiRkFJTEVEIikgewoJCQljZXJyIDw8ICIgICAgRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgZW5kbDsKCQkJY2VyciA8PCAiICAgIFJlY2VpdmVkOiAiIDw8IHJlY2VpdmVkIDw8IGVuZGw7CgkJfQoKCQlyZXR1cm4gdmVyZGljdCA9PSAiUEFTU0VEIjsKCX0KCglpbnQgcnVuX3Rlc3RfY2FzZShpbnQgY2FzZW51bV9fKSB7CgkJc3dpdGNoIChjYXNlbnVtX18pIHsKCQljYXNlIDA6IHsKCQkJaW50IG1hZ2ljUG93ZXJbXSAgICAgICAgICA9IHsxLCAyfTsKCQkJc3RyaW5nIG1hZ2ljQm9uZFtdICAgICAgICA9IHsiTlkiLAogIllOIn07CgkJCWludCBrICAgICAgICAgICAgICAgICAgICAgPSAxOwoJCQlpbnQgZXhwZWN0ZWRfXyAgICAgICAgICAgID0gMjsKCgkJCWNsb2NrX3Qgc3RhcnRfXyAgICAgICAgICAgPSBjbG9jaygpOwoJCQlpbnQgcmVjZWl2ZWRfXyAgICAgICAgICAgID0gTWFnaWNNb2xlY3VsZUVhc3koKS5tYXhNYWdpY1Bvd2VyKHZlY3RvciA8aW50PihtYWdpY1Bvd2VyLCBtYWdpY1Bvd2VyICsgKHNpemVvZiBtYWdpY1Bvd2VyIC8gc2l6ZW9mIG1hZ2ljUG93ZXJbMF0pKSwgdmVjdG9yIDxzdHJpbmc+KG1hZ2ljQm9uZCwgbWFnaWNCb25kICsgKHNpemVvZiBtYWdpY0JvbmQgLyBzaXplb2YgbWFnaWNCb25kWzBdKSksIGspOwoJCQlyZXR1cm4gdmVyaWZ5X2Nhc2UoY2FzZW51bV9fLCBleHBlY3RlZF9fLCByZWNlaXZlZF9fLCBjbG9jaygpLXN0YXJ0X18pOwoJCX0KCQljYXNlIDE6IHsKCQkJaW50IG1hZ2ljUG93ZXJbXSAgICAgICAgICA9IHsxMDAsIDEsIDEwMH07CgkJCXN0cmluZyBtYWdpY0JvbmRbXSAgICAgICAgPSB7Ik5ZTiIsCiAiWU5ZIiwKICJOWU4ifTsKCQkJaW50IGsgICAgICAgICAgICAgICAgICAgICA9IDE7CgkJCWludCBleHBlY3RlZF9fICAgICAgICAgICAgPSAxOwoKCQkJY2xvY2tfdCBzdGFydF9fICAgICAgICAgICA9IGNsb2NrKCk7CgkJCWludCByZWNlaXZlZF9fICAgICAgICAgICAgPSBNYWdpY01vbGVjdWxlRWFzeSgpLm1heE1hZ2ljUG93ZXIodmVjdG9yIDxpbnQ+KG1hZ2ljUG93ZXIsIG1hZ2ljUG93ZXIgKyAoc2l6ZW9mIG1hZ2ljUG93ZXIgLyBzaXplb2YgbWFnaWNQb3dlclswXSkpLCB2ZWN0b3IgPHN0cmluZz4obWFnaWNCb25kLCBtYWdpY0JvbmQgKyAoc2l6ZW9mIG1hZ2ljQm9uZCAvIHNpemVvZiBtYWdpY0JvbmRbMF0pKSwgayk7CgkJCXJldHVybiB2ZXJpZnlfY2FzZShjYXNlbnVtX18sIGV4cGVjdGVkX18sIHJlY2VpdmVkX18sIGNsb2NrKCktc3RhcnRfXyk7CgkJfQoJCWNhc2UgMjogewoJCQlpbnQgbWFnaWNQb3dlcltdICAgICAgICAgID0gezEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9OwoKCQkJc3RyaW5nIG1hZ2ljQm9uZFtdICAgICAgICA9IHsiTllZWVlZWVlZWVlZWVlZWVlZWVlZTllZTllZWVlZWVlZWVlZWVlZWVlZIiwgIllOWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlOWVlZWVlZWVlZWVlZWSIsICJZWU5ZWVlZWVlZWVlZWVlZWVlZWVlZWVlOWVlZWVlZWVlZWVlZWVlZWVkiLCAiWVlZTllZWVlZWVlZWU5ZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlOIiwgIllZWVlOWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWSIsICJZWVlZWU5ZWVlZTllZWVlZWVlZWVlOWVlZWVlZWVlZWVlZWVlZWVlZWVkiLCAiWVlZWVlZTllZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZIiwgIllZWVlZWVlOWVlZWVlZWVlZWU5ZWVlZWVlZWVlZWVlOWVlZWVlZWVlZWSIsICJZWVlZWVlZWU5ZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVkiLCAiWVlZWVlZWVlZTllZWVlZWVlZWVlZWVlZWVlZWU5ZWVlZWVlZWVlZWVlZIiwgIllZWVlZTllZWVlOWVlOWVlZWVlZWVlZWVlZWVlZWVlZWU5ZWVlZWVlZWSIsICJZWVlZWVlZWVlZWU5ZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVkiLCAiWVlZWVlZWVlZWVlZTllZWU5ZWVlZWVlZWVlZWVlOWVlOWVlZWVlZWVlZIiwgIllZWU5ZWVlZWVlOWVlOWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlOWSIsICJZWVlZWVlZWVlZWVlZWU5ZWVlZWVlZWVlZWVlZWVlOWVlZWVlZWVlZWVkiLCAiWVlZWVlZWVlZWVlZWVlZTllZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZIiwgIllZWVlZWVlZWVlZWU5ZWVlOWVlZWVlZWVlZTk5ZWVlZWVlZWVlZWVlZWSIsICJZWVlZWVlZWVlZWVlZWVlZWU5ZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVkiLCAiWVlZWVlZWU5ZWVlZWVlZWVlZTllZWVlZWVlZWVlZWVlZWVlZWVlZWVlZIiwgIllZWVlZWVlZWVlZWVlZWVlZWVlOWVlZWVlZWVlOTllZWVlZWVlZWVlZWSIsICJZWVlZWVlZWVlZWVlZWVlZWVlZWU5ZWVlZWVlZWVlZWVlZWVlZWVlZWVkiLCAiTllZWVlOWVlZWVlZWVlZWVlZWVlZTllZWVlZWVlZWVlZWVlZWVlZWVlZIiwgIllZWVlZWVlZWVlZWVlZWVlZWVlZWVlOWVlZWVlZWVlZWVlOWVlZWVlOWSIsICJZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWU5ZWVlZWVlZWVlZWVlZWVlZWVkiLCAiTllOWVlZWVlZWVlZWVlZWVlZWVlZWVlZTllZWVlZWVlZWVlZWVlZWVlZIiwgIllZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlOWVlZWVlZWVlZWVlZWVlZWSIsICJZWVlZWVlZWVlZWVlZWVlZTllZWVlZWVlZWU5ZWVlZWVlZWVlZWVlZWVkiLCAiWVlZWVlZWVlZWVlZWVlZWU5ZWVlZWVlZWVlZTllZWVlZWVlZWVlZWVlZIiwgIllOWVlZWVlZWU5ZWVlZWVlZWVlOWVlZWVlZWVlOWVlZWVlZWVlZWU5ZWSIsICJZWVlZWVlZWVlZWVlOWVlZWVlZTllZWVlZWVlZWU5ZWVlZTllZWVlZWVkiLCAiWVlZWVlZWVlZWVlZWVlOWVlZWVlZWVlZWVlZWVlZTllZWVlZWVlZWVlZIiwgIllZWVlZWVlOWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlOWVlZWVlZWVlZWSIsICJZWVlZWVlZWVlZWVlOWVlZWVlZWVlZWVlZWVlZWVlZWU5ZWVlZWVlZTlkiLCAiWVlZWVlZWVlZWU5ZWVlZWVlZWVlZWVlZWVlZWVlZWVlZTllZWVlZTllZIiwgIllZWVlZWVlZWVlZWVlZWVlZWVlZWVlOWVlZWVlZTllZWVlOWVlZTllZWSIsICJZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWU5ZWU5ZWVkiLCAiWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZTllZWVlZIiwgIllZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlOWVlZWSIsICJZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZTk5ZWU5ZWVkiLCAiWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWU5ZWVlZTllZWVlZTk5ZIiwgIllZWVlZWVlZWVlZWVlOWVlZWVlZWVlOWVlZWVlZWVlZTllZWVlZWU5OWSIsICJZWVlOWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWU4ifTsKCQkJaW50IGsgICAgICAgICAgICAgICAgICAgICA9IDEzOwoJCQlpbnQgZXhwZWN0ZWRfXyAgICAgICAgICAgID0gLTE7CgoJCQljbG9ja190IHN0YXJ0X18gICAgICAgICAgID0gY2xvY2soKTsKCQkJaW50IHJlY2VpdmVkX18gICAgICAgICAgICA9IE1hZ2ljTW9sZWN1bGVFYXN5KCkubWF4TWFnaWNQb3dlcih2ZWN0b3IgPGludD4obWFnaWNQb3dlciwgbWFnaWNQb3dlciArIChzaXplb2YgbWFnaWNQb3dlciAvIHNpemVvZiBtYWdpY1Bvd2VyWzBdKSksIHZlY3RvciA8c3RyaW5nPihtYWdpY0JvbmQsIG1hZ2ljQm9uZCArIChzaXplb2YgbWFnaWNCb25kIC8gc2l6ZW9mIG1hZ2ljQm9uZFswXSkpLCBrKTsKCQkJcmV0dXJuIHZlcmlmeV9jYXNlKGNhc2VudW1fXywgZXhwZWN0ZWRfXywgcmVjZWl2ZWRfXywgY2xvY2soKS1zdGFydF9fKTsKCQl9CgkJY2FzZSAzOiB7CgkJCWludCBtYWdpY1Bvd2VyW10gICAgICAgICAgPSB7NCwgNywgNSwgOH07CgkJCXN0cmluZyBtYWdpY0JvbmRbXSAgICAgICAgPSB7Ik5ZTlkiLAogIllOWU4iLAogIk5ZTlkiLAogIllOWU4ifTsKCQkJaW50IGsgICAgICAgICAgICAgICAgICAgICA9IDI7CgkJCWludCBleHBlY3RlZF9fICAgICAgICAgICAgPSAxNTsKCgkJCWNsb2NrX3Qgc3RhcnRfXyAgICAgICAgICAgPSBjbG9jaygpOwoJCQlpbnQgcmVjZWl2ZWRfXyAgICAgICAgICAgID0gTWFnaWNNb2xlY3VsZUVhc3koKS5tYXhNYWdpY1Bvd2VyKHZlY3RvciA8aW50PihtYWdpY1Bvd2VyLCBtYWdpY1Bvd2VyICsgKHNpemVvZiBtYWdpY1Bvd2VyIC8gc2l6ZW9mIG1hZ2ljUG93ZXJbMF0pKSwgdmVjdG9yIDxzdHJpbmc+KG1hZ2ljQm9uZCwgbWFnaWNCb25kICsgKHNpemVvZiBtYWdpY0JvbmQgLyBzaXplb2YgbWFnaWNCb25kWzBdKSksIGspOwoJCQlyZXR1cm4gdmVyaWZ5X2Nhc2UoY2FzZW51bV9fLCBleHBlY3RlZF9fLCByZWNlaXZlZF9fLCBjbG9jaygpLXN0YXJ0X18pOwoJCX0KCQljYXNlIDQ6IHsKCQkJaW50IG1hZ2ljUG93ZXJbXSAgICAgICAgICA9IHs0NjQ3NCwgNjA4NDgsIDk4MjgyLCA1ODA3MywgNDI2NzAsIDUwMzczfTsKCQkJc3RyaW5nIG1hZ2ljQm9uZFtdICAgICAgICA9IHsiTllOTk5ZIiwgIllOTllOWSIsICJOTk5ZWVkiLCAiTllZTk5OIiwgIk5OWU5OTiIsICJZWVlOTk4ifTsKCQkJaW50IGsgICAgICAgICAgICAgICAgICAgICA9IDM7CgkJCWludCBleHBlY3RlZF9fICAgICAgICAgICAgPSAyMDk1MDM7CgoJCQljbG9ja190IHN0YXJ0X18gICAgICAgICAgID0gY2xvY2soKTsKCQkJaW50IHJlY2VpdmVkX18gICAgICAgICAgICA9IE1hZ2ljTW9sZWN1bGVFYXN5KCkubWF4TWFnaWNQb3dlcih2ZWN0b3IgPGludD4obWFnaWNQb3dlciwgbWFnaWNQb3dlciArIChzaXplb2YgbWFnaWNQb3dlciAvIHNpemVvZiBtYWdpY1Bvd2VyWzBdKSksIHZlY3RvciA8c3RyaW5nPihtYWdpY0JvbmQsIG1hZ2ljQm9uZCArIChzaXplb2YgbWFnaWNCb25kIC8gc2l6ZW9mIG1hZ2ljQm9uZFswXSkpLCBrKTsKCQkJcmV0dXJuIHZlcmlmeV9jYXNlKGNhc2VudW1fXywgZXhwZWN0ZWRfXywgcmVjZWl2ZWRfXywgY2xvY2soKS1zdGFydF9fKTsKCQl9CgkJY2FzZSA1OiB7CgkJCWludCBtYWdpY1Bvd2VyW10gICAgICAgICAgPSB7MSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMX07CgkJCXN0cmluZyBtYWdpY0JvbmRbXSAgICAgICAgPSB7Ik5OWVlZTllZTllOTlkiLCAiTk5ZTllZWVlZWVlOWSIsICJZWU5ZWU5ZWVlZWVlZIiwgIllOWU5ZWU5ZWVlZWVkiLAogIllZWVlOTllZWVlZTlkiLCAiTllOWU5OWVlZWVlOTiIsICJZWVlOWVlOWVlZWVlZIiwgIllZWVlZWVlOWU5ZWVkiLAogIk5ZWVlZWVlZTllZWVkiLCAiWVlZWVlZWU5ZTk5OTiIsICJOWVlZWVlZWVlOTllOIiwgIk5OWVlOTllZWU5ZTk4iLCAiWVlZWVlOWVlZTk5OTiJ9OwoJCQlpbnQgayAgICAgICAgICAgICAgICAgICAgID0gOTsKCQkJaW50IGV4cGVjdGVkX18gICAgICAgICAgICA9IC0xOwoKCQkJY2xvY2tfdCBzdGFydF9fICAgICAgICAgICA9IGNsb2NrKCk7CgkJCWludCByZWNlaXZlZF9fICAgICAgICAgICAgPSBNYWdpY01vbGVjdWxlRWFzeSgpLm1heE1hZ2ljUG93ZXIodmVjdG9yIDxpbnQ+KG1hZ2ljUG93ZXIsIG1hZ2ljUG93ZXIgKyAoc2l6ZW9mIG1hZ2ljUG93ZXIgLyBzaXplb2YgbWFnaWNQb3dlclswXSkpLCB2ZWN0b3IgPHN0cmluZz4obWFnaWNCb25kLCBtYWdpY0JvbmQgKyAoc2l6ZW9mIG1hZ2ljQm9uZCAvIHNpemVvZiBtYWdpY0JvbmRbMF0pKSwgayk7CgkJCXJldHVybiB2ZXJpZnlfY2FzZShjYXNlbnVtX18sIGV4cGVjdGVkX18sIHJlY2VpdmVkX18sIGNsb2NrKCktc3RhcnRfXyk7CgkJfQoJCWNhc2UgNjogewoJCQlpbnQgbWFnaWNQb3dlcltdICAgICAgICAgID0gezEsIDF9OwoJCQlzdHJpbmcgbWFnaWNCb25kW10gICAgICAgID0geyJOTiIsICJOTiJ9OwoJCQlpbnQgayAgICAgICAgICAgICAgICAgICAgID0gMTsKCQkJaW50IGV4cGVjdGVkX18gICAgICAgICAgICA9IDE7CgoJCQljbG9ja190IHN0YXJ0X18gICAgICAgICAgID0gY2xvY2soKTsKCQkJaW50IHJlY2VpdmVkX18gICAgICAgICAgICA9IE1hZ2ljTW9sZWN1bGVFYXN5KCkubWF4TWFnaWNQb3dlcih2ZWN0b3IgPGludD4obWFnaWNQb3dlciwgbWFnaWNQb3dlciArIChzaXplb2YgbWFnaWNQb3dlciAvIHNpemVvZiBtYWdpY1Bvd2VyWzBdKSksIHZlY3RvciA8c3RyaW5nPihtYWdpY0JvbmQsIG1hZ2ljQm9uZCArIChzaXplb2YgbWFnaWNCb25kIC8gc2l6ZW9mIG1hZ2ljQm9uZFswXSkpLCBrKTsKCQkJcmV0dXJuIHZlcmlmeV9jYXNlKGNhc2VudW1fXywgZXhwZWN0ZWRfXywgcmVjZWl2ZWRfXywgY2xvY2soKS1zdGFydF9fKTsKCQl9CgkJY2FzZSA3OiB7CgkJCWludCBtYWdpY1Bvd2VyW10gICAgICAgICAgPSB7MSwxLDIsNSwyLDQsMn07CgkJCXN0cmluZyBtYWdpY0JvbmRbXSAgICAgICAgPSB7Ik5OTk5OTk4iLCJOTllOTk5OIiwiTllOTk5ZTiIsIk5OTk5OTlkiLCJOTk5OTk5OIiwiTk5ZTk5OTiIsIk5OTllOTk4ifTsKCQkJaW50IGsgICAgICAgICAgICAgICAgICAgICA9IDM7CgkJCWludCBleHBlY3RlZF9fICAgICAgICAgICAgPSAxMTsKCgkJCWNsb2NrX3Qgc3RhcnRfXyAgICAgICAgICAgPSBjbG9jaygpOwoJCQlpbnQgcmVjZWl2ZWRfXyAgICAgICAgICAgID0gTWFnaWNNb2xlY3VsZUVhc3koKS5tYXhNYWdpY1Bvd2VyKHZlY3RvciA8aW50PihtYWdpY1Bvd2VyLCBtYWdpY1Bvd2VyICsgKHNpemVvZiBtYWdpY1Bvd2VyIC8gc2l6ZW9mIG1hZ2ljUG93ZXJbMF0pKSwgdmVjdG9yIDxzdHJpbmc+KG1hZ2ljQm9uZCwgbWFnaWNCb25kICsgKHNpemVvZiBtYWdpY0JvbmQgLyBzaXplb2YgbWFnaWNCb25kWzBdKSksIGspOwoJCQlyZXR1cm4gdmVyaWZ5X2Nhc2UoY2FzZW51bV9fLCBleHBlY3RlZF9fLCByZWNlaXZlZF9fLCBjbG9jaygpLXN0YXJ0X18pOwoJCX0KCgkJLy8gY3VzdG9tIGNhc2VzCgovKiAgICAgIGNhc2UgODogewoJCQlpbnQgbWFnaWNQb3dlcltdICAgICAgICAgID0gOwoJCQlzdHJpbmcgbWFnaWNCb25kW10gICAgICAgID0gOwoJCQlpbnQgayAgICAgICAgICAgICAgICAgICAgID0gOwoJCQlpbnQgZXhwZWN0ZWRfXyAgICAgICAgICAgID0gOwoKCQkJY2xvY2tfdCBzdGFydF9fICAgICAgICAgICA9IGNsb2NrKCk7CgkJCWludCByZWNlaXZlZF9fICAgICAgICAgICAgPSBNYWdpY01vbGVjdWxlRWFzeSgpLm1heE1hZ2ljUG93ZXIodmVjdG9yIDxpbnQ+KG1hZ2ljUG93ZXIsIG1hZ2ljUG93ZXIgKyAoc2l6ZW9mIG1hZ2ljUG93ZXIgLyBzaXplb2YgbWFnaWNQb3dlclswXSkpLCB2ZWN0b3IgPHN0cmluZz4obWFnaWNCb25kLCBtYWdpY0JvbmQgKyAoc2l6ZW9mIG1hZ2ljQm9uZCAvIHNpemVvZiBtYWdpY0JvbmRbMF0pKSwgayk7CgkJCXJldHVybiB2ZXJpZnlfY2FzZShjYXNlbnVtX18sIGV4cGVjdGVkX18sIHJlY2VpdmVkX18sIGNsb2NrKCktc3RhcnRfXyk7CgkJfSovCi8qICAgICAgY2FzZSA5OiB7CgkJCWludCBtYWdpY1Bvd2VyW10gICAgICAgICAgPSA7CgkJCXN0cmluZyBtYWdpY0JvbmRbXSAgICAgICAgPSA7CgkJCWludCBrICAgICAgICAgICAgICAgICAgICAgPSA7CgkJCWludCBleHBlY3RlZF9fICAgICAgICAgICAgPSA7CgoJCQljbG9ja190IHN0YXJ0X18gICAgICAgICAgID0gY2xvY2soKTsKCQkJaW50IHJlY2VpdmVkX18gICAgICAgICAgICA9IE1hZ2ljTW9sZWN1bGVFYXN5KCkubWF4TWFnaWNQb3dlcih2ZWN0b3IgPGludD4obWFnaWNQb3dlciwgbWFnaWNQb3dlciArIChzaXplb2YgbWFnaWNQb3dlciAvIHNpemVvZiBtYWdpY1Bvd2VyWzBdKSksIHZlY3RvciA8c3RyaW5nPihtYWdpY0JvbmQsIG1hZ2ljQm9uZCArIChzaXplb2YgbWFnaWNCb25kIC8gc2l6ZW9mIG1hZ2ljQm9uZFswXSkpLCBrKTsKCQkJcmV0dXJuIHZlcmlmeV9jYXNlKGNhc2VudW1fXywgZXhwZWN0ZWRfXywgcmVjZWl2ZWRfXywgY2xvY2soKS1zdGFydF9fKTsKCQl9Ki8KLyogICAgICBjYXNlIDEwOiB7CgkJCWludCBtYWdpY1Bvd2VyW10gICAgICAgICAgPSA7CgkJCXN0cmluZyBtYWdpY0JvbmRbXSAgICAgICAgPSA7CgkJCWludCBrICAgICAgICAgICAgICAgICAgICAgPSA7CgkJCWludCBleHBlY3RlZF9fICAgICAgICAgICAgPSA7CgoJCQljbG9ja190IHN0YXJ0X18gICAgICAgICAgID0gY2xvY2soKTsKCQkJaW50IHJlY2VpdmVkX18gICAgICAgICAgICA9IE1hZ2ljTW9sZWN1bGVFYXN5KCkubWF4TWFnaWNQb3dlcih2ZWN0b3IgPGludD4obWFnaWNQb3dlciwgbWFnaWNQb3dlciArIChzaXplb2YgbWFnaWNQb3dlciAvIHNpemVvZiBtYWdpY1Bvd2VyWzBdKSksIHZlY3RvciA8c3RyaW5nPihtYWdpY0JvbmQsIG1hZ2ljQm9uZCArIChzaXplb2YgbWFnaWNCb25kIC8gc2l6ZW9mIG1hZ2ljQm9uZFswXSkpLCBrKTsKCQkJcmV0dXJuIHZlcmlmeV9jYXNlKGNhc2VudW1fXywgZXhwZWN0ZWRfXywgcmVjZWl2ZWRfXywgY2xvY2soKS1zdGFydF9fKTsKCQl9Ki8KCQlkZWZhdWx0OgoJCQlyZXR1cm4gLTE7CgkJfQoJfQp9CgoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewoJaWYgKGFyZ2MgPT0gMSkgewoJCW1val9oYXJuZXNzOjpydW5fdGVzdCgpOwoJfSBlbHNlIHsKCQlmb3IgKGludCBpPTE7IGk8YXJnYzsgKytpKQoJCQltb2pfaGFybmVzczo6cnVuX3Rlc3QoYXRvaShhcmd2W2ldKSk7Cgl9Cn0KLy8gRU5EIENVVCBIRVJFCgoK