ITSMCore
9.0.10
OFORK
https://o-fork.de/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
New release.
New release.
New release.
New release.
New release.
New release.
Bugfixing.
New release.
Added new functions.
Init release.
The OFORK::ITSM Core package.
Das OFORK::ITSM Core Paket.
9.0.x
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to install the OFORK package ITSMCore.<br/>
<br/>
<br/>
<strong>REQUIRED OFORK PACKAGES</strong>
<ul>
<li>GeneralCatalog 9.0.10</li>
</ul>
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>WILLKOMMEN</strong>
<br/>
<br/>
Sie sind im Begriff das OFORK-Paket ITSMCore zu installieren.<br/>
<br/>
<br/>
<strong>BENÖTIGTE OFORK-PAKETE</strong>
<ul>
<li>GeneralCatalog 9.0.10</li>
</ul>
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>NOTICE</strong>
<br/>
<br/>
In order to grant users access to the service menu, you need to add them as member to the group 'itsm-service'.
<br/>
<br/>
The menu items that were added by this package will be visible after you log-in to the system again.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>HINWEIS</strong>
<br/>
<br/>
Um Benutzern Zugriff auf das Service-Menü zu gewähren, müssen diese Mitglied der neuen Gruppe 'itsm-service' sein.
<br/>
<br/>
Die von diesem Paket hinzugefügten Menü-Punkte sind erst nach einem erneuten Anmeldevorgang im System sichtbar.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
If you uninstall this package, all database tables that were created during installation will be deleted.
All data from these tables will be irrevocably lost!
<br/>
<br/>
The group 'itsm-service' that was created during package installation will be deactivated.
You can activate this group again in the admin area.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ACHTUNG</strong>
<br/>
<br/>
Bei der Deinstallation werden die von diesem Paket angelegten Datenbank-Tabellen gelöscht.
Alle darin enthaltenen Daten gehen unwiderruflich verloren!
<br/>
<br/>
Die von diesem Paket angelegte Gruppe 'itsm-service' wird deaktiviert.
Sie kann jederzeit im Admin-Bereich wieder aktiviert werden.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to upgrade the OFORK package ITSMCore.<br/>
<br/>
<br/>
<strong>REQUIRED OFORK PACKAGES</strong>
<ul>
<li>GeneralCatalog 9.0.10</li>
</ul>
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>WILLKOMMEN</strong>
<br/>
<br/>
Sie sind im Begriff das OFORK-Paket ITSMCore zu aktualisieren.<br/>
<br/>
<br/>
<strong>BENÖTIGTE OFORK-PAKETE</strong>
<ul>
<li>GeneralCatalog 9.0.10</li>
</ul>
<br/>
<br/>
((enjoy))<br/>
<br/>
GeneralCatalog
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeInstall();
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# discard internally stored object, so that the next access to object creates them newly
$Kernel::OM->ObjectsDiscard(
Objects => [$CodeModule],
ForcePackageReload => 1,
);
$Kernel::OM->Get($CodeModule)->CodeUpgrade();
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeUninstall();
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeReinstall();
2020-09-06 13:41:09
localhost
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uPDGG28kJSX5+Ph88MEHEyZMEATBzc3N+DFtUqlUTGTEyMaQvzR7rLGoqKijR48a5qMZOnV1da2qqnJxcREEoaGhwdXV1TC2q1evjh8//tq1a+27zPr6+o8//viNN97QarVKpdLFxSUjI8PHx0fcWl5ebia0kslkxjkU7rW8vDy9Xh8aGurs7GzrsaDN3nvvve3bt1dWVprZh2gJAIC75GTrAQAA8AsXF5e6ujqxgKi0tNTQPmjQoH379un1+oSEhHnz5ok1COHh4d9++21ERETT8xjX9TR7rLEhQ4acOnWq6VJHISEh169fF3/hNEmRTp06NWzYsHZfpqur69KlS//0pz9t3rx59erVt27d+vjjjw3LOXl7e7f7zOhYer1eo9EIghAVFSWTyWw9HLSZl5eXrYcAAEDnx1pLAAA7Mnjw4Hfffbe2tjY3N3fBggWG9qeeeiozM1N8bJZh1Zvnn39+/vz5WVlZjY2NP/3005NPPtnsOZs91tjkyZN3797dtH327NlLly4tKioqKir6y1/+Yrxp9+7dkydPbu9V/szV1fWFF14oLCzcuHHj4cOHKyoq7vKE6HDijEXBimstAQAAOBzukwAAduTjjz9OTEz08/MbM2bM+PHjDe1Tp06dMWOGp6fnq6+++sUXX4iNixcvnjJlyowZMzw8PObMmfPUU081e85mjzU2c+bMlJSUK1eumLQvX748KioqOjp60KBBjzzyiKE9Ozv77Nmz06dPv9urFQRBEFxcXBYvXnzx4kWmqNshcYqlVCplfSsAAICWsNYSAADC2rVrT548efjwYUt2njRp0qhRo1566aV7PSrYnDghTqfTdenSxdZjQXusWLHio48+Yq0lAADuKdZaAgBAePnlly3f2cIECp2ARCJh9W4AAADzmBAHAABgF9RqdUNDgzgLDwAAwFEQLQEAANiFqqqqgoKC6upqWw8EAACgDYiWAAAA7IJYrySTyWw9EAAAgDYgWgIAALALREsAAMARES0BAADYBaIlAADgiIiWAAAA7ALREgAAcERESwAAALan1+vFaMnJycnWYwEAAGgD7l0AAACad+fOHa1W6+7u7uzsfK/7EnMliURC1RIAAHAsREsAAADNq6ysbGxslMvlVouWyJUAAIDDIVoCAABonkKhUKvV1pmhptFoBKIlAADggIiWAAAAmufr62u1vqha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JvPwww/XRn80Icvy2972Nvfpz87OvvKVr9yxY0c4HDZNM51OHzt27LHHHisWi2611PqjuOOwfv3rX19++eU+n+/cc1555ZVPPPHE0aNH77333le96lWxWGxlZeXQoUPPPPOMLMu1FdD37dv3+OOPP/300wcPHrzqqqui0Wgul3v44Ye7aQ3v0dHREydOuK3Qc889Vzs+OTn5wAMP1Fq2dTU5v/4dxTve8Y4777zzO9/5jvszb3Fg3cTExPHjx1/2spfVH2x0qVVvYNZ9xNHR0eeee+6lL32pIAjHjx93hxoJjX8y9fbu3fvggw+eWS2NjY3Vrvnss8/Wf+nBBx/ct29fK896XZqmffOb3/zYxz728Y9//Mc//rFpmisrKwcPHnSXDAMAz1Wr1enpadu2Q6HQyMhIbxZMAAD0OKqlDZqYmLjlllu++93vzs/P//CHPzzzhEgkcuDAgfq7N99887e+9a2jR48ePXr03AOc+wVf85rXfOMb3zh+/Li72Zxr3759rSw/PD4+fsstt3znO9+ZnZ295557Vn3V5/O5vdJZPcpLX/rSQ4cOPfDAAw888IB7xF0NfcM5h4eH3/jGNx48ePDIkSP1IztEUTxw4MDQ0FDttD/4gz/40Y9+9Nhjj9Vfc+/evYcPH25xxE2bu+mmmz70oQ995StfEQThQx/6UO34e9/73ne/+91f/OIXd+/effTo0U9/+tPf/OY3m1ynxfOLxWI0Gg2FQlNTU3/5l3/ZYshbbrnl1ltv/epXv9rX1/fJT37SnRPX6FL9/f2//e1vL7744hYf8aabbrrtttv++Z//WRCE22677aabbmr+k6n3pje96dvf/vaf/umfrjp+8803f/CDH/za174mCMIHPvCB+i9997vfvfnmm1t84q247LLL7r333qeeeupjH/vYfffd99nPfvYLX/jCJl4fADbM7/ePjY3NzMwUi8WFhYXaoFcAANA7unNpye0xMTFx6623vvnNb77wwguj0aiiKKqqxmKxiy+++Prrr7/ttttq73td4+Pj73vf+173uteNj48HAgFJkgKBwNjY2Gte85r3ve99Gwhwjhd8yUtecvPNN09MTCiK4vP5xsbG3vzmN9fXYes++q233vqmN73pggsucJ++3+8fGRm59tprb7vttpe//OVn+yjXXnvt1VdfnUgkVrU555Lziiuu+LM/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yZIlr7zySnV3NLCYUZU9wkr6TzzvvPO2v/p55523/cjDW7FixZ//+Z8vWLCgvr5+zpw5Z5999qpVq6q797EWC8Ow1jUAAMD/6e3t3bhxYzKZ3GeffWpdC8AU9c1vfnPJkiXlcnlQeyKRuP3222+44Yb+lpEEJf2xw1CdZ8+evXr16n333be/ZfPmzSeeeOLatWuHH3BUoqtH54687JFXEo0Zi8Xq6+vff//9GTNm9B/q6OiYO3duPp+P+u+0/kqlctVVV913333DX3H8MGsJAIBxJJPJxGKxYrFYKBRqXQvAVPStb33rpptuqlQqF1100bPPPtvd3d3b27tmzZqLL764UqnceOON3/72t/s7h79vmMbtT9m8efPy5cv322+/TZs2/fVf//XAPjfccMPatWvnz5//ve997913383n8x0dHatXr7799tsPOeSQXb/HkZc92kpOPPHEXC73yCOPDGx8+OGHc7ncSSedNMLylixZct9999XV1d1www3r1q3L5/ObNm16+OGHjz766F246TFk1hIAAONLR0dHKpWKMqZa1wIwtbz77rv7779/oVB44IEHLrzwwkFHv/e97331q19NpVJvvvnmggULtj994MygER595pln/uiP/ugjH/nIpk2b+htbW1vb29tXr159zDHH7OIdjaS2YQ6NvJJokEceeeTcc8894ogjXnjhhf5DRxxxxEsvvfSv//qv55xzzlAX6vfaa68ddNBBlUplh78E45NZSwAAjC8zZsxoaGiQKwHsecuWLSsUCmeeeeYOQ40LL7zwjDPOKBQKy5Yt211XPPTQQ4Mg6OzsHNgY7bh3wAEH7PT0He5eNKotjYY38koip59+ektLy4svvvjyyy9HLS+99NJLL73U0tJy2mmnjWSE73znO5VK5dOf/vREyZUC0RIAAAAQefLJJ4MguOSSS4bqEB362c9+truu+OKLLwZBMGgO1OGHHx4EwUUXXfTGG2/srgtVZ7SV1NfXR9t433///VFL9OL888+vr68fyQgrV64MguDLX/5yVfXWhgVxAAAAQBAEQUtLy7Zt27Zu3drS0rLDDm1tbbNmzWptbW1ra9v+6KgWxLW1tT399NPf+MY31q9fv3Tp0ltuuaW/59NPP/3Zz342l8sFQbDffvsddthhBx988KJFi0444YREIrHTK468caeHqqjklVdeOeyww2bOnLlx48YgCObOndvR0fHKK68ccsghw39/IjNnzuzo6Hj55Zd/+9vf3nXXXb/+9a/r6uo++clPnn322V/72teSyeQw59aKaAkAAAAIgiBIJpOlUqlYLNbV1e2wQ7FYTKVSdXV1xWJx+6MjiZa2d8455zz44IODQpN169bdfvvty5cv7+7u7m9csGDBP/zDP5xxxhkjvJ0R1jZ82SOsZOAgRx555PPPP//II4+EYXjeeecdeeSRa9as2emFInV1deVy+frrr7/zzjsHHTrmmGOefPLJpqamEd3wHiRaAgAAAIJgj8xaGmTBggWPPfZYtO5se+Vy+de//vXatWvXrFnz+OOPv/7667FY7NFHH/2zP/uzkd7SCGobSeKz00oGDrJs2bIrrrjipJNOCsNwxYoVy5Ytu+yyy0Z4oebm5p6enlgs9ulPf/r2228/9NBDi8Xi8uXLr7/++o6Ojuuuu277yKnmREsAAABAEATBUUcd9dxzzz3xxBMnn3zyDjs88cQTn/vc54466qhnn312+6MjXxBXLBbffvvt22677aGHHpo1a9b//u//zp49e/jaKpXKkiVL7rjjjkHPXxuhXYyWdlrJwEE6OzvnzZuXzWaDIMhkMu+///60adNGeKEDDjjgjTfeaG5u/t3vfjdjxoz+9v/8z//84he/+NGPfvSdd94ZYZ17jG28AQAAgCAIgs985jNBEHz3u98dqkN0KOq2K5LJ5IEHHvj973//c5/73JYtW5YsWbLTU+Lx+I033hgEwdq1a3fx6rtop5VMnz79zDPPDMMwDMOzzjorypVG6LDDDguC4MADDxyYKwVBsGjRoiAIPvjgg+rrHjOiJQAAACAIguDyyy9PJpP/8R//8YMf/GD7ow899NAPf/jDVCp1+eWX75bLxWKxb3/723V1dQ8++OBrr7220/7RY9rGw2ZDO63koosuGvRihL7whS8EQfD66693dnYObF+1alUQBPPmzRttqXuAaAkAgPGoUqm0t7e///77tS4EYAr56Ec/+rd/+xAlpbMAAAytSURBVLdBEFxwwQWXXnrpc88919fXl81mn3/++csuu+wrX/lKEAR33HHH3nvvvbuueOCBB371q18tlUoDJy4tXLhwyZIlP/3pT9999918Pp/L5d5+++1777032tjolFNO6e8Zi8W238Jph43VGXklgyxatCiatXT88ceP6opf+tKXPv7xj3d1dS1evPjpp5/u7Oxsa2u7//77/+Iv/iIIgnPPPXcX72gs2GsJAIDxKAzDt956q1Kp7L333ul0utblAEwht91229KlSyuVyqD2eDx+66233nzzzUOdOPK9lgbauHHj/vvvn8vl1qxZ86lPfSoY+llyQRAcdNBBK1asmDNnzjBjjrxxhIeqrmTkFxrohRdeOOmkkwbNWgqC4IQTTnj88cczmczwp+95oiUAAMapbdu2xePxpqamRCJR61oAppa1a9fec889Tz311HvvvReG4YIFC0488cSrr7564cKFw5xVXbQUBMFNN930zW9+8zOf+cyTTz4ZBMFvfvOb5cuXr1q1au3atZs3bw7DsLW1deHChaeeeurFF1888P8bxjpa2sVKRn6hQTZs2HDbbbf95Cc/2bhxYyaTOfjgg88///xLL710fP6FKFoCAAAAoEr2WgIAAACgSqIlAAAAAKokWgIAAACgSqIlAAAAAKokWgIAAACgSqIlAAAAAKokWgIAAACgSqIlAADGtTAMu7u7t2zZUutCAIAdEC0BADDebd68uaOjI5/P17oQgMkvFotFX4cSBEGlUnnggQeOP/742bNnp1KpffbZ5ytf+cozzzzTP8LixYt3OPjixYujEfr99Kc//fznPz9r1qxkMjlnzpwzzjjjZz/72RjfIruZaAkAgHEtFoul0+kgCLLZbK1rAZgqwgG2f3v11Vf/8Ic/vPPOO19//fWenp4nnnjiqKOO+su//Mv+01955ZWXX3550Jgvv/zyK6+8MrBl6dKlN9988+WXX/7aa691dXU9+uij5XL55JNPHvv7Y3eKRT8WAAAwbm3btq2tra2xsXHevHm1rgVgkovFBgcF27c0NTW98847ra2tQ43wj//4jytXrvz3f//3ge1nnXXWiSeeeOWVV0ajPfHEEzfccMPq1aszmczAbn/zN3+zdOnS3XMz7BFmLQEAMN5Fnzqy2az/FgUYD+bNm/fLX/5ymA4XX3zxCy+88Nvf/ra/Zd26dS+++OLFF1/c33L33XcvXbp0UK4UBEF/rvSd73xn//33T6VS+++//3e/+93+DrFY7JFHHjn66KObmpoSiUTU+Nhjjx1++OH19fX77LPP/fffv4s3yKiYtQQAwATw5ptvViqVvffeO1ocB8AYGcmspaeeeuq8887bf//9Fy1adNBBBy1atOhjH/vYoP4PPPDAqlWrvv/970eNF1xwwQknnHDhhRf2jzZr1qzf/OY3s2bN2mEZjz766DXXXPPggw8eeeSRzz333AUXXHDvvfd+4QtfiMY/8MAD77vvvmOOOaahoSEIgmeeeebzn//8vffeu3jx4nXr1p1zzjn33HPPKaecsju/LwxNtAQAwASwcePG3t7e1tbWlpaWWtcCMJmNJFoKgqCvr2/lypXPPvvs2rVr//u///tTn/rUgw8+OGfOnP7+5XL5kEMO+fGPf7zPPvusX79+8eLFv/rVrxKJRP9oyWQym83W1dXtsIzjjjvu+uuvP/XUU6O3jz766N///d//4he/iMZftWrV8ccf39/55JNPvuyyy84888zo7bPPPnvVVVc999xzu+c7ws6IlgAAmAA6Ojq2bNnS0NAwf/78WtcCMJmNMFoaKJfLXXvttZs2bVq+fPnA/o888sgvfvGLe++994orrli0aNE555wz8OisWbNeffXVvfbaa4djtrS0vPnmmzNnzozebtu27eMf/3h7e3s0QjabHTiJddasWW1tbQNPTyQSpVJp9HdPNey1BADABBAtebDdEsA4lE6n77jjjhUrVgxqP/vss9esWfPCCy88//zzX/rSlwYdPfroo1etWlX1FQe+7enp6e7uHvgYO7nSniRaAgBgAkilUolEIgzDbDZb61oAprprrrmmXC4PbNm4cWNzc/OgbvF4/Oabb/7sZz978803x+OD84errrrq1ltv3f5P9VtvvTUIgoMOOmhg8PTzn//8k5/85FD1/OEf/uELL7xQxY2wW4iWAACYGPonLtW6EICp7u677z7yyCOXL1/e2dnZ1dW1YsWKc8899+qrr96+5+mnn75169bTTjtt+0N/8id/8qd/+qfHH3/8j3/8487Ozlwu9z//8z+nnnpq9IS466677pprrlm5cmVPT8/KlSuvvfbaG2+8cah6brnlluuuu27VqlU9PT29vb1PPfXU4sWLd+P9Mjx7LQEAMDF0dXVt2rQpnU7vvffeta4FYNIayV5Lv/zlL//5n/95xYoV7733XiaTOfjggy+55JILL7xwqP7DjPaTn/zk7rvvXrNmTWdnZ2tr63HHHXfllVeedNJJQRAsW7bsrrvueueddz72sY/deOONl1xyyTDj//znP7/lllvWrFlTqVSOOeaYJUuWRIOwB4iWAACYGIrF4vr162Ox2H777bf9wgoAoCb8lQwAwMSQTCaTyaTtlgBgXBEtAQAwYUTbLfX19dW6EADg/4iWAACYMDKZTGAnbwAYT0RLAABMGFG0lM/nBz30GgCoFdESAAATRl1dXSqVCkxcAoBxQ7QEAMBEEm23JFoCgHFCtAQAwEQSrYmzkzcAjBOiJQAAJpJMJhOPx+vq6sIwrHUtAJPcO++88+6770ave3p61q9fH73O5/Nbt24NgqC3t3fDhg0bNmz44IMPBp44sPPWrVvXrVs3zMhBEHR2dpqOOnHF/JUMAMDEEoZhLBardRUAk9xjjz32q1/9qr29fd999z3zzDO//vWvH3roofX19V/84hf/7u/+bsuWLcuXL3/++ef/67/+K5vNPvfcc0888UR04vvvv9/f+YQTTrjtttuOPfbYN998c9myZduPfPXVV3d3d59wwgl/9Vd/deaZZ9budqmeaAkAAADYsa6uriuuuOLYY49duHDhH//xH59++uk/+tGPgiA49dRTly9fHvX5wQ9+UFdXd84550Rv77nnnv7OF1100RtvvHH++ed/7Wtf+7d/+7ftR3744YeXLl3a0tKyYMEC0dIEZUEcAAAAsANhGN5www3XX3/9li1bZs2aNVS3Rx999LTTTnvrrbeef/75bDY7sPMRRxyxevXqa6655pRTTunvMHDklStXfuITn9hrr7320C0xBkRLAAAAwA5cd911Z5111mGHHTZ//vyNGzcGQbD9euQ33nhjwYIF6XR648aN69aty+VyAzvff//9X//61x9++OEf/ehH/R0GjrxixYrVq1c/9NBD999/v+2WJigL4gAAAIDB/umf/um+++477rjjDjjggC9/+cuXX3753LlzDz300FNPPXXp0qWPP/74pZdeetNNN918881nnXXW4Ycf3n9ie3t7f+eFCxfeeeedBx54YG9v77e+9a3tR7722muDIPiXf/mXdDptQdwEJVoCAAAAdiIMw1wul8lkRtu5VCpls9nm5uYxLpCaES0BAAAAUCV7LQEAAABQJdESAAATVblcLpVKta4CAKY00RIAABNSe3v7W2+91d7eXutCAGBKEy0BADAhpVKpIAjMWgKA2rKNNwAAE1IYhpVKJZFI1LoQAJjSREsAAAAAVMmCOAAAAACqJFoCAAAAoEqiJQAAAACqJFoCAAAAoEqiJQAAAACqJFoCAAAAoEqiJQAAAACqJFoCAGBi27x581tvvZXNZmtdCABMRaIlAAAmtnK5XC6XRUsAUBOiJQAAJrZMJhMEgWgJAGpCtAQAwMQWRUu5XC4Mw1rXAgBTjmgJAICJrb6+Ph6PVyqVfD5f61oAYMoRLQEAMOFZEwcAtSJaAgBgwhMtAUCtiJYAAJjw0ul0EAS5XK7WhQDAlCNaAgBgwkun07FYrFwuFwqFWtcCAFOLaAkAgAkvFotFE5esiQOAPUy0BADAZGC7JQCoCdESAACTgWgJAGpCtAQAwGQQbbdUKpVKpVKtawGAKUS0BADAZBCPx+vr6wMTlwBgzxItAQAwSVgTBwB7nmgJAIBJwkPiAGDPEy0BADBJRLOWCoVCuVyudS0AMFWIlgAAmCQSiUQqlQpMXAKAPUi0BADA5GG7JQDYw0RLAABMHlG0lMvlal0IAEwVdbUuAAAAdptMJtPc3BwFTADAHhALw7DWNQAAAAAwIVkQBwAAAECVREsAAAAAVEm0BAAAAECVREsAAAAAVEm0BAAAAECV/h8WiYO98PolyQAAAABJRU5ErkJggg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvZm9ya19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJDb25maWciPgogICAgPENWUz4kSWQ6IEZyYW1ld29ya0lUU01Db3JlLnhtbCx2IDEuNCAyMDIwLzAxLzI3IDEzOjM4OjU1IHVkIEV4cCAkPC9DVlM+CiAgICA8U2V0dGluZyBOYW1lPSJQcm9kdWN0TmFtZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIiBDb25maWdMZXZlbD0iMjAwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiwgc2hvd24gaW4gdGhlIHdlYiBpbnRlcmZhY2UsIHRhYnMgYW5kIHRpdGxlIGJhciBvZiB0aGUgd2ViIGJyb3dzZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9IiI+T0ZPUks6OklUU00gOTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTGlua09iamVjdDo6Vmlld01vZGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGV0ZXJtaW5lcyB0aGUgd2F5IHRoZSBsaW5rZWQgb2JqZWN0cyBhcmUgZGlzcGxheWVkIGluIGVhY2ggem9vbSBtYXNrLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6TGlua09iamVjdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU2VsZWN0IiBTZWxlY3RlZElEPSJDb21wbGV4Ij4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iU2ltcGxlIiBUcmFuc2xhdGFibGU9IjEiPlNpbXBsZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQ29tcGxleCIgVHJhbnNsYXRhYmxlPSIxIj5Db21wbGV4PC9JdGVtPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBhY2thZ2U6OlJlcG9zaXRvcnlMaXN0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiIENvbmZpZ0xldmVsPSIyMDAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGxpc3Qgb2Ygb25saW5lIHJlcG9zaXRvcmllcy4gQW5vdGhlciBpbnN0YWxsYXRpb25zIGNhbiBiZSB1c2VkIGFzIHJlcG9zaXRvcnksIGZvciBleGFtcGxlOiBLZXk9Imh0dHA6Ly9leGFtcGxlLmNvbS9vZm9yay9wdWJsaWMucGw/QWN0aW9uPVB1YmxpY1JlcG9zaXRvcnk7RmlsZT0iIGFuZCBDb250ZW50PSJTb21lIE5hbWUiLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6UGFja2FnZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cjwvb2ZvcmtfY29uZmlnPgo=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvZm9ya19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJDb25maWciPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FkbWluSVRTTUNJUEFsbG9jYXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbklUU01DSVBBbGxvY2F0ZSBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kUmVnaXN0cmF0aW9uIj4KICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPmFkbWluPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPk1hbmFnZSBwcmlvcml0eSBtYXRyaXguPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+Q3JpdGljYWxpdHkg4oaUIEltcGFjdCDihpQgUHJpb3JpdHk8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5BZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6QWRtaW5JVFNNQ0lQQWxsb2NhdGUjIyMwMDMtSVRTTUNvcmUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TG9hZGVyIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TG9hZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNTUyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLlRhYmxlLmNzczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpOYXZpZ2F0aW9uIyMjQWRtaW5JVFNNQ0lQQWxsb2NhdGUjIyMwMDMtSVRTTUNvcmUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWFpbiBtZW51IGl0ZW0gcmVnaXN0cmF0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb246Ok1haW5NZW51PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmROYXZpZ2F0aW9uIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TmF2aWdhdGlvbk1vZHVsZSMjI0FkbWluSVRTTUNJUEFsbG9jYXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFkbWluIGFyZWEgbmF2aWdhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uOjpBZG1pbk92ZXJ2aWV3PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPmFkbWluPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXI6Ok1vZHVsZUFkbWluPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkNyaXRpY2FsaXR5IOKGlCBJbXBhY3Qg4oaUIFByaW9yaXR5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5NYW5hZ2UgdGhlIGNyaXRpY2FsaXR5IC0gaW1wYWN0IC0gcHJpb3JpdHkgbWF0cml4LjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSWNvbkJpZyI+ZmEtdGFibGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikljb25TbWFsbCI+PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU006OkNvcmU6OkluY2lkZW50TGlua1R5cGVEaXJlY3Rpb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0IHRoZSB0eXBlIGFuZCBkaXJlY3Rpb24gb2YgbGlua3MgdG8gYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGluY2lkZW50IHN0YXRlLiBUaGUga2V5IGlzIHRoZSBuYW1lIG9mIHRoZSBsaW5rIHR5cGUgKGFzIGRlZmluZWQgaW4gTGlua09iamVjdDo6VHlwZSksIGFuZCB0aGUgdmFsdWUgaXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgSW5jaWRlbnRMaW5rVHlwZSB0aGF0IHNob3VsZCBiZSBmb2xsb3dlZCB0byBjYWxjdWxhdGUgdGhlIGluY2lkZW50IHN0YXRlLiBGb3IgZXhhbXBsZSBpZiB0aGUgSW5jaWRlbnRMaW5rVHlwZSBpcyBzZXQgdG8gJ0RlcGVuZHNPbicsIGFuZCB0aGUgRGlyZWN0aW9uIGlzICdTb3VyY2UnLCBvbmx5ICdEZXBlbmRzIG9uJyBsaW5rcyB3aWxsIGJlIGZvbGxvd2VkIChhbmQgbm90IHRoZSBvcHBvc2l0ZSBsaW5rICdSZXF1aXJlZCBmb3InKSB0byBjYWxjdWxhdGUgdGhlIGluY2lkZW50IHN0YXRlLiBZb3UgY2FuIGFkZCBtb3JlIGxpbmsgdHlwZXMgYWQgZGlyZWN0aW9ucyBhcyB5b3UgbGlrZSwgZS5nLiAnSW5jbHVkZXMnIHdpdGggdGhlIGRpcmVjdGlvbiAnVGFyZ2V0Jy4gQWxsIGxpbmsgdHlwZXMgZGVmaW5lZCBpbiB0aGUgc3lzY29uZmlnIG9wdGlvbnMgTGlua09iamVjdDo6VHlwZSBhcmUgcG9zc2libGUgYW5kIHRoZSBkaXJlY3Rpb24gY2FuIGJlICdTb3VyY2UnLCAnVGFyZ2V0Jywgb3IgJ0JvdGgnLiBJTVBPUlRBTlQ6IEFGVEVSIFlPVSBNQUtFIENIQU5HRVMgVE8gVEhJUyBTWVNDT05GSUcgT1BUSU9OIFlPVSBORUVEIFRPIFJVTiBUSEUgQ09OU09MRSBDT01NQU5EIGJpbi9vZm9yay5Db25zb2xlLnBsIEFkbWluOjpJVFNNOjpJbmNpZGVudFN0YXRlOjpSZWNhbGN1bGF0ZSBTTyBUSEFUIEFMTCBJTkNJREVOVCBTVEFURVMgV0lMTCBCRSBSRUNBTENVTEFURUQgQkFTRUQgT04gVEhFIE5FVyBTRVRUSU5HUyE8L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OklUU01Db3JlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQm90aCIgVHJhbnNsYXRhYmxlPSIxIj5Cb3RoPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iU291cmNlIiBUcmFuc2xhdGFibGU9IjEiPlNvdXJjZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlRhcmdldCIgVHJhbnNsYXRhYmxlPSIxIj5UYXJnZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXBlbmRzT24iIFNlbGVjdGVkSUQ9IkJvdGgiPjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMaW5rT2JqZWN0OjpUeXBlIyMjQWx0ZXJuYXRpdmVUbyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGUgbGluayB0eXBlICdBbHRlcm5hdGl2ZVRvJy4gSWYgdGhlIHNvdXJjZSBuYW1lIGFuZCB0aGUgdGFyZ2V0IG5hbWUgY29udGFpbiB0aGUgc2FtZSB2YWx1ZSwgdGhlIHJlc3VsdGluZyBsaW5rIGlzIGEgbm9uLWRpcmVjdGlvbmFsIG9uZS4gSWYgdGhlIHZhbHVlcyBhcmUgZGlmZmVyZW50LCB0aGUgcmVzdWx0aW5nIGxpbmsgaXMgYSBkaXJlY3Rpb25hbCBsaW5rLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6TGlua09iamVjdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTb3VyY2VOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkFsdGVybmF0aXZlIHRvPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXROYW1lIiBUcmFuc2xhdGFibGU9IjEiPkFsdGVybmF0aXZlIHRvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxpbmtPYmplY3Q6OlR5cGUjIyNDb25uZWN0ZWRUbyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGUgbGluayB0eXBlICdDb25uZWN0ZWRUbycuIElmIHRoZSBzb3VyY2UgbmFtZSBhbmQgdGhlIHRhcmdldCBuYW1lIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWUsIHRoZSByZXN1bHRpbmcgbGluayBpcyBhIG5vbi1kaXJlY3Rpb25hbCBvbmUuIElmIHRoZSB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgdGhlIHJlc3VsdGluZyBsaW5rIGlzIGEgZGlyZWN0aW9uYWwgbGluay48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkxpbmtPYmplY3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU291cmNlTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5Db25uZWN0ZWQgdG88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldE5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+Q29ubmVjdGVkIHRvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxpbmtPYmplY3Q6OlR5cGUjIyNEZXBlbmRzT24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhlIGxpbmsgdHlwZSAnRGVwZW5kc09uJy4gSWYgdGhlIHNvdXJjZSBuYW1lIGFuZCB0aGUgdGFyZ2V0IG5hbWUgY29udGFpbiB0aGUgc2FtZSB2YWx1ZSwgdGhlIHJlc3VsdGluZyBsaW5rIGlzIGEgbm9uLWRpcmVjdGlvbmFsIG9uZS4gSWYgdGhlIHZhbHVlcyBhcmUgZGlmZmVyZW50LCB0aGUgcmVzdWx0aW5nIGxpbmsgaXMgYSBkaXJlY3Rpb25hbCBsaW5rLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6TGlua09iamVjdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTb3VyY2VOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkRlcGVuZHMgb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldE5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+UmVxdWlyZWQgZm9yPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxpbmtPYmplY3Q6OlR5cGUjIyNJbmNsdWRlcyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGUgbGluayB0eXBlICdJbmNsdWRlcycuIElmIHRoZSBzb3VyY2UgbmFtZSBhbmQgdGhlIHRhcmdldCBuYW1lIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWUsIHRoZSByZXN1bHRpbmcgbGluayBpcyBhIG5vbi1kaXJlY3Rpb25hbCBvbmUuIElmIHRoZSB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgdGhlIHJlc3VsdGluZyBsaW5rIGlzIGEgZGlyZWN0aW9uYWwgbGluay48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkxpbmtPYmplY3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU291cmNlTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5JbmNsdWRlczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0TmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5QYXJ0IG9mPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxpbmtPYmplY3Q6OlR5cGUjIyNSZWxldmFudFRvIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoZSBsaW5rIHR5cGUgJ1JlbGV2YW50VG8nLiBJZiB0aGUgc291cmNlIG5hbWUgYW5kIHRoZSB0YXJnZXQgbmFtZSBjb250YWluIHRoZSBzYW1lIHZhbHVlLCB0aGUgcmVzdWx0aW5nIGxpbmsgaXMgYSBub24tZGlyZWN0aW9uYWwgb25lLiBJZiB0aGUgdmFsdWVzIGFyZSBkaWZmZXJlbnQsIHRoZSByZXN1bHRpbmcgbGluayBpcyBhIGRpcmVjdGlvbmFsIGxpbmsuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpMaW5rT2JqZWN0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNvdXJjZU5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+UmVsZXZhbnQgdG88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldE5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+UmVsZXZhbnQgdG88L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMzIwMCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgJ0lUU01Db25maWdJdGVtJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoIG90aGVyICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0cyB1c2luZyB0aGUgJ0FsdGVybmF0aXZlVG8nIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkxpbmtPYmplY3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDIiPklUU01Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5BbHRlcm5hdGl2ZVRvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzMyMDEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCBvdGhlciAnSVRTTUNvbmZpZ0l0ZW0nIG9iamVjdHMgdXNpbmcgdGhlICdDb25uZWN0ZWRUbycgbGluayB0eXBlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6TGlua09iamVjdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QxIj5JVFNNQ29uZmlnSXRlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPkNvbm5lY3RlZFRvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzMyMDIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCBvdGhlciAnSVRTTUNvbmZpZ0l0ZW0nIG9iamVjdHMgdXNpbmcgdGhlICdEZXBlbmRzT24nIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkxpbmtPYmplY3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDIiPklUU01Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5EZXBlbmRzT248L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMzIwMyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgJ0lUU01Db25maWdJdGVtJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoIG90aGVyICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0cyB1c2luZyB0aGUgJ0luY2x1ZGVzJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpMaW5rT2JqZWN0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDEiPklUU01Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5JVFNNQ29uZmlnSXRlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+SW5jbHVkZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMzIwNCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgJ0lUU01Db25maWdJdGVtJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoIG90aGVyICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0cyB1c2luZyB0aGUgJ1JlbGV2YW50VG8nIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkxpbmtPYmplY3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDIiPklUU01Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5SZWxldmFudFRvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzMyMjAiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCAnVGlja2V0JyBvYmplY3RzIHVzaW5nIHRoZSAnQWx0ZXJuYXRpdmVUbycgbGluayB0eXBlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6TGlua09iamVjdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QxIj5JVFNNQ29uZmlnSXRlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5BbHRlcm5hdGl2ZVRvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzMyMjEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCAnVGlja2V0JyBvYmplY3RzIHVzaW5nIHRoZSAnRGVwZW5kc09uJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpMaW5rT2JqZWN0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDEiPklUU01Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5UaWNrZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPkRlcGVuZHNPbjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMaW5rT2JqZWN0OjpQb3NzaWJsZUxpbmsjIyMzMjIyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnSVRTTUNvbmZpZ0l0ZW0nIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggJ1RpY2tldCcgb2JqZWN0cyB1c2luZyB0aGUgJ1JlbGV2YW50VG8nIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkxpbmtPYmplY3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDIiPlRpY2tldDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+UmVsZXZhbnRUbzwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMaW5rT2JqZWN0OjpQb3NzaWJsZUxpbmsjIyMzMjQwIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnSVRTTUNvbmZpZ0l0ZW0nIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggJ1NlcnZpY2UnIG9iamVjdHMgdXNpbmcgdGhlICdBbHRlcm5hdGl2ZVRvJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpMaW5rT2JqZWN0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDEiPklUU01Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5TZXJ2aWNlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5BbHRlcm5hdGl2ZVRvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzMyNDEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCAnU2VydmljZScgb2JqZWN0cyB1c2luZyB0aGUgJ0RlcGVuZHNPbicgbGluayB0eXBlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6TGlua09iamVjdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QxIj5JVFNNQ29uZmlnSXRlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+U2VydmljZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+RGVwZW5kc09uPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzMyNDIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCAnU2VydmljZScgb2JqZWN0cyB1c2luZyB0aGUgJ1JlbGV2YW50VG8nIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkxpbmtPYmplY3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDIiPlNlcnZpY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPlJlbGV2YW50VG88L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMzI2MCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgJ0lUU01Db25maWdJdGVtJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoICdGQVEnIG9iamVjdHMgdXNpbmcgdGhlICdOb3JtYWwnIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkxpbmtPYmplY3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDIiPkZBUTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+Tm9ybWFsPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzMyNjEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhICdJVFNNQ29uZmlnSXRlbScgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCAnRkFRJyBvYmplY3RzIHVzaW5nIHRoZSAnUGFyZW50Q2hpbGQnIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkxpbmtPYmplY3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDIiPkZBUTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+UGFyZW50Q2hpbGQ8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMzI2MiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgJ0lUU01Db25maWdJdGVtJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoICdGQVEnIG9iamVjdHMgdXNpbmcgdGhlICdSZWxldmFudFRvJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpMaW5rT2JqZWN0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDEiPklUU01Db25maWdJdGVtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5GQVE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPlJlbGV2YW50VG88L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMzI4MCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgJ1NlcnZpY2UnIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggJ0ZBUScgb2JqZWN0cyB1c2luZyB0aGUgJ05vcm1hbCcgbGluayB0eXBlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6TGlua09iamVjdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QxIj5TZXJ2aWNlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5GQVE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPk5vcm1hbDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMaW5rT2JqZWN0OjpQb3NzaWJsZUxpbmsjIyMzMjgxIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnU2VydmljZScgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCAnRkFRJyBvYmplY3RzIHVzaW5nIHRoZSAnUGFyZW50Q2hpbGQnIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkxpbmtPYmplY3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+U2VydmljZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+RkFRPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5QYXJlbnRDaGlsZDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMaW5rT2JqZWN0OjpQb3NzaWJsZUxpbmsjIyMzMjgyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnU2VydmljZScgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCAnRkFRJyBvYmplY3RzIHVzaW5nIHRoZSAnUmVsZXZhbnRUbycgbGluayB0eXBlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6TGlua09iamVjdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QxIj5TZXJ2aWNlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5GQVE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPlJlbGV2YW50VG88L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMzQwMCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgJ0lUU01Xb3JrT3JkZXInIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggJ1NlcnZpY2UnIG9iamVjdHMgdXNpbmcgdGhlICdOb3JtYWwnIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkxpbmtPYmplY3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+SVRTTVdvcmtPcmRlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+U2VydmljZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+Tm9ybWFsPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzM0MDEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhICdJVFNNV29ya09yZGVyJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoICdTZXJ2aWNlJyBvYmplY3RzIHVzaW5nIHRoZSAnRGVwZW5kc09uJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpMaW5rT2JqZWN0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDEiPklUU01Xb3JrT3JkZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDIiPlNlcnZpY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPkRlcGVuZHNPbjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMaW5rT2JqZWN0OjpQb3NzaWJsZUxpbmsjIyMzNDEwIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnSVRTTVdvcmtPcmRlcicgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCAnSVRTTUNvbmZpZ0l0ZW0nIG9iamVjdHMgdXNpbmcgdGhlICdOb3JtYWwnIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkxpbmtPYmplY3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+SVRTTVdvcmtPcmRlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPk5vcm1hbDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMaW5rT2JqZWN0OjpQb3NzaWJsZUxpbmsjIyMzNDExIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnSVRTTVdvcmtPcmRlcicgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCAnSVRTTUNvbmZpZ0l0ZW0nIG9iamVjdHMgdXNpbmcgdGhlICdEZXBlbmRzT24nIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkxpbmtPYmplY3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+SVRTTVdvcmtPcmRlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+SVRTTUNvbmZpZ0l0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPkRlcGVuZHNPbjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMaW5rT2JqZWN0OjpQb3NzaWJsZUxpbmsjIyMzNDEyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnSVRTTVdvcmtPcmRlcicgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCAnVGlja2V0JyBvYmplY3RzIHVzaW5nIHRoZSAnTm9ybWFsJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpMaW5rT2JqZWN0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDEiPklUU01Xb3JrT3JkZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDIiPlRpY2tldDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+Tm9ybWFsPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzM0MjAiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhICdJVFNNQ2hhbmdlJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoICdUaWNrZXQnIG9iamVjdHMgdXNpbmcgdGhlICdOb3JtYWwnIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkxpbmtPYmplY3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+SVRTTUNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5Ob3JtYWw8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTTo6RnJvbnRlbmQ6OlRleHRBcmVhIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPldpZHRoIG9mIElUU00gdGV4dGFyZWFzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il5bMC05XXsxLDN9JCI+Nzg8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNJbmNpZGVudFN0YXRlcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5QYXJhbWV0ZXJzIGZvciB0aGUgaW5jaWRlbnQgc3RhdGVzIGluIHRoZSBwcmVmZXJlbmNlIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpHZW5lcmFsQ2F0YWxvZzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzOjpHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDbGFzcyI+SVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFiZWwiIFRyYW5zbGF0YWJsZT0iMSI+SW5jaWRlbnQgU3RhdGUgVHlwZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzYyIgVHJhbnNsYXRhYmxlPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRhdGEiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Indhcm5pbmciIFRyYW5zbGF0YWJsZT0iMSI+V2FybmluZzwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJvcGVyYXRpb25hbCIgVHJhbnNsYXRhYmxlPSIxIj5PcGVyYXRpb25hbDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpbmNpZGVudCIgVHJhbnNsYXRhYmxlPSIxIj5JbmNpZGVudDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByZWZLZXkiPkZ1bmN0aW9uYWxpdHk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJsb2NrIj5PcHRpb248L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpBZ2VudDo6Q29tbW9uQ1NTIyMjMTAwLUlUU00iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TGlzdCBvZiBDU1MgZmlsZXMgdG8gYWx3YXlzIGJlIGxvYWRlZCBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpCYXNlOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkFnZW50LkRlZmF1bHQuY3NzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5BZ2VudC5TZWFyY2guY3NzPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6OkFnZW50OjpDb21tb25KUyMjIzEwMC1JVFNNIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxpc3Qgb2YgSlMgZmlsZXMgdG8gYWx3YXlzIGJlIGxvYWRlZCBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpCYXNlOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkFnZW50LkN1c3RvbWVyU2VhcmNoLmpzPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cjwvb2ZvcmtfY29uZmlnPgo=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvZm9ya19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJDb25maWciPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTVNlcnZpY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTVNlcnZpY2Ugb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tc2VydmljZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1zZXJ2aWNlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPklUU00gU2VydmljZSBPdmVydmlldy48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5TZXJ2aWNlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+U2VydmljZTwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6QWdlbnRJVFNNU2VydmljZSMjIzAwMy1JVFNNU2VydmljZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkFnZW50LlNlcnZpY2UuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TmF2aWdhdGlvbiMjI0FnZW50SVRTTVNlcnZpY2UjIyMwMDMtSVRTTVNlcnZpY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWFpbiBtZW51IGl0ZW0gcmVnaXN0cmF0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246Ok1haW5NZW51PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmROYXZpZ2F0aW9uIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tc2VydmljZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLXNlcnZpY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+U2VydmljZS1BcmVhPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPlNlcnZpY2VzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01TZXJ2aWNlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmtPcHRpb24iPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXIiPlNlcnZpY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+TWVudTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+SXRlbUFyZWE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWNjZXNzS2V5Ij48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpbyI+MzEwMDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1zZXJ2aWNlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tc2VydmljZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5TZXJ2aWNlIE92ZXJ2aWV3PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPlNlcnZpY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTVNlcnZpY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGlua09wdGlvbiI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhciI+U2VydmljZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQmxvY2siPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY2Nlc3NLZXkiPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvIj4xMDA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNU0xBIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01TTEEgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+aXRzbS1zZXJ2aWNlPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPklUU00gU0xBIE92ZXJ2aWV3LjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPlNlcnZpY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5TTEE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpNb2R1bGU6OkFnZW50SVRTTVNMQSMjIzAwMy1JVFNNU2VydmljZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkFnZW50LlNMQS5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpOYXZpZ2F0aW9uIyMjQWdlbnRJVFNNU0xBIyMjMDAzLUlUU01TZXJ2aWNlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1haW4gbWVudSBpdGVtIHJlZ2lzdHJhdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpNYWluTWVudTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kTmF2aWdhdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLXNlcnZpY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+U0xBIE92ZXJ2aWV3PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPlNMQTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNU0xBPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmtPcHRpb24iPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXIiPlNlcnZpY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJsb2NrIj48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWNjZXNzS2V5Ij48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpbyI+MjAwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTVNlcnZpY2Vab29tIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01TZXJ2aWNlWm9vbSBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLXNlcnZpY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+U2VydmljZSBab29tLjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPlpvb208L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5TZXJ2aWNlPC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpBZ2VudElUU01TZXJ2aWNlWm9vbSMjIzAwMy1JVFNNU2VydmljZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ1NTIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkNvcmUuQWxsb2NhdGlvbkxpc3QuY3NzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkphdmFTY3JpcHQiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5VSS5BbGxvY2F0aW9uTGlzdC5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5VSS5UYWJsZS5Tb3J0LmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFnZW50LlRhYmxlRmlsdGVycy5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5MaW5rT2JqZWN0LmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkFnZW50LlNlcnZpY2Vab29tLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTVNlcnZpY2VQcmludCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNU2VydmljZVByaW50IG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kUmVnaXN0cmF0aW9uIj4KICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPml0c20tc2VydmljZTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5TZXJ2aWNlIFByaW50LjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPlByaW50PC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+U2VydmljZTwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNU0xBWm9vbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNU0xBWm9vbSBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLXNlcnZpY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+U0xBIFpvb20uPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+Wm9vbTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPlNlcnZpY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpNb2R1bGU6OkFnZW50SVRTTVNMQVpvb20jIyMwMDMtSVRTTVNlcnZpY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TG9hZGVyIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TG9hZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkphdmFTY3JpcHQiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5BZ2VudC5TTEFab29tLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTVNMQVByaW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01TTEFQcmludCBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLXNlcnZpY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+U0xBIFByaW50LjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPlByaW50PC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+U2VydmljZTwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNU2VydmljZTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwMDAtQmFjayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Nb2R1bGUgdG8gc2hvdyB0aGUgQmFjayBtZW51IGl0ZW0gaW4gc2VydmljZSBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpJVFNNU2VydmljZTo6TWVudU1vZHVsZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNU2VydmljZU1lbnU6OkdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkJhY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+QmFjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+QmFjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01TZXJ2aWNlPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IklUU01TZXJ2aWNlOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzEwMC1QcmludCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Nb2R1bGUgdG8gc2hvdyB0aGUgUHJpbnQgbWVudSBpdGVtIGluIHNlcnZpY2UgbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6SVRTTVNlcnZpY2U6Ok1lbnVNb2R1bGU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTVNlcnZpY2VNZW51OjpHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5QcmludDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+UHJpbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNU2VydmljZVByaW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNU2VydmljZVByaW50O1NlcnZpY2VJRD1bJSBEYXRhLlNlcnZpY2VJRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSVRTTVNlcnZpY2U6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMjAwLUxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TW9kdWxlIHRvIHNob3cgdGhlIExpbmsgbWVudSBpdGVtIGluIHNlcnZpY2UgbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6SVRTTVNlcnZpY2U6Ok1lbnVNb2R1bGU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTVNlcnZpY2VNZW51OjpMaW5rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5MaW5rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXQiPlBvcFVwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5MaW5rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTVNlcnZpY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudExpbmtPYmplY3Q7U291cmNlT2JqZWN0PVNlcnZpY2U7U291cmNlS2V5PVslIERhdGEuU2VydmljZUlEIHwgaHRtbCAlXTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNU0xBOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzAwMC1CYWNrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1vZHVsZSB0byBzaG93IHRoZSBCYWNrIG1lbnUgaXRlbSBpbiBTTEEgbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6SVRTTVNMQTo6TWVudU1vZHVsZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNU0xBTWVudTo6R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+QmFjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0Ij5CYWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5CYWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTVNMQTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNU0xBOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzEwMC1QcmludCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Nb2R1bGUgdG8gc2hvdyB0aGUgUHJpbnQgbWVudSBpdGVtIGluIFNMQSBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpJVFNNU0xBOjpNZW51TW9kdWxlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01TTEFNZW51OjpHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5QcmludDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+UHJpbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNU0xBUHJpbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01TTEFQcmludDtTTEFJRD1bJSBEYXRhLlNMQUlEIHwgaHRtbCAlXTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMaW5rT2JqZWN0OjpDb21wbGV4VGFibGU6OlNldHRpbmdzVmlzaWJpbGl0eSMjI1NlcnZpY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lIEFjdGlvbnMgd2hlcmUgYSBzZXR0aW5ncyBidXR0b24gaXMgYXZhaWxhYmxlIGluIHRoZSBsaW5rZWQgb2JqZWN0cyB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUGxlYXNlIG5vdGUgdGhhdCB0aGVzZSBBY3Rpb25zIG11c3QgaGF2ZSByZWdpc3RlcmVkIHRoZSBmb2xsb3dpbmcgSlMgYW5kIENTUyBmaWxlczogQ29yZS5BbGxvY2F0aW9uTGlzdC5jc3MsIENvcmUuVUkuQWxsb2NhdGlvbkxpc3QuanMsIENvcmUuVUkuVGFibGUuU29ydC5qcywgQ29yZS5BZ2VudC5UYWJsZUZpbHRlcnMuanMgYW5kIENvcmUuQWdlbnQuTGlua09iamVjdC5qcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TGlua09iamVjdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPkFnZW50SVRTTVNlcnZpY2Vab29tPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMaW5rT2JqZWN0OjpDb21wbGV4VGFibGUjIyNTZXJ2aWNlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZSB3aGljaCBjb2x1bW5zIGFyZSBzaG93biBpbiB0aGUgbGlua2VkIFNlcnZpY2VzIHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBOb3RlOiBPbmx5IFNlcnZpY2UgYXR0cmlidXRlcyBhcmUgYWxsb3dlZCBmb3IgRGVmYXVsdENvbHVtbnMuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OkxpbmtPYmplY3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGlua09iamVjdDo6U2VydmljZS5wbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdENvbHVtbnMiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbW1lbnQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+MjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcml0aWNhbGl0eSI+MjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXJJbmNpU3RhdGUiPjI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3JlYXRlVGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHkiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbW1lbnQiPjExMDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj4xMjA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3JpdGljYWxpdHkiPjEzMDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXJJbmNpU3RhdGUiPjE0MDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVUaW1lIj4xNTA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlVGltZSI+MTYwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cjwvb2ZvcmtfY29uZmlnPgo=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvZm9ya19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJDb25maWciPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpTZXJ2aWNlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbG93cyBkZWZpbmluZyBzZXJ2aWNlcyBhbmQgU0xBcyBmb3IgdGlja2V0cyAoZS4gZy4gZW1haWwsIGRlc2t0b3AsIG5ldHdvcmssIC4uLiksIGFuZCBlc2NhbGF0aW9uIGF0dHJpYnV0ZXMgZm9yIFNMQXMgKGlmIHRpY2tldCBzZXJ2aWNlL1NMQSBmZWF0dXJlIGlzIGVuYWJsZWQpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6VGlja2V0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgo8L29mb3JrX2NvbmZpZz4K
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JVFNNQ29yZS5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBkZV9JVFNNQ29yZS5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMzo1MSB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkZV9JVFNNQ29yZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSVRTTUNJUEFsbG9jYXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSDihpQgSW1wYWN0IOKGlCBQcmlvcml0eSd9ID0gJ0tyaXRpa2FsaXTDpHQg4oaUIEF1c3dpcmt1bmcg4oaUIFByaW9yaXTDpHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIHRoZSBwcmlvcml0eSByZXN1bHQgb2YgY29tYmluYXRpbmcgQ3JpdGljYWxpdHkg4oaUIEltcGFjdC4nfSA9CiAgICAgICAgJ1ZlcndhbHR1bmcgZGVyIFByaW9yaXTDpHQgYXVzIGRlciBLb21iaW5hdGlvbiB2b24gS3JpdGlrYWxpdMOkdCDihpQgSW1wYWN0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmlvcml0eSBhbGxvY2F0aW9uJ30gPSAnUHJpb3JpdMOkdCB6dW9yZG5lbic7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5TTEEKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01pbmltdW0gVGltZSBCZXR3ZWVuIEluY2lkZW50cyd9ID0gJ01pbmRlc3R6ZWl0IHp3aXNjaGVuIEluY2lkZW50cyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5TZXJ2aWNlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0tyaXRpa2FsaXTDpHQnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTVNMQVpvb20KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NMQSBJbmZvcm1hdGlvbid9ID0gJ1NMQS1JbmZvcm1hdGlvbmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCd9ID0gJ1p1bGV0enQgZ2XDpG5kZXJ0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgY2hhbmdlZCBieSd9ID0gJ1p1bGV0enQgZ2XDpG5kZXJ0IHZvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBc3NvY2lhdGVkIFNlcnZpY2VzJ30gPSAnWnVnZWjDtnJpZ2UgU2VydmljZXMnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50SVRTTVNlcnZpY2Vab29tCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluZm9ybWF0aW9uJ30gPSAnU2VydmljZS1JbmZvcm1hdGlvbmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1cnJlbnQgaW5jaWRlbnQgc3RhdGUnfSA9ICdBa3R1ZWxsZXIgVm9yZmFsbHN0YXR1cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBc3NvY2lhdGVkIFNMQXMnfSA9ICdadWdlaMO2cmlnZSBTTEFzJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbklUU01DSVBBbGxvY2F0ZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAnQXVzd2lya3VuZyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRJVFNNU0xBUHJpbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIFNMQUlEIGlzIGdpdmVuISd9ID0gJ0tlaW5lIFNMQUlEIHZvcmhhbmRlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU0xBSUQgJXMgbm90IGZvdW5kIGluIGRhdGFiYXNlISd9ID0gJ1NMQUlEICIlcyIgaW4gZGVyIERhdGVuYmFuayBuaWNodCBnZWZ1bmRlbiEgJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIERlZmF1bHQnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVNlcnZpY2VQcmludC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gU2VydmljZUlEIGlzIGdpdmVuISd9ID0gJ0tlaW5lIFNlcnZpY2VJRCB2b3JoYW5kZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2VJRCAlcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJ30gPSAnU2VydmljZUlEICIlcyIgaW4gZGVyIERhdGVuYmFuayBuaWNodCBnZWZ1bmRlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VycmVudCBJbmNpZGVudCBTdGF0ZSd9ID0gJ0FrdHVlbGxlciBWb3JmYWxsc3N0YXR1cyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0xpbmtPYmplY3QvU2VydmljZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgU3RhdGUnfSA9ICdWb3JmYWxsc3N0YXR1cyc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUNvcmUuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3BlcmF0aW9uYWwnfSA9ICdPcGVyYXRpdic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNpZGVudCd9ID0gJ1ZvcmZhbGwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5kIFVzZXIgU2VydmljZSd9ID0gJ0Fud2VuZGVyLVNlcnZpY2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnQgRW5kJ30gPSAnRnJvbnRlbmQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFjayBFbmQnfSA9ICdCYWNrZW5kJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUIE1hbmFnZW1lbnQnfSA9ICdJVCBNYW5hZ2VtZW50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcG9ydGluZyd9ID0gJ1JlcG9ydGluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVCBPcGVyYXRpb25hbCd9ID0gJ0lUIEJldHJpZWInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVtb25zdHJhdGlvbid9ID0gJ0RlbW9uc3RyYXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJvamVjdCd9ID0gJ1Byb2pla3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVW5kZXJwaW5uaW5nIENvbnRyYWN0J30gPSAnVW5kZXJwaW5uaW5nIENvbnRyYWN0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyJ30gPSAnU29uc3RpZ2VzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0F2YWlsYWJpbGl0eSd9ID0gJ1ZlcmbDvGdiYXJrZWl0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3BvbnNlIFRpbWUnfSA9ICdSZWFrdGlvbnN6ZWl0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFRpbWUnfSA9ICdXaWVkZXJoZXJzdGVsbHVuZ3N6ZWl0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc29sdXRpb24gUmF0ZSd9ID0gJ0zDtnN1bmdzemVpdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc2FjdGlvbnMnfSA9ICdUcmFuc2FrdGlvbmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9ycyd9ID0gJ0ZlaGxlcic7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsdGVybmF0aXZlIHRvJ30gPSAnQWx0ZXJuYXRpdiB6dSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCb3RoJ30gPSAnQmVpZGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29ubmVjdGVkIHRvJ30gPSAnVmVyYnVuZGVuIG1pdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgQWN0aW9ucyB3aGVyZSBhIHNldHRpbmdzIGJ1dHRvbiBpcyBhdmFpbGFibGUgaW4gdGhlIGxpbmtlZCBvYmplY3RzIHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZXNlIEFjdGlvbnMgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgdGhlIGZvbGxvd2luZyBKUyBhbmQgQ1NTIGZpbGVzOiBDb3JlLkFsbG9jYXRpb25MaXN0LmNzcywgQ29yZS5VSS5BbGxvY2F0aW9uTGlzdC5qcywgQ29yZS5VSS5UYWJsZS5Tb3J0LmpzLCBDb3JlLkFnZW50LlRhYmxlRmlsdGVycy5qcyBhbmQgQ29yZS5BZ2VudC5MaW5rT2JqZWN0LmpzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB3aGljaCBjb2x1bW5zIGFyZSBzaG93biBpbiB0aGUgbGlua2VkIFNlcnZpY2VzIHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBOb3RlOiBPbmx5IFNlcnZpY2UgYXR0cmlidXRlcyBhcmUgYWxsb3dlZCBmb3IgRGVmYXVsdENvbHVtbnMuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICdEZWZpbmllcnQgd2VsY2hlIFNwYWx0ZW4gaW0gV2lkZ2V0ICJWZXJrbsO8cGZ0ZSBTZXJ2aWNlcyIgYW5nZXplaWd0IHdlcmRlbiAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBIaW53ZWlzOiBFcyBzaW5kIG51ciBTZXJ2aWNlZWlnZW5zY2hhZnRlbiBhbHMgRGVmYXVsdC1TcGFsdGVuIGVybGF1YnQuIE3DtmdsaWNoZSBXZXJ0ZTogMCA9IERlYWt0aXZpZXJ0LCAxID0gVmVyZsO8Z2JhciwgMiA9IFN0YW5kYXJ0bcOkw59pZyBha3RpdmllcnQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZHMgb24nfSA9ICdIw6RuZ3QgYWIgdm9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbklUU01DSVBBbGxvY2F0ZSBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0KICAgICAgICAnRnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVyIEFkbWluSVRTTUNJUEFsbG9jYXRlIEtvbmZpZ3VyYXRpb24gaW0gQWRtaW4tQmVyZWljaC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTVNMQSBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0Zyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01TTEEtT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01TTEFQcmludCBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0Zyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01TTEFQcmludC1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTVNMQVpvb20gb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdGcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNU0xBWm9vbS1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTVNlcnZpY2Ugb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdGcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNU2VydmljZS1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTVNlcnZpY2VQcmludCBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0Zyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01TZXJ2aWNlUHJpbnQtT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01TZXJ2aWNlWm9vbSBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0Zyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01TZXJ2aWNlWm9vbS1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBTTEEgT3ZlcnZpZXcuJ30gPSAnSVRTTSBTTEEtw5xiZXJzaWNodC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVRTTSBTZXJ2aWNlIE92ZXJ2aWV3Lid9ID0gJ0lUU00tRGllbnN0w7xiZXJzaWNodC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jaWRlbnQgU3RhdGUgVHlwZSd9ID0gJ1ZvcmZhbGxzdGF0dXMtVHlwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2x1ZGVzJ30gPSAnQmVpbmhhbHRldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgcHJpb3JpdHkgbWF0cml4Lid9ID0gJ1ByaW9yaXTDpHRzLU1hdHJpeCB2ZXJ3YWx0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIHRoZSBjcml0aWNhbGl0eSAtIGltcGFjdCAtIHByaW9yaXR5IG1hdHJpeC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIHNob3cgdGhlIEJhY2sgbWVudSBpdGVtIGluIFNMQSBtZW51Lid9ID0gJ8OcYmVyIGRpZXNlcyBNb2R1bCB3aXJkIGRlciBadXLDvGNrLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIFNMQS1BbnNpY2h0IGFuZ2V6ZWlndC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIHNob3cgdGhlIEJhY2sgbWVudSBpdGVtIGluIHNlcnZpY2UgbWVudS4nfSA9ICfDnGJlciBkaWVzZXMgTW9kdWwgd2lyZCBkZXIgWnVyw7xjay1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBTZXJ2aWNlLUFuc2ljaHQgYW5nZXplaWd0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gc2hvdyB0aGUgTGluayBtZW51IGl0ZW0gaW4gc2VydmljZSBtZW51Lid9ID0gJ8OcYmVyIGRpZXNlcyBNb2R1bCB3aXJkIGRlciBMaW5rLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIFNlcnZpY2UtQW5zaWNodCBhbmdlemVpZ3QuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBzaG93IHRoZSBQcmludCBtZW51IGl0ZW0gaW4gU0xBIG1lbnUuJ30gPSAnw5xiZXIgZGllc2VzIE1vZHVsIHdpcmQgZGVyIERydWNrZW4tTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgU0xBLUFuc2ljaHQgYW5nZXplaWd0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gc2hvdyB0aGUgUHJpbnQgbWVudSBpdGVtIGluIHNlcnZpY2UgbWVudS4nfSA9ICfDnGJlciBkaWVzZXMgTW9kdWwgd2lyZCBkZXIgRHJ1Y2tlbi1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBTZXJ2aWNlLUFuc2ljaHQgYW5nZXplaWd0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgaW5jaWRlbnQgc3RhdGVzIGluIHRoZSBwcmVmZXJlbmNlIHZpZXcuJ30gPSAnUGFyYW1ldGVyIGZ1ZXIgZGVuIFZvcmZhbGxzc3RhdHVzIGluIGRlciBBbnNpY2h0IGZ1ZXIgZGllIEVpbnN0ZWxsdW5nZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcnQgb2YnfSA9ICdUZWlsIHZvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxldmFudCB0byd9ID0gJ1JlbGV2YW50IGbDvHInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgZm9yJ30gPSAnQmVuw7Z0aWd0IGbDvHInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU0xBIE92ZXJ2aWV3J30gPSAnU0xBLcOcYmVyc2ljaHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU0xBIFByaW50Lid9ID0gJ1NMQS1EcnVjay4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU0xBIFpvb20uJ30gPSAnU0xBIFpvb20uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgT3ZlcnZpZXcnfSA9ICdEaWVuc3TDvGJlcnNpY2h0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgUHJpbnQuJ30gPSAnRGllbnN0IERydWNrZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgWm9vbS4nfSA9ICdEaWVuc3QgWm9vbS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZS1BcmVhJ30gPSAnU2VydmljZS1CZXJlaWNoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldCB0aGUgdHlwZSBhbmQgZGlyZWN0aW9uIG9mIGxpbmtzIHRvIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBpbmNpZGVudCBzdGF0ZS4gVGhlIGtleSBpcyB0aGUgbmFtZSBvZiB0aGUgbGluayB0eXBlIChhcyBkZWZpbmVkIGluIExpbmtPYmplY3Q6OlR5cGUpLCBhbmQgdGhlIHZhbHVlIGlzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIEluY2lkZW50TGlua1R5cGUgdGhhdCBzaG91bGQgYmUgZm9sbG93ZWQgdG8gY2FsY3VsYXRlIHRoZSBpbmNpZGVudCBzdGF0ZS4gRm9yIGV4YW1wbGUgaWYgdGhlIEluY2lkZW50TGlua1R5cGUgaXMgc2V0IHRvIFwnRGVwZW5kc09uXCcsIGFuZCB0aGUgRGlyZWN0aW9uIGlzIFwnU291cmNlXCcsIG9ubHkgXCdEZXBlbmRzIG9uXCcgbGlua3Mgd2lsbCBiZSBmb2xsb3dlZCAoYW5kIG5vdCB0aGUgb3Bwb3NpdGUgbGluayBcJ1JlcXVpcmVkIGZvclwnKSB0byBjYWxjdWxhdGUgdGhlIGluY2lkZW50IHN0YXRlLiBZb3UgY2FuIGFkZCBtb3JlIGxpbmsgdHlwZXMgYWQgZGlyZWN0aW9ucyBhcyB5b3UgbGlrZSwgZS5nLiBcJ0luY2x1ZGVzXCcgd2l0aCB0aGUgZGlyZWN0aW9uIFwnVGFyZ2V0XCcuIEFsbCBsaW5rIHR5cGVzIGRlZmluZWQgaW4gdGhlIHN5c2NvbmZpZyBvcHRpb25zIExpbmtPYmplY3Q6OlR5cGUgYXJlIHBvc3NpYmxlIGFuZCB0aGUgZGlyZWN0aW9uIGNhbiBiZSBcJ1NvdXJjZVwnLCBcJ1RhcmdldFwnLCBvciBcJ0JvdGhcJy4gSU1QT1JUQU5UOiBBRlRFUiBZT1UgTUFLRSBDSEFOR0VTIFRPIFRISVMgU1lTQ09ORklHIE9QVElPTiBZT1UgTkVFRCBUTyBSVU4gVEhFIENPTlNPTEUgQ09NTUFORCBiaW4vb2ZvcmsuQ29uc29sZS5wbCBBZG1pbjo6SVRTTTo6SW5jaWRlbnRTdGF0ZTo6UmVjYWxjdWxhdGUgU08gVEhBVCBBTEwgSU5DSURFTlQgU1RBVEVTIFdJTEwgQkUgUkVDQUxDVUxBVEVEIEJBU0VEIE9OIFRIRSBORVcgU0VUVElOR1MhJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSBcJ0lUU01DaGFuZ2VcJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoIFwnVGlja2V0XCcgb2JqZWN0cyB1c2luZyB0aGUgXCdOb3JtYWxcJyBsaW5rIHR5cGUuJ30gPQogICAgICAgICdEZWZpbmllcnQsIGRhc3MgZWluIFwnSVRTTUNoYW5nZVwnLU9iamVrdCBtaXQgZGVtIExpbmt0eXAgXCdOb3JtYWxcJyBtaXQgXCdUaWNrZXRcJy1PYmpla3RlbiB2ZXJsaW5rdCB3ZXJkZW4ga2Fubi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhIFwnSVRTTUNvbmZpZ0l0ZW1cJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoIFwnRkFRXCcgb2JqZWN0cyB1c2luZyB0aGUgXCdOb3JtYWxcJyBsaW5rIHR5cGUuJ30gPQogICAgICAgICdEZWZpbmllcnQsIGRhc3MgZWluIFwnSVRTTUNvbmZpZ0l0ZW1cJy1PYmpla3QgbWl0IGRlbSBMaW5rdHlwIFwnTm9ybWFsXCcgbWl0IFwnRkFRXCctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSBcJ0lUU01Db25maWdJdGVtXCcgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCBcJ0ZBUVwnIG9iamVjdHMgdXNpbmcgdGhlIFwnUGFyZW50Q2hpbGRcJyBsaW5rIHR5cGUuJ30gPQogICAgICAgICdEZWZpbmllcnQsIGRhc3MgZWluIFwnSVRTTUNvbmZpZ0l0ZW1cJy1PYmpla3QgbWl0IGRlbSBMaW5rdHlwIFwnUGFyZW50Q2hpbGRcJyBtaXQgXCdGQVFcJy1PYmpla3RlbiB2ZXJsaW5rdCB3ZXJkZW4ga2Fubi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhIFwnSVRTTUNvbmZpZ0l0ZW1cJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoIFwnRkFRXCcgb2JqZWN0cyB1c2luZyB0aGUgXCdSZWxldmFudFRvXCcgbGluayB0eXBlLid9ID0KICAgICAgICAnRGVmaW5pZXJ0LCBkYXNzIGVpbiBcJ0lUU01Db25maWdJdGVtXCctT2JqZWt0IG1pdCBkZW0gTGlua3R5cCBcJ1JlbGV2YW50VG9cJyBtaXQgXCdGQVFcJy1PYmpla3RlbiB2ZXJsaW5rdCB3ZXJkZW4ga2Fubi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhIFwnSVRTTUNvbmZpZ0l0ZW1cJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoIFwnU2VydmljZVwnIG9iamVjdHMgdXNpbmcgdGhlIFwnQWx0ZXJuYXRpdmVUb1wnIGxpbmsgdHlwZS4nfSA9CiAgICAgICAgJ0RlZmluaWVydCwgZGFzcyBlaW4gXCdJVFNNQ29uZmlnSXRlbVwnLU9iamVrdCBtaXQgZGVtIExpbmt0eXAgXCdBbHRlcm5hdGl2ZVRvXCcgbWl0IFwnU2VydmljZVwnLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgXCdJVFNNQ29uZmlnSXRlbVwnIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggXCdTZXJ2aWNlXCcgb2JqZWN0cyB1c2luZyB0aGUgXCdEZXBlbmRzT25cJyBsaW5rIHR5cGUuJ30gPQogICAgICAgICdEZWZpbmllcnQsIGRhc3MgZWluIFwnSVRTTUNvbmZpZ0l0ZW1cJy1PYmpla3QgbWl0IGRlbSBMaW5rdHlwIFwnRGVwZW5kc09uXCcgbWl0IFwnU2VydmljZVwnLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgXCdJVFNNQ29uZmlnSXRlbVwnIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggXCdTZXJ2aWNlXCcgb2JqZWN0cyB1c2luZyB0aGUgXCdSZWxldmFudFRvXCcgbGluayB0eXBlLid9ID0KICAgICAgICAnRGVmaW5pZXJ0LCBkYXNzIGVpbiBcJ0lUU01Db25maWdJdGVtXCctT2JqZWt0IG1pdCBkZW0gTGlua3R5cCBcJ1JlbGV2YW50VG9cJyBtaXQgXCdTZXJ2aWNlXCctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSBcJ0lUU01Db25maWdJdGVtXCcgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCBcJ1RpY2tldFwnIG9iamVjdHMgdXNpbmcgdGhlIFwnQWx0ZXJuYXRpdmVUb1wnIGxpbmsgdHlwZS4nfSA9CiAgICAgICAgJ0RlZmluaWVydCwgZGFzcyBlaW4gXCdJVFNNQ29uZmlnSXRlbVwnLU9iamVrdCBtaXQgZGVtIExpbmt0eXAgXCdBbHRlcm5hdGl2ZVRvXCcgbWl0IFwnVGlja2V0XCctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSBcJ0lUU01Db25maWdJdGVtXCcgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCBcJ1RpY2tldFwnIG9iamVjdHMgdXNpbmcgdGhlIFwnRGVwZW5kc09uXCcgbGluayB0eXBlLid9ID0KICAgICAgICAnRGVmaW5pZXJ0LCBkYXNzIGVpbiBcJ0lUU01Db25maWdJdGVtXCctT2JqZWt0IG1pdCBkZW0gTGlua3R5cCBcJ0RlcGVuZHNPblwnIG1pdCBcJ1RpY2tldFwnLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgXCdJVFNNQ29uZmlnSXRlbVwnIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggXCdUaWNrZXRcJyBvYmplY3RzIHVzaW5nIHRoZSBcJ1JlbGV2YW50VG9cJyBsaW5rIHR5cGUuJ30gPQogICAgICAgICdEZWZpbmllcnQsIGRhc3MgZWluIFwnSVRTTUNvbmZpZ0l0ZW1cJy1PYmpla3QgbWl0IGRlbSBMaW5rdHlwIFwnUmVsZXZhbnRUb1wnIG1pdCBcJ1RpY2tldFwnLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgXCdJVFNNQ29uZmlnSXRlbVwnIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggb3RoZXIgXCdJVFNNQ29uZmlnSXRlbVwnIG9iamVjdHMgdXNpbmcgdGhlIFwnQWx0ZXJuYXRpdmVUb1wnIGxpbmsgdHlwZS4nfSA9CiAgICAgICAgJ0RlZmluaWVydCwgZGFzcyBlaW4gXCdJVFNNQ29uZmlnSXRlbVwnLU9iamVrdCBtaXQgZGVtIExpbmt0eXAgXCdBbHRlcm5hdGl2ZVRvXCcgbWl0IGFuZGVyZW4gXCdJVFNNQ29uZmlnSXRlbVwnLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgXCdJVFNNQ29uZmlnSXRlbVwnIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggb3RoZXIgXCdJVFNNQ29uZmlnSXRlbVwnIG9iamVjdHMgdXNpbmcgdGhlIFwnQ29ubmVjdGVkVG9cJyBsaW5rIHR5cGUuJ30gPQogICAgICAgICdEZWZpbmllcnQsIGRhc3MgZWluIFwnSVRTTUNvbmZpZ0l0ZW1cJy1PYmpla3QgbWl0IGRlbSBMaW5rdHlwIFwnQ29ubmVjdGVkVG9cJyBtaXQgYW5kZXJlbiBcJ0lUU01Db25maWdJdGVtXCctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSBcJ0lUU01Db25maWdJdGVtXCcgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCBvdGhlciBcJ0lUU01Db25maWdJdGVtXCcgb2JqZWN0cyB1c2luZyB0aGUgXCdEZXBlbmRzT25cJyBsaW5rIHR5cGUuJ30gPQogICAgICAgICdEZWZpbmllcnQsIGRhc3MgZWluIFwnSVRTTUNvbmZpZ0l0ZW1cJy1PYmpla3QgbWl0IGRlbSBMaW5rdHlwIFwnRGVwZW5kc09uXCcgbWl0IGFuZGVyZW4gXCdJVFNNQ29uZmlnSXRlbVwnLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgXCdJVFNNQ29uZmlnSXRlbVwnIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggb3RoZXIgXCdJVFNNQ29uZmlnSXRlbVwnIG9iamVjdHMgdXNpbmcgdGhlIFwnSW5jbHVkZXNcJyBsaW5rIHR5cGUuJ30gPQogICAgICAgICdEZWZpbmllcnQsIGRhc3MgZWluIFwnSVRTTUNvbmZpZ0l0ZW1cJy1PYmpla3QgbWl0IGRlbSBMaW5rdHlwIFwnSW5jbHVkZXNcJyBtaXQgYW5kZXJlbiBcJ0lUU01Db25maWdJdGVtXCctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSBcJ0lUU01Db25maWdJdGVtXCcgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCBvdGhlciBcJ0lUU01Db25maWdJdGVtXCcgb2JqZWN0cyB1c2luZyB0aGUgXCdSZWxldmFudFRvXCcgbGluayB0eXBlLid9ID0KICAgICAgICAnRGVmaW5pZXJ0LCBkYXNzIGVpbiBcJ0lUU01Db25maWdJdGVtXCctT2JqZWt0IG1pdCBkZW0gTGlua3R5cCBcJ1JlbGV2YW50VG9cJyBtaXQgYW5kZXJlbiBcJ0lUU01Db25maWdJdGVtXCctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSBcJ0lUU01Xb3JrT3JkZXJcJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoIFwnSVRTTUNvbmZpZ0l0ZW1cJyBvYmplY3RzIHVzaW5nIHRoZSBcJ0RlcGVuZHNPblwnIGxpbmsgdHlwZS4nfSA9CiAgICAgICAgJ0RlZmluaWVydCwgZGFzcyBlaW4gXCdJVFNNV29ya09yZGVyXCctT2JqZWt0IG1pdCBkZW0gTGlua3R5cCBcJ0RlcGVuZHNPblwnIG1pdCBcJ0lUU01Db25maWdJdGVtXCctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSBcJ0lUU01Xb3JrT3JkZXJcJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoIFwnSVRTTUNvbmZpZ0l0ZW1cJyBvYmplY3RzIHVzaW5nIHRoZSBcJ05vcm1hbFwnIGxpbmsgdHlwZS4nfSA9CiAgICAgICAgJ0RlZmluaWVydCwgZGFzcyBlaW4gXCdJVFNNV29ya09yZGVyXCctT2JqZWt0IG1pdCBkZW0gTGlua3R5cCBcJ05vcm1hbFwnIG1pdCBcJ0lUU01Db25maWdJdGVtXCctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSBcJ0lUU01Xb3JrT3JkZXJcJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoIFwnU2VydmljZVwnIG9iamVjdHMgdXNpbmcgdGhlIFwnRGVwZW5kc09uXCcgbGluayB0eXBlLid9ID0KICAgICAgICAnRGVmaW5pZXJ0LCBkYXNzIGVpbiBcJ0lUU01Xb3JrT3JkZXJcJy1PYmpla3QgbWl0IGRlbSBMaW5rdHlwIFwnRGVwZW5kc09uXCcgbWl0IFwnU2VydmljZVwnLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgXCdJVFNNV29ya09yZGVyXCcgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCBcJ1NlcnZpY2VcJyBvYmplY3RzIHVzaW5nIHRoZSBcJ05vcm1hbFwnIGxpbmsgdHlwZS4nfSA9CiAgICAgICAgJ0RlZmluaWVydCwgZGFzcyBlaW4gXCdJVFNNV29ya09yZGVyXCctT2JqZWt0IG1pdCBkZW0gTGlua3R5cCBcJ05vcm1hbFwnIG1pdCBcJ1NlcnZpY2VcJy1PYmpla3RlbiB2ZXJsaW5rdCB3ZXJkZW4ga2Fubi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhIFwnSVRTTVdvcmtPcmRlclwnIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggXCdUaWNrZXRcJyBvYmplY3RzIHVzaW5nIHRoZSBcJ05vcm1hbFwnIGxpbmsgdHlwZS4nfSA9CiAgICAgICAgJ0RlZmluaWVydCwgZGFzcyBlaW4gXCdJVFNNV29ya09yZGVyXCctT2JqZWt0IG1pdCBkZW0gTGlua3R5cCBcJ05vcm1hbFwnIG1pdCBcJ1RpY2tldFwnLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgXCdTZXJ2aWNlXCcgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCBcJ0ZBUVwnIG9iamVjdHMgdXNpbmcgdGhlIFwnTm9ybWFsXCcgbGluayB0eXBlLid9ID0KICAgICAgICAnRGVmaW5pZXJ0LCBkYXNzIGVpbiBcJ1NlcnZpY2VcJy1PYmpla3QgbWl0IGRlbSBMaW5rdHlwIFwnTm9ybWFsXCcgbWl0IFwnRkFRXCctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSBcJ1NlcnZpY2VcJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoIFwnRkFRXCcgb2JqZWN0cyB1c2luZyB0aGUgXCdQYXJlbnRDaGlsZFwnIGxpbmsgdHlwZS4nfSA9CiAgICAgICAgJ0RlZmluaWVydCwgZGFzcyBlaW4gXCdTZXJ2aWNlXCctT2JqZWt0IG1pdCBkZW0gTGlua3R5cCBcJ1BhcmVudENoaWxkXCcgbWl0IFwnRkFRXCctT2JqZWt0ZW4gdmVybGlua3Qgd2VyZGVuIGthbm4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSBcJ1NlcnZpY2VcJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoIFwnRkFRXCcgb2JqZWN0cyB1c2luZyB0aGUgXCdSZWxldmFudFRvXCcgbGluayB0eXBlLid9ID0KICAgICAgICAnRGVmaW5pZXJ0LCBkYXNzIGVpbiBcJ1NlcnZpY2VcJy1PYmpla3QgbWl0IGRlbSBMaW5rdHlwIFwnUmVsZXZhbnRUb1wnIG1pdCBcJ0ZBUVwnLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIHNldHRpbmcgZGVmaW5lcyB0aGUgbGluayB0eXBlIFwnQWx0ZXJuYXRpdmVUb1wnLiBJZiB0aGUgc291cmNlIG5hbWUgYW5kIHRoZSB0YXJnZXQgbmFtZSBjb250YWluIHRoZSBzYW1lIHZhbHVlLCB0aGUgcmVzdWx0aW5nIGxpbmsgaXMgYSBub24tZGlyZWN0aW9uYWwgb25lLiBJZiB0aGUgdmFsdWVzIGFyZSBkaWZmZXJlbnQsIHRoZSByZXN1bHRpbmcgbGluayBpcyBhIGRpcmVjdGlvbmFsIGxpbmsuJ30gPQogICAgICAgICdEZWZpbmllcnQgZGVuIExpbmt0eXAgXCdBbHRlcm5hdGl2ZVRvXCcuIFdpcmQgYWxzIFNvdXJjZU5hbWUgdW5kIFRhcmdldE5hbWUgZGVyIGdsZWljaGUgSW5oYWx0IGFuZ2VnZWJlbiwgZW50c3RlaHQgZWluIHVuZ2VyaWNodGV0ZXIgTGlua3R5cC4gV2lyZCBhbHMgU291cmNlTmFtZSB1bmQgVGFyZ2V0TmFtZSB2ZXJzY2hpZWRlbmVyIEluaGFsdCBhbmdlZ2ViZW4sIGVudHN0ZWh0IGVpbiBnZXJpY2h0ZXRlciBMaW5rdHlwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIHNldHRpbmcgZGVmaW5lcyB0aGUgbGluayB0eXBlIFwnQ29ubmVjdGVkVG9cJy4gSWYgdGhlIHNvdXJjZSBuYW1lIGFuZCB0aGUgdGFyZ2V0IG5hbWUgY29udGFpbiB0aGUgc2FtZSB2YWx1ZSwgdGhlIHJlc3VsdGluZyBsaW5rIGlzIGEgbm9uLWRpcmVjdGlvbmFsIG9uZS4gSWYgdGhlIHZhbHVlcyBhcmUgZGlmZmVyZW50LCB0aGUgcmVzdWx0aW5nIGxpbmsgaXMgYSBkaXJlY3Rpb25hbCBsaW5rLid9ID0KICAgICAgICAnRGVmaW5pZXJ0IGRlbiBMaW5rdHlwIFwnQ29ubmVjdGVkVG9cJy4gV2lyZCBhbHMgU291cmNlTmFtZSB1bmQgVGFyZ2V0TmFtZSBkZXIgZ2xlaWNoZSBJbmhhbHQgYW5nZWdlYmVuLCBlbnRzdGVodCBlaW4gdW5nZXJpY2h0ZXRlciBMaW5rdHlwLiBXaXJkIGFscyBTb3VyY2VOYW1lIHVuZCBUYXJnZXROYW1lIHZlcnNjaGllZGVuZXIgSW5oYWx0IGFuZ2VnZWJlbiwgZW50c3RlaHQgZWluIGdlcmljaHRldGVyIExpbmt0eXAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgc2V0dGluZyBkZWZpbmVzIHRoZSBsaW5rIHR5cGUgXCdEZXBlbmRzT25cJy4gSWYgdGhlIHNvdXJjZSBuYW1lIGFuZCB0aGUgdGFyZ2V0IG5hbWUgY29udGFpbiB0aGUgc2FtZSB2YWx1ZSwgdGhlIHJlc3VsdGluZyBsaW5rIGlzIGEgbm9uLWRpcmVjdGlvbmFsIG9uZS4gSWYgdGhlIHZhbHVlcyBhcmUgZGlmZmVyZW50LCB0aGUgcmVzdWx0aW5nIGxpbmsgaXMgYSBkaXJlY3Rpb25hbCBsaW5rLid9ID0KICAgICAgICAnRGVmaW5pZXJ0IGRlbiBMaW5rdHlwIFwnRGVwZW5kc09uXCcuIFdpcmQgYWxzIFNvdXJjZU5hbWUgdW5kIFRhcmdldE5hbWUgZGVyIGdsZWljaGUgSW5oYWx0IGFuZ2VnZWJlbiwgZW50c3RlaHQgZWluIHVuZ2VyaWNodGV0ZXIgTGlua3R5cC4gV2lyZCBhbHMgU291cmNlTmFtZSB1bmQgVGFyZ2V0TmFtZSB2ZXJzY2hpZWRlbmVyIEluaGFsdCBhbmdlZ2ViZW4sIGVudHN0ZWh0IGVpbiBnZXJpY2h0ZXRlciBMaW5rdHlwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIHNldHRpbmcgZGVmaW5lcyB0aGUgbGluayB0eXBlIFwnSW5jbHVkZXNcJy4gSWYgdGhlIHNvdXJjZSBuYW1lIGFuZCB0aGUgdGFyZ2V0IG5hbWUgY29udGFpbiB0aGUgc2FtZSB2YWx1ZSwgdGhlIHJlc3VsdGluZyBsaW5rIGlzIGEgbm9uLWRpcmVjdGlvbmFsIG9uZS4gSWYgdGhlIHZhbHVlcyBhcmUgZGlmZmVyZW50LCB0aGUgcmVzdWx0aW5nIGxpbmsgaXMgYSBkaXJlY3Rpb25hbCBsaW5rLid9ID0KICAgICAgICAnRGVmaW5pZXJ0IGRlbiBMaW5rdHlwIFwnSW5jbHVkZXNcJy4gV2lyZCBhbHMgU291cmNlTmFtZSB1bmQgVGFyZ2V0TmFtZSBkZXIgZ2xlaWNoZSBJbmhhbHQgYW5nZWdlYmVuLCBlbnRzdGVodCBlaW4gdW5nZXJpY2h0ZXRlciBMaW5rdHlwLiBXaXJkIGFscyBTb3VyY2VOYW1lIHVuZCBUYXJnZXROYW1lIHZlcnNjaGllZGVuZXIgSW5oYWx0IGFuZ2VnZWJlbiwgZW50c3RlaHQgZWluIGdlcmljaHRldGVyIExpbmt0eXAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgc2V0dGluZyBkZWZpbmVzIHRoZSBsaW5rIHR5cGUgXCdSZWxldmFudFRvXCcuIElmIHRoZSBzb3VyY2UgbmFtZSBhbmQgdGhlIHRhcmdldCBuYW1lIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWUsIHRoZSByZXN1bHRpbmcgbGluayBpcyBhIG5vbi1kaXJlY3Rpb25hbCBvbmUuIElmIHRoZSB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgdGhlIHJlc3VsdGluZyBsaW5rIGlzIGEgZGlyZWN0aW9uYWwgbGluay4nfSA9CiAgICAgICAgJ0RlZmluaWVydCBkZW4gTGlua3R5cCBcJ1JlbGV2YW50VG9cJy4gV2lyZCBhbHMgU291cmNlTmFtZSB1bmQgVGFyZ2V0TmFtZSBkZXIgZ2xlaWNoZSBJbmhhbHQgYW5nZWdlYmVuLCBlbnRzdGVodCBlaW4gdW5nZXJpY2h0ZXRlciBMaW5rdHlwLiBXaXJkIGFscyBTb3VyY2VOYW1lIHVuZCBUYXJnZXROYW1lIHZlcnNjaGllZGVuZXIgSW5oYWx0IGFuZ2VnZWJlbiwgZW50c3RlaHQgZWluIGdlcmljaHRldGVyIExpbmt0eXAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dpZHRoIG9mIElUU00gdGV4dGFyZWFzLid9ID0gJ0FuemFobCBkZXIgWmVpY2hlbiBwcm8gWmVpbGUgaW4gSVRTTS1UZXh0QXJlYXMuJzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICApOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSVRTTUNJUEFsbG9jYXRlLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFkbWluSVRTTUNJUEFsbG9jYXRlLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEzOjUxIHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5JVFNNQ0lQQWxsb2NhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHRoZSBwcmlvcml0eSBsaXN0CiAgICBteSAlUHJpb3JpdHlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5JyktPlByaW9yaXR5TGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciBJVFNNQ3JpdGljYWxpdHkgYW5kIElUU01JbXBhY3QKICAgIG15ICREeW5hbWljRmllbGRDb25maWdBcnJheVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsnVGlja2V0J10sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gewogICAgICAgICAgICBJVFNNQ3JpdGljYWxpdHkgPT4gMSwKICAgICAgICAgICAgSVRTTUltcGFjdCAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZm9yIElUU01Dcml0aWNhbGl0eSBhbmQgSVRTTUltcGFjdAogICAgbXkgJVBvc3NpYmxlVmFsdWVzOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGRDb25maWdBcnJheVJlZn0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICRQb3NzaWJsZVZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1Bvc3NpYmxlVmFsdWVzfSB8fCB7fTsKICAgIH0KCiAgICAjIHNldCB0aGUgY3JpdGljYWxpdHkgbGlzdAogICAgJFNlbGYtPntDcml0aWNhbGl0eUxpc3R9ID0gJFBvc3NpYmxlVmFsdWVze0lUU01Dcml0aWNhbGl0eX07CgogICAgIyBzZXQgdGhlIGltcGFjdCBsaXN0CiAgICAkU2VsZi0+e0ltcGFjdExpc3R9ID0gJFBvc3NpYmxlVmFsdWVze0lUU01JbXBhY3R9OwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3QKICAgIG15ICRDSVBBbGxvY2F0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNyaXRpY2FsaXR5LCBpbXBhY3QgYW5kIHByaW9yaXR5IGFsbG9jYXRpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDSVBBbGxvY2F0ZScgKSB7CgogICAgICAgICMgZ2V0IGFsbCBQcmlvcml0eUlEcyBvZiB0aGUgbWF0cml4CiAgICAgICAgbXkgJEFsbG9jYXRlRGF0YTsKICAgICAgICBmb3IgbXkgJEltcGFjdCAoIHNvcnQga2V5cyAleyAkU2VsZi0+e0ltcGFjdExpc3R9IH0gKSB7CgogICAgICAgICAgICBDUklUSUNBTElUWToKICAgICAgICAgICAgZm9yIG15ICRDcml0aWNhbGl0eSAoIHNvcnQga2V5cyAleyAkU2VsZi0+e0NyaXRpY2FsaXR5TGlzdH0gfSApIHsKCiAgICAgICAgICAgICAgICAjIGJ1aWxkIGZpZWxkIG5hbWUgZm9yIHByaW9yaXR5IGlkCiAgICAgICAgICAgICAgICBteSAkRmllbGROYW1lID0gIlByaW9yaXR5SUQiIC4gJEltcGFjdCAuICctJyAuICRDcml0aWNhbGl0eTsKCiAgICAgICAgICAgICAgICAjIGNsZWFuIHVwIGFsbCB3aGl0ZXNwYWNlcyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBhbGxvd2VkIGluIEhUTUwgSUQtQXR0cmlidXRlcwogICAgICAgICAgICAgICAgJEZpZWxkTmFtZSA9fiBzeyBccysgfXt9Z3htczsKCiAgICAgICAgICAgICAgICAjIGdldCBmb3JtIHBhcmFtIGZvciBwcmlvcml0eSBpZAogICAgICAgICAgICAgICAgbXkgJFByaW9yaXR5SUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKAogICAgICAgICAgICAgICAgICAgIFBhcmFtID0+ICRGaWVsZE5hbWUsCiAgICAgICAgICAgICAgICApIHx8ICcnOwoKICAgICAgICAgICAgICAgIG5leHQgQ1JJVElDQUxJVFkgaWYgISRQcmlvcml0eUlEOwoKICAgICAgICAgICAgICAgICRBbGxvY2F0ZURhdGEtPnskSW1wYWN0fS0+eyRDcml0aWNhbGl0eX0gPSAkUHJpb3JpdHlJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgYWxsb2NhdGlvbnMKICAgICAgICAkQ0lQQWxsb2NhdGVPYmplY3QtPkFsbG9jYXRlVXBkYXRlKAogICAgICAgICAgICBBbGxvY2F0ZURhdGEgPT4gJEFsbG9jYXRlRGF0YSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgYWxsb2NhdGlvbiBkYXRhCiAgICAgICAgbXkgJEFsbG9jYXRlRGF0YSA9ICRDSVBBbGxvY2F0ZU9iamVjdC0+QWxsb2NhdGVMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSAkQWxsb2NhdGVNYXRyaXg7CiAgICAgICAgJEFsbG9jYXRlTWF0cml4LT5bMF0tPlswXS0+e09iamVjdFR5cGV9ID0KICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdJbXBhY3QnKSAuICcgLyAnCiAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDcml0aWNhbGl0eScpOwogICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WzBdLT5bMF0tPntDbGFzc30gPSAnSGVhZGVyQ29sdW1uRGVzY3JpcHRpb24nOwoKICAgICAgICAjIGdlbmVyYXRlIHRhYmxlIGRlc2NyaXB0aW9uIChJbXBhY3QpCiAgICAgICAgbXkgJENvdW50ZXIxID0gMTsKICAgICAgICBmb3IgbXkgJEltcGFjdCAoCiAgICAgICAgICAgIHNvcnQgeyAkU2VsZi0+e0ltcGFjdExpc3R9LT57JGF9IGNtcCAkU2VsZi0+e0ltcGFjdExpc3R9LT57JGJ9IH0KICAgICAgICAgICAga2V5cyAleyAkU2VsZi0+e0ltcGFjdExpc3R9IH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEFsbG9jYXRlTWF0cml4LT5bJENvdW50ZXIxXS0+WzBdLT57T2JqZWN0VHlwZX0gICA9ICdJbXBhY3QnOwogICAgICAgICAgICAkQWxsb2NhdGVNYXRyaXgtPlskQ291bnRlcjFdLT5bMF0tPntJbXBhY3RLZXl9ICAgID0gJEltcGFjdDsKICAgICAgICAgICAgJEFsbG9jYXRlTWF0cml4LT5bJENvdW50ZXIxXS0+WzBdLT57T2JqZWN0T3B0aW9ufSA9ICRTZWxmLT57SW1wYWN0TGlzdH0tPnskSW1wYWN0fTsKICAgICAgICAgICAgJENvdW50ZXIxKys7CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIHRhYmxlIGRlc2NyaXB0aW9uIChDcml0aWNhbGl0eSkKICAgICAgICBteSAkQ291bnRlcjIgPSAxOwogICAgICAgIGZvciBteSAkQ3JpdGljYWxpdHkgKAogICAgICAgICAgICBzb3J0IHsgJFNlbGYtPntDcml0aWNhbGl0eUxpc3R9LT57JGF9IGNtcCAkU2VsZi0+e0NyaXRpY2FsaXR5TGlzdH0tPnskYn0gfQogICAgICAgICAgICBrZXlzICV7ICRTZWxmLT57Q3JpdGljYWxpdHlMaXN0fSB9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WzBdLT5bJENvdW50ZXIyXS0+e09iamVjdFR5cGV9ICAgICA9ICdDcml0aWNhbGl0eSc7CiAgICAgICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WzBdLT5bJENvdW50ZXIyXS0+e0NyaXRpY2FsaXR5S2V5fSA9ICRDcml0aWNhbGl0eTsKICAgICAgICAgICAgJEFsbG9jYXRlTWF0cml4LT5bMF0tPlskQ291bnRlcjJdLT57T2JqZWN0T3B0aW9ufSAgID0gJFNlbGYtPntDcml0aWNhbGl0eUxpc3R9LT57JENyaXRpY2FsaXR5fTsKICAgICAgICAgICAgJENvdW50ZXIyKys7CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIGNvbnRlbnQKICAgICAgICBmb3IgbXkgJFJvdyAoIDEgLi4gKCAkQ291bnRlcjEgLSAxICkgKSB7CiAgICAgICAgICAgIGZvciBteSAkQ29sdW1uICggMSAuLiAoICRDb3VudGVyMiAtIDEgKSApIHsKCiAgICAgICAgICAgICAgICAjIGV4dHJhY3Qga2V5cwogICAgICAgICAgICAgICAgbXkgJEltcGFjdEtleSAgICAgID0gJEFsbG9jYXRlTWF0cml4LT5bJFJvd10tPlswXS0+e0ltcGFjdEtleX07CiAgICAgICAgICAgICAgICBteSAkQ3JpdGljYWxpdHlLZXkgPSAkQWxsb2NhdGVNYXRyaXgtPlswXS0+WyRDb2x1bW5dLT57Q3JpdGljYWxpdHlLZXl9OwoKICAgICAgICAgICAgICAgICMgYnVpbGQgZmllbGQgbmFtZSBmb3IgcHJpb3JpdHkgaWQKICAgICAgICAgICAgICAgIG15ICRGaWVsZE5hbWUgPSAiUHJpb3JpdHlJRCIgLiAkSW1wYWN0S2V5IC4gJy0nIC4gJENyaXRpY2FsaXR5S2V5OwoKICAgICAgICAgICAgICAgICMgY2xlYW4gdXAgYWxsIHdoaXRlc3BhY2VzIGJlY2F1c2UgdGhleSBhcmUgbm90IGFsbG93ZWQgaW4gSFRNTCBJRC1BdHRyaWJ1dGVzCiAgICAgICAgICAgICAgICAkRmllbGROYW1lID1+IHN7IFxzKyB9e31neG1zOwoKICAgICAgICAgICAgICAgICMgY3JlYXRlIG9wdGlvbiBzdHJpbmcKICAgICAgICAgICAgICAgIG15ICRPcHRpb25TdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkRmllbGROYW1lLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkQWxsb2NhdGVEYXRhLT57JEltcGFjdEtleX0tPnskQ3JpdGljYWxpdHlLZXl9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICAgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkQWxsb2NhdGVNYXRyaXgtPlskUm93XS0+WyRDb2x1bW5dLT57T3B0aW9uU3RyZ30gPSAkT3B0aW9uU3RyZzsKICAgICAgICAgICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WyRSb3ddLT5bJENvbHVtbl0tPntDbGFzc30gICAgICA9ICdDb250ZW50JzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRSb3cgKCAwIC4uICQjeyRBbGxvY2F0ZU1hdHJpeH0gKSB7CgogICAgICAgICAgICBpZiAoICRSb3cgIT0gMCApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdSb3cnICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciBteSAkQ29sdW1uICggMCAuLiAkI3sgJEFsbG9jYXRlTWF0cml4LT5bJFJvd10gfSApIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIHRoZSByb3cgaXMgaGVhZGVyCiAgICAgICAgICAgICAgICBpZiAoICRSb3cgPT0gMCApIHsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ29sdW1uID09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSGVhZGVyQ29sdW1uRGVzY3JpcHRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkQWxsb2NhdGVNYXRyaXgtPlskUm93XS0+WyRDb2x1bW5dLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJDZWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJEFsbG9jYXRlTWF0cml4LT5bJFJvd10tPlskQ29sdW1uXSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiB0aGUgY29sdW1uIGlzIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICBlbHNpZiAoICRDb2x1bW4gPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRGVzY3JpcHRpb25DZWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkQWxsb2NhdGVNYXRyaXgtPlskUm93XS0+WyRDb2x1bW5dLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ29udGVudENlbGwnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRBbGxvY2F0ZU1hdHJpeC0+WyRSb3ddLT5bJENvbHVtbl0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JVFNNQ0lQQWxsb2NhdGUnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluU2VydmljZS5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZG1pblNlcnZpY2UucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTM6NTEgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pblNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwojIC0tLQoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDb25maWdPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKTsKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkIGZvciBJVFNNQ3JpdGljYWxpdHkKICAgIG15ICREeW5hbWljRmllbGRDb25maWdBcnJheVJlZiA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbICdUaWNrZXQnIF0sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gewogICAgICAgICAgICBJVFNNQ3JpdGljYWxpdHkgPT4gMSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmb3IgSVRTTUNyaXRpY2FsaXR5CiAgICBteSAlUG9zc2libGVWYWx1ZXM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICREeW5hbWljRmllbGRDb25maWdBcnJheVJlZiB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAkUG9zc2libGVWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntQb3NzaWJsZVZhbHVlc30gfHwge307CiAgICB9CgogICAgIyBzZXQgdGhlIGNyaXRpY2FsaXR5IGxpc3QKICAgICRTZWxmLT57Q3JpdGljYWxpdHlMaXN0fSA9ICRQb3NzaWJsZVZhbHVlc3tJVFNNQ3JpdGljYWxpdHl9OwojIC0tLQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc2VydmljZSBlZGl0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZUVkaXQnICkgewoKICAgICAgICAjIGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrTmV3KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNlcnZpY2Ugc2F2ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NlcnZpY2VTYXZlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAlR2V0UGFyYW07CiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KIyAgICAgICAgZm9yIChxdyhTZXJ2aWNlSUQgUGFyZW50SUQgTmFtZSBWYWxpZElEIENvbW1lbnQpKSB7CiAgICAgICAgZm9yIChxdyhTZXJ2aWNlSUQgUGFyZW50SUQgTmFtZSBWYWxpZElEIENvbW1lbnQgVHlwZUlEIENyaXRpY2FsaXR5KSkgewojIC0tLQogICAgICAgICAgICAkR2V0UGFyYW17JF99ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKSB8fCAnJzsKICAgICAgICB9CgogICAgICAgIG15ICVFcnJvcjsKCiAgICAgICAgaWYgKCAhJEdldFBhcmFte05hbWV9ICkgewogICAgICAgICAgICAkRXJyb3J7J05hbWVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgbXkgJFNlcnZpY2VOYW1lID0gJyc7CiAgICAgICAgaWYgKCAkR2V0UGFyYW17UGFyZW50SUR9ICkgewogICAgICAgICAgICBteSAkUHJlZml4ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJEdldFBhcmFte1BhcmVudElEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkUHJlZml4KSB7CiAgICAgICAgICAgICAgICAkU2VydmljZU5hbWUgPSAkUHJlZml4IC4gIjo6IjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkU2VydmljZU5hbWUgLj0gJEdldFBhcmFte05hbWV9OwoKICAgICAgICBpZiAoIGxlbmd0aCAkU2VydmljZU5hbWUgPiAyMDAgKSB7CiAgICAgICAgICAgICRFcnJvcnsnTmFtZUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICRFcnJvcntMb25nTmFtZX0gPSAxOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhJUVycm9yICkgewoKICAgICAgICAgICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAgICAgICAgICMgc2F2ZSB0byBkYXRhYmFzZQogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtTZXJ2aWNlSUR9IGVxICdORVcnICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1NlcnZpY2VJRH0gPSAkU2VydmljZU9iamVjdC0+U2VydmljZUFkZCgKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7TWVzc2FnZX0gPSAkTG9nT2JqZWN0LT5HZXRMb2dFbnRyeSgKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBXaGF0ID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VydmljZU9iamVjdC0+U2VydmljZVVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7TWVzc2FnZX0gPSAkTG9nT2JqZWN0LT5HZXRMb2dFbnRyeSgKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBXaGF0ID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICElRXJyb3IgKSB7CgogICAgICAgICAgICAgICAgIyB1cGRhdGUgcHJlZmVyZW5jZXMKICAgICAgICAgICAgICAgIG15ICVTZXJ2aWNlRGF0YSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICVQcmVmZXJlbmNlcyA9ICgpOwogICAgICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1NlcnZpY2VQcmVmZXJlbmNlcycpICkgewogICAgICAgICAgICAgICAgICAgICVQcmVmZXJlbmNlcyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnU2VydmljZVByZWZlcmVuY2VzJykgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIHNvcnQga2V5cyAlUHJlZmVyZW5jZXMgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJE1vZHVsZSA9ICRQcmVmZXJlbmNlc3skSXRlbX0tPntNb2R1bGV9CiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6U2VydmljZVByZWZlcmVuY2VzOjpHZW5lcmljJzsKCiAgICAgICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoJE1vZHVsZSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiAkUHJlZmVyZW5jZXN7JEl0ZW19LAogICAgICAgICAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJE5vdGU7CiAgICAgICAgICAgICAgICAgICAgbXkgQFBhcmFtcyA9ICRPYmplY3QtPlBhcmFtKCBTZXJ2aWNlRGF0YSA9PiBcJVNlcnZpY2VEYXRhICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKEBQYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1JdGVtIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSBAQXJyYXkgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1JdGVtLT57TmFtZX0gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFBhcmFtSXRlbS0+e05hbWV9IH0gPSBcQEFycmF5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICEkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlRGF0YSA9PiBcJVNlcnZpY2VEYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICROb3RlIC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggSW5mbyA9PiAkT2JqZWN0LT5FcnJvcigpICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBpZiB0aGUgdXNlciB3b3VsZCBsaWtlIHRvIGNvbnRpbnVlIGVkaXRpbmcgdGhlIHNlcnZpY2UsIGp1c3QgcmVkaXJlY3QgdG8gdGhlIGVkaXQgc2NyZWVuCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ29udGludWVBZnRlclNhdmUnICkKICAgICAgICAgICAgICAgICAgICAmJiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb250aW51ZUFmdGVyU2F2ZScgKSBlcSAnMScgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBteSAkSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VydmljZUlEJyApIHx8ICcnOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3ViYWN0aW9uPVNlcnZpY2VFZGl0O1NlcnZpY2VJRD0kSUQiCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSByZXR1cm4gdG8gb3ZlcnZpZXcKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNvbWV0aGluZyB3ZW50IHdyb25nCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJEVycm9ye01lc3NhZ2V9CiAgICAgICAgICAgID8gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICBJbmZvICAgICA9PiAkRXJyb3J7TWVzc2FnZX0sCiAgICAgICAgICAgICkKICAgICAgICAgICAgOiAnJzsKCiAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrTmV3KAogICAgICAgICAgICAlRXJyb3IsCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKCiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzZXJ2aWNlIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNlIHsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGNoZWNrIGlmIHNlcnZpY2UgaXMgZW5hYmxlZCB0byB1c2UgaXQgaGVyZQogICAgICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgIERhdGEgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggIlBsZWFzZSBhY3RpdmF0ZSAlcyBmaXJzdCEiLCAiU2VydmljZSIgKSwKICAgICAgICAgICAgICAgIExpbmsgPT4KICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9CiAgICAgICAgICAgICAgICAgICAgLiAnQWN0aW9uPUFkbWluU3lzdGVtQ29uZmlndXJhdGlvbjtTdWJhY3Rpb249VmlldztTZXR0aW5nPVRpY2tldCUzQSUzQVNlcnZpY2U7JywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgfSwKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uQWRkJyApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdGaWx0ZXInICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IHJlc3VsdAogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3QnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNlcnZpY2UgbGlzdAogICAgICAgIG15ICRTZXJ2aWNlTGlzdCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTGlzdEdldCgKICAgICAgICAgICAgVmFsaWQgID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBpZiB0aGVyZSBhcmUgYW55IHNlcnZpY2VzIGRlZmluZWQsIHRoZXkgYXJlIHNob3duCiAgICAgICAgaWYgKCBAeyRTZXJ2aWNlTGlzdH0gKSB7CgogICAgICAgICAgICAjIGdldCB2YWxpZCBsaXN0CiAgICAgICAgICAgIG15ICVWYWxpZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CgogICAgICAgICAgICAjIHNvcnQgdGhlIHNlcnZpY2UgbGlzdCBieSBsb25nIHNlcnZpY2UgbmFtZQogICAgICAgICAgICBAeyRTZXJ2aWNlTGlzdH0gPSBzb3J0IHsgJGEtPntOYW1lfSAuICc6OicgY21wICRiLT57TmFtZX0gLiAnOjonIH0gQHskU2VydmljZUxpc3R9OwoKICAgICAgICAgICAgZm9yIG15ICRTZXJ2aWNlRGF0YSAoIEB7JFNlcnZpY2VMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCByb3cKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdFJvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICV7JFNlcnZpY2VEYXRhfSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgPT4gJFZhbGlkTGlzdHsgJFNlcnZpY2VEYXRhLT57VmFsaWRJRH0gfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgICMgb3RoZXJ3aXNlIGEgbm8gZGF0YSBmb3VuZCBtc2cgaXMgZGlzcGxheWVkCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTm9EYXRhRm91bmRNc2cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5TZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KICAgIHJldHVybjsKfQoKc3ViIF9NYXNrTmV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpOwogICAgbXkgJVNlcnZpY2VEYXRhOwoKICAgICMgZ2V0IHBhcmFtcwogICAgJFNlcnZpY2VEYXRhe1NlcnZpY2VJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAiU2VydmljZUlEIiApOwogICAgaWYgKCAkU2VydmljZURhdGF7U2VydmljZUlEfSBuZSAnTkVXJyApIHsKICAgICAgICAlU2VydmljZURhdGEgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUdldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIG91dHB1dCBvdmVydmlldwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBTZXJ2aWNlSUQgICA9PiAkU2VydmljZURhdGF7U2VydmljZUlEfSwKICAgICAgICAgICAgU2VydmljZU5hbWUgPT4gJFNlcnZpY2VEYXRhe05hbWV9LAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnICk7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkTGlzdFR5cGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJyk7CgogICAgIyBnZW5lcmF0ZSBQYXJlbnRPcHRpb25TdHJnCiAgICBteSAkS2VlcENoaWxkcmVuID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2U6OktlZXBDaGlsZHJlbicpIC8vIDA7CiAgICBteSAlU2VydmljZUxpc3QgID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0KAogICAgICAgIFZhbGlkICAgICAgICA9PiAhJEtlZXBDaGlsZHJlbiwKICAgICAgICBLZWVwQ2hpbGRyZW4gPT4gJEtlZXBDaGlsZHJlbiwKICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgICRTZXJ2aWNlRGF0YXtQYXJlbnRPcHRpb25TdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgID0+IFwlU2VydmljZUxpc3QsCiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ1BhcmVudElEJywKICAgICAgICBTZWxlY3RlZElEICAgICA9PiAkUGFyYW17UGFyZW50SUR9IHx8ICRTZXJ2aWNlRGF0YXtQYXJlbnRJRH0sCiAgICAgICAgUG9zc2libGVOb25lICAgPT4gMSwKICAgICAgICBUcmVlVmlldyAgICAgICA9PiAoICRMaXN0VHlwZSBlcSAndHJlZScgKSA/IDEgOiAwLAogICAgICAgIERpc2FibGVkQnJhbmNoID0+ICRTZXJ2aWNlRGF0YXtOYW1lfSwKICAgICAgICBUcmFuc2xhdGlvbiAgICA9PiAwLAogICAgICAgIENsYXNzICAgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgIyBnZW5lcmF0ZSBUeXBlT3B0aW9uU3RyZwogICAgbXkgJFR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICk7CgogICAgIyBidWlsZCB0aGUgdHlwZSBkcm9wZG93bgogICAgJFNlcnZpY2VEYXRhe1R5cGVPcHRpb25TdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gJFR5cGVMaXN0LAogICAgICAgIE5hbWUgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VHlwZUlEfSB8fCAkU2VydmljZURhdGF7VHlwZUlEfSwKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICAjIGJ1aWxkIHRoZSBjcml0aWNhbGl0eSBkcm9wZG93bgogICAgJFNlcnZpY2VEYXRhe0NyaXRpY2FsaXR5T3B0aW9uU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+ICRTZWxmLT57Q3JpdGljYWxpdHlMaXN0fSwKICAgICAgICBOYW1lICAgICAgID0+ICdDcml0aWNhbGl0eScsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17Q3JpdGljYWxpdHl9IHx8ICRTZXJ2aWNlRGF0YXtDcml0aWNhbGl0eX0sCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CiMgLS0tCgogICAgIyBnZXQgdmFsaWQgbGlzdAogICAgbXkgJVZhbGlkTGlzdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CiAgICBteSAlVmFsaWRMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJVZhbGlkTGlzdDsKCiAgICAkU2VydmljZURhdGF7VmFsaWRPcHRpb25TdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gXCVWYWxpZExpc3QsCiAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkU2VydmljZURhdGF7VmFsaWRJRH0gfHwgJFZhbGlkTGlzdFJldmVyc2V7dmFsaWR9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgb3V0cHV0IHNlcnZpY2UgZWRpdAogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnU2VydmljZUVkaXQnLAogICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVTZXJ2aWNlRGF0YSwgfSwKICAgICk7CgogICAgIyBzaG93IGVhY2ggcHJlZmVyZW5jZXMgc2V0dGluZwogICAgbXkgJVByZWZlcmVuY2VzID0gKCk7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnU2VydmljZVByZWZlcmVuY2VzJykgKSB7CiAgICAgICAgJVByZWZlcmVuY2VzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdTZXJ2aWNlUHJlZmVyZW5jZXMnKSB9OwogICAgfQogICAgZm9yIG15ICRJdGVtICggc29ydCBrZXlzICVQcmVmZXJlbmNlcyApIHsKICAgICAgICBteSAkTW9kdWxlID0gJFByZWZlcmVuY2VzeyRJdGVtfS0+e01vZHVsZX0KICAgICAgICAgICAgfHwgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpTZXJ2aWNlUHJlZmVyZW5jZXM6OkdlbmVyaWMnOwoKICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgbXkgJE9iamVjdCA9ICRNb2R1bGUtPm5ldygKICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gJFByZWZlcmVuY2VzeyRJdGVtfSwKICAgICAgICAgICAgRGVidWcgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICApOwogICAgICAgIG15IEBQYXJhbXMgPSAkT2JqZWN0LT5QYXJhbSggU2VydmljZURhdGEgPT4gXCVTZXJ2aWNlRGF0YSApOwogICAgICAgIGlmIChAUGFyYW1zKSB7CiAgICAgICAgICAgIGZvciBteSAkUGFyYW1JdGVtIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJdGVtJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICByZWYoICRQYXJhbUl0ZW0tPntEYXRhfSApIGVxICdIQVNIJwogICAgICAgICAgICAgICAgICAgIHx8IHJlZiggJFByZWZlcmVuY2VzeyRJdGVtfS0+e0RhdGF9ICkgZXEgJ0hBU0gnCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG15ICVCdWlsZFNlbGVjdGlvblBhcmFtcyA9ICgKICAgICAgICAgICAgICAgICAgICAgICAgJXsgJFByZWZlcmVuY2VzeyRJdGVtfSB9LAogICAgICAgICAgICAgICAgICAgICAgICAleyRQYXJhbUl0ZW19LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJEJ1aWxkU2VsZWN0aW9uUGFyYW1ze0NsYXNzfSA9IGpvaW4oICcgJywgJEJ1aWxkU2VsZWN0aW9uUGFyYW1ze0NsYXNzfSAvLyAnJywgJ01vZGVybml6ZScgKTsKCiAgICAgICAgICAgICAgICAgICAgJFBhcmFtSXRlbS0+eydPcHRpb24nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAlQnVpbGRTZWxlY3Rpb25QYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFtSXRlbS0+e0Jsb2NrfSB8fCAkUHJlZmVyZW5jZXN7JEl0ZW19LT57QmxvY2t9IHx8ICdPcHRpb24nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAleyAkUHJlZmVyZW5jZXN7JEl0ZW19IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBhcmFtSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblNlcnZpY2UnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtCiAgICApOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluU0xBLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFkbWluU0xBLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEzOjUxIHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5TTEE7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkU0xBT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNMQScpOwojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICBteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKTsKIyAtLS0KICAgIG15ICVFcnJvciAgICAgICAgPSAoKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNsYSBlZGl0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU0xBRWRpdCcgKSB7CgogICAgICAgICMgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGh0bWwgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2tOZXcoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgU3ViYWN0aW9uID0+ICRTZWxmLT57U3ViYWN0aW9ufSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc2xhIHNhdmUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTTEFTYXZlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgIGZvciBteSAkUGFyYW0gKAojIC0tLQojIElUU01Db3JlCiMgLS0tCiMgICAgICAgICAgICBxdyhTTEFJRCBOYW1lIENhbGVuZGFyIEZpcnN0UmVzcG9uc2VUaW1lIEZpcnN0UmVzcG9uc2VOb3RpZnkgU29sdXRpb25UaW1lIFNvbHV0aW9uTm90aWZ5IFVwZGF0ZVRpbWUgVXBkYXRlTm90aWZ5IFZhbGlkSUQgQ29tbWVudCkKICAgICAgICAgICAgcXcoU0xBSUQgTmFtZSBDYWxlbmRhciBGaXJzdFJlc3BvbnNlVGltZSBGaXJzdFJlc3BvbnNlTm90aWZ5IFNvbHV0aW9uVGltZSBTb2x1dGlvbk5vdGlmeSBVcGRhdGVUaW1lIFVwZGF0ZU5vdGlmeSBWYWxpZElEIENvbW1lbnQgVHlwZUlEIE1pblRpbWVCZXR3ZWVuSW5jaWRlbnRzKQojIC0tLQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbSApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgICAgICAlRXJyb3IgPSAoKTsKICAgICAgICBpZiAoICEkR2V0UGFyYW17TmFtZX0gKSB7CiAgICAgICAgICAgICRFcnJvcnsnTmFtZUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICAgICAjIGlmIG5vIGVycm9ycyBvY2N1cnJlZAogICAgICAgIGlmICggISVFcnJvciApIHsKCiAgICAgICAgICAgICMgZ2V0IHNlcnZpY2UgaWRzCiAgICAgICAgICAgIG15IEBTZXJ2aWNlSURzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1NlcnZpY2VJRHMnICk7CiAgICAgICAgICAgICRHZXRQYXJhbXtTZXJ2aWNlSURzfSA9IFxAU2VydmljZUlEczsKCiAgICAgICAgICAgICMgc2F2ZSB0byBkYXRhYmFzZQogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17U0xBSUR9ICkgewoKICAgICAgICAgICAgICAgICMgYWRkIGEgbmV3IHNsYQogICAgICAgICAgICAgICAgJEdldFBhcmFte1NMQUlEfSA9ICRTTEFPYmplY3QtPlNMQUFkZCgKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17U0xBSUR9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcntNZXNzYWdlfSA9ICRMb2dPYmplY3QtPkdldExvZ0VudHJ5KAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIFdoYXQgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyB1cGRhdGUgdGhlIHNsYQogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU0xBT2JqZWN0LT5TTEFVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9ye01lc3NhZ2V9ID0gJExvZ09iamVjdC0+R2V0TG9nRW50cnkoCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgV2hhdCA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAhJUVycm9yICkgewoKICAgICAgICAgICAgICAgICMgdXBkYXRlIHByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICBteSAlU0xBRGF0YSA9ICRTTEFPYmplY3QtPlNMQUdldCgKICAgICAgICAgICAgICAgICAgICBTTEFJRCAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICVQcmVmZXJlbmNlcyA9ICgpOwogICAgICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1NMQVByZWZlcmVuY2VzJykgKSB7CiAgICAgICAgICAgICAgICAgICAgJVByZWZlcmVuY2VzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdTTEFQcmVmZXJlbmNlcycpIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBzb3J0IGtleXMgJVByZWZlcmVuY2VzICkgewogICAgICAgICAgICAgICAgICAgIG15ICRNb2R1bGUgPSAkUHJlZmVyZW5jZXN7JEl0ZW19LT57TW9kdWxlfQogICAgICAgICAgICAgICAgICAgICAgICB8fCAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OlNMQVByZWZlcmVuY2VzOjpHZW5lcmljJzsKCiAgICAgICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoJE1vZHVsZSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiAkUHJlZmVyZW5jZXN7JEl0ZW19LAogICAgICAgICAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJE5vdGU7CiAgICAgICAgICAgICAgICAgICAgbXkgQFBhcmFtcyA9ICRPYmplY3QtPlBhcmFtKCBTTEFEYXRhID0+IFwlU0xBRGF0YSApOwogICAgICAgICAgICAgICAgICAgIGlmIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtSXRlbSAoQFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgQEFycmF5ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtSXRlbS0+e05hbWV9ICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRQYXJhbUl0ZW0tPntOYW1lfSB9ID0gXEBBcnJheTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFBhcmFtID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xBRGF0YSAgPT4gXCVTTEFEYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICROb3RlIC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggSW5mbyA9PiAkT2JqZWN0LT5FcnJvcigpICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBpZiB0aGUgdXNlciB3b3VsZCBsaWtlIHRvIGNvbnRpbnVlIGVkaXRpbmcgdGhlIFNMQSwganVzdCByZWRpcmVjdCB0byB0aGUgZWRpdCBzY3JlZW4KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb250aW51ZUFmdGVyU2F2ZScgKQogICAgICAgICAgICAgICAgICAgICYmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NvbnRpbnVlQWZ0ZXJTYXZlJyApIGVxICcxJyApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3ViYWN0aW9uPVNMQUVkaXQ7U0xBSUQ9JEdldFBhcmFte1NMQUlEfSIKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlIHJldHVybiB0byBvdmVydmlldwogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICAjIGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRFcnJvcntNZXNzYWdlfQogICAgICAgICAgICA/ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJywKICAgICAgICAgICAgSW5mbyAgICAgPT4gJEVycm9ye01lc3NhZ2V9LAogICAgICAgICAgICApCiAgICAgICAgICAgIDogJyc7CgogICAgICAgICMgaHRtbCBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFza05ldygKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVFcnJvciwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc2xhIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNlIHsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGNoZWNrIGlmIHNlcnZpY2UgaXMgZW5hYmxlZCB0byB1c2UgaXQgaGVyZQogICAgICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgIERhdGEgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggIlBsZWFzZSBhY3RpdmF0ZSAlcyBmaXJzdCEiLCAiU2VydmljZSIgKSwKICAgICAgICAgICAgICAgIExpbmsgPT4KICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9CiAgICAgICAgICAgICAgICAgICAgLiAnQWN0aW9uPUFkbWluU3lzdGVtQ29uZmlndXJhdGlvbjtTdWJhY3Rpb249VmlldztTZXR0aW5nPVRpY2tldCUzQSUzQVNlcnZpY2U7JywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkFkZCcgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnRmlsdGVyJyApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldyByZXN1bHQKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2VydmljZSBsaXN0CiAgICAgICAgbXkgJVNlcnZpY2VMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUxpc3QoCiAgICAgICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwoKICAgICAgICAjIGdldCBzbGEgbGlzdAogICAgICAgIG15ICVTTEFMaXN0ID0gJFNMQU9iamVjdC0+U0xBTGlzdCgKICAgICAgICAgICAgVmFsaWQgID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBpZiB0aGVyZSBhcmUgYW55IFNMQSdzIGRlZmluZWQsIHRoZXkgYXJlIHNob3duCiAgICAgICAgaWYgKCVTTEFMaXN0KSB7CiAgICAgICAgICAgIFNMQUlEOgogICAgICAgICAgICBmb3IgbXkgJFNMQUlEICggc29ydCB7IGxjICRTTEFMaXN0eyRhfSBjbXAgbGMgJFNMQUxpc3R7JGJ9IH0ga2V5cyAlU0xBTGlzdCApIHsKCiAgICAgICAgICAgICAgICAjIGdldCB0aGUgc2xhIGRhdGEKICAgICAgICAgICAgICAgIG15ICVTTEFEYXRhID0gJFNMQU9iamVjdC0+U0xBR2V0KAogICAgICAgICAgICAgICAgICAgIFNMQUlEICA9PiAkU0xBSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBidWlsZCB0aGUgc2VydmljZSBsaXN0CiAgICAgICAgICAgICAgICBteSBAU2VydmljZUxpc3Q7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFNlcnZpY2VJRCAoCiAgICAgICAgICAgICAgICAgICAgc29ydCB7IGxjICRTZXJ2aWNlTGlzdHskYX0gY21wIGxjICRTZXJ2aWNlTGlzdHskYn0gfQogICAgICAgICAgICAgICAgICAgIEB7ICRTTEFEYXRhe1NlcnZpY2VJRHN9IH0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAU2VydmljZUxpc3QsICRTZXJ2aWNlTGlzdHskU2VydmljZUlEfSB8fCAnLSc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgbGlzdCByb3cKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdFJvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVTTEFEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlID0+ICRTZXJ2aWNlTGlzdFswXSB8fCAnLScsCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkID0+ICRWYWxpZExpc3R7ICRTTEFEYXRhe1ZhbGlkSUR9IH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBTTEFJRCBpZiBzY2FsYXIgQFNlcnZpY2VMaXN0IDw9IDE7CgogICAgICAgICAgICAgICAgIyByZW1vdmUgdGhlIGZpcnN0IHNlcnZpY2UgaWQKICAgICAgICAgICAgICAgIHNoaWZ0IEBTZXJ2aWNlTGlzdDsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJFNlcnZpY2VOYW1lIChAU2VydmljZUxpc3QpIHsKCiAgICAgICAgICAgICAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgbGlzdCByb3cKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlID0+ICRTZXJ2aWNlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG90aGVyd2lzZSBhIG5vIGRhdGEgZm91bmQgbXNnIGlzIGRpc3BsYXllZAogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ05vRGF0YUZvdW5kTXNnJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluU0xBJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9NYXNrTmV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJVNMQURhdGE7CiAgICAkU0xBRGF0YXtTTEFJRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU0xBSUQnICkgfHwgJyc7CgogICAgaWYgKCAkU0xBRGF0YXtTTEFJRH0gKSB7CgogICAgICAgICMgZ2V0IHNsYSBkYXRhCiAgICAgICAgJVNMQURhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyktPlNMQUdldCgKICAgICAgICAgICAgU0xBSUQgID0+ICRTTEFEYXRhe1NMQUlEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNMQURhdGF7U2VydmljZUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZXJ2aWNlSUQnICk7CiAgICB9CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkTGlzdFR5cGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJyk7CgogICAgIyBnZXQgc2VydmljZSBsaXN0CiAgICBteSAlU2VydmljZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlTGlzdCgKICAgICAgICBWYWxpZCAgICAgICAgPT4gMSwKICAgICAgICBLZWVwQ2hpbGRyZW4gPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2U6OktlZXBDaGlsZHJlbicpIC8vIDAsCiAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGdlbmVyYXRlIFNlcnZpY2VPcHRpb25TdHJnCiAgICAkUGFyYW17U2VydmljZU9wdGlvblN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgPT4gXCVTZXJ2aWNlTGlzdCwKICAgICAgICBOYW1lICAgICAgICA9PiAnU2VydmljZUlEcycsCiAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFNMQURhdGF7U2VydmljZUlEc30gfHwgW10sCiAgICAgICAgTXVsdGlwbGUgICAgPT4gMSwKICAgICAgICBTaXplICAgICAgICA9PiA1LAogICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgVHJlZVZpZXcgICAgPT4gKCAkTGlzdFR5cGUgZXEgJ3RyZWUnICkgPyAxIDogMCwKICAgICAgICBNYXggICAgICAgICA9PiAyMDAsCiAgICAgICAgQ2xhc3MgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgIyBnZW5lcmF0ZSBUeXBlT3B0aW9uU3RyZwogICAgICAgIG15ICRUeXBlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OlNMQTo6VHlwZScsCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17VHlwZU9wdGlvblN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gJFR5cGVMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRTTEFEYXRhe1R5cGVJRH0sCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKIyAtLS0KCiAgICAjIGdlbmVyYXRlIENhbGVuZGFyT3B0aW9uU3RyZwogICAgbXkgJUNhbGVuZGFyTGlzdDsKCiAgICBteSAkTWF4aW11bSA9ICRDb25maWdPYmplY3QtPkdldCgiTWF4aW11bUNhbGVuZGFyTnVtYmVyIikgfHwgNTA7CgogICAgZm9yIG15ICRDYWxlbmRhck51bWJlciAoICcnLCAxIC4uICRNYXhpbXVtICkgewogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCJUaW1lVmFjYXRpb25EYXlzOjpDYWxlbmRhciRDYWxlbmRhck51bWJlciIpICkgewogICAgICAgICAgICAkQ2FsZW5kYXJMaXN0eyRDYWxlbmRhck51bWJlcn0gPSAiQ2FsZW5kYXIgJENhbGVuZGFyTnVtYmVyIC0gIgogICAgICAgICAgICAgICAgLiAkQ29uZmlnT2JqZWN0LT5HZXQoICJUaW1lWm9uZTo6Q2FsZW5kYXIiIC4gJENhbGVuZGFyTnVtYmVyIC4gIk5hbWUiICk7CiAgICAgICAgfQogICAgfQogICAgJFNMQURhdGF7Q2FsZW5kYXJPcHRpb25TdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiBcJUNhbGVuZGFyTGlzdCwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NhbGVuZGFyJywKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte0NhbGVuZGFyfSB8fCAkU0xBRGF0YXtDYWxlbmRhcn0sCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKICAgIG15ICVOb3RpZnlMZXZlbExpc3QgPSAoCiAgICAgICAgMTAgPT4gJzEwJScsCiAgICAgICAgMjAgPT4gJzIwJScsCiAgICAgICAgMzAgPT4gJzMwJScsCiAgICAgICAgNDAgPT4gJzQwJScsCiAgICAgICAgNTAgPT4gJzUwJScsCiAgICAgICAgNjAgPT4gJzYwJScsCiAgICAgICAgNzAgPT4gJzcwJScsCiAgICAgICAgODAgPT4gJzgwJScsCiAgICAgICAgOTAgPT4gJzkwJScsCiAgICApOwogICAgJFNMQURhdGF7Rmlyc3RSZXNwb25zZU5vdGlmeU9wdGlvblN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlTm90aWZ5TGV2ZWxMaXN0LAogICAgICAgIE5hbWUgICAgICAgICA9PiAnRmlyc3RSZXNwb25zZU5vdGlmeScsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtGaXJzdFJlc3BvbnNlTm90aWZ5fSB8fCAkU0xBRGF0YXtGaXJzdFJlc3BvbnNlTm90aWZ5fSwKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwogICAgJFNMQURhdGF7VXBkYXRlTm90aWZ5T3B0aW9uU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVOb3RpZnlMZXZlbExpc3QsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdVcGRhdGVOb3RpZnknLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VXBkYXRlTm90aWZ5fSB8fCAkU0xBRGF0YXtVcGRhdGVOb3RpZnl9LAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CiAgICAkU0xBRGF0YXtTb2x1dGlvbk5vdGlmeU9wdGlvblN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlTm90aWZ5TGV2ZWxMaXN0LAogICAgICAgIE5hbWUgICAgICAgICA9PiAnU29sdXRpb25Ob3RpZnknLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U29sdXRpb25Ob3RpZnl9IHx8ICRTTEFEYXRhe1NvbHV0aW9uTm90aWZ5fSwKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgIG15ICVWYWxpZExpc3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwogICAgbXkgJVZhbGlkTGlzdFJldmVyc2UgPSByZXZlcnNlICVWYWxpZExpc3Q7CgogICAgJFNMQURhdGF7VmFsaWRPcHRpb25TdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gXCVWYWxpZExpc3QsCiAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VmFsaWRJRH0gfHwgJFNMQURhdGF7VmFsaWRJRH0gfHwgJFZhbGlkTGlzdFJldmVyc2V7dmFsaWR9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgb3V0cHV0IHNsYSBlZGl0CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIFNMQUlEICAgICA9PiAkU0xBRGF0YXtTTEFJRH0sCiAgICAgICAgICAgIFNMQU5hbWUgICA9PiAkU0xBRGF0YXtOYW1lfSwKICAgICAgICAgICAgU3ViYWN0aW9uID0+ICRQYXJhbXtTdWJhY3Rpb259LAogICAgICAgICAgICAlUGFyYW0KICAgICAgICB9LAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25PdmVydmlldycgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdTTEFFZGl0JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlU0xBRGF0YSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIHNob3dzIGhlYWRlcgogICAgaWYgKCAkU0xBRGF0YXtTTEFJRH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0hlYWRlckVkaXQnICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnSGVhZGVyQWRkJyApOwogICAgfQoKICAgICMgc2hvdyBlYWNoIHByZWZlcmVuY2VzIHNldHRpbmcKICAgIG15ICVQcmVmZXJlbmNlcyA9ICgpOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1NMQVByZWZlcmVuY2VzJykgKSB7CiAgICAgICAgJVByZWZlcmVuY2VzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdTTEFQcmVmZXJlbmNlcycpIH07CiAgICB9CiAgICBmb3IgbXkgJEl0ZW0gKCBzb3J0IGtleXMgJVByZWZlcmVuY2VzICkgewogICAgICAgIG15ICRNb2R1bGUgPSAkUHJlZmVyZW5jZXN7JEl0ZW19LT57TW9kdWxlfQogICAgICAgICAgICB8fCAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OlNMQVByZWZlcmVuY2VzOjpHZW5lcmljJzsKCiAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoJE1vZHVsZSkgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgfQogICAgICAgIG15ICRPYmplY3QgPSAkTW9kdWxlLT5uZXcoCiAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICBDb25maWdJdGVtID0+ICRQcmVmZXJlbmNlc3skSXRlbX0sCiAgICAgICAgICAgIERlYnVnICAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgKTsKICAgICAgICBteSBAUGFyYW1zID0gJE9iamVjdC0+UGFyYW0oIFNMQURhdGEgPT4gXCVTTEFEYXRhICk7CiAgICAgICAgaWYgKEBQYXJhbXMpIHsKICAgICAgICAgICAgZm9yIG15ICRQYXJhbUl0ZW0gKEBQYXJhbXMpIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NMQUl0ZW0nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgIHJlZiggJFBhcmFtSXRlbS0+e0RhdGF9ICkgZXEgJ0hBU0gnCiAgICAgICAgICAgICAgICAgICAgfHwgcmVmKCAkUHJlZmVyZW5jZXN7JEl0ZW19LT57RGF0YX0gKSBlcSAnSEFTSCcKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUJ1aWxkU2VsZWN0aW9uUGFyYW1zID0gKAogICAgICAgICAgICAgICAgICAgICAgICAleyAkUHJlZmVyZW5jZXN7JEl0ZW19IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBhcmFtSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkQnVpbGRTZWxlY3Rpb25QYXJhbXN7Q2xhc3N9ID0gam9pbiggJyAnLCAkQnVpbGRTZWxlY3Rpb25QYXJhbXN7Q2xhc3N9IC8vICcnLCAnTW9kZXJuaXplJyApOwoKICAgICAgICAgICAgICAgICAgICAkUGFyYW1JdGVtLT57J09wdGlvbid9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICVCdWlsZFNlbGVjdGlvblBhcmFtcywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW1JdGVtLT57QmxvY2t9IHx8ICRQcmVmZXJlbmNlc3skSXRlbX0tPntCbG9ja30gfHwgJ09wdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICV7ICRQcmVmZXJlbmNlc3skSXRlbX0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgJXskUGFyYW1JdGVtfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBvdXRwdXQgYmFjawogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluU0xBJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbQogICAgKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVNlcnZpY2UucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNU2VydmljZS5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMzo1MSB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTVNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgKTsKCiAgICAjIGdldCBzZXJ2aWNlIGxpc3QKICAgIG15ICRTZXJ2aWNlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VMaXN0R2V0KAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgc2V0IGluY2lkZW50IHNpZ25hbAogICAgbXkgJUluY2lTaWduYWxzID0gKAogICAgICAgIG9wZXJhdGlvbmFsID0+ICdncmVlbmxlZCcsCiAgICAgICAgd2FybmluZyAgICAgPT4gJ3llbGxvd2xlZCcsCiAgICAgICAgaW5jaWRlbnQgICAgPT4gJ3JlZGxlZCcsCiAgICApOwoKICAgIGlmICggQHskU2VydmljZUxpc3R9ICkgewoKICAgICAgICAjIHNvcnQgdGhlIHNlcnZpY2UgbGlzdCBieSBsb25nIHNlcnZpY2UgbmFtZQogICAgICAgIEB7JFNlcnZpY2VMaXN0fSA9IHNvcnQgeyAkYS0+e05hbWV9IC4gJzo6JyBjbXAgJGItPntOYW1lfSAuICc6OicgfSBAeyRTZXJ2aWNlTGlzdH07CgogICAgICAgIGZvciBteSAkU2VydmljZURhdGEgKCBAeyRTZXJ2aWNlTGlzdH0gKSB7CgogICAgICAgICAgICAjIG91dHB1dCBvdmVydmlldyByb3cKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1JvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyRTZXJ2aWNlRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAkU2VydmljZURhdGEtPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU2lnbmFsID0+ICRJbmNpU2lnbmFsc3sgJFNlcnZpY2VEYXRhLT57Q3VySW5jaVN0YXRlVHlwZX0gfSwKICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgID0+ICRTZXJ2aWNlRGF0YS0+e0N1ckluY2lTdGF0ZVR5cGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBvdGhlcndpc2UgaXQgZGlzcGxheXMgYSBubyBkYXRhIGZvdW5kIG1lc3NhZ2UKICAgIGVsc2UgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0RhdGFGb3VuZE1zZycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGludmVzdGlnYXRlIHJlZnJlc2gKICAgIG15ICRSZWZyZXNoID0gJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9ID8gNjAgKiAkU2VsZi0+e1VzZXJSZWZyZXNoVGltZX0gOiB1bmRlZjsKCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgVGl0bGUgICA9PiAnT3ZlcnZpZXcnLAogICAgICAgIFJlZnJlc2ggPT4gJFJlZnJlc2gsCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNU2VydmljZScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVNlcnZpY2VQcmludC5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01TZXJ2aWNlUHJpbnQucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTM6NTEgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01TZXJ2aWNlUHJpbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICRTZXJ2aWNlSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VydmljZUlEJyApOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZXJ2aWNlSUQgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gU2VydmljZUlEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBzZXJ2aWNlCiAgICBteSAlU2VydmljZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VHZXQoCiAgICAgICAgU2VydmljZUlEICAgICA9PiAkU2VydmljZUlELAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIEluY2lkZW50U3RhdGUgPT4gMSwKICAgICk7CiAgICBpZiAoICEkU2VydmljZXtTZXJ2aWNlSUR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdTZXJ2aWNlSUQgJXMgbm90IGZvdW5kIGluIGRhdGFiYXNlIScsICRTZXJ2aWNlSUQgKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgc2xhIGxpc3QKICAgIG15ICVTTEFMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNMQScpLT5TTEFMaXN0KAogICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZXtTZXJ2aWNlSUR9LAogICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IHVzZXIgb2JqZWN0CiAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgIyBnZXQgdXNlciBkYXRhIChjcmVhdGUgYnkpCiAgICAkU2VydmljZXtDcmVhdGVCeU5hbWV9ID0gJFVzZXJPYmplY3QtPlVzZXJOYW1lKAogICAgICAgIFVzZXJJRCA9PiAkU2VydmljZXtDcmVhdGVCeX0sCiAgICApOwoKICAgICMgZ2V0IHVzZXIgZGF0YSAoY2hhbmdlIGJ5KQogICAgJFNlcnZpY2V7Q2hhbmdlQnlOYW1lfSA9ICRVc2VyT2JqZWN0LT5Vc2VyTmFtZSgKICAgICAgICBVc2VySUQgPT4gJFNlcnZpY2V7Q2hhbmdlQnl9LAogICAgKTsKCiAgICAjIGdldCBQREYgb2JqZWN0CiAgICBteSAkUERGT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBERicpOwoKICAgICMgZ2VuZXJhdGUgcGRmIG91dHB1dAogICAgbXkgJVBhZ2U7CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgbWF4aW11bSBudW1iZXIgb2YgcGFnZXMKICAgICRQYWdle01heFBhZ2VzfSA9ICRDb25maWdPYmplY3QtPkdldCgnUERGOjpNYXhQYWdlcycpOwogICAgaWYgKCAhJFBhZ2V7TWF4UGFnZXN9IHx8ICRQYWdle01heFBhZ2VzfSA8IDEgfHwgJFBhZ2V7TWF4UGFnZXN9ID4gMTAwMCApIHsKICAgICAgICAkUGFnZXtNYXhQYWdlc30gPSAxMDA7CiAgICB9CiAgICAkUGFnZXtNYXJnaW5Ub3B9ICAgID0gMzA7CiAgICAkUGFnZXtNYXJnaW5SaWdodH0gID0gNDA7CiAgICAkUGFnZXtNYXJnaW5Cb3R0b219ID0gNDA7CiAgICAkUGFnZXtNYXJnaW5MZWZ0fSAgID0gNDA7CiAgICAkUGFnZXtIZWFkZXJSaWdodH0gID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdTZXJ2aWNlJyk7CiAgICAkUGFnZXtQYWdlVGV4dH0gICAgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdQYWdlJyk7CiAgICAkUGFnZXtQYWdlQ291bnR9ICAgID0gMTsKCiAgICAjIGNyZWF0ZSBuZXcgcGRmIGRvY3VtZW50CiAgICAkUERGT2JqZWN0LT5Eb2N1bWVudE5ldygKICAgICAgICBUaXRsZSAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdQcm9kdWN0JykgLiAnOiAnIC4gJFNlcnZpY2V7TmFtZVNob3J0fSwKICAgICAgICBFbmNvZGUgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICk7CgogICAgIyBjcmVhdGUgZmlyc3QgcGRmIHBhZ2UKICAgICRQREZPYmplY3QtPlBhZ2VOZXcoCiAgICAgICAgJVBhZ2UsCiAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICk7CiAgICAkUGFnZXtQYWdlQ291bnR9Kys7CgogICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtNiwKICAgICk7CgogICAgIyBvdXRwdXQgdGl0bGUKICAgICRQREZPYmplY3QtPlRleHQoCiAgICAgICAgVGV4dCAgICAgPT4gJFNlcnZpY2V7TmFtZVNob3J0fSwKICAgICAgICBGb250U2l6ZSA9PiAxMywKICAgICk7CgogICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtNiwKICAgICk7CgogICAgIyBvdXRwdXQgInByaW50ZWQgYnkiCiAgICAkUERGT2JqZWN0LT5UZXh0KAogICAgICAgIFRleHQgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdwcmludGVkIGJ5JykgLiAnICcKICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJGdWxsbmFtZX0gLiAnICcKICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57VGltZX0sCiAgICAgICAgRm9udFNpemUgPT4gOSwKICAgICk7CgogICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtMTQsCiAgICApOwoKICAgICMgb3V0cHV0IGdlbmVyYWwgaW5mb3MKICAgICRTZWxmLT5fUERGT3V0cHV0R2VuZXJhbEluZm9zKAogICAgICAgIFBhZ2UgICAgPT4gXCVQYWdlLAogICAgICAgIFNlcnZpY2UgPT4gXCVTZXJ2aWNlLAogICAgKTsKCiAgICAjIG91dHB1dCBhc3NvY2lhdGVkIHNsYXMKICAgIGlmICglU0xBTGlzdCkgewogICAgICAgICRTZWxmLT5fUERGT3V0cHV0QXNzb2NpYXRlZFNMQXMoCiAgICAgICAgICAgIFBhZ2UgICAgPT4gXCVQYWdlLAogICAgICAgICAgICBTTEFMaXN0ID0+IFwlU0xBTGlzdCwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGRldGFpbGVkIGluZm9zCiAgICAkU2VsZi0+X1BERk91dHB1dERldGFpbGVkSW5mb3MoCiAgICAgICAgUGFnZSAgICA9PiBcJVBhZ2UsCiAgICAgICAgU2VydmljZSA9PiBcJVNlcnZpY2UsCiAgICApOwoKICAgICMgY3JlYXRlIGZpbGUgbmFtZQogICAgbXkgJEZpbGVuYW1lID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+RmlsZW5hbWVDbGVhblVwKAogICAgICAgIEZpbGVuYW1lID0+ICRTZXJ2aWNle05hbWVTaG9ydH0sCiAgICAgICAgVHlwZSAgICAgPT4gJ0F0dGFjaG1lbnQnLAogICAgKTsKCiAgICAjIGdldCBkYXRldGltZSBvYmplY3QKICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwoKICAgICMgcmV0dXJuIHRoZSBwZGYgZG9jdW1lbnQKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgIEZpbGVuYW1lICAgID0+ICJzZXJ2aWNlXyR7RmlsZW5hbWV9XyIgLiAkRGF0ZVRpbWVPYmplY3QtPkZvcm1hdCggRm9ybWF0ID0+ICclWS0lbS0lZF8lSDolTScgKSAuICcucGRmJywKICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vcGRmJywKICAgICAgICBDb250ZW50ICAgICA9PiAkUERGT2JqZWN0LT5Eb2N1bWVudE91dHB1dCgpLAogICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgKTsKfQoKc3ViIF9QREZPdXRwdXRHZW5lcmFsSW5mb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoUGFnZSBTZXJ2aWNlKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNyZWF0ZSBsZWZ0IHRhYmxlCiAgICBteSAkVGFibGVMZWZ0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdTZXJ2aWNlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtTZXJ2aWNlfS0+e05hbWVTaG9ydH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ3VycmVudCBJbmNpZGVudCBTdGF0ZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17U2VydmljZX0tPntDdXJJbmNpU3RhdGV9LAogICAgICAgIH0sCiAgICBdOwoKICAgICMgY3JlYXRlIHJpZ2h0IHRhYmxlCiAgICBteSAkVGFibGVSaWdodCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ3JlYXRlZCcpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnWyUgRGF0YS5DcmVhdGVUaW1lIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV0nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXCV7ICRQYXJhbXtTZXJ2aWNlfSB9LAogICAgICAgICAgICApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NyZWF0ZWQgYnknKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte1NlcnZpY2V9LT57Q3JlYXRlQnlOYW1lfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdMYXN0IGNoYW5nZWQnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJ1slIERhdGEuQ2hhbmdlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdJywKICAgICAgICAgICAgICAgIERhdGEgICAgID0+IFwleyAkUGFyYW17U2VydmljZX0gfSwKICAgICAgICAgICAgKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdMYXN0IGNoYW5nZWQgYnknKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte1NlcnZpY2V9LT57Q3JlYXRlQnlOYW1lfSwKICAgICAgICB9LAogICAgXTsKCiAgICBteSAkUm93cyA9IEB7JFRhYmxlTGVmdH07CiAgICBpZiAoIEB7JFRhYmxlUmlnaHR9ID4gJFJvd3MgKSB7CiAgICAgICAgJFJvd3MgPSBAeyRUYWJsZVJpZ2h0fTsKICAgIH0KCiAgICBteSAlVGFibGVQYXJhbTsKICAgIGZvciBteSAkUm93ICggMSAuLiAkUm93cyApIHsKICAgICAgICAkUm93LS07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVMZWZ0LT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICAgICAgICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlTGVmdC0+WyRSb3ddLT57VmFsdWV9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsyXXtDb250ZW50fSAgICAgICAgID0gJyAnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsyXXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNGRkZGRkYnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVszXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlUmlnaHQtPlskUm93XS0+e0tleX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzNde0ZvbnR9ICAgICAgICAgICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzRde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVSaWdodC0+WyRSb3ddLT57VmFsdWV9OwogICAgfQogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSAxNzAuNTsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzJde1dpZHRofSA9IDQ7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVszXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzRde1dpZHRofSA9IDE3MC41OwogICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICAgICAgID0gJ0N1dCc7CiAgICAkVGFibGVQYXJhbXtCb3JkZXJ9ICAgICAgICAgICAgICAgPSAwOwogICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICAgICAgID0gNjsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvckV2ZW59ICA9ICcjREREREREJzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgICAgICAgICA9IDE7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgICAgICAgPSAzOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICAgICAgID0gMzsKCiAgICAjIGdldCBQREYgb2JqZWN0CiAgICBteSAkUERGT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBERicpOwoKICAgICMgb3V0cHV0IHRhYmxlCiAgICBQQUdFOgogICAgZm9yICggJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fSAuLiAkUGFyYW17UGFnZX0tPntNYXhQYWdlc30gKSB7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICVUYWJsZVBhcmFtID0gJFBERk9iamVjdC0+VGFibGUoJVRhYmxlUGFyYW0pOwoKICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICBsYXN0IFBBR0UgaWYgJFRhYmxlUGFyYW17U3RhdGV9OwoKICAgICAgICAkUERGT2JqZWN0LT5QYWdlTmV3KAogICAgICAgICAgICAleyAkUGFyYW17UGFnZX0gfSwKICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhcmFte1BhZ2V9LT57UGFnZVRleHR9IC4gJyAnIC4gJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fQogICAgICAgICk7CiAgICAgICAgJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fSsrOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX1BERk91dHB1dERldGFpbGVkSW5mb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoUGFnZSBTZXJ2aWNlKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgUERGIG9iamVjdAogICAgbXkgJFBERk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQREYnKTsKCiAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTE1LAogICAgKTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAkUERGT2JqZWN0LT5UZXh0KAogICAgICAgIFRleHQgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnU2VydmljZScpLAogICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgKTsKCiAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTQsCiAgICApOwoKICAgICMgY3JlYXRlIHRhYmxlCiAgICBteSAkVGFibGUgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1NlcnZpY2UnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte1NlcnZpY2V9LT57TmFtZX0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnVHlwZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRQYXJhbXtTZXJ2aWNlfS0+e1R5cGV9ICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ3JpdGljYWxpdHknKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkUGFyYW17U2VydmljZX0tPntDcml0aWNhbGl0eX0gKSwKICAgICAgICB9LAogICAgXTsKICAgIG15ICVUYWJsZVBhcmFtOwogICAgbXkgJFJvd3MgPSBAeyRUYWJsZX07CiAgICBmb3IgbXkgJFJvdyAoIDEgLi4gJFJvd3MgKSB7CiAgICAgICAgJFJvdy0tOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSA9ICRUYWJsZS0+WyRSb3ddLT57S2V5fTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJFRhYmxlLT5bJFJvd10tPntWYWx1ZX07CiAgICB9CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQzMTsKICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgICAgICA9ICdDdXQnOwogICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICAgICAgID0gMDsKICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgICAgICA9IDY7CiAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3J9ICAgICAgPSAnI0RERERERCc7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgICAgICAgPSAxOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICAgICAgID0gMzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgICAgICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIFBBR0U6CiAgICBmb3IgKCAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9IC4uICRQYXJhbXtQYWdlfS0+e01heFBhZ2VzfSApIHsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgJVRhYmxlUGFyYW0gPSAkUERGT2JqZWN0LT5UYWJsZSglVGFibGVQYXJhbSk7CgogICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgIGxhc3QgUEFHRSBpZiAkVGFibGVQYXJhbXtTdGF0ZX07CgogICAgICAgICRQREZPYmplY3QtPlBhZ2VOZXcoCiAgICAgICAgICAgICV7ICRQYXJhbXtQYWdlfSB9LAogICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFyYW17UGFnZX0tPntQYWdlVGV4dH0gLiAnICcgLiAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9CiAgICAgICAgKTsKICAgICAgICAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9Kys7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0QXNzb2NpYXRlZFNMQXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoUGFnZSBTTEFMaXN0KSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVRhYmxlUGFyYW07CiAgICBteSAkUm93ID0gMDsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgZ2VuZXJhdGUgdGFibGUgZGF0YQogICAgZm9yIG15ICRTTEFJRCAoIHNvcnQga2V5cyAleyAkUGFyYW17U0xBTGlzdH0gfSApIHsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1NMQScpIC4gJzonOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkUGFyYW17U0xBTGlzdH0tPnskU0xBSUR9OwogICAgICAgICRSb3crKzsKICAgIH0KICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgICMgZ2V0IFBERiBvYmplY3QKICAgIG15ICRQREZPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UERGJyk7CgogICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICBZICAgID0+IC0xNSwKICAgICk7CgogICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICRQREZPYmplY3QtPlRleHQoCiAgICAgICAgVGV4dCAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdBc3NvY2lhdGVkIFNMQXMnKSwKICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICk7CgogICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICBZICAgID0+IC00LAogICAgKTsKCiAgICAjIHRhYmxlIHBhcmFtcwogICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICA9ICdDdXQnOwogICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICA9IDA7CiAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICAgID0gNjsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvcn0gPSAnI0RERERERCc7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgID0gMTsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdUb3B9ICAgICAgPSAzOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIFBBR0U6CiAgICBmb3IgKCAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9IC4uICRQYXJhbXtQYWdlfS0+e01heFBhZ2VzfSApIHsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgJVRhYmxlUGFyYW0gPSAkUERGT2JqZWN0LT5UYWJsZSglVGFibGVQYXJhbSk7CgogICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgIGxhc3QgUEFHRSBpZiAkVGFibGVQYXJhbXtTdGF0ZX07CgogICAgICAgICRQREZPYmplY3QtPlBhZ2VOZXcoCiAgICAgICAgICAgICV7ICRQYXJhbXtQYWdlfSB9LAogICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFyYW17UGFnZX0tPntQYWdlVGV4dH0gLiAnICcgLiAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9CiAgICAgICAgKTsKICAgICAgICAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9Kys7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVNlcnZpY2Vab29tLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVNlcnZpY2Vab29tLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEzOjUxIHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNU2VydmljZVpvb207Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICRTZXJ2aWNlSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VydmljZUlEJyApOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZXJ2aWNlSUQgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gU2VydmljZUlEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBzZXJ2aWNlCiAgICBteSAlU2VydmljZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VHZXQoCiAgICAgICAgU2VydmljZUlEICAgICA9PiAkU2VydmljZUlELAogICAgICAgIEluY2lkZW50U3RhdGUgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBpZiAoICEkU2VydmljZXtTZXJ2aWNlSUR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdTZXJ2aWNlSUQgJXMgbm90IGZvdW5kIGluIGRhdGFiYXNlIScsICRTZXJ2aWNlSUQgKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBydW4gY29uZmlnIGl0ZW0gbWVudSBtb2R1bGVzCiAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01TZXJ2aWNlOjpGcm9udGVuZDo6TWVudU1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlTWVudXMgICA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnSVRTTVNlcnZpY2U6OkZyb250ZW5kOjpNZW51TW9kdWxlJykgfTsKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRNZW51ICggc29ydCBrZXlzICVNZW51cyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAkTWVudXN7JE1lbnV9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNZW51c3skTWVudX0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZWxmLT57U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZXQgY2xhc3NlcwogICAgICAgICAgICAgICAgaWYgKCAkTWVudXN7JE1lbnV9LT57VGFyZ2V0fSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRNZW51c3skTWVudX0tPntUYXJnZXR9IGVxICdQb3BVcCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRNZW51c3skTWVudX0tPntNZW51Q2xhc3N9ID0gJ0FzUG9wdXAnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRNZW51c3skTWVudX0tPntUYXJnZXR9IGVxICdCYWNrJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE1lbnVzeyRNZW51fS0+e01lbnVDbGFzc30gPSAnSGlzdG9yeUJhY2snOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgICRDb3VudGVyID0gJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlID0+IFwlU2VydmljZSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyID0+ICRDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgPT4gJE1lbnVzeyRNZW51fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHNsYSBvYmplY3QKICAgIG15ICRTTEFPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyk7CgogICAgIyBnZXQgc2xhIGxpc3QKICAgIG15ICVTTEFMaXN0ID0gJFNMQU9iamVjdC0+U0xBTGlzdCgKICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRCwKICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIGlmICglU0xBTGlzdCkgewoKICAgICAgICAjIG91dHB1dCByb3cKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJFNMQUlEICggc29ydCB7ICRTTEFMaXN0eyRhfSBjbXAgJFNMQUxpc3R7JGJ9IH0ga2V5cyAlU0xBTGlzdCApIHsKCiAgICAgICAgICAgICMgZ2V0IHNsYSBkYXRhCiAgICAgICAgICAgIG15ICVTTEEgPSAkU0xBT2JqZWN0LT5TTEFHZXQoCiAgICAgICAgICAgICAgICBTTEFJRCAgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IHJvdwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NMQVJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlU0xBLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbGlua2VkIG9iamVjdHMKICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICBPYmplY3QgPT4gJ1NlcnZpY2UnLAogICAgICAgIEtleSAgICA9PiAkU2VydmljZUlELAogICAgICAgIFN0YXRlICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGxpbmsgdGFibGUgdmlldyBtb2RlCiAgICBteSAkTGlua1RhYmxlVmlld01vZGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0xpbmtPYmplY3Q6OlZpZXdNb2RlJyk7CgogICAgIyBjcmVhdGUgdGhlIGxpbmsgdGFibGUKICAgIG15ICRMaW5rVGFibGVTdHJnID0gJExheW91dE9iamVjdC0+TGlua09iamVjdFRhYmxlQ3JlYXRlKAogICAgICAgIExpbmtMaXN0V2l0aERhdGEgPT4gJExpbmtMaXN0V2l0aERhdGEsCiAgICAgICAgVmlld01vZGUgICAgICAgICA9PiAkTGlua1RhYmxlVmlld01vZGUsCiAgICAgICAgT2JqZWN0ICAgICAgICAgICA9PiAnU2VydmljZScsCiAgICAgICAgS2V5ICAgICAgICAgICAgICA9PiAkU2VydmljZUlELAogICAgKTsKCiAgICAjIG91dHB1dCB0aGUgbGluayB0YWJsZQogICAgaWYgKCRMaW5rVGFibGVTdHJnKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtUYWJsZScgLiAkTGlua1RhYmxlVmlld01vZGUsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGlua1RhYmxlU3RyZyA9PiAkTGlua1RhYmxlU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IGluY2lkZW50IHNpZ25hbAogICAgbXkgJUluY2lTaWduYWxzID0gKAogICAgICAgIG9wZXJhdGlvbmFsID0+ICdncmVlbmxlZCcsCiAgICAgICAgd2FybmluZyAgICAgPT4gJ3llbGxvd2xlZCcsCiAgICAgICAgaW5jaWRlbnQgICAgPT4gJ3JlZGxlZCcsCiAgICApOwoKICAgICMgZ2V0IHVzZXIgb2JqZWN0CiAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgIyBnZXQgY3JlYXRlIHVzZXIgZGF0YQogICAgJFNlcnZpY2V7Q3JlYXRlQnlOYW1lfSA9ICRVc2VyT2JqZWN0LT5Vc2VyTmFtZSgKICAgICAgICBVc2VySUQgPT4gJFNlcnZpY2V7Q3JlYXRlQnl9LAogICAgKTsKCiAgICAjIGdldCBjaGFuZ2UgdXNlciBkYXRhCiAgICAkU2VydmljZXtDaGFuZ2VCeU5hbWV9ID0gJFVzZXJPYmplY3QtPlVzZXJOYW1lKAogICAgICAgIFVzZXJJRCA9PiAkU2VydmljZXtDaGFuZ2VCeX0sCiAgICApOwoKICAgICMgc3RvcmUgbGFzdCBzY3JlZW4KICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpLT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5WaWV3JywKICAgICAgICBWYWx1ZSAgICAgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgKTsKCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVNlcnZpY2Vab29tJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVTZXJ2aWNlLAogICAgICAgICAgICBDdXJJbmNpU2lnbmFsID0+ICRJbmNpU2lnbmFsc3sgJFNlcnZpY2V7Q3VySW5jaVN0YXRlVHlwZX0gfSwKICAgICAgICB9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVNMQS5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01TTEEucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTM6NTEgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01TTEE7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICk7CgogICAgIyBnZXQgc2xhIG9iamVjdAogICAgbXkgJFNMQU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTTEEnKTsKCiAgICAjIGdldCBzbGEgbGlzdAogICAgbXkgJVNMQUxpc3QgPSAkU0xBT2JqZWN0LT5TTEFMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICglU0xBTGlzdCkgewogICAgICAgIGZvciBteSAkU0xBSUQgKCBzb3J0IHsgJFNMQUxpc3R7JGF9IGNtcCAkU0xBTGlzdHskYn0gfSBrZXlzICVTTEFMaXN0ICkgewoKICAgICAgICAgICAgIyBnZXQgc2xhIGRhdGEKICAgICAgICAgICAgbXkgJVNMQSA9ICRTTEFPYmplY3QtPlNMQUdldCgKICAgICAgICAgICAgICAgIFNMQUlEICA9PiAkU0xBSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgcm93CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVNMQSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgb3RoZXJ3aXNlIGl0IGRpc3BsYXlzIGEgbm8gZGF0YSBmb3VuZCBtZXNzYWdlCiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9EYXRhRm91bmRNc2cnLAogICAgICAgICk7CiAgICB9CgogICAgIyBpbnZlc3RpZ2F0ZSByZWZyZXNoCiAgICBteSAkUmVmcmVzaCA9ICRTZWxmLT57VXNlclJlZnJlc2hUaW1lfSA/IDYwICogJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9IDogdW5kZWY7CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgIFRpdGxlICAgPT4gVHJhbnNsYXRhYmxlKCdPdmVydmlldycpLAogICAgICAgIFJlZnJlc2ggPT4gJFJlZnJlc2gsCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNU0xBJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVNMQVByaW50LnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVNMQVByaW50LnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEzOjUxIHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNU0xBUHJpbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICRTTEFJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICJTTEFJRCIgKTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkU0xBSUQgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gU0xBSUQgaXMgZ2l2ZW4hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHNsYQogICAgbXkgJVNMQSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTTEEnKS0+U0xBR2V0KAogICAgICAgIFNMQUlEICA9PiAkU0xBSUQsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBpZiAoICEkU0xBe1NMQUlEfSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnU0xBSUQgJXMgbm90IGZvdW5kIGluIGRhdGFiYXNlIScsICRTTEFJRCApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBjYWxlbmRhciBuYW1lCiAgICBpZiAoICRTTEF7Q2FsZW5kYXJ9ICkgewogICAgICAgICRTTEF7Q2FsZW5kYXJOYW1lfSA9ICJDYWxlbmRhciAkU0xBe0NhbGVuZGFyfSAtICIKICAgICAgICAgICAgLiAkQ29uZmlnT2JqZWN0LT5HZXQoICJUaW1lWm9uZTo6Q2FsZW5kYXIiIC4gJFNMQXtDYWxlbmRhcn0gLiAiTmFtZSIgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTTEF7Q2FsZW5kYXJOYW1lfSA9IFRyYW5zbGF0YWJsZSgnQ2FsZW5kYXIgRGVmYXVsdCcpOwogICAgfQoKICAgICMgZ2V0IHVzZXIgb2JqZWN0CiAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgIyBnZXQgdXNlciBkYXRhIChjcmVhdGUgYnkpCiAgICAkU0xBe0NyZWF0ZUJ5TmFtZX0gPSAkVXNlck9iamVjdC0+VXNlck5hbWUoCiAgICAgICAgVXNlcklEID0+ICRTTEF7Q3JlYXRlQnl9LAogICAgKTsKCiAgICAjIGdldCB1c2VyIGRhdGEgKGNoYW5nZSBieSkKICAgICRTTEF7Q2hhbmdlQnlOYW1lfSA9ICRVc2VyT2JqZWN0LT5Vc2VyTmFtZSgKICAgICAgICBVc2VySUQgPT4gJFNMQXtDaGFuZ2VCeX0sCiAgICApOwoKICAgICMgZ2V0IFBERiBvYmplY3QKICAgIG15ICRQREZPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UERGJyk7CgogICAgIyBnZW5lcmF0ZSBQREYgb3V0cHV0CiAgICBteSAlUGFnZTsKCiAgICAjIGdldCBtYXhpbXVtIG51bWJlciBvZiBwYWdlcwogICAgJFBhZ2V7TWF4UGFnZXN9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdQREY6Ok1heFBhZ2VzJyk7CiAgICBpZiAoICEkUGFnZXtNYXhQYWdlc30gfHwgJFBhZ2V7TWF4UGFnZXN9IDwgMSB8fCAkUGFnZXtNYXhQYWdlc30gPiAxMDAwICkgewogICAgICAgICRQYWdle01heFBhZ2VzfSA9IDEwMDsKICAgIH0KICAgICRQYWdle01hcmdpblRvcH0gICAgPSAzMDsKICAgICRQYWdle01hcmdpblJpZ2h0fSAgPSA0MDsKICAgICRQYWdle01hcmdpbkJvdHRvbX0gPSA0MDsKICAgICRQYWdle01hcmdpbkxlZnR9ICAgPSA0MDsKICAgICRQYWdle0hlYWRlclJpZ2h0fSAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1NMQScpOwogICAgJFBhZ2V7UGFnZVRleHR9ICAgICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUGFnZScpOwogICAgJFBhZ2V7UGFnZUNvdW50fSAgICA9IDE7CgogICAgIyBjcmVhdGUgbmV3IFBERiBkb2N1bWVudAogICAgJFBERk9iamVjdC0+RG9jdW1lbnROZXcoCiAgICAgICAgVGl0bGUgID0+ICRDb25maWdPYmplY3QtPkdldCgnUHJvZHVjdCcpIC4gJzogJyAuICRTTEF7TmFtZX0sCiAgICAgICAgRW5jb2RlID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICApOwoKICAgICMgY3JlYXRlIGZpcnN0IFBERiBwYWdlCiAgICAkUERGT2JqZWN0LT5QYWdlTmV3KAogICAgICAgICVQYWdlLAogICAgICAgIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICApOwogICAgJFBhZ2V7UGFnZUNvdW50fSsrOwoKICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTYsCiAgICApOwoKICAgICMgb3V0cHV0IHRpdGxlCiAgICAkUERGT2JqZWN0LT5UZXh0KAogICAgICAgIFRleHQgICAgID0+ICRTTEF7TmFtZX0sCiAgICAgICAgRm9udFNpemUgPT4gMTMsCiAgICApOwoKICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTYsCiAgICApOwoKICAgICMgb3V0cHV0ICJwcmludGVkIGJ5IgogICAgJFBERk9iamVjdC0+VGV4dCgKICAgICAgICBUZXh0ID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgncHJpbnRlZCBieScpIC4gJyAnCiAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyRnVsbG5hbWV9IC4gJyAnCiAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e1RpbWV9LAogICAgICAgIEZvbnRTaXplID0+IDksCiAgICApOwoKICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTE0LAogICAgKTsKCiAgICAjIG91dHB1dCBnZW5lcmFsIGluZm9zCiAgICAkU2VsZi0+X1BERk91dHB1dEdlbmVyYWxJbmZvcygKICAgICAgICBQYWdlID0+IFwlUGFnZSwKICAgICAgICBTTEEgID0+IFwlU0xBLAogICAgKTsKCiAgICAjIG91dHB1dCBkZXRhaWxlZCBpbmZvcwogICAgJFNlbGYtPl9QREZPdXRwdXREZXRhaWxlZEluZm9zKAogICAgICAgIFBhZ2UgPT4gXCVQYWdlLAogICAgICAgIFNMQSAgPT4gXCVTTEEsCiAgICApOwoKICAgICMgY3JlYXRlIGZpbGUgbmFtZQogICAgbXkgJEZpbGVuYW1lID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+RmlsZW5hbWVDbGVhblVwKAogICAgICAgIEZpbGVuYW1lID0+ICRTTEF7TmFtZX0sCiAgICAgICAgVHlwZSAgICAgPT4gJ0F0dGFjaG1lbnQnLAogICAgKTsKCiAgICAjIGdldCBkYXRldGltZSBvYmplY3QKICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwoKICAgICMgcmV0dXJuIHRoZSBQREYgZG9jdW1lbnQKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgIEZpbGVuYW1lICAgID0+ICJzbGFfJHtGaWxlbmFtZX1fIiAuICREYXRlVGltZU9iamVjdC0+Rm9ybWF0KCBGb3JtYXQgPT4gIiVZLSVtLSVkXyVIOiVNIiApIC4gJy5wZGYnLAogICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9wZGYnLAogICAgICAgIENvbnRlbnQgICAgID0+ICRQREZPYmplY3QtPkRvY3VtZW50T3V0cHV0KCksCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICApOwp9CgpzdWIgX1BERk91dHB1dEdlbmVyYWxJbmZvcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhQYWdlIFNMQSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjcmVhdGUgbGVmdCB0YWJsZQogICAgbXkgJFRhYmxlTGVmdCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnU0xBJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtTTEF9LT57TmFtZX0sCiAgICAgICAgfSwKICAgIF07CgogICAgIyBjcmVhdGUgcmlnaHQgdGFibGUKICAgIG15ICRUYWJsZVJpZ2h0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDcmVhdGVkJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICdbJSBEYXRhLkNyZWF0ZVRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXScsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcJXsgJFBhcmFte1NMQX0gfSwKICAgICAgICAgICAgKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDcmVhdGVkIGJ5JykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtTTEF9LT57Q2hhbmdlQnlOYW1lfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdMYXN0IGNoYW5nZWQnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJ1slIERhdGEuQ2hhbmdlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdJywKICAgICAgICAgICAgICAgIERhdGEgICAgID0+IFwleyAkUGFyYW17U0xBfSB9LAogICAgICAgICAgICApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0xhc3QgY2hhbmdlZCBieScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17U0xBfS0+e0NoYW5nZUJ5TmFtZX0sCiAgICAgICAgfSwKICAgIF07CgogICAgbXkgJFJvd3MgPSBAeyRUYWJsZUxlZnR9OwogICAgaWYgKCBAeyRUYWJsZVJpZ2h0fSA+ICRSb3dzICkgewogICAgICAgICRSb3dzID0gQHskVGFibGVSaWdodH07CiAgICB9CgogICAgbXkgJVRhYmxlUGFyYW07CiAgICBmb3IgbXkgJFJvdyAoIDEgLi4gJFJvd3MgKSB7CiAgICAgICAgJFJvdy0tOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlTGVmdC0+WyRSb3ddLT57S2V5fTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgICAgICAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gICAgICAgICA9ICRUYWJsZUxlZnQtPlskUm93XS0+e1ZhbHVlfTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMl17Q29udGVudH0gICAgICAgICA9ICcgJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMl17QmFja2dyb3VuZENvbG9yfSA9ICcjRkZGRkZGJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bM117Q29udGVudH0gICAgICAgICA9ICRUYWJsZVJpZ2h0LT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVszXXtGb250fSAgICAgICAgICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVs0XXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlUmlnaHQtPlskUm93XS0+e1ZhbHVlfTsKICAgIH0KICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDUwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gMjAwLjU7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsyXXtXaWR0aH0gPSA0OwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bM117V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVs0XXtXaWR0aH0gPSAxNzAuNTsKICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgICAgICA9ICdDdXQnOwogICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICAgICAgID0gMDsKICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgICAgICA9IDY7CiAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3JFdmVufSAgPSAnI0RERERERCc7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgICAgICAgPSAxOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICAgICAgID0gMzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgICAgICA9IDM7CgogICAgIyBnZXQgUERGIG9iamVjdAogICAgbXkgJFBERk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQREYnKTsKCiAgICAjIG91dHB1dCB0YWJsZQogICAgUEFHRToKICAgIGZvciAoICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0gLi4gJFBhcmFte1BhZ2V9LT57TWF4UGFnZXN9ICkgewoKICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAlVGFibGVQYXJhbSA9ICRQREZPYmplY3QtPlRhYmxlKCVUYWJsZVBhcmFtKTsKCiAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgbGFzdCBQQUdFIGlmICRUYWJsZVBhcmFte1N0YXRlfTsKCiAgICAgICAgJFBERk9iamVjdC0+UGFnZU5ldygKICAgICAgICAgICAgJXsgJFBhcmFte1BhZ2V9IH0sCiAgICAgICAgICAgIEZvb3RlclJpZ2h0ID0+ICRQYXJhbXtQYWdlfS0+e1BhZ2VUZXh0fSAuICcgJyAuICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0KICAgICAgICApOwogICAgICAgICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0rKzsKICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX1BERk91dHB1dERldGFpbGVkSW5mb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoUGFnZSBTTEEpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBQREYgb2JqZWN0CiAgICBteSAkUERGT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBERicpOwoKICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtMTUsCiAgICApOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICRQREZPYmplY3QtPlRleHQoCiAgICAgICAgVGV4dCAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdTTEEnKSwKICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICk7CgogICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICBZICAgID0+IC00LAogICAgKTsKCiAgICAjIGNyZWF0ZSB0YWJsZQogICAgbXkgJFRhYmxlID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdTTEEnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte1NMQX0tPntOYW1lfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdUeXBlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJFBhcmFte1NMQX0tPntUeXBlfSApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NhbGVuZGFyJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJFBhcmFte1NMQX0tPntDYWxlbmRhck5hbWV9ICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0ZpcnN0IFJlc3BvbnNlIFRpbWUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4KICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJFBhcmFte1NMQX0tPntGaXJzdFJlc3BvbnNlVGltZX0gKQogICAgICAgICAgICAgICAgLiAnICcKICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdtaW51dGVzJyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnVXBkYXRlIFRpbWUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkUGFyYW17U0xBfS0+e1VwZGF0ZVRpbWV9ICkgLiAnICcKICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdtaW51dGVzJyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnU29sdXRpb24gVGltZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRQYXJhbXtTTEF9LT57U29sdXRpb25UaW1lfSApCiAgICAgICAgICAgICAgICAuICcgJwogICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ21pbnV0ZXMnKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTWluaW11bSBUaW1lIEJldHdlZW4gSW5jaWRlbnRzJykKICAgICAgICAgICAgICAgIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAkUGFyYW17U0xBfS0+e01pblRpbWVCZXR3ZWVuSW5jaWRlbnRzfSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC4gJyAnCiAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnbWludXRlcycpLAogICAgICAgIH0sCiAgICBdOwogICAgbXkgJVRhYmxlUGFyYW07CiAgICBteSAkUm93cyA9IEB7JFRhYmxlfTsKICAgIGZvciBteSAkUm93ICggMSAuLiAkUm93cyApIHsKICAgICAgICAkUm93LS07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ID0gJFRhYmxlLT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkVGFibGUtPlskUm93XS0+e1ZhbHVlfTsKICAgIH0KICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDEyMDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDM5MTsKICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgICAgICA9ICdDdXQnOwogICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICAgICAgID0gMDsKICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgICAgICA9IDY7CiAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3J9ICAgICAgPSAnI0RERERERCc7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgICAgICAgPSAxOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICAgICAgID0gMzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgICAgICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIFBBR0U6CiAgICBmb3IgKCAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9IC4uICRQYXJhbXtQYWdlfS0+e01heFBhZ2VzfSApIHsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgJVRhYmxlUGFyYW0gPSAkUERGT2JqZWN0LT5UYWJsZSglVGFibGVQYXJhbSk7CgogICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgIGxhc3QgUEFHRSBpZiAkVGFibGVQYXJhbXtTdGF0ZX07CgogICAgICAgICRQREZPYmplY3QtPlBhZ2VOZXcoCiAgICAgICAgICAgICV7ICRQYXJhbXtQYWdlfSB9LAogICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFyYW17UGFnZX0tPntQYWdlVGV4dH0gLiAnICcgLiAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9CiAgICAgICAgKTsKICAgICAgICAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9Kys7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVNMQVpvb20ucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNU0xBWm9vbS5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMzo1MSB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTVNMQVpvb207Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICRTTEFJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICJTTEFJRCIgKTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkU0xBSUQgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gU0xBSUQgaXMgZ2l2ZW4hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHNsYQogICAgbXkgJVNMQSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTTEEnKS0+U0xBR2V0KAogICAgICAgIFNMQUlEICA9PiAkU0xBSUQsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBpZiAoICEkU0xBe1NMQUlEfSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnU0xBSUQgJXMgbm90IGZvdW5kIGluIGRhdGFiYXNlIScsICRTTEFJRCApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBjYWxlbmRhciBuYW1lCiAgICBpZiAoICRTTEF7Q2FsZW5kYXJ9ICkgewogICAgICAgICRTTEF7Q2FsZW5kYXJOYW1lfSA9ICJDYWxlbmRhciAkU0xBe0NhbGVuZGFyfSAtICIKICAgICAgICAgICAgLiAkQ29uZmlnT2JqZWN0LT5HZXQoICJUaW1lWm9uZTo6Q2FsZW5kYXIiIC4gJFNMQXtDYWxlbmRhcn0gLiAiTmFtZSIgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTTEF7Q2FsZW5kYXJOYW1lfSA9IFRyYW5zbGF0YWJsZSgnQ2FsZW5kYXIgRGVmYXVsdCcpOwogICAgfQoKICAgICMgcnVuIGNvbmZpZyBpdGVtIG1lbnUgbW9kdWxlcwogICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdJVFNNU0xBOjpGcm9udGVuZDo6TWVudU1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlTWVudXMgICA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnSVRTTVNMQTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKSB9OwogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICRNZW51c3skTWVudX0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1lbnVzeyRNZW51fS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICBTTEFJRCA9PiAkU2VsZi0+e1NMQUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZXQgY2xhc3NlcwogICAgICAgICAgICAgICAgaWYgKCAkTWVudXN7JE1lbnV9LT57VGFyZ2V0fSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRNZW51c3skTWVudX0tPntUYXJnZXR9IGVxICdQb3BVcCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRNZW51c3skTWVudX0tPntNZW51Q2xhc3N9ID0gJ0FzUG9wdXAnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRNZW51c3skTWVudX0tPntUYXJnZXR9IGVxICdCYWNrJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE1lbnVzeyRNZW51fS0+e01lbnVDbGFzc30gPSAnSGlzdG9yeUJhY2snOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgICRDb3VudGVyID0gJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBTTEEgICAgID0+IFwlU0xBLAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgPT4gJENvdW50ZXIsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnICA9PiAkTWVudXN7JE1lbnV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkU0xBe1NlcnZpY2VJRHN9ICYmIHJlZiAkU0xBe1NlcnZpY2VJRHN9IGVxICdBUlJBWScgJiYgQHsgJFNMQXtTZXJ2aWNlSURzfSB9ICkgewoKICAgICAgICAjIG91dHB1dCByb3cKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VydmljZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgc2VydmljZSBsaXN0CiAgICAgICAgbXkgJVNlcnZpY2VMaXN0OwogICAgICAgIGZvciBteSAkU2VydmljZUlEICggQHsgJFNMQXtTZXJ2aWNlSURzfSB9ICkgewoKICAgICAgICAgICAgIyBnZXQgc2VydmljZSBkYXRhCiAgICAgICAgICAgIG15ICVTZXJ2aWNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUdldCgKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIEluY2lkZW50U3RhdGUgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgc2VydmljZSB0byBoYXNoCiAgICAgICAgICAgICRTZXJ2aWNlTGlzdHskU2VydmljZUlEfSA9IFwlU2VydmljZTsKICAgICAgICB9CgogICAgICAgICMgc2V0IGluY2lkZW50IHNpZ25hbAogICAgICAgIG15ICVJbmNpU2lnbmFscyA9ICgKICAgICAgICAgICAgb3BlcmF0aW9uYWwgPT4gJ2dyZWVubGVkJywKICAgICAgICAgICAgd2FybmluZyAgICAgPT4gJ3llbGxvd2xlZCcsCiAgICAgICAgICAgIGluY2lkZW50ICAgID0+ICdyZWRsZWQnLAogICAgICAgICk7CgogICAgICAgIG15ICRDc3NDbGFzcyA9ICcnOwogICAgICAgIGZvciBteSAkU2VydmljZUlEICgKICAgICAgICAgICAgc29ydCB7ICRTZXJ2aWNlTGlzdHskYX0tPntOYW1lfSBjbXAgJFNlcnZpY2VMaXN0eyRifS0+e05hbWV9IH0KICAgICAgICAgICAga2V5cyAlU2VydmljZUxpc3QKICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgc2V0IG91dHB1dCBvYmplY3QKICAgICAgICAgICAgJENzc0NsYXNzID0gJENzc0NsYXNzIGVxICdzZWFyY2hwYXNzaXZlJyA/ICdzZWFyY2hhY3RpdmUnIDogJ3NlYXJjaHBhc3NpdmUnOwoKICAgICAgICAgICAgIyBvdXRwdXQgcm93CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU2VydmljZVJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyAkU2VydmljZUxpc3R7JFNlcnZpY2VJRH0gfSwKICAgICAgICAgICAgICAgICAgICBDdXJJbmNpU2lnbmFsID0+ICRJbmNpU2lnbmFsc3sgJFNlcnZpY2VMaXN0eyRTZXJ2aWNlSUR9LT57Q3VySW5jaVN0YXRlVHlwZX0gfSwKICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyAgICAgID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHVzZXIgb2JqZWN0CiAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgIyBnZXQgY3JlYXRlIHVzZXIgZGF0YQogICAgJFNMQXtDcmVhdGVCeU5hbWV9ID0gJFVzZXJPYmplY3QtPlVzZXJOYW1lKAogICAgICAgIFVzZXJJRCA9PiAkU0xBe0NyZWF0ZUJ5fSwKICAgICk7CgogICAgIyBnZXQgY2hhbmdlIHVzZXIgZGF0YQogICAgJFNMQXtDaGFuZ2VCeU5hbWV9ID0gJFVzZXJPYmplY3QtPlVzZXJOYW1lKAogICAgICAgIFVzZXJJRCA9PiAkU0xBe0NoYW5nZUJ5fSwKICAgICk7CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01TTEFab29tJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVTTEEsCiAgICAgICAgfSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNU2VydmljZU1lbnUvR2VuZXJpYy5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBHZW5lcmljLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEzOjUxIHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNU2VydmljZU1lbnU6OkdlbmVyaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcsCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBVc2VySUQgcGFyYW0KICAgICRTZWxmLT57VXNlcklEfSA9ICRQYXJhbXtVc2VySUR9IHx8IGRpZSAiR290IG5vIFVzZXJJRCEiOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17U2VydmljZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFNlcnZpY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBncm91cHMKICAgIG15ICRHcm91cHNSbyA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRQYXJhbXtDb25maWd9LT57QWN0aW9ufSB9LT57R3JvdXBSb30KICAgICAgICB8fCBbXTsKICAgIG15ICRHcm91cHNSdyA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRQYXJhbXtDb25maWd9LT57QWN0aW9ufSB9LT57R3JvdXB9CiAgICAgICAgfHwgW107CgogICAgIyBzZXQgYWNjZXNzCiAgICBteSAkQWNjZXNzID0gMTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbgogICAgaWYgKCAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0gJiYgKCBAeyRHcm91cHNSb30gfHwgQHskR3JvdXBzUnd9ICkgKSB7CgogICAgICAgICMgc2V0IGFjY2VzcwogICAgICAgICRBY2Nlc3MgPSAwOwoKICAgICAgICAjIGZpbmQgcmVhZCBvbmx5IGdyb3VwcwogICAgICAgIFJPR1JPVVA6CiAgICAgICAgZm9yIG15ICRSb0dyb3VwICggQHskR3JvdXBzUm99ICkgewoKICAgICAgICAgICAgbmV4dCBST0dST1VQIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvbkNoZWNrKAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEdyb3VwTmFtZSA9PiAkUm9Hcm91cCwKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAncm8nLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgYWNjZXNzCiAgICAgICAgICAgICRBY2Nlc3MgPSAxOwogICAgICAgICAgICBsYXN0IFJPR1JPVVA7CiAgICAgICAgfQoKICAgICAgICAjIGZpbmQgcmVhZCB3cml0ZSBncm91cHMKICAgICAgICBSV0dST1VQOgogICAgICAgIGZvciBteSAkUndHcm91cCAoIEB7JEdyb3Vwc1J3fSApIHsKCiAgICAgICAgICAgIG5leHQgUldHUk9VUCBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25DaGVjaygKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBHcm91cE5hbWUgPT4gJFJ3R3JvdXAsCiAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ3J3JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IGFjY2VzcwogICAgICAgICAgICAkQWNjZXNzID0gMTsKICAgICAgICAgICAgbGFzdCBSV0dST1VQOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9IGlmICEkQWNjZXNzOwoKICAgICMgb3V0cHV0IG1lbnUgaXRlbQogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnTWVudUl0ZW0nLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7ICRQYXJhbXtTZXJ2aWNlfSB9LAogICAgICAgICAgICAleyAkUGFyYW17Q29uZmlnfSB9LAogICAgICAgIH0sCiAgICApOwogICAgJFBhcmFte0NvdW50ZXJ9Kys7CgogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNU2VydmljZU1lbnUvTGluay5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBMaW5rLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEzOjUxIHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNU2VydmljZU1lbnU6Okxpbms7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcsCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgVXNlcklEIHBhcmFtCiAgICAkU2VsZi0+e1VzZXJJRH0gPSAkUGFyYW17VXNlcklEfSB8fCBkaWUgIkdvdCBubyBVc2VySUQhIjsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1NlcnZpY2V9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBTZXJ2aWNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZ3JvdXBzCiAgICBteSAkR3JvdXBzUncgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0gfS0+e0dyb3VwfQogICAgICAgIHx8IFtdOwoKICAgICMgc2V0IGFjY2VzcwogICAgbXkgJEFjY2VzcyA9IDE7CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb24KICAgIGlmICggJFBhcmFte0NvbmZpZ30tPntBY3Rpb259ICYmIEB7JEdyb3Vwc1J3fSApIHsKCiAgICAgICAgIyBzZXQgYWNjZXNzCiAgICAgICAgJEFjY2VzcyA9IDA7CgogICAgICAgICMgZmluZCByZWFkIHdyaXRlIGdyb3VwcwogICAgICAgIFJXR1JPVVA6CiAgICAgICAgZm9yIG15ICRSd0dyb3VwICggQHskR3JvdXBzUnd9ICkgewoKICAgICAgICAgICAgbmV4dCBSV0dST1VQIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvbkNoZWNrKAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEdyb3VwTmFtZSA9PiAkUndHcm91cCwKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAncncnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgYWNjZXNzCiAgICAgICAgICAgICRBY2Nlc3MgPSAxOwogICAgICAgICAgICBsYXN0IFJXR1JPVVA7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn0gaWYgISRBY2Nlc3M7CgogICAgIyBjaGVjayBpZiBzZXJ2aWNlcyBjYW4gYmUgbGlua2VkIHdpdGggb3RoZXIgb2JqZWN0cwogICAgbXkgJVBvc3NpYmxlT2JqZWN0cyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPlBvc3NpYmxlT2JqZWN0c0xpc3QoCiAgICAgICAgT2JqZWN0ID0+ICdTZXJ2aWNlJywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGRvbid0IHNob3cgbGluayBtZW51IGl0ZW0gaWYgdGhlcmUgYXJlIG5vIGxpbmthYmxlIG9iamVjdHMKICAgIHJldHVybiBpZiAhJVBvc3NpYmxlT2JqZWN0czsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZW51SXRlbScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXsgJFBhcmFte1NlcnZpY2V9IH0sCiAgICAgICAgICAgICV7ICRQYXJhbXtDb25maWd9IH0sCiAgICAgICAgfSwKICAgICk7CgogICAgJFBhcmFte0NvdW50ZXJ9Kys7CgogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNU0xBTWVudS9HZW5lcmljLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEdlbmVyaWMucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTM6NTEgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01TTEFNZW51OjpHZW5lcmljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgVXNlcklEIHBhcmFtCiAgICAkU2VsZi0+e1VzZXJJRH0gPSAkUGFyYW17VXNlcklEfSB8fCBkaWUgIkdvdCBubyBVc2VySUQhIjsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1NMQX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFNMQSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2V0IGdyb3VwcwogICAgbXkgJEdyb3Vwc1JvID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPnsgJFBhcmFte0NvbmZpZ30tPntBY3Rpb259IH0tPntHcm91cFJvfQogICAgICAgIHx8IFtdOwogICAgbXkgJEdyb3Vwc1J3ID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPnsgJFBhcmFte0NvbmZpZ30tPntBY3Rpb259IH0tPntHcm91cH0KICAgICAgICB8fCBbXTsKCiAgICAjIHNldCBhY2Nlc3MKICAgIG15ICRBY2Nlc3MgPSAxOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjaGVjayBwZXJtaXNzaW9uCiAgICBpZiAoICRQYXJhbXtDb25maWd9LT57QWN0aW9ufSAmJiAoIEB7JEdyb3Vwc1JvfSB8fCBAeyRHcm91cHNSd30gKSApIHsKCiAgICAgICAgIyBzZXQgYWNjZXNzCiAgICAgICAgJEFjY2VzcyA9IDA7CgogICAgICAgICMgZmluZCByZWFkIG9ubHkgZ3JvdXBzCiAgICAgICAgUk9HUk9VUDoKICAgICAgICBmb3IgbXkgJFJvR3JvdXAgKCBAeyRHcm91cHNSb30gKSB7CgogICAgICAgICAgICBuZXh0IFJPR1JPVVAgaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uQ2hlY2soCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgR3JvdXBOYW1lID0+ICRSb0dyb3VwLAogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdybycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCBhY2Nlc3MKICAgICAgICAgICAgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgIGxhc3QgUk9HUk9VUDsKICAgICAgICB9CgogICAgICAgICMgZmluZCByZWFkIHdyaXRlIGdyb3VwcwogICAgICAgIFJXR1JPVVA6CiAgICAgICAgZm9yIG15ICRSd0dyb3VwICggQHskR3JvdXBzUnd9ICkgewoKICAgICAgICAgICAgbmV4dCBSV0dST1VQIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvbkNoZWNrKAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEdyb3VwTmFtZSA9PiAkUndHcm91cCwKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAncncnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgYWNjZXNzCiAgICAgICAgICAgICRBY2Nlc3MgPSAxOwogICAgICAgICAgICBsYXN0IFJXR1JPVVA7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn0gaWYgISRBY2Nlc3M7CgogICAgIyBvdXRwdXQgbWVudSBpdGVtCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZW51SXRlbScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXsgJFBhcmFte1NMQX0gfSwKICAgICAgICAgICAgJXsgJFBhcmFte0NvbmZpZ30gfSwKICAgICAgICB9LAogICAgKTsKICAgICRQYXJhbXtDb3VudGVyfSsrOwoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn07Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MaW5rT2JqZWN0L1NlcnZpY2UucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogU2VydmljZS5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMzo1MSB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGlua09iamVjdDo6U2VydmljZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpMYW5ndWFnZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkpTT04nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGlua09iamVjdDo6U2VydmljZSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBsaW5rIG9iamVjdCAoc2VydmljZSkKCj1jdXQKCj1oZWFkMiBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3Q6OlNlcnZpY2UtPm5ldygKICAgICAgICBVc2VyTGFuZ3VhZ2UgPT4gJ2VuJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkTmVlZGVkIChxdyhVc2VyTGFuZ3VhZ2UgVXNlcklEKSkgewogICAgICAgICRTZWxmLT57JE5lZWRlZH0gPSAkUGFyYW17JE5lZWRlZH0gfHwgZGllICJHb3Qgbm8gJE5lZWRlZCEiOwogICAgfQoKICAgICMgd2UgbmVlZCBvdXIgb3duIExheW91dE9iamVjdCBpbnN0YW5jZSB0byBhdm9pZCBibG9ja2RhdGEgY29sbGlzaW9ucwogICAgIyB3aXRoIHRoZSBtYWluIHBhZ2UuCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0gPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0LT5uZXcoICV7JFNlbGZ9ICk7CgogICAgIyBkZWZpbmUgbmVlZGVkIHZhcmlhYmxlcwogICAgJFNlbGYtPntPYmplY3REYXRhfSA9IHsKICAgICAgICBPYmplY3QgICAgID0+ICdTZXJ2aWNlJywKICAgICAgICBSZWFsbmFtZSAgID0+ICdTZXJ2aWNlJywKICAgICAgICBPYmplY3ROYW1lID0+ICdTb3VyY2VPYmplY3RJRCcsCiAgICB9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFRhYmxlQ3JlYXRlQ29tcGxleCgpCgpyZXR1cm4gYW4gYXJyYXkgd2l0aCB0aGUgYmxvY2sgZGF0YQoKUmV0dXJuCgogICAgQEJsb2NrRGF0YSA9ICgKCiAgICAgICAgT2JqZWN0TmFtZSAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgT2JqZWN0SUQgICAgPT4gJzEyMycsCgogICAgICAgIE9iamVjdCAgICA9PiAnU2VydmljZScsCiAgICAgICAgQmxvY2tuYW1lID0+ICdTZXJ2aWNlJywKICAgICAgICBIZWFkbGluZSAgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcnLAogICAgICAgICAgICAgICAgV2lkdGggICA9PiAyMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAnU2VydmljZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1R5cGUnLAogICAgICAgICAgICAgICAgV2lkdGggICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0NyaXRpY2FsaXR5JywKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDaGFuZ2VkJywKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMTUwLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgSXRlbUxpc3QgPT4gWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICA9PiAnSW5jaVNpZ25hbCcsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICAgICA9PiAxMjMsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJ1NlcnZpY2UgQmxhJywKICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgPT4gJ0FjdGlvbj1BZ2VudElUU01TZXJ2aWNlWm9vbTtTZXJ2aWNlSUQ9MTIzJywKICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNzAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ090aGVyJywKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGUgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnSGlnaCcsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRlID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ1RpbWVMb25nJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcyMDA4LTAxLTAxIDEyOjEyOjAwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgID0+ICdJbmNpU2lnbmFsJywKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgICAgID0+IDMyMSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnT3BlcmF0aW9uYWwnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAnU2VydmljZSBCbGEnLAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgICA9PiAnQWN0aW9uPUFnZW50SVRTTVNlcnZpY2Vab29tO1NlcnZpY2VJRD0zMjEnLAogICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA3MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnT3RoZXInLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0ZSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdMb3cnLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0ZSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUaW1lTG9uZycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjAwNy0wMi0wMiAyMjoxMjowMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIF0sCiAgICApOwoKICAgIEBCbG9ja0RhdGEgPSAkTGlua09iamVjdC0+VGFibGVDcmVhdGVDb21wbGV4KAogICAgICAgIE9iamVjdExpbmtMaXN0V2l0aERhdGEgPT4gJE9iamVjdExpbmtMaXN0UmVmLAogICAgKTsKCj1jdXQKCnN1YiBUYWJsZUNyZWF0ZUNvbXBsZXggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IHx8IHJlZiAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBPYmplY3RMaW5rTGlzdFdpdGhEYXRhIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjb252ZXJ0IHRoZSBsaXN0CiAgICBteSAlTGlua0xpc3Q7CiAgICBmb3IgbXkgJExpbmtUeXBlICggc29ydCBrZXlzICV7ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB9ICkgewoKICAgICAgICAjIGV4dHJhY3QgbGluayB0eXBlIExpc3QKICAgICAgICBteSAkTGlua1R5cGVMaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfTsKCiAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBzb3J0IGtleXMgJXskTGlua1R5cGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBkaXJlY3Rpb24gbGlzdAogICAgICAgICAgICBteSAkRGlyZWN0aW9uTGlzdCA9ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufTsKCiAgICAgICAgICAgIGZvciBteSAkU2VydmljZUlEICggc29ydCBrZXlzICV7JERpcmVjdGlvbkxpc3R9ICkgewoKICAgICAgICAgICAgICAgICRMaW5rTGlzdHskU2VydmljZUlEfS0+e0RhdGF9ID0gJERpcmVjdGlvbkxpc3QtPnskU2VydmljZUlEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkQ29tcGxleFRhYmxlRGF0YSA9ICRDb25maWdPYmplY3QtPkdldCgiTGlua09iamVjdDo6Q29tcGxleFRhYmxlIik7CiAgICBteSAkRGVmYXVsdENvbHVtbnM7CiAgICBpZiAoCiAgICAgICAgJENvbXBsZXhUYWJsZURhdGEKICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSgkQ29tcGxleFRhYmxlRGF0YSkKICAgICAgICAmJiAkQ29tcGxleFRhYmxlRGF0YS0+e1NlcnZpY2V9CiAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRDb21wbGV4VGFibGVEYXRhLT57U2VydmljZX0gKQogICAgICAgICkKICAgIHsKICAgICAgICAkRGVmYXVsdENvbHVtbnMgPSAkQ29tcGxleFRhYmxlRGF0YS0+eyJTZXJ2aWNlIn0tPnsiRGVmYXVsdENvbHVtbnMifTsKICAgIH0KCiAgICBteSBAVGltZUxvbmdUeXBlcyA9ICgKICAgICAgICAnQ3JlYXRlVGltZScsCiAgICAgICAgJ0NoYW5nZVRpbWUnLAogICAgKTsKCiAgICBteSBAVHJhbnNsYXRlVHlwZXMgPSAoCiAgICAgICAgJ1R5cGUnLAogICAgICAgICdDcml0aWNhbGl0eScsCiAgICApOwoKICAgICMgYWx3YXlzIHNob3cgdGhlIGluY2lkZW50IHN0YXRlIGZsYWcgYW5kIHRoZSBzZXJ2aWNlIG5hbWUKICAgIG15IEBIZWFkbGluZSA9ICgKICAgICAgICB7CiAgICAgICAgICAgIENvbnRlbnQgPT4gJ0luY2lkZW50IFN0YXRlJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQ29udGVudCA9PiAnU2VydmljZScsCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgICMgTG9hZCB1c2VyIHByZWZlcmVuY2VzLgogICAgbXkgJVByZWZlcmVuY2VzID0gJFVzZXJPYmplY3QtPkdldFByZWZlcmVuY2VzKAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggISREZWZhdWx0Q29sdW1ucyB8fCAhSXNIYXNoUmVmV2l0aERhdGEoJERlZmF1bHRDb2x1bW5zKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ01pc3NpbmcgY29uZmlndXJhdGlvbiBmb3IgTGlua09iamVjdDo6Q29tcGxleFRhYmxlIyMjU2VydmljZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgR2V0IGRlZmF1bHQgY29sdW1uIHByaW9yaXR5IGZyb20gU3lzQ29uZmlnLgogICAgIyBFYWNoIGNvbHVtbiBpbiB0YWJsZSAoVGl0bGUsIFN0YXRlLC4uLikgaGFzIGRlZmluZWQgUHJpb3JpdHkgaW4gU3lzQ29uZmlnLiBTeXN0ZW0gdXNlIHRoaXMKICAgICMgICBwcmlvcml0eSB0byBzb3J0IGNvbHVtbnMsIGlmIHVzZXIgZG9lc24ndCBoYXZlIG93biBzZXR0aW5ncy4KICAgIG15ICVTb3J0T3JkZXI7CiAgICBpZiAoCiAgICAgICAgJENvbXBsZXhUYWJsZURhdGEtPnsiU2VydmljZSJ9LT57IlByaW9yaXR5In0KICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJENvbXBsZXhUYWJsZURhdGEtPnsiU2VydmljZSJ9LT57IlByaW9yaXR5In0gKQogICAgICAgICkKICAgIHsKICAgICAgICAlU29ydE9yZGVyID0gJXsgJENvbXBsZXhUYWJsZURhdGEtPnsiU2VydmljZSJ9LT57IlByaW9yaXR5In0gfTsKICAgIH0KCiAgICBteSAlVXNlckNvbHVtbnMgPSAleyREZWZhdWx0Q29sdW1uc307CgogICAgaWYgKCAkUHJlZmVyZW5jZXN7J0xpbmtPYmplY3Q6OkNvbXBsZXhUYWJsZS1TZXJ2aWNlJ30gKSB7CgogICAgICAgIG15ICRDb2x1bW5zRW5hYmxlZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyktPkRlY29kZSgKICAgICAgICAgICAgRGF0YSA9PiAkUHJlZmVyZW5jZXN7J0xpbmtPYmplY3Q6OkNvbXBsZXhUYWJsZS1TZXJ2aWNlJ30sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ29sdW1uc0VuYWJsZWQKICAgICAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoJENvbHVtbnNFbmFibGVkKQogICAgICAgICAgICAmJiAkQ29sdW1uc0VuYWJsZWQtPntPcmRlcn0KICAgICAgICAgICAgJiYgSXNBcnJheVJlZldpdGhEYXRhKCAkQ29sdW1uc0VuYWJsZWQtPntPcmRlcn0gKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAjIENsZWFyIHNvcnQgb3JkZXIuCiAgICAgICAgICAgICVTb3J0T3JkZXIgPSAoKTsKCiAgICAgICAgICAgIERFRkFVTFRDT0xVTU46CiAgICAgICAgICAgIGZvciBteSAkRGVmYXVsdENvbHVtbiAoIHNvcnQga2V5cyAlVXNlckNvbHVtbnMgKSB7CiAgICAgICAgICAgICAgICBteSAkSW5kZXggPSAwOwoKICAgICAgICAgICAgICAgIGZvciBteSAkVXNlclNldHRpbmcgKCBAeyAkQ29sdW1uc0VuYWJsZWQtPntPcmRlcn0gfSApIHsKICAgICAgICAgICAgICAgICAgICAkSW5kZXgrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoICREZWZhdWx0Q29sdW1uIGVxICRVc2VyU2V0dGluZyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFVzZXJDb2x1bW5zeyREZWZhdWx0Q29sdW1ufSA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICRTb3J0T3JkZXJ7JERlZmF1bHRDb2x1bW59ICAgPSAkSW5kZXg7CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IERFRkFVTFRDT0xVTU47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgTm90IGZvdW5kLCBtZWFucyB1c2VyIGNob3NlIHRvIGhpZGUgdGhpcyBpdGVtLgogICAgICAgICAgICAgICAgaWYgKCAkVXNlckNvbHVtbnN7JERlZmF1bHRDb2x1bW59ID09IDIgKSB7CiAgICAgICAgICAgICAgICAgICAgJFVzZXJDb2x1bW5zeyREZWZhdWx0Q29sdW1ufSA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAhJFNvcnRPcmRlcnskRGVmYXVsdENvbHVtbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNvcnRPcmRlcnskRGVmYXVsdENvbHVtbn0gPSAwOyAgICAjIFNldCAwLCBpdCBzeXN0ZW0gd2lsbCBoaWRlIHRoaXMgaXRlbSBhbnl3YXlzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBVc2VyIGhhcyBubyBvd24gc2V0dGluZ3MuCiAgICAgICAgZm9yIG15ICRDb2x1bW4gKCBzb3J0IGtleXMgJVVzZXJDb2x1bW5zICkgewogICAgICAgICAgICBpZiAoICEkU29ydE9yZGVyeyRDb2x1bW59ICkgewogICAgICAgICAgICAgICAgJFNvcnRPcmRlcnskQ29sdW1ufSA9IDA7ICAgICAgICAgICAgICAgIyBTZXQgMCwgaXQgc3lzdGVtIHdpbGwgaGlkZSB0aGlzIGl0ZW0gYW55d2F5cwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgRGVmaW5lIEhlYWRsaW5lIGNvbHVtbnMuCiAgICBteSBAQWxsQ29sdW1uczsKICAgIENPTFVNTjoKICAgIGZvciBteSAkQ29sdW1uICggc29ydCB7ICRTb3J0T3JkZXJ7JGF9IDw9PiAkU29ydE9yZGVyeyRifSB9IGtleXMgJVVzZXJDb2x1bW5zICkgewoKICAgICAgICBteSAkQ29sdW1uVHJhbnNsYXRlID0gJENvbHVtbjsKICAgICAgICBpZiAoICRDb2x1bW4gZXEgJ0N1ckluY2lTdGF0ZScgKSB7CiAgICAgICAgICAgICRDb2x1bW5UcmFuc2xhdGUgPSBUcmFuc2xhdGFibGUoJ0luY2lkZW50IFN0YXRlJyk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJENvbHVtbiBlcSAnQ3JlYXRlVGltZScgKSB7CiAgICAgICAgICAgICRDb2x1bW5UcmFuc2xhdGUgPSBUcmFuc2xhdGFibGUoJ0NyZWF0ZWQnKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkQ29sdW1uIGVxICdDaGFuZ2VUaW1lJyApIHsKICAgICAgICAgICAgJENvbHVtblRyYW5zbGF0ZSA9IFRyYW5zbGF0YWJsZSgnQ2hhbmdlZCcpOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAQWxsQ29sdW1ucywgewogICAgICAgICAgICBDb2x1bW5OYW1lICAgICAgPT4gJENvbHVtbiwKICAgICAgICAgICAgQ29sdW1uVHJhbnNsYXRlID0+ICRDb2x1bW5UcmFuc2xhdGUsCiAgICAgICAgfTsKCiAgICAgICAgIyBpZiBlbmFibGVkIGJ5IGRlZmF1bHQuCiAgICAgICAgaWYgKCAkVXNlckNvbHVtbnN7JENvbHVtbn0gPT0gMiApIHsKICAgICAgICAgICAgcHVzaCBASGVhZGxpbmUsIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJENvbHVtblRyYW5zbGF0ZSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIGl0ZW0gbGlzdCAodGFibGUgY29udGVudCkKICAgIG15IEBJdGVtTGlzdDsKICAgIGZvciBteSAkU2VydmljZUlEICgKICAgICAgICBzb3J0IHsgbGMgJExpbmtMaXN0eyRhfXtEYXRhfS0+e05hbWV9IGNtcCBsYyAkTGlua0xpc3R7JGJ9e0RhdGF9LT57TmFtZX0gfQogICAgICAgIGtleXMgJUxpbmtMaXN0CiAgICAgICAgKQogICAgewoKICAgICAgICAjIGV4dHJhY3Qgc2VydmljZSBkYXRhCiAgICAgICAgbXkgJFNlcnZpY2UgPSAkTGlua0xpc3R7JFNlcnZpY2VJRH0tPntEYXRhfTsKCiAgICAgICAgIyBDdXJJbmNpU2lnbmFsIG11c3QgYWx3YXlzIGJlIHByZXNlbnQsIGFzIHdlbGwgYXMgc2VydmljZSBuYW1lCiAgICAgICAgIyAoYmVjYXVzZSBpdCBjb250YWlucyB0aGUgbWFzdGVyIGxpbmsgdG8gdGhlIFNlcnZpY2UpLgogICAgICAgIG15IEBJdGVtQ29sdW1ucyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICA9PiAnQ3VySW5jaVNpZ25hbCcsCiAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgID0+ICRTZXJ2aWNlLT57Q3VySW5jaVN0YXRlfSwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZVR5cGUgPT4gJFNlcnZpY2UtPntDdXJJbmNpU3RhdGVUeXBlfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRTZXJ2aWNlLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMaW5rICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jhc2VsaW5rfQogICAgICAgICAgICAgICAgICAgIC4gJ0FjdGlvbj1BZ2VudElUU01TZXJ2aWNlWm9vbTtTZXJ2aWNlSUQ9JwogICAgICAgICAgICAgICAgICAgIC4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIFRpdGxlICAgICA9PiAiU2VydmljZTogJFNlcnZpY2UtPntOYW1lfSIsCiAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNzAsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgQ09MVU1OOgogICAgICAgIGZvciBteSAkQ29sdW1uICggc29ydCB7ICRTb3J0T3JkZXJ7JGF9IDw9PiAkU29ydE9yZGVyeyRifSB9IGtleXMgJVVzZXJDb2x1bW5zICkgewoKICAgICAgICAgICAgIyBpZiBlbmFibGVkIGJ5IGRlZmF1bHQKICAgICAgICAgICAgaWYgKCAkVXNlckNvbHVtbnN7JENvbHVtbn0gPT0gMiApIHsKCiAgICAgICAgICAgICAgICBteSAlSGFzaDsKICAgICAgICAgICAgICAgIGlmICggZ3JlcCB7ICRfIGVxICRDb2x1bW4gfSBAVGltZUxvbmdUeXBlcyApIHsKICAgICAgICAgICAgICAgICAgICAkSGFzaHsnVHlwZSd9ID0gJ1RpbWVMb25nJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRIYXNoeydUeXBlJ30gPSAnVGV4dCc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkQ29sdW1uIGVxICdDb21tZW50JyApIHsKICAgICAgICAgICAgICAgICAgICAkSGFzaHtNYXhMZW5ndGh9ID0gMzA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCBncmVwIHsgJF8gZXEgJENvbHVtbiB9IEBUcmFuc2xhdGVUeXBlcyApIHsKICAgICAgICAgICAgICAgICAgICAkSGFzaHsnVHJhbnNsYXRlJ30gPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRIYXNoeydDb250ZW50J30gPSAkU2VydmljZS0+eyRDb2x1bW59OwoKICAgICAgICAgICAgICAgIHB1c2ggQEl0ZW1Db2x1bW5zLCBcJUhhc2g7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHB1c2ggQEl0ZW1MaXN0LCBcQEl0ZW1Db2x1bW5zOwogICAgfQoKICAgIHJldHVybiBpZiAhQEl0ZW1MaXN0OwoKICAgICMgRGVmaW5lIHRoZSBibG9jayBkYXRhLgogICAgbXkgJUJsb2NrID0gKAogICAgICAgIE9iamVjdCAgICAgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0sCiAgICAgICAgQmxvY2tuYW1lICA9PiAkU2VsZi0+e09iamVjdERhdGF9LT57T2JqZWN0fSwKICAgICAgICBPYmplY3ROYW1lID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntPYmplY3ROYW1lfSwKICAgICAgICBPYmplY3RJRCAgID0+ICRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgSGVhZGxpbmUgICA9PiBcQEhlYWRsaW5lLAogICAgICAgIEl0ZW1MaXN0ICAgPT4gXEBJdGVtTGlzdCwKICAgICAgICBBbGxDb2x1bW5zID0+IFxAQWxsQ29sdW1ucywKICAgICk7CgogICAgcmV0dXJuICggXCVCbG9jayApOwoKfQoKPWhlYWQyIFRhYmxlQ3JlYXRlU2ltcGxlKCkKCnJldHVybiBhIGhhc2ggd2l0aCB0aGUgbGluayBvdXRwdXQgZGF0YQoKUmV0dXJuCgogICAgJUxpbmtPdXRwdXREYXRhID0gKAogICAgICAgIE5vcm1hbDo6U291cmNlID0+IHsKICAgICAgICAgICAgU2VydmljZSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnUzpUaGUgc2VydmljWy4uXScsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICA9PiAnU2VydmljZTogVGhlIHNlcnZpY2UgbmFtZScsCiAgICAgICAgICAgICAgICAgICAgQ3NzICAgICA9PiAnc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoIicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1M6TmFtZSBvZiBzZXJ2aWNbLi5dJywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICdTZXJ2aWNlOiBOYW1lIG9mIHNlcnZpY2UgMicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUGFyZW50Q2hpbGQ6OlRhcmdldCA9PiB7CiAgICAgICAgICAgIFNlcnZpY2UgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1M6U2VydmljZSBuYW1bLi5dJywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICdTZXJ2aWNlOiBTZXJ2aWNlIG5hbWUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgKTsKCiAgICAlTGlua091dHB1dERhdGEgPSAkTGlua09iamVjdC0+VGFibGVDcmVhdGVTaW1wbGUoCiAgICAgICAgT2JqZWN0TGlua0xpc3RXaXRoRGF0YSA9PiAkT2JqZWN0TGlua0xpc3RSZWYsCiAgICApOwoKPWN1dAoKc3ViIFRhYmxlQ3JlYXRlU2ltcGxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB8fCByZWYgJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgT2JqZWN0TGlua0xpc3RXaXRoRGF0YSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVMaW5rT3V0cHV0RGF0YTsKICAgIGZvciBteSAkTGlua1R5cGUgKCBzb3J0IGtleXMgJXsgJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IH0gKSB7CgogICAgICAgICMgZXh0cmFjdCBsaW5rIHR5cGUgTGlzdAogICAgICAgIG15ICRMaW5rVHlwZUxpc3QgPSAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0tPnskTGlua1R5cGV9OwoKICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIHNvcnQga2V5cyAleyRMaW5rVHlwZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259OwoKICAgICAgICAgICAgbXkgQEl0ZW1MaXN0OwogICAgICAgICAgICBmb3IgbXkgJFNlcnZpY2VJRCAoCiAgICAgICAgICAgICAgICBzb3J0IHsKICAgICAgICAgICAgICAgICAgICBsYyAkRGlyZWN0aW9uTGlzdC0+eyRhfS0+e05hbWVTaG9ydH0gY21wIGxjICREaXJlY3Rpb25MaXN0LT57JGJ9LT57TmFtZVNob3J0fQogICAgICAgICAgICAgICAgfSBrZXlzICV7JERpcmVjdGlvbkxpc3R9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAjIGV4dHJhY3Qgc2VydmljZSBkYXRhCiAgICAgICAgICAgICAgICBteSAkU2VydmljZSA9ICREaXJlY3Rpb25MaXN0LT57JFNlcnZpY2VJRH07CgogICAgICAgICAgICAgICAgIyBkZWZpbmUgaXRlbSBkYXRhCiAgICAgICAgICAgICAgICBteSAlSXRlbSA9ICgKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICJTOiRTZXJ2aWNlLT57TmFtZVNob3J0fSIsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICA9PiAiU2VydmljZTogJFNlcnZpY2UtPntOYW1lfSIsCiAgICAgICAgICAgICAgICAgICAgTGluayAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCYXNlbGlua30KICAgICAgICAgICAgICAgICAgICAgICAgLiAnQWN0aW9uPUFnZW50SVRTTVNlcnZpY2Vab29tO1NlcnZpY2VJRD0nCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gMjAsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHB1c2ggQEl0ZW1MaXN0LCBcJUl0ZW07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIGl0ZW0gbGlzdCB0byBsaW5rIG91dHB1dCBkYXRhCiAgICAgICAgICAgICRMaW5rT3V0cHV0RGF0YXsgJExpbmtUeXBlIC4gJzo6JyAuICREaXJlY3Rpb24gfS0+e1NlcnZpY2V9ID0gXEBJdGVtTGlzdDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVMaW5rT3V0cHV0RGF0YTsKfQoKPWhlYWQyIENvbnRlbnRTdHJpbmdDcmVhdGUoKQoKcmV0dXJuIGEgb3V0cHV0IHN0cmluZwoKICAgIG15ICRTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5Db250ZW50U3RyaW5nQ3JlYXRlKAogICAgICAgIENvbnRlbnREYXRhID0+ICRIYXNoUmVmLAogICAgKTsKCj1jdXQKCnN1YiBDb250ZW50U3RyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb250ZW50RGF0YX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENvbnRlbnREYXRhIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBleHRyYWN0IGNvbnRlbnQKICAgIG15ICRDb250ZW50ID0gJFBhcmFte0NvbnRlbnREYXRhfTsKCiAgICByZXR1cm4gaWYgJENvbnRlbnQtPntUeXBlfSBuZSAnQ3VySW5jaVNpZ25hbCc7CgogICAgIyBzZXQgaW5jaWRlbnQgc2lnbmFsCiAgICBteSAlSW5jaVNpZ25hbHMgPSAoCiAgICAgICAgaW5jaWRlbnQgICAgPT4gJ3JlZGxlZCcsCiAgICAgICAgb3BlcmF0aW9uYWwgPT4gJ2dyZWVubGVkJywKICAgICAgICB1bmtub3duICAgICA9PiAnZ3JheWxlZCcsCiAgICAgICAgd2FybmluZyAgICAgPT4gJ3llbGxvd2xlZCcsCiAgICApOwoKICAgICMgaW52ZXN0aWdhdGUgY3VycmVudCBpbmNpZGVudCBzaWduYWwKICAgICRDb250ZW50LT57Q3VySW5jaVN0YXRlVHlwZX0gfHw9ICd1bmtub3duJzsKICAgIG15ICRDdXJJbmNpU2lnbmFsID0gJEluY2lTaWduYWxzeyAkQ29udGVudC0+e0N1ckluY2lTdGF0ZVR5cGV9IH07CiAgICAkQ3VySW5jaVNpZ25hbCB8fD0gJEluY2lTaWduYWxze3Vua25vd259OwoKICAgIG15ICRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZSA9PiAnPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCIgdGl0bGU9IlslIERhdGEuQ3VySW5jaVN0YXRlIHwgaHRtbCAlXSI+ICcKICAgICAgICAgICAgLiAnPHNwYW4gY2xhc3M9IlslIERhdGEuQ3VySW5jaVNpZ25hbCB8IGh0bWwgJV0iPjwvc3Bhbj4gPC9kaXY+JywKCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1ckluY2lTaWduYWwgPT4gJEN1ckluY2lTaWduYWwsCiAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgPT4gJENvbnRlbnQtPntDb250ZW50fSB8fCAnJywKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWhlYWQyIFNlbGVjdGFibGVPYmplY3RMaXN0KCkKCnJldHVybiBhbiBhcnJheSBoYXNoIHdpdGggc2VsZWN0LWFibGUgb2JqZWN0cwoKUmV0dXJuCgogICAgQFNlbGVjdGFibGVPYmplY3RMaXN0ID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBWYWx1ZSA9PiAnU2VydmljZScsCiAgICAgICAgfSwKICAgICk7CgogICAgQFNlbGVjdGFibGVPYmplY3RMaXN0ID0gJExpbmtPYmplY3QtPlNlbGVjdGFibGVPYmplY3RMaXN0KAogICAgICAgIFNlbGVjdGVkID0+ICRJZGVudGlmaWVyLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFNlbGVjdGFibGVPYmplY3RMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGVjdGVkOwogICAgaWYgKCAkUGFyYW17U2VsZWN0ZWR9ICYmICRQYXJhbXtTZWxlY3RlZH0gZXEgJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0gKSB7CiAgICAgICAgJFNlbGVjdGVkID0gMTsKICAgIH0KCiAgICAjIG9iamVjdCBzZWxlY3QgbGlzdAogICAgbXkgQE9iamVjdFNlbGVjdExpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICA9PiAkU2VsZi0+e09iamVjdERhdGF9LT57T2JqZWN0fSwKICAgICAgICAgICAgVmFsdWUgICAgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e1JlYWxuYW1lfSwKICAgICAgICAgICAgU2VsZWN0ZWQgPT4gJFNlbGVjdGVkLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiBAT2JqZWN0U2VsZWN0TGlzdDsKfQoKPWhlYWQyIFNlYXJjaE9wdGlvbkxpc3QoKQoKcmV0dXJuIGFuIGFycmF5IGhhc2ggd2l0aCBzZWFyY2ggb3B0aW9ucwoKUmV0dXJuCgogICAgQFNlYXJjaE9wdGlvbkxpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBJbnB1dFN0cmcgPT4gJEZvcm1TdHJpbmcsCiAgICAgICAgICAgIEZvcm1EYXRhICA9PiAnU2VydmljZSBOYW1lJywKICAgICAgICB9LAogICAgKTsKCiAgICBAU2VhcmNoT3B0aW9uTGlzdCA9ICRMaW5rT2JqZWN0LT5TZWFyY2hPcHRpb25MaXN0KCk7Cgo9Y3V0CgpzdWIgU2VhcmNoT3B0aW9uTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2VhcmNoIG9wdGlvbiBsaXN0CiAgICBteSBAU2VhcmNoT3B0aW9uTGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgPT4gJ05hbWUnLAogICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9ybWtleQogICAgZm9yIG15ICRSb3cgKEBTZWFyY2hPcHRpb25MaXN0KSB7CiAgICAgICAgJFJvdy0+e0Zvcm1LZXl9ID0gJ1NFQVJDSDo6JyAuICRSb3ctPntLZXl9OwogICAgfQoKICAgICMgYWRkIGZvcm0gZGF0YSBhbmQgaW5wdXQgc3RyaW5nCiAgICBST1c6CiAgICBmb3IgbXkgJFJvdyAoQFNlYXJjaE9wdGlvbkxpc3QpIHsKCiAgICAgICAgIyBnZXQgZm9ybSBkYXRhCiAgICAgICAgJFJvdy0+e0Zvcm1EYXRhfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICRSb3ctPntGb3JtS2V5fSApOwoKICAgICAgICAjIHBhcnNlIHRoZSBpbnB1dCB0ZXh0IGJsb2NrCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSW5wdXRUZXh0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAkUm93LT57Rm9ybUtleX0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkUm93LT57Rm9ybURhdGF9IHx8ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgYWRkIHRoZSBpbnB1dCBzdHJpbmcKICAgICAgICAkUm93LT57SW5wdXRTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0xpbmtPYmplY3QnLAogICAgICAgICk7CgogICAgICAgIG5leHQgUk9XOwogICAgfQoKICAgIHJldHVybiBAU2VhcmNoT3B0aW9uTGlzdDsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
PGRpdiBjbGFzcz0iU3BhY2luZyBDZW50ZXIiPgogICAgPHNwYW4gY2xhc3M9IkFKQVhMb2FkZXIiIHRpdGxlPSJ7eyBTcGFuVGl0bGUgfCBUcmFuc2xhdGUgfX0iPjwvc3Bhbj4KPC9kaXY+Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWRtaW5JVFNNQ0lQQWxsb2NhdGUudHQKIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWRtaW5JVFNNQ0lQQWxsb2NhdGUudHQsdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTM6NTEgdWQgRXhwICQKIyAtLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiBMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckZpcnN0Ij4KICAgIDxoMSBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJDcml0aWNhbGl0eSDihpQgSW1wYWN0IOKGlCBQcmlvcml0eSIpIHwgaHRtbCAlXTwvaDE+CgogICAgWyUgQnJlYWRjcnVtYlBhdGggPSBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRlKCdDcml0aWNhbGl0eSDihpQgSW1wYWN0IOKGlCBQcmlvcml0eScpLAogICAgICAgICAgICAgICAgTGluayA9PiBFbnYoIkFjdGlvbiIpLAogICAgICAgICAgICB9LAogICAgICAgIF0KICAgICVdCgogICAgWyUgSU5DTFVERSAiQnJlYWRjcnVtYi50dCIgUGF0aCA9IEJyZWFkY3J1bWJQYXRoICVdCgogICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj48aDI+WyUgVHJhbnNsYXRlKCJOb3RlIikgfCBodG1sICVdPC9oMj48L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJNYW5hZ2UgdGhlIHByaW9yaXR5IHJlc3VsdCBvZiBjb21iaW5hdGluZyBDcml0aWNhbGl0eSDihpQgSW1wYWN0LiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJQcmlvcml0eSBhbGxvY2F0aW9uIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iQ0lQQWxsb2NhdGUiLz4KICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSBEYXRhVGFibGVOb0hpZ2hsaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyQ29sdW1uRGVzY3JpcHRpb24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKERhdGEuT2JqZWN0VHlwZSkgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckNvbHVtbkRlc2NyaXB0aW9uIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyQ2VsbCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5PYmplY3RPcHRpb24pIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJIZWFkZXJDZWxsIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KClslIFJlbmRlckJsb2NrU3RhcnQoIlJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkRlc2NyaXB0aW9uQ2VsbCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5PYmplY3RPcHRpb24pIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJEZXNjcmlwdGlvbkNlbGwiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb250ZW50Q2VsbCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk9wdGlvblN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ29udGVudENlbGwiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AgU2F2ZUJ1dHRvbnMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiBpZD0iU3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV0iPjxzcGFuPlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdIj48c3Bhbj5bJSBUcmFuc2xhdGUoIkNhbmNlbCIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2Pgo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWRtaW5TZXJ2aWNlLnR0CiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFkbWluU2VydmljZS50dCx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMzo1MSB1ZCBFeHAgJAojIC0tLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3IikgJV0KPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJGaXJzdCI+CiAgICA8aDEgY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiU2VydmljZSBNYW5hZ2VtZW50IikgfCBodG1sICVdPC9oMT4KCiAgICBbJSBCcmVhZGNydW1iUGF0aCA9IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGUoJ1NlcnZpY2UgTWFuYWdlbWVudCcpLAogICAgICAgICAgICAgICAgTGluayA9PiBFbnYoIkFjdGlvbiIpLAogICAgICAgICAgICB9LAogICAgICAgIF0KICAgICVdCgogICAgWyUgSUYgRGF0YS5TZXJ2aWNlSUQgPT0gIk5FVyIgICVdCiAgICAgICAgWyUgQnJlYWRjcnVtYlBhdGgucHVzaCh7IE5hbWUgPT4gVHJhbnNsYXRlKCJBZGQgU2VydmljZSIpLH0pICVdCiAgICBbJSBFTFNJRiBEYXRhLlNlcnZpY2VJRCAlXQogICAgICAgIFslIFVTRSBFZGl0VGl0bGUgPSBTdHJpbmcoVHJhbnNsYXRlKCJFZGl0IFNlcnZpY2UiKSkgJV0KICAgICAgICBbJSBCcmVhZGNydW1iUGF0aC5wdXNoKHsgTmFtZSA9PiBFZGl0VGl0bGUuYXBwZW5kKCAnOiAnLCBEYXRhLlNlcnZpY2VOYW1lICkgfSkgJV0KICAgIFslIEVORCAlXQoKICAgIFslIElOQ0xVREUgIkJyZWFkY3J1bWIudHQiIFBhdGggPSBCcmVhZGNydW1iUGF0aCAlXQoKICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGlvbkxpc3QiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQWN0aW9ucyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9uTGlzdCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGlvbk92ZXJ2aWV3IikgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1sZWZ0Ij48L2k+WyUgVHJhbnNsYXRlKCJHbyB0byBvdmVydmlldyIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbk92ZXJ2aWV3IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uQWRkIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1TZXJ2aWNlRWRpdDtTZXJ2aWNlSUQ9TkVXIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1wbHVzLXNxdWFyZSI+PC9pPlslIFRyYW5zbGF0ZSgiQWRkIHNlcnZpY2UiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25BZGQiKSAlXQogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25MaXN0IikgJV0KICAgICAgICA8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkZpbHRlciIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj48bGFiZWwgZm9yPSJGaWx0ZXJTZXJ2aWNlcyI+WyUgVHJhbnNsYXRlKCJGaWx0ZXIgZm9yIFNlcnZpY2VzIikgfCBodG1sICVdPC9sYWJlbD48L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IkZpbHRlclNlcnZpY2VzIiBjbGFzcz0iRmlsdGVyQm94IiBwbGFjZWhvbGRlcj0iWyUgVHJhbnNsYXRlKCJKdXN0IHN0YXJ0IHR5cGluZyB0byBmaWx0ZXIuLi4iKSB8IGh0bWwgJV0iIG5hbWU9IkZpbHRlclNlcnZpY2VzIiB2YWx1ZT0iIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJGaWx0ZXIgZm9yIHNlcnZpY2VzIikgfCBodG1sICVdIj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJGaWx0ZXIiKSAlXQogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdMaXN0IikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkxpc3QiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUiIGlkPSJTZXJ2aWNlcyI+CiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkNvbW1lbnQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiVmFsaWRpdHkiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQ2hhbmdlZCIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJDcmVhdGVkIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9EYXRhRm91bmRNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJObyBkYXRhIGZvdW5kLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vRGF0YUZvdW5kTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdMaXN0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyIFslIElGIERhdGEuVmFsaWRJRCAhPSAxJV1jbGFzcz0iSW52YWxpZCJbJSBFTkQgJV0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuTGV2ZWxTcGFjZSB8IGh0bWwgJV08YSBjbGFzcz0iQXNCbG9jayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPVNlcnZpY2VFZGl0O1NlcnZpY2VJRD1bJSBEYXRhLlNlcnZpY2VJRCB8IHVyaSAlXSI+WyUgRGF0YS5OYW1lIHwgdHJ1bmNhdGUoODApIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHRpdGxlPSJbJSBEYXRhLkNvbW1lbnQgfCBodG1sICVdIj5bJSBEYXRhLkNvbW1lbnQgfCB0cnVuY2F0ZSgyMCkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBUcmFuc2xhdGUoRGF0YS5WYWxpZCkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBEYXRhLkNoYW5nZVRpbWUgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuQ3JlYXRlVGltZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3RSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9IkZpbHRlck1lc3NhZ2UgSGlkZGVuIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI1Ij5bJSBUcmFuc2xhdGUoIk5vIG1hdGNoZXMgZm91bmQuIikgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KCiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlNlcnZpY2VFZGl0IikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgWyUgSUYgRGF0YS5TZXJ2aWNlSUQgPT0gJ05FVycgJV0KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFkZCBTZXJ2aWNlIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiRWRpdCBTZXJ2aWNlIikgfCBodG1sICVdIDogWyUgRGF0YS5OYW1lIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU2VydmljZVNhdmUiLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTZXJ2aWNlSUQiIHZhbHVlPSJbJSBEYXRhLlNlcnZpY2VJRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLlNlcnZpY2VJRCAhPSAnTkVXJyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDb250aW51ZUFmdGVyU2F2ZSIgaWQ9IkNvbnRpbnVlQWZ0ZXJTYXZlIiB2YWx1ZT0iIi8+CiAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9Ik5hbWUiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iTmFtZSIgaWQ9Ik5hbWUiIHZhbHVlPSJbJSBEYXRhLk5hbWVTaG9ydCB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyBWYWxpZGF0ZV9SZXF1aXJlZCBbJSBEYXRhLk5hbWVJbnZhbGlkIHwgaHRtbCAlXSIgbWF4bGVuZ3RoPSIyMDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5Mb25nTmFtZSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmFtZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPlslIFRyYW5zbGF0ZSgiU2VydmljZSBuYW1lIG1heGltdW0gbGVuZ3RoIGlzIDIwMCBjaGFyYWN0ZXJzICh3aXRoIFN1Yi1zZXJ2aWNlKS4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOYW1lU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUGFyZW50SUQiPlslIFRyYW5zbGF0ZSgiU3ViLXNlcnZpY2Ugb2YiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUGFyZW50T3B0aW9uU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlR5cGVJRCI+WyUgVHJhbnNsYXRlKCJUeXBlIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlR5cGVPcHRpb25TdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDcml0aWNhbGl0eSI+WyUgVHJhbnNsYXRlKCJDcml0aWNhbGl0eSIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Dcml0aWNhbGl0eU9wdGlvblN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAtLS0KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlZhbGlkSUQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiVmFsaWRpdHkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5WYWxpZE9wdGlvblN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNvbW1lbnQiPlslIFRyYW5zbGF0ZSgiQ29tbWVudCIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNvbW1lbnQiIGlkPSJDb21tZW50IiB2YWx1ZT0iWyUgRGF0YS5Db21tZW50IHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIiBtYXhsZW5ndGg9IjI1MCIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSXRlbSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIklucHV0S2V5IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoRGF0YS5LZXkpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iIGlkPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiB2YWx1ZT0iWyUgRGF0YS5TZWxlY3RlZElEIHwgaHRtbCAlXSIgY2xhc3M9IlcyNXBjIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJJbnB1dEtleSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIklucHV0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iIGlkPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiB2YWx1ZT0iWyUgRGF0YS5TZWxlY3RlZElEIHwgaHRtbCAlXSIgY2xhc3M9IlcyNXBjIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKERhdGEuRGVzYykgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiSW5wdXQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUZXh0QXJlYSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiBpZD0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgcm93cz0iWyUgRGF0YS5Sb3dzIHwgaHRtbCAlXSIgY29scz0iWyUgRGF0YS5Db2xzIHwgaHRtbCAlXSI+WyUgRGF0YS5TZWxlY3RlZElEIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKERhdGEuRGVzYykgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGV4dEFyZWEiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPcHRpb24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdIFslIFRyYW5zbGF0ZShEYXRhLktleSkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuT3B0aW9uICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKERhdGEuRGVzYykgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3B0aW9uIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVXBsb2FkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoRGF0YS5LZXkpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiBpZD0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgdHlwZT0iZmlsZSIgc2l6ZT0iMzAiIGNsYXNzPSJmaXhlZCIvPjxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIiPlslIERhdGEuRmlsZW5hbWUgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVXBsb2FkIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUGFzc3dvcmQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdIFslIFRyYW5zbGF0ZShEYXRhLktleSkgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icGFzc3dvcmQiIGNsYXNzPSJXMjVwYyIgbmFtZT0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgaWQ9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iIHZhbHVlPSIiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJQYXNzd29yZCIpICVdClslIFJlbmRlckJsb2NrRW5kKCJJdGVtIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLlNlcnZpY2VJRCAhPSAnTkVXJyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkNhbGxGb3JBY3Rpb24gUHJpbWFyeSIgaWQ9IlN1Ym1pdEFuZENvbnRpbnVlIiB0eXBlPSJidXR0b24iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV0iPjxzcGFuPlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBQcmltYXJ5IiBpZD0iU3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV0iPjxzcGFuPlslIFRyYW5zbGF0ZSgiU2F2ZSBhbmQgZmluaXNoIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkNhbGxGb3JBY3Rpb24gUHJpbWFyeSIgaWQ9IlN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdIj48c3Bhbj5bJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdIj5bJSBUcmFuc2xhdGUoIkNhbmNlbCIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgoKICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTZXJ2aWNlRWRpdCIpICVdCiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlldyIpICVdCg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWRtaW5TTEEudHQKIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWRtaW5TTEEudHQsdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTM6NTEgdWQgRXhwICQKIyAtLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlNMQSBNYW5hZ2VtZW50IikgfCBodG1sICVdPC9oMT4KCiAgICBbJSBCcmVhZGNydW1iUGF0aCA9IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGUoJ1NMQSBNYW5hZ2VtZW50JyksCiAgICAgICAgICAgICAgICBMaW5rID0+IEVudigiQWN0aW9uIiksCiAgICAgICAgICAgIH0sCiAgICAgICAgXQogICAgJV0KCiAgICBbJSBJRiBEYXRhLlNMQUlEICVdCiAgICAgICAgWyUgVVNFIEVkaXRUaXRsZSA9IFN0cmluZyhUcmFuc2xhdGUoIkVkaXQgU0xBIikpICVdCiAgICAgICAgWyUgQnJlYWRjcnVtYlBhdGgucHVzaCh7IE5hbWUgPT4gRWRpdFRpdGxlLmFwcGVuZCggJzogJywgRGF0YS5TTEFOYW1lICkgfSkgJV0KICAgIFslIEVMU0lGIERhdGEuU3ViYWN0aW9uID09ICJTTEFFZGl0IiAgJV0KICAgICAgICBbJSBCcmVhZGNydW1iUGF0aC5wdXNoKHsgTmFtZSA9PiBUcmFuc2xhdGUoIkFkZCBTTEEiKSx9KSAlXQogICAgWyUgRU5EICVdCgogICAgWyUgSU5DTFVERSAiQnJlYWRjcnVtYi50dCIgUGF0aCA9IEJyZWFkY3J1bWJQYXRoICVdCgogICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25MaXN0IikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQWN0aW9ucyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9uTGlzdCI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25PdmVydmlldyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtbGVmdCI+PC9pPlslIFRyYW5zbGF0ZSgiR28gdG8gb3ZlcnZpZXciKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25PdmVydmlldyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25BZGQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249U0xBRWRpdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtcGx1cy1zcXVhcmUiPjwvaT5bJSBUcmFuc2xhdGUoIkFkZCBTTEEiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0aW9uQWRkIikgJV0KCiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbkxpc3QiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGaWx0ZXIiKSAlXQogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+PGxhYmVsIGZvcj0iRmlsdGVyU0xBcyI+WyUgVHJhbnNsYXRlKCJGaWx0ZXIgZm9yIFNMQXMiKSB8IGh0bWwgJV08L2xhYmVsPjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iRmlsdGVyU0xBcyIgY2xhc3M9IkZpbHRlckJveCIgcGxhY2Vob2xkZXI9IlslIFRyYW5zbGF0ZSgiSnVzdCBzdGFydCB0eXBpbmcgdG8gZmlsdGVyLi4uIikgfCBodG1sICVdIiBuYW1lPSJGaWx0ZXJTTEFzIiB2YWx1ZT0iIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJGaWx0ZXIgZm9yIFNMQXMiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZpbHRlciIpICVdCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3QiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiTGlzdCIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KCiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSIgaWQ9IlNMQXMiPgogICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiU0xBIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQ29tbWVudCIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJWYWxpZGl0eSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJDaGFuZ2VkIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkNyZWF0ZWQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RhdGFGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3RSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHIgWyUgSUYgRGF0YS5WYWxpZElEICYmIERhdGEuVmFsaWRJRCAhPSAxICVdY2xhc3M9IkludmFsaWQiWyUgRU5EICVdPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxhIGNsYXNzPSJBc0Jsb2NrIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249U0xBRWRpdDtTTEFJRD1bJSBEYXRhLlNMQUlEIHwgdXJpICVdIj5bJSBEYXRhLk5hbWUgfCBodG1sICVdPC9hPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+WyUgRGF0YS5TZXJ2aWNlIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuQ29tbWVudCB8IGh0bWwgJV0iPlslIERhdGEuQ29tbWVudCB8IHRydW5jYXRlKDI2KSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIFRyYW5zbGF0ZShEYXRhLlZhbGlkKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuQ2hhbmdlVGltZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+WyUgRGF0YS5DcmVhdGVUaW1lIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3TGlzdFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iRmlsdGVyTWVzc2FnZSBIaWRkZW4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjYiPlslIFRyYW5zbGF0ZSgiTm8gbWF0Y2hlcyBmb3VuZC4iKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3TGlzdCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTTEFFZGl0IikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgWyUgSUYgIURhdGEuU0xBSUQgJV0KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFkZCBTTEEiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJFZGl0IFNMQSIpIHwgaHRtbCAlXSA6IFslIERhdGEuTmFtZSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNMQVNhdmUiLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTTEFJRCIgdmFsdWU9IlslIERhdGEuU0xBSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5TTEFJRCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDb250aW51ZUFmdGVyU2F2ZSIgaWQ9IkNvbnRpbnVlQWZ0ZXJTYXZlIiB2YWx1ZT0iIi8+CiAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iTmFtZSI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJTTEEiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik5hbWUiIGlkPSJOYW1lIiB2YWx1ZT0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuTmFtZUludmFsaWQgfCBodG1sICVdIiBtYXhsZW5ndGg9IjIwMCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmFtZUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VydmljZUlEcyI+WyUgVHJhbnNsYXRlKCJUeXBlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVHlwZU9wdGlvblN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAtLS0KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNlcnZpY2VJRHMiPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNlcnZpY2VPcHRpb25TdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDYWxlbmRhciI+WyUgVHJhbnNsYXRlKCJDYWxlbmRhciIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNhbGVuZGFyT3B0aW9uU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRmlyc3RSZXNwb25zZVRpbWUiPlslIFRyYW5zbGF0ZSgiRXNjYWxhdGlvbiAtIGZpcnN0IHJlc3BvbnNlIHRpbWUiKSB8IGh0bWwgJV0gKFslIFRyYW5zbGF0ZSgibWludXRlcyIpIHwgaHRtbCAlXSk6PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkZpcnN0UmVzcG9uc2VUaW1lIiBpZD0iRmlyc3RSZXNwb25zZVRpbWUiIHZhbHVlPSJbJSBEYXRhLkZpcnN0UmVzcG9uc2VUaW1lIHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHB4IFZhbGlkYXRlX051bWJlciIgbWF4bGVuZ3RoPSIxMCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRmlyc3RSZXNwb25zZVRpbWVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHdyaXRlIG9ubHkgbnVtYmVycyEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPGxhYmVsIGZvcj0iRmlyc3RSZXNwb25zZU5vdGlmeSI+WyUgVHJhbnNsYXRlKCJOb3RpZnkgYnkiKSB8IGh0bWwgJV08L2xhYmVsPiBbJSBEYXRhLkZpcnN0UmVzcG9uc2VOb3RpZnlPcHRpb25TdHJnICVdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiMCA9IG5vIGVzY2FsYXRpb24iKSB8IGh0bWwgJV0gLSAyNCBbJSBUcmFuc2xhdGUoImhvdXJzIikgfCBodG1sICVdID0gMTQ0MCBbJSBUcmFuc2xhdGUoIm1pbnV0ZXMiKSB8IGh0bWwgJV0gLSBbJSBUcmFuc2xhdGUoIk9ubHkgYnVzaW5lc3MgaG91cnMgYXJlIGNvdW50ZWQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJVcGRhdGVUaW1lIj5bJSBUcmFuc2xhdGUoIkVzY2FsYXRpb24gLSB1cGRhdGUgdGltZSIpIHwgaHRtbCAlXSAoWyUgVHJhbnNsYXRlKCJtaW51dGVzIikgfCBodG1sICVdKTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVXBkYXRlVGltZSIgaWQ9IlVwZGF0ZVRpbWUiIHZhbHVlPSJbJSBEYXRhLlVwZGF0ZVRpbWUgfCBodG1sICVdIiBjbGFzcz0iVzUwcHggVmFsaWRhdGVfTnVtYmVyIiBtYXhsZW5ndGg9IjEwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJVcGRhdGVUaW1lRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlBsZWFzZSB3cml0ZSBvbmx5IG51bWJlcnMhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKDxsYWJlbCBmb3I9IlVwZGF0ZU5vdGlmeSI+WyUgVHJhbnNsYXRlKCJOb3RpZnkgYnkiKSB8IGh0bWwgJV08L2xhYmVsPiBbJSBEYXRhLlVwZGF0ZU5vdGlmeU9wdGlvblN0cmcgJV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCIwID0gbm8gZXNjYWxhdGlvbiIpIHwgaHRtbCAlXSAtIDI0IFslIFRyYW5zbGF0ZSgiaG91cnMiKSB8IGh0bWwgJV0gPSAxNDQwIFslIFRyYW5zbGF0ZSgibWludXRlcyIpIHwgaHRtbCAlXSAtIFslIFRyYW5zbGF0ZSgiT25seSBidXNpbmVzcyBob3VycyBhcmUgY291bnRlZC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNvbHV0aW9uVGltZSI+WyUgVHJhbnNsYXRlKCJFc2NhbGF0aW9uIC0gc29sdXRpb24gdGltZSIpIHwgaHRtbCAlXSAoWyUgVHJhbnNsYXRlKCJtaW51dGVzIikgfCBodG1sICVdKTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iU29sdXRpb25UaW1lIiBpZD0iU29sdXRpb25UaW1lIiB2YWx1ZT0iWyUgRGF0YS5Tb2x1dGlvblRpbWUgfCBodG1sICVdIiBjbGFzcz0iVzUwcHggVmFsaWRhdGVfTnVtYmVyIiBtYXhsZW5ndGg9IjEwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTb2x1dGlvblRpbWVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHdyaXRlIG9ubHkgbnVtYmVycyEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPGxhYmVsIGZvcj0iU29sdXRpb25Ob3RpZnkiPlslIFRyYW5zbGF0ZSgiTm90aWZ5IGJ5IikgfCBodG1sICVdPC9sYWJlbD4gWyUgRGF0YS5Tb2x1dGlvbk5vdGlmeU9wdGlvblN0cmcgJV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCIwID0gbm8gZXNjYWxhdGlvbiIpIHwgaHRtbCAlXSAtIDI0IFslIFRyYW5zbGF0ZSgiaG91cnMiKSB8IGh0bWwgJV0gPSAxNDQwIFslIFRyYW5zbGF0ZSgibWludXRlcyIpIHwgaHRtbCAlXSAtIFslIFRyYW5zbGF0ZSgiT25seSBidXNpbmVzcyBob3VycyBhcmUgY291bnRlZC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJNaW5UaW1lQmV0d2VlbkluY2lkZW50cyI+WyUgVHJhbnNsYXRlKCJNaW5pbXVtIFRpbWUgQmV0d2VlbiBJbmNpZGVudHMiKSB8IGh0bWwgJV0gKFslIFRyYW5zbGF0ZSgibWludXRlcyIpIHwgaHRtbCAlXSk6PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik1pblRpbWVCZXR3ZWVuSW5jaWRlbnRzIiBpZD0iTWluVGltZUJldHdlZW5JbmNpZGVudHMiIHZhbHVlPSJbJSBEYXRhLk1pblRpbWVCZXR3ZWVuSW5jaWRlbnRzIHwgaHRtbCAlXSIgY2xhc3M9IlcyNXBjIFZhbGlkYXRlX051bWJlciIgbWF4bGVuZ3RoPSIxNSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTWluVGltZUJldHdlZW5JbmNpZGVudHNFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHdyaXRlIG9ubHkgbnVtYmVycyEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgLS0tCgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJWYWxpZElEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIlZhbGlkaXR5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVmFsaWRPcHRpb25TdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDb21tZW50Ij5bJSBUcmFuc2xhdGUoIkNvbW1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNvbW1lbnQiIGlkPSJDb21tZW50IiB2YWx1ZT0iWyUgRGF0YS5Db21tZW50IHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIiBtYXhsZW5ndGg9IjI1MCIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTTEFJdGVtIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW5wdXRLZXkiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdIFslIFRyYW5zbGF0ZShEYXRhLktleSkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiBpZD0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgdmFsdWU9IlslIERhdGEuU2VsZWN0ZWRJRCB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiSW5wdXRLZXkiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbnB1dCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iIGlkPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiB2YWx1ZT0iWyUgRGF0YS5TZWxlY3RlZElEIHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKERhdGEuRGVzYykgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJJbnB1dCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRleHRBcmVhIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgaWQ9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iIHJvd3M9IlslIERhdGEuUm93cyB8IGh0bWwgJV0iIGNvbHM9IlslIERhdGEuQ29scyB8IGh0bWwgJV0iPlslIERhdGEuU2VsZWN0ZWRJRCB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZShEYXRhLkRlc2MpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tFbmQoIlRleHRBcmVhIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3B0aW9uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoRGF0YS5LZXkpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk9wdGlvbiAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZShEYXRhLkRlc2MpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3B0aW9uIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVXBsb2FkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoRGF0YS5LZXkpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgaWQ9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iIHR5cGU9ImZpbGUiIGNsYXNzPSJmaXhlZCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIj5bJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlVwbG9hZCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlBhc3N3b3JkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoRGF0YS5LZXkpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iIGlkPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiB2YWx1ZT0iIiBjbGFzcz0iVzUwcGMiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlBhc3N3b3JkIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIlNMQUl0ZW0iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuU0xBSUQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJDYWxsRm9yQWN0aW9uIFByaW1hcnkiIGlkPSJTdWJtaXRBbmRDb250aW51ZSIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdIj48c3Bhbj5bJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJvciIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkNhbGxGb3JBY3Rpb24gUHJpbWFyeSIgaWQ9IlN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdIj48c3Bhbj5bJSBUcmFuc2xhdGUoIlNhdmUgYW5kIGZpbmlzaCIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIEVMU0UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJDYWxsRm9yQWN0aW9uIFByaW1hcnkiIGlkPSJTdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXSI+PHNwYW4+WyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSI+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTTEFFZGl0IikgJV0KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3IikgJV0K
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNU2VydmljZS50dAojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTkgT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE5IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyAtLQojICRJZDogQWdlbnRJVFNNU2VydmljZS50dCx2IDEuMiAyMDE5LzA1LzE5IDE0OjQyOjEyIHVkIEV4cCAkCiMgLS0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXciKSAlXQo8ZGl2IGNsYXNzPSJNYWluQm94IEFyaWFSb2xlTWFpbiBTcGFjaW5nVG9wIj4KICAgIDxkaXYgY2xhc3M9Ilc3NXBjQWdlbnRJVFNNU2VydmljZU9GT1JLIFNwYWNpbmdCb3R0b20gQ2VudGVyQm94Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiT3ZlcnZpZXciKSB8IGh0bWwgJV06IFslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50IFNwYWNpbmdCb3R0b20iPgogICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJTdGF0ZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkNvbW1lbnQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiVHlwZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJDcml0aWNhbGl0eSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJDaGFuZ2VkIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9Ik1hc3RlckFjdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJbJSBEYXRhLkN1ckluY2lTaWduYWwgJV0iIHRpdGxlPSJbJSBEYXRhLlN0YXRlICVdIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGV2ZWxTcGFjZSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJNYXN0ZXJBY3Rpb25MaW5rIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRJVFNNU2VydmljZVpvb207U2VydmljZUlEPVslIERhdGEuU2VydmljZUlEIHwgdXJpICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuQ29tbWVudCB8IGh0bWwgJV0iPlslIERhdGEuQ29tbWVudCB8IHRydW5jYXRlKDEwMCkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBUcmFuc2xhdGUoRGF0YS5UeXBlKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIFRyYW5zbGF0ZShEYXRhLkNyaXRpY2FsaXR5KSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuQ2hhbmdlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3Um93IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9EYXRhRm91bmRNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJObyBkYXRhIGZvdW5kLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vRGF0YUZvdW5kTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlldyIpICVdCg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNU2VydmljZVpvb20udHQKIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNU2VydmljZVpvb20udHQsdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTM6NTEgdWQgRXhwICQKIyAtLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiI+CiAgICA8ZGl2IGNsYXNzPSJDbGVhckxlZnQiPjwvZGl2PgogICAgPGRpdiBjbGFzcz0iSGVhZGxpbmUiPgogICAgICAgIDxkaXYgY2xhc3M9IkZsYWciIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5DdXJJbmNpU3RhdGUpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJbJSBEYXRhLkN1ckluY2lTaWduYWwgfCBodG1sICVdIj48L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGgxIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV06IFslIERhdGEuTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV06IFslIERhdGEuTmFtZSB8IGh0bWwgJV0KICAgICAgICA8L2gxPgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckxhc3QiPgogICAgICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBvciBoaWRlIHRoZSBjb250ZW50IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIEluZm9ybWF0aW9uIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIFRpZ2h0Ij4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkN1cnJlbnQgaW5jaWRlbnQgc3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlslIERhdGEuQ3VySW5jaVNpZ25hbCB8IGh0bWwgJV0iPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKERhdGEuQ3VySW5jaVN0YXRlKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNyZWF0ZWQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLkNyZWF0ZVRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCBieSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DcmVhdGVCeU5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTGFzdCBjaGFuZ2VkIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNoYW5nZVRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkxhc3QgY2hhbmdlZCBieSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DaGFuZ2VCeU5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJMaW5rVGFibGVTaW1wbGUiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgRG9udFByaW50Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiTGlua2VkIE9iamVjdHMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxpbmtUYWJsZVN0cmcgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkxpbmtUYWJsZVNpbXBsZSIpICVdCiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250cm9sUm93Ij4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFjdGlvblJvdyI+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbnMiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZW51SXRlbSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1bJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgY2xhc3M9IlslIERhdGEuTWVudUNsYXNzIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkRlc2NyaXB0aW9uKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiTWVudUl0ZW0iKSAlXQogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRCb3ggU3BhY2luZ1RvcCBFeHBhbmRlZCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJMaWdodFJvdyBIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPjxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb3IgaGlkZSB0aGUgY29udGVudC4iKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV06IFslIERhdGEuTmFtZSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50IEF1dG9IZWlnaHQiPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUeXBlIikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZShEYXRhLlR5cGUpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3JpdGljYWxpdHkiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZShEYXRhLkNyaXRpY2FsaXR5KSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDb21tZW50IikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIkNvbW1lbnQiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZShEYXRhLkNvbW1lbnQpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU0xBIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIERvbnRQcmludCBTcGFjaW5nVG9wICBTcGFjaW5nQm90dG9tTWVkaXVtIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QWN0aW9uIFRvZ2dsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb3IgaGlkZSB0aGUgY29udGVudCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQXNzb2NpYXRlZCBTTEFzIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiU0xBIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJDb21tZW50IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJUeXBlIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJDaGFuZ2VkIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiU0xBUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJBc0Jsb2NrIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRJVFNNU0xBWm9vbTtTTEFJRD1bJSBEYXRhLlNMQUlEIHwgdXJpICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHRpdGxlPSJbJSBEYXRhLkNvbW1lbnQgfCBodG1sICVdIj5bJSBEYXRhLkNvbW1lbnQgfCB0cnVuY2F0ZSgxMDApIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIFRyYW5zbGF0ZShEYXRhLlR5cGUpIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuQ2hhbmdlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJTTEFSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTTEEiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTGlua1RhYmxlQ29tcGxleCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5MaW5rVGFibGVTdHJnICVdCiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTGlua1RhYmxlQ29tcGxleCIpICVdCgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4K
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNU0xBLnR0CiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTkgT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlLwojIC0tCiMgJElkOiBBZ2VudElUU01TTEEudHQsdiAxLjIgMjAxOS8wNS8xOSAxNDo0MTo1NiB1ZCBFeHAgJAojIC0tLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3IikgJV0KPGRpdiBjbGFzcz0iTWFpbkJveCBBcmlhUm9sZU1haW4gU3BhY2luZ1RvcCI+CiAgICA8ZGl2IGNsYXNzPSJXNzVwY0FnZW50SVRTTVNMQU9GT1JLIFNwYWNpbmdCb3R0b20gQ2VudGVyQm94Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiT3ZlcnZpZXciKSB8IGh0bWwgJV06IFslIFRyYW5zbGF0ZSgiU0xBIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQgU3BhY2luZ0JvdHRvbSI+CiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlNMQSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJDb21tZW50IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQ2hhbmdlZCIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3Um93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJNYXN0ZXJBY3Rpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJNYXN0ZXJBY3Rpb25MaW5rIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRJVFNNU0xBWm9vbTtTTEFJRD1bJSBEYXRhLlNMQUlEIHwgdXJpICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuQ29tbWVudCB8IGh0bWwgJV0iPlslIERhdGEuQ29tbWVudCB8IHRydW5jYXRlKDEwMCkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBUcmFuc2xhdGUoRGF0YS5UeXBlKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuQ2hhbmdlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3Um93IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9EYXRhRm91bmRNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJObyBkYXRhIGZvdW5kLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vRGF0YUZvdW5kTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlldyIpICVdCg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWdlbnRJVFNNU0xBWm9vbS50dAojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01TTEFab29tLnR0LHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEzOjUxIHVkIEV4cCAkCiMgLS0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIj4KICAgIDxkaXYgY2xhc3M9IkNsZWFyTGVmdCI+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJIZWFkbGluZSI+CiAgICAgICAgPGgxPlslIFRyYW5zbGF0ZSgiU0xBIikgfCBodG1sICVdOiBbJSBEYXRhLk5hbWUgfCBodG1sICVdPC9oMT4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IkxheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyTGFzdCI+CiAgICAgICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IG9yIGhpZGUgdGhlIGNvbnRlbnQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIlNMQSBJbmZvcm1hdGlvbiIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBUaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNyZWF0ZWQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLkNyZWF0ZVRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCBieSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DcmVhdGVCeU5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTGFzdCBjaGFuZ2VkIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNoYW5nZVRpbWUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkxhc3QgY2hhbmdlZCBieSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DaGFuZ2VCeU5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgoKICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udHJvbFJvdyI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJBY3Rpb25Sb3ciPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25zIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWVudUl0ZW0iKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIGNsYXNzPSJbJSBEYXRhLk1lbnVDbGFzcyB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5EZXNjcmlwdGlvbikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIk1lbnVJdGVtIikgJV0KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0Qm94IFNwYWNpbmdUb3AgRXhwYW5kZWQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTGlnaHRSb3cgSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj48YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IG9yIGhpZGUgdGhlIGNvbnRlbnQuIikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJTTEEiKSB8IGh0bWwgJV06IFslIERhdGEuTmFtZSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50IEF1dG9IZWlnaHQiPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWwiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJUeXBlIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5UeXBlKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNhbGVuZGFyIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNhbGVuZGFyTmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkZpcnN0IFJlc3BvbnNlIFRpbWUiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmlyc3RSZXNwb25zZVRpbWUgfCBodG1sICVdIFslIFRyYW5zbGF0ZSgibWludXRlcyIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVXBkYXRlIFRpbWUiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVXBkYXRlVGltZSB8IGh0bWwgJV0gWyUgVHJhbnNsYXRlKCJtaW51dGVzIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJTb2x1dGlvbiBUaW1lIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNvbHV0aW9uVGltZSB8IGh0bWwgJV0gWyUgVHJhbnNsYXRlKCJtaW51dGVzIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJNaW5pbXVtIFRpbWUgQmV0d2VlbiBJbmNpZGVudHMiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTWluVGltZUJldHdlZW5JbmNpZGVudHMgfCBodG1sICVdIFslIFRyYW5zbGF0ZSgibWludXRlcyIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ29tbWVudCIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Db21tZW50IHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU2VydmljZSIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBTcGFjaW5nVG9wIFNwYWNpbmdCb3R0b21NZWRpdW0iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBvciBoaWRlIHRoZSBjb250ZW50IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJBc3NvY2lhdGVkIFNlcnZpY2VzIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiU3RhdGUiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkNvbW1lbnQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkNyaXRpY2FsaXR5IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJDaGFuZ2VkIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiU2VydmljZVJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJbJSBEYXRhLkN1ckluY2lTaWduYWwgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuQ3VySW5jaVN0YXRlKSB8IGh0bWwgJV0iPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudElUU01TZXJ2aWNlWm9vbTtTZXJ2aWNlSUQ9WyUgRGF0YS5TZXJ2aWNlSUQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuQ29tbWVudCB8IGh0bWwgJV0iPlslIERhdGEuQ29tbWVudCB8IHRydW5jYXRlKDEwMCkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+WyUgVHJhbnNsYXRlKERhdGEuVHlwZSkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+WyUgVHJhbnNsYXRlKERhdGEuQ3JpdGljYWxpdHkpIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuQ2hhbmdlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJTZXJ2aWNlUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU2VydmljZSIpICVdCgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2Pgo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vQ29uc29sZS9Db21tYW5kL0FkbWluL1NlcnZpY2UvQWRkLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFkZC5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMzo1MSB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6Q29tbWFuZDo6QWRtaW46OlNlcnZpY2U6OkFkZDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CiMgLS0tCgp1c2UgcGFyZW50IHF3KEtlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpCYXNlQ29tbWFuZCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnLAojIC0tLQopOwoKc3ViIENvbmZpZ3VyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT5EZXNjcmlwdGlvbignQWRkIG5ldyBzZXJ2aWNlLicpOwogICAgJFNlbGYtPkFkZE9wdGlvbigKICAgICAgICBOYW1lICAgICAgICA9PiAnbmFtZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gIk5hbWUgb2YgdGhlIG5ldyBzZXJ2aWNlLiIsCiAgICAgICAgUmVxdWlyZWQgICAgPT4gMSwKICAgICAgICBIYXNWYWx1ZSAgICA9PiAxLAogICAgICAgIFZhbHVlUmVnZXggID0+IHFyLy4qL3NteCwKICAgICk7CiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICRTZWxmLT5BZGRPcHRpb24oCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ2NyaXRpY2FsaXR5JywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ3JpdGljYWxpdHkgb2YgdGhlIG5ldyBzZXJ2aWNlLiIsCiAgICAgICAgUmVxdWlyZWQgICAgPT4gMSwKICAgICAgICBIYXNWYWx1ZSAgICA9PiAxLAogICAgICAgIFZhbHVlUmVnZXggID0+IHFyLy4qL3NteCwKICAgICk7CiAgICAkU2VsZi0+QWRkT3B0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICd0eXBlJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiVHlwZSBvZiB0aGUgbmV3IHNlcnZpY2UuIiwKICAgICAgICBSZXF1aXJlZCAgICA9PiAxLAogICAgICAgIEhhc1ZhbHVlICAgID0+IDEsCiAgICAgICAgVmFsdWVSZWdleCAgPT4gcXIvLiovc214LAogICAgKTsKIyAtLS0KICAgICRTZWxmLT5BZGRPcHRpb24oCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ3BhcmVudC1uYW1lJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiUGFyZW50IHNlcnZpY2UgbmFtZS4gSWYgZ2l2ZW4sIHRoZSBuZXcgc2VydmljZSB3aWxsIGJlIGEgc3Vic2VydmljZSBvZiB0aGUgZ2l2ZW4gcGFyZW50LiIsCiAgICAgICAgUmVxdWlyZWQgICAgPT4gMCwKICAgICAgICBIYXNWYWx1ZSAgICA9PiAxLAogICAgICAgIFZhbHVlUmVnZXggID0+IHFyLy4qL3NteCwKICAgICk7CiAgICAkU2VsZi0+QWRkT3B0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICdjb21tZW50JywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ29tbWVudCBmb3IgdGhlIG5ldyBzZXJ2aWNlLiIsCiAgICAgICAgUmVxdWlyZWQgICAgPT4gMCwKICAgICAgICBIYXNWYWx1ZSAgICA9PiAxLAogICAgICAgIFZhbHVlUmVnZXggID0+IHFyLy4qL3NteCwKICAgICk7CgogICAgcmV0dXJuOwp9CgpzdWIgUHJlUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBHZXQgYWxsIHNlcnZpY2VzLgogICAgJFNlbGYtPntOYW1lfSA9ICRTZWxmLT5HZXRPcHRpb24oJ25hbWUnKTsKICAgIG15ICVTZXJ2aWNlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VMaXN0KAogICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKICAgIG15ICVSZXZlcnNlID0gcmV2ZXJzZSAlU2VydmljZUxpc3Q7CgogICAgJFNlbGYtPntQYXJlbnROYW1lfSA9ICRTZWxmLT5HZXRPcHRpb24oJ3BhcmVudC1uYW1lJyk7CiAgICBpZiAoICRTZWxmLT57UGFyZW50TmFtZX0gKSB7CgogICAgICAgICMgQ2hlY2sgaWYgUGFyZW50IHNlcnZpY2UgZXhpc3RzLgogICAgICAgICRTZWxmLT57UGFyZW50SUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgTmFtZSAgID0+ICRTZWxmLT57UGFyZW50TmFtZX0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CiAgICAgICAgZGllICJQYXJlbnQgc2VydmljZSAkU2VsZi0+e1BhcmVudE5hbWV9IGRvZXMgbm90IGV4aXN0LlxuIiBpZiAhJFNlbGYtPntQYXJlbnRJRH07CgogICAgICAgICMgQ2hlY2sgaWYgUGFyZW50OjpDaGlsZCBzZXJ2aWNlIGNvbWJpbmF0aW9uIGV4aXN0cy4KICAgICAgICBteSAkU2VydmljZU5hbWUgPSAkU2VsZi0+e1BhcmVudE5hbWV9IC4gJzo6JyAuICRTZWxmLT57TmFtZX07CiAgICAgICAgZGllICJTZXJ2aWNlICckU2VydmljZU5hbWUnIGFscmVhZHkgZXhpc3RzIVxuIiBpZiAkUmV2ZXJzZXskU2VydmljZU5hbWV9OwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgQ2hlY2sgaWYgc2VydmljZSBhbHJlYWR5IGV4aXN0cy4KICAgICAgICBkaWUgIlNlcnZpY2UgJyRTZWxmLT57TmFtZX0nIGFscmVhZHkgZXhpc3RzIVxuIiBpZiAkUmV2ZXJzZXsgJFNlbGYtPntOYW1lfSB9OwogICAgfQojIC0tLQojIElUU01Db3JlCiMgLS0tCgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGQgY29uZmlnIGZvciBJVFNNQ3JpdGljYWxpdHkKICAgIG15ICREeW5hbWljRmllbGRDb25maWdBcnJheVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsgJ1RpY2tldCcgXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiB7CiAgICAgICAgICAgIElUU01Dcml0aWNhbGl0eSA9PiAxLAogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlcyBmb3IgSVRTTUNyaXRpY2FsaXR5CiAgICBteSAlUG9zc2libGVWYWx1ZXM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICREeW5hbWljRmllbGRDb25maWdBcnJheVJlZiB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAkUG9zc2libGVWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntQb3NzaWJsZVZhbHVlc30gfHwge307CiAgICB9CgogICAgbXkgJUNyaXRpY2FsaXR5ID0gJXsgJFBvc3NpYmxlVmFsdWVze0lUU01Dcml0aWNhbGl0eX0gfTsKCiAgICAkU2VsZi0+e0NyaXRpY2FsaXR5fSA9ICRDcml0aWNhbGl0eXsgJFNlbGYtPkdldE9wdGlvbignY3JpdGljYWxpdHknKSB9OwoKICAgIGlmICggISRTZWxmLT57Q3JpdGljYWxpdHl9ICkgewogICAgICAgIGRpZSAiQ3JpdGljYWxpdHkgJyIgLiAkU2VsZi0+R2V0T3B0aW9uKCdjcml0aWNhbGl0eScpIC4gIicgZG9lcyBub3QgZXhpc3QuXG4iOwogICAgfQoKICAgICMgZ2V0IHNlcnZpY2UgdHlwZSBsaXN0CiAgICBteSAkU2VydmljZVR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICk7CgogICAgbXkgJVNlcnZpY2VUeXBlID0gcmV2ZXJzZSAleyRTZXJ2aWNlVHlwZUxpc3R9OwoKICAgICRTZWxmLT57VHlwZUlEfSA9ICRTZXJ2aWNlVHlwZXsgJFNlbGYtPkdldE9wdGlvbigndHlwZScpIH07CgogICAgaWYgKCAhJFNlbGYtPntUeXBlSUR9ICkgewogICAgICAgIGRpZSAiVHlwZSAnIiAuICRTZWxmLT5HZXRPcHRpb24oJ3R5cGUnKSAuICInIGRvZXMgbm90IGV4aXN0LlxuIjsKICAgIH0KIyAtLS0KCiAgICByZXR1cm47Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+QWRkaW5nIGEgbmV3IHNlcnZpY2UuLi48L3llbGxvdz5cbiIpOwoKICAgICMgYWRkIHNlcnZpY2UKICAgIGlmICgKICAgICAgICAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUFkZCgKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJFNlbGYtPntOYW1lfSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJFNlbGYtPkdldE9wdGlvbignY29tbWVudCcpLAogICAgICAgICAgICBQYXJlbnRJRCA9PiAkU2VsZi0+e1BhcmVudElEfSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICA9PiAkU2VsZi0+e1R5cGVJRH0sCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICRTZWxmLT57Q3JpdGljYWxpdHl9LAojIC0tLQogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPlByaW50RXJyb3IoIkNhbid0IGFkZCBzZXJ2aWNlLiIpOwogICAgICAgIHJldHVybiAkU2VsZi0+RXhpdENvZGVFcnJvcigpOwogICAgfQoKICAgICRTZWxmLT5QcmludCgiPGdyZWVuPkRvbmUuPC9ncmVlbj5cbiIpOwogICAgcmV0dXJuICRTZWxmLT5FeGl0Q29kZU9rKCk7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vTGlua09iamVjdC9TZXJ2aWNlLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IFNlcnZpY2UucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTM6NTEgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q6OlNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScsCiAgICAnS2VybmVsOjpMYW5ndWFnZScsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q6OlNlcnZpY2UKCj1oZWFkMSBERVNDUklQVElPTgoKU2VydmljZSBiYWNrZW5kIGZvciB0aGUgc2VydmljZSBsaW5rIG9iamVjdC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9Y3V0Cgo9aGVhZDIgbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRMaW5rT2JqZWN0U2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0OjpTZXJ2aWNlJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIExpbmtMaXN0V2l0aERhdGEoKQoKZmlsbCB1cCB0aGUgbGluayBsaXN0IHdpdGggZGF0YQoKICAgICRTdWNjZXNzID0gJExpbmtPYmplY3RCYWNrZW5kLT5MaW5rTGlzdFdpdGhEYXRhKAogICAgICAgIExpbmtMaXN0ID0+ICRIYXNoUmVmLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtMaXN0V2l0aERhdGEgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTGlua0xpc3QgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGxpbmsgbGlzdAogICAgaWYgKCByZWYgJFBhcmFte0xpbmtMaXN0fSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdMaW5rTGlzdCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgbXkgJExpbmtUeXBlICggc29ydCBrZXlzICV7ICRQYXJhbXtMaW5rTGlzdH0gfSApIHsKCiAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBzb3J0IGtleXMgJXsgJFBhcmFte0xpbmtMaXN0fS0+eyRMaW5rVHlwZX0gfSApIHsKCiAgICAgICAgICAgIFNFUlZJQ0VJRDoKICAgICAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBzb3J0IGtleXMgJXsgJFBhcmFte0xpbmtMaXN0fS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufSB9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IHNlcnZpY2UgZGF0YQogICAgICAgICAgICAgICAgbXkgJVNlcnZpY2VEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUdldCgKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICAgICAgSW5jaWRlbnRTdGF0ZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmVtb3ZlIGlkIGZyb20gaGFzaCBpZiBubyBzZXJ2aWNlIGRhdGEgd2FzIGZvdW5kCiAgICAgICAgICAgICAgICBpZiAoICElU2VydmljZURhdGEgKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn0tPnskU2VydmljZUlEfTsKICAgICAgICAgICAgICAgICAgICBuZXh0IFNFUlZJQ0VJRDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGFkZCBzZXJ2aWNlIGRhdGEKICAgICAgICAgICAgICAgICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn0tPnskU2VydmljZUlEfSA9IFwlU2VydmljZURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBPYmplY3RQZXJtaXNzaW9uKCkKCmNoZWNrcyByZWFkIHBlcm1pc3Npb24gZm9yIGEgZ2l2ZW4gb2JqZWN0IGFuZCBVc2VySUQuCgogICAgJFBlcm1pc3Npb24gPSAkTGlua09iamVjdC0+T2JqZWN0UGVybWlzc2lvbigKICAgICAgICBPYmplY3QgID0+ICdTZXJ2aWNlJywKICAgICAgICBLZXkgICAgID0+IDEyMywKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdFBlcm1pc3Npb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0IEtleSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgbW9kdWxlIHJlZ2lzdHJ5IG9mIEFnZW50SVRTTVNlcnZpY2Vab29tCiAgICBteSAkTW9kdWxlUmVnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudElUU01TZXJ2aWNlWm9vbX07CgogICAgIyBkbyBub3QgZ3JhbnQgYWNjZXNzIGlmIGZyb250ZW5kIG1vZHVsZSBpcyBub3QgcmVnaXN0ZXJlZAogICAgcmV0dXJuIGlmICEkTW9kdWxlUmVnOwoKICAgICMgZ3JhbnQgYWNjZXNzIGlmIG1vZHVsZSBwZXJtaXNzb24gaGFzIG5vIEdyb3VwIG9yIEdyb3VwUm8gZGVmaW5lZAogICAgaWYgKCAhJE1vZHVsZVJlZy0+e0dyb3VwUm99ICYmICEkTW9kdWxlUmVnLT57R3JvdXB9ICkgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIFBFUk1JU1NJT046CiAgICBmb3IgbXkgJFBlcm1pc3Npb24gKHF3KEdyb3VwUm8gR3JvdXApKSB7CgogICAgICAgIG5leHQgUEVSTUlTU0lPTiBpZiAhJE1vZHVsZVJlZy0+eyRQZXJtaXNzaW9ufTsKICAgICAgICBuZXh0IFBFUk1JU1NJT04gaWYgcmVmICRNb2R1bGVSZWctPnskUGVybWlzc2lvbn0gbmUgJ0FSUkFZJzsKCiAgICAgICAgZm9yIG15ICRHcm91cCAoIEB7ICRNb2R1bGVSZWctPnskUGVybWlzc2lvbn0gfSApIHsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBncm91cCBpZAogICAgICAgICAgICBteSAkR3JvdXBJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExvb2t1cCggR3JvdXAgPT4gJEdyb3VwICk7CgogICAgICAgICAgICBteSAkVHlwZTsKICAgICAgICAgICAgaWYgKCAkUGVybWlzc2lvbiBlcSAnR3JvdXBSbycgKSB7CiAgICAgICAgICAgICAgICAkVHlwZSA9ICdybyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkUGVybWlzc2lvbiBlcSAnR3JvdXAnICkgewogICAgICAgICAgICAgICAgJFR5cGUgPSAncncnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCB1c2VyIGdyb3Vwcywgd2hlcmUgdGhlIHVzZXIgaGFzIHRoZSBhcHByb3ByaWF0ZSBwcml2aWxlZ2UKICAgICAgICAgICAgbXkgJUdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBncmFudCBhY2Nlc3MgaWYgYWdlbnQgaXMgYSBtZW1iZXIgaW4gdGhlIGdyb3VwCiAgICAgICAgICAgIHJldHVybiAxIGlmICRHcm91cHN7JEdyb3VwSUR9OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm47Cn0KCj1oZWFkMiBPYmplY3REZXNjcmlwdGlvbkdldCgpCgpyZXR1cm4gYSBoYXNoIG9mIG9iamVjdCBkZXNjcmlwdGlvbnMKClJldHVybgogICAgJURlc2NyaXB0aW9uID0gKAogICAgICAgIE5vcm1hbCA9PiAiU2VydmljZSBTZXJ2aWNlTmFtZSIsCiAgICAgICAgTG9uZyAgID0+ICJTZXJ2aWNlIFBhcmVudFNlcnZpY2U6OlNlcnZpY2VOYW1lIiwKICAgICk7CgogICAgJURlc2NyaXB0aW9uID0gJExpbmtPYmplY3QtPk9iamVjdERlc2NyaXB0aW9uR2V0KAogICAgICAgIEtleSAgICAgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0RGVzY3JpcHRpb25HZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0IEtleSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTZXJ2aWNlU3RyZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6TGFuZ3VhZ2UnKS0+VHJhbnNsYXRlKCdTZXJ2aWNlJyk7CgogICAgIyBjcmVhdGUgZGVzY3JpcHRpb24KICAgIG15ICVEZXNjcmlwdGlvbiA9ICgKICAgICAgICBOb3JtYWwgPT4gJFNlcnZpY2VTdHJnLAogICAgICAgIExvbmcgICA9PiAkU2VydmljZVN0cmcsCiAgICApOwoKICAgIHJldHVybiAlRGVzY3JpcHRpb24gaWYgJFBhcmFte01vZGV9ICYmICRQYXJhbXtNb2RlfSBlcSAnVGVtcG9yYXJ5JzsKCiAgICAjIGdldCBzZXJ2aWNlCiAgICBteSAlU2VydmljZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VHZXQoCiAgICAgICAgU2VydmljZUlEICAgICA9PiAkUGFyYW17S2V5fSwKICAgICAgICBJbmNpZGVudFN0YXRlID0+IDAsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gaWYgISVTZXJ2aWNlOwoKICAgICMgY3JlYXRlIGRlc2NyaXB0aW9uCiAgICAlRGVzY3JpcHRpb24gPSAoCiAgICAgICAgTm9ybWFsID0+ICRTZXJ2aWNlU3RyZyAuICIgJyRTZXJ2aWNle05hbWVTaG9ydH0nIiwKICAgICAgICBMb25nICAgPT4gJFNlcnZpY2VTdHJnIC4gIiAnJFNlcnZpY2V7TmFtZX0nIiwKICAgICk7CgogICAgcmV0dXJuICVEZXNjcmlwdGlvbjsKfQoKPWhlYWQyIE9iamVjdFNlYXJjaCgpCgpyZXR1cm4gYSBoYXNoIGxpc3Qgb2YgdGhlIHNlYXJjaCByZXN1bHRzCgpSZXR1cm5zOgoKICAgICRTZWFyY2hMaXN0ID0gewogICAgICAgIE5PVExJTktFRCA9PiB7CiAgICAgICAgICAgIFNvdXJjZSA9PiB7CiAgICAgICAgICAgICAgICAxMiAgPT4gJERhdGFPZkl0ZW0xMiwKICAgICAgICAgICAgICAgIDIxMiA9PiAkRGF0YU9mSXRlbTIxMiwKICAgICAgICAgICAgICAgIDMzMiA9PiAkRGF0YU9mSXRlbTMzMiwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfTsKCiAgICAkU2VhcmNoTGlzdCA9ICRMaW5rT2JqZWN0QmFja2VuZC0+T2JqZWN0U2VhcmNoKAogICAgICAgIFNlYXJjaFBhcmFtcyA9PiAkSGFzaFJlZiwgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3RTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgcGFyYW1zCiAgICAkUGFyYW17U2VhcmNoUGFyYW1zfSB8fD0ge307CgogICAgIyBhZGQgd2lsZGNhcmRzCiAgICBteSAlU2VhcmNoOwogICAgaWYgKCAkUGFyYW17U2VhcmNoUGFyYW1zfS0+e05hbWV9ICkgewogICAgICAgICRTZWFyY2h7TmFtZX0gPSAnKicgLiAkUGFyYW17U2VhcmNoUGFyYW1zfS0+e05hbWV9IC4gJyonOwogICAgfQoKICAgICMgc2VhcmNoIHRoZSBzZXJ2aWNlcwogICAgbXkgQFNlcnZpY2VJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlU2VhcmNoKAogICAgICAgICV7ICRQYXJhbXtTZWFyY2hQYXJhbXN9IH0sCiAgICAgICAgJVNlYXJjaCwKICAgICAgICBMaW1pdCAgPT4gNTAsCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBteSAlU2VhcmNoTGlzdDsKICAgIFNFUlZJQ0VJRDoKICAgIGZvciBteSAkU2VydmljZUlEIChAU2VydmljZUlEcykgewoKICAgICAgICAjIGdldCBzZXJ2aWNlIGRhdGEKICAgICAgICBteSAlU2VydmljZURhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlR2V0KAogICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgIEluY2lkZW50U3RhdGUgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBuZXh0IFNFUlZJQ0VJRCBpZiAhJVNlcnZpY2VEYXRhOwoKICAgICAgICAjIGFkZCBzZXJ2aWNlIGRhdGEKICAgICAgICAkU2VhcmNoTGlzdHtOT1RMSU5LRUR9LT57U291cmNlfS0+eyRTZXJ2aWNlSUR9ID0gXCVTZXJ2aWNlRGF0YTsKICAgIH0KCiAgICByZXR1cm4gXCVTZWFyY2hMaXN0Owp9Cgo9aGVhZDIgTGlua0FkZFByZSgpCgpsaW5rIGFkZCBwcmUgZXZlbnQgbW9kdWxlCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZFByZSgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnU2VydmljZScsCiAgICAgICAgU291cmNlS2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZFByZSgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnU2VydmljZScsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtBZGRQcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMSBpZiAkUGFyYW17U3RhdGV9IGVxICdUZW1wb3JhcnknOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgTGlua0FkZFBvc3QoKQoKbGluayBhZGQgcHJlIGV2ZW50IG1vZHVsZQoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtBZGRQb3N0KAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICdTZXJ2aWNlJywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnU2VydmljZScsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtBZGRQb3N0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBUeXBlIFN0YXRlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDEgaWYgJFBhcmFte1N0YXRlfSBlcSAnVGVtcG9yYXJ5JzsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIExpbmtEZWxldGVQcmUoKQoKbGluayBkZWxldGUgcHJlIGV2ZW50IG1vZHVsZQoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtEZWxldGVQcmUoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ1NlcnZpY2UnLAogICAgICAgIFNvdXJjZUtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtEZWxldGVQcmUoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ1NlcnZpY2UnLAogICAgICAgIFRhcmdldEtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rRGVsZXRlUHJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBUeXBlIFN0YXRlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDEgaWYgJFBhcmFte1N0YXRlfSBlcSAnVGVtcG9yYXJ5JzsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIExpbmtEZWxldGVQb3N0KCkKCmxpbmsgZGVsZXRlIHBvc3QgZXZlbnQgbW9kdWxlCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0RlbGV0ZVBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ1NlcnZpY2UnLAogICAgICAgIFNvdXJjZUtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtEZWxldGVQb3N0KAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdTZXJ2aWNlJywKICAgICAgICBUYXJnZXRLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0RlbGV0ZVBvc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMSBpZiAkUGFyYW17U3RhdGV9IGVxICdUZW1wb3JhcnknOwoKICAgICMgdXBkYXRlIHRoZSBjdXJyZW50IGluY2lkZW50IHN0YXRlIHR5cGUgZnJvbSBDSXMgb2YgdGhlIHNlcnZpY2UKICAgICMgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGR5bmFtaWMgaW5jaWRlbnQgY2FsY3VsYXRpb24gaXMgcmVzZXQgYWZ0ZXIKICAgICMgdW5saW5raW5nIGEgQ0kgd2hpY2ggaGFzIGJlZW4gaW4gYW4gaW5jaWRlbnQgc3RhdGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VQcmVmZXJlbmNlc1NldCgKICAgICAgICBTZXJ2aWNlSUQgPT4gJFBhcmFte0tleX0sCiAgICAgICAgS2V5ICAgICAgID0+ICdDdXJJbmNpU3RhdGVUeXBlRnJvbUNJcycsCiAgICAgICAgVmFsdWUgICAgID0+ICcnLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9GT1JLIHByb2plY3QgKEw8aHR0cHM6Ly9vLWZvcmsuZGUvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNJUEFsbG9jYXRlLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IElUU01DSVBBbGxvY2F0ZS5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMzo1MSB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlIC0gQzxjcml0aWNhbGl0eT4sIGltcGFjdCBhbmQgcHJpb3JpdHkgYWxsb2NhdGlvbiBsaWIKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9Y3V0Cgo9aGVhZDIgbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRJVFNNQ0lQQWxsb2NhdGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIEFsbG9jYXRlTGlzdCgpCgpyZXR1cm4gYSB0d28gZGltZW5zaW9uYWwgaGFzaCByZWZlcmVuY2Ugb2YgYWxsb2NhdGlvbnMKCiAgICBteSAkTGlzdFJlZiA9ICRDSVBBbGxvY2F0ZU9iamVjdC0+QWxsb2NhdGVMaXN0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCkM8JExpc3RSZWY+IGlzIHNvbWV0aGluZyBsaWtlCgogICAgJExpc3RSZXQgPSB7CiAgICAgICAgJzMgbm9ybWFsJyA9PiB7CiAgICAgICAgICAgICcxIHZlcnkgbG93JyA9PiAxLAogICAgICAgICAgICAnMyBub3JtYWwnICAgPT4gMiwKICAgICAgICAgICAgJzQgaGlnaCcgICAgID0+IDMsCiAgICAgICAgfSwKICAgICAgICAnNSB2ZXJ5IGhpZ2gnID0+IHsKICAgICAgICAgICAgJzIgbG93JyAgICA9PiAzLAogICAgICAgICAgICAnMyBub3JtYWwnID0+IDQsCiAgICAgICAgICAgICc0IGhpZ2gnICAgPT4gNSwKICAgICAgICB9LAogICAgfTsKCm1lYW5pbmcgdGhhdCB0aGUgQzxDcml0aWNhbGl0eT4gJzMgbm9ybWFsJyBhbmQgdGhlIEltcGFjdCAnMSB2ZXJ5IGxvdycgc3VnZ2VzdCB0aGUgUHJpb3JpdHlJRCAnMScuCgo9Y3V0CgpzdWIgQWxsb2NhdGVMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgY3JpdGljYWxpdHksIGltcGFjdCwgcHJpb3JpdHlfaWQgRlJPTSBjaXBfYWxsb2NhdGUnLAogICAgKTsKCiAgICAjIHJlc3VsdCBsaXN0CiAgICBteSAlQWxsb2NhdGVEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQWxsb2NhdGVEYXRheyAkUm93WzFdIH17ICRSb3dbMF0gfSA9ICRSb3dbMl07CiAgICB9CgogICAgcmV0dXJuIFwlQWxsb2NhdGVEYXRhOwp9Cgo9aGVhZDIgQWxsb2NhdGVVcGRhdGUoKQoKdXBkYXRlIHRoZSBhbGxvY2F0aW9uIG9mIEM8Y3JpdGljYWxpdHk+LCBpbXBhY3QgYW5kIHByaW9yaXR5CgogICAgbXkgJFRydWUgPSAkQ0lQQWxsb2NhdGVPYmplY3QtPkFsbG9jYXRlVXBkYXRlKAogICAgICAgIEFsbG9jYXRlRGF0YSA9PiAkRGF0YVJlZiwgICMgMkQgaGFzaCByZWZlcmVuY2UKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQWxsb2NhdGVVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQWxsb2NhdGVEYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBhbGxvY2F0ZSBkYXRhIGlzIGEgaGFzaCByZWZlcmVuY2UKICAgIGlmICggcmVmICRQYXJhbXtBbGxvY2F0ZURhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0FsbG9jYXRlRGF0YSBtdXN0IGJlIGEgMkQgaGFzaCByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGFsbG9jYXRlIGRhdGEgaXMgYSAyRCBoYXNoIHJlZmVyZW5jZQogICAgSU1QQUNUOgogICAgZm9yIG15ICRJbXBhY3QgKCBzb3J0IGtleXMgJXsgJFBhcmFte0FsbG9jYXRlRGF0YX0gfSApIHsKCiAgICAgICAgbmV4dCBJTVBBQ1QgaWYgcmVmICRQYXJhbXtBbGxvY2F0ZURhdGF9LT57JEltcGFjdH0gZXEgJ0hBU0gnOwoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0FsbG9jYXRlRGF0YSBtdXN0IGJlIGEgMkQgaGFzaCByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBvbGQgYWxsb2NhdGlvbnMKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbyggU1FMID0+ICdERUxFVEUgRlJPTSBjaXBfYWxsb2NhdGUnICk7CgogICAgIyBpbnNlcnQgbmV3IGFsbG9jYXRpb25zCiAgICBmb3IgbXkgJEltcGFjdCAoIHNvcnQga2V5cyAleyAkUGFyYW17QWxsb2NhdGVEYXRhfSB9ICkgewoKICAgICAgICBmb3IgbXkgJENyaXRpY2FsaXR5ICggc29ydCBrZXlzICV7ICRQYXJhbXtBbGxvY2F0ZURhdGF9LT57JEltcGFjdH0gfSApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBwcmlvcml0eQogICAgICAgICAgICBteSAkUHJpb3JpdHlJRCA9ICRQYXJhbXtBbGxvY2F0ZURhdGF9LT57JEltcGFjdH0tPnskQ3JpdGljYWxpdHl9OwoKICAgICAgICAgICAgIyBpbnNlcnQgbmV3IGFsbG9jYXRpb24KICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjaXBfYWxsb2NhdGUgJwogICAgICAgICAgICAgICAgICAgIC4gJyhjcml0aWNhbGl0eSwgaW1wYWN0LCBwcmlvcml0eV9pZCwgJwogICAgICAgICAgICAgICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpIFZBTFVFUyAnCiAgICAgICAgICAgICAgICAgICAgLiAnKD8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgICAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgXCRDcml0aWNhbGl0eSwgXCRJbXBhY3QsIFwkUHJpb3JpdHlJRCwKICAgICAgICAgICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgUHJpb3JpdHlBbGxvY2F0aW9uR2V0KCkKCnJldHVybiB0aGUgcHJpb3JpdHkgaWQgb2YgYSBDPGNyaXRpY2FsaXR5PiBhbmQgYW4gaW1wYWN0CgogICAgbXkgJFByaW9yaXR5SUQgPSAkQ0lQQWxsb2NhdGVPYmplY3QtPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICBDcml0aWNhbGl0eSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgSW1wYWN0ICAgICAgPT4gJzMgbm9ybWFsJywKICAgICk7Cgo9Y3V0CgpzdWIgUHJpb3JpdHlBbGxvY2F0aW9uR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENyaXRpY2FsaXR5IEltcGFjdCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgcHJpb3JpdHkgaWQgZnJvbSBkYgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgcHJpb3JpdHlfaWQgRlJPTSBjaXBfYWxsb2NhdGUgJwogICAgICAgICAgICAuICdXSEVSRSBjcml0aWNhbGl0eSA9ID8gQU5EIGltcGFjdCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDcml0aWNhbGl0eX0sIFwkUGFyYW17SW1wYWN0fSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggcmVzdWx0CiAgICBteSAkUHJpb3JpdHlJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFByaW9yaXR5SUQgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkUHJpb3JpdHlJRDsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU2VydmljZS5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBTZXJ2aWNlLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEzOjUxIHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIChxdyg6YWxsKSk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcsCiMgLS0tCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UgLSBzZXJ2aWNlIGxpYgoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgc2VydmljZSBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnU2VydmljZSc7CiAgICAkU2VsZi0+e0NhY2hlVFRMfSAgPSA2MCAqIDYwICogMjQgKiAyMDsKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkIGZvciBJVFNNQ3JpdGljYWxpdHkKICAgIG15ICREeW5hbWljRmllbGRDb25maWdBcnJheVJlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsgJ1RpY2tldCcgXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiB7CiAgICAgICAgICAgIElUU01Dcml0aWNhbGl0eSA9PiAxLAogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZvciBJVFNNQ3JpdGljYWxpdHkKICAgIG15ICVQb3NzaWJsZVZhbHVlczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJER5bmFtaWNGaWVsZENvbmZpZ0FycmF5UmVmIH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICRQb3NzaWJsZVZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1Bvc3NpYmxlVmFsdWVzfSB8fCB7fTsKICAgIH0KCiAgICAjIHNldCB0aGUgY3JpdGljYWxpdHkgbGlzdAogICAgJFNlbGYtPntDcml0aWNhbGl0eUxpc3R9ID0gJFBvc3NpYmxlVmFsdWVze0lUU01Dcml0aWNhbGl0eX07CiMgLS0tCgogICAgIyBsb2FkIGdlbmVyYXRvciBwcmVmZXJlbmNlcyBtb2R1bGUKICAgIG15ICRHZW5lcmF0b3JNb2R1bGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NlcnZpY2U6OlByZWZlcmVuY2VzTW9kdWxlJykKICAgICAgICB8fCAnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U6OlByZWZlcmVuY2VzREInOwogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCRHZW5lcmF0b3JNb2R1bGUpICkgewogICAgICAgICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9ID0gJEdlbmVyYXRvck1vZHVsZS0+bmV3KCk7CiAgICB9CiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICRTZWxmLT57REJPYmplY3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CiMgLS0tCgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgU2VydmljZUxpc3QoKQoKcmV0dXJuIGEgaGFzaCBsaXN0IG9mIHNlcnZpY2VzCgogICAgbXkgJVNlcnZpY2VMaXN0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0KAogICAgICAgIFZhbGlkICA9PiAwLCAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgKDB8MSkKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VydmljZUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgdmFsaWQgcGFyYW0KICAgIGlmICggIWRlZmluZWQgJFBhcmFte1ZhbGlkfSApIHsKICAgICAgICAkUGFyYW17VmFsaWR9ID0gMTsKICAgIH0KCiAgICAjIHJlYWQgY2FjaGUKICAgIG15ICRDYWNoZUtleSA9ICdTZXJ2aWNlTGlzdDo6VmFsaWQ6OicgLiAkUGFyYW17VmFsaWR9OwoKICAgIGlmICggJFBhcmFte1ZhbGlkfSAmJiBkZWZpbmVkICRQYXJhbXtLZWVwQ2hpbGRyZW59ICYmICRQYXJhbXtLZWVwQ2hpbGRyZW59IGVxICcxJyApIHsKICAgICAgICAkQ2FjaGVLZXkgLj0gJzo6S2VlcENoaWxkcmVuOjonIC4gJFBhcmFte0tlZXBDaGlsZHJlbn07CiAgICB9CgogICAgbXkgJENhY2hlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gJXskQ2FjaGV9IGlmIHJlZiAkQ2FjaGUgZXEgJ0hBU0gnOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgbmFtZSwgdmFsaWRfaWQgRlJPTSBzZXJ2aWNlJywKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlU2VydmljZUxpc3Q7CiAgICBteSAlU2VydmljZVZhbGlkTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRTZXJ2aWNlTGlzdHsgJFJvd1swXSB9ICAgICAgPSAkUm93WzFdOwogICAgICAgICRTZXJ2aWNlVmFsaWRMaXN0eyAkUm93WzBdIH0gPSAkUm93WzJdOwogICAgfQoKICAgIGlmICggISRQYXJhbXtWYWxpZH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBcJVNlcnZpY2VMaXN0LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICVTZXJ2aWNlTGlzdCBpZiAhJFBhcmFte1ZhbGlkfTsKICAgIH0KCiAgICAjIGdldCB2YWxpZCBpZHMKICAgIG15IEBWYWxpZElEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZElEc0dldCgpOwoKICAgICMgZHVwbGljYXRlIHNlcnZpY2UgbGlzdAogICAgbXkgJVNlcnZpY2VMaXN0VG1wID0gJVNlcnZpY2VMaXN0OwoKICAgICMgYWRkIHN1ZmZpeCBmb3IgY29ycmVjdCBzb3J0aW5nCiAgICBmb3IgbXkgJFNlcnZpY2VJRCAoIHNvcnQga2V5cyAlU2VydmljZUxpc3RUbXAgKSB7CiAgICAgICAgJFNlcnZpY2VMaXN0VG1weyRTZXJ2aWNlSUR9IC49ICc6Oic7CiAgICB9CgogICAgbXkgJVNlcnZpY2VJbnZhbGlkTGlzdDsKICAgIFNFUlZJQ0VJRDoKICAgIGZvciBteSAkU2VydmljZUlEICggc29ydCB7ICRTZXJ2aWNlTGlzdFRtcHskYX0gY21wICRTZXJ2aWNlTGlzdFRtcHskYn0gfSBrZXlzICVTZXJ2aWNlTGlzdFRtcCApCiAgICB7CgogICAgICAgIG15ICRWYWxpZCA9IHNjYWxhciBncmVwIHsgJF8gZXEgJFNlcnZpY2VWYWxpZExpc3R7JFNlcnZpY2VJRH0gfSBAVmFsaWRJRHM7CgogICAgICAgIG5leHQgU0VSVklDRUlEIGlmICRWYWxpZDsKCiAgICAgICAgJFNlcnZpY2VJbnZhbGlkTGlzdHsgJFNlcnZpY2VMaXN0eyRTZXJ2aWNlSUR9IH0gPSAxOwogICAgICAgIGRlbGV0ZSAkU2VydmljZUxpc3R7JFNlcnZpY2VJRH07CiAgICB9CgogICAgIyBkZWxldGUgaW52YWxpZCBzZXJ2aWNlcyBhbmQgY2hpbGRyZW4KICAgIGlmICggIWRlZmluZWQgJFBhcmFte0tlZXBDaGlsZHJlbn0gfHwgISRQYXJhbXtLZWVwQ2hpbGRyZW59ICkgewogICAgICAgIGZvciBteSAkU2VydmljZUlEICggc29ydCBrZXlzICVTZXJ2aWNlTGlzdCApIHsKCiAgICAgICAgICAgIElOVkFMSUROQU1FOgogICAgICAgICAgICBmb3IgbXkgJEludmFsaWROYW1lICggc29ydCBrZXlzICVTZXJ2aWNlSW52YWxpZExpc3QgKSB7CgogICAgICAgICAgICAgICAgaWYgKCAkU2VydmljZUxpc3R7JFNlcnZpY2VJRH0gPX4gbXsgXEEgXFEkSW52YWxpZE5hbWVcRSA6OiB9eG1zICkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkU2VydmljZUxpc3R7JFNlcnZpY2VJRH07CiAgICAgICAgICAgICAgICAgICAgbGFzdCBJTlZBTElETkFNRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFwlU2VydmljZUxpc3QsCiAgICApOwoKICAgIHJldHVybiAlU2VydmljZUxpc3Q7Cn0KCj1oZWFkMiBTZXJ2aWNlTGlzdEdldCgpCgpyZXR1cm4gYSBsaXN0IG9mIHNlcnZpY2VzIHdpdGggdGhlIGNvbXBsZXRlIGxpc3Qgb2YgYXR0cmlidXRlcyBmb3IgZWFjaCBzZXJ2aWNlCgogICAgbXkgJFNlcnZpY2VMaXN0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0R2V0KAogICAgICAgIFZhbGlkICA9PiAwLCAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgKDB8MSkKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgcmV0dXJucwoKICAgICRTZXJ2aWNlTGlzdCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIFNlcnZpY2VJRCAgPT4gMSwKICAgICAgICAgICAgUGFyZW50SUQgICA9PiAwLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdNeVNlcnZpY2UnLAogICAgICAgICAgICBOYW1lU2hvcnQgID0+ICdNeVNlcnZpY2UnLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgPT4gJ1NvbWUgQ29tbWVudCcKICAgICAgICAgICAgQ3JlYXRlVGltZSA9PiAnMjAxMS0wMi0wOCAxNTowODowMCcsCiAgICAgICAgICAgIENoYW5nZVRpbWUgPT4gJzIwMTEtMDYtMTEgMTc6MjI6MDAnLAogICAgICAgICAgICBDcmVhdGVCeSAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICAgICAgID0+IDE2LAogICAgICAgICAgICBUeXBlICAgICAgICAgICAgID0+ICdCYWNrZW5kJywKICAgICAgICAgICAgQ3JpdGljYWxpdHkgICAgICA9PiAnMyBub3JtYWwnLAogICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+IDEsCiAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnb3BlcmF0aW9uYWwnLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBTZXJ2aWNlSUQgID0+IDIsCiAgICAgICAgICAgIFBhcmVudElEICAgPT4gMSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTXlTZXJ2aWNlOjpNeVN1YlNlcnZpY2UnLAogICAgICAgICAgICBOYW1lU2hvcnQgID0+ICdNeVN1YlNlcnZpY2UnLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgPT4gJ1NvbWUgQ29tbWVudCcKICAgICAgICAgICAgQ3JlYXRlVGltZSA9PiAnMjAxMS0wMi0wOCAxNTowODowMCcsCiAgICAgICAgICAgIENoYW5nZVRpbWUgPT4gJzIwMTEtMDYtMTEgMTc6MjI6MDAnLAogICAgICAgICAgICBDcmVhdGVCeSAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICAgICAgID0+IDE2LAogICAgICAgICAgICBUeXBlICAgICAgICAgICAgID0+ICdCYWNrZW5kJywKICAgICAgICAgICAgQ3JpdGljYWxpdHkgICAgICA9PiAnMyBub3JtYWwnLAogICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCAgID0+IDEsCiAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgICAgPT4gJ09wZXJhdGlvbmFsJywKICAgICAgICAgICAgQ3VySW5jaVN0YXRlVHlwZSA9PiAnb3BlcmF0aW9uYWwnLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgIyAuLi4KICAgIF07Cgo9Y3V0CgpzdWIgU2VydmljZUxpc3RHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgdmFsaWQgcGFyYW0KICAgIGlmICggIWRlZmluZWQgJFBhcmFte1ZhbGlkfSApIHsKICAgICAgICAkUGFyYW17VmFsaWR9ID0gMTsKICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlZCByZXN1bHRzCiAgICBteSAkQ2FjaGVLZXkgPSAnQ2FjaGU6OlNlcnZpY2VMaXN0R2V0OjpWYWxpZDo6JyAuICRQYXJhbXtWYWxpZH07CiAgICBteSAkQ2FjaGUgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKICAgIHJldHVybiAkQ2FjaGUgaWYgZGVmaW5lZCAkQ2FjaGU7CgogICAgIyBjcmVhdGUgU1FMIHF1ZXJ5CiAgICBteSAkU1FMID0gJ1NFTEVDVCBpZCwgbmFtZSwgdmFsaWRfaWQsIGNvbW1lbnRzLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5ICcKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgIC4gIiwgdHlwZV9pZCwgY3JpdGljYWxpdHkgIgojIC0tLQogICAgICAgIC4gJ0ZST00gc2VydmljZSc7CgogICAgaWYgKCAkUGFyYW17VmFsaWR9ICkgewogICAgICAgICRTUUwgLj0gJyBXSEVSRSB2YWxpZF9pZCBJTiAoJyAuIGpvaW4gJywgJywKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCkgLiAnKSc7CiAgICB9CgogICAgJFNRTCAuPSAnIE9SREVSIEJZIG5hbWUnOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJFNRTCwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAU2VydmljZUxpc3Q7CiAgICBteSAlU2VydmljZU5hbWUySUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBteSAlU2VydmljZURhdGE7CiAgICAgICAgJFNlcnZpY2VEYXRhe1NlcnZpY2VJRH0gID0gJFJvd1swXTsKICAgICAgICAkU2VydmljZURhdGF7TmFtZX0gICAgICAgPSAkUm93WzFdOwogICAgICAgICRTZXJ2aWNlRGF0YXtWYWxpZElEfSAgICA9ICRSb3dbMl07CiAgICAgICAgJFNlcnZpY2VEYXRhe0NvbW1lbnR9ICAgID0gJFJvd1szXSB8fCAnJzsKICAgICAgICAkU2VydmljZURhdGF7Q3JlYXRlVGltZX0gPSAkUm93WzRdOwogICAgICAgICRTZXJ2aWNlRGF0YXtDcmVhdGVCeX0gICA9ICRSb3dbNV07CiAgICAgICAgJFNlcnZpY2VEYXRhe0NoYW5nZVRpbWV9ID0gJFJvd1s2XTsKICAgICAgICAkU2VydmljZURhdGF7Q2hhbmdlQnl9ICAgPSAkUm93WzddOwojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgJFNlcnZpY2VEYXRhe1R5cGVJRH0gICAgICA9ICRSb3dbOF07CiAgICAgICAgJFNlcnZpY2VEYXRhe0NyaXRpY2FsaXR5fSA9ICRSb3dbOV0gfHwgJyc7CiMgLS0tCgogICAgICAgICMgYWRkIHNlcnZpY2UgZGF0YSB0byBzZXJ2aWNlIGxpc3QKICAgICAgICBwdXNoIEBTZXJ2aWNlTGlzdCwgXCVTZXJ2aWNlRGF0YTsKCiAgICAgICAgIyBidWlsZCBzZXJ2aWNlIGlkIGxvb2t1cCBoYXNoCiAgICAgICAgJFNlcnZpY2VOYW1lMklEeyAkU2VydmljZURhdGF7TmFtZX0gfSA9ICRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9OwogICAgfQoKICAgIGZvciBteSAkU2VydmljZURhdGEgKEBTZXJ2aWNlTGlzdCkgewoKICAgICAgICAjIGNyZWF0ZSBzaG9ydCBuYW1lIGFuZCBwYXJlbnRpZAogICAgICAgICRTZXJ2aWNlRGF0YS0+e05hbWVTaG9ydH0gPSAkU2VydmljZURhdGEtPntOYW1lfTsKICAgICAgICBpZiAoICRTZXJ2aWNlRGF0YS0+e05hbWV9ID1+IG17IFxBICguKikgOjogKC4rPykgXHogfXhtcyApIHsKICAgICAgICAgICAgbXkgJFBhcmVudE5hbWUgPSAkMTsKICAgICAgICAgICAgJFNlcnZpY2VEYXRhLT57TmFtZVNob3J0fSA9ICQyOwogICAgICAgICAgICAkU2VydmljZURhdGEtPntQYXJlbnRJRH0gID0gJFNlcnZpY2VOYW1lMklEeyRQYXJlbnROYW1lfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNlcnZpY2UgcHJlZmVyZW5jZXMKICAgICAgICBteSAlUHJlZmVyZW5jZXMgPSAkU2VsZi0+U2VydmljZVByZWZlcmVuY2VzR2V0KAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VEYXRhLT57U2VydmljZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIG1lcmdlIGhhc2gKICAgICAgICBpZiAoJVByZWZlcmVuY2VzKSB7CiAgICAgICAgICAgICV7JFNlcnZpY2VEYXRhfSA9ICggJXskU2VydmljZURhdGF9LCAlUHJlZmVyZW5jZXMgKTsKICAgICAgICB9CiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAjIGdldCBjdXJyZW50IGluY2lkZW50IHN0YXRlLCBjYWxjdWxhdGVkIGZyb20gcmVsYXRlZCBjb25maWcgaXRlbXMgYW5kIGNoaWxkIHNlcnZpY2VzCiAgICAgICAgbXkgJU5ld1NlcnZpY2VEYXRhID0gJFNlbGYtPl9TZXJ2aWNlR2V0Q3VycmVudEluY2lkZW50U3RhdGUoCiAgICAgICAgICAgIFNlcnZpY2VEYXRhID0+ICRTZXJ2aWNlRGF0YSwKICAgICAgICAgICAgUHJlZmVyZW5jZXMgPT4gXCVQcmVmZXJlbmNlcywKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkU2VydmljZURhdGEgPSBcJU5ld1NlcnZpY2VEYXRhOwojIC0tLQogICAgfQoKICAgIGlmIChAU2VydmljZUxpc3QpIHsKCiAgICAgICAgIyBzZXQgY2FjaGUKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFxAU2VydmljZUxpc3QsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gXEBTZXJ2aWNlTGlzdDsKfQoKPWhlYWQyIFNlcnZpY2VHZXQoKQoKcmV0dXJuIGEgc2VydmljZSBhcyBoYXNoCgpSZXR1cm4KICAgICRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9CiAgICAkU2VydmljZURhdGF7UGFyZW50SUR9CiAgICAkU2VydmljZURhdGF7TmFtZX0KICAgICRTZXJ2aWNlRGF0YXtOYW1lU2hvcnR9CiAgICAkU2VydmljZURhdGF7VmFsaWRJRH0KICAgICRTZXJ2aWNlRGF0YXtDb21tZW50fQogICAgJFNlcnZpY2VEYXRhe0NyZWF0ZVRpbWV9CiAgICAkU2VydmljZURhdGF7Q3JlYXRlQnl9CiAgICAkU2VydmljZURhdGF7Q2hhbmdlVGltZX0KICAgICRTZXJ2aWNlRGF0YXtDaGFuZ2VCeX0KIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgJFNlcnZpY2VEYXRhe1R5cGVJRH0KICAgICRTZXJ2aWNlRGF0YXtUeXBlfQogICAgJFNlcnZpY2VEYXRhe0NyaXRpY2FsaXR5fQogICAgJFNlcnZpY2VEYXRhe0N1ckluY2lTdGF0ZUlEfSAgICAjIE9ubHkgaWYgSW5jaWRlbnRTdGF0ZSBpcyAxCiAgICAkU2VydmljZURhdGF7Q3VySW5jaVN0YXRlfSAgICAgICMgT25seSBpZiBJbmNpZGVudFN0YXRlIGlzIDEKICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVUeXBlfSAgIyBPbmx5IGlmIEluY2lkZW50U3RhdGUgaXMgMQoKICAgIG15ICVTZXJ2aWNlRGF0YSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlR2V0KAogICAgICAgIFNlcnZpY2VJRCAgICAgPT4gMTIzLAogICAgICAgIEluY2lkZW50U3RhdGUgPT4gMSwgIyBPcHRpb25hbCwgcmV0dXJucyBDdXJJbmNpU3RhdGUgZXRjLgogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7CiMgLS0tCgogICAgbXkgJVNlcnZpY2VEYXRhID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VHZXQoCiAgICAgICAgU2VydmljZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgbXkgJVNlcnZpY2VEYXRhID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VHZXQoCiAgICAgICAgTmFtZSAgICA9PiAnU2VydmljZTo6U3ViU2VydmljZScsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBVc2VySUQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGVpdGhlciBTZXJ2aWNlSUQgb3IgTmFtZSBtdXN0IGJlIHBhc3NlZAogICAgaWYgKCAhJFBhcmFte1NlcnZpY2VJRH0gJiYgISRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgU2VydmljZUlEIG9yIE5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIHRoYXQgbm90IGJvdGggU2VydmljZUlEIGFuZCBOYW1lIGFyZSBnaXZlbgogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSAmJiAkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIGVpdGhlciBTZXJ2aWNlSUQgT1IgTmFtZSAtIG5vdCBib3RoIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb29rdXAgdGhlIFNlcnZpY2VJRAogICAgaWYgKCAkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgJFBhcmFte1NlcnZpY2VJRH0gPSAkU2VsZi0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlZCByZXN1bHRzCiAgICBteSAkQ2FjaGVLZXkgPSAnQ2FjaGU6OlNlcnZpY2VHZXQ6OicgLiAkUGFyYW17U2VydmljZUlEfTsKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgIyBhZGQgdGhlIEluY2lkZW50U3RhdGUgcGFyYW1ldGVyIHRvIHRoZSBjYWNoZSBrZXkKICAgICRQYXJhbXtJbmNpZGVudFN0YXRlfSB8fD0gMDsKICAgICRDYWNoZUtleSAuPSAnOjpJbmNpZGVudFN0YXRlOjonIC4gJFBhcmFte0luY2lkZW50U3RhdGV9OwojIC0tLQogICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gJXskQ2FjaGV9IGlmIHJlZiAkQ2FjaGUgZXEgJ0hBU0gnOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBnZXQgc2VydmljZSBmcm9tIGRiCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+CiAgICAgICAgICAgICdTRUxFQ1QgaWQsIG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSAnCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgLiAiLCB0eXBlX2lkLCBjcml0aWNhbGl0eSAiCiMgLS0tCiAgICAgICAgICAgIC4gJ0ZST00gc2VydmljZSBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlU2VydmljZURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkU2VydmljZURhdGF7U2VydmljZUlEfSAgPSAkUm93WzBdOwogICAgICAgICRTZXJ2aWNlRGF0YXtOYW1lfSAgICAgICA9ICRSb3dbMV07CiAgICAgICAgJFNlcnZpY2VEYXRhe1ZhbGlkSUR9ICAgID0gJFJvd1syXTsKICAgICAgICAkU2VydmljZURhdGF7Q29tbWVudH0gICAgPSAkUm93WzNdIHx8ICcnOwogICAgICAgICRTZXJ2aWNlRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbNF07CiAgICAgICAgJFNlcnZpY2VEYXRhe0NyZWF0ZUJ5fSAgID0gJFJvd1s1XTsKICAgICAgICAkU2VydmljZURhdGF7Q2hhbmdlVGltZX0gPSAkUm93WzZdOwogICAgICAgICRTZXJ2aWNlRGF0YXtDaGFuZ2VCeX0gICA9ICRSb3dbN107CiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAkU2VydmljZURhdGF7VHlwZUlEfSAgICAgID0gJFJvd1s4XTsKICAgICAgICAkU2VydmljZURhdGF7Q3JpdGljYWxpdHl9ID0gJFJvd1s5XSB8fCAnJzsKIyAtLS0KICAgIH0KCiAgICAjIGNoZWNrIHNlcnZpY2UKICAgIGlmICggISRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBTZXJ2aWNlSUQgKCRQYXJhbXtTZXJ2aWNlSUR9KSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHNob3J0IG5hbWUgYW5kIHBhcmVudGlkCiAgICAkU2VydmljZURhdGF7TmFtZVNob3J0fSA9ICRTZXJ2aWNlRGF0YXtOYW1lfTsKICAgIGlmICggJFNlcnZpY2VEYXRhe05hbWV9ID1+IG17IFxBICguKikgOjogKC4rPykgXHogfXhtcyApIHsKICAgICAgICAkU2VydmljZURhdGF7TmFtZVNob3J0fSA9ICQyOwoKICAgICAgICAjIGxvb2t1cCBwYXJlbnQKICAgICAgICBteSAkU2VydmljZUlEID0gJFNlbGYtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgICAgIE5hbWUgPT4gJDEsCiAgICAgICAgKTsKICAgICAgICAkU2VydmljZURhdGF7UGFyZW50SUR9ID0gJFNlcnZpY2VJRDsKICAgIH0KCiAgICAjIGdldCBzZXJ2aWNlIHByZWZlcmVuY2VzCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkU2VsZi0+U2VydmljZVByZWZlcmVuY2VzR2V0KAogICAgICAgIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSwKICAgICk7CgogICAgIyBtZXJnZSBoYXNoCiAgICBpZiAoJVByZWZlcmVuY2VzKSB7CiAgICAgICAgJVNlcnZpY2VEYXRhID0gKCAlU2VydmljZURhdGEsICVQcmVmZXJlbmNlcyApOwogICAgfQojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICBpZiAoICRQYXJhbXtJbmNpZGVudFN0YXRlfSApIHsKICAgICAgICAjIGdldCBjdXJyZW50IGluY2lkZW50IHN0YXRlLCBjYWxjdWxhdGVkIGZyb20gcmVsYXRlZCBjb25maWcgaXRlbXMgYW5kIGNoaWxkIHNlcnZpY2VzCiAgICAgICAgJVNlcnZpY2VEYXRhID0gJFNlbGYtPl9TZXJ2aWNlR2V0Q3VycmVudEluY2lkZW50U3RhdGUoCiAgICAgICAgICAgIFNlcnZpY2VEYXRhID0+IFwlU2VydmljZURhdGEsCiAgICAgICAgICAgIFByZWZlcmVuY2VzID0+IFwlUHJlZmVyZW5jZXMsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CiMgLS0tCgogICAgIyBzZXQgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBcJVNlcnZpY2VEYXRhLAogICAgKTsKCiAgICByZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZDIgU2VydmljZUxvb2t1cCgpCgpyZXR1cm4gYSBzZXJ2aWNlIG5hbWUgYW5kIGlkCgogICAgbXkgJFNlcnZpY2VOYW1lID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgU2VydmljZUlEID0+IDEyMywKICAgICk7CgogICAgb3IKCiAgICBteSAkU2VydmljZUlEID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgTmFtZSA9PiAnU2VydmljZTo6U3ViU2VydmljZScsCiAgICApOwoKPWN1dAoKc3ViIFNlcnZpY2VMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1NlcnZpY2VJRH0gJiYgISRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgU2VydmljZUlEIG9yIE5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewoKICAgICAgICAjIGNoZWNrIGNhY2hlCiAgICAgICAgbXkgJENhY2hlS2V5ID0gJ0NhY2hlOjpTZXJ2aWNlTG9va3VwOjpJRDo6JyAuICRQYXJhbXtTZXJ2aWNlSUR9OwogICAgICAgIG15ICRDYWNoZSAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkQ2FjaGUgaWYgZGVmaW5lZCAkQ2FjaGU7CgogICAgICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICAgICAjIGxvb2t1cAogICAgICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBuYW1lIEZST00gc2VydmljZSBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17U2VydmljZUlEfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICRSZXN1bHQgPSAnJzsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJFJlc3VsdCA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+ICRSZXN1bHQsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRSZXN1bHQ7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBjaGVjayBjYWNoZQogICAgICAgIG15ICRDYWNoZUtleSA9ICdDYWNoZTo6U2VydmljZUxvb2t1cDo6TmFtZTo6JyAuICRQYXJhbXtOYW1lfTsKICAgICAgICBteSAkQ2FjaGUgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJENhY2hlIGlmIGRlZmluZWQgJENhY2hlOwoKICAgICAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAgICAgIyBsb29rdXAKICAgICAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBzZXJ2aWNlIFdIRVJFIG5hbWUgPSA/JywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFJlc3VsdCA9ICcnOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkUmVzdWx0ID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gJFJlc3VsdCwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFJlc3VsdDsKICAgIH0KfQoKPWhlYWQyIFNlcnZpY2VBZGQoKQoKYWRkIGEgc2VydmljZQoKICAgIG15ICRTZXJ2aWNlSUQgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUFkZCgKICAgICAgICBOYW1lICAgICA9PiAnU2VydmljZSBOYW1lJywKICAgICAgICBQYXJlbnRJRCA9PiAxLCAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICBDb21tZW50ICA9PiAnQ29tbWVudCcsICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICBUeXBlSUQgICAgICA9PiAyLAogICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICApOwoKPWN1dAoKc3ViIFNlcnZpY2VBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgojIC0tLQojIElUU01Db3JlCiMgLS0tCiMgICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBWYWxpZElEIFVzZXJJRCkpIHsKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgVmFsaWRJRCBVc2VySUQgVHlwZUlEIENyaXRpY2FsaXR5KSkgewojIC0tLQogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBjb21tZW50CiAgICAkUGFyYW17Q29tbWVudH0gfHw9ICcnOwoKICAgICMgY2xlYW51cCBnaXZlbiBwYXJhbXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgQ29tbWVudCkpIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtJyktPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIHNlcnZpY2UgbmFtZQogICAgaWYgKCAkUGFyYW17TmFtZX0gPX4gbXsgOjogfXhtcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGFkZCBzZXJ2aWNlISBJbnZhbGlkIFNlcnZpY2UgbmFtZSAnJFBhcmFte05hbWV9JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIGZ1bGwgbmFtZQogICAgJFBhcmFte0Z1bGxOYW1lfSA9ICRQYXJhbXtOYW1lfTsKCiAgICAjIGdldCBwYXJlbnQgbmFtZQogICAgaWYgKCAkUGFyYW17UGFyZW50SUR9ICkgewogICAgICAgIG15ICRQYXJlbnROYW1lID0gJFNlbGYtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkUGFyYW17UGFyZW50SUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCRQYXJlbnROYW1lKSB7CiAgICAgICAgICAgICRQYXJhbXtGdWxsTmFtZX0gPSAkUGFyZW50TmFtZSAuICc6OicgLiAkUGFyYW17TmFtZX07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBmaW5kIGV4aXN0aW5nIHNlcnZpY2UKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gc2VydmljZSBXSEVSRSBuYW1lID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0Z1bGxOYW1lfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICRFeGlzdHM7CiAgICB3aGlsZSAoICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRFeGlzdHMgPSAxOwogICAgfQoKICAgICMgYWRkIHNlcnZpY2UgdG8gZGF0YWJhc2UKICAgIGlmICgkRXhpc3RzKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJBIHNlcnZpY2Ugd2l0aCB0aGUgbmFtZSBhbmQgcGFyZW50ICckUGFyYW17RnVsbE5hbWV9JyBhbHJlYWR5IGV4aXN0cy4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQojICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIHNlcnZpY2UgJwojICAgICAgICAgICAgLiAnKG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkgJwojICAgICAgICAgICAgLiAnVkFMVUVTICg/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKIyAgICAgICAgQmluZCA9PiBbCiMgICAgICAgICAgICBcJFBhcmFte0Z1bGxOYW1lfSwgXCRQYXJhbXtWYWxpZElEfSwgXCRQYXJhbXtDb21tZW50fSwKIyAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LAojICAgICAgICBdLAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gc2VydmljZSAnCiAgICAgICAgICAgIC4gJyhuYW1lLCB2YWxpZF9pZCwgY29tbWVudHMsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnksICcKICAgICAgICAgICAgLiAndHlwZV9pZCwgY3JpdGljYWxpdHkpICcKICAgICAgICAgICAgLiAnVkFMVUVTICg/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8sID8sID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtGdWxsTmFtZX0sIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1R5cGVJRH0sIFwkUGFyYW17Q3JpdGljYWxpdHl9LAogICAgICAgIF0sCiMgLS0tCiAgICApOwoKICAgICMgZ2V0IHNlcnZpY2UgaWQKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gc2VydmljZSBXSEVSRSBuYW1lID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0Z1bGxOYW1lfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwogICAgbXkgJFNlcnZpY2VJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRTZXJ2aWNlSUQgPSAkUm93WzBdOwogICAgfQoKICAgICMgcmVzZXQgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgKTsKCiAgICByZXR1cm4gJFNlcnZpY2VJRDsKfQoKPWhlYWQyIFNlcnZpY2VVcGRhdGUoKQoKdXBkYXRlIGFuIGV4aXN0aW5nIHNlcnZpY2UKCiAgICBteSAkVHJ1ZSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlVXBkYXRlKAogICAgICAgIFNlcnZpY2VJRCA9PiAxMjMsCiAgICAgICAgUGFyZW50SUQgID0+IDEsICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBOYW1lICAgICAgPT4gJ1NlcnZpY2UgTmFtZScsCiAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgQ29tbWVudCAgID0+ICdDb21tZW50JywgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICBUeXBlSUQgICAgICA9PiAyLAogICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICApOwoKPWN1dAoKc3ViIFNlcnZpY2VVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgojIC0tLQojIElUU01Db3JlCiMgLS0tCiMgICAgZm9yIG15ICRBcmd1bWVudCAocXcoU2VydmljZUlEIE5hbWUgVmFsaWRJRCBVc2VySUQpKSB7CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgTmFtZSBWYWxpZElEIFVzZXJJRCBUeXBlSUQgQ3JpdGljYWxpdHkpKSB7CiMgLS0tCiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgY29tbWVudAogICAgJFBhcmFte0NvbW1lbnR9IHx8PSAnJzsKCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIENvbW1lbnQpKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpLT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBzZXJ2aWNlIG5hbWUKICAgIGlmICggJFBhcmFte05hbWV9ID1+IG17IDo6IH14bXMgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCB1cGRhdGUgc2VydmljZSEgSW52YWxpZCBTZXJ2aWNlIG5hbWUgJyRQYXJhbXtOYW1lfSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBvbGQgbmFtZSBvZiBzZXJ2aWNlCiAgICBteSAkT2xkU2VydmljZU5hbWUgPSAkU2VsZi0+U2VydmljZUxvb2t1cCgKICAgICAgICBTZXJ2aWNlSUQgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICApOwoKICAgIGlmICggISRPbGRTZXJ2aWNlTmFtZSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IHVwZGF0ZSBzZXJ2aWNlISBTZXJ2aWNlICckUGFyYW17U2VydmljZUlEfScgZG9lcyBub3QgZXhpc3QuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBmdWxsIG5hbWUKICAgICRQYXJhbXtGdWxsTmFtZX0gPSAkUGFyYW17TmFtZX07CgogICAgIyBnZXQgcGFyZW50IG5hbWUKICAgIGlmICggJFBhcmFte1BhcmVudElEfSApIHsKCiAgICAgICAgIyBsb29rdXAgc2VydmljZQogICAgICAgIG15ICRQYXJlbnROYW1lID0gJFNlbGYtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkUGFyYW17UGFyZW50SUR9LAogICAgICAgICk7CgogICAgICAgIGlmICgkUGFyZW50TmFtZSkgewogICAgICAgICAgICAkUGFyYW17RnVsbE5hbWV9ID0gJFBhcmVudE5hbWUgLiAnOjonIC4gJFBhcmFte05hbWV9OwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjaywgaWYgc2VsZWN0ZWQgcGFyZW50IHdhcyBhIGNoaWxkIG9mIHRoaXMgc2VydmljZQogICAgICAgIGlmICggJFBhcmFte0Z1bGxOYW1lfSA9fiBteyBcQSAoIFxRJE9sZFNlcnZpY2VOYW1lXEUgKSA6OiB9eG1zICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ2FuXCd0IHVwZGF0ZSBzZXJ2aWNlISBJbnZhbGlkIHBhcmVudCB3YXMgc2VsZWN0ZWQuJwogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBmaW5kIGV4aXN0cyBzZXJ2aWNlCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIHNlcnZpY2UgV0hFUkUgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtGdWxsTmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKICAgIG15ICRFeGlzdHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9IG5lICRSb3dbMF0gKSB7CiAgICAgICAgICAgICRFeGlzdHMgPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIHVwZGF0ZSBzZXJ2aWNlCiAgICBpZiAoJEV4aXN0cykgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQSBzZXJ2aWNlIHdpdGggdGhlIG5hbWUgYW5kIHBhcmVudCAnJFBhcmFte0Z1bGxOYW1lfScgYWxyZWFkeSBleGlzdHMuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKCiAgICB9CgogICAgIyB1cGRhdGUgc2VydmljZQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAojIC0tLQojIElUU01Db3JlCiMgLS0tCiMgICAgICAgIFNRTCA9PiAnVVBEQVRFIHNlcnZpY2UgU0VUIG5hbWUgPSA/LCB2YWxpZF9pZCA9ID8sIGNvbW1lbnRzID0gPywgJwojICAgICAgICAgICAgLiAnIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8gV0hFUkUgaWQgPSA/JywKIyAgICAgICAgQmluZCA9PiBbCiMgICAgICAgICAgICBcJFBhcmFte0Z1bGxOYW1lfSwgXCRQYXJhbXtWYWxpZElEfSwgXCRQYXJhbXtDb21tZW50fSwKIyAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtTZXJ2aWNlSUR9LAojICAgICAgICBdLAogICAgICAgIFNRTCA9PiAnVVBEQVRFIHNlcnZpY2UgU0VUIG5hbWUgPSA/LCB2YWxpZF9pZCA9ID8sIGNvbW1lbnRzID0gPywgJwogICAgICAgICAgICAuICcgY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5ID0gPywgdHlwZV9pZCA9ID8sIGNyaXRpY2FsaXR5ID0gPycKICAgICAgICAgICAgLiAnIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17RnVsbE5hbWV9LCBcJFBhcmFte1ZhbGlkSUR9LCBcJFBhcmFte0NvbW1lbnR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17VHlwZUlEfSwgXCRQYXJhbXtDcml0aWNhbGl0eX0sIFwkUGFyYW17U2VydmljZUlEfSwKICAgICAgICBdLAojIC0tLQogICAgKTsKCiAgICBteSAkTGlrZVNlcnZpY2UgPSAkREJPYmplY3QtPlF1b3RlKCAkT2xkU2VydmljZU5hbWUsICdMaWtlJyApIC4gJzo6JSc7CgogICAgIyBmaW5kIGFsbCBjaGlsZHMKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICJTRUxFQ1QgaWQsIG5hbWUgRlJPTSBzZXJ2aWNlIFdIRVJFIG5hbWUgTElLRSA/IiwKICAgICAgICBCaW5kID0+IFsgXCRMaWtlU2VydmljZSBdLAogICAgKTsKCiAgICBteSBAQ2hpbGRzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbXkgJUNoaWxkOwogICAgICAgICRDaGlsZHtTZXJ2aWNlSUR9ID0gJFJvd1swXTsKICAgICAgICAkQ2hpbGR7TmFtZX0gICAgICA9ICRSb3dbMV07CiAgICAgICAgcHVzaCBAQ2hpbGRzLCBcJUNoaWxkOwogICAgfQoKICAgICMgdXBkYXRlIGNoaWxkcwogICAgZm9yIG15ICRDaGlsZCAoQENoaWxkcykgewogICAgICAgICRDaGlsZC0+e05hbWV9ID1+IHN7IFxBICggXFEkT2xkU2VydmljZU5hbWVcRSApIDo6IH17JFBhcmFte0Z1bGxOYW1lfTo6fXhtczsKICAgICAgICAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgID0+ICdVUERBVEUgc2VydmljZSBTRVQgbmFtZSA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkQ2hpbGQtPntOYW1lfSwgXCRDaGlsZC0+e1NlcnZpY2VJRH0gXSwKICAgICAgICApOwogICAgfQoKICAgICMgcmVzZXQgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIFNlcnZpY2VTZWFyY2goKQoKcmV0dXJuIHNlcnZpY2UgaWRzIGFzIGFuIGFycmF5CgogICAgbXkgQFNlcnZpY2VMaXN0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VTZWFyY2goCiAgICAgICAgTmFtZSAgID0+ICdTZXJ2aWNlIE5hbWUnLCAjIChvcHRpb25hbCkKICAgICAgICBMaW1pdCAgPT4gMTIyLCAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEwMDAKICAgICAgICBVc2VySUQgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgIFR5cGVJRHMgICAgICAgPT4gMiwKICAgICAgICBDcml0aWNhbGl0aWVzID0+IFsgJzIgbG93JywgJzMgbm9ybWFsJyBdLAojIC0tLQogICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IGxpbWl0CiAgICAkUGFyYW17TGltaXR9IHx8PSAxMDAwOwoKICAgICMgY3JlYXRlIHNxbCBxdWVyeQogICAgbXkgJFNRTAogICAgICAgID0gIlNFTEVDVCBpZCBGUk9NIHNlcnZpY2UgV0hFUkUgdmFsaWRfaWQgSU4gKCAke1woam9pbiAnLCAnLCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKSl9ICkiOwogICAgbXkgQEJpbmQ7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICBpZiAoICRQYXJhbXtOYW1lfSApIHsKCiAgICAgICAgIyBxdW90ZQogICAgICAgICRQYXJhbXtOYW1lfSA9ICREQk9iamVjdC0+UXVvdGUoICRQYXJhbXtOYW1lfSwgJ0xpa2UnICk7CgogICAgICAgICMgcmVwbGFjZSAqIHdpdGggJSBhbmQgY2xlYW4gdGhlIHN0cmluZwogICAgICAgICRQYXJhbXtOYW1lfSA9fiBzeyBcKisgfXslfXhtc2c7CiAgICAgICAgJFBhcmFte05hbWV9ID1+IHN7ICUrIH17JX14bXNnOwogICAgICAgIG15ICRMaWtlU3RyaW5nID0gJyUnIC4gJFBhcmFte05hbWV9IC4gJyUnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkTGlrZVN0cmluZzsKCiAgICAgICAgJFNRTCAuPSAiIEFORCBuYW1lIExJS0UgPyI7CiAgICB9CiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICMgYWRkIHR5cGUgaWRzCiAgICBpZiAoICRQYXJhbXtUeXBlSURzfSAmJiByZWYgJFBhcmFte1R5cGVJRHN9IGVxICdBUlJBWScgJiYgQHsgJFBhcmFte1R5cGVJRHN9IH0gKSB7CgogICAgICAgICMgcXVvdGUgYXMgaW50ZWdlcgogICAgICAgIGZvciBteSAkVHlwZUlEICggQHsgJFBhcmFte1R5cGVJRHN9IH0gKSB7CiAgICAgICAgICAgICRUeXBlSUQgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRUeXBlSUQsICdJbnRlZ2VyJyApOwogICAgICAgIH0KCiAgICAgICAgJFNRTCAuPSAiIEFORCB0eXBlX2lkIElOICgiIC4gam9pbignLCAnLCBAeyAkUGFyYW17VHlwZUlEc30gfSkgLiAiKSAiOwogICAgfQoKICAgICMgYWRkIGNyaXRpY2FsaXRpZXMKICAgIGlmICgkUGFyYW17Q3JpdGljYWxpdGllc30gJiYgcmVmICRQYXJhbXtDcml0aWNhbGl0aWVzfSBlcSAnQVJSQVknICYmIEB7ICRQYXJhbXtDcml0aWNhbGl0aWVzfSB9ICkgewoKICAgICAgICAjIHF1b3RlIGFuZCB3cmFwIGluIHNpbmdsZSBxdW90ZXMKICAgICAgICBmb3IgbXkgJENyaXRpY2FsaXR5ICggQHsgJFBhcmFte0NyaXRpY2FsaXRpZXN9IH0gKSB7CiAgICAgICAgICAgICRDcml0aWNhbGl0eSA9ICInIiAuICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJENyaXRpY2FsaXR5ICkgLiAiJyI7CiAgICAgICAgfQoKICAgICAgICAkU1FMIC49ICJBTkQgY3JpdGljYWxpdHkgSU4gKCIgLiBqb2luKCcsICcsIEB7ICRQYXJhbXtDcml0aWNhbGl0aWVzfSB9KSAuICIpICI7CiAgICB9CiMgLS0tCgogICAgJFNRTCAuPSAnIE9SREVSIEJZIG5hbWUnOwoKICAgICMgc2VhcmNoIHNlcnZpY2UgaW4gZGIKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15IEBTZXJ2aWNlTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQFNlcnZpY2VMaXN0LCAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiBAU2VydmljZUxpc3Q7Cn0KCj1oZWFkMiBDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgpCgpyZXR1cm5zIGEgbGlzdCBvZiBjdXN0b21lcnVzZXIvc2VydmljZSBtZW1iZXJzCgogICAgU2VydmljZUlEOiBzZXJ2aWNlIGlkCiAgICBDdXN0b21lclVzZXJMb2dpbjogY3VzdG9tZXIgdXNlciBsb2dpbgogICAgRGVmYXVsdFNlcnZpY2VzOiBhY3RpdmF0ZSBvciBkZWFjdGl2YXRlIGRlZmF1bHQgc2VydmljZXMKCiAgICBSZXN1bHQ6IEhBU0ggLT4gcmV0dXJucyBhIGhhc2ggb2Yga2V5ID0+IHNlcnZpY2UgaWQsIHZhbHVlID0+IHNlcnZpY2UgbmFtZQogICAgICAgICAgICBOYW1lIC0+IHJldHVybnMgYW4gYXJyYXkgb2YgdXNlciBuYW1lcwogICAgICAgICAgICBJRCAgIC0+IHJldHVybnMgYW4gYXJyYXkgb2YgdXNlciBpZHMKCiAgICBFeGFtcGxlIChnZXQgc2VydmljZXMgb2YgY3VzdG9tZXIgdXNlcik6CgogICAgJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICdUZXN0JywKICAgICAgICBSZXN1bHQgICAgICAgICAgICA9PiAnSEFTSCcsCiAgICAgICAgRGVmYXVsdFNlcnZpY2VzICAgPT4gMCwKICAgICk7CgogICAgRXhhbXBsZSAoZ2V0IGN1c3RvbWVyIHVzZXIgb2Ygc2VydmljZSk6CgogICAgJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgICAgIFNlcnZpY2VJRCA9PiAkSUQsCiAgICAgICAgUmVzdWx0ICAgID0+ICdIQVNIJywKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1Jlc3VsdH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFJlc3VsdCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgKG9ubHkgMSBvciAwIGlzIGFsbG93ZWQgdG8gY29ycmVjdGx5IHNldCB0aGUgY2FjaGUga2V5KQogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17RGVmYXVsdFNlcnZpY2VzfSB8fCAkUGFyYW17RGVmYXVsdFNlcnZpY2VzfSApIHsKICAgICAgICAkUGFyYW17RGVmYXVsdFNlcnZpY2VzfSA9IDE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17RGVmYXVsdFNlcnZpY2VzfSA9IDA7CiAgICB9CgogICAgIyBnZXQgb3B0aW9ucyBmb3IgZGVmYXVsdCBzZXJ2aWNlcyBmb3IgdW5rbm93biBjdXN0b21lcnMKICAgIG15ICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lcgogICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2U6OkRlZmF1bHQ6OlVua25vd25DdXN0b21lcicpOwogICAgaWYgKAogICAgICAgICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lcgogICAgICAgICYmICRQYXJhbXtEZWZhdWx0U2VydmljZXN9CiAgICAgICAgJiYgISRQYXJhbXtTZXJ2aWNlSUR9CiAgICAgICAgJiYgISRQYXJhbXtDdXN0b21lclVzZXJMb2dpbn0KICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufSA9ICc8REVGQVVMVD4nOwogICAgfQoKICAgICMgY2hlY2sgbW9yZSBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtTZXJ2aWNlSUR9ICYmICEkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBTZXJ2aWNlSUQgb3IgQ3VzdG9tZXJVc2VyTG9naW4hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBjYWNoZSBrZXkKICAgIG15ICRDYWNoZUtleSA9ICdDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdDo6JyAuICRQYXJhbXtSZXN1bHR9IC4gJzo6JwogICAgICAgIC4gJ0RlZmF1bHRTZXJ2aWNlczo6JyAuICRQYXJhbXtEZWZhdWx0U2VydmljZXN9IC4gJzo6JzsKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgJENhY2hlS2V5IC49ICdTZXJ2aWNlSUQ6OicgLiAkUGFyYW17U2VydmljZUlEfTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufSApIHsKICAgICAgICAkQ2FjaGVLZXkgLj0gJ0N1c3RvbWVyVXNlckxvZ2luOjonIC4gJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufTsKICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkQ2FjaGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKICAgIGlmICggJFBhcmFte1Jlc3VsdH0gZXEgJ0hBU0gnICkgewogICAgICAgIHJldHVybiAleyRDYWNoZX0gaWYgcmVmICRDYWNoZSBlcSAnSEFTSCc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gQHskQ2FjaGV9IGlmIHJlZiAkQ2FjaGUgZXEgJ0FSUkFZJzsKICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZGIgcXVvdGUKICAgIGZvciAoIHNvcnQga2V5cyAlUGFyYW0gKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICREQk9iamVjdC0+UXVvdGUoICRQYXJhbXskX30gKTsKICAgIH0KICAgIGZvciAocXcoU2VydmljZUlEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkREJPYmplY3QtPlF1b3RlKCAkUGFyYW17JF99LCAnSW50ZWdlcicgKTsKICAgIH0KCiAgICAjIHNxbAogICAgbXkgJURhdGE7CiAgICBteSBARGF0YTsKICAgIG15ICRTUUwgPSAnU0VMRUNUIHNjdS5zZXJ2aWNlX2lkLCBzY3UuY3VzdG9tZXJfdXNlcl9sb2dpbiwgcy5uYW1lICcKICAgICAgICAuICcgRlJPTSAnCiAgICAgICAgLiAnIHNlcnZpY2VfY3VzdG9tZXJfdXNlciBzY3UsIHNlcnZpY2UgcycKICAgICAgICAuICcgV0hFUkUgJwogICAgICAgIC4gIiBzLnZhbGlkX2lkIElOICggJHtcKGpvaW4gJywgJywgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCkpfSApIEFORCAiCiAgICAgICAgLiAnIHMuaWQgPSBzY3Uuc2VydmljZV9pZCBBTkQgJzsKCiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICRTUUwgLj0gIiBzY3Uuc2VydmljZV9pZCA9ICRQYXJhbXtTZXJ2aWNlSUR9IjsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufSApIHsKICAgICAgICAkU1FMIC49ICIgc2N1LmN1c3RvbWVyX3VzZXJfbG9naW4gPSAnJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufSciOwogICAgfQoKICAgICREQk9iamVjdC0+UHJlcGFyZSggU1FMID0+ICRTUUwgKTsKCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgbXkgJFZhbHVlID0gJyc7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgJERhdGF7ICRSb3dbMV0gfSA9ICRSb3dbMF07CiAgICAgICAgICAgICRWYWx1ZSA9ICRSb3dbMF07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRGF0YXsgJFJvd1swXSB9ID0gJFJvd1syXTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoCiAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufQogICAgICAgICYmICRQYXJhbXtDdXN0b21lclVzZXJMb2dpbn0gbmUgJzxERUZBVUxUPicKICAgICAgICAmJiAkUGFyYW17RGVmYXVsdFNlcnZpY2VzfQogICAgICAgICYmICFrZXlzKCVEYXRhKQogICAgICAgICkKICAgIHsKICAgICAgICAlRGF0YSA9ICRTZWxmLT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJzxERUZBVUxUPicsCiAgICAgICAgICAgIFJlc3VsdCAgICAgICAgICAgID0+ICdIQVNIJywKICAgICAgICAgICAgRGVmYXVsdFNlcnZpY2VzICAgPT4gMCwKICAgICAgICApOwogICAgfQoKICAgICMgcmV0dXJuIHJlc3VsdAogICAgaWYgKCAkUGFyYW17UmVzdWx0fSBlcSAnSEFTSCcgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBcJURhdGEsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJURhdGE7CiAgICB9CiAgICBpZiAoICRQYXJhbXtSZXN1bHR9IGVxICdOYW1lJyApIHsKICAgICAgICBARGF0YSA9IHZhbHVlcyAlRGF0YTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIEBEYXRhID0ga2V5cyAlRGF0YTsKICAgIH0KICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBcQERhdGEsCiAgICApOwogICAgcmV0dXJuIEBEYXRhOwp9Cgo9aGVhZDIgQ3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckFkZCgpCgp0byBhZGQgYSBtZW1iZXIgdG8gYSBzZXJ2aWNlCgppZiAnQWN0aXZlJyBpcyAwLCB0aGUgY3VzdG9tZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzZXJ2aWNlCgogICAgJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICAgICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJ1Rlc3QxJywKICAgICAgICBTZXJ2aWNlSUQgICAgICAgICA9PiA2LAogICAgICAgIEFjdGl2ZSAgICAgICAgICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEN1c3RvbWVyVXNlckxvZ2luIFNlcnZpY2VJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkZWxldGUgZXhpc3RpbmcgcmVsYXRpb24KICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBzZXJ2aWNlX2N1c3RvbWVyX3VzZXIgV0hFUkUgY3VzdG9tZXJfdXNlcl9sb2dpbiA9ID8gQU5EIHNlcnZpY2VfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDdXN0b21lclVzZXJMb2dpbn0sIFwkUGFyYW17U2VydmljZUlEfSBdLAogICAgKTsKCiAgICAjIHJldHVybiBpZiByZWxhdGlvbiBpcyBub3QgYWN0aXZlCiAgICBpZiAoICEkUGFyYW17QWN0aXZlfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBpbnNlcnQgbmV3IHJlbGF0aW9uCiAgICBteSAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBzZXJ2aWNlX2N1c3RvbWVyX3VzZXIgJwogICAgICAgICAgICAuICcoY3VzdG9tZXJfdXNlcl9sb2dpbiwgc2VydmljZV9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSkgJwogICAgICAgICAgICAuICdWQUxVRVMgKD8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59LCBcJFBhcmFte1NlcnZpY2VJRH0sIFwkUGFyYW17VXNlcklEfSBdCiAgICApOwoKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgKTsKCiAgICByZXR1cm4gJFN1Y2Nlc3M7Cn0KCj1oZWFkMiBTZXJ2aWNlUHJlZmVyZW5jZXNTZXQoKQoKc2V0IHNlcnZpY2UgcHJlZmVyZW5jZXMKCiAgICAkU2VydmljZU9iamVjdC0+U2VydmljZVByZWZlcmVuY2VzU2V0KAogICAgICAgIFNlcnZpY2VJRCA9PiAxMjMsCiAgICAgICAgS2V5ICAgICAgID0+ICdVc2VyQ29tbWVudCcsCiAgICAgICAgVmFsdWUgICAgID0+ICdzb21lIGNvbW1lbnQnLAogICAgICAgIFVzZXJJRCAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFNlcnZpY2VQcmVmZXJlbmNlc1NldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5TZXJ2aWNlUHJlZmVyZW5jZXNTZXQoJVBhcmFtKTsKCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICk7CiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIFNlcnZpY2VQcmVmZXJlbmNlc0dldCgpCgpnZXQgc2VydmljZSBwcmVmZXJlbmNlcwoKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlUHJlZmVyZW5jZXNHZXQoCiAgICAgICAgU2VydmljZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlUHJlZmVyZW5jZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPlNlcnZpY2VQcmVmZXJlbmNlc0dldCglUGFyYW0pOwp9Cgo9aGVhZDIgU2VydmljZVBhcmVudHNHZXQoKQoKcmV0dXJuIGFuIG9yZGVyZWQgbGlzdCBhbGwgcGFyZW50IHNlcnZpY2UgSURzIGZvciB0aGUgZ2l2ZW4gc2VydmljZSBmcm9tIHRoZSByb290IHBhcmVudCB0byB0aGUKY3VycmVudCBzZXJ2aWNlIHBhcmVudAoKICAgIG15ICRTZXJ2aWNlUGFyZW50c0xpc3QgPSAkU2VydmljZU9iamVjdC0+U2VydmljZVBhcmVudHNHZXQoCiAgICAgICAgU2VydmljZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgcmV0dXJucwoKICAgICRTZXJ2aWNlUGFyZW50c0xpc3QgPSBbIDEsIDIsIC4uLl07Cgo9Y3V0CgpzdWIgU2VydmljZVBhcmVudHNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFVzZXJJRCBTZXJ2aWNlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCAkTmVlZGVkIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyByZWFkIGNhY2hlCiAgICBteSAkQ2FjaGVLZXkgPSAnU2VydmljZVBhcmVudHNHZXQ6OicgLiAkUGFyYW17U2VydmljZUlEfTsKICAgIG15ICRDYWNoZSAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwogICAgcmV0dXJuICRDYWNoZSBpZiByZWYgJENhY2hlOwoKICAgICMgZ2V0IHRoZSBsaXN0IG9mIHNlcnZpY2VzCiAgICBteSAkU2VydmljZUxpc3QgPSAkU2VsZi0+U2VydmljZUxpc3RHZXQoCiAgICAgICAgVmFsaWQgID0+IDAsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGEgc2VydmljZSBsb29rdXAgdGFibGUKICAgIG15ICVTZXJ2aWNlTG9va3VwOwogICAgU0VSVklDRToKICAgIGZvciBteSAkU2VydmljZURhdGEgKCBAeyRTZXJ2aWNlTGlzdH0gKSB7CiAgICAgICAgbmV4dCBTRVJWSUNFIGlmICEkU2VydmljZURhdGE7CiAgICAgICAgbmV4dCBTRVJWSUNFIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkU2VydmljZURhdGEpOwogICAgICAgIG5leHQgU0VSVklDRSBpZiAhJFNlcnZpY2VEYXRhLT57U2VydmljZUlEfTsKCiAgICAgICAgJFNlcnZpY2VMb29rdXB7ICRTZXJ2aWNlRGF0YS0+e1NlcnZpY2VJRH0gfSA9ICRTZXJ2aWNlRGF0YTsKICAgIH0KCiAgICAjIGV4aXQgaWYgU2VydmljZUlEIGlzIGludmFsaWQKICAgIHJldHVybiBpZiAhJFNlcnZpY2VMb29rdXB7ICRQYXJhbXtTZXJ2aWNlSUR9IH07CgogICAgIyB0byBzdG9yZSB0aGUgcmV0dXJuIHN0cnVjdHVyZQogICAgbXkgQFNlcnZpY2VQYXJlbnRzOwoKICAgICMgZ2V0IHRoZSBTZXJ2aWNlUGFyZW50SUQgZnJvbSB0aGUgcmVxdWVzdGVkIHNlcnZpY2UKICAgIG15ICRTZXJ2aWNlUGFyZW50SUQgPSAkU2VydmljZUxvb2t1cHsgJFBhcmFte1NlcnZpY2VJRH0gfS0+e1BhcmVudElEfTsKCiAgICAjIGdldCBhbGwgcGFydGVudHMgZm9yIHRoZSByZXF1ZXN0ZWQgc2VydmljZQogICAgd2hpbGUgKCRTZXJ2aWNlUGFyZW50SUQpIHsKCiAgICAgICAgIyBhZGQgc2VydmljZSBwYXJlbnQgSUQgdG8gdGhlIHJldHVybiBzdHJ1Y3R1cmUKICAgICAgICBwdXNoIEBTZXJ2aWNlUGFyZW50cywgJFNlcnZpY2VQYXJlbnRJRDsKCiAgICAgICAgIyBzZXQgbmV4dCBTZXJ2aWNlUGFyZW50SUQgKHRoZSBwYXJlbnQgb2YgdGhlIGN1cnJlbnQgcGFyZW50KQogICAgICAgICRTZXJ2aWNlUGFyZW50SUQgPSAkU2VydmljZUxvb2t1cHskU2VydmljZVBhcmVudElEfS0+e1BhcmVudElEfSB8fCAwOwoKICAgIH0KCiAgICAjIHJldmVyc2UgdGhlIHJldHVybiBhcnJheSB0byBnZXQgdGhlIGxpc3Qgb3JkZXJlZCBmcm9tIG9sZCB0byB5b3VuZyAoaW4gcGFyZW50IGNvbnRleHQpCiAgICBteSBARGF0YSA9IHJldmVyc2UgQFNlcnZpY2VQYXJlbnRzOwoKICAgICMgc2V0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXEBEYXRhLAogICAgKTsKCiAgICByZXR1cm4gXEBEYXRhOwp9Cgo9aGVhZDIgR2V0QWxsQ3VzdG9tU2VydmljZXMoKQoKZ2V0IGFsbCBjdXN0b20gc2VydmljZXMgb2Ygb25lIHVzZXIKCiAgICBteSBAU2VydmljZXMgPSAkU2VydmljZU9iamVjdC0+R2V0QWxsQ3VzdG9tU2VydmljZXMoIFVzZXJJRCA9PiAxMjMgKTsKCj1jdXQKCnN1YiBHZXRBbGxDdXN0b21TZXJ2aWNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJENhY2hlS2V5ID0gJ0dldEFsbEN1c3RvbVNlcnZpY2VzOjonIC4gJFBhcmFte1VzZXJJRH07CiAgICBteSAkQ2FjaGUgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKCiAgICByZXR1cm4gQHskQ2FjaGV9IGlmICRDYWNoZTsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgc2VhcmNoIGFsbCBjdXN0b20gc2VydmljZXMKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCBzZXJ2aWNlX2lkCiAgICAgICAgICAgIEZST00gcGVyc29uYWxfc2VydmljZXMKICAgICAgICAgICAgV0hFUkUgdXNlcl9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1VzZXJJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAU2VydmljZUlEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQFNlcnZpY2VJRHMsICRSb3dbMF07CiAgICB9CgogICAgIyBzZXQgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBcQFNlcnZpY2VJRHMsCiAgICApOwoKICAgIHJldHVybiBAU2VydmljZUlEczsKfQojIC0tLQojIElUU01Db3JlCiMgLS0tCgo9aGVhZDIgX1NlcnZpY2VHZXRDdXJyZW50SW5jaWRlbnRTdGF0ZSgpCgpSZXR1cm5zIGEgaGFzaCB3aXRoIHRoZSBvcmlnaW5hbCBzZXJ2aWNlIGRhdGEsCmVuaGFuY2VkIHdpdGggYWRkaXRpb25hbCBzZXJ2aWNlIGRhdGEgYWJvdXQgdGhlIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUsCmJhc2VkIG9uIGNvbmZpZ3VyYXRpb24gaXRlbXMgYW5kIG90aGVyIHNlcnZpY2VzLgoKICAgICVTZXJ2aWNlRGF0YSA9ICRTZXJ2aWNlT2JqZWN0LT5fU2VydmljZUdldEN1cnJlbnRJbmNpZGVudFN0YXRlKAogICAgICAgIFNlcnZpY2VEYXRhID0+IFwlU2VydmljZURhdGEsCiAgICAgICAgUHJlZmVyZW5jZXMgPT4gXCVQcmVmZXJlbmNlcywKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfU2VydmljZUdldEN1cnJlbnRJbmNpZGVudFN0YXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFNlcnZpY2VEYXRhIFByZWZlcmVuY2VzIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFNlcnZpY2VEYXRhIFByZWZlcmVuY2VzKSkgewogICAgICAgIGlmICggcmVmICRQYXJhbXskQXJndW1lbnR9IG5lICdIQVNIJyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRBcmd1bWVudCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIG1ha2UgbG9jYWwgY29waWVzCiAgICBteSAlU2VydmljZURhdGEgPSAleyAkUGFyYW17U2VydmljZURhdGF9IH07CiAgICBteSAlUHJlZmVyZW5jZXMgPSAleyAkUGFyYW17UHJlZmVyZW5jZXN9IH07CgogICAgIyBnZXQgc2VydmljZSB0eXBlIGxpc3QKICAgIG15ICRTZXJ2aWNlVHlwZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAogICAgKTsKICAgICRTZXJ2aWNlRGF0YXtUeXBlfSA9ICRTZXJ2aWNlVHlwZUxpc3QtPnsgJFNlcnZpY2VEYXRhe1R5cGVJRH0gfSB8fCAnJzsKCiAgICAjIHNldCBkZWZhdWx0IGluY2lkZW50IHN0YXRlIHR5cGUKICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVUeXBlfSA9ICdvcGVyYXRpb25hbCc7CgogICAgIyBnZXQgSVRTTSBtb2R1bGUgZGlyZWN0b3J5CiAgICBteSAkQ29uZmlnSXRlbU1vZHVsZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSG9tZScpIC4gJy9LZXJuZWwvU3lzdGVtL0lUU01Db25maWdJdGVtLnBtJzsKCiAgICAjIGNoZWNrIGlmIElUU01Db25maWd1cmF0aW9uTWFuYWdlbWVudCBwYWNrYWdlIGlzIGluc3RhbGxlZAogICAgaWYgKCAtZSAkQ29uZmlnSXRlbU1vZHVsZSApIHsKCiAgICAgICAgIyBjaGVjayBpZiBhIHByZWZlcmVuY2Ugc2V0dGluZyBmb3IgQ3VySW5jaVN0YXRlVHlwZUZyb21DSXMgZXhpc3RzCiAgICAgICAgaWYgKCAkUHJlZmVyZW5jZXN7Q3VySW5jaVN0YXRlVHlwZUZyb21DSXN9ICkgewoKICAgICAgICAgICAgIyBzZXQgZGVmYXVsdCBpbmNpZGVudCBzdGF0ZSB0eXBlIGZyb20gc2VydmljZSBwcmVmZXJlbmNlcyAnQ3VySW5jaVN0YXRlVHlwZUZyb21DSXMnCiAgICAgICAgICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVUeXBlfSA9ICRQcmVmZXJlbmNlc3tDdXJJbmNpU3RhdGVUeXBlRnJvbUNJc307CiAgICAgICAgfQoKICAgICAgICAjIHNldCB0aGUgcHJlZmVyZW5jZXMgc2V0dGluZyBmb3IgQ3VySW5jaVN0YXRlVHlwZUZyb21DSXMKICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgZ2V0IGluY2lkZW50IGxpbmsgdHlwZXMgYW5kIGRpcmVjdGlvbnMgZnJvbSBjb25maWcKICAgICAgICAgICAgbXkgJEluY2lkZW50TGlua1R5cGVEaXJlY3Rpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0lUU006OkNvcmU6OkluY2lkZW50TGlua1R5cGVEaXJlY3Rpb24nKTsKCiAgICAgICAgICAgICMgdG8gc3RvcmUgYWxsIGxpbmtlZCBjb25maWcgaXRlbSBpZHMgb2YgdGhpcyBzZXJ2aWNlIChmb3IgYWxsIGNvbmZpZ3VyZWQgbGluayB0eXBlcykKICAgICAgICAgICAgbXkgJUFsbExpbmtlZENvbmZpZ0l0ZW1JRHM7CgogICAgICAgICAgICBMSU5LVFlQRToKICAgICAgICAgICAgZm9yIG15ICRMaW5rVHlwZSAoIHNvcnQga2V5cyAleyAkSW5jaWRlbnRMaW5rVHlwZURpcmVjdGlvbiB9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBkaXJlY3Rpb24KICAgICAgICAgICAgICAgIG15ICRMaW5rRGlyZWN0aW9uID0gJEluY2lkZW50TGlua1R5cGVEaXJlY3Rpb24tPnskTGlua1R5cGV9OwoKICAgICAgICAgICAgICAgICMgcmV2ZXJzZSB0aGUgbGluayBkaXJlY3Rpb24sIGFzIHRoaXMgaXMgdGhlIHBlcnNwZWN0aXZlIGZyb20gdGhlIHNlcnZpY2UKICAgICAgICAgICAgICAgICMgbm8gbmVlZCB0byByZXZlcnNlIGlmIGRpcmVjdGlvbiBpcyAnQm90aCcKICAgICAgICAgICAgICAgIGlmICggJExpbmtEaXJlY3Rpb24gZXEgJ1NvdXJjZScgKSB7CiAgICAgICAgICAgICAgICAgICAgJExpbmtEaXJlY3Rpb24gPSAnVGFyZ2V0JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJExpbmtEaXJlY3Rpb24gZXEgJ1RhcmdldCcgKSB7CiAgICAgICAgICAgICAgICAgICAgJExpbmtEaXJlY3Rpb24gPSAnU291cmNlJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGZpbmQgYWxsIGxpbmtlZCBjb25maWcgaXRlbXMgd2l0aCB0aGlzIGxpbmt0eXBlIGFuZCBkaXJlY3Rpb24KICAgICAgICAgICAgICAgIG15ICVMaW5rZWRDb25maWdJdGVtSURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0tleUxpc3RXaXRoRGF0YSgKICAgICAgICAgICAgICAgICAgICBPYmplY3QxICAgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICAgICAgICAgIEtleTEgICAgICA9PiAkU2VydmljZURhdGF7U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBPYmplY3QyICAgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJExpbmtUeXBlLAogICAgICAgICAgICAgICAgICAgIERpcmVjdGlvbiA9PiAkTGlua0RpcmVjdGlvbiwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0aGUgbGlua2VkIGNvbmZpZyBpdGVtcwogICAgICAgICAgICAgICAgJUFsbExpbmtlZENvbmZpZ0l0ZW1JRHMgPSAoICVBbGxMaW5rZWRDb25maWdJdGVtSURzLCAlTGlua2VkQ29uZmlnSXRlbUlEcyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaW52ZXN0aWdhdGUgdGhlIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgb2YgZWFjaCBjb25maWcgaXRlbQogICAgICAgICAgICBDT05GSUdJVEVNSUQ6CiAgICAgICAgICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICggc29ydCBrZXlzICVBbGxMaW5rZWRDb25maWdJdGVtSURzICkgewoKICAgICAgICAgICAgICAgICMgZXh0cmFjdCBjb25maWcgaXRlbSBkYXRhCiAgICAgICAgICAgICAgICBteSAkQ29uZmlnSXRlbURhdGEgPSAkQWxsTGlua2VkQ29uZmlnSXRlbUlEc3skQ29uZmlnSXRlbUlEfTsKCiAgICAgICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAkQ29uZmlnSXRlbURhdGEtPntDdXJEZXBsU3RhdGVUeXBlfSBuZSAncHJvZHVjdGl2ZSc7CiAgICAgICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAkQ29uZmlnSXRlbURhdGEtPntDdXJJbmNpU3RhdGVUeXBlfSBlcSAnb3BlcmF0aW9uYWwnOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgc2VydmljZSBtdXN0IGJlIHNldCB0byAnd2FybmluZycKICAgICAgICAgICAgICAgIGlmICggJENvbmZpZ0l0ZW1EYXRhLT57Q3VySW5jaVN0YXRlVHlwZX0gZXEgJ3dhcm5pbmcnICkgewogICAgICAgICAgICAgICAgICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVUeXBlfSA9ICd3YXJuaW5nJzsKICAgICAgICAgICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIHNlcnZpY2UgbXVzdCBiZSBzZXQgdG8gJ2luY2lkZW50JwogICAgICAgICAgICAgICAgaWYgKCAkQ29uZmlnSXRlbURhdGEtPntDdXJJbmNpU3RhdGVUeXBlfSBlcSAnaW5jaWRlbnQnICkgewogICAgICAgICAgICAgICAgICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVUeXBlfSA9ICdpbmNpZGVudCc7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBDT05GSUdJVEVNSUQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdXBkYXRlIHRoZSBjdXJyZW50IGluY2lkZW50IHN0YXRlIHR5cGUgZnJvbSBDSXMgb2YgdGhlIHNlcnZpY2UKICAgICAgICAgICAgJFNlbGYtPlNlcnZpY2VQcmVmZXJlbmNlc1NldCgKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZURhdGF7U2VydmljZUlEfSwKICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAnQ3VySW5jaVN0YXRlVHlwZUZyb21DSXMnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVUeXBlfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgdGhlIHByZWZlcmVuY2VzIGxvY2FsbHkKICAgICAgICAgICAgJFByZWZlcmVuY2Vze0N1ckluY2lTdGF0ZVR5cGVGcm9tQ0lzfSA9ICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVUeXBlfTsKICAgICAgICB9CiAgICB9CgogICAgIyBpbnZlc3RpZ2F0ZSB0aGUgc3RhdGUgb2YgYWxsIGNoaWxkIHNlcnZpY2VzCiAgICBpZiAoICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVUeXBlfSBlcSAnb3BlcmF0aW9uYWwnICkgewoKICAgICAgICAjIGNyZWF0ZSB0aGUgdmFsaWQgc3RyaW5nCiAgICAgICAgbXkgJFZhbGlkSURTdHJpbmcgPSBqb2luIHF7LCB9LCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKTsKCiAgICAgICAgIyBwcmVwYXJlIG5hbWUKICAgICAgICBteSAkTmFtZSA9ICRTZXJ2aWNlRGF0YXtOYW1lfTsKICAgICAgICAkTmFtZSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJE5hbWUsICdMaWtlJyApOwoKICAgICAgICAjIGdldCBsaXN0IG9mIGFsbCB2YWxpZCBjaGlsZHMKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQsIG5hbWUgRlJPTSBzZXJ2aWNlICIKICAgICAgICAgICAgICAgIC4gIldIRVJFIG5hbWUgTElLRSAnIiAuICROYW1lIC4gIjo6JScgIgogICAgICAgICAgICAgICAgLiAiQU5EIHZhbGlkX2lkIElOICgiIC4gJFZhbGlkSURTdHJpbmcgLiAiKSIsCiAgICAgICAgKTsKCiAgICAgICAgIyBmaW5kIGxlbmd0aCBvZiBjaGlsZHMgcHJlZml4CiAgICAgICAgbXkgJFByZWZpeExlbmd0aCA9IGxlbmd0aCAiJFNlcnZpY2VEYXRhe05hbWV9OjoiOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSBAQ2hpbGRJRHM7CiAgICAgICAgUk9XOgogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICAgICAjIGV4dHJhY3QgY2hpbGQgcGFydAogICAgICAgICAgICBteSAkQ2hpbGRQYXJ0ID0gc3Vic3RyICRSb3dbMV0sICRQcmVmaXhMZW5ndGg7CgogICAgICAgICAgICBuZXh0IFJPVyBpZiAkQ2hpbGRQYXJ0ID1+IG17IDo6IH14bXM7CgogICAgICAgICAgICBwdXNoIEBDaGlsZElEcywgJFJvd1swXTsKICAgICAgICB9CgogICAgICAgIFNFUlZJQ0VJRDoKICAgICAgICBmb3IgbXkgJFNlcnZpY2VJRCAoIEBDaGlsZElEcyApIHsKCiAgICAgICAgICAgICMgZ2V0IGRhdGEgb2YgY2hpbGQgc2VydmljZQogICAgICAgICAgICBteSAlQ2hpbGRTZXJ2aWNlRGF0YSA9ICRTZWxmLT5TZXJ2aWNlR2V0KAogICAgICAgICAgICAgICAgU2VydmljZUlEICAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgIEluY2lkZW50U3RhdGUgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgU0VSVklDRUlEIGlmICRDaGlsZFNlcnZpY2VEYXRhe0N1ckluY2lTdGF0ZVR5cGV9IGVxICdvcGVyYXRpb25hbCc7CgogICAgICAgICAgICAkU2VydmljZURhdGF7Q3VySW5jaVN0YXRlVHlwZX0gPSAnd2FybmluZyc7CiAgICAgICAgICAgIGxhc3QgU0VSVklDRUlEOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlZmluZSBkZWZhdWx0IGluY2lkZW50IHN0YXRlcwogICAgbXkgJURlZmF1bHRJbmNpU3RhdGVzID0gKAogICAgICAgIG9wZXJhdGlvbmFsID0+ICdPcGVyYXRpb25hbCcsCiAgICAgICAgd2FybmluZyAgICAgPT4gJ1dhcm5pbmcnLAogICAgICAgIGluY2lkZW50ICAgID0+ICdJbmNpZGVudCcsCiAgICApOwoKICAgICMgZ2V0IHRoZSBpbmNpZGVudCBzdGF0ZSBsaXN0IG9mIHRoaXMgdHlwZQogICAgbXkgJEluY2lTdGF0ZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgUHJlZmVyZW5jZXMgICA9PiB7CiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJFNlcnZpY2VEYXRhe0N1ckluY2lTdGF0ZVR5cGV9LAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICVSZXZlcnNlSW5jaVN0YXRlTGlzdCA9IHJldmVyc2UgJXsgJEluY2lTdGF0ZUxpc3QgfTsKICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVJRH0KICAgICAgICA9ICRSZXZlcnNlSW5jaVN0YXRlTGlzdHsgJERlZmF1bHRJbmNpU3RhdGVzeyAkU2VydmljZURhdGF7Q3VySW5jaVN0YXRlVHlwZX0gfSB9OwoKICAgICMgZmFsbGJhY2sgaWYgdGhlIGRlZmF1bHQgaW5jaWRlbnQgc3RhdGUgaXMgZGVhY3RpdmF0ZWQKICAgIGlmICggISRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVJRH0gKSB7CiAgICAgICAgbXkgQFNvcnRlZEluY2lMaXN0ID0gc29ydCBrZXlzICV7ICRJbmNpU3RhdGVMaXN0IH07CiAgICAgICAgJFNlcnZpY2VEYXRhe0N1ckluY2lTdGF0ZUlEfSA9ICRTb3J0ZWRJbmNpTGlzdFswXTsKICAgIH0KCiAgICAjIGdldCBpbmNpZGVudCBzdGF0ZSBmdW5jdGlvbmFsaXR5CiAgICBteSAkSW5jaVN0YXRlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1HZXQoCiAgICAgICAgSXRlbUlEID0+ICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVJRH0sCiAgICApOwoKICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGV9ICAgICA9ICRJbmNpU3RhdGUtPntOYW1lfTsKICAgICRTZXJ2aWNlRGF0YXtDdXJJbmNpU3RhdGVUeXBlfSA9ICRJbmNpU3RhdGUtPntGdW5jdGlvbmFsaXR5fTsKCiAgICAlU2VydmljZURhdGEgPSAoJVNlcnZpY2VEYXRhLCAlUHJlZmVyZW5jZXMpOwoKICAgIHJldHVybiAlU2VydmljZURhdGE7Cn0KCiMgLS0tCgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9GT1JLIHByb2plY3QgKEw8aHR0cHM6Ly9vLWZvcmsuZGUvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU0xBLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IFNMQS5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxMzo1MSB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U0xBOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycsCiMgLS0tCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6U0xBIC0gc2xhIGxpYgoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgc2xhIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCkRvbid0IHVzZSB0aGUgY29uc3RydWN0b3IgZGlyZWN0bHksIHVzZSB0aGUgT2JqZWN0TWFuYWdlciBpbnN0ZWFkOgoKICAgIG15ICRTTEFPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IGNvbmZpZ3VyZWQgcHJlZmVyZW5jZXMgb2JqZWN0CiAgICBteSAkR2VuZXJhdG9yTW9kdWxlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTTEE6OlByZWZlcmVuY2VzTW9kdWxlJykKICAgICAgICB8fCAnS2VybmVsOjpTeXN0ZW06OlNMQTo6UHJlZmVyZW5jZXNEQic7CgogICAgIyBnZXQgcHJlZmVyZW5jZXMgb2JqZWN0CiAgICAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJEdlbmVyYXRvck1vZHVsZSk7CgogICAgJFNlbGYtPntDYWNoZVR5cGV9ID0gJ1NMQSc7CiAgICAkU2VsZi0+e0NhY2hlVFRMfSAgPSA2MCAqIDYwICogMjQgKiAyMDsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBTTEFMaXN0KCkKCnJldHVybiBhIGhhc2ggbGlzdCBvZiBzbGFzCgogICAgbXkgJVNMQUxpc3QgPSAkU0xBT2JqZWN0LT5TTEFMaXN0KAogICAgICAgIFNlcnZpY2VJRCA9PiAxLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsaWQgICAgID0+IDAsICAjIChvcHRpb25hbCkgZGVmYXVsdCAxICgwfDEpCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFNMQUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgdmFsaWQgcGFyYW0KICAgIGlmICggIWRlZmluZWQgJFBhcmFte1ZhbGlkfSApIHsKICAgICAgICAkUGFyYW17VmFsaWR9ID0gMTsKICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgYWRkIFNlcnZpY2VJRAogICAgbXkgJVNRTFRhYmxlOwogICAgJFNRTFRhYmxle3NsYX0gPSAnc2xhIHMnOwogICAgbXkgQFNRTFdoZXJlOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKCiAgICAgICAgIyBxdW90ZQogICAgICAgICRQYXJhbXtTZXJ2aWNlSUR9ID0gJERCT2JqZWN0LT5RdW90ZSggJFBhcmFte1NlcnZpY2VJRH0sICdJbnRlZ2VyJyApOwoKICAgICAgICAkU1FMVGFibGV7c2VydmljZX0gPSAnc2VydmljZV9zbGEgcic7CiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICJzLmlkID0gci5zbGFfaWQgQU5EIHIuc2VydmljZV9pZCA9ICRQYXJhbXtTZXJ2aWNlSUR9IjsKICAgIH0KCiAgICAjIGFkZCB2YWxpZCBwYXJ0CiAgICBpZiAoICRQYXJhbXtWYWxpZH0gKSB7CgogICAgICAgICMgZ2V0IHZhbGlkIG9iamVjdAogICAgICAgIG15ICRWYWxpZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpOwoKICAgICAgICAjIGNyZWF0ZSB0aGUgdmFsaWQgbGlzdAogICAgICAgIG15ICRWYWxpZElEcyA9IGpvaW4gJywgJywgJFZhbGlkT2JqZWN0LT5WYWxpZElEc0dldCgpOwoKICAgICAgICBwdXNoIEBTUUxXaGVyZSwgInMudmFsaWRfaWQgSU4gKCAkVmFsaWRJRHMgKSI7CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHRhYmxlIGFuZCB3aGVyZSBzdHJpbmdzCiAgICBteSAkVGFibGVTdHJpbmcgPSBqb2luIHF7LCB9LCB2YWx1ZXMgJVNRTFRhYmxlOwogICAgbXkgJFdoZXJlU3RyaW5nID0gQFNRTFdoZXJlID8gJyBXSEVSRSAnIC4gam9pbiBxeyBBTkQgfSwgQFNRTFdoZXJlIDogJyc7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBzLmlkLCBzLm5hbWUgRlJPTSAkVGFibGVTdHJpbmcgJFdoZXJlU3RyaW5nIiwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlU0xBTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRTTEFMaXN0eyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgIHJldHVybiAlU0xBTGlzdDsKfQoKPWhlYWQyIFNMQUdldCgpCgpSZXR1cm5zIGFuIFNMQSBhcyBhIGhhc2gKCiAgICBteSAlU0xBRGF0YSA9ICRTTEFPYmplY3QtPlNMQUdldCgKICAgICAgICBTTEFJRCAgPT4gMTIzLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgbXkgJVNMQURhdGEgPSAoCiAgICAgICAgICAnU0xBSUQnICAgICAgICAgICAgICAgPT4gJzInLAogICAgICAgICAgJ05hbWUnICAgICAgICAgICAgICAgID0+ICdEaWFtb25kIFBhY2lmaWMgLSBTMicsCiAgICAgICAgICAnQ2FsZW5kYXInICAgICAgICAgICAgPT4gJzInLAogICAgICAgICAgJ0ZpcnN0UmVzcG9uc2VUaW1lJyAgID0+ICc2MCcsICAgIyBpbiBtaW51dGVzIGFjY29yZGluZyB0byBidXNpbmVzcyBob3VycwogICAgICAgICAgJ0ZpcnN0UmVzcG9uc2VOb3RpZnknID0+ICc3MCcsICAgIyBpbiBwZXJjZW50CiAgICAgICAgICAnVXBkYXRlVGltZScgICAgICAgICAgPT4gJzM2MCcsICAjIGluIG1pbnV0ZXMgYWNjb3JkaW5nIHRvIGJ1c2luZXNzIGhvdXJzCiAgICAgICAgICAnVXBkYXRlTm90aWZ5JyAgICAgICAgPT4gJzcwJywgICAjIGluIHBlcmNlbnQKICAgICAgICAgICdTb2x1dGlvblRpbWUnICAgICAgICA9PiAnOTYwJywgICMgaW4gbWludXRlcyBhY2NvcmRpbmcgdG8gYnVzaW5lc3MgaG91cnMKICAgICAgICAgICdTb2x1dGlvbk5vdGlmeScgICAgICA9PiAnODAnLCAgICMgaW4gcGVyY2VudAogICAgICAgICAgJ1NlcnZpY2VJRHMnICAgICAgICAgID0+IFsgJzQnLCAnNycsICc4JyBdLAogICAgICAgICAgJ1ZhbGlkSUQnICAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICdDb21tZW50JyAgICAgICAgICAgICA9PiAnU29tZSBDb21tZW50JywKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgJ1R5cGVJRCcgICAgICAgICAgICAgICAgICA9PiAnNScsCiAgICAgICAgICAnVHlwZScgICAgICAgICAgICAgICAgICAgID0+ICdJbmNpZGVudCcsCiAgICAgICAgICAnTWluVGltZUJldHdlZW5JbmNpZGVudHMnID0+ICc0MDAwJywgICMgaW4gbWludXRlcwojIC0tLQogICAgICAgICAgJ0NyZWF0ZUJ5JyAgICAgICAgICAgID0+ICc5MycsCiAgICAgICAgICAnQ3JlYXRlVGltZScgICAgICAgICAgPT4gJzIwMTEtMDYtMTYgMjI6NTQ6NTQnLAogICAgICAgICAgJ0NoYW5nZUJ5JyAgICAgICAgICAgID0+ICc5MycsCiAgICAgICAgICAnQ2hhbmdlVGltZScgICAgICAgICAgPT4gJzIwMTEtMDYtMTYgMjI6NTQ6NTQnLAogICAgKTsKCj1jdXQKCnN1YiBTTEFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoU0xBSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIHJlc3VsdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgbXkgJENhY2hlS2V5ID0gJ0NhY2hlOjpTTEFHZXQ6OicgLiAkUGFyYW17U0xBSUR9OwogICAgbXkgJENhY2hlZCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlICAgICAgICAgICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICAgICAgICAgICAgPT4gJENhY2hlS2V5LAogICAgICAgIENhY2hlSW5NZW1vcnkgID0+IDEsCiAgICAgICAgQ2FjaGVJbkJhY2tlbmQgPT4gMCwKICAgICk7CgogICAgaWYgKCByZWYgJENhY2hlZCBlcSAnSEFTSCcgKSB7CiAgICAgICAgcmV0dXJuICV7JENhY2hlZH07CiAgICB9CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGdldCBzbGEgZnJvbSBkYgogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBuYW1lLCBjYWxlbmRhcl9uYW1lLCBmaXJzdF9yZXNwb25zZV90aW1lLCBmaXJzdF9yZXNwb25zZV9ub3RpZnksICcKICAgICAgICAgICAgLiAndXBkYXRlX3RpbWUsIHVwZGF0ZV9ub3RpZnksIHNvbHV0aW9uX3RpbWUsIHNvbHV0aW9uX25vdGlmeSwgJwogICAgICAgICAgICAuICd2YWxpZF9pZCwgY29tbWVudHMsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgJwojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIC4gJywgdHlwZV9pZCwgbWluX3RpbWVfYmV0X2luY2lkZW50cyAnCiMgLS0tCiAgICAgICAgICAgIC4gJ0ZST00gc2xhIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17U0xBSUR9LAogICAgICAgIF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlU0xBRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRTTEFEYXRhe1NMQUlEfSAgICAgICAgICAgICAgID0gJFJvd1swXTsKICAgICAgICAkU0xBRGF0YXtOYW1lfSAgICAgICAgICAgICAgICA9ICRSb3dbMV07CiAgICAgICAgJFNMQURhdGF7Q2FsZW5kYXJ9ICAgICAgICAgICAgPSAkUm93WzJdIHx8ICcnOwogICAgICAgICRTTEFEYXRhe0ZpcnN0UmVzcG9uc2VUaW1lfSAgID0gJFJvd1szXTsKICAgICAgICAkU0xBRGF0YXtGaXJzdFJlc3BvbnNlTm90aWZ5fSA9ICRSb3dbNF07CiAgICAgICAgJFNMQURhdGF7VXBkYXRlVGltZX0gICAgICAgICAgPSAkUm93WzVdOwogICAgICAgICRTTEFEYXRhe1VwZGF0ZU5vdGlmeX0gICAgICAgID0gJFJvd1s2XTsKICAgICAgICAkU0xBRGF0YXtTb2x1dGlvblRpbWV9ICAgICAgICA9ICRSb3dbN107CiAgICAgICAgJFNMQURhdGF7U29sdXRpb25Ob3RpZnl9ICAgICAgPSAkUm93WzhdOwogICAgICAgICRTTEFEYXRhe1ZhbGlkSUR9ICAgICAgICAgICAgID0gJFJvd1s5XTsKICAgICAgICAkU0xBRGF0YXtDb21tZW50fSAgICAgICAgICAgICA9ICRSb3dbMTBdIHx8ICcnOwogICAgICAgICRTTEFEYXRhe0NyZWF0ZVRpbWV9ICAgICAgICAgID0gJFJvd1sxMV07CiAgICAgICAgJFNMQURhdGF7Q3JlYXRlQnl9ICAgICAgICAgICAgPSAkUm93WzEyXTsKICAgICAgICAkU0xBRGF0YXtDaGFuZ2VUaW1lfSAgICAgICAgICA9ICRSb3dbMTNdOwogICAgICAgICRTTEFEYXRhe0NoYW5nZUJ5fSAgICAgICAgICAgID0gJFJvd1sxNF07CiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAkU0xBRGF0YXtUeXBlSUR9ICAgICAgICAgICAgICAgICAgPSAkUm93WzE1XTsKICAgICAgICAkU0xBRGF0YXtNaW5UaW1lQmV0d2VlbkluY2lkZW50c30gPSAkUm93WzE2XSB8fCAwOwojIC0tLQogICAgfQoKICAgICMgY2hlY2sgc2xhCiAgICBpZiAoICEkU0xBRGF0YXtTTEFJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIFNMQUlEICgkUGFyYW17U0xBSUR9KSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAjIGdldCBzbGEgdHlwZSBsaXN0CiAgICBteSAkU0xBVHlwZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OlNMQTo6VHlwZScsCiAgICApOwogICAgJFNMQURhdGF7VHlwZX0gPSAkU0xBVHlwZUxpc3QtPnsgJFNMQURhdGF7VHlwZUlEfSB9IHx8ICcnOwojIC0tLQoKICAgICMgZ2V0IGFsbCBzZXJ2aWNlIGlkcwogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBzZXJ2aWNlX2lkIEZST00gc2VydmljZV9zbGEgV0hFUkUgc2xhX2lkID0gPyBPUkRFUiBCWSBzZXJ2aWNlX2lkIEFTQycsCiAgICAgICAgQmluZCA9PiBbIFwkU0xBRGF0YXtTTEFJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAU2VydmljZUlEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQFNlcnZpY2VJRHMsICRSb3dbMF07CiAgICB9CgogICAgIyBhZGQgdGhlIGlkcwogICAgJFNMQURhdGF7U2VydmljZUlEc30gPSBcQFNlcnZpY2VJRHM7CgogICAgIyBnZXQgc2xhIHByZWZlcmVuY2VzCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkU2VsZi0+U0xBUHJlZmVyZW5jZXNHZXQoIFNMQUlEID0+ICRQYXJhbXtTTEFJRH0gKTsKCiAgICAjIG1lcmdlIGhhc2gKICAgIGlmICglUHJlZmVyZW5jZXMpIHsKICAgICAgICAlU0xBRGF0YSA9ICggJVNMQURhdGEsICVQcmVmZXJlbmNlcyApOwogICAgfQoKICAgICMgY2FjaGUgcmVzdWx0CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIFRUTCAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCgogICAgICAgICMgbWFrZSBhIGxvY2FsIGNvcHkgb2YgdGhlIHNsYSBkYXRhIHRvIGF2b2lkIGl0IGJlaW5nIGFsdGVyZWQgaW4tbWVtb3J5IGxhdGVyCiAgICAgICAgVmFsdWUgICAgICAgICAgPT4geyVTTEFEYXRhfSwKICAgICAgICBDYWNoZUluTWVtb3J5ICA9PiAxLAogICAgICAgIENhY2hlSW5CYWNrZW5kID0+IDAsCiAgICApOwoKICAgIHJldHVybiAlU0xBRGF0YTsKfQoKPWhlYWQyIFNMQUxvb2t1cCgpCgpyZXR1cm5zIHRoZSBuYW1lIG9yIHRoZSBzbGEgaWQKCiAgICBteSAkU0xBTmFtZSA9ICRTTEFPYmplY3QtPlNMQUxvb2t1cCgKICAgICAgICBTTEFJRCA9PiAxMjMsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFNMQUlEID0gJFNMQU9iamVjdC0+U0xBTG9va3VwKAogICAgICAgIE5hbWUgPT4gJ1NMQSBOYW1lJywKICAgICk7Cgo9Y3V0CgpzdWIgU0xBTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtTTEFJRH0gJiYgISRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgU0xBSUQgb3IgTmFtZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgaWYgKCAkUGFyYW17U0xBSUR9ICkgewoKICAgICAgICAjIGNoZWNrIGNhY2hlCiAgICAgICAgbXkgJENhY2hlS2V5ID0gJ0NhY2hlOjpTTEFMb29rdXA6OklEOjonIC4gJFBhcmFte1NMQUlEfTsKICAgICAgICBteSAkQ2FjaGVkICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgICAgICBUeXBlICAgICAgICAgICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgICAgICAgICAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgQ2FjaGVJbk1lbW9yeSAgPT4gMSwKICAgICAgICAgICAgQ2FjaGVJbkJhY2tlbmQgPT4gMCwKICAgICAgICApOwogICAgICAgIGlmICggZGVmaW5lZCAkQ2FjaGVkICkgewogICAgICAgICAgICByZXR1cm4gJENhY2hlZDsKICAgICAgICB9CgogICAgICAgICMgbG9va3VwCiAgICAgICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgICA9PiAnU0VMRUNUIG5hbWUgRlJPTSBzbGEgV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1NMQUlEfSwgXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAkTmFtZSA9ICcnOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkTmFtZSA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICAjIGNhY2hlCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBUVEwgICAgICAgICAgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgS2V5ICAgICAgICAgICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICA9PiAkTmFtZSwKICAgICAgICAgICAgQ2FjaGVJbk1lbW9yeSAgPT4gMSwKICAgICAgICAgICAgQ2FjaGVJbkJhY2tlbmQgPT4gMCwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJE5hbWU7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBjaGVjayBjYWNoZQogICAgICAgIG15ICRDYWNoZUtleSA9ICdDYWNoZTo6U0xBTG9va3VwOjpOYW1lOjonIC4gJFBhcmFte05hbWV9OwogICAgICAgIG15ICRDYWNoZWQgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICAgICAgICAgICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBDYWNoZUluTWVtb3J5ICA9PiAxLAogICAgICAgICAgICBDYWNoZUluQmFja2VuZCA9PiAwLAogICAgICAgICk7CiAgICAgICAgaWYgKCBkZWZpbmVkICRDYWNoZWQgKSB7CiAgICAgICAgICAgIHJldHVybiAkQ2FjaGVkOwogICAgICAgIH0KCiAgICAgICAgIyBsb29rdXAKICAgICAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBzbGEgV0hFUkUgbmFtZSA9ID8nLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAkU0xBSUQgPSAnJzsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJFNMQUlEID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgICMgY2FjaGUKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICBUeXBlICAgICAgICAgICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIFRUTCAgICAgICAgICAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICBLZXkgICAgICAgICAgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgQ2FjaGVJbk1lbW9yeSAgPT4gMSwKICAgICAgICAgICAgQ2FjaGVJbkJhY2tlbmQgPT4gMCwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNMQUlEOwogICAgfQp9Cgo9aGVhZDIgU0xBQWRkKCkKCmFkZCBhIHNsYQoKICAgIG15ICRTTEFJRCA9ICRTTEFPYmplY3QtPlNMQUFkZCgKICAgICAgICBTZXJ2aWNlSURzICAgICAgICAgID0+IFsgMSwgNSwgNyBdLCAgIyAob3B0aW9uYWwpCiAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnU0xBIE5hbWUnLAogICAgICAgIENhbGVuZGFyICAgICAgICAgICAgPT4gJ0NhbGVuZGFyMScsICAjIChvcHRpb25hbCkKICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDEyMCwgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRmlyc3RSZXNwb25zZU5vdGlmeSA9PiA2MCwgICAgICAgICAgICMgKG9wdGlvbmFsKSBub3RpZnkgYWdlbnQgaWYgZmlyc3QgcmVzcG9uc2UgZXNjYWxhdGlvbiBpcyA2MCUgcmVhY2hlZAogICAgICAgIFVwZGF0ZVRpbWUgICAgICAgICAgPT4gMTgwLCAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDgwLCAgICAgICAgICAgIyAob3B0aW9uYWwpIG5vdGlmeSBhZ2VudCBpZiB1cGRhdGUgZXNjYWxhdGlvbiBpcyA4MCUgcmVhY2hlZAogICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gNTgwLCAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBTb2x1dGlvbk5vdGlmeSAgICAgID0+IDgwLCAgICAgICAgICAgIyAob3B0aW9uYWwpIG5vdGlmeSBhZ2VudCBpZiBzb2x1dGlvbiBlc2NhbGF0aW9uIGlzIDgwJSByZWFjaGVkCiAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJ0NvbW1lbnQnLCAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgICAgICAgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICBUeXBlSUQgICAgICAgICAgICAgICAgICA9PiAyLAogICAgICAgIE1pblRpbWVCZXR3ZWVuSW5jaWRlbnRzID0+IDM0NDMsICAgICAjIChvcHRpb25hbCkKIyAtLS0KICAgICk7Cgo9Y3V0CgpzdWIgU0xBQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQojICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgVmFsaWRJRCBVc2VySUQpKSB7CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIFZhbGlkSUQgVXNlcklEIFR5cGVJRCkpIHsKIyAtLS0KICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBzZXJ2aWNlIGlkcwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtTZXJ2aWNlSURzfSAmJiByZWYgJFBhcmFte1NlcnZpY2VJRHN9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdTZXJ2aWNlSURzIG5lZWRzIHRvIGJlIGFuIGFycmF5IHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzCiAgICAkUGFyYW17U2VydmljZUlEc30gICAgICAgICAgfHw9IFtdOwogICAgJFBhcmFte0NhbGVuZGFyfSAgICAgICAgICAgIHx8PSAnJzsKICAgICRQYXJhbXtDb21tZW50fSAgICAgICAgICAgICB8fD0gJyc7CiAgICAkUGFyYW17Rmlyc3RSZXNwb25zZVRpbWV9ICAgfHw9IDA7CiAgICAkUGFyYW17Rmlyc3RSZXNwb25zZU5vdGlmeX0gfHw9IDA7CiAgICAkUGFyYW17VXBkYXRlVGltZX0gICAgICAgICAgfHw9IDA7CiAgICAkUGFyYW17VXBkYXRlTm90aWZ5fSAgICAgICAgfHw9IDA7CiAgICAkUGFyYW17U29sdXRpb25UaW1lfSAgICAgICAgfHw9IDA7CiAgICAkUGFyYW17U29sdXRpb25Ob3RpZnl9ICAgICAgfHw9IDA7CiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICRQYXJhbXtNaW5UaW1lQmV0d2VlbkluY2lkZW50c30gfHw9IDA7CiMgLS0tCgogICAgIyBnZXQgY2hlY2sgaXRlbSBvYmplY3QKICAgIG15ICRDaGVja0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtJyk7CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRDaGVja0l0ZW1PYmplY3QtPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZmluZCBleGl0aW5nIHNsYSdzIHdpdGggdGhlIHNhbWUgbmFtZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBzbGEgV0hFUkUgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJE5vQWRkOwogICAgd2hpbGUgKCAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTm9BZGQgPSAxOwogICAgfQoKICAgICMgYWJvcnQgaW5zZXJ0IG9mIG5ldyBzbGEsIGlmIG5hbWUgYWxyZWFkeSBleGlzdHMKICAgIGlmICgkTm9BZGQpIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkFuIFNMQSB3aXRoIHRoZSBuYW1lICckUGFyYW17TmFtZX0nIGFscmVhZHkgZXhpc3RzLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBhZGQgc2xhIHRvIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KIyAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBzbGEgJwojICAgICAgICAgICAgLiAnKG5hbWUsIGNhbGVuZGFyX25hbWUsIGZpcnN0X3Jlc3BvbnNlX3RpbWUsIGZpcnN0X3Jlc3BvbnNlX25vdGlmeSwgJwojICAgICAgICAgICAgLiAndXBkYXRlX3RpbWUsIHVwZGF0ZV9ub3RpZnksIHNvbHV0aW9uX3RpbWUsIHNvbHV0aW9uX25vdGlmeSwgJwojICAgICAgICAgICAgLiAndmFsaWRfaWQsIGNvbW1lbnRzLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KSBWQUxVRVMgJwojICAgICAgICAgICAgLiAnKD8sID8sID8sID8sID8sID8sID8sID8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAojICAgICAgICBCaW5kID0+IFsKIyAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sICAgICAgICAgICAgICAgIFwkUGFyYW17Q2FsZW5kYXJ9LCAgICAgICBcJFBhcmFte0ZpcnN0UmVzcG9uc2VUaW1lfSwKIyAgICAgICAgICAgIFwkUGFyYW17Rmlyc3RSZXNwb25zZU5vdGlmeX0sIFwkUGFyYW17VXBkYXRlVGltZX0sICAgICBcJFBhcmFte1VwZGF0ZU5vdGlmeX0sCiMgICAgICAgICAgICBcJFBhcmFte1NvbHV0aW9uVGltZX0sICAgICAgICBcJFBhcmFte1NvbHV0aW9uTm90aWZ5fSwgXCRQYXJhbXtWYWxpZElEfSwgXCRQYXJhbXtDb21tZW50fSwKIyAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LAojICAgICAgICBdLAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gc2xhICcKICAgICAgICAgICAgLiAnKG5hbWUsIGNhbGVuZGFyX25hbWUsIGZpcnN0X3Jlc3BvbnNlX3RpbWUsIGZpcnN0X3Jlc3BvbnNlX25vdGlmeSwgJwogICAgICAgICAgICAuICd1cGRhdGVfdGltZSwgdXBkYXRlX25vdGlmeSwgc29sdXRpb25fdGltZSwgc29sdXRpb25fbm90aWZ5LCAnCiAgICAgICAgICAgIC4gJ3ZhbGlkX2lkLCBjb21tZW50cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSwgJwogICAgICAgICAgICAuICd0eXBlX2lkLCBtaW5fdGltZV9iZXRfaW5jaWRlbnRzKSBWQUxVRVMgJwogICAgICAgICAgICAuICcoPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCA/LCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sICAgICAgICAgICAgICAgIFwkUGFyYW17Q2FsZW5kYXJ9LCAgIFwkUGFyYW17Rmlyc3RSZXNwb25zZVRpbWV9LAogICAgICAgICAgICBcJFBhcmFte0ZpcnN0UmVzcG9uc2VOb3RpZnl9LCBcJFBhcmFte1VwZGF0ZVRpbWV9LCBcJFBhcmFte1VwZGF0ZU5vdGlmeX0sCiAgICAgICAgICAgIFwkUGFyYW17U29sdXRpb25UaW1lfSwgXCRQYXJhbXtTb2x1dGlvbk5vdGlmeX0sIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1R5cGVJRH0sIFwkUGFyYW17TWluVGltZUJldHdlZW5JbmNpZGVudHN9LAogICAgICAgIF0sCiMgLS0tCiAgICApOwoKICAgICMgZ2V0IHNsYSBpZAogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIHNsYSBXSEVSRSBuYW1lID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkU0xBSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkU0xBSUQgPSAkUm93WzBdOwogICAgfQoKICAgICMgY2hlY2sgc2xhIGlkCiAgICBpZiAoICEkU0xBSUQgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBmaW5kIFNMQUlEIGZvciAnJFBhcmFte05hbWV9JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcmVtb3ZlIGFsbCBleGlzdGluZyBhbGxvY2F0aW9ucwogICAgJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBzZXJ2aWNlX3NsYSBXSEVSRSBzbGFfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRTTEFJRCBdLAogICAgKTsKCiAgICAjIGFkZCB0aGUgbmV3IGFsbG9jYXRpb25zCiAgICBmb3IgbXkgJFNlcnZpY2VJRCAoIEB7ICRQYXJhbXtTZXJ2aWNlSURzfSB9ICkgewoKICAgICAgICAjIGFkZCBvbmUgYWxsb2NhdGlvbgogICAgICAgICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gJ0lOU0VSVCBJTlRPIHNlcnZpY2Vfc2xhIChzZXJ2aWNlX2lkLCBzbGFfaWQpIFZBTFVFUyAoPywgPyknLAogICAgICAgICAgICBCaW5kID0+IFsgXCRTZXJ2aWNlSUQsIFwkU0xBSUQgXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkU0xBSUQ7Cn0KCj1oZWFkMiBTTEFVcGRhdGUoKQoKdXBkYXRlIGEgZXhpc3Rpbmcgc2xhCgogICAgbXkgJFRydWUgPSAkU0xBT2JqZWN0LT5TTEFVcGRhdGUoCiAgICAgICAgU0xBSUQgICAgICAgICAgICAgICA9PiAyLAogICAgICAgIFNlcnZpY2VJRHMgICAgICAgICAgPT4gWyAxLCAyLCAzIF0sICAjIChvcHRpb25hbCkKICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdTZXJ2aWNlIE5hbWUnLAogICAgICAgIENhbGVuZGFyICAgICAgICAgICAgPT4gJ0NhbGVuZGFyMScsICAjIChvcHRpb25hbCkKICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDEyMCwgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRmlyc3RSZXNwb25zZU5vdGlmeSA9PiA2MCwgICAgICAgICAgICMgKG9wdGlvbmFsKSBub3RpZnkgYWdlbnQgaWYgZmlyc3QgcmVzcG9uc2UgZXNjYWxhdGlvbiBpcyA2MCUgcmVhY2hlZAogICAgICAgIFVwZGF0ZVRpbWUgICAgICAgICAgPT4gMTgwLCAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDgwLCAgICAgICAgICAgIyAob3B0aW9uYWwpIG5vdGlmeSBhZ2VudCBpZiB1cGRhdGUgZXNjYWxhdGlvbiBpcyA4MCUgcmVhY2hlZAogICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gNTgwLCAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBTb2x1dGlvbk5vdGlmeSAgICAgID0+IDgwLCAgICAgICAgICAgIyAob3B0aW9uYWwpIG5vdGlmeSBhZ2VudCBpZiBzb2x1dGlvbiBlc2NhbGF0aW9uIGlzIDgwJSByZWFjaGVkCiAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJ0NvbW1lbnQnLCAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgICAgICAgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICBUeXBlSUQgICAgICAgICAgICAgICAgICA9PiAyLAogICAgICAgIE1pblRpbWVCZXR3ZWVuSW5jaWRlbnRzID0+IDM0NDMsICAjIChvcHRpb25hbCkKIyAtLS0KICAgICk7Cgo9Y3V0CgpzdWIgU0xBVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQojICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFNMQUlEIE5hbWUgVmFsaWRJRCBVc2VySUQpKSB7CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTTEFJRCBOYW1lIFZhbGlkSUQgVXNlcklEIFR5cGVJRCkpIHsKIyAtLS0KICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBzZXJ2aWNlIGlkcwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtTZXJ2aWNlSURzfSAmJiByZWYgJFBhcmFte1NlcnZpY2VJRHN9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdTZXJ2aWNlSURzIG5lZWQgdG8gYmUgYW4gYXJyYXkgcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgICRQYXJhbXtTZXJ2aWNlSURzfSAgICAgICAgICB8fD0gW107CiAgICAkUGFyYW17Q2FsZW5kYXJ9ICAgICAgICAgICAgfHw9ICcnOwogICAgJFBhcmFte0NvbW1lbnR9ICAgICAgICAgICAgIHx8PSAnJzsKICAgICRQYXJhbXtGaXJzdFJlc3BvbnNlVGltZX0gICB8fD0gMDsKICAgICRQYXJhbXtGaXJzdFJlc3BvbnNlTm90aWZ5fSB8fD0gMDsKICAgICRQYXJhbXtVcGRhdGVUaW1lfSAgICAgICAgICB8fD0gMDsKICAgICRQYXJhbXtVcGRhdGVOb3RpZnl9ICAgICAgICB8fD0gMDsKICAgICRQYXJhbXtTb2x1dGlvblRpbWV9ICAgICAgICB8fD0gMDsKICAgICRQYXJhbXtTb2x1dGlvbk5vdGlmeX0gICAgICB8fD0gMDsKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgJFBhcmFte01pblRpbWVCZXR3ZWVuSW5jaWRlbnRzfSB8fD0gMDsKIyAtLS0KCiAgICAjIGdldCBjaGVjayBpdGVtIG9iamVjdAogICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIENvbW1lbnQpKSB7CiAgICAgICAgJENoZWNrSXRlbU9iamVjdC0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBmaW5kIGV4aXRpbmcgc2xhJ3Mgd2l0aCB0aGUgc2FtZSBuYW1lCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gc2xhIFdIRVJFIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRVcGRhdGUgPSAwOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUm93WzBdICE9ICRQYXJhbXtTTEFJRH0gKSB7CiAgICAgICAgICAgICRVcGRhdGUgPSAkUm93WzBdOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFib3J0IHVwZGF0ZSBvZiBzbGEsIGlmIG5hbWUgYWxyZWFkeSBleGlzdHMKICAgIGlmICgkVXBkYXRlKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJBbiBTTEEgd2l0aCB0aGUgbmFtZSAnJFBhcmFte05hbWV9JyBhbHJlYWR5IGV4aXN0cy4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcmVzZXQgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAnQ2FjaGU6OlNMQUdldDo6JyAuICRQYXJhbXtTTEFJRH0sCiAgICApOwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICdDYWNoZTo6U0xBTG9va3VwOjpOYW1lOjonIC4gJFBhcmFte05hbWV9LAogICAgKTsKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAnQ2FjaGU6OlNMQUxvb2t1cDo6SUQ6OicgLiAkUGFyYW17U0xBSUR9LAogICAgKTsKCiAgICAjIHVwZGF0ZSBzZXJ2aWNlCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KIyAgICAgICAgU1FMID0+ICdVUERBVEUgc2xhIFNFVCBuYW1lID0gPywgY2FsZW5kYXJfbmFtZSA9ID8sICcKIyAgICAgICAgICAgIC4gJ2ZpcnN0X3Jlc3BvbnNlX3RpbWUgPSA/LCBmaXJzdF9yZXNwb25zZV9ub3RpZnkgPSA/LCAnCiMgICAgICAgICAgICAuICd1cGRhdGVfdGltZSA9ID8sIHVwZGF0ZV9ub3RpZnkgPSA/LCBzb2x1dGlvbl90aW1lID0gPywgc29sdXRpb25fbm90aWZ5ID0gPywgJwojICAgICAgICAgICAgLiAndmFsaWRfaWQgPSA/LCBjb21tZW50cyA9ID8sIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8gJwojICAgICAgICAgICAgLiAnV0hFUkUgaWQgPSA/JywKIyAgICAgICAgQmluZCA9PiBbCiMgICAgICAgICAgICBcJFBhcmFte05hbWV9LCAgICAgICAgICAgICAgICBcJFBhcmFte0NhbGVuZGFyfSwgICAgICAgXCRQYXJhbXtGaXJzdFJlc3BvbnNlVGltZX0sCiMgICAgICAgICAgICBcJFBhcmFte0ZpcnN0UmVzcG9uc2VOb3RpZnl9LCBcJFBhcmFte1VwZGF0ZVRpbWV9LCAgICAgXCRQYXJhbXtVcGRhdGVOb3RpZnl9LAojICAgICAgICAgICAgXCRQYXJhbXtTb2x1dGlvblRpbWV9LCAgICAgICAgXCRQYXJhbXtTb2x1dGlvbk5vdGlmeX0sIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29tbWVudH0sCiMgICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17U0xBSUR9LAojICAgICAgICBdLAogICAgICAgIFNRTCA9PiAnVVBEQVRFIHNsYSBTRVQgbmFtZSA9ID8sIGNhbGVuZGFyX25hbWUgPSA/LCAnCiAgICAgICAgICAgIC4gJ2ZpcnN0X3Jlc3BvbnNlX3RpbWUgPSA/LCBmaXJzdF9yZXNwb25zZV9ub3RpZnkgPSA/LCAnCiAgICAgICAgICAgIC4gJ3VwZGF0ZV90aW1lID0gPywgdXBkYXRlX25vdGlmeSA9ID8sIHNvbHV0aW9uX3RpbWUgPSA/LCBzb2x1dGlvbl9ub3RpZnkgPSA/LCAnCiAgICAgICAgICAgIC4gJ3ZhbGlkX2lkID0gPywgY29tbWVudHMgPSA/LCBjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnkgPSA/LCAnCiAgICAgICAgICAgIC4gJ3R5cGVfaWQgPSA/LCBtaW5fdGltZV9iZXRfaW5jaWRlbnRzID0gPyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sICAgICAgICAgICAgICAgIFwkUGFyYW17Q2FsZW5kYXJ9LCAgIFwkUGFyYW17Rmlyc3RSZXNwb25zZVRpbWV9LAogICAgICAgICAgICBcJFBhcmFte0ZpcnN0UmVzcG9uc2VOb3RpZnl9LCBcJFBhcmFte1VwZGF0ZVRpbWV9LCBcJFBhcmFte1VwZGF0ZU5vdGlmeX0sCiAgICAgICAgICAgIFwkUGFyYW17U29sdXRpb25UaW1lfSwgXCRQYXJhbXtTb2x1dGlvbk5vdGlmeX0sIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtUeXBlSUR9LCBcJFBhcmFte01pblRpbWVCZXR3ZWVuSW5jaWRlbnRzfSwgXCRQYXJhbXtTTEFJRH0sCiAgICAgICAgXSwKIyAtLS0KICAgICk7CgogICAgIyByZW1vdmUgYWxsIGV4aXN0aW5nIGFsbG9jYXRpb25zCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gc2VydmljZV9zbGEgV0hFUkUgc2xhX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17U0xBSUR9LCBdCiAgICApOwoKICAgICMgYWRkIHRoZSBuZXcgYWxsb2NhdGlvbnMKICAgIGZvciBteSAkU2VydmljZUlEICggQHsgJFBhcmFte1NlcnZpY2VJRHN9IH0gKSB7CgogICAgICAgICMgYWRkIG9uZSBhbGxvY2F0aW9uCiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgID0+ICdJTlNFUlQgSU5UTyBzZXJ2aWNlX3NsYSAoc2VydmljZV9pZCwgc2xhX2lkKSBWQUxVRVMgKD8sID8pJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkU2VydmljZUlELCBcJFBhcmFte1NMQUlEfSBdLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBTTEFQcmVmZXJlbmNlc1NldCgpCgpzZXQgU0xBIHByZWZlcmVuY2VzCgogICAgJFNMQU9iamVjdC0+U0xBUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgU0xBSUQgID0+IDEyMywKICAgICAgICBLZXkgICAgPT4gJ1VzZXJDb21tZW50JywKICAgICAgICBWYWx1ZSAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVXNlcklEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgU0xBUHJlZmVyZW5jZXNTZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPlNMQVByZWZlcmVuY2VzU2V0KCVQYXJhbSk7Cn0KCj1oZWFkMiBTTEFQcmVmZXJlbmNlc0dldCgpCgpnZXQgU0xBIHByZWZlcmVuY2VzCgogICAgbXkgJVByZWZlcmVuY2VzID0gJFNMQU9iamVjdC0+U0xBUHJlZmVyZW5jZXNHZXQoCiAgICAgICAgU0xBSUQgID0+IDEyMywKICAgICAgICBVc2VySUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBTTEFQcmVmZXJlbmNlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+U0xBUHJlZmVyZW5jZXNHZXQoJVBhcmFtKTsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA0ZmUyMThiZWNjZGI5MjZhMjlkZDdiZWQ5ZGU0ODIxMTQzMGQ2OWQwIC0gc2NyaXB0cy90ZXN0L0NvbnNvbGUvQ29tbWFuZC9BZG1pbi9TZXJ2aWNlL0FkZC50CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkQ29tbWFuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpBZG1pbjo6U2VydmljZTo6QWRkJyk7CgpteSAoICRSZXN1bHQsICRFeGl0Q29kZSApOwoKIyBnZXQgaGVscGVyIG9iamVjdAokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKbXkgJFBhcmVudFNlcnZpY2VOYW1lID0gIlBhcmVudFNlcnZpY2UiIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKbXkgJENoaWxkU2VydmljZU5hbWUgID0gIkNoaWxkU2VydmljZSIgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKIyB0cnkgdG8gZXhlY3V0ZSBjb21tYW5kIHdpdGhvdXQgYW55IG9wdGlvbnMKJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoKTsKJFNlbGYtPklzKAogICAgJEV4aXRDb2RlLAogICAgMSwKICAgICJObyBvcHRpb25zIiwKKTsKCiMgcHJvdmlkZSBtaW5pbXVtIG9wdGlvbnMKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQojJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoICctLW5hbWUnLCAkUGFyZW50U2VydmljZU5hbWUgKTsKJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoICctLW5hbWUnLCAkUGFyZW50U2VydmljZU5hbWUsICctLWNyaXRpY2FsaXR5JywgJzMgbm9ybWFsJywgJy0tdHlwZScsICdEZW1vbnN0cmF0aW9uJyApOwojIC0tLQokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAwLAogICAgIk1pbmltdW0gb3B0aW9ucyAoIHRoZSBzZXJ2aWNlIGlzIGFkZGVkIC0gJFBhcmVudFNlcnZpY2VOYW1lICkiLAopOwoKIyBzYW1lIGFnYWluIChzaG91bGQgZmFpbCBiZWNhdXNlIGFscmVhZHkgZXhpc3RzKQojIC0tLQojIElUU01Db3JlCiMgLS0tCiMkRXhpdENvZGUgPSAkQ29tbWFuZE9iamVjdC0+RXhlY3V0ZSggJy0tbmFtZScsICRQYXJlbnRTZXJ2aWNlTmFtZSApOwokRXhpdENvZGUgPSAkQ29tbWFuZE9iamVjdC0+RXhlY3V0ZSggJy0tbmFtZScsICRQYXJlbnRTZXJ2aWNlTmFtZSwgJy0tY3JpdGljYWxpdHknLCAnMyBub3JtYWwnLCAnLS10eXBlJywgJ0RlbW9uc3RyYXRpb24nICk7CiMgLS0tCiRTZWxmLT5JcygKICAgICRFeGl0Q29kZSwKICAgIDEsCiAgICAiTWluaW11bSBvcHRpb25zICggc2VydmljZSAkUGFyZW50U2VydmljZU5hbWUgYWxyZWFkeSBleGlzdHMgKSIsCik7CgojIGludmFsaWQgcGFyZW50CiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KIyRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKCAnLS1uYW1lJywgJENoaWxkU2VydmljZU5hbWUsICctLXBhcmVudC1uYW1lJywgJENoaWxkU2VydmljZU5hbWUgKTsKJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoICctLW5hbWUnLCAkQ2hpbGRTZXJ2aWNlTmFtZSwgJy0tcGFyZW50LW5hbWUnLCAkQ2hpbGRTZXJ2aWNlTmFtZSwgJy0tY3JpdGljYWxpdHknLCAnMyBub3JtYWwnLCAnLS10eXBlJywgJ0RlbW9uc3RyYXRpb24nICk7CiMgLS0tCiRTZWxmLT5JcygKICAgICRFeGl0Q29kZSwKICAgIDEsCiAgICAiUGFyZW50IHNlcnZpY2UgJENoaWxkU2VydmljZU5hbWUgZG9lcyBub3QgZXhpc3QiLAopOwoKIyB2YWxpZCBwYXJlbnQKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQojJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoICctLW5hbWUnLCAkQ2hpbGRTZXJ2aWNlTmFtZSwgJy0tcGFyZW50LW5hbWUnLCAkUGFyZW50U2VydmljZU5hbWUgKTsKJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoICctLW5hbWUnLCAkQ2hpbGRTZXJ2aWNlTmFtZSwgJy0tcGFyZW50LW5hbWUnLCAkUGFyZW50U2VydmljZU5hbWUsICctLWNyaXRpY2FsaXR5JywgJzMgbm9ybWFsJywgJy0tdHlwZScsICdEZW1vbnN0cmF0aW9uJyApOwojIC0tLQokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAwLAogICAgIkV4aXN0aW5nIHBhcmVudCAoIHNlcnZpY2UgaXMgYWRkZWQgLSAkQ2hpbGRTZXJ2aWNlTmFtZSApIiwKKTsKCiMgU2FtZSBhZ2FpbiAoc2hvdWxkIGZhaWwgYmVjYXVzZSBhbHJlYWR5IGV4aXN0cykuCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KIyRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKCAnLS1uYW1lJywgJENoaWxkU2VydmljZU5hbWUsICctLXBhcmVudC1uYW1lJywgJFBhcmVudFNlcnZpY2VOYW1lICk7CiRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKCAnLS1uYW1lJywgJENoaWxkU2VydmljZU5hbWUsICctLXBhcmVudC1uYW1lJywgJFBhcmVudFNlcnZpY2VOYW1lLCAnLS1jcml0aWNhbGl0eScsICczIG5vcm1hbCcsICctLXR5cGUnLCAnRGVtb25zdHJhdGlvbicgKTsKIyAtLS0KJFNlbGYtPklzKAogICAgJEV4aXRDb2RlLAogICAgMSwKICAgICJFeGlzdGluZyBwYXJlbnQgKCBzZXJ2aWNlICR7UGFyZW50U2VydmljZU5hbWV9OjokQ2hpbGRTZXJ2aWNlTmFtZSBhbHJlYWR5IGV4aXN0cyApIiwKKTsKCiMgUGFyZW50IGFuZCBjaGlsZCBzZXJ2aWNlIHNhbWUgbmFtZS4KIyAtLS0KIyBJVFNNQ29yZQojIC0tLQojJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoICctLW5hbWUnLCAkUGFyZW50U2VydmljZU5hbWUsICctLXBhcmVudC1uYW1lJywgJFBhcmVudFNlcnZpY2VOYW1lICk7CiRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKCAnLS1uYW1lJywgJFBhcmVudFNlcnZpY2VOYW1lLCAnLS1wYXJlbnQtbmFtZScsICRQYXJlbnRTZXJ2aWNlTmFtZSwgJy0tY3JpdGljYWxpdHknLCAnMyBub3JtYWwnLCAnLS10eXBlJywgJ0RlbW9uc3RyYXRpb24nICk7CiMgLS0tCm15ICRTZXJ2aWNlTmFtZSA9ICRQYXJlbnRTZXJ2aWNlTmFtZSAuICc6OicgLiAkUGFyZW50U2VydmljZU5hbWU7CiRTZWxmLT5JcygKICAgICRFeGl0Q29kZSwKICAgIDAsCiAgICAiUGFyZW50IGFuZCBjaGlsZCBzZXJ2aWNlIHNhbWUgbmFtZSAtICRTZXJ2aWNlTmFtZSAtIGlzIGNyZWF0ZWQiLAopOwoKIyBQYXJlbnQgKHR3byBsZXZlbHMpIGFuZCBjaGlsZCBzYW1lIG5hbWUuCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KIyRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKCAnLS1uYW1lJywgJFBhcmVudFNlcnZpY2VOYW1lLCAnLS1wYXJlbnQtbmFtZScsICRTZXJ2aWNlTmFtZSApOwokRXhpdENvZGUgPSAkQ29tbWFuZE9iamVjdC0+RXhlY3V0ZSggJy0tbmFtZScsICRQYXJlbnRTZXJ2aWNlTmFtZSwgJy0tcGFyZW50LW5hbWUnLCAkU2VydmljZU5hbWUsICctLWNyaXRpY2FsaXR5JywgJzMgbm9ybWFsJywgJy0tdHlwZScsICdEZW1vbnN0cmF0aW9uJyApOwojIC0tLQokU2VydmljZU5hbWUgPSAkU2VydmljZU5hbWUgLiAnOjonIC4gJFBhcmVudFNlcnZpY2VOYW1lOwokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAwLAogICAgIlBhcmVudCAodHdvIGxldmVscykgYW5kIGNoaWxkIHNlcnZpY2Ugc2FtZSBuYW1lIC0gJFNlcnZpY2VOYW1lIC0gaXMgY3JlYXRlZCIsCik7CgojIGNsZWFudXAgaXMgZG9uZSBieSBSZXN0b3JlRGF0YWJhc2UKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA5MWMyY2MyOTYyZTVhMDNkNjUzOGNhNjhkNjE5NmMxMTdhNDFhMjlkIC0gc2NyaXB0cy90ZXN0L0dlbmVyaWNJbnRlcmZhY2UvT3BlcmF0aW9uL1RpY2tldC9UaWNrZXRDcmVhdGUudAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKIyMgbm8gY3JpdGljIChNb2R1bGVzOjpSZXF1aXJlRXhwbGljaXRQYWNrYWdlKQp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7Cgp1c2UgU29ja2V0Owp1c2UgTUlNRTo6QmFzZTY0OwoKdXNlIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6RGVidWdnZXI7CnVzZSBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6VGlja2V0OjpUaWNrZXRDcmVhdGU7CnVzZSBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6U2Vzc2lvbjo6U2Vzc2lvbkNyZWF0ZTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyhJc0FycmF5UmVmV2l0aERhdGEgSXNIYXNoUmVmV2l0aERhdGEgSXNTdHJpbmdXaXRoRGF0YSk7CgokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBTa2lwU1NMVmVyaWZ5ICAgICA9PiAxLAogICAgICAgIERpc2FibGVBc3luY0NhbGxzID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKJEhlbHBlci0+e0Rlc3Ryb3lMb2d9ID0gMTsKCm15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgokSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgVmFsaWQgPT4gMSwKICAgIEtleSAgID0+ICdUaWNrZXQ6OlR5cGUnLAogICAgVmFsdWUgPT4gMSwKKTsKCiRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICBWYWxpZCA9PiAxLAogICAgS2V5ICAgPT4gJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJywKICAgIFZhbHVlID0+IDEsCik7CgokSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgVmFsaWQgPT4gMSwKICAgIEtleSAgID0+ICdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScsCiAgICBWYWx1ZSA9PiAxLAopOwoKIyBkaXNhYmxlIEROUyBsb29rdXBzCiRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICBWYWxpZCA9PiAxLAogICAgS2V5ICAgPT4gJ0NoZWNrTVhSZWNvcmQnLAogICAgVmFsdWUgPT4gMCwKKTsKCiRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICBWYWxpZCA9PiAxLAogICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgVmFsdWUgPT4gMSwKKTsKCiMgZGlzYWJsZSBTZXNzaW9uQ2hlY2tSZW1vdGVJUCBzZXR0aW5nCiRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICBWYWxpZCA9PiAxLAogICAgS2V5ICAgPT4gJ1Nlc3Npb25DaGVja1JlbW90ZUlQJywKICAgIFZhbHVlID0+IDAsCik7CgojIGVuYWJsZSBjdXN0b21lciBncm91cHMgc3VwcG9ydAokSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgVmFsaWQgPT4gMSwKICAgIEtleSAgID0+ICdDdXN0b21lckdyb3VwU3VwcG9ydCcsCiAgICBWYWx1ZSA9PiAxLAopOwoKJEtlcm5lbDo6T00tPk9iamVjdHNEaXNjYXJkKAogICAgT2JqZWN0cyAgICAgICAgICAgID0+IFsnS2VybmVsOjpDb25maWcnXSwKICAgIEZvcmNlUGFja2FnZVJlbG9hZCA9PiAxLAopOwoKbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgojIGNoZWNrIGlmIFNTTCBDZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gaXMgZGlzYWJsZWQKJFNlbGYtPklzKAogICAgJEVOVntQRVJMX0xXUF9TU0xfVkVSSUZZX0hPU1ROQU1FfSwKICAgIDAsCiAgICAnRGlzYWJsZWQgU1NMIGNlcnRpZmljYXRlcyB2ZXJpZmljYXRpb24gaW4gZW52aXJvbm1lbnQnCik7CgpteSAkVGVzdE93bmVyTG9naW4gICAgICAgID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoKTsKbXkgJFRlc3RSZXNwb25zaWJsZUxvZ2luICA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKCk7Cm15ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0Q3VzdG9tZXJVc2VyQ3JlYXRlKCk7Cm15ICRUZXN0VXNlckxvZ2luICAgICAgICAgPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycsIF0sCik7CgpteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgpteSAkT3duZXJJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgVXNlckxvZ2luID0+ICRUZXN0T3duZXJMb2dpbiwKKTsKbXkgJFJlc3BvbnNpYmxlSUQgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgIFVzZXJMb2dpbiA9PiAkVGVzdFJlc3BvbnNpYmxlTG9naW4sCik7Cm15ICRVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiwKKTsKCm15ICRJbnZhbGlkSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMb29rdXAoIFZhbGlkID0+ICdpbnZhbGlkJyApOwoKIyBzYW5pdHkgdGVzdAokU2VsZi0+SXNOb3QoCiAgICAkSW52YWxpZElELAogICAgdW5kZWYsCiAgICAiVmFsaWRMb29rdXAoKSBmb3IgJ2ludmFsaWQnIHNob3VsZCBub3QgYmUgdW5kZWYiCik7CgojIGdldCBncm91cCBvYmplY3QKbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CgojIGNyZWF0ZSBhIG5ldyBncm91cApteSAkR3JvdXBJRCA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICBOYW1lICAgID0+ICdUZXN0U3BlY2lhbCcgLiAkUmFuZG9tSUQsCiAgICBDb21tZW50ID0+ICdjb21tZW50IGRlc2NyaWJpbmcgdGhlIGdyb3VwJywgICAgIyBvcHRpb25hbAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKbXkgJUdyb3VwRGF0YSA9ICRHcm91cE9iamVjdC0+R3JvdXBHZXQoIElEID0+ICRHcm91cElEICk7CgojIHNhbml0eSBjaGVjawokU2VsZi0+VHJ1ZSgKICAgIElzSGFzaFJlZldpdGhEYXRhKCBcJUdyb3VwRGF0YSApLAogICAgIkdyb3VwR2V0KCkgLSBmb3IgdGVzdGluZyBncm91cCIKKTsKCiMgY3JlYXRlIHF1ZXVlIG9iamVjdApteSAkUXVldWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKCm15IEBRdWV1ZXM7CgpteSBAUXVldWVQcm9wZXJ0aWVzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ3F1ZXVlMScgLiAkUmFuZG9tSUQsCiAgICAgICAgR3JvdXBJRCA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdxdWV1ZTInIC4gJFJhbmRvbUlELAogICAgICAgIEdyb3VwSUQgPT4gJEdyb3VwSUQsCiAgICB9Cik7CgojIGNyZWF0ZSBxdWV1ZXMKZm9yIG15ICRRdWV1ZVByb3BlcnR5IChAUXVldWVQcm9wZXJ0aWVzKSB7CiAgICBteSAkUXVldWVJRCA9ICRRdWV1ZU9iamVjdC0+UXVldWVBZGQoCiAgICAgICAgJXskUXVldWVQcm9wZXJ0eX0sCiAgICAgICAgVmFsaWRJRCAgICAgICAgID0+IDEsCiAgICAgICAgU3lzdGVtQWRkcmVzc0lEID0+IDEsCiAgICAgICAgU2FsdXRhdGlvbklEICAgID0+IDEsCiAgICAgICAgU2lnbmF0dXJlSUQgICAgID0+IDEsCiAgICAgICAgQ29tbWVudCAgICAgICAgID0+ICdTb21lIGNvbW1lbnQnLAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgKTsKCiAgICAjIHNhbml0eSBjaGVjawogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFF1ZXVlSUQsCiAgICAgICAgIlF1ZXVlQWRkKCkgLSBjcmVhdGUgdGVzdGluZyBxdWV1ZSIKICAgICk7CiAgICBteSAlUXVldWVEYXRhID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUdldCggSUQgPT4gJFF1ZXVlSUQgKTsKCiAgICBwdXNoIEBRdWV1ZXMsIFwlUXVldWVEYXRhOwp9CgojIGdldCB0eXBlIG9iamVjdApteSAkVHlwZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyk7CgojIGNyZWF0ZSBuZXcgdHlwZQpteSAkVHlwZUlEID0gJFR5cGVPYmplY3QtPlR5cGVBZGQoCiAgICBOYW1lICAgID0+ICdUZXN0VHlwZScgLiAkUmFuZG9tSUQsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CgojIHNhbml0eSBjaGVjawokU2VsZi0+VHJ1ZSgKICAgICRUeXBlSUQsCiAgICAiVHlwZUFkZCgpIC0gY3JlYXRlIHRlc3RpbmcgdHlwZSIKKTsKCm15ICVUeXBlRGF0YSA9ICRUeXBlT2JqZWN0LT5UeXBlR2V0KAogICAgSUQgPT4gJFR5cGVJRCwKKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5UcnVlKAogICAgSXNIYXNoUmVmV2l0aERhdGEoIFwlVHlwZURhdGEgKSwKICAgICJUeXBlR2V0KCkgLSBmb3IgdGVzdGluZyB0eXBlIgopOwoKIyBjcmVhdGUgc2VydmljZSBvYmplY3QKbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpOwojIC0tLQojIElUU01Db3JlCiMgLS0tCgojIGdldCB0aGUgbGlzdCBvZiBzZXJ2aWNlIHR5cGVzIGZyb20gZ2VuZXJhbCBjYXRhbG9nCm15ICRTZXJ2aWNlVHlwZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICBDbGFzcyA9PiAnSVRTTTo6U2VydmljZTo6VHlwZScsCik7CgojIGJ1aWxkIGEgbG9va3VwIGhhc2gKbXkgJVNlcnZpY2VUeXBlTmFtZTJJRCA9IHJldmVyc2UgJXsgJFNlcnZpY2VUeXBlTGlzdCB9OwoKIyBnZXQgdGhlIGxpc3Qgb2Ygc2xhIHR5cGVzIGZyb20gZ2VuZXJhbCBjYXRhbG9nCm15ICRTTEFUeXBlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpTTEE6OlR5cGUnLAopOwoKIyBidWlsZCBhIGxvb2t1cCBoYXNoCm15ICVTTEFUeXBlTmFtZTJJRCA9IHJldmVyc2UgJXsgJFNMQVR5cGVMaXN0IH07CiMgLS0tCgojIGNyZWF0ZSBuZXcgc2VydmljZQpteSAkU2VydmljZUlEID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VBZGQoCiAgICBOYW1lICAgID0+ICdUZXN0U2VydmljZScgLiAkUmFuZG9tSUQsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgIFR5cGVJRCAgICAgID0+ICRTZXJ2aWNlVHlwZU5hbWUySUR7VHJhaW5pbmd9LAogICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKIyAtLS0KICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5UcnVlKAogICAgJFNlcnZpY2VJRCwKICAgICJTZXJ2aWNlQWRkKCkgLSBjcmVhdGUgdGVzdGluZyBzZXJ2aWNlIgopOwoKbXkgJVNlcnZpY2VEYXRhID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VHZXQoCiAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRCwKICAgIFVzZXJJRCAgICA9PiAxLAopOwoKIyBzYW5pdHkgY2hlY2sKJFNlbGYtPlRydWUoCiAgICBJc0hhc2hSZWZXaXRoRGF0YSggXCVTZXJ2aWNlRGF0YSApLAogICAgIlNlcnZpY2VHZXQoKSAtIGZvciB0ZXN0aW5nIHNlcnZpY2UiCik7CgojIHNldCBzZXJ2aWNlIGZvciB0aGUgY3VzdG9tZXIKJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgU2VydmljZUlEICAgICAgICAgPT4gJFNlcnZpY2VJRCwKICAgIEFjdGl2ZSAgICAgICAgICAgID0+IDEsCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAopOwoKIyBjcmVhdGUgU0xBIG9iamVjdApteSAkU0xBT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNMQScpOwoKIyBjcmVhdGUgbmV3IFNMQQpteSAkU0xBSUQgPSAkU0xBT2JqZWN0LT5TTEFBZGQoCiAgICBOYW1lICAgICAgID0+ICdUZXN0U0xBJyAuICRSYW5kb21JRCwKICAgIFNlcnZpY2VJRHMgPT4gWyRTZXJ2aWNlSURdLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICBUeXBlSUQgICAgID0+ICRTTEFUeXBlTmFtZTJJRHtPdGhlcn0sCiMgLS0tCiAgICBWYWxpZElEICAgID0+IDEsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIHNhbml0eSBjaGVjawokU2VsZi0+VHJ1ZSgKICAgICRTTEFJRCwKICAgICJTTEFBZGQoKSAtIGNyZWF0ZSB0ZXN0aW5nIFNMQSIKKTsKCm15ICVTTEFEYXRhID0gJFNMQU9iamVjdC0+U0xBR2V0KAogICAgU0xBSUQgID0+ICRTTEFJRCwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBzYW5pdHkgY2hlY2sKJFNlbGYtPlRydWUoCiAgICBJc0hhc2hSZWZXaXRoRGF0YSggXCVTTEFEYXRhICksCiAgICAiU0xBR2V0KCkgLSBmb3IgdGVzdGluZyBTTEEiCik7CgojIGNyZWF0ZSBzdGF0ZSBvYmplY3QKbXkgJFN0YXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyk7CgojIGNyZWF0ZSBuZXcgc3RhdGUKbXkgJFN0YXRlSUQgPSAkU3RhdGVPYmplY3QtPlN0YXRlQWRkKAogICAgTmFtZSAgICA9PiAnVGVzdFN0YXRlJyAuICRSYW5kb21JRCwKICAgIFR5cGVJRCAgPT4gMiwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5UcnVlKAogICAgJFN0YXRlSUQsCiAgICAiU3RhdGVBZGQoKSAtIGNyZWF0ZSB0ZXN0aW5nIHN0YXRlIgopOwoKbXkgJVN0YXRlRGF0YSA9ICRTdGF0ZU9iamVjdC0+U3RhdGVHZXQoCiAgICBJRCA9PiAkU3RhdGVJRCwKKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5UcnVlKAogICAgSXNIYXNoUmVmV2l0aERhdGEoIFwlU3RhdGVEYXRhICksCiAgICAiU3RhdGVHZXQoKSAtIGZvciB0ZXN0aW5nIHN0YXRlIgopOwoKIyBjcmVhdGUgcHJpb3JpdHkgb2JqZWN0Cm15ICRQcmlvcml0eU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcmlvcml0eScpOwoKIyBjcmVhdGUgbmV3IHByaW9yaXR5Cm15ICRQcmlvcml0eUlEID0gJFByaW9yaXR5T2JqZWN0LT5Qcmlvcml0eUFkZCgKICAgIE5hbWUgICAgPT4gJ1Rlc3RQcmlvcml0eScgLiAkUmFuZG9tSUQsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CgojIHNhbml0eSBjaGVjawokU2VsZi0+VHJ1ZSgKICAgICRQcmlvcml0eUlELAogICAgIlByaW9yaXR5QWRkKCkgLSBjcmVhdGUgdGVzdGluZyBwcmlvcml0eSIsCik7CgpteSAlUHJpb3JpdHlEYXRhID0gJFByaW9yaXR5T2JqZWN0LT5Qcmlvcml0eUdldCgKICAgIFByaW9yaXR5SUQgPT4gJFByaW9yaXR5SUQsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIHNhbml0eSBjaGVjawokU2VsZi0+VHJ1ZSgKICAgIElzSGFzaFJlZldpdGhEYXRhKCBcJVByaW9yaXR5RGF0YSApLAogICAgIlByaW9yaXR5R2V0KCkgLSBmb3IgdGVzdGluZyBwcmlvcml0eSIKKTsKCiMgY3JlYXRlIGR5bmFtaWMgZmllbGQgb2JqZWN0Cm15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CgojIGFkZCB0ZXh0IGR5bmFtaWMgZmllbGQKbXkgJUR5bmFtaWNGaWVsZFRleHRDb25maWcgPSAoCiAgICBOYW1lICAgICAgID0+ICJVbml0dGVzdDEkUmFuZG9tSUQiLAogICAgRmllbGRPcmRlciA9PiA5OTkxLAogICAgRmllbGRUeXBlICA9PiAnVGV4dCcsCiAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgTGFiZWwgICAgICA9PiAnRGVzY3JpcHRpb24nLAogICAgVmFsaWRJRCAgICA9PiAxLAogICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgRGVmYXVsdFZhbHVlID0+ICcnLAogICAgfSwKKTsKbXkgJEZpZWxkVGV4dElEID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkQWRkKAogICAgJUR5bmFtaWNGaWVsZFRleHRDb25maWcsCiAgICBVc2VySUQgID0+IDEsCiAgICBSZW9yZGVyID0+IDAsCik7CiRTZWxmLT5UcnVlKAogICAgJEZpZWxkVGV4dElELAogICAgIkR5bmFtaWMgRmllbGQgJEZpZWxkVGV4dElEIgopOwoKIyBhZGQgSUQKJER5bmFtaWNGaWVsZFRleHRDb25maWd7SUR9ID0gJEZpZWxkVGV4dElEOwoKIyBhZGQgZHJvcGRvd24gZHluYW1pYyBmaWVsZApteSAlRHluYW1pY0ZpZWxkRHJvcGRvd25Db25maWcgPSAoCiAgICBOYW1lICAgICAgID0+ICJVbml0dGVzdDIkUmFuZG9tSUQiLAogICAgRmllbGRPcmRlciA9PiA5OTkyLAogICAgRmllbGRUeXBlICA9PiAnRHJvcGRvd24nLAogICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgIExhYmVsICAgICAgPT4gJ0Rlc2NyaXB0aW9uJywKICAgIFZhbGlkSUQgICAgPT4gMSwKICAgIENvbmZpZyAgICAgPT4gewogICAgICAgIFBvc3NpYmxlVmFsdWVzID0+IFsKICAgICAgICAgICAgMSA9PiAnT25lJywKICAgICAgICAgICAgMiA9PiAnVHdvJywKICAgICAgICAgICAgMyA9PiAnVGhyZWUnLAogICAgICAgIF0sCiAgICB9LAopOwpteSAkRmllbGREcm9wZG93bklEID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkQWRkKAogICAgJUR5bmFtaWNGaWVsZERyb3Bkb3duQ29uZmlnLAogICAgVXNlcklEICA9PiAxLAogICAgUmVvcmRlciA9PiAwLAopOwokU2VsZi0+VHJ1ZSgKICAgICRGaWVsZERyb3Bkb3duSUQsCiAgICAiRHluYW1pYyBGaWVsZCAkRmllbGREcm9wZG93bklEIgopOwoKIyBhZGQgSUQKJER5bmFtaWNGaWVsZERyb3Bkb3duQ29uZmlne0lEfSA9ICRGaWVsZERyb3Bkb3duSUQ7CgojIGFkZCBtdWx0aXNlbGVjdCBkeW5hbWljIGZpZWxkCm15ICVEeW5hbWljRmllbGRNdWx0aXNlbGVjdENvbmZpZyA9ICgKICAgIE5hbWUgICAgICAgPT4gIlVuaXR0ZXN0MyRSYW5kb21JRCIsCiAgICBGaWVsZE9yZGVyID0+IDk5OTMsCiAgICBGaWVsZFR5cGUgID0+ICdNdWx0aXNlbGVjdCcsCiAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgTGFiZWwgICAgICA9PiAnTXVsdGlzZWxlY3QgbGFiZWwnLAogICAgVmFsaWRJRCAgICA9PiAxLAogICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gWwogICAgICAgICAgICAxID0+ICdWYWx1ZTnDn8O8w58nLAogICAgICAgICAgICAyID0+ICdEaWZmZXJlbnRWYWx1ZScsCiAgICAgICAgICAgIDMgPT4gJzEyMzQ1NjcnLAogICAgICAgIF0sCiAgICB9LAopOwpteSAkRmllbGRNdWx0aXNlbGVjdElEID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkQWRkKAogICAgJUR5bmFtaWNGaWVsZE11bHRpc2VsZWN0Q29uZmlnLAogICAgVXNlcklEICA9PiAxLAogICAgUmVvcmRlciA9PiAwLAopOwokU2VsZi0+VHJ1ZSgKICAgICRGaWVsZE11bHRpc2VsZWN0SUQsCiAgICAiRHluYW1pYyBGaWVsZCAkRmllbGRNdWx0aXNlbGVjdElEIgopOwoKIyBhZGQgSUQKJER5bmFtaWNGaWVsZE11bHRpc2VsZWN0Q29uZmlne0lEfSA9ICRGaWVsZE11bHRpc2VsZWN0SUQ7CgojIGFkZCBkYXRlLXRpbWUgZHluYW1pYyBmaWVsZApteSAlRHluYW1pY0ZpZWxkRGF0ZVRpbWVDb25maWcgPSAoCiAgICBOYW1lICAgICAgID0+ICJVbml0dGVzdDQkUmFuZG9tSUQiLAogICAgRmllbGRPcmRlciA9PiA5OTk0LAogICAgRmllbGRUeXBlICA9PiAnRGF0ZVRpbWUnLAogICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgIExhYmVsICAgICAgPT4gJ0Rlc2NyaXB0aW9uJywKICAgIENvbmZpZyAgICAgPT4gewogICAgICAgIERlZmF1bHRWYWx1ZSAgPT4gMCwKICAgICAgICBZZWFyc0luRnV0dXJlID0+IDAsCiAgICAgICAgWWVhcnNJblBhc3QgICA9PiAwLAogICAgICAgIFllYXJzUGVyaW9kICAgPT4gMCwKICAgIH0sCiAgICBWYWxpZElEID0+IDEsCik7Cm15ICRGaWVsZERhdGVUaW1lSUQgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRBZGQoCiAgICAlRHluYW1pY0ZpZWxkRGF0ZVRpbWVDb25maWcsCiAgICBVc2VySUQgID0+IDEsCiAgICBSZW9yZGVyID0+IDAsCik7CiRTZWxmLT5UcnVlKAogICAgJEZpZWxkRGF0ZVRpbWVJRCwKICAgICJEeW5hbWljIEZpZWxkICRGaWVsZERhdGVUaW1lSUQiCik7CgojIGFkZCBJRAokRHluYW1pY0ZpZWxkRGF0ZVRpbWVDb25maWd7SUR9ID0gJEZpZWxkRGF0ZVRpbWVJRDsKCiMgYWRkIGRhdGUtdGltZSBkeW5hbWljIGZpZWxkCm15ICVEeW5hbWljRmllbGREYXRlQ29uZmlnID0gKAogICAgTmFtZSAgICAgICA9PiAiVW5pdHRlc3Q1JFJhbmRvbUlEIiwKICAgIEZpZWxkT3JkZXIgPT4gOTk5NSwKICAgIEZpZWxkVHlwZSAgPT4gJ0RhdGUnLAogICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgIExhYmVsICAgICAgPT4gJ0Rlc2NyaXB0aW9uJywKICAgIENvbmZpZyAgICAgPT4gewogICAgICAgIERlZmF1bHRWYWx1ZSAgPT4gMCwKICAgICAgICBZZWFyc0luRnV0dXJlID0+IDAsCiAgICAgICAgWWVhcnNJblBhc3QgICA9PiAwLAogICAgICAgIFllYXJzUGVyaW9kICAgPT4gMCwKICAgIH0sCiAgICBWYWxpZElEID0+IDEsCik7Cm15ICRGaWVsZERhdGVJRCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEFkZCgKICAgICVEeW5hbWljRmllbGREYXRlQ29uZmlnLAogICAgVXNlcklEICA9PiAxLAogICAgUmVvcmRlciA9PiAwLAopOwokU2VsZi0+VHJ1ZSgKICAgICRGaWVsZERhdGVJRCwKICAgICJEeW5hbWljIEZpZWxkICRGaWVsZERhdGVJRCIsCik7CgojIGFkZCBJRAokRHluYW1pY0ZpZWxkRGF0ZUNvbmZpZ3tJRH0gPSAkRmllbGREYXRlSUQ7CgojIGNyZWF0ZSB3ZWIgc2VydmljZSBvYmplY3QKbXkgJFdlYnNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJpY0ludGVyZmFjZTo6V2Vic2VydmljZScpOwokU2VsZi0+SXMoCiAgICAnS2VybmVsOjpTeXN0ZW06OkdlbmVyaWNJbnRlcmZhY2U6OldlYnNlcnZpY2UnLAogICAgcmVmICRXZWJzZXJ2aWNlT2JqZWN0LAogICAgJ0NyZWF0ZSB3ZWIgc2VydmljZSBvYmplY3QnCik7CgojIHNldCB3ZWIgc2VydmljZSBuYW1lCm15ICRXZWJzZXJ2aWNlTmFtZSA9ICctVGVzdC0nIC4gJFJhbmRvbUlEOwoKbXkgJFdlYnNlcnZpY2VJRCA9ICRXZWJzZXJ2aWNlT2JqZWN0LT5XZWJzZXJ2aWNlQWRkKAogICAgTmFtZSAgID0+ICRXZWJzZXJ2aWNlTmFtZSwKICAgIENvbmZpZyA9PiB7CiAgICAgICAgRGVidWdnZXIgPT4gewogICAgICAgICAgICBEZWJ1Z1RocmVzaG9sZCA9PiAnZGVidWcnLAogICAgICAgIH0sCiAgICAgICAgUHJvdmlkZXIgPT4gewogICAgICAgICAgICBUcmFuc3BvcnQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKJFNlbGYtPlRydWUoCiAgICAkV2Vic2VydmljZUlELAogICAgIkFkZGVkIHdlYiBzZXJ2aWNlIiwKKTsKCiMgZ2V0IHJlbW90ZSBob3N0IHdpdGggc29tZSBwcmVjYXV0aW9ucyBmb3IgY2VydGFpbiB1bml0IHRlc3Qgc3lzdGVtcwpteSAkSG9zdCA9ICRIZWxwZXItPkdldFRlc3RIVFRQSG9zdG5hbWUoKTsKCiMgcHJlcGFyZSB3ZWIgc2VydmljZSBjb25maWcKbXkgJFJlbW90ZVN5c3RlbSA9CiAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0h0dHBUeXBlJykKICAgIC4gJzovLycKICAgIC4gJEhvc3QKICAgIC4gJy8nCiAgICAuICRDb25maWdPYmplY3QtPkdldCgnU2NyaXB0QWxpYXMnKQogICAgLiAnL25waC1nZW5lcmljaW50ZXJmYWNlLnBsL1dlYnNlcnZpY2VJRC8nCiAgICAuICRXZWJzZXJ2aWNlSUQ7CgpteSAkV2Vic2VydmljZUNvbmZpZyA9IHsKCiAgICAjICAgIE5hbWUgPT4gJycsCiAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICdUZXN0IGZvciBUaWNrZXQgQ29ubmVjdG9yIHVzaW5nIFNPQVAgdHJhbnNwb3J0IGJhY2tlbmQuJywKICAgIERlYnVnZ2VyID0+IHsKICAgICAgICBEZWJ1Z1RocmVzaG9sZCA9PiAnZGVidWcnLAogICAgICAgIFRlc3RNb2RlICAgICAgID0+IDEsCiAgICB9LAogICAgUHJvdmlkZXIgPT4gewogICAgICAgIFRyYW5zcG9ydCA9PiB7CiAgICAgICAgICAgIFR5cGUgICA9PiAnSFRUUDo6U09BUCcsCiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gMTAwMDAwMDAsCiAgICAgICAgICAgICAgICBOYW1lU3BhY2UgPT4gJ2h0dHA6Ly9vdHJzLm9yZy9Tb2FwVGVzdEludGVyZmFjZS8nLAogICAgICAgICAgICAgICAgRW5kcG9pbnQgID0+ICRSZW1vdGVTeXN0ZW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gewogICAgICAgICAgICBUaWNrZXRDcmVhdGUgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnVGlja2V0OjpUaWNrZXRDcmVhdGUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTZXNzaW9uQ3JlYXRlID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1Nlc3Npb246OlNlc3Npb25DcmVhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgUmVxdWVzdGVyID0+IHsKICAgICAgICBUcmFuc3BvcnQgPT4gewogICAgICAgICAgICBUeXBlICAgPT4gJ0hUVFA6OlNPQVAnLAogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgTmFtZVNwYWNlID0+ICdodHRwOi8vb3Rycy5vcmcvU29hcFRlc3RJbnRlcmZhY2UvJywKICAgICAgICAgICAgICAgIEVuY29kaW5nICA9PiAnVVRGLTgnLAogICAgICAgICAgICAgICAgRW5kcG9pbnQgID0+ICRSZW1vdGVTeXN0ZW0sCiAgICAgICAgICAgICAgICBUaW1lb3V0ICAgPT4gMTIwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgSW52b2tlciA9PiB7CiAgICAgICAgICAgIFRpY2tldENyZWF0ZSA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXN0OjpUZXN0U2ltcGxlJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2Vzc2lvbkNyZWF0ZSA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXN0OjpUZXN0U2ltcGxlJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKfTsKCiMgdXBkYXRlIHdlYiBzZXJ2aWNlIHdpdGggcmVhbCBjb25maWcKbXkgJFdlYnNlcnZpY2VVcGRhdGUgPSAkV2Vic2VydmljZU9iamVjdC0+V2Vic2VydmljZVVwZGF0ZSgKICAgIElEICAgICAgPT4gJFdlYnNlcnZpY2VJRCwKICAgIE5hbWUgICAgPT4gJFdlYnNlcnZpY2VOYW1lLAogICAgQ29uZmlnICA9PiAkV2Vic2VydmljZUNvbmZpZywKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKJFNlbGYtPlRydWUoCiAgICAkV2Vic2VydmljZVVwZGF0ZSwKICAgICJVcGRhdGVkIHdlYiBzZXJ2aWNlICRXZWJzZXJ2aWNlSUQgLSAkV2Vic2VydmljZU5hbWUiCik7CgojIEdldCBTZXNzaW9uSUQKIyBjcmVhdGUgcmVxdWVzdGVyIG9iamVjdApteSAkUmVxdWVzdGVyU2Vzc2lvbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJyk7CiRTZWxmLT5JcygKICAgICdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicsCiAgICByZWYgJFJlcXVlc3RlclNlc3Npb25PYmplY3QsCiAgICAnU2Vzc2lvbklEIC0gQ3JlYXRlIHJlcXVlc3RlciBvYmplY3QnCik7CgojIGNyZWF0ZSBhIG5ldyB1c2VyIGZvciBjdXJyZW50IHRlc3QKbXkgJFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ3VzZXJzJyBdLAopOwpteSAkUGFzc3dvcmQgPSAkVXNlckxvZ2luOwoKIyBjcmVhdGUgYSBuZXcgdXNlciB3aXRob3V0IHBlcm1pc3Npb25zIGZvciBjdXJyZW50IHRlc3QKbXkgJFVzZXJMb2dpbjIgPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgpOwpteSAkUGFzc3dvcmQyICA9ICRVc2VyTG9naW4yOwoKIyBjcmVhdGUgYSBjdXN0b21lciB3aGVyZSBhIHRpY2tldCB3aWxsIHVzZSBhbmQgd2lsbCBoYXZlIHBlcm1pc3Npb25zCm15ICRDdXN0b21lclVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RDdXN0b21lclVzZXJDcmVhdGUoKTsKbXkgJEN1c3RvbWVyUGFzc3dvcmQgID0gJEN1c3RvbWVyVXNlckxvZ2luOwoKIyBjcmVhdGUgYSBjdXN0b21lciB0aGF0IHdpbGwgbm90IGhhdmUgcGVybWlzc2lvbnMKbXkgJEN1c3RvbWVyVXNlckxvZ2luMiA9ICRIZWxwZXItPlRlc3RDdXN0b21lclVzZXJDcmVhdGUoKTsKbXkgJEN1c3RvbWVyUGFzc3dvcmQyICA9ICRDdXN0b21lclVzZXJMb2dpbjI7CgojIHN0YXJ0IHJlcXVlc3RlciB3aXRoIG91ciB3ZWIgc2VydmljZQpteSAkUmVxdWVzdGVyU2Vzc2lvblJlc3VsdCA9ICRSZXF1ZXN0ZXJTZXNzaW9uT2JqZWN0LT5SdW4oCiAgICBXZWJzZXJ2aWNlSUQgPT4gJFdlYnNlcnZpY2VJRCwKICAgIEludm9rZXIgICAgICA9PiAnU2Vzc2lvbkNyZWF0ZScsCiAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgIFVzZXJMb2dpbiA9PiAkVXNlckxvZ2luLAogICAgICAgIFBhc3N3b3JkICA9PiAkUGFzc3dvcmQsCiAgICB9LAopOwoKbXkgJE5ld1Nlc3Npb25JRCA9ICRSZXF1ZXN0ZXJTZXNzaW9uUmVzdWx0LT57RGF0YX0tPntTZXNzaW9uSUR9OwpteSBAVGVzdHMgICAgICAgID0gKAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdFbXB0eSBSZXF1ZXN0JywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4ge30sCiAgICAgICAgRXhwZWN0ZWREYXRhICAgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ1RpY2tldENyZWF0ZS5NaXNzaW5nUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnTm8gQXJ0aWNsZScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnVGlja2V0Q3JlYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdJbnZhbGlkIFRpY2tldCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ICA9PiAxLAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnVGlja2V0Q3JlYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdJbnZhbGlkIEFydGljbGUnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gMSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnVGlja2V0Q3JlYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdJbnZhbGlkIER5bmFtaWNGaWVsZCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuTWlzc2luZ1BhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgQXR0YWNobWVudCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gMSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnVGlja2V0Q3JlYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdNaXNzaW5nIFRpdGxlJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ1RpY2tldENyZWF0ZS5NaXNzaW5nUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnTWlzc2luZyBDdXN0b21lclVzZXInLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSA9PiAnVGlja2V0IFRpdGxlJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuTWlzc2luZ1BhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgQ3VzdG9tZXJVc2VyJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICdJbnZhbGlkJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ01pc3NpbmcgUXVldWUgb3IgUXVldWVJRCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAnVGlja2V0IFRpdGxlJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ1RpY2tldENyZWF0ZS5NaXNzaW5nUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnSW52YWxpZCBRdWV1ZScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAnVGlja2V0IFRpdGxlJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWUgICAgICAgID0+ICdJbnZhbGlkJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgUXVldWVJRCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAnVGlja2V0IFRpdGxlJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgID0+ICdJbnZhbGlkJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgTG9jaycsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAnVGlja2V0IFRpdGxlJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgID0+ICRRdWV1ZXNbMF0tPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgICAgICA9PiAnSW52YWxpZCcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnVGlja2V0Q3JlYXRlLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdJbnZhbGlkIExvY2tJRCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAnVGlja2V0IFRpdGxlJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgID0+ICRRdWV1ZXNbMF0tPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIExvY2tJRCAgICAgICA9PiAnSW52YWxpZCcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnVGlja2V0Q3JlYXRlLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdNaXNzaW5nIFR5cGUgb3IgVHlwZUlEJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gJFF1ZXVlc1swXS0+e1F1ZXVlSUR9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ1RpY2tldENyZWF0ZS5NaXNzaW5nUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnSW52YWxpZCBUeXBlJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gJFF1ZXVlc1swXS0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdJbnZhbGlkJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgVHlwZUlEJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gJFF1ZXVlc1swXS0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVHlwZUlEICAgICAgID0+ICdJbnZhbGlkJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgU2VydmljZScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAnVGlja2V0IFRpdGxlJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgID0+ICRRdWV1ZXNbMF0tPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICA9PiAkVHlwZUlELAogICAgICAgICAgICAgICAgU2VydmljZSAgICAgID0+ICdJbnZhbGlkJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgU2VydmljZScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAnVGlja2V0IFRpdGxlJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgID0+ICRRdWV1ZXNbMF0tPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICA9PiAkVHlwZUlELAogICAgICAgICAgICAgICAgU2VydmljZUlEICAgID0+ICdJbnZhbGlkJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgU0xBJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gJFF1ZXVlc1swXS0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVHlwZUlEICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIFNMQSAgICAgICAgICA9PiAnSW52YWxpZCcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnVGlja2V0Q3JlYXRlLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdJbnZhbGlkIFNMQUlEJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gJFF1ZXVlc1swXS0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVHlwZUlEICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICA9PiAnSW52YWxpZCcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnVGlja2V0Q3JlYXRlLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdNaXNzaW5nIFN0YXRlIG9yIFN0YXRlSUQnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJ1RpY2tldCBUaXRsZScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgU0xBSUQgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuTWlzc2luZ1BhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgU3RhdGUnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJ1RpY2tldCBUaXRsZScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgU0xBSUQgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnSW52YWxpZCcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnVGlja2V0Q3JlYXRlLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdJbnZhbGlkIFN0YXRlSUQnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJ1RpY2tldCBUaXRsZScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgU0xBSUQgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICA9PiAnSW52YWxpZCcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnVGlja2V0Q3JlYXRlLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdNaXNzaW5nIFByaW9yaXR5IG9yIFByaW9yaXR5SUQnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJ1RpY2tldCBUaXRsZScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgU0xBSUQgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuTWlzc2luZ1BhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgUHJpb3JpdHknLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJ1RpY2tldCBUaXRsZScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgU0xBSUQgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICA9PiAnSW52YWxpZCcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnVGlja2V0Q3JlYXRlLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdJbnZhbGlkIFByaW9yaXR5SUQnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJ1RpY2tldCBUaXRsZScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgU0xBSUQgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICA9PiAnSW52YWxpZCcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnVGlja2V0Q3JlYXRlLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdJbnZhbGlkIE93bmVyJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gJFF1ZXVlc1swXS0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVHlwZUlEICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICA9PiAkU0xBSUQsCiAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgPT4gJFByaW9yaXR5SUQsCiAgICAgICAgICAgICAgICBPd25lciAgICAgICAgPT4gJ0ludmFsaWQnIC4gJFJhbmRvbUlELAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ1RpY2tldENyZWF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnSW52YWxpZCBPd25lcklEJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gJFF1ZXVlc1swXS0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVHlwZUlEICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICA9PiAkU0xBSUQsCiAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgPT4gJFByaW9yaXR5SUQsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgPT4gJ0ludmFsaWQnIC4gJFJhbmRvbUlELAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ1RpY2tldENyZWF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnSW52YWxpZCBSZXNwb25zaWJsZScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAnVGlja2V0IFRpdGxlJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgID0+ICRRdWV1ZXNbMF0tPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICA9PiAkVHlwZUlELAogICAgICAgICAgICAgICAgU2VydmljZUlEICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgID0+ICRTdGF0ZUlELAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgID0+ICRPd25lcklELAogICAgICAgICAgICAgICAgUmVzcG9uc2libGUgID0+ICdJbnZhbGlkJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgUmVzcG9uc2liZUlEJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICA9PiAnVGlja2V0IFRpdGxlJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlc1swXS0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAkVHlwZUlELAogICAgICAgICAgICAgICAgU2VydmljZUlEICAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgU0xBSUQgICAgICAgICA9PiAkU0xBSUQsCiAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICAgID0+ICRTdGF0ZUlELAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgICA9PiAkUHJpb3JpdHlJRCwKICAgICAgICAgICAgICAgIE93bmVySUQgICAgICAgPT4gJE93bmVySUQsCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZUlEID0+ICdJbnZhbGlkJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgUGVuZGluZ1RpbWUnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTMsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ1RpY2tldENyZWF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnSW52YWxpZCBQZW5kaW5nVGltZSBEaWZmJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICA9PiAnVGlja2V0IFRpdGxlJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlc1swXS0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAkVHlwZUlELAogICAgICAgICAgICAgICAgU2VydmljZUlEICAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgU0xBSUQgICAgICAgICA9PiAkU0xBSUQsCiAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICAgID0+ICRTdGF0ZUlELAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgICA9PiAkUHJpb3JpdHlJRCwKICAgICAgICAgICAgICAgIE93bmVySUQgICAgICAgPT4gJE93bmVySUQsCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZUlEID0+ICRSZXNwb25zaWJsZUlELAogICAgICAgICAgICAgICAgUGVuZGluZ1RpbWUgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGlmZiA9PiAtMTIzNDU2LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgUGVuZGluZ1RpbWUgRGlmZiArIEZ1bGwnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBEaWZmICAgPT4gMTIzNDU2LAogICAgICAgICAgICAgICAgICAgIFllYXIgICA9PiAyMDEyLAogICAgICAgICAgICAgICAgICAgIE1vbnRoICA9PiAxMywKICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gMTYsCiAgICAgICAgICAgICAgICAgICAgSG91ciAgID0+IDIwLAogICAgICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiA0OCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnVGlja2V0Q3JlYXRlLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdNaXNzaW5nIFN1YmplY3QnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ1RpY2tldENyZWF0ZS5NaXNzaW5nUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnTWlzc2luZyBCb2R5JywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICA9PiAnVGlja2V0IFRpdGxlJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlc1swXS0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAkVHlwZUlELAogICAgICAgICAgICAgICAgU2VydmljZUlEICAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgU0xBSUQgICAgICAgICA9PiAkU0xBSUQsCiAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICAgID0+ICRTdGF0ZUlELAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgICA9PiAkUHJpb3JpdHlJRCwKICAgICAgICAgICAgICAgIE93bmVySUQgICAgICAgPT4gJE93bmVySUQsCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZUlEID0+ICRSZXNwb25zaWJsZUlELAogICAgICAgICAgICAgICAgUGVuZGluZ1RpbWUgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgWWVhciAgID0+IDIwMTIsCiAgICAgICAgICAgICAgICAgICAgTW9udGggID0+IDEyLAogICAgICAgICAgICAgICAgICAgIERheSAgICA9PiAxNiwKICAgICAgICAgICAgICAgICAgICBIb3VyICAgPT4gMjAsCiAgICAgICAgICAgICAgICAgICAgTWludXRlID0+IDQ4LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBTdWJqZWN0ID0+ICdBcnRpY2xlIHN1YmplY3QnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnVGlja2V0Q3JlYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdNaXNzaW5nIEF1dG9SZXNwb25zZVR5cGUnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgPT4gJ0FydGljbGUgc3ViamVjdCcsCiAgICAgICAgICAgICAgICBCb2R5ICAgID0+ICdBcnRpY2xlIGJvZHknLAogICAgICAgICAgICB9LAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnVGlja2V0Q3JlYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdJbnZhbGlkIEF1dG9SZXNwb25zZVR5cGUnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgPT4gJ0FydGljbGUgc3ViamVjdCcsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgID0+ICdBcnRpY2xlIGJvZHknLAogICAgICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSA9PiAnSW52YWxpZCcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgU2VuZGVyVHlwZScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ1RpY2tldCBUaXRsZScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZXNbMF0tPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICAgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgPT4gJFByaW9yaXR5SUQsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgID0+ICRPd25lcklELAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVJRCA9PiAkUmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgIFBlbmRpbmdUaW1lICAgPT4gewogICAgICAgICAgICAgICAgICAgIFllYXIgICA9PiAyMDEyLAogICAgICAgICAgICAgICAgICAgIE1vbnRoICA9PiAxMiwKICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gMTYsCiAgICAgICAgICAgICAgICAgICAgSG91ciAgID0+IDIwLAogICAgICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiA0OCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJ0FydGljbGUgc3ViamVjdCcsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICA9PiAnQXJ0aWNsZSBib2R5JywKICAgICAgICAgICAgICAgIEF1dG9SZXNwb25zZVR5cGUgICAgID0+ICdhdXRvIHJlcGx5JywKICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdJbnZhbGlkJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgU2VuZGVyVHlwZUlEJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICA9PiAnVGlja2V0IFRpdGxlJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlc1swXS0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAkVHlwZUlELAogICAgICAgICAgICAgICAgU2VydmljZUlEICAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgU0xBSUQgICAgICAgICA9PiAkU0xBSUQsCiAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICAgID0+ICRTdGF0ZUlELAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgICA9PiAkUHJpb3JpdHlJRCwKICAgICAgICAgICAgICAgIE93bmVySUQgICAgICAgPT4gJE93bmVySUQsCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZUlEID0+ICRSZXNwb25zaWJsZUlELAogICAgICAgICAgICAgICAgUGVuZGluZ1RpbWUgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgWWVhciAgID0+IDIwMTIsCiAgICAgICAgICAgICAgICAgICAgTW9udGggID0+IDEyLAogICAgICAgICAgICAgICAgICAgIERheSAgICA9PiAxNiwKICAgICAgICAgICAgICAgICAgICBIb3VyICAgPT4gMjAsCiAgICAgICAgICAgICAgICAgICAgTWludXRlID0+IDQ4LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAnQXJ0aWNsZSBzdWJqZWN0JywKICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIGJvZHknLAogICAgICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgPT4gJ2F1dG8gcmVwbHknLAogICAgICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwKICAgICAgICAgICAgICAgIFNlbmRlclR5cGVJRCAgICAgICAgID0+ICdJbnZhbGlkJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ1RpY2tldENyZWF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnSW52YWxpZCBGcm9tJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICA9PiAnVGlja2V0IFRpdGxlJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlc1swXS0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAkVHlwZUlELAogICAgICAgICAgICAgICAgU2VydmljZUlEICAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgU0xBSUQgICAgICAgICA9PiAkU0xBSUQsCiAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICAgID0+ICRTdGF0ZUlELAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgICA9PiAkUHJpb3JpdHlJRCwKICAgICAgICAgICAgICAgIE93bmVySUQgICAgICAgPT4gJE93bmVySUQsCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZUlEID0+ICRSZXNwb25zaWJsZUlELAogICAgICAgICAgICAgICAgUGVuZGluZ1RpbWUgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgWWVhciAgID0+IDIwMTIsCiAgICAgICAgICAgICAgICAgICAgTW9udGggID0+IDEyLAogICAgICAgICAgICAgICAgICAgIERheSAgICA9PiAxNiwKICAgICAgICAgICAgICAgICAgICBIb3VyICAgPT4gMjAsCiAgICAgICAgICAgICAgICAgICAgTWludXRlID0+IDQ4LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAnQXJ0aWNsZSBzdWJqZWN0JywKICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIGJvZHknLAogICAgICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgPT4gJ2F1dG8gcmVwbHknLAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZUlEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICA9PiAnSW52YWxpZCcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ01pc3NpbmcgQ29udGVudFR5cGUgb3IgTUlNRVR5cGUgYW5kIENoYXJzZXQnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgID0+ICdBcnRpY2xlIHN1YmplY3QnLAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgYm9keScsCiAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlICAgICA9PiAnYXV0byByZXBseScsCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlSUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgID0+ICdlbmpveUBvdHJzLmNvbScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuTWlzc2luZ1BhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgQ29udGVudFR5cGUnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgID0+ICdBcnRpY2xlIHN1YmplY3QnLAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgYm9keScsCiAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlICAgICA9PiAnYXV0byByZXBseScsCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlSUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgID0+ICdlbmpveUBvdHJzLmNvbScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICA9PiAnSW52YWxpZCcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ01pc3NpbmcgQ29udGVudFR5cGUgb3IgTUlNRVR5cGUgYW5kIENoYXJzZXQnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgID0+ICdBcnRpY2xlIHN1YmplY3QnLAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgYm9keScsCiAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlICAgICA9PiAnYXV0byByZXBseScsCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlSUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgID0+ICdlbmpveUBvdHJzLmNvbScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuTWlzc2luZ1BhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgSGlzdG9yeVR5cGUnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgID0+ICdBcnRpY2xlIHN1YmplY3QnLAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgYm9keScsCiAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlICAgICA9PiAnYXV0byByZXBseScsCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlSUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgID0+ICdlbmpveUBvdHJzLmNvbScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEY4JywKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICdJbnZhbGlkJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ1RpY2tldENyZWF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnTWlzc2luZyBUaW1lVW5pdCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ1RpY2tldCBUaXRsZScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZXNbMF0tPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICAgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgPT4gJFByaW9yaXR5SUQsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgID0+ICRPd25lcklELAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVJRCA9PiAkUmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgIFBlbmRpbmdUaW1lICAgPT4gewogICAgICAgICAgICAgICAgICAgIFllYXIgICA9PiAyMDEyLAogICAgICAgICAgICAgICAgICAgIE1vbnRoICA9PiAxMiwKICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gMTYsCiAgICAgICAgICAgICAgICAgICAgSG91ciAgID0+IDIwLAogICAgICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiA0OCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJ0FydGljbGUgc3ViamVjdCcsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICA9PiAnQXJ0aWNsZSBib2R5JywKICAgICAgICAgICAgICAgIEF1dG9SZXNwb25zZVR5cGUgICAgID0+ICdhdXRvIHJlcGx5JywKICAgICAgICAgICAgICAgIFNlbmRlclR5cGVJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAxLAogICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJ2Vuam95QG90cnMuY29tJywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlICAgICAgICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURjgnLAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgPT4gJ05ld1RpY2tldCcsCiAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAnJSAlICcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuTWlzc2luZ1BhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgVGltZVVuaXQnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgID0+ICdBcnRpY2xlIHN1YmplY3QnLAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgYm9keScsCiAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlICAgICA9PiAnYXV0byByZXBseScsCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlSUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgID0+ICdlbmpveUBvdHJzLmNvbScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEY4JywKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICdOZXdUaWNrZXQnLAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgPT4gJyUgJSAnLAogICAgICAgICAgICAgICAgVGltZVVuaXQgICAgICAgICAgICAgPT4gJ0ludmFsaWQnIC4gJFJhbmRvbUlELAogICAgICAgICAgICB9LAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnVGlja2V0Q3JlYXRlLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdJbnZhbGlkIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgc3ViamVjdCcsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIGJvZHknLAogICAgICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgICAgICA9PiAnYXV0byByZXBseScsCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlSUQgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgID0+ICdlbmpveUBvdHJzLmNvbScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICAgICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURjgnLAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgICAgICA9PiAnTmV3VGlja2V0JywKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgICAgICAgPT4gJyUgJSAnLAogICAgICAgICAgICAgICAgVGltZVVuaXQgICAgICAgICAgICAgICAgICA9PiAyNSwKICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgPT4gewogICAgICAgICAgICAgICAgICAgIEl0ZW0gPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgRm9yY2VOb3RpZmljYXRpb25Ub1VzZXJJRCBJbnRlcm5hbCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ1RpY2tldCBUaXRsZScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZXNbMF0tPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICAgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgPT4gJFByaW9yaXR5SUQsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgID0+ICRPd25lcklELAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVJRCA9PiAkUmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgIFBlbmRpbmdUaW1lICAgPT4gewogICAgICAgICAgICAgICAgICAgIFllYXIgICA9PiAyMDEyLAogICAgICAgICAgICAgICAgICAgIE1vbnRoICA9PiAxMiwKICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gMTYsCiAgICAgICAgICAgICAgICAgICAgSG91ciAgID0+IDIwLAogICAgICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiA0OCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICA9PiAnQXJ0aWNsZSBzdWJqZWN0JywKICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgYm9keScsCiAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlICAgICAgICAgID0+ICdhdXRvIHJlcGx5JywKICAgICAgICAgICAgICAgIFNlbmRlclR5cGVJRCAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgICAgICAgPT4gJ2Vuam95QG90cnMuY29tJywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlICAgICAgICAgICAgICAgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGOCcsCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICAgICAgID0+ICdOZXdUaWNrZXQnLAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgICAgICA9PiAnJSAlICcsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgICAgICAgICAgICAgICAgID0+IDI1LAogICAgICAgICAgICAgICAgRm9yY2VOb3RpZmljYXRpb25Ub1VzZXJJRCA9PiBbICdJbnZhbGlkJyAuICRSYW5kb21JRCBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnVGlja2V0Q3JlYXRlLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdJbnZhbGlkIEV4Y2x1ZGVOb3RpZmljYXRpb25Ub1VzZXJJRCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ1RpY2tldCBUaXRsZScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZXNbMF0tPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICAgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgPT4gJFByaW9yaXR5SUQsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgID0+ICRPd25lcklELAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVJRCA9PiAkUmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgIFBlbmRpbmdUaW1lICAgPT4gewogICAgICAgICAgICAgICAgICAgIFllYXIgICA9PiAyMDEyLAogICAgICAgICAgICAgICAgICAgIE1vbnRoICA9PiAxMiwKICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gMTYsCiAgICAgICAgICAgICAgICAgICAgSG91ciAgID0+IDIwLAogICAgICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiA0OCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIHN1YmplY3QnLAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIGJvZHknLAogICAgICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgICAgICAgID0+ICdhdXRvIHJlcGx5JywKICAgICAgICAgICAgICAgIFNlbmRlclR5cGVJRCAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2Vuam95QG90cnMuY29tJywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlICAgICAgICAgICAgICAgICA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEY4JywKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgICAgICAgICA9PiAnTmV3VGlja2V0JywKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgICAgICAgICA9PiAnJSAlICcsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgICAgICAgICAgICAgICAgICAgPT4gMjUsCiAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU5vdGlmaWNhdGlvblRvVXNlcklEID0+IHsKICAgICAgICAgICAgICAgICAgICBJdGVtID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnVGlja2V0Q3JlYXRlLkludmFsaWRQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdJbnZhbGlkIEV4Y2x1ZGVOb3RpZmljYXRpb25Ub1VzZXJJRCBpbnRlcm5hbCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ1RpY2tldCBUaXRsZScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZXNbMF0tPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICAgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgPT4gJFByaW9yaXR5SUQsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgID0+ICRPd25lcklELAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVJRCA9PiAkUmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgIFBlbmRpbmdUaW1lICAgPT4gewogICAgICAgICAgICAgICAgICAgIFllYXIgICA9PiAyMDEyLAogICAgICAgICAgICAgICAgICAgIE1vbnRoICA9PiAxMiwKICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gMTYsCiAgICAgICAgICAgICAgICAgICAgSG91ciAgID0+IDIwLAogICAgICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiA0OCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIHN1YmplY3QnLAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIGJvZHknLAogICAgICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgICAgICAgID0+ICdhdXRvIHJlcGx5JywKICAgICAgICAgICAgICAgIFNlbmRlclR5cGVJRCAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2Vuam95QG90cnMuY29tJywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlICAgICAgICAgICAgICAgICA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEY4JywKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgICAgICAgICA9PiAnTmV3VGlja2V0JywKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgICAgICAgICA9PiAnJSAlICcsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgICAgICAgICAgICAgICAgICAgPT4gMjUsCiAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU5vdGlmaWNhdGlvblRvVXNlcklEID0+IFsgJ0ludmFsaWQnIC4gJFJhbmRvbUlEIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgRXhjbHVkZU11dGVOb3RpZmljYXRpb25Ub1VzZXJJRCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ1RpY2tldCBUaXRsZScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZXNbMF0tPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICAgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgPT4gJFByaW9yaXR5SUQsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgID0+ICRPd25lcklELAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVJRCA9PiAkUmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgIFBlbmRpbmdUaW1lICAgPT4gewogICAgICAgICAgICAgICAgICAgIFllYXIgICA9PiAyMDEyLAogICAgICAgICAgICAgICAgICAgIE1vbnRoICA9PiAxMiwKICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gMTYsCiAgICAgICAgICAgICAgICAgICAgSG91ciAgID0+IDIwLAogICAgICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiA0OCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXJ0aWNsZSBzdWJqZWN0JywKICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgYm9keScsCiAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlICAgICAgICAgICAgICAgID0+ICdhdXRvIHJlcGx5JywKICAgICAgICAgICAgICAgIFNlbmRlclR5cGVJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2Vuam95QG90cnMuY29tJywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGOCcsCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICdOZXdUaWNrZXQnLAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgICAgICAgICAgICA9PiAnJSAlICcsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgICAgICAgICAgICAgICAgICAgICAgID0+IDI1LAogICAgICAgICAgICAgICAgRm9yY2VOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgICAgICBFeGNsdWRlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgID0+IFskVXNlcklEXSwKICAgICAgICAgICAgICAgIEV4Y2x1ZGVNdXRlTm90aWZpY2F0aW9uVG9Vc2VySUQgPT4gewogICAgICAgICAgICAgICAgICAgIEl0ZW0gPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgRXhjbHVkZU11dGVOb3RpZmljYXRpb25Ub1VzZXJJRCBpbnRlcm5hbCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ1RpY2tldCBUaXRsZScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZXNbMF0tPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICAgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgPT4gJFByaW9yaXR5SUQsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgID0+ICRPd25lcklELAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVJRCA9PiAkUmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgIFBlbmRpbmdUaW1lICAgPT4gewogICAgICAgICAgICAgICAgICAgIFllYXIgICA9PiAyMDEyLAogICAgICAgICAgICAgICAgICAgIE1vbnRoICA9PiAxMiwKICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gMTYsCiAgICAgICAgICAgICAgICAgICAgSG91ciAgID0+IDIwLAogICAgICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiA0OCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXJ0aWNsZSBzdWJqZWN0JywKICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgYm9keScsCiAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlICAgICAgICAgICAgICAgID0+ICdhdXRvIHJlcGx5JywKICAgICAgICAgICAgICAgIFNlbmRlclR5cGVJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2Vuam95QG90cnMuY29tJywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGOCcsCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICdOZXdUaWNrZXQnLAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgICAgICAgICAgICA9PiAnJSAlICcsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgICAgICAgICAgICAgICAgICAgICAgID0+IDI1LAogICAgICAgICAgICAgICAgRm9yY2VOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgICAgICBFeGNsdWRlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgID0+IFskVXNlcklEXSwKICAgICAgICAgICAgICAgIEV4Y2x1ZGVNdXRlTm90aWZpY2F0aW9uVG9Vc2VySUQgPT4gWyAnSW52YWxpZCcgLiAkUmFuZG9tSUQgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ1RpY2tldENyZWF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnTWlzc2luZyBEeW5hbWljRmllbGQgbmFtZScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ1RpY2tldCBUaXRsZScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZXNbMF0tPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICAgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgPT4gJFByaW9yaXR5SUQsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgID0+ICRPd25lcklELAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVJRCA9PiAkUmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgIFBlbmRpbmdUaW1lICAgPT4gewogICAgICAgICAgICAgICAgICAgIFllYXIgICA9PiAyMDEyLAogICAgICAgICAgICAgICAgICAgIE1vbnRoICA9PiAxMiwKICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gMTYsCiAgICAgICAgICAgICAgICAgICAgSG91ciAgID0+IDIwLAogICAgICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiA0OCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXJ0aWNsZSBzdWJqZWN0JywKICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgYm9keScsCiAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlICAgICAgICAgICAgICAgID0+ICdhdXRvIHJlcGx5JywKICAgICAgICAgICAgICAgIFNlbmRlclR5cGVJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2Vuam95QG90cnMuY29tJywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGOCcsCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICdOZXdUaWNrZXQnLAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgICAgICAgICAgICA9PiAnJSAlICcsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgICAgICAgICAgICAgICAgICAgICAgID0+IDI1LAogICAgICAgICAgICAgICAgRm9yY2VOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgICAgICBFeGNsdWRlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgID0+IFskVXNlcklEXSwKICAgICAgICAgICAgICAgIEV4Y2x1ZGVNdXRlTm90aWZpY2F0aW9uVG9Vc2VySUQgPT4gWyRVc2VySURdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgIFRlc3QgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnVGlja2V0Q3JlYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdNaXNzaW5nIER5bmFtaWNGaWVsZCB2YWx1ZScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ1RpY2tldCBUaXRsZScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZXNbMF0tPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICAgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgPT4gJFByaW9yaXR5SUQsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgID0+ICRPd25lcklELAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVJRCA9PiAkUmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgIFBlbmRpbmdUaW1lICAgPT4gewogICAgICAgICAgICAgICAgICAgIFllYXIgICA9PiAyMDEyLAogICAgICAgICAgICAgICAgICAgIE1vbnRoICA9PiAxMiwKICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gMTYsCiAgICAgICAgICAgICAgICAgICAgSG91ciAgID0+IDIwLAogICAgICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiA0OCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXJ0aWNsZSBzdWJqZWN0JywKICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgYm9keScsCiAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlICAgICAgICAgICAgICAgID0+ICdhdXRvIHJlcGx5JywKICAgICAgICAgICAgICAgIFNlbmRlclR5cGVJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2Vuam95QG90cnMuY29tJywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGOCcsCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICdOZXdUaWNrZXQnLAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgICAgICAgICAgICA9PiAnJSAlICcsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgICAgICAgICAgICAgICAgICAgICAgID0+IDI1LAogICAgICAgICAgICAgICAgRm9yY2VOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgICAgICBFeGNsdWRlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgID0+IFskVXNlcklEXSwKICAgICAgICAgICAgICAgIEV4Y2x1ZGVNdXRlTm90aWZpY2F0aW9uVG9Vc2VySUQgPT4gWyRVc2VySURdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW52YWxpZCcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgVGVzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuTWlzc2luZ1BhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgRHluYW1pY0ZpZWxkIG5hbWUnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgc3ViamVjdCcsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIGJvZHknLAogICAgICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgICAgICAgICAgICA9PiAnYXV0byByZXBseScsCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlSUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdlbmpveUBvdHJzLmNvbScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURjgnLAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAnTmV3VGlja2V0JywKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgICAgICAgICAgICAgPT4gJyUgJSAnLAogICAgICAgICAgICAgICAgVGltZVVuaXQgICAgICAgICAgICAgICAgICAgICAgICA9PiAyNSwKICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgICAgICBFeGNsdWRlTXV0ZU5vdGlmaWNhdGlvblRvVXNlcklEID0+IFskVXNlcklEXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICdJbnZhbGlkJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICdJbnZhbGlkJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ1RpY2tldENyZWF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnSW52YWxpZCBEeW5hbWljRmllbGQgdmFsdWUnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgc3ViamVjdCcsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIGJvZHknLAogICAgICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgICAgICAgICAgICA9PiAnYXV0byByZXBseScsCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlSUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdlbmpveUBvdHJzLmNvbScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURjgnLAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAnTmV3VGlja2V0JywKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgICAgICAgICAgICAgPT4gJyUgJSAnLAogICAgICAgICAgICAgICAgVGltZVVuaXQgICAgICAgICAgICAgICAgICAgICAgICA9PiAyNSwKICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgICAgICBFeGNsdWRlTXV0ZU5vdGlmaWNhdGlvblRvVXNlcklEID0+IFskVXNlcklEXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGREYXRlVGltZUNvbmZpZ3tOYW1lfSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICdJbnZhbGlkJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ1RpY2tldENyZWF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnTWlzc2luZyBhdHRhY2htZW50IENvbnRlbnQnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgc3ViamVjdCcsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIGJvZHknLAogICAgICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgICAgICAgICAgICA9PiAnYXV0byByZXBseScsCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlSUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdlbmpveUBvdHJzLmNvbScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURjgnLAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAnTmV3VGlja2V0JywKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgICAgICAgICAgICAgPT4gJyUgJSAnLAogICAgICAgICAgICAgICAgVGltZVVuaXQgICAgICAgICAgICAgICAgICAgICAgICA9PiAyNSwKICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgICAgICBFeGNsdWRlTXV0ZU5vdGlmaWNhdGlvblRvVXNlcklEID0+IFskVXNlcklEXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGREYXRlVGltZUNvbmZpZ3tOYW1lfSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICcyMDEyLTAxLTE3IDEyOjQwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICBUZXN0ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ1RpY2tldENyZWF0ZS5NaXNzaW5nUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnTWlzc2luZyBhdHRhY2htZW50IENvbnRlbnRUeXBlJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICA9PiAnVGlja2V0IFRpdGxlJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlc1swXS0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAkVHlwZUlELAogICAgICAgICAgICAgICAgU2VydmljZUlEICAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgU0xBSUQgICAgICAgICA9PiAkU0xBSUQsCiAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICAgID0+ICRTdGF0ZUlELAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgICA9PiAkUHJpb3JpdHlJRCwKICAgICAgICAgICAgICAgIE93bmVySUQgICAgICAgPT4gJE93bmVySUQsCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZUlEID0+ICRSZXNwb25zaWJsZUlELAogICAgICAgICAgICAgICAgUGVuZGluZ1RpbWUgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgWWVhciAgID0+IDIwMTIsCiAgICAgICAgICAgICAgICAgICAgTW9udGggID0+IDEyLAogICAgICAgICAgICAgICAgICAgIERheSAgICA9PiAxNiwKICAgICAgICAgICAgICAgICAgICBIb3VyICAgPT4gMjAsCiAgICAgICAgICAgICAgICAgICAgTWludXRlID0+IDQ4LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIHN1YmplY3QnLAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXJ0aWNsZSBib2R5JywKICAgICAgICAgICAgICAgIEF1dG9SZXNwb25zZVR5cGUgICAgICAgICAgICAgICAgPT4gJ2F1dG8gcmVwbHknLAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZUlEICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnZW5qb3lAb3Rycy5jb20nLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEY4JywKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ05ld1RpY2tldCcsCiAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICAgICAgICAgICAgID0+ICclICUgJywKICAgICAgICAgICAgICAgIFRpbWVVbml0ICAgICAgICAgICAgICAgICAgICAgICAgPT4gMjUsCiAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICAgID0+IFskVXNlcklEXSwKICAgICAgICAgICAgICAgIEV4Y2x1ZGVOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU11dGVOb3RpZmljYXRpb25Ub1VzZXJJRCA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkRGF0ZVRpbWVDb25maWd7TmFtZX0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnMjAxMi0wMS0xNyAxMjo0MDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAnVkdocGN5QnBjeUJoSUhSbGMzUWdkR1Y0ZEM0PScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ1RpY2tldENyZWF0ZS5NaXNzaW5nUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnTWlzc2luZyBhdHRhY2htZW50IEZpbGVuYW1lJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDAsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICA9PiAnVGlja2V0IFRpdGxlJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlc1swXS0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAkVHlwZUlELAogICAgICAgICAgICAgICAgU2VydmljZUlEICAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgU0xBSUQgICAgICAgICA9PiAkU0xBSUQsCiAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICAgID0+ICRTdGF0ZUlELAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgICA9PiAkUHJpb3JpdHlJRCwKICAgICAgICAgICAgICAgIE93bmVySUQgICAgICAgPT4gJE93bmVySUQsCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZUlEID0+ICRSZXNwb25zaWJsZUlELAogICAgICAgICAgICAgICAgUGVuZGluZ1RpbWUgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgWWVhciAgID0+IDIwMTIsCiAgICAgICAgICAgICAgICAgICAgTW9udGggID0+IDEyLAogICAgICAgICAgICAgICAgICAgIERheSAgICA9PiAxNiwKICAgICAgICAgICAgICAgICAgICBIb3VyICAgPT4gMjAsCiAgICAgICAgICAgICAgICAgICAgTWludXRlID0+IDQ4LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIHN1YmplY3QnLAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXJ0aWNsZSBib2R5JywKICAgICAgICAgICAgICAgIEF1dG9SZXNwb25zZVR5cGUgICAgICAgICAgICAgICAgPT4gJ2F1dG8gcmVwbHknLAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZUlEICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnZW5qb3lAb3Rycy5jb20nLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEY4JywKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ05ld1RpY2tldCcsCiAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICAgICAgICAgICAgID0+ICclICUgJywKICAgICAgICAgICAgICAgIFRpbWVVbml0ICAgICAgICAgICAgICAgICAgICAgICAgPT4gMjUsCiAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICAgID0+IFskVXNlcklEXSwKICAgICAgICAgICAgICAgIEV4Y2x1ZGVOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU11dGVOb3RpZmljYXRpb25Ub1VzZXJJRCA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkRGF0ZVRpbWVDb25maWd7TmFtZX0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnMjAxMi0wMS0xNyAxMjo0MDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJ1ZHaHBjeUJwY3lCaElIUmxjM1FnZEdWNGRDND0nLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ0ludmFsaWQnIC4gJFJhbmRvbUlELAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuTWlzc2luZ1BhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0ludmFsaWQgYXR0YWNobWVudCBDb250ZW50VHlwZScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ1RpY2tldCBUaXRsZScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZXNbMF0tPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICAgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgPT4gJFByaW9yaXR5SUQsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgID0+ICRPd25lcklELAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVJRCA9PiAkUmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgIFBlbmRpbmdUaW1lICAgPT4gewogICAgICAgICAgICAgICAgICAgIFllYXIgICA9PiAyMDEyLAogICAgICAgICAgICAgICAgICAgIE1vbnRoICA9PiAxMiwKICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gMTYsCiAgICAgICAgICAgICAgICAgICAgSG91ciAgID0+IDIwLAogICAgICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiA0OCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXJ0aWNsZSBzdWJqZWN0JywKICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgYm9keScsCiAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlICAgICAgICAgICAgICAgID0+ICdhdXRvIHJlcGx5JywKICAgICAgICAgICAgICAgIFNlbmRlclR5cGVJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2Vuam95QG90cnMuY29tJywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGOCcsCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICdOZXdUaWNrZXQnLAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgICAgICAgICAgICA9PiAnJSAlICcsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgICAgICAgICAgICAgICAgICAgICAgID0+IDI1LAogICAgICAgICAgICAgICAgRm9yY2VOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgICAgICBFeGNsdWRlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgID0+IFskVXNlcklEXSwKICAgICAgICAgICAgICAgIEV4Y2x1ZGVNdXRlTm90aWZpY2F0aW9uVG9Vc2VySUQgPT4gWyRVc2VySURdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZERhdGVUaW1lQ29uZmlne05hbWV9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJzIwMTItMDEtMTcgMTI6NDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICdWR2hwY3lCcGN5QmhJSFJsYzNRZ2RHVjRkQzQ9JywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdJbnZhbGlkJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdUZXN0LnR4dCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ1RpY2tldENyZWF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnVGlja2V0IHdpdGggSURzJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICA9PiAnVGlja2V0IFRpdGxlJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlc1swXS0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAkVHlwZUlELAogICAgICAgICAgICAgICAgU2VydmljZUlEICAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgU0xBSUQgICAgICAgICA9PiAkU0xBSUQsCiAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICAgID0+ICRTdGF0ZUlELAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgICA9PiAkUHJpb3JpdHlJRCwKICAgICAgICAgICAgICAgIE93bmVySUQgICAgICAgPT4gJE93bmVySUQsCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZUlEID0+ICRSZXNwb25zaWJsZUlELAogICAgICAgICAgICAgICAgUGVuZGluZ1RpbWUgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgWWVhciAgID0+IDIwMTIsCiAgICAgICAgICAgICAgICAgICAgTW9udGggID0+IDEyLAogICAgICAgICAgICAgICAgICAgIERheSAgICA9PiAxNiwKICAgICAgICAgICAgICAgICAgICBIb3VyICAgPT4gMjAsCiAgICAgICAgICAgICAgICAgICAgTWludXRlID0+IDQ4LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIHN1YmplY3QnLAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXJ0aWNsZSBib2R5JywKICAgICAgICAgICAgICAgIEF1dG9SZXNwb25zZVR5cGUgICAgICAgICAgICAgICAgPT4gJ2F1dG8gcmVwbHknLAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZUlEICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnZW5qb3lAb3Rycy5jb20nLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEY4JywKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ05ld1RpY2tldCcsCiAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICAgICAgICAgICAgID0+ICclICUgJywKICAgICAgICAgICAgICAgIFRpbWVVbml0ICAgICAgICAgICAgICAgICAgICAgICAgPT4gMjUsCiAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICAgID0+IFskVXNlcklEXSwKICAgICAgICAgICAgICAgIEV4Y2x1ZGVOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU11dGVOb3RpZmljYXRpb25Ub1VzZXJJRCA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkRGF0ZVRpbWVDb25maWd7TmFtZX0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnMjAxMi0wMS0xNyAxMjo0MDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJ1ZHaHBjeUJwY3lCaElIUmxjM1FnZEdWNGRDND0nLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGOCcsCiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnVGVzdC50eHQnLAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnVGlja2V0IHdpdGggSURzIFBlbmRpbmdUaW1lIERpZmYnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBEaWZmID0+IDEwMDgwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIHN1YmplY3QnLAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXJ0aWNsZSBib2R5JywKICAgICAgICAgICAgICAgIEF1dG9SZXNwb25zZVR5cGUgICAgICAgICAgICAgICAgPT4gJ2F1dG8gcmVwbHknLAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZUlEICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnZW5qb3lAb3Rycy5jb20nLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEY4JywKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ05ld1RpY2tldCcsCiAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICAgICAgICAgICAgID0+ICclICUgJywKICAgICAgICAgICAgICAgIFRpbWVVbml0ICAgICAgICAgICAgICAgICAgICAgICAgPT4gMjUsCiAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICAgID0+IFskVXNlcklEXSwKICAgICAgICAgICAgICAgIEV4Y2x1ZGVOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU11dGVOb3RpZmljYXRpb25Ub1VzZXJJRCA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkRGF0ZVRpbWVDb25maWd7TmFtZX0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnMjAxMi0wMS0xNyAxMjo0MDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJ1ZHaHBjeUJwY3lCaElIUmxjM1FnZEdWNGRDND0nLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGOCcsCiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnVGVzdC50eHQnLAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnVGlja2V0IHdpdGggSURzIChVc2luZyBTZXNzaW9uKScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ1RpY2tldCBUaXRsZScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZXNbMF0tPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICAgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgPT4gJFByaW9yaXR5SUQsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgID0+ICRPd25lcklELAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVJRCA9PiAkUmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgIFBlbmRpbmdUaW1lICAgPT4gewogICAgICAgICAgICAgICAgICAgIFllYXIgICA9PiAyMDEyLAogICAgICAgICAgICAgICAgICAgIE1vbnRoICA9PiAxMiwKICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gMTYsCiAgICAgICAgICAgICAgICAgICAgSG91ciAgID0+IDIwLAogICAgICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiA0OCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXJ0aWNsZSBzdWJqZWN0JywKICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgYm9keScsCiAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlICAgICAgICAgICAgICAgID0+ICdhdXRvIHJlcGx5JywKICAgICAgICAgICAgICAgIFNlbmRlclR5cGVJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2Vuam95QG90cnMuY29tJywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGOCcsCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICdOZXdUaWNrZXQnLAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgICAgICAgICAgICA9PiAnJSAlICcsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgICAgICAgICAgICAgICAgICAgICAgID0+IDI1LAogICAgICAgICAgICAgICAgRm9yY2VOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgICAgICBFeGNsdWRlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgID0+IFskVXNlcklEXSwKICAgICAgICAgICAgICAgIEV4Y2x1ZGVNdXRlTm90aWZpY2F0aW9uVG9Vc2VySUQgPT4gWyRVc2VySURdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZERhdGVUaW1lQ29uZmlne05hbWV9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJzIwMTItMDEtMTcgMTI6NDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICdWR2hwY3lCcGN5QmhJSFJsYzNRZ2RHVjRkQzQ9JywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURjgnLAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ1Rlc3QudHh0JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEF1dGggPT4gewogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJE5ld1Nlc3Npb25JRCwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ1RpY2tldCB3aXRoIENEQVRBIHRhZ3MnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgc3ViamVjdCcsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdUZXN0IGNvbnRlbnQgPFtbaHR0cHM6Ly9leGFtcGxlLmNvbS9dXT4nLAogICAgICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgICAgICAgICAgICA9PiAnYXV0byByZXBseScsCiAgICAgICAgICAgICAgICBBcnRpY2xlVHlwZUlEICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlSUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdlbmpveUBvdHJzLmNvbScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURjgnLAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAnTmV3VGlja2V0JywKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgICAgICAgICAgICAgPT4gJyUgJSAnLAogICAgICAgICAgICAgICAgVGltZVVuaXQgICAgICAgICAgICAgICAgICAgICAgICA9PiAyNSwKICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgICAgICBFeGNsdWRlTXV0ZU5vdGlmaWNhdGlvblRvVXNlcklEID0+IFskVXNlcklEXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGREYXRlVGltZUNvbmZpZ3tOYW1lfSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICcyMDEyLTAxLTE3IDEyOjQwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAnVkdocGN5QnBjeUJoSUhSbGMzUWdkR1Y0ZEM0PScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEY4JywKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdUZXN0LnR4dCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBBdXRoID0+IHsKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICROZXdTZXNzaW9uSUQsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdUaWNrZXQgd2l0aCBOYW1lcycsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAnVGlja2V0IFRpdGxlJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWUgICAgICAgID0+ICRRdWV1ZXNbMF0tPntOYW1lfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAkVHlwZURhdGF7TmFtZX0sCiAgICAgICAgICAgICAgICBTZXJ2aWNlICAgICAgPT4gJFNlcnZpY2VEYXRhe05hbWV9LAogICAgICAgICAgICAgICAgU0xBICAgICAgICAgID0+ICRTTEFEYXRhe05hbWV9LAogICAgICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICRTdGF0ZURhdGF7TmFtZX0sCiAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgPT4gJFByaW9yaXR5RGF0YXtOYW1lfSwKICAgICAgICAgICAgICAgIE93bmVyICAgICAgICA9PiAkVGVzdE93bmVyTG9naW4sCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZSAgPT4gJFRlc3RSZXNwb25zaWJsZUxvZ2luLAogICAgICAgICAgICAgICAgUGVuZGluZ1RpbWUgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgPT4gJ0FydGljbGUgc3ViamVjdCDDpMO2w7zDn8OEw5bDnOKCrNC40YEnLAogICAgICAgICAgICAgICAgQm9keSAgICA9PiAnQXJ0aWNsZSBib2R5IMmfIMmgIMmhIMmiIMmjIMmkIMmlIMmmIMmnIMqAIMqBIMqCIMqDIMqEIMqFIMqGIMqHIMqIIMqJIMqKIMqLIMqMIMqNIMqOJywKICAgICAgICAgICAgICAgIEF1dG9SZXNwb25zZVR5cGUgICAgICAgICAgICAgICAgPT4gJ2F1dG8gcmVwbHknLAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgICAgICAgICAgICA9PiAnYWdlbnQnLAogICAgICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnZW5qb3lAb3Rycy5jb20nLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEY4JywKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ05ld1RpY2tldCcsCiAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICAgICAgICAgICAgID0+ICclICUgJywKICAgICAgICAgICAgICAgIFRpbWVVbml0ICAgICAgICAgICAgICAgICAgICAgICAgPT4gMjUsCiAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICAgID0+IFskVXNlcklEXSwKICAgICAgICAgICAgICAgIEV4Y2x1ZGVOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU11dGVOb3RpZmljYXRpb25Ub1VzZXJJRCA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkRGF0ZVRpbWVDb25maWd7TmFtZX0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnMjAxMi0wMS0xNyAxMjo0MDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJ1ZHaHBjeUJwY3lCaElIUmxjM1FnZEdWNGRDND0nLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGOCcsCiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnVGVzdC50eHQnLAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdUaWNrZXQgd2l0aCBleHRlcm5hbCBjdXN0b21lciB1c2VyJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCAgID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgICA9PiAxLAogICAgICAgIEV4dGVybmFsQ3VzdG9tZXIgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAnVGlja2V0IFRpdGxlJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAnc29tZW9uZUBzb21laG90cy5jb20nLAogICAgICAgICAgICAgICAgUXVldWUgICAgICAgID0+ICRRdWV1ZXNbMF0tPntOYW1lfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAkVHlwZURhdGF7TmFtZX0sCiAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgPT4gJFN0YXRlRGF0YXtOYW1lfSwKICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICA9PiAkUHJpb3JpdHlEYXRhe05hbWV9LAogICAgICAgICAgICAgICAgT3duZXIgICAgICAgID0+ICRUZXN0T3duZXJMb2dpbiwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlICA9PiAkVGVzdFJlc3BvbnNpYmxlTG9naW4sCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgPT4gewogICAgICAgICAgICAgICAgICAgIFllYXIgICA9PiAyMDEyLAogICAgICAgICAgICAgICAgICAgIE1vbnRoICA9PiAxMiwKICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gMTYsCiAgICAgICAgICAgICAgICAgICAgSG91ciAgID0+IDIwLAogICAgICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiA0OCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgU3ViamVjdCA9PiAnQXJ0aWNsZSBzdWJqZWN0IMOkw7bDvMOfw4TDlsOc4oKs0LjRgScsCiAgICAgICAgICAgICAgICBCb2R5ICAgID0+ICdBcnRpY2xlIGJvZHkgyZ8gyaAgyaEgyaIgyaMgyaQgyaUgyaYgyacgyoAgyoEgyoIgyoMgyoQgyoUgyoYgyocgyoggyokgyoogyosgyowgyo0gyo4nLAogICAgICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgICAgICAgICAgICA9PiAnYXV0byByZXBseScsCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICAgICAgICAgICAgID0+ICdhZ2VudCcsCiAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdlbmpveUBvdHJzLmNvbScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURjgnLAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAnTmV3VGlja2V0JywKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgICAgICAgICAgICAgPT4gJyUgJSAnLAogICAgICAgICAgICAgICAgVGltZVVuaXQgICAgICAgICAgICAgICAgICAgICAgICA9PiAyNSwKICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgICAgICBFeGNsdWRlTXV0ZU5vdGlmaWNhdGlvblRvVXNlcklEID0+IFskVXNlcklEXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGREYXRlVGltZUNvbmZpZ3tOYW1lfSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICcyMDEyLTAxLTE3IDEyOjQwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAnVkdocGN5QnBjeUJoSUhSbGMzUWdkR1Y0ZEM0PScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEY4JywKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdUZXN0LnR4dCcsCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdUaWNrZXQgd2l0aCBUaW1lVW5pdHMgMCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAnVGlja2V0IFRpdGxlJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWUgICAgICAgID0+ICRRdWV1ZXNbMF0tPntOYW1lfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAkVHlwZURhdGF7TmFtZX0sCiAgICAgICAgICAgICAgICBTZXJ2aWNlICAgICAgPT4gJFNlcnZpY2VEYXRhe05hbWV9LAogICAgICAgICAgICAgICAgU0xBICAgICAgICAgID0+ICRTTEFEYXRhe05hbWV9LAogICAgICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICRTdGF0ZURhdGF7TmFtZX0sCiAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgPT4gJFByaW9yaXR5RGF0YXtOYW1lfSwKICAgICAgICAgICAgICAgIE93bmVyICAgICAgICA9PiAkVGVzdE93bmVyTG9naW4sCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZSAgPT4gJFRlc3RSZXNwb25zaWJsZUxvZ2luLAogICAgICAgICAgICAgICAgUGVuZGluZ1RpbWUgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgc3ViamVjdCDDpMO2w7zDn8OEw5bDnOKCrNC40YEnLAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXJ0aWNsZSBib2R5JywKICAgICAgICAgICAgICAgIEF1dG9SZXNwb25zZVR5cGUgICAgICAgICAgICAgICAgPT4gJ2F1dG8gcmVwbHknLAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgICAgICAgICAgICA9PiAnYWdlbnQnLAogICAgICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnZW5qb3lAb3Rycy5jb20nLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEY4JywKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ05ld1RpY2tldCcsCiAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICAgICAgICAgICAgID0+ICclICUgJywKICAgICAgICAgICAgICAgIFRpbWVVbml0ICAgICAgICAgICAgICAgICAgICAgICAgPT4gMjUsCiAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICAgID0+IFskVXNlcklEXSwKICAgICAgICAgICAgICAgIEV4Y2x1ZGVOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU11dGVOb3RpZmljYXRpb25Ub1VzZXJJRCA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkRGF0ZVRpbWVDb25maWd7TmFtZX0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnMjAxMi0wMS0xNyAxMjo0MDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJ1ZHaHBjeUJwY3lCaElIUmxjM1FnZEdWNGRDND0nLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGOCcsCiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnVGVzdC50eHQnLAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnVGlja2V0IHdpdGggVGltZVVuaXRzIGZyYWN0aW9uYWwnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJ1RpY2tldCBUaXRsZScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIFF1ZXVlICAgICAgICA9PiAkUXVldWVzWzBdLT57TmFtZX0sCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJFR5cGVEYXRhe05hbWV9LAogICAgICAgICAgICAgICAgU2VydmljZSAgICAgID0+ICRTZXJ2aWNlRGF0YXtOYW1lfSwKICAgICAgICAgICAgICAgIFNMQSAgICAgICAgICA9PiAkU0xBRGF0YXtOYW1lfSwKICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAkU3RhdGVEYXRhe05hbWV9LAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgID0+ICRQcmlvcml0eURhdGF7TmFtZX0sCiAgICAgICAgICAgICAgICBPd25lciAgICAgICAgPT4gJFRlc3RPd25lckxvZ2luLAogICAgICAgICAgICAgICAgUmVzcG9uc2libGUgID0+ICRUZXN0UmVzcG9uc2libGVMb2dpbiwKICAgICAgICAgICAgICAgIFBlbmRpbmdUaW1lICA9PiB7CiAgICAgICAgICAgICAgICAgICAgWWVhciAgID0+IDIwMTIsCiAgICAgICAgICAgICAgICAgICAgTW9udGggID0+IDEyLAogICAgICAgICAgICAgICAgICAgIERheSAgICA9PiAxNiwKICAgICAgICAgICAgICAgICAgICBIb3VyICAgPT4gMjAsCiAgICAgICAgICAgICAgICAgICAgTWludXRlID0+IDQ4LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIHN1YmplY3Qgw6TDtsO8w5/DhMOWw5zigqzQuNGBJywKICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgYm9keScsCiAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlICAgICAgICAgICAgICAgID0+ICdhdXRvIHJlcGx5JywKICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgICAgICAgICAgICAgPT4gJ2FnZW50JywKICAgICAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2Vuam95QG90cnMuY29tJywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGOCcsCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICdOZXdUaWNrZXQnLAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgICAgICAgICAgICA9PiAnJSAlICcsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgICAgICAgICAgICAgICAgICAgICAgID0+IDI1LjUsCiAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICAgID0+IFskVXNlcklEXSwKICAgICAgICAgICAgICAgIEV4Y2x1ZGVOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU11dGVOb3RpZmljYXRpb25Ub1VzZXJJRCA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkRGF0ZVRpbWVDb25maWd7TmFtZX0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnMjAxMi0wMS0xNyAxMjo0MDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJ1ZHaHBjeUJwY3lCaElIUmxjM1FnZEdWNGRDND0nLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGOCcsCiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnVGVzdC50eHQnLAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnVGlja2V0IHdpdGggSURzIEFnZW50IChObyBQZXJtaXNzaW9uKScsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAwLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ1RpY2tldCBUaXRsZScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZXNbMF0tPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICAgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgPT4gJFByaW9yaXR5SUQsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgID0+ICRPd25lcklELAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVJRCA9PiAkUmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgIFBlbmRpbmdUaW1lICAgPT4gewogICAgICAgICAgICAgICAgICAgIFllYXIgICA9PiAyMDEyLAogICAgICAgICAgICAgICAgICAgIE1vbnRoICA9PiAxMiwKICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gMTYsCiAgICAgICAgICAgICAgICAgICAgSG91ciAgID0+IDIwLAogICAgICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiA0OCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXJ0aWNsZSBzdWJqZWN0JywKICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgYm9keScsCiAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlICAgICAgICAgICAgICAgID0+ICdhdXRvIHJlcGx5JywKICAgICAgICAgICAgICAgIFNlbmRlclR5cGVJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2Vuam95QG90cnMuY29tJywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGOCcsCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICdOZXdUaWNrZXQnLAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgICAgICAgICAgICA9PiAnJSAlICcsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgICAgICAgICAgICAgICAgICAgICAgID0+IDI1LAogICAgICAgICAgICAgICAgRm9yY2VOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgICAgICBFeGNsdWRlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgID0+IFskVXNlcklEXSwKICAgICAgICAgICAgICAgIEV4Y2x1ZGVNdXRlTm90aWZpY2F0aW9uVG9Vc2VySUQgPT4gWyRVc2VySURdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZERhdGVUaW1lQ29uZmlne05hbWV9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJzIwMTItMDEtMTcgMTI6NDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICdWR2hwY3lCcGN5QmhJSFJsYzNRZ2RHVjRkQzQ9JywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURjgnLAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ1Rlc3QudHh0JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEF1dGggPT4gewogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFVzZXJMb2dpbjIsCiAgICAgICAgICAgIFBhc3N3b3JkICA9PiAkUGFzc3dvcmQyLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuQWNjZXNzRGVuaWVkJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCgogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ1RpY2tldCB3aXRoIElEcyBDdXN0b21lciAoV2l0aCBQZXJtaXNzaW9ucyknLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgc3ViamVjdCcsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIGJvZHknLAogICAgICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgICAgICAgICAgICA9PiAnYXV0byByZXBseScsCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlSUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdlbmpveUBvdHJzLmNvbScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURjgnLAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAnTmV3VGlja2V0JywKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgICAgICAgICAgICAgPT4gJyUgJSAnLAogICAgICAgICAgICAgICAgVGltZVVuaXQgICAgICAgICAgICAgICAgICAgICAgICA9PiAyNSwKICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgICAgICBFeGNsdWRlTXV0ZU5vdGlmaWNhdGlvblRvVXNlcklEID0+IFskVXNlcklEXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGREYXRlVGltZUNvbmZpZ3tOYW1lfSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICcyMDEyLTAxLTE3IDEyOjQwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAnVkdocGN5QnBjeUJoSUhSbGMzUWdkR1Y0ZEM0PScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEY4JywKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdUZXN0LnR4dCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBBdXRoID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCAgICAgICAgICA9PiAkQ3VzdG9tZXJQYXNzd29yZCwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ1RpY2tldCB3aXRoIElEcyBDdXN0b21lciAoTm8gUGVybWlzc2lvbiknLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzFdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgc3ViamVjdCcsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIGJvZHknLAogICAgICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgICAgICAgICAgICA9PiAnYXV0byByZXBseScsCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlSUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdlbmpveUBvdHJzLmNvbScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURjgnLAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAnTmV3VGlja2V0JywKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgICAgICAgICAgICAgPT4gJyUgJSAnLAogICAgICAgICAgICAgICAgVGltZVVuaXQgICAgICAgICAgICAgICAgICAgICAgICA9PiAyNSwKICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgICAgICBFeGNsdWRlTXV0ZU5vdGlmaWNhdGlvblRvVXNlcklEID0+IFskVXNlcklEXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGREYXRlVGltZUNvbmZpZ3tOYW1lfSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICcyMDEyLTAxLTE3IDEyOjQwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAnVkdocGN5QnBjeUJoSUhSbGMzUWdkR1Y0ZEM0PScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEY4JywKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdUZXN0LnR4dCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBBdXRoID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlckxvZ2luMiwKICAgICAgICAgICAgUGFzc3dvcmQgICAgICAgICAgPT4gJEN1c3RvbWVyUGFzc3dvcmQyLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuQWNjZXNzRGVuaWVkJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnQ3JlYXRlIER5bmFtaWNGaWVsZHMgKHdpdGggZW1wdHkgdmFsdWUpJywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFN1Y2Nlc3NDcmVhdGUgID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICA9PiAnVGlja2V0IFRpdGxlJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlc1swXS0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVHlwZUlEICAgICAgICA9PiAkVHlwZUlELAogICAgICAgICAgICAgICAgU2VydmljZUlEICAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgU0xBSUQgICAgICAgICA9PiAkU0xBSUQsCiAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICAgID0+ICRTdGF0ZUlELAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgICA9PiAkUHJpb3JpdHlJRCwKICAgICAgICAgICAgICAgIE93bmVySUQgICAgICAgPT4gJE93bmVySUQsCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZUlEID0+ICRSZXNwb25zaWJsZUlELAogICAgICAgICAgICAgICAgUGVuZGluZ1RpbWUgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgWWVhciAgID0+IDIwMTIsCiAgICAgICAgICAgICAgICAgICAgTW9udGggID0+IDEyLAogICAgICAgICAgICAgICAgICAgIERheSAgICA9PiAxNiwKICAgICAgICAgICAgICAgICAgICBIb3VyICAgPT4gMjAsCiAgICAgICAgICAgICAgICAgICAgTWludXRlID0+IDQ4LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXJ0aWNsZSA9PiB7CiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIHN1YmplY3QnLAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXJ0aWNsZSBib2R5JywKICAgICAgICAgICAgICAgIEF1dG9SZXNwb25zZVR5cGUgICAgICAgICAgICAgICAgPT4gJ2F1dG8gcmVwbHknLAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZUlEICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnZW5qb3lAb3Rycy5jb20nLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEY4JywKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ05ld1RpY2tldCcsCiAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICAgICAgICAgICAgID0+ICclICUgJywKICAgICAgICAgICAgICAgIFRpbWVVbml0ICAgICAgICAgICAgICAgICAgICAgICAgPT4gMjUsCiAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICAgID0+IFskVXNlcklEXSwKICAgICAgICAgICAgICAgIEV4Y2x1ZGVOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU11dGVOb3RpZmljYXRpb25Ub1VzZXJJRCA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gIlVuaXR0ZXN0MSRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgID0+ICJVbml0dGVzdDIkUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICA9PiAiVW5pdHRlc3QzJFJhbmRvbUlEIiwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJ1ZHaHBjeUJwY3lCaElIUmxjM1FnZEdWNGRDND0nLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGOCcsCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnVGVzdC50eHQnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0NyZWF0ZSBEeW5hbWljRmllbGRzICh3aXRoIG5vdCBlbXB0eSB2YWx1ZSknLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgc3ViamVjdCcsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIGJvZHknLAogICAgICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgICAgICAgICAgICA9PiAnYXV0byByZXBseScsCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlSUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdlbmpveUBvdHJzLmNvbScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURjgnLAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAnTmV3VGlja2V0JywKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgICAgICAgICAgICAgPT4gJyUgJSAnLAogICAgICAgICAgICAgICAgVGltZVVuaXQgICAgICAgICAgICAgICAgICAgICAgICA9PiAyNSwKICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgICAgICBFeGNsdWRlTXV0ZU5vdGlmaWNhdGlvblRvVXNlcklEID0+IFskVXNlcklEXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICA9PiAiVW5pdHRlc3QxJFJhbmRvbUlEIiwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnVmFsdWU5w5/DvMOfLeOCq+OCueOCvzEyMzQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICA9PiAiVW5pdHRlc3QyJFJhbmRvbUlEIiwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnMicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgID0+ICJVbml0dGVzdDMkUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+IFsgMSwgMiBdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAnVkdocGN5QnBjeUJoSUhSbGMzUWdkR1Y0ZEM0PScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEY4JywKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdUZXN0LnR4dCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAoKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnQ3JlYXRlIER5bmFtaWNGaWVsZHMgKHdpdGggd3JvbmcgdmFsdWUgdHlwZSknLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgc3ViamVjdCcsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIGJvZHknLAogICAgICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgICAgICAgICAgICA9PiAnYXV0byByZXBseScsCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlSUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdlbmpveUBvdHJzLmNvbScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURjgnLAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAnTmV3VGlja2V0JywKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgICAgICAgICAgICAgPT4gJyUgJSAnLAogICAgICAgICAgICAgICAgVGltZVVuaXQgICAgICAgICAgICAgICAgICAgICAgICA9PiAyNSwKICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgICAgICBFeGNsdWRlTXV0ZU5vdGlmaWNhdGlvblRvVXNlcklEID0+IFskVXNlcklEXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICA9PiAiVW5pdHRlc3QxJFJhbmRvbUlEIiwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiB7IFdyb25nID0+ICdWYWx1ZScgfSwgICAgIyB2YWx1ZSB0eXBlIGRlcGVuZHMgb24gdGhlIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gIlVuaXR0ZXN0MiRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4geyBXcm9uZyA9PiAnVmFsdWUnIH0sICAgICMgdmFsdWUgdHlwZSBkZXBlbmRzIG9uIHRoZSBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBBdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICdWR2hwY3lCcGN5QmhJSFJsYzNRZ2RHVjRkQzQ9JywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURjgnLAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ1Rlc3QudHh0JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gewogICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9PiAnVGlja2V0Q3JlYXRlLk1pc3NpbmdQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAoKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnQ3JlYXRlIER5bmFtaWNGaWVsZHMgKHdpdGggaW52YWxpZCB2YWx1ZSknLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgc3ViamVjdCcsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIGJvZHknLAogICAgICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgICAgICAgICAgICA9PiAnYXV0byByZXBseScsCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlSUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdlbmpveUBvdHJzLmNvbScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURjgnLAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAnTmV3VGlja2V0JywKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgICAgICAgICAgICAgPT4gJyUgJSAnLAogICAgICAgICAgICAgICAgVGltZVVuaXQgICAgICAgICAgICAgICAgICAgICAgICA9PiAyNSwKICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgICAgICBFeGNsdWRlTXV0ZU5vdGlmaWNhdGlvblRvVXNlcklEID0+IFskVXNlcklEXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICA9PiAiVW5pdHRlc3QyJFJhbmRvbUlEIiwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnNCcsICAgICAgICAgICAgICAgICAgICAjIGludmFsaWQgdmFsdWUKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJ1ZHaHBjeUJwY3lCaElIUmxjM1FnZEdWNGRDND0nLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGOCcsCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnVGVzdC50eHQnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWREYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0+ICdUaWNrZXRDcmVhdGUuSW52YWxpZFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAoKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnVGlja2V0IHdpdGggQWxpYXMgQ2hhcnNldHMgYXR0YWNobWVudCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ1RpY2tldCBUaXRsZScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZXNbMF0tPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICAgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgPT4gJFByaW9yaXR5SUQsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgID0+ICRPd25lcklELAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVJRCA9PiAkUmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgIFBlbmRpbmdUaW1lICAgPT4gewogICAgICAgICAgICAgICAgICAgIFllYXIgICA9PiAyMDEyLAogICAgICAgICAgICAgICAgICAgIE1vbnRoICA9PiAxMiwKICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gMTYsCiAgICAgICAgICAgICAgICAgICAgSG91ciAgID0+IDIwLAogICAgICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiA0OCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXJ0aWNsZSBzdWJqZWN0JywKICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgYm9keScsCiAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlICAgICAgICAgICAgICAgID0+ICdhdXRvIHJlcGx5JywKICAgICAgICAgICAgICAgIEFydGljbGVUeXBlSUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFNlbmRlclR5cGVJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2Vuam95QG90cnMuY29tJywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVMtQVNDSUknLAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAnTmV3VGlja2V0JywKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgICAgICAgICAgICAgPT4gJyUgJSAnLAogICAgICAgICAgICAgICAgVGltZVVuaXQgICAgICAgICAgICAgICAgICAgICAgICA9PiAyNSwKICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgICAgICBFeGNsdWRlTXV0ZU5vdGlmaWNhdGlvblRvVXNlcklEID0+IFskVXNlcklEXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGREYXRlVGltZUNvbmZpZ3tOYW1lfSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICcyMDEyLTAxLTE3IDEyOjQwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAnVkdocGN5QnBjeUJoSUhSbGMzUWdkR1Y0ZEM0PScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1VUy1BU0NJSScsCiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnVGVzdC50eHQnLAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAnQXJ0aWNsZSB3aXRoIEVtYWlsIGNvbW11bmljYXRpb24gY2hhbm5lbCcsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBTdWNjZXNzQ3JlYXRlICA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ1RpY2tldCBUaXRsZScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZXNbMF0tPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICAgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgPT4gJFByaW9yaXR5SUQsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgID0+ICRPd25lcklELAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVJRCA9PiAkUmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgIFBlbmRpbmdUaW1lICAgPT4gewogICAgICAgICAgICAgICAgICAgIFllYXIgICA9PiAyMDEyLAogICAgICAgICAgICAgICAgICAgIE1vbnRoICA9PiAxMiwKICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gMTYsCiAgICAgICAgICAgICAgICAgICAgSG91ciAgID0+IDIwLAogICAgICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiA0OCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFydGljbGUgPT4gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXJ0aWNsZSBzdWJqZWN0JywKICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgYm9keScsCiAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlICAgICAgICAgICAgICAgID0+ICdhdXRvIHJlcGx5JywKICAgICAgICAgICAgICAgIEFydGljbGVUeXBlSUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFNlbmRlclR5cGVJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENvbW11bmljYXRpb25DaGFubmVsICAgICAgICAgICAgPT4gJ0VtYWlsJywKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2Vuam95QG90cnMuY29tJywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVMtQVNDSUknLAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAnTmV3VGlja2V0JywKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgICAgICAgICAgICAgPT4gJyUgJSAnLAogICAgICAgICAgICAgICAgVGltZVVuaXQgICAgICAgICAgICAgICAgICAgICAgICA9PiAyNSwKICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgICAgICBFeGNsdWRlTXV0ZU5vdGlmaWNhdGlvblRvVXNlcklEID0+IFskVXNlcklEXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGREYXRlVGltZUNvbmZpZ3tOYW1lfSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICcyMDEyLTAxLTE3IDEyOjQwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXR0YWNobWVudCA9PiB7CiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAnVkdocGN5QnBjeUJoSUhSbGMzUWdkR1Y0ZEM0PScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1VUy1BU0NJSScsCiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnVGVzdC50eHQnLAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0FydGljbGUgd2l0aCBJbnRlcm5hbCBjb21tdW5pY2F0aW9uIGNoYW5uZWwnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgc3ViamVjdCcsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIGJvZHknLAogICAgICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgICAgICAgICAgICA9PiAnYXV0byByZXBseScsCiAgICAgICAgICAgICAgICBBcnRpY2xlVHlwZUlEICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlSUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDb21tdW5pY2F0aW9uQ2hhbm5lbCAgICAgICAgICAgID0+ICdJbnRlcm5hbCcsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdlbmpveUBvdHJzLmNvbScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVTLUFTQ0lJJywKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ05ld1RpY2tldCcsCiAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICAgICAgICAgICAgID0+ICclICUgJywKICAgICAgICAgICAgICAgIFRpbWVVbml0ICAgICAgICAgICAgICAgICAgICAgICAgPT4gMjUsCiAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICAgID0+IFskVXNlcklEXSwKICAgICAgICAgICAgICAgIEV4Y2x1ZGVOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU11dGVOb3RpZmljYXRpb25Ub1VzZXJJRCA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkRGF0ZVRpbWVDb25maWd7TmFtZX0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnMjAxMi0wMS0xNyAxMjo0MDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJ1ZHaHBjeUJwY3lCaElIUmxjM1FnZEdWNGRDND0nLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVMtQVNDSUknLAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ1Rlc3QudHh0JywKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0FydGljbGUgd2l0aCBQaG9uZSBjb21tdW5pY2F0aW9uIGNoYW5uZWwnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgc3ViamVjdCcsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIGJvZHknLAogICAgICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgICAgICAgICAgICA9PiAnYXV0byByZXBseScsCiAgICAgICAgICAgICAgICBBcnRpY2xlVHlwZUlEICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlSUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDb21tdW5pY2F0aW9uQ2hhbm5lbCAgICAgICAgICAgID0+ICdQaG9uZScsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdlbmpveUBvdHJzLmNvbScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVTLUFTQ0lJJywKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ05ld1RpY2tldCcsCiAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICAgICAgICAgICAgID0+ICclICUgJywKICAgICAgICAgICAgICAgIFRpbWVVbml0ICAgICAgICAgICAgICAgICAgICAgICAgPT4gMjUsCiAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICAgID0+IFskVXNlcklEXSwKICAgICAgICAgICAgICAgIEV4Y2x1ZGVOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU11dGVOb3RpZmljYXRpb25Ub1VzZXJJRCA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkRGF0ZVRpbWVDb25maWd7TmFtZX0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnMjAxMi0wMS0xNyAxMjo0MDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gewogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJ1ZHaHBjeUJwY3lCaElIUmxjM1FnZEdWNGRDND0nLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVMtQVNDSUknLAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ1Rlc3QudHh0JywKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0Q3JlYXRlJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0FydGljbGUgd2l0aCB3cm9uZyBjb21tdW5pY2F0aW9uIGNoYW5uZWwnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMCwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgc3ViamVjdCcsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIGJvZHknLAogICAgICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgICAgICAgICAgICA9PiAnYXV0byByZXBseScsCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlSUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDb21tdW5pY2F0aW9uQ2hhbm5lbCAgICAgICAgICAgID0+ICdUZXN0MTIzJywKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2Vuam95QG90cnMuY29tJywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGOCcsCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICdOZXdUaWNrZXQnLAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgICAgICAgICAgICA9PiAnJSAlICcsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgICAgICAgICAgICAgICAgICAgICAgID0+IDI1LAogICAgICAgICAgICAgICAgRm9yY2VOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgICAgICBFeGNsdWRlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgID0+IFskVXNlcklEXSwKICAgICAgICAgICAgICAgIEV4Y2x1ZGVNdXRlTm90aWZpY2F0aW9uVG9Vc2VySUQgPT4gWyRVc2VySURdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZERhdGVUaW1lQ29uZmlne05hbWV9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJzIwMTItMDEtMTcgMTI6NDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICdWR2hwY3lCcGN5QmhJSFJsYzNRZ2RHVjRkQzQ9JywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVTLUFTQ0lJJywKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdUZXN0LnR4dCcsCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEVycm9yID0+IHsKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPT4gJ1RpY2tldENyZWF0ZS5JbnZhbGlkUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRDcmVhdGUnLAogICAgfSwKKTsKCiMgZGVidWdnZXIgb2JqZWN0Cm15ICREZWJ1Z2dlck9iamVjdCA9IEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6RGVidWdnZXItPm5ldygKICAgIERlYnVnZ2VyQ29uZmlnID0+IHsKICAgICAgICBEZWJ1Z1RocmVzaG9sZCA9PiAnZGVidWcnLAogICAgICAgIFRlc3RNb2RlICAgICAgID0+IDEsCiAgICB9LAogICAgV2Vic2VydmljZUlEICAgICAgPT4gJFdlYnNlcnZpY2VJRCwKICAgIENvbW11bmljYXRpb25UeXBlID0+ICdQcm92aWRlcicsCik7CiRTZWxmLT5JcygKICAgIHJlZiAkRGVidWdnZXJPYmplY3QsCiAgICAnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpEZWJ1Z2dlcicsCiAgICAnRGVidWdnZXJPYmplY3QgaW5zdGFudGlhdGUgY29ycmVjdGx5JwopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIGNyZWF0ZSBsb2NhbCBvYmplY3QKICAgIG15ICRMb2NhbE9iamVjdCA9ICJLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6VGlja2V0OjokVGVzdC0+e09wZXJhdGlvbn0iLT5uZXcoCiAgICAgICAgRGVidWdnZXJPYmplY3QgPT4gJERlYnVnZ2VyT2JqZWN0LAogICAgICAgIFdlYnNlcnZpY2VJRCAgID0+ICRXZWJzZXJ2aWNlSUQsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAiS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OlRpY2tldDo6JFRlc3QtPntPcGVyYXRpb259IiwKICAgICAgICByZWYgJExvY2FsT2JqZWN0LAogICAgICAgICIkVGVzdC0+e05hbWV9IC0gQ3JlYXRlIGxvY2FsIG9iamVjdCIKICAgICk7CgogICAgbXkgJUF1dGggPSAoCiAgICAgICAgVXNlckxvZ2luID0+ICRVc2VyTG9naW4sCiAgICAgICAgUGFzc3dvcmQgID0+ICRQYXNzd29yZCwKICAgICk7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkVGVzdC0+e0F1dGh9ICkgKSB7CiAgICAgICAgJUF1dGggPSAleyAkVGVzdC0+e0F1dGh9IH07CiAgICB9CgogICAgIyBzdGFydCByZXF1ZXN0ZXIgd2l0aCBvdXIgd2ViIHNlcnZpY2UKICAgIG15ICRMb2NhbFJlc3VsdCA9ICRMb2NhbE9iamVjdC0+UnVuKAogICAgICAgIFdlYnNlcnZpY2VJRCA9PiAkV2Vic2VydmljZUlELAogICAgICAgIEludm9rZXIgICAgICA9PiAkVGVzdC0+e09wZXJhdGlvbn0sCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJUF1dGgsCiAgICAgICAgICAgICV7ICRUZXN0LT57UmVxdWVzdERhdGF9IH0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBjaGVjayByZXN1bHQKICAgICRTZWxmLT5JcygKICAgICAgICAnSEFTSCcsCiAgICAgICAgcmVmICRMb2NhbFJlc3VsdCwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIHJlc3VsdCBzdHJ1Y3R1cmUgaXMgdmFsaWQiCiAgICApOwoKICAgICMgY3JlYXRlIHJlcXVlc3RlciBvYmplY3QKICAgIG15ICRSZXF1ZXN0ZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpOwogICAgJFNlbGYtPklzKAogICAgICAgICdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicsCiAgICAgICAgcmVmICRSZXF1ZXN0ZXJPYmplY3QsCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBDcmVhdGUgcmVxdWVzdGVyIG9iamVjdCIKICAgICk7CgogICAgIyBzdGFydCByZXF1ZXN0ZXIgd2l0aCBvdXIgd2ViIHNlcnZpY2UKICAgIG15ICRSZXF1ZXN0ZXJSZXN1bHQgPSAkUmVxdWVzdGVyT2JqZWN0LT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRXZWJzZXJ2aWNlSUQsCiAgICAgICAgSW52b2tlciAgICAgID0+ICRUZXN0LT57T3BlcmF0aW9ufSwKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlQXV0aCwKICAgICAgICAgICAgJXsgJFRlc3QtPntSZXF1ZXN0RGF0YX0gfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGNoZWNrIHJlc3VsdAogICAgJFNlbGYtPklzKAogICAgICAgICdIQVNIJywKICAgICAgICByZWYgJFJlcXVlc3RlclJlc3VsdCwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlcXVlc3RlciByZXN1bHQgc3RydWN0dXJlIGlzIHZhbGlkIgogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJFJlcXVlc3RlclJlc3VsdC0+e1N1Y2Nlc3N9LAogICAgICAgICRUZXN0LT57U3VjY2Vzc1JlcXVlc3R9LAogICAgICAgICIkVGVzdC0+e05hbWV9IC0gUmVxdWVzdGVyIHN1Y2Nlc3NmdWwgcmVzdWx0IgogICAgKTsKCiAgICAjIHRlc3RzIHN1cHBvc2VkIHRvIHN1Y2NlZWQKICAgIGlmICggJFRlc3QtPntTdWNjZXNzQ3JlYXRlfSApIHsKCiAgICAgICAgIyBsb2NhbCByZXN1bHRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdC0+e0RhdGF9LT57VGlja2V0SUR9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIHJlc3VsdCBUaWNrZXRJRCB3aXRoIFRydWUuIgogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdC0+e0RhdGF9LT57VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgVGlja2V0TnVtYmVyIHdpdGggVHJ1ZS4iCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57RGF0YX0tPntBcnRpY2xlSUR9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIHJlc3VsdCBBcnRpY2xlSUQgd2l0aCBUcnVlLiIKICAgICAgICApOwogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57RGF0YX0tPntFcnJvcn0sCiAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIHJlc3VsdCBFcnJvciBpcyB1bmRlZmluZWQuIgogICAgICAgICk7CgogICAgICAgICMgcmVxdWVzdGVyIHJlc3VsdHMKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57VGlja2V0SUR9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlcXVlc3RlciByZXN1bHQgVGlja2V0SUQgd2l0aCBUcnVlLiIKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkUmVxdWVzdGVyUmVzdWx0LT57RGF0YX0tPntUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlcXVlc3RlciByZXN1bHQgVGlja2V0TnVtYmVyIHdpdGggVHJ1ZS4iCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXF1ZXN0ZXIgcmVzdWx0IEFydGljbGVJRCB3aXRoIFRydWUuIgogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAkUmVxdWVzdGVyUmVzdWx0LT57RGF0YX0tPntFcnJvcn0sCiAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlcXVlc3RlciByZXN1bHQgRXJyb3IgaXMgdW5kZWZpbmVkLiIKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSB0aWNrZXQgb2JqZWN0CiAgICAgICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAgICAgIyBnZXQgdGhlIFRpY2tldCBlbnRyeSAoZnJvbSBsb2NhbCByZXN1bHQpCiAgICAgICAgbXkgJUxvY2FsVGlja2V0RGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e1RpY2tldElEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIHNjYWxhciAlTG9jYWxUaWNrZXREYXRhLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIGNyZWF0ZWQgbG9jYWwgdGlja2V0IHN0cnVjdHVyZSB3aXRoIFRydWUuIgogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRoZSBUaWNrZXQgZW50cnkgKGZyb20gcmVxdWVzdGVyIHJlc3VsdCkKICAgICAgICBteSAlUmVxdWVzdGVyVGlja2V0RGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUmVxdWVzdGVyUmVzdWx0LT57RGF0YX0tPntUaWNrZXRJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBzY2FsYXIgJVJlcXVlc3RlclRpY2tldERhdGEsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gY3JlYXRlZCByZXF1ZXN0ZXIgdGlja2V0IHN0cnVjdHVyZSB3aXRoIFRydWUuIgogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgdGlja2V0IGF0dHJpYnV0ZXMgYXMgZGVmaW5lZCBpbiB0aGUgdGVzdAogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJExvY2FsVGlja2V0RGF0YXtUaXRsZX0sCiAgICAgICAgICAgICRUZXN0LT57UmVxdWVzdERhdGF9LT57VGlja2V0fS0+e1RpdGxlfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBsb2NhbCBUaWNrZXQtPlRpdGxlIG1hdGNoIHRlc3QgZGVmaW5pdGlvbi4iCgogICAgICAgICk7CgogICAgICAgICMgZXh0ZXJuYWwgY3VzdG9tZXJzIG9ubHkgc2V0IGl0J3MgdmFsdWUgaW4gYXJ0aWNsZSAoaWYgbm8gRnJvbSBpcyBkZWZpbmVkKSwgdGlja2V0CiAgICAgICAgIyBpcyBjcmVhdGVkIHdpdGggYW4gZW1wdHkgY3VzdG9tZXIKICAgICAgICBpZiAoICRUZXN0LT57RXh0ZXJuYWxDdXN0b21lcn0gKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRMb2NhbFRpY2tldERhdGF7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIGxvY2FsIFRpY2tldC0+Q3VzdG9tZXJVc2VyIGlzIGVtcHR5LiIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRMb2NhbFRpY2tldERhdGF7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgJFRlc3QtPntSZXF1ZXN0RGF0YX0tPntUaWNrZXR9LT57Q3VzdG9tZXJVc2VyfSwKICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gbG9jYWwgVGlja2V0LT5DdXN0b21lclVzZXIgbWF0Y2ggdGVzdCBkZWZpbml0aW9uLiIKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhRdWV1ZSBUeXBlIFNlcnZpY2UgU0xBIFN0YXRlIFByaW9yaXR5IE93bmVyIFJlc3BvbnNpYmxlKSkgewogICAgICAgICAgICBpZiAoICRUZXN0LT57UmVxdWVzdERhdGF9LT57VGlja2V0fS0+eyAkQXR0cmlidXRlIC4gJ0lEJyB9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICRMb2NhbFRpY2tldERhdGF7ICRBdHRyaWJ1dGUgLiAnSUQnIH0sCiAgICAgICAgICAgICAgICAgICAgJFRlc3QtPntSZXF1ZXN0RGF0YX0tPntUaWNrZXR9LT57ICRBdHRyaWJ1dGUgLiAnSUQnIH0sCiAgICAgICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBsb2NhbCBUaWNrZXQtPiRBdHRyaWJ1dGUiIC4gJ0lEJyAuICIgbWF0Y2ggdGVzdCBkZWZpbml0aW9uLiIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICRMb2NhbFRpY2tldERhdGF7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAgICAgJFRlc3QtPntSZXF1ZXN0RGF0YX0tPntUaWNrZXR9LT57JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBsb2NhbCBUaWNrZXQtPiRBdHRyaWJ1dGUgbWF0Y2ggdGVzdCBkZWZpbml0aW9uLiIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRBcnRpY2xlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwoKICAgICAgICBteSAkTG9jYWxBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQXJ0aWNsZSgKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRMb2NhbFJlc3VsdC0+e0RhdGF9LT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJExvY2FsUmVzdWx0LT57RGF0YX0tPntBcnRpY2xlSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGxvY2FsIGFydGljbGUgaW5mb3JtYXRpb24KICAgICAgICBteSAlTG9jYWxBcnRpY2xlRGF0YSA9ICRMb2NhbEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlR2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRMb2NhbFJlc3VsdC0+e0RhdGF9LT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgICAgID0+ICRMb2NhbFJlc3VsdC0+e0RhdGF9LT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICRSZXF1ZXN0ZXJBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQXJ0aWNsZSgKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRSZXF1ZXN0ZXJSZXN1bHQtPntEYXRhfS0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRSZXF1ZXN0ZXJSZXN1bHQtPntEYXRhfS0+e0FydGljbGVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgcmVxdWVzdGVyIGFydGljbGUgaW5mb3JtYXRpb24KICAgICAgICBteSAlUmVxdWVzdGVyQXJ0aWNsZURhdGEgPSAkUmVxdWVzdGVyQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgICAgID0+ICRSZXF1ZXN0ZXJSZXN1bHQtPntEYXRhfS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoU3ViamVjdCBCb2R5IENvbnRlbnRUeXBlIE1pbWVUeXBlIENoYXJzZXQgRnJvbSkpIHsKICAgICAgICAgICAgaWYgKCAkVGVzdC0+e1JlcXVlc3REYXRhfS0+e0FydGljbGV9LT57JEF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAgICAgJExvY2FsQXJ0aWNsZURhdGF7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAgICAgJFRlc3QtPntSZXF1ZXN0RGF0YX0tPntBcnRpY2xlfS0+eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gbG9jYWwgQXJ0aWNsZS0+JEF0dHJpYnV0ZSBtYXRjaCB0ZXN0IGRlZmluaXRpb24uIgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KFNlbmRlclR5cGUpKSB7CiAgICAgICAgICAgIGlmICggJFRlc3QtPntSZXF1ZXN0RGF0YX0tPntBcnRpY2xlfS0+eyAkQXR0cmlidXRlIC4gJ0lEJyB9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICRMb2NhbEFydGljbGVEYXRheyAkQXR0cmlidXRlIC4gJ0lEJyB9LAogICAgICAgICAgICAgICAgICAgICRUZXN0LT57UmVxdWVzdERhdGF9LT57QXJ0aWNsZX0tPnsgJEF0dHJpYnV0ZSAuICdJRCcgfSwKICAgICAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIGxvY2FsIEFydGljbGUtPiRBdHRyaWJ1dGUiIC4gJ0lEJyAuICIgbWF0Y2ggdGVzdCBkZWZpbml0aW9uLiIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAgICAgJExvY2FsQXJ0aWNsZURhdGF7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAgICAgJFRlc3QtPntSZXF1ZXN0RGF0YX0tPntBcnRpY2xlfS0+eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gbG9jYWwgQXJ0aWNsZS0+JEF0dHJpYnV0ZSBtYXRjaCB0ZXN0IGRlZmluaXRpb24uIgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBkeW5hbWljIGZpZWxkcwogICAgICAgIG15IEBSZXF1ZXN0ZWREeW5hbWljRmllbGRzOwogICAgICAgIGlmICggcmVmICRUZXN0LT57UmVxdWVzdERhdGF9LT57RHluYW1pY0ZpZWxkfSBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgIHB1c2ggQFJlcXVlc3RlZER5bmFtaWNGaWVsZHMsICRUZXN0LT57UmVxdWVzdERhdGF9LT57RHluYW1pY0ZpZWxkfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIEBSZXF1ZXN0ZWREeW5hbWljRmllbGRzID0gQHsgJFRlc3QtPntSZXF1ZXN0RGF0YX0tPntEeW5hbWljRmllbGR9IH07CiAgICAgICAgfQogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkIChAUmVxdWVzdGVkRHluYW1pY0ZpZWxkcykgewoKICAgICAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkLT57RmllbGRUeXBlfSBlcSAnRGF0ZScgJiYgJER5bmFtaWNGaWVsZC0+e1ZhbHVlfSA9fiBteyBcQSBcZHs0fS1cZHsyfS1cZHsyfSBceiB9eG1zICkgewogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZC0+e1ZhbHVlfSAuPSAnIDAwOjAwOjAwJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAgICAgJExvY2FsVGlja2V0RGF0YXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gLy8gJycsCiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkLT57VmFsdWV9LAogICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBsb2NhbCBUaWNrZXQtPkR5bmFtaWNGaWVsZF8iCiAgICAgICAgICAgICAgICAgICAgLiAkRHluYW1pY0ZpZWxkLT57TmFtZX0KICAgICAgICAgICAgICAgICAgICAuICIgbWF0Y2ggdGVzdCBkZWZpbml0aW9uLiIKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgYXR0YWNobWVudHMKICAgICAgICBteSAlQXR0YWNobWVudEluZGV4ID0gJExvY2FsQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVBdHRhY2htZW50SW5kZXgoCiAgICAgICAgICAgIEFydGljbGVJRCAgICAgICAgPT4gJExvY2FsUmVzdWx0LT57RGF0YX0tPntBcnRpY2xlSUR9LAogICAgICAgICAgICBFeGNsdWRlUGxhaW5UZXh0ID0+IDEsCiAgICAgICAgICAgIEV4Y2x1ZGVIVE1MQm9keSAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSBAQXR0YWNobWVudHM7CiAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICBmb3IgbXkgJEZpbGVJRCAoIHNvcnQga2V5cyAlQXR0YWNobWVudEluZGV4ICkgewogICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQgaWYgISRGaWxlSUQ7CiAgICAgICAgICAgIG15ICVBdHRhY2htZW50ID0gJExvY2FsQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVBdHRhY2htZW50KAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRMb2NhbFJlc3VsdC0+e0RhdGF9LT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgIEZpbGVJRCAgICA9PiAkRmlsZUlELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggXCVBdHRhY2htZW50ICk7CgogICAgICAgICAgICAjIGNvbnZlcnQgY29udGVudCB0byBiYXNlNjQKICAgICAgICAgICAgJEF0dGFjaG1lbnR7Q29udGVudH0gPSBlbmNvZGVfYmFzZTY0KCAkQXR0YWNobWVudHtDb250ZW50fSwgJycgKTsKCiAgICAgICAgICAgICMgZGVsZXRlIG5vdCBuZWVkZWQgYXR0cmlidXRlcwogICAgICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoQ29udGVudEFsdGVybmF0aXZlIENvbnRlbnRJRCBGaWxlc2l6ZSBGaWxlc2l6ZVJhdykpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkQXR0YWNobWVudHskQXR0cmlidXRlfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXNoIEBBdHRhY2htZW50cywgeyVBdHRhY2htZW50fTsKICAgICAgICB9CgogICAgICAgIG15IEBSZXF1ZXN0ZWRBdHRhY2htZW50czsKICAgICAgICBpZiAoIHJlZiAkVGVzdC0+e1JlcXVlc3REYXRhfS0+e0F0dGFjaG1lbnR9IGVxICdIQVNIJyApIHsKICAgICAgICAgICAgcHVzaCBAUmVxdWVzdGVkQXR0YWNobWVudHMsICRUZXN0LT57UmVxdWVzdERhdGF9LT57QXR0YWNobWVudH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBAUmVxdWVzdGVkQXR0YWNobWVudHMgPSBAeyAkVGVzdC0+e1JlcXVlc3REYXRhfS0+e0F0dGFjaG1lbnR9IH07CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgIFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgIFxAUmVxdWVzdGVkQXR0YWNobWVudHMsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gbG9jYWwgVGlja2V0LT5BdHRhY2htZW50IG1hdGNoIHRlc3QgZGVmaW5pdGlvbi4iCiAgICAgICAgKTsKCiAgICAgICAgIyByZW1vdmUgYXR0cmlidXRlcyB0aGF0IG1pZ2h0IGJlIGRpZmZlcmVudCBmcm9tIGxvY2FsIGFuZCByZXF1ZXN0ZXIgcmVzcG9uc2VzCiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKAogICAgICAgICAgICBxdyhUaWNrZXRJRCBUaWNrZXROdW1iZXIgQ3JlYXRlZCBDaGFuZ2VkIEFnZSBVbmxvY2tUaW1lb3V0KQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBkZWxldGUgJExvY2FsVGlja2V0RGF0YXskQXR0cmlidXRlfTsKICAgICAgICAgICAgZGVsZXRlICRSZXF1ZXN0ZXJUaWNrZXREYXRheyRBdHRyaWJ1dGV9OwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICBcJUxvY2FsVGlja2V0RGF0YSwKICAgICAgICAgICAgXCVSZXF1ZXN0ZXJUaWNrZXREYXRhLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIHRpY2tldCByZXN1bHQgbWF0Y2hlZCB3aXRoIHJlbW90ZSByZXN1bHQuIgogICAgICAgICk7CgogICAgICAgICMgcmVtb3ZlIGF0dHJpYnV0ZXMgdGhhdCBtaWdodCBiZSBkaWZmZXJlbnQgZnJvbSBsb2NhbCBhbmQgcmVxdWVzdGVyIHJlc3BvbnNlcwogICAgICAgIGZvciBteSAkQXR0cmlidXRlICgKICAgICAgICAgICAgcXcoIEFnZSBBZ2VUaW1lVW5peCBBcnRpY2xlSUQgVGlja2V0SUQgQ3JlYXRlVGltZSBDaGFuZ2VUaW1lIEluY29taW5nVGltZSBUaWNrZXROdW1iZXIKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBkZWxldGUgJExvY2FsQXJ0aWNsZURhdGF7JEF0dHJpYnV0ZX07CiAgICAgICAgICAgIGRlbGV0ZSAkUmVxdWVzdGVyQXJ0aWNsZURhdGF7JEF0dHJpYnV0ZX07CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgIFwlTG9jYWxBcnRpY2xlRGF0YSwKICAgICAgICAgICAgXCVSZXF1ZXN0ZXJBcnRpY2xlRGF0YSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCBhcnRpY2xlIHJlc3VsdCBtYXRjaGVkIHdpdGggcmVtb3RlIHJlc3VsdC4iCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGhlIHRpY2tldHMKICAgICAgICBmb3IgbXkgJFRpY2tldElEICgKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57RGF0YX0tPntUaWNrZXRJRH0sCiAgICAgICAgICAgICRSZXF1ZXN0ZXJSZXN1bHQtPntEYXRhfS0+e1RpY2tldElEfQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgIyBBbGxvdyBzb21lIHRpbWUgZm9yIGFsbCBoaXN0b3J5IGVudHJpZXMgdG8gYmUgd3JpdHRlbiB0byB0aGUgdGlja2V0IGJlZm9yZSBkZWxldGluZyBpdCwKICAgICAgICAgICAgIyAgIG90aGVyd2lzZSBUaWNrZXREZWxldGUgY291bGQgZmFpbC4KICAgICAgICAgICAgc2xlZXAgMTsKCiAgICAgICAgICAgIG15ICRUaWNrZXREZWxldGUgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXREZWxldGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzYW5pdHkgY2hlY2sKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkVGlja2V0RGVsZXRlLAogICAgICAgICAgICAgICAgIlRpY2tldERlbGV0ZSgpIHN1Y2Nlc3NmdWwgZm9yIFRpY2tldCBJRCAkVGlja2V0SUQiCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGVzdHMgc3VwcG9zZWQgdG8gZmFpbAogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IFRpY2tldElEIHdpdGggZmFsc2UuIgogICAgICAgICk7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIHJlc3VsdCBUaWNrZXROdW1iZXIgd2l0aCBmYWxzZS4iCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdC0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IEFydGljbGVJRCB3aXRoIGZhbHNlLiIKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57RGF0YX0tPntFcnJvcn0tPntFcnJvckNvZGV9LAogICAgICAgICAgICAkVGVzdC0+e0V4cGVjdGVkRGF0YX0tPntEYXRhfS0+e0Vycm9yfS0+e0Vycm9yQ29kZX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IEVycm9yQ29kZSBtYXRjaGVkIHdpdGggZXhwZWN0ZWQgbG9jYWwgY2FsbCByZXN1bHQuIgogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdC0+e0RhdGF9LT57RXJyb3J9LT57RXJyb3JNZXNzYWdlfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgRXJyb3JNZXNzYWdlIHdpdGggdHJ1ZS4iCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXNOb3QoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdC0+e0RhdGF9LT57RXJyb3J9LT57RXJyb3JNZXNzYWdlfSwKICAgICAgICAgICAgJycsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IEVycm9yTWVzc2FnZSBpcyBub3QgZW1wdHkuIgogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntFcnJvck1lc3NhZ2V9LAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e0Vycm9yfS0+e0Vycm9yQ29kZX0KICAgICAgICAgICAgICAgIC4gJzogJwogICAgICAgICAgICAgICAgLiAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e0Vycm9yfS0+e0Vycm9yTWVzc2FnZX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IEVycm9yTWVzc2FnZSAob3V0c2lkZSBEYXRhIGhhc2gpIG1hdGNoZWQgd2l0aCBjb25jYXRlbmF0aW9uIgogICAgICAgICAgICAgICAgLiAiIG9mIEVycm9yQ29kZSBhbmQgRXJyb3JNZXNzYWdlIHdpdGhpbiBEYXRhIGhhc2guIgogICAgICAgICk7CgogICAgICAgICMgcmVtb3ZlIEVycm9yTWVzc2FnZSBwYXJhbWV0ZXIgZnJvbSBkaXJlY3QgY2FsbAogICAgICAgICMgcmVzdWx0IHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBTT0FQIGNhbGwgcmVzdWx0CiAgICAgICAgaWYgKCAkTG9jYWxSZXN1bHQtPntFcnJvck1lc3NhZ2V9ICkgewogICAgICAgICAgICBkZWxldGUgJExvY2FsUmVzdWx0LT57RXJyb3JNZXNzYWdlfTsKICAgICAgICB9CgogICAgICAgICMgc2FuaXR5IGNoZWNrCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntFcnJvck1lc3NhZ2V9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIHJlc3VsdCBFcnJvck1lc3NhZ2UgKG91dHNpZGUgRGF0YSBoYXNoKSBnb3QgcmVtb3ZlZCB0byBjb21wYXJlIgogICAgICAgICAgICAgICAgLiAiIGxvY2FsIGFuZCByZW1vdGUgdGVzdHMuIgogICAgICAgICk7CgogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgJExvY2FsUmVzdWx0LAogICAgICAgICAgICAkUmVxdWVzdGVyUmVzdWx0LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIHJlc3VsdCBtYXRjaGVkIHdpdGggcmVtb3RlIHJlc3VsdC4iCiAgICAgICAgKTsKICAgIH0KfQoKIyBkZWxldGUgd2ViIHNlcnZpY2UKbXkgJFdlYnNlcnZpY2VEZWxldGUgPSAkV2Vic2VydmljZU9iamVjdC0+V2Vic2VydmljZURlbGV0ZSgKICAgIElEICAgICA9PiAkV2Vic2VydmljZUlELAogICAgVXNlcklEID0+IDEsCik7CiRTZWxmLT5UcnVlKAogICAgJFdlYnNlcnZpY2VEZWxldGUsCiAgICAiRGVsZXRlZCB3ZWIgc2VydmljZSAkV2Vic2VydmljZUlEIiwKKTsKCiMgZ2V0IERCIG9iamVjdApteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKJFNlbGYtPklzKAogICAgcmVmICREQk9iamVjdCwKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgIkRCT2JqZWN0IGNyZWF0ZWQgY29ycmVjdGx5IiwKKTsKCm15ICRTdWNjZXNzOwoKIyBkZWxldGUgcXVldWVzCmZvciBteSAkUXVldWVEYXRhIChAUXVldWVzKSB7CiAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBxdWV1ZSBXSEVSRSBpZCA9ICRRdWV1ZURhdGEtPntRdWV1ZUlEfSIsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgIlF1ZXVlIHdpdGggSUQgJFF1ZXVlRGF0YS0+e1F1ZXVlSUR9IGlzIGRlbGV0ZWQhIgogICAgKTsKfQoKIyBkZWxldGUgZ3JvdXAKJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgU1FMID0+ICJERUxFVEUgRlJPTSBncm91cHMgV0hFUkUgaWQgPSAkR3JvdXBJRCIsCik7CiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiR3JvdXAgd2l0aCBJRCAkR3JvdXBJRCBpcyBkZWxldGVkISIKKTsKCiMgZGVsZXRlIHR5cGUKJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgU1FMID0+ICJERUxFVEUgRlJPTSB0aWNrZXRfdHlwZSBXSEVSRSBpZCA9ICRUeXBlSUQiLAopOwokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIlR5cGUgd2l0aCBJRCAkVHlwZUlEIGlzIGRlbGV0ZWQhIgopOwoKIyBkZWxldGUgc2VydmljZV9jdXN0b21lcl91c2VyIGFuZCBzZXJ2aWNlCiRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgIFNRTCA9PiAiREVMRVRFIEZST00gc2VydmljZV9jdXN0b21lcl91c2VyIFdIRVJFIHNlcnZpY2VfaWQgPSAkU2VydmljZUlEIiwKKTsKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICJTZXJ2aWNlIHVzZXIgcmVmZXJlbmNlZCB0byBzZXJ2aWNlIElEICRTZXJ2aWNlSUQgaXMgZGVsZXRlZCEiCik7CgokU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2Vfc2xhIFdIRVJFIHNlcnZpY2VfaWQgPSAkU2VydmljZUlEIE9SIHNsYV9pZCA9ICRTTEFJRCIsCik7CiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiU2VydmljZSBTTEEgcmVmZXJlbmNlZCB0byBzZXJ2aWNlIElEICRTZXJ2aWNlSUQgaXMgZGVsZXRlZCEiCik7CgokU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2UgV0hFUkUgaWQgPSAkU2VydmljZUlEIiwKKTsKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICJTZXJ2aWNlIHdpdGggSUQgJFNlcnZpY2VJRCBpcyBkZWxldGVkISIKKTsKCiMgZGVsZXRlIFNMQQokU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNsYSBXSEVSRSBpZCA9ICRTTEFJRCIsCik7CiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiU0xBIHdpdGggSUQgJFNMQUlEIGlzIGRlbGV0ZWQhIiwKKTsKCiMgZGVsZXRlIHN0YXRlCiRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgIFNRTCA9PiAiREVMRVRFIEZST00gdGlja2V0X3N0YXRlIFdIRVJFIGlkID0gJFN0YXRlSUQiLAopOwokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIlN0YXRlIHdpdGggSUQgJFN0YXRlSUQgaXMgZGVsZXRlZCEiCik7CgojIGRlbGV0ZSBwcmlvcml0eQokU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHRpY2tldF9wcmlvcml0eSBXSEVSRSBpZCA9ICRQcmlvcml0eUlEIiwKKTsKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICJQcmlvcml0eSB3aXRoIElEICRQcmlvcml0eUlEIGlzIGRlbGV0ZWQhIgopOwoKIyBkZWxldGUgZHluYW1pYyBmaWVsZHMKbXkgJERlbGV0ZUZpZWxkTGlzdCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3QoCiAgICBSZXN1bHRUeXBlID0+ICdIQVNIJywKICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCik7CgpteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCkRZTkFNSUNGSUVMRDoKZm9yIG15ICREeW5hbWljRmllbGRJRCAoIHNvcnQga2V5cyAleyREZWxldGVGaWVsZExpc3R9ICkgewoKICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkSUQ7CiAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJERlbGV0ZUZpZWxkTGlzdC0+eyREeW5hbWljRmllbGRJRH07CgogICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJERlbGV0ZUZpZWxkTGlzdC0+eyREeW5hbWljRmllbGRJRH0gIX4gbXsgXlVuaXR0ZXN0IH14bXM7CgogICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICBJRCA9PiAkRHluYW1pY0ZpZWxkSUQsCiAgICApOwogICAgbXkgJFZhbHVlc0RlbGV0ZVN1Y2Nlc3MgPSAkQmFja2VuZE9iamVjdC0+QWxsVmFsdWVzRGVsZXRlKAogICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAogICAgKTsKCiAgICBteSAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZERlbGV0ZSgKICAgICAgICBJRCAgICAgPT4gJER5bmFtaWNGaWVsZElELAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiRHluYW1pY0ZpZWxkRGVsZXRlKCkgZm9yICREZWxldGVGaWVsZExpc3QtPnskRHluYW1pY0ZpZWxkSUR9IHdpdGggdHJ1ZSIKICAgICk7Cn0KCiMgY2xlYW51cCBjYWNoZQokS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgpOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA0ZmUyMThiZWNjZGI5MjZhMjlkZDdiZWQ5ZGU0ODIxMTQzMGQ2OWQwIC0gc2NyaXB0cy90ZXN0L0dlbmVyaWNJbnRlcmZhY2UvT3BlcmF0aW9uL1RpY2tldC9UaWNrZXRDcmVhdGVJbmNsdWRlVGlja2V0RGF0YS50CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgojIyBubyBjcml0aWMgKE1vZHVsZXM6OlJlcXVpcmVFeHBsaWNpdFBhY2thZ2UpCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCnVzZSBTb2NrZXQ7CnVzZSBNSU1FOjpCYXNlNjQ7Cgp1c2UgS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpEZWJ1Z2dlcjsKdXNlIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpUaWNrZXQ6OlRpY2tldENyZWF0ZTsKdXNlIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpTZXNzaW9uOjpTZXNzaW9uQ3JlYXRlOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KElzQXJyYXlSZWZXaXRoRGF0YSBJc0hhc2hSZWZXaXRoRGF0YSBJc1N0cmluZ1dpdGhEYXRhKTsKCiMgZ2V0IG5lZWRlZCBvYmplY3RzCm15ICRDb25maWdPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwpteSAkU3lzQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycpOwoKIyBTa2lwIFNTTCBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24uCiRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicgPT4gewogICAgICAgIFNraXBTU0xWZXJpZnkgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICBWYWxpZCA9PiAxLAogICAgS2V5ICAgPT4gJ1RpY2tldDo6VHlwZScsCiAgICBWYWx1ZSA9PiAxLAopOwoKJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgIFZhbGlkID0+IDEsCiAgICBLZXkgICA9PiAnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnLAogICAgVmFsdWUgPT4gMSwKKTsKCiRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICBWYWxpZCA9PiAxLAogICAgS2V5ICAgPT4gJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJywKICAgIFZhbHVlID0+IDEsCik7CgojIGRpc2FibGUgRE5TIGxvb2t1cHMKJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgIFZhbGlkID0+IDEsCiAgICBLZXkgICA9PiAnQ2hlY2tNWFJlY29yZCcsCiAgICBWYWx1ZSA9PiAwLAopOwoKJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgIFZhbGlkID0+IDEsCiAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICBWYWx1ZSA9PiAxLAopOwoKIyBkaXNhYmxlIFNlc3Npb25DaGVja1JlbW90ZUlQIHNldHRpbmcKJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgIFZhbGlkID0+IDEsCiAgICBLZXkgICA9PiAnU2Vzc2lvbkNoZWNrUmVtb3RlSVAnLAogICAgVmFsdWUgPT4gMCwKKTsKCiMgZW5hYmxlIGN1c3RvbWVyIGdyb3VwcyBzdXBwb3J0CiRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICBWYWxpZCA9PiAxLAogICAgS2V5ICAgPT4gJ0N1c3RvbWVyR3JvdXBTdXBwb3J0JywKICAgIFZhbHVlID0+IDEsCik7CgojIGNoZWNrIGlmIFNTTCBDZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gaXMgZGlzYWJsZWQKJFNlbGYtPklzKAogICAgJEVOVntQRVJMX0xXUF9TU0xfVkVSSUZZX0hPU1ROQU1FfSwKICAgIDAsCiAgICAnRGlzYWJsZWQgU1NMIGNlcnRpZmljYXRlcyB2ZXJpZmljYXRpb24gaW4gZW52aXJvbm1lbnQnCik7CgpteSAkVGVzdE93bmVyTG9naW4gICAgICAgID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoKTsKbXkgJFRlc3RSZXNwb25zaWJsZUxvZ2luICA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKCk7Cm15ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0Q3VzdG9tZXJVc2VyQ3JlYXRlKCk7Cm15ICRUZXN0VXNlckxvZ2luICAgICAgICAgPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycsIF0sCik7Cm15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCm15ICRPd25lcklEID0gJFVzZXJPYmplY3QtPlVzZXJMb29rdXAoCiAgICBVc2VyTG9naW4gPT4gJFRlc3RPd25lckxvZ2luLAopOwpteSAkUmVzcG9uc2libGVJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgVXNlckxvZ2luID0+ICRUZXN0UmVzcG9uc2libGVMb2dpbiwKKTsKbXkgJFVzZXJJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAopOwoKbXkgJEludmFsaWRJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExvb2t1cCggVmFsaWQgPT4gJ2ludmFsaWQnICk7CgojIHNhbml0eSB0ZXN0CiRTZWxmLT5Jc05vdCgKICAgICRJbnZhbGlkSUQsCiAgICB1bmRlZiwKICAgICJWYWxpZExvb2t1cCgpIGZvciAnaW52YWxpZCcgc2hvdWxkIG5vdCBiZSB1bmRlZiIKKTsKCiMgZ2V0IGdyb3VwIG9iamVjdApteSAkR3JvdXBPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKCiMgY3JlYXRlIGEgbmV3IGdyb3VwCm15ICRHcm91cElEID0gJEdyb3VwT2JqZWN0LT5Hcm91cEFkZCgKICAgIE5hbWUgICAgPT4gJ1Rlc3RTcGVjaWFsJyAuICRSYW5kb21JRCwKICAgIENvbW1lbnQgPT4gJ2NvbW1lbnQgZGVzY3JpYmluZyB0aGUgZ3JvdXAnLCAgICAjIG9wdGlvbmFsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CgpteSAlR3JvdXBEYXRhID0gJEdyb3VwT2JqZWN0LT5Hcm91cEdldCggSUQgPT4gJEdyb3VwSUQgKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5UcnVlKAogICAgSXNIYXNoUmVmV2l0aERhdGEoIFwlR3JvdXBEYXRhICksCiAgICAiR3JvdXBHZXQoKSAtIGZvciB0ZXN0aW5nIGdyb3VwIiwKKTsKCiMgY3JlYXRlIHF1ZXVlIG9iamVjdApteSAkUXVldWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKCm15IEBRdWV1ZXM7CgpteSBAUXVldWVQcm9wZXJ0aWVzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ3F1ZXVlMScgLiAkUmFuZG9tSUQsCiAgICAgICAgR3JvdXBJRCA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdxdWV1ZTInIC4gJFJhbmRvbUlELAogICAgICAgIEdyb3VwSUQgPT4gJEdyb3VwSUQsCiAgICB9Cik7CgojIGNyZWF0ZSBxdWV1ZXMKZm9yIG15ICRRdWV1ZVByb3BlcnR5IChAUXVldWVQcm9wZXJ0aWVzKSB7CiAgICBteSAkUXVldWVJRCA9ICRRdWV1ZU9iamVjdC0+UXVldWVBZGQoCiAgICAgICAgJXskUXVldWVQcm9wZXJ0eX0sCiAgICAgICAgVmFsaWRJRCAgICAgICAgID0+IDEsCiAgICAgICAgU3lzdGVtQWRkcmVzc0lEID0+IDEsCiAgICAgICAgU2FsdXRhdGlvbklEICAgID0+IDEsCiAgICAgICAgU2lnbmF0dXJlSUQgICAgID0+IDEsCiAgICAgICAgQ29tbWVudCAgICAgICAgID0+ICdTb21lIGNvbW1lbnQnLAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgKTsKCiAgICAjIHNhbml0eSBjaGVjawogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFF1ZXVlSUQsCiAgICAgICAgIlF1ZXVlQWRkKCkgLSBjcmVhdGUgdGVzdGluZyBxdWV1ZSIsCiAgICApOwogICAgbXkgJVF1ZXVlRGF0YSA9ICRRdWV1ZU9iamVjdC0+UXVldWVHZXQoIElEID0+ICRRdWV1ZUlEICk7CgogICAgcHVzaCBAUXVldWVzLCBcJVF1ZXVlRGF0YTsKfQoKIyBnZXQgdHlwZSBvYmplY3QKbXkgJFR5cGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VHlwZScpOwoKIyBjcmVhdGUgbmV3IHR5cGUKbXkgJFR5cGVJRCA9ICRUeXBlT2JqZWN0LT5UeXBlQWRkKAogICAgTmFtZSAgICA9PiAnVGVzdFR5cGUnIC4gJFJhbmRvbUlELAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKIyBzYW5pdHkgY2hlY2sKJFNlbGYtPlRydWUoCiAgICAkVHlwZUlELAogICAgIlR5cGVBZGQoKSAtIGNyZWF0ZSB0ZXN0aW5nIHR5cGUiLAopOwoKbXkgJVR5cGVEYXRhID0gJFR5cGVPYmplY3QtPlR5cGVHZXQoCiAgICBJRCA9PiAkVHlwZUlELAopOwoKIyBzYW5pdHkgY2hlY2sKJFNlbGYtPlRydWUoCiAgICBJc0hhc2hSZWZXaXRoRGF0YSggXCVUeXBlRGF0YSApLAogICAgIlR5cGVHZXQoKSAtIGZvciB0ZXN0aW5nIHR5cGUiLAopOwoKIyBjcmVhdGUgc2VydmljZSBvYmplY3QKbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpOwojIC0tLQojIElUU01Db3JlCiMgLS0tCgojIGdldCB0aGUgbGlzdCBvZiBzZXJ2aWNlIHR5cGVzIGZyb20gZ2VuZXJhbCBjYXRhbG9nCm15ICRTZXJ2aWNlVHlwZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICBDbGFzcyA9PiAnSVRTTTo6U2VydmljZTo6VHlwZScsCik7CgojIGJ1aWxkIGEgbG9va3VwIGhhc2gKbXkgJVNlcnZpY2VUeXBlTmFtZTJJRCA9IHJldmVyc2UgJXsgJFNlcnZpY2VUeXBlTGlzdCB9OwoKIyBnZXQgdGhlIGxpc3Qgb2Ygc2xhIHR5cGVzIGZyb20gZ2VuZXJhbCBjYXRhbG9nCm15ICRTTEFUeXBlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpTTEE6OlR5cGUnLAopOwoKIyBidWlsZCBhIGxvb2t1cCBoYXNoCm15ICVTTEFUeXBlTmFtZTJJRCA9IHJldmVyc2UgJXsgJFNMQVR5cGVMaXN0IH07CiMgLS0tCgojIGNyZWF0ZSBuZXcgc2VydmljZQpteSAkU2VydmljZUlEID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VBZGQoCiAgICBOYW1lICAgID0+ICdUZXN0U2VydmljZScgLiAkUmFuZG9tSUQsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgIFR5cGVJRCAgICAgID0+ICRTZXJ2aWNlVHlwZU5hbWUySUR7VHJhaW5pbmd9LAogICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKIyAtLS0KICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5UcnVlKAogICAgJFNlcnZpY2VJRCwKICAgICJTZXJ2aWNlQWRkKCkgLSBjcmVhdGUgdGVzdGluZyBzZXJ2aWNlIiwKKTsKCm15ICVTZXJ2aWNlRGF0YSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlR2V0KAogICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICBVc2VySUQgICAgPT4gMSwKKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5UcnVlKAogICAgSXNIYXNoUmVmV2l0aERhdGEoIFwlU2VydmljZURhdGEgKSwKICAgICJTZXJ2aWNlR2V0KCkgLSBmb3IgdGVzdGluZyBzZXJ2aWNlIiwKKTsKCiMgc2V0IHNlcnZpY2UgZm9yIHRoZSBjdXN0b21lcgokU2VydmljZU9iamVjdC0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckFkZCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICBTZXJ2aWNlSUQgICAgICAgICA9PiAkU2VydmljZUlELAogICAgQWN0aXZlICAgICAgICAgICAgPT4gMSwKICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCik7CgojIGNyZWF0ZSBTTEEgb2JqZWN0Cm15ICRTTEFPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyk7CgojIGNyZWF0ZSBuZXcgU0xBCm15ICRTTEFJRCA9ICRTTEFPYmplY3QtPlNMQUFkZCgKICAgIE5hbWUgICAgICAgPT4gJ1Rlc3RTTEEnIC4gJFJhbmRvbUlELAogICAgU2VydmljZUlEcyA9PiBbJFNlcnZpY2VJRF0sCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgIFR5cGVJRCAgICAgPT4gJFNMQVR5cGVOYW1lMklEe090aGVyfSwKIyAtLS0KICAgIFZhbGlkSUQgICAgPT4gMSwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5UcnVlKAogICAgJFNMQUlELAogICAgIlNMQUFkZCgpIC0gY3JlYXRlIHRlc3RpbmcgU0xBIiwKKTsKCm15ICVTTEFEYXRhID0gJFNMQU9iamVjdC0+U0xBR2V0KAogICAgU0xBSUQgID0+ICRTTEFJRCwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBzYW5pdHkgY2hlY2sKJFNlbGYtPlRydWUoCiAgICBJc0hhc2hSZWZXaXRoRGF0YSggXCVTTEFEYXRhICksCiAgICAiU0xBR2V0KCkgLSBmb3IgdGVzdGluZyBTTEEiLAopOwoKIyBjcmVhdGUgc3RhdGUgb2JqZWN0Cm15ICRTdGF0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpOwoKIyBjcmVhdGUgbmV3IHN0YXRlCm15ICRTdGF0ZUlEID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUFkZCgKICAgIE5hbWUgICAgPT4gJ1Rlc3RTdGF0ZScgLiAkUmFuZG9tSUQsCiAgICBUeXBlSUQgID0+IDIsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CgojIHNhbml0eSBjaGVjawokU2VsZi0+VHJ1ZSgKICAgICRTdGF0ZUlELAogICAgIlN0YXRlQWRkKCkgLSBjcmVhdGUgdGVzdGluZyBzdGF0ZSIsCik7CgpteSAlU3RhdGVEYXRhID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUdldCgKICAgIElEID0+ICRTdGF0ZUlELAopOwoKIyBzYW5pdHkgY2hlY2sKJFNlbGYtPlRydWUoCiAgICBJc0hhc2hSZWZXaXRoRGF0YSggXCVTdGF0ZURhdGEgKSwKICAgICJTdGF0ZUdldCgpIC0gZm9yIHRlc3Rpbmcgc3RhdGUiLAopOwoKIyBjcmVhdGUgcHJpb3JpdHkgb2JqZWN0Cm15ICRQcmlvcml0eU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcmlvcml0eScpOwoKIyBjcmVhdGUgbmV3IHByaW9yaXR5Cm15ICRQcmlvcml0eUlEID0gJFByaW9yaXR5T2JqZWN0LT5Qcmlvcml0eUFkZCgKICAgIE5hbWUgICAgPT4gJ1Rlc3RQcmlvcml0eScgLiAkUmFuZG9tSUQsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CgojIHNhbml0eSBjaGVjawokU2VsZi0+VHJ1ZSgKICAgICRQcmlvcml0eUlELAogICAgIlByaW9yaXR5QWRkKCkgLSBjcmVhdGUgdGVzdGluZyBwcmlvcml0eSIsCik7CgpteSAlUHJpb3JpdHlEYXRhID0gJFByaW9yaXR5T2JqZWN0LT5Qcmlvcml0eUdldCgKICAgIFByaW9yaXR5SUQgPT4gJFByaW9yaXR5SUQsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIHNhbml0eSBjaGVjawokU2VsZi0+VHJ1ZSgKICAgIElzSGFzaFJlZldpdGhEYXRhKCBcJVByaW9yaXR5RGF0YSApLAogICAgIlByaW9yaXR5R2V0KCkgLSBmb3IgdGVzdGluZyBwcmlvcml0eSIsCik7CgojIGNyZWF0ZSBkeW5hbWljIGZpZWxkIG9iamVjdApteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwoKIyBjcmVhdGUgbmV3IGR5bmFtaWMgZmllbGQKbXkgJER5bmFtaWNGaWVsZElEID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkQWRkKAogICAgTmFtZSAgICAgICA9PiAnVGVzdER5bmFtaWNGaWVsZEdJJyAuICRIZWxwZXItPkdldFJhbmRvbU51bWJlcigpLAogICAgTGFiZWwgICAgICA9PiAnR0kgVGVzdCBGaWVsZCcsCiAgICBGaWVsZE9yZGVyID0+IDk5OTEsCiAgICBGaWVsZFR5cGUgID0+ICdEYXRlVGltZScsCiAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgRGVmYXVsdFZhbHVlICA9PiAwLAogICAgICAgIFllYXJzSW5GdXR1cmUgPT4gMCwKICAgICAgICBZZWFyc0luUGFzdCAgID0+IDAsCiAgICAgICAgWWVhcnNQZXJpb2QgICA9PiAwLAogICAgfSwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCm15ICREeW5hbWljRmllbGRJRDIgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRBZGQoCiAgICBOYW1lICAgICAgID0+ICdUZXN0RHluYW1pY0ZpZWxkR0kyJyAuICRIZWxwZXItPkdldFJhbmRvbU51bWJlcigpLAogICAgTGFiZWwgICAgICA9PiAnR0kgVGVzdCBGaWVsZDInLAogICAgRmllbGRPcmRlciA9PiA5OTkyLAogICAgRmllbGRUeXBlICA9PiAnVGV4dCcsCiAgICBPYmplY3RUeXBlID0+ICdBcnRpY2xlJywKICAgIENvbmZpZyAgICAgPT4gewogICAgICAgIERlZmF1bHRWYWx1ZSA9PiAnJywKICAgIH0sCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CgojIHNhbml0eSBjaGVjawokU2VsZi0+VHJ1ZSgKICAgICREeW5hbWljRmllbGRJRCwKICAgICJEeW5hbWljRmllbGRBZGQoKSAtIGNyZWF0ZSB0ZXN0aW5nIGR5bmFtaWMgZmllbGQiLAopOwoKbXkgJER5bmFtaWNGaWVsZERhdGEgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICBJRCA9PiAkRHluYW1pY0ZpZWxkSUQsCik7CgokU2VsZi0+VHJ1ZSgKICAgICREeW5hbWljRmllbGRJRDIsCiAgICAiRHluYW1pY0ZpZWxkQWRkKCkgLSBjcmVhdGUgdGVzdGluZyBkeW5hbWljIGZpZWxkIiwKKTsKCm15ICREeW5hbWljRmllbGREYXRhMiA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCgKICAgIElEID0+ICREeW5hbWljRmllbGRJRDIsCik7CgojIHNhbml0eSBjaGVjawokU2VsZi0+VHJ1ZSgKICAgIElzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGREYXRhKSwKICAgICJEeW5hbWljRmllbGRHZXQoKSAtIGZvciB0ZXN0aW5nIGR5bmFtaWMgZmllbGQiLAopOwoKIyBjcmVhdGUgd2ViIHNlcnZpY2Ugb2JqZWN0Cm15ICRXZWJzZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyaWNJbnRlcmZhY2U6OldlYnNlcnZpY2UnKTsKJFNlbGYtPklzKAogICAgcmVmICRXZWJzZXJ2aWNlT2JqZWN0LAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmljSW50ZXJmYWNlOjpXZWJzZXJ2aWNlJywKICAgICJDcmVhdGUgd2ViIHNlcnZpY2Ugb2JqZWN0IiwKKTsKCiMgc2V0IHdlYiBzZXJ2aWNlIG5hbWUKbXkgJFdlYnNlcnZpY2VOYW1lID0gJy1UZXN0LScgLiAkUmFuZG9tSUQ7CgpteSAkV2Vic2VydmljZUlEID0gJFdlYnNlcnZpY2VPYmplY3QtPldlYnNlcnZpY2VBZGQoCiAgICBOYW1lICAgPT4gJFdlYnNlcnZpY2VOYW1lLAogICAgQ29uZmlnID0+IHsKICAgICAgICBEZWJ1Z2dlciA9PiB7CiAgICAgICAgICAgIERlYnVnVGhyZXNob2xkID0+ICdkZWJ1ZycsCiAgICAgICAgfSwKICAgICAgICBQcm92aWRlciA9PiB7CiAgICAgICAgICAgIFRyYW5zcG9ydCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICcnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwokU2VsZi0+VHJ1ZSgKICAgICRXZWJzZXJ2aWNlSUQsCiAgICAiQWRkZWQgd2ViIHNlcnZpY2UiLAopOwoKIyBnZXQgcmVtb3RlIGhvc3Qgd2l0aCBzb21lIHByZWNhdXRpb25zIGZvciBjZXJ0YWluIHVuaXQgdGVzdCBzeXN0ZW1zCm15ICRIb3N0ID0gJEhlbHBlci0+R2V0VGVzdEhUVFBIb3N0bmFtZSgpOwoKIyBwcmVwYXJlIHdlYiBzZXJ2aWNlIGNvbmZpZwpteSAkUmVtb3RlU3lzdGVtID0KICAgICRDb25maWdPYmplY3QtPkdldCgnSHR0cFR5cGUnKQogICAgLiAnOi8vJwogICAgLiAkSG9zdAogICAgLiAnLycKICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpCiAgICAuICcvbnBoLWdlbmVyaWNpbnRlcmZhY2UucGwvV2Vic2VydmljZUlELycKICAgIC4gJFdlYnNlcnZpY2VJRDsKCm15ICRXZWJzZXJ2aWNlQ29uZmlnID0gewoKICAgICMgICAgTmFtZSA9PiAnJywKICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgJ1Rlc3QgZm9yIFRpY2tldCBDb25uZWN0b3IgdXNpbmcgU09BUCB0cmFuc3BvcnQgYmFja2VuZC4nLAogICAgRGVidWdnZXIgPT4gewogICAgICAgIERlYnVnVGhyZXNob2xkID0+ICdkZWJ1ZycsCiAgICAgICAgVGVzdE1vZGUgICAgICAgPT4gMSwKICAgIH0sCiAgICBQcm92aWRlciA9PiB7CiAgICAgICAgVHJhbnNwb3J0ID0+IHsKICAgICAgICAgICAgVHlwZSAgID0+ICdIVFRQOjpTT0FQJywKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiAxMDAwMDAwMCwKICAgICAgICAgICAgICAgIE5hbWVTcGFjZSA9PiAnaHR0cDovL290cnMub3JnL1NvYXBUZXN0SW50ZXJmYWNlLycsCiAgICAgICAgICAgICAgICBFbmRwb2ludCAgPT4gJFJlbW90ZVN5c3RlbSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiB7CiAgICAgICAgICAgIFRpY2tldENyZWF0ZSA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICA9PiAnVGlja2V0OjpUaWNrZXRDcmVhdGUnLAogICAgICAgICAgICAgICAgSW5jbHVkZVRpY2tldERhdGEgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2Vzc2lvbkNyZWF0ZSA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdTZXNzaW9uOjpTZXNzaW9uQ3JlYXRlJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIFJlcXVlc3RlciA9PiB7CiAgICAgICAgVHJhbnNwb3J0ID0+IHsKICAgICAgICAgICAgVHlwZSAgID0+ICdIVFRQOjpTT0FQJywKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgIE5hbWVTcGFjZSA9PiAnaHR0cDovL290cnMub3JnL1NvYXBUZXN0SW50ZXJmYWNlLycsCiAgICAgICAgICAgICAgICBFbmNvZGluZyAgPT4gJ1VURi04JywKICAgICAgICAgICAgICAgIEVuZHBvaW50ICA9PiAkUmVtb3RlU3lzdGVtLAogICAgICAgICAgICAgICAgVGltZW91dCAgID0+IDEyMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEludm9rZXIgPT4gewogICAgICAgICAgICBUaWNrZXRDcmVhdGUgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnVGVzdDo6VGVzdFNpbXBsZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNlc3Npb25DcmVhdGUgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnVGVzdDo6VGVzdFNpbXBsZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCn07CgojIHVwZGF0ZSB3ZWIgc2VydmljZSB3aXRoIHJlYWwgY29uZmlnCm15ICRXZWJzZXJ2aWNlVXBkYXRlID0gJFdlYnNlcnZpY2VPYmplY3QtPldlYnNlcnZpY2VVcGRhdGUoCiAgICBJRCAgICAgID0+ICRXZWJzZXJ2aWNlSUQsCiAgICBOYW1lICAgID0+ICRXZWJzZXJ2aWNlTmFtZSwKICAgIENvbmZpZyAgPT4gJFdlYnNlcnZpY2VDb25maWcsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CiRTZWxmLT5UcnVlKAogICAgJFdlYnNlcnZpY2VVcGRhdGUsCiAgICAiVXBkYXRlZCB3ZWIgc2VydmljZSAkV2Vic2VydmljZUlEIC0gJFdlYnNlcnZpY2VOYW1lIiwKKTsKCiMgR2V0IFNlc3Npb25JRAojIGNyZWF0ZSByZXF1ZXN0ZXIgb2JqZWN0Cm15ICRSZXF1ZXN0ZXJTZXNzaW9uT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInKTsKJFNlbGYtPklzKAogICAgcmVmICRSZXF1ZXN0ZXJTZXNzaW9uT2JqZWN0LAogICAgJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJywKICAgICJTZXNzaW9uSUQgLSBDcmVhdGUgcmVxdWVzdGVyIG9iamVjdCIsCik7CgojIGNyZWF0ZSBhIG5ldyB1c2VyIGZvciBjdXJyZW50IHRlc3QKbXkgJFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ3VzZXJzJyBdLAopOwpteSAkUGFzc3dvcmQgPSAkVXNlckxvZ2luOwoKIyBjcmVhdGUgYSBuZXcgdXNlciB3aXRob3V0IHBlcm1pc3Npb25zIGZvciBjdXJyZW50IHRlc3QKbXkgJFVzZXJMb2dpbjIgPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgpOwpteSAkUGFzc3dvcmQyICA9ICRVc2VyTG9naW4yOwoKIyBjcmVhdGUgYSBjdXN0b21lciB3aGVyZSBhIHRpY2tldCB3aWxsIHVzZSBhbmQgd2lsbCBoYXZlIHBlcm1pc3Npb25zCm15ICRDdXN0b21lclVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RDdXN0b21lclVzZXJDcmVhdGUoKTsKbXkgJEN1c3RvbWVyUGFzc3dvcmQgID0gJEN1c3RvbWVyVXNlckxvZ2luOwoKIyBjcmVhdGUgYSBjdXN0b21lciB0aGF0IHdpbGwgbm90IGhhdmUgcGVybWlzc2lvbnMKbXkgJEN1c3RvbWVyVXNlckxvZ2luMiA9ICRIZWxwZXItPlRlc3RDdXN0b21lclVzZXJDcmVhdGUoKTsKbXkgJEN1c3RvbWVyUGFzc3dvcmQyICA9ICRDdXN0b21lclVzZXJMb2dpbjI7CgojIHN0YXJ0IHJlcXVlc3RlciB3aXRoIG91ciB3ZWIgc2VydmljZQpteSAkUmVxdWVzdGVyU2Vzc2lvblJlc3VsdCA9ICRSZXF1ZXN0ZXJTZXNzaW9uT2JqZWN0LT5SdW4oCiAgICBXZWJzZXJ2aWNlSUQgPT4gJFdlYnNlcnZpY2VJRCwKICAgIEludm9rZXIgICAgICA9PiAnU2Vzc2lvbkNyZWF0ZScsCiAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgIFVzZXJMb2dpbiA9PiAkVXNlckxvZ2luLAogICAgICAgIFBhc3N3b3JkICA9PiAkUGFzc3dvcmQsCiAgICB9LAopOwoKbXkgJE5ld1Nlc3Npb25JRCA9ICRSZXF1ZXN0ZXJTZXNzaW9uUmVzdWx0LT57RGF0YX0tPntTZXNzaW9uSUR9OwpteSBAVGVzdHMgICAgICAgID0gKAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdUaWNrZXQgd2l0aCBJRHMnLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgU3VjY2Vzc0NyZWF0ZSAgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdUaWNrZXQgVGl0bGUnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVzWzBdLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gJFJlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBQZW5kaW5nVGltZSAgID0+IHsKICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gMjAxMiwKICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gMTIsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+IDE2LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICAgICAgICAgICAgICBNaW51dGUgPT4gNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlID0+IHsKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FydGljbGUgc3ViamVjdCcsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBcnRpY2xlIGJvZHknLAogICAgICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgICAgICAgICAgICA9PiAnYXV0byByZXBseScsCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlSUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDb21tdW5pY2F0aW9uQ2hhbm5lbCAgICAgICAgICAgID0+ICdFbWFpbCcsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdlbmpveUBvdHJzLmNvbScsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURjgnLAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgICAgICAgICAgICA9PiAnTmV3VGlja2V0JywKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgICAgICAgICAgICAgPT4gJyUgJSAnLAogICAgICAgICAgICAgICAgVGltZVVuaXQgICAgICAgICAgICAgICAgICAgICAgICA9PiAyNSwKICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgICAgPT4gWyRVc2VySURdLAogICAgICAgICAgICAgICAgRXhjbHVkZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgICAgICBFeGNsdWRlTXV0ZU5vdGlmaWNhdGlvblRvVXNlcklEID0+IFskVXNlcklEXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkRGF0YS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICcyMDEyLTAxLTE3IDEyOjQwOjAwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZERhdGEyLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJ0R5bmFtaWNGaWVsZFR5cGVBcnRpY2xlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEF0dGFjaG1lbnQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICdWR2hwY3lCcGN5QmhJSFJsYzNRZ2RHVjRkQzQ9JywKICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEY4JywKICAgICAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnVGVzdC50eHQnLAogICAgICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldENyZWF0ZScsCiAgICB9LAopOwoKIyBkZWJ1Z2dlciBvYmplY3QKbXkgJERlYnVnZ2VyT2JqZWN0ID0gS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpEZWJ1Z2dlci0+bmV3KAogICAgRGVidWdnZXJDb25maWcgPT4gewogICAgICAgIERlYnVnVGhyZXNob2xkID0+ICdkZWJ1ZycsCiAgICAgICAgVGVzdE1vZGUgICAgICAgPT4gMSwKICAgIH0sCiAgICBXZWJzZXJ2aWNlSUQgICAgICA9PiAkV2Vic2VydmljZUlELAogICAgQ29tbXVuaWNhdGlvblR5cGUgPT4gJ1Byb3ZpZGVyJywKKTsKJFNlbGYtPklzKAogICAgcmVmICREZWJ1Z2dlck9iamVjdCwKICAgICdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OkRlYnVnZ2VyJywKICAgICdEZWJ1Z2dlck9iamVjdCBpbnN0YW50aWF0ZSBjb3JyZWN0bHknLAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIGNyZWF0ZSBsb2NhbCBvYmplY3QKICAgIG15ICRMb2NhbE9iamVjdCA9ICJLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6VGlja2V0OjokVGVzdC0+e09wZXJhdGlvbn0iLT5uZXcoCiAgICAgICAgRGVidWdnZXJPYmplY3QgPT4gJERlYnVnZ2VyT2JqZWN0LAogICAgICAgIFdlYnNlcnZpY2VJRCAgID0+ICRXZWJzZXJ2aWNlSUQsCiAgICAgICAgT3BlcmF0aW9uICAgICAgPT4gJFRlc3QtPntPcGVyYXRpb259LAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgcmVmICRMb2NhbE9iamVjdCwKICAgICAgICAiS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OlRpY2tldDo6JFRlc3QtPntPcGVyYXRpb259IiwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIENyZWF0ZSBsb2NhbCBvYmplY3QiLAogICAgKTsKCiAgICBteSAlQXV0aCA9ICgKICAgICAgICBVc2VyTG9naW4gPT4gJFVzZXJMb2dpbiwKICAgICAgICBQYXNzd29yZCAgPT4gJFBhc3N3b3JkLAogICAgKTsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRUZXN0LT57QXV0aH0gKSApIHsKICAgICAgICAlQXV0aCA9ICV7ICRUZXN0LT57QXV0aH0gfTsKICAgIH0KCiAgICAjIHN0YXJ0IHJlcXVlc3RlciB3aXRoIG91ciB3ZWIgc2VydmljZQogICAgbXkgJExvY2FsUmVzdWx0ID0gJExvY2FsT2JqZWN0LT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRXZWJzZXJ2aWNlSUQsCiAgICAgICAgSW52b2tlciAgICAgID0+ICRUZXN0LT57T3BlcmF0aW9ufSwKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlQXV0aCwKICAgICAgICAgICAgJXsgJFRlc3QtPntSZXF1ZXN0RGF0YX0gfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGNoZWNrIHJlc3VsdAogICAgJFNlbGYtPklzKAogICAgICAgIHJlZiAkTG9jYWxSZXN1bHQsCiAgICAgICAgJ0hBU0gnLAogICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IHN0cnVjdHVyZSBpcyB2YWxpZCIsCiAgICApOwoKICAgICMgY3JlYXRlIHJlcXVlc3RlciBvYmplY3QKICAgIG15ICRSZXF1ZXN0ZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpOwogICAgJFNlbGYtPklzKAogICAgICAgIHJlZiAkUmVxdWVzdGVyT2JqZWN0LAogICAgICAgICdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicsCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBDcmVhdGUgcmVxdWVzdGVyIG9iamVjdCIsCiAgICApOwoKICAgICMgc3RhcnQgcmVxdWVzdGVyIHdpdGggb3VyIHdlYiBzZXJ2aWNlCiAgICBteSAkUmVxdWVzdGVyUmVzdWx0ID0gJFJlcXVlc3Rlck9iamVjdC0+UnVuKAogICAgICAgIFdlYnNlcnZpY2VJRCA9PiAkV2Vic2VydmljZUlELAogICAgICAgIEludm9rZXIgICAgICA9PiAkVGVzdC0+e09wZXJhdGlvbn0sCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJUF1dGgsCiAgICAgICAgICAgICV7ICRUZXN0LT57UmVxdWVzdERhdGF9IH0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBjaGVjayByZXN1bHQKICAgICRTZWxmLT5JcygKICAgICAgICByZWYgJFJlcXVlc3RlclJlc3VsdCwKICAgICAgICAnSEFTSCcsCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXF1ZXN0ZXIgcmVzdWx0IHN0cnVjdHVyZSBpcyB2YWxpZCIsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkUmVxdWVzdGVyUmVzdWx0LT57U3VjY2Vzc30sCiAgICAgICAgJFRlc3QtPntTdWNjZXNzUmVxdWVzdH0sCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXF1ZXN0ZXIgc3VjY2Vzc2Z1bCByZXN1bHQiLAogICAgKTsKCiAgICAjIHRlc3RzIHN1cHBvc2VkIHRvIHN1Y2NlZWQKICAgIGlmICggJFRlc3QtPntTdWNjZXNzQ3JlYXRlfSApIHsKCiAgICAgICAgIyBsb2NhbCByZXN1bHRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdC0+e0RhdGF9LT57VGlja2V0SUR9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIHJlc3VsdCBUaWNrZXRJRCB3aXRoIFRydWUuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IFRpY2tldE51bWJlciB3aXRoIFRydWUuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IEFydGljbGVJRCB3aXRoIFRydWUuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57RGF0YX0tPntFcnJvcn0sCiAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIExvY2FsIHJlc3VsdCBFcnJvciBpcyB1bmRlZmluZWQuIiwKICAgICAgICApOwoKICAgICAgICAjIHJlcXVlc3RlciByZXN1bHRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRSZXF1ZXN0ZXJSZXN1bHQtPntEYXRhfS0+e1RpY2tldElEfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXF1ZXN0ZXIgcmVzdWx0IFRpY2tldElEIHdpdGggVHJ1ZS4iLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRSZXF1ZXN0ZXJSZXN1bHQtPntEYXRhfS0+e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gUmVxdWVzdGVyIHJlc3VsdCBUaWNrZXROdW1iZXIgd2l0aCBUcnVlLiIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXF1ZXN0ZXIgcmVzdWx0IEFydGljbGVJRCB3aXRoIFRydWUuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57RXJyb3J9LAogICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXF1ZXN0ZXIgcmVzdWx0IEVycm9yIGlzIHVuZGVmaW5lZC4iLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHRpY2tldCBvYmplY3QKICAgICAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICAgICAjIGNoZWNrIHNldmVyYWwgdGlja2V0IGFuZCBhcnRpY2xlIGRhdGEKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdC0+e0RhdGF9LT57VGlja2V0fS0+e1RpdGxlfSwKICAgICAgICAgICAgJFRlc3QtPntSZXF1ZXN0RGF0YX0tPntUaWNrZXR9LT57VGl0bGV9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFRpY2tldCB0aXRsZSBPay4iLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57RGF0YX0tPntUaWNrZXR9LT57UXVldWVJRH0sCiAgICAgICAgICAgICRUZXN0LT57UmVxdWVzdERhdGF9LT57VGlja2V0fS0+e1F1ZXVlSUR9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFRpY2tldCBRdWV1ZUlEIE9rLiIsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e1RpY2tldH0tPntBcnRpY2xlfS0+e0JvZHl9LAogICAgICAgICAgICAkVGVzdC0+e1JlcXVlc3REYXRhfS0+e0FydGljbGV9LT57Qm9keX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gQXJ0aWNsZSBib2R5IE9rLiIsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e1RpY2tldH0tPntBcnRpY2xlfS0+e0Zyb219LAogICAgICAgICAgICAkVGVzdC0+e1JlcXVlc3REYXRhfS0+e0FydGljbGV9LT57RnJvbX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gQXJ0aWNsZSBmcm9tIE9rLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBkeW5hbWljIGZpZWxkcwogICAgICAgIG15ICVDb21wYXJlRHluYW1pY0ZpZWxkVGVzdDsKICAgICAgICBmb3IgbXkgJEZpZWxkICggQHsgJFRlc3QtPntSZXF1ZXN0RGF0YX0tPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgICAgIGlmICggJEZpZWxkLT57TmFtZX0gZXEgJER5bmFtaWNGaWVsZERhdGEtPntOYW1lfSApIHsKICAgICAgICAgICAgICAgICRDb21wYXJlRHluYW1pY0ZpZWxkVGVzdHtUaWNrZXR9ID0gJEZpZWxkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEZpZWxkLT57TmFtZX0gZXEgJER5bmFtaWNGaWVsZERhdGEyLT57TmFtZX0gKSB7CiAgICAgICAgICAgICAgICAkQ29tcGFyZUR5bmFtaWNGaWVsZFRlc3R7QXJ0aWNsZX0gPSAkRmllbGQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICBteSAlQ29tcGFyZUR5bmFtaWNGaWVsZExvY2FsOwogICAgICAgIExPQ0FMUkVTVUxUVElDS0VUOgogICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e1RpY2tldH0tPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgICAgIG5leHQgTE9DQUxSRVNVTFRUSUNLRVQgaWYgJEZpZWxkLT57TmFtZX0gbmUgJER5bmFtaWNGaWVsZERhdGEtPntOYW1lfTsKICAgICAgICAgICAgJENvbXBhcmVEeW5hbWljRmllbGRMb2NhbHtUaWNrZXR9ID0gJEZpZWxkOwogICAgICAgIH0KCiAgICAgICAgTE9DQUxSRVNVTFRBUlRJQ0xFOgogICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkTG9jYWxSZXN1bHQtPntEYXRhfS0+e1RpY2tldH0tPntBcnRpY2xlfS0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBMT0NBTFJFU1VMVEFSVElDTEUgaWYgJEZpZWxkLT57TmFtZX0gbmUgJER5bmFtaWNGaWVsZERhdGEyLT57TmFtZX07CiAgICAgICAgICAgICRDb21wYXJlRHluYW1pY0ZpZWxkTG9jYWx7QXJ0aWNsZX0gPSAkRmllbGQ7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgIFwlQ29tcGFyZUR5bmFtaWNGaWVsZExvY2FsLAogICAgICAgICAgICBcJUNvbXBhcmVEeW5hbWljRmllbGRUZXN0LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIGxvY2FsIFRpY2tldC0+RHluYW1pY0ZpZWxkIG1hdGNoIHRlc3QgZGVmaW5pdGlvbi4iLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57RGF0YX0tPntUaWNrZXR9LT57QXJ0aWNsZX0tPntBdHRhY2htZW50fS0+WzBdLT57RmlsZW5hbWV9LAogICAgICAgICAgICAkVGVzdC0+e1JlcXVlc3REYXRhfS0+e0F0dGFjaG1lbnR9LT5bMF0tPntGaWxlbmFtZX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gQXR0YWNobWVudCBmaWxlbmFtZSBPay4iLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57VGlja2V0fS0+e1RpdGxlfSwKICAgICAgICAgICAgJFRlc3QtPntSZXF1ZXN0RGF0YX0tPntUaWNrZXR9LT57VGl0bGV9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFRpY2tldCB0aXRsZSBPay4iLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57VGlja2V0fS0+e1F1ZXVlSUR9LAogICAgICAgICAgICAkVGVzdC0+e1JlcXVlc3REYXRhfS0+e1RpY2tldH0tPntRdWV1ZUlEfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBUaWNrZXQgUXVldWVJRCBPay4iLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57VGlja2V0fS0+e0FydGljbGV9LT57Qm9keX0sCiAgICAgICAgICAgICRUZXN0LT57UmVxdWVzdERhdGF9LT57QXJ0aWNsZX0tPntCb2R5fSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBBcnRpY2xlIGJvZHkgT2suIiwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRSZXF1ZXN0ZXJSZXN1bHQtPntEYXRhfS0+e1RpY2tldH0tPntBcnRpY2xlfS0+e0Zyb219LAogICAgICAgICAgICAkVGVzdC0+e1JlcXVlc3REYXRhfS0+e0FydGljbGV9LT57RnJvbX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gQXJ0aWNsZSBmcm9tIE9rLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBkeW5hbWljIGZpZWxkcwogICAgICAgIG15ICVDb21wYXJlRHluYW1pY0ZpZWxkUmVxOwogICAgICAgIExPQ0FMUkVTVUxUVElDS0VUOgogICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkUmVxdWVzdGVyUmVzdWx0LT57RGF0YX0tPntUaWNrZXR9LT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IExPQ0FMUkVTVUxUVElDS0VUIGlmICRGaWVsZC0+e05hbWV9IG5lICREeW5hbWljRmllbGREYXRhLT57TmFtZX07CiAgICAgICAgICAgICRDb21wYXJlRHluYW1pY0ZpZWxkUmVxe1RpY2tldH0gPSAkRmllbGQ7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIGZvciB0eXBlIG9mIGtleSBjb250YWluaW5nIGFydGljbGUgZHluYW1pYyBmaWVsZCBkYXRhLCBzaW5jZSBpdCBtaWdodCBiZSBhIGhhc2ggb24gc3lzdGVtcyB3aXRob3V0CiAgICAgICAgIyAgIG11bHRpcGxlIGZpZWxkcyBkZWZpbmVkLiBJbiB0aGlzIGNhc2Ugbm9ybWFsaXplIGl0IHRvIGFuIGFycmF5IG9mIGhhc2hlcyBmb3IgZWFzaWVyIGNvbXBhcmlzb24gbGF0ZXIuCiAgICAgICAgaWYgKCByZWYgJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57VGlja2V0fS0+e0FydGljbGV9LT57RHluYW1pY0ZpZWxkfSBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgICRSZXF1ZXN0ZXJSZXN1bHQtPntEYXRhfS0+e1RpY2tldH0tPntBcnRpY2xlfS0+e0R5bmFtaWNGaWVsZH0KICAgICAgICAgICAgICAgID0gWyAkUmVxdWVzdGVyUmVzdWx0LT57RGF0YX0tPntUaWNrZXR9LT57QXJ0aWNsZX0tPntEeW5hbWljRmllbGR9IF07CiAgICAgICAgfQoKICAgICAgICBMT0NBTFJFU1VMVEFSVElDTEU6CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7ICRSZXF1ZXN0ZXJSZXN1bHQtPntEYXRhfS0+e1RpY2tldH0tPntBcnRpY2xlfS0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBMT0NBTFJFU1VMVEFSVElDTEUgaWYgJEZpZWxkLT57TmFtZX0gbmUgJER5bmFtaWNGaWVsZERhdGEyLT57TmFtZX07CiAgICAgICAgICAgICRDb21wYXJlRHluYW1pY0ZpZWxkUmVxe0FydGljbGV9ID0gJEZpZWxkOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICBcJUNvbXBhcmVEeW5hbWljRmllbGRSZXEsCiAgICAgICAgICAgIFwlQ29tcGFyZUR5bmFtaWNGaWVsZFRlc3QsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gcmVxIFRpY2tldC0+RHluYW1pY0ZpZWxkIG1hdGNoIHRlc3QgZGVmaW5pdGlvbi4iLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgYXR0YWNobWVudAogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFJlcXVlc3RlclJlc3VsdC0+e0RhdGF9LT57VGlja2V0fS0+e0FydGljbGV9LT57QXR0YWNobWVudH0tPntGaWxlbmFtZX0sCiAgICAgICAgICAgICRUZXN0LT57UmVxdWVzdERhdGF9LT57QXR0YWNobWVudH0tPlswXS0+e0ZpbGVuYW1lfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBBdHRhY2htZW50IGZpbGVuYW1lIE9rLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGhlIHRpY2tldHMKICAgICAgICBmb3IgbXkgJFRpY2tldElEICgKICAgICAgICAgICAgJExvY2FsUmVzdWx0LT57RGF0YX0tPntUaWNrZXRJRH0sCiAgICAgICAgICAgICRSZXF1ZXN0ZXJSZXN1bHQtPntEYXRhfS0+e1RpY2tldElEfQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgIyBBbGxvdyBzb21lIHRpbWUgZm9yIGFsbCBoaXN0b3J5IGVudHJpZXMgdG8gYmUgd3JpdHRlbiB0byB0aGUgdGlja2V0IGJlZm9yZSBkZWxldGluZyBpdCwKICAgICAgICAgICAgIyAgIG90aGVyd2lzZSBUaWNrZXREZWxldGUgY291bGQgZmFpbC4KICAgICAgICAgICAgc2xlZXAgMTsKCiAgICAgICAgICAgIG15ICRUaWNrZXREZWxldGUgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXREZWxldGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzYW5pdHkgY2hlY2sKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkVGlja2V0RGVsZXRlLAogICAgICAgICAgICAgICAgIlRpY2tldERlbGV0ZSgpIHN1Y2Nlc3NmdWwgZm9yIFRpY2tldCBJRCAkVGlja2V0SUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KfQoKIyBkZWxldGUgd2ViIHNlcnZpY2UKbXkgJFdlYnNlcnZpY2VEZWxldGUgPSAkV2Vic2VydmljZU9iamVjdC0+V2Vic2VydmljZURlbGV0ZSgKICAgIElEICAgICA9PiAkV2Vic2VydmljZUlELAogICAgVXNlcklEID0+IDEsCik7CiRTZWxmLT5UcnVlKAogICAgJFdlYnNlcnZpY2VEZWxldGUsCiAgICAiRGVsZXRlZCB3ZWIgc2VydmljZSAkV2Vic2VydmljZUlEIiwKKTsKCiMgZ2V0IERCIG9iamVjdApteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCm15ICRTdWNjZXNzOwoKIyBkZWxldGUgcXVldWVzCmZvciBteSAkUXVldWVEYXRhIChAUXVldWVzKSB7CiAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBxdWV1ZSBXSEVSRSBpZCA9ICRRdWV1ZURhdGEtPntRdWV1ZUlEfSIsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgIlF1ZXVlIHdpdGggSUQgJFF1ZXVlRGF0YS0+e1F1ZXVlSUR9IGlzIGRlbGV0ZWQhIiwKICAgICk7Cn0KCiMgZGVsZXRlIGdyb3VwCiRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgIFNRTCA9PiAiREVMRVRFIEZST00gZ3JvdXBzIFdIRVJFIGlkID0gJEdyb3VwSUQiLAopOwokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIkdyb3VwIHdpdGggSUQgJEdyb3VwSUQgaXMgZGVsZXRlZCEiLAopOwoKIyBkZWxldGUgdHlwZQokU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHRpY2tldF90eXBlIFdIRVJFIGlkID0gJFR5cGVJRCIsCik7CiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiVHlwZSB3aXRoIElEICRUeXBlSUQgaXMgZGVsZXRlZCEiLAopOwoKIyBkZWxldGUgc2VydmljZV9jdXN0b21lcl91c2VyIGFuZCBzZXJ2aWNlCiRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgIFNRTCA9PiAiREVMRVRFIEZST00gc2VydmljZV9jdXN0b21lcl91c2VyIFdIRVJFIHNlcnZpY2VfaWQgPSAkU2VydmljZUlEIiwKKTsKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICJTZXJ2aWNlIHVzZXIgcmVmZXJlbmNlZCB0byBzZXJ2aWNlIElEICRTZXJ2aWNlSUQgaXMgZGVsZXRlZCEiLAopOwoKJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgU1FMID0+ICJERUxFVEUgRlJPTSBzZXJ2aWNlX3NsYSBXSEVSRSBzZXJ2aWNlX2lkID0gJFNlcnZpY2VJRCBPUiBzbGFfaWQgPSAkU0xBSUQiLAopOwokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIlNlcnZpY2UgU0xBIHJlZmVyZW5jZWQgdG8gc2VydmljZSBJRCAkU2VydmljZUlEIGlzIGRlbGV0ZWQhIiwKKTsKCiRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgIFNRTCA9PiAiREVMRVRFIEZST00gc2VydmljZSBXSEVSRSBpZCA9ICRTZXJ2aWNlSUQiLAopOwokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIlNlcnZpY2Ugd2l0aCBJRCAkU2VydmljZUlEIGlzIGRlbGV0ZWQhIiwKKTsKCiMgZGVsZXRlIFNMQQokU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNsYSBXSEVSRSBpZCA9ICRTTEFJRCIsCik7CiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiU0xBIHdpdGggSUQgJFNMQUlEIGlzIGRlbGV0ZWQhIiwKKTsKCiMgZGVsZXRlIHN0YXRlCiRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgIFNRTCA9PiAiREVMRVRFIEZST00gdGlja2V0X3N0YXRlIFdIRVJFIGlkID0gJFN0YXRlSUQiLAopOwokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIlN0YXRlIHdpdGggSUQgJFN0YXRlSUQgaXMgZGVsZXRlZCEiLAopOwoKIyBkZWxldGUgcHJpb3JpdHkKJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgU1FMID0+ICJERUxFVEUgRlJPTSB0aWNrZXRfcHJpb3JpdHkgV0hFUkUgaWQgPSAkUHJpb3JpdHlJRCIsCik7CiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiUHJpb3JpdHkgd2l0aCBJRCAkUHJpb3JpdHlJRCBpcyBkZWxldGVkISIsCik7CgojIERlbGV0ZSB0ZXN0IGR5bmFtaWMgZmllbGRzLgokU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBkeW5hbWljX2ZpZWxkIFdIRVJFIGlkID0gPyBPUiBpZCA9ID8nLAogICAgQmluZCA9PiBbIFwkRHluYW1pY0ZpZWxkSUQsIFwkRHluYW1pY0ZpZWxkSUQyIF0sCik7CiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiRHluYW1pYyBmaWVsZHMgd2l0aCBJRCAkRHluYW1pY0ZpZWxkSUQgYW5kICREeW5hbWljRmllbGRJRDIgYXJlIGRlbGV0ZWQhIiwKKTsKCiMgY2xlYW51cCBjYWNoZQokS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgpOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSAwYTA0ZTcyMmZiY2JkMzljY2EzZmIwODljMjk0ZTcyYjMxNzBlNmIxIC0gc2NyaXB0cy90ZXN0L0dlbmVyaWNJbnRlcmZhY2UvT3BlcmF0aW9uL1RpY2tldC9UaWNrZXRTZWFyY2gudAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKIyMgbm8gY3JpdGljIChNb2R1bGVzOjpSZXF1aXJlRXhwbGljaXRQYWNrYWdlKQp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7Cgp1c2UgTUlNRTo6QmFzZTY0OwoKdXNlIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6RGVidWdnZXI7CnVzZSBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6VGlja2V0OjpUaWNrZXRTZWFyY2g7CnVzZSBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6Ok9wZXJhdGlvbjo6U2Vzc2lvbjo6U2Vzc2lvbkNyZWF0ZTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwpteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKIyBTa2lwIFNTTCBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24uCiRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicgPT4gewogICAgICAgIFNraXBTU0xWZXJpZnkgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKIyBzZWFyY2ggb2xkIHRlc3QgdGlja2V0cwpteSBAT2xkVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJypAZXhhbXBsZS5jb20nLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0FSUkFZJywKICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCik7CgojIGRlbGV0ZSBvbGQgdGVzdCB0aWNrZXQgdG8gaGF2ZSBhIGNsZWFuIGVudmlyb25tZW50CmZvciBteSAkVGlja2V0SUQgKEBPbGRUaWNrZXRJRHMpIHsKICAgICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7Cn0KCiMgZ2V0IGEgcmFuZG9tIG51bWJlcgpteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21OdW1iZXIoKTsKCiRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgIFZhbHVlID0+IDAsCik7CgojIGdldCB0aGUgc3RhcnQgdGltZSBmb3IgdGhlIHRlc3QKbXkgJFN0YXJ0VGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwoKIyBnZXQgdXNlciBvYmplY3QKbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKIyBjcmVhdGUgYSBuZXcgdXNlciBmb3IgY3VycmVudCB0ZXN0Cm15ICRVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckFkZCgKICAgIFVzZXJGaXJzdG5hbWUgPT4gJ1Rlc3QnLAogICAgVXNlckxhc3RuYW1lICA9PiAnVXNlcicsCiAgICBVc2VyTG9naW4gICAgID0+ICdUZXN0VXNlcicgLiAkUmFuZG9tSUQsCiAgICBVc2VyUHcgICAgICAgID0+ICdzb21lLXBhc3MnLAogICAgVXNlckVtYWlsICAgICA9PiAndGVzdCcgLiAkUmFuZG9tSUQgLiAnZW1haWxAZXhhbXBsZS5jb20nLAogICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgQ2hhbmdlVXNlcklEICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkVXNlcklELAogICAgJ1VzZXIgQWRkICgpJywKKTsKCiMgY3JlYXRlIHR5cGUgb2JqZWN0Cm15ICRUeXBlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlR5cGUnKTsKCiMgY3JlYXRlIG5ldyB0eXBlCm15ICRUeXBlSUQgPSAkVHlwZU9iamVjdC0+VHlwZUFkZCgKICAgIE5hbWUgICAgPT4gJ1Rlc3RUeXBlJyAuICRSYW5kb21JRCwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5UcnVlKAogICAgJFR5cGVJRCwKICAgICJUeXBlQWRkKCkgLSBjcmVhdGUgdGVzdGluZyB0eXBlIiwKKTsKCm15ICVUeXBlRGF0YSA9ICRUeXBlT2JqZWN0LT5UeXBlR2V0KAogICAgSUQgPT4gJFR5cGVJRCwKKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5UcnVlKAogICAgSXNIYXNoUmVmV2l0aERhdGEoIFwlVHlwZURhdGEgKSwKICAgICJRdWV1ZUdldCgpIC0gZm9yIHRlc3RpbmcgdHlwZSIsCik7CgojIGdldCBzZXJ2aWNlIG9iamVjdApteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyk7CgojIGNyZWF0ZSBuZXcgc2VydmljZQpteSAkU2VydmljZUlEID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VBZGQoCiAgICBOYW1lICAgID0+ICdUZXN0U2VydmljZScgLiAkUmFuZG9tSUQsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgIFR5cGVJRCAgICAgID0+IDEsCiAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKIyBzYW5pdHkgY2hlY2sKJFNlbGYtPlRydWUoCiAgICAkU2VydmljZUlELAogICAgIlNlcnZpY2VBZGQoKSAtIGNyZWF0ZSB0ZXN0aW5nIHNlcnZpY2UiLAopOwoKbXkgJVNlcnZpY2VEYXRhID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VHZXQoCiAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRCwKICAgIFVzZXJJRCAgICA9PiAxLAopOwoKIyBzYW5pdHkgY2hlY2sKJFNlbGYtPlRydWUoCiAgICBJc0hhc2hSZWZXaXRoRGF0YSggXCVTZXJ2aWNlRGF0YSApLAogICAgIlNlcnZpY2VHZXQoKSAtIGZvciB0ZXN0aW5nIHNlcnZpY2UiLAopOwoKIyBjcmVhdGUgZHluYW1pYyBmaWVsZCBwcm9wZXJ0aWVzCm15IEBEeW5hbWljRmllbGRQcm9wZXJ0aWVzID0gKAogICAgewogICAgICAgIE5hbWUgICAgICAgPT4gIkRGVDEkUmFuZG9tSUQiLAogICAgICAgIEZpZWxkT3JkZXIgPT4gOTk5MSwKICAgICAgICBGaWVsZFR5cGUgID0+ICdUZXh0JywKICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgRGVmYXVsdFZhbHVlID0+ICdEZWZhdWx0JywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgID0+ICJERlQyJFJhbmRvbUlEIiwKICAgICAgICBGaWVsZE9yZGVyID0+IDk5OTIsCiAgICAgICAgRmllbGRUeXBlICA9PiAnRHJvcGRvd24nLAogICAgICAgIENvbmZpZyAgICAgPT4gewogICAgICAgICAgICBEZWZhdWx0VmFsdWUgICA9PiAnRGVmYXVsdCcsCiAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+IHsKICAgICAgICAgICAgICAgIHRpY2tldDFfZmllbGQyID0+ICd0aWNrZXQxX2ZpZWxkMicsCiAgICAgICAgICAgICAgICB0aWNrZXQyX2ZpZWxkMiA9PiAndGlja2V0Ml9maWVsZDInLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgPT4gIkRGVDMkUmFuZG9tSUQiLAogICAgICAgIEZpZWxkT3JkZXIgPT4gOTk5MywKICAgICAgICBGaWVsZFR5cGUgID0+ICdEYXRlVGltZScsICAgICAgICAjIG1hbmRhdG9yeSwgc2VsZWN0cyB0aGUgREYgYmFja2VuZCB0byB1c2UgZm9yIHRoaXMgZmllbGQKICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgRGVmYXVsdFZhbHVlID0+ICdEZWZhdWx0JywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgID0+ICJERlQ0JFJhbmRvbUlEIiwKICAgICAgICBGaWVsZE9yZGVyID0+IDk5OTQsCiAgICAgICAgRmllbGRUeXBlICA9PiAnRGF0ZScsICAgICAgICAgICAgIyBtYW5kYXRvcnksIHNlbGVjdHMgdGhlIERGIGJhY2tlbmQgdG8gdXNlIGZvciB0aGlzIGZpZWxkCiAgICAgICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgICAgIERlZmF1bHRWYWx1ZSA9PiAnRGVmYXVsdCcsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICA9PiAiREZUNSRSYW5kb21JRCIsCiAgICAgICAgRmllbGRPcmRlciA9PiA5OTk1LAogICAgICAgIEZpZWxkVHlwZSAgPT4gJ0NoZWNrYm94JywgICAgICAgICMgbWFuZGF0b3J5LCBzZWxlY3RzIHRoZSBERiBiYWNrZW5kIHRvIHVzZSBmb3IgdGhpcyBmaWVsZAogICAgICAgIENvbmZpZyAgICAgPT4gewogICAgICAgICAgICBEZWZhdWx0VmFsdWUgPT4gJ0RlZmF1bHQnLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgPT4gIkRGVDYkUmFuZG9tSUQiLAogICAgICAgIEZpZWxkT3JkZXIgPT4gOTk5NiwKICAgICAgICBGaWVsZFR5cGUgID0+ICdNdWx0aXNlbGVjdCcsICAgICAjIG1hbmRhdG9yeSwgc2VsZWN0cyB0aGUgREYgYmFja2VuZCB0byB1c2UgZm9yIHRoaXMgZmllbGQKICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgRGVmYXVsdFZhbHVlICAgPT4gWyAndGlja2V0Ml9maWVsZDUnLCAndGlja2V0NF9maWVsZDUnIF0sCiAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+IHsKICAgICAgICAgICAgICAgIHRpY2tldDFfZmllbGQ1ID0+ICd0aWNrZXQxX2ZpZWxkNTEnLAogICAgICAgICAgICAgICAgdGlja2V0Ml9maWVsZDUgPT4gJ3RpY2tldDJfZmllbGQ1MicsCiAgICAgICAgICAgICAgICB0aWNrZXQzX2ZpZWxkNSA9PiAndGlja2V0Ml9maWVsZDUzJywKICAgICAgICAgICAgICAgIHRpY2tldDRfZmllbGQ1ID0+ICd0aWNrZXQyX2ZpZWxkNTQnLAogICAgICAgICAgICAgICAgdGlja2V0NV9maWVsZDUgPT4gJ3RpY2tldDJfZmllbGQ1NScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0KKTsKCiMgY3JlYXRlIGR5bmFtaWMgZmllbGRzCm15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7Cm15IEBUZXN0RmllbGRDb25maWc7Cgpmb3IgbXkgJER5bmFtaWNGaWVsZFByb3BlcnR5IChARHluYW1pY0ZpZWxkUHJvcGVydGllcykgewogICAgbXkgJEZpZWxkSUQgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRBZGQoCiAgICAgICAgJXskRHluYW1pY0ZpZWxkUHJvcGVydHl9LAogICAgICAgIExhYmVsICAgICAgPT4gJ0Rlc2NyaXB0aW9uJywKICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgUmVvcmRlciAgICA9PiAwLAogICAgKTsKCiAgICBwdXNoIEBUZXN0RmllbGRDb25maWcsICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICBJRCA9PiAkRmllbGRJRCwKICAgICk7Cn0KCiMgY3JlYXRlIDMgdGlja2V0cwoKIyB0aWNrZXQgaWQgY29udGFpbmVyCm15IEBUaWNrZXRJRHM7CgojIGNyZWF0ZSB0aWNrZXQgMQpteSAkVGlja2V0SUQxID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKAogICAgVGl0bGUgICAgICAgID0+ICdUaWNrZXQgT25lIFRpdGxlICcgLiAkUmFuZG9tSUQsCiAgICBRdWV1ZSAgICAgICAgPT4gJ1JhdycsCiAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICBQcmlvcml0eSAgICAgPT4gJzMgbm9ybWFsJywKICAgIFN0YXRlICAgICAgICA9PiAnbmV3JywKICAgIEN1c3RvbWVySUQgICA9PiAnMTIzNDY1JyAuICRSYW5kb21JRCwKICAgIEN1c3RvbWVyVXNlciA9PiAnY3VzdG9tZXJPbmVAZXhhbXBsZS5jb20nLAogICAgU2VydmljZSAgICAgID0+ICdUZXN0U2VydmljZScgLiAkUmFuZG9tSUQsCiAgICBPd25lcklEICAgICAgPT4gMSwKICAgIFVzZXJJRCAgICAgICA9PiAxLAopOwoKIyBzYW5pdHkgY2hlY2sKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0SUQxLAogICAgIlRpY2tldENyZWF0ZSgpIHN1Y2Nlc3NmdWwgZm9yIFRpY2tldCBPbmUgSUQgJFRpY2tldElEMSIsCik7CgpteSAkVGlja2V0TnVtYmVyMSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldE51bWJlckxvb2t1cCgKICAgIFRpY2tldElEID0+ICRUaWNrZXRJRDEsCik7CgojIHNhbml0eSBjaGVjawokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXROdW1iZXIxLAogICAgIlRpY2tldE51bWJlckxvb2t1cCgpIHN1Y2Nlc3NmdWwgZm9yIFRpY2tldCBPbmUgSUQgJFRpY2tldElEMSIsCik7CgojIHVwZGF0ZSBlc2NhbGF0aW9uIHRpbWVzIGRpcmVjdGx5IGluIHRoZSBEQgpteSAkRXNjYWxhdGlvblRpbWUgPSAkU3RhcnRUaW1lLT5Ub0Vwb2NoKCkgKyAxMjA7CnJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgU1FMID0+ICcKICAgICAgICBVUERBVEUgdGlja2V0CiAgICAgICAgU0VUIGVzY2FsYXRpb25fdGltZSA9ID8sIGVzY2FsYXRpb25fcmVzcG9uc2VfdGltZSA9ID8sIGVzY2FsYXRpb25fdXBkYXRlX3RpbWUgPSA/LAogICAgICAgICAgICBlc2NhbGF0aW9uX3NvbHV0aW9uX3RpbWUgPSA/LCBjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnkgPSA/CiAgICAgICAgV0hFUkUgaWQgPSA/JywKICAgIEJpbmQgPT4gWwogICAgICAgIFwkRXNjYWxhdGlvblRpbWUsCiAgICAgICAgXCRFc2NhbGF0aW9uVGltZSwKICAgICAgICBcJEVzY2FsYXRpb25UaW1lLAogICAgICAgIFwkRXNjYWxhdGlvblRpbWUsCiAgICAgICAgXCcxJywKICAgICAgICBcJFRpY2tldElEMSwKICAgIF0sCik7CgojIGNyZWF0ZSBiYWNrZW5kIG9iamVjdCBhbmQgZGVsZWdhdGVzCm15ICRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwokU2VsZi0+SXMoCiAgICByZWYgJEJhY2tlbmRPYmplY3QsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcsCiAgICAnQmFja2VuZCBvYmplY3Qgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5JywKKTsKCiRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkVGVzdEZpZWxkQ29uZmlnWzBdLAogICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRDEsCiAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJ3RpY2tldDFfZmllbGQxJywKICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAopOwoKJEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRUZXN0RmllbGRDb25maWdbMV0sCiAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElEMSwKICAgIFZhbHVlICAgICAgICAgICAgICA9PiAndGlja2V0MV9maWVsZDInLAogICAgVXNlcklEICAgICAgICAgICAgID0+IDEsCik7CgokQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJFRlc3RGaWVsZENvbmZpZ1syXSwKICAgIE9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQxLAogICAgVmFsdWUgICAgICAgICAgICAgID0+ICcyMDAxLTAxLTAxIDAxOjAxOjAxJywKICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAopOwoKJEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRUZXN0RmllbGRDb25maWdbM10sCiAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElEMSwKICAgIFZhbHVlICAgICAgICAgICAgICA9PiAnMjAwMS0wMS0wMSAwMDowMDowMCcsCiAgICBVc2VySUQgICAgICAgICAgICAgPT4gMSwKKTsKCiRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkVGVzdEZpZWxkQ29uZmlnWzRdLAogICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRDEsCiAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJzAnLAogICAgVXNlcklEICAgICAgICAgICAgID0+IDEsCik7CgokQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJFRlc3RGaWVsZENvbmZpZ1s1XSwKICAgIE9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQxLAogICAgVmFsdWUgICAgICAgICAgICAgID0+IFsgJ3RpY2tldDFfZmllbGQ1MScsICd0aWNrZXQxX2ZpZWxkNTInLCAndGlja2V0MV9maWVsZDUzJyBdLAogICAgVXNlcklEICAgICAgICAgICAgID0+IDEsCik7CgojIGdldCB0aGUgVGlja2V0IGVudHJ5CiMgd2l0aG91dCBkeW5hbWljIGZpZWxkcwpteSAlVGlja2V0RW50cnlPbmUgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRDEsCiAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCik7CgokU2VsZi0+VHJ1ZSgKICAgIElzSGFzaFJlZldpdGhEYXRhKCBcJVRpY2tldEVudHJ5T25lICksCiAgICAiVGlja2V0R2V0KCkgc3VjY2Vzc2Z1bCBmb3IgTG9jYWwgVGlja2V0R2V0IE9uZSBJRCAkVGlja2V0SUQxIiwKKTsKCmZvciBteSAkS2V5ICggc29ydCBrZXlzICVUaWNrZXRFbnRyeU9uZSApIHsKICAgIGlmICggISRUaWNrZXRFbnRyeU9uZXskS2V5fSApIHsKICAgICAgICAkVGlja2V0RW50cnlPbmV7JEtleX0gPSAnJzsKICAgIH0KICAgIGlmICggJEtleSBlcSAnQWdlJyApIHsKICAgICAgICBkZWxldGUgJFRpY2tldEVudHJ5T25leyRLZXl9OwogICAgfQp9CgojIGdldCB0aGUgVGlja2V0IGVudHJ5CiMgd2l0aCBkeW5hbWljIGZpZWxkcwpteSAlVGlja2V0RW50cnlPbmVERiA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElEMSwKICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKKTsKCiRTZWxmLT5UcnVlKAogICAgSXNIYXNoUmVmV2l0aERhdGEoIFwlVGlja2V0RW50cnlPbmVERiApLAogICAgIlRpY2tldEdldCgpIHN1Y2Nlc3NmdWwgd2l0aCBERiBmb3IgTG9jYWwgVGlja2V0R2V0IE9uZSBJRCAkVGlja2V0SUQxIiwKKTsKCmZvciBteSAkS2V5ICggc29ydCBrZXlzICVUaWNrZXRFbnRyeU9uZURGICkgewogICAgaWYgKCAhJFRpY2tldEVudHJ5T25lREZ7JEtleX0gKSB7CiAgICAgICAgJFRpY2tldEVudHJ5T25lREZ7JEtleX0gPSAnJzsKICAgIH0KICAgIGlmICggJEtleSBlcSAnQWdlJyApIHsKICAgICAgICBkZWxldGUgJFRpY2tldEVudHJ5T25lREZ7JEtleX07CiAgICB9Cn0KCiMgYWRkIHRpY2tldCBpZApwdXNoIEBUaWNrZXRJRHMsICRUaWNrZXRJRDE7CgojIGNyZWF0ZSB0aWNrZXQgMgpteSAkVGlja2V0SUQyID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKAogICAgVGl0bGUgICAgICAgID0+ICdUaWNrZXQgVHdvIFRpdGxlICcgLiAkUmFuZG9tSUQsCiAgICBRdWV1ZSAgICAgICAgPT4gJ1JhdycsCiAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICBQcmlvcml0eSAgICAgPT4gJzMgbm9ybWFsJywKICAgIFN0YXRlICAgICAgICA9PiAnbmV3JywKICAgIEN1c3RvbWVySUQgICA9PiAnMTIzNDY1JyAuICRSYW5kb21JRCwKICAgIEN1c3RvbWVyVXNlciA9PiAnY3VzdG9tZXJUd28nIC4gJFJhbmRvbUlEIC4gJ0BleGFtcGxlLmNvbScsCiAgICBPd25lcklEICAgICAgPT4gMSwKICAgIFVzZXJJRCAgICAgICA9PiAxLAopOwoKIyBzYW5pdHkgY2hlY2sKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0SUQyLAogICAgIlRpY2tldENyZWF0ZSgpIHN1Y2Nlc3NmdWwgZm9yIFRpY2tldCBUd28gSUQgJFRpY2tldElEMiIsCik7CgpteSAkVGlja2V0TnVtYmVyMiA9ICRUaWNrZXRPYmplY3QtPlRpY2tldE51bWJlckxvb2t1cCgKICAgIFRpY2tldElEID0+ICRUaWNrZXRJRDIsCik7CgojIHNhbml0eSBjaGVjawokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXROdW1iZXIyLAogICAgIlRpY2tldE51bWJlckxvb2t1cCgpIHN1Y2Nlc3NmdWwgZm9yIFRpY2tldCBPbmUgSUQgJFRpY2tldElEMiIsCik7CgojIHNldCBkeW5hbWljIGZpZWxkIHZhbHVlcwokQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJFRlc3RGaWVsZENvbmZpZ1swXSwKICAgIE9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQyLAogICAgVmFsdWUgICAgICAgICAgICAgID0+ICd0aWNrZXQyX2ZpZWxkMScsCiAgICBVc2VySUQgICAgICAgICAgICAgPT4gMSwKKTsKCiRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkVGVzdEZpZWxkQ29uZmlnWzFdLAogICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRDIsCiAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJ3RpY2tldDJfZmllbGQyJywKICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAopOwoKJEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRUZXN0RmllbGRDb25maWdbMl0sCiAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElEMiwKICAgIFZhbHVlICAgICAgICAgICAgICA9PiAnMjAxMS0xMS0xMSAxMToxMToxMScsCiAgICBVc2VySUQgICAgICAgICAgICAgPT4gMSwKKTsKCiRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkVGVzdEZpZWxkQ29uZmlnWzNdLAogICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRDIsCiAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJzIwMTEtMTEtMTEgMDA6MDA6MDAnLAogICAgVXNlcklEICAgICAgICAgICAgID0+IDEsCik7CgokQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJFRlc3RGaWVsZENvbmZpZ1s0XSwKICAgIE9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQyLAogICAgVmFsdWUgICAgICAgICAgICAgID0+ICcxJywKICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAopOwoKJEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRUZXN0RmllbGRDb25maWdbNV0sCiAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElEMiwKICAgIFZhbHVlICAgICAgICAgICAgICA9PiBbCiAgICAgICAgJ3RpY2tldDFfZmllbGQ1JywKICAgICAgICAndGlja2V0Ml9maWVsZDUnLAogICAgICAgICd0aWNrZXQ0X2ZpZWxkNScsCiAgICBdLAogICAgVXNlcklEID0+IDEsCik7CgojIGdldCB0aGUgVGlja2V0IGVudHJ5CiMgd2l0aG91dCBERgpteSAlVGlja2V0RW50cnlUd28gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRDIsCiAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCik7CgokU2VsZi0+VHJ1ZSgKICAgIElzSGFzaFJlZldpdGhEYXRhKCBcJVRpY2tldEVudHJ5VHdvICksCiAgICAiVGlja2V0R2V0KCkgc3VjY2Vzc2Z1bCBmb3IgTG9jYWwgVGlja2V0R2V0IFR3byBJRCAkVGlja2V0SUQyIiwKKTsKCmZvciBteSAkS2V5ICggc29ydCBrZXlzICVUaWNrZXRFbnRyeVR3byApIHsKICAgIGlmICggISRUaWNrZXRFbnRyeVR3b3skS2V5fSApIHsKICAgICAgICAkVGlja2V0RW50cnlUd297JEtleX0gPSAnJzsKICAgIH0KICAgIGlmICggJEtleSBlcSAnQWdlJyApIHsKICAgICAgICBkZWxldGUgJFRpY2tldEVudHJ5VHdveyRLZXl9OwogICAgfQp9CgojIGdldCB0aGUgVGlja2V0IGVudHJ5CiMgd2l0aCBERgpteSAlVGlja2V0RW50cnlUd29ERiA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElEMiwKICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKKTsKCiRTZWxmLT5UcnVlKAogICAgSXNIYXNoUmVmV2l0aERhdGEoIFwlVGlja2V0RW50cnlUd29ERiApLAogICAgIlRpY2tldEdldCgpIHN1Y2Nlc3NmdWwgZm9yIExvY2FsIFRpY2tldEdldCBUd28gSUQgJFRpY2tldElEMiIsCik7Cgpmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlVGlja2V0RW50cnlUd29ERiApIHsKICAgIGlmICggISRUaWNrZXRFbnRyeVR3b0RGeyRLZXl9ICkgewogICAgICAgICRUaWNrZXRFbnRyeVR3b0RGeyRLZXl9ID0gJyc7CiAgICB9CiAgICBpZiAoICRLZXkgZXEgJ0FnZScgKSB7CiAgICAgICAgZGVsZXRlICRUaWNrZXRFbnRyeVR3b0RGeyRLZXl9OwogICAgfQp9CgojIGFkZCB0aWNrZXQgaWQKcHVzaCBAVGlja2V0SURzLCAkVGlja2V0SUQyOwoKIyBjcmVhdGUgdGlja2V0IDMKbXkgJFRpY2tldElEMyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgIFRpdGxlICAgICAgICA9PiAnVGlja2V0IFRocmVlIFRpdGxlJywKICAgIFF1ZXVlICAgICAgICA9PiAnUmF3JywKICAgIExvY2sgICAgICAgICA9PiAndW5sb2NrJywKICAgIFByaW9yaXR5ICAgICA9PiAnMSB2ZXJ5IGxvdycsCiAgICBTdGF0ZSAgICAgICAgPT4gJ25ldycsCiAgICBDdXN0b21lcklEICAgPT4gJzEyMzQ2NScgLiAkUmFuZG9tSUQsCiAgICBDdXN0b21lclVzZXIgPT4gJ2N1c3RvbWVyVGhyZWVAZXhhbXBsZS5jb20nLAogICAgVHlwZSAgICAgICAgID0+ICdUZXN0VHlwZScgLiAkUmFuZG9tSUQsCiAgICBPd25lcklEICAgICAgPT4gMSwKICAgIFVzZXJJRCAgICAgICA9PiAxLAopOwoKIyBzYW5pdHkgY2hlY2sKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0SUQzLAogICAgIlRpY2tldENyZWF0ZSgpIHN1Y2Nlc3NmdWwgZm9yIFRpY2tldCBUaHJlZSBJRCAkVGlja2V0SUQzIiwKKTsKCiMgZ2V0IHRoZSBUaWNrZXQgZW50cnkKbXkgJVRpY2tldEVudHJ5VGhyZWUgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRDMsCiAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCik7CgokU2VsZi0+VHJ1ZSgKICAgIElzSGFzaFJlZldpdGhEYXRhKCBcJVRpY2tldEVudHJ5VGhyZWUgKSwKICAgICJUaWNrZXRHZXQoKSBzdWNjZXNzZnVsIGZvciBMb2NhbCBUaWNrZXRHZXQgVGhyZWUgSUQgJFRpY2tldElEMyIsCik7Cgpmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlVGlja2V0RW50cnlUaHJlZSApIHsKICAgIGlmICggISRUaWNrZXRFbnRyeVRocmVleyRLZXl9ICkgewogICAgICAgICRUaWNrZXRFbnRyeVRocmVleyRLZXl9ID0gJyc7CiAgICB9CiAgICBpZiAoICRLZXkgZXEgJ0FnZScgKSB7CiAgICAgICAgZGVsZXRlICRUaWNrZXRFbnRyeVRocmVleyRLZXl9OwogICAgfQp9CgojIGFkZCB0aWNrZXQgaWQKcHVzaCBAVGlja2V0SURzLCAkVGlja2V0SUQzOwoKIyBjcmVhdGUgdGlja2V0IDQKbXkgJFRpY2tldElENCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgIFRpdGxlICAgICAgICA9PiAnVGlja2V0IEZvdXIgVGl0bGUgw6TDtsO8w5/DhMOWw5zigqzQuNGBJywKICAgIFF1ZXVlICAgICAgICA9PiAnSnVuaycsCiAgICBMb2NrICAgICAgICAgPT4gJ2xvY2snLAogICAgUHJpb3JpdHkgICAgID0+ICczIG5vcm1hbCcsCiAgICBTdGF0ZSAgICAgICAgPT4gJ25ldycsCiAgICBDdXN0b21lcklEICAgPT4gJzY1NDMyMScgLiAkUmFuZG9tSUQsCiAgICBDdXN0b21lclVzZXIgPT4gJ2N1c3RvbWVyRm91ckBleGFtcGxlLmNvbScsCiAgICBPd25lcklEICAgICAgPT4gMSwKICAgIFVzZXJJRCAgICAgICA9PiAxLAopOwoKIyBzYW5pdHkgY2hlY2sKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0SUQ0LAogICAgIlRpY2tldENyZWF0ZSgpIHN1Y2Nlc3NmdWwgZm9yIFRpY2tldCBGb3VyIElEICRUaWNrZXRJRDQiLAopOwoKbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7Cm15ICRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQ2hhbm5lbCggQ2hhbm5lbE5hbWUgPT4gJ0ludGVybmFsJyApOwoKIyBmaXJzdCBhcnRpY2xlCm15ICRBcnRpY2xlSUQ0MSA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUNyZWF0ZSgKICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRUaWNrZXRJRDQsCiAgICBTZW5kZXJUeXBlICAgICAgICAgICA9PiAnYWdlbnQnLAogICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwKICAgIEZyb20gICAgICAgICAgICAgICAgID0+ICdBZ2VudCBTb21lIEFnZW50IFNvbWUgQWdlbnQgPGVtYWlsQGV4YW1wbGUuY29tPicsCiAgICBUbyAgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tZXIgQSA8Y3VzdG9tZXItYUBleGFtcGxlLmNvbT4nLAogICAgQ2MgICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbWVyIEIgPGN1c3RvbWVyLWJAZXhhbXBsZS5jb20+JywKICAgIFJlcGx5VG8gICAgICAgICAgICAgID0+ICdDdXN0b21lciBCIDxjdXN0b21lci1iQGV4YW1wbGUuY29tPicsCiAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAnZmlyc3QgYXJ0aWNsZScsCiAgICBCb2R5ICAgICAgICAgICAgICAgICA9PiAnQSB0ZXh0IGZvciB0aGUgYm9keSwgVGl0bGUgw6TDtsO8w5/DhMOWw5zigqzQuNGBJywKICAgIENvbnRlbnRUeXBlICAgICAgICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTE1JywKICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICdPd25lclVwZGF0ZScsCiAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAnZmlyc3QgYXJ0aWNsZScsCiAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAxLAogICAgTm9BZ2VudE5vdGlmeSAgICAgICAgPT4gMSwKKTsKCiRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlU2VhcmNoSW5kZXhCdWlsZCgKICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQ0LAogICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQ0MSwKICAgIFVzZXJJRCAgICA9PiAxLAopOwoKIyBzZWNvbmQgYXJ0aWNsZQpteSAkQXJ0aWNsZUlENDIgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVDcmVhdGUoCiAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkVGlja2V0SUQ0LAogICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJ2FnZW50JywKICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsCiAgICBGcm9tICAgICAgICAgICAgICAgICA9PiAnQW5vdCBSZWFsIEFnZW50IDxlbWFpbEBleGFtcGxlLmNvbT4nLAogICAgVG8gICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbWVyIEEgPGN1c3RvbWVyLWFAZXhhbXBsZS5jb20+JywKICAgIENjICAgICAgICAgICAgICAgICAgID0+ICdDdXN0b21lciBCIDxjdXN0b21lci1iQGV4YW1wbGUuY29tPicsCiAgICBSZXBseVRvICAgICAgICAgICAgICA9PiAnQ3VzdG9tZXIgQiA8Y3VzdG9tZXItYkBleGFtcGxlLmNvbT4nLAogICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJ3NlY29uZCBhcnRpY2xlJywKICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICdBIHRleHQgZm9yIHRoZSBib2R5LCBub3QgdG9vIGxvbmcnLAogICAgQ29udGVudFR5cGUgICAgICAgICAgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMTUnLAogICAgSGlzdG9yeVR5cGUgICAgICAgICAgPT4gJ093bmVyVXBkYXRlJywKICAgIEhpc3RvcnlDb21tZW50ICAgICAgID0+ICdzZWNvbmQgYXJ0aWNsZScsCiAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAxLAogICAgTm9BZ2VudE5vdGlmeSAgICAgICAgPT4gMSwKKTsKCiRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlU2VhcmNoSW5kZXhCdWlsZCgKICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQ0LAogICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQ0MiwKICAgIFVzZXJJRCAgICA9PiAxLAopOwoKIyBIZWxwZXIgbWV0aG9kIHRvIHJldHJpZXZlIGFydGljbGUgY29udGVudCBmb3Igc3VwcGxpZWQgbGlzdCBvZiBhcnRpY2xlcy4KIwojICAgICRBcnRpY2xlQ29udGVudEdldC0+KAojICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAxMjMsICAgICAgICAgICAjIChyZXF1aXJlZCkKIyAgICAgICAgQXJ0aWNsZXMgICAgICAgICAgICAgPT4gXEBBcnRpY2xlcywgICAgIyAocmVxdWlyZWQpCiMgICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgID0+IDEsICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBJbmNsdWRlIGR5bmFtaWMgZmllbGQgdmFsdWVzCiMgICAgKTsKIwpteSAkQXJ0aWNsZUNvbnRlbnRHZXQgPSBzdWIgewogICAgbXkgKCVQYXJhbSkgPSBAXzsKCiAgICBpZiAoCiAgICAgICAgISRQYXJhbXtUaWNrZXRJRH0KICAgICAgICAmJiAhSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17QXJ0aWNsZXN9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15IEBBcnRpY2xlQ29udGVudHM7CiAgICBmb3IgbXkgJEFydGljbGUgKCBAeyAkUGFyYW17QXJ0aWNsZXN9IH0gKSB7CiAgICAgICAgbXkgJUFydGljbGVDb250ZW50ID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlR2V0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZS0+e0FydGljbGVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAQXJ0aWNsZUNvbnRlbnRzLCBcJUFydGljbGVDb250ZW50OwogICAgfQoKICAgIHJldHVybiBAQXJ0aWNsZUNvbnRlbnRzOwp9OwoKIyBHZXQgYXJ0aWNsZSBjb250ZW50cyAobm8gYXR0YWNobWVudHMpLgpteSBAQXJ0aWNsZXMgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQ0LAopOwpteSBAQXJ0aWNsZVdpdGhvdXRBdHRhY2htZW50cyA9ICRBcnRpY2xlQ29udGVudEdldC0+KAogICAgQXJ0aWNsZXMgPT4gXEBBcnRpY2xlcywKICAgIFRpY2tldElEID0+ICRUaWNrZXRJRDQsCik7CgojIEFkZCBhdHRhY2htZW50cyB0byBhcnRpY2xlLgpmb3IgbXkgJEZpbGUgKHF3KHhscyB0eHQgZG9jIHBuZyBwZGYpKSB7CiAgICBteSAkTG9jYXRpb24gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0hvbWUnKQogICAgICAgIC4gIi9zY3JpcHRzL3Rlc3Qvc2FtcGxlL1N0ZEF0dGFjaG1lbnQvU3RkQXR0YWNobWVudC1UZXN0MS4kRmlsZSI7CgogICAgbXkgJENvbnRlbnRSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5GaWxlUmVhZCgKICAgICAgICBMb2NhdGlvbiA9PiAkTG9jYXRpb24sCiAgICAgICAgTW9kZSAgICAgPT4gJ2Jpbm1vZGUnLAogICAgICAgIFR5cGUgICAgID0+ICdMb2NhbCcsCiAgICApOwoKICAgIG15ICRBcnRpY2xlV3JpdGVBdHRhY2htZW50ID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAogICAgICAgIENvbnRlbnQgICAgID0+ICR7JENvbnRlbnRSZWZ9LAogICAgICAgIEZpbGVuYW1lICAgID0+ICJTdGRBdHRhY2htZW50LVRlc3QxLiRGaWxlIiwKICAgICAgICBDb250ZW50VHlwZSA9PiAkRmlsZSwKICAgICAgICBBcnRpY2xlSUQgICA9PiAkQXJ0aWNsZUlENDIsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7Cn0KCiMgR2V0IGFydGljbGUgY29udGVudHMgKGF0dGFjaG1lbnRzKS4KbXkgQEFydGljbGVCb3ggPSAkQXJ0aWNsZUNvbnRlbnRHZXQtPigKICAgIEFydGljbGVzID0+IFxAQXJ0aWNsZXMsCiAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQ0LAopOwoKIyBIZWxwZXIgbWV0aG9kIHRvIHJldHJpZXZlIGFydGljbGUgYXR0YWNobWVudCBjb250ZW50IGZvciBzdXBwbGllZCBsaXN0IG9mIGFydGljbGVzLgojCiMgICAgJEFydGljbGVBdHRhY2htZW50Q29udGVudEdldC0+KAojICAgICAgICBBcnRpY2xlcyAgPT4gXEBBcnRpY2xlcywgICAgIyAocmVxdWlyZWQpCiMgICAgICAgIE5vQ29udGVudCA9PiAxLCAgICAgICAgICAgICAjIChvcHRpb25hbCkgT21pdCBhY3R1YWwgYXR0YWNobWVudCBjb250ZW50LCByZXR1cm4gb25seSBtZXRhIGRhdGEKIyAgICAgICAgSFRNTEJvZHkgID0+IDEsICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBJbmNsdWRlIEhUTUwgYm9keSBhdHRhY2htZW50IGNvbnRlbnQKIyAgICApOwojCm15ICRBcnRpY2xlQXR0YWNobWVudENvbnRlbnRHZXQgPSBzdWIgewogICAgbXkgKCVQYXJhbSkgPSBAXzsKCiAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtBcnRpY2xlc30gKSApIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgQEFydGljbGVzID0gQHsgJFBhcmFte0FydGljbGVzfSB9OwoKICAgIEFSVElDTEU6CiAgICBmb3IgbXkgJEFydGljbGUgKEBBcnRpY2xlcykgewoKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRBcnRpY2xlfSApIHsKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkQXJ0aWNsZS0+eyRLZXl9ICkgewogICAgICAgICAgICAgICAgJEFydGljbGUtPnskS2V5fSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIEdldCBhdHRhY2htZW50IGluZGV4LgogICAgICAgIG15ICVBdG1JbmRleCA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUF0dGFjaG1lbnRJbmRleCgKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICA9PiAkQXJ0aWNsZS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIEV4Y2x1ZGVQbGFpblRleHQgPT4gMSwKICAgICAgICAgICAgRXhjbHVkZUhUTUxCb2R5ICA9PiAkUGFyYW17SFRNTEJvZHl9ID8gMCA6IDEsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBBUlRJQ0xFIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggXCVBdG1JbmRleCApOwoKICAgICAgICBteSBAQXR0YWNobWVudHM7CiAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICBmb3IgbXkgJEZpbGVJRCAoIHNvcnQga2V5cyAlQXRtSW5kZXggKSB7CiAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAhJEZpbGVJRDsKICAgICAgICAgICAgbXkgJUF0dGFjaG1lbnQgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVBdHRhY2htZW50KAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgIEZpbGVJRCAgICA9PiAkRmlsZUlELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggXCVBdHRhY2htZW50ICk7CgogICAgICAgICAgICAkQXR0YWNobWVudHtGaWxlSUR9ID0gJEZpbGVJRDsKCiAgICAgICAgICAgICMgY29udmVydCBjb250ZW50IHRvIGJhc2U2NAogICAgICAgICAgICAkQXR0YWNobWVudHtDb250ZW50fSAgICAgICAgICAgID0gJFBhcmFte05vQ29udGVudH0gPyAnJyA6IGVuY29kZV9iYXNlNjQoICRBdHRhY2htZW50e0NvbnRlbnR9ICk7CiAgICAgICAgICAgICRBdHRhY2htZW50e0NvbnRlbnRJRH0gICAgICAgICAgPSAnJzsKICAgICAgICAgICAgJEF0dGFjaG1lbnR7Q29udGVudEFsdGVybmF0aXZlfSA9ICcnOwogICAgICAgICAgICBwdXNoIEBBdHRhY2htZW50cywgeyVBdHRhY2htZW50fTsKICAgICAgICB9CgogICAgICAgICMgc2V0IEF0dGFjaG1lbnRzIGRhdGEKICAgICAgICAkQXJ0aWNsZS0+e0F0dGFjaG1lbnR9ID0gXEBBdHRhY2htZW50czsKICAgIH0KfTsKCiMgSW5zZXJ0IGF0dGFjaG1lbnQgY29udGVudC4KJEFydGljbGVBdHRhY2htZW50Q29udGVudEdldC0+KAogICAgQXJ0aWNsZXMgPT4gXEBBcnRpY2xlQm94LAopOwoKIyBnZXQgdGhlIFRpY2tldCBlbnRyeQpteSAlVGlja2V0RW50cnlGb3VyID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQ0LAogICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAopOwoKJFNlbGYtPlRydWUoCiAgICBJc0hhc2hSZWZXaXRoRGF0YSggXCVUaWNrZXRFbnRyeUZvdXIgKSwKICAgICJUaWNrZXRHZXQoKSBzdWNjZXNzZnVsIGZvciBMb2NhbCBUaWNrZXRHZXQgRm91ciBJRCAkVGlja2V0SUQ0IgopOwoKZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJVRpY2tldEVudHJ5Rm91ciApIHsKICAgIGlmICggISRUaWNrZXRFbnRyeUZvdXJ7JEtleX0gKSB7CiAgICAgICAgJFRpY2tldEVudHJ5Rm91cnskS2V5fSA9ICcnOwogICAgfQogICAgaWYgKCAkS2V5IGVxICdBZ2UnICkgewogICAgICAgIGRlbGV0ZSAkVGlja2V0RW50cnlGb3VyeyRLZXl9OwogICAgfQp9CgojIGFkZCB0aWNrZXQgaWQKcHVzaCBAVGlja2V0SURzLCAkVGlja2V0SUQ0OwoKIyBzZXQgd2ViIHNlcnZpY2UgbmFtZQpteSAkV2Vic2VydmljZU5hbWUgPSAnLVRlc3QtJyAuICRSYW5kb21JRDsKCiMgY3JlYXRlIHdlYiBzZXJ2aWNlIG9iamVjdApteSAkV2Vic2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmljSW50ZXJmYWNlOjpXZWJzZXJ2aWNlJyk7CiRTZWxmLT5JcygKICAgICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJpY0ludGVyZmFjZTo6V2Vic2VydmljZScsCiAgICByZWYgJFdlYnNlcnZpY2VPYmplY3QsCiAgICAiQ3JlYXRlIHdlYiBzZXJ2aWNlIG9iamVjdCIKKTsKCm15ICRXZWJzZXJ2aWNlSUQgPSAkV2Vic2VydmljZU9iamVjdC0+V2Vic2VydmljZUFkZCgKICAgIE5hbWUgICA9PiAkV2Vic2VydmljZU5hbWUsCiAgICBDb25maWcgPT4gewogICAgICAgIERlYnVnZ2VyID0+IHsKICAgICAgICAgICAgRGVidWdUaHJlc2hvbGQgPT4gJ2RlYnVnJywKICAgICAgICB9LAogICAgICAgIFByb3ZpZGVyID0+IHsKICAgICAgICAgICAgVHJhbnNwb3J0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CiRTZWxmLT5UcnVlKAogICAgJFdlYnNlcnZpY2VJRCwKICAgICdBZGRlZCB3ZWIgc2VydmljZScKKTsKCiMgZ2V0IHJlbW90ZSBob3N0IHdpdGggc29tZSBwcmVjYXV0aW9ucyBmb3IgY2VydGFpbiB1bml0IHRlc3Qgc3lzdGVtcwpteSAkSG9zdCA9ICRIZWxwZXItPkdldFRlc3RIVFRQSG9zdG5hbWUoKTsKCiMgcHJlcGFyZSB3ZWIgc2VydmljZSBjb25maWcKbXkgJFJlbW90ZVN5c3RlbSA9CiAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0h0dHBUeXBlJykKICAgIC4gJzovLycKICAgIC4gJEhvc3QKICAgIC4gJy8nCiAgICAuICRDb25maWdPYmplY3QtPkdldCgnU2NyaXB0QWxpYXMnKQogICAgLiAnL25waC1nZW5lcmljaW50ZXJmYWNlLnBsL1dlYnNlcnZpY2VJRC8nCiAgICAuICRXZWJzZXJ2aWNlSUQ7CgpteSAkV2Vic2VydmljZUNvbmZpZyA9IHsKCiAgICAjICAgIE5hbWUgPT4gJycsCiAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICdUZXN0IGZvciBUaWNrZXQgQ29ubmVjdG9yIHVzaW5nIFNPQVAgdHJhbnNwb3J0IGJhY2tlbmQuJywKICAgIERlYnVnZ2VyID0+IHsKICAgICAgICBEZWJ1Z1RocmVzaG9sZCA9PiAnZGVidWcnLAogICAgICAgIFRlc3RNb2RlICAgICAgID0+IDEsCiAgICB9LAogICAgUHJvdmlkZXIgPT4gewogICAgICAgIFRyYW5zcG9ydCA9PiB7CiAgICAgICAgICAgIFR5cGUgICA9PiAnSFRUUDo6U09BUCcsCiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gMTAwMDAwMDAsCiAgICAgICAgICAgICAgICBOYW1lU3BhY2UgPT4gJ2h0dHA6Ly9vdHJzLm9yZy9Tb2FwVGVzdEludGVyZmFjZS8nLAogICAgICAgICAgICAgICAgRW5kcG9pbnQgID0+ICRSZW1vdGVTeXN0ZW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gewogICAgICAgICAgICBUaWNrZXRTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnVGlja2V0OjpUaWNrZXRTZWFyY2gnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTZXNzaW9uQ3JlYXRlID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1Nlc3Npb246OlNlc3Npb25DcmVhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgUmVxdWVzdGVyID0+IHsKICAgICAgICBUcmFuc3BvcnQgPT4gewogICAgICAgICAgICBUeXBlICAgPT4gJ0hUVFA6OlNPQVAnLAogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgTmFtZVNwYWNlID0+ICdodHRwOi8vb3Rycy5vcmcvU29hcFRlc3RJbnRlcmZhY2UvJywKICAgICAgICAgICAgICAgIEVuY29kaW5nICA9PiAnVVRGLTgnLAogICAgICAgICAgICAgICAgRW5kcG9pbnQgID0+ICRSZW1vdGVTeXN0ZW0sCiAgICAgICAgICAgICAgICBUaW1lb3V0ICAgPT4gMTIwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgSW52b2tlciA9PiB7CiAgICAgICAgICAgIFRpY2tldFNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXN0OjpUZXN0U2ltcGxlJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2Vzc2lvbkNyZWF0ZSA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXN0OjpUZXN0U2ltcGxlJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKfTsKCiMgdXBkYXRlIHdlYiBzZXJ2aWNlIHdpdGggcmVhbCBjb25maWcKbXkgJFdlYnNlcnZpY2VVcGRhdGUgPSAkV2Vic2VydmljZU9iamVjdC0+V2Vic2VydmljZVVwZGF0ZSgKICAgIElEICAgICAgPT4gJFdlYnNlcnZpY2VJRCwKICAgIE5hbWUgICAgPT4gJFdlYnNlcnZpY2VOYW1lLAogICAgQ29uZmlnICA9PiAkV2Vic2VydmljZUNvbmZpZywKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gJFVzZXJJRCwKKTsKJFNlbGYtPlRydWUoCiAgICAkV2Vic2VydmljZVVwZGF0ZSwKICAgICJVcGRhdGVkIHdlYiBzZXJ2aWNlICRXZWJzZXJ2aWNlSUQgLSAkV2Vic2VydmljZU5hbWUiCik7CgojIEdldCBTZXNzaW9uSUQKIyBjcmVhdGUgcmVxdWVzdGVyIG9iamVjdApteSAkUmVxdWVzdGVyU2Vzc2lvbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJyk7CiRTZWxmLT5JcygKICAgICdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicsCiAgICByZWYgJFJlcXVlc3RlclNlc3Npb25PYmplY3QsCiAgICAnU2Vzc2lvbklEIC0gQ3JlYXRlIHJlcXVlc3RlciBvYmplY3QnCik7CgojIGNyZWF0ZSBhIG5ldyB1c2VyIGZvciBjdXJyZW50IHRlc3QKbXkgJFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ3VzZXJzJyBdLAopOwpteSAkUGFzc3dvcmQgPSAkVXNlckxvZ2luOwoKIyBzdGFydCByZXF1ZXN0ZXIgd2l0aCBvdXIgd2ViIHNlcnZpY2UKbXkgJFJlcXVlc3RlclNlc3Npb25SZXN1bHQgPSAkUmVxdWVzdGVyU2Vzc2lvbk9iamVjdC0+UnVuKAogICAgV2Vic2VydmljZUlEID0+ICRXZWJzZXJ2aWNlSUQsCiAgICBJbnZva2VyICAgICAgPT4gJ1Nlc3Npb25DcmVhdGUnLAogICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICBVc2VyTG9naW4gPT4gJFVzZXJMb2dpbiwKICAgICAgICBQYXNzd29yZCAgPT4gJFBhc3N3b3JkLAogICAgfSwKKTsKCm15ICROZXdTZXNzaW9uSUQgPSAkUmVxdWVzdGVyU2Vzc2lvblJlc3VsdC0+e0RhdGF9LT57U2Vzc2lvbklEfTsKCm15ICRUZXN0Q291bnRlciA9IDE7CgpteSBAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gIlRlc3QgIiAuICRUZXN0Q291bnRlcisrLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRpY2tldE51bWJlcjEsCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVybkxvY2FsRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gWyRUaWNrZXRJRDFdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuUmVtb3RlRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElEMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldFNlYXJjaCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICJUZXN0ICIgLiAkVGVzdENvdW50ZXIrKywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+IFsKICAgICAgICAgICAgICAgICRUaWNrZXROdW1iZXIxLAogICAgICAgICAgICAgICAgJFRpY2tldE51bWJlcjIsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFNvcnRCeSAgPT4gJ1RpY2tldCcsICAgICMgZm9yY2Ugb3JkZXIsIGJlY2F1c2UgdGhlIEFnZSAoZGVmYXVsdCkgY2FuIGJlIHRoZSBzYW1lCiAgICAgICAgICAgIE9yZGVyQnkgPT4gJ0Rvd24nLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5Mb2NhbERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFsgJFRpY2tldElEMiwgJFRpY2tldElEMSBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuUmVtb3RlRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gWyAkVGlja2V0SUQyLCAkVGlja2V0SUQxIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0U2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gIlRlc3QgIiAuICRUZXN0Q291bnRlcisrLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaXRsZSA9PiAnVGlja2V0IFR3byBUaXRsZSAnIC4gJFJhbmRvbUlELAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5Mb2NhbERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFskVGlja2V0SUQyXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVyblJlbW90ZURhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRDIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0U2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gIlRlc3QgIiAuICRUZXN0Q291bnRlcisrLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaXRsZSA9PiBbCiAgICAgICAgICAgICAgICAnVGlja2V0IE9uZSBUaXRsZSAnIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgJ1RpY2tldCBUd28gVGl0bGUgJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU29ydEJ5ICA9PiAnVGlja2V0JywgICAgIyBmb3JjZSBvcmRlciwgYmVjYXVzZSB0aGUgQWdlIChkZWZhdWx0KSBjYW4gYmUgdGhlIHNhbWUKICAgICAgICAgICAgT3JkZXJCeSA9PiAnRG93bicsCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVybkxvY2FsRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gWyAkVGlja2V0SUQyLCAkVGlja2V0SUQxIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5SZW1vdGVEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiBbICRUaWNrZXRJRDIsICRUaWNrZXRJRDEgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRTZWFyY2gnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAiVGVzdCAiIC4gJFRlc3RDb3VudGVyKyssCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpdGxlICA9PiAnVGlja2V0IFR3byBUaXRsZSAnIC4gJFJhbmRvbUlELAogICAgICAgICAgICBRdWV1ZXMgPT4gJ1JhdycKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuTG9jYWxEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiBbJFRpY2tldElEMl0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5SZW1vdGVEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldFNlYXJjaCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICJUZXN0ICIgLiAkVGVzdENvdW50ZXIrKywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGl0bGUgID0+ICdUaWNrZXQgVHdvIFRpdGxlICcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIFF1ZXVlcyA9PiAnUmF3JywKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuTG9jYWxEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiBbJFRpY2tldElEMl0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5SZW1vdGVEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldFNlYXJjaCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICJUZXN0ICIgLiAkVGVzdENvdW50ZXIrKywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGl0bGUgPT4gJ1RpY2tldCBUd28gVGl0bGUgJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgTG9ja3MgPT4gJ3VubG9jaycsCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVybkxvY2FsRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gWyRUaWNrZXRJRDJdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuUmVtb3RlRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElEMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRTZWFyY2gnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAiVGVzdCAiIC4gJFRlc3RDb3VudGVyKyssCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpdGxlICA9PiAnVGlja2V0IFR3byBUaXRsZSAnIC4gJFJhbmRvbUlELAogICAgICAgICAgICBTdGF0ZXMgPT4gJ25ldycsCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVybkxvY2FsRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gWyRUaWNrZXRJRDJdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuUmVtb3RlRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElEMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRTZWFyY2gnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAiVGVzdCAiIC4gJFRlc3RDb3VudGVyKyssCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpdGxlICAgICAgPT4gJ1RpY2tldCBUd28gVGl0bGUgJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgUHJpb3JpdGllcyA9PiAnMyBub3JtYWwnLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5Mb2NhbERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFskVGlja2V0SUQyXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVyblJlbW90ZURhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRDIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0U2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gIlRlc3QgIiAuICRUZXN0Q291bnRlcisrLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBDdXN0b21lcklEID0+ICcxMjM0NjUnIC4gJFJhbmRvbUlELAogICAgICAgICAgICBTb3J0QnkgICAgID0+ICdUaWNrZXQnLCAgICAgICAgICAgICAgICMgZm9yY2Ugb3JkZXIsIGJlY2F1c2UgdGhlIEFnZSAoZGVmYXVsdCkgY2FuIGJlIHRoZSBzYW1lCiAgICAgICAgICAgIE9yZGVyQnkgICAgPT4gJ0Rvd24nLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5Mb2NhbERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFsgJFRpY2tldElEMywgJFRpY2tldElEMiwgJFRpY2tldElEMSBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuUmVtb3RlRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gWyAkVGlja2V0SUQzLCAkVGlja2V0SUQyLCAkVGlja2V0SUQxIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0U2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gIlRlc3QgIiAuICRUZXN0Q291bnRlcisrLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBRdWV1ZXMgICAgID0+IFsnSnVuayddLAogICAgICAgICAgICBDdXN0b21lcklEID0+ICc2NTQzMjEnIC4gJFJhbmRvbUlELAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5Mb2NhbERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFskVGlja2V0SUQ0XSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVyblJlbW90ZURhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRDQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0U2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gIlRlc3QgIiAuICRUZXN0Q291bnRlcisrLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUeXBlcyA9PiBbICdUZXN0VHlwZScgLiAkUmFuZG9tSUQgXSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuTG9jYWxEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiBbJFRpY2tldElEM10sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5SZW1vdGVEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQzLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldFNlYXJjaCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICJUZXN0ICIgLiAkVGVzdENvdW50ZXIrKywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgU3RhdGVzID0+IFsnbmV3J10sCiAgICAgICAgICAgIFRpdGxlICA9PiAnVGlja2V0IFR3byBUaXRsZSAnIC4gJFJhbmRvbUlELAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5Mb2NhbERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFskVGlja2V0SUQyXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVyblJlbW90ZURhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRDIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0U2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gIlRlc3QgIiAuICRUZXN0Q291bnRlcisrLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBTdGF0ZXMgID0+IFsnbmV3J10sCiAgICAgICAgICAgIFRpdGxlICAgPT4gJyonIC4gJFJhbmRvbUlELAogICAgICAgICAgICBTb3J0QnkgID0+ICdUaWNrZXQnLCAgICAgICAgICAjIGZvcmNlIG9yZGVyLCBiZWNhdXNlIHRoZSBBZ2UgKGRlZmF1bHQpIGNhbiBiZSB0aGUgc2FtZQogICAgICAgICAgICBPcmRlckJ5ID0+ICdEb3duJywKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuTG9jYWxEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiBbICRUaWNrZXRJRDIsICRUaWNrZXRJRDEgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVyblJlbW90ZURhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFsgJFRpY2tldElEMiwgJFRpY2tldElEMSBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldFNlYXJjaCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICJUZXN0ICIgLiAkVGVzdENvdW50ZXIrKywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGl0bGUgICAgICA9PiAnKiDDpMO2w7zDn8OEw5bDnOKCrNC40YEnLAogICAgICAgICAgICBDdXN0b21lcklEID0+ICc2NTQzMjEnIC4gJFJhbmRvbUlELAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5Mb2NhbERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFskVGlja2V0SUQ0XSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVyblJlbW90ZURhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRDQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0U2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gIlRlc3QgIiAuICRUZXN0Q291bnRlcisrLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBQcmlvcml0aWVzID0+IFsnMSB2ZXJ5IGxvdyddLAogICAgICAgICAgICBDdXN0b21lcklEID0+ICcxMjM0NjUnIC4gJFJhbmRvbUlELAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5Mb2NhbERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFskVGlja2V0SUQzXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVyblJlbW90ZURhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRDMsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0U2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gIlRlc3QgKEhhc2gpIERGICIgLiAkVGVzdENvdW50ZXIrKywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAiREZUMSRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICBFcXVhbHMgPT4gJ3RpY2tldDJfZmllbGQxJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuTG9jYWxEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiBbJFRpY2tldElEMl0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5SZW1vdGVEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldFNlYXJjaCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICJUZXN0IChIYXNoKSBERiAiIC4gJFRlc3RDb3VudGVyKyssCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBOYW1lID0+ICJERlQxJFJhbmRvbUlEIiwKICAgICAgICAgICAgICAgIExpa2UgPT4gJypfZmllbGQxJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU29ydEJ5ID0+ICdUaWNrZXROdW1iZXInLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5Mb2NhbERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFsgJFRpY2tldElEMiwgJFRpY2tldElEMSBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuUmVtb3RlRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gWyAkVGlja2V0SUQyLCAkVGlja2V0SUQxIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0U2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gIlRlc3QgKEFycmF5KSBERiAiIC4gJFRlc3RDb3VudGVyKyssCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgID0+ICJERlQxJFJhbmRvbUlEIiwKICAgICAgICAgICAgICAgICAgICBFcXVhbHMgPT4gJ3RpY2tldDJfZmllbGQxJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVybkxvY2FsRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gWyRUaWNrZXRJRDJdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuUmVtb3RlRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElEMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRTZWFyY2gnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAiVGVzdCAoQXJyYXkpIERGICIgLiAkVGVzdENvdW50ZXIrKywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICJERlQxJFJhbmRvbUlEIiwKICAgICAgICAgICAgICAgICAgICBMaWtlID0+ICcqX2ZpZWxkMScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTb3J0QnkgPT4gJ1RpY2tldE51bWJlcicsCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVybkxvY2FsRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gWyAkVGlja2V0SUQyLCAkVGlja2V0SUQxIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5SZW1vdGVEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiBbICRUaWNrZXRJRDIsICRUaWNrZXRJRDEgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRTZWFyY2gnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAiVGVzdCAoT2xkIEFQSSkgREYgIiAuICRUZXN0Q291bnRlcisrLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICAiRHluYW1pY0ZpZWxkX0RGVDEkUmFuZG9tSUQiID0+IHsKICAgICAgICAgICAgICAgIEVxdWFscyA9PiAndGlja2V0Ml9maWVsZDEnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5Mb2NhbERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFskVGlja2V0SUQyXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVyblJlbW90ZURhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRDIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0U2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gIlRlc3QgKE9sZCBBUEkpIERGICIgLiAkVGVzdENvdW50ZXIrKywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgIkR5bmFtaWNGaWVsZF9ERlQxJFJhbmRvbUlEIiA9PiB7CiAgICAgICAgICAgICAgICBMaWtlID0+ICcqX2ZpZWxkMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvcnRCeSA9PiAnVGlja2V0TnVtYmVyJywKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuTG9jYWxEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiBbICRUaWNrZXRJRDIsICRUaWNrZXRJRDEgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVyblJlbW90ZURhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFsgJFRpY2tldElEMiwgJFRpY2tldElEMSBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldFNlYXJjaCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICJUZXN0IERGIERhdGUgIiAuICRUZXN0Q291bnRlcisrLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICAiRHluYW1pY0ZpZWxkX0RGVDQkUmFuZG9tSUQiID0+IHsKICAgICAgICAgICAgICAgIEdyZWF0ZXJUaGFuRXF1YWxzID0+ICcyMDEwLTAxLTAxJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU29ydEJ5ID0+ICdUaWNrZXROdW1iZXInLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5Mb2NhbERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFskVGlja2V0SUQyXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVyblJlbW90ZURhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRDIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0U2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gIlRlc3QgTGFzdENoYW5nZVRpbWVOZXdlckRhdGUgKyAgQ3JlYXRlVGltZU5ld2VyRGF0ZSAiIC4gJFRlc3RDb3VudGVyKyssCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldExhc3RDaGFuZ2VUaW1lTmV3ZXJEYXRlID0+ICRTdGFydFRpbWUtPlRvU3RyaW5nKCksCiAgICAgICAgICAgIFRpY2tldENyZWF0ZVRpbWVOZXdlckRhdGUgICAgID0+ICRTdGFydFRpbWUtPlRvU3RyaW5nKCksCiAgICAgICAgICAgIFNvcnRCeSAgPT4gJ1RpY2tldCcsICAgICMgZm9yY2Ugb3JkZXIsIGJlY2F1c2UgdGhlIEFnZSAoZGVmYXVsdCkgY2FuIGJlIHRoZSBzYW1lCiAgICAgICAgICAgIE9yZGVyQnkgPT4gJ0Rvd24nLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5Mb2NhbERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFsgJFRpY2tldElENCwgJFRpY2tldElEMywgJFRpY2tldElEMiwgJFRpY2tldElEMSBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuUmVtb3RlRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gWyAkVGlja2V0SUQ0LCAkVGlja2V0SUQzLCAkVGlja2V0SUQyLCAkVGlja2V0SUQxIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0U2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gIlRlc3QgQ3JlYXRlVGltZU5ld2VyRGF0ZSAiIC4gJFRlc3RDb3VudGVyKyssCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldENyZWF0ZVRpbWVOZXdlckRhdGUgPT4gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBFcG9jaCA9PiAkU3RhcnRUaW1lLT5Ub0Vwb2NoKCkgKyAxMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICktPlRvU3RyaW5nKCksCiAgICAgICAgICAgIFNvcnRCeSAgPT4gJ1RpY2tldCcsICAgICMgZm9yY2Ugb3JkZXIsIGJlY2F1c2UgdGhlIEFnZSAoZGVmYXVsdCkgY2FuIGJlIHRoZSBzYW1lCiAgICAgICAgICAgIE9yZGVyQnkgPT4gJ0Rvd24nLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5Mb2NhbERhdGEgPT4gewogICAgICAgICAgICBEYXRhICAgID0+IHt9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuUmVtb3RlRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgICAgPT4ge30sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0U2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gIlRlc3QgTGltaXQgIiAuICRUZXN0Q291bnRlcisrLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXRMYXN0Q2hhbmdlVGltZU5ld2VyRGF0ZSA9PiAkU3RhcnRUaW1lLT5Ub1N0cmluZygpLAogICAgICAgICAgICBUaWNrZXRDcmVhdGVUaW1lTmV3ZXJEYXRlICAgICA9PiAkU3RhcnRUaW1lLT5Ub1N0cmluZygpLAogICAgICAgICAgICBTb3J0QnkgID0+ICdUaWNrZXQnLCAgICAjIGZvcmNlIG9yZGVyLCBiZWNhdXNlIHRoZSBBZ2UgKGRlZmF1bHQpIGNhbiBiZSB0aGUgc2FtZQogICAgICAgICAgICBPcmRlckJ5ID0+ICdEb3duJywKICAgICAgICAgICAgTGltaXQgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5Mb2NhbERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFskVGlja2V0SUQ0XSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVyblJlbW90ZURhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRDQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0U2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gIlRlc3QgRXNjYWxhdGlvblRpbWUgIiAuICRUZXN0Q291bnRlcisrLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXRFc2NhbGF0aW9uVGltZU5ld2VyTWludXRlcyA9PiAxMjAsCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVybkxvY2FsRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gWyRUaWNrZXRJRDFdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuUmVtb3RlRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElEMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRTZWFyY2gnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAiVGVzdCBFc2NhbGF0aW9uUmVzcG9uc2VUaW1lICIgLiAkVGVzdENvdW50ZXIrKywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0RXNjYWxhdGlvblJlc3BvbnNlVGltZU5ld2VyTWludXRlcyA9PiAxMjAsCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVybkxvY2FsRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gWyRUaWNrZXRJRDFdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuUmVtb3RlRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElEMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRTZWFyY2gnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAiVGVzdCBFc2NhbGF0aW9uVXBkYXRlVGltZSAiIC4gJFRlc3RDb3VudGVyKyssCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldEVzY2FsYXRpb25VcGRhdGVUaW1lTmV3ZXJNaW51dGVzID0+IDEyMCwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuTG9jYWxEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiBbJFRpY2tldElEMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5SZW1vdGVEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldFNlYXJjaCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICJUZXN0IEVzY2FsYXRpb25Tb2x1dGlvblRpbWUgIiAuICRUZXN0Q291bnRlcisrLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXRFc2NhbGF0aW9uU29sdXRpb25UaW1lTmV3ZXJNaW51dGVzID0+IDEyMCwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuTG9jYWxEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiBbJFRpY2tldElEMV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5SZW1vdGVEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldFNlYXJjaCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICJUZXN0IENvbnRlbnRTZWFyY2ggUGFyYW1ldGVyIiAuICRUZXN0Q291bnRlcisrLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBNSU1FQmFzZV9Cb2R5ICAgID0+ICd0ZXh0IGJvZHkgbG9uZycsCiAgICAgICAgICAgIE1JTUVCYXNlX1N1YmplY3QgPT4gJ3RleHQgYm9keSBsb25nJywKICAgICAgICAgICAgQ29udGVudFNlYXJjaCAgICA9PiAnT1InLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5Mb2NhbERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFskVGlja2V0SUQ0XSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5SZW1vdGVEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQ0LAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldFNlYXJjaCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICJUZXN0IE9wZXJhdG9yICdFbXB0eScgREZUMSAtIERGICIgLiAkVGVzdENvdW50ZXIrKywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0SUQgICAgID0+IFsgJFRpY2tldElEMSwgJFRpY2tldElEMiwgJFRpY2tldElEMywgJFRpY2tldElENCBdLAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gIkRGVDEkUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgRW1wdHkgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgT3JkZXJCeSA9PiAnVXAnLAogICAgICAgICAgICBTb3J0QnkgID0+ICdUaWNrZXROdW1iZXInLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5Mb2NhbERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFsgJFRpY2tldElEMywgJFRpY2tldElENCBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuUmVtb3RlRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gWyAkVGlja2V0SUQzLCAkVGlja2V0SUQ0IF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0U2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gIlRlc3QgT3BlcmF0b3IgJ0VtcHR5JyBERlQyIC0gREYgIiAuICRUZXN0Q291bnRlcisrLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXRJRCAgICAgPT4gWyAkVGlja2V0SUQxLCAkVGlja2V0SUQyLCAkVGlja2V0SUQzLCAkVGlja2V0SUQ0IF0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAiREZUMiRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICBFbXB0eSA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBPcmRlckJ5ID0+ICdVcCcsCiAgICAgICAgICAgIFNvcnRCeSAgPT4gJ1RpY2tldE51bWJlcicsCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVybkxvY2FsRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gWyAkVGlja2V0SUQzLCAkVGlja2V0SUQ0IF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5SZW1vdGVEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiBbICRUaWNrZXRJRDMsICRUaWNrZXRJRDQgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRTZWFyY2gnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAiVGVzdCBPcGVyYXRvciAnRW1wdHknIERGVDMgLSBERiAiIC4gJFRlc3RDb3VudGVyKyssCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldElEICAgICA9PiBbICRUaWNrZXRJRDEsICRUaWNrZXRJRDIsICRUaWNrZXRJRDMsICRUaWNrZXRJRDQgXSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICJERlQzJFJhbmRvbUlEIiwKICAgICAgICAgICAgICAgIEVtcHR5ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE9yZGVyQnkgPT4gJ1VwJywKICAgICAgICAgICAgU29ydEJ5ICA9PiAnVGlja2V0TnVtYmVyJywKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuTG9jYWxEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiBbICRUaWNrZXRJRDMsICRUaWNrZXRJRDQgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVyblJlbW90ZURhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFsgJFRpY2tldElEMywgJFRpY2tldElENCBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldFNlYXJjaCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICJUZXN0IE9wZXJhdG9yICdFbXB0eScgREZUNCAtIERGICIgLiAkVGVzdENvdW50ZXIrKywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0SUQgICAgID0+IFsgJFRpY2tldElEMSwgJFRpY2tldElEMiwgJFRpY2tldElEMywgJFRpY2tldElENCBdLAogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gIkRGVDQkUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgRW1wdHkgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgT3JkZXJCeSA9PiAnVXAnLAogICAgICAgICAgICBTb3J0QnkgID0+ICdUaWNrZXROdW1iZXInLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5Mb2NhbERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFsgJFRpY2tldElEMywgJFRpY2tldElENCBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuUmVtb3RlRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gWyAkVGlja2V0SUQzLCAkVGlja2V0SUQ0IF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0U2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gIlRlc3QgT3BlcmF0b3IgJ0VtcHR5JyBERlQgQUxMIC0gREYgIiAuICRUZXN0Q291bnRlcisrLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXRJRCAgICAgPT4gWyAkVGlja2V0SUQxLCAkVGlja2V0SUQyLCAkVGlja2V0SUQzLCAkVGlja2V0SUQ0IF0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gIkRGVDEkUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgICAgIEVtcHR5ID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgID0+ICJERlQyJFJhbmRvbUlEIiwKICAgICAgICAgICAgICAgICAgICBFbXB0eSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICA9PiAiREZUMyRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICAgICAgRW1wdHkgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gIkRGVDQkUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgICAgIEVtcHR5ID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBPcmRlckJ5ID0+ICdVcCcsCiAgICAgICAgICAgIFNvcnRCeSAgPT4gJ1RpY2tldE51bWJlcicsCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVybkxvY2FsRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gWyAkVGlja2V0SUQzLCAkVGlja2V0SUQ0IF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5SZW1vdGVEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiBbICRUaWNrZXRJRDMsICRUaWNrZXRJRDQgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRTZWFyY2gnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAiVGVzdCAoT2xkIEFQSSkgT3BlcmF0b3IgJ0VtcHR5JyBERlQxIC0gREYgIiAuICRUZXN0Q291bnRlcisrLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgICAgID0+IFsgJFRpY2tldElEMSwgJFRpY2tldElEMiwgJFRpY2tldElEMywgJFRpY2tldElENCBdLAogICAgICAgICAgICAiRHluYW1pY0ZpZWxkX0RGVDEkUmFuZG9tSUQiID0+IHsKICAgICAgICAgICAgICAgIEVtcHR5ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE9yZGVyQnkgPT4gJ1VwJywKICAgICAgICAgICAgU29ydEJ5ICA9PiAnVGlja2V0TnVtYmVyJywKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuTG9jYWxEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiBbICRUaWNrZXRJRDMsICRUaWNrZXRJRDQgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVyblJlbW90ZURhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFsgJFRpY2tldElEMywgJFRpY2tldElENCBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldFNlYXJjaCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICJUZXN0IChPbGQgQVBJKSBPcGVyYXRvciAnRW1wdHknIERGVDIgLSBERiAiIC4gJFRlc3RDb3VudGVyKyssCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgICAgPT4gWyAkVGlja2V0SUQxLCAkVGlja2V0SUQyLCAkVGlja2V0SUQzLCAkVGlja2V0SUQ0IF0sCiAgICAgICAgICAgICJEeW5hbWljRmllbGRfREZUMiRSYW5kb21JRCIgPT4gewogICAgICAgICAgICAgICAgRW1wdHkgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgT3JkZXJCeSA9PiAnVXAnLAogICAgICAgICAgICBTb3J0QnkgID0+ICdUaWNrZXROdW1iZXInLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5Mb2NhbERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFsgJFRpY2tldElEMywgJFRpY2tldElENCBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuUmVtb3RlRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gWyAkVGlja2V0SUQzLCAkVGlja2V0SUQ0IF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0U2VhcmNoJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gIlRlc3QgKE9sZCBBUEkpIE9wZXJhdG9yICdFbXB0eScgREZUMyAtIERGICIgLiAkVGVzdENvdW50ZXIrKywKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICAgICA9PiBbICRUaWNrZXRJRDEsICRUaWNrZXRJRDIsICRUaWNrZXRJRDMsICRUaWNrZXRJRDQgXSwKICAgICAgICAgICAgIkR5bmFtaWNGaWVsZF9ERlQzJFJhbmRvbUlEIiA9PiB7CiAgICAgICAgICAgICAgICBFbXB0eSA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBPcmRlckJ5ID0+ICdVcCcsCiAgICAgICAgICAgIFNvcnRCeSAgPT4gJ1RpY2tldE51bWJlcicsCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVybkxvY2FsRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gWyAkVGlja2V0SUQzLCAkVGlja2V0SUQ0IF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5SZW1vdGVEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiBbICRUaWNrZXRJRDMsICRUaWNrZXRJRDQgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRTZWFyY2gnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAiVGVzdCAoT2xkIEFQSSkgT3BlcmF0b3IgJ0VtcHR5JyBERlQ0IC0gREYgIiAuICRUZXN0Q291bnRlcisrLAogICAgICAgIFN1Y2Nlc3NSZXF1ZXN0ID0+IDEsCiAgICAgICAgUmVxdWVzdERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgICAgID0+IFsgJFRpY2tldElEMSwgJFRpY2tldElEMiwgJFRpY2tldElEMywgJFRpY2tldElENCBdLAogICAgICAgICAgICAiRHluYW1pY0ZpZWxkX0RGVDQkUmFuZG9tSUQiID0+IHsKICAgICAgICAgICAgICAgIEVtcHR5ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE9yZGVyQnkgPT4gJ1VwJywKICAgICAgICAgICAgU29ydEJ5ICA9PiAnVGlja2V0TnVtYmVyJywKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuTG9jYWxEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiBbICRUaWNrZXRJRDMsICRUaWNrZXRJRDQgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVyblJlbW90ZURhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFsgJFRpY2tldElEMywgJFRpY2tldElENCBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldFNlYXJjaCcsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICJUZXN0IChPbGQgQVBJKSBPcGVyYXRvciAnRW1wdHknIERGVCBBTEwgLSBERiAiIC4gJFRlc3RDb3VudGVyKyssCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgICAgPT4gWyAkVGlja2V0SUQxLCAkVGlja2V0SUQyLCAkVGlja2V0SUQzLCAkVGlja2V0SUQ0IF0sCiAgICAgICAgICAgICJEeW5hbWljRmllbGRfREZUMSRSYW5kb21JRCIgPT4gewogICAgICAgICAgICAgICAgRW1wdHkgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIkR5bmFtaWNGaWVsZF9ERlQyJFJhbmRvbUlEIiA9PiB7CiAgICAgICAgICAgICAgICBFbXB0eSA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICAiRHluYW1pY0ZpZWxkX0RGVDMkUmFuZG9tSUQiID0+IHsKICAgICAgICAgICAgICAgIEVtcHR5ID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJEeW5hbWljRmllbGRfREZUNCRSYW5kb21JRCIgPT4gewogICAgICAgICAgICAgICAgRW1wdHkgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgT3JkZXJCeSA9PiAnVXAnLAogICAgICAgICAgICBTb3J0QnkgID0+ICdUaWNrZXROdW1iZXInLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5Mb2NhbERhdGEgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+IFsgJFRpY2tldElEMywgJFRpY2tldElENCBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuUmVtb3RlRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gWyAkVGlja2V0SUQzLCAkVGlja2V0SUQ0IF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0U2VhcmNoJywKICAgIH0sCik7CgojIEFkZCBhIHdyb25nIHZhbHVlIHRlc3QgZm9yIGVhY2ggcG9zc2libGUgcGFyYW1ldGVyIG9uIGRpcmVjdCBzZWFyY2gKCmZvciBteSAkSXRlbSAoCiAgICBxdygKICAgIFRpY2tldE51bWJlciBUaXRsZSBNSU1FQmFzZV9Gcm9tIE1JTUVCYXNlX1RvIE1JTUVCYXNlX0NjIE1JTUVCYXNlX1N1YmplY3QKICAgIE1JTUVCYXNlX0JvZHkgQ3VzdG9tZXJJRCBDdXN0b21lclVzZXJMb2dpbiBTdGF0ZVR5cGUgRnVsbHRleHQKICAgICkKICAgICkKewogICAgbXkgJEZhaWxUZXN0ID0gewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICJUZXN0ICRJdGVtIiwKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgJEl0ZW0gPT4gJ05vdEFSZWFsJyAuICRJdGVtLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5Mb2NhbERhdGEgPT4gewogICAgICAgICAgICBEYXRhICAgID0+IHt9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuUmVtb3RlRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgICAgPT4ge30sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgT3BlcmF0aW9uID0+ICdUaWNrZXRTZWFyY2gnLAogICAgfTsKCiAgICAjIHB1c2ggdGVzdAogICAgcHVzaCBAVGVzdHMsICRGYWlsVGVzdDsKfQoKIyBBcnJheXMgYXMgc3RyaW5ncwpmb3IgbXkgJEl0ZW0gKAogICAgcXcoU3RhdGVJRHMgU3RhdGVUeXBlSURzIFF1ZXVlSURzIFByaW9yaXR5SURzIE93bmVySURzCiAgICBDcmVhdGVkUXVldWVJRHMgQ3JlYXRlZFVzZXJJRHMgV2F0Y2hVc2VySURzIFJlc3BvbnNpYmxlSURzCiAgICBUeXBlSURzIFNlcnZpY2VJRHMgU0xBSURzIExvY2tJRHMgUXVldWVzIFR5cGVzIFN0YXRlcwogICAgUHJpb3JpdGllcyBTZXJ2aWNlcyBTTEFzIExvY2tzIENyZWF0ZWRUeXBlcyBDcmVhdGVkVXNlcklEcwogICAgQ3JlYXRlZFR5cGVzIENyZWF0ZWRUeXBlSURzIENyZWF0ZWRQcmlvcml0aWVzCiAgICBDcmVhdGVkUHJpb3JpdHlJRHMgQ3JlYXRlZFN0YXRlcyBDcmVhdGVkU3RhdGVJRHMKICAgIENyZWF0ZWRRdWV1ZXMgQ3JlYXRlZFF1ZXVlSURzCiAgICApCiAgICApCnsKICAgIG15ICRGYWlsVGVzdCA9IHsKICAgICAgICBOYW1lICAgICAgICAgICA9PiAiVGVzdCAkSXRlbSIsCiAgICAgICAgU3VjY2Vzc1JlcXVlc3QgPT4gMSwKICAgICAgICBSZXF1ZXN0RGF0YSAgICA9PiB7CiAgICAgICAgICAgICRJdGVtID0+ICdOb3RBUmVhbCcgLiAkSXRlbSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmV0dXJuTG9jYWxEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSAgICA9PiB7fSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVyblJlbW90ZURhdGEgPT4gewogICAgICAgICAgICBEYXRhICAgID0+IHt9LAogICAgICAgICAgICBTdWNjZXNzID0+IDEKICAgICAgICB9LAogICAgICAgIE9wZXJhdGlvbiA9PiAnVGlja2V0U2VhcmNoJywKICAgIH07CgogICAgIyBwdXNoIHRlc3QKICAgIHB1c2ggQFRlc3RzLCAkRmFpbFRlc3Q7Cn0KCiMgQXJyYXlzCmZvciBteSAkSXRlbSAoCiAgICBxdyhTdGF0ZUlEcyBTdGF0ZVR5cGVJRHMgUXVldWVJRHMgUHJpb3JpdHlJRHMgT3duZXJJRHMKICAgIENyZWF0ZWRRdWV1ZUlEcyBDcmVhdGVkVXNlcklEcyBXYXRjaFVzZXJJRHMgUmVzcG9uc2libGVJRHMKICAgIFR5cGVJRHMgU2VydmljZUlEcyBTTEFJRHMgTG9ja0lEcyBRdWV1ZXMgVHlwZXMgU3RhdGVzCiAgICBQcmlvcml0aWVzIFNlcnZpY2VzIFNMQXMgTG9ja3MgQ3JlYXRlZFR5cGVzIENyZWF0ZWRVc2VySURzCiAgICBDcmVhdGVkVHlwZXMgQ3JlYXRlZFR5cGVJRHMgQ3JlYXRlZFByaW9yaXRpZXMKICAgIENyZWF0ZWRQcmlvcml0eUlEcyBDcmVhdGVkU3RhdGVzIENyZWF0ZWRTdGF0ZUlEcwogICAgQ3JlYXRlZFF1ZXVlcyBDcmVhdGVkUXVldWVJRHMKICAgICkKICAgICkKewogICAgbXkgJEZhaWxUZXN0ID0gewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICJUZXN0ICRJdGVtIiwKICAgICAgICBTdWNjZXNzUmVxdWVzdCA9PiAxLAogICAgICAgIFJlcXVlc3REYXRhICAgID0+IHsKICAgICAgICAgICAgJEl0ZW0gPT4gWwogICAgICAgICAgICAgICAgJ05vdEFSZWFsJyAuICRJdGVtIC4gJ09uZScsCiAgICAgICAgICAgICAgICAnTm90QVJlYWwnIC4gJEl0ZW0gLiAnVHdvJywKICAgICAgICAgICAgICAgICdOb3RBUmVhbCcgLiAkSXRlbSAuICdUaHJlZScsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJldHVybkxvY2FsRGF0YSA9PiB7CiAgICAgICAgICAgIERhdGEgICAgPT4ge30sCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMQogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXR1cm5SZW1vdGVEYXRhID0+IHsKICAgICAgICAgICAgRGF0YSAgICA9PiB7fSwKICAgICAgICAgICAgU3VjY2VzcyA9PiAxCiAgICAgICAgfSwKICAgICAgICBPcGVyYXRpb24gPT4gJ1RpY2tldFNlYXJjaCcsCiAgICB9OwoKICAgICMgcHVzaCB0ZXN0CiAgICBwdXNoIEBUZXN0cywgJEZhaWxUZXN0Owp9CgojIGRlYnVnZ2VyIG9iamVjdApteSAkRGVidWdnZXJPYmplY3QgPSBLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OkRlYnVnZ2VyLT5uZXcoCiAgICBEZWJ1Z2dlckNvbmZpZyA9PiB7CiAgICAgICAgRGVidWdUaHJlc2hvbGQgPT4gJ2RlYnVnJywKICAgICAgICBUZXN0TW9kZSAgICAgICA9PiAxLAogICAgfSwKICAgIFdlYnNlcnZpY2VJRCAgICAgID0+ICRXZWJzZXJ2aWNlSUQsCiAgICBDb21tdW5pY2F0aW9uVHlwZSA9PiAnUHJvdmlkZXInLAopOwokU2VsZi0+SXMoCiAgICByZWYgJERlYnVnZ2VyT2JqZWN0LAogICAgJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6RGVidWdnZXInLAogICAgJ0RlYnVnZ2VyT2JqZWN0IGluc3RhbnRpYXRlIGNvcnJlY3RseScKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgIyBjcmVhdGUgbG9jYWwgb2JqZWN0CiAgICBteSAkTG9jYWxPYmplY3QgPSAiS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OlRpY2tldDo6JFRlc3QtPntPcGVyYXRpb259Ii0+bmV3KAogICAgICAgIERlYnVnZ2VyT2JqZWN0ID0+ICREZWJ1Z2dlck9iamVjdCwKICAgICAgICBXZWJzZXJ2aWNlSUQgICA9PiAkV2Vic2VydmljZUlELAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgIktlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpUaWNrZXQ6OiRUZXN0LT57T3BlcmF0aW9ufSIsCiAgICAgICAgcmVmICRMb2NhbE9iamVjdCwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIENyZWF0ZSBsb2NhbCBvYmplY3QiLAogICAgKTsKCiAgICAjIHN0YXJ0IHJlcXVlc3RlciB3aXRoIG91ciB3ZWIgc2VydmljZQogICAgbXkgJExvY2FsUmVzdWx0ID0gJExvY2FsT2JqZWN0LT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRXZWJzZXJ2aWNlSUQsCiAgICAgICAgSW52b2tlciAgICAgID0+ICRUZXN0LT57T3BlcmF0aW9ufSwKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgID0+ICRQYXNzd29yZCwKICAgICAgICAgICAgVGlja2V0SUQgID0+IFsgJFRpY2tldElEMSwgJFRpY2tldElEMiwgJFRpY2tldElEMywgJFRpY2tldElENCBdLAogICAgICAgICAgICAleyAkVGVzdC0+e1JlcXVlc3REYXRhfSB9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgY2hlY2sgcmVzdWx0CiAgICAkU2VsZi0+SXMoCiAgICAgICAgJ0hBU0gnLAogICAgICAgIHJlZiAkTG9jYWxSZXN1bHQsCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBMb2NhbCByZXN1bHQgc3RydWN0dXJlIGlzIHZhbGlkIgogICAgKTsKCiAgICAjIGNyZWF0ZSByZXF1ZXN0ZXIgb2JqZWN0CiAgICBteSAkUmVxdWVzdGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInKTsKICAgICRTZWxmLT5JcygKICAgICAgICAnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInLAogICAgICAgIHJlZiAkUmVxdWVzdGVyT2JqZWN0LAogICAgICAgICIkVGVzdC0+e05hbWV9IC0gQ3JlYXRlIHJlcXVlc3RlciBvYmplY3QiCiAgICApOwoKICAgICMgc3RhcnQgcmVxdWVzdGVyIHdpdGggb3VyIHdlYiBzZXJ2aWNlCiAgICBteSAkUmVxdWVzdGVyUmVzdWx0ID0gJFJlcXVlc3Rlck9iamVjdC0+UnVuKAogICAgICAgIFdlYnNlcnZpY2VJRCA9PiAkV2Vic2VydmljZUlELAogICAgICAgIEludm9rZXIgICAgICA9PiAkVGVzdC0+e09wZXJhdGlvbn0sCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICROZXdTZXNzaW9uSUQsCiAgICAgICAgICAgIFRpY2tldElEICA9PiBbICRUaWNrZXRJRDEsICRUaWNrZXRJRDIsICRUaWNrZXRJRDMsICRUaWNrZXRJRDQgXSwKICAgICAgICAgICAgJXsgJFRlc3QtPntSZXF1ZXN0RGF0YX0gfSwKICAgICAgICAgICAgfQogICAgKTsKCiAgICAjIGNoZWNrIHJlc3VsdAogICAgJFNlbGYtPklzKAogICAgICAgICdIQVNIJywKICAgICAgICByZWYgJFJlcXVlc3RlclJlc3VsdCwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlcXVlc3RlciByZXN1bHQgc3RydWN0dXJlIGlzIHZhbGlkIiwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRSZXF1ZXN0ZXJSZXN1bHQtPntTdWNjZXNzfSwKICAgICAgICAkVGVzdC0+e1N1Y2Nlc3NSZXF1ZXN0fSwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlcXVlc3RlciBzdWNjZXNzZnVsIHJlc3VsdCIsCiAgICApOwoKICAgICMgcmVtb3ZlIEVycm9yTWVzc2FnZSBwYXJhbWV0ZXIgZnJvbSBkaXJlY3QgY2FsbAogICAgIyByZXN1bHQgdG8gYmUgY29uc2lzdGVudCB3aXRoIFNPQVAgY2FsbCByZXN1bHQKICAgIGlmICggJExvY2FsUmVzdWx0LT57RXJyb3JNZXNzYWdlfSApIHsKICAgICAgICBkZWxldGUgJExvY2FsUmVzdWx0LT57RXJyb3JNZXNzYWdlfTsKICAgIH0KCiAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgJFJlcXVlc3RlclJlc3VsdCwKICAgICAgICAkVGVzdC0+e0V4cGVjdGVkUmV0dXJuUmVtb3RlRGF0YX0sCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXF1ZXN0ZXIgc3VjY2VzcyBzdGF0dXMgKG5lZWRzIGNvbmZpZ3VyZWQgYW5kIHJ1bm5pbmcgd2Vic2VydmVyKSIKICAgICk7CgogICAgaWYgKCAkVGVzdC0+e0V4cGVjdGVkUmV0dXJuTG9jYWxEYXRhfSApIHsKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgICRMb2NhbFJlc3VsdCwKICAgICAgICAgICAgJFRlc3QtPntFeHBlY3RlZFJldHVybkxvY2FsRGF0YX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IG1hdGNoZWQgd2l0aCBleHBlY3RlZCBsb2NhbCBjYWxsIHJlc3VsdC4iCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgJExvY2FsUmVzdWx0LAogICAgICAgICAgICAkVGVzdC0+e0V4cGVjdGVkUmV0dXJuUmVtb3RlRGF0YX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTG9jYWwgcmVzdWx0IG1hdGNoZWQgd2l0aCByZW1vdGUgcmVzdWx0LiIKICAgICAgICApOwogICAgfQoKfSAgICAjZW5kIGxvb3AKCiMgY2xlYW51cAoKIyBjbGVhbnVwIHdlYiBzZXJ2aWNlCm15ICRXZWJzZXJ2aWNlRGVsZXRlID0gJFdlYnNlcnZpY2VPYmplY3QtPldlYnNlcnZpY2VEZWxldGUoCiAgICBJRCAgICAgPT4gJFdlYnNlcnZpY2VJRCwKICAgIFVzZXJJRCA9PiAkVXNlcklELAopOwokU2VsZi0+VHJ1ZSgKICAgICRXZWJzZXJ2aWNlRGVsZXRlLAogICAgIkRlbGV0ZWQgd2ViIHNlcnZpY2UgJFdlYnNlcnZpY2VJRCIKKTsKCiMgZGVsZXRlIHRoZSB0aWNrZXRzCmZvciBteSAkVGlja2V0SUQgKEBUaWNrZXRJRHMpIHsKICAgIG15ICRUaWNrZXREZWxldGUgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXREZWxldGUoCiAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgIFVzZXJJRCAgID0+ICRVc2VySUQsCiAgICApOwoKICAgICMgc2FuaXR5IGNoZWNrCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVGlja2V0RGVsZXRlLAogICAgICAgICJUaWNrZXREZWxldGUoKSBzdWNjZXNzZnVsIGZvciBUaWNrZXQgSUQgJFRpY2tldElEIgogICAgKTsKfQoKIyBkZWxldGUgZHluYW1pYyBmaWVsZHMKZm9yIG15ICRUZXN0RmllbGRDb25maWdJdGVtIChAVGVzdEZpZWxkQ29uZmlnKSB7CiAgICBteSAkVGVzdEZpZWxkQ29uZmlnSXRlbUlEID0gJFRlc3RGaWVsZENvbmZpZ0l0ZW0tPntJRH07CgogICAgbXkgJERGRGVsZXRlID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkRGVsZXRlKAogICAgICAgIElEICAgICAgPT4gJFRlc3RGaWVsZENvbmZpZ0l0ZW1JRCwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgUmVvcmRlciA9PiAwLAogICAgKTsKCiAgICAjIHNhbml0eSBjaGVjawogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJERGRGVsZXRlLAogICAgICAgICJEeW5hbWljRmllbGREZWxldGUoKSBzdWNjZXNzZnVsIGZvciBGaWVsZCBJRCAkVGVzdEZpZWxkQ29uZmlnSXRlbUlEIgogICAgKTsKfQoKIyBnZXQgREIgb2JqZWN0Cm15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKIyBkZWxldGUgdXNlcgpteSAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHVzZXJfcHJlZmVyZW5jZXMgV0hFUkUgdXNlcl9pZCA9ICRVc2VySUQiLAopOwokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIlVzZXIgcHJlZmVyZW5jZSByZWZlcmVuY2VkIHRvIFVzZXIgSUQgJFVzZXJJRCBpcyBkZWxldGVkISIKKTsKJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgU1FMID0+ICJERUxFVEUgRlJPTSB1c2VycyBXSEVSRSBpZCA9ICRVc2VySUQiLAopOwokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIlVzZXIgd2l0aCBJRCAkVXNlcklEIGlzIGRlbGV0ZWQhIgopOwoKIyBkZWxldGUgdHlwZQokU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHRpY2tldF90eXBlIFdIRVJFIGlkID0gJFR5cGVJRCIsCik7CiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiVHlwZSB3aXRoIElEICRUeXBlSUQgaXMgZGVsZXRlZCEiCik7CgojIGNsZWFudXAgY2FjaGUKJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSAwYTA0ZTcyMmZiY2JkMzljY2EzZmIwODljMjk0ZTcyYjMxNzBlNmIxIC0gc2NyaXB0cy90ZXN0L1Byb2Nlc3NNYW5hZ2VtZW50L1RyYW5zaXRpb25BY3Rpb24vVGlja2V0U0xBU2V0LnQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCiMgZ2V0IG5lZWRlZCBvYmplY3RzCm15ICRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKTsKbXkgJFNMQU9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyk7Cm15ICRUaWNrZXRPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwpteSAkTW9kdWxlT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6VHJhbnNpdGlvbkFjdGlvbjo6VGlja2V0U0xBU2V0Jyk7CgojIGdldCBoZWxwZXIgb2JqZWN0CiRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicgPT4gewogICAgICAgIFJlc3RvcmVEYXRhYmFzZSAgPT4gMSwKICAgICAgICBVc2VUbXBBcnRpY2xlRGlyID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiMgZGVmaW5lIHZhcmlhYmxlcwpteSAkVXNlcklEICAgICA9IDE7Cm15ICRNb2R1bGVOYW1lID0gJ1RpY2tldFNMQVNldCc7Cm15ICRSYW5kb21JRCAgID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiMgYWRkIGEgY3VzdG9tZXIgdXNlcgpteSAkVGVzdEN1c3RvbWVyVXNlckxvZ2luID0gJEhlbHBlci0+VGVzdEN1c3RvbWVyVXNlckNyZWF0ZSgpOwoKIyBzZXQgdXNlciBkZXRhaWxzCm15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoKTsKbXkgJFRlc3RVc2VySUQgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTG9va3VwKAogICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAopOwojIC0tLQojIElUU01Db3JlCiMgLS0tCgojIGdldCB0aGUgbGlzdCBvZiBzZXJ2aWNlIHR5cGVzIGZyb20gZ2VuZXJhbCBjYXRhbG9nCm15ICRTZXJ2aWNlVHlwZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICBDbGFzcyA9PiAnSVRTTTo6U2VydmljZTo6VHlwZScsCik7CgojIGJ1aWxkIGEgbG9va3VwIGhhc2gKbXkgJVNlcnZpY2VUeXBlTmFtZTJJRCA9IHJldmVyc2UgJXsgJFNlcnZpY2VUeXBlTGlzdCB9OwoKIyBnZXQgdGhlIGxpc3Qgb2Ygc2xhIHR5cGVzIGZyb20gZ2VuZXJhbCBjYXRhbG9nCm15ICRTTEFUeXBlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpTTEE6OlR5cGUnLAopOwoKIyBidWlsZCBhIGxvb2t1cCBoYXNoCm15ICVTTEFUeXBlTmFtZTJJRCA9IHJldmVyc2UgJXsgJFNMQVR5cGVMaXN0IH07CiMgLS0tCgojCiMgQ3JlYXRlIG5ldyBzZXJ2aWNlcwojCm15IEBTZXJ2aWNlcyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdTZXJ2aWNlMCcgLiAkUmFuZG9tSUQsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICBUeXBlSUQgICAgICA9PiAkU2VydmljZVR5cGVOYW1lMklEe1RyYWluaW5nfSwKICAgICAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRTZXJ2aWNlRGF0YSAoQFNlcnZpY2VzKSB7CiAgICBteSAkU2VydmljZUlEID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VBZGQoICV7JFNlcnZpY2VEYXRhfSApOwoKICAgICMgc2FuaXR5IHRlc3QKICAgICRTZWxmLT5Jc05vdCgKICAgICAgICAkU2VydmljZUlELAogICAgICAgIHVuZGVmLAogICAgICAgICJTZXJ2aWNlQWRkKCkgZm9yICRTZXJ2aWNlRGF0YS0+e05hbWV9LCBTZXJ2aWNlSUQgc2hvdWxkIG5vdCBiZSB1bmRlZiIsCiAgICApOwoKICAgICMgc3RvcmUgdGhlIFNlcnZpY2VJRAogICAgJFNlcnZpY2VEYXRhLT57U2VydmljZUlEfSA9ICRTZXJ2aWNlSUQ7Cn0KCiMKIyBDcmVhdGUgbmV3IFNMQXMKIwpteSBAU0xBcyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgICAgID0+ICdTTEEwJyAuICRSYW5kb21JRCwKICAgICAgICBTZXJ2aWNlSURzID0+IFsgJFNlcnZpY2VzWzBdLT57U2VydmljZUlEfSBdLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgVHlwZUlEID0+ICRTTEFUeXBlTmFtZTJJRHtPdGhlcn0sCiMgLS0tCiAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICA9PiAnU0xBMScgLiAkUmFuZG9tSUQsCiAgICAgICAgU2VydmljZUlEcyA9PiBbICRTZXJ2aWNlc1swXS0+e1NlcnZpY2VJRH0gXSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgIFR5cGVJRCA9PiAkU0xBVHlwZU5hbWUySUR7T3RoZXJ9LAojIC0tLQogICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgPT4gJ1NMQTInIC4gJFJhbmRvbUlELAogICAgICAgIFNlcnZpY2VJRHMgPT4gW10sCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICBUeXBlSUQgPT4gJFNMQVR5cGVOYW1lMklEe090aGVyfSwKIyAtLS0KICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkU0xBRGF0YSAoQFNMQXMpIHsKICAgIG15ICRTTEFJRCA9ICRTTEFPYmplY3QtPlNMQUFkZCggJXskU0xBRGF0YX0gKTsKCiAgICAjIHNhbml0eSB0ZXN0CiAgICAkU2VsZi0+SXNOb3QoCiAgICAgICAgJFNMQUlELAogICAgICAgIHVuZGVmLAogICAgICAgICJTTEFBZGQoKSBmb3IgJFNMQURhdGEtPntOYW1lfSwgU0xBSUQgc2hvdWxkIG5vdCBiZSB1bmRlZiIsCiAgICApOwoKICAgICMgc3RvcmUgdGhlIFNMQUlECiAgICAkU0xBRGF0YS0+e1NMQUlEfSA9ICRTTEFJRDsKfQoKIwojIEFzc2lnbiBzZXJ2aWNlcyB0byBjdXN0b21lciAoMCBhbmQgMSkKIwpteSAkU3VjY2VzcyA9ICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkKAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlc1swXS0+e1NlcnZpY2VJRH0sCiAgICBBY3RpdmUgICAgICAgICAgICA9PiAxLAogICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKKTsKCiMgc2FuaXR5IHRlc3QKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICJDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkKCkgZm9yIHVzZXIgJFRlc3RDdXN0b21lclVzZXJMb2dpbiwgYW5kIFNlcnZpY2UgJFNlcnZpY2VzWzBdLT57TmFtZX0iCiAgICAgICAgLiAiIHdpdGggdHJ1ZSIsCik7CgojCiMgQ3JlYXRlIGEgdGVzdCB0aWNrZXRzCiMKbXkgQFRpY2tldERhdGE7CmZvciBteSAkSXRlbSAoIDAgLi4gMSApIHsKICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICBUaXRsZSAgICAgICAgID0+ICggJEl0ZW0gPT0gMCApID8gJFNMQXNbMF0tPntTTEFJRH0gOiAndGVzdCcsCiAgICAgICAgUXVldWVJRCAgICAgICA9PiAxLAogICAgICAgIExvY2sgICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnMyBub3JtYWwnLAogICAgICAgIFN0YXRlSUQgICAgICAgPT4gMSwKICAgICAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICAgICAgU2VydmljZSAgICAgICA9PiAoICRJdGVtID09IDAgKSA/ICRTZXJ2aWNlc1swXS0+e05hbWV9IDogdW5kZWYsCiAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAoICRJdGVtID09IDAgKSA/ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4gOiB1bmRlZiwKICAgICAgICBPd25lcklEICAgICAgID0+IDEsCiAgICAgICAgUmVzcG9uc2libGVJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICk7CgogICAgIyBzYW5pdHkgY2hlY2tzCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgIlRpY2tldENyZWF0ZSgpIC0gJFRpY2tldElEIiwKICAgICk7CgogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgVXNlcklEICAgPT4gJFVzZXJJRCwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICBJc0hhc2hSZWZXaXRoRGF0YSggXCVUaWNrZXQgKSwKICAgICAgICAiVGlja2V0R2V0KCkgLSBHZXQgVGlja2V0IHdpdGggSUQgJFRpY2tldElELiIsCiAgICApOwoKICAgIHB1c2ggQFRpY2tldERhdGEsIFwlVGlja2V0Owp9CgojIFJ1bigpIHRlc3RzCm15IEBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdObyBQYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4gdW5kZWYsCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ05vIFVzZXJJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+IHVuZGVmLAogICAgICAgICAgICBUaWNrZXQgPT4gJFRpY2tldERhdGFbMF0sCiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICd0ZXN0JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdObyBUaWNrZXQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICBUaWNrZXQgPT4gdW5kZWYsCiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICd0ZXN0JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdObyBDb25maWcnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICBUaWNrZXQgPT4gJFRpY2tldERhdGFbMF0sCiAgICAgICAgICAgIENvbmZpZyA9PiB7fSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdXcm9uZyBDb25maWcnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICBUaWNrZXQgPT4gJFRpY2tldERhdGFbMF0sCiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICBOb0FnZW50Tm90aWZ5ID0+IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnV3JvbmcgVGlja2V0IEZvcm1hdCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFRpY2tldCA9PiAxLAogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgU0xBID0+ICdvcGVuJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdXcm9uZyBDb25maWcgRm9ybWF0JywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVGlja2V0ID0+ICRUaWNrZXREYXRhWzBdLAogICAgICAgICAgICBDb25maWcgPT4gMSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdXcm9uZyBTTEEnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICBUaWNrZXQgPT4gJFRpY2tldERhdGFbMF0sCiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICBTTEEgPT4gJ05vdEV4aXN0aW5nJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdXcm9uZyBTTEFJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFRpY2tldCA9PiAkVGlja2V0RGF0YVswXSwKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgIFNMQUlEID0+ICdOb3RFeGlzdGluZycgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnTm90IGFzc2lnbmVkIFNMQScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFRpY2tldCA9PiAkVGlja2V0RGF0YVswXSwKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgIFNMQSA9PiAkU0xBc1syXS0+e05hbWV9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ05vdCBBc3NpZ25lZCBTTEFJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFRpY2tldCA9PiAkVGlja2V0RGF0YVswXSwKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgIFNMQUlEID0+ICRTTEFzWzJdLT57U0xBSUR9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gIlRpY2tldCB3aXRob3V0IHNlcnZpY2Ugd2l0aCBTTEEgJFNMQXNbMF0tPntOYW1lfSIsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFRpY2tldCA9PiAkVGlja2V0RGF0YVsxXSwKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgIFNMQUlEID0+ICRTTEFzWzBdLT57TmFtZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAiVGlja2V0IHdpdGhvdXQgc2VydmljZSB3aXRoIFNMQUlEICRTTEFzWzFdLT57TmFtZX0iLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICBUaWNrZXQgPT4gJFRpY2tldERhdGFbMV0sCiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICBTTEFJRCA9PiAkU0xBc1swXS0+e1NMQUlEfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICJDb3JyZWN0IFNMQSAkU0xBc1swXS0+e05hbWV9IiwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVGlja2V0ID0+ICRUaWNrZXREYXRhWzBdLAogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgU0xBID0+ICRTTEFzWzBdLT57TmFtZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAiQ29ycmVjdCBTTEEgJFNMQXNbMV0tPntOYW1lfSIsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFRpY2tldCA9PiAkVGlja2V0RGF0YVswXSwKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgIFNMQSA9PiAkU0xBc1sxXS0+e05hbWV9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gIkNvcnJlY3QgU0xBSUQgJFNMQXNbMF0tPntOYW1lfSIsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFRpY2tldCA9PiAkVGlja2V0RGF0YVswXSwKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgIFNMQUlEID0+ICRTTEFzWzBdLT57U0xBSUR9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gIkNvcnJlY3QgU0xBSUQgJFNMQXNbMV0tPntOYW1lfSIsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFRpY2tldCA9PiAkVGlja2V0RGF0YVswXSwKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgIFNMQUlEID0+ICRTTEFzWzBdLT57U0xBSUR9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gIkNvcnJlY3QgVGlja2V0LT5UaXRsZSIsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFRpY2tldCA9PiAkVGlja2V0RGF0YVswXSwKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgIFNMQUlEID0+ICc8T1RSU19USUNLRVRfVGl0bGU+JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICJDb3JyZWN0IFRpY2tldC0+Tm90RXhpc3RpbmciLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICBUaWNrZXQgPT4gJFRpY2tldERhdGFbMF0sCiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICBTTEFJRCA9PiAnPE9UUlNfVElDS0VUX05vdEV4aXN0aW5nPicsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAiQ29ycmVjdCBVc2luZyBEaWZmZXJlbnQgVXNlcklEIiwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVGlja2V0ID0+ICRUaWNrZXREYXRhWzBdLAogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgU0xBICAgID0+ICRTTEFzWzBdLT57TmFtZX0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIG1ha2UgYSBkZWVwIGNvcHkgdG8gYXZvaWQgY2hhbmdpbmcgdGhlIGRlZmluaXRpb24KICAgIG15ICRPcmlnVGVzdCA9IFN0b3JhYmxlOjpkY2xvbmUoJFRlc3QpOwoKICAgIG15ICRTdWNjZXNzID0gJE1vZHVsZU9iamVjdC0+UnVuKAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgICAgIFByb2Nlc3NFbnRpdHlJRCAgICAgICAgICA9PiAnUDEnLAogICAgICAgIEFjdGl2aXR5RW50aXR5SUQgICAgICAgICA9PiAnQTEnLAogICAgICAgIFRyYW5zaXRpb25FbnRpdHlJRCAgICAgICA9PiAnVDEnLAogICAgICAgIFRyYW5zaXRpb25BY3Rpb25FbnRpdHlJRCA9PiAnVEExJywKICAgICk7CgogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkTW9kdWxlTmFtZSBSdW4oKSAtIFRlc3Q6JyRUZXN0LT57TmFtZX0nIHwgZXhlY3V0ZWQgd2l0aCBUcnVlIgogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRpY2tldAogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXREYXRhWzBdLT57VGlja2V0SUR9OwogICAgICAgIGlmICggJFRlc3QtPntDb25maWd9LT57VGlja2V0fS0+e1RpY2tldElEfSBlcSAkVGlja2V0RGF0YVsxXS0+e1RpY2tldElEfSApIHsKICAgICAgICAgICAgJFRpY2tldElEID0gJFRpY2tldERhdGFbMV0tPntUaWNrZXRJRH07CiAgICAgICAgfQogICAgICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBBVFRSSUJVVEU6CiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJXsgJFRlc3QtPntDb25maWd9LT57Q29uZmlnfSB9ICkgewoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRUaWNrZXR7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAiJE1vZHVsZU5hbWUgLSBUZXN0OickVGVzdC0+e05hbWV9JyB8IEF0dHJpYnV0ZTogJEF0dHJpYnV0ZSBmb3IgVGlja2V0SUQ6IgogICAgICAgICAgICAgICAgICAgIC4gIiAkVGlja2V0SUQgZXhpc3RzIHdpdGggVHJ1ZSIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkRXhwZWN0ZWRWYWx1ZSA9ICRUZXN0LT57Q29uZmlnfS0+e0NvbmZpZ30tPnskQXR0cmlidXRlfTsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJE9yaWdUZXN0LT57Q29uZmlnfS0+e0NvbmZpZ30tPnskQXR0cmlidXRlfQogICAgICAgICAgICAgICAgPX4gbXtcQTxPVFJTX1RJQ0tFVF8oW0EtWmEtejAtOV9dKyk+XHp9bXN4CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFeHBlY3RlZFZhbHVlID0gJFRpY2tldHskMX0gLy8gJyc7CiAgICAgICAgICAgICAgICAkU2VsZi0+SXNOb3QoCiAgICAgICAgICAgICAgICAgICAgJFRlc3QtPntDb25maWd9LT57Q29uZmlnfS0+eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgICAgICRPcmlnVGVzdC0+e0NvbmZpZ30tPntDb25maWd9LT57JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAgICAgIiRNb2R1bGVOYW1lIC0gVGVzdDonJFRlc3QtPntOYW1lfScgfCBBdHRyaWJ1dGU6ICRBdHRyaWJ1dGUgdmFsdWU6ICRPcmlnVGVzdC0+e0NvbmZpZ30tPntDb25maWd9LT57JEF0dHJpYnV0ZX0gc2hvdWxkIGJlZW4gcmVwbGFjZWQiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJFRpY2tldHskQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICRFeHBlY3RlZFZhbHVlLAogICAgICAgICAgICAgICAgIiRNb2R1bGVOYW1lIC0gVGVzdDonJFRlc3QtPntOYW1lfScgfCBBdHRyaWJ1dGU6ICRBdHRyaWJ1dGUgZm9yIFRpY2tldElEOiIKICAgICAgICAgICAgICAgICAgICAuICIgJFRpY2tldElEIG1hdGNoIGV4cGVjdGVkIHZhbHVlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJE9yaWdUZXN0LT57Q29uZmlnfS0+e0NvbmZpZ30tPntVc2VySUR9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkVGVzdC0+e0NvbmZpZ30tPntDb25maWd9LT57VXNlcklEfSwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgIiRNb2R1bGVOYW1lIC0gVGVzdDonJFRlc3QtPntOYW1lfScgfCBBdHRyaWJ1dGU6IFVzZXJJRCBmb3IgVGlja2V0SUQ6IgogICAgICAgICAgICAgICAgICAgIC4gIiAkVGlja2V0SUQgc2hvdWxkIGJlIHJlbW92ZWQgKGFzIGl0IHdhcyB1c2VkKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRNb2R1bGVOYW1lIFJ1bigpIC0gVGVzdDonJFRlc3QtPntOYW1lfScgfCBleGVjdXRlZCB3aXRoIEZhbHNlIgogICAgICAgICk7CiAgICB9Cn0KCiMgY2xlYW51cCBpcyBkb25lIGJ5IFJlc3RvcmVEYXRhYmFzZS4KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSAwYTA0ZTcyMmZiY2JkMzljY2EzZmIwODljMjk0ZTcyYjMxNzBlNmIxIC0gc2NyaXB0cy90ZXN0L1Byb2Nlc3NNYW5hZ2VtZW50L1RyYW5zaXRpb25BY3Rpb24vVGlja2V0U2VydmljZVNldC50CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgojIGdldCBuZWVkZWQgb2JqZWN0cwpteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyk7Cm15ICRUaWNrZXRPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwpteSAkTW9kdWxlT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6VHJhbnNpdGlvbkFjdGlvbjo6VGlja2V0U2VydmljZVNldCcpOwoKIyBnZXQgaGVscGVyIG9iamVjdAokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgID0+IDEsCiAgICAgICAgVXNlVG1wQXJ0aWNsZURpciA9PiAxLAogICAgfSwKKTsKbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgojIGRlZmluZSB2YXJpYWJsZXMKbXkgJFVzZXJJRCAgICAgPSAxOwpteSAkTW9kdWxlTmFtZSA9ICdUaWNrZXRTZXJ2aWNlU2V0JzsKbXkgJFJhbmRvbUlEICAgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKIyBhZGQgYSBjdXN0b21lciB1c2VyCm15ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0Q3VzdG9tZXJVc2VyQ3JlYXRlKCk7CgojIHNldCB1c2VyIGRldGFpbHMKbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgpOwpteSAkVGVzdFVzZXJJRCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoCiAgICBVc2VyTG9naW4gPT4gJFRlc3RVc2VyTG9naW4sCik7CiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KCiMgZ2V0IHRoZSBsaXN0IG9mIHNlcnZpY2UgdHlwZXMgZnJvbSBnZW5lcmFsIGNhdGFsb2cKbXkgJFNlcnZpY2VUeXBlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKKTsKCiMgYnVpbGQgYSBsb29rdXAgaGFzaApteSAlU2VydmljZVR5cGVOYW1lMklEID0gcmV2ZXJzZSAleyAkU2VydmljZVR5cGVMaXN0IH07CiMgLS0tCgojCiMgQ3JlYXRlIG5ldyBzZXJ2aWNlcwojCm15IEBTZXJ2aWNlcyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdTZXJ2aWNlMCcgLiAkUmFuZG9tSUQsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICBUeXBlSUQgICAgICA9PiAkU2VydmljZVR5cGVOYW1lMklEe1RyYWluaW5nfSwKICAgICAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ1NlcnZpY2UxJyAuICRSYW5kb21JRCwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgIFR5cGVJRCAgICAgID0+ICRTZXJ2aWNlVHlwZU5hbWUySUR7VHJhaW5pbmd9LAogICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnU2VydmljZTInIC4gJFJhbmRvbUlELAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgVHlwZUlEICAgICAgPT4gJFNlcnZpY2VUeXBlTmFtZTJJRHtUcmFpbmluZ30sCiAgICAgICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKIyAtLS0KICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkU2VydmljZURhdGEgKEBTZXJ2aWNlcykgewogICAgbXkgJFNlcnZpY2VJRCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlQWRkKCAleyRTZXJ2aWNlRGF0YX0gKTsKCiAgICAjIHNhbml0eSB0ZXN0CiAgICAkU2VsZi0+SXNOb3QoCiAgICAgICAgJFNlcnZpY2VJRCwKICAgICAgICB1bmRlZiwKICAgICAgICAiU2VydmljZUFkZCgpIGZvciAkU2VydmljZURhdGEtPntOYW1lfSwgU2VydmljZUlEIHNob3VsZCBub3QgYmUgdW5kZWYiLAogICAgKTsKCiAgICAjIHN0b3JlIHRoZSBTZXJ2aWNlSUQKICAgICRTZXJ2aWNlRGF0YS0+e1NlcnZpY2VJRH0gPSAkU2VydmljZUlEOwp9CgojCiMgQXNzaWduIHNlcnZpY2VzIHRvIGN1c3RvbWVyICgwIGFuZCAxKQojCm15ICRTdWNjZXNzID0gJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgU2VydmljZUlEICAgICAgICAgPT4gJFNlcnZpY2VzWzBdLT57U2VydmljZUlEfSwKICAgIEFjdGl2ZSAgICAgICAgICAgID0+IDEsCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAopOwoKIyBzYW5pdHkgdGVzdAokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoKSBmb3IgdXNlciAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLCBhbmQgU2VydmljZSAkU2VydmljZXNbMF0tPntOYW1lfSIKICAgICAgICAuICIgd2l0aCB0cnVlIiwKKTsKCiRTdWNjZXNzID0gJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgU2VydmljZUlEICAgICAgICAgPT4gJFNlcnZpY2VzWzFdLT57U2VydmljZUlEfSwKICAgIEFjdGl2ZSAgICAgICAgICAgID0+IDEsCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAopOwoKIyBzYW5pdHkgdGVzdAokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoKSBmb3IgdXNlciAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLCBhbmQgU2VydmljZSAkU2VydmljZXNbMV0tPntOYW1lfSIKICAgICAgICAuICIgd2l0aCB0cnVlIiwKKTsKCiMKIyBDcmVhdGUgYSB0ZXN0IHRpY2tldHMKIwpteSBAVGlja2V0RGF0YTsKZm9yIG15ICRJdGVtICggMCAuLiAxICkgewogICAgbXkgJFRpY2tldElEID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKAogICAgICAgIFRpdGxlICAgICAgICAgPT4gKCAkSXRlbSA9PSAwICkgPyAkU2VydmljZXNbMF0tPntTZXJ2aWNlSUR9IDogJ3Rlc3QnLAogICAgICAgIFF1ZXVlSUQgICAgICAgPT4gMSwKICAgICAgICBMb2NrICAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgIFByaW9yaXR5ICAgICAgPT4gJzMgbm9ybWFsJywKICAgICAgICBTdGF0ZUlEICAgICAgID0+IDEsCiAgICAgICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgICAgIEN1c3RvbWVyVXNlciAgPT4gKCAkSXRlbSA9PSAwICkgPyAkVGVzdEN1c3RvbWVyVXNlckxvZ2luIDogdW5kZWYsCiAgICAgICAgT3duZXJJRCAgICAgICA9PiAxLAogICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICApOwoKICAgICMgc2FuaXR5IGNoZWNrcwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFRpY2tldElELAogICAgICAgICJUaWNrZXRDcmVhdGUoKSAtICRUaWNrZXRJRCIsCiAgICApOwoKICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgIFVzZXJJRCAgID0+ICRVc2VySUQsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgIElzSGFzaFJlZldpdGhEYXRhKCBcJVRpY2tldCApLAogICAgICAgICJUaWNrZXRHZXQoKSAtIEdldCBUaWNrZXQgd2l0aCBJRCAkVGlja2V0SUQuIiwKICAgICk7CgogICAgcHVzaCBAVGlja2V0RGF0YSwgXCVUaWNrZXQ7Cgp9CgojIFJ1bigpIHRlc3RzCm15IEBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdObyBQYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4gdW5kZWYsCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ05vIFVzZXJJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+IHVuZGVmLAogICAgICAgICAgICBUaWNrZXQgPT4gJFRpY2tldERhdGFbMF0sCiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICd0ZXN0JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdObyBUaWNrZXQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICBUaWNrZXQgPT4gdW5kZWYsCiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICd0ZXN0JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdObyBDb25maWcnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICBUaWNrZXQgPT4gJFRpY2tldERhdGFbMF0sCiAgICAgICAgICAgIENvbmZpZyA9PiB7fSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdXcm9uZyBDb25maWcnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICBUaWNrZXQgPT4gJFRpY2tldERhdGFbMF0sCiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICBOb0FnZW50Tm90aWZ5ID0+IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnV3JvbmcgVGlja2V0IEZvcm1hdCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFRpY2tldCA9PiAxLAogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgU2VydmljZSA9PiAnb3BlbicsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnV3JvbmcgQ29uZmlnIEZvcm1hdCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFRpY2tldCA9PiAkVGlja2V0RGF0YVswXSwKICAgICAgICAgICAgQ29uZmlnID0+IDEsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnV3JvbmcgU2VydmljZScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFRpY2tldCA9PiAkVGlja2V0RGF0YVswXSwKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgIFNlcnZpY2UgPT4gJ05vdEV4aXN0aW5nJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdXcm9uZyBTZXJ2aWNlSUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICBUaWNrZXQgPT4gJFRpY2tldERhdGFbMF0sCiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJ05vdEV4aXN0aW5nJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdOb3QgYXNzaWduZWQgU2VydmljZScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFRpY2tldCA9PiAkVGlja2V0RGF0YVswXSwKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgIFNlcnZpY2UgPT4gJFNlcnZpY2VzWzJdLT57TmFtZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnTm90IEFzc2lnbmVkIFNlcnZpY2VJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFRpY2tldCA9PiAkVGlja2V0RGF0YVswXSwKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZXNbMl0tPntTZXJ2aWNlSUR9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gIlRpY2tldCB3aXRob3V0IGN1c3RvbWVyIHdpdGggU2VydmljZSAkU2VydmljZXNbMF0tPntOYW1lfSIsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFRpY2tldCA9PiAkVGlja2V0RGF0YVsxXSwKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZXNbMF0tPntOYW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICJUaWNrZXQgd2l0aG91dCBjdXN0b21lciB3aXRoIFNlcnZpY2VJRCAkU2VydmljZXNbMV0tPntOYW1lfSIsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFRpY2tldCA9PiAkVGlja2V0RGF0YVsxXSwKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZXNbMF0tPntTZXJ2aWNlSUR9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gIkNvcnJlY3QgU2VydmljZSAkU2VydmljZXNbMF0tPntOYW1lfSIsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFRpY2tldCA9PiAkVGlja2V0RGF0YVswXSwKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgIFNlcnZpY2UgPT4gJFNlcnZpY2VzWzBdLT57TmFtZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAiQ29ycmVjdCBTZXJ2aWNlICRTZXJ2aWNlc1sxXS0+e05hbWV9IiwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVGlja2V0ID0+ICRUaWNrZXREYXRhWzBdLAogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgU2VydmljZSA9PiAkU2VydmljZXNbMV0tPntOYW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICJDb3JyZWN0IFNlcnZpY2VJRCAkU2VydmljZXNbMF0tPntOYW1lfSIsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFRpY2tldCA9PiAkVGlja2V0RGF0YVswXSwKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZXNbMF0tPntTZXJ2aWNlSUR9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gIkNvcnJlY3QgU2VydmljZUlEICRTZXJ2aWNlc1sxXS0+e05hbWV9IiwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVGlja2V0ID0+ICRUaWNrZXREYXRhWzBdLAogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlc1sxXS0+e1NlcnZpY2VJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAiQ29ycmVjdCBUaWNrZXQtPlRpdGxlIiwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVGlja2V0ID0+ICRUaWNrZXREYXRhWzBdLAogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICc8T1RSU19USUNLRVRfVGl0bGU+JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICJXcm9uZyBUaWNrZXQtPk5vdEV4aXN0aW5nIiwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVGlja2V0ID0+ICRUaWNrZXREYXRhWzBdLAogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICc8T1RSU19USUNLRVRfTm90RXhpc3Rpbmc+JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICJDb3JyZWN0IFVzaW5nIERpZmZlcmVudCBVc2VySUQiLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICBUaWNrZXQgPT4gJFRpY2tldERhdGFbMF0sCiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICBTZXJ2aWNlID0+ICRTZXJ2aWNlc1swXS0+e05hbWV9LAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAkVGVzdFVzZXJJRCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgbWFrZSBhIGRlZXAgY29weSB0byBhdm9pZCBjaGFuZ2luZyB0aGUgZGVmaW5pdGlvbgogICAgbXkgJE9yaWdUZXN0ID0gU3RvcmFibGU6OmRjbG9uZSgkVGVzdCk7CgogICAgbXkgJFN1Y2Nlc3MgPSAkTW9kdWxlT2JqZWN0LT5SdW4oCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICAgICAgUHJvY2Vzc0VudGl0eUlEICAgICAgICAgID0+ICdQMScsCiAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCAgICAgICAgID0+ICdBMScsCiAgICAgICAgVHJhbnNpdGlvbkVudGl0eUlEICAgICAgID0+ICdUMScsCiAgICAgICAgVHJhbnNpdGlvbkFjdGlvbkVudGl0eUlEID0+ICdUQTEnLAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRNb2R1bGVOYW1lIFJ1bigpIC0gVGVzdDonJFRlc3QtPntOYW1lfScgfCBleGVjdXRlZCB3aXRoIFRydWUiCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGlja2V0CiAgICAgICAgbXkgJFRpY2tldElEID0gJFRpY2tldERhdGFbMF0tPntUaWNrZXRJRH07CiAgICAgICAgaWYgKCAkVGVzdC0+e0NvbmZpZ30tPntUaWNrZXR9LT57VGlja2V0SUR9IGVxICRUaWNrZXREYXRhWzFdLT57VGlja2V0SUR9ICkgewogICAgICAgICAgICAkVGlja2V0SUQgPSAkVGlja2V0RGF0YVsxXS0+e1RpY2tldElEfTsKICAgICAgICB9CgogICAgICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBBVFRSSUJVVEU6CiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJXsgJFRlc3QtPntDb25maWd9LT57Q29uZmlnfSB9ICkgewoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRUaWNrZXR7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAiJE1vZHVsZU5hbWUgLSBUZXN0OickVGVzdC0+e05hbWV9JyB8IEF0dHJpYnV0ZTogJEF0dHJpYnV0ZSBmb3IgVGlja2V0SUQ6IgogICAgICAgICAgICAgICAgICAgIC4gIiAkVGlja2V0SUQgZXhpc3RzIHdpdGggVHJ1ZSIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkRXhwZWN0ZWRWYWx1ZSA9ICRUZXN0LT57Q29uZmlnfS0+e0NvbmZpZ30tPnskQXR0cmlidXRlfTsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJE9yaWdUZXN0LT57Q29uZmlnfS0+e0NvbmZpZ30tPnskQXR0cmlidXRlfQogICAgICAgICAgICAgICAgPX4gbXtcQTxPVFJTX1RJQ0tFVF8oW0EtWmEtejAtOV9dKyk+XHp9bXN4CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFeHBlY3RlZFZhbHVlID0gJFRpY2tldHskMX0gLy8gJyc7CiAgICAgICAgICAgICAgICAkU2VsZi0+SXNOb3QoCiAgICAgICAgICAgICAgICAgICAgJFRlc3QtPntDb25maWd9LT57Q29uZmlnfS0+eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgICAgICRPcmlnVGVzdC0+e0NvbmZpZ30tPntDb25maWd9LT57JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAgICAgIiRNb2R1bGVOYW1lIC0gVGVzdDonJFRlc3QtPntOYW1lfScgfCBBdHRyaWJ1dGU6ICRBdHRyaWJ1dGUgdmFsdWU6ICRPcmlnVGVzdC0+e0NvbmZpZ30tPntDb25maWd9LT57JEF0dHJpYnV0ZX0gc2hvdWxkIGJlZW4gcmVwbGFjZWQiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJFRpY2tldHskQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICRFeHBlY3RlZFZhbHVlLAogICAgICAgICAgICAgICAgIiRNb2R1bGVOYW1lIC0gVGVzdDonJFRlc3QtPntOYW1lfScgfCBBdHRyaWJ1dGU6ICRBdHRyaWJ1dGUgZm9yIFRpY2tldElEOiIKICAgICAgICAgICAgICAgICAgICAuICIgJFRpY2tldElEIG1hdGNoIGV4cGVjdGVkIHZhbHVlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJE9yaWdUZXN0LT57Q29uZmlnfS0+e0NvbmZpZ30tPntVc2VySUR9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkVGVzdC0+e0NvbmZpZ30tPntDb25maWd9LT57VXNlcklEfSwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgIiRNb2R1bGVOYW1lIC0gVGVzdDonJFRlc3QtPntOYW1lfScgfCBBdHRyaWJ1dGU6IFVzZXJJRCBmb3IgVGlja2V0SUQ6IgogICAgICAgICAgICAgICAgICAgIC4gIiAkVGlja2V0SUQgc2hvdWxkIGJlIHJlbW92ZWQgKGFzIGl0IHdhcyB1c2VkKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRNb2R1bGVOYW1lIFJ1bigpIC0gVGVzdDonJFRlc3QtPntOYW1lfScgfCBleGVjdXRlZCB3aXRoIEZhbHNlIgogICAgICAgICk7CiAgICB9Cn0KCiMgY2xlYW51cCBpcyBkb25lIGJ5IFJlc3RvcmVEYXRhYmFzZS4KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA0ZmUyMThiZWNjZGI5MjZhMjlkZDdiZWQ5ZGU0ODIxMTQzMGQ2OWQwIC0gc2NyaXB0cy90ZXN0L1Byb2Nlc3NNYW5hZ2VtZW50L1Byb2Nlc3MudAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKIyBnZXQgbmVlZGVkIG9iamVjdHMKbXkgJENvbmZpZ09iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwpteSAkUXVldWVPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwpteSAkUHJvY2Vzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6UHJvY2VzcycpOwoKIyBnZXQgaGVscGVyIG9iamVjdAokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgID0+IDEsCiAgICAgICAgVXNlVG1wQXJ0aWNsZURpciA9PiAxLAogICAgfSwKKTsKbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgojIGNyZWF0ZSBjb21tb24gb2JqZWN0cyB0byBiZSB1c2VkIGluIEFjdGl2aXR5RGlhbG9nIG9iamVjdCBjcmVhdGlvbgpteSAlQ29tbW9uT2JqZWN0OwokQ29tbW9uT2JqZWN0e0FjdGl2aXR5T2JqZWN0fSAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eScpOwokQ29tbW9uT2JqZWN0e0FjdGl2aXR5RGlhbG9nT2JqZWN0fSAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eURpYWxvZycpOwokQ29tbW9uT2JqZWN0e1RyYW5zaXRpb25PYmplY3R9ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uJyk7CiRDb21tb25PYmplY3R7VHJhbnNpdGlvbkFjdGlvbk9iamVjdH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlRyYW5zaXRpb25BY3Rpb24nKTsKJENvbW1vbk9iamVjdHtUaWNrZXRPYmplY3R9ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiMgZGVmaW5lIG5lZWRlZCB2YXJpYWJsZXMKbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiMgY3JlYXRlIHNvbWUgcXVldWVzIGluIHRoZSBzeXN0ZW0KbXkgJVF1ZXVlRGF0YTEgPSAoCiAgICBOYW1lICAgICAgICAgICAgPT4gJ1F1ZXVlMScgLiAkUmFuZG9tSUQsCiAgICBWYWxpZElEICAgICAgICAgPT4gMSwKICAgIEdyb3VwSUQgICAgICAgICA9PiAxLAogICAgU3lzdGVtQWRkcmVzc0lEID0+IDEsCiAgICBTYWx1dGF0aW9uSUQgICAgPT4gMSwKICAgIFNpZ25hdHVyZUlEICAgICA9PiAxLAogICAgQ29tbWVudCAgICAgICAgID0+ICdTb21lIGNvbW1lbnQnLAogICAgVXNlcklEICAgICAgICAgID0+IDEsCik7CgpteSAlUXVldWVEYXRhMiA9ICgKICAgIE5hbWUgICAgICAgICAgICA9PiAnUXVldWUyJyAuICRSYW5kb21JRCwKICAgIFZhbGlkSUQgICAgICAgICA9PiAxLAogICAgR3JvdXBJRCAgICAgICAgID0+IDEsCiAgICBTeXN0ZW1BZGRyZXNzSUQgPT4gMSwKICAgIFNhbHV0YXRpb25JRCAgICA9PiAxLAogICAgU2lnbmF0dXJlSUQgICAgID0+IDEsCiAgICBDb21tZW50ICAgICAgICAgPT4gJ1NvbWUgY29tbWVudCcsCiAgICBVc2VySUQgICAgICAgICAgPT4gMSwKKTsKCm15ICVRdWV1ZURhdGEzID0gKAogICAgTmFtZSAgICAgICAgICAgID0+ICdRdWV1ZTMnIC4gJFJhbmRvbUlELAogICAgVmFsaWRJRCAgICAgICAgID0+IDEsCiAgICBHcm91cElEICAgICAgICAgPT4gMSwKICAgIFN5c3RlbUFkZHJlc3NJRCA9PiAxLAogICAgU2FsdXRhdGlvbklEICAgID0+IDEsCiAgICBTaWduYXR1cmVJRCAgICAgPT4gMSwKICAgIENvbW1lbnQgICAgICAgICA9PiAnU29tZSBjb21tZW50JywKICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAopOwoKbXkgJFF1ZXVlSUQxID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUFkZCglUXVldWVEYXRhMSk7CgojIHNhbml0eSBjaGVjawokU2VsZi0+SXNOb3QoCiAgICAkUXVldWVJRDEsCiAgICB1bmRlZiwKICAgICJRdWV1ZUFkZCgpIC0gQWRkZWQgcXVldWUgJyRRdWV1ZURhdGExe05hbWV9JyBmb3IgQUNMIGNoZWNrIC0gc2hvdWxkIG5vdCBiZSB1bmRlZiIKKTsKCm15ICRRdWV1ZUlEMiA9ICRRdWV1ZU9iamVjdC0+UXVldWVBZGQoJVF1ZXVlRGF0YTIpOwoKIyBzYW5pdHkgY2hlY2sKJFNlbGYtPklzTm90KAogICAgJFF1ZXVlSUQyLAogICAgdW5kZWYsCiAgICAiUXVldWVBZGQoKSAtIEFkZGVkIHF1ZXVlICckUXVldWVEYXRhMntOYW1lfScgZm9yIEFDTCBjaGVjayAtIHNob3VsZCBub3QgYmUgdW5kZWYiCik7CgpteSAkUXVldWVJRDMgPSAkUXVldWVPYmplY3QtPlF1ZXVlQWRkKCVRdWV1ZURhdGEzKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5Jc05vdCgKICAgICRRdWV1ZUlEMywKICAgIHVuZGVmLAogICAgIlF1ZXVlQWRkKCkgLSBBZGRlZCBxdWV1ZSAnJFF1ZXVlRGF0YTN7TmFtZX0nIGZvciBBQ0wgY2hlY2sgLSBzaG91bGQgbm90IGJlIHVuZGVmIgopOwoKbXkgJFRlc3RDdXN0b21lclVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RDdXN0b21lclVzZXJDcmVhdGUoKTsKCiMgR2V0IFNlcnZpY2VPYmplY3QuCm15ICRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKTsKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQoKIyBnZXQgdGhlIGxpc3Qgb2Ygc2VydmljZSB0eXBlcyBmcm9tIGdlbmVyYWwgY2F0YWxvZwpteSAkU2VydmljZVR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAopOwoKIyBidWlsZCBhIGxvb2t1cCBoYXNoCm15ICVTZXJ2aWNlVHlwZU5hbWUySUQgPSByZXZlcnNlICV7ICRTZXJ2aWNlVHlwZUxpc3QgfTsKCiMgZ2V0IHRoZSBsaXN0IG9mIHNsYSB0eXBlcyBmcm9tIGdlbmVyYWwgY2F0YWxvZwpteSAkU0xBVHlwZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICBDbGFzcyA9PiAnSVRTTTo6U0xBOjpUeXBlJywKKTsKCiMgYnVpbGQgYSBsb29rdXAgaGFzaApteSAlU0xBVHlwZU5hbWUySUQgPSByZXZlcnNlICV7ICRTTEFUeXBlTGlzdCB9OwojIC0tLQoKbXkgJFNlcnZpY2VJRCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlQWRkKAogICAgTmFtZSAgICA9PiAkUmFuZG9tSUQsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgIFR5cGVJRCAgICAgID0+ICRTZXJ2aWNlVHlwZU5hbWUySUR7VHJhaW5pbmd9LAogICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKIyAtLS0KICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkKAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlSUQsCiAgICBBY3RpdmUgICAgICAgICAgICA9PiAxLAogICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKKTsKCm15ICRTTEFJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTTEEnKS0+U0xBQWRkKAogICAgU2VydmljZUlEcyA9PiBbJFNlcnZpY2VJRF0sCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgIFR5cGVJRCAgICAgPT4gJFNMQVR5cGVOYW1lMklEe090aGVyfSwKIyAtLS0KICAgIE5hbWUgICAgICAgPT4gJFJhbmRvbUlELAogICAgVmFsaWRJRCAgICA9PiAxLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKbXkgJFRpY2tldElEID0gJENvbW1vbk9iamVjdHtUaWNrZXRPYmplY3R9LT5UaWNrZXRDcmVhdGUoCiAgICBUaXRsZSAgICAgICAgPT4gJ1Byb2Nlc3MgVW5pdHRlc3QgVGVzdHRpY2tldCcsCiAgICBRdWV1ZSAgICAgICAgPT4gJFF1ZXVlRGF0YTN7TmFtZX0sCiAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICBQcmlvcml0eSAgICAgPT4gJzMgbm9ybWFsJywKICAgIFN0YXRlICAgICAgICA9PiAnbmV3JywKICAgIE93bmVySUQgICAgICA9PiAxLAogICAgQ3VzdG9tZXJVc2VyID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICBVc2VySUQgICAgICAgPT4gMSwKKTsKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0SUQgfHwgMCwKICAgICJUaWNrZXRDcmVhdGUoKSBUZXN0dGlja2V0IGZvciBVbml0dGVzdHMgY3JlYXRlZCIsCik7CgpteSBAVGVzdHMgPSAoCgogICAgIyBHZXQgb24gbm8gY29uZmlnCiAgICB7CiAgICAgICAgUHJvY2Vzc0dldCA9PiB7CiAgICAgICAgICAgIENvbmZpZyAgICAgICAgICA9PiB7fSwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICd1bmtub3duMTIzJywKICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgID0+ICdQcm9jZXNzR2V0KCkgKE5vIENvbmZpZyknLAogICAgICAgICAgICBUZXN0VHlwZSAgICAgICAgPT4gJ0ZhbHNlJywKICAgICAgICAgICAgfQogICAgfSwKCiAgICAjIEdldCBvbiBubyBQcm9jZXNzRW50aXR5SUQKICAgIHsKICAgICAgICBQcm9jZXNzR2V0ID0+IHsKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgICdQcm9jZXNzJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1AxJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ0Jvb2sgT3JkZXJzJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgICAgICA9PiAnMTYtMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lICAgICAgICAgID0+ICcxNy0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgPT4gJ0FjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHkgICAgICAgPT4gJ0ExJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRBY3Rpdml0eURpYWxvZyA9PiAnQUQxJywKICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQTEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QyJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0EzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBMicgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMycgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAndW5rbm93bicgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICA9PiAnUHJvY2Vzc0dldCgpICh1bmtub3duIFByb2Nlc3NFbnRpdHlJRCknLAogICAgICAgICAgICBUZXN0VHlwZSAgICAgICAgPT4gJ0ZhbHNlJywKICAgICAgICAgICAgfQogICAgfSwKCiAgICB7CiAgICAgICAgUHJvY2Vzc0dldCA9PiB7CiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICAnUHJvY2VzcycgPT4gewogICAgICAgICAgICAgICAgICAgICdQMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdCb29rIE9yZGVycycsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgICAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgICAgICA9PiAnMTctMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgID0+ICdBY3RpdmUnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5ICAgICAgID0+ICdBMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHlEaWFsb2cgPT4gJ0FEMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ExJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QxJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0EyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMicgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQTInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDMnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBNZXNzYWdlICA9PiAnUHJvY2Vzc0dldCgpIChObyBQcm9jZXNzRW50aXR5SUQpJywKICAgICAgICAgICAgVGVzdFR5cGUgPT4gJ0ZhbHNlJywKICAgICAgICAgICAgfQogICAgfSwKCiAgICAjIEdldCBvbiBpbnZhbGlkIFByb2Nlc3NFbnRpdHlJRAogICAgewogICAgICAgIFByb2Nlc3NHZXQgPT4gewogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgJ1Byb2Nlc3MnID0+IHsKICAgICAgICAgICAgICAgICAgICAnUDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnQm9vayBPcmRlcnMnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUaW1lICAgICAgICAgID0+ICcxNi0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVRpbWUgICAgICAgICAgPT4gJzE3LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgICAgICAgICAgICAgICA9PiAnQWN0aXZlJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRBY3Rpdml0eSAgICAgICA9PiAnQTEnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5RGlhbG9nID0+ICdBRDEnLAogICAgICAgICAgICAgICAgICAgICAgICBQYXRoICAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EyJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QzJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0E0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICd1bmtub3duMTIzJywKICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgID0+ICdQcm9jZXNzR2V0KCkgKHVua25vd24gUHJvY2Vzc0VudGl0eUlEKScsCiAgICAgICAgICAgIFRlc3RUeXBlICAgICAgICA9PiAnRmFsc2UnLAogICAgICAgICAgICB9CiAgICB9LAoKICAgICMgR2V0IG9uIHZhbGlkIFByb2Nlc3NFbnRpdHlJRAogICAgewogICAgICAgIFByb2Nlc3NHZXQgPT4gewogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgJ1Byb2Nlc3MnID0+IHsKICAgICAgICAgICAgICAgICAgICAnUDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnQm9vayBPcmRlcnMnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUaW1lICAgICAgICAgID0+ICcxNi0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVRpbWUgICAgICAgICAgPT4gJzE3LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgICAgICAgICAgICAgICA9PiAnQWN0aXZlJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRBY3Rpdml0eSAgICAgICA9PiAnQTEnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5RGlhbG9nID0+ICdBRDEnLAogICAgICAgICAgICAgICAgICAgICAgICBQYXRoICAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EyJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QzJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0E0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICdQMScsCiAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICA9PiAnUHJvY2Vzc0dldCgpIChrbm93biBQcm9jZXNzRW50aXR5SUQpJywKICAgICAgICAgICAgVGVzdFR5cGUgICAgICAgID0+ICdSZXN1bHQnLAogICAgICAgICAgICBSZXN1bHQgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnQm9vayBPcmRlcnMnLAogICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgICAgICA9PiAnMTYtMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgIENoYW5nZVRpbWUgICAgICAgICAgPT4gJzE3LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgID0+ICdBY3RpdmUnLAogICAgICAgICAgICAgICAgU3RhcnRBY3Rpdml0eSAgICAgICA9PiAnQTEnLAogICAgICAgICAgICAgICAgU3RhcnRBY3Rpdml0eURpYWxvZyA9PiAnQUQxJywKICAgICAgICAgICAgICAgIFBhdGggICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICdBMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAnVDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0EyJywKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ1QyJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBMycsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnQTInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ1QzJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBNCcsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBHZXQgb24gdmFsaWQgUHJvY2Vzc0VudGl0eUlEIFVURjgKICAgIHsKICAgICAgICBQcm9jZXNzR2V0ID0+IHsKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgICdQcm9jZXNzJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1AxJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICfDpMO2w7zDn8OEw5bDnOKCrNC40YHDocOpw63DusOzw7rDgcOJw43Dk8Oaw7HDkS3jgqvjgrnjgr8t55So6L+O5L2/55SoLdCv0LfRi9C6JywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgICAgICA9PiAnMTYtMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lICAgICAgICAgID0+ICcxNy0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgPT4gJ0FjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHkgICAgICAgPT4gJ0ExJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRBY3Rpdml0eURpYWxvZyA9PiAnQUQxJywKICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQTEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QyJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0EzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBMicgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMycgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAnUDEnLAogICAgICAgICAgICBNZXNzYWdlICAgICAgICAgPT4gJ1Byb2Nlc3NHZXQoKSAoa25vd24gUHJvY2Vzc0VudGl0eUlEIFVURjgpJywKICAgICAgICAgICAgVGVzdFR5cGUgICAgICAgID0+ICdSZXN1bHQnLAogICAgICAgICAgICBSZXN1bHQgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgTmFtZSA9PgogICAgICAgICAgICAgICAgICAgICfDpMO2w7zDn8OEw5bDnOKCrNC40YHDocOpw63DusOzw7rDgcOJw43Dk8Oaw7HDkS3jgqvjgrnjgr8t55So6L+O5L2/55SoLdCv0LfRi9C6JywKICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgICAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lICAgICAgICAgID0+ICcxNy0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgU3RhdGUgICAgICAgICAgICAgICA9PiAnQWN0aXZlJywKICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHkgICAgICAgPT4gJ0ExJywKICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHlEaWFsb2cgPT4gJ0FEMScsCiAgICAgICAgICAgICAgICBQYXRoICAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAnQTEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ1QxJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBMicsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdUMicgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTMnLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ0EyJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdUMycgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTQnLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTGlzdCBvbiBpbnZhbGlkIENvbmZpZwogICAgewogICAgICAgIFByb2Nlc3NMaXN0ID0+IHsKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgICdQcm9jZXNzJyA9PiB7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJ1AxJywKICAgICAgICAgICAgUHJvY2Vzc1N0YXRlICAgID0+IFsgJ0FjdGl2ZScsICdGYWRlQXdheScsICdJbmFjdGl2ZScgXSwKICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgID0+ICdQcm9jZXNzTGlzdCgpIChpbnZhbGlkIENvbmZpZyknLAogICAgICAgICAgICBUZXN0VHlwZSAgICAgICAgPT4gJ0ZhbHNlJywKICAgICAgICAgICAgfQogICAgfSwKCiAgICAjIExpc3Qgb24gdmFsaWQgQ29uZmlnLCBtaXNzaW5nIFByb2Nlc3NTdGF0ZQogICAgewogICAgICAgIFByb2Nlc3NMaXN0ID0+IHsKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgICdQcm9jZXNzJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1AxJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ0Jvb2sgT3JkZXJzJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgICAgICA9PiAnMTYtMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lICAgICAgICAgID0+ICcxNy0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgPT4gJ0FjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHkgICAgICAgPT4gJ0ExJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRBY3Rpdml0eURpYWxvZyA9PiAnQUQxJywKICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQTEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QyJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0EzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBMicgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMycgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAnUDEnLAogICAgICAgICAgICBQcm9jZXNzU3RhdGUgICAgPT4gW10sCiAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICA9PiAnUHJvY2Vzc0xpc3QoKSAodmFsaWQgQ29uZmlnLCBtaXNzaW5nIFByb2Nlc3NTdGF0ZSknLAogICAgICAgICAgICBUZXN0VHlwZSAgICAgICAgPT4gJ0ZhbHNlJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIExpc3Qgb24gdmFsaWQgQ29uZmlnLCByaWdodCBQcm9jZXNzU3RhdGUKICAgIHsKICAgICAgICBQcm9jZXNzTGlzdCA9PiB7CiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICAnUHJvY2VzcycgPT4gewogICAgICAgICAgICAgICAgICAgICdQMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdCb29rIE9yZGVycycsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgICAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgICAgICA9PiAnMTctMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgID0+ICdBY3RpdmUnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5ICAgICAgID0+ICdBMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHlEaWFsb2cgPT4gJ0FEMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ExJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QxJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0EyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMicgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQTInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDMnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJ1AxJywKICAgICAgICAgICAgUHJvY2Vzc1N0YXRlICAgID0+IFsgJ0FjdGl2ZScsICdGYWRlQXdheScsICdJbmFjdGl2ZScgXSwKICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgID0+ICdQcm9jZXNzTGlzdCgpICh2YWxpZCBDb25maWcsIHJpZ2h0IFByb2Nlc3NTdGF0ZSknLAogICAgICAgICAgICBUZXN0VHlwZSAgICAgICAgPT4gJ1Jlc3VsdCcsCiAgICAgICAgICAgIFJlc3VsdCAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAnUDEnID0+ICdCb29rIE9yZGVycycKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIExpc3Qgb24gdmFsaWQgQ29uZmlnLCB3cm9uZyBQcm9jZXNzU3RhdGUKICAgIHsKICAgICAgICBQcm9jZXNzTGlzdCA9PiB7CiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICAnUHJvY2VzcycgPT4gewogICAgICAgICAgICAgICAgICAgICdQMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdCb29rIE9yZGVycycsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgICAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgICAgICA9PiAnMTctMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgID0+ICdBY3RpdmUnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5ICAgICAgID0+ICdBMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHlEaWFsb2cgPT4gJ0FEMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ExJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QxJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0EyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMicgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQTInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDMnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJ1AxJywKICAgICAgICAgICAgUHJvY2Vzc1N0YXRlICAgID0+IFsgJ0ZhZGVBd2F5JywgJ0luYWN0aXZlJyBdLAogICAgICAgICAgICBNZXNzYWdlICAgICAgICAgPT4gJ1Byb2Nlc3NMaXN0KCkgKHZhbGlkIENvbmZpZywgd3JvbmcgUHJvY2Vzc1N0YXRlKScsCiAgICAgICAgICAgIFRlc3RUeXBlICAgICAgICA9PiAnUmVzdWx0JywKICAgICAgICAgICAgUmVzdWx0ICAgICAgICAgID0+IHt9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTGlzdCBvbiB2YWxpZCBDb25maWcsIHdyb25nIGludGVyZmFjZQogICAgewogICAgICAgIFByb2Nlc3NMaXN0ID0+IHsKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgICdQcm9jZXNzJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1AxJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ0Jvb2sgT3JkZXJzJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgICAgICA9PiAnMTYtMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lICAgICAgICAgID0+ICcxNy0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgPT4gJ0FjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHkgICAgICAgPT4gJ0ExJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRBY3Rpdml0eURpYWxvZyA9PiAnQUQxJywKICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQTEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QyJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0EzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBMicgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMycgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnUHJvY2Vzczo6QWN0aXZpdHlEaWFsb2cnID0+IHsKICAgICAgICAgICAgICAgICAgICAnQUQxJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEludGVyZmFjZSAgICAgICAgPT4gWydDdXN0b21lckludGVyZmFjZSddLAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdBY3Rpdml0eSBEaWFsb2cgMScsCiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJ0FEMSBQcm9jZXNzIFNob3J0JywKICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICA9PiAnQUQxIFByb2Nlc3MgTG9uZyBkZXNjcmlwdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgICAgPT4gJzA3LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+ICcyJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgICA9PiAnMDgtMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgPT4gJzMnLAogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZF9NYWtlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5ICAgICAgICAgID0+IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICA9PiAnTWFrZSBMb25nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICdNYWtlIFNob3J0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkT3JkZXIgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF9NYWtlJywKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgU3VibWl0QWR2aWNlVGV4dCA9PiAnTk9URTogSWYgeW91IHN1Ym1pdCB0aGUgZm9ybSAuLi4nLAogICAgICAgICAgICAgICAgICAgICAgICBTdWJtaXRCdXR0b25UZXh0ID0+ICdNYWtlIGFuIGlucXVpcnknLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJ1AxJywKICAgICAgICAgICAgUHJvY2Vzc1N0YXRlICAgID0+IFsnQWN0aXZlJ10sCiAgICAgICAgICAgIEludGVyZmFjZSAgICAgICA9PiBbJ0FnZW50SW50ZXJmYWNlJ10sCiAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICA9PiAnUHJvY2Vzc0xpc3QoKSAodmFsaWQgQ29uZmlnLCB3cm9uZyBJbnRlcmZhY2UpJywKICAgICAgICAgICAgVGVzdFR5cGUgICAgICAgID0+ICdSZXN1bHQnLAogICAgICAgICAgICBSZXN1bHQgICAgICAgICAgPT4ge30sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBMaXN0IG9uIHZhbGlkIENvbmZpZywgcmlnaHQgaW50ZXJmYWNlCiAgICB7CiAgICAgICAgUHJvY2Vzc0xpc3QgPT4gewogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgJ1Byb2Nlc3MnID0+IHsKICAgICAgICAgICAgICAgICAgICAnUDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnQm9vayBPcmRlcnMnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUaW1lICAgICAgICAgID0+ICcxNi0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVRpbWUgICAgICAgICAgPT4gJzE3LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgICAgICAgICAgICAgICA9PiAnQWN0aXZlJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRBY3Rpdml0eSAgICAgICA9PiAnQTEnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5RGlhbG9nID0+ICdBRDEnLAogICAgICAgICAgICAgICAgICAgICAgICBQYXRoICAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EyJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QzJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0E0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdQcm9jZXNzOjpBY3Rpdml0eURpYWxvZycgPT4gewogICAgICAgICAgICAgICAgICAgICdBRDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlICAgICAgICA9PiBbJ0FnZW50SW50ZXJmYWNlJ10sCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0FjdGl2aXR5IERpYWxvZyAxJywKICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAnQUQxIFByb2Nlc3MgU2hvcnQnLAogICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgID0+ICdBRDEgUHJvY2VzcyBMb25nIGRlc2NyaXB0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgICA9PiAnMDctMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gJzInLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lICAgICAgID0+ICcwOC0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAnMycsCiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcyAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkX01ha2UgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgICAgICAgICAgPT4gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgID0+ICdNYWtlIExvbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJ01ha2UgU2hvcnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRPcmRlciA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkX01ha2UnLAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBTdWJtaXRBZHZpY2VUZXh0ID0+ICdOT1RFOiBJZiB5b3Ugc3VibWl0IHRoZSBmb3JtIC4uLicsCiAgICAgICAgICAgICAgICAgICAgICAgIFN1Ym1pdEJ1dHRvblRleHQgPT4gJ01ha2UgYW4gaW5xdWlyeScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAnUDEnLAogICAgICAgICAgICBQcm9jZXNzU3RhdGUgICAgPT4gWydBY3RpdmUnXSwKICAgICAgICAgICAgSW50ZXJmYWNlICAgICAgID0+IFsnQWdlbnRJbnRlcmZhY2UnXSwKICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgID0+ICdQcm9jZXNzTGlzdCgpICh2YWxpZCBDb25maWcsIHJpZ2h0IEludGVyZmFjZSknLAogICAgICAgICAgICBUZXN0VHlwZSAgICAgICAgPT4gJ1Jlc3VsdCcsCiAgICAgICAgICAgIFJlc3VsdCAgICAgICAgICA9PiB7ICdQMScgPT4gJ0Jvb2sgT3JkZXJzJyB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgUHJvY2Vzc1N0YXJ0cG9pbnRHZXQgb24gaW52YWxpZCBDb25maWcKICAgIHsKICAgICAgICBQcm9jZXNzU3RhcnRwb2ludEdldCA9PiB7CiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICAnUHJvY2VzcycgPT4gewogICAgICAgICAgICAgICAgICAgICdQMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdCb29rIE9yZGVycycsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSA9PiAnMTctMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgID0+ICdBY3RpdmUnLAogICAgICAgICAgICAgICAgICAgICAgICBQYXRoICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EyJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QzJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0E0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICdQMScsCiAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICA9PiAnUHJvY2Vzc1N0YXJ0cG9pbnRHZXQoKSAoaW52YWxpZCBTdGFydCknLAogICAgICAgICAgICBUZXN0VHlwZSAgICAgICAgPT4gJ0ZhbHNlJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIFByb2Nlc3NTdGFydHBvaW50R2V0IG9uIHZhbGlkIENvbmZpZwogICAgewogICAgICAgIFByb2Nlc3NTdGFydHBvaW50R2V0ID0+IHsKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgICdQcm9jZXNzJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1AxJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ0Jvb2sgT3JkZXJzJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgICAgICA9PiAnMTYtMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lICAgICAgICAgID0+ICcxNy0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgPT4gJ0FjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHkgICAgICAgPT4gJ0ExJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRBY3Rpdml0eURpYWxvZyA9PiAnQUQxJywKICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQTEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QyJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0EzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBMicgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMycgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAnUDEnLAogICAgICAgICAgICBNZXNzYWdlICAgICAgICAgPT4gJ1Byb2Nlc3NTdGFydHBvaW50R2V0KCkgKHZhbGlkIFN0YXJ0KScsCiAgICAgICAgICAgIFRlc3RUeXBlICAgICAgICA9PiAnUmVzdWx0JywKICAgICAgICAgICAgUmVzdWx0ICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIEFjdGl2aXR5c2V0ICAgID0+ICdBMScsCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZyA9PiAnQUQxJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFRyYW5zaXRpb24gb24gbWlzc2luZyBQcm9jZXNzRW50aXR5SUQKICAgIHsKICAgICAgICBQcm9jZXNzVHJhbnNpdGlvbiA9PiB7CiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICAnUHJvY2VzcycgPT4gewogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEICA9PiB1bmRlZiwKICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTEnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBNZXNzYWdlICAgICAgICAgID0+ICdQcm9jZXNzVHJhbnNpdGlvbigpIChtaXNzaW5nIFByb2Nlc3NFbnRpdHlJRCknLAogICAgICAgICAgICBUZXN0VHlwZSAgICAgICAgID0+ICdGYWxzZScsCiAgICAgICAgICAgIH0KICAgIH0sCgogICAgIyBUcmFuc2l0aW9uIG9uIG1pc3NpbmcgQWN0aXZpdHlFbnRpdHlJRAogICAgewogICAgICAgIFByb2Nlc3NUcmFuc2l0aW9uID0+IHsKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgICdQcm9jZXNzJyA9PiB7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgID0+ICdQMScsCiAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gdW5kZWYsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICAgPT4gJ1Byb2Nlc3NUcmFuc2l0aW9uKCkgKG1pc3NpbmcgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCknLAogICAgICAgICAgICBUZXN0VHlwZSAgICAgICAgID0+ICdGYWxzZScsCiAgICAgICAgICAgIH0KICAgIH0sCgogICAgIyBUcmFuc2l0aW9uIG9uIG1pc3NpbmcgVGlja2V0SUQKICAgIHsKICAgICAgICBQcm9jZXNzVHJhbnNpdGlvbiA9PiB7CiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICAnUHJvY2VzcycgPT4gewogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEICA9PiAnUDEnLAogICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBMScsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgICA9PiAnUHJvY2Vzc1RyYW5zaXRpb24oKSAobWlzc2luZyBUaWNrZXRJRCknLAogICAgICAgICAgICBUZXN0VHlwZSAgICAgICAgID0+ICdGYWxzZScsCiAgICAgICAgICAgIH0KICAgIH0sCgogICAgIyBUcmFuc2l0aW9uIG9uIG1pc3NpbmcgVXNlcklECiAgICB7CiAgICAgICAgUHJvY2Vzc1RyYW5zaXRpb24gPT4gewogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgJ1Byb2Nlc3MnID0+IHsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCAgPT4gJ1AxJywKICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTEnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgICA9PiAnUHJvY2Vzc1RyYW5zaXRpb24oKSAobWlzc2luZyBVc2VySUQpJywKICAgICAgICAgICAgVGVzdFR5cGUgICAgICAgICA9PiAnRmFsc2UnLAogICAgICAgICAgICB9CiAgICB9LAoKICAgICMgVHJhbnNpdGlvbiBvbiBpbnZhbGlkIFRpY2tldElECiAgICB7CiAgICAgICAgUHJvY2Vzc1RyYW5zaXRpb24gPT4gewogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgJ1Byb2Nlc3MnID0+IHsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCAgPT4gJ1AxJywKICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTEnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgICA9PiAnUHJvY2Vzc1RyYW5zaXRpb24oKSAoaW52YWxpZCBUaWNrZXRJRCknLAogICAgICAgICAgICBUZXN0VHlwZSAgICAgICAgID0+ICdGYWxzZScsCiAgICAgICAgICAgIH0KICAgIH0sCgogICAgIyBUcmFuc2l0aW9uIG9uIGludmFsaWQgUHJvY2VzcyBDb25maWd1cmF0aW9uCiAgICB7CiAgICAgICAgUHJvY2Vzc1RyYW5zaXRpb24gPT4gewogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgJ1Byb2Nlc3MnID0+IHsKICAgICAgICAgICAgICAgICAgICAnUDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnQm9vayBPcmRlcnMnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUaW1lICAgICAgICAgID0+ICcxNi0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVRpbWUgICAgICAgICAgPT4gJzE3LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgICAgICAgICAgICAgICA9PiAnQWN0aXZlJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRBY3Rpdml0eSAgICAgICA9PiAnQTEnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5RGlhbG9nID0+ICdBRDEnLAogICAgICAgICAgICAgICAgICAgICAgICBQYXRoICAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEICA9PiAnUDEnLAogICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBMScsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICAgPT4gJ1Byb2Nlc3NUcmFuc2l0aW9uKCkgKGludmFsaWQgUHJvY2VzcyBDb25maWd1cmF0aW9uKScsCiAgICAgICAgICAgIFRlc3RUeXBlICAgICAgICAgPT4gJ0ZhbHNlJywKICAgICAgICAgICAgfQogICAgfSwKCiAgICAjIFRyYW5zaXRpb24gb24gbWlzc2luZyBBY3Rpdml0c2V0cyBpbiBQcm9jZXNzLT5QYXRoCiAgICB7CiAgICAgICAgUHJvY2Vzc1RyYW5zaXRpb24gPT4gewogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgJ1Byb2Nlc3MnID0+IHsKICAgICAgICAgICAgICAgICAgICAnUDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnQm9vayBPcmRlcnMnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUaW1lICAgICAgICAgID0+ICcxNi0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVRpbWUgICAgICAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgICAgICAgICAgICAgICA9PiAnQWN0aXZlJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRBY3Rpdml0eSAgICAgICA9PiAnQTEnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5RGlhbG9nID0+ICdBRDEnLAogICAgICAgICAgICAgICAgICAgICAgICBQYXRoICAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBMicgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMycgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCAgPT4gJ1AxJywKICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTEnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBNZXNzYWdlICAgICAgICAgID0+ICdQcm9jZXNzVHJhbnNpdGlvbigpIChtaXNzaW5nIHJlcXVpcmVkIEFjdGl2aXR5IGluIFBhdGggQ29uZmlnKScsCiAgICAgICAgICAgIFRlc3RUeXBlICAgICAgICAgPT4gJ0ZhbHNlJywKICAgICAgICAgICAgRGVidWcgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICB9CiAgICB9LAoKICAgICMgVHJhbnNpdGlvbiBvbiBubyBtYXRjaGluZyBUcmFuc2l0aW9uCiAgICB7CiAgICAgICAgUHJvY2Vzc1RyYW5zaXRpb24gPT4gewogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgJ1Byb2Nlc3M6OlRyYW5zaXRpb24nID0+IHsKICAgICAgICAgICAgICAgICAgICAnVDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUcmFuc2l0aW9uIDEnLAogICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZDEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICc5OTk5OTk5OTk5OTk5OTk5OTk5OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICdQcm9jZXNzIFVuaXR0ZXN0IFRlc3R0aWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlSUQgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnVDInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUcmFuc2l0aW9uIDInLAogICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZDEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICc5OTk5OTk5OTk5OTk5OTk5OTk5OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICdQcm9jZXNzIFVuaXR0ZXN0IFRlc3R0aWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlSUQgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnUHJvY2VzcycgPT4gewogICAgICAgICAgICAgICAgICAgICdQMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdCb29rIE9yZGVycycsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgICAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgICAgICA9PiAnMTctMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgID0+ICdBY3RpdmUnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5ICAgICAgID0+ICdBMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHlEaWFsb2cgPT4gJ0FEMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ExJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QxJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0EyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMicgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQTInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDMnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgID0+ICdQMScsCiAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0ExJywKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgICA9PiAnUHJvY2Vzc1RyYW5zaXRpb24oKSAobm8gbWF0Y2hpbmcgVHJhbnNpdGlvbiknLAogICAgICAgICAgICBUZXN0VHlwZSAgICAgICAgID0+ICdGYWxzZScsCiAgICAgICAgICAgIERlYnVnICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfQogICAgfSwKCiAgICAjIFRyYW5zaXRpb24gb24gbWF0Y2hpbmcgVHJhbnNpdGlvbiBDaGVjayBPbmx5CiAgICB7CiAgICAgICAgUHJvY2Vzc1RyYW5zaXRpb24gPT4gewogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgJ1Byb2Nlc3M6OlRyYW5zaXRpb24nID0+IHsKICAgICAgICAgICAgICAgICAgICAnVDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUcmFuc2l0aW9uIDEnLAogICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZDEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICc5OTk5OTk5OTk5OTk5OTk5OTk5OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICdQcm9jZXNzIFVuaXR0ZXN0IFRlc3R0aWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlSUQgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnVDInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUcmFuc2l0aW9uIDInLAogICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZDEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgPT4gJ1Byb2Nlc3MgVW5pdHRlc3QgVGVzdHRpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVJRCAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdQcm9jZXNzJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1AxJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ0Jvb2sgT3JkZXJzJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgICAgICA9PiAnMTYtMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lICAgICAgICAgID0+ICcxNy0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgPT4gJ0FjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHkgICAgICAgPT4gJ0ExJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRBY3Rpdml0eURpYWxvZyA9PiAnQUQxJywKICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQTEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QyJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0EzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBMicgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMycgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnUHJvY2Vzczo6QWN0aXZpdHknID0+IHsKICAgICAgICAgICAgICAgICAgICAnQTEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0FjdGl2aXR5IDEgb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUaW1lICAgICA9PiAnMTYtMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgPT4gJzE3LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBRDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FEMicsCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnQTInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0FjdGl2aXR5IDIgb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUaW1lICAgICA9PiAnMTYtMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgPT4gJzE3LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBRDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FEMicsCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnQTMnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0FjdGl2aXR5IDMgb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUaW1lICAgICA9PiAnMTYtMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgPT4gJzE3LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBRDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FEMicsCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnQTQnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0FjdGl2aXR5IDQgb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUaW1lICAgICA9PiAnMTYtMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgPT4gJzE3LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBRDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FEMicsCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCAgPT4gJ1AxJywKICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTEnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDaGVja09ubHkgICAgICAgID0+IDEsCiAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICAgPT4gJ1Byb2Nlc3NUcmFuc2l0aW9uKCkgKG1hdGNoaW5nIFRyYW5zaXRpb24gQ2hlY2sgT25seSknLAogICAgICAgICAgICBUZXN0VHlwZSAgICAgICAgID0+ICdSZXN1bHQnLAogICAgICAgICAgICBSZXN1bHQgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICdUMicgPT4gewogICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0EzJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBUcmFuc2l0aW9uIG9uIG1hdGNoaW5nIFRyYW5zaXRpb24gY2hhbmdlIEFjdGl2aXR5RW50aXR5SUQgb24gVGlja2V0CiAgICB7CiAgICAgICAgUHJvY2Vzc1RyYW5zaXRpb24gPT4gewogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgJ1Byb2Nlc3M6OlRyYW5zaXRpb24nID0+IHsKICAgICAgICAgICAgICAgICAgICAnVDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUcmFuc2l0aW9uIDEnLAogICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZDEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICc5OTk5OTk5OTk5OTk5OTk5OTk5OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICdQcm9jZXNzIFVuaXR0ZXN0IFRlc3R0aWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlSUQgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnVDInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUcmFuc2l0aW9uIDInLAogICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZDEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgPT4gJ1Byb2Nlc3MgVW5pdHRlc3QgVGVzdHRpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVJRCAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdQcm9jZXNzJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1AxJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ0Jvb2sgT3JkZXJzJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgICAgICA9PiAnMTYtMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lICAgICAgICAgID0+ICcxNy0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgPT4gJ0FjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHkgICAgICAgPT4gJ0ExJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRBY3Rpdml0eURpYWxvZyA9PiAnQUQxJywKICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQTEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QyJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0EzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBMicgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMycgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnUHJvY2Vzczo6QWN0aXZpdHknID0+IHsKICAgICAgICAgICAgICAgICAgICAnQTEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0FjdGl2aXR5IDEgb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUaW1lICAgICA9PiAnMTYtMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgPT4gJzE3LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBRDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FEMicsCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnQTInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0FjdGl2aXR5IDIgb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUaW1lICAgICA9PiAnMTYtMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgPT4gJzE3LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBRDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FEMicsCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnQTMnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0FjdGl2aXR5IDMgb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUaW1lICAgICA9PiAnMTYtMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgPT4gJzE3LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBRDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FEMicsCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnQTQnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0FjdGl2aXR5IDQgb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUaW1lICAgICA9PiAnMTYtMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgPT4gJzE3LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBRDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FEMicsCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCAgPT4gJ1AxJywKICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTEnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDaGVja09ubHkgICAgICAgID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICAgPT4gJ1Byb2Nlc3NUcmFuc2l0aW9uKCkgKG1hdGNoaW5nIFRyYW5zaXRpb24gY2hhbmdlIEFjdGl2aXR5RW50aXR5SUQpJywKICAgICAgICAgICAgVGVzdFR5cGUgICAgICAgICA9PiAnVHJ1ZScsCiAgICAgICAgICAgIH0KICAgIH0sCgogICAgIyBQcm9jZXNzVGlja2V0QWN0aXZpdHlTZXQgb24gbm8gQWN0aXZpdHlFbnRpdHlJRAogICAgewogICAgICAgIFByb2Nlc3NUaWNrZXRBY3Rpdml0eVNldCA9PiB7CiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICAnUHJvY2VzcycgPT4gewogICAgICAgICAgICAgICAgICAgICdQMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdCb29rIE9yZGVycycsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgICAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgICAgICA9PiAnMTctMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgID0+ICdBY3RpdmUnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5ICAgICAgID0+ICdBMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHlEaWFsb2cgPT4gJ0FEMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ExJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QxJyA9PiAnQTInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMicgPT4gJ0EzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQTInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDMnID0+ICdBNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ1Byb2Nlc3M6OkFjdGl2aXR5JyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ0ExJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdBY3Rpdml0eSAxIG9wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVRpbWUgICAgID0+ICcxNy0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQUQxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBRDInLAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgID0+ICdQMScsCiAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gdW5kZWYsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICdQcm9jZXNzVGlja2V0QWN0aXZpdHlTZXQoKSAoU2V0IEFjdGl2aXR5RW50aXR5SUQgb24gVGlja2V0IHdpdGggbm8gQWN0aXZpdHlFbnRpdHlJRCknLAogICAgICAgICAgICBUZXN0VHlwZSA9PiAnRmFsc2UnLAogICAgICAgICAgICB9CiAgICB9LAoKICAgICMgUHJvY2Vzc1RpY2tldEFjdGl2aXR5U2V0IG9uIG5vIFByb2Nlc3NFbnRpdHlJRAogICAgewogICAgICAgIFByb2Nlc3NUaWNrZXRBY3Rpdml0eVNldCA9PiB7CiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICAnUHJvY2VzcycgPT4gewogICAgICAgICAgICAgICAgICAgICdQMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdCb29rIE9yZGVycycsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgICAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgICAgICA9PiAnMTctMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgID0+ICdBY3RpdmUnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5ICAgICAgID0+ICdBMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHlEaWFsb2cgPT4gJ0FEMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ExJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QxJyA9PiAnQTInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMicgPT4gJ0EzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQTInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDMnID0+ICdBNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ1Byb2Nlc3M6OkFjdGl2aXR5JyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ0ExJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdBY3Rpdml0eSAxIG9wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVRpbWUgICAgID0+ICcxNy0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQUQxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBRDInLAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgID0+IHVuZGVmLAogICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBMycsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICdQcm9jZXNzVGlja2V0QWN0aXZpdHlTZXQoKSAoU2V0IEFjdGl2aXR5RW50aXR5SUQgb24gVGlja2V0IHdpdGggbm8gUHJvY2Vzc0VudGl0eUlEKScsCiAgICAgICAgICAgIFRlc3RUeXBlID0+ICdGYWxzZScsCiAgICAgICAgICAgIH0KICAgIH0sCgogICAgIyBQcm9jZXNzVGlja2V0QWN0aXZpdHlTZXQgb24gbm8gVGlja2V0SUQKICAgIHsKICAgICAgICBQcm9jZXNzVGlja2V0QWN0aXZpdHlTZXQgPT4gewogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgJ1Byb2Nlc3MnID0+IHsKICAgICAgICAgICAgICAgICAgICAnUDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnQm9vayBPcmRlcnMnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUaW1lICAgICAgICAgID0+ICcxNi0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVRpbWUgICAgICAgICAgPT4gJzE3LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgICAgICAgICAgICAgICA9PiAnQWN0aXZlJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRBY3Rpdml0eSAgICAgICA9PiAnQTEnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5RGlhbG9nID0+ICdBRDEnLAogICAgICAgICAgICAgICAgICAgICAgICBQYXRoICAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMScgPT4gJ0EyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDInID0+ICdBMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EyJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QzJyA9PiAnQTQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdQcm9jZXNzOjpBY3Rpdml0eScgPT4gewogICAgICAgICAgICAgICAgICAgICdBMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAnQWN0aXZpdHkgMSBvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgID0+ICcxNi0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lICAgICA9PiAnMTctMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2cgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FEMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQUQyJywKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEICA9PiAnUDEnLAogICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBMycsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJ1Byb2Nlc3NUaWNrZXRBY3Rpdml0eVNldCgpIChTZXQgQWN0aXZpdHlFbnRpdHlJRCBvbiBUaWNrZXQgd2l0aCBubyBUaWNrZXRJRCknLAogICAgICAgICAgICBUZXN0VHlwZSA9PiAnRmFsc2UnLAogICAgICAgICAgICB9CiAgICB9LAoKICAgICMgUHJvY2Vzc1RpY2tldEFjdGl2aXR5U2V0IG9uIGludmFsaWQgQWN0aXZpdHlFbnRpdHlJRAogICAgewogICAgICAgIFByb2Nlc3NUaWNrZXRBY3Rpdml0eVNldCA9PiB7CiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICAnUHJvY2VzcycgPT4gewogICAgICAgICAgICAgICAgICAgICdQMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdCb29rIE9yZGVycycsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgICAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgICAgICA9PiAnMTctMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgID0+ICdBY3RpdmUnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5ICAgICAgID0+ICdBMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHlEaWFsb2cgPT4gJ0FEMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ExJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QxJyA9PiAnQTInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMicgPT4gJ0EzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQTInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDMnID0+ICdBNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ1Byb2Nlc3M6OkFjdGl2aXR5JyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ0ExJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdBY3Rpdml0eSAxIG9wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVRpbWUgICAgID0+ICcxNy0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQUQxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBRDInLAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgID0+ICdQMScsCiAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0EzJywKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJ1Byb2Nlc3NUaWNrZXRBY3Rpdml0eVNldCgpIChTZXQgQWN0aXZpdHlFbnRpdHlJRCBvbiBUaWNrZXQgd2l0aCBpbnZhbGlkIEFjdGl2aXR5RW50aXR5SUQpJywKICAgICAgICAgICAgVGVzdFR5cGUgPT4gJ0ZhbHNlJywKICAgICAgICAgICAgfQogICAgfSwKCiAgICAjIFByb2Nlc3NUaWNrZXRBY3Rpdml0eVNldCBvbiBpbnZhbGlkIFByb2Nlc3NFbnRpdHlJRAogICAgewogICAgICAgIFByb2Nlc3NUaWNrZXRBY3Rpdml0eVNldCA9PiB7CiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICAnUHJvY2VzcycgPT4gewogICAgICAgICAgICAgICAgICAgICdQMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdCb29rIE9yZGVycycsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgICAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgICAgICA9PiAnMTctMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgID0+ICdBY3RpdmUnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5ICAgICAgID0+ICdBMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHlEaWFsb2cgPT4gJ0FEMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ExJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QxJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0EyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMicgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQTInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDMnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ1Byb2Nlc3M6OkFjdGl2aXR5JyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ0ExJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdBY3Rpdml0eSAxIG9wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVRpbWUgICAgID0+ICcxNy0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQUQxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBRDInLAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgID0+ICdQMicsCiAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0ExJywKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJ1Byb2Nlc3NUaWNrZXRBY3Rpdml0eVNldCgpIChTZXQgQWN0aXZpdHlFbnRpdHlJRCBvbiBUaWNrZXQgd2l0aCBpbnZhbGlkIFByb2Nlc3NFbnRpdHlJRCknLAogICAgICAgICAgICBUZXN0VHlwZSA9PiAnRmFsc2UnLAogICAgICAgICAgICB9CiAgICB9LAoKICAgICMgUHJvY2Vzc1RpY2tldEFjdGl2aXR5U2V0IG9uIHZhbGlkIENvbmZpZwogICAgewogICAgICAgIFByb2Nlc3NUaWNrZXRBY3Rpdml0eVNldCA9PiB7CiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICAnUHJvY2VzcycgPT4gewogICAgICAgICAgICAgICAgICAgICdQMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdCb29rIE9yZGVycycsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgICAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgICAgICA9PiAnMTctMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgID0+ICdBY3RpdmUnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5ICAgICAgID0+ICdBMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHlEaWFsb2cgPT4gJ0FEMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ExJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QxJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0EyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMicgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQTInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDMnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ1Byb2Nlc3M6OkFjdGl2aXR5JyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ0ExJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdBY3Rpdml0eSAxIG9wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVRpbWUgICAgID0+ICcxNy0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQUQxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBRDInLAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgID0+ICdQMScsCiAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0ExJywKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJ1Byb2Nlc3NUaWNrZXRBY3Rpdml0eVNldCgpIChTZXQgQWN0aXZpdHlFbnRpdHlJRCBvbiBUaWNrZXQgd2l0aCB2YWxpZCBDb25maWcpJywKICAgICAgICAgICAgVGVzdFR5cGUgPT4gJ1RydWUnLAogICAgICAgICAgICB9CiAgICB9LAoKICAgICMgUHJvY2Vzc1RpY2tldFByb2Nlc3NTZXQgb24gaW52YWxpZCBDb25maWcKICAgIHsKICAgICAgICBQcm9jZXNzVGlja2V0UHJvY2Vzc1NldCA9PiB7CiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICAnUHJvY2VzcycgPT4gewogICAgICAgICAgICAgICAgICAgICdQMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdCb29rIE9yZGVycycsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgICAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgICAgICA9PiAnMTctMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgID0+ICdBY3RpdmUnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5ICAgICAgID0+ICdBMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHlEaWFsb2cgPT4gJ0FEMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ExJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QxJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0EyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMicgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQTInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDMnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJ1AxNycsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAnUHJvY2Vzc1RpY2tldFByb2Nlc3NTZXQoKSAoU2V0IFByb2Nlc3NFbnRpdHlJRCBvbiBUaWNrZXQgd2l0aCBpbnZhbGlkIFByb2Nlc3NFbnRpdHlJRCknLAogICAgICAgICAgICBUZXN0VHlwZSA9PiAnRmFsc2UnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgUHJvY2Vzc1RpY2tldFByb2Nlc3NTZXQgb24gaW52YWxpZCBUaWNrZXRJRAogICAgewogICAgICAgIFByb2Nlc3NUaWNrZXRQcm9jZXNzU2V0ID0+IHsKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgICdQcm9jZXNzJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1AxJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ0Jvb2sgT3JkZXJzJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgICAgICA9PiAnMTYtMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lICAgICAgICAgID0+ICcxNy0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgPT4gJ0FjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHkgICAgICAgPT4gJ0ExJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRBY3Rpdml0eURpYWxvZyA9PiAnQUQxJywKICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQTEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QyJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0EzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBMicgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMycgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAnUDEnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAnUHJvY2Vzc1RpY2tldFByb2Nlc3NTZXQoKSAoU2V0IFByb2Nlc3NFbnRpdHlJRCBvbiBUaWNrZXQgd2l0aCBpbnZhbGlkIFRpY2tldElEKScsCiAgICAgICAgICAgIFRlc3RUeXBlID0+ICdGYWxzZScsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBQcm9jZXNzVGlja2V0UHJvY2Vzc1NldCBvbiB2YWxpZCBDb25maWcKICAgIHsKICAgICAgICBQcm9jZXNzVGlja2V0UHJvY2Vzc1NldCA9PiB7CiAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICAnUHJvY2VzcycgPT4gewogICAgICAgICAgICAgICAgICAgICdQMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdCb29rIE9yZGVycycsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgICAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgICAgICA9PiAnMTctMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgID0+ICdBY3RpdmUnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5ICAgICAgID0+ICdBMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHlEaWFsb2cgPT4gJ0FEMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ExJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QxJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0EyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMicgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQTInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDMnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJ1AxJywKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICdQcm9jZXNzVGlja2V0UHJvY2Vzc1NldCgpIChTZXQgUHJvY2Vzc0VudGl0eUlEIG9uIFRpY2tldCB3aXRoIHZhbGlkIENvbmZpZyknLAogICAgICAgICAgICBUZXN0VHlwZSA9PiAnVHJ1ZScsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBUcmFuc2l0aW9uICsgUXVldWVNb3ZlIFRyYW5zaXRpb25BY3Rpb24gb24gbWF0Y2hpbmcgVHJhbnNpdGlvbiBjaGFuZ2UgQWN0aXZpdHlFbnRpdHlJRCBvbiBUaWNrZXQKICAgICMgYW5kIG1vdmUgaXQgdG8gUXVldWUxCiAgICB7CiAgICAgICAgUHJvY2Vzc1RyYW5zaXRpb24gPT4gewogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgJ1Byb2Nlc3M6OlRyYW5zaXRpb24nID0+IHsKICAgICAgICAgICAgICAgICAgICAnVDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUcmFuc2l0aW9uIDEnLAogICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZDEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICc5OTk5OTk5OTk5OTk5OTk5OTk5OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICdQcm9jZXNzIFVuaXR0ZXN0IFRlc3R0aWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlSUQgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnVDInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUcmFuc2l0aW9uIDInLAogICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZDEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgPT4gJ1Byb2Nlc3MgVW5pdHRlc3QgVGVzdHRpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVJRCAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdQcm9jZXNzJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1AxJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ0Jvb2sgT3JkZXJzJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgICAgICA9PiAnMTYtMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lICAgICAgICAgID0+ICcxNy0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgPT4gJ0FjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHkgICAgICAgPT4gJ0ExJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRBY3Rpdml0eURpYWxvZyA9PiAnQUQxJywKICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQTEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QyJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0EzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNpdGlvbkFjdGlvbiA9PiBbJ1RBMSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EyJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QzJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0E0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdQcm9jZXNzOjpBY3Rpdml0eScgPT4gewogICAgICAgICAgICAgICAgICAgICdBMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAnQWN0aXZpdHkgMSBvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgID0+ICcxNi0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lICAgICA9PiAnMTctMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2cgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FEMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQUQyJywKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdBMicgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAnQWN0aXZpdHkgMiBvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgID0+ICcxNi0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lICAgICA9PiAnMTctMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2cgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FEMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQUQyJywKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdBMycgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAnQWN0aXZpdHkgMyBvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgID0+ICcxNi0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lICAgICA9PiAnMTctMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2cgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FEMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQUQyJywKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdBNCcgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAnQWN0aXZpdHkgNCBvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgID0+ICcxNi0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lICAgICA9PiAnMTctMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2cgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FEMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQUQyJywKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdQcm9jZXNzOjpUcmFuc2l0aW9uQWN0aW9uJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1RBMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdRdWV1ZSBNb3ZlJywKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uQWN0aW9uOjpUaWNrZXRRdWV1ZVNldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZSA9PiAkUXVldWVEYXRhMXtOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnVEEyJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1F1ZXVlIE1vdmUnLAogICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGUgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlRyYW5zaXRpb25BY3Rpb246OlRpY2tldFF1ZXVlU2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXVlID0+ICRRdWV1ZURhdGEye05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdUQTMnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUXVldWUgTW92ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6VHJhbnNpdGlvbkFjdGlvbjo6VGlja2V0UXVldWVTZXQnLAogICAgICAgICAgICAgICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVldWUgPT4gJFF1ZXVlRGF0YTN7TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgID0+ICdQMScsCiAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0ExJywKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hlY2tPbmx5ICAgICAgICA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAnUHJvY2Vzc1RyYW5zaXRpb24oKSAobWF0Y2hpbmcgVHJhbnNpdGlvbiBjaGFuZ2UgQWN0aXZpdHlFbnRpdHlJRCBhbmQgQWN0aW9uIFF1ZXVlIE1vdmUgdG8gTWlzYyknLAogICAgICAgICAgICBUZXN0VHlwZSA9PiAnVHJ1ZScsCiAgICAgICAgICAgIH0KICAgIH0sCgogICAgIyBUcmFuc2l0aW9uICsgUXVldWVNb3ZlIFRyYW5zaXRpb25BY3Rpb24gb24gbWF0Y2hpbmcgVHJhbnNpdGlvbiBjaGFuZ2UgQWN0aXZpdHlFbnRpdHlJRCBvbiBUaWNrZXQgMQogICAgIyBiYWNrIHRvIEExIGFuZCBtb3ZlIGl0IGJhY2sgdG8gUXVldWUzCiAgICB7CiAgICAgICAgUHJvY2Vzc1RyYW5zaXRpb24gPT4gewogICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgJ1Byb2Nlc3M6OlRyYW5zaXRpb24nID0+IHsKICAgICAgICAgICAgICAgICAgICAnVDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUcmFuc2l0aW9uIDEnLAogICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZDEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICc5OTk5OTk5OTk5OTk5OTk5OTk5OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICdQcm9jZXNzIFVuaXR0ZXN0IFRlc3R0aWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlSUQgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnVDInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUcmFuc2l0aW9uIDInLAogICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZDEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgPT4gJ1Byb2Nlc3MgVW5pdHRlc3QgVGVzdHRpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVJRCAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdUNCcgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJ1RyYW5zaXRpb24gNCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kMSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICA9PiAnUHJvY2VzcyBVbml0dGVzdCBUZXN0dGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZUlEICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ1Byb2Nlc3MnID0+IHsKICAgICAgICAgICAgICAgICAgICAnUDEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnQm9vayBPcmRlcnMnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUaW1lICAgICAgICAgID0+ICcxNi0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVRpbWUgICAgICAgICAgPT4gJzE3LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgICAgICAgICAgICAgICA9PiAnQWN0aXZlJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRBY3Rpdml0eSAgICAgICA9PiAnQTEnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5RGlhbG9nID0+ICdBRDEnLAogICAgICAgICAgICAgICAgICAgICAgICBQYXRoICAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICdBMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2l0aW9uQWN0aW9uID0+IFsnVEExJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQTInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVDMnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EzJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Q0JyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0ExJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNpdGlvbkFjdGlvbiA9PiBbJ1RBMyddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ1Byb2Nlc3M6OkFjdGl2aXR5JyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ0ExJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdBY3Rpdml0eSAxIG9wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVRpbWUgICAgID0+ICcxNy0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQUQxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBRDInLAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ0EyJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdBY3Rpdml0eSAyIG9wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVRpbWUgICAgID0+ICcxNy0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQUQxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBRDInLAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ0EzJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdBY3Rpdml0eSAzIG9wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVRpbWUgICAgID0+ICcxNy0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQUQxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBRDInLAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ0E0JyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdBY3Rpdml0eSA0IG9wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVRpbWUgICAgID0+ICcxNy0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQUQxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBRDInLAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ1Byb2Nlc3M6OlRyYW5zaXRpb25BY3Rpb24nID0+IHsKICAgICAgICAgICAgICAgICAgICAnVEExJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1F1ZXVlIE1vdmUnLAogICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGUgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlRyYW5zaXRpb25BY3Rpb246OlRpY2tldFF1ZXVlU2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXVlID0+ICRRdWV1ZURhdGExe05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdUQTInID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUXVldWUgTW92ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6VHJhbnNpdGlvbkFjdGlvbjo6VGlja2V0UXVldWVTZXQnLAogICAgICAgICAgICAgICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVldWUgPT4gJFF1ZXVlRGF0YTJ7TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ1RBMycgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdRdWV1ZSBNb3ZlJywKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uQWN0aW9uOjpUaWNrZXRRdWV1ZVNldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZSA9PiAkUXVldWVEYXRhM3tOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCAgPT4gJ1AxJywKICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAnQTMnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDaGVja09ubHkgICAgICAgID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICdQcm9jZXNzVHJhbnNpdGlvbigpIChtYXRjaGluZyBUcmFuc2l0aW9uIGNoYW5nZSBBY3Rpdml0eUVudGl0eUlEIGFuZCBUcmFuc2l0aW9uQWN0aW9uIFF1ZXVlIE1vdmUgdG8gUmF3KScsCiAgICAgICAgICAgIFRlc3RUeXBlID0+ICdUcnVlJywKICAgICAgICAgICAgfQogICAgfSwKCiAjIFRyYW5zaXRpb24gKyBUaWNrZXRTZXJ2aWNlU2V0ICsgVGlja2V0U0xBU2V0IFRyYW5zaXRpb25BY3Rpb24gb24gbWF0Y2hpbmcgVHJhbnNpdGlvbiBjaGFuZ2UgU2VydmljZSBhbmQgU0xBIG9uIFRpY2tldAogICAgewogICAgICAgIFByb2Nlc3NUcmFuc2l0aW9uID0+IHsKICAgICAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgICAgICdQcm9jZXNzOjpUcmFuc2l0aW9uJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1QxJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVHJhbnNpdGlvbiAxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmQxID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICdQcm9jZXNzIFVuaXR0ZXN0IFRlc3R0aWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlSUQgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnUHJvY2VzcycgPT4gewogICAgICAgICAgICAgICAgICAgICdQMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdCb29rIE9yZGVycycsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgICAgICAgPT4gJzE2LTAyLTIwMTIgMTM6Mzc6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgICAgICA9PiAnMTctMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgID0+ICdBY3RpdmUnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydEFjdGl2aXR5ICAgICAgID0+ICdBMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QWN0aXZpdHlEaWFsb2cgPT4gJ0FEMScsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ExJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QxJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0EyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNpdGlvbkFjdGlvbiA9PiBbICdUQTEnLCAnVEEyJyBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EyJyA9PiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdQcm9jZXNzOjpBY3Rpdml0eScgPT4gewogICAgICAgICAgICAgICAgICAgICdBMScgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAnQWN0aXZpdHkgMSBvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgID0+ICcxNi0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lICAgICA9PiAnMTctMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2cgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FEMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQUQyJywKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdBMicgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAnQWN0aXZpdHkgMiBvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgID0+ICcxNi0wMi0yMDEyIDEzOjM3OjAwJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lICAgICA9PiAnMTctMDItMjAxMiAxMzozNzowMCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2cgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FEMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQUQyJywKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnUHJvY2Vzczo6VHJhbnNpdGlvbkFjdGlvbicgPT4gewogICAgICAgICAgICAgICAgICAgICdUQTEnID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU2VydmljZSBTZXQnLAogICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGUgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlRyYW5zaXRpb25BY3Rpb246OlRpY2tldFNlcnZpY2VTZXQnLAogICAgICAgICAgICAgICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ1RBMicgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTTEEgU2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uQWN0aW9uOjpUaWNrZXRTTEFTZXQnLAogICAgICAgICAgICAgICAgICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xBSUQgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgID0+ICdQMScsCiAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJ0ExJywKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hlY2tPbmx5ICAgICAgICA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAnUHJvY2Vzc1RyYW5zaXRpb24oKSAobWF0Y2hpbmcgVHJhbnNpdGlvbiBBY3Rpb25zIFNlcnZpY2UgU2V0IGFuZCBTTEEgU2V0KScsCiAgICAgICAgICAgIFRlc3RUeXBlICAgICAgID0+ICdUaWNrZXRWYWx1ZXMnLAogICAgICAgICAgICBFeHBlY3RlZFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgIFNMQUlEICAgICA9PiAkU0xBSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewogICAgaWYgKCAkVGVzdC0+e1Byb2Nlc3NUcmFuc2l0aW9ufSApIHsKCiAgICAgICAgIyBTZXQgQ29uZmlnCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFRlc3QtPntQcm9jZXNzVHJhbnNpdGlvbn0tPntDb25maWd9ICkgKSB7CiAgICAgICAgICAgIGZvciBteSAkQ29uZmlnICggc29ydCBrZXlzICV7ICRUZXN0LT57UHJvY2Vzc1RyYW5zaXRpb259LT57Q29uZmlnfSB9ICkgewogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+U2V0KAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4ge30sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+U2V0KAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFRlc3QtPntQcm9jZXNzVHJhbnNpdGlvbn0tPntDb25maWd9LT57JENvbmZpZ30sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIElmIHdlIGhhdmUgYSB0ZXN0IHdpdGggZGVidWcgb24sIHdlIG5lZWQgYSBuZXcgUHJvY2Vzc09iamVjdAogICAgICAgICMgd2l0aCBEZWJ1ZyB0dXJuZWQgb24KICAgICAgICBpZiAoICRUZXN0LT57UHJvY2Vzc1RyYW5zaXRpb259LT57RGVidWd9ICkgewogICAgICAgICAgICAkUHJvY2Vzc09iamVjdCA9IHVuZGVmOwogICAgICAgICAgICAkUHJvY2Vzc09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6UHJvY2Vzcy0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAlQ29tbW9uT2JqZWN0LAogICAgICAgICAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgICAgPT4gJFRlc3QtPntQcm9jZXNzVHJhbnNpdGlvbn0tPntEZWJ1Z30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGV4Y3VzZSBwcm9jZXNzIG9iamVjdCBjYWxsCiAgICAgICAgbXkgJFJlc3VsdCA9ICRQcm9jZXNzT2JqZWN0LT5Qcm9jZXNzVHJhbnNpdGlvbiggJXsgJFRlc3QtPntQcm9jZXNzVHJhbnNpdGlvbn0gfSApOwoKICAgICAgICBpZiAoICRUZXN0LT57UHJvY2Vzc1RyYW5zaXRpb259LT57VGVzdFR5cGV9IGVxICdGYWxzZScgKSB7CgogICAgICAgICAgICAjIFByb2Nlc3NUcmFuc2l0aW9uIC0gQ2hlY2sgb24gRmFsc2UKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgICAgICRUZXN0LT57UHJvY2Vzc1RyYW5zaXRpb259LT57TWVzc2FnZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFRlc3QtPntQcm9jZXNzVHJhbnNpdGlvbn0tPntUZXN0VHlwZX0gZXEgJ1RydWUnICkgewoKICAgICAgICAgICAgIyBQcm9jZXNzVHJhbnNpdGlvbiAtIENoZWNrIG9uIFRydWUKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkUmVzdWx0LAogICAgICAgICAgICAgICAgJFRlc3QtPntQcm9jZXNzVHJhbnNpdGlvbn0tPntNZXNzYWdlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkVGVzdC0+e1Byb2Nlc3NUcmFuc2l0aW9ufS0+e1Rlc3RUeXBlfSBlcSAnUmVzdWx0JyApIHsKICAgICAgICAgICAgbXkgJEV4cGVjdGVkUmVzdWx0ID0gJFRlc3QtPntQcm9jZXNzVHJhbnNpdGlvbn0tPntSZXN1bHR9OwoKICAgICAgICAgICAgIyBQcm9jZXNzVHJhbnNpdGlvbiAtIENoZWNrIGdpdmVuIGFuZCBleHBlY3RlZCByZXN1bHQKICAgICAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgICAgICRFeHBlY3RlZFJlc3VsdCwKICAgICAgICAgICAgICAgICRUZXN0LT57UHJvY2Vzc1RyYW5zaXRpb259LT57TWVzc2FnZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFRlc3QtPntQcm9jZXNzVHJhbnNpdGlvbn0tPntUZXN0VHlwZX0gZXEgJ1RpY2tldFZhbHVlcycgKSB7CgogICAgICAgICAgICAjIFByb2Nlc3NUcm5zaXRpb24gLSBDaGVjayB0aWNrZXQgdmFsdWVzIGFmdGVyIGFsbCB0cmFuc2l0aW9uIGFjdGlvbnMKICAgICAgICAgICAgbXkgJVRpY2tldCA9ICRDb21tb25PYmplY3R7VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIHNvcnQga2V5cyAleyAkVGVzdC0+e1Byb2Nlc3NUcmFuc2l0aW9ufS0+e0V4cGVjdGVkUmVzdWx0fSB9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7JEF0dHJpYnV0ZX0gLy8gJycsCiAgICAgICAgICAgICAgICAgICAgJFRlc3QtPntQcm9jZXNzVHJhbnNpdGlvbn0tPntFeHBlY3RlZFJlc3VsdH0tPnskQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICAgICAiJFRlc3QtPntQcm9jZXNzVHJhbnNpdGlvbn0tPntNZXNzYWdlfSAtIFRpY2tldCAkQXR0cmlidXRlIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgSWYgd2UgaGFkIGEgdGVzdCB3aXRoIGRlYnVnIG9uLCByZXN0b3JlIFByb2Nlc3NPYmplY3QgdG8gZGVmYXVsdAogICAgICAgIGlmICggJFRlc3QtPntQcm9jZXNzVHJhbnNpdGlvbn0tPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICRQcm9jZXNzT2JqZWN0ID0gdW5kZWY7CiAgICAgICAgICAgICRQcm9jZXNzT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpQcm9jZXNzLT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICVDb21tb25PYmplY3QsCiAgICAgICAgICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRUZXN0LT57UHJvY2Vzc1RpY2tldFByb2Nlc3NTZXR9ICkgewoKICAgICAgICAjIFNldCBDb25maWcKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkVGVzdC0+e1Byb2Nlc3NUaWNrZXRQcm9jZXNzU2V0fS0+e0NvbmZpZ30gKSApIHsKICAgICAgICAgICAgZm9yIG15ICRDb25maWcgKCBzb3J0IGtleXMgJXsgJFRlc3QtPntQcm9jZXNzVGlja2V0UHJvY2Vzc1NldH0tPntDb25maWd9IH0gKSB7CiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJENvbmZpZywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiB7fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJENvbmZpZywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVGVzdC0+e1Byb2Nlc3NUaWNrZXRQcm9jZXNzU2V0fS0+e0NvbmZpZ30tPnskQ29uZmlnfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgSWYgd2UgaGF2ZSBhIHRlc3Qgd2l0aCBkZWJ1ZyBvbiwgd2UgbmVlZCBhIG5ldyBQcm9jZXNzT2JqZWN0CiAgICAgICAgIyB3aXRoIERlYnVnIHR1cm5lZCBvbgogICAgICAgIGlmICggJFRlc3QtPntQcm9jZXNzVGlja2V0UHJvY2Vzc1NldH0tPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICRQcm9jZXNzT2JqZWN0ID0gdW5kZWY7CiAgICAgICAgICAgICRQcm9jZXNzT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpQcm9jZXNzLT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICVDb21tb25PYmplY3QsCiAgICAgICAgICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICAgICAgICAgIERlYnVnICAgICAgICA9PiAkVGVzdC0+e1Byb2Nlc3NUaWNrZXRQcm9jZXNzU2V0fS0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZXhlY3V0ZSBwcm9jZXNzIG9iamVjdCBjYWxsCiAgICAgICAgbXkgJFJlc3VsdCA9ICRQcm9jZXNzT2JqZWN0LT5Qcm9jZXNzVGlja2V0UHJvY2Vzc1NldCggJXsgJFRlc3QtPntQcm9jZXNzVGlja2V0UHJvY2Vzc1NldH0gfSApOwoKICAgICAgICBpZiAoICRUZXN0LT57UHJvY2Vzc1RpY2tldFByb2Nlc3NTZXR9LT57VGVzdFR5cGV9IGVxICdGYWxzZScgKSB7CgogICAgICAgICAgICAjIFByb2Nlc3NUaWNrZXRQcm9jZXNzU2V0IC0gQ2hlY2sgb24gRmFsc2UKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgICAgICRUZXN0LT57UHJvY2Vzc1RpY2tldFByb2Nlc3NTZXR9LT57TWVzc2FnZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFRlc3QtPntQcm9jZXNzVGlja2V0UHJvY2Vzc1NldH0tPntUZXN0VHlwZX0gZXEgJ1RydWUnICkgewoKICAgICAgICAgICAgIyBQcm9jZXNzVGlja2V0UHJvY2Vzc1NldCAtIENoZWNrIG9uIFRydWUKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkUmVzdWx0LAogICAgICAgICAgICAgICAgJFRlc3QtPntQcm9jZXNzVGlja2V0UHJvY2Vzc1NldH0tPntNZXNzYWdlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgSWYgd2UgaGFkIGEgdGVzdCB3aXRoIGRlYnVnIG9uLCByZXN0b3JlIFByb2Nlc3NPYmplY3QgdG8gZGVmYXVsdAogICAgICAgIGlmICggJFRlc3QtPntQcm9jZXNzVGlja2V0UHJvY2Vzc1NldH0tPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICRQcm9jZXNzT2JqZWN0ID0gdW5kZWY7CiAgICAgICAgICAgICRQcm9jZXNzT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpQcm9jZXNzLT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICVDb21tb25PYmplY3QsCiAgICAgICAgICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRUZXN0LT57UHJvY2Vzc1RpY2tldEFjdGl2aXR5U2V0fSApIHsKCiAgICAgICAgIyBTZXQgQ29uZmlnCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFRlc3QtPntQcm9jZXNzVGlja2V0QWN0aXZpdHlTZXR9LT57Q29uZmlnfSApICkgewogICAgICAgICAgICBmb3IgbXkgJENvbmZpZyAoIHNvcnQga2V5cyAleyAkVGVzdC0+e1Byb2Nlc3NUaWNrZXRBY3Rpdml0eVNldH0tPntDb25maWd9IH0gKSB7CiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJENvbmZpZywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiB7fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJENvbmZpZywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVGVzdC0+e1Byb2Nlc3NUaWNrZXRBY3Rpdml0eVNldH0tPntDb25maWd9LT57JENvbmZpZ30sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIElmIHdlIGhhdmUgYSB0ZXN0IHdpdGggZGVidWcgb24sIHdlIG5lZWQgYSBuZXcgUHJvY2Vzc09iamVjdAogICAgICAgICMgd2l0aCBEZWJ1ZyB0dXJuZWQgb24KICAgICAgICBpZiAoICRUZXN0LT57UHJvY2Vzc1RpY2tldEFjdGl2aXR5U2V0fS0+e0RlYnVnfSApIHsKICAgICAgICAgICAgJFByb2Nlc3NPYmplY3QgPSB1bmRlZjsKICAgICAgICAgICAgJFByb2Nlc3NPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlByb2Nlc3MtPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgJUNvbW1vbk9iamVjdCwKICAgICAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgICAgICAgICAgRGVidWcgICAgICAgID0+ICRUZXN0LT57UHJvY2Vzc1RpY2tldEFjdGl2aXR5U2V0fS0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZXhlY3V0ZSBwcm9jZXNzIG9iamVjdCBjYWxsCiAgICAgICAgbXkgJFJlc3VsdCA9ICRQcm9jZXNzT2JqZWN0LT5Qcm9jZXNzVGlja2V0QWN0aXZpdHlTZXQoICV7ICRUZXN0LT57UHJvY2Vzc1RpY2tldEFjdGl2aXR5U2V0fSB9ICk7CgogICAgICAgIGlmICggJFRlc3QtPntQcm9jZXNzVGlja2V0QWN0aXZpdHlTZXR9LT57VGVzdFR5cGV9IGVxICdGYWxzZScgKSB7CgogICAgICAgICAgICAjIFByb2Nlc3NUaWNrZXRBY3Rpdml0eVNldCAtIENoZWNrIG9uIEZhbHNlCiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICAgICAkVGVzdC0+e1Byb2Nlc3NUaWNrZXRBY3Rpdml0eVNldH0tPntNZXNzYWdlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkVGVzdC0+e1Byb2Nlc3NUaWNrZXRBY3Rpdml0eVNldH0tPntUZXN0VHlwZX0gZXEgJ1RydWUnICkgewoKICAgICAgICAgICAgIyBQcm9jZXNzVGlja2V0QWN0aXZpdHlTZXQgLSBDaGVjayBvbiBUcnVlCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgICAgICRUZXN0LT57UHJvY2Vzc1RpY2tldEFjdGl2aXR5U2V0fS0+e01lc3NhZ2V9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBJZiB3ZSBoYWQgYSB0ZXN0IHdpdGggZGVidWcgb24sIHJlc3RvcmUgUHJvY2Vzc09iamVjdCB0byBkZWZhdWx0CiAgICAgICAgaWYgKCAkVGVzdC0+e1Byb2Nlc3NUaWNrZXRBY3Rpdml0eVNldH0tPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICRQcm9jZXNzT2JqZWN0ID0gdW5kZWY7CiAgICAgICAgICAgICRQcm9jZXNzT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpQcm9jZXNzLT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICVDb21tb25PYmplY3QsCiAgICAgICAgICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRUZXN0LT57UHJvY2Vzc0xpc3R9ICkgewoKICAgICAgICAjIFNldCBDb25maWcKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkVGVzdC0+e1Byb2Nlc3NMaXN0fS0+e0NvbmZpZ30gKSApIHsKICAgICAgICAgICAgZm9yIG15ICRDb25maWcgKCBzb3J0IGtleXMgJXsgJFRlc3QtPntQcm9jZXNzTGlzdH0tPntDb25maWd9IH0gKSB7CiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJENvbmZpZywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiB7fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJENvbmZpZywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVGVzdC0+e1Byb2Nlc3NMaXN0fS0+e0NvbmZpZ30tPnskQ29uZmlnfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgSWYgd2UgaGF2ZSBhIHRlc3Qgd2l0aCBkZWJ1ZyBvbiwgd2UgbmVlZCBhIG5ldyBQcm9jZXNzT2JqZWN0CiAgICAgICAgIyB3aXRoIERlYnVnIHR1cm5lZCBvbgogICAgICAgIGlmICggJFRlc3QtPntQcm9jZXNzTGlzdH0tPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICRQcm9jZXNzT2JqZWN0ID0gdW5kZWY7CiAgICAgICAgICAgICRQcm9jZXNzT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpQcm9jZXNzLT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICVDb21tb25PYmplY3QsCiAgICAgICAgICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICAgICAgICAgIERlYnVnICAgICAgICA9PiAkVGVzdC0+e1Byb2Nlc3NMaXN0fS0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZXhlY3V0ZSBwcm9jZXNzIG9iamVjdCBjYWxsCiAgICAgICAgbXkgJFJlc3VsdCA9ICRQcm9jZXNzT2JqZWN0LT5Qcm9jZXNzTGlzdCggJXsgJFRlc3QtPntQcm9jZXNzTGlzdH0gfSApOwoKICAgICAgICBpZiAoICRUZXN0LT57UHJvY2Vzc0xpc3R9LT57VGVzdFR5cGV9IGVxICdGYWxzZScgKSB7CgogICAgICAgICAgICAjIFByb2Nlc3NMaXN0IC0gQ2hlY2sgb24gRmFsc2UKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgICAgICRUZXN0LT57UHJvY2Vzc0xpc3R9LT57TWVzc2FnZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFRlc3QtPntQcm9jZXNzTGlzdH0tPntUZXN0VHlwZX0gZXEgJ1RydWUnICkgewoKICAgICAgICAgICAgIyBQcm9jZXNzTGlzdCAtIENoZWNrIG9uIFRydWUKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkUmVzdWx0LAogICAgICAgICAgICAgICAgJFRlc3QtPntQcm9jZXNzTGlzdH0tPntNZXNzYWdlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkVGVzdC0+e1Byb2Nlc3NMaXN0fS0+e1Rlc3RUeXBlfSBlcSAnUmVzdWx0JyApIHsKICAgICAgICAgICAgbXkgJEV4cGVjdGVkUmVzdWx0ID0gJFRlc3QtPntQcm9jZXNzTGlzdH0tPntSZXN1bHR9OwoKICAgICAgICAgICAgIyBQcm9jZXNzTGlzdCAtIENoZWNrIGdpdmVuIGFuZCBleHBlY3RlZCByZXN1bHQKICAgICAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgICAgICRFeHBlY3RlZFJlc3VsdCwKICAgICAgICAgICAgICAgICRUZXN0LT57UHJvY2Vzc0xpc3R9LT57TWVzc2FnZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIElmIHdlIGhhZCBhIHRlc3Qgd2l0aCBkZWJ1ZyBvbiwgcmVzdG9yZSBQcm9jZXNzT2JqZWN0IHRvIGRlZmF1bHQKICAgICAgICBpZiAoICRUZXN0LT57UHJvY2Vzc0xpc3R9LT57RGVidWd9ICkgewogICAgICAgICAgICAkUHJvY2Vzc09iamVjdCA9IHVuZGVmOwogICAgICAgICAgICAkUHJvY2Vzc09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6UHJvY2Vzcy0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAlQ29tbW9uT2JqZWN0LAogICAgICAgICAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkVGVzdC0+e1Byb2Nlc3NHZXR9ICkgewoKICAgICAgICAjIFNldCBDb25maWcKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkVGVzdC0+e1Byb2Nlc3NHZXR9LT57Q29uZmlnfSApICkgewogICAgICAgICAgICBmb3IgbXkgJENvbmZpZyAoIHNvcnQga2V5cyAleyAkVGVzdC0+e1Byb2Nlc3NHZXR9LT57Q29uZmlnfSB9ICkgewogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+U2V0KAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4ge30sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+U2V0KAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFRlc3QtPntQcm9jZXNzR2V0fS0+e0NvbmZpZ30tPnskQ29uZmlnfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgSWYgd2UgaGF2ZSBhIHRlc3Qgd2l0aCBkZWJ1ZyBvbiwgd2UgbmVlZCBhIG5ldyBQcm9jZXNzT2JqZWN0CiAgICAgICAgIyB3aXRoIERlYnVnIHR1cm5lZCBvbgogICAgICAgIGlmICggJFRlc3QtPntQcm9jZXNzR2V0fS0+e0RlYnVnfSApIHsKICAgICAgICAgICAgJFByb2Nlc3NPYmplY3QgPSB1bmRlZjsKICAgICAgICAgICAgJFByb2Nlc3NPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlByb2Nlc3MtPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgJUNvbW1vbk9iamVjdCwKICAgICAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgICAgICAgICAgRGVidWcgICAgICAgID0+ICRUZXN0LT57UHJvY2Vzc0dldH0tPntEZWJ1Z30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGV4ZWN1dGUgcHJvY2VzcyBvYmplY3QgY2FsbAogICAgICAgIG15ICRSZXN1bHQgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc0dldCggJXsgJFRlc3QtPntQcm9jZXNzR2V0fSB9ICk7CgogICAgICAgIGlmICggJFRlc3QtPntQcm9jZXNzR2V0fS0+e1Rlc3RUeXBlfSBlcSAnRmFsc2UnICkgewoKICAgICAgICAgICAgIyBQcm9jZXNzR2V0IC0gQ2hlY2sgb24gRmFsc2UKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgICAgICRUZXN0LT57UHJvY2Vzc0dldH0tPntNZXNzYWdlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkVGVzdC0+e1Byb2Nlc3NHZXR9LT57VGVzdFR5cGV9IGVxICdUcnVlJyApIHsKCiAgICAgICAgICAgICMgUHJvY2Vzc0dldCAtIENoZWNrIG9uIFRydWUKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkUmVzdWx0LAogICAgICAgICAgICAgICAgJFRlc3QtPntQcm9jZXNzR2V0fS0+e01lc3NhZ2V9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRUZXN0LT57UHJvY2Vzc0dldH0tPntUZXN0VHlwZX0gZXEgJ1Jlc3VsdCcgKSB7CiAgICAgICAgICAgIG15ICRFeHBlY3RlZFJlc3VsdCA9ICRUZXN0LT57UHJvY2Vzc0dldH0tPntSZXN1bHR9OwoKICAgICAgICAgICAgIyBQcm9jZXNzR2V0IC0gQ2hlY2sgZ2l2ZW4gYW5kIGV4cGVjdGVkIHJlc3VsdAogICAgICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgICAgICAkUmVzdWx0LAogICAgICAgICAgICAgICAgJEV4cGVjdGVkUmVzdWx0LAogICAgICAgICAgICAgICAgJFRlc3QtPntQcm9jZXNzR2V0fS0+e01lc3NhZ2V9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBJZiB3ZSBoYWQgYSB0ZXN0IHdpdGggZGVidWcgb24sIHJlc3RvcmUgUHJvY2Vzc09iamVjdCB0byBkZWZhdWx0CiAgICAgICAgaWYgKCAkVGVzdC0+e1Byb2Nlc3NMaXN0fS0+e0RlYnVnfSApIHsKICAgICAgICAgICAgJFByb2Nlc3NPYmplY3QgPSB1bmRlZjsKICAgICAgICAgICAgJFByb2Nlc3NPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlByb2Nlc3MtPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgJUNvbW1vbk9iamVjdCwKICAgICAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFRlc3QtPntQcm9jZXNzU3RhcnRwb2ludEdldH0gKSB7CgogICAgICAgICMgU2V0IENvbmZpZwogICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRUZXN0LT57UHJvY2Vzc1N0YXJ0cG9pbnRHZXR9LT57Q29uZmlnfSApICkgewogICAgICAgICAgICBmb3IgbXkgJENvbmZpZyAoIHNvcnQga2V5cyAleyAkVGVzdC0+e1Byb2Nlc3NTdGFydHBvaW50R2V0fS0+e0NvbmZpZ30gfSApIHsKICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPlNldCgKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+IHt9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPlNldCgKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRUZXN0LT57UHJvY2Vzc1N0YXJ0cG9pbnRHZXR9LT57Q29uZmlnfS0+eyRDb25maWd9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBJZiB3ZSBoYXZlIGEgdGVzdCB3aXRoIGRlYnVnIG9uLCB3ZSBuZWVkIGEgbmV3IFByb2Nlc3NPYmplY3QKICAgICAgICAjIHdpdGggRGVidWcgdHVybmVkIG9uCiAgICAgICAgaWYgKCAkVGVzdC0+e1Byb2Nlc3NTdGFydHBvaW50R2V0fS0+e0RlYnVnfSApIHsKICAgICAgICAgICAgJFByb2Nlc3NPYmplY3QgPSB1bmRlZjsKICAgICAgICAgICAgJFByb2Nlc3NPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlByb2Nlc3MtPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgJUNvbW1vbk9iamVjdCwKICAgICAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgICAgICAgICAgRGVidWcgICAgICAgID0+ICRUZXN0LT57UHJvY2Vzc1N0YXJ0cG9pbnRHZXR9LT57RGVidWd9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBleGVjdXRlIHByb2Nlc3Mgb2JqZWN0IGNhbGwKICAgICAgICBteSAkUmVzdWx0ID0gJFByb2Nlc3NPYmplY3QtPlByb2Nlc3NTdGFydHBvaW50R2V0KCAleyAkVGVzdC0+e1Byb2Nlc3NTdGFydHBvaW50R2V0fSB9ICk7CgogICAgICAgIGlmICggJFRlc3QtPntQcm9jZXNzU3RhcnRwb2ludEdldH0tPntUZXN0VHlwZX0gZXEgJ0ZhbHNlJyApIHsKCiAgICAgICAgICAgICMgUHJvY2Vzc1N0YXJ0cG9pbnRHZXQgLSBDaGVjayBvbiBGYWxzZQogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkUmVzdWx0LAogICAgICAgICAgICAgICAgJFRlc3QtPntQcm9jZXNzU3RhcnRwb2ludEdldH0tPntNZXNzYWdlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkVGVzdC0+e1Byb2Nlc3NTdGFydHBvaW50R2V0fS0+e1Rlc3RUeXBlfSBlcSAnVHJ1ZScgKSB7CgogICAgICAgICAgICAjIFByb2Nlc3NTdGFydHBvaW50R2V0IC0gQ2hlY2sgb24gVHJ1ZQogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICAgICAkVGVzdC0+e1Byb2Nlc3NTdGFydHBvaW50R2V0fS0+e01lc3NhZ2V9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBJZiB3ZSBoYWQgYSB0ZXN0IHdpdGggZGVidWcgb24sIHJlc3RvcmUgUHJvY2Vzc09iamVjdCB0byBkZWZhdWx0CiAgICAgICAgaWYgKCAkVGVzdC0+e1Byb2Nlc3NTdGFydHBvaW50R2V0fS0+e0RlYnVnfSApIHsKICAgICAgICAgICAgJFByb2Nlc3NPYmplY3QgPSB1bmRlZjsKICAgICAgICAgICAgJFByb2Nlc3NPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlByb2Nlc3MtPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgJUNvbW1vbk9iamVjdCwKICAgICAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KfQoKIyBjbGVhbnVwIGlzIGRvbmUgYnkgUmVzdG9yZURhdGFiYXNlCgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA0ZmUyMThiZWNjZGI5MjZhMjlkZDdiZWQ5ZGU0ODIxMTQzMGQ2OWQwIC0gc2NyaXB0cy90ZXN0L1N0YXRzL1RpY2tldFNvbHV0aW9uUmVzcG9uc2VUaW1lR2V0U3RhdEVsZW1lbnQudAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlICA9PiAxLAogICAgICAgIFVzZVRtcEFydGljbGVEaXIgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKbXkgJER5bmFtaWNGaWVsZE9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwpteSAkQmFja2VuZE9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7Cm15ICRUaWNrZXRPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKbXkgJEFydGljbGVPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwpteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckNoYW5uZWwoIENoYW5uZWxOYW1lID0+ICdJbnRlcm5hbCcgKTsKbXkgJFNlcnZpY2VPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKTsKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQoKIyBnZXQgdGhlIGxpc3Qgb2Ygc2VydmljZSB0eXBlcyBmcm9tIGdlbmVyYWwgY2F0YWxvZwpteSAkU2VydmljZVR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAopOwoKIyBidWlsZCBhIGxvb2t1cCBoYXNoCm15ICVTZXJ2aWNlVHlwZU5hbWUySUQgPSByZXZlcnNlICV7ICRTZXJ2aWNlVHlwZUxpc3QgfTsKCiMgZ2V0IHRoZSBsaXN0IG9mIHNsYSB0eXBlcyBmcm9tIGdlbmVyYWwgY2F0YWxvZwpteSAkU0xBVHlwZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICBDbGFzcyA9PiAnSVRTTTo6U0xBOjpUeXBlJywKKTsKCiMgYnVpbGQgYSBsb29rdXAgaGFzaApteSAlU0xBVHlwZU5hbWUySUQgPSByZXZlcnNlICV7ICRTTEFUeXBlTGlzdCB9OwojIC0tLQoKIyBFbmFibGUgU2VydmljZS4KJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgIEtleSAgID0+ICdUaWNrZXQ6OlNlcnZpY2UnLAogICAgVmFsdWUgPT4gMSwKKTsKCiMgVXNlIGEgY2FsZW5kYXIgd2l0aCB0aGUgc2FtZSBidXNpbmVzcyBob3VycyBmb3IgZXZlcnkgZGF5IHNvIHRoYXQgdGhlIFVUIHJ1bnMgY29ycmVjdGx5CiMgICBvbiBldmVyeSBkYXkgb2YgdGhlIHdlZWsgYW5kIG91dHNpZGUgdXN1YWwgYnVzaW5lc3MgaG91cnMuCiRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICBLZXkgICA9PiAnVGltZVdvcmtpbmdIb3Vyczo6Q2FsZW5kYXIxJywKICAgIFZhbHVlID0+IHsKICAgICAgICBtYXAgeyAkXyA9PiBbIDAgLi4gMjMgXSB9IHF3KCBNb24gVHVlIFdlZCBUaHUgRnJpIFNhdCBTdW4gKSwKICAgIH0sCik7CgojIERpc2FibGUgZGVmYXVsdCBWYWNhdGlvbiBkYXlzLgokSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgS2V5ICAgPT4gJ1RpbWVWYWNhdGlvbkRheXM6OkNhbGVuZGFyMScsCiAgICBWYWx1ZSA9PiB7fSwKKTsKCiMgU2V0IGZpeGVkIHRpbWUuCiRIZWxwZXItPkZpeGVkVGltZVNldCgpOwoKbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tTnVtYmVyKCk7CgojIENyZWF0ZSBhIHRlc3QgY3VzdG9tZXIuCm15ICRUZXN0VXNlckN1c3RvbWVyID0gJEhlbHBlci0+VGVzdEN1c3RvbWVyVXNlckNyZWF0ZSgpOwoKIyBDcmVhdGUgYSBkeW5hbWljIGZpZWxkLgpteSAkRHluYW1pY0ZpZWxkTmFtZSA9ICJUZXN0REYkUmFuZG9tSUQiOwpteSAkRmllbGRJRCAgICAgICAgICA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEFkZCgKICAgIE5hbWUgICAgICAgPT4gJER5bmFtaWNGaWVsZE5hbWUsCiAgICBGaWVsZE9yZGVyID0+IDk5OTIsCiAgICBGaWVsZFR5cGUgID0+ICdEcm9wZG93bicsCiAgICBDb25maWcgICAgID0+IHsKICAgICAgICBEZWZhdWx0VmFsdWUgICA9PiAnRGVmYXVsdCcsCiAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gewogICAgICAgICAgICBJdGVtMSA9PiAnVmFsdWUxJywKICAgICAgICAgICAgaXRlbTIgPT4gJ1ZhbHVlMicsCiAgICAgICAgfSwKICAgIH0sCiAgICBMYWJlbCAgICAgID0+ICREeW5hbWljRmllbGROYW1lLAogICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgIFZhbGlkSUQgICAgPT4gMSwKICAgIFVzZXJJRCAgICAgPT4gMSwKICAgIFJlb3JkZXIgICAgPT4gMCwKKTsKJFNlbGYtPlRydWUoCiAgICAkRmllbGRJRCwKICAgICJEeW5hbWljRmllbGRBZGQoKSBzdWNjZXNzZnVsIGZvciBGaWVsZCBJRCAkRmllbGRJRCIsCik7CgojIEFkZCB0ZXN0IFNlcnZpY2UuCm15ICRTZXJ2aWNlSUQgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUFkZCgKICAgIE5hbWUgICAgPT4gIlRlc3RTZXJ2aWNlIC0gIiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCksCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgIFR5cGVJRCAgICAgID0+ICRTZXJ2aWNlVHlwZU5hbWUySUR7VHJhaW5pbmd9LAogICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKIyAtLS0KICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKJFNlbGYtPlRydWUoCiAgICAkU2VydmljZUlELAogICAgIlNlcnZpY2UgJFNlcnZpY2VJRCBoYXMgYmVlbiBjcmVhdGVkLiIsCik7CgojIEFkZCBzZXJ2aWNlIGZvciB0aGUgdGVzdCBjdXN0b21lci4KJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkVGVzdFVzZXJDdXN0b21lciwKICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlSUQsCiAgICBBY3RpdmUgICAgICAgICAgICA9PiAxLAogICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKKTsKCiMgQWRkIHRlc3QgU0xBLgpteSAkU0xBSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyktPlNMQUFkZCgKICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gIlRlc3RTTEEgLSAiIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKSwKICAgIFNlcnZpY2VJRHMgICAgICAgICAgPT4gWyRTZXJ2aWNlSURdLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICBUeXBlSUQgPT4gJFNMQVR5cGVOYW1lMklEe090aGVyfSwKIyAtLS0KICAgIEZpcnN0UmVzcG9uc2VUaW1lICAgPT4gNSwKICAgIEZpcnN0UmVzcG9uc2VOb3RpZnkgPT4gNjAsCiAgICBVcGRhdGVUaW1lICAgICAgICAgID0+IDEwLAogICAgVXBkYXRlTm90aWZ5ICAgICAgICA9PiA4MCwKICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gMTUsCiAgICBTb2x1dGlvbk5vdGlmeSAgICAgID0+IDgwLAogICAgQ2FsZW5kYXIgICAgICAgICAgICA9PiAxLAogICAgVmFsaWRJRCAgICAgICAgICAgICA9PiAxLAogICAgVXNlcklEICAgICAgICAgICAgICA9PiAxLAopOwokU2VsZi0+VHJ1ZSgKICAgICRTTEFJRCwKICAgICJTTEEgJFNMQUlEIGhhcyBiZWVuIGNyZWF0ZWQuIiwKKTsKCmZvciBteSAkSXRlbSAoIDEgLi4gNSApIHsKCiAgICBteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCiAgICAgICAgVGl0bGUgICAgICAgID0+ICdUaWNrZXQgT25lIFRpdGxlJywKICAgICAgICBRdWV1ZSAgICAgICAgPT4gJ1JhdycsCiAgICAgICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgIFByaW9yaXR5ICAgICA9PiAnMyBub3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnbmV3JywKICAgICAgICBTZXJ2aWNlSUQgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICBTTEFJRCAgICAgICAgPT4gJFNMQUlELAogICAgICAgIEN1c3RvbWVySUQgICA9PiAkVGVzdFVzZXJDdXN0b21lciwKICAgICAgICBDdXN0b21lclVzZXIgPT4gJFRlc3RVc2VyQ3VzdG9tZXIsCiAgICAgICAgT3duZXJJRCAgICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRUaWNrZXRJRCwKICAgICAgICAiVGlja2V0Q3JlYXRlKCkgc3VjY2Vzc2Z1bCBmb3IgVGlja2V0IE9uZSBJRCAkVGlja2V0SUQiLAogICAgKTsKCiAgICBteSAkVGVzdEZpZWxkQ29uZmlnID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgIElEID0+ICRGaWVsZElELAogICAgKTsKCiAgICAkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRUZXN0RmllbGRDb25maWcsCiAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJ0l0ZW0xJywKICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gMSwKICAgICk7CgogICAgJEhlbHBlci0+Rml4ZWRUaW1lQWRkU2Vjb25kcyggMiAqICRJdGVtICogNjAgKTsKCiAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN0YXRlU2V0KAogICAgICAgIFN0YXRlSUQgICAgICAgICAgICA9PiA0LAogICAgICAgIFRpY2tldElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgU2VuZE5vTm90aWZpY2F0aW9uID0+IDAsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+IDEsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgIlRpY2tldFN0YXRlU2V0KCkgc3VjY2Vzc2Z1bCBzZXQgc3RhdGUgJ29wZW4nIGZvciB0aWNrZXQgJFRpY2tldElEIiwKICAgICk7CgogICAgbXkgJEFydGljbGVJRCA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwKICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICA9PiAnYWdlbnQnLAogICAgICAgIEZyb20gICAgICAgICAgICAgICAgID0+ICdBZ2VudCBTb21lIEFnZW50IFNvbWUgQWdlbnQgPGVtYWlsQGV4YW1wbGUuY29tPicsCiAgICAgICAgVG8gICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbWVyIEEgPGN1c3RvbWVyLWFAZXhhbXBsZS5jb20+JywKICAgICAgICBDYyAgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tZXIgQiA8Y3VzdG9tZXItYkBleGFtcGxlLmNvbT4nLAogICAgICAgIFJlcGx5VG8gICAgICAgICAgICAgID0+ICdDdXN0b21lciBCIDxjdXN0b21lci1iQGV4YW1wbGUuY29tPicsCiAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJ3NvbWUgc2hvcnQgZGVzY3JpcHRpb24nLAogICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICd0aGUgbWVzc2FnZSB0ZXh0IFBlcmwgbW9kdWxlcyBwcm92aWRlIGEgcmFuZ2Ugb2YnLAogICAgICAgIENvbnRlbnRUeXBlICAgICAgICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTE1JywKICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAnT3duZXJVcGRhdGUnLAogICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgID0+ICdTb21lIGZyZWUgdGV4dCEnLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgTm9BZ2VudE5vdGlmeSAgICAgICAgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSggJEFydGljbGVJRCwgIkFydGljbGVDcmVhdGUoKSBDcmVhdGVkIGFydGljbGUgJEFydGljbGVJRCIgKTsKCiAgICAkSGVscGVyLT5GaXhlZFRpbWVBZGRTZWNvbmRzKCAkSXRlbSAqIDYwICk7CgogICAgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdGF0ZVNldCgKICAgICAgICBTdGF0ZUlEICAgICAgICAgICAgPT4gMiwKICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgIFNlbmROb05vdGlmaWNhdGlvbiA9PiAwLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVGlja2V0U3RhdGVTZXQoKSBzdWNjZXNzZnVsIHNldCBzdGF0ZSAnY2xvc2Ugc3VjY2Vzc2Z1bCcgZm9yIHRpY2tldCAkVGlja2V0SUQiLAogICAgKTsKCn0KCm15IEBUZXN0cyA9ICgKICAgIHsKICAgICAgICBLaW5kc09mUmVwb3J0aW5nID0+ICdTb2x1dGlvbkF2ZXJhZ2VBbGxPdmVyJywKICAgICAgICBFeHBlY3RlZFJlc3VsdCAgID0+ICc5IG0nLAogICAgfSwKICAgIHsKICAgICAgICBLaW5kc09mUmVwb3J0aW5nID0+ICdTb2x1dGlvbk1pblRpbWVBbGxPdmVyJywKICAgICAgICBFeHBlY3RlZFJlc3VsdCAgID0+ICczIG0nLAogICAgfSwKICAgIHsKICAgICAgICBLaW5kc09mUmVwb3J0aW5nID0+ICdTb2x1dGlvbk1heFRpbWVBbGxPdmVyJywKICAgICAgICBFeHBlY3RlZFJlc3VsdCAgID0+ICcxNSBtJywKICAgIH0sCiAgICB7CiAgICAgICAgS2luZHNPZlJlcG9ydGluZyA9PiAnU29sdXRpb25BdmVyYWdlJywKICAgICAgICBFeHBlY3RlZFJlc3VsdCAgID0+ICc5IG0nLAogICAgfSwKICAgIHsKICAgICAgICBLaW5kc09mUmVwb3J0aW5nID0+ICdTb2x1dGlvbk1pblRpbWUnLAogICAgICAgIEV4cGVjdGVkUmVzdWx0ICAgPT4gJzMgbScsCiAgICB9LAogICAgewogICAgICAgIEtpbmRzT2ZSZXBvcnRpbmcgPT4gJ1NvbHV0aW9uTWF4VGltZScsCiAgICAgICAgRXhwZWN0ZWRSZXN1bHQgICA9PiAnMTUgbScsCiAgICB9LAogICAgewogICAgICAgIEtpbmRzT2ZSZXBvcnRpbmcgPT4gJ1NvbHV0aW9uV29ya2luZ1RpbWVBdmVyYWdlJywKICAgICAgICBFeHBlY3RlZFJlc3VsdCAgID0+ICc5IG0nLAogICAgfSwKICAgIHsKICAgICAgICBLaW5kc09mUmVwb3J0aW5nID0+ICdTb2x1dGlvbk1pbldvcmtpbmdUaW1lJywKICAgICAgICBFeHBlY3RlZFJlc3VsdCAgID0+ICczIG0nLAogICAgfSwKICAgIHsKICAgICAgICBLaW5kc09mUmVwb3J0aW5nID0+ICdTb2x1dGlvbk1heFdvcmtpbmdUaW1lJywKICAgICAgICBFeHBlY3RlZFJlc3VsdCAgID0+ICcxNSBtJywKICAgIH0sCiAgICB7CiAgICAgICAgS2luZHNPZlJlcG9ydGluZyA9PiAnTnVtYmVyT2ZUaWNrZXRzJywKICAgICAgICBFeHBlY3RlZFJlc3VsdCAgID0+ICc1JywKICAgIH0sCiAgICB7CiAgICAgICAgS2luZHNPZlJlcG9ydGluZyA9PiAnUmVzcG9uc2VBdmVyYWdlJywKICAgICAgICBFeHBlY3RlZFJlc3VsdCAgID0+ICc2IG0nLAogICAgfSwKICAgIHsKICAgICAgICBLaW5kc09mUmVwb3J0aW5nID0+ICdSZXNwb25zZU1pblRpbWUnLAogICAgICAgIEV4cGVjdGVkUmVzdWx0ICAgPT4gJzIgbScsCiAgICB9LAogICAgewogICAgICAgIEtpbmRzT2ZSZXBvcnRpbmcgPT4gJ1Jlc3BvbnNlV29ya2luZ1RpbWVBdmVyYWdlJywKICAgICAgICBFeHBlY3RlZFJlc3VsdCAgID0+ICc2IG0nLAogICAgfSwKICAgIHsKICAgICAgICBLaW5kc09mUmVwb3J0aW5nID0+ICdSZXNwb25zZU1pbldvcmtpbmdUaW1lJywKICAgICAgICBFeHBlY3RlZFJlc3VsdCAgID0+ICcyIG0nLAogICAgfSwKICAgIHsKICAgICAgICBLaW5kc09mUmVwb3J0aW5nID0+ICdSZXNwb25zZU1heFdvcmtpbmdUaW1lJywKICAgICAgICBFeHBlY3RlZFJlc3VsdCAgID0+ICcxMCBtJywKICAgIH0sCik7CgpteSAkVGlja2V0U29sdXRpb25SZXNwb25zZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OlRpY2tldFNvbHV0aW9uUmVzcG9uc2VUaW1lJyk7CgojIENoZWNrIEdldFN0YXRFbGVtZW50KCkuCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CiAgICBmb3IgbXkgJEl0ZW0gKHF3KEl0ZW0xIEl0ZW0yKSkgewoKICAgICAgICBteSAkUmVzdWx0ID0gJFRpY2tldFNvbHV0aW9uUmVzcG9uc2VUaW1lT2JqZWN0LT5HZXRTdGF0RWxlbWVudCgKICAgICAgICAgICAgU2VydmljZUlEcyAgICAgICAgICAgICAgICAgICAgICAgPT4gWyRTZXJ2aWNlSURdLAogICAgICAgICAgICBLaW5kc09mUmVwb3J0aW5nICAgICAgICAgICAgICAgICA9PiBbICRUZXN0LT57S2luZHNPZlJlcG9ydGluZ30gXSwKICAgICAgICAgICAgIkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkTmFtZSIgPT4gWyRJdGVtXSwKICAgICAgICApOwoKICAgICAgICBteSAkRXhwZWN0ZWRSZXN1bHQ7CiAgICAgICAgaWYgKCAkSXRlbSBlcSAnSXRlbTInICkgewogICAgICAgICAgICAkRXhwZWN0ZWRSZXN1bHQgPSAwOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEV4cGVjdGVkUmVzdWx0ID0gJFRlc3QtPntFeHBlY3RlZFJlc3VsdH07CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICRFeHBlY3RlZFJlc3VsdCwKICAgICAgICAgICAgIiRUZXN0LT57S2luZHNPZlJlcG9ydGluZ30gaXMgY2FsY3VsYXRlZCB3ZWxsIC0gJFJlc3VsdCIsCiAgICAgICAgKTsKICAgIH0KCn0KCiMgQ2xlYW51cCBjYWNoZS4KJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA0ZmUyMThiZWNjZGI5MjZhMjlkZDdiZWQ5ZGU0ODIxMTQzMGQ2OWQwIC0gc2NyaXB0cy90ZXN0L1RpY2tldC9UaWNrZXRBQ0wudAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKbXkgJENvbmZpZ09iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwpteSAkVXNlck9iamVjdCAgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7Cm15ICRDdXN0b21lclVzZXJPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwpteSAkU2VydmljZU9iamVjdCAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyk7Cm15ICRRdWV1ZU9iamVjdCAgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7Cm15ICRUeXBlT2JqZWN0ICAgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlR5cGUnKTsKbXkgJFByaW9yaXR5T2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJpb3JpdHknKTsKbXkgJFNMQU9iamVjdCAgICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyk7Cm15ICRTdGF0ZU9iamVjdCAgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyk7Cm15ICREeW5hbWljRmllbGRPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwpteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKbXkgJFN0b3JhYmxlT2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RvcmFibGUnKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlICA9PiAxLAogICAgICAgIFVzZVRtcEFydGljbGVEaXIgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKIyBzZXQgdmFsaWQgb3B0aW9ucwpteSAlVmFsaWRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwolVmFsaWRMaXN0ID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwoKIyBzZXQgdXNlciBvcHRpb25zCm15ICRVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgIEdyb3VwcyA9PiBbJ2FkbWluJ10sCikgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKbXkgJFVzZXJJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgVXNlckxvZ2luID0+ICRVc2VyTG9naW4sCik7Cm15ICVVc2VyRGF0YSA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgIFVzZXJJRCA9PiAkVXNlcklELAopOwpteSAkTmV3VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICBHcm91cHMgPT4gWydhZG1pbiddLAopIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCm15ICROZXdVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgIFVzZXJMb2dpbiA9PiAkTmV3VXNlckxvZ2luLAopOwpteSAlTmV3VXNlckRhdGEgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICBVc2VySUQgPT4gJE5ld1VzZXJJRCwKKTsKCiMgc2V0IGN1c3RvbWVyIHVzZXIgb3B0aW9ucwpteSAkQ3VzdG9tZXJVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0Q3VzdG9tZXJVc2VyQ3JlYXRlKCkKICAgIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCBjdXN0b21lciB1c2VyIjsKCm15ICVDdXN0b21lclVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlckxvZ2luLAopOwoKbXkgJE5ld0N1c3RvbWVyVXNlckxvZ2luID0gJEhlbHBlci0+VGVzdEN1c3RvbWVyVXNlckNyZWF0ZSgpCiAgICB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgY3VzdG9tZXIgdXNlciI7CgpteSAlTmV3Q3VzdG9tZXJVc2VyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICBVc2VyID0+ICROZXdDdXN0b21lclVzZXJMb2dpbiwKKTsKCm15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgojIHNldCBxdWV1ZSBvcHRpb25zCm15ICRRdWV1ZU5hbWUgPSAnUXVldWVfJyAuICRSYW5kb21JRDsKbXkgJFF1ZXVlSUQgICA9ICRRdWV1ZU9iamVjdC0+UXVldWVBZGQoCiAgICBOYW1lICAgICAgICAgICAgPT4gJFF1ZXVlTmFtZSwKICAgIFZhbGlkSUQgICAgICAgICA9PiAkVmFsaWRMaXN0eyd2YWxpZCd9LAogICAgR3JvdXBJRCAgICAgICAgID0+IDEsCiAgICBTeXN0ZW1BZGRyZXNzSUQgPT4gMSwKICAgIFNhbHV0YXRpb25JRCAgICA9PiAxLAogICAgU2lnbmF0dXJlSUQgICAgID0+IDEsCiAgICBDb21tZW50ICAgICAgICAgPT4gJ1NvbWUgY29tbWVudCcsCiAgICBVc2VySUQgICAgICAgICAgPT4gMSwKKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5UcnVlKAogICAgJFF1ZXVlSUQsCiAgICAiUXVldWVBZGQoKSBJRCAoJFF1ZXVlSUQpIGFkZGVkIHN1Y2Nlc3NmdWxseSIKKTsKCm15ICROZXdRdWV1ZU5hbWUgPSAnTmV3UXVldWVfJyAuICRSYW5kb21JRDsKbXkgJE5ld1F1ZXVlSUQgICA9ICRRdWV1ZU9iamVjdC0+UXVldWVBZGQoCiAgICBOYW1lICAgICAgICAgICAgPT4gJE5ld1F1ZXVlTmFtZSwKICAgIFZhbGlkSUQgICAgICAgICA9PiAkVmFsaWRMaXN0eyd2YWxpZCd9LAogICAgR3JvdXBJRCAgICAgICAgID0+IDEsCiAgICBTeXN0ZW1BZGRyZXNzSUQgPT4gMSwKICAgIFNhbHV0YXRpb25JRCAgICA9PiAxLAogICAgU2lnbmF0dXJlSUQgICAgID0+IDEsCiAgICBDb21tZW50ICAgICAgICAgPT4gJ1NvbWUgY29tbWVudCcsCiAgICBVc2VySUQgICAgICAgICAgPT4gMSwKKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5UcnVlKAogICAgJE5ld1F1ZXVlSUQsCiAgICAiUXVldWVBZGQoKSBJRCAoJE5ld1F1ZXVlSUQpIGFkZGVkIHN1Y2Nlc3NmdWxseSIKKTsKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQoKIyBnZXQgdGhlIGxpc3Qgb2Ygc2VydmljZSB0eXBlcyBmcm9tIGdlbmVyYWwgY2F0YWxvZwpteSAkU2VydmljZVR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAopOwoKIyBidWlsZCBhIGxvb2t1cCBoYXNoCm15ICVTZXJ2aWNlVHlwZU5hbWUySUQgPSByZXZlcnNlICV7ICRTZXJ2aWNlVHlwZUxpc3QgfTsKCiMgZ2V0IHRoZSBsaXN0IG9mIHNsYSB0eXBlcyBmcm9tIGdlbmVyYWwgY2F0YWxvZwpteSAkU0xBVHlwZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICBDbGFzcyA9PiAnSVRTTTo6U0xBOjpUeXBlJywKKTsKCiMgYnVpbGQgYSBsb29rdXAgaGFzaApteSAlU0xBVHlwZU5hbWUySUQgPSByZXZlcnNlICV7ICRTTEFUeXBlTGlzdCB9OwojIC0tLQoKIyBzZXQgc2VydmljZSBvcHRpb25zCm15ICRTZXJ2aWNlTmFtZSA9ICdTZXJ2aWNlXycgLiAkUmFuZG9tSUQ7Cm15ICRTZXJ2aWNlSUQgICA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlQWRkKAogICAgTmFtZSAgICA9PiAkU2VydmljZU5hbWUsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgIFR5cGVJRCAgICAgID0+ICRTZXJ2aWNlVHlwZU5hbWUySUR7VHJhaW5pbmd9LAogICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKIyAtLS0KICAgIFZhbGlkSUQgPT4gJFZhbGlkTGlzdHsndmFsaWQnfSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5UcnVlKAogICAgJFNlcnZpY2VJRCwKICAgICJTZXJ2aWNlQWRkKCkgSUQgKCRTZXJ2aWNlSUQpIGFkZGVkIHN1Y2Nlc3NmdWxseSIKKTsKCm15ICROZXdTZXJ2aWNlTmFtZSA9ICdOZXdTZXJ2aWNlXycgLiAkUmFuZG9tSUQ7Cm15ICROZXdTZXJ2aWNlSUQgICA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlQWRkKAogICAgTmFtZSAgICA9PiAkTmV3U2VydmljZU5hbWUsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgIFR5cGVJRCAgICAgID0+ICRTZXJ2aWNlVHlwZU5hbWUySUR7VHJhaW5pbmd9LAogICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKIyAtLS0KICAgIFZhbGlkSUQgPT4gJFZhbGlkTGlzdHsndmFsaWQnfSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5UcnVlKAogICAgJE5ld1NlcnZpY2VJRCwKICAgICJTZXJ2aWNlQWRkKCkgSUQgKCROZXdTZXJ2aWNlSUQpIGFkZGVkIHN1Y2Nlc3NmdWxseSIKKTsKCiMgc2V0IHR5cGUgb3B0aW9ucwpteSAkVHlwZU5hbWUgPSAnVHlwZV8nIC4gJFJhbmRvbUlEOwpteSAkVHlwZUlEICAgPSAkVHlwZU9iamVjdC0+VHlwZUFkZCgKICAgIE5hbWUgICAgPT4gJFR5cGVOYW1lLAogICAgVmFsaWRJRCA9PiAkVmFsaWRMaXN0eyd2YWxpZCd9LAogICAgVXNlcklEICA9PiAxLAopOwoKIyBzYW5pdHkgY2hlY2sKJFNlbGYtPlRydWUoCiAgICAkVHlwZUlELAogICAgIlR5cGVBZGQoKSBJRCAoJFR5cGVJRCkgYWRkZWQgc3VjY2Vzc2Z1bGx5IgopOwoKbXkgJE5ld1R5cGVOYW1lID0gJ05ld1R5cGVfJyAuICRSYW5kb21JRDsKbXkgJE5ld1R5cGVJRCAgID0gJFR5cGVPYmplY3QtPlR5cGVBZGQoCiAgICBOYW1lICAgID0+ICROZXdUeXBlTmFtZSwKICAgIFZhbGlkSUQgPT4gJFZhbGlkTGlzdHsndmFsaWQnfSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5UcnVlKAogICAgJE5ld1R5cGVJRCwKICAgICJUeXBlQWRkKCkgSUQgKCROZXdUeXBlSUQpIGFkZGVkIHN1Y2Nlc3NmdWxseSIKKTsKCiMgc2V0IHByaW9yaXR5IG9wdGlvbnMKbXkgJFByaW9yaXR5TmFtZSA9ICdQcmlvcml0eV8nIC4gJFJhbmRvbUlEOwpteSAkUHJpb3JpdHlJRCAgID0gJFByaW9yaXR5T2JqZWN0LT5Qcmlvcml0eUFkZCgKICAgIE5hbWUgICAgPT4gJFByaW9yaXR5TmFtZSwKICAgIFZhbGlkSUQgPT4gJFZhbGlkTGlzdHsndmFsaWQnfSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5UcnVlKAogICAgJFByaW9yaXR5SUQsCiAgICAiUHJpb3JpdHlBZGQoKSBJRCAoJFByaW9yaXR5SUQpIGFkZGVkIHN1Y2Nlc3NmdWxseSIKKTsKCm15ICROZXdQcmlvcml0eU5hbWUgPSAnTmV3UHJpb3JpdHlfJyAuICRSYW5kb21JRDsKbXkgJE5ld1ByaW9yaXR5SUQgICA9ICRQcmlvcml0eU9iamVjdC0+UHJpb3JpdHlBZGQoCiAgICBOYW1lICAgID0+ICROZXdQcmlvcml0eU5hbWUsCiAgICBWYWxpZElEID0+ICRWYWxpZExpc3R7J3ZhbGlkJ30sCiAgICBVc2VySUQgID0+IDEsCik7CgojIHNhbml0eSBjaGVjawokU2VsZi0+VHJ1ZSgKICAgICROZXdQcmlvcml0eUlELAogICAgIlByaW9yaXR5QWRkKCkgSUQgKCROZXdQcmlvcml0eUlEKSBhZGRlZCBzdWNjZXNzZnVsbHkiCik7CgojIHNldCBTTEEgb3B0aW9ucwpteSAkU0xBTmFtZSA9ICdTTEFfJyAuICRSYW5kb21JRDsKbXkgJFNMQUlEICAgPSAkU0xBT2JqZWN0LT5TTEFBZGQoCiAgICBOYW1lICAgID0+ICRTTEFOYW1lLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICBUeXBlSUQgPT4gJFNMQVR5cGVOYW1lMklEe090aGVyfSwKIyAtLS0KICAgIFZhbGlkSUQgPT4gJFZhbGlkTGlzdHsndmFsaWQnfSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5UcnVlKAogICAgJFNMQUlELAogICAgIlNMQUFkZCgpIElEICgkU0xBSUQpIGFkZGVkIHN1Y2Nlc3NmdWxseSIKKTsKCm15ICROZXdTTEFOYW1lID0gJ05ld1NMQV8nIC4gJFJhbmRvbUlEOwpteSAkTmV3U0xBSUQgICA9ICRTTEFPYmplY3QtPlNMQUFkZCgKICAgIE5hbWUgICAgPT4gJE5ld1NMQU5hbWUsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgIFR5cGVJRCA9PiAkU0xBVHlwZU5hbWUySUR7T3RoZXJ9LAojIC0tLQogICAgVmFsaWRJRCA9PiAkVmFsaWRMaXN0eyd2YWxpZCd9LAogICAgVXNlcklEICA9PiAxLAopOwoKIyBzYW5pdHkgY2hlY2sKJFNlbGYtPlRydWUoCiAgICAkTmV3U0xBSUQsCiAgICAiU0xBQWRkKCkgSUQgKCROZXdTTEFJRCkgYWRkZWQgc3VjY2Vzc2Z1bGx5IgopOwoKIyBzZXQgc3RhdGUgb3B0aW9ucwpteSAkU3RhdGVOYW1lID0gJ1N0YXRlXycgLiAkUmFuZG9tSUQ7Cm15ICRTdGF0ZUlEICAgPSAkU3RhdGVPYmplY3QtPlN0YXRlQWRkKAogICAgTmFtZSAgICA9PiAkU3RhdGVOYW1lLAogICAgVmFsaWRJRCA9PiAxLAogICAgVHlwZUlEICA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKIyBzYW5pdHkgY2hlY2sKJFNlbGYtPlRydWUoCiAgICAkU3RhdGVJRCwKICAgICJTdGF0ZUFkZCgpIElEICgkU3RhdGVJRCkgYWRkZWQgc3VjY2Vzc2Z1bGx5IgopOwoKbXkgJE5ld1N0YXRlTmFtZSA9ICdOZXdTdGF0ZV8nIC4gJFJhbmRvbUlEOwpteSAkTmV3U3RhdGVJRCAgID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUFkZCgKICAgIE5hbWUgICAgPT4gJE5ld1N0YXRlTmFtZSwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFR5cGVJRCAgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5UcnVlKAogICAgJE5ld1N0YXRlSUQsCiAgICAiU3RhdGVBZGQoKSBJRCAoJE5ld1N0YXRlSUQpIGFkZGVkIHN1Y2Nlc3NmdWxseSIKKTsKCiMgQ3JlYXRlIHRlc3QgdGlja2V0IGR5bmFtaWMgZmllbGRzLgpteSBARHluYW1pY0ZpZWxkTmFtZXM7CmZvciBteSAkQ291bnQgKCAxIC4uIDIgKSB7CiAgICBteSAkRHluYW1pY0ZpZWxkTmFtZSA9ICdEeW5hbWljRmllbGQnIC4gJENvdW50IC4gJFJhbmRvbUlEOwogICAgbXkgJER5bmFtaWNGaWVsZElEICAgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRBZGQoCiAgICAgICAgTmFtZSAgICAgICA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICAgICBMYWJlbCAgICAgID0+ICdhIGRlc2NyaXB0aW9uJywKICAgICAgICBGaWVsZE9yZGVyID0+IDk5OTk5LAogICAgICAgIEZpZWxkVHlwZSAgPT4gJ1RleHQnLAogICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgICAgIERlZmF1bHRWYWx1ZSA9PiAnRGVmYXVsdCcsCiAgICAgICAgfSwKICAgICAgICBSZW9yZGVyID0+IDAsCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkRHluYW1pY0ZpZWxkSUQsCiAgICAgICAgIkR5bmFtaWNGaWVsZEFkZCgpIElEICgkRHluYW1pY0ZpZWxkSUQpIGFkZGVkIHN1Y2Nlc3NmdWxseSIKICAgICk7CgogICAgcHVzaCBARHluYW1pY0ZpZWxkTmFtZXMsICREeW5hbWljRmllbGROYW1lOwp9CgojIFRPRE8gaW50ZWdyYXRlIHRoaXMgdGVzdHMgd2l0aCBkYXRhYmFzZSB0ZXN0cwojIHNldCB0ZXN0aW5nIEFDTHMgb3B0aW9ucwpteSAlVGVzdEFDTHMgPSAoCiAgICAnUXVldWUtMScgPT4gewogICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICBRdWV1ZSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lID0+IFskUXVldWVOYW1lXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFBvc3NpYmxlTm90ID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFN0YXRlID0+IFsnb3BlbiddLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgJ1NlcnZpY2UtMScgPT4gewogICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICBTZXJ2aWNlID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gWyRTZXJ2aWNlTmFtZV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiBbICcxIHZlcnkgbG93JywgJzMgbWVkaXVtJywgXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgICdUeXBlLTEnID0+IHsKICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgVHlwZSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lID0+IFskVHlwZU5hbWVdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUG9zc2libGUgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgUXVldWUgPT4gWydSYXcnXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgICdDdXN0b21lclVzZXItMScgPT4gewogICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gewogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+IFskQ3VzdG9tZXJVc2VyTG9naW5dLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUG9zc2libGUgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgU3RhdGUgPT4gWydvcGVuJ10sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICAnUHJpb3JpdHktMScgPT4gewogICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICBQcmlvcml0eSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lID0+IFskUHJpb3JpdHlOYW1lXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFBvc3NpYmxlID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFF1ZXVlID0+IFsnUmF3J10sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICAnU0xBLTEnID0+IHsKICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgU0xBID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gWyRTTEFOYW1lXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFBvc3NpYmxlTm90ID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFN0YXRlID0+IFsnb3BlbiddLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgJ1N0YXRlLTEnID0+IHsKICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgU3RhdGUgPT4gewogICAgICAgICAgICAgICAgTmFtZSA9PiBbJFN0YXRlTmFtZV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBQb3NzaWJsZU5vdCA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBRdWV1ZSA9PiBbJ1JhdyddLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgJ093bmVyLTEnID0+IHsKICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgT3duZXIgPT4gewogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+IFskVXNlckxvZ2luXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFBvc3NpYmxlID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFN0YXRlID0+IFsnb3BlbiddLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgJ1Jlc3BvbnNpYmxlLTEnID0+IHsKICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgUmVzcG9uc2libGUgPT4gewogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+IFskVXNlckxvZ2luXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFBvc3NpYmxlTm90ID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFN0YXRlID0+IFsnb3BlbiddLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgJ0Zyb250ZW5kLTEnID0+IHsKICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgRnJvbnRlbmQgPT4gewogICAgICAgICAgICAgICAgQWN0aW9uID0+IFsgJ0FnZW50VGlja2V0UGhvbmUnLCAnQWdlbnRUaWNrZXRFbWFpbCcgXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFBvc3NpYmxlTm90ID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFsgJzEgdmVyeSBsb3cnLCAnMyBtZWRpdW0nLCBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgJ1RpY2tldC0xJyA9PiB7CiAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBRdWV1ZSAgICA9PiBbJFF1ZXVlTmFtZV0sCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiBbJFByaW9yaXR5TmFtZV0sCiAgICAgICAgICAgICAgICBTdGF0ZSAgICA9PiBbJFN0YXRlTmFtZV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgIEFjdGlvbiA9PiBbICdBZ2VudFRpY2tldFBob25lJywgJ0FnZW50VGlja2V0Qm91bmNlJywgXSwKICAgICAgICB9LAogICAgfSwKICAgICdEeW5hbWljRmllbGQtMScgPT4gewogICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkX0ZpZWxkMSA9PiBbJ0l0ZW0xJ10sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBQb3NzaWJsZU5vdCA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBTdGF0ZSA9PiBbJ29wZW4nXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgICdEeW5hbWljRmllbGQtMicgPT4gewogICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkX0ZpZWxkMiA9PiBbJzAnXSwgICAgIyB6ZXJvLXZhbHVlLCBzZWUgYnVnIzEyMjczCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBQb3NzaWJsZU5vdCA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBTdGF0ZSA9PiBbJ29wZW4nXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKKTsKCiRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdUaWNrZXRBY2wnLAogICAgVmFsdWUgPT4gXCVUZXN0QUNMcywKKTsKCm15ICRHb3RBQ0xzID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRBY2wnKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5Jc0RlZXBseSgKICAgICRHb3RBQ0xzLAogICAgXCVUZXN0QUNMcywKICAgICJBQ0xzIFNldCBhbmQgR2V0IGZyb20gc3lzY29uZmlnIiwKKTsKCm15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgojIHNldCB0aWNrZXQgb3B0aW9ucwpteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCiAgICBUaXRsZSAgICAgICAgID0+ICdTb21lIFRpY2tldCBUaXRsZScsCiAgICBRdWV1ZSAgICAgICAgID0+ICRRdWV1ZU5hbWUsCiAgICBTZXJ2aWNlICAgICAgID0+ICRTZXJ2aWNlTmFtZSwKICAgIFR5cGUgICAgICAgICAgPT4gJFR5cGVOYW1lLAogICAgTG9jayAgICAgICAgICA9PiAndW5sb2NrJywKICAgIFByaW9yaXR5ICAgICAgPT4gJFByaW9yaXR5TmFtZSwKICAgIFNMQSAgICAgICAgICAgPT4gJFNMQU5hbWUsCiAgICBTdGF0ZSAgICAgICAgID0+ICRTdGF0ZU5hbWUsCiAgICBDdXN0b21lcklEICAgID0+ICcxMjM0NjUnLAogICAgQ3VzdG9tZXJVc2VyICA9PiAkQ3VzdG9tZXJVc2VyTG9naW4sCiAgICBPd25lcklEICAgICAgID0+ICRVc2VySUQsCiAgICBSZXNwb25zaWJsZUlEID0+ICRVc2VySUQsCiAgICBVc2VySUQgICAgICAgID0+IDEsCik7CgojIHNhbml0eSBjaGVjawokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRJRCwKICAgICJUaWNrZXRDcmVhdGUoKSBJRCAoJFRpY2tldElEKSBjcmVhdGVkIHN1Y2Nlc3NmdWxseSIsCik7CgojIFNldCB0aGUgdGVzdCB0aWNrZXQgZHluYW1pYyBmaWVsZCB2YWx1ZXMuCmZvciBteSAkQ291bnQgKCAwIC4uIDEgKSB7CiAgICBteSAkVmFsdWU7CiAgICBpZiAoICRDb3VudCA9PSAwICkgewogICAgICAgICRWYWx1ZSA9ICdJdGVtMSc7CiAgICB9CiAgICBlbHNpZiAoICRDb3VudCA9PSAxICkgewogICAgICAgICRWYWx1ZSA9ICcwJzsKICAgIH0KCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgIE5hbWUgPT4gJER5bmFtaWNGaWVsZE5hbWVzWyRDb3VudF0sCiAgICApOwogICAgbXkgJER5bmFtaWNGaWVsZFZhbHVlU2V0U3VjY2VzcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZVNldFN1Y2Nlc3MsCiAgICAgICAgIkR5bmFtaWNGaWVsZCBWYWx1ZVNldCgpIGZvciBEeW5hbWljRmllbGQgSUQgKCREeW5hbWljRmllbGROYW1lc1skQ291bnRdKSwgVGlja2V0IElEICgkVGlja2V0SUQpIHNldCBzdWNjZXNzZnVsbHkiLAogICAgKTsKfQoKIyBkZWZpbmUgZm9ybSB1cGRhdGUgYmFzZWQgdGVzdHMKbXkgQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICA9PiAnQUNMIFF1ZXVlLTEgLSB3cm9uZyBRdWV1ZScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICduZXcnLAogICAgICAgICAgICAgICAgMiA9PiAnb3BlbicsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1N0YXRlJywKICAgICAgICAgICAgUXVldWUgICAgICAgICA9PiAnUmF3JywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDAsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHt9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FDTCBRdWV1ZS0xIC0gd3JvbmcgcmV0dXJuIHR5cGUgKEFjdGlvbiknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnbmV3JywKICAgICAgICAgICAgICAgIDIgPT4gJ29wZW4nLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpb24nLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdXcm9uZycsCiAgICAgICAgICAgIFF1ZXVlICAgICAgICAgPT4gJFF1ZXVlTmFtZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoICAgICA9PiAwLAogICAgICAgIFJldHVybkFjdGlvbkRhdGEgPT4ge30sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQUNMIFF1ZXVlLTEgLSB3cm9uZyByZXR1cm4gdHlwZSAoTm9uIEFjdGlvbiknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnbmV3JywKICAgICAgICAgICAgICAgIDIgPT4gJ29wZW4nLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdXcm9uZycsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1N0YXRlJywKICAgICAgICAgICAgUXVldWUgICAgICAgICA9PiAkUXVldWVOYW1lLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMCwKICAgICAgICBSZXR1cm5EYXRhICAgPT4ge30sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQUNMIFF1ZXVlLTEgLSB3cm9uZyByZXR1cm4gc3ViIHR5cGUnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnbmV3JywKICAgICAgICAgICAgICAgIDIgPT4gJ29wZW4nLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdXcm9uZycsCiAgICAgICAgICAgIFF1ZXVlICAgICAgICAgPT4gJFF1ZXVlTmFtZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDAsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHt9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FDTCBRdWV1ZS0xIC0gY29ycmVjdCBRdWV1ZScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICduZXcnLAogICAgICAgICAgICAgICAgMiA9PiAnb3BlbicsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1N0YXRlJywKICAgICAgICAgICAgUXVldWUgICAgICAgICA9PiAkUXVldWVOYW1lLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAxID0+ICduZXcnLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQUNMIFF1ZXVlLTEgLSBjb3JyZWN0IFF1ZXVlSUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnbmV3JywKICAgICAgICAgICAgICAgIDIgPT4gJ29wZW4nLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdTdGF0ZScsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAxLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7CiAgICAgICAgICAgIDEgPT4gJ25ldycsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBQ0wgU2VydmljZS0xIC0gY29ycmVjdCBTZXJ2aWNlJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICAgICAgMiA9PiAnMiBsb3cnLAogICAgICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgICAgICAgICAgNCA9PiAnNCBoaWdoJywKICAgICAgICAgICAgICAgIDUgPT4gJzUgdmVyeSBoaWdoJwogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIFNlcnZpY2UgICAgICAgPT4gJFNlcnZpY2VOYW1lLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQUNMIFNlcnZpY2UtMSAtIGNvcnJlY3QgU2VydmljZUlEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICAgICAgMiA9PiAnMiBsb3cnLAogICAgICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgICAgICAgICAgNCA9PiAnNCBoaWdoJywKICAgICAgICAgICAgICAgIDUgPT4gJzUgdmVyeSBoaWdoJwogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FDTCBUeXBlLTEgLSBjb3JyZWN0IFR5cGUnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnUmF3JywKICAgICAgICAgICAgICAgIDIgPT4gJ1Bvc3RNYXN0ZXInLAogICAgICAgICAgICAgICAgMyA9PiAnSnVuaycsCiAgICAgICAgICAgICAgICA0ID0+ICdNaXNjJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUXVldWUnLAogICAgICAgICAgICBUeXBlICAgICAgICAgID0+ICRUeXBlTmFtZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMSA9PiAnUmF3JywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FDTCBUeXBlLTEgLSBjb3JyZWN0IFR5cGVJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICdSYXcnLAogICAgICAgICAgICAgICAgMiA9PiAnUG9zdE1hc3RlcicsCiAgICAgICAgICAgICAgICAzID0+ICdKdW5rJywKICAgICAgICAgICAgICAgIDQgPT4gJ01pc2MnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdRdWV1ZScsCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMSA9PiAnUmF3JywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FDTCBDdXN0b21lclVzZXItMSAtIGNvcnJlY3QgQ3VzdG9tZXJVc2VyJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJ25ldycsCiAgICAgICAgICAgICAgICAyID0+ICdvcGVuJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICdTdGF0ZScsCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXJEYXRhe1VzZXJJRH0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAyID0+ICdvcGVuJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FDTCBQcmlvcml0eS0xIC0gY29ycmVjdCBQcmlvcml0eScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICdSYXcnLAogICAgICAgICAgICAgICAgMiA9PiAnUG9zdE1hc3RlcicsCiAgICAgICAgICAgICAgICAzID0+ICdKdW5rJywKICAgICAgICAgICAgICAgIDQgPT4gJ01pc2MnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdRdWV1ZScsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJFByaW9yaXR5TmFtZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMSA9PiAnUmF3JywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FDTCBQcmlvcml0eS0xIC0gY29ycmVjdCBQcmlvcml0eUlEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJ1JhdycsCiAgICAgICAgICAgICAgICAyID0+ICdQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgIDMgPT4gJ0p1bmsnLAogICAgICAgICAgICAgICAgNCA9PiAnTWlzYycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1F1ZXVlJywKICAgICAgICAgICAgUHJpb3JpdHlJRCAgICA9PiAkUHJpb3JpdHlJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMSA9PiAnUmF3JywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FDTCBTTEEtMSAtIGNvcnJlY3QgU0xBJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJ25ldycsCiAgICAgICAgICAgICAgICAyID0+ICdvcGVuJywKICAgICAgICAgICAgICAgIDMgPT4gJ2Nsb3NlZCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBTTEEgICAgICAgICAgID0+ICRTTEFOYW1lLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAxID0+ICduZXcnLAogICAgICAgICAgICAzID0+ICdjbG9zZWQnLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQUNMIFNMQS0xIC0gY29ycmVjdCBTTEFJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICduZXcnLAogICAgICAgICAgICAgICAgMiA9PiAnb3BlbicsCiAgICAgICAgICAgICAgICAzID0+ICdjbG9zZWQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdTdGF0ZScsCiAgICAgICAgICAgIFNMQUlEICAgICAgICAgPT4gJFNMQUlELAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAxID0+ICduZXcnLAogICAgICAgICAgICAzID0+ICdjbG9zZWQnCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBQ0wgU3RhdGUtMSAtIGNvcnJlY3QgU3RhdGUnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnUmF3JywKICAgICAgICAgICAgICAgIDIgPT4gJ1Bvc3RNYXN0ZXInLAogICAgICAgICAgICAgICAgMyA9PiAnSnVuaycsCiAgICAgICAgICAgICAgICA0ID0+ICdNaXNjJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUXVldWUnLAogICAgICAgICAgICBTdGF0ZSAgICAgICAgID0+ICRTdGF0ZU5hbWUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAxLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7CiAgICAgICAgICAgIDIgPT4gJ1Bvc3RNYXN0ZXInLAogICAgICAgICAgICAzID0+ICdKdW5rJywKICAgICAgICAgICAgNCA9PiAnTWlzYycsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBQ0wgU3RhdGUtMSAtIGNvcnJlY3QgU3RhdGVJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICdSYXcnLAogICAgICAgICAgICAgICAgMiA9PiAnUG9zdE1hc3RlcicsCiAgICAgICAgICAgICAgICAzID0+ICdKdW5rJywKICAgICAgICAgICAgICAgIDQgPT4gJ01pc2MnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdRdWV1ZScsCiAgICAgICAgICAgIFN0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAxLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7CiAgICAgICAgICAgIDIgPT4gJ1Bvc3RNYXN0ZXInLAogICAgICAgICAgICAzID0+ICdKdW5rJywKICAgICAgICAgICAgNCA9PiAnTWlzYycsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBQ0wgT3duZXItMSAtIGNvcnJlY3QgT3duZXInLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnbmV3JywKICAgICAgICAgICAgICAgIDIgPT4gJ29wZW4nLAogICAgICAgICAgICAgICAgMyA9PiAnY2xvc2VkJwogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdTdGF0ZScsCiAgICAgICAgICAgIE93bmVyICAgICAgICAgPT4gJFVzZXJMb2dpbiwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMiA9PiAnb3BlbicsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBQ0wgT3duZXItMSAtIGNvcnJlY3QgT3duZXJJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICduZXcnLAogICAgICAgICAgICAgICAgMiA9PiAnb3BlbicsCiAgICAgICAgICAgICAgICAzID0+ICdjbG9zZWQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdTdGF0ZScsCiAgICAgICAgICAgIE93bmVySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMiA9PiAnb3BlbicsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBQ0wgUmVzcG9uc2libGUtMSAtIGNvcnJlY3QgUmVzcG9uc2libGUnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnbmV3JywKICAgICAgICAgICAgICAgIDIgPT4gJ29wZW4nLAogICAgICAgICAgICAgICAgMyA9PiAnY2xvc2VkJwogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdTdGF0ZScsCiAgICAgICAgICAgIFJlc3BvbnNpYmxlICAgPT4gJFVzZXJMb2dpbiwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMSA9PiAnbmV3JywKICAgICAgICAgICAgMyA9PiAnY2xvc2VkJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FDTCBSZXNwb25zaWJsZS0xIC0gY29ycmVjdCBSZXNwb25zaWJsZUlEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJ25ldycsCiAgICAgICAgICAgICAgICAyID0+ICdvcGVuJywKICAgICAgICAgICAgICAgIDMgPT4gJ2Nsb3NlZCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1N0YXRlJywKICAgICAgICAgICAgUmVzcG9uc2libGVJRCA9PiAkVXNlcklELAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAxID0+ICduZXcnLAogICAgICAgICAgICAzID0+ICdjbG9zZWQnCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBQ0wgRnJvbnRlbmQtMSAtIGNvcnJlY3QgQWN0aW9uJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICAgICAgMiA9PiAnMiBsb3cnLAogICAgICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgICAgICAgICAgNCA9PiAnNCBoaWdoJywKICAgICAgICAgICAgICAgIDUgPT4gJzUgdmVyeSBoaWdoJwogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJ0FnZW50VGlja2V0UGhvbmUnLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAyID0+ICcyIGxvdycsCiAgICAgICAgICAgIDQgPT4gJzQgaGlnaCcsCiAgICAgICAgICAgIDUgPT4gJzUgdmVyeSBoaWdoJwogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQUNMIFRpY2tldC0xIC0gY29ycmVjdCBUaWNrZXQgdXNpbmcgQWN0aW9uJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhICAgICAgICAgID0+ICctJywKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aW9uJywKICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAnQWdlbnRUaWNrZXRQaG9uZScsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJy0nLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoICAgICA9PiAxLAogICAgICAgIFJldHVybkFjdGlvbkRhdGEgPT4gewogICAgICAgICAgICAxID0+ICdBZ2VudFRpY2tldFBob25lJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FDTCBUaWNrZXQtMSAtIGNvcnJlY3QgVGlja2V0IHVzaW5nIERhdGEnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnQWdlbnRUaWNrZXRQaG9uZScsCiAgICAgICAgICAgICAgICAyID0+ICdBZ2VudFRpY2tldEJvdW5jZScsCiAgICAgICAgICAgICAgICAzID0+ICdBZ2VudFRpY2tldENvbXBvc2UnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpb24nLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCAgICAgPT4gMSwKICAgICAgICBSZXR1cm5BY3Rpb25EYXRhID0+IHsKICAgICAgICAgICAgMSA9PiAnQWdlbnRUaWNrZXRQaG9uZScsCiAgICAgICAgICAgIDIgPT4gJ0FnZW50VGlja2V0Qm91bmNlJywKICAgICAgICB9LAogICAgfSwKCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBQ0wgRHluYW1pY0ZpZWxkLTEgLSBjb3JyZWN0IER5bmFtaWNGaWVsZCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICduZXcnLAogICAgICAgICAgICAgICAgMiA9PiAnb3BlbicsCiAgICAgICAgICAgICAgICAzID0+ICdjbG9zZWQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdTdGF0ZScsCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCAgPT4gewogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkX0ZpZWxkMSA9PiBbJ0l0ZW0xJ10KICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAxID0+ICduZXcnLAogICAgICAgICAgICAzID0+ICdjbG9zZWQnLAogICAgICAgIH0sCiAgICB9LAoKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FDTCBEeW5hbWljRmllbGQtMiAtIER5bmFtaWNGaWVsZCB3aXRoIHplcm8gdmFsdWUnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnbmV3JywKICAgICAgICAgICAgICAgIDIgPT4gJ29wZW4nLAogICAgICAgICAgICAgICAgMyA9PiAnY2xvc2VkJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBEeW5hbWljRmllbGQgID0+IHsKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZF9GaWVsZDIgPT4gWycwJ10sICAgICMgemVyby12YWx1ZSwgc2VlIGJ1ZyMxMjI3MwogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAxLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7CiAgICAgICAgICAgIDEgPT4gJ25ldycsCiAgICAgICAgICAgIDMgPT4gJ2Nsb3NlZCcsCiAgICAgICAgfSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgIG15ICRDb25maWcgICAgID0gJFRlc3QtPntDb25maWd9OwogICAgbXkgJEFDTFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woICV7ICRUZXN0LT57Q29uZmlnfSB9ICk7CgogICAgaWYgKCAhJFRlc3QtPntTdWNjZXNzTWF0Y2h9ICkgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJEFDTFN1Y2Nlc3MsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IGV4ZWN1dGVkIHdpdGggRmFsc2UiLAogICAgICAgICk7CgogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRBQ0xTdWNjZXNzLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSBleGVjdXRlZCB3aXRoIFRydWUiLAogICAgICAgICk7CgogICAgICAgIGlmICggJFRlc3QtPntDb25maWd9LT57UmV0dXJuVHlwZX0gZXEgJ0FjdGlvbicgKSB7CgogICAgICAgICAgICAjIGdldCB0aGUgYWN0aW9uIGRhdGEgZnJvbSBBQ0wKICAgICAgICAgICAgbXkgJUFDTEFjdGlvbkRhdGEgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CgogICAgICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgICAgICBcJUFDTEFjdGlvbkRhdGEsCiAgICAgICAgICAgICAgICAkVGVzdC0+e1JldHVybkFjdGlvbkRhdGF9LAogICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gQUNMIGFjdGlvbiBkYXRhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBnZXQgdGhlIGRhdGEgZnJvbSBBQ0wKICAgICAgICAgICAgbXkgJUFDTERhdGEgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgICAgICBcJUFDTERhdGEsCiAgICAgICAgICAgICAgICAkVGVzdC0+e1JldHVybkRhdGF9LAogICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gQUNMIGRhdGEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KfQoKJFNlbGYtPlRydWUoCiAgICAxLAogICAgIi0tLSBTdGFydCBEYXRhYmFzZSBBQ0wgVGVzdHMgLS0tIiwKKTsKCiMgZGVmaW5lIHRoZSBkYXRhYmFzZSB0ZXN0cwpAVGVzdHMgPSAoCgogICAgIyBxdWV1ZSBiYXNlZCB0ZXN0cwogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBEQi1RdWV1ZS0xIC0gU2VudCBuZXcgcXVldWUsIFdyb25nIFByb3BlcnRpZXNEYXRhYmFzZTogJywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ0RCLVF1ZXVlLTEtQScgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllc0RhdGFiYXNlID0+IHsKICAgICAgICAgICAgICAgICAgICBRdWV1ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWyROZXdRdWV1ZU5hbWVdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb3QgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlID0+IFsnbmV3J10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJ25ldycsCiAgICAgICAgICAgICAgICAyID0+ICdvcGVuJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgUXVldWUgICAgICAgICA9PiAkTmV3UXVldWVOYW1lLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMCwKICAgICAgICBSZXR1cm5EYXRhICAgPT4ge30sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBEQi1RdWV1ZS0xIC0gU2VudCBuZXcgcXVldWUsIENvcnJlY3QgUHJvcGVydGllc0RhdGFiYXNlOiAnLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnREItUXVldWUtMS1CJyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzRGF0YWJhc2UgPT4gewogICAgICAgICAgICAgICAgICAgIFF1ZXVlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiBbJFF1ZXVlTmFtZV0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgPT4gWydvcGVuJ10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJ25ldycsCiAgICAgICAgICAgICAgICAyID0+ICdvcGVuJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgUXVldWUgICAgICAgICA9PiAkTmV3UXVldWVOYW1lLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAxID0+ICduZXcnLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBEQi1RdWV1ZS0xIC0gU2VudCBuZXcgcXVldWUsIFdyb25nIFByb3BlcnRpZXMsIENvcnJlY3QgUHJvcGVydGllc0RhdGFiYXNlOiAnLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnREItUXVldWUtMS1DJyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBRdWV1ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWyRRdWV1ZU5hbWVdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUHJvcGVydGllc0RhdGFiYXNlID0+IHsKICAgICAgICAgICAgICAgICAgICBRdWV1ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWyRRdWV1ZU5hbWVdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb3QgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlID0+IFsnbmV3J10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJ25ldycsCiAgICAgICAgICAgICAgICAyID0+ICdvcGVuJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgUXVldWUgICAgICAgICA9PiAkTmV3UXVldWVOYW1lLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMCwKICAgICAgICBSZXR1cm5EYXRhICAgPT4ge30sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBEQi1RdWV1ZS0xIC0gU2VudCBuZXcgcXVldWUsIENvcnJlY3QgUHJvcGVydGllcywnCiAgICAgICAgICAgIC4gJyBDb3JyZWN0IFByb3BlcnRpZXNEYXRhYmFzZTogJywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ0RCLVF1ZXVlLTEtRCcgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgUXVldWUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+IFskTmV3UXVldWVOYW1lXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFByb3BlcnRpZXNEYXRhYmFzZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgUXVldWUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+IFskUXVldWVOYW1lXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm90ID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSA9PiBbJ25ldyddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICduZXcnLAogICAgICAgICAgICAgICAgMiA9PiAnb3BlbicsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1N0YXRlJywKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFF1ZXVlICAgICAgICAgPT4gJE5ld1F1ZXVlTmFtZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMiA9PiAnb3BlbicsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBzZXJ2aWNlIGJhc2VkIHRlc3RzCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLVNlcnZpY2UtMSAtIFNlbnQgbmV3IHNlcnZpY2UsIFdyb25nIFByb3BlcnRpZXNEYXRhYmFzZTogJywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ0RCLVNlcnZpY2UtMS1BJyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzRGF0YWJhc2UgPT4gewogICAgICAgICAgICAgICAgICAgIFNlcnZpY2UgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+IFskTmV3U2VydmljZU5hbWVdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGUgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFsgJzEgdmVyeSBsb3cnLCAnMyBtZWRpdW0nLCBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICAgICAgICAgIDQgPT4gJzQgaGlnaCcsCiAgICAgICAgICAgICAgICA1ID0+ICc1IHZlcnkgaGlnaCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgU2VydmljZSAgICAgICA9PiAkTmV3U2VydmljZU5hbWUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAwLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7fSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLVNlcnZpY2UtMSAtIFNlbnQgbmV3IHNlcnZpY2UsIENvcnJlY3QgUHJvcGVydGllc0RhdGFiYXNlOiAnLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnREItU2VydmljZS0xLUInID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXNEYXRhYmFzZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU2VydmljZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWyRTZXJ2aWNlTmFtZV0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gWyAnMSB2ZXJ5IGxvdycsIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICAgICAgMiA9PiAnMiBsb3cnLAogICAgICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgICAgICAgICAgNCA9PiAnNCBoaWdoJywKICAgICAgICAgICAgICAgIDUgPT4gJzUgdmVyeSBoaWdoJwogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBTZXJ2aWNlICAgICAgID0+ICROZXdTZXJ2aWNlTmFtZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLVNlcnZpY2UtMSAtIFNlbnQgbmV3IHNlcnZpY2UsIFdyb25nIFByb3BlcnRpZXMsJwogICAgICAgICAgICAuICcgQ29ycmVjdCBQcm9wZXJ0aWVzRGF0YWJhc2U6ICcsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdEQi1TZXJ2aWNlLTEtQycgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU2VydmljZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWyRTZXJ2aWNlTmFtZV0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzRGF0YWJhc2UgPT4gewogICAgICAgICAgICAgICAgICAgIFNlcnZpY2UgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+IFskU2VydmljZU5hbWVdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGUgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFsgJzEgdmVyeSBsb3cnLCAnMyBtZWRpdW0nLCBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICAgICAgICAgIDQgPT4gJzQgaGlnaCcsCiAgICAgICAgICAgICAgICA1ID0+ICc1IHZlcnkgaGlnaCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgU2VydmljZSAgICAgICA9PiAkTmV3U2VydmljZU5hbWUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAwLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7fSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLVNlcnZpY2UtMSAtIFNlbnQgbmV3IHNlcnZpY2UsIENvcnJlY3QgUHJvcGVydGllcywnCiAgICAgICAgICAgIC4gJyBDb3JyZWN0IFByb3BlcnRpZXNEYXRhYmFzZTogJywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ0RCLVNlcnZpY2UtMS1EJyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiBbJE5ld1NlcnZpY2VOYW1lXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFByb3BlcnRpZXNEYXRhYmFzZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU2VydmljZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWyRTZXJ2aWNlTmFtZV0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gWyAnMSB2ZXJ5IGxvdycsICczIG1lZGl1bScsIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICAgICAgMiA9PiAnMiBsb3cnLAogICAgICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgICAgICAgICAgNCA9PiAnNCBoaWdoJywKICAgICAgICAgICAgICAgIDUgPT4gJzUgdmVyeSBoaWdoJwogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBTZXJ2aWNlICAgICAgID0+ICROZXdTZXJ2aWNlTmFtZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIHR5cGUgYmFzZWQgdGVzdHMKICAgIHsKICAgICAgICBOYW1lID0+ICdBQ0wgREItVHlwZS0xIC0gU2VudCBuZXcgdHlwZSwgV3JvbmcgUHJvcGVydGllc0RhdGFiYXNlOiAnLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnREItVHlwZS0xLUEnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXNEYXRhYmFzZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWyROZXdUeXBlTmFtZV0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUXVldWUgPT4gWydSYXcnXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnUmF3JywKICAgICAgICAgICAgICAgIDIgPT4gJ1Bvc3RNYXN0ZXInLAogICAgICAgICAgICAgICAgMyA9PiAnSnVuaycsCiAgICAgICAgICAgICAgICA0ID0+ICdNaXNjJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUXVldWUnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVHlwZSAgICAgICAgICA9PiAkTmV3VHlwZU5hbWUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAwLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7fSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLVR5cGUtMSAtIFNlbnQgbmV3IHR5cGUsIENvcnJlY3QgUHJvcGVydGllc0RhdGFiYXNlOicsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdEQi1UeXBlLTEtQicgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllc0RhdGFiYXNlID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiBbJFR5cGVOYW1lXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZSA9PiBbJ01pc2MnXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnUmF3JywKICAgICAgICAgICAgICAgIDIgPT4gJ1Bvc3RNYXN0ZXInLAogICAgICAgICAgICAgICAgMyA9PiAnSnVuaycsCiAgICAgICAgICAgICAgICA0ID0+ICdNaXNjJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUXVldWUnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVHlwZSAgICAgICAgICA9PiAkTmV3VHlwZU5hbWUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAxLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7CiAgICAgICAgICAgIDQgPT4gJ01pc2MnLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBEQi1UeXBlLTEgLSBTZW50IG5ldyB0eXBlLCBXcm9uZyBQcm9wZXJ0aWVzLCBDb3JyZWN0IFByb3BlcnRpZXNEYXRhYmFzZTonLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnREItVHlwZS0xLUMnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+IFskVHlwZU5hbWVdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUHJvcGVydGllc0RhdGFiYXNlID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiBbJFR5cGVOYW1lXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZSA9PiBbJ1JhdyddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICdSYXcnLAogICAgICAgICAgICAgICAgMiA9PiAnUG9zdE1hc3RlcicsCiAgICAgICAgICAgICAgICAzID0+ICdKdW5rJywKICAgICAgICAgICAgICAgIDQgPT4gJ01pc2MnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdRdWV1ZScsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBUeXBlICAgICAgICAgID0+ICROZXdUeXBlTmFtZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDAsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHt9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lID0+ICdBQ0wgREItVHlwZS0xIC0gU2VudCBuZXcgdHlwZSwgQ29ycmVjdCBQcm9wZXJ0aWVzLCBDb3JyZWN0IFByb3BlcnRpZXNEYXRhYmFzZTonLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnREItVHlwZS0xLUQnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+IFskTmV3VHlwZU5hbWVdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUHJvcGVydGllc0RhdGFiYXNlID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiBbJFR5cGVOYW1lXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZSA9PiBbJ1JhdyddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICdSYXcnLAogICAgICAgICAgICAgICAgMiA9PiAnUG9zdE1hc3RlcicsCiAgICAgICAgICAgICAgICAzID0+ICdKdW5rJywKICAgICAgICAgICAgICAgIDQgPT4gJ01pc2MnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdRdWV1ZScsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBUeXBlICAgICAgICAgID0+ICROZXdUeXBlTmFtZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMSA9PiAnUmF3JywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGN1c3RvbWVyIGJhc2VkIHRlc3RzCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLUN1c3RvbWVyVXNlci0xIC0gU2V0IG5ldyBDdXN0b21lclVzZXIsIFdyb25nIFByb3BlcnRpZXNEYXRhYmFzZTogJywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ0RCLUN1c3RvbWVyVXNlci0xLUEnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXNEYXRhYmFzZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+IFskTmV3Q3VzdG9tZXJVc2VyTG9naW5dLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGUgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlID0+IFsnb3BlbiddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICduZXcnLAogICAgICAgICAgICAgICAgMiA9PiAnb3BlbicsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlICA9PiAnU3RhdGUnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICROZXdDdXN0b21lclVzZXJEYXRhe1VzZXJJRH0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMCwKICAgICAgICBSZXR1cm5EYXRhICAgPT4ge30sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBEQi1DdXN0b21lclVzZXItMSAtIFNldCBuZXcgQ3VzdG9tZXJVc2VyLCBDb3JyZWN0IFByb3BlcnRpZXNEYXRhYmFzZTogJywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ0RCLUN1c3RvbWVyVXNlci0xLUInID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXNEYXRhYmFzZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+IFskQ3VzdG9tZXJVc2VyTG9naW5dLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGUgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlID0+IFsnbmV3J10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJ25ldycsCiAgICAgICAgICAgICAgICAyID0+ICdvcGVuJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICdTdGF0ZScsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJE5ld0N1c3RvbWVyVXNlckRhdGF7VXNlcklEfSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAxLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7CiAgICAgICAgICAgIDEgPT4gJ25ldycsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLUN1c3RvbWVyVXNlci0xIC0gU2V0IG5ldyBDdXN0b21lclVzZXIsIFdyb25nIFByb3BlcnRpZXMsJwogICAgICAgICAgICAuICcgQ29ycmVjdCBQcm9wZXJ0aWVzRGF0YWJhc2U6ICcsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdEQi1DdXN0b21lclVzZXItMS1DJyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gWyRDdXN0b21lclVzZXJMb2dpbl0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzRGF0YWJhc2UgPT4gewogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiBbJEN1c3RvbWVyVXNlckxvZ2luXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSA9PiBbJ29wZW4nXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnbmV3JywKICAgICAgICAgICAgICAgIDIgPT4gJ29wZW4nLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJ1N0YXRlJywKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkTmV3Q3VzdG9tZXJVc2VyRGF0YXtVc2VySUR9LAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDAsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHt9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lID0+ICdBQ0wgREItQ3VzdG9tZXJVc2VyLTEgLSBTZXQgbmV3IEN1c3RvbWVyVXNlciwgQ29ycmVjdCBQcm9wZXJ0aWVzLCcKICAgICAgICAgICAgLiAnIENvcnJlY3QgUHJvcGVydGllc0RhdGFiYXNlOiAnLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnREItQ3VzdG9tZXJVc2VyLTEtUycgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+IFskTmV3Q3VzdG9tZXJVc2VyTG9naW5dLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUHJvcGVydGllc0RhdGFiYXNlID0+IHsKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gWyRDdXN0b21lclVzZXJMb2dpbl0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgPT4gWydvcGVuJ10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJ25ldycsCiAgICAgICAgICAgICAgICAyID0+ICdvcGVuJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICdTdGF0ZScsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJE5ld0N1c3RvbWVyVXNlckRhdGF7VXNlcklEfSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAxLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7CiAgICAgICAgICAgIDIgPT4gJ29wZW4nLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgcHJpb3JpdHkgYmFzZWQgdGVzdHMKICAgIHsKICAgICAgICBOYW1lID0+ICdBQ0wgREItUHJpb3JpdHktMSAtIFNlbnQgbmV3IHByaW9yaXR5LCBXcm9uZyBQcm9wZXJ0aWVzOiAnLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnREItUHJpb3JpdHktMS1BJyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzRGF0YWJhc2UgPT4gewogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiBbJE5ld1ByaW9yaXR5TmFtZV0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgPT4gWydvcGVuJ10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJ25ldycsCiAgICAgICAgICAgICAgICAyID0+ICdvcGVuJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAkTmV3UHJpb3JpdHlOYW1lLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMCwKICAgICAgICBSZXR1cm5EYXRhICAgPT4ge30sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBEQi1Qcmlvcml0eS0xIC0gU2VudCBuZXcgcHJpb3JpdHksIENvcnJlY3QgUHJvcGVydGllc0RhdGFiYXNlOiAnLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnREItUHJpb3JpdHktMS1CJyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzRGF0YWJhc2UgPT4gewogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiBbJFByaW9yaXR5TmFtZV0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgPT4gWyduZXcnXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnbmV3JywKICAgICAgICAgICAgICAgIDIgPT4gJ29wZW4nLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdTdGF0ZScsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICROZXdQcmlvcml0eU5hbWUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAxLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7CiAgICAgICAgICAgIDEgPT4gJ25ldycsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLVByaW9yaXR5LTEgLSBTZW50IG5ldyBwcmlvcml0eSwgV3JvbmcgUHJvcGVydGllcywnCiAgICAgICAgICAgIC4gJyBDb3JyZWN0IFByb3BlcnRpZXNEYXRhYmFzZTogJywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ0RCLVByaW9yaXR5LTEtQycgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+IFskUHJpb3JpdHlOYW1lXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFByb3BlcnRpZXNEYXRhYmFzZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+IFskUHJpb3JpdHlOYW1lXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSA9PiBbJ29wZW4nXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnbmV3JywKICAgICAgICAgICAgICAgIDIgPT4gJ29wZW4nLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdTdGF0ZScsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICROZXdQcmlvcml0eU5hbWUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAwLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7fSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLVByaW9yaXR5LTEgLSBTZW50IG5ldyBwcmlvcml0eSwgQ29ycmVjdCBQcm9wZXJ0aWVzLCcKICAgICAgICAgICAgLiAnIENvcnJlY3QgUHJvcGVydGllc0RhdGFiYXNlOiAnLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnREItUHJpb3JpdHktMS1EJyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWyROZXdQcmlvcml0eU5hbWVdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUHJvcGVydGllc0RhdGFiYXNlID0+IHsKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWyRQcmlvcml0eU5hbWVdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGUgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlID0+IFsnb3BlbiddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICduZXcnLAogICAgICAgICAgICAgICAgMiA9PiAnb3BlbicsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1N0YXRlJywKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJE5ld1ByaW9yaXR5TmFtZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMiA9PiAnb3BlbicsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBzbGEgYmFzZWQgdGVzdHMKICAgIHsKICAgICAgICBOYW1lID0+ICdBQ0wgREItU0xBLTEgLSBTZW50IG5ldyBTTEEsIFdyb25nIFByb3BlcnRpZXNEYXRhYmFzZTogJywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ0RCLVNMQS0xLUEnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXNEYXRhYmFzZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU0xBID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiBbJE5ld1NMQU5hbWVdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb3QgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlID0+IFsnb3BlbiddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICduZXcnLAogICAgICAgICAgICAgICAgMiA9PiAnb3BlbicsCiAgICAgICAgICAgICAgICAzID0+ICdjbG9zZWQnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1N0YXRlJywKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFNMQSAgICAgICAgICAgPT4gJE5ld1NMQU5hbWUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAwLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7fSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLVNMQS0xIC0gU2VudCBuZXcgU0xBLCBDb3JyZWN0IFByb3BlcnRpZXNEYXRhYmFzZTogJywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ0RCLVNMQS0xLUInID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXNEYXRhYmFzZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU0xBID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiBbJFNMQU5hbWVdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb3QgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlID0+IFsnbmV3J10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJ25ldycsCiAgICAgICAgICAgICAgICAyID0+ICdvcGVuJywKICAgICAgICAgICAgICAgIDMgPT4gJ2Nsb3NlZCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgU0xBICAgICAgICAgICA9PiAkTmV3U0xBTmFtZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMiA9PiAnb3BlbicsCiAgICAgICAgICAgIDMgPT4gJ2Nsb3NlZCcsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLVNMQS0xIC0gU2VudCBuZXcgU0xBLCBXcm9uZyBQcm9wZXJ0aWVzLCBDb3JyZWN0IFByb3BlcnRpZXNEYXRhYmFzZTogJywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ0RCLVNMQS0xLUMnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFNMQSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWyRTTEFOYW1lXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFByb3BlcnRpZXNEYXRhYmFzZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU0xBID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiBbJFNMQU5hbWVdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb3QgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlID0+IFsnb3BlbiddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICduZXcnLAogICAgICAgICAgICAgICAgMiA9PiAnb3BlbicsCiAgICAgICAgICAgICAgICAzID0+ICdjbG9zZWQnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1N0YXRlJywKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFNMQSAgICAgICAgICAgPT4gJE5ld1NMQU5hbWUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAwLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7fSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLVNMQS0xIC0gU2VudCBuZXcgU0xBLCBDb3JyZWN0IFByb3BlcnRpZXMsIENvcnJlY3QgUHJvcGVydGllc0RhdGFiYXNlOicsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdEQi1TTEEtMS1EJyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBTTEEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+IFskTmV3U0xBTmFtZV0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzRGF0YWJhc2UgPT4gewogICAgICAgICAgICAgICAgICAgIFNMQSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWyRTTEFOYW1lXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm90ID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSA9PiBbJ29wZW4nXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnbmV3JywKICAgICAgICAgICAgICAgIDIgPT4gJ29wZW4nLAogICAgICAgICAgICAgICAgMyA9PiAnY2xvc2VkJwogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdTdGF0ZScsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBTTEEgICAgICAgICAgID0+ICROZXdTTEFOYW1lLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAxID0+ICduZXcnLAogICAgICAgICAgICAzID0+ICdjbG9zZWQnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgc3RhdGUgYmFzZWQgdGVzdHMKICAgIHsKICAgICAgICBOYW1lID0+ICdBQ0wgREItU3RhdGUtMSAtIFNlbnQgbmV3IHN0YXRlLCBXcm9uZyBQcm9wZXJ0aWVzRGF0YWJhc2U6ICcsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdEQi1TdGF0ZS0xLUEnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXNEYXRhYmFzZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RhdGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+IFskTmV3U3RhdGVOYW1lXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm90ID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZSA9PiBbJ1JhdyddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICdSYXcnLAogICAgICAgICAgICAgICAgMiA9PiAnUG9zdE1hc3RlcicsCiAgICAgICAgICAgICAgICAzID0+ICdKdW5rJywKICAgICAgICAgICAgICAgIDQgPT4gJ01pc2MnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdRdWV1ZScsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBTdGF0ZSAgICAgICAgID0+ICROZXdTdGF0ZU5hbWUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAwLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7fSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLVN0YXRlLTEgLSBTZW50IG5ldyBzdGF0ZSwgQ29ycmVjdCBQcm9wZXJ0aWVzRGF0YWJhc2U6JywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ0RCLVN0YXRlLTEtQicgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllc0RhdGFiYXNlID0+IHsKICAgICAgICAgICAgICAgICAgICBTdGF0ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWyRTdGF0ZU5hbWVdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb3QgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXVlID0+IFsnSnVuayddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICdSYXcnLAogICAgICAgICAgICAgICAgMiA9PiAnUG9zdE1hc3RlcicsCiAgICAgICAgICAgICAgICAzID0+ICdKdW5rJywKICAgICAgICAgICAgICAgIDQgPT4gJ01pc2MnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdRdWV1ZScsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBTdGF0ZSAgICAgICAgID0+ICROZXdTdGF0ZU5hbWUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAxLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7CiAgICAgICAgICAgIDEgPT4gJ1JhdycsCiAgICAgICAgICAgIDIgPT4gJ1Bvc3RNYXN0ZXInLAogICAgICAgICAgICA0ID0+ICdNaXNjJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lID0+ICdBQ0wgREItU3RhdGUtMSAtIFNlbnQgbmV3IHN0YXRlLCBXcm9uZyBQcm9wZXJ0aWVzLCBDb3JyZWN0IFByb3BlcnRpZXNEYXRhYmFzZTonLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnREItU3RhdGUtMS1DJyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBTdGF0ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWyRTdGF0ZU5hbWVdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUHJvcGVydGllc0RhdGFiYXNlID0+IHsKICAgICAgICAgICAgICAgICAgICBTdGF0ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWyRTdGF0ZU5hbWVdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb3QgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXVlID0+IFsnUmF3J10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJ1JhdycsCiAgICAgICAgICAgICAgICAyID0+ICdQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgIDMgPT4gJ0p1bmsnLAogICAgICAgICAgICAgICAgNCA9PiAnTWlzYycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1F1ZXVlJywKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFN0YXRlICAgICAgICAgPT4gJE5ld1N0YXRlTmFtZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDAsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHt9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lID0+ICdBQ0wgREItU3RhdGUtMSAtIFNlbnQgbmV3IHN0YXRlLCBDb3JyZWN0IFByb3BlcnRpZXMsJwogICAgICAgICAgICAuICcgQ29ycmVjdCBQcm9wZXJ0aWVzRGF0YWJhc2U6JywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ0RCLVN0YXRlLTEtRCcgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RhdGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+IFskTmV3U3RhdGVOYW1lXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFByb3BlcnRpZXNEYXRhYmFzZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RhdGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+IFskU3RhdGVOYW1lXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm90ID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZSA9PiBbJ1JhdyddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICdSYXcnLAogICAgICAgICAgICAgICAgMiA9PiAnUG9zdE1hc3RlcicsCiAgICAgICAgICAgICAgICAzID0+ICdKdW5rJywKICAgICAgICAgICAgICAgIDQgPT4gJ01pc2MnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdRdWV1ZScsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBTdGF0ZSAgICAgICAgID0+ICROZXdTdGF0ZU5hbWUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAxLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7CiAgICAgICAgICAgIDIgPT4gJ1Bvc3RNYXN0ZXInLAogICAgICAgICAgICAzID0+ICdKdW5rJywKICAgICAgICAgICAgNCA9PiAnTWlzYycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBvd25lciBiYXNlZCB0ZXN0cwogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBEQi1Pd25lci0xIC0gU2VudCBuZXcgb3duZXIsIFdyb25nIFByb3BlcnRpZXNEYXRhYmFzZTogJywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ0RCLU93bmVyLTEtQScgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllc0RhdGFiYXNlID0+IHsKICAgICAgICAgICAgICAgICAgICBPd25lciA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiBbJE5ld1VzZXJMb2dpbl0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgPT4gWydvcGVuJ10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJ25ldycsCiAgICAgICAgICAgICAgICAyID0+ICdvcGVuJywKICAgICAgICAgICAgICAgIDMgPT4gJ2Nsb3NlZCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgT3duZXIgICAgICAgICA9PiAkTmV3VXNlckxvZ2luLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMCwKICAgICAgICBSZXR1cm5EYXRhICAgPT4ge30sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBEQi1Pd25lci0xIC0gU2VudCBuZXcgb3duZXIsIENvcnJlY3QgUHJvcGVydGllc0RhdGFiYXNlOiAnLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnREItT3duZXItMS1CJyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzRGF0YWJhc2UgPT4gewogICAgICAgICAgICAgICAgICAgIE93bmVyID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+IFskVXNlckxvZ2luXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSA9PiBbJ2Nsb3NlZCddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICduZXcnLAogICAgICAgICAgICAgICAgMiA9PiAnb3BlbicsCiAgICAgICAgICAgICAgICAzID0+ICdjbG9zZWQnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1N0YXRlJywKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIE93bmVyICAgICAgICAgPT4gJE5ld1VzZXJMb2dpbiwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMyA9PiAnY2xvc2VkJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lID0+ICdBQ0wgREItT3duZXItMSAtIFNlbnQgbmV3IG93bmVyLCBXcm9uZyBQcm9wZXJ0aWVzLCBDb3JyZWN0IFByb3BlcnRpZXNEYXRhYmFzZTogJywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ0RCLU93bmVyLTEtQycgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3duZXIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gWyRVc2VyTG9naW5dLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUHJvcGVydGllc0RhdGFiYXNlID0+IHsKICAgICAgICAgICAgICAgICAgICBPd25lciA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiBbJFVzZXJMb2dpbl0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgPT4gWydvcGVuJ10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJ25ldycsCiAgICAgICAgICAgICAgICAyID0+ICdvcGVuJywKICAgICAgICAgICAgICAgIDMgPT4gJ2Nsb3NlZCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgT3duZXIgICAgICAgICA9PiAkTmV3VXNlckxvZ2luLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMCwKICAgICAgICBSZXR1cm5EYXRhICAgPT4ge30sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBEQi1Pd25lci0xIC0gU2VudCBuZXcgb3duZXIsIENvcnJlY3QgUHJvcGVydGllcywnCiAgICAgICAgICAgIC4gJyBDb3JyZWN0IFByb3BlcnRpZXNEYXRhYmFzZTogJywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ0RCLU93bmVyLTEtRCcgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3duZXIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gWyROZXdVc2VyTG9naW5dLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUHJvcGVydGllc0RhdGFiYXNlID0+IHsKICAgICAgICAgICAgICAgICAgICBPd25lciA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiBbJFVzZXJMb2dpbl0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgPT4gWydvcGVuJ10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJ25ldycsCiAgICAgICAgICAgICAgICAyID0+ICdvcGVuJywKICAgICAgICAgICAgICAgIDMgPT4gJ2Nsb3NlZCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgT3duZXIgICAgICAgICA9PiAkTmV3VXNlckxvZ2luLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAyID0+ICdvcGVuJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIHJlc3BvbnNpYmxlIGJhc2VkIHRlc3RzCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLVJlc3BvbnNpYmxlLTEgLSBTZW50IG5ldyByZXNwb25zaWJsZSwgV3JvbmcgUHJvcGVydGllc0RhdGFiYXNlOiAnLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnREItUmVzcG9uc2libGUtMS1BJyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzRGF0YWJhc2UgPT4gewogICAgICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+IFskTmV3VXNlckxvZ2luXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm90ID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSA9PiBbJ29wZW4nXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnbmV3JywKICAgICAgICAgICAgICAgIDIgPT4gJ29wZW4nLAogICAgICAgICAgICAgICAgMyA9PiAnY2xvc2VkJwogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdTdGF0ZScsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBSZXNwb25zaWJsZSAgID0+ICROZXdVc2VyTG9naW4sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAwLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7fSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLVJlc3BvbnNpYmxlLTEgLSBTZW50IG5ldyByZXNwb25zaWJsZSwgQ29ycmVjdCBQcm9wZXJ0aWVzRGF0YWJhc2U6ICcsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdEQi1SZXNwb25zaWJsZS0xLUInID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXNEYXRhYmFzZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2libGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gWyRVc2VyTG9naW5dLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb3QgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlID0+IFsnY2xvc2VkJ10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJ25ldycsCiAgICAgICAgICAgICAgICAyID0+ICdvcGVuJywKICAgICAgICAgICAgICAgIDMgPT4gJ2Nsb3NlZCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgUmVzcG9uc2libGUgICA9PiAkTmV3VXNlckxvZ2luLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAxID0+ICduZXcnLAogICAgICAgICAgICAyID0+ICdvcGVuJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lID0+ICdBQ0wgREItUmVzcG9uc2libGUtMSAtIFNlbnQgbmV3IHJlc3BvbnNpYmxlLCBXcm9uZyBQcm9wZXJ0aWVzLCcKICAgICAgICAgICAgLiAnIENvcnJlY3QgUHJvcGVydGllc0RhdGFiYXNlOiAnLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnREItUmVzcG9uc2libGUtMS1DJyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBSZXNwb25zaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiBbJFVzZXJMb2dpbl0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzRGF0YWJhc2UgPT4gewogICAgICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+IFskVXNlckxvZ2luXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm90ID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSA9PiBbJ29wZW4nXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnbmV3JywKICAgICAgICAgICAgICAgIDIgPT4gJ29wZW4nLAogICAgICAgICAgICAgICAgMyA9PiAnY2xvc2VkJwogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdTdGF0ZScsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBSZXNwb25zaWJsZSAgID0+ICROZXdVc2VyTG9naW4sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAwLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7fSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLVJlc3BvbnNpYmxlLTEgLSBTZW50IG5ldyByZXNwb25zaWJsZSwgQ29ycmVjdCBQcm9wZXJ0aWVzLCcKICAgICAgICAgICAgLiAnIENvcnJlY3QgUHJvcGVydGllc0RhdGFiYXNlOicsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdEQi1SZXNwb25zaWJsZS0xLUQnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+IFskTmV3VXNlckxvZ2luXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFByb3BlcnRpZXNEYXRhYmFzZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2libGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gWyRVc2VyTG9naW5dLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb3QgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlID0+IFsnb3BlbiddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICduZXcnLAogICAgICAgICAgICAgICAgMiA9PiAnb3BlbicsCiAgICAgICAgICAgICAgICAzID0+ICdjbG9zZWQnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1N0YXRlJywKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFJlc3BvbnNpYmxlICAgPT4gJE5ld1VzZXJMb2dpbiwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMSA9PiAnbmV3JywKICAgICAgICAgICAgMyA9PiAnY2xvc2VkJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGZyb250ZW5kIGJhc2VkIHRlc3RzCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLUZyb250ZW5kLTEgLSBjb3JyZWN0IEFjdGlvbjogJywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ0RCLUZyb250ZW5kLTEnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXNEYXRhYmFzZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRnJvbnRlbmQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gPT4gWyAnQWdlbnRUaWNrZXRQaG9uZScsICdBZ2VudFRpY2tldEVtYWlsJyBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb3QgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFsgJzEgdmVyeSBsb3cnLCAnMyBtZWRpdW0nLCBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICAgICAgICAgIDQgPT4gJzQgaGlnaCcsCiAgICAgICAgICAgICAgICA1ID0+ICc1IHZlcnkgaGlnaCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICdBZ2VudFRpY2tldFBob25lJywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMiA9PiAnMiBsb3cnLAogICAgICAgICAgICA0ID0+ICc0IGhpZ2gnLAogICAgICAgICAgICA1ID0+ICc1IHZlcnkgaGlnaCcKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRpY2tldCBiYXNlZCB0ZXN0cwogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBEQi1UaWNrZXQtMSAtIFNlbnQgbmV3IHBhcmFtcywgV3JvbmcgUHJvcGVydGllc0RhdGFiYXNlIDonLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnREItVGlja2V0LTEtQScgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllc0RhdGFiYXNlID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZSAgICA9PiBbJE5ld1F1ZXVlTmFtZV0sCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFskTmV3UHJpb3JpdHlOYW1lXSwKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgICAgPT4gWyROZXdTdGF0ZU5hbWVdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGUgPT4gewogICAgICAgICAgICAgICAgICAgIEFjdGlvbiA9PiBbJ0FnZW50VGlja2V0Q29tcG9zZSddLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnQWdlbnRUaWNrZXRDbG9zZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJy0nLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgUXVldWUgICAgICAgICA9PiAkTmV3UXVldWVOYW1lLAogICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICROZXdQcmlvcml0eU5hbWUsCiAgICAgICAgICAgIFN0YXRlICAgICAgICAgPT4gJE5ld1N0YXRlTmFtZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCgogICAgICAgICMgQWN0aW9uIEFDTCBhbHdheXMgcmV0dXJuIGZhbHNlCiAgICAgICAgU3VjY2Vzc01hdGNoICAgICA9PiAwLAogICAgICAgIFJldHVybkFjdGlvbkRhdGEgPT4ge30sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBEQi1UaWNrZXQtMSAtIFNlbnQgbmV3IHBhcmFtcywgQ29ycmVjdCBQcm9wZXJ0aWVzRGF0YWJhc2U6ICcsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdEQi1UaWNrZXQtMS1CJyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzRGF0YWJhc2UgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXVlICAgID0+IFskUXVldWVOYW1lXSwKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gWyRQcmlvcml0eU5hbWVdLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICA9PiBbJFN0YXRlTmFtZV0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQWN0aW9uID0+IFsgJ0FnZW50VGlja2V0Q2xvc2UnLCAnQWdlbnRUaWNrZXRCb3VuY2UnLCBdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnQWdlbnRUaWNrZXRDbG9zZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJy0nLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgUXVldWUgICAgICAgICA9PiAkTmV3UXVldWVOYW1lLAogICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICROZXdQcmlvcml0eU5hbWUsCiAgICAgICAgICAgIFN0YXRlICAgICAgICAgPT4gJE5ld1N0YXRlTmFtZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCgogICAgICAgICMgQWN0aW9uIEFDTCBhbHdheXMgcmV0dXJuIGZhbHNlCiAgICAgICAgU3VjY2Vzc01hdGNoICAgICA9PiAxLAogICAgICAgIFJldHVybkFjdGlvbkRhdGEgPT4gewogICAgICAgICAgICAxID0+ICdBZ2VudFRpY2tldENsb3NlJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lID0+ICdBQ0wgREItVGlja2V0LTEgLSBTZW50IG5ldyBwYXJhbXMsIFdyb25nIFByb3BlcnRpZXMsJwogICAgICAgICAgICAuICcgQ29ycmVjdCBQcm9wZXJ0aWVzRGF0YWJhc2U6JywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ0RCLVRpY2tldC0xLUMnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXVlICAgID0+IFskUXVldWVOYW1lXSwKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gWyRQcmlvcml0eU5hbWVdLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICA9PiBbJFN0YXRlTmFtZV0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzRGF0YWJhc2UgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXVlICAgID0+IFskUXVldWVOYW1lXSwKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gWyRQcmlvcml0eU5hbWVdLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICA9PiBbJFN0YXRlTmFtZV0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQWN0aW9uID0+IFsnQWdlbnRUaWNrZXRDb21wb3NlJ10sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICdBZ2VudFRpY2tldENsb3NlJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aW9uJywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnLScsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBRdWV1ZSAgICAgICAgID0+ICROZXdRdWV1ZU5hbWUsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJE5ld1ByaW9yaXR5TmFtZSwKICAgICAgICAgICAgU3RhdGUgICAgICAgICA9PiAkTmV3U3RhdGVOYW1lLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggICAgID0+IDAsCiAgICAgICAgUmV0dXJuQWN0aW9uRGF0YSA9PiB7fSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLVRpY2tldC0yIC0gU2VudCBuZXcgcGFyYW1zLCBXcm9uZyBQcm9wZXJ0aWVzLCcKICAgICAgICAgICAgLiAnIENvcnJlY3QgUHJvcGVydGllc0RhdGFiYXNlOicsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdEQi1UaWNrZXQtMS1EJyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZSAgICA9PiBbJE5ld1F1ZXVlTmFtZV0sCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFskTmV3UHJpb3JpdHlOYW1lXSwKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgICAgPT4gWyROZXdTdGF0ZU5hbWVdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUHJvcGVydGllc0RhdGFiYXNlID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZSAgICA9PiBbJFF1ZXVlTmFtZV0sCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFskUHJpb3JpdHlOYW1lXSwKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgICAgPT4gWyRTdGF0ZU5hbWVdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGUgPT4gewogICAgICAgICAgICAgICAgICAgIEFjdGlvbiA9PiBbJ0FnZW50VGlja2V0Q29tcG9zZSddLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnQWdlbnRUaWNrZXRDbG9zZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJy0nLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgUXVldWUgICAgICAgICA9PiAkTmV3UXVldWVOYW1lLAogICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICROZXdQcmlvcml0eU5hbWUsCiAgICAgICAgICAgIFN0YXRlICAgICAgICAgPT4gJE5ld1N0YXRlTmFtZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCgogICAgICAgICMgQWN0aW9uIEFDTCBhbHdheXMgcmV0dXJuIGZhbHNlCiAgICAgICAgU3VjY2Vzc01hdGNoICAgICA9PiAxLAogICAgICAgIFJldHVybkFjdGlvbkRhdGEgPT4ge30KICAgIH0sCgogICAgIyBkeW5hbWljIGZpZWxkcyBiYXNlZCB0ZXN0cwogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBEQi1EeW5hbWljRmllbGQtMSAtIFNlbnQgbmV3IGR5bmFtaWMgZmllbGQgdmFsdWUsJwogICAgICAgICAgICAuICcgV3JvbmcgUHJvcGVydGllc0RhdGFiYXNlOiAnLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnREItRHluYW1pY0ZpZWxkLTEtQScgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllc0RhdGFiYXNlID0+IHsKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkTmFtZXNbMF0gPT4gWydJdGVtMiddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb3QgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlID0+IFsnb3BlbiddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICduZXcnLAogICAgICAgICAgICAgICAgMiA9PiAnb3BlbicsCiAgICAgICAgICAgICAgICAzID0+ICdjbG9zZWQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdTdGF0ZScsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBEeW5hbWljRmllbGQgID0+IHsKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGROYW1lc1swXSA9PiBbJ0l0ZW0yJ10KICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMCwKICAgICAgICBSZXR1cm5EYXRhICAgPT4ge30sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBEQi1EeW5hbWljRmllbGQtMSAtIFNlbnQgbmV3IGR5bmFtaWMgZmllbGQgdmFsdWUsJwogICAgICAgICAgICAuICcgQ29ycmVjdCBQcm9wZXJ0aWVzRGF0YWJhc2U6ICcsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdEQi1EeW5hbWljRmllbGQtMS1CJyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzRGF0YWJhc2UgPT4gewogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGROYW1lc1swXSA9PiBbJ0l0ZW0xJ10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgPT4gWyduZXcnXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnbmV3JywKICAgICAgICAgICAgICAgIDIgPT4gJ29wZW4nLAogICAgICAgICAgICAgICAgMyA9PiAnY2xvc2VkJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkICA9PiB7CiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkTmFtZXNbMF0gPT4gWydJdGVtMiddCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMiA9PiAnb3BlbicsCiAgICAgICAgICAgIDMgPT4gJ2Nsb3NlZCcsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLUR5bmFtaWNGaWVsZC0xIC0gU2VudCBuZXcgZHluYW1pYyBmaWVsZCB2YWx1ZSwgV3JvbmcgUHJvcGVydGllcywnCiAgICAgICAgICAgIC4gJyBDb3JyZWN0IFByb3BlcnRpZXNEYXRhYmFzZTogJywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ0RCLUR5bmFtaWNGaWVsZC0xLUMnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGROYW1lc1swXSA9PiBbJ0l0ZW0xJ10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzRGF0YWJhc2UgPT4gewogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGROYW1lc1swXSA9PiBbJ0l0ZW0xJ10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgPT4gWydvcGVuJ10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJ25ldycsCiAgICAgICAgICAgICAgICAyID0+ICdvcGVuJywKICAgICAgICAgICAgICAgIDMgPT4gJ2Nsb3NlZCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1N0YXRlJywKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIER5bmFtaWNGaWVsZCAgPT4gewogICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZE5hbWVzWzBdID0+IFsnSXRlbTInXQogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAwLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7fSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLUR5bmFtaWNGaWVsZC0xIC0gU2VudCBuZXcgZHluYW1pYyBmaWVsZCB2YWx1ZSwgQ29ycmVjdCBQcm9wZXJ0aWVzLCcKICAgICAgICAgICAgLiAnIENvcnJlY3QgUHJvcGVydGllc0RhdGFiYXNlOiAnLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnREItRHluYW1pY0ZpZWxkLTEtQycgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZE5hbWVzWzBdID0+IFsnSXRlbTInXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFByb3BlcnRpZXNEYXRhYmFzZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZE5hbWVzWzBdID0+IFsnSXRlbTEnXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm90ID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSA9PiBbJ29wZW4nXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnbmV3JywKICAgICAgICAgICAgICAgIDIgPT4gJ29wZW4nLAogICAgICAgICAgICAgICAgMyA9PiAnY2xvc2VkJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkICA9PiB7CiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkTmFtZXNbMF0gPT4gWydJdGVtMiddCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMSA9PiAnbmV3JywKICAgICAgICAgICAgMyA9PiAnY2xvc2VkJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lID0+ICdBQ0wgREItRHluYW1pY0ZpZWxkIC0gcmVzdHJpY3QgYWN0aW9uJywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ0RCLUR5bmFtaWNGaWVsZCcgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZE5hbWVzWzBdID0+IFsnSXRlbTEnXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm90ID0+IHsKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gPT4gWydBZ2VudFRpY2tldENsb3NlJ10sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICdBZ2VudFRpY2tldFByaW50JywKICAgICAgICAgICAgICAgIDIgPT4gJ0FnZW50VGlja2V0Q2xvc2UnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpb24nLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCAgICAgPT4gMSwKICAgICAgICBSZXR1cm5BY3Rpb25EYXRhID0+IHsKICAgICAgICAgICAgMSA9PiAnQWdlbnRUaWNrZXRQcmludCcsCiAgICAgICAgICAgIH0KICAgIH0sCgogICAgIyB1c2VyIGJhc2VkIHRlc3RzCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLVVzZXItMSAtIFdyb25nIFByb3BlcnRpZXNEYXRhYmFzZTogJywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ0RCLVVzZXItMS1BJyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzRGF0YWJhc2UgPT4gewogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gWyROZXdVc2VyTG9naW5dLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb3QgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFsgJzEgdmVyeSBsb3cnLCAnMyBtZWRpdW0nLCBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICAgICAgICAgIDQgPT4gJzQgaGlnaCcsCiAgICAgICAgICAgICAgICA1ID0+ICc1IHZlcnkgaGlnaCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMCwKICAgICAgICBSZXR1cm5EYXRhICAgPT4ge30sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBEQi1Vc2VyLTEgLSBDb3JyZWN0IFByb3BlcnRpZXNEYXRhYmFzZTogJywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ0RCLVVzZXItMS1CJyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzRGF0YWJhc2UgPT4gewogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gWyRVc2VyTG9naW5dLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb3QgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFsnMiBsb3cnXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgICAgICAyID0+ICcyIGxvdycsCiAgICAgICAgICAgICAgICAzID0+ICczIG1lZGl1bScsCiAgICAgICAgICAgICAgICA0ID0+ICc0IGhpZ2gnLAogICAgICAgICAgICAgICAgNSA9PiAnNSB2ZXJ5IGhpZ2gnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICAgICAgNCA9PiAnNCBoaWdoJywKICAgICAgICAgICAgNSA9PiAnNSB2ZXJ5IGhpZ2gnCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLVVzZXItMSAtIFdyb25nIFByb3BlcnRpZXMsIENvcnJlY3QgUHJvcGVydGllc0RhdGFiYXNlOiAnLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnREItVXNlci0xLUMnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gWyROZXdVc2VyTG9naW5dLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUHJvcGVydGllc0RhdGFiYXNlID0+IHsKICAgICAgICAgICAgICAgICAgICBVc2VyID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+IFskVXNlckxvZ2luXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm90ID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiBbJzIgbG93J10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICAgICAgMiA9PiAnMiBsb3cnLAogICAgICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgICAgICAgICAgNCA9PiAnNCBoaWdoJywKICAgICAgICAgICAgICAgIDUgPT4gJzUgdmVyeSBoaWdoJwogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAwLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7fSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLVVzZXItMSAtIENvcnJlY3QgUHJvcGVydGllcywgQ29ycmVjdCBQcm9wZXJ0aWVzRGF0YWJhc2U6ICcsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdEQi1Vc2VyLTEtRCcgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiBbJFVzZXJMb2dpbl0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzRGF0YWJhc2UgPT4gewogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gWyRVc2VyTG9naW5dLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb3QgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFsgJzEgdmVyeSBsb3cnLCAnMyBtZWRpdW0nLCBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICAgICAgICAgIDQgPT4gJzQgaGlnaCcsCiAgICAgICAgICAgICAgICA1ID0+ICc1IHZlcnkgaGlnaCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAyID0+ICcyIGxvdycsCiAgICAgICAgICAgIDQgPT4gJzQgaGlnaCcsCiAgICAgICAgICAgIDUgPT4gJzUgdmVyeSBoaWdoJwogICAgICAgIH0sCiAgICB9LAopOwoKIyBHZXQgcm9sZSBvYmplY3QuCm15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwoKIyBBZGQgc29tZSByb2xlcwpteSAkUm9sZUlEMSA9ICRHcm91cE9iamVjdC0+Um9sZUFkZCgKICAgIE5hbWUgICAgPT4gInVuaXR0ZXN0MS0kUmFuZG9tSUQiLAogICAgQ29tbWVudCA9PiAnY29tbWVudCBkZXNjcmliaW5nIHRoZSByb2xlJywKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKJFNlbGYtPklzTm90KAogICAgJFJvbGVJRDEsCiAgICB1bmRlZiwKICAgICJSb2xlQWRkKCkgLSBSb2xlSUQxIiwKKTsKbXkgJFJvbGVJRDIgPSAkR3JvdXBPYmplY3QtPlJvbGVBZGQoCiAgICBOYW1lICAgID0+ICJ1bml0dGVzdDItJFJhbmRvbUlEIiwKICAgIENvbW1lbnQgPT4gJ2NvbW1lbnQgZGVzY3JpYmluZyB0aGUgcm9sZScsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CiRTZWxmLT5Jc05vdCgKICAgICRSb2xlSUQyLAogICAgdW5kZWYsCiAgICAiUm9sZUFkZCgpIC0gUm9sZUlEMiIsCik7CgpteSAkUmVtb3ZlUm9sZXMgPSBzdWIgewoKICAgIGZvciBteSAkUm9sZUlEICggJFJvbGVJRDEsICRSb2xlSUQyICkgewogICAgICAgIG15ICRTdWNjZXNzID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uUm9sZVVzZXJBZGQoCiAgICAgICAgICAgIFVJRCAgICA9PiAkVXNlcklELAogICAgICAgICAgICBSSUQgICAgPT4gJFJvbGVJRCwKICAgICAgICAgICAgQWN0aXZlID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiVGVzdCB1c2VyIHJlbW92ZWQgZnJvbSBSb2xlICRSb2xlSUQiLAogICAgICAgICk7CiAgICB9Cn07CgpteSAkRXhlY3V0ZVRlc3RzID0gc3ViIHsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgQFRlc3RzID0gQHsgJFBhcmFte1Rlc3RzfSB9OwoKICAgIGZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgICAgICMgY2xlYW4gcHJldmlvdXMgZGF0YQogICAgICAgICRUaWNrZXRPYmplY3QtPntUaWNrZXRBY2xEYXRhfSA9IHt9OwoKICAgICAgICBpZiAoICRUZXN0LT57QWRkUm9sZXN9ICkgewogICAgICAgICAgICAkUmVtb3ZlUm9sZXMtPigpOwogICAgICAgICAgICBmb3IgbXkgJFJvbGVJRCAoIEB7ICRUZXN0LT57QWRkUm9sZXN9IH0gKSB7CiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvblJvbGVVc2VyQWRkKAogICAgICAgICAgICAgICAgICAgIFVJRCAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgICAgIFJJRCAgICA9PiAkUm9sZUlELAogICAgICAgICAgICAgICAgICAgIEFjdGl2ZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgICAgICJUZXN0IHVzZXIgYWRkZWQgdG8gUm9sZSAkUm9sZUlEIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRDb25maWdPYmplY3QtPlNldCgKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldEFjbCcsCiAgICAgICAgICAgIFZhbHVlID0+ICRUZXN0LT57QUNMc30sCiAgICAgICAgKTsKCiAgICAgICAgJEdvdEFDTHMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFjbCcpOwoKICAgICAgICAjIHNhbml0eSBjaGVjawogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgJEdvdEFDTHMsCiAgICAgICAgICAgICRUZXN0LT57QUNMc30sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IEFDTHMgU2V0IGFuZCBHZXQgZnJvbSBzeXNjb25maWciLAogICAgICAgICk7CgogICAgICAgIG15ICRDb25maWcgICAgID0gJFRlc3QtPntDb25maWd9OwogICAgICAgIG15ICRBQ0xTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKCAleyAkVGVzdC0+e0NvbmZpZ30gfSApOwoKICAgICAgICAjIGdldCB0aGUgZGF0YSBmcm9tIEFDTAogICAgICAgIG15ICVBQ0xEYXRhID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICBpZiAoICEkVGVzdC0+e1N1Y2Nlc3NNYXRjaH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRBQ0xTdWNjZXNzLAogICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gRXhlY3V0ZWQgd2l0aCBGYWxzZSIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgICAgICBcJUFDTERhdGEsCiAgICAgICAgICAgICAgICB7fSwKICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IEFDTCBkYXRhIG11c3QgYmUgZW1wdHkiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgIGlmICggJFRlc3QtPntDb25maWd9LT57UmV0dXJuVHlwZX0gZXEgJ0FjdGlvbicgKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgdGhlIGFjdGlvbiBkYXRhIGZyb20gQUNMCiAgICAgICAgICAgICAgICAjIEFjdGlvbiBBQ0wgYWx3YXlzIHJldHVybiBmYWxzZQogICAgICAgICAgICAgICAgbXkgJUFDTEFjdGlvbkRhdGEgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CgogICAgICAgICAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAgICAgICAgIFwlQUNMQWN0aW9uRGF0YSwKICAgICAgICAgICAgICAgICAgICAkVGVzdC0+e1JldHVybkFjdGlvbkRhdGF9LAogICAgICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IEFDTCBhY3Rpb24gZGF0YSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAgICAgJEFDTFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gRXhlY3V0ZWQgd2l0aCBUcnVlIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAgICAgICAgIFwlQUNMRGF0YSwKICAgICAgICAgICAgICAgICAgICAkVGVzdC0+e1JldHVybkRhdGF9LAogICAgICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IEFDTCBkYXRhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2xlYW4gQUNMcwogICAgICAgICRDb25maWdPYmplY3QtPlNldCgKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldEFjbCcsCiAgICAgICAgICAgIFZhbHVlID0+IHt9LAogICAgICAgICk7CgogICAgICAgICRHb3RBQ0xzID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRBY2wnKTsKCiAgICAgICAgIyBzYW5pdHkgY2hlY2sKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgICRHb3RBQ0xzLAogICAgICAgICAgICB7fSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gQUNMcyBhcmUgY2xlYW4iLAogICAgICAgICk7CgogICAgICAgIGlmICggJFRlc3QtPntBZGRSb2xlc30gKSB7CiAgICAgICAgICAgICRSZW1vdmVSb2xlcy0+KCk7CiAgICAgICAgfQogICAgfQp9OwokRXhlY3V0ZVRlc3RzLT4oIFRlc3RzID0+IFxAVGVzdHMgKTsKCiMgc3BlY2lhbCB0ZXN0cwpAVGVzdHMgPSAoCgogICAgIyBQcm9wZXJ0aWVzIE5vdAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBRdWV1ZSAtIFVzaW5nIFtOb3RdOicsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdOb3QtUXVldWUtUmF3JyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBRdWV1ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWydbTm90XVJhdyddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGUgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFsgJzEgdmVyeSBsb3cnLCAnMyBtZWRpdW0nLCBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICAgICAgICAgIDQgPT4gJzQgaGlnaCcsCiAgICAgICAgICAgICAgICA1ID0+ICc1IHZlcnkgaGlnaCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgID0+ICdNaXNjJywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lID0+ICdBQ0wgUXVldWUgLSBVc2luZyBbTm90XSBOZWdhdGVkIFF1ZXVlOicsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdOb3QtUXVldWUtUmF3JyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBRdWV1ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWydbTm90XVJhdyddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGUgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFsgJzEgdmVyeSBsb3cnLCAnMyBtZWRpdW0nLCBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICAgICAgICAgIDQgPT4gJzQgaGlnaCcsCiAgICAgICAgICAgICAgICA1ID0+ICc1IHZlcnkgaGlnaCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgID0+ICdSYXcnLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMCwKICAgICAgICBSZXR1cm5EYXRhICAgPT4ge30sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBRdWV1ZSAtIFVzaW5nIFtOb3RdIGluIGFuIEFycmF5OicsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdOb3QtUXVldWUtUmF3JyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBRdWV1ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWyAnW05vdF1SYXcnLCAnW05vdF1Qb3N0bWFzdGVyJyBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGUgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFsgJzEgdmVyeSBsb3cnLCAnMyBtZWRpdW0nLCBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICAgICAgICAgIDQgPT4gJzQgaGlnaCcsCiAgICAgICAgICAgICAgICA1ID0+ICc1IHZlcnkgaGlnaCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgID0+ICdNaXNjJywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIFByb3BlcnRpZXMgTm90UmVnRXhwCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIFF1ZXVlIC0gVXNpbmcgW05vdFJlZ0V4cF06JywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ05vdC1RdWV1ZS1SYXcnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFF1ZXVlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiBbJ1tOb3RSZWdFeHBdSFcnXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiBbICcxIHZlcnkgbG93JywgJzMgbWVkaXVtJywgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgICAgICAyID0+ICcyIGxvdycsCiAgICAgICAgICAgICAgICAzID0+ICczIG1lZGl1bScsCiAgICAgICAgICAgICAgICA0ID0+ICc0IGhpZ2gnLAogICAgICAgICAgICAgICAgNSA9PiAnNSB2ZXJ5IGhpZ2gnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgUXVldWUgICAgICAgICA9PiAnTWlzYycsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAxLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7CiAgICAgICAgICAgIDEgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICAzID0+ICczIG1lZGl1bScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIFF1ZXVlIC0gVXNpbmcgW05vdFJlZ0V4cF0gTmVnYXRlZCBRdWV1ZTonLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnTm90LVF1ZXVlLVJhdycgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgUXVldWUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+IFsnW05vdFJlZ0V4cF1hdyddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGUgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFsgJzEgdmVyeSBsb3cnLCAnMyBtZWRpdW0nLCBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICAgICAgICAgIDQgPT4gJzQgaGlnaCcsCiAgICAgICAgICAgICAgICA1ID0+ICc1IHZlcnkgaGlnaCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgID0+ICdSYXcnLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMCwKICAgICAgICBSZXR1cm5EYXRhICAgPT4ge30sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBRdWV1ZSAtIFVzaW5nIFtOb3RSZWdFeHBdIGluIGFuIEFycmF5OicsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdOb3QtUXVldWUtUmF3JyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBRdWV1ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWyAnW05vdFJlZ0V4cF1hdycsICdbTm90UmVnRXhwXW1hc3RlcicgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiBbICcxIHZlcnkgbG93JywgJzMgbWVkaXVtJywgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgICAgICAyID0+ICcyIGxvdycsCiAgICAgICAgICAgICAgICAzID0+ICczIG1lZGl1bScsCiAgICAgICAgICAgICAgICA0ID0+ICc0IGhpZ2gnLAogICAgICAgICAgICAgICAgNSA9PiAnNSB2ZXJ5IGhpZ2gnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgUXVldWUgICAgICAgICA9PiAnTWlzYycsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAxLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7CiAgICAgICAgICAgIDEgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICAzID0+ICczIG1lZGl1bScsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBQcm9wZXJ0aWVzIE5vdHJlZ2V4cAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBRdWV1ZSAtIFVzaW5nIFtOb3RyZWdleHBdOicsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdOb3QtUXVldWUtUmF3JyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBRdWV1ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWydbTm90cmVnZXhwXUhXJ10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gWyAnMSB2ZXJ5IGxvdycsICczIG1lZGl1bScsIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICAgICAgMiA9PiAnMiBsb3cnLAogICAgICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgICAgICAgICAgNCA9PiAnNCBoaWdoJywKICAgICAgICAgICAgICAgIDUgPT4gJzUgdmVyeSBoaWdoJwogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIFF1ZXVlICAgICAgICAgPT4gJ01pc2MnLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBRdWV1ZSAtIFVzaW5nIFtOb3RyZWdleHBdIE5lZ2F0ZWQgUXVldWU6JywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ05vdC1RdWV1ZS1SYXcnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFF1ZXVlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiBbJ1tOb3RyZWdleHBdcmEnXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiBbICcxIHZlcnkgbG93JywgJzMgbWVkaXVtJywgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgICAgICAyID0+ICcyIGxvdycsCiAgICAgICAgICAgICAgICAzID0+ICczIG1lZGl1bScsCiAgICAgICAgICAgICAgICA0ID0+ICc0IGhpZ2gnLAogICAgICAgICAgICAgICAgNSA9PiAnNSB2ZXJ5IGhpZ2gnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgUXVldWUgICAgICAgICA9PiAnUmF3JywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDAsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHt9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lID0+ICdBQ0wgUXVldWUgLSBVc2luZyBbTm90cmVnZXhwXSBpbiBhbiBBcnJheTonLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnTm90LVF1ZXVlLVJhdycgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgUXVldWUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+IFsgJ1tOb3RyZWdleHBdcmEnLCAnW05vdHJlZ2V4cF1tYXN0ZXInIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gWyAnMSB2ZXJ5IGxvdycsICczIG1lZGl1bScsIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICAgICAgMiA9PiAnMiBsb3cnLAogICAgICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgICAgICAgICAgNCA9PiAnNCBoaWdoJywKICAgICAgICAgICAgICAgIDUgPT4gJzUgdmVyeSBoaWdoJwogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIFF1ZXVlICAgICAgICAgPT4gJ01pc2MnLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgY29tYmluYXRpb24gcG9zc2libGUsIHBvc3NpYmxlIG5vdAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBRdWV1ZSAtIFBvc3NpYmxlL1Bvc3NpYmxlTm90OicsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdRdWV1ZS1Qb3NzaWJsZS1Qcmlvcml0eScgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgUXVldWUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+IFsnUmF3J10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gWyAnMSB2ZXJ5IGxvdycsICcyIGxvdycsICczIG1lZGl1bScsIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdRdWV1ZS1Qb3NzaWJsZS1Qcmlvcml0eTInID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFF1ZXVlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiBbJ1JhdyddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb3QgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFsgJzIgbG93JywgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgICAgICAyID0+ICcyIGxvdycsCiAgICAgICAgICAgICAgICAzID0+ICczIG1lZGl1bScsCiAgICAgICAgICAgICAgICA0ID0+ICc0IGhpZ2gnLAogICAgICAgICAgICAgICAgNSA9PiAnNSB2ZXJ5IGhpZ2gnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgUXVldWUgICAgICAgICA9PiAnUmF3JywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lID0+ICdBQ0wgUXVldWUgLSBQb3NzaWJsZS9Qb3NzaWJsZU5vdCBKb2luOicsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdRdWV1ZS1Qb3NzaWJsZS1Qcmlvcml0eScgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgUXVldWUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+IFsnUmF3J10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gWyAnMSB2ZXJ5IGxvdycsICcyIGxvdycsICczIG1lZGl1bScsIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gWyAnMiBsb3cnLCBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICAgICAgICAgIDQgPT4gJzQgaGlnaCcsCiAgICAgICAgICAgICAgICA1ID0+ICc1IHZlcnkgaGlnaCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgID0+ICdSYXcnLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBRdWV1ZSAtIFBvc3NpYmxlTm90IG9ubHk6JywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ1F1ZXVlLVBvc3NpYmxlLVByaW9yaXR5MicgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgUXVldWUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+IFsnUmF3J10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gWyAnMiBsb3cnLCBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICAgICAgICAgIDQgPT4gJzQgaGlnaCcsCiAgICAgICAgICAgICAgICA1ID0+ICc1IHZlcnkgaGlnaCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgID0+ICdSYXcnLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgICAgICA0ID0+ICc0IGhpZ2gnLAogICAgICAgICAgICA1ID0+ICc1IHZlcnkgaGlnaCcsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLVVzZXItMSAtIFBvc3NpYmxlL1Bvc3NpYmxlQWRkOiAnLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnREItVXNlci0xLUQnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gWyRVc2VyTG9naW5dLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiBbJFVzZXJMb2dpbl0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gWyAnMSB2ZXJ5IGxvdycsICczIG1lZGl1bScsIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdEQi1Vc2VyLTEtRScgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiBbJFVzZXJMb2dpbl0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBVc2VyID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+IFskVXNlckxvZ2luXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlQWRkID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiBbICc0IGhpZ2gnLCBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICAgICAgICAgIDQgPT4gJzQgaGlnaCcsCiAgICAgICAgICAgICAgICA1ID0+ICc1IHZlcnkgaGlnaCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgICAgICA0ID0+ICc0IGhpZ2gnCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIERCLVVzZXItMSAtIFBvc3NpYmxlL1Bvc3NpYmxlQWRkL1Bvc3NpYmxlOiAnLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnREItVXNlci0xLUQnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gWyRVc2VyTG9naW5dLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiBbJFVzZXJMb2dpbl0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gWyAnMSB2ZXJ5IGxvdycsICczIG1lZGl1bScsIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdEQi1Vc2VyLTEtRScgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiBbJFVzZXJMb2dpbl0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBVc2VyID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+IFskVXNlckxvZ2luXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlQWRkID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiBbICc0IGhpZ2gnLCBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICAnREItVXNlci0xLUYnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gWyRVc2VyTG9naW5dLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiBbJFVzZXJMb2dpbl0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gWyAnNCBoaWdoJywgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICAgICAgMiA9PiAnMiBsb3cnLAogICAgICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgICAgICAgICAgNCA9PiAnNCBoaWdoJywKICAgICAgICAgICAgICAgIDUgPT4gJzUgdmVyeSBoaWdoJwogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAxLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7CiAgICAgICAgICAgIDQgPT4gJzQgaGlnaCcKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lID0+ICdBQ0wgUXVldWUgLSBQb3NzaWJsZU5vdC9Qb3NzaWJsZUFkZDonLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnUXVldWUtUG9zc2libGUtUHJpb3JpdHkxJyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBRdWV1ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWydSYXcnXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm90ID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiBbICcxIHZlcnkgbG93JywgJzIgbG93JywgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ1F1ZXVlLVBvc3NpYmxlLVByaW9yaXR5MicgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgUXVldWUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+IFsnUmF3J10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZUFkZCA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gWyAnMiBsb3cnLCBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICAgICAgICAgIDQgPT4gJzQgaGlnaCcsCiAgICAgICAgICAgICAgICA1ID0+ICc1IHZlcnkgaGlnaCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgID0+ICdSYXcnLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAyID0+ICcyIGxvdycsCiAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICAgICAgNCA9PiAnNCBoaWdoJywKICAgICAgICAgICAgNSA9PiAnNSB2ZXJ5IGhpZ2gnCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIFF1ZXVlIC0gUG9zc2libGVOb3QvUG9zc2libGU6JywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ1F1ZXVlLVBvc3NpYmxlLVByaW9yaXR5MScgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgUXVldWUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+IFsnUmF3J10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gWyAnMiBsb3cnLCBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICAnUXVldWUtUG9zc2libGUtUHJpb3JpdHkyJyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBRdWV1ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWydSYXcnXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiBbICcxIHZlcnkgbG93JywgJzIgbG93JywgJzMgbWVkaXVtJywgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgICAgICAyID0+ICcyIGxvdycsCiAgICAgICAgICAgICAgICAzID0+ICczIG1lZGl1bScsCiAgICAgICAgICAgICAgICA0ID0+ICc0IGhpZ2gnLAogICAgICAgICAgICAgICAgNSA9PiAnNSB2ZXJ5IGhpZ2gnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgUXVldWUgICAgICAgICA9PiAnUmF3JywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBRdWV1ZSAtIFBvc3NpYmxlL1Bvc3NpYmxlQWRkL1Bvc3NpYmxlTm90OicsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdRdWV1ZS1Qb3NzaWJsZS1Qcmlvcml0eTEnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFF1ZXVlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiBbJ1JhdyddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGUgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFsgJzEgdmVyeSBsb3cnLCAnMiBsb3cnLCBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICAnUXVldWUtUG9zc2libGUtUHJpb3JpdHkyJyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBRdWV1ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gWydSYXcnXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlQWRkID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiBbICcyIGxvdycsICczIG1lZGl1bScsICc0IGhpZ2gnIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdRdWV1ZS1Qb3NzaWJsZS1Qcmlvcml0eTMnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFF1ZXVlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiBbJ1JhdyddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb3QgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFsgJzMgbWVkaXVtJywgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgICAgICAyID0+ICcyIGxvdycsCiAgICAgICAgICAgICAgICAzID0+ICczIG1lZGl1bScsCiAgICAgICAgICAgICAgICA0ID0+ICc0IGhpZ2gnLAogICAgICAgICAgICAgICAgNSA9PiAnNSB2ZXJ5IGhpZ2gnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgUXVldWUgICAgICAgICA9PiAnUmF3JywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDEsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgNCA9PiAnNCBoaWdoJywKICAgICAgICB9LAogICAgfSwKKTsKJFNlbGYtPlRydWUoCiAgICAxLAogICAgIi0tLSBTdGFydCBTcGVjaWFsIEFDTCBUZXN0cyAtLS0iLAopOwokRXhlY3V0ZVRlc3RzLT4oIFRlc3RzID0+IFxAVGVzdHMgKTsKCiMgQXJyYXkgbWF0Y2ggdGVzdHMKbXkgQFRlc3RzTm9ybWFsID0gKAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBVc2VyIFJvbGUgLSBObyByb2xlcyBjaGVjayB1bml0dGVzdDEnLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnUm9sZS1UZXN0JyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBVc2VyID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUm9sZSA9PiBbInVuaXR0ZXN0MS0kUmFuZG9tSUQiXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiBbICcxIHZlcnkgbG93JywgJzMgbWVkaXVtJywgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgICAgICAyID0+ICcyIGxvdycsCiAgICAgICAgICAgICAgICAzID0+ICczIG1lZGl1bScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDAsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBVc2VyIFJvbGUgLSAxIHJvbGUgKHdyb25nKSBjaGVjayB1bml0dGVzdDEnLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnUm9sZS1UZXN0JyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBVc2VyID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUm9sZSA9PiBbInVuaXR0ZXN0MS0kUmFuZG9tSUQiXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiBbICcxIHZlcnkgbG93JywgJzMgbWVkaXVtJywgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgICAgICAyID0+ICcyIGxvdycsCiAgICAgICAgICAgICAgICAzID0+ICczIG1lZGl1bScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgQWRkUm9sZXMgICAgID0+IFskUm9sZUlEMl0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDAsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBVc2VyIFJvbGUgLSAgMSByb2xlIGNoZWNrIHVuaXR0ZXN0MScsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdSb2xlLVRlc3QnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBSb2xlID0+IFsidW5pdHRlc3QxLSRSYW5kb21JRCJdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGUgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFsgJzEgdmVyeSBsb3cnLCAnMyBtZWRpdW0nLCBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBBZGRSb2xlcyAgICAgPT4gWyRSb2xlSUQxXSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBVc2VyIFJvbGUgLSAgMiByb2xlIGNoZWNrIHVuaXR0ZXN0MScsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdSb2xlLVRlc3QnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBSb2xlID0+IFsidW5pdHRlc3QxLSRSYW5kb21JRCJdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGUgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFsgJzEgdmVyeSBsb3cnLCAnMyBtZWRpdW0nLCBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBBZGRSb2xlcyAgICAgPT4gWyAkUm9sZUlEMSwgJFJvbGVJRDIgXSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBVc2VyIFJvbGUgLSAgMiByb2xlIGNoZWNrIHVuaXR0ZXN0MicsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdSb2xlLVRlc3QnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBSb2xlID0+IFsidW5pdHRlc3QyLSRSYW5kb21JRCJdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGUgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFsgJzEgdmVyeSBsb3cnLCAnMyBtZWRpdW0nLCBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBBZGRSb2xlcyAgICAgPT4gWyAkUm9sZUlEMSwgJFJvbGVJRDIgXSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMSwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgIH0sCiAgICB9LAopOwoKbXkgJVRlc3RNb2RpZmllcnMgPSAoCiAgICBSZWdFeHAgPT4gWwogICAgICAgIHsKICAgICAgICAgICAgTmFtZSA9PiAnQUNMIFVzZXIgUm9sZSAtIE5vIHJvbGVzIGNoZWNrIFtSZWdFeHBddW5pdHRlc3QxJywKICAgICAgICAgICAgUm9sZSA9PiBbIltSZWdFeHBddW5pdHRlc3QxIl0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSA9PiAnQUNMIFVzZXIgUm9sZSAtIDEgcm9sZSAod3JvbmcpIGNoZWNrIFtSZWdFeHBddW5pdHRlc3QxJywKICAgICAgICAgICAgUm9sZSA9PiBbIltSZWdFeHBddW5pdHRlc3QxIl0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSA9PiAnQUNMIFVzZXIgUm9sZSAtICAxIHJvbGUgY2hlY2sgW1JlZ0V4cF11bml0dGVzdDEnLAogICAgICAgICAgICBSb2xlID0+IFsiW1JlZ0V4cF11bml0dGVzdDEiXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lID0+ICdBQ0wgVXNlciBSb2xlIC0gIDIgcm9sZSBjaGVjayBbUmVnRXhwXXVuaXR0ZXN0MScsCiAgICAgICAgICAgIFJvbGUgPT4gWyJbUmVnRXhwXXVuaXR0ZXN0MSJdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgPT4gJ0FDTCBVc2VyIFJvbGUgLSAgMiByb2xlIGNoZWNrIFtSZWdFeHBddW5pdHRlc3QyJywKICAgICAgICAgICAgUm9sZSA9PiBbIltSZWdFeHBddW5pdHRlc3QyIl0KICAgICAgICB9CiAgICBdLAogICAgcmVnZXhwID0+IFsKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgPT4gJ0FDTCBVc2VyIFJvbGUgLSBObyByb2xlcyBjaGVjayBbcmVnZXhwXXVuaXR0ZXN0MScsCiAgICAgICAgICAgIFJvbGUgPT4gWyJbcmVnZXhwXXVuaXR0ZXN0MSJdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgPT4gJ0FDTCBVc2VyIFJvbGUgLSAxIHJvbGUgKHdyb25nKSBjaGVjayBbcmVnZXhwXXVuaXR0ZXN0MScsCiAgICAgICAgICAgIFJvbGUgPT4gWyJbcmVnZXhwXXVuaXR0ZXN0MSJdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgPT4gJ0FDTCBVc2VyIFJvbGUgLSAgMSByb2xlIGNoZWNrIFtyZWdleHBddW5pdHRlc3QxJywKICAgICAgICAgICAgUm9sZSA9PiBbIltyZWdleHBddW5pdHRlc3QxIl0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSA9PiAnQUNMIFVzZXIgUm9sZSAtICAyIHJvbGUgY2hlY2sgW3JlZ2V4cF11bml0dGVzdDEnLAogICAgICAgICAgICBSb2xlID0+IFsiW3JlZ2V4cF11bml0dGVzdDEiXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lID0+ICdBQ0wgVXNlciBSb2xlIC0gIDIgcm9sZSBjaGVjayBbcmVnZXhwXXVuaXR0ZXN0MicsCiAgICAgICAgICAgIFJvbGUgPT4gWyJbcmVnZXhwXXVuaXR0ZXN0MiJdCiAgICAgICAgfSwKICAgICAgICBdCik7CgpteSAkTnVtYmVyT2ZUZXN0cyA9ICQjVGVzdHNOb3JtYWw7Cgpmb3IgbXkgJFRlc3RDYXNlICggc29ydCBrZXlzICVUZXN0TW9kaWZpZXJzICkgewogICAgZm9yIG15ICRJbmRleCAoIDAgLi4gJE51bWJlck9mVGVzdHMgKSB7CgogICAgICAgIG15ICRUZXN0ID0gJFN0b3JhYmxlT2JqZWN0LT5DbG9uZSggRGF0YSA9PiAkVGVzdHNOb3JtYWxbJEluZGV4XSApOwoKICAgICAgICAkVGVzdC0+e05hbWV9ID0gJFRlc3RNb2RpZmllcnN7JFRlc3RDYXNlfS0+WyRJbmRleF0tPntOYW1lfTsKICAgICAgICAkVGVzdC0+e0FDTHN9LT57J1JvbGUtVGVzdCd9LT57UHJvcGVydGllc30tPntVc2VyfS0+e1JvbGV9ID0gJFRlc3RNb2RpZmllcnN7JFRlc3RDYXNlfS0+WyRJbmRleF0tPntSb2xlfTsKCiAgICAgICAgcHVzaCBAVGVzdHNOb3JtYWwsICRUZXN0OwogICAgfQp9CgpteSBAVGVzdHNOb3QgPSAoCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIFVzZXIgUm9sZSAtIE5vIHJvbGVzIGNoZWNrIFtOb3RddW5pdHRlc3QxOicsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdSb2xlLVRlc3QnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBSb2xlID0+IFsiW05vdF11bml0dGVzdDEtJFJhbmRvbUlEIl0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gWyAnMSB2ZXJ5IGxvdycsICczIG1lZGl1bScsIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICAgICAgMiA9PiAnMiBsb3cnLAogICAgICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAxLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7CiAgICAgICAgICAgIDEgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICAzID0+ICczIG1lZGl1bScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIFVzZXIgUm9sZSAtIDEgcm9sZSAod3JvbmcpIGNoZWNrIFtOb3RddW5pdHRlc3QxOicsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdSb2xlLVRlc3QnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBSb2xlID0+IFsiW05vdF11bml0dGVzdDEtJFJhbmRvbUlEIl0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gWyAnMSB2ZXJ5IGxvdycsICczIG1lZGl1bScsIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICAgICAgMiA9PiAnMiBsb3cnLAogICAgICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIEFkZFJvbGVzICAgICA9PiBbJFJvbGVJRDJdLAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAxLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7CiAgICAgICAgICAgIDEgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICAzID0+ICczIG1lZGl1bScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIFVzZXIgUm9sZSAtIDEgcm9sZSBjaGVjayBbTm90XXVuaXR0ZXN0MTonLAogICAgICAgIEFDTHMgPT4gewogICAgICAgICAgICAnUm9sZS1UZXN0JyA9PiB7CiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBVc2VyID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUm9sZSA9PiBbIltOb3RddW5pdHRlc3QxLSRSYW5kb21JRCJdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUG9zc2libGUgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFsgJzEgdmVyeSBsb3cnLCAnMyBtZWRpdW0nLCBdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBBZGRSb2xlcyAgICAgPT4gWyRSb2xlSUQxXSwKICAgICAgICBTdWNjZXNzTWF0Y2ggPT4gMCwKICAgICAgICBSZXR1cm5EYXRhICAgPT4gewogICAgICAgICAgICAxID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgMiA9PiAnMiBsb3cnLAogICAgICAgICAgICAzID0+ICczIG1lZGl1bScsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSA9PiAnQUNMIFVzZXIgUm9sZSAtICAyIHJvbGUgY2hlY2sgW05vdF11bml0dGVzdDE6JywKICAgICAgICBBQ0xzID0+IHsKICAgICAgICAgICAgJ1JvbGUtVGVzdCcgPT4gewogICAgICAgICAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFJvbGUgPT4gWyJbTm90XXVuaXR0ZXN0MS0kUmFuZG9tSUQiXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiBbICcxIHZlcnkgbG93JywgJzMgbWVkaXVtJywgXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgICAgICAyID0+ICcyIGxvdycsCiAgICAgICAgICAgICAgICAzID0+ICczIG1lZGl1bScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgQWRkUm9sZXMgICAgID0+IFsgJFJvbGVJRDEsICRSb2xlSUQyIF0sCiAgICAgICAgU3VjY2Vzc01hdGNoID0+IDAsCiAgICAgICAgUmV0dXJuRGF0YSAgID0+IHsKICAgICAgICAgICAgMSA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgIDIgPT4gJzIgbG93JywKICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ0FDTCBVc2VyIFJvbGUgLSAgMiByb2xlIGNoZWNrIFtOb3RddW5pdHRlc3QyOicsCiAgICAgICAgQUNMcyA9PiB7CiAgICAgICAgICAgICdSb2xlLVRlc3QnID0+IHsKICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBSb2xlID0+IFsiW05vdF11bml0dGVzdDItJFJhbmRvbUlEIl0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gWyAnMSB2ZXJ5IGxvdycsICczIG1lZGl1bScsIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICAgICAgMiA9PiAnMiBsb3cnLAogICAgICAgICAgICAgICAgMyA9PiAnMyBtZWRpdW0nLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIEFkZFJvbGVzICAgICA9PiBbICRSb2xlSUQxLCAkUm9sZUlEMiBdLAogICAgICAgIFN1Y2Nlc3NNYXRjaCA9PiAwLAogICAgICAgIFJldHVybkRhdGEgICA9PiB7CiAgICAgICAgICAgIDEgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICAyID0+ICcyIGxvdycsCiAgICAgICAgICAgIDMgPT4gJzMgbWVkaXVtJywKICAgICAgICB9LAogICAgfSwKKTsKCiVUZXN0TW9kaWZpZXJzID0gKAogICAgUmVnRXhwID0+IFsKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgPT4gJ0FDTCBVc2VyIFJvbGUgLSBObyByb2xlcyBjaGVjayBbTm90UmVnRXhwXXVuaXR0ZXN0MScsCiAgICAgICAgICAgIFJvbGUgPT4gWyJbTm90UmVnRXhwXXVuaXR0ZXN0MSJdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgPT4gJ0FDTCBVc2VyIFJvbGUgLSAxIHJvbGUgKHdyb25nKSBjaGVjayBbTm90UmVnRXhwXXVuaXR0ZXN0MScsCiAgICAgICAgICAgIFJvbGUgPT4gWyJbTm90UmVnRXhwXXVuaXR0ZXN0MSJdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgPT4gJ0FDTCBVc2VyIFJvbGUgLSAgMSByb2xlIGNoZWNrIFtOb3RSZWdFeHBddW5pdHRlc3QxJywKICAgICAgICAgICAgUm9sZSA9PiBbIltOb3RSZWdFeHBddW5pdHRlc3QxIl0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSA9PiAnQUNMIFVzZXIgUm9sZSAtICAyIHJvbGUgY2hlY2sgW05vdFJlZ0V4cF11bml0dGVzdDEnLAogICAgICAgICAgICBSb2xlID0+IFsiW05vdFJlZ0V4cF11bml0dGVzdDEiXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lID0+ICdBQ0wgVXNlciBSb2xlIC0gIDIgcm9sZSBjaGVjayBbTm90UmVnRXhwXXVuaXR0ZXN0MicsCiAgICAgICAgICAgIFJvbGUgPT4gWyJbTm90UmVnRXhwXXVuaXR0ZXN0MiJdCiAgICAgICAgfQogICAgXSwKICAgIHJlZ2V4cCA9PiBbCiAgICAgICAgewogICAgICAgICAgICBOYW1lID0+ICdBQ0wgVXNlciBSb2xlIC0gTm8gcm9sZXMgY2hlY2sgW05vdHJlZ2V4cF11bml0dGVzdDEnLAogICAgICAgICAgICBSb2xlID0+IFsiW05vdHJlZ2V4cF11bml0dGVzdDEiXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lID0+ICdBQ0wgVXNlciBSb2xlIC0gMSByb2xlICh3cm9uZykgY2hlY2sgW05vdHJlZ2V4cF11bml0dGVzdDEnLAogICAgICAgICAgICBSb2xlID0+IFsiW05vdHJlZ2V4cF11bml0dGVzdDEiXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lID0+ICdBQ0wgVXNlciBSb2xlIC0gIDEgcm9sZSBjaGVjayBbTm90cmVnZXhwXXVuaXR0ZXN0MScsCiAgICAgICAgICAgIFJvbGUgPT4gWyJbTm90cmVnZXhwXXVuaXR0ZXN0MSJdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgPT4gJ0FDTCBVc2VyIFJvbGUgLSAgMiByb2xlIGNoZWNrIFtOb3RyZWdleHBddW5pdHRlc3QxJywKICAgICAgICAgICAgUm9sZSA9PiBbIltOb3RyZWdleHBddW5pdHRlc3QxIl0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSA9PiAnQUNMIFVzZXIgUm9sZSAtICAyIHJvbGUgY2hlY2sgW05vdHJlZ2V4cF11bml0dGVzdDInLAogICAgICAgICAgICBSb2xlID0+IFsiW05vdHJlZ2V4cF11bml0dGVzdDIiXQogICAgICAgIH0sCiAgICAgICAgXQopOwoKJE51bWJlck9mVGVzdHMgPSAkI1Rlc3RzTm90OwoKZm9yIG15ICRUZXN0Q2FzZSAoIHNvcnQga2V5cyAlVGVzdE1vZGlmaWVycyApIHsKICAgIGZvciBteSAkSW5kZXggKCAwIC4uICROdW1iZXJPZlRlc3RzICkgewoKICAgICAgICBteSAkVGVzdCA9IFN0b3JhYmxlOjpkY2xvbmUoICRUZXN0c05vdFskSW5kZXhdICk7CgogICAgICAgICRUZXN0LT57TmFtZX0gPSAkVGVzdE1vZGlmaWVyc3skVGVzdENhc2V9LT5bJEluZGV4XS0+e05hbWV9OwogICAgICAgICRUZXN0LT57QUNMc30tPnsnUm9sZS1UZXN0J30tPntQcm9wZXJ0aWVzfS0+e1VzZXJ9LT57Um9sZX0gPSAkVGVzdE1vZGlmaWVyc3skVGVzdENhc2V9LT5bJEluZGV4XS0+e1JvbGV9OwoKICAgICAgICBwdXNoIEBUZXN0c05vdCwgJFRlc3Q7CiAgICB9Cn0KCkBUZXN0cyA9ICggQFRlc3RzTm9ybWFsLCBAVGVzdHNOb3QgKTsKCiRTZWxmLT5UcnVlKAogICAgMSwKICAgICItLS0gU3RhcnQgQXJyYXkgbWF0Y2ggQUNMIFRlc3RzIC0tLSIsCik7CiRFeGVjdXRlVGVzdHMtPiggVGVzdHMgPT4gXEBUZXN0cyApOwoKIyBjbGVhbnVwIGlzIGRvbmUgYnkgUmVzdG9yZURhdGFiYXNlLgoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA0ZmUyMThiZWNjZGI5MjZhMjlkZDdiZWQ5ZGU0ODIxMTQzMGQ2OWQwIC0gc2NyaXB0cy90ZXN0L1RpY2tldC9UaWNrZXRTZXJ2aWNlTGlzdC50CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4Owp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7Cm15ICRUaWNrZXRPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwpteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyk7Cm15ICRUeXBlT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlR5cGUnKTsKCm15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdEN1c3RvbWVyVXNlckNyZWF0ZSgpOwoKbXkgJFJhbmRvbSA9ICRIZWxwZXItPkdldFJhbmRvbU51bWJlcigpOwoKbXkgJFR5cGVJRDEgPSAkVHlwZU9iamVjdC0+VHlwZUFkZCgKICAgIE5hbWUgICAgPT4gJ1Rlc3RUeXBlMScgLiAkUmFuZG9tLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwokU2VsZi0+VHJ1ZSgKICAgICRUeXBlSUQxLAogICAgJ1R5cGUgMSBjcmVhdGVkLicsCik7CgpteSAkVHlwZUlEMiA9ICRUeXBlT2JqZWN0LT5UeXBlQWRkKAogICAgTmFtZSAgICA9PiAnVGVzdFR5cGUyJyAuICRSYW5kb20sCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CiRTZWxmLT5UcnVlKAogICAgJFR5cGVJRDIsCiAgICAnVHlwZSAyIGNyZWF0ZWQuJywKKTsKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQoKIyBnZXQgdGhlIGxpc3Qgb2Ygc2VydmljZSB0eXBlcyBmcm9tIGdlbmVyYWwgY2F0YWxvZwpteSAkU2VydmljZVR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAopOwoKIyBidWlsZCBhIGxvb2t1cCBoYXNoCm15ICVTZXJ2aWNlVHlwZU5hbWUySUQgPSByZXZlcnNlICV7ICRTZXJ2aWNlVHlwZUxpc3QgfTsKIyAtLS0KCm15ICRTZXJ2aWNlSUQxID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VBZGQoCiAgICBOYW1lICAgID0+ICdUZXN0U2VydmljZTEnIC4gJFJhbmRvbSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgVHlwZUlEICAgICAgPT4gJFNlcnZpY2VUeXBlTmFtZTJJRHtUcmFpbmluZ30sCiAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwokU2VsZi0+VHJ1ZSgKICAgICRTZXJ2aWNlSUQxLAogICAgJ1NlcnZpY2UgMSBjcmVhdGVkLicsCik7Cm15ICRTZXJ2aWNlSUQyID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VBZGQoCiAgICBOYW1lICAgID0+ICdUZXN0U2VydmljZTInIC4gJFJhbmRvbSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgVHlwZUlEICAgICAgPT4gJFNlcnZpY2VUeXBlTmFtZTJJRHtUcmFpbmluZ30sCiAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwokU2VsZi0+VHJ1ZSgKICAgICRTZXJ2aWNlSUQyLAogICAgJ1NlcnZpY2UgMiBjcmVhdGVkLicsCik7CgpteSAkUXVldWVJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJ1JhdycgKTsKCm15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgIFRpdGxlICAgICAgICA9PiAnVGVzdCB0aWNrZXQgdGl0bGUgJyAuICRSYW5kb20sCiAgICBRdWV1ZUlEICAgICAgPT4gJFF1ZXVlSUQsCiAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICBQcmlvcml0eSAgICAgPT4gJzMgbm9ybWFsJywKICAgIFN0YXRlICAgICAgICA9PiAnbmV3JywKICAgIEN1c3RvbWVyVXNlciA9PiAkVGVzdFVzZXJMb2dpbiwKICAgIE93bmVySUQgICAgICA9PiAxLAogICAgVXNlcklEICAgICAgID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRJRCwKICAgICdUaWNrZXQgY3JlYXRlZC4nLAopOwoKbXkgQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICA9PiAnVGlja2V0U2VydmljZUxpc3QoKSAtIE1pc3NpbmcgVXNlcklEIG9yIEN1c3RvbWVyVXNlcklEJywKICAgICAgICBQYXJhbXMgPT4gewogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJlc3VsdCA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1RpY2tldFNlcnZpY2VMaXN0KCkgLSBNaXNzaW5nIFRpY2tldElEIG9yIFF1ZXVlSUQnLAogICAgICAgIFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXN1bHQgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdUaWNrZXRTZXJ2aWNlTGlzdCgpIC0gVXNlcklEIGFuZCBUaWNrZXRJRCcsCiAgICAgICAgUGFyYW1zID0+IHsKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXN1bHQgPT4gewogICAgICAgICAgICAiJFNlcnZpY2VJRDEiID0+ICdUZXN0U2VydmljZTEnIC4gJFJhbmRvbSwKICAgICAgICAgICAgIiRTZXJ2aWNlSUQyIiA9PiAnVGVzdFNlcnZpY2UyJyAuICRSYW5kb20sCgogICAgICAgICAgICAjIFRoZXJlIG1pZ2h0IGJlIG90aGVyIHNlcnZpY2VzIGFzIHdlbGwuLi4KICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1RpY2tldFNlcnZpY2VMaXN0KCkgLSBVc2VySUQgYW5kIFF1ZXVlSUQnLAogICAgICAgIFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmVzdWx0ID0+IHsKICAgICAgICAgICAgIiRTZXJ2aWNlSUQxIiA9PiAnVGVzdFNlcnZpY2UxJyAuICRSYW5kb20sCiAgICAgICAgICAgICIkU2VydmljZUlEMiIgPT4gJ1Rlc3RTZXJ2aWNlMicgLiAkUmFuZG9tLAoKICAgICAgICAgICAgIyBUaGVyZSBtaWdodCBiZSBvdGhlciBzZXJ2aWNlcyBhcyB3ZWxsLi4uCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdUaWNrZXRTZXJ2aWNlTGlzdCgpIC0gQ3VzdG9tZXJVc2VySUQgYW5kIFF1ZXVlSUQnLAogICAgICAgIFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmVzdWx0ID0+IHsKCiAgICAgICAgICAgICMgVGhlcmUgbWlnaHQgYmUgb3RoZXIgc2VydmljZXMgYXMgd2VsbC4uLgogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnVGlja2V0U2VydmljZUxpc3QoKSAtIEN1c3RvbWVyVXNlcklEIGFuZCBUaWNrZXRJRCcsCiAgICAgICAgUGFyYW1zID0+IHsKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmVzdWx0ID0+IHsKCiAgICAgICAgICAgICMgVGhlcmUgbWlnaHQgYmUgb3RoZXIgc2VydmljZXMgYXMgd2VsbC4uLgogICAgICAgIH0sCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICBteSAlTGlzdCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlcnZpY2VMaXN0KAogICAgICAgICV7ICRUZXN0LT57UGFyYW1zfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57RXhwZWN0ZWRSZXN1bHR9ICkgewoKICAgICAgICAjIGlmICgkVGVzdC0+e1BhcmFtc30tPntVc2VySUR9KSB7CiAgICAgICAgIyBSZW1vdmUgYWxsIG90aGVyIHNlcnZpY2VzIHRoYXQgYXJlIG5vdCBjcmVhdGVkIGluIHRoaXMgdGVzdC4KICAgICAgICBteSBARmlsdGVyID0gZ3JlcCB7ICRfID09ICRTZXJ2aWNlSUQxIHx8ICRfID09ICRTZXJ2aWNlSUQyIH0ga2V5cyAlTGlzdDsKICAgICAgICBteSAlVGVtcDsKICAgICAgICBAVGVtcHtARmlsdGVyfSA9IEBMaXN0e0BGaWx0ZXJ9OwogICAgICAgICVMaXN0ID0gJVRlbXA7CgogICAgICAgICMgfQogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgXCVMaXN0LAogICAgICAgICAgICAkVGVzdC0+e0V4cGVjdGVkUmVzdWx0fSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBDaGVjayBpZiByZXN1bHQgbWF0Y2hlcyBleHBlY3RlZCB2YWx1ZS4iLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICVMaXN0ID8gMSA6IDAsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gQ0NDaGVjayBpZiByZXN1bHQgbWF0Y2hlcyBleHBlY3RlZCB2YWx1ZS4iLAogICAgICAgICk7CiAgICB9Cn0KCiRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkKAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJFRlc3RVc2VyTG9naW4sCiAgICBTZXJ2aWNlSUQgICAgICAgICA9PiAkU2VydmljZUlEMSwKICAgIEFjdGl2ZSAgICAgICAgICAgID0+IDEsCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAopOwoKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICA9PiAnVGlja2V0U2VydmljZUxpc3QoKSAtIFVzZXJJRCBhbmQgVGlja2V0SUQnLAogICAgICAgIFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmVzdWx0ID0+IHsKICAgICAgICAgICAgIiRTZXJ2aWNlSUQxIiA9PiAnVGVzdFNlcnZpY2UxJyAuICRSYW5kb20sCiAgICAgICAgICAgICIkU2VydmljZUlEMiIgPT4gJ1Rlc3RTZXJ2aWNlMicgLiAkUmFuZG9tLAoKICAgICAgICAgICAgIyBUaGVyZSBtaWdodCBiZSBvdGhlciBzZXJ2aWNlcyBhcyB3ZWxsLi4uCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdUaWNrZXRTZXJ2aWNlTGlzdCgpIC0gVXNlcklEIGFuZCBRdWV1ZUlEJywKICAgICAgICBQYXJhbXMgPT4gewogICAgICAgICAgICBRdWV1ZUlEID0+ICRRdWV1ZUlELAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJlc3VsdCA9PiB7CiAgICAgICAgICAgICIkU2VydmljZUlEMSIgPT4gJ1Rlc3RTZXJ2aWNlMScgLiAkUmFuZG9tLAogICAgICAgICAgICAiJFNlcnZpY2VJRDIiID0+ICdUZXN0U2VydmljZTInIC4gJFJhbmRvbSwKCiAgICAgICAgICAgICMgVGhlcmUgbWlnaHQgYmUgb3RoZXIgc2VydmljZXMgYXMgd2VsbC4uLgogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnVGlja2V0U2VydmljZUxpc3QoKSAtIEN1c3RvbWVyVXNlcklEIGFuZCBRdWV1ZUlEJywKICAgICAgICBQYXJhbXMgPT4gewogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJlc3VsdCA9PiB7CiAgICAgICAgICAgICIkU2VydmljZUlEMSIgPT4gJ1Rlc3RTZXJ2aWNlMScgLiAkUmFuZG9tLAoKICAgICAgICAgICAgIyBUaGVyZSBtaWdodCBiZSBvdGhlciBzZXJ2aWNlcyBhcyB3ZWxsLi4uCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdUaWNrZXRTZXJ2aWNlTGlzdCgpIC0gQ3VzdG9tZXJVc2VySUQgYW5kIFRpY2tldElEJywKICAgICAgICBQYXJhbXMgPT4gewogICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXN1bHQgPT4gewogICAgICAgICAgICAiJFNlcnZpY2VJRDEiID0+ICdUZXN0U2VydmljZTEnIC4gJFJhbmRvbSwKCiAgICAgICAgICAgICMgVGhlcmUgbWlnaHQgYmUgb3RoZXIgc2VydmljZXMgYXMgd2VsbC4uLgogICAgICAgIH0sCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICBteSAlTGlzdCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlcnZpY2VMaXN0KAogICAgICAgICV7ICRUZXN0LT57UGFyYW1zfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57RXhwZWN0ZWRSZXN1bHR9ICkgewoKICAgICAgICAjIFJlbW92ZSBhbGwgb3RoZXIgc2VydmljZXMgdGhhdCBhcmUgbm90IGNyZWF0ZWQgaW4gdGhpcyB0ZXN0LgogICAgICAgIG15IEBGaWx0ZXIgPSBncmVwIHsgJF8gPT0gJFNlcnZpY2VJRDEgfHwgJF8gPT0gJFNlcnZpY2VJRDIgfSBrZXlzICVMaXN0OwogICAgICAgIG15ICVUZW1wOwogICAgICAgIEBUZW1we0BGaWx0ZXJ9ID0gQExpc3R7QEZpbHRlcn07CiAgICAgICAgJUxpc3QgPSAlVGVtcDsKCiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICBcJUxpc3QsCiAgICAgICAgICAgICRUZXN0LT57RXhwZWN0ZWRSZXN1bHR9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIENoZWNrIGlmIHJlc3VsdCBtYXRjaGVzIGV4cGVjdGVkIHZhbHVlLiIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJUxpc3QgPyAxIDogMCwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBDQ0NoZWNrIGlmIHJlc3VsdCBtYXRjaGVzIGV4cGVjdGVkIHZhbHVlLiIsCiAgICAgICAgKTsKICAgIH0KfQoKIyBDbGVhbnVwIGlzIGRvbmUgYnkgUmVzdG9yZURhdGFiYXNlLgoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA0ZmUyMThiZWNjZGI5MjZhMjlkZDdiZWQ5ZGU0ODIxMTQzMGQ2OWQwIC0gc2NyaXB0cy90ZXN0L0N1c3RvbWVyVXNlclNlcnZpY2UudAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKIyBnZXQgbmVlZGVkIG9iamVjdHMKbXkgJENvbmZpZ09iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7Cm15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7Cm15ICRTZXJ2aWNlT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpOwoKIyBnZXQgaGVscGVyIG9iamVjdAokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKIyBkb24ndCBjaGVjayBlbWFpbCBhZGRyZXNzIHZhbGlkaXR5CiRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgIFZhbHVlID0+IDAsCik7CgojIHNhdmUgYWxsIG9yaWdpbmFsIGRlZmF1bHQgc2VydmljZXMKbXkgQE9yaWdpbmFsRGVmYXVsdFNlcnZpY2VzID0gJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJzxERUZBVUxUPicsCiAgICBSZXN1bHQgICAgICAgICAgICA9PiAnSUQnLAogICAgRGVmYXVsdFNlcnZpY2VzICAgPT4gMCwKKTsKCiMgZGVsZXRlIGFsbCBkZWZhdWx0IHNlcnZpY2VzCmZvciBteSAkU2VydmljZUlEIChAT3JpZ2luYWxEZWZhdWx0U2VydmljZXMpIHsKICAgICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkKAogICAgICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICc8REVGQVVMVD4nLAogICAgICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgQWN0aXZlICAgICAgICAgICAgPT4gMCwKICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgKTsKfQoKIyBhZGQgc2VydmljZTEKbXkgJFNlcnZpY2VSYW5kMSA9ICdTb21lU2VydmljZScgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwpteSAkU2VydmljZUlEMSAgID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VBZGQoCiAgICBOYW1lICAgID0+ICRTZXJ2aWNlUmFuZDEsCiAgICBDb21tZW50ID0+ICdTb21lIENvbW1lbnQnLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICBUeXBlSUQgICAgICA9PiAxLAogICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKIyAtLS0KKTsKCiRTZWxmLT5UcnVlKAogICAgJFNlcnZpY2VJRDEsCiAgICAnU2VydmljZUFkZDEoKScsCik7CgojIGFkZCBzZXJ2aWNlMgpteSAkU2VydmljZVJhbmQyID0gJ1NvbWVTZXJ2aWNlJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7Cm15ICRTZXJ2aWNlSUQyICAgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUFkZCgKICAgIE5hbWUgICAgPT4gJFNlcnZpY2VSYW5kMiwKICAgIENvbW1lbnQgPT4gJ1NvbWUgQ29tbWVudCcsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgIFR5cGVJRCAgICAgID0+IDEsCiAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQopOwoKJFNlbGYtPlRydWUoCiAgICAkU2VydmljZUlEMiwKICAgICdTZXJ2aWNlQWRkMigpJywKKTsKCm15ICRDdXN0b21lclVzZXIxID0gJEhlbHBlci0+VGVzdEN1c3RvbWVyVXNlckNyZWF0ZSgpCiAgICB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgY3VzdG9tZXIgdXNlciI7Cm15ICRDdXN0b21lclVzZXIyID0gJEhlbHBlci0+VGVzdEN1c3RvbWVyVXNlckNyZWF0ZSgpCiAgICB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgY3VzdG9tZXIgdXNlciI7CgojIGFsbG9jYXRpb24gdGVzdCAxCm15IEBBbGxvY2F0aW9uMSA9ICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIxLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDAsCik7CgokU2VsZi0+RmFsc2UoCiAgICBzY2FsYXIgQEFsbG9jYXRpb24xLAogICAgJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0MSgpJywKKTsKCiMgYWxsb2NhdGlvbiB0ZXN0IDIKbXkgQEFsbG9jYXRpb24yID0gJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlcjEsCiAgICBSZXN1bHQgICAgICAgICAgICA9PiAnSUQnLAopOwoKJFNlbGYtPkZhbHNlKAogICAgc2NhbGFyIEBBbGxvY2F0aW9uMiwKICAgICdDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdDIoKScsCik7CgojIGFsbG9jYXRpb24gdGVzdCAzCm15IEBBbGxvY2F0aW9uMyA9ICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIyLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDAsCik7CgokU2VsZi0+RmFsc2UoCiAgICBzY2FsYXIgQEFsbG9jYXRpb24zLAogICAgJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0MygpJywKKTsKCiMgYWxsb2NhdGlvbiB0ZXN0IDQKbXkgQEFsbG9jYXRpb240ID0gJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlcjIsCiAgICBSZXN1bHQgICAgICAgICAgICA9PiAnSUQnLAopOwoKJFNlbGYtPkZhbHNlKAogICAgc2NhbGFyIEBBbGxvY2F0aW9uNCwKICAgICdDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdDQoKScsCik7CgojIHNldCBhbGxvY2F0aW9uIDEKJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAnPERFRkFVTFQ+JywKICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlSUQxLAogICAgQWN0aXZlICAgICAgICAgICAgPT4gMSwKICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCik7CgojIGFsbG9jYXRpb24gdGVzdCA1Cm15IEBBbGxvY2F0aW9uNSA9ICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIxLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDAsCik7CgokU2VsZi0+RmFsc2UoCiAgICBzY2FsYXIgQEFsbG9jYXRpb241LAogICAgJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0NSgpJywKKTsKCiMgYWxsb2NhdGlvbiB0ZXN0IDYKbXkgQEFsbG9jYXRpb242ID0gJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlcjEsCiAgICBSZXN1bHQgICAgICAgICAgICA9PiAnSUQnLAopOwoKbXkgJEFsbG9jYXRpb242Q291bnQgPSBAQWxsb2NhdGlvbjY7Cm15ICRBbGxvY2F0aW9uNk9rICAgID0gMDsKaWYgKCAkQWxsb2NhdGlvbjZDb3VudCBlcSAxICYmICRBbGxvY2F0aW9uNlswXSBlcSAkU2VydmljZUlEMSApIHsKICAgICRBbGxvY2F0aW9uNk9rID0gMTsKfQoKJFNlbGYtPlRydWUoCiAgICAkQWxsb2NhdGlvbjZPaywKICAgICdDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdDYoKScsCik7CgojIGFsbG9jYXRpb24gdGVzdCA3Cm15IEBBbGxvY2F0aW9uNyA9ICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIyLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDAsCik7CgokU2VsZi0+RmFsc2UoCiAgICBzY2FsYXIgQEFsbG9jYXRpb243LAogICAgJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0NygpJywKKTsKCiMgYWxsb2NhdGlvbiB0ZXN0IDgKbXkgQEFsbG9jYXRpb244ID0gJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlcjIsCiAgICBSZXN1bHQgICAgICAgICAgICA9PiAnSUQnLAopOwoKbXkgJEFsbG9jYXRpb244Q291bnQgPSBAQWxsb2NhdGlvbjg7Cm15ICRBbGxvY2F0aW9uOE9rICAgID0gMDsKaWYgKCAkQWxsb2NhdGlvbjhDb3VudCBlcSAxICYmICRBbGxvY2F0aW9uOFswXSBlcSAkU2VydmljZUlEMSApIHsKICAgICRBbGxvY2F0aW9uOE9rID0gMTsKfQoKJFNlbGYtPlRydWUoCiAgICAkQWxsb2NhdGlvbjhPaywKICAgICdDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdDgoKScsCik7CgojIHNldCBhbGxvY2F0aW9uIDIKJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMSwKICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlSUQyLAogICAgQWN0aXZlICAgICAgICAgICAgPT4gMSwKICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCik7CgojIGFsbG9jYXRpb24gdGVzdCA5Cm15IEBBbGxvY2F0aW9uOSA9ICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIxLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDAsCik7CgpteSAkQWxsb2NhdGlvbjlDb3VudCA9IEBBbGxvY2F0aW9uOTsKbXkgJEFsbG9jYXRpb245T2sgICAgPSAwOwppZiAoICRBbGxvY2F0aW9uOUNvdW50IGVxIDEgJiYgJEFsbG9jYXRpb245WzBdIGVxICRTZXJ2aWNlSUQyICkgewogICAgJEFsbG9jYXRpb245T2sgPSAxOwp9CgokU2VsZi0+VHJ1ZSgKICAgICRBbGxvY2F0aW9uOU9rLAogICAgJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0OSgpJywKKTsKCiMgYWxsb2NhdGlvbiB0ZXN0IDEwCm15IEBBbGxvY2F0aW9uMTAgPSAkU2VydmljZU9iamVjdC0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMSwKICAgIFJlc3VsdCAgICAgICAgICAgID0+ICdJRCcsCik7CgpteSAkQWxsb2NhdGlvbjEwQ291bnQgPSBAQWxsb2NhdGlvbjEwOwpteSAkQWxsb2NhdGlvbjEwT2sgICAgPSAwOwppZiAoICRBbGxvY2F0aW9uMTBDb3VudCBlcSAxICYmICRBbGxvY2F0aW9uMTBbMF0gZXEgJFNlcnZpY2VJRDIgKSB7CiAgICAkQWxsb2NhdGlvbjEwT2sgPSAxOwp9CgokU2VsZi0+VHJ1ZSgKICAgICRBbGxvY2F0aW9uMTBPaywKICAgICdDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdDEwKCknLAopOwoKIyBhbGxvY2F0aW9uIHRlc3QgMTEKbXkgQEFsbG9jYXRpb24xMSA9ICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIyLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDAsCik7CgokU2VsZi0+RmFsc2UoCiAgICBzY2FsYXIgQEFsbG9jYXRpb24xMSwKICAgICdDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdDExKCknLAopOwoKIyBhbGxvY2F0aW9uIHRlc3QgMTIKbXkgQEFsbG9jYXRpb24xMiA9ICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIyLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKKTsKCm15ICRBbGxvY2F0aW9uMTJDb3VudCA9IEBBbGxvY2F0aW9uMTI7Cm15ICRBbGxvY2F0aW9uMTJPayAgICA9IDA7CmlmICggJEFsbG9jYXRpb24xMkNvdW50IGVxIDEgJiYgJEFsbG9jYXRpb24xMlswXSBlcSAkU2VydmljZUlEMSApIHsKICAgICRBbGxvY2F0aW9uMTJPayA9IDE7Cn0KCiRTZWxmLT5UcnVlKAogICAgJEFsbG9jYXRpb24xMk9rLAogICAgJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0MTIoKScsCik7CgojIHNldCBhbGxvY2F0aW9uIDMKJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMiwKICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlSUQxLAogICAgQWN0aXZlICAgICAgICAgICAgPT4gMSwKICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCik7CiRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkKAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlcjIsCiAgICBTZXJ2aWNlSUQgICAgICAgICA9PiAkU2VydmljZUlEMiwKICAgIEFjdGl2ZSAgICAgICAgICAgID0+IDEsCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAopOwoKIyBhbGxvY2F0aW9uIHRlc3QgMTMKbXkgQEFsbG9jYXRpb24xMyA9ICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIxLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDAsCik7CgpteSAkQWxsb2NhdGlvbjEzT2sgPSAwOwppZiAoIHNjYWxhciBAQWxsb2NhdGlvbjEzIGVxIDEgJiYgJEFsbG9jYXRpb24xM1swXSBlcSAkU2VydmljZUlEMiApIHsKICAgICRBbGxvY2F0aW9uMTNPayA9IDE7Cn0KCiRTZWxmLT5UcnVlKAogICAgJEFsbG9jYXRpb24xM09rLAogICAgJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0MTMoKScsCik7CgojIGFsbG9jYXRpb24gdGVzdCAxNApteSBAQWxsb2NhdGlvbjE0ID0gJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlcjEsCiAgICBSZXN1bHQgICAgICAgICAgICA9PiAnSUQnLAopOwoKbXkgJEFsbG9jYXRpb24xNENvdW50ID0gQEFsbG9jYXRpb24xNDsKbXkgJEFsbG9jYXRpb24xNE9rICAgID0gMDsKaWYgKCAkQWxsb2NhdGlvbjE0Q291bnQgZXEgMSAmJiAkQWxsb2NhdGlvbjE0WzBdIGVxICRTZXJ2aWNlSUQyICkgewogICAgJEFsbG9jYXRpb24xNE9rID0gMTsKfQoKJFNlbGYtPlRydWUoCiAgICAkQWxsb2NhdGlvbjE0T2ssCiAgICAnQ3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QxNCgpJywKKTsKCiMgYWxsb2NhdGlvbiB0ZXN0IDE1Cm15IEBBbGxvY2F0aW9uMTUgPSAkU2VydmljZU9iamVjdC0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyMiwKICAgIFJlc3VsdCAgICAgICAgICAgID0+ICdJRCcsCiAgICBEZWZhdWx0U2VydmljZXMgICA9PiAwLAopOwoKbXkgJEFsbG9jYXRpb24xNUNvdW50ID0gQEFsbG9jYXRpb24xNTsKbXkgJEFsbG9jYXRpb24xNU9rICAgID0gMDsKaWYgKAogICAgJEFsbG9jYXRpb24xNUNvdW50IGVxIDIgJiYgKAogICAgICAgICggJEFsbG9jYXRpb24xNVswXSBlcSAkU2VydmljZUlEMSAmJiAkQWxsb2NhdGlvbjE1WzFdIGVxICRTZXJ2aWNlSUQyICkgfHwKICAgICAgICAoICRBbGxvY2F0aW9uMTVbMF0gZXEgJFNlcnZpY2VJRDIgJiYgJEFsbG9jYXRpb24xNVsxXSBlcSAkU2VydmljZUlEMSApCiAgICApCiAgICApCnsKICAgICRBbGxvY2F0aW9uMTVPayA9IDE7Cn0KCiRTZWxmLT5UcnVlKAogICAgJEFsbG9jYXRpb24xNU9rLAogICAgJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0MTUoKScsCik7CgojIGFsbG9jYXRpb24gdGVzdCAxNgpteSBAQWxsb2NhdGlvbjE2ID0gJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlcjIsCiAgICBSZXN1bHQgICAgICAgICAgICA9PiAnSUQnLAopOwoKbXkgJEFsbG9jYXRpb24xNkNvdW50ID0gQEFsbG9jYXRpb24xNjsKbXkgJEFsbG9jYXRpb24xNk9rICAgID0gMDsKaWYgKAogICAgJEFsbG9jYXRpb24xNkNvdW50IGVxIDIgJiYgKAogICAgICAgICggJEFsbG9jYXRpb24xNlswXSBlcSAkU2VydmljZUlEMSAmJiAkQWxsb2NhdGlvbjE2WzFdIGVxICRTZXJ2aWNlSUQyICkgfHwKICAgICAgICAoICRBbGxvY2F0aW9uMTZbMF0gZXEgJFNlcnZpY2VJRDIgJiYgJEFsbG9jYXRpb24xNlsxXSBlcSAkU2VydmljZUlEMSApCiAgICApCiAgICApCnsKICAgICRBbGxvY2F0aW9uMTZPayA9IDE7Cn0KCiRTZWxmLT5UcnVlKAogICAgJEFsbG9jYXRpb24xNk9rLAogICAgJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0MTYoKScsCik7CgojIHJlbmFtZSBjdXN0b21lciB1c2VyMQpteSAlQ3VzdG9tZXIgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VyMSwKKTsKbXkgJE5ld0N1c3RvbWVyVXNlcjEgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwpteSAkVXBkYXRlICAgICAgICAgICA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlclVwZGF0ZSgKICAgICVDdXN0b21lciwKICAgIElEICAgICAgICA9PiAkQ3VzdG9tZXJ7VXNlckxvZ2lufSwKICAgIFVzZXJMb2dpbiA9PiAkTmV3Q3VzdG9tZXJVc2VyMSwKICAgIFVzZXJJRCAgICA9PiAxLAopOwokU2VsZi0+VHJ1ZSgKICAgICRVcGRhdGUsCiAgICAiQ3VzdG9tZXJVc2VyVXBkYXRlIC0gJEN1c3RvbWVye1VzZXJMb2dpbn0gLSAkTmV3Q3VzdG9tZXJVc2VyMSIsCik7CgojIGFsbG9jYXRpb24gdGVzdCBhZnRlciByZW5hbWUKIyBpbnN0YW50aWF0ZSBuZXcgc2VydmljZSBvYmplY3QgYmVjYXVzZSBvZiBjYWNoaW5nIQokS2VybmVsOjpPTS0+T2JqZWN0c0Rpc2NhcmQoIE9iamVjdHMgPT4gWydLZXJuZWw6OlN5c3RlbTo6U2VydmljZSddICk7CiRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKTsKCm15IEBBbGxvY2F0aW9uMTcgPSAkU2VydmljZU9iamVjdC0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QoCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJ7VXNlckxvZ2lufSwKICAgIFJlc3VsdCAgICAgICAgICAgID0+ICdJRCcsCiAgICBEZWZhdWx0U2VydmljZXMgICA9PiAwLAopOwoKJFNlbGYtPklzKAogICAgc2NhbGFyIEBBbGxvY2F0aW9uMTcsCiAgICAwLAogICAgIk5vIHNlcnZpY2VzIGFsbG9jYXRlZCB0byBvbGQgY3VzdG9tZXIgJEN1c3RvbWVyVXNlcjEgYWZ0ZXIgcmVuYW1lIiwKKTsKbXkgQEFsbG9jYXRpb24xOCA9ICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICROZXdDdXN0b21lclVzZXIxLAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0lEJywKICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDAsCik7CgokU2VsZi0+SXMoCiAgICBzY2FsYXIgQEFsbG9jYXRpb24xOCwKICAgIDEsCiAgICAiU2VydmljZXMgYWxsb2NhdGVkIHRvIG5ldyBjdXN0b21lciAkTmV3Q3VzdG9tZXJVc2VyMSBhZnRlciByZW5hbWUiLAopOwoKIyBjbGVhbnVwIGlzIGRvbmUgYnkgUmVzdG9yZURhdGFiYXNlCgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHZhcnMgcXcoJFNlbGYpOwoKbXkgJENJUEFsbG9jYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZScpOwoKIyBnZXQgY3VycmVudCBhbGxvY2F0aW9uIGxpc3QgKFVzZXJJRCBpcyBuZWVkZWQpCm15ICRBbGxvY2F0ZURhdGExID0gJENJUEFsbG9jYXRlT2JqZWN0LT5BbGxvY2F0ZUxpc3QoKTsKCiMgY2hlY2sgdGhlIHJlc3VsdAokU2VsZi0+RmFsc2UoICRBbGxvY2F0ZURhdGExLCAnQWxsb2NhdGVMaXN0KCknICk7CgojIGdldCBjdXJyZW50IGFsbG9jYXRpb24gbGlzdApteSAkQWxsb2NhdGVEYXRhMiA9ICRDSVBBbGxvY2F0ZU9iamVjdC0+QWxsb2NhdGVMaXN0KAogICAgVXNlcklEID0+IDEsCik7CgojIGNoZWNrIHRoZSByZXN1bHQKJFNlbGYtPlRydWUoICRBbGxvY2F0ZURhdGEyLCAnQWxsb2NhdGVMaXN0KCknICk7CgojIGNoZWNrIHRoZSBhbGxvY2F0aW9uIGhhc2gKbXkgJEhhc2hPSyA9IDE7CmlmICggcmVmICRBbGxvY2F0ZURhdGEyIG5lICdIQVNIJyApIHsKICAgICRIYXNoT0sgPSAwOwp9CgojIGNoZWNrIHRoZSBhbGxvY2F0aW9uIDJkIGhhc2gKaWYgKCRIYXNoT0spIHsKCiAgICBJTVBBQ1Q6CiAgICBmb3IgbXkgJEltcGFjdCAoIHNvcnQga2V5cyAleyRBbGxvY2F0ZURhdGEyfSApIHsKCiAgICAgICAgaWYgKCByZWYgJEFsbG9jYXRlRGF0YTItPnskSW1wYWN0fSBuZSAnSEFTSCcgKSB7CiAgICAgICAgICAgICRIYXNoT0sgPSAwOwogICAgICAgICAgICBsYXN0IElNUEFDVDsKICAgICAgICB9CgogICAgICAgIENSSVRJQ0FMSVRZOgogICAgICAgIGZvciBteSAkQ3JpdGljYWxpdHkgKCBzb3J0IGtleXMgJXsgJEFsbG9jYXRlRGF0YTItPnskSW1wYWN0fSB9ICkgewoKICAgICAgICAgICAgaWYgKCAhJENyaXRpY2FsaXR5IHx8ICEkQWxsb2NhdGVEYXRhMi0+eyRJbXBhY3R9LT57JENyaXRpY2FsaXR5fSApIHsKICAgICAgICAgICAgICAgICRIYXNoT0sgPSAwOwogICAgICAgICAgICAgICAgbGFzdCBJTVBBQ1Q7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCiMgY2hlY2sgSGFzaE9LCiRTZWxmLT5UcnVlKCAkSGFzaE9LLCAnQWxsb2NhdGVMaXN0KCknICk7CgojIGNhbGwgUHJpb3JpdHlBbGxvY2F0aW9uR2V0KCkgZm9yIG9uZSBDcml0aWNhbGl0eS9JbXBhY3QgcGFpcgppZiAoJEhhc2hPSykgewoKICAgIG15ICgkSW1wYWN0KSA9IHNvcnQga2V5cyAleyRBbGxvY2F0ZURhdGEyfTsKCiAgICBpZiAoICRBbGxvY2F0ZURhdGEyLT57JEltcGFjdH0gKSB7CiAgICAgICAgbXkgKCRDcml0aWNhbGl0eSkgPSBzb3J0IGtleXMgJXsgJEFsbG9jYXRlRGF0YTItPnskSW1wYWN0fSB9OwoKICAgICAgICBteSAkRXhwZWN0ZWRQcmlvcml0eUlEID0gJEFsbG9jYXRlRGF0YTItPnskSW1wYWN0fS0+eyRDcml0aWNhbGl0eX07CiAgICAgICAgbXkgJFByaW9yaXR5SUQgICAgICAgICA9ICRDSVBBbGxvY2F0ZU9iamVjdC0+UHJpb3JpdHlBbGxvY2F0aW9uR2V0KAogICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAkQ3JpdGljYWxpdHksCiAgICAgICAgICAgIEltcGFjdCAgICAgID0+ICRJbXBhY3QsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRQcmlvcml0eUlELAogICAgICAgICAgICAkRXhwZWN0ZWRQcmlvcml0eUlELAogICAgICAgICAgICAnUHJpb3JpdHlBbGxvY2F0aW9uR2V0KCknLAogICAgICAgICk7CiAgICB9Cn0KCiMgdXBkYXRlIHRoZSBhbGxvY2F0aW9uIGhhc2ggKG5vdCBhbGwgbmVlZGVkIGFyZ3VtZW50cyBnaXZlbikKbXkgJFN1Y2Nlc3MxID0gJENJUEFsbG9jYXRlT2JqZWN0LT5BbGxvY2F0ZVVwZGF0ZSgKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBjaGVjayB0aGUgcmVzdWx0CiRTZWxmLT5GYWxzZSggJFN1Y2Nlc3MxLCAnQWxsb2NhdGVVcGRhdGUoKScgKTsKCiMgdXBkYXRlIHRoZSBhbGxvY2F0aW9uIGhhc2ggKG5vdCBhbGwgbmVlZGVkIGFyZ3VtZW50cyBnaXZlbikKbXkgJFN1Y2Nlc3MyID0gJENJUEFsbG9jYXRlT2JqZWN0LT5BbGxvY2F0ZVVwZGF0ZSgKICAgIEFsbG9jYXRlRGF0YSA9PiAkQWxsb2NhdGVEYXRhMiwKKTsKCiMgY2hlY2sgdGhlIHJlc3VsdAokU2VsZi0+RmFsc2UoICRTdWNjZXNzMiwgJ0FsbG9jYXRlVXBkYXRlKCknICk7CgojIHVwZGF0ZSB0aGUgYWxsb2NhdGlvbiBoYXNoIChhbGxvY2F0aW9uIGhhc2gpCm15ICRTdWNjZXNzMyA9ICRDSVBBbGxvY2F0ZU9iamVjdC0+QWxsb2NhdGVVcGRhdGUoCiAgICBBbGxvY2F0ZURhdGEgPT4gewogICAgICAgIFRlc3QgID0+ICdhYWEnLAogICAgICAgIFRlc3QyID0+ICdiYmInLAogICAgfSwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBjaGVjayB0aGUgcmVzdWx0CiRTZWxmLT5GYWxzZSggJFN1Y2Nlc3MzLCAnQWxsb2NhdGVVcGRhdGUoKScgKTsKCiMgdXBkYXRlIHRoZSBhbGxvY2F0aW9uIGhhc2gKbXkgJFN1Y2Nlc3M0ID0gJENJUEFsbG9jYXRlT2JqZWN0LT5BbGxvY2F0ZVVwZGF0ZSgKICAgIEFsbG9jYXRlRGF0YSA9PiAkQWxsb2NhdGVEYXRhMiwKICAgIFVzZXJJRCAgICAgICA9PiAxLAopOwoKIyBjaGVjayB0aGUgcmVzdWx0CiRTZWxmLT5UcnVlKCAkU3VjY2VzczQsICdBbGxvY2F0ZVVwZGF0ZSgpJyApOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA0ZmUyMThiZWNjZGI5MjZhMjlkZDdiZWQ5ZGU0ODIxMTQzMGQ2OWQwIC0gc2NyaXB0cy90ZXN0L1NlcnZpY2UudAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKIyBnZXQgbmVlZGVkIG9iamVjdHMKbXkgJENvbmZpZ09iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwpteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyk7Cm15ICRVc2VyT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCm15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgbWFrZSBwcmVwYXJhdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBjcmVhdGUgbmVlZGVkIHVzZXJzCm15IEBVc2VySURzOwp7CgogICAgIyBkaXNhYmxlIGVtYWlsIGNoZWNrcyB0byBjcmVhdGUgbmV3IHVzZXIKICAgIG15ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnID0gJENvbmZpZ09iamVjdC0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJykgfHwgMTsKICAgICRDb25maWdPYmplY3QtPlNldCgKICAgICAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICAgICAgVmFsdWUgPT4gMCwKICAgICk7CgogICAgZm9yIG15ICRDb3VudGVyICggMSAuLiAyICkgewoKICAgICAgICAjIGNyZWF0ZSBuZXcgdXNlcnMgZm9yIHRoZSB0ZXN0cwogICAgICAgIG15ICRVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckFkZCgKICAgICAgICAgICAgVXNlckZpcnN0bmFtZSA9PiAnU2VydmljZScgLiAkQ291bnRlciwKICAgICAgICAgICAgVXNlckxhc3RuYW1lICA9PiAnVW5pdFRlc3QnLAogICAgICAgICAgICBVc2VyTG9naW4gICAgID0+ICdVbml0VGVzdC1TZXJ2aWNlLScgLiAkQ291bnRlciAuICRSYW5kb21JRCwKICAgICAgICAgICAgVXNlckVtYWlsICAgICA9PiAnVW5pdFRlc3QtU2VydmljZS0nIC4gJENvdW50ZXIgLiAnQGxvY2FsaG9zdCcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFVzZXJJRHMsICRVc2VySUQ7CiAgICB9CgogICAgIyByZXN0b3JlIG9yaWdpbmFsIGVtYWlsIGNoZWNrIHBhcmFtCiAgICAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnLAogICAgKTsKfQoKIyBjcmVhdGUgbmVlZGVkIHJhbmRvbSBzZXJ2aWNlIG5hbWVzCm15IEBTZXJ2aWNlTmFtZTsKZm9yIG15ICRDb3VudGVyICggMSAuLiAxMSApIHsKICAgIHB1c2ggQFNlcnZpY2VOYW1lLCAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwp9CgojIGdldCBvcmlnaW5hbCBzZXJ2aWNlIGxpc3QgZm9yIGxhdGVyIGNoZWNrcwpteSAlU2VydmljZUxpc3RPcmlnaW5hbCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTGlzdCgKICAgIFZhbGlkICA9PiAwLAogICAgVXNlcklEID0+IDEsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZGVmaW5lIGdlbmVyYWwgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJEl0ZW1EYXRhID0gWwoKICAgICMgdGhpcyBzZXJ2aWNlIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2VydmljZSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICRTZXJ2aWNlTmFtZVswXSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNlcnZpY2UgaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgfSwKICAgIH0sCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KCiAgICAjIHRoaXMgc2VydmljZSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU2VydmljZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICBUeXBlSUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNlcnZpY2UgaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRTZXJ2aWNlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKICAgICAgICB9LAogICAgfSwKIyAtLS0KCiAgICAjIHRoaXMgc2VydmljZSBtdXN0IGJlIGluc2VydGVkIHN1Y2Nlc3NmdWxseQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgUGFyZW50SUQgID0+ICcnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJFNlcnZpY2VOYW1lWzBdLAogICAgICAgICAgICBOYW1lU2hvcnQgPT4gJFNlcnZpY2VOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2VydmljZSBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgb25lIHRlc3QgYmVmb3JlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBzZXJ2aWNlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoc2VydmljZSBpcyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2VydmljZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHNlcnZpY2UgaXMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICA9PiAkU2VydmljZU5hbWVbMF0gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNlcnZpY2Ugb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChzZXJ2aWNlIGlzIE5PVCBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVswXSAuICdVUERBVEUxJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAojIC0tLQojIElUU01Db3JlCiMgLS0tCgogICAgIyB0aGUgc2VydmljZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHNlcnZpY2UgaXMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lWzBdIC4gJ1VQREFURTEnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgVHlwZUlEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNlcnZpY2Ugb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChzZXJ2aWNlIGlzIE5PVCBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgICAgICA9PiAkU2VydmljZU5hbWVbMF0gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiAgICAgICAgfSwKICAgIH0sCiMgLS0tCgogICAgIyB0aGlzIHNlcnZpY2UgbXVzdCBiZSBpbnNlcnRlZCBzdWNjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVsxXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICdUZXN0Q29tbWVudDInLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gMiwKICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKIyAtLS0KICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIFBhcmVudElEICA9PiAnJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICRTZXJ2aWNlTmFtZVsxXSwKICAgICAgICAgICAgTmFtZVNob3J0ID0+ICRTZXJ2aWNlTmFtZVsxXSwKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICA9PiAnVGVzdENvbW1lbnQyJywKICAgICAgICAgICAgQ3JlYXRlQnkgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICA9PiAxLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+IDIsCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2VydmljZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHNlcnZpY2UgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2VydmljZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHNlcnZpY2UgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICRTZXJ2aWNlTmFtZVsxXSAuICdVUERBVEUyJywKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2VydmljZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHNlcnZpY2UgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU2VydmljZU5hbWVbMV0gLiAnVVBEQVRFMicsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBzZXJ2aWNlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIChzZXJ2aWNlIHVwZGF0ZSBhcmd1bWVudHMgYXJlIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lWzFdIC4gJ1VQREFURTInLAogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1Rlc3RDb21tZW50MlVQREFURTInLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzBdLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+IDQsCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBQYXJlbnRJRCAgPT4gJycsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VydmljZU5hbWVbMV0gLiAnVVBEQVRFMicsCiAgICAgICAgICAgIE5hbWVTaG9ydCA9PiAkU2VydmljZU5hbWVbMV0gLiAnVVBEQVRFMicsCiAgICAgICAgICAgIFZhbGlkSUQgICA9PiAyLAogICAgICAgICAgICBDb21tZW50ICAgPT4gJ1Rlc3RDb21tZW50MlVQREFURTInLAogICAgICAgICAgICBDcmVhdGVCeSAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgID0+ICRVc2VySURzWzBdLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+IDQsCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNlcnZpY2Ugb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKHNlcnZpY2UgdXBkYXRlIGFyZ3VtZW50cyBhcmUgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU2VydmljZU5hbWVbMV0gLiAnVVBEQVRFMycsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnVGVzdENvbW1lbnQyVVBEQVRFMycsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMV0sCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKIyAtLS0KICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIFBhcmVudElEICA9PiAnJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICRTZXJ2aWNlTmFtZVsxXSAuICdVUERBVEUzJywKICAgICAgICAgICAgTmFtZVNob3J0ID0+ICRTZXJ2aWNlTmFtZVsxXSAuICdVUERBVEUzJywKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICA9PiAnVGVzdENvbW1lbnQyVVBEQVRFMycsCiAgICAgICAgICAgIENyZWF0ZUJ5ICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgPT4gJFVzZXJJRHNbMV0sCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2VydmljZSBoYXMgYW4gaW52YWxpZCBuYW1lIGFuZCBtdXN0IGJlIE5PVCBpbnNlcnRlZAogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lWzFdIC4gJzo6VVBEQVRFNCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzZXJ2aWNlIGhhcyBhbiBpbnZhbGlkIG5hbWUgYW5kIG11c3QgYmUgTk9UIGluc2VydGVkCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU2VydmljZU5hbWVbMV0gLiAnOjpUZXN0OjpVUERBVEU0JywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNlcnZpY2UgaGFzIGFuIGludmFsaWQgbmFtZSBhbmQgbXVzdCBiZSBOT1QgaW5zZXJ0ZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVsyXSAuICc6OlRlc3QnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2VydmljZSBoYXMgYW4gaW52YWxpZCBuYW1lIGFuZCBtdXN0IGJlIE5PVCBpbnNlcnRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJzo6VGVzdCcgLiAkU2VydmljZU5hbWVbMl0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzZXJ2aWNlIGhhcyBhbiBpbnZhbGlkIG5hbWUgYW5kIG11c3QgYmUgTk9UIGluc2VydGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU2VydmljZU5hbWVbMl0gLiAnOjpUZXN0OjpUZXN0JywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNlcnZpY2UgaGFzIGFuIGludmFsaWQgbmFtZSBhbmQgbXVzdCBiZSBOT1QgaW5zZXJ0ZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVsyXSAuICdUZXN0OjonLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2VydmljZSBtdXN0IGJlIGluc2VydGVkIHN1Y2Nlc3NmdWxseSAoY2hlY2sgc3RyaW5nIGNsZWFuZXIgZnVuY3Rpb24pCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAiIFx0IFxuIFxyICIgLiAkU2VydmljZU5hbWVbM10gLiAiIFx0IFxuIFxyICIsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAiIFx0IFxuIFxyIFRlc3QgQ29tbWVudCBcdCBcbiBcciAiLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gMiwKICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKIyAtLS0KICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIFBhcmVudElEICA9PiAnJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICRTZXJ2aWNlTmFtZVszXSwKICAgICAgICAgICAgTmFtZVNob3J0ID0+ICRTZXJ2aWNlTmFtZVszXSwKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICA9PiAnVGVzdCBDb21tZW50JywKICAgICAgICAgICAgQ3JlYXRlQnkgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICA9PiAxLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+IDIsCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2VydmljZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gIiBcdCBcbiBcciAiIC4gJFNlcnZpY2VOYW1lWzNdIC4gIiBVUERBVEUxIFx0IFxuIFxyICIsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMiwKICAgICAgICAgICAgQ29tbWVudCA9PiAiIFx0IFxuIFxyIFRlc3QgQ29tbWVudCBcdCBcbiBcciAiLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzFdLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBQYXJlbnRJRCAgPT4gJycsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VydmljZU5hbWVbM10gLiAnIFVQREFURTEnLAogICAgICAgICAgICBOYW1lU2hvcnQgPT4gJFNlcnZpY2VOYW1lWzNdIC4gJyBVUERBVEUxJywKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgICA9PiAnVGVzdCBDb21tZW50JywKICAgICAgICAgICAgQ3JlYXRlQnkgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICA9PiAkVXNlcklEc1sxXSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzZXJ2aWNlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjY2Vzc2Z1bGx5IChVbmljb2RlIGNoZWNrcykKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVs0XSAuICcgz5Igz6Egxqkgz54gJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICcg0aAg0aQgVGVzdENvbW1lbnQ1IM+gIM6pICcsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgUGFyZW50SUQgID0+ICcnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJFNlcnZpY2VOYW1lWzRdIC4gJyDPkiDPoSDGqSDPnicsCiAgICAgICAgICAgIE5hbWVTaG9ydCA9PiAkU2VydmljZU5hbWVbNF0gLiAnIM+SIM+hIMapIM+eJywKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICA9PiAn0aAg0aQgVGVzdENvbW1lbnQ1IM+gIM6pJywKICAgICAgICAgICAgQ3JlYXRlQnkgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICA9PiAxLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2VydmljZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgKFVuaWNvZGUgY2hlY2tzKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lWzRdIC4gJyDPkiDPoSDGqSDPniBVUERBVEUxJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgICAgICBDb21tZW50ID0+ICcg0aAg0aQgVGVzdENvbW1lbnQ1IM+gIM6pIFVQREFURTEnLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzBdLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBQYXJlbnRJRCAgPT4gJycsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VydmljZU5hbWVbNF0gLiAnIM+SIM+hIMapIM+eIFVQREFURTEnLAogICAgICAgICAgICBOYW1lU2hvcnQgPT4gJFNlcnZpY2VOYW1lWzRdIC4gJyDPkiDPoSDGqSDPniBVUERBVEUxJywKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgICA9PiAn0aAg0aQgVGVzdENvbW1lbnQ1IM+gIM6pIFVQREFURTEnLAogICAgICAgICAgICBDcmVhdGVCeSAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgID0+ICRVc2VySURzWzBdLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNlcnZpY2UgbXVzdCBiZSBpbnNlcnRlZCBzdWNjZXNzZnVsbHkgKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICcgW3Rlc3RdJSpcXCAnIC4gJFNlcnZpY2VOYW1lWzhdIC4gJyBbdGVzdF0lKlxcICcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnIFt0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBQYXJlbnRJRCAgPT4gJycsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnW3Rlc3RdJSpcXCAnIC4gJFNlcnZpY2VOYW1lWzhdIC4gJyBbdGVzdF0lKlxcJywKICAgICAgICAgICAgTmFtZVNob3J0ID0+ICdbdGVzdF0lKlxcICcgLiAkU2VydmljZU5hbWVbOF0gLiAnIFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICdbdGVzdF0lKlxcIFRlc3QgQ29tbWVudCBbdGVzdF0lKlxcJywKICAgICAgICAgICAgQ3JlYXRlQnkgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICA9PiAxLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgc2VydmljZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICcgW3Rlc3RdJSpcXCAnIC4gJFNlcnZpY2VOYW1lWzhdIC4gJyBVUERBVEUxIFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgICAgICBDb21tZW50ID0+ICcgW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgVVBEQVRFMSBbdGVzdF0lKlxcICcsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMV0sCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKIyAtLS0KICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIFBhcmVudElEICA9PiAnJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICdbdGVzdF0lKlxcICcgLiAkU2VydmljZU5hbWVbOF0gLiAnIFVQREFURTEgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIE5hbWVTaG9ydCA9PiAnW3Rlc3RdJSpcXCAnIC4gJFNlcnZpY2VOYW1lWzhdIC4gJyBVUERBVEUxIFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMiwKICAgICAgICAgICAgQ29tbWVudCAgID0+ICdbdGVzdF0lKlxcIFRlc3QgQ29tbWVudCBVUERBVEUxIFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBDcmVhdGVCeSAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgID0+ICRVc2VySURzWzFdLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNlcnZpY2UgbXVzdCBiZSBpbnNlcnRlZCBzdWNjZXNzZnVsbHkgKHVzZWQgZm9yIHRoZSBmb2xsb3dpbmcgdGVzdHMpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU2VydmljZU5hbWVbNV0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBQYXJlbnRJRCAgPT4gJycsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VydmljZU5hbWVbNV0sCiAgICAgICAgICAgIE5hbWVTaG9ydCA9PiAkU2VydmljZU5hbWVbNV0sCiAgICAgICAgICAgIFZhbGlkSUQgICA9PiAxLAogICAgICAgICAgICBDcmVhdGVCeSAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgc2VydmljZSBtdXN0IGJlIGluc2VydGVkIHN1Y2Nlc3NmdWxseSAocGFyZW50IHNlcnZpY2UgY2hlY2spCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgUGFyZW50SUQgPT4gJ0xBU1RBRERJRCcsCiAgICAgICAgICAgIE5hbWUgICAgID0+ICRTZXJ2aWNlTmFtZVs2XSwKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgUGFyZW50SUQgID0+ICdMQVNUQURESUQnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJFNlcnZpY2VOYW1lWzVdIC4gJzo6JyAuICRTZXJ2aWNlTmFtZVs2XSwKICAgICAgICAgICAgTmFtZVNob3J0ID0+ICRTZXJ2aWNlTmFtZVs2XSwKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENyZWF0ZUJ5ICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzZXJ2aWNlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjY2Vzc2Z1bGx5IChwYXJlbnQgc2VydmljZSBjaGVjaykKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBQYXJlbnRJRCA9PiAnTEFTVEFERElEJywKICAgICAgICAgICAgTmFtZSAgICAgPT4gIiBcbiBcdCAiIC4gJFNlcnZpY2VOYW1lWzddIC4gIiBcbiBcdCAiLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBQYXJlbnRJRCAgPT4gJ0xBU1RBRERJRCcsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VydmljZU5hbWVbNV0gLiAnOjonIC4gJFNlcnZpY2VOYW1lWzZdIC4gJzo6JyAuICRTZXJ2aWNlTmFtZVs3XSwKICAgICAgICAgICAgTmFtZVNob3J0ID0+ICRTZXJ2aWNlTmFtZVs3XSwKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENyZWF0ZUJ5ICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNlcnZpY2UgbXVzdCBiZSBOT1QgdXBkYXRlZCAocGFyZW50IHNlcnZpY2UgaWQgYW5kIHBhcmVudCBpZCBhcmUgaWRlbnRpY2FsKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFBhcmVudElEID0+ICdMQVNUQURESUQnLAogICAgICAgICAgICBOYW1lICAgICA9PiAkU2VydmljZU5hbWVbN10gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHNlcnZpY2UgbXVzdCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSAobW92ZSBzZXJ2aWNlIHRvIHRoZSBoaWdoZXN0IGxldmVsKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFBhcmVudElEID0+ICcnLAogICAgICAgICAgICBOYW1lICAgICA9PiAkU2VydmljZU5hbWVbN10gLiAnIFVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBQYXJlbnRJRCAgPT4gJycsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VydmljZU5hbWVbN10gLiAnIFVQREFURTEnLAogICAgICAgICAgICBOYW1lU2hvcnQgPT4gJFNlcnZpY2VOYW1lWzddIC4gJyBVUERBVEUxJywKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENyZWF0ZUJ5ICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBzZXJ2aWNlIG11c3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgKG1vdmUgc2VydmljZSBiYWNrIHdpdGggdGhlIG9sZCBwYXJlbnQgc2VydmljZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBQYXJlbnRJRCA9PiAnTEFTVExBU1RBRERJRCcsCiAgICAgICAgICAgIE5hbWUgICAgID0+ICRTZXJ2aWNlTmFtZVs3XSAuICcgVVBEQVRFKDIpJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgUGFyZW50SUQgPT4gJ0xBU1RMQVNUQURESUQnLAogICAgICAgICAgICBOYW1lICAgICA9PiAkU2VydmljZU5hbWVbNV0gLiAnOjonCiAgICAgICAgICAgICAgICAuICRTZXJ2aWNlTmFtZVs2XSAuICc6OicKICAgICAgICAgICAgICAgIC4gJFNlcnZpY2VOYW1lWzddCiAgICAgICAgICAgICAgICAuICcgVVBEQVRFKDIpJywKICAgICAgICAgICAgTmFtZVNob3J0ID0+ICRTZXJ2aWNlTmFtZVs3XSAuICcgVVBEQVRFKDIpJywKICAgICAgICAgICAgVmFsaWRJRCAgID0+IDEsCiAgICAgICAgICAgIENyZWF0ZUJ5ICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgICAgIH0sCiAgICB9LApdOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHJ1biBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRUZXN0Q291bnQgPSAxOwpteSAkTGFzdEFkZGVkU2VydmljZUlEOwpteSAkTGFzdExhc3RBZGRlZFNlcnZpY2VJRDsKbXkgJEFkZGVkQ291bnRlciA9IDA7Cgpmb3IgbXkgJEl0ZW0gKCBAeyRJdGVtRGF0YX0gKSB7CgogICAgaWYgKCAkSXRlbS0+e0FkZH0gKSB7CgogICAgICAgICMgcHJlcGFyZSBwYXJlbnQgaWQKICAgICAgICBpZiAoICRJdGVtLT57QWRkfS0+e1BhcmVudElEfSAmJiAkSXRlbS0+e0FkZH0tPntQYXJlbnRJRH0gZXEgJ0xBU1RBRERJRCcgKSB7CiAgICAgICAgICAgICRJdGVtLT57QWRkfS0+e1BhcmVudElEfSA9ICRMYXN0QWRkZWRTZXJ2aWNlSUQ7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEl0ZW0tPntBZGR9LT57UGFyZW50SUR9ICYmICRJdGVtLT57QWRkfS0+e1BhcmVudElEfSBlcSAnTEFTVExBU1RBRERJRCcgKSB7CiAgICAgICAgICAgICRJdGVtLT57QWRkfS0+e1BhcmVudElEfSA9ICRMYXN0TGFzdEFkZGVkU2VydmljZUlEOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZGVsZXRlICRJdGVtLT57QWRkfS0+e1BhcmVudElEfTsKICAgICAgICB9CgogICAgICAgICMgYWRkIG5ldyBzZXJ2aWNlCiAgICAgICAgbXkgJFNlcnZpY2VJRCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlQWRkKAogICAgICAgICAgICAleyAkSXRlbS0+e0FkZH0gfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHNlcnZpY2Ugd2FzIGFkZGVkIHN1Y2Nlc3NmdWxseSBvciBub3QKICAgICAgICBpZiAoICRJdGVtLT57QWRkR2V0fSApIHsKCiAgICAgICAgICAgICMgcHJlcGFyZSBwYXJlbnQgaWQKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0FkZEdldH0tPntQYXJlbnRJRH0gJiYgJEl0ZW0tPntBZGRHZXR9LT57UGFyZW50SUR9IGVxICdMQVNUQURESUQnICkgewogICAgICAgICAgICAgICAgJEl0ZW0tPntBZGRHZXR9LT57UGFyZW50SUR9ID0gJExhc3RBZGRlZFNlcnZpY2VJRDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRJdGVtLT57QWRkR2V0fS0+e1BhcmVudElEfSAmJiAkSXRlbS0+e0FkZEdldH0tPntQYXJlbnRJRH0gZXEgJ0xBU1RMQVNUQURESUQnICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEl0ZW0tPntBZGRHZXR9LT57UGFyZW50SUR9ID0gJExhc3RMYXN0QWRkZWRTZXJ2aWNlSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNlcnZpY2VBZGQoKSAtIFNlcnZpY2VJRDogJFNlcnZpY2VJRCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJFNlcnZpY2VJRCkgewoKICAgICAgICAgICAgICAgICMgbG9va3VwIHNlcnZpY2UgbmFtZQogICAgICAgICAgICAgICAgbXkgJFNlcnZpY2VOYW1lID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMb29rdXAoIFNlcnZpY2VJRCA9PiAkU2VydmljZUlEICk7CgogICAgICAgICAgICAgICAgIyBsb29rdXAgdGVzdAogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICRTZXJ2aWNlTmFtZSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0FkZEdldH0tPntOYW1lfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTZXJ2aWNlTG9va3VwKCkgLSBsb29rdXAiLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJldmVyc2UgbG9va3VwIHRoZSBzZXJ2aWNlIGlkCiAgICAgICAgICAgICAgICBteSAkU2VydmljZUlETmV3ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMb29rdXAoIE5hbWUgPT4gJFNlcnZpY2VOYW1lIHx8ICcnICk7CgogICAgICAgICAgICAgICAgIyByZXZlcnNlIGxvb2t1cCB0ZXN0CiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAgICAgJFNlcnZpY2VJRE5ldyB8fCAnJywKICAgICAgICAgICAgICAgICAgICAkU2VydmljZUlEICAgIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNlcnZpY2VMb29rdXAoKSAtIHJldmVyc2UgbG9va3VwIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZXQgbGFzdCBzZXJ2aWNlIGlkIHZhcmlhYmxlCiAgICAgICAgICAgICAgICAkTGFzdExhc3RBZGRlZFNlcnZpY2VJRCA9ICRMYXN0QWRkZWRTZXJ2aWNlSUQ7CiAgICAgICAgICAgICAgICAkTGFzdEFkZGVkU2VydmljZUlEICAgICA9ICRTZXJ2aWNlSUQ7CgogICAgICAgICAgICAgICAgIyBpbmNyZW1lbnQgdGhlIGFkZGVkIGNvdW50ZXIKICAgICAgICAgICAgICAgICRBZGRlZENvdW50ZXIrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNlcnZpY2VBZGQoKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzZXJ2aWNlIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciBjcmVhdGlvbiBvZiB0aGUgc2VydmljZQogICAgICAgIG15ICVTZXJ2aWNlR2V0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VHZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUlELAogICAgICAgICAgICBVc2VySUQgICAgPT4gJEl0ZW0tPntBZGR9LT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHNlcnZpY2UgZGF0YSBhZnRlciBjcmVhdGlvbiBvZiB0aGUgc2VydmljZQogICAgICAgIGZvciBteSAkU2VydmljZUF0dHJpYnV0ZSAoIHNvcnQga2V5cyAleyAkSXRlbS0+e0FkZEdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJFNlcnZpY2VHZXR7JFNlcnZpY2VBdHRyaWJ1dGV9IHx8ICcnLAogICAgICAgICAgICAgICAgJEl0ZW0tPntBZGRHZXR9LT57JFNlcnZpY2VBdHRyaWJ1dGV9IHx8ICcnLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogU2VydmljZUdldCgpIC0gJFNlcnZpY2VBdHRyaWJ1dGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRJdGVtLT57VXBkYXRlfSApIHsKCiAgICAgICAgIyBjaGVjayBsYXN0IHNlcnZpY2UgaWQgdmFyaWFibGUKICAgICAgICBpZiAoICEkTGFzdEFkZGVkU2VydmljZUlEICkgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogTk8gTEFTVCBTRVJWSUNFIElEIEdJVkVOIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcHJlcGFyZSBwYXJlbnQgaWQKICAgICAgICBpZiAoICRJdGVtLT57VXBkYXRlfS0+e1BhcmVudElEfSAmJiAkSXRlbS0+e1VwZGF0ZX0tPntQYXJlbnRJRH0gZXEgJ0xBU1RBRERJRCcgKSB7CiAgICAgICAgICAgICRJdGVtLT57VXBkYXRlfS0+e1BhcmVudElEfSA9ICRMYXN0QWRkZWRTZXJ2aWNlSUQ7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEl0ZW0tPntVcGRhdGV9LT57UGFyZW50SUR9ICYmICRJdGVtLT57VXBkYXRlfS0+e1BhcmVudElEfSBlcSAnTEFTVExBU1RBRERJRCcgKSB7CiAgICAgICAgICAgICRJdGVtLT57VXBkYXRlfS0+e1BhcmVudElEfSA9ICRMYXN0TGFzdEFkZGVkU2VydmljZUlEOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZGVsZXRlICRJdGVtLT57VXBkYXRlfS0+e1BhcmVudElEfTsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIHRoZSBzZXJ2aWNlCiAgICAgICAgbXkgJFVwZGF0ZVN1Y2VzcyA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlVXBkYXRlKAogICAgICAgICAgICAleyAkSXRlbS0+e1VwZGF0ZX0gfSwKICAgICAgICAgICAgU2VydmljZUlEID0+ICRMYXN0QWRkZWRTZXJ2aWNlSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBzZXJ2aWNlIHdhcyB1cGRhdGVkIHN1Y2Nlc3NmdWxseSBvciBub3QKICAgICAgICBpZiAoICRJdGVtLT57VXBkYXRlR2V0fSApIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkVXBkYXRlU3VjZXNzLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogU2VydmljZVVwZGF0ZSgpIC0gU2VydmljZUlEOiAkTGFzdEFkZGVkU2VydmljZUlEIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTZXJ2aWNlVXBkYXRlKCkiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgbm9uLWV4aXN0aW5nIHNlcnZpY2UKICAgICAgICBteSAkTm9uZXhpc3RpbmdTZXJ2aWNlSUQgPSAzMjU2NyAtIDE7CiAgICAgICAgbXkgJFVwZGF0ZU5vblN1Y2VzcyAgICAgID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VVcGRhdGUoCiAgICAgICAgICAgICV7ICRJdGVtLT57VXBkYXRlfSB9LAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJE5vbmV4aXN0aW5nU2VydmljZUlELAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkVXBkYXRlTm9uU3VjZXNzLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTZXJ2aWNlVXBkYXRlKCkgZm9yIG5vbmV4aXN0aW5nIHNlcnZpY2UiLAogICAgICAgICk7CgogICAgICAgICMgcHJlcGFyZSBwYXJlbnQgaWQKICAgICAgICBpZiAoICRJdGVtLT57VXBkYXRlR2V0fS0+e1BhcmVudElEfSAmJiAkSXRlbS0+e1VwZGF0ZUdldH0tPntQYXJlbnRJRH0gZXEgJ0xBU1RBRERJRCcgKSB7CiAgICAgICAgICAgICRJdGVtLT57VXBkYXRlR2V0fS0+e1BhcmVudElEfSA9ICRMYXN0QWRkZWRTZXJ2aWNlSUQ7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgKICAgICAgICAgICAgJEl0ZW0tPntVcGRhdGVHZXR9LT57UGFyZW50SUR9CiAgICAgICAgICAgICYmICRJdGVtLT57VXBkYXRlR2V0fS0+e1BhcmVudElEfSBlcSAnTEFTVExBU1RBRERJRCcKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEl0ZW0tPntVcGRhdGVHZXR9LT57UGFyZW50SUR9ID0gJExhc3RMYXN0QWRkZWRTZXJ2aWNlSUQ7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzZXJ2aWNlIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlCiAgICAgICAgbXkgJVNlcnZpY2VHZXQyID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VHZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkTGFzdEFkZGVkU2VydmljZUlELAogICAgICAgICAgICBVc2VySUQgICAgPT4gJEl0ZW0tPntVcGRhdGV9LT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHNlcnZpY2UgZGF0YSBhZnRlciB1cGRhdGUKICAgICAgICBmb3IgbXkgJFNlcnZpY2VBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJXsgJEl0ZW0tPntVcGRhdGVHZXR9IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRTZXJ2aWNlR2V0MnskU2VydmljZUF0dHJpYnV0ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAkSXRlbS0+e1VwZGF0ZUdldH0tPnskU2VydmljZUF0dHJpYnV0ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTZXJ2aWNlR2V0KCkgLSAkU2VydmljZUF0dHJpYnV0ZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGxvb2t1cCBzZXJ2aWNlIG5hbWUKICAgICAgICBteSAkU2VydmljZU5hbWUgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxvb2t1cCggU2VydmljZUlEID0+ICRTZXJ2aWNlR2V0MntTZXJ2aWNlSUR9ICk7CgogICAgICAgICMgbG9va3VwIHRlc3QKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZXJ2aWNlTmFtZSB8fCAnJywKICAgICAgICAgICAgJFNlcnZpY2VHZXQye05hbWV9IHx8ICcnLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTZXJ2aWNlTG9va3VwKCkgLSBsb29rdXAiLAogICAgICAgICk7CgogICAgICAgICMgcmV2ZXJzZSBsb29rdXAgdGhlIHNlcnZpY2UgaWQKICAgICAgICBteSAkU2VydmljZUlETmV3ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMb29rdXAoIE5hbWUgPT4gJFNlcnZpY2VOYW1lIHx8ICcnICk7CgogICAgICAgICMgcmV2ZXJzZSBsb29rdXAgdGVzdAogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlcnZpY2VJRE5ldyB8fCAnJywKICAgICAgICAgICAgJFNlcnZpY2VHZXQye1NlcnZpY2VJRH0gfHwgJycsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNlcnZpY2VMb29rdXAoKSAtIHJldmVyc2UgbG9va3VwIiwKICAgICAgICApOwogICAgfQoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIEFkZGl0aW9uYWwgU2VydmljZUdldCB0ZXN0IChCeSBTZXJ2aWNlTmFtZSBhbmQgU2VydmljZUlEKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgp7CgogICAgIyBnZXQgYSBzZXJ2aWNlIGJ5IHVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUKICAgIG15ICVTZXJ2aWNlR2V0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VHZXQoCiAgICAgICAgTmFtZSAgID0+ICRTZXJ2aWNlTmFtZVswXSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRTZXJ2aWNlR2V0e05hbWV9LAogICAgICAgICRTZXJ2aWNlTmFtZVswXSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTZXJ2aWNlR2V0KCkgLSBieSBzZXJ2aWNlIG5hbWUiLAogICAgKTsKCiAgICAjIGdldCB0aGUgc2FtZSBzZXJ2aWNlIGJ5IHVzaW5nIHRoZSBzZXJ2aWNlIGlkCiAgICAlU2VydmljZUdldCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlR2V0KAogICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUdldHtTZXJ2aWNlSUR9LAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJFNlcnZpY2VHZXR7TmFtZX0sCiAgICAgICAgJFNlcnZpY2VOYW1lWzBdLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNlcnZpY2VHZXQoKSAtIGJ5IHNlcnZpY2UgaWQiLAogICAgKTsKCn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBTZXJ2aWNlTGlzdCB0ZXN0IDEgKGNoZWNrIGdlbmVyYWwgZnVuY3Rpb25hbGl0eSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJVNlcnZpY2VMaXN0MSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTGlzdCgKICAgIFZhbGlkICA9PiAwLAogICAgVXNlcklEID0+IDEsCik7Cm15ICVTZXJ2aWNlTGlzdDFPcmcgPSAlU2VydmljZUxpc3RPcmlnaW5hbDsKClNFUlZJQ0VJRDoKZm9yIG15ICRTZXJ2aWNlSUQgKCBzb3J0IGtleXMgJVNlcnZpY2VMaXN0MU9yZyApIHsKCiAgICBpZiAoICRTZXJ2aWNlTGlzdDF7JFNlcnZpY2VJRH0gJiYgJFNlcnZpY2VMaXN0MU9yZ3skU2VydmljZUlEfSBlcSAkU2VydmljZUxpc3QxeyRTZXJ2aWNlSUR9ICkgewogICAgICAgIGRlbGV0ZSAkU2VydmljZUxpc3QxeyRTZXJ2aWNlSUR9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlcnZpY2VMaXN0MXtEdW1teX0gPSAxOwogICAgfQp9CgpteSAkU2VydmljZUxpc3QxQ291bnQgPSBzY2FsYXIga2V5cyAlU2VydmljZUxpc3QxOwoKJFNlbGYtPklzKAogICAgJFNlcnZpY2VMaXN0MUNvdW50IHx8ICcnLAogICAgJEFkZGVkQ291bnRlciAgICAgIHx8ICcnLAogICAgIlRlc3QgJFRlc3RDb3VudDogU2VydmljZUxpc3QoKSIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgU2VydmljZUxpc3QgdGVzdCAyIChjaGVjayBjYWNoZSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJVNlcnZpY2VMaXN0MiA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTGlzdCgKICAgIFZhbGlkICA9PiAwLAogICAgVXNlcklEID0+IDEsCik7CgpteSAkU2VydmljZUxpc3QyU2VydmljZUlEID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VBZGQoCiAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZVs5XSwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgVHlwZUlEICAgICAgPT4gMSwKICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCik7CgpteSAlU2VydmljZUxpc3QyYiA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTGlzdCgKICAgIFZhbGlkICA9PiAwLAogICAgVXNlcklEID0+IDEsCik7CgpTRVJWSUNFSUQ6CmZvciBteSAkU2VydmljZUlEICggc29ydCBrZXlzICVTZXJ2aWNlTGlzdDIgKSB7CgogICAgaWYgKCAkU2VydmljZUxpc3QyYnskU2VydmljZUlEfSAmJiAkU2VydmljZUxpc3QyeyRTZXJ2aWNlSUR9IGVxICRTZXJ2aWNlTGlzdDJieyRTZXJ2aWNlSUR9ICkgewogICAgICAgIGRlbGV0ZSAkU2VydmljZUxpc3QyYnskU2VydmljZUlEfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZXJ2aWNlTGlzdDJie0R1bW15fSA9IDE7CiAgICB9Cn0KCm15IEBTZXJ2aWNlTGlzdDJJRHMgICA9IGtleXMgJVNlcnZpY2VMaXN0MmI7Cm15ICRTZXJ2aWNlTGlzdDJDb3VudCA9IHNjYWxhciBAU2VydmljZUxpc3QySURzOwoKJFNlbGYtPklzKAogICAgJFNlcnZpY2VMaXN0MkNvdW50IHx8ICcnLAogICAgMSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IFNlcnZpY2VMaXN0KCkgLSBjaGVjayBudW1iZXIgb2Ygc2VydmljZXMiLAopOwoKJFNlbGYtPklzKAogICAgJFNlcnZpY2VMaXN0MklEc1swXSB8fCAnJywKICAgICRTZXJ2aWNlTGlzdDJTZXJ2aWNlSUQgfHwgJycsCiAgICAiVGVzdCAkVGVzdENvdW50OiBTZXJ2aWNlTGlzdCgpIC0gY2hlY2sgaWQgb2YgbGFzdCBzZXJ2aWNlIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBTZXJ2aWNlU2VhcmNoIHRlc3QgMSAoY2hlY2sgZ2VuZXJhbCBmdW5jdGlvbmFsaXR5KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSBAU2VydmljZVNlYXJjaDFTZWFyY2ggPSAkU2VydmljZU9iamVjdC0+U2VydmljZVNlYXJjaCggVXNlcklEID0+IDEgKTsKCm15ICVTZXJ2aWNlU2VhcmNoMUxpc3QgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxpc3QoCiAgICBVc2VySUQgICAgICAgPT4gMSwKICAgIEtlZXBDaGlsZHJlbiA9PiAxLAopOwoKU0VSVklDRUlEOgpmb3IgbXkgJFNlcnZpY2VJRCAoQFNlcnZpY2VTZWFyY2gxU2VhcmNoKSB7CgogICAgaWYgKCAkU2VydmljZVNlYXJjaDFMaXN0eyRTZXJ2aWNlSUR9ICkgewogICAgICAgIGRlbGV0ZSAkU2VydmljZVNlYXJjaDFMaXN0eyRTZXJ2aWNlSUR9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlcnZpY2VTZWFyY2gxTGlzdHtEdW1teX0gPSAxOwogICAgfQp9CgpteSAkU2VydmljZVNlYXJjaDFDb3VudCA9IHNjYWxhciBrZXlzICVTZXJ2aWNlU2VhcmNoMUxpc3Q7CgokU2VsZi0+SXMoCiAgICAkU2VydmljZVNlYXJjaDFDb3VudCwKICAgIDAsCiAgICAiVGVzdCAkVGVzdENvdW50OiBTZXJ2aWNlU2VhcmNoKCkiLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zIGZvciBsYXRlciB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGFkZCBzb21lIG5lZWRlZCBzZXJ2aWNlcyBmb3IgbGF0ZXIgdGVzdHMKbXkgQFNlcnZpY2VOYW1lcyA9ICggJFNlcnZpY2VOYW1lWzEwXSAuICdOb3JtYWwnLCAkU2VydmljZU5hbWVbMTBdIC4gJ9SIINO0IM+qIM++JyApOwpteSAlU2VydmljZVNlYXJjaDJTZXJ2aWNlSUQ7CgpteSAkQ291bnRlcjEgPSAwOwpmb3IgbXkgJFNlcnZpY2VOYW1lIChAU2VydmljZU5hbWVzKSB7CgogICAgJFNlcnZpY2VTZWFyY2gyU2VydmljZUlEeyRDb3VudGVyMX0gPSAkU2VydmljZU9iamVjdC0+U2VydmljZUFkZCgKICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZSwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgVHlwZUlEICAgICAgPT4gMSwKICAgICAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgKTsKCiAgICAkQ291bnRlcjErKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFNlcnZpY2VTZWFyY2ggdGVzdCAyIChnZW5lcmFsIG5hbWUgY2hlY2tzKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkQ291bnRlcjIgPSAwOwpmb3IgbXkgJFNlcnZpY2VOYW1lIChAU2VydmljZU5hbWVzKSB7CgogICAgbXkgQFByZXBhcmVkTmFtZXMgPSAoCiAgICAgICAgJFNlcnZpY2VOYW1lLAogICAgICAgICcqJyAuICRTZXJ2aWNlTmFtZSwKICAgICAgICAkU2VydmljZU5hbWUgLiAnKicsCiAgICAgICAgJyonIC4gJFNlcnZpY2VOYW1lIC4gJyonLAogICAgICAgICcqKicgLiAkU2VydmljZU5hbWUsCiAgICAgICAgJFNlcnZpY2VOYW1lIC4gJyoqJywKICAgICAgICAnKionIC4gJFNlcnZpY2VOYW1lIC4gJyoqJywKICAgICk7CgogICAgZm9yIG15ICRQcmVwYXJlZE5hbWUgKEBQcmVwYXJlZE5hbWVzKSB7CgogICAgICAgIG15IEBTZXJ2aWNlTGlzdCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlU2VhcmNoKAogICAgICAgICAgICBOYW1lICAgPT4gJFNlcnZpY2VOYW1lLAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZXJ2aWNlTGlzdFswXSB8fCAnJywKICAgICAgICAgICAgJFNlcnZpY2VTZWFyY2gyU2VydmljZUlEeyRDb3VudGVyMn0gfHwgJycsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNlcnZpY2VTZWFyY2goKSAtIGdlbmVyYWwgbmFtZSBjaGVjayIsCiAgICAgICAgKTsKCiAgICAgICAgJFRlc3RDb3VudCsrOwogICAgfQoKICAgICRDb3VudGVyMisrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgU2VydmljZUxpc3RHZXQKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgdGhlIGxpc3Qgb2Ygc2VydmljZXMKbXkgJFNlcnZpY2VMaXN0ID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMaXN0R2V0KAogICAgVmFsaWQgID0+IDAsCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgY2hlY2sgaWYgcmVzdWx0IGlzIGFuIGFycmF5IHJlZgokU2VsZi0+SXMoCiAgICByZWYgJFNlcnZpY2VMaXN0LAogICAgJ0FSUkFZJywKICAgICJTZXJ2aWNlTGlzdEdldCgpIC0gSXMgQXJyYXkiLAopOwoKIyBjaGVjayBpZiBlYWNoIGFycmF5IGl0ZW0gaXMgYSBoYXNoIHJlZgp7CiAgICBteSAkQ291bnRlcjsKICAgIGZvciBteSAkU2VydmljZURhdGEgKCBAeyRTZXJ2aWNlTGlzdH0gKSB7CgogICAgICAgICRDb3VudGVyKys7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICByZWYgJFNlcnZpY2VEYXRhLAogICAgICAgICAgICAnSEFTSCcsCiAgICAgICAgICAgICJTZXJ2aWNlTGlzdEdldFskQ291bnRlcl0gLSBJcyBIYXNoIiwKICAgICAgICApOwogICAgfQp9CgojIGNoZWNrIGludGVncml0eSBvZiBlYWNoIGFycmF5IGVsZW1lbnQKewogICAgbXkgJENvdW50ZXI7CiAgICBmb3IgbXkgJFNlcnZpY2VEYXRhICggQHskU2VydmljZUxpc3R9ICkgewoKICAgICAgICBteSAlU2VydmljZSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VEYXRhLT57U2VydmljZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgSW5jaWRlbnRTdGF0ZSA9PiAxLAojIC0tLQogICAgICAgICk7CiAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgICRTZXJ2aWNlRGF0YSwKICAgICAgICAgICAgXCVTZXJ2aWNlLAogICAgICAgICAgICAiU2VydmljZUxpc3RHZXRbJENvdW50ZXJdIC0gQ29tcGFyZWQgdG8gU2VydmljZUdldCIsCiAgICAgICAgKTsKICAgIH0KfQoKIyBhZGQgc2VydmljZXMKbXkgJFNlcnZpY2VHcmFuZEZhdGhlcklEID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VBZGQoCiAgICBOYW1lICAgICA9PiAnVW5pdFRlc3RTZXJ2aWNlX0dGXycgLiAkUmFuZG9tSUQsCiAgICBQYXJlbnRJRCA9PiAwLAogICAgVmFsaWRJRCAgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgVHlwZUlEICAgICAgPT4gMSwKICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICBDb21tZW50ICA9PiAnVGVzdGluZyBzZXJ2aWNlJywKICAgIFVzZXJJRCAgID0+IDEsCik7CgojIHNhbml0eSBjaGVjawokU2VsZi0+VHJ1ZSgKICAgICRTZXJ2aWNlR3JhbmRGYXRoZXJJRCwKICAgICJTZXJ2aWNlQWRkKCkgLSBmb3IgU2VydmljZUdyYW5kRmF0aGVyIgopOwoKbXkgJFNlcnZpY2VGYXRoZXJJRCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlQWRkKAogICAgTmFtZSAgICAgPT4gJ1VuaXRUZXN0U2VydmljZV9GXycgLiAkUmFuZG9tSUQsCiAgICBQYXJlbnRJRCA9PiAkU2VydmljZUdyYW5kRmF0aGVySUQsCiAgICBWYWxpZElEICA9PiAxLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICBUeXBlSUQgICAgICA9PiAxLAogICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKIyAtLS0KICAgIENvbW1lbnQgID0+ICdUZXN0aW5nIHNlcnZpY2UnLAogICAgVXNlcklEICAgPT4gMSwKKTsKCiMgc2FuaXR5IGNoZWNrCiRTZWxmLT5UcnVlKAogICAgJFNlcnZpY2VGYXRoZXJJRCwKICAgICJTZXJ2aWNlQWRkKCkgLSBmb3IgU2VydmljZUZhdGhlciIKKTsKCm15ICRTZXJ2aWNlU29uSUQgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUFkZCgKICAgIE5hbWUgICAgID0+ICdVbml0VGVzdFNlcnZpY2VfU18nIC4gJFJhbmRvbUlELAogICAgUGFyZW50SUQgPT4gJFNlcnZpY2VGYXRoZXJJRCwKICAgIFZhbGlkSUQgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgIFR5cGVJRCAgICAgID0+IDEsCiAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgQ29tbWVudCAgPT4gJ1Rlc3Rpbmcgc2VydmljZScsCiAgICBVc2VySUQgICA9PiAxLAopOwoKIyBzYW5pdHkgY2hlY2sKJFNlbGYtPlRydWUoCiAgICAkU2VydmljZVNvbklELAogICAgIlNlcnZpY2VBZGQoKSAtIGZvciBTZXJ2aWNlU29uIgopOwoKIyBnZXQgdGhlIHNlcnZpY2UgbGlzdCBhZ2FpbgpteSAkTmV3U2VydmljZUxpc3QgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxpc3RHZXQoCiAgICBWYWxpZCAgPT4gMCwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBjb21wYXJlIHRoZSBzZXJ2aWNlIGxpc3RzIChzaG91bGQgYmUgbm90IGVxdWFsIHNpbmNlIG5ldyBzZXJ2aWNlcyB3aGVyZSBhZGRlZCkKJFNlbGYtPklzTm90RGVlcGx5KAogICAgJFNlcnZpY2VMaXN0LAogICAgJE5ld1NlcnZpY2VMaXN0LAogICAgIlNlcnZpY2VMaXN0R2V0KCkgLSBjb21wYXJlZCB3aXRoIGl0c2VsZiBhZnRlciBhZGRpbmcgbmV3IHNlcnZpY2VzIgopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFNlcnZpY2VQYXJlbnRzR2V0CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IHRoZSBwYXJlbnRzIGZvciBncmFuZCBmYXRoZXIKbXkgJFNlcnZpY2VQYXJlbnRzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VQYXJlbnRzR2V0KAogICAgU2VydmljZUlEID0+ICRTZXJ2aWNlR3JhbmRGYXRoZXJJRCwKICAgIFVzZXJJRCAgICA9PiAxLAopOwoKJFNlbGYtPklzRGVlcGx5KAogICAgJFNlcnZpY2VQYXJlbnRzLAogICAgW10sCiAgICAiU2VydmljZVBhcmVudHNMaXN0R2V0IC0gZm9yIFNlcnZpY2VHcmFuZEZhdGhlciIKKTsKCiRTZXJ2aWNlUGFyZW50cyA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlUGFyZW50c0dldCgKICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUdyYW5kRmF0aGVySUQsCiAgICBVc2VySUQgICAgPT4gMSwKKTsKCiRTZWxmLT5Jc0RlZXBseSgKICAgICRTZXJ2aWNlUGFyZW50cywKICAgIFtdLAogICAgIlNlcnZpY2VQYXJlbnRzTGlzdEdldCAtIGZvciBTZXJ2aWNlR3JhbmRGYXRoZXIgKGNhY2hlZCkiCik7CgojIGdldCB0aGUgcGFyZW50cyBmb3IgZmF0aGVyCiRTZXJ2aWNlUGFyZW50cyA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlUGFyZW50c0dldCgKICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUZhdGhlcklELAogICAgVXNlcklEICAgID0+IDEsCik7CgokU2VsZi0+SXNEZWVwbHkoCiAgICAkU2VydmljZVBhcmVudHMsCiAgICBbJFNlcnZpY2VHcmFuZEZhdGhlcklEXSwKICAgICJTZXJ2aWNlUGFyZW50c0dldCAtIGZvciBTZXJ2aWNlRmF0aGVyIgopOwoKJFNlcnZpY2VQYXJlbnRzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VQYXJlbnRzR2V0KAogICAgU2VydmljZUlEID0+ICRTZXJ2aWNlRmF0aGVySUQsCiAgICBVc2VySUQgICAgPT4gMSwKKTsKCiRTZWxmLT5Jc0RlZXBseSgKICAgICRTZXJ2aWNlUGFyZW50cywKICAgIFskU2VydmljZUdyYW5kRmF0aGVySURdLAogICAgIlNlcnZpY2VQYXJlbnRzR2V0IC0gZm9yIFNlcnZpY2VGYXRoZXIgKGNhY2hlZCkiCik7CgojIGdldCB0aGUgcGFyZW50cyBmb3Igc29uCiRTZXJ2aWNlUGFyZW50cyA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlUGFyZW50c0dldCgKICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZVNvbklELAogICAgVXNlcklEICAgID0+IDEsCik7CgokU2VsZi0+SXNEZWVwbHkoCiAgICAkU2VydmljZVBhcmVudHMsCiAgICBbICRTZXJ2aWNlR3JhbmRGYXRoZXJJRCwgJFNlcnZpY2VGYXRoZXJJRCBdLAogICAgIlNlcnZpY2VQYXJlbnRzR2V0IC0gZm9yIFNlcnZpY2VTb24iCik7CgokU2VydmljZVBhcmVudHMgPSAkU2VydmljZU9iamVjdC0+U2VydmljZVBhcmVudHNHZXQoCiAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VTb25JRCwKICAgIFVzZXJJRCAgICA9PiAxLAopOwoKJFNlbGYtPklzRGVlcGx5KAogICAgJFNlcnZpY2VQYXJlbnRzLAogICAgWyAkU2VydmljZUdyYW5kRmF0aGVySUQsICRTZXJ2aWNlRmF0aGVySUQgXSwKICAgICJTZXJ2aWNlUGFyZW50c0dldCAtIGZvciBTZXJ2aWNlU29uIChjYWNoZWQpIgopOwoKIyBjbGVhbnVwIGlzIGRvbmUgYnkgUmVzdG9yZURhdGFiYXNlCgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA0ZmUyMThiZWNjZGI5MjZhMjlkZDdiZWQ5ZGU0ODIxMTQzMGQ2OWQwIC0gc2NyaXB0cy90ZXN0L1NMQS50CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgojIGdldCBuZWVkZWQgb2JqZWN0cwpteSAkQ29uZmlnT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7Cm15ICRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKTsKbXkgJFNMQU9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyk7Cm15ICRVc2VyT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBtYWtlIHByZXBhcmF0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGNyZWF0ZSBuZWVkZWQgdXNlcnMKbXkgQFVzZXJJRHM7CnsKCiAgICAjIGRpc2FibGUgZW1haWwgY2hlY2tzIHRvIGNyZWF0ZSBuZXcgdXNlcgogICAgbXkgJENoZWNrRW1haWxBZGRyZXNzZXNPcmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NoZWNrRW1haWxBZGRyZXNzZXMnKSB8fCAxOwogICAgJENvbmZpZ09iamVjdC0+U2V0KAogICAgICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgICAgICBWYWx1ZSA9PiAwLAogICAgKTsKCiAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDIgKSB7CgogICAgICAgICMgY3JlYXRlIG5ldyB1c2VycyBmb3IgdGhlIHRlc3RzCiAgICAgICAgbXkgJFVzZXJJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyQWRkKAogICAgICAgICAgICBVc2VyRmlyc3RuYW1lID0+ICdTTEEnIC4gJENvdW50ZXIsCiAgICAgICAgICAgIFVzZXJMYXN0bmFtZSAgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgVXNlckxvZ2luICAgICA9PiAnVW5pdFRlc3QtU0xBLScgLiAkQ291bnRlciAuICRIZWxwZXItPkdldFJhbmRvbUlEKCksCiAgICAgICAgICAgIFVzZXJFbWFpbCAgICAgPT4gJ1VuaXRUZXN0LVNMQS0nIC4gJENvdW50ZXIgLiAnQGxvY2FsaG9zdCcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFVzZXJJRHMsICRVc2VySUQ7CiAgICB9CgogICAgIyByZXN0b3JlIG9yaWdpbmFsIGVtYWlsIGNoZWNrIHBhcmFtCiAgICAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnLAogICAgKTsKfQoKIyBjcmVhdGUgbmVlZGVkIHJhbmRvbSBzZXJ2aWNlIG5hbWVzCm15IEBTTEFOYW1lOwpmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDEwICkgewogICAgcHVzaCBAU0xBTmFtZSwgJ1VuaXRUZXN0JyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7Cn0KCiMgY3JlYXRlIHNvbWUgdGVzdCBzZXJ2aWNlcwpteSBAU2VydmljZUlEczsKZm9yIG15ICRDb3VudGVyICggMSAuLiAzICkgewoKICAgICMgYWRkIGEgc2VydmljZQogICAgbXkgJFNlcnZpY2VJRCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlQWRkKAogICAgICAgIE5hbWUgICAgPT4gJ1VuaXRUZXN0LVNMQScgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICBUeXBlSUQgICAgICA9PiAxLAogICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICApOwoKICAgIHB1c2ggQFNlcnZpY2VJRHMsICRTZXJ2aWNlSUQ7Cn0KCiMgZ2V0IG9yaWdpbmFsIFNMQSBsaXN0IGZvciBsYXRlciBjaGVja3MKbXkgJVNMQUxpc3RPcmlnaW5hbCA9ICRTTEFPYmplY3QtPlNMQUxpc3QoCiAgICBWYWxpZCAgPT4gMCwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRJdGVtRGF0YSA9IFsKCiAgICAjIHRoaXMgU0xBIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgU0xBIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBOYW1lICAgPT4gJFNMQU5hbWVbMF0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBTTEEgaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNMQU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgIyB0aGlzIFNMQSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU0xBTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCiMgLS0tCgogICAgIyBzZXJ2aWNlIGlkcyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRHMgPT4gXGRvIHsnRHVtbXknfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkU0xBTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBzZXJ2aWNlIGlkcyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRHMgPT4gJycsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJFNMQU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgc2VydmljZSBpZHMgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzID0+IHt9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICRTTEFOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgU0xBIG11c3QgYmUgaW5zZXJ0ZWQgc3VjY2Vzc2Z1bGx5CiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU0xBTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzICAgICAgICAgID0+IFtdLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICRTTEFOYW1lWzBdLAogICAgICAgICAgICBDYWxlbmRhciAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDAsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VOb3RpZnkgPT4gMCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gMCwKICAgICAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiAwLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAxLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgICAgICAgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgU0xBIGhhdmUgdGhlIHNhbWUgbmFtZSBhcyBvbmUgdGVzdCBiZWZvcmUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU0xBTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgU0xBIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoU0xBIGlzIE5PVCBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBTTEEgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChTTEEgaXMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICA9PiAkU0xBTmFtZVswXSAuICdVUERBVEUxJywKICAgICAgICAgICAgVXNlcklEID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgU0xBIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoU0xBIGlzIE5PVCBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRTTEFOYW1lWzBdIC4gJ1VQREFURTEnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgU0xBIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoc2VydmljZSBpZHMgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyA9PiBcZG8geydEdW1teSd9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICRTTEFOYW1lWzBdIC4gJ1VQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBTTEEgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChzZXJ2aWNlIGlkcyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzID0+ICcnLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICRTTEFOYW1lWzBdIC4gJ1VQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBTTEEgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChzZXJ2aWNlIGlkcyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzID0+IHt9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICRTTEFOYW1lWzBdIC4gJ1VQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgU0xBIG11c3QgYmUgaW5zZXJ0ZWQgc3VjY2Vzc2Z1bGx5IChjaGVjayB0aGUgcmV0dXJuZWQgc2VydmljZSBpZCBhcnJheSkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzID0+IFsgJFNlcnZpY2VJRHNbMF0gXSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkU0xBTmFtZVsxXSwKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDIsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzICAgICAgICAgID0+IFsgJFNlcnZpY2VJRHNbMF0gXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAkU0xBTmFtZVsxXSwKICAgICAgICAgICAgQ2FsZW5kYXIgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgRmlyc3RSZXNwb25zZVRpbWUgICA9PiAwLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlTm90aWZ5ID0+IDAsCiAgICAgICAgICAgIFVwZGF0ZVRpbWUgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgVXBkYXRlTm90aWZ5ICAgICAgICA9PiAwLAogICAgICAgICAgICBTb2x1dGlvblRpbWUgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNvbHV0aW9uTm90aWZ5ICAgICAgPT4gMCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMiwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgU0xBIG11c3QgYmUgaW5zZXJ0ZWQgc3VjY2Vzc2Z1bGx5IChjaGVjayB0aGUgc29ydGluZyBvZiB0aGUgcmV0dXJuZWQgc2VydmljZSBpZCBhcnJheSkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzID0+IFsgJFNlcnZpY2VJRHNbMV0sICRTZXJ2aWNlSURzWzBdIF0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJFNMQU5hbWVbMl0sCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAyLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyAgICAgICAgICA9PiBbICRTZXJ2aWNlSURzWzBdLCAkU2VydmljZUlEc1sxXSBdLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICRTTEFOYW1lWzJdLAogICAgICAgICAgICBDYWxlbmRhciAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDAsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VOb3RpZnkgPT4gMCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gMCwKICAgICAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiAwLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAxLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAyLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNMQU5hbWVbMV0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBTTEEgbXVzdCBiZSBpbnNlcnRlZCBzdWNjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzICAgICAgICAgID0+IFsgJFNlcnZpY2VJRHNbMV0sICRTZXJ2aWNlSURzWzJdLCAkU2VydmljZUlEc1swXSBdLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICRTTEFOYW1lWzNdLAogICAgICAgICAgICBDYWxlbmRhciAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgRmlyc3RSZXNwb25zZVRpbWUgICA9PiAxMCwKICAgICAgICAgICAgRmlyc3RSZXNwb25zZU5vdGlmeSA9PiAyMCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgICA9PiAzMCwKICAgICAgICAgICAgVXBkYXRlTm90aWZ5ICAgICAgICA9PiA0MCwKICAgICAgICAgICAgU29sdXRpb25UaW1lICAgICAgICA9PiA1MCwKICAgICAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiA2MCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgICAgID0+ICdUZXN0Q29tbWVudDInLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzICAgICAgICAgID0+IFsgJFNlcnZpY2VJRHNbMF0sICRTZXJ2aWNlSURzWzFdLCAkU2VydmljZUlEc1syXSBdLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICRTTEFOYW1lWzNdLAogICAgICAgICAgICBDYWxlbmRhciAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgRmlyc3RSZXNwb25zZVRpbWUgICA9PiAxMCwKICAgICAgICAgICAgRmlyc3RSZXNwb25zZU5vdGlmeSA9PiAyMCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgICA9PiAzMCwKICAgICAgICAgICAgVXBkYXRlTm90aWZ5ICAgICAgICA9PiA0MCwKICAgICAgICAgICAgU29sdXRpb25UaW1lICAgICAgICA9PiA1MCwKICAgICAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiA2MCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgICAgID0+ICdUZXN0Q29tbWVudDInLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBTTEEgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChTTEEgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgU0xBIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoU0xBIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICA9PiAkU0xBTmFtZVszXSAuICdVUERBVEUxJywKICAgICAgICAgICAgVXNlcklEID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgU0xBIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoU0xBIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNMQU5hbWVbM10gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBTTEEgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKFNMQSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzICAgICAgICAgID0+IFtdLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICRTTEFOYW1lWzNdIC4gJ1VQREFURTInLAogICAgICAgICAgICBDYWxlbmRhciAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgRmlyc3RSZXNwb25zZVRpbWUgICA9PiAyMCwKICAgICAgICAgICAgRmlyc3RSZXNwb25zZU5vdGlmeSA9PiAzMCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgICA9PiA0MCwKICAgICAgICAgICAgVXBkYXRlTm90aWZ5ICAgICAgICA9PiA1MCwKICAgICAgICAgICAgU29sdXRpb25UaW1lICAgICAgICA9PiA2MCwKICAgICAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiA3MCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgICAgID0+ICdUZXN0Q29tbWVudDJVUERBVEUyJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAkVXNlcklEc1swXSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMiwKIyAtLS0KICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRHMgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJFNMQU5hbWVbM10gLiAnVVBEQVRFMicsCiAgICAgICAgICAgIENhbGVuZGFyICAgICAgICAgICAgPT4gJzEnLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDIwLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlTm90aWZ5ID0+IDMwLAogICAgICAgICAgICBVcGRhdGVUaW1lICAgICAgICAgID0+IDQwLAogICAgICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDUwLAogICAgICAgICAgICBTb2x1dGlvblRpbWUgICAgICAgID0+IDYwLAogICAgICAgICAgICBTb2x1dGlvbk5vdGlmeSAgICAgID0+IDcwLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJ1Rlc3RDb21tZW50MlVQREFURTInLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDIsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgU0xBIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIChTTEEgdXBkYXRlIGFyZ3VtZW50cyBhcmUgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyAgICAgICAgICA9PiBbICRTZXJ2aWNlSURzWzJdIF0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJFNMQU5hbWVbM10gLiAnVVBEQVRFMycsCiAgICAgICAgICAgIENhbGVuZGFyICAgICAgICAgICAgPT4gJzInLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDMwLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlTm90aWZ5ID0+IDQwLAogICAgICAgICAgICBVcGRhdGVUaW1lICAgICAgICAgID0+IDUwLAogICAgICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDYwLAogICAgICAgICAgICBTb2x1dGlvblRpbWUgICAgICAgID0+IDcwLAogICAgICAgICAgICBTb2x1dGlvbk5vdGlmeSAgICAgID0+IDgwLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJ1Rlc3RDb21tZW50MlVQREFURTMnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgID0+ICRVc2VySURzWzFdLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyAgICAgICAgICA9PiBbICRTZXJ2aWNlSURzWzJdIF0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJFNMQU5hbWVbM10gLiAnVVBEQVRFMycsCiAgICAgICAgICAgIENhbGVuZGFyICAgICAgICAgICAgPT4gJzInLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDMwLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlTm90aWZ5ID0+IDQwLAogICAgICAgICAgICBVcGRhdGVUaW1lICAgICAgICAgID0+IDUwLAogICAgICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDYwLAogICAgICAgICAgICBTb2x1dGlvblRpbWUgICAgICAgID0+IDcwLAogICAgICAgICAgICBTb2x1dGlvbk5vdGlmeSAgICAgID0+IDgwLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJ1Rlc3RDb21tZW50MlVQREFURTMnLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIFNMQSBtdXN0IGJlIGluc2VydGVkIHN1Y2Nlc3NmdWxseSAoY2hlY2sgc3RyaW5nIGNsZWFuZXIgZnVuY3Rpb24pCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyA9PiBbICRTZXJ2aWNlSURzWzBdIF0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gIiBcdCBcbiBcciAiIC4gJFNMQU5hbWVbNF0gLiAiIFx0IFxuIFxyICIsCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICA9PiAiIFx0IFxuIFxyIFRlc3QgQ29tbWVudCBcdCBcbiBcciAiLAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDIsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzICAgICAgICAgID0+IFsgJFNlcnZpY2VJRHNbMF0gXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAkU0xBTmFtZVs0XSwKICAgICAgICAgICAgQ2FsZW5kYXIgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgRmlyc3RSZXNwb25zZVRpbWUgICA9PiAwLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlTm90aWZ5ID0+IDAsCiAgICAgICAgICAgIFVwZGF0ZVRpbWUgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgVXBkYXRlTm90aWZ5ICAgICAgICA9PiAwLAogICAgICAgICAgICBTb2x1dGlvblRpbWUgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNvbHV0aW9uTm90aWZ5ICAgICAgPT4gMCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgICAgID0+ICdUZXN0IENvbW1lbnQnLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gMSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMiwKIyAtLS0KICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBTTEEgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IChjaGVjayBzdHJpbmcgY2xlYW5lciBmdW5jdGlvbikKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzID0+IFsgJFNlcnZpY2VJRHNbMV0gXSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAiIFx0IFxuIFxyICIgLiAkU0xBTmFtZVs0XSAuICIgVVBEQVRFMSBcdCBcbiBcciAiLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgICAgPT4gIiBcdCBcbiBcciBUZXN0IENvbW1lbnQgVVBEQVRFMSBcdCBcbiBcciAiLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRVc2VySURzWzFdLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgU2VydmljZUlEcyAgICAgICAgICA9PiBbICRTZXJ2aWNlSURzWzFdIF0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJFNMQU5hbWVbNF0gLiAnIFVQREFURTEnLAogICAgICAgICAgICBDYWxlbmRhciAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDAsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VOb3RpZnkgPT4gMCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gMCwKICAgICAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiAwLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJ1Rlc3QgQ29tbWVudCBVUERBVEUxJywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgID0+ICRVc2VySURzWzFdLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBTTEEgbXVzdCBiZSBpbnNlcnRlZCBzdWNjZXNzZnVsbHkgKFVuaWNvZGUgY2hlY2tzKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNMQU5hbWVbNV0gLiAnIM+SIM+hIMapIM+eICcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnINGgINGkIFRlc3RDb21tZW50NSDPoCDOqSAnLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDMsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzICAgICAgICAgID0+IFtdLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICRTTEFOYW1lWzVdIC4gJyDPkiDPoSDGqSDPnicsCiAgICAgICAgICAgIENhbGVuZGFyICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lICAgPT4gMCwKICAgICAgICAgICAgRmlyc3RSZXNwb25zZU5vdGlmeSA9PiAwLAogICAgICAgICAgICBVcGRhdGVUaW1lICAgICAgICAgID0+IDAsCiAgICAgICAgICAgIFVwZGF0ZU5vdGlmeSAgICAgICAgPT4gMCwKICAgICAgICAgICAgU29sdXRpb25UaW1lICAgICAgICA9PiAwLAogICAgICAgICAgICBTb2x1dGlvbk5vdGlmeSAgICAgID0+IDAsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICAgICA9PiAn0aAg0aQgVGVzdENvbW1lbnQ1IM+gIM6pJywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDMsCiMgLS0tCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgU0xBIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSAoVW5pY29kZSBjaGVja3MpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAkU0xBTmFtZVs1XSAuICcgz5Igz6Egxqkgz54gVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnINGgINGkIFRlc3RDb21tZW50NSDPoCDOqSBVUERBVEUxJywKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1swXSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMSwKIyAtLS0KICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRHMgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJFNMQU5hbWVbNV0gLiAnIM+SIM+hIMapIM+eIFVQREFURTEnLAogICAgICAgICAgICBDYWxlbmRhciAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDAsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VOb3RpZnkgPT4gMCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gMCwKICAgICAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiAwLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJ9GgINGkIFRlc3RDb21tZW50NSDPoCDOqSBVUERBVEUxJywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgID0+ICRVc2VySURzWzBdLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBTTEEgbXVzdCBiZSBpbnNlcnRlZCBzdWNjZXNzZnVsbHkgKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzID0+IFtdLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICcgW3Rlc3RdJSpcXCAnIC4gJFNMQU5hbWVbNl0gLiAnIFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICcgW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzICAgICAgICAgID0+IFtdLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdbdGVzdF0lKlxcICcgLiAkU0xBTmFtZVs2XSAuICcgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIENhbGVuZGFyICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lICAgPT4gMCwKICAgICAgICAgICAgRmlyc3RSZXNwb25zZU5vdGlmeSA9PiAwLAogICAgICAgICAgICBVcGRhdGVUaW1lICAgICAgICAgID0+IDAsCiAgICAgICAgICAgIFVwZGF0ZU5vdGlmeSAgICAgICAgPT4gMCwKICAgICAgICAgICAgU29sdXRpb25UaW1lICAgICAgICA9PiAwLAogICAgICAgICAgICBTb2x1dGlvbk5vdGlmeSAgICAgID0+IDAsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICAgICA9PiAnW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAxLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIFNMQSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBTZXJ2aWNlSURzID0+IFtdLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICcgW3Rlc3RdJSpcXCAnIC4gJFNMQU5hbWVbNl0gLiAnIFVQREFURTEgW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgICAgPT4gJyBbdGVzdF0lKlxcIFRlc3QgQ29tbWVudCBVUERBVEUxIFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklEc1sxXSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMiwKIyAtLS0KICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIFNlcnZpY2VJRHMgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ1t0ZXN0XSUqXFwgJyAuICRTTEFOYW1lWzZdIC4gJyBVUERBVEUxIFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBDYWxlbmRhciAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSAgID0+IDAsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VOb3RpZnkgPT4gMCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgICAgPT4gMCwKICAgICAgICAgICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiAwLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFVQREFURTEgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICA9PiAkVXNlcklEc1sxXSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gMiwKIyAtLS0KICAgICAgICB9LAogICAgfSwKXTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBydW4gZ2VuZXJhbCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkVGVzdENvdW50ID0gMTsKbXkgJExhc3RBZGRlZFNMQUlEOwpteSAkQWRkZWRDb3VudGVyID0gMDsKCmZvciBteSAkSXRlbSAoIEB7JEl0ZW1EYXRhfSApIHsKCiAgICBpZiAoICRJdGVtLT57QWRkfSApIHsKCiAgICAgICAgIyBhZGQgbmV3IFNMQQogICAgICAgIG15ICRTTEFJRCA9ICRTTEFPYmplY3QtPlNMQUFkZCggJXsgJEl0ZW0tPntBZGR9IH0gKTsKCiAgICAgICAgIyBjaGVjayBpZiBTTEEgd2FzIGFkZGVkIHN1Y2Nlc3NmdWxseSBvciBub3QKICAgICAgICBpZiAoICRJdGVtLT57QWRkR2V0fSApIHsKCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFNMQUlELAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogU0xBQWRkKCkgLSBTTEFJRDogJFNMQUlEIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkU0xBSUQpIHsKCiAgICAgICAgICAgICAgICAjIGxvb2t1cCBTTEEgbmFtZQogICAgICAgICAgICAgICAgbXkgJFNMQU5hbWUgPSAkU0xBT2JqZWN0LT5TTEFMb29rdXAoIFNMQUlEID0+ICRTTEFJRCApOwoKICAgICAgICAgICAgICAgICMgbG9va3VwIHRlc3QKICAgICAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICAgICAkU0xBTmFtZSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0FkZEdldH0tPntOYW1lfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTTEFMb29rdXAoKSAtIGxvb2t1cCIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmV2ZXJzZSBsb29rdXAgdGhlIFNMQSBpZAogICAgICAgICAgICAgICAgbXkgJFNMQUlETmV3ID0gJFNMQU9iamVjdC0+U0xBTG9va3VwKCBOYW1lID0+ICRTTEFOYW1lIHx8ICcnICk7CgogICAgICAgICAgICAgICAgIyByZXZlcnNlIGxvb2t1cCB0ZXN0CiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAgICAgJFNMQUlETmV3IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICRTTEFJRCAgICB8fCAnJywKICAgICAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTTEFMb29rdXAoKSAtIHJldmVyc2UgbG9va3VwIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZXQgbGFzdCBTTEEgaWQgdmFyaWFibGUKICAgICAgICAgICAgICAgICRMYXN0QWRkZWRTTEFJRCA9ICRTTEFJRDsKCiAgICAgICAgICAgICAgICAjIGluY3JlbWVudCB0aGUgYWRkZWQgY291bnRlcgogICAgICAgICAgICAgICAgJEFkZGVkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkU0xBSUQsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTTEFBZGQoKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBTTEEgZGF0YSB0byBjaGVjayB0aGUgdmFsdWVzIGFmdGVyIGNyZWF0aW9uIG9mIHRoZSBTTEEKICAgICAgICBteSAlU0xBR2V0ID0gJFNMQU9iamVjdC0+U0xBR2V0KAogICAgICAgICAgICBTTEFJRCAgPT4gJFNMQUlELAogICAgICAgICAgICBVc2VySUQgPT4gJEl0ZW0tPntBZGR9LT57VXNlcklEfSwKICAgICAgICAgICAgQ2FjaGUgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBTTEEgZGF0YSBhZnRlciBjcmVhdGlvbiBvZiB0aGUgU0xBCiAgICAgICAgZm9yIG15ICRTTEFBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJXsgJEl0ZW0tPntBZGRHZXR9IH0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIGF0dHJpYnV0ZXMKICAgICAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAgICAgJFNMQUdldHskU0xBQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICRJdGVtLT57QWRkR2V0fS0+eyRTTEFBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogU0xBR2V0KCkgLSAkU0xBQXR0cmlidXRlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkSXRlbS0+e1VwZGF0ZX0gKSB7CgogICAgICAgICMgY2hlY2sgbGFzdCBTTEEgaWQgdmFyaWFibGUKICAgICAgICBpZiAoICEkTGFzdEFkZGVkU0xBSUQgKSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBOTyBMQVNUIFNFUlZJQ0UgSUQgR0lWRU4iLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgdGhlIFNMQQogICAgICAgIG15ICRVcGRhdGVTdWNlc3MgPSAkU0xBT2JqZWN0LT5TTEFVcGRhdGUoCiAgICAgICAgICAgICV7ICRJdGVtLT57VXBkYXRlfSB9LAogICAgICAgICAgICBTTEFJRCA9PiAkTGFzdEFkZGVkU0xBSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBTTEEgd2FzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdAogICAgICAgIGlmICggJEl0ZW0tPntVcGRhdGVHZXR9ICkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTTEFVcGRhdGUoKSAtIFNMQUlEOiAkTGFzdEFkZGVkU0xBSUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJFVwZGF0ZVN1Y2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFNMQVVwZGF0ZSgpIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IFNMQSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgdGhlIHVwZGF0ZQogICAgICAgIG15ICVTTEFHZXQyID0gJFNMQU9iamVjdC0+U0xBR2V0KAogICAgICAgICAgICBTTEFJRCAgPT4gJExhc3RBZGRlZFNMQUlELAogICAgICAgICAgICBVc2VySUQgPT4gJEl0ZW0tPntVcGRhdGV9LT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIFNMQSBkYXRhIGFmdGVyIHVwZGF0ZQogICAgICAgIGZvciBteSAkU0xBQXR0cmlidXRlICggc29ydCBrZXlzICV7ICRJdGVtLT57VXBkYXRlR2V0fSB9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBhdHRyaWJ1dGVzCiAgICAgICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgICAgICRTTEFHZXQyeyRTTEFBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgJEl0ZW0tPntVcGRhdGVHZXR9LT57JFNMQUF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTTEFHZXQoKSAtICRTTEFBdHRyaWJ1dGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBsb29rdXAgU0xBIG5hbWUKICAgICAgICBteSAkU0xBTmFtZSA9ICRTTEFPYmplY3QtPlNMQUxvb2t1cCggU0xBSUQgPT4gJFNMQUdldDJ7U0xBSUR9ICk7CgogICAgICAgICMgbG9va3VwIHRlc3QKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTTEFOYW1lIHx8ICcnLAogICAgICAgICAgICAkU0xBR2V0MntOYW1lfSB8fCAnJywKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogU0xBTG9va3VwKCkgLSBsb29rdXAiLAogICAgICAgICk7CgogICAgICAgICMgcmV2ZXJzZSBsb29rdXAgdGhlIFNMQSBpZAogICAgICAgIG15ICRTTEFJRE5ldyA9ICRTTEFPYmplY3QtPlNMQUxvb2t1cCggTmFtZSA9PiAkU0xBTmFtZSB8fCAnJyApOwoKICAgICAgICAjIHJldmVyc2UgbG9va3VwIHRlc3QKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTTEFJRE5ldyB8fCAnJywKICAgICAgICAgICAgJFNMQUdldDJ7U0xBSUR9IHx8ICcnLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTTEFMb29rdXAoKSAtIHJldmVyc2UgbG9va3VwIiwKICAgICAgICApOwogICAgfQoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFNMQUxpc3QgdGVzdCAxIChjaGVjayBnZW5lcmFsIGZ1bmN0aW9uYWxpdHkpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICVTTEFMaXN0MSA9ICRTTEFPYmplY3QtPlNMQUxpc3QoCiAgICBWYWxpZCAgPT4gMCwKICAgIFVzZXJJRCA9PiAxLAopOwpteSAlU0xBTGlzdDFPcmcgPSAlU0xBTGlzdE9yaWdpbmFsOwoKU0VSVklDRUlEOgpmb3IgbXkgJFNMQUlEICggc29ydCBrZXlzICVTTEFMaXN0MU9yZyApIHsKCiAgICBpZiAoICRTTEFMaXN0MXskU0xBSUR9ICYmICRTTEFMaXN0MU9yZ3skU0xBSUR9IGVxICRTTEFMaXN0MXskU0xBSUR9ICkgewogICAgICAgIGRlbGV0ZSAkU0xBTGlzdDF7JFNMQUlEfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTTEFMaXN0MXtEdW1teX0gPSAxOwogICAgfQp9CgpteSAkU0xBTGlzdDFDb3VudCA9IHNjYWxhciBrZXlzICVTTEFMaXN0MTsKCiRTZWxmLT5JcygKICAgICRTTEFMaXN0MUNvdW50IHx8ICcnLAogICAgJEFkZGVkQ291bnRlciAgfHwgJycsCiAgICAiVGVzdCAkVGVzdENvdW50OiBTTEFMaXN0KCkiLAopOwoKIyBjbGVhbnVwIGlzIGRvbmUgYnkgUmVzdG9yZURhdGFiYXNlCgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSBjMDk1N2RhMmFjMzlmNTE5MTllZjZmMmE5ZGE2YzgyMzgyMjRhY2RiIC0gc2NyaXB0cy90ZXN0L1RpY2tldC50CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoSXNIYXNoUmVmV2l0aERhdGEpOwoKbXkgJFF1ZXVlT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7Cm15ICRTZXJ2aWNlT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyk7Cm15ICRTTEFPYmplY3QgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTTEEnKTsKbXkgJFN0YXRlT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyk7Cm15ICRUaWNrZXRPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKbXkgJEFydGljbGVPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwpteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckNoYW5uZWwoIENoYW5uZWxOYW1lID0+ICdJbnRlcm5hbCcgKTsKbXkgJERhdGVUaW1lT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7Cm15ICRUeXBlT2JqZWN0ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyk7Cm15ICRVc2VyT2JqZWN0ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgID0+IDEsCiAgICAgICAgVXNlVG1wQXJ0aWNsZURpciA9PiAxLAogICAgfSwKKTsKbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgojIHNldCBmaXhlZCB0aW1lCiRIZWxwZXItPkZpeGVkVGltZVNldCgpOwoKbXkgJFRpY2tldElEID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKAogICAgVGl0bGUgICAgICAgID0+ICdTb21lIFRpY2tldF9UaXRsZScsCiAgICBRdWV1ZSAgICAgICAgPT4gJ1JhdycsCiAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICBQcmlvcml0eSAgICAgPT4gJzMgbm9ybWFsJywKICAgIFN0YXRlICAgICAgICA9PiAnY2xvc2VkIHN1Y2Nlc3NmdWwnLAogICAgQ3VzdG9tZXJObyAgID0+ICcxMjM0NjUnLAogICAgQ3VzdG9tZXJVc2VyID0+ICd1bml0dGVzdEBvdHJzLmNvbScsCiAgICBPd25lcklEICAgICAgPT4gMSwKICAgIFVzZXJJRCAgICAgICA9PiAxLAopOwokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRJRCwKICAgICdUaWNrZXRDcmVhdGUoKScsCik7CgpteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgRXh0ZW5kZWQgPT4gMSwKKTsKJFNlbGYtPklzKAogICAgJFRpY2tldHtUaXRsZX0sCiAgICAnU29tZSBUaWNrZXRfVGl0bGUnLAogICAgJ1RpY2tldEdldCgpIChUaXRsZSknLAopOwokU2VsZi0+SXMoCiAgICAkVGlja2V0e1F1ZXVlfSwKICAgICdSYXcnLAogICAgJ1RpY2tldEdldCgpIChRdWV1ZSknLAopOwokU2VsZi0+SXMoCiAgICAkVGlja2V0e1ByaW9yaXR5fSwKICAgICczIG5vcm1hbCcsCiAgICAnVGlja2V0R2V0KCkgKFByaW9yaXR5KScsCik7CiRTZWxmLT5JcygKICAgICRUaWNrZXR7U3RhdGV9LAogICAgJ2Nsb3NlZCBzdWNjZXNzZnVsJywKICAgICdUaWNrZXRHZXQoKSAoU3RhdGUpJywKKTsKJFNlbGYtPklzKAogICAgJFRpY2tldHtPd25lcn0sCiAgICAncm9vdEBsb2NhbGhvc3QnLAogICAgJ1RpY2tldEdldCgpIChPd25lciknLAopOwokU2VsZi0+SXMoCiAgICAkVGlja2V0e0NyZWF0ZUJ5fSwKICAgIDEsCiAgICAnVGlja2V0R2V0KCkgKENyZWF0ZUJ5KScsCik7CiRTZWxmLT5JcygKICAgICRUaWNrZXR7Q2hhbmdlQnl9LAogICAgMSwKICAgICdUaWNrZXRHZXQoKSAoQ2hhbmdlQnkpJywKKTsKJFNlbGYtPklzKAogICAgJFRpY2tldHtUaXRsZX0sCiAgICAnU29tZSBUaWNrZXRfVGl0bGUnLAogICAgJ1RpY2tldEdldCgpIChUaXRsZSknLAopOwokU2VsZi0+SXMoCiAgICAkVGlja2V0e1Jlc3BvbnNpYmxlfSwKICAgICdyb290QGxvY2FsaG9zdCcsCiAgICAnVGlja2V0R2V0KCkgKFJlc3BvbnNpYmxlKScsCik7CiRTZWxmLT5JcygKICAgICRUaWNrZXR7TG9ja30sCiAgICAndW5sb2NrJywKICAgICdUaWNrZXRHZXQoKSAoTG9jayknLAopOwokU2VsZi0+SXMoCiAgICAkVGlja2V0e1NlcnZpY2VJRH0sCiAgICAnJywKICAgICdUaWNrZXRHZXQoKSAoU2VydmljZUlEKScsCik7CiRTZWxmLT5JcygKICAgICRUaWNrZXR7U0xBSUR9LAogICAgJycsCiAgICAnVGlja2V0R2V0KCkgKFNMQUlEKScsCik7CgpteSAkRGVmYXVsdFRpY2tldFR5cGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6VHlwZTo6RGVmYXVsdCcpOwokU2VsZi0+SXMoCiAgICAkVGlja2V0e1R5cGVJRH0sCiAgICAkVHlwZU9iamVjdC0+VHlwZUxvb2t1cCggVHlwZSA9PiAkRGVmYXVsdFRpY2tldFR5cGUgKSwKICAgICdUaWNrZXRHZXQoKSAoVHlwZUlEKScsCik7CiRTZWxmLT5JcygKICAgICRUaWNrZXR7Q2xvc2VkfSwKICAgICRUaWNrZXR7Q3JlYXRlZH0sCiAgICAnVGlja2V0IGNyZWF0ZWQgYXMgY2xvc2VkIGFzIENsb3NlIFRpbWUgPSBDcmVhdGlvbiBUaW1lJywKKTsKCm15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICBHcm91cHMgPT4gWyAndXNlcnMnLCBdLAopOwoKbXkgJFRlc3RVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiwKKTsKCm15ICRUaWNrZXRJRENyZWF0ZWRCeSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgIFRpdGxlICAgICAgICA9PiAnU29tZSBUaWNrZXRfVGl0bGUnLAogICAgUXVldWUgICAgICAgID0+ICdSYXcnLAogICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgUHJpb3JpdHkgICAgID0+ICczIG5vcm1hbCcsCiAgICBTdGF0ZSAgICAgICAgPT4gJ2Nsb3NlZCBzdWNjZXNzZnVsJywKICAgIEN1c3RvbWVyTm8gICA9PiAnMTIzNDY1JywKICAgIEN1c3RvbWVyVXNlciA9PiAndW5pdHRlc3RAb3Rycy5jb20nLAogICAgT3duZXJJRCAgICAgID0+IDEsCiAgICBVc2VySUQgICAgICAgPT4gJFRlc3RVc2VySUQsCik7CgpteSAlQ2hlY2tDcmVhdGVkQnkgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICBUaWNrZXRJRCA9PiAkVGlja2V0SURDcmVhdGVkQnksCiAgICBVc2VySUQgICA9PiAkVGVzdFVzZXJJRCwKKTsKCiRTZWxmLT5JcygKICAgICRDaGVja0NyZWF0ZWRCeXtDaGFuZ2VCeX0sCiAgICAkVGVzdFVzZXJJRCwKICAgICdUaWNrZXRHZXQoKSAoQ2hhbmdlQnkgLSBub3Qgc3lzdGVtIElEIDEgdXNlciknLAopOwoKJFNlbGYtPklzKAogICAgJENoZWNrQ3JlYXRlZEJ5e0NyZWF0ZUJ5fSwKICAgICRUZXN0VXNlcklELAogICAgJ1RpY2tldEdldCgpIChDcmVhdGVCeSAtIG5vdCBzeXN0ZW0gSUQgMSB1c2VyKScsCik7CgokVGlja2V0T2JqZWN0LT5UaWNrZXRPd25lclNldCgKICAgIFRpY2tldElEICA9PiAkVGlja2V0SURDcmVhdGVkQnksCiAgICBOZXdVc2VySUQgPT4gJFRlc3RVc2VySUQsCiAgICBVc2VySUQgICAgPT4gMSwKKTsKCiVDaGVja0NyZWF0ZWRCeSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgIFRpY2tldElEID0+ICRUaWNrZXRJRENyZWF0ZWRCeSwKICAgIFVzZXJJRCAgID0+ICRUZXN0VXNlcklELAopOwoKJFNlbGYtPklzKAogICAgJENoZWNrQ3JlYXRlZEJ5e0NyZWF0ZUJ5fSwKICAgICRUZXN0VXNlcklELAogICAgJ1RpY2tldEdldCgpIChDcmVhdGVCeSAtIHN0aWxsIHRoZSBzYW1lIGFmdGVyIE93bmVyU2V0KScsCik7CgokU2VsZi0+SXMoCiAgICAkQ2hlY2tDcmVhdGVkQnl7T3duZXJJRH0sCiAgICAkVGVzdFVzZXJJRCwKICAgICdUaWNrZXRPd25lclNldCgpJywKKTsKCiRTZWxmLT5JcygKICAgICRDaGVja0NyZWF0ZWRCeXtDaGFuZ2VCeX0sCiAgICAxLAogICAgJ1RpY2tldE93bmVyU2V0KCkgKENoYW5nZUJ5IC0gU3lzdGVtIElEIDEgbm93KScsCik7CgpteSAkQXJ0aWNsZUlEID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlQ3JlYXRlKAogICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJ2FnZW50JywKICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDAsCiAgICBGcm9tID0+CiAgICAgICAgJ1NvbWUgQWdlbnQgU29tZSBBZ2VudCBTb21lIEFnZW50IFNvbWUgQWdlbnQgU29tZSBBZ2VudCBTb21lIEFnZW50IFNvbWUgQWdlbnQgU29tZSBBZ2VudCBTb21lIEFnZW50IFNvbWUgQWdlbnQgU29tZSBBZ2VudCA8ZW1haWxAZXhhbXBsZS5jb20+JywKICAgIFRvID0+CiAgICAgICAgJ1NvbWUgQ3VzdG9tZXIgQSBTb21lIEN1c3RvbWVyIEEgU29tZSBDdXN0b21lciBBIFNvbWUgQ3VzdG9tZXIgQSBTb21lIEN1c3RvbWVyIEEgU29tZSBDdXN0b21lciBBICBTb21lIEN1c3RvbWVyIEFTb21lIEN1c3RvbWVyIEEgU29tZSBDdXN0b21lciBBIDxjdXN0b21lci1hQGV4YW1wbGUuY29tPicsCiAgICBDYyA9PgogICAgICAgICdTb21lIEN1c3RvbWVyIEIgU29tZSBDdXN0b21lciBCIFNvbWUgQ3VzdG9tZXIgQiBTb21lIEN1c3RvbWVyIEIgU29tZSBDdXN0b21lciBCIFNvbWUgQ3VzdG9tZXIgQiBTb21lIEN1c3RvbWVyIEIgU29tZSBDdXN0b21lciBCIFNvbWUgQ3VzdG9tZXIgQiA8Y3VzdG9tZXItYkBleGFtcGxlLmNvbT4nLAogICAgUmVwbHlUbyA9PgogICAgICAgICdTb21lIEN1c3RvbWVyIEIgU29tZSBDdXN0b21lciBCIFNvbWUgQ3VzdG9tZXIgQiBTb21lIEN1c3RvbWVyIEIgU29tZSBDdXN0b21lciBCIFNvbWUgQ3VzdG9tZXIgQiBTb21lIEN1c3RvbWVyIEIgU29tZSBDdXN0b21lciBCIFNvbWUgQ3VzdG9tZXIgQiA8Y3VzdG9tZXItYkBleGFtcGxlLmNvbT4nLAogICAgU3ViamVjdCA9PgogICAgICAgICdzb21lIHNob3J0IGRlc2NyaXB0aW9uIHNvbWUgc2hvcnQgZGVzY3JpcHRpb24gc29tZSBzaG9ydCBkZXNjcmlwdGlvbiBzb21lIHNob3J0IGRlc2NyaXB0aW9uIHNvbWUgc2hvcnQgZGVzY3JpcHRpb24gc29tZSBzaG9ydCBkZXNjcmlwdGlvbiBzb21lIHNob3J0IGRlc2NyaXB0aW9uIHNvbWUgc2hvcnQgZGVzY3JpcHRpb24gJywKICAgIEJvZHkgPT4gKAogICAgICAgICd0aGUgbWVzc2FnZSB0ZXh0ClBlcmwgbW9kdWxlcyBwcm92aWRlIGEgcmFuZ2Ugb2YgZmVhdHVyZXMgdG8gaGVscCB5b3UgYXZvaWQgcmVpbnZlbnRpbmcgdGhlIHdoZWVsLCBhbmQgY2FuIGJlIGRvd25sb2FkZWQgZnJvbSBDUEFOICggaHR0cDovL3d3dy5jcGFuLm9yZy8gKS4gQSBudW1iZXIgb2YgcG9wdWxhciBtb2R1bGVzIGFyZSBpbmNsdWRlZCB3aXRoIHRoZSBQZXJsIGRpc3RyaWJ1dGlvbiBpdHNlbGYuCgpDYXRlZ29yaWVzIG9mIG1vZHVsZXMgcmFuZ2UgZnJvbSB0ZXh0IG1hbmlwdWxhdGlvbiB0byBuZXR3b3JrIHByb3RvY29scyB0byBkYXRhYmFzZSBpbnRlZ3JhdGlvbiB0byBncmFwaGljcy4gQSBjYXRlZ29yaXplZCBsaXN0IG9mIG1vZHVsZXMgaXMgYWxzbyBhdmFpbGFibGUgZnJvbSBDUEFOLgoKVG8gbGVhcm4gaG93IHRvIGluc3RhbGwgbW9kdWxlcyB5b3UgZG93bmxvYWQgZnJvbSBDUEFOLCByZWFkIHBlcmxtb2RpbnN0YWxsCgpUbyBsZWFybiBob3cgdG8gdXNlIGEgcGFydGljdWxhciBtb2R1bGUsIHVzZSBwZXJsZG9jIE1vZHVsZTo6TmFtZSAuIFR5cGljYWxseSB5b3Ugd2lsbCB3YW50IHRvIHVzZSBNb2R1bGU6Ok5hbWUgLCB3aGljaCB3aWxsIHRoZW4gZ2l2ZSB5b3UgYWNjZXNzIHRvIGV4cG9ydGVkIGZ1bmN0aW9ucyBvciBhbiBPTyBpbnRlcmZhY2UgdG8gdGhlIG1vZHVsZS4KCnBlcmxmYXEgY29udGFpbnMgcXVlc3Rpb25zIGFuZCBhbnN3ZXJzIHJlbGF0ZWQgdG8gbWFueSBjb21tb24gdGFza3MsIGFuZCBvZnRlbiBwcm92aWRlcyBzdWdnZXN0aW9ucyBmb3IgZ29vZCBDUEFOIG1vZHVsZXMgdG8gdXNlLgoKcGVybG1vZCBkZXNjcmliZXMgUGVybCBtb2R1bGVzIGluIGdlbmVyYWwuIHBlcmxtb2RsaWIgbGlzdHMgdGhlIG1vZHVsZXMgd2hpY2ggY2FtZSB3aXRoIHlvdXIgUGVybCBpbnN0YWxsYXRpb24uCgpJZiB5b3UgZmVlbCB0aGUgdXJnZSB0byB3cml0ZSBQZXJsIG1vZHVsZXMsIHBlcmxuZXdtb2Qgd2lsbCBnaXZlIHlvdSBnb29kIGFkdmljZS4KJyB4IDIwMAogICAgKSwgICAgIyBjcmVhdGUgYSByZWFsbHkgYmlnIHN0cmluZyBieSBjb25jYXRlbmF0aW5nIDIwMCB0aW1lcwoKICAgIENvbnRlbnRUeXBlICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTE1JywKICAgIEhpc3RvcnlUeXBlICAgID0+ICdPd25lclVwZGF0ZScsCiAgICBIaXN0b3J5Q29tbWVudCA9PiAnU29tZSBmcmVlIHRleHQhJywKICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICBOb0FnZW50Tm90aWZ5ICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiB5b3UgZG9uJ3Qgd2FudCB0byBzZW5kIGFnZW50IG5vdGlmaWNhdGlvbnMKKTsKCiRTZWxmLT5UcnVlKAogICAgJEFydGljbGVJRCwKICAgICdBcnRpY2xlQ3JlYXRlKCknCik7CgokU2VsZi0+SXMoCiAgICBzY2FsYXIgJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKSwKICAgIDEsCiAgICAnQXJ0aWNsZUNvdW50JywKKTsKCm15ICVBcnRpY2xlID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlR2V0KAogICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAopOwokU2VsZi0+VHJ1ZSgKICAgICRBcnRpY2xle0Zyb219IGVxCiAgICAgICAgJ1NvbWUgQWdlbnQgU29tZSBBZ2VudCBTb21lIEFnZW50IFNvbWUgQWdlbnQgU29tZSBBZ2VudCBTb21lIEFnZW50IFNvbWUgQWdlbnQgU29tZSBBZ2VudCBTb21lIEFnZW50IFNvbWUgQWdlbnQgU29tZSBBZ2VudCA8ZW1haWxAZXhhbXBsZS5jb20+JywKICAgICdBcnRpY2xlR2V0KCknLAopOwoKZm9yIG15ICRLZXkgKHF3KCBCb2R5IFN1YmplY3QgRnJvbSBUbyBSZXBseVRvICkpIHsKICAgIG15ICRTdWNjZXNzID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlVXBkYXRlKAogICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgS2V5ICAgICAgID0+ICRLZXksCiAgICAgICAgVmFsdWUgICAgID0+ICJOZXcgJEtleSIsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgJ0FydGljbGVVcGRhdGUoKScKICAgICk7CgogICAgbXkgJUFydGljbGUyID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlR2V0KAogICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICApOwogICAgJFNlbGYtPklzKAogICAgICAgICRBcnRpY2xlMnskS2V5fSwKICAgICAgICAiTmV3ICRLZXkiLAogICAgICAgICdBcnRpY2xlVXBkYXRlKCknCiAgICApOwoKICAgICMgc2V0IG9sZCB2YWx1ZQogICAgJFN1Y2Nlc3MgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVVcGRhdGUoCiAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICBLZXkgICAgICAgPT4gJEtleSwKICAgICAgICBWYWx1ZSAgICAgPT4gJEFydGljbGV7JEtleX0sCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwp9CgokQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZVNlYXJjaEluZGV4QnVpbGQoCiAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICBVc2VySUQgICAgPT4gMSwKKTsKCm15ICRUaWNrZXRTZWFyY2hUaWNrZXROdW1iZXIgPSBzdWJzdHIgJFRpY2tldHtUaWNrZXROdW1iZXJ9LCAwLCAxMDsKbXkgJVRpY2tldElEcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgICA9PiAnSEFTSCcsCiAgICBMaW1pdCAgICAgICAgPT4gMTAwLAogICAgVGlja2V0TnVtYmVyID0+IFsgJFRpY2tldFNlYXJjaFRpY2tldE51bWJlciAuICclJywgJyVub3QgZXhpc2l0aW5nJScgXSwKICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgUGVybWlzc2lvbiAgID0+ICdydycsCik7CiRTZWxmLT5UcnVlKAogICAgJFRpY2tldElEc3skVGlja2V0SUR9LAogICAgJ1RpY2tldFNlYXJjaCgpIChIQVNIOlRpY2tldE51bWJlciBhcyBIQVNIUkVGKScsCik7CgolVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgUmVzdWx0ICAgICAgID0+ICdIQVNIJywKICAgIExpbWl0ICAgICAgICA9PiAxMDAsCiAgICBUaWNrZXROdW1iZXIgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgVXNlcklEICAgICAgID0+IDEsCiAgICBQZXJtaXNzaW9uICAgPT4gJ3J3JywKKTsKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0SURzeyRUaWNrZXRJRH0sCiAgICAnVGlja2V0U2VhcmNoKCkgKEhBU0g6VGlja2V0TnVtYmVyKScsCik7CgojIFRlc3QgVGlja2V0TnVtYmVyIHNlYXJjaCBjb25kaXRpb24gJzAnLCBleHBlY3Rpbmcgbm8gcmVzdWx0cywgc2VlIGJ1ZyMxMTQ2MS4KJVRpY2tldElEcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgICA9PiAnSEFTSCcsCiAgICBMaW1pdCAgICAgICAgPT4gMTAwLAogICAgVGlja2V0TnVtYmVyID0+IDAsCiAgICBVc2VySUQgICAgICAgPT4gMSwKICAgIFBlcm1pc3Npb24gICA9PiAncncnLAopOwokU2VsZi0+VHJ1ZSgKICAgICEkVGlja2V0SURzeyRUaWNrZXRJRH0sCiAgICAnVGlja2V0U2VhcmNoKCkgKEhBU0g6VGlja2V0TnVtYmVyIGVxIDApJywKKTsKCiVUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgIExpbWl0ICAgICAgPT4gMTAwLAogICAgVGlja2V0SUQgICA9PiAkVGlja2V0SUQsCiAgICBVc2VySUQgICAgID0+IDEsCiAgICBQZXJtaXNzaW9uID0+ICdydycsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRJRHN7JFRpY2tldElEfSwKICAgICdUaWNrZXRTZWFyY2goKSAoSEFTSDpUaWNrZXRJRCknLAopOwoKJVRpY2tldElEcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgTGltaXQgICAgICA9PiAxMDAsCiAgICBUaWNrZXRJRCAgID0+IFsgJFRpY2tldElELCA0MiBdLAogICAgVXNlcklEICAgICA9PiAxLAogICAgUGVybWlzc2lvbiA9PiAncncnLAopOwoKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0SURzeyRUaWNrZXRJRH0sCiAgICAnVGlja2V0U2VhcmNoKCkgKEhBU0g6VGlja2V0SUQgYXMgQVJSQVlSRUYpJywKKTsKCm15ICRDb3VudCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgICA9PiAnQ09VTlQnLAogICAgVGlja2V0TnVtYmVyID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgUGVybWlzc2lvbiAgID0+ICdydycsCik7CiRTZWxmLT5JcygKICAgICRDb3VudCwKICAgIDEsCiAgICAnVGlja2V0U2VhcmNoKCkgKENPVU5UOlRpY2tldE51bWJlciknLAopOwoKJVRpY2tldElEcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgICA9PiAnSEFTSCcsCiAgICBMaW1pdCAgICAgICAgPT4gMTAwLAogICAgVGlja2V0TnVtYmVyID0+IFsgJFRpY2tldHtUaWNrZXROdW1iZXJ9LCAnMTIzNCcgXSwKICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgUGVybWlzc2lvbiAgID0+ICdydycsCik7CiRTZWxmLT5UcnVlKAogICAgJFRpY2tldElEc3skVGlja2V0SUR9LAogICAgJ1RpY2tldFNlYXJjaCgpIChIQVNIOlRpY2tldE51bWJlcltBUlJBWV0pJywKKTsKCiVUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgIExpbWl0ICAgICAgPT4gMTAwLAogICAgVGl0bGUgICAgICA9PiAkVGlja2V0e1RpdGxlfSwKICAgIFVzZXJJRCAgICAgPT4gMSwKICAgIFBlcm1pc3Npb24gPT4gJ3J3JywKKTsKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0SURzeyRUaWNrZXRJRH0sCiAgICAnVGlja2V0U2VhcmNoKCkgKEhBU0g6VGl0bGUpJywKKTsKCiVUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgIExpbWl0ICAgICAgPT4gMTAwLAogICAgVGl0bGUgICAgICA9PiBbICRUaWNrZXR7VGl0bGV9LCAnU29tZVRpdGxlQUJDJyBdLAogICAgVXNlcklEICAgICA9PiAxLAogICAgUGVybWlzc2lvbiA9PiAncncnLAopOwokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRJRHN7JFRpY2tldElEfSwKICAgICdUaWNrZXRTZWFyY2goKSAoSEFTSDpUaXRsZVtBUlJBWV0pJywKKTsKCiVUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgIExpbWl0ICAgICAgPT4gMTAwLAogICAgQ3VzdG9tZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVySUR9LAogICAgVXNlcklEICAgICA9PiAxLAogICAgUGVybWlzc2lvbiA9PiAncncnLAopOwokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRJRHN7JFRpY2tldElEfSwKICAgICdUaWNrZXRTZWFyY2goKSAoSEFTSDpDdXN0b21lcklEKScsCik7CgolVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCiAgICBMaW1pdCAgICAgID0+IDEwMCwKICAgIEN1c3RvbWVySUQgPT4gWyAkVGlja2V0e0N1c3RvbWVySUR9LCAnTFVMVScgXSwKICAgIFVzZXJJRCAgICAgPT4gMSwKICAgIFBlcm1pc3Npb24gPT4gJ3J3JywKKTsKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0SURzeyRUaWNrZXRJRH0sCiAgICAnVGlja2V0U2VhcmNoKCkgKEhBU0g6Q3VzdG9tZXJJRFtBUlJBWV0pJywKKTsKCiVUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgIExpbWl0ICAgICAgPT4gMTAwLAogICAgQ3VzdG9tZXJJRCA9PiBbJ0xVTFUnXSwKICAgIFVzZXJJRCAgICAgPT4gMSwKICAgIFBlcm1pc3Npb24gPT4gJ3J3JywKKTsKJFNlbGYtPkZhbHNlKAogICAgc2NhbGFyICRUaWNrZXRJRHN7JFRpY2tldElEfSwKICAgICdUaWNrZXRTZWFyY2goKSAoSEFTSDpDdXN0b21lcklEW0FSUkFZXSknLAopOwoKJVRpY2tldElEcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgICAgICAgID0+ICdIQVNIJywKICAgIExpbWl0ICAgICAgICAgICAgID0+IDEwMCwKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VyfSwKICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICBQZXJtaXNzaW9uICAgICAgICA9PiAncncnLAopOwokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRJRHN7JFRpY2tldElEfSwKICAgICdUaWNrZXRTZWFyY2goKSAoSEFTSDpDdXN0b21lclVzZXIpJywKKTsKCiVUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgICAgICAgICA9PiAnSEFTSCcsCiAgICBMaW1pdCAgICAgICAgICAgICA9PiAxMDAsCiAgICBDdXN0b21lclVzZXJMb2dpbiA9PiBbICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LCAnMTIzNCcgXSwKICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICBQZXJtaXNzaW9uICAgICAgICA9PiAncncnLAopOwokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRJRHN7JFRpY2tldElEfSwKICAgICdUaWNrZXRTZWFyY2goKSAoSEFTSDpDdXN0b21lclVzZXJbQVJSQVldKScsCik7CgolVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0hBU0gnLAogICAgTGltaXQgICAgICAgICAgICAgPT4gMTAwLAogICAgVGlja2V0TnVtYmVyICAgICAgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgVGl0bGUgICAgICAgICAgICAgPT4gJFRpY2tldHtUaXRsZX0sCiAgICBDdXN0b21lcklEICAgICAgICA9PiAkVGlja2V0e0N1c3RvbWVySUR9LAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgUGVybWlzc2lvbiAgICAgICAgPT4gJ3J3JywKKTsKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0SURzeyRUaWNrZXRJRH0sCiAgICAnVGlja2V0U2VhcmNoKCkgKEhBU0g6VGlja2V0TnVtYmVyLFRpdGxlLEN1c3RvbWVySUQsQ3VzdG9tZXJVc2VySUQpJywKKTsKCiVUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgICAgICAgICA9PiAnSEFTSCcsCiAgICBMaW1pdCAgICAgICAgICAgICA9PiAxMDAsCiAgICBUaWNrZXROdW1iZXIgICAgICA9PiBbICRUaWNrZXR7VGlja2V0TnVtYmVyfSwgJ0FCQycgXSwKICAgIFRpdGxlICAgICAgICAgICAgID0+IFsgJFRpY2tldHtUaXRsZX0sICcxMjMnIF0sCiAgICBDdXN0b21lcklEICAgICAgICA9PiBbICRUaWNrZXR7Q3VzdG9tZXJJRH0sICcxMjEzNDIxJyBdLAogICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gWyAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwgJ2lhZGFzZCcgXSwKICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICBQZXJtaXNzaW9uICAgICAgICA9PiAncncnLAopOwokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRJRHN7JFRpY2tldElEfSwKICAgICdUaWNrZXRTZWFyY2goKSAoSEFTSDpUaWNrZXROdW1iZXIsVGl0bGUsQ3VzdG9tZXJJRCxDdXN0b21lclVzZXJbQVJSQVldKScsCik7CgolVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgUmVzdWx0ICAgICAgID0+ICdIQVNIJywKICAgIExpbWl0ICAgICAgICA9PiAxMDAsCiAgICBUaWNrZXROdW1iZXIgPT4gWyAkVGlja2V0e1RpY2tldE51bWJlcn0sICdBQkMnIF0sCiAgICBTdGF0ZVR5cGUgICAgPT4gJ0Nsb3NlZCcsCiAgICBVc2VySUQgICAgICAgPT4gMSwKICAgIFBlcm1pc3Npb24gICA9PiAncncnLAopOwokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRJRHN7JFRpY2tldElEfSwKICAgICdUaWNrZXRTZWFyY2goKSAoSEFTSDpUaWNrZXROdW1iZXIsU3RhdGVUeXBlOkNsb3NlZCknLAopOwoKJVRpY2tldElEcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgICA9PiAnSEFTSCcsCiAgICBMaW1pdCAgICAgICAgPT4gMTAwLAogICAgVGlja2V0TnVtYmVyID0+IFsgJFRpY2tldHtUaWNrZXROdW1iZXJ9LCAnQUJDJyBdLAogICAgU3RhdGVUeXBlICAgID0+ICdPcGVuJywKICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgUGVybWlzc2lvbiAgID0+ICdydycsCik7CiRTZWxmLT5GYWxzZSgKICAgICRUaWNrZXRJRHN7JFRpY2tldElEfSwKICAgICdUaWNrZXRTZWFyY2goKSAoSEFTSDpUaWNrZXROdW1iZXIsU3RhdGVUeXBlOk9wZW4pJywKKTsKCiVUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgICAgICAgICAgID0+ICdIQVNIJywKICAgIExpbWl0ICAgICAgICAgICAgICAgPT4gMTAwLAogICAgTUlNRUJhc2VfQm9keSAgICAgICA9PiAnd3JpdGUgcGVybCBtb2R1bGVzJywKICAgIENvbmRpdGlvbklubGluZSAgICAgPT4gMSwKICAgIENvbnRlbnRTZWFyY2hQcmVmaXggPT4gJyonLAogICAgQ29udGVudFNlYXJjaFN1ZmZpeCA9PiAnKicsCiAgICBTdGF0ZVR5cGUgICAgICAgICAgID0+ICdDbG9zZWQnLAogICAgVXNlcklEICAgICAgICAgICAgICA9PiAxLAogICAgUGVybWlzc2lvbiAgICAgICAgICA9PiAncncnLAopOwokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRJRHN7JFRpY2tldElEfSwKICAgICdUaWNrZXRTZWFyY2goKSAoSEFTSDpNSU1FQmFzZV9Cb2R5LFN0YXRlVHlwZTpDbG9zZWQpJywKKTsKCiVUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgICAgICAgICAgID0+ICdIQVNIJywKICAgIExpbWl0ICAgICAgICAgICAgICAgPT4gMTAwLAogICAgTUlNRUJhc2VfQm9keSAgICAgICA9PiAnd3JpdGUgcGVybCBtb2R1bGVzJywKICAgIENvbmRpdGlvbklubGluZSAgICAgPT4gMSwKICAgIENvbnRlbnRTZWFyY2hQcmVmaXggPT4gJyonLAogICAgQ29udGVudFNlYXJjaFN1ZmZpeCA9PiAnKicsCiAgICBTdGF0ZVR5cGUgICAgICAgICAgID0+ICdPcGVuJywKICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gMSwKICAgIFBlcm1pc3Npb24gICAgICAgICAgPT4gJ3J3JywKKTsKJFNlbGYtPlRydWUoCiAgICAhJFRpY2tldElEc3skVGlja2V0SUR9LAogICAgJ1RpY2tldFNlYXJjaCgpIChIQVNIOk1JTUVCYXNlXyxTdGF0ZVR5cGU6T3BlbiknLAopOwoKJFRpY2tldE9iamVjdC0+TW92ZVRpY2tldCgKICAgIFF1ZXVlICAgICAgICAgICAgICA9PiAnSnVuaycsCiAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgU2VuZE5vTm90aWZpY2F0aW9uID0+IDEsCiAgICBVc2VySUQgICAgICAgICAgICAgPT4gMSwKKTsKCiRUaWNrZXRPYmplY3QtPk1vdmVUaWNrZXQoCiAgICBRdWV1ZSAgICAgICAgICAgICAgPT4gJ1JhdycsCiAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgU2VuZE5vTm90aWZpY2F0aW9uID0+IDEsCiAgICBVc2VySUQgICAgICAgICAgICAgPT4gMSwKKTsKCm15ICVIRCA9ICRUaWNrZXRPYmplY3QtPkhpc3RvcnlUaWNrZXRHZXQoCiAgICBTdG9wWWVhciAgPT4gNDAwMCwKICAgIFN0b3BNb250aCA9PiAxLAogICAgU3RvcERheSAgID0+IDEsCiAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgRm9yY2UgICAgID0+IDEsCik7Cm15ICRRdWV1ZUxvb2t1cElEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJEhEe1F1ZXVlfSApOwokU2VsZi0+SXMoCiAgICAkUXVldWVMb29rdXBJRCwKICAgICRIRHtRdWV1ZUlEfSwKICAgICdIaXN0b3J5VGlja2V0R2V0KCkgQ2hlY2sgaGlzdG9yeSBxdWV1ZScsCik7CgpteSAkVGlja2V0TW92ZSA9ICRUaWNrZXRPYmplY3QtPk1vdmVUaWNrZXQoCiAgICBRdWV1ZSAgICAgICAgICAgICAgPT4gJ0p1bmsnLAogICAgVGlja2V0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgIFNlbmROb05vdGlmaWNhdGlvbiA9PiAxLAogICAgVXNlcklEICAgICAgICAgICAgID0+IDEsCik7CiRTZWxmLT5UcnVlKAogICAgJFRpY2tldE1vdmUsCiAgICAnTW92ZVRpY2tldCgpJywKKTsKCm15ICRUaWNrZXRTdGF0ZSA9ICRUaWNrZXRPYmplY3QtPlN0YXRlU2V0KAogICAgU3RhdGUgICAgPT4gJ29wZW4nLAogICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgVXNlcklEICAgPT4gMSwKKTsKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0U3RhdGUsCiAgICAnU3RhdGVTZXQoKScsCik7CgolVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgUmVzdWx0ICAgICAgID0+ICdIQVNIJywKICAgIExpbWl0ICAgICAgICA9PiAxMDAsCiAgICBUaWNrZXROdW1iZXIgPT4gWyAkVGlja2V0e1RpY2tldE51bWJlcn0sICdBQkMnIF0sCiAgICBTdGF0ZVR5cGUgICAgPT4gJ09wZW4nLAogICAgVXNlcklEICAgICAgID0+IDEsCiAgICBQZXJtaXNzaW9uICAgPT4gJ3J3JywKKTsKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0SURzeyRUaWNrZXRJRH0sCiAgICAnVGlja2V0U2VhcmNoKCkgKEhBU0g6VGlja2V0TnVtYmVyLFN0YXRlVHlwZTpPcGVuKScsCik7CgolVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgUmVzdWx0ICAgICAgID0+ICdIQVNIJywKICAgIExpbWl0ICAgICAgICA9PiAxMDAsCiAgICBUaWNrZXROdW1iZXIgPT4gWyAkVGlja2V0e1RpY2tldE51bWJlcn0sICdBQkMnIF0sCiAgICBTdGF0ZVR5cGUgICAgPT4gJ0Nsb3NlZCcsCiAgICBVc2VySUQgICAgICAgPT4gMSwKICAgIFBlcm1pc3Npb24gICA9PiAncncnLAopOwokU2VsZi0+RmFsc2UoCiAgICAkVGlja2V0SURzeyRUaWNrZXRJRH0sCiAgICAnVGlja2V0U2VhcmNoKCkgKEhBU0g6VGlja2V0TnVtYmVyLFN0YXRlVHlwZTpDbG9zZWQpJywKKTsKCmZvciBteSAkQ29uZGl0aW9uICgKICAgICcoU29tZSYmQWdlbnQpJywKICAgICdTb21lJiZBZ2VudCcsCiAgICAnKFNvbWUrQWdlbnQpJywKICAgICcgKFNvbWUrQWdlbnQpJywKICAgICcgKFNvbWUrQWdlbnQpICAnLAogICAgJ1NvbWUmJkFnZW50JywKICAgICdTb21lK0FnZW50JywKICAgICcgU29tZStBZ2VudCcsCiAgICAnU29tZStBZ2VudCAnLAogICAgJyBTb21lK0FnZW50ICcsCiAgICAnKCFTb21lV29yZFNob3VsZE5vdEZvdW5kfHwoU29tZStBZ2VudCkpJywKICAgICcoKFNvbWUrQWdlbnQpfHwoU29tZUFnZW50Tm90Rm91bmR8fEFnZW50Tm90Rm91bmQpKScsCiAgICAnIlNvbWUgQWdlbnQgU29tZSInLAogICAgJygiU29tZSBBZ2VudCBTb21lIiknLAogICAgJyEiU29tZSBTb21lIEFnZW50IicsCiAgICAnKCEiU29tZSBTb21lIEFnZW50IiknLAogICAgKQp7CiAgICAlVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAoKICAgICAgICAjIHJlc3VsdCAocmVxdWlyZWQpCiAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKCiAgICAgICAgIyByZXN1bHQgbGltaXQKICAgICAgICBMaW1pdCAgICAgICAgICAgICAgID0+IDEwMDAsCiAgICAgICAgTUlNRUJhc2VfRnJvbSAgICAgICA9PiAkQ29uZGl0aW9uLAogICAgICAgIENvbmRpdGlvbklubGluZSAgICAgPT4gMSwKICAgICAgICBDb250ZW50U2VhcmNoUHJlZml4ID0+ICcqJywKICAgICAgICBDb250ZW50U2VhcmNoU3VmZml4ID0+ICcqJywKICAgICAgICBVc2VySUQgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgUGVybWlzc2lvbiAgICAgICAgICA9PiAncncnLAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRUaWNrZXRJRHN7JFRpY2tldElEfSwKICAgICAgICAiVGlja2V0U2VhcmNoKCkgKEhBU0g6TUlNRUJhc2VfRnJvbSxDb25kaXRpb25JbmxpbmUsTUlNRUJhc2VfRnJvbT0nJENvbmRpdGlvbicpIiwKICAgICk7Cn0KCmZvciBteSAkQ29uZGl0aW9uICgKICAgICcoU29tZU5vdEZvdW5kV29yZCYmQWdlbnROb3RGb3VuZFdvcmQpJywKICAgICdTb21lTm90Rm91bmRXb3JkfHxBZ2VudE5vdEZvdW5kV29yZCcsCiAgICAnIFNvbWVOb3RGb3VuZFdvcmR8fEFnZW50Tm90Rm91bmRXb3JkJywKICAgICdTb21lTm90Rm91bmRXb3JkJiZBZ2VudE5vdEZvdW5kV29yZCcsCiAgICAnU29tZU5vdEZvdW5kV29yZCYmQWdlbnROb3RGb3VuZFdvcmQgICcsCiAgICAnKFNvbWVOb3RGb3VuZFdvcmQgQWdlbnROb3RGb3VuZFdvcmQpJywKICAgICdTb21lTm90Rm91bmRXb3JkJiZBZ2VudE5vdEZvdW5kV29yZCcsCiAgICAnKFNvbWVXb3JkU2hvdWxkTm90Rm91bmR8fCghU29tZSshQWdlbnQpKScsCiAgICAnKChTb21lTm90Rm91bmQmJkFnZW50KXx8KFNvbWVBZ2VudE5vdEZvdW5kfHxBZ2VudE5vdEZvdW5kKSknLAogICAgJyEiU29tZSBBZ2VudCBTb21lIicsCiAgICAnKCEiU29tZSBBZ2VudCBTb21lIiknLAogICAgJyJTb21lIFNvbWUgQWdlbnQiJywKICAgICcoIlNvbWUgU29tZSBBZ2VudCIpJywKICAgICkKewogICAgJVRpY2tldElEcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKCiAgICAgICAgIyByZXN1bHQgKHJlcXVpcmVkKQogICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCgogICAgICAgICMgcmVzdWx0IGxpbWl0CiAgICAgICAgTGltaXQgICAgICAgICAgICAgICA9PiAxMDAwLAogICAgICAgIE1JTUVCYXNlX0Zyb20gICAgICAgPT4gJENvbmRpdGlvbiwKICAgICAgICBDb25kaXRpb25JbmxpbmUgICAgID0+IDEsCiAgICAgICAgQ29udGVudFNlYXJjaFByZWZpeCA9PiAnKicsCiAgICAgICAgQ29udGVudFNlYXJjaFN1ZmZpeCA9PiAnKicsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAxLAogICAgICAgIFBlcm1pc3Npb24gICAgICAgICAgPT4gJ3J3JywKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgKCAhJFRpY2tldElEc3skVGlja2V0SUR9ICksCiAgICAgICAgIlRpY2tldFNlYXJjaCgpIChIQVNIOk1JTUVCYXNlX0Zyb20sQ29uZGl0aW9uSW5saW5lLE1JTUVCYXNlX0Zyb209JyRDb25kaXRpb24nKSIsCiAgICApOwp9CgpteSAkVGlja2V0UHJpb3JpdHkgPSAkVGlja2V0T2JqZWN0LT5Qcmlvcml0eVNldCgKICAgIFByaW9yaXR5ID0+ICcyIGxvdycsCiAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICBVc2VySUQgICA9PiAxLAopOwokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRQcmlvcml0eSwKICAgICdQcmlvcml0eVNldCgpJywKKTsKCiMgZ2V0IHRpY2tldCBkYXRhCm15ICVUaWNrZXREYXRhID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgVXNlcklEICAgPT4gMSwKKTsKCiMgc2F2ZSBjdXJyZW50IGNoYW5nZV90aW1lCm15ICRDaGFuZ2VUaW1lID0gJFRpY2tldERhdGF7Q2hhbmdlZH07CgojIHdhaXQgNSBzZWNvbmRzCiRIZWxwZXItPkZpeGVkVGltZUFkZFNlY29uZHMoNSk7CgpteSAkVGlja2V0VGl0bGUgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRUaXRsZVVwZGF0ZSgKICAgIFRpdGxlID0+ICdWZXJ5IGxvbmcgdGl0bGUgMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODknCiAgICAgICAgLiAnMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OScKICAgICAgICAuICcwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5JwogICAgICAgIC4gJzAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODknLAogICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgVXNlcklEICAgPT4gMSwKKTsKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0VGl0bGUsCiAgICAnVGlja2V0VGl0bGVVcGRhdGUoKScsCik7CgojIGdldCB1cGRhdGVkIHRpY2tldCBkYXRhCiVUaWNrZXREYXRhID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgVXNlcklEICAgPT4gMSwKKTsKCiMgY29tcGFyZSBjdXJyZW50IGNoYW5nZV90aW1lIHdpdGggb2xkIG9uZQokU2VsZi0+SXNOb3QoCiAgICAkQ2hhbmdlVGltZSwKICAgICRUaWNrZXREYXRhe0NoYW5nZWR9LAogICAgJ0NoYW5nZV90aW1lIHVwZGF0ZWQgaW4gVGlja2V0VGl0bGVVcGRhdGUoKScsCik7CgojIGNoZWNrIGlmIHdlIGhhdmUgYSBUaWNrZXQgVGl0bGUgVXBkYXRlIGhpc3RvcnkgcmVjb3JkCm15IEBIaXN0b3J5TGluZXMgPSAkVGlja2V0T2JqZWN0LT5IaXN0b3J5R2V0KAogICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgVXNlcklEICAgPT4gMSwKKTsKbXkgJEhpc3RvcnlJdGVtID0gcG9wIEBIaXN0b3J5TGluZXM7CiRTZWxmLT5JcygKICAgICRIaXN0b3J5SXRlbS0+e0hpc3RvcnlUeXBlfSwKICAgICdUaXRsZVVwZGF0ZScsCiAgICAiVGlja2V0VGl0bGVVcGRhdGUgLSBmb3VuZCBIaXN0b3J5SXRlbSIsCik7CgokU2VsZi0+SXMoCiAgICAkSGlzdG9yeUl0ZW0tPntOYW1lfSwKICAgICclJVNvbWUgVGlja2V0X1RpdGxlJSVWZXJ5IGxvbmcgdGl0bGUgMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMy4uLicsCiAgICAiVGlja2V0VGl0bGVVcGRhdGUgLSBGb3VuZCBuZXcgdGl0bGUiLAopOwoKIyBnZXQgdXBkYXRlZCB0aWNrZXQgZGF0YQolVGlja2V0RGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgIFVzZXJJRCAgID0+IDEsCik7CgojIHNhdmUgY3VycmVudCBjaGFuZ2VfdGltZQokQ2hhbmdlVGltZSA9ICRUaWNrZXREYXRhe0NoYW5nZWR9OwoKIyB3YWl0IDUgc2Vjb25kcwokSGVscGVyLT5GaXhlZFRpbWVBZGRTZWNvbmRzKDUpOwoKIyBzZXQgdW5sb2NrIHRpbWVvdXQKbXkgJFVubG9ja1RpbWVvdXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRVbmxvY2tUaW1lb3V0VXBkYXRlKAogICAgVW5sb2NrVGltZW91dCA9PiAkRGF0ZVRpbWVPYmplY3QtPlRvRXBvY2goKSArIDEwMDAwLAogICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICBVc2VySUQgICAgICAgID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRVbmxvY2tUaW1lb3V0LAogICAgJ1RpY2tldFVubG9ja1RpbWVvdXRVcGRhdGUoKScsCik7CgojIGdldCB1cGRhdGVkIHRpY2tldCBkYXRhCiVUaWNrZXREYXRhID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgVXNlcklEICAgPT4gMSwKKTsKCiMgY29tcGFyZSBjdXJyZW50IGNoYW5nZV90aW1lIHdpdGggb2xkIG9uZQokU2VsZi0+SXNOb3QoCiAgICAkQ2hhbmdlVGltZSwKICAgICRUaWNrZXREYXRhe0NoYW5nZWR9LAogICAgJ0NoYW5nZV90aW1lIHVwZGF0ZWQgaW4gVGlja2V0VW5sb2NrVGltZW91dFVwZGF0ZSgpJywKKTsKCiMgc2F2ZSBjdXJyZW50IGNoYW5nZV90aW1lCiRDaGFuZ2VUaW1lID0gJFRpY2tldERhdGF7Q2hhbmdlZH07CgojIHNhdmUgY3VycmVudCBxdWV1ZQpteSAkQ3VycmVudFF1ZXVlSUQgPSAkVGlja2V0RGF0YXtRdWV1ZUlEfTsKCiMgd2FpdCA1IHNlY29uZHMKJEhlbHBlci0+Rml4ZWRUaW1lQWRkU2Vjb25kcyg1KTsKCm15ICROZXdRdWV1ZSA9ICRDdXJyZW50UXVldWVJRCAhPSAxID8gMSA6IDI7CgojIHNldCBxdWV1ZQpteSAkVGlja2V0UXVldWVTZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRRdWV1ZVNldCgKICAgIFF1ZXVlSUQgID0+ICROZXdRdWV1ZSwKICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgIFVzZXJJRCAgID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRRdWV1ZVNldCwKICAgICdUaWNrZXRRdWV1ZVNldCgpJywKKTsKCiMgZ2V0IHVwZGF0ZWQgdGlja2V0IGRhdGEKJVRpY2tldERhdGEgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICBVc2VySUQgICA9PiAxLAopOwoKIyBjb21wYXJlIGN1cnJlbnQgY2hhbmdlX3RpbWUgd2l0aCBvbGQgb25lCiRTZWxmLT5Jc05vdCgKICAgICRDaGFuZ2VUaW1lLAogICAgJFRpY2tldERhdGF7Q2hhbmdlZH0sCiAgICAnQ2hhbmdlX3RpbWUgdXBkYXRlZCBpbiBUaWNrZXRRdWV1ZVNldCgpJywKKTsKCiMgcmVzdG9yZSBxdWV1ZQokVGlja2V0UXVldWVTZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRRdWV1ZVNldCgKICAgIFF1ZXVlSUQgID0+ICRDdXJyZW50UXVldWVJRCwKICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgIFVzZXJJRCAgID0+IDEsCik7CgojIHNhdmUgY3VycmVudCBjaGFuZ2VfdGltZQokQ2hhbmdlVGltZSA9ICRUaWNrZXREYXRhe0NoYW5nZWR9OwoKIyBzYXZlIGN1cnJlbnQgdHlwZQpteSAkQ3VycmVudFRpY2tldFR5cGUgPSAkVGlja2V0RGF0YXtUeXBlSUR9OwoKIyB3YWl0IDUgc2Vjb25kcwokSGVscGVyLT5GaXhlZFRpbWVBZGRTZWNvbmRzKDUpOwoKIyBjcmVhdGUgYSB0ZXN0IHR5cGUKbXkgJFR5cGVJRCA9ICRUeXBlT2JqZWN0LT5UeXBlQWRkKAogICAgTmFtZSAgICA9PiAnVHlwZScgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKIyBzZXQgdHlwZQpteSAkVGlja2V0VHlwZVNldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFR5cGVTZXQoCiAgICBUeXBlSUQgICA9PiAkVHlwZUlELAogICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgVXNlcklEICAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFRpY2tldFR5cGVTZXQsCiAgICAnVGlja2V0VHlwZVNldCgpJywKKTsKCiMgZ2V0IHVwZGF0ZWQgdGlja2V0IGRhdGEKJVRpY2tldERhdGEgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICBVc2VySUQgICA9PiAxLAopOwoKIyBjb21wYXJlIGN1cnJlbnQgY2hhbmdlX3RpbWUgd2l0aCBvbGQgb25lCiRTZWxmLT5Jc05vdCgKICAgICRDaGFuZ2VUaW1lLAogICAgJFRpY2tldERhdGF7Q2hhbmdlZH0sCiAgICAnQ2hhbmdlX3RpbWUgdXBkYXRlZCBpbiBUaWNrZXRUeXBlU2V0KCknLAopOwoKIyByZXN0b3JlIHR5cGUKJFRpY2tldFR5cGVTZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRUeXBlU2V0KAogICAgVHlwZUlEICAgPT4gJEN1cnJlbnRUaWNrZXRUeXBlLAogICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgVXNlcklEICAgPT4gMSwKKTsKCiMgc2V0IGFzIGludmFsaWQgdGhlIHRlc3QgdHlwZQokVHlwZU9iamVjdC0+VHlwZVVwZGF0ZSgKICAgIElEICAgICAgPT4gJFR5cGVJRCwKICAgIE5hbWUgICAgPT4gJ1R5cGUnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKSwKICAgIFZhbGlkSUQgPT4gMiwKICAgIFVzZXJJRCAgPT4gMSwKKTsKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQoKIyBnZXQgdGhlIGxpc3Qgb2Ygc2VydmljZSB0eXBlcyBmcm9tIGdlbmVyYWwgY2F0YWxvZwpteSAkU2VydmljZVR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAopOwoKIyBidWlsZCBhIGxvb2t1cCBoYXNoCm15ICVTZXJ2aWNlVHlwZU5hbWUySUQgPSByZXZlcnNlICV7ICRTZXJ2aWNlVHlwZUxpc3QgfTsKCiMgZ2V0IHRoZSBsaXN0IG9mIHNsYSB0eXBlcyBmcm9tIGdlbmVyYWwgY2F0YWxvZwpteSAkU0xBVHlwZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICBDbGFzcyA9PiAnSVRTTTo6U0xBOjpUeXBlJywKKTsKCiMgYnVpbGQgYSBsb29rdXAgaGFzaApteSAlU0xBVHlwZU5hbWUySUQgPSByZXZlcnNlICV7ICRTTEFUeXBlTGlzdCB9OwojIC0tLQoKIyBjcmVhdGUgYSB0ZXN0IHNlcnZpY2UKbXkgJFNlcnZpY2VJRCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlQWRkKAogICAgTmFtZSAgICA9PiAnU2VydmljZScgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpLAogICAgVmFsaWRJRCA9PiAxLAogICAgQ29tbWVudCA9PiAnVW5pdCBUZXN0IENvbW1lbnQnLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICBUeXBlSUQgICAgICA9PiAkU2VydmljZVR5cGVOYW1lMklEe1RyYWluaW5nfSwKICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICBVc2VySUQgID0+IDEsCik7CgojIHdhaXQgMSBzZWNvbmRzCiRIZWxwZXItPkZpeGVkVGltZUFkZFNlY29uZHMoMSk7CgojIHNldCB0eXBlCm15ICRUaWNrZXRTZXJ2aWNlU2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VydmljZVNldCgKICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUlELAogICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgIFVzZXJJRCAgICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0U2VydmljZVNldCwKICAgICdUaWNrZXRTZXJ2aWNlU2V0KCknLAopOwoKIyBnZXQgdXBkYXRlZCB0aWNrZXQgZGF0YQolVGlja2V0RGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgIFVzZXJJRCAgID0+IDEsCik7CgojIGNvbXBhcmUgY3VycmVudCBjaGFuZ2VfdGltZSB3aXRoIG9sZCBvbmUKJFNlbGYtPklzTm90KAogICAgJENoYW5nZVRpbWUsCiAgICAkVGlja2V0RGF0YXtDaGFuZ2VkfSwKICAgICdDaGFuZ2VfdGltZSB1cGRhdGVkIGluIFRpY2tldFNlcnZpY2VTZXQoKScsCik7CgojIHNldCBhcyBpbnZhbGlkIHRoZSB0ZXN0IHNlcnZpY2UKJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VVcGRhdGUoCiAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRCwKICAgIE5hbWUgICAgICA9PiAnU2VydmljZScgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpLAogICAgVmFsaWRJRCAgID0+IDIsCiAgICBVc2VySUQgICAgPT4gMSwKKTsKCiMgc2F2ZSBjdXJyZW50IGNoYW5nZV90aW1lCiRDaGFuZ2VUaW1lID0gJFRpY2tldERhdGF7Q2hhbmdlZH07CgojIHdhaXQgNSBzZWNvbmRzCiRIZWxwZXItPkZpeGVkVGltZUFkZFNlY29uZHMoNSk7CgpteSAkVGlja2V0RXNjYWxhdGlvbkluZGV4QnVpbGQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRFc2NhbGF0aW9uSW5kZXhCdWlsZCgKICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgIFVzZXJJRCAgID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRFc2NhbGF0aW9uSW5kZXhCdWlsZCwKICAgICdUaWNrZXRFc2NhbGF0aW9uSW5kZXhCdWlsZCgpJywKKTsKCiMgZ2V0IHVwZGF0ZWQgdGlja2V0IGRhdGEKJVRpY2tldERhdGEgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICBVc2VySUQgICA9PiAxLAopOwoKIyBjb21wYXJlIGN1cnJlbnQgY2hhbmdlX3RpbWUgd2l0aCBvbGQgb25lCiRTZWxmLT5Jc05vdCgKICAgICRDaGFuZ2VUaW1lLAogICAgJFRpY2tldERhdGF7Q2hhbmdlZH0sCiAgICAnQ2hhbmdlX3RpbWUgdXBkYXRlZCBpbiBUaWNrZXRFc2NhbGF0aW9uSW5kZXhCdWlsZCgpJywKKTsKCiMgc2F2ZSBjdXJyZW50IGNoYW5nZV90aW1lCiRDaGFuZ2VUaW1lID0gJFRpY2tldERhdGF7Q2hhbmdlZH07CgojIGNyZWF0ZSBhIHRlc3QgU0xBCm15ICRTTEFJRCA9ICRTTEFPYmplY3QtPlNMQUFkZCgKICAgIE5hbWUgICAgPT4gJ1NMQScgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpLAogICAgVmFsaWRJRCA9PiAxLAogICAgQ29tbWVudCA9PiAnVW5pdCBUZXN0IENvbW1lbnQnLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICBUeXBlSUQgPT4gJFNMQVR5cGVOYW1lMklEe090aGVyfSwKIyAtLS0KICAgIFVzZXJJRCAgPT4gMSwKKTsKCiMgd2FpdCA1IHNlY29uZHMKJEhlbHBlci0+Rml4ZWRUaW1lQWRkU2Vjb25kcyg1KTsKCiMgc2V0IFNMQQpteSAkVGlja2V0U0xBU2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U0xBU2V0KAogICAgU0xBSUQgICAgPT4gJFNMQUlELAogICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgVXNlcklEICAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFRpY2tldFNMQVNldCwKICAgICdUaWNrZXRTTEFTZXQoKScsCik7CgojIGdldCB1cGRhdGVkIHRpY2tldCBkYXRhCiVUaWNrZXREYXRhID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgVXNlcklEICAgPT4gMSwKKTsKCiMgY29tcGFyZSBjdXJyZW50IGNoYW5nZV90aW1lIHdpdGggb2xkIG9uZQokU2VsZi0+SXNOb3QoCiAgICAkQ2hhbmdlVGltZSwKICAgICRUaWNrZXREYXRhe0NoYW5nZWR9LAogICAgJ0NoYW5nZV90aW1lIHVwZGF0ZWQgaW4gVGlja2V0U0xBU2V0KCknLAopOwoKIyBzZXQgYXMgaW52YWxpZCB0aGUgdGVzdCBTTEEKJFNMQU9iamVjdC0+U0xBVXBkYXRlKAogICAgU0xBSUQgICA9PiAkU0xBSUQsCiAgICBOYW1lICAgID0+ICdTTEEnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKSwKICAgIFZhbGlkSUQgPT4gMSwKICAgIENvbW1lbnQgPT4gJ1VuaXQgVGVzdCBDb21tZW50JywKICAgIFVzZXJJRCAgPT4gMSwKKTsKCm15ICRUaWNrZXRMb2NrID0gJFRpY2tldE9iamVjdC0+TG9ja1NldCgKICAgIExvY2sgICAgICAgICAgICAgICA9PiAnbG9jaycsCiAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgU2VuZE5vTm90aWZpY2F0aW9uID0+IDEsCiAgICBVc2VySUQgICAgICAgICAgICAgPT4gMSwKKTsKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0TG9jaywKICAgICdMb2NrU2V0KCknLAopOwoKIyBUZXN0IENyZWF0ZWRVc2VySURzCiVUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgICAgICA9PiAnSEFTSCcsCiAgICBMaW1pdCAgICAgICAgICA9PiAxMDAsCiAgICBDcmVhdGVkVXNlcklEcyA9PiBbIDEsIDQ1NSwgMzIgXSwKICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICBQZXJtaXNzaW9uICAgICA9PiAncncnLAopOwokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRJRHN7JFRpY2tldElEfSwKICAgICdUaWNrZXRTZWFyY2goKSAoSEFTSDpDcmVhdGVkVXNlcklEc1tBcnJheV0pJywKKTsKCiMgVGVzdCBDcmVhdGVkUHJpb3JpdGllcwolVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0hBU0gnLAogICAgTGltaXQgICAgICAgICAgICAgPT4gMTAwLAogICAgQ3JlYXRlZFByaW9yaXRpZXMgPT4gWyAnMiBsb3cnLCAnMyBub3JtYWwnIF0sCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgUGVybWlzc2lvbiAgICAgICAgPT4gJ3J3JywKKTsKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0SURzeyRUaWNrZXRJRH0sCiAgICAnVGlja2V0U2VhcmNoKCkgKEhBU0g6Q3JlYXRlZFByaW9yaXRpZXNbQXJyYXldKScsCik7CgojIFRlc3QgQ3JlYXRlZFByaW9yaXR5SURzCiVUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgICAgICAgICAgPT4gJ0hBU0gnLAogICAgTGltaXQgICAgICAgICAgICAgID0+IDEwMCwKICAgIENyZWF0ZWRQcmlvcml0eUlEcyA9PiBbIDIsIDMgXSwKICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAogICAgUGVybWlzc2lvbiAgICAgICAgID0+ICdydycsCik7CiRTZWxmLT5UcnVlKAogICAgJFRpY2tldElEc3skVGlja2V0SUR9LAogICAgJ1RpY2tldFNlYXJjaCgpIChIQVNIOkNyZWF0ZWRQcmlvcml0eUlEc1tBcnJheV0pJywKKTsKCiMgVGVzdCBDcmVhdGVkU3RhdGVzCiVUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgICAgID0+ICdIQVNIJywKICAgIExpbWl0ICAgICAgICAgPT4gMTAwLAogICAgQ3JlYXRlZFN0YXRlcyA9PiBbJ2Nsb3NlZCBzdWNjZXNzZnVsJ10sCiAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICBQZXJtaXNzaW9uICAgID0+ICdydycsCik7CiRTZWxmLT5UcnVlKAogICAgJFRpY2tldElEc3skVGlja2V0SUR9LAogICAgJ1RpY2tldFNlYXJjaCgpIChIQVNIOkNyZWF0ZWRTdGF0ZXNbQXJyYXldKScsCik7CgojIFRlc3QgQ3JlYXRlZFN0YXRlSURzCiVUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgICAgICAgPT4gJ0hBU0gnLAogICAgTGltaXQgICAgICAgICAgID0+IDEwMCwKICAgIENyZWF0ZWRTdGF0ZUlEcyA9PiBbMl0sCiAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgIFBlcm1pc3Npb24gICAgICA9PiAncncnLAopOwokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRJRHN7JFRpY2tldElEfSwKICAgICdUaWNrZXRTZWFyY2goKSAoSEFTSDpDcmVhdGVkU3RhdGVJRHNbQXJyYXldKScsCik7CgojIFRlc3QgQ3JlYXRlZFF1ZXVlcwolVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgUmVzdWx0ICAgICAgICA9PiAnSEFTSCcsCiAgICBMaW1pdCAgICAgICAgID0+IDEwMCwKICAgIENyZWF0ZWRRdWV1ZXMgPT4gWydSYXcnXSwKICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgIFBlcm1pc3Npb24gICAgPT4gJ3J3JywKKTsKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0SURzeyRUaWNrZXRJRH0sCiAgICAnVGlja2V0U2VhcmNoKCkgKEhBU0g6Q3JlYXRlZFF1ZXVlc1tBcnJheV0pJywKKTsKCiMgVGVzdCBDcmVhdGVkUXVldWVJRHMKJVRpY2tldElEcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgICAgICA9PiAnSEFTSCcsCiAgICBMaW1pdCAgICAgICAgICAgPT4gMTAwLAogICAgQ3JlYXRlZFF1ZXVlSURzID0+IFsgMiwgMyBdLAogICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICBQZXJtaXNzaW9uICAgICAgPT4gJ3J3JywKKTsKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0SURzeyRUaWNrZXRJRH0sCiAgICAnVGlja2V0U2VhcmNoKCkgKEhBU0g6Q3JlYXRlZFF1ZXVlSURzW0FycmF5XSknLAopOwoKIyBUZXN0IFRpY2tldENyZWF0ZVRpbWVOZXdlck1pbnV0ZXMKJVRpY2tldElEcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0hBU0gnLAogICAgTGltaXQgICAgICAgICAgICAgICAgICAgICAgICA9PiAxMDAsCiAgICBUaWNrZXRDcmVhdGVUaW1lTmV3ZXJNaW51dGVzID0+IDYwLAogICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgUGVybWlzc2lvbiAgICAgICAgICAgICAgICAgICA9PiAncncnLAopOwokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRJRHN7JFRpY2tldElEfSwKICAgICdUaWNrZXRTZWFyY2goKSAoSEFTSDpUaWNrZXRDcmVhdGVUaW1lTmV3ZXJNaW51dGVzID0+IDYwKScsCik7CgojIFRlc3QgVGlja2V0TGFzdENoYW5nZVRpbWVOZXdlck1pbnV0ZXMKJVRpY2tldElEcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdIQVNIJywKICAgIExpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEwMCwKICAgIFRpY2tldExhc3RDaGFuZ2VUaW1lTmV3ZXJNaW51dGVzID0+IDYwLAogICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIFBlcm1pc3Npb24gICAgICAgICAgICAgICAgICAgICAgID0+ICdydycsCik7CiRTZWxmLT5UcnVlKAogICAgJFRpY2tldElEc3skVGlja2V0SUR9LAogICAgJ1RpY2tldFNlYXJjaCgpIChIQVNIOlRpY2tldExhc3RDaGFuZ2VUaW1lTmV3ZXJNaW51dGVzID0+IDYwKScsCik7CgojIFRlc3QgQXJ0aWNsZUNyZWF0ZVRpbWVOZXdlck1pbnV0ZXMKJVRpY2tldElEcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgID0+ICdIQVNIJywKICAgIExpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEwMCwKICAgIEFydGljbGVDcmVhdGVUaW1lTmV3ZXJNaW51dGVzID0+IDYwLAogICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIFBlcm1pc3Npb24gICAgICAgICAgICAgICAgICAgID0+ICdydycsCik7CiRTZWxmLT5UcnVlKAogICAgJFRpY2tldElEc3skVGlja2V0SUR9LAogICAgJ1RpY2tldFNlYXJjaCgpIChIQVNIOkFydGljbGVDcmVhdGVUaW1lTmV3ZXJNaW51dGVzID0+IDYwKScsCik7CgojIFRlc3QgVGlja2V0Q3JlYXRlT2xkZXJNaW51dGVzCiVUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgID0+ICdIQVNIJywKICAgIExpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgPT4gMTAwLAogICAgVGlja2V0Q3JlYXRlVGltZU9sZGVyTWludXRlcyA9PiA2MCwKICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIFBlcm1pc3Npb24gICAgICAgICAgICAgICAgICAgPT4gJ3J3JywKKTsKJFNlbGYtPkZhbHNlKAogICAgJFRpY2tldElEc3skVGlja2V0SUR9LAogICAgJ1RpY2tldFNlYXJjaCgpIChIQVNIOlRpY2tldENyZWF0ZVRpbWVPbGRlck1pbnV0ZXMgPT4gNjApJywKKTsKCiMgVGVzdCBUaWNrZXRMYXN0Q2hhbmdlT2xkZXJNaW51dGVzCiVUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnSEFTSCcsCiAgICBMaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxMDAsCiAgICBUaWNrZXRMYXN0Q2hhbmdlVGltZU9sZGVyTWludXRlcyA9PiA2MCwKICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICBQZXJtaXNzaW9uICAgICAgICAgICAgICAgICAgICAgICA9PiAncncnLAopOwokU2VsZi0+RmFsc2UoCiAgICAkVGlja2V0SURzeyRUaWNrZXRJRH0sCiAgICAnVGlja2V0U2VhcmNoKCkgKEhBU0g6VGlja2V0TGFzdENoYW5nZVRpbWVPbGRlck1pbnV0ZXMgPT4gNjApJywKKTsKCiMgVGVzdCBBcnRpY2xlQ3JlYXRlT2xkZXJNaW51dGVzCiVUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICA9PiAnSEFTSCcsCiAgICBMaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxMDAsCiAgICBBcnRpY2xlQ3JlYXRlVGltZU9sZGVyTWludXRlcyA9PiA2MCwKICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICBQZXJtaXNzaW9uICAgICAgICAgICAgICAgICAgICA9PiAncncnLAopOwokU2VsZi0+RmFsc2UoCiAgICAkVGlja2V0SURzeyRUaWNrZXRJRH0sCiAgICAnVGlja2V0U2VhcmNoKCkgKEhBU0g6QXJ0aWNsZUNyZWF0ZVRpbWVPbGRlck1pbnV0ZXMgPT4gNjApJywKKTsKCiMgVGVzdCBUaWNrZXRDcmVhdGVUaW1lTmV3ZXJEYXRlCm15ICRUaWNrZXRDcmVhdGVUaW1lTmV3ZXJEYXRlID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiRUaWNrZXRDcmVhdGVUaW1lTmV3ZXJEYXRlLT5TdWJ0cmFjdCggSG91cnMgPT4gMSApOwoKJVRpY2tldElEcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgICAgICAgICAgICAgICAgPT4gJ0hBU0gnLAogICAgTGltaXQgICAgICAgICAgICAgICAgICAgICA9PiAxMDAsCiAgICBUaWNrZXRDcmVhdGVUaW1lTmV3ZXJEYXRlID0+ICRUaWNrZXRDcmVhdGVUaW1lTmV3ZXJEYXRlLT5Ub1N0cmluZygpLAogICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgUGVybWlzc2lvbiAgICAgICAgICAgICAgICA9PiAncncnLAopOwokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRJRHN7JFRpY2tldElEfSwKICAgICdUaWNrZXRTZWFyY2goKSAoSEFTSDpUaWNrZXRDcmVhdGVUaW1lTmV3ZXJEYXRlID0+IDYwKScsCik7CgojIFRlc3QgVGlja2V0TGFzdENoYW5nZVRpbWVOZXdlckRhdGUKbXkgJFRpY2tldExhc3RDaGFuZ2VUaW1lTmV3ZXJEYXRlID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiRUaWNrZXRMYXN0Q2hhbmdlVGltZU5ld2VyRGF0ZS0+U3VidHJhY3QoIEhvdXJzID0+IDEgKTsKCiVUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICA9PiAnSEFTSCcsCiAgICBMaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxMDAsCiAgICBUaWNrZXRMYXN0Q2hhbmdlVGltZU5ld2VyRGF0ZSA9PiAkVGlja2V0TGFzdENoYW5nZVRpbWVOZXdlckRhdGUtPlRvU3RyaW5nKCksCiAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgUGVybWlzc2lvbiAgICAgICAgICAgICAgICAgICAgPT4gJ3J3JywKKTsKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0SURzeyRUaWNrZXRJRH0sCiAgICAnVGlja2V0U2VhcmNoKCkgKEhBU0g6VGlja2V0TGFzdENoYW5nZVRpbWVOZXdlckRhdGUgPT4gNjApJywKKTsKCiMgVGVzdCBBcnRpY2xlQ3JlYXRlVGltZU5ld2VyRGF0ZQpteSAkQXJ0aWNsZUNyZWF0ZVRpbWVOZXdlckRhdGUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKJEFydGljbGVDcmVhdGVUaW1lTmV3ZXJEYXRlLT5TdWJ0cmFjdCggSG91cnMgPT4gMSApOwoKJVRpY2tldElEcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgICAgICAgICAgICAgICAgID0+ICdIQVNIJywKICAgIExpbWl0ICAgICAgICAgICAgICAgICAgICAgID0+IDEwMCwKICAgIEFydGljbGVDcmVhdGVUaW1lTmV3ZXJEYXRlID0+ICRBcnRpY2xlQ3JlYXRlVGltZU5ld2VyRGF0ZS0+VG9TdHJpbmcoKSwKICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICBQZXJtaXNzaW9uICAgICAgICAgICAgICAgICA9PiAncncnLAopOwokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRJRHN7JFRpY2tldElEfSwKICAgICdUaWNrZXRTZWFyY2goKSAoSEFTSDpBcnRpY2xlQ3JlYXRlVGltZU5ld2VyRGF0ZSA9PiA2MCknLAopOwoKIyBUZXN0IFRpY2tldExhc3RDaGFuZ2VPbGRlckRhdGUKbXkgJFRpY2tldExhc3RDaGFuZ2VPbGRlckRhdGUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKJFRpY2tldExhc3RDaGFuZ2VPbGRlckRhdGUtPlN1YnRyYWN0KCBIb3VycyA9PiAxICk7CgolVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0hBU0gnLAogICAgTGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMTAwLAogICAgVGlja2V0TGFzdENoYW5nZVRpbWVPbGRlckRhdGUgPT4gJFRpY2tldExhc3RDaGFuZ2VPbGRlckRhdGUtPlRvU3RyaW5nKCksCiAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgUGVybWlzc2lvbiAgICAgICAgICAgICAgICAgICAgPT4gJ3J3JywKKTsKJFNlbGYtPkZhbHNlKAogICAgJFRpY2tldElEc3skVGlja2V0SUR9LAogICAgJ1RpY2tldFNlYXJjaCgpIChIQVNIOlRpY2tldExhc3RDaGFuZ2VUaW1lT2xkZXJEYXRlID0+IDYwKScsCik7CgojIFRlc3QgVGlja2V0Q3JlYXRlT2xkZXJEYXRlCm15ICRUaWNrZXRDcmVhdGVPbGRlckRhdGUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKJFRpY2tldENyZWF0ZU9sZGVyRGF0ZS0+U3VidHJhY3QoIEhvdXJzID0+IDEgKTsKCiVUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgICAgICAgICAgICAgICAgID0+ICdIQVNIJywKICAgIExpbWl0ICAgICAgICAgICAgICAgICAgICAgPT4gMTAwLAogICAgVGlja2V0Q3JlYXRlVGltZU9sZGVyRGF0ZSA9PiAkVGlja2V0Q3JlYXRlT2xkZXJEYXRlLT5Ub1N0cmluZygpLAogICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgUGVybWlzc2lvbiAgICAgICAgICAgICAgICA9PiAncncnLAopOwokU2VsZi0+RmFsc2UoCiAgICAkVGlja2V0SURzeyRUaWNrZXRJRH0sCiAgICAnVGlja2V0U2VhcmNoKCkgKEhBU0g6VGlja2V0Q3JlYXRlVGltZU9sZGVyRGF0ZSA9PiA2MCknLAopOwoKIyBUZXN0IEFydGljbGVDcmVhdGVPbGRlckRhdGUKbXkgJEFydGljbGVDcmVhdGVPbGRlckRhdGUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKJEFydGljbGVDcmVhdGVPbGRlckRhdGUtPlN1YnRyYWN0KCBIb3VycyA9PiAxICk7CgolVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgPT4gJ0hBU0gnLAogICAgTGltaXQgICAgICAgICAgICAgICAgICAgICAgPT4gMTAwLAogICAgQXJ0aWNsZUNyZWF0ZVRpbWVPbGRlckRhdGUgPT4gJEFydGljbGVDcmVhdGVPbGRlckRhdGUtPlRvU3RyaW5nKCksCiAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgUGVybWlzc2lvbiAgICAgICAgICAgICAgICAgPT4gJ3J3JywKKTsKJFNlbGYtPkZhbHNlKAogICAgJFRpY2tldElEc3skVGlja2V0SUR9LAogICAgJ1RpY2tldFNlYXJjaCgpIChIQVNIOkFydGljbGVDcmVhdGVUaW1lT2xkZXJEYXRlID0+IDYwKScsCik7CgojIFRlc3QgVGlja2V0Q2xvc2VUaW1lTmV3ZXJEYXRlCm15ICRUaWNrZXRDbG9zZVRpbWVOZXdlckRhdGUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKJFRpY2tldENsb3NlVGltZU5ld2VyRGF0ZS0+U3VidHJhY3QoIEhvdXJzID0+IDEgKTsKCiVUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgICAgICAgICAgICAgICAgPT4gJ0hBU0gnLAogICAgTGltaXQgICAgICAgICAgICAgICAgICAgID0+IDEwMCwKICAgIFRpY2tldENsb3NlVGltZU5ld2VyRGF0ZSA9PiAkVGlja2V0Q2xvc2VUaW1lTmV3ZXJEYXRlLT5Ub1N0cmluZygpLAogICAgVXNlcklEICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICBQZXJtaXNzaW9uICAgICAgICAgICAgICAgPT4gJ3J3JywKKTsKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0SURzeyRUaWNrZXRJRH0sCiAgICAnVGlja2V0U2VhcmNoKCkgKEhBU0g6VGlja2V0Q2xvc2VUaW1lTmV3ZXJEYXRlID0+IDYwKScsCik7CgojIFRlc3QgVGlja2V0Q2xvc2VPbGRlckRhdGUKbXkgJFRpY2tldENsb3NlT2xkZXJEYXRlID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiRUaWNrZXRDbG9zZU9sZGVyRGF0ZS0+U3VidHJhY3QoIEhvdXJzID0+IDEgKTsKCiVUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgICAgICAgICAgICAgICAgPT4gJ0hBU0gnLAogICAgTGltaXQgICAgICAgICAgICAgICAgICAgID0+IDEwMCwKICAgIFRpY2tldENsb3NlVGltZU9sZGVyRGF0ZSA9PiAkVGlja2V0Q2xvc2VPbGRlckRhdGUtPlRvU3RyaW5nKCksCiAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIFBlcm1pc3Npb24gICAgICAgICAgICAgICA9PiAncncnLAopOwokU2VsZi0+RmFsc2UoCiAgICAkVGlja2V0SURzeyRUaWNrZXRJRH0sCiAgICAnVGlja2V0U2VhcmNoKCkgKEhBU0g6VGlja2V0Q2xvc2VUaW1lT2xkZXJEYXRlID0+IDYwKScsCik7CgpteSAlVGlja2V0MiA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFRpY2tldElEICk7CiRTZWxmLT5JcygKICAgICRUaWNrZXQye1RpdGxlfSwKICAgICdWZXJ5IGxvbmcgdGl0bGUgMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODknCiAgICAgICAgLiAnMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OScKICAgICAgICAuICcwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5JwogICAgICAgIC4gJzAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODknLAogICAgJ1RpY2tldEdldCgpIChUaXRsZSknLAopOwokU2VsZi0+SXMoCiAgICAkVGlja2V0MntRdWV1ZX0sCiAgICAnSnVuaycsCiAgICAnVGlja2V0R2V0KCkgKFF1ZXVlKScsCik7CiRTZWxmLT5JcygKICAgICRUaWNrZXQye1ByaW9yaXR5fSwKICAgICcyIGxvdycsCiAgICAnVGlja2V0R2V0KCkgKFByaW9yaXR5KScsCik7CiRTZWxmLT5JcygKICAgICRUaWNrZXQye1N0YXRlfSwKICAgICdvcGVuJywKICAgICdUaWNrZXRHZXQoKSAoU3RhdGUpJywKKTsKJFNlbGYtPklzKAogICAgJFRpY2tldDJ7TG9ja30sCiAgICAnbG9jaycsCiAgICAnVGlja2V0R2V0KCkgKExvY2spJywKKTsKCm15IEBNb3ZlUXVldWVMaXN0ID0gJFRpY2tldE9iamVjdC0+TW92ZVF1ZXVlTGlzdCgKICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgIFR5cGUgICAgID0+ICdOYW1lJywKKTsKCiRTZWxmLT5JcygKICAgICRNb3ZlUXVldWVMaXN0WzBdLAogICAgJ1JhdycsCiAgICAnTW92ZVF1ZXVlTGlzdCgpIChSYXcpJywKKTsKJFNlbGYtPklzKAogICAgJE1vdmVRdWV1ZUxpc3RbLTFdLAogICAgJ0p1bmsnLAogICAgJ01vdmVRdWV1ZUxpc3QoKSAoSnVuayknLAopOwoKbXkgJFRpY2tldEFjY291bnRUaW1lID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNjb3VudFRpbWUoCiAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICBUaW1lVW5pdCAgPT4gJzQuNScsCiAgICBVc2VySUQgICAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFRpY2tldEFjY291bnRUaW1lLAogICAgJ1RpY2tldEFjY291bnRUaW1lKCkgMScsCik7CgpteSAkVGlja2V0QWNjb3VudFRpbWUyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNjb3VudFRpbWUoCiAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICBUaW1lVW5pdCAgPT4gJzQxMjMuNTMnLAogICAgVXNlcklEICAgID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRBY2NvdW50VGltZTIsCiAgICAnVGlja2V0QWNjb3VudFRpbWUoKSAyJywKKTsKCm15ICRUaWNrZXRBY2NvdW50VGltZTMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2NvdW50VGltZSgKICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgIFRpbWVVbml0ICA9PiAnNCw1MycsCiAgICBVc2VySUQgICAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFRpY2tldEFjY291bnRUaW1lMywKICAgICdUaWNrZXRBY2NvdW50VGltZSgpIDMnLAopOwoKbXkgJEFjY291bnRlZFRpbWUgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2NvdW50ZWRUaW1lR2V0KCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKTsKCiRTZWxmLT5JcygKICAgICRBY2NvdW50ZWRUaW1lLAogICAgNDEzMi41NiwKICAgICdUaWNrZXRBY2NvdW50ZWRUaW1lR2V0KCknLAopOwoKbXkgJEFjY291bnRlZFRpbWUyID0gJEFydGljbGVPYmplY3QtPkFydGljbGVBY2NvdW50ZWRUaW1lR2V0KAogICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCik7CgokU2VsZi0+SXMoCiAgICAkQWNjb3VudGVkVGltZTIsCiAgICA0MTMyLjU2LAogICAgJ0FydGljbGVBY2NvdW50ZWRUaW1lR2V0KCknCik7CgpteSAkSGlzdG9yeVRpY2tldFN0YXR1c0dldFN0YXJ0T2JqICAgID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7Cm15ICRIaXN0b3J5VGlja2V0U3RhdHVzR2V0U3RhcnRWYWx1ZXMgPSAkSGlzdG9yeVRpY2tldFN0YXR1c0dldFN0YXJ0T2JqLT5HZXQoKTsKCm15ICRIaXN0b3J5VGlja2V0U3RhdHVzR2V0U3RvcE9iaiA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwokSGlzdG9yeVRpY2tldFN0YXR1c0dldFN0b3BPYmotPlN1YnRyYWN0KCBEYXlzID0+IDEgKTsKbXkgJEhpc3RvcnlUaWNrZXRTdGF0dXNHZXRTdG9wVmFsdWVzID0gJEhpc3RvcnlUaWNrZXRTdGF0dXNHZXRTdG9wT2JqLT5HZXQoKTsKCm15ICVUaWNrZXRTdGF0dXMgPSAkVGlja2V0T2JqZWN0LT5IaXN0b3J5VGlja2V0U3RhdHVzR2V0KAogICAgU3RvcFllYXIgICA9PiAkSGlzdG9yeVRpY2tldFN0YXR1c0dldFN0YXJ0VmFsdWVzLT57WWVhcn0sCiAgICBTdG9wTW9udGggID0+ICRIaXN0b3J5VGlja2V0U3RhdHVzR2V0U3RhcnRWYWx1ZXMtPntNb250aH0sCiAgICBTdG9wRGF5ICAgID0+ICRIaXN0b3J5VGlja2V0U3RhdHVzR2V0U3RhcnRWYWx1ZXMtPntEYXl9LAogICAgU3RhcnRZZWFyICA9PiAkSGlzdG9yeVRpY2tldFN0YXR1c0dldFN0b3BWYWx1ZXMtPntZZWFyfSwKICAgIFN0YXJ0TW9udGggPT4gJEhpc3RvcnlUaWNrZXRTdGF0dXNHZXRTdG9wVmFsdWVzLT57TW9udGh9LAogICAgU3RhcnREYXkgICA9PiAkSGlzdG9yeVRpY2tldFN0YXR1c0dldFN0b3BWYWx1ZXMtPntEYXl9LAopOwoKaWYgKCAkVGlja2V0U3RhdHVzeyRUaWNrZXRJRH0gKSB7CiAgICBteSAlVGlja2V0SGlzdG9yeSA9ICV7ICRUaWNrZXRTdGF0dXN7JFRpY2tldElEfSB9OwogICAgJFNlbGYtPklzKAogICAgICAgICRUaWNrZXRIaXN0b3J5e1RpY2tldE51bWJlcn0sCiAgICAgICAgJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICJIaXN0b3J5VGlja2V0U3RhdHVzR2V0KCkgKFRpY2tldE51bWJlcikiLAogICAgKTsKICAgICRTZWxmLT5JcygKICAgICAgICAkVGlja2V0SGlzdG9yeXtUaWNrZXRJRH0sCiAgICAgICAgJFRpY2tldElELAogICAgICAgICJIaXN0b3J5VGlja2V0U3RhdHVzR2V0KCkgKFRpY2tldElEKSIsCiAgICApOwogICAgJFNlbGYtPklzKAogICAgICAgICRUaWNrZXRIaXN0b3J5e0NyZWF0ZVVzZXJJRH0sCiAgICAgICAgMSwKICAgICAgICAiSGlzdG9yeVRpY2tldFN0YXR1c0dldCgpIChDcmVhdGVVc2VySUQpIiwKICAgICk7CiAgICAkU2VsZi0+SXMoCiAgICAgICAgJFRpY2tldEhpc3Rvcnl7UXVldWV9LAogICAgICAgICdKdW5rJywKICAgICAgICAiSGlzdG9yeVRpY2tldFN0YXR1c0dldCgpIChRdWV1ZSkiLAogICAgKTsKICAgICRTZWxmLT5JcygKICAgICAgICAkVGlja2V0SGlzdG9yeXtDcmVhdGVRdWV1ZX0sCiAgICAgICAgJ1JhdycsCiAgICAgICAgIkhpc3RvcnlUaWNrZXRTdGF0dXNHZXQoKSAoQ3JlYXRlUXVldWUpIiwKICAgICk7CiAgICAkU2VsZi0+SXMoCiAgICAgICAgJFRpY2tldEhpc3Rvcnl7U3RhdGV9LAogICAgICAgICdvcGVuJywKICAgICAgICAiSGlzdG9yeVRpY2tldFN0YXR1c0dldCgpIChTdGF0ZSkiLAogICAgKTsKICAgICRTZWxmLT5JcygKICAgICAgICAkVGlja2V0SGlzdG9yeXtDcmVhdGVTdGF0ZX0sCiAgICAgICAgJ2Nsb3NlZCBzdWNjZXNzZnVsJywKICAgICAgICAiSGlzdG9yeVRpY2tldFN0YXR1c0dldCgpIChDcmVhdGVTdGF0ZSkiLAogICAgKTsKICAgICRTZWxmLT5JcygKICAgICAgICAkVGlja2V0SGlzdG9yeXtQcmlvcml0eX0sCiAgICAgICAgJzIgbG93JywKICAgICAgICAiSGlzdG9yeVRpY2tldFN0YXR1c0dldCgpIChQcmlvcml0eSkiLAogICAgKTsKICAgICRTZWxmLT5JcygKICAgICAgICAkVGlja2V0SGlzdG9yeXtDcmVhdGVQcmlvcml0eX0sCiAgICAgICAgJzMgbm9ybWFsJywKICAgICAgICAiSGlzdG9yeVRpY2tldFN0YXR1c0dldCgpIChDcmVhdGVQcmlvcml0eSkiLAogICAgKTsKCn0KZWxzZSB7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAwLAogICAgICAgICdIaXN0b3J5VGlja2V0U3RhdHVzR2V0KCknLAogICAgKTsKfQoKbXkgJERlbGV0ZSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgIFVzZXJJRCAgID0+IDEsCik7CiRTZWxmLT5UcnVlKAogICAgJERlbGV0ZSwKICAgICdUaWNrZXREZWxldGUoKScsCik7CgpteSAkRGVsZXRlQ2hlY2sgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICBVc2VySUQgICA9PiAxLAopOwoKJFNlbGYtPkZhbHNlKAogICAgJERlbGV0ZUNoZWNrLAogICAgJ1RpY2tldERlbGV0ZSgpIHdvcmtlZCcsCik7CgpteSAkQ3VzdG9tZXJObyA9ICdDdXN0b21lck5vJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgojIHRpY2tldCBzZWFyY2ggc29ydC9vcmRlciB0ZXN0Cm15ICRUaWNrZXRJRFNvcnRPcmRlcjEgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCiAgICBUaXRsZSAgICAgICAgPT4gJ1NvbWUgVGlja2V0X1RpdGxlIC0gdGlja2V0IHNvcnQvb3JkZXIgYnkgdGVzdHMnLAogICAgUXVldWUgICAgICAgID0+ICdSYXcnLAogICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgUHJpb3JpdHkgICAgID0+ICczIG5vcm1hbCcsCiAgICBTdGF0ZSAgICAgICAgPT4gJ25ldycsCiAgICBDdXN0b21lck5vICAgPT4gJEN1c3RvbWVyTm8sCiAgICBDdXN0b21lclVzZXIgPT4gJ3VuaXR0ZXN0QG90cnMuY29tJywKICAgIE93bmVySUQgICAgICA9PiAxLAogICAgVXNlcklEICAgICAgID0+IDEsCik7CgpteSAlVGlja2V0Q3JlYXRlZCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgIFRpY2tldElEID0+ICRUaWNrZXRJRFNvcnRPcmRlcjEsCiAgICBVc2VySUQgICA9PiAxLAopOwoKIyB3YWl0IDIgc2Vjb25kcwokSGVscGVyLT5GaXhlZFRpbWVBZGRTZWNvbmRzKDIpOwoKbXkgJFRpY2tldElEU29ydE9yZGVyMiA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgIFRpdGxlICAgICAgICA9PiAnU29tZSBUaWNrZXRfVGl0bGUgLSB0aWNrZXQgc29ydC9vcmRlciBieSB0ZXN0czInLAogICAgUXVldWUgICAgICAgID0+ICdSYXcnLAogICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgUHJpb3JpdHkgICAgID0+ICczIG5vcm1hbCcsCiAgICBTdGF0ZSAgICAgICAgPT4gJ25ldycsCiAgICBDdXN0b21lck5vICAgPT4gJEN1c3RvbWVyTm8sCiAgICBDdXN0b21lclVzZXIgPT4gJ3VuaXR0ZXN0QG90cnMuY29tJywKICAgIE93bmVySUQgICAgICA9PiAxLAogICAgVXNlcklEICAgICAgID0+IDEsCik7CgojIHdhaXQgMiBzZWNvbmRzCiRIZWxwZXItPkZpeGVkVGltZUFkZFNlY29uZHMoMik7CgpteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN0YXRlU2V0KAogICAgU3RhdGUgICAgPT4gJ29wZW4nLAogICAgVGlja2V0SUQgPT4gJFRpY2tldElEU29ydE9yZGVyMSwKICAgIFVzZXJJRCAgID0+IDEsCik7CgpteSAlVGlja2V0VXBkYXRlZCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgIFRpY2tldElEID0+ICRUaWNrZXRJRFNvcnRPcmRlcjEsCiAgICBVc2VySUQgICA9PiAxLAopOwoKJFNlbGYtPklzTm90KAogICAgJFRpY2tldENyZWF0ZWR7Q2hhbmdlZH0sCiAgICAkVGlja2V0VXBkYXRlZHtDaGFuZ2VkfSwKICAgICdUaWNrZXRVcGRhdGVkIGZvciBzb3J0IC0gY2hhbmdlIHRpbWUgd2FzIHVwZGF0ZWQnCiAgICAgICAgLiAiICRUaWNrZXRDcmVhdGVke0NoYW5nZWR9IG5lICRUaWNrZXRVcGRhdGVke0NoYW5nZWR9IiwKKTsKCiMgZmluZCBuZXdlc3QgdGlja2V0IGJ5IHByaW9yaXR5LCBhZ2UKbXkgQFRpY2tldElEc1NvcnRPcmRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgICA9PiAnQVJSQVknLAogICAgVGl0bGUgICAgICAgID0+ICclc29ydC9vcmRlciBieSB0ZXN0JScsCiAgICBRdWV1ZXMgICAgICAgPT4gWydSYXcnXSwKICAgIEN1c3RvbWVySUQgICA9PiAkQ3VzdG9tZXJObywKICAgIEN1c3RvbWVyVXNlciA9PiAndW5pdHRlc3RAb3Rycy5jb20nLAogICAgT3JkZXJCeSAgICAgID0+IFsgJ0Rvd24nLCAnVXAnIF0sCiAgICBTb3J0QnkgICAgICAgPT4gWyAnUHJpb3JpdHknLCAnQWdlJyBdLAogICAgVXNlcklEICAgICAgID0+IDEsCiAgICBMaW1pdCAgICAgICAgPT4gMSwKKTsKCiRTZWxmLT5JcygKICAgICRUaWNrZXRJRHNTb3J0T3JkZXJbMF0sCiAgICAkVGlja2V0SURTb3J0T3JkZXIxLAogICAgJ1RpY2tldFRpY2tldFNlYXJjaCgpIC0gdGlja2V0IHNvcnQvb3JkZXIgYnkgKFByaW9yaXR5IChEb3duKSwgQWdlIChVcCkpJywKKTsKCiMgZmluZCBvbGRlc3QgdGlja2V0IGJ5IHByaW9yaXR5LCBhZ2UKQFRpY2tldElEc1NvcnRPcmRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgICA9PiAnQVJSQVknLAogICAgVGl0bGUgICAgICAgID0+ICclc29ydC9vcmRlciBieSB0ZXN0JScsCiAgICBRdWV1ZXMgICAgICAgPT4gWydSYXcnXSwKICAgIEN1c3RvbWVySUQgICA9PiAkQ3VzdG9tZXJObywKICAgIEN1c3RvbWVyVXNlciA9PiAndW5pdHRlc3RAb3Rycy5jb20nLAogICAgT3JkZXJCeSAgICAgID0+IFsgJ0Rvd24nLCAnRG93bicgXSwKICAgIFNvcnRCeSAgICAgICA9PiBbICdQcmlvcml0eScsICdBZ2UnIF0sCiAgICBVc2VySUQgICAgICAgPT4gMSwKICAgIExpbWl0ICAgICAgICA9PiAxLAopOwokU2VsZi0+SXMoCiAgICAkVGlja2V0SURzU29ydE9yZGVyWzBdLAogICAgJFRpY2tldElEU29ydE9yZGVyMiwKICAgICdUaWNrZXRUaWNrZXRTZWFyY2goKSAtIHRpY2tldCBzb3J0L29yZGVyIGJ5IChQcmlvcml0eSAoRG93biksIEFnZSAoRG93bikpJywKKTsKCiMgZmluZCBsYXN0IG1vZGlmaWVkIHRpY2tldCBieSBjaGFuZ2VkIHRpbWUKQFRpY2tldElEc1NvcnRPcmRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgICA9PiAnQVJSQVknLAogICAgVGl0bGUgICAgICAgID0+ICclc29ydC9vcmRlciBieSB0ZXN0JScsCiAgICBRdWV1ZXMgICAgICAgPT4gWydSYXcnXSwKICAgIEN1c3RvbWVySUQgICA9PiAkQ3VzdG9tZXJObywKICAgIEN1c3RvbWVyVXNlciA9PiAndW5pdHRlc3RAb3Rycy5jb20nLAogICAgT3JkZXJCeSAgICAgID0+IFsgJ0Rvd24nLCBdLAogICAgU29ydEJ5ICAgICAgID0+IFsnQ2hhbmdlZCddLAogICAgVXNlcklEICAgICAgID0+IDEsCiAgICBMaW1pdCAgICAgICAgPT4gMSwKKTsKJFNlbGYtPklzKAogICAgJFRpY2tldElEc1NvcnRPcmRlclswXSwKICAgICRUaWNrZXRJRFNvcnRPcmRlcjEsCiAgICAnVGlja2V0VGlja2V0U2VhcmNoKCkgLSB0aWNrZXQgc29ydC9vcmRlciBieSAoQ2hhbmdlZCAoRG93bikpJwogICAgICAgIC4gIiRUaWNrZXRJRHNTb3J0T3JkZXJbMF0gaW5zdGVhZCBvZiAkVGlja2V0SURTb3J0T3JkZXIxIiwKKTsKCiMgZmluZCBvbGRlc3QgbW9kaWZpZWQgYnkgY2hhbmdlZCB0aW1lCkBUaWNrZXRJRHNTb3J0T3JkZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgICAgPT4gJ0FSUkFZJywKICAgIFRpdGxlICAgICAgICA9PiAnJXNvcnQvb3JkZXIgYnkgdGVzdCUnLAogICAgUXVldWVzICAgICAgID0+IFsnUmF3J10sCiAgICBDdXN0b21lcklEICAgPT4gJEN1c3RvbWVyTm8sCiAgICBDdXN0b21lclVzZXIgPT4gJ3VuaXR0ZXN0QG90cnMuY29tJywKICAgIE9yZGVyQnkgICAgICA9PiBbICdVcCcsIF0sCiAgICBTb3J0QnkgICAgICAgPT4gWyAnQ2hhbmdlZCcsIF0sCiAgICBVc2VySUQgICAgICAgPT4gMSwKICAgIExpbWl0ICAgICAgICA9PiAxLAopOwokU2VsZi0+SXMoCiAgICAkVGlja2V0SURzU29ydE9yZGVyWzBdLAogICAgJFRpY2tldElEU29ydE9yZGVyMiwKICAgICdUaWNrZXRUaWNrZXRTZWFyY2goKSAtIHRpY2tldCBzb3J0L29yZGVyIGJ5IChDaGFuZ2VkIChVcCkpKScKICAgICAgICAuICIkVGlja2V0SURzU29ydE9yZGVyWzBdICBpbnN0ZWFkIG9mICRUaWNrZXRJRFNvcnRPcmRlcjIiLAopOwoKbXkgJFRpY2tldElEU29ydE9yZGVyMyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgIFRpdGxlICAgICAgICA9PiAnU29tZSBUaWNrZXRfVGl0bGUgLSB0aWNrZXQgc29ydC9vcmRlciBieSB0ZXN0czInLAogICAgUXVldWUgICAgICAgID0+ICdSYXcnLAogICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgUHJpb3JpdHkgICAgID0+ICc0IGhpZ2gnLAogICAgU3RhdGUgICAgICAgID0+ICduZXcnLAogICAgQ3VzdG9tZXJObyAgID0+ICRDdXN0b21lck5vLAogICAgQ3VzdG9tZXJVc2VyID0+ICd1bml0dGVzdEBvdHJzLmNvbScsCiAgICBPd25lcklEICAgICAgPT4gMSwKICAgIFVzZXJJRCAgICAgICA9PiAxLAopOwoKIyB3YWl0IDIgc2Vjb25kcwokSGVscGVyLT5GaXhlZFRpbWVBZGRTZWNvbmRzKDIpOwoKbXkgJFRpY2tldElEU29ydE9yZGVyNCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgIFRpdGxlICAgICAgICA9PiAnU29tZSBUaWNrZXRfVGl0bGUgLSB0aWNrZXQgc29ydC9vcmRlciBieSB0ZXN0czInLAogICAgUXVldWUgICAgICAgID0+ICdSYXcnLAogICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgUHJpb3JpdHkgICAgID0+ICc0IGhpZ2gnLAogICAgU3RhdGUgICAgICAgID0+ICduZXcnLAogICAgQ3VzdG9tZXJObyAgID0+ICRDdXN0b21lck5vLAogICAgQ3VzdG9tZXJVc2VyID0+ICd1bml0dGVzdEBvdHJzLmNvbScsCiAgICBPd25lcklEICAgICAgPT4gMSwKICAgIFVzZXJJRCAgICAgICA9PiAxLAopOwoKIyB3YWl0IDIgc2Vjb25kcwokSGVscGVyLT5GaXhlZFRpbWVBZGRTZWNvbmRzKDIpOwoKbXkgJFRpY2tldElEU29ydE9yZGVyNSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgIFRpdGxlICAgICAgICA9PiAnU29tZSBUaWNrZXRfVGl0bGUgLSB0aWNrZXQgc29ydC9vcmRlciBieSB0ZXN0czUgKHdpdGggb3RoZXIgcXVldWUpJywKICAgIFF1ZXVlICAgICAgICA9PiAnTWlzYycsCiAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICBQcmlvcml0eSAgICAgPT4gJzMgbm9ybWFsJywKICAgIFN0YXRlICAgICAgICA9PiAnbmV3JywKICAgIEN1c3RvbWVyTm8gICA9PiAkQ3VzdG9tZXJObywKICAgIEN1c3RvbWVyVXNlciA9PiAndW5pdHRlc3RAb3Rycy5jb20nLAogICAgT3duZXJJRCAgICAgID0+IDEsCiAgICBVc2VySUQgICAgICAgPT4gMSwKKTsKCiMgZmluZCBvbGRlc3QgdGlja2V0IGJ5IHByaW9yaXR5LCBhZ2UKQFRpY2tldElEc1NvcnRPcmRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgICA9PiAnQVJSQVknLAogICAgVGl0bGUgICAgICAgID0+ICclc29ydC9vcmRlciBieSB0ZXN0JScsCiAgICBRdWV1ZXMgICAgICAgPT4gWydSYXcnXSwKICAgIEN1c3RvbWVySUQgICA9PiAkQ3VzdG9tZXJObywKICAgIEN1c3RvbWVyVXNlciA9PiAndW5pdHRlc3RAb3Rycy5jb20nLAogICAgT3JkZXJCeSAgICAgID0+IFsgJ0Rvd24nLCAnRG93bicgXSwKICAgIFNvcnRCeSAgICAgICA9PiBbICdQcmlvcml0eScsICdBZ2UnIF0sCiAgICBVc2VySUQgICAgICAgPT4gMSwKICAgIExpbWl0ICAgICAgICA9PiAxLAopOwokU2VsZi0+SXMoCiAgICAkVGlja2V0SURzU29ydE9yZGVyWzBdLAogICAgJFRpY2tldElEU29ydE9yZGVyNCwKICAgICdUaWNrZXRUaWNrZXRTZWFyY2goKSAtIHRpY2tldCBzb3J0L29yZGVyIGJ5IChQcmlvcml0eSAoRG93biksIEFnZSAoRG93bikpJywKKTsKCiMgZmluZCBvbGRlc3QgdGlja2V0IGJ5IHByaW9yaXR5LCBhZ2UKQFRpY2tldElEc1NvcnRPcmRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgICA9PiAnQVJSQVknLAogICAgVGl0bGUgICAgICAgID0+ICclc29ydC9vcmRlciBieSB0ZXN0JScsCiAgICBRdWV1ZXMgICAgICAgPT4gWydSYXcnXSwKICAgIEN1c3RvbWVySUQgICA9PiAkQ3VzdG9tZXJObywKICAgIEN1c3RvbWVyVXNlciA9PiAndW5pdHRlc3RAb3Rycy5jb20nLAogICAgT3JkZXJCeSAgICAgID0+IFsgJ1VwJywgJ0Rvd24nIF0sCiAgICBTb3J0QnkgICAgICAgPT4gWyAnUHJpb3JpdHknLCAnQWdlJyBdLAogICAgVXNlcklEICAgICAgID0+IDEsCiAgICBMaW1pdCAgICAgICAgPT4gMSwKKTsKJFNlbGYtPklzKAogICAgJFRpY2tldElEc1NvcnRPcmRlclswXSwKICAgICRUaWNrZXRJRFNvcnRPcmRlcjIsCiAgICAnVGlja2V0VGlja2V0U2VhcmNoKCkgLSB0aWNrZXQgc29ydC9vcmRlciBieSAoUHJpb3JpdHkgKFVwKSwgQWdlIChEb3duKSknLAopOwoKIyBmaW5kIG5ld2VzdCB0aWNrZXQKQFRpY2tldElEc1NvcnRPcmRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgICA9PiAnQVJSQVknLAogICAgVGl0bGUgICAgICAgID0+ICclc29ydC9vcmRlciBieSB0ZXN0JScsCiAgICBRdWV1ZXMgICAgICAgPT4gWydSYXcnXSwKICAgIEN1c3RvbWVySUQgICA9PiAkQ3VzdG9tZXJObywKICAgIEN1c3RvbWVyVXNlciA9PiAndW5pdHRlc3RAb3Rycy5jb20nLAogICAgT3JkZXJCeSAgICAgID0+ICdEb3duJywKICAgIFNvcnRCeSAgICAgICA9PiAnQWdlJywKICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgTGltaXQgICAgICAgID0+IDEsCik7CiRTZWxmLT5JcygKICAgICRUaWNrZXRJRHNTb3J0T3JkZXJbMF0sCiAgICAkVGlja2V0SURTb3J0T3JkZXI0LAogICAgJ1RpY2tldFRpY2tldFNlYXJjaCgpIC0gdGlja2V0IHNvcnQvb3JkZXIgYnkgKEFnZSAoRG93bikpJywKKTsKCiMgZmluZCBvbGRlc3QgdGlja2V0CkBUaWNrZXRJRHNTb3J0T3JkZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgICAgPT4gJ0FSUkFZJywKICAgIFRpdGxlICAgICAgICA9PiAnJXNvcnQvb3JkZXIgYnkgdGVzdCUnLAogICAgUXVldWVzICAgICAgID0+IFsnUmF3J10sCiAgICBDdXN0b21lcklEICAgPT4gJEN1c3RvbWVyTm8sCiAgICBDdXN0b21lclVzZXIgPT4gJ3VuaXR0ZXN0QG90cnMuY29tJywKICAgIE9yZGVyQnkgICAgICA9PiAnVXAnLAogICAgU29ydEJ5ICAgICAgID0+ICdBZ2UnLAogICAgVXNlcklEICAgICAgID0+IDEsCiAgICBMaW1pdCAgICAgICAgPT4gMSwKKTsKJFNlbGYtPklzKAogICAgJFRpY2tldElEc1NvcnRPcmRlclswXSwKICAgICRUaWNrZXRJRFNvcnRPcmRlcjEsCiAgICAnVGlja2V0VGlja2V0U2VhcmNoKCkgLSB0aWNrZXQgc29ydC9vcmRlciBieSAoQWdlIChVcCkpJywKKTsKCiMgc29ydCBieSB0aWNrZXQgcXVldWUKQFRpY2tldElEc1NvcnRPcmRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgICA9PiAnQVJSQVknLAogICAgVGl0bGUgICAgICAgID0+ICclc29ydC9vcmRlciBieSB0ZXN0JScsCiAgICBRdWV1ZXMgICAgICAgPT4gWyAnTWlzYycsICdSYXcnIF0sCiAgICBDdXN0b21lcklEICAgPT4gJEN1c3RvbWVyTm8sCiAgICBDdXN0b21lclVzZXIgPT4gJ3VuaXR0ZXN0QG90cnMuY29tJywKICAgIE9yZGVyQnkgICAgICA9PiAnVXAnLAogICAgU29ydEJ5ICAgICAgID0+ICdRdWV1ZScsCiAgICBVc2VySUQgICAgICAgPT4gMSwKICAgIExpbWl0ICAgICAgICA9PiAxLAopOwokU2VsZi0+SXMoCiAgICAkVGlja2V0SURzU29ydE9yZGVyWzBdLAogICAgJFRpY2tldElEU29ydE9yZGVyNSwKICAgICdUaWNrZXRUaWNrZXRTZWFyY2goKSAtIHRpY2tldCBzb3J0L29yZGVyIGJ5IChRdWV1ZSAoVXApKScsCik7CgokQ291bnQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgICAgPT4gJ0NPVU5UJywKICAgIFRpdGxlICAgICAgICA9PiAnJXNvcnQvb3JkZXIgYnkgdGVzdCUnLAogICAgUXVldWVzICAgICAgID0+IFsnUmF3J10sCiAgICBDdXN0b21lcklEICAgPT4gJEN1c3RvbWVyTm8sCiAgICBDdXN0b21lclVzZXIgPT4gJ3VuaXR0ZXN0QG90cnMuY29tJywKICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgTGltaXQgICAgICAgID0+IDEsCik7CiRTZWxmLT5JcygKICAgICRDb3VudCwKICAgIDQsCiAgICAnVGlja2V0VGlja2V0U2VhcmNoKCkgLSB0aWNrZXQgY291bnQgZm9yIGNyZWF0ZWQgdGlja2V0cycsCik7Cgpmb3IgbXkgJFRpY2tldElERGVsZXRlICgKICAgICRUaWNrZXRJRFNvcnRPcmRlcjEsICRUaWNrZXRJRFNvcnRPcmRlcjIsICRUaWNrZXRJRFNvcnRPcmRlcjMsCiAgICAkVGlja2V0SURTb3J0T3JkZXI0CiAgICApCnsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElERGVsZXRlLAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICksCiAgICAgICAgIlRpY2tldERlbGV0ZSgpIiwKICAgICk7Cn0KCiMgYXZvaWQgU3RhdGVUeXBlIGFuZCBTdGF0ZVR5cGVJRCBwcm9ibGVtcyBpbiBUaWNrZXRTZWFyY2goKQoKbXkgJVN0YXRlVHlwZUxpc3QgPSAkU3RhdGVPYmplY3QtPlN0YXRlVHlwZUxpc3QoCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgeW91IG5lZWQgYSBoYXNoIHdpdGggdGhlIHN0YXRlIGFzIGtleSBhbmQgdGhlIHJlbGF0ZWQgU3RhdGVUeXBlIGFuZCBTdGF0ZVR5cGVJRCBhcwojIHJlZmVyZW5jZQpteSAlU3RhdGVBc0tleUFuZFN0YXRlVHlwZUFzVmFsdWU7CmZvciBteSAkU3RhdGVUeXBlSUQgKCBzb3J0IGtleXMgJVN0YXRlVHlwZUxpc3QgKSB7CiAgICBteSBATGlzdCA9ICRTdGF0ZU9iamVjdC0+U3RhdGVHZXRTdGF0ZXNCeVR5cGUoCiAgICAgICAgU3RhdGVUeXBlID0+IFsgJFN0YXRlVHlwZUxpc3R7JFN0YXRlVHlwZUlEfSBdLAogICAgICAgIFJlc3VsdCAgICA9PiAnTmFtZScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEhBU0h8SUR8TmFtZQogICAgKTsKICAgIGZvciBteSAkSW5kZXggKEBMaXN0KSB7CiAgICAgICAgJFN0YXRlQXNLZXlBbmRTdGF0ZVR5cGVBc1ZhbHVleyRJbmRleH0tPntOYW1lfSA9ICRTdGF0ZVR5cGVMaXN0eyRTdGF0ZVR5cGVJRH07CiAgICAgICAgJFN0YXRlQXNLZXlBbmRTdGF0ZVR5cGVBc1ZhbHVleyRJbmRleH0tPntJRH0gICA9ICRTdGF0ZVR5cGVJRDsKICAgIH0KfQoKIyB0byBiZSBzdXJlIHRoYXQgeW91IGhhdmUgYSByZXN1bHQgdGlja2V0IGNyZWF0ZSBvbmUKJFRpY2tldElEID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKAogICAgVGl0bGUgICAgICAgID0+ICdTdGF0ZVR5cGVUZXN0JywKICAgIFF1ZXVlICAgICAgICA9PiAnUmF3JywKICAgIExvY2sgICAgICAgICA9PiAndW5sb2NrJywKICAgIFByaW9yaXR5ICAgICA9PiAnMyBub3JtYWwnLAogICAgU3RhdGUgICAgICAgID0+ICduZXcnLAogICAgQ3VzdG9tZXJJRCAgID0+ICcxMjM0NjUnLAogICAgQ3VzdG9tZXJVc2VyID0+ICd1bml0dGVzdEBvdHJzLmNvbScsCiAgICBPd25lcklEICAgICAgPT4gMSwKICAgIFVzZXJJRCAgICAgICA9PiAxLAopOwoKbXkgJVN0YXRlTGlzdCA9ICRTdGF0ZU9iamVjdC0+U3RhdGVMaXN0KCBVc2VySUQgPT4gMSApOwoKIyBub3cgY2hlY2sgZXZlcnkgcG9zc2libGUgc3RhdGUKZm9yIG15ICRTdGF0ZSAoIHZhbHVlcyAlU3RhdGVMaXN0ICkgewogICAgJFRpY2tldE9iamVjdC0+U3RhdGVTZXQoCiAgICAgICAgU3RhdGUgICAgICAgICAgICAgID0+ICRTdGF0ZSwKICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgIFNlbmROb05vdGlmaWNhdGlvbiA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAogICAgKTsKCiAgICBteSBAVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgICAgIFJlc3VsdCAgICAgICA9PiAnQVJSQVknLAogICAgICAgIFRpdGxlICAgICAgICA9PiAnJVN0YXRlVHlwZVRlc3QlJywKICAgICAgICBRdWV1ZXMgICAgICAgPT4gWydSYXcnXSwKICAgICAgICBTdGF0ZVR5cGVJRHMgPT4gWyAkU3RhdGVBc0tleUFuZFN0YXRlVHlwZUFzVmFsdWV7JFN0YXRlfS0+e0lEfSBdLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICBteSBAVGlja2V0SURzVHlwZSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgICAgICBSZXN1bHQgICAgPT4gJ0FSUkFZJywKICAgICAgICBUaXRsZSAgICAgPT4gJyVTdGF0ZVR5cGVUZXN0JScsCiAgICAgICAgUXVldWVzICAgID0+IFsnUmF3J10sCiAgICAgICAgU3RhdGVUeXBlID0+IFsgJFN0YXRlQXNLZXlBbmRTdGF0ZVR5cGVBc1ZhbHVleyRTdGF0ZX0tPntOYW1lfSBdLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICBpZiAoICRUaWNrZXRJRHNbMF0gKSB7CiAgICAgICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElEc1swXSwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgaWYgdGhlcmUgaXMgbm8gcmVzdWx0IHRoZSBTdGF0ZVR5cGVJRCBoYXNuJ3Qgd29ya2VkCiAgICAjIFRlc3QgaWYgdGhlcmUgaXMgYSByZXN1bHQsIGlmIEkgdXNlIFN0YXRlVHlwZUlEICRTdGF0ZUFzS2V5QW5kU3RhdGVUeXBlQXNWYWx1ZXskU3RhdGV9LT57SUR9CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVGlja2V0SURzWzBdLAogICAgICAgICJUaWNrZXRTZWFyY2goKSAtIFN0YXRlVHlwZUlEIC0gZm91bmQgdGlja2V0IiwKICAgICk7CgojIGlmIGl0IGlzIG5vdCBlcXVhbCB0aGVuIHRoZXJlIGlzIGluIHRoZSB1c2luZyBvZiBTdGF0ZVR5cGUgb3IgU3RhdGVUeXBlSUQgYW4gZXJyb3IKIyBjaGVjayBpZiB5b3UgZ2V0IHRoZSBzYW1lIHJlc3VsdCBpZiB5b3UgdXNlIHRoZSBTdGF0ZVR5cGUgYXR0cmlidXRlIG9yIHRoZSBTdGF0ZVR5cGVJRHMgYXR0cmlidXRlLgojIFN0YXRlKCRTdGF0ZSkgU3RhdGVUeXBlKCRTdGF0ZUFzS2V5QW5kU3RhdGVUeXBlQXNWYWx1ZXskU3RhdGV9LT57TmFtZX0pIGFuZCBTdGF0ZVR5cGVJRHMoJFN0YXRlQXNLZXlBbmRTdGF0ZVR5cGVBc1ZhbHVleyRTdGF0ZX0tPntJRH0pCiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEBUaWNrZXRJRHMsCiAgICAgICAgc2NhbGFyIEBUaWNrZXRJRHNUeXBlLAogICAgICAgICJUaWNrZXRTZWFyY2goKSAtIFN0YXRlVHlwZSIsCiAgICApOwp9CgpteSAlVGlja2V0UGVuZGluZyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgIFVzZXJJRCAgID0+IDEsCik7CgokU2VsZi0+SXMoCiAgICAkVGlja2V0UGVuZGluZ3tVbnRpbFRpbWV9LAogICAgJzAnLAogICAgIlRpY2tldFBlbmRpbmdUaW1lU2V0KCkgLSBQZW5kaW5nIFRpbWUgLSBub3Qgc2V0IiwKKTsKCm15ICREaWZmICAgICAgICAgICAgICAgPSA2MDsKbXkgJEN1cnJlbnRTeXN0ZW1UaW1lICA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpLT5Ub0Vwb2NoKCk7Cm15ICRQZW5kaW5nVGltZVNldERpZmYgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgIERpZmYgICAgID0+ICREaWZmLAogICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgVXNlcklEICAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFBlbmRpbmdUaW1lU2V0RGlmZiwKICAgICJUaWNrZXRQZW5kaW5nVGltZVNldCgpIC0gUGVuZGluZyBUaW1lIC0gc2V0IGRpZmYiLAopOwoKJVRpY2tldFBlbmRpbmcgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICBVc2VySUQgICA9PiAxLAopOwoKJFNlbGYtPklzKAogICAgJFRpY2tldFBlbmRpbmd7UmVhbFRpbGxUaW1lTm90VXNlZH0sCiAgICAkQ3VycmVudFN5c3RlbVRpbWUgKyAkRGlmZiAqIDYwLAogICAgIlRpY2tldFBlbmRpbmdUaW1lU2V0KCkgLSBkaWZmIHRpbWUgY2hlY2siLAopOwoKbXkgJFBlbmRpbmdUaW1lU2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVuZGluZ1RpbWVTZXQoCiAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICBVc2VySUQgICA9PiAxLAogICAgWWVhciAgICAgPT4gJzIwMDMnLAogICAgTW9udGggICAgPT4gJzA4JywKICAgIERheSAgICAgID0+ICcxNCcsCiAgICBIb3VyICAgICA9PiAnMjInLAogICAgTWludXRlICAgPT4gJzA1JywKKTsKCiRTZWxmLT5UcnVlKAogICAgJFBlbmRpbmdUaW1lU2V0LAogICAgIlRpY2tldFBlbmRpbmdUaW1lU2V0KCkgLSBQZW5kaW5nIFRpbWUgLSBzZXQiLAopOwoKJVRpY2tldFBlbmRpbmcgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICBVc2VySUQgICA9PiAxLAopOwoKbXkgJFBlbmRpbmdVbnRpbFRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgIFllYXIgICA9PiAnMjAwMycsCiAgICAgICAgTW9udGggID0+ICcwOCcsCiAgICAgICAgRGF5ICAgID0+ICcxNCcsCiAgICAgICAgSG91ciAgID0+ICcyMicsCiAgICAgICAgTWludXRlID0+ICcwNScsCiAgICAgICAgU2Vjb25kID0+ICcwMCcsCiAgICAgICAgfQopLT5Ub0Vwb2NoKCk7CgokUGVuZGluZ1VudGlsVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpLT5Ub0Vwb2NoKCkgLSAkUGVuZGluZ1VudGlsVGltZTsKCiRTZWxmLT5JcygKICAgICRUaWNrZXRQZW5kaW5ne1VudGlsVGltZX0sCiAgICAnLScgLiAkUGVuZGluZ1VudGlsVGltZSwKICAgICJUaWNrZXRQZW5kaW5nVGltZVNldCgpIC0gUGVuZGluZyBUaW1lIC0gcmVhZCBiYWNrIiwKKTsKCiRQZW5kaW5nVGltZVNldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFBlbmRpbmdUaW1lU2V0KAogICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgVXNlcklEICAgPT4gMSwKICAgIFllYXIgICAgID0+ICcwJywKICAgIE1vbnRoICAgID0+ICcwJywKICAgIERheSAgICAgID0+ICcwJywKICAgIEhvdXIgICAgID0+ICcwJywKICAgIE1pbnV0ZSAgID0+ICcwJywKKTsKCiRTZWxmLT5UcnVlKAogICAgJFBlbmRpbmdUaW1lU2V0LAogICAgIlRpY2tldFBlbmRpbmdUaW1lU2V0KCkgLSBQZW5kaW5nIFRpbWUgLSByZXNldCIsCik7CgolVGlja2V0UGVuZGluZyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgIFVzZXJJRCAgID0+IDEsCik7CgokU2VsZi0+SXMoCiAgICAkVGlja2V0UGVuZGluZ3tVbnRpbFRpbWV9LAogICAgJzAnLAogICAgIlRpY2tldFBlbmRpbmdUaW1lU2V0KCkgLSBQZW5kaW5nIFRpbWUgLSBub3Qgc2V0IiwKKTsKCiRQZW5kaW5nVGltZVNldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFBlbmRpbmdUaW1lU2V0KAogICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgVXNlcklEICAgPT4gMSwKICAgIFN0cmluZyAgID0+ICcyMDAzLTA5LTE0IDIyOjA1OjAwJywKKTsKCiRTZWxmLT5UcnVlKAogICAgJFBlbmRpbmdUaW1lU2V0LAogICAgIlRpY2tldFBlbmRpbmdUaW1lU2V0KCkgLSBQZW5kaW5nIFRpbWUgLSBzZXQgc3RyaW5nIiwKKTsKCiVUaWNrZXRQZW5kaW5nID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgVXNlcklEICAgPT4gMSwKKTsKCiRQZW5kaW5nVW50aWxUaW1lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICBTdHJpbmcgPT4gJzIwMDMtMDktMTQgMjI6MDU6MDAnLAogICAgICAgIH0KKS0+VG9FcG9jaCgpOwoKJFBlbmRpbmdVbnRpbFRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKS0+VG9FcG9jaCgpIC0gJFBlbmRpbmdVbnRpbFRpbWU7CgokU2VsZi0+SXMoCiAgICAkVGlja2V0UGVuZGluZ3tVbnRpbFRpbWV9LAogICAgJy0nIC4gJFBlbmRpbmdVbnRpbFRpbWUsCiAgICAiVGlja2V0UGVuZGluZ1RpbWVTZXQoKSAtIFBlbmRpbmcgVGltZSAtIHJlYWQgYmFjayIsCik7CgokUGVuZGluZ1RpbWVTZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgIFVzZXJJRCAgID0+IDEsCiAgICBTdHJpbmcgICA9PiAnMDAwMC0wMC0wMCAwMDowMDowMCcsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRQZW5kaW5nVGltZVNldCwKICAgICJUaWNrZXRQZW5kaW5nVGltZVNldCgpIC0gUGVuZGluZyBUaW1lIC0gcmVzZXQgc3RyaW5nIiwKKTsKCiVUaWNrZXRQZW5kaW5nID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgVXNlcklEICAgPT4gMSwKKTsKCiRTZWxmLT5JcygKICAgICRUaWNrZXRQZW5kaW5ne1VudGlsVGltZX0sCiAgICAnMCcsCiAgICAiVGlja2V0UGVuZGluZ1RpbWVTZXQoKSAtIFBlbmRpbmcgVGltZSAtIG5vdCBzZXQiLAopOwoKJFBlbmRpbmdUaW1lU2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVuZGluZ1RpbWVTZXQoCiAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICBVc2VySUQgICA9PiAxLAogICAgU3RyaW5nICAgPT4gJzIwMDMtMDktMTQgMjI6MDU6MDAnLAopOwoKJFNlbGYtPlRydWUoCiAgICAkUGVuZGluZ1RpbWVTZXQsCiAgICAiVGlja2V0UGVuZGluZ1RpbWVTZXQoKSAtIFBlbmRpbmcgVGltZSAtIHNldCBzdHJpbmciLAopOwoKbXkgJFRpY2tldFN0YXRlVXBkYXRlID0gJFRpY2tldE9iamVjdC0+VGlja2V0U3RhdGVTZXQoCiAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICBVc2VySUQgICA9PiAxLAogICAgU3RhdGUgICAgPT4gJ3BlbmRpbmcgcmVtaW5kZXInLAopOwoKJVRpY2tldFBlbmRpbmcgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICBVc2VySUQgICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0UGVuZGluZ3tVbnRpbFRpbWV9LAogICAgIlRpY2tldFBlbmRpbmdUaW1lU2V0KCkgLSBTZXQgdG8gcGVuZGluZyAtIHRpbWUgc2hvdWxkIHN0aWxsIGJlIHRoZXJlIiwKKTsKCiRUaWNrZXRTdGF0ZVVwZGF0ZSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN0YXRlU2V0KAogICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgVXNlcklEICAgPT4gMSwKICAgIFN0YXRlICAgID0+ICduZXcnLAopOwoKJVRpY2tldFBlbmRpbmcgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICBVc2VySUQgICA9PiAxLAopOwoKJFNlbGYtPklzKAogICAgJFRpY2tldFBlbmRpbmd7VW50aWxUaW1lfSwKICAgICcwJywKICAgICJUaWNrZXRQZW5kaW5nVGltZVNldCgpIC0gU2V0IHRvIG5ldyAtIFBlbmRpbmcgVGltZSBub3Qgc2V0IiwKKTsKCiMgY2hlY2sgdGhhdCBzZWFyY2hlcyB3aXRoIE5ld2VyRGF0ZSBpbiB0aGUgZnV0dXJlIGFyZSBub3QgZXhlY3V0ZWQKJEhlbHBlci0+Rml4ZWRUaW1lQWRkU2Vjb25kcyggLTYwICogNjAgKTsKCiMgVGVzdCBUaWNrZXRDcmVhdGVUaW1lTmV3ZXJEYXRlIChmdXR1cmUgZGF0ZSkKJFRpY2tldENyZWF0ZVRpbWVOZXdlckRhdGUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKJFRpY2tldENyZWF0ZVRpbWVOZXdlckRhdGUtPkFkZCggSG91cnMgPT4gMSApOwoKJVRpY2tldElEcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgICAgICAgICAgICAgICAgPT4gJ0hBU0gnLAogICAgTGltaXQgICAgICAgICAgICAgICAgICAgICA9PiAxMDAsCiAgICBUaWNrZXRDcmVhdGVUaW1lTmV3ZXJEYXRlID0+ICRUaWNrZXRDcmVhdGVUaW1lTmV3ZXJEYXRlLT5Ub1N0cmluZygpLAogICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgUGVybWlzc2lvbiAgICAgICAgICAgICAgICA9PiAncncnLAopOwokU2VsZi0+RmFsc2UoCiAgICAkVGlja2V0SURzeyRUaWNrZXRJRH0sCiAgICAnVGlja2V0U2VhcmNoKCkgKEhBU0g6VGlja2V0Q3JlYXRlVGltZU5ld2VyRGF0ZSA9PiAtNjApJywKKTsKCiMgVGVzdCBBcnRpY2xlQ3JlYXRlVGltZU5ld2VyRGF0ZSAoZnV0dXJlIGRhdGUpCiRBcnRpY2xlQ3JlYXRlVGltZU5ld2VyRGF0ZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwokQXJ0aWNsZUNyZWF0ZVRpbWVOZXdlckRhdGUtPkFkZCggSG91cnMgPT4gMSApOwoKJVRpY2tldElEcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgIFJlc3VsdCAgICAgICAgICAgICAgICAgICAgID0+ICdIQVNIJywKICAgIExpbWl0ICAgICAgICAgICAgICAgICAgICAgID0+IDEwMCwKICAgIEFydGljbGVDcmVhdGVUaW1lTmV3ZXJEYXRlID0+ICRBcnRpY2xlQ3JlYXRlVGltZU5ld2VyRGF0ZS0+VG9TdHJpbmcoKSwKICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICBQZXJtaXNzaW9uICAgICAgICAgICAgICAgICA9PiAncncnLAopOwokU2VsZi0+RmFsc2UoCiAgICAkVGlja2V0SURzeyRUaWNrZXRJRH0sCiAgICAnVGlja2V0U2VhcmNoKCkgKEhBU0g6QXJ0aWNsZUNyZWF0ZVRpbWVOZXdlckRhdGUgPT4gLTYwKScsCik7CgojIFRlc3QgVGlja2V0Q2xvc2VUaW1lTmV3ZXJEYXRlIChmdXR1cmUgZGF0ZSkKJFRpY2tldENsb3NlVGltZU5ld2VyRGF0ZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwokVGlja2V0Q2xvc2VUaW1lTmV3ZXJEYXRlLT5BZGQoIEhvdXJzID0+IDEgKTsKCiVUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgICAgICAgICAgICAgICAgPT4gJ0hBU0gnLAogICAgTGltaXQgICAgICAgICAgICAgICAgICAgID0+IDEwMCwKICAgIFRpY2tldENsb3NlVGltZU5ld2VyRGF0ZSA9PiAkVGlja2V0Q2xvc2VUaW1lTmV3ZXJEYXRlLT5Ub1N0cmluZygpLAogICAgVXNlcklEICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICBQZXJtaXNzaW9uICAgICAgICAgICAgICAgPT4gJ3J3JywKKTsKJFNlbGYtPkZhbHNlKAogICAgJFRpY2tldElEc3skVGlja2V0SUR9LAogICAgJ1RpY2tldFNlYXJjaCgpIChIQVNIOlRpY2tldENsb3NlVGltZU5ld2VyRGF0ZSA9PiAtNjApJywKKTsKCiMgdGhlIHRpY2tldCBpcyBubyBsb25nZXIgbmVlZGVkCiRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgIFVzZXJJRCAgID0+IDEsCik7CgojIHRlc3RzIGZvciBzZWFyY2hpbmcgU3RhdGVUeXBlcyB0aGF0IG1pZ2h0IG5vdCBoYXZlIHN0YXRlcwojIHRoaXMgc2hvdWxkIHJldHVybiBhbiBlbXB0eSBsaXN0IHJhdGhlciB0aGVuIGEgYmlnIFNRTCBlcnJvcgojIHRoZSBwcm9ibGVtIGlzLCB3ZSBjYW4ndCByZWFsbHkgdGVzdCBpZiB0aGVyZSBpcyBhbiBTUUwgZXJyb3Igb3Igbm90CiMgdGlja2V0IHNlYXJjaCByZXR1cm5zIGFuIGVtcHR5IGxpc3QgYW55d2F5CgpteSBATmV3U3RhdGVzID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUdldFN0YXRlc0J5VHlwZSgKICAgIFN0YXRlVHlwZSA9PiBbJ25ldyddLAogICAgUmVzdWx0ICAgID0+ICdJRCcsCik7CgojIG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIHZhbGlkIHN0YXRlcyBmb3Igc3RhdGUgdHlwZSBuZXcKZm9yIG15ICROZXdTdGF0ZUlEIChATmV3U3RhdGVzKSB7CiAgICBteSAlU3RhdGUgPSAkU3RhdGVPYmplY3QtPlN0YXRlR2V0KAogICAgICAgIElEID0+ICROZXdTdGF0ZUlELAogICAgKTsKICAgICRTdGF0ZU9iamVjdC0+U3RhdGVVcGRhdGUoCiAgICAgICAgJVN0YXRlLAogICAgICAgIFZhbGlkSUQgPT4gMiwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwp9CgpteSBAVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgUmVzdWx0ICAgICAgID0+ICdMSVNUJywKICAgIExpbWl0ICAgICAgICA9PiAxMDAsCiAgICBUaWNrZXROdW1iZXIgPT4gWyAkVGlja2V0e1RpY2tldE51bWJlcn0sICdBQkMnIF0sCiAgICBTdGF0ZVR5cGUgICAgPT4gJ05ldycsCiAgICBVc2VySUQgICAgICAgPT4gMSwKICAgIFBlcm1pc3Npb24gICA9PiAncncnLAopOwokU2VsZi0+RmFsc2UoCiAgICAkVGlja2V0SURzWzBdLAogICAgJ1RpY2tldFNlYXJjaCgpIChMSVNUOlRpY2tldE51bWJlcixTdGF0ZVR5cGU6bmV3IChubyB2YWxpZCBzdGF0ZXMgb2Ygc3RhdGUgdHlwZSBuZXcpJywKKTsKCiMgYWN0aXZhdGUgc3RhdGVzIGFnYWluCmZvciBteSAkTmV3U3RhdGVJRCAoQE5ld1N0YXRlcykgewogICAgbXkgJVN0YXRlID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUdldCgKICAgICAgICBJRCA9PiAkTmV3U3RhdGVJRCwKICAgICk7CiAgICAkU3RhdGVPYmplY3QtPlN0YXRlVXBkYXRlKAogICAgICAgICVTdGF0ZSwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKfQoKIyBjaGVjayByZXNwb25zZSBvZiB0aWNrZXQgc2VhcmNoIGZvciBpbnZhbGlkIHRpbWVzdGFtcHMKZm9yIG15ICRTZWFyY2hQYXJhbSAocXcoQXJ0aWNsZUNyZWF0ZVRpbWUgVGlja2V0Q3JlYXRlVGltZSBUaWNrZXRQZW5kaW5nVGltZSkpIHsKICAgIGZvciBteSAkUGFyYW1PcHRpb24gKHF3KE9sZGVyRGF0ZSBOZXdlckRhdGUpKSB7CiAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICAkU2VhcmNoUGFyYW0gLiAkUGFyYW1PcHRpb24gPT4gJzIwMDAtMDItMzEgMDA6MDA6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgIG15ICRFcnJvck1lc3NhZ2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkdldExvZ0VudHJ5KAogICAgICAgICAgICBUeXBlID0+ICdlcnJvcicsCiAgICAgICAgICAgIFdoYXQgPT4gJ01lc3NhZ2UnLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkRXJyb3JNZXNzYWdlLAogICAgICAgICAgICAiU2VhcmNoIG5vdCBleGVjdXRlZCBkdWUgdG8gaW52YWxpZCB0aW1lICcyMDAwLTAyLTMxIDAwOjAwOjAwJyEiLAogICAgICAgICAgICAiVGlja2V0U2VhcmNoKCkgKEhhbmRsaW5nIGludmFsaWQgdGltZXN0YW1wIGluICckU2VhcmNoUGFyYW0kUGFyYW1PcHRpb24nKSIsCiAgICAgICAgKTsKICAgIH0KfQoKIyBDcmVhdGUgZW52aXJvbWVudCBmb3IgdGVzdGluZyBFc2NhbGF0aW9uIE9SREVSIEJZIG1vZGlmaWNhdGlvbiBmcm9tIHRoZSBidWcjMTM0NTguCiMgQ3JlYXRlIFF1ZXVlcyB3aXRoIGRpZmZlcmVudCBFc2NhbGF0aW9uIHRpbWVzLgpteSBAUXVldWVDb25maWcgPSAoCiAgICB7CiAgICAgICAgIyBGaXJzdCBjcmVhdGVkIFF1ZXVlIGRvZXMgbm90IGhhdmUgVXBkYXRlIHRpbWUgc2V0LCB2YWx1ZSBpcyAwIGZvciBjcmVhdGVkIHRpY2tldC4KICAgICAgICBOYW1lICAgICAgICAgICAgICA9PiAnUXVldWUnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKSwKICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSA9PiA1MCwKICAgICAgICBTb2x1dGlvblRpbWUgICAgICA9PiA2MCwKICAgIH0sCiAgICB7CiAgICAgICAgIyBTZWNvbmQgY3JlYXRlZCBRdWV1ZSBkb2VzIG5vdCBoYXZlIEZpcnN0IHJlc3BvbnNlIHRpbWUgc2V0LCB2YWx1ZSBpcyAwIGZvciBjcmVhdGVkIHRpY2tldC4KICAgICAgICBOYW1lICAgICAgICAgPT4gJ1F1ZXVlJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCksCiAgICAgICAgVXBkYXRlVGltZSAgID0+IDcwLAogICAgICAgIFNvbHV0aW9uVGltZSA9PiA4MCwKICAgIH0sCiAgICB7CiAgICAgICAgIyBUaGlyZCBjcmVhdGVkIFF1ZXVlIGRvZXMgbm90IGhhdmUgU29sdXRpb24gdGltZSBzZXQsIHZhbHVlIGlzIDAgZm9yIGNyZWF0ZWQgdGlja2V0LgogICAgICAgIE5hbWUgICAgICAgICAgICAgID0+ICdRdWV1ZScgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpLAogICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lID0+IDYwLAogICAgICAgIFVwZGF0ZVRpbWUgICAgICAgID0+IDMwLAogICAgfSwKKTsKCm15IEBRdWV1ZUlEczsKZm9yIG15ICRRdWV1ZUNyZWF0ZSAoQFF1ZXVlQ29uZmlnKSB7CiAgICBteSAkUXVldWVJRCA9ICRRdWV1ZU9iamVjdC0+UXVldWVBZGQoCiAgICAgICAgVmFsaWRJRCAgICAgICAgID0+IDEsCiAgICAgICAgR3JvdXBJRCAgICAgICAgID0+IDEsCiAgICAgICAgRm9sbG93VXBJRCAgICAgID0+IDEsCiAgICAgICAgU3lzdGVtQWRkcmVzc0lEID0+IDEsCiAgICAgICAgU2FsdXRhdGlvbklEICAgID0+IDEsCiAgICAgICAgU2lnbmF0dXJlSUQgICAgID0+IDEsCiAgICAgICAgQ29tbWVudCAgICAgICAgID0+ICdTb21lIGNvbW1lbnQnLAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICV7JFF1ZXVlQ3JlYXRlfSwKICAgICk7CiAgICBwdXNoIEBRdWV1ZUlEcywgJFF1ZXVlSUQ7Cn0KCiMgQ3JlYXRlIFRpY2tldHMuCm15IEBUZXN0VGlja2V0SURzOwpmb3IgbXkgJFF1ZXVlSUQgKEBRdWV1ZUlEcykgewogICAgbXkgJFRpY2tldElEID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKAogICAgICAgIFRpdGxlICAgICAgICA9PiAnU29tZSBUaWNrZXQgVGl0bGUnLAogICAgICAgIFF1ZXVlSUQgICAgICA9PiAkUXVldWVJRCwKICAgICAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgUHJpb3JpdHkgICAgID0+ICczIG5vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICduZXcnLAogICAgICAgIEN1c3RvbWVySUQgICA9PiAnMTIzNDY1JywKICAgICAgICBDdXN0b21lclVzZXIgPT4gJ2J1Z3Rlc3RAb3Rycy5jb20nLAogICAgICAgIE93bmVySUQgICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKICAgIHB1c2ggQFRlc3RUaWNrZXRJRHMsICRUaWNrZXRJRDsKCiAgICBteSAkQXJ0aWNsZUlEID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAwLAogICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdhZ2VudCcsCiAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJ0FnZW50IFNvbWUgQWdlbnQgU29tZSBBZ2VudCA8ZW1haWxAZXhhbXBsZS5jb20+JywKICAgICAgICBUbyAgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tZXIgQSA8Y3VzdG9tZXItYUBleGFtcGxlLmNvbT4nLAogICAgICAgIENjICAgICAgICAgICAgICAgICAgID0+ICdDdXN0b21lciBCIDxjdXN0b21lci1iQGV4YW1wbGUuY29tPicsCiAgICAgICAgUmVwbHlUbyAgICAgICAgICAgICAgPT4gJ0N1c3RvbWVyIEIgPGN1c3RvbWVyLWJAZXhhbXBsZS5jb20+JywKICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAnc29tZSBzaG9ydCBkZXNjcmlwdGlvbicsCiAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJ3RoZSBtZXNzYWdlIHRleHQgUGVybCBtb2R1bGVzIHByb3ZpZGUgYSByYW5nZSBvZicsCiAgICAgICAgQ29udGVudFR5cGUgICAgICAgICAgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMTUnLAogICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICdBZGROb3RlJywKICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAnU29tZSBmcmVlIHRleHQhJywKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIE5vQWdlbnROb3RpZnkgICAgICAgID0+IDEsCiAgICApOwoKICAgIG15ICRUaWNrZXRFc2NhbGF0aW9uSW5kZXhCdWlsZCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEVzY2FsYXRpb25JbmRleEJ1aWxkKAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICAjIFdhaXQgMSBzZWNvbmQgdG8gaGF2ZSBlc2NhbGF0aW9ucy4KICAgICRIZWxwZXItPkZpeGVkVGltZUFkZFNlY29uZHMoMSk7CgogICAgIyBSZW5ldyBvYmplY3RzIGJlY2F1c2Ugb2YgdHJhbnNhY3Rpb24uCiAgICAkS2VybmVsOjpPTS0+T2JqZWN0c0Rpc2NhcmQoCiAgICAgICAgT2JqZWN0cyA9PiBbCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnLAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZTo6QmFja2VuZDo6SW50ZXJuYWwnLAogICAgICAgIF0sCiAgICApOwogICAgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKfQoKIyBDcmVhdGUgVGlja2V0U2VhcmNoIGJ5IEVzY2FsYXRpb25zIHNjZW5hcmlvcy4KbXkgQFRlc3RzID0gKAogICAgewogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIE9yZGVyQnkgPT4gJ1VwJywKICAgICAgICAgICAgU29ydEJ5ICA9PiAnRXNjYWxhdGlvblJlc3BvbnNlVGltZScsCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJlc3VsdCA9PiBbICRUZXN0VGlja2V0SURzWzFdLCAkVGVzdFRpY2tldElEc1swXSwgJFRlc3RUaWNrZXRJRHNbMl0gXSwKICAgIH0sCiAgICB7CiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgT3JkZXJCeSA9PiAnRG93bicsCiAgICAgICAgICAgIFNvcnRCeSAgPT4gJ0VzY2FsYXRpb25SZXNwb25zZVRpbWUnLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXN1bHQgPT4gWyAkVGVzdFRpY2tldElEc1syXSwgJFRlc3RUaWNrZXRJRHNbMF0sICRUZXN0VGlja2V0SURzWzFdIF0sCiAgICB9LAogICAgewogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIE9yZGVyQnkgPT4gJ1VwJywKICAgICAgICAgICAgU29ydEJ5ICA9PiAnRXNjYWxhdGlvblVwZGF0ZVRpbWUnLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXN1bHQgPT4gWyAkVGVzdFRpY2tldElEc1swXSwgJFRlc3RUaWNrZXRJRHNbMl0sICRUZXN0VGlja2V0SURzWzFdIF0sCiAgICB9LAogICAgewogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIE9yZGVyQnkgPT4gJ0Rvd24nLAogICAgICAgICAgICBTb3J0QnkgID0+ICdFc2NhbGF0aW9uVXBkYXRlVGltZScsCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJlc3VsdCA9PiBbICRUZXN0VGlja2V0SURzWzFdLCAkVGVzdFRpY2tldElEc1syXSwgJFRlc3RUaWNrZXRJRHNbMF0gXSwKICAgIH0sCiAgICB7CiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgT3JkZXJCeSA9PiAnVXAnLAogICAgICAgICAgICBTb3J0QnkgID0+ICdFc2NhbGF0aW9uU29sdXRpb25UaW1lJywKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmVzdWx0ID0+IFsgJFRlc3RUaWNrZXRJRHNbMl0sICRUZXN0VGlja2V0SURzWzBdLCAkVGVzdFRpY2tldElEc1sxXSBdLAogICAgfSwKICAgIHsKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBPcmRlckJ5ID0+ICdEb3duJywKICAgICAgICAgICAgU29ydEJ5ICA9PiAnRXNjYWxhdGlvblNvbHV0aW9uVGltZScsCiAgICAgICAgfSwKICAgICAgICBFeHBlY3RlZFJlc3VsdCA9PiBbICRUZXN0VGlja2V0SURzWzFdLCAkVGVzdFRpY2tldElEc1swXSwgJFRlc3RUaWNrZXRJRHNbMl0gXSwKICAgIH0sCik7CmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CiAgICBteSBAVGlja2V0cyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgICAgICBSZXN1bHQgICAgICAgICAgICA9PiAnQVJSQVknLAogICAgICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICdidWd0ZXN0QG90cnMuY29tJywKICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAkVGVzdC0+e0V4cGVjdGVkUmVzdWx0fSwKICAgICAgICBcQFRpY2tldHMsCiAgICAgICAgIlRpY2tldFNlYXJjaCgpIC0gU29ydEJ5ICRUZXN0LT57Q29uZmlnfXtTb3J0Qnl9IC0gT3JkZXJCeSAkVGVzdC0+e0NvbmZpZ317T3JkZXJCeX0iCiAgICApOwp9CgojIGNsZWFudXAgaXMgZG9uZSBieSBSZXN0b3JlRGF0YWJhc2UgYnV0IHdlIG5lZWQgdG8gZGVsZXRlIHRoZSB0aWNrZXRzIHRvIGNsZWFudXAgdGhlIGZpbGVzeXN0ZW0gdG9vCm15IEBEZWxldGVUaWNrZXRMaXN0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0FSUkFZJywKICAgIEN1c3RvbWVyVXNlckxvZ2luID0+IFsgJ3VuaXR0ZXN0QG90cnMuY29tJywgJ2J1Z3Rlc3RAb3Rycy5jb20nIF0sCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAopOwpmb3IgbXkgJFRpY2tldElEIChARGVsZXRlVGlja2V0TGlzdCkgewogICAgJFRpY2tldE9iamVjdC0+VGlja2V0RGVsZXRlKAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKfQoKIyBUZXN0IHRpY2tldCBzZWFyY2ggYnkgZnVsbHRleHQgKHNlZSBidWcjMTMyODQpLgojICAgQ3JlYXRlIGEgdGVzdCB0aWNrZXQgYW5kIGFkZCBhbiBhcnRpY2xlIGZvciB0aGlzIHRpY2tldC4KIyAgIE5vdGUgdGhhdCBhcnRpY2xlIHN1YmplY3QgYW5kIHRpY2tldCB0aXRsZSBkaWZmZXIuCm15ICRUZXN0VGlja2V0VGl0bGUgID0gJ3RpdGxlJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7Cm15ICRGdWxsdGV4dFRpY2tldElEID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKAogICAgVGl0bGUgICAgICAgID0+ICRUZXN0VGlja2V0VGl0bGUsCiAgICBRdWV1ZSAgICAgICAgPT4gJ1JhdycsCiAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICBQcmlvcml0eSAgICAgPT4gJzMgbm9ybWFsJywKICAgIFN0YXRlICAgICAgICA9PiAnb3BlbicsCiAgICBDdXN0b21lcklEICAgPT4gJzEyMzQ2NScsCiAgICBDdXN0b21lclVzZXIgPT4gJ2J1Z3Rlc3RAb3Rycy5jb20nLAogICAgT3duZXJJRCAgICAgID0+IDEsCiAgICBVc2VySUQgICAgICAgPT4gMSwKKTsKCm15ICRUZXN0QXJ0aWNsZVN1YmplY3QgPSAnc3ViamVjdCcgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwpteSAkRnVsbHRleHRBcnRpY2xlSUQgID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlQ3JlYXRlKAogICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gJEZ1bGx0ZXh0VGlja2V0SUQsCiAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAwLAogICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJ2FnZW50JywKICAgIEZyb20gICAgICAgICAgICAgICAgID0+ICdBZ2VudCBTb21lIEFnZW50IFNvbWUgQWdlbnQgPGVtYWlsQGV4YW1wbGUuY29tPicsCiAgICBUbyAgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tZXIgQSA8Y3VzdG9tZXItYUBleGFtcGxlLmNvbT4nLAogICAgQ2MgICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbWVyIEIgPGN1c3RvbWVyLWJAZXhhbXBsZS5jb20+JywKICAgIFJlcGx5VG8gICAgICAgICAgICAgID0+ICdDdXN0b21lciBCIDxjdXN0b21lci1iQGV4YW1wbGUuY29tPicsCiAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAkVGVzdEFydGljbGVTdWJqZWN0LAogICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJ1NvbWUgdGV4dCcsCiAgICBDb250ZW50VHlwZSAgICAgICAgICA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xNScsCiAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAnQWRkTm90ZScsCiAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAnU29tZSBmcmVlIHRleHQhJywKICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+IDEsCiAgICBOb0FnZW50Tm90aWZ5ICAgICAgICA9PiAxLAopOwoKJEFydGljbGVPYmplY3QtPkFydGljbGVTZWFyY2hJbmRleEJ1aWxkKAogICAgVGlja2V0SUQgID0+ICRGdWxsdGV4dFRpY2tldElELAogICAgQXJ0aWNsZUlEID0+ICRGdWxsdGV4dEFydGljbGVJRCwKICAgIFVzZXJJRCAgICA9PiAxLAopOwoKIyBTZWFyY2ggZm9yIHRpY2tldCB0aXRsZSBhcyBmdWxsdGV4dCBwYXJhbWV0ZXIuCkBUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICBSZXN1bHQgICAgID0+ICdBUlJBWScsCiAgICBGdWxsdGV4dCAgID0+ICRUZXN0VGlja2V0VGl0bGUsCiAgICBVc2VySUQgICAgID0+IDEsCiAgICBQZXJtaXNzaW9uID0+ICdydycsCik7CgojIFZlcmlmeSByZXN1bHQgaGFzIG9uZSBpdGVtIGFuZCBpdCdzIGluZGVlZCB0aGUgdGVzdCB0aWNrZXQuCiRTZWxmLT5Jc0RlZXBseSgKICAgIFxAVGlja2V0SURzLAogICAgWyRGdWxsdGV4dFRpY2tldElEXSwKICAgICJUaWNrZXRTZWFyY2goKSAtIHNlYXJjaCB0aWNrZXQgdGl0bGUgJyRUZXN0VGlja2V0VGl0bGUnIGFzIGZ1bGx0ZXh0IC0gZm91bmQgb25seSBUaWNrZXRJRCAkRnVsbHRleHRUaWNrZXRJRCIKKTsKCiMgU2VhcmNoIGZvciBhcnRpY2xlIHN1YmplY3QgYXMgZnVsbHRleHQgcGFyYW1ldGVyLgpAVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgUmVzdWx0ICAgICA9PiAnQVJSQVknLAogICAgRnVsbHRleHQgICA9PiAkVGVzdEFydGljbGVTdWJqZWN0LAogICAgVXNlcklEICAgICA9PiAxLAogICAgUGVybWlzc2lvbiA9PiAncncnLAopOwoKIyBWZXJpZnkgcmVzdWx0IGhhcyBvbmUgaXRlbSBhbmQgaXQncyBpbmRlZWQgdGhlIHRlc3QgdGlja2V0LgokU2VsZi0+SXNEZWVwbHkoCiAgICBcQFRpY2tldElEcywKICAgIFskRnVsbHRleHRUaWNrZXRJRF0sCiAgICAiVGlja2V0U2VhcmNoKCkgLSBzZWFyY2ggYXJ0aWNsZSBzdWJqZWN0ICckVGVzdEFydGljbGVTdWJqZWN0JyBhcyBmdWxsdGV4dCAtIGZvdW5kIG9ubHkgVGlja2V0SUQgJEZ1bGx0ZXh0VGlja2V0SUQiCik7CgokU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgIFRpY2tldElEID0+ICRGdWxsdGV4dFRpY2tldElELAogICAgVXNlcklEICAgPT4gMSwKKTsKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICJUaWNrZXRJRCAkRnVsbHRleHRUaWNrZXRJRCAtIGRlbGV0ZWQiLAopOwoKIyBUZXN0IFRpY2tldENvdW50QnlBdHRyaWJ1dGUoKSBmdW5jdGlvbi4KIyBFbmFibGUgVGlja2V0IFR5cGUuCiRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPlNldCgKICAgIEtleSAgID0+ICdUaWNrZXQ6OlR5cGUnLAogICAgVmFsdWUgPT4gMSwKKTsKCiMgQ3JlYXRlIHRlc3QgZW52aXJvbm1lbnQuCm15ICRQcmlvcml0eU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcmlvcml0eScpOwpteSAkUmFuZG9tSUQgICAgICAgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwpteSBAUHJpb3JpdGllczsKbXkgQFNlcnZpY2VzOwpteSBAU0xBczsKbXkgQFN0YXRlczsKbXkgQFR5cGVzOwpteSBAUXVldWVzOwoKZm9yIG15ICRJbmRleCAoIDEgLi4gMyApIHsKCiAgICAjIENyZWF0ZSB0ZXN0IHF1ZXVlcy4KICAgIG15ICRRdWV1ZU5hbWUgPSAkSW5kZXggLiAnUXVldWUnIC4gJFJhbmRvbUlEOwogICAgbXkgJFF1ZXVlSUQgICA9ICRRdWV1ZU9iamVjdC0+UXVldWVBZGQoCiAgICAgICAgTmFtZSAgICAgICAgICAgID0+ICRRdWV1ZU5hbWUsCiAgICAgICAgVmFsaWRJRCAgICAgICAgID0+IDEsCiAgICAgICAgR3JvdXBJRCAgICAgICAgID0+IDEsCiAgICAgICAgRm9sbG93VXBJRCAgICAgID0+IDEsCiAgICAgICAgU3lzdGVtQWRkcmVzc0lEID0+IDEsCiAgICAgICAgU2FsdXRhdGlvbklEICAgID0+IDEsCiAgICAgICAgU2lnbmF0dXJlSUQgICAgID0+IDEsCiAgICAgICAgQ29tbWVudCAgICAgICAgID0+ICdVbml0IFRlc3QgQ29tbWVudCcsCiAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICApIHx8IGRpZSAiUXVldWVBZGQoKSBlcnJvci4iOwoKICAgIHB1c2ggQFF1ZXVlcywgewogICAgICAgIElEICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgTmFtZSA9PiAkUXVldWVOYW1lLAogICAgfTsKCiAgICAjIENyZWF0ZSB0ZXN0IHByaW9yaXRpZXMuCiAgICBteSAkUHJpb3JpdHlOYW1lID0gJEluZGV4IC4gJ1ByaW8nIC4gJFJhbmRvbUlEOwogICAgbXkgJFByaW9yaXR5SUQgICA9ICRQcmlvcml0eU9iamVjdC0+UHJpb3JpdHlBZGQoCiAgICAgICAgTmFtZSAgICA9PiAkUHJpb3JpdHlOYW1lLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApIHx8IGRpZSAiUHJpb3JpdHlBZGQoKSBlcnJvci4iOwoKICAgIHB1c2ggQFByaW9yaXRpZXMsIHsKICAgICAgICBJRCAgID0+ICRQcmlvcml0eUlELAogICAgICAgIE5hbWUgPT4gJFByaW9yaXR5TmFtZSwKICAgIH07CgogICAgIyBDcmVhdGUgdGVzdCBzZXJ2aWNlcy4KICAgIG15ICRTZXJ2aWNlTmFtZSA9ICRJbmRleCAuICdTZXJ2aWNlJyAuICRSYW5kb21JRDsKICAgIG15ICRTZXJ2aWNlSUQgICA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlQWRkKAogICAgICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBDb21tZW50ID0+ICdVbml0IFRlc3QgQ29tbWVudCcsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICBUeXBlSUQgICAgICA9PiAkU2VydmljZVR5cGVOYW1lMklEe1RyYWluaW5nfSwKICAgICAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICkgfHwgZGllICJTZXJ2aWNlQWRkKCkgZXJyb3IuIjsKCiAgICBwdXNoIEBTZXJ2aWNlcywgewogICAgICAgIElEICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICBOYW1lID0+ICRTZXJ2aWNlTmFtZSwKICAgIH07CgogICAgIyBDcmVhdGUgdGVzdCBTTEFzLgogICAgbXkgJFNMQU5hbWUgPSAkSW5kZXggLiAnU0xBJyAuICRSYW5kb21JRDsKICAgIG15ICRTTEFJRCAgID0gJFNMQU9iamVjdC0+U0xBQWRkKAogICAgICAgIE5hbWUgICAgPT4gJFNMQU5hbWUsCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIENvbW1lbnQgPT4gJ1VuaXQgVGVzdCBDb21tZW50JywKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgIFR5cGVJRCA9PiAkU0xBVHlwZU5hbWUySUR7T3RoZXJ9LAojIC0tLQogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICkgfHwgZGllICJTTEFBZGQoKSBlcnJvci4iOwoKICAgIHB1c2ggQFNMQXMsIHsKICAgICAgICBJRCAgID0+ICRTTEFJRCwKICAgICAgICBOYW1lID0+ICRTTEFOYW1lLAogICAgfTsKCiAgICAjIENyZWF0ZSB0ZXN0IHN0YXRlcy4KICAgIG15ICRTdGF0ZU5hbWUgPSAkSW5kZXggLiAnU3RhdGUnIC4gJFJhbmRvbUlEOwogICAgbXkgJFN0YXRlSUQgICA9ICRTdGF0ZU9iamVjdC0+U3RhdGVBZGQoCiAgICAgICAgTmFtZSAgICA9PiAkU3RhdGVOYW1lLAogICAgICAgIENvbW1lbnQgPT4gJ1VuaXQgVGVzdCBDb21tZW50JywKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVHlwZUlEICA9PiAxLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICkgfHwgZGllICJTdGF0ZUFkZCgpIGVycm9yLiI7CgogICAgcHVzaCBAU3RhdGVzLCB7CiAgICAgICAgSUQgICA9PiAkU3RhdGVJRCwKICAgICAgICBOYW1lID0+ICRTdGF0ZU5hbWUsCiAgICB9OwoKICAgICMgQ3JlYXRlIHRlc3QgdHlwZXMuCiAgICBteSAkVHlwZU5hbWUgPSAkSW5kZXggLiAnVHlwZScgLiAkUmFuZG9tSUQ7CiAgICBteSAkVHlwZUlEICAgPSAkVHlwZU9iamVjdC0+VHlwZUFkZCgKICAgICAgICBOYW1lICAgID0+ICRUeXBlTmFtZSwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKSB8fCBkaWUgIlR5cGVBZGQoKSBlcnJvci4iOwoKICAgIHB1c2ggQFR5cGVzLCB7CiAgICAgICAgSUQgICA9PiAkVHlwZUlELAogICAgICAgIE5hbWUgPT4gJFR5cGVOYW1lLAogICAgfTsKfQoKIyBDcmVhdGUgdGVzdCBjYXNlcyBmb3IgZGlmZmVyZW50IGZ1bmN0aW9uIG91dGNvbWUuCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBRdWV1ZUlEICAgID0+ICRRdWV1ZXNbMF0tPntJRH0sCiAgICAgICAgUHJpb3JpdHlJRCA9PiAkUHJpb3JpdGllc1swXS0+e0lEfSwKICAgICAgICBTdGF0ZUlEICAgID0+ICRTdGF0ZXNbMF0tPntJRH0sCiAgICAgICAgU2VydmljZUlEICA9PiAkU2VydmljZXNbMF0tPntJRH0sCiAgICAgICAgU0xBSUQgICAgICA9PiAkU0xBc1syXS0+e0lEfSwKICAgICAgICBUeXBlSUQgICAgID0+ICRUeXBlc1swXS0+e0lEfSwKICAgIH0sCiAgICB7CiAgICAgICAgUXVldWVJRCAgICA9PiAkUXVldWVzWzFdLT57SUR9LAogICAgICAgIFByaW9yaXR5SUQgPT4gJFByaW9yaXRpZXNbMl0tPntJRH0sCiAgICAgICAgU3RhdGVJRCAgICA9PiAkU3RhdGVzWzFdLT57SUR9LAogICAgICAgIFNlcnZpY2VJRCAgPT4gJFNlcnZpY2VzWzFdLT57SUR9LAogICAgICAgIFNMQUlEICAgICAgPT4gJFNMQXNbMl0tPntJRH0sCiAgICAgICAgVHlwZUlEICAgICA9PiAkVHlwZXNbMV0tPntJRH0sCiAgICB9LAogICAgewogICAgICAgIFF1ZXVlSUQgICAgPT4gJFF1ZXVlc1syXS0+e0lEfSwKICAgICAgICBQcmlvcml0eUlEID0+ICRQcmlvcml0aWVzWzJdLT57SUR9LAogICAgICAgIFN0YXRlSUQgICAgPT4gJFN0YXRlc1swXS0+e0lEfSwKICAgICAgICBTZXJ2aWNlSUQgID0+ICRTZXJ2aWNlc1sxXS0+e0lEfSwKICAgICAgICBTTEFJRCAgICAgID0+ICRTTEFzWzJdLT57SUR9LAogICAgICAgIFR5cGVJRCAgICAgPT4gJFR5cGVzWzBdLT57SUR9LAogICAgfSwKICAgIHsKICAgICAgICBRdWV1ZUlEICAgID0+ICRRdWV1ZXNbMl0tPntJRH0sCiAgICAgICAgUHJpb3JpdHlJRCA9PiAkUHJpb3JpdGllc1swXS0+e0lEfSwKICAgICAgICBTdGF0ZUlEICAgID0+ICRTdGF0ZXNbMF0tPntJRH0sCiAgICAgICAgU2VydmljZUlEICA9PiAkU2VydmljZXNbMV0tPntJRH0sCiAgICAgICAgU0xBSUQgICAgICA9PiAkU0xBc1syXS0+e0lEfSwKICAgICAgICBUeXBlSUQgICAgID0+ICRUeXBlc1syXS0+e0lEfSwKICAgIH0sCiAgICB7CiAgICAgICAgUXVldWVJRCAgICA9PiAkUXVldWVzWzJdLT57SUR9LAogICAgICAgIFByaW9yaXR5SUQgPT4gJFByaW9yaXRpZXNbMl0tPntJRH0sCiAgICAgICAgU3RhdGVJRCAgICA9PiAkU3RhdGVzWzBdLT57SUR9LAogICAgICAgIFNlcnZpY2VJRCAgPT4gJFNlcnZpY2VzWzJdLT57SUR9LAogICAgICAgIFNMQUlEICAgICAgPT4gJFNMQXNbMl0tPntJRH0sCiAgICAgICAgVHlwZUlEICAgICA9PiAkVHlwZXNbMV0tPntJRH0sCiAgICB9LAogICAgewogICAgICAgIFF1ZXVlSUQgICAgPT4gJFF1ZXVlc1sxXS0+e0lEfSwKICAgICAgICBQcmlvcml0eUlEID0+ICRQcmlvcml0aWVzWzBdLT57SUR9LAogICAgICAgIFN0YXRlSUQgICAgPT4gJFN0YXRlc1sxXS0+e0lEfSwKICAgICAgICBTZXJ2aWNlSUQgID0+ICRTZXJ2aWNlc1swXS0+e0lEfSwKICAgICAgICBTTEFJRCAgICAgID0+ICRTTEFzWzJdLT57SUR9LAogICAgICAgIFR5cGVJRCAgICAgPT4gJFR5cGVzWzJdLT57SUR9LAogICAgfSwKICAgIHsKICAgICAgICBRdWV1ZUlEICAgID0+ICRRdWV1ZXNbMV0tPntJRH0sCiAgICAgICAgUHJpb3JpdHlJRCA9PiAkUHJpb3JpdGllc1swXS0+e0lEfSwKICAgICAgICBTdGF0ZUlEICAgID0+ICRTdGF0ZXNbMV0tPntJRH0sCiAgICAgICAgU2VydmljZUlEICA9PiAkU2VydmljZXNbMF0tPntJRH0sCiAgICAgICAgU0xBSUQgICAgICA9PiAkU0xBc1syXS0+e0lEfSwKICAgICAgICBUeXBlSUQgICAgID0+ICRUeXBlc1swXS0+e0lEfSwKICAgIH0sCiAgICB7CiAgICAgICAgUXVldWVJRCAgICA9PiAkUXVldWVzWzFdLT57SUR9LAogICAgICAgIFByaW9yaXR5SUQgPT4gJFByaW9yaXRpZXNbMl0tPntJRH0sCiAgICAgICAgU3RhdGVJRCAgICA9PiAkU3RhdGVzWzJdLT57SUR9LAogICAgICAgIFNlcnZpY2VJRCAgPT4gJFNlcnZpY2VzWzBdLT57SUR9LAogICAgICAgIFNMQUlEICAgICAgPT4gJFNMQXNbMl0tPntJRH0sCiAgICAgICAgVHlwZUlEICAgICA9PiAkVHlwZXNbMV0tPntJRH0sCiAgICB9LAogICAgewogICAgICAgIFF1ZXVlSUQgICAgPT4gJFF1ZXVlc1syXS0+e0lEfSwKICAgICAgICBQcmlvcml0eUlEID0+ICRQcmlvcml0aWVzWzJdLT57SUR9LAogICAgICAgIFN0YXRlSUQgICAgPT4gJFN0YXRlc1sxXS0+e0lEfSwKICAgICAgICBTZXJ2aWNlSUQgID0+ICRTZXJ2aWNlc1swXS0+e0lEfSwKICAgICAgICBTTEFJRCAgICAgID0+ICRTTEFzWzJdLT57SUR9LAogICAgICAgIFR5cGVJRCAgICAgPT4gJFR5cGVzWzBdLT57SUR9LAogICAgfSwKICAgIHsKICAgICAgICBRdWV1ZUlEICAgID0+ICRRdWV1ZXNbMF0tPntJRH0sCiAgICAgICAgUHJpb3JpdHlJRCA9PiAkUHJpb3JpdGllc1syXS0+e0lEfSwKICAgICAgICBTdGF0ZUlEICAgID0+ICRTdGF0ZXNbMF0tPntJRH0sCiAgICAgICAgU2VydmljZUlEICA9PiAkU2VydmljZXNbMF0tPntJRH0sCiAgICAgICAgU0xBSUQgICAgICA9PiAkU0xBc1syXS0+e0lEfSwKICAgICAgICBUeXBlSUQgICAgID0+ICRUeXBlc1syXS0+e0lEfSwKICAgIH0sCik7CgpteSAlRXhwZWN0ZWRSZXN1bHQ7CnVuZGVmIEBUaWNrZXRJRHM7CmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CiAgICBteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCiAgICAgICAgJXskVGVzdH0sCiAgICAgICAgVGl0bGUgICAgICAgID0+ICdVbml0IFRlc3QgdGlja2V0JywKICAgICAgICBDdXN0b21lck5vICAgPT4gJ1VuaXQgVGVzdCBjdXN0b21lcicsCiAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICd1bml0dGVzdEBvdHJzLmNvbScsCiAgICAgICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgIE93bmVySUQgICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKICAgIHB1c2ggQFRpY2tldElEcywgJFRpY2tldElEOwoKfQoKIyBDcmVhdGUgdGVzdCBleHBlY3RlZCBvdXRjb21lLgpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgQXR0cmlidXRlICAgICA9PiAnU2VydmljZScsCiAgICAgICAgRXhwZWN0ZWRDb3VudCA9PiB7CiAgICAgICAgICAgICRTZXJ2aWNlc1swXS0+e05hbWV9ID0+IDYsCiAgICAgICAgICAgICRTZXJ2aWNlc1sxXS0+e05hbWV9ID0+IDMsCiAgICAgICAgICAgICRTZXJ2aWNlc1syXS0+e05hbWV9ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgQXR0cmlidXRlICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICBFeHBlY3RlZENvdW50ID0+IHsKICAgICAgICAgICAgJFNlcnZpY2VzWzBdLT57SUR9ID0+IDYsCiAgICAgICAgICAgICRTZXJ2aWNlc1sxXS0+e0lEfSA9PiAzLAogICAgICAgICAgICAkU2VydmljZXNbMl0tPntJRH0gPT4gMSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBBdHRyaWJ1dGUgICAgID0+ICdTTEEnLAogICAgICAgIEV4cGVjdGVkQ291bnQgPT4gewogICAgICAgICAgICAkU0xBc1syXS0+e05hbWV9ID0+IDEwLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEF0dHJpYnV0ZSAgICAgPT4gJ1NMQUlEJywKICAgICAgICBFeHBlY3RlZENvdW50ID0+IHsKICAgICAgICAgICAgJFNMQXNbMl0tPntJRH0gPT4gMTAsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgQXR0cmlidXRlICAgICA9PiAnUXVldWUnLAogICAgICAgIEV4cGVjdGVkQ291bnQgPT4gewogICAgICAgICAgICAkUXVldWVzWzBdLT57TmFtZX0gPT4gMiwKICAgICAgICAgICAgJFF1ZXVlc1sxXS0+e05hbWV9ID0+IDQsCiAgICAgICAgICAgICRRdWV1ZXNbMl0tPntOYW1lfSA9PiA0LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEF0dHJpYnV0ZSAgICAgPT4gJ1F1ZXVlSUQnLAogICAgICAgIEV4cGVjdGVkQ291bnQgPT4gewogICAgICAgICAgICAkUXVldWVzWzBdLT57SUR9ID0+IDIsCiAgICAgICAgICAgICRRdWV1ZXNbMV0tPntJRH0gPT4gNCwKICAgICAgICAgICAgJFF1ZXVlc1syXS0+e0lEfSA9PiA0LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEF0dHJpYnV0ZSAgICAgPT4gJ1ByaW9yaXR5JywKICAgICAgICBFeHBlY3RlZENvdW50ID0+IHsKICAgICAgICAgICAgJFByaW9yaXRpZXNbMF0tPntOYW1lfSA9PiA0LAogICAgICAgICAgICAkUHJpb3JpdGllc1syXS0+e05hbWV9ID0+IDYsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgQXR0cmlidXRlICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgRXhwZWN0ZWRDb3VudCA9PiB7CiAgICAgICAgICAgICRQcmlvcml0aWVzWzBdLT57SUR9ID0+IDQsCiAgICAgICAgICAgICRQcmlvcml0aWVzWzJdLT57SUR9ID0+IDYsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgQXR0cmlidXRlICAgICA9PiAnU3RhdGUnLAogICAgICAgIEV4cGVjdGVkQ291bnQgPT4gewogICAgICAgICAgICAkU3RhdGVzWzBdLT57TmFtZX0gPT4gNSwKICAgICAgICAgICAgJFN0YXRlc1sxXS0+e05hbWV9ID0+IDQsCiAgICAgICAgICAgICRTdGF0ZXNbMl0tPntOYW1lfSA9PiAxLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEF0dHJpYnV0ZSAgICAgPT4gJ1N0YXRlSUQnLAogICAgICAgIEV4cGVjdGVkQ291bnQgPT4gewogICAgICAgICAgICAkU3RhdGVzWzBdLT57SUR9ID0+IDUsCiAgICAgICAgICAgICRTdGF0ZXNbMV0tPntJRH0gPT4gNCwKICAgICAgICAgICAgJFN0YXRlc1syXS0+e0lEfSA9PiAxLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEF0dHJpYnV0ZSAgICAgPT4gJ1R5cGUnLAogICAgICAgIEV4cGVjdGVkQ291bnQgPT4gewogICAgICAgICAgICAkVHlwZXNbMF0tPntOYW1lfSA9PiA0LAogICAgICAgICAgICAkVHlwZXNbMV0tPntOYW1lfSA9PiAzLAogICAgICAgICAgICAkVHlwZXNbMl0tPntOYW1lfSA9PiAzLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEF0dHJpYnV0ZSAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgRXhwZWN0ZWRDb3VudCA9PiB7CiAgICAgICAgICAgICRUeXBlc1swXS0+e0lEfSA9PiA0LAogICAgICAgICAgICAkVHlwZXNbMV0tPntJRH0gPT4gMywKICAgICAgICAgICAgJFR5cGVzWzJdLT57SUR9ID0+IDMsCiAgICAgICAgfSwKICAgIH0sCik7CgojIENoZWNrIHJlcXVpcmVkIHBhcmFtcy4KbXkgJFRpY2tldENvdW50ID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q291bnRCeUF0dHJpYnV0ZSgKICAgIFRpY2tldElEcyA9PiBcQFRpY2tldElEcywKKTsKJFNlbGYtPkZhbHNlKAogICAgJFRpY2tldENvdW50LAogICAgIlRpY2tldENvdW50QnlBdHRyaWJ1dGUoKSBuZWVkIEF0dHJpYnV0ZSBwYXJhbS4iCik7CiRUaWNrZXRDb3VudCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENvdW50QnlBdHRyaWJ1dGUoCiAgICBBdHRyaWJ1dGUgPT4gJ1NlcnZpY2UnLAogICAgVGlja2V0SURzID0+IFtdLAopOwokU2VsZi0+VHJ1ZSgKICAgICFJc0hhc2hSZWZXaXRoRGF0YSgkVGlja2V0Q291bnQpLAogICAgIlRpY2tldENvdW50QnlBdHRyaWJ1dGUoKSBuZWVkIFRpY2tldElEcyBhcnJheS4iCik7CgojIFJ1biB2YWxpZCB0ZXN0cy4KZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKICAgIG15ICRUaWNrZXRDb3VudCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENvdW50QnlBdHRyaWJ1dGUoCiAgICAgICAgQXR0cmlidXRlID0+ICRUZXN0LT57QXR0cmlidXRlfSwKICAgICAgICBUaWNrZXRJRHMgPT4gXEBUaWNrZXRJRHMsCiAgICApOwogICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICRUaWNrZXRDb3VudCwKICAgICAgICAkVGVzdC0+e0V4cGVjdGVkQ291bnR9LAogICAgICAgICJUaWNrZXRDb3VudEJ5QXR0cmlidXRlKCkgZm9yIEF0dHJpYnV0ZSAkVGVzdC0+e0F0dHJpYnV0ZX0gY29ycmVjdCwiCiAgICApOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA5ZWEwN2E5Nzk2MDMwODU0ZmJjN2NhNWYwNDJmNTUwMWMyZGRkZDliIC0gc2NyaXB0cy90ZXN0L1NlbGVuaXVtL0FnZW50L0FkbWluL0FkbWluQ3VzdG9tZXJVc2VyU2VydmljZS50CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICBteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiAgICAgICAgIyBEaXNhYmxlIGNoZWNrIGVtYWlsIGFkZHJlc3MuCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgICAgICBWYWx1ZSA9PiAwCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCBDdXN0b21lclVzZXIuCiAgICAgICAgbXkgJEN1c3RvbWVyVXNlck5hbWUgPSAiQ3VzdG9tZXJVc2VyIiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJEN1c3RvbWVyVXNlcklEICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyVXNlckFkZCgKICAgICAgICAgICAgVXNlckZpcnN0bmFtZSAgPT4gJEN1c3RvbWVyVXNlck5hbWUsCiAgICAgICAgICAgIFVzZXJMYXN0bmFtZSAgID0+ICRDdXN0b21lclVzZXJOYW1lLAogICAgICAgICAgICBVc2VyQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJVc2VyTmFtZSwKICAgICAgICAgICAgVXNlckxvZ2luICAgICAgPT4gJEN1c3RvbWVyVXNlck5hbWUsCiAgICAgICAgICAgIFVzZXJFbWFpbCAgICAgID0+ICRDdXN0b21lclVzZXJOYW1lIC4gJ0Bsb2NhbGhvc3QuY29tJywKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ3VzdG9tZXJVc2VySUQsCiAgICAgICAgICAgICJDdXN0b21lclVzZXJBZGQgLSAkQ3VzdG9tZXJVc2VySUQiLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgU2VydmljZS4KICAgICAgICBteSAkU2VydmljZU5hbWUgPSAnU29tZVNlcnZpY2UnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkU2VydmljZUlEICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnU29tZSBDb21tZW50JywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKIyAtLS0KICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VydmljZUlELAogICAgICAgICAgICAiU2VydmljZUFkZCAtICRTZXJ2aWNlSUQiLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgdXNlciBhbmQgbG9naW4uCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsnYWRtaW4nXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBOYXZpZ2F0ZSBBZG1pbkN1c3RvbWVyVXNlclNlcnZpY2Ugc2NyZWVuLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFkbWluQ3VzdG9tZXJVc2VyU2VydmljZSIpOwoKICAgICAgICAjIENoZWNrIG92ZXJ2aWV3IEFkbWluQ3VzdG9tZXJVc2VyU2VydmljZS4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNGaWx0ZXJTZXJ2aWNlcyIsICAgICAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0N1c3RvbWVyVXNlclNlYXJjaCIsICdjc3MnICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjQ3VzdG9tZXJzIiwgICAgICAgICAgJ2NzcycgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTZXJ2aWNlIiwgICAgICAgICAgICAnY3NzJyApOwoKICAgICAgICAjIENoZWNrIGJyZWFkY3J1bWIgb24gT3ZlcnZpZXcgc2NyZWVuLgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5CcmVhZENydW1iJywgJ2NzcycgKSwKICAgICAgICAgICAgIkJyZWFkY3J1bWIgaXMgZm91bmQgb24gT3ZlcnZpZXcgc2NyZWVuLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBUZXN0IHNlYXJjaCBmaWx0ZXIgZm9yIEN1c3RvbWVyVXNlci4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNDdXN0b21lclVzZXJTZWFyY2giLCAnY3NzJyApLT5jbGVhcigpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0N1c3RvbWVyVXNlclNlYXJjaCIsICdjc3MnICktPnNlbmRfa2V5cygkQ3VzdG9tZXJVc2VyTmFtZSk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAdmFsdWU9J1NlYXJjaCddW1xAdHlwZT0nc3VibWl0J10iKS0+VmVyaWZpZWRDbGljaygpOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJEN1c3RvbWVyVXNlck5hbWUgKSA+IC0xLAogICAgICAgICAgICAiQ3VzdG9tZXJVc2VyICRDdXN0b21lclVzZXJOYW1lIGZvdW5kIG9uIHBhZ2UiLAogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjQ3VzdG9tZXJVc2VyU2VhcmNoIiwgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB2YWx1ZT0nU2VhcmNoJ11bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgRmlsdGVyIGZvciBzZXJ2aWNlLiBJdCBpcyBhdXRvIGNvbXBsZXRlLCBzdWJtaXQgaXMgbm90IG5lY2Vzc2FyeS4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNGaWx0ZXJTZXJ2aWNlcyIsICdjc3MnICktPnNlbmRfa2V5cygkU2VydmljZU5hbWUpOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiRTZXJ2aWNlTmFtZSIsICdsaW5rX3RleHQnICktPmlzX2Rpc3BsYXllZCgpLAogICAgICAgICAgICAiJFNlcnZpY2VOYW1lIHNlcnZpY2UgZm91bmQgb24gcGFnZSIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNGaWx0ZXJTZXJ2aWNlcyIsICdjc3MnICktPmNsZWFyKCk7CgogICAgICAgICMgQWxsb2NhdGUgdGVzdCBzZXJ2aWNlIHRvIHRlc3QgY3VzdG9tZXIgdXNlci4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdDdXN0b21lclVzZXJMb2dpbj0kQ3VzdG9tZXJVc2VyTmFtZScgKV0iKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIENoZWNrIGJyZWFkY3J1bWIgb24gYWxsb2NhdGUgc2NyZWVuLgogICAgICAgIG15ICRDb3VudCA9IDE7CiAgICAgICAgbXkgJElzTGlua2VkQnJlYWRjcnVtYlRleHQ7CiAgICAgICAgZm9yIG15ICRCcmVhZGNydW1iVGV4dCAoCiAgICAgICAgICAgICdNYW5hZ2UgQ3VzdG9tZXIgVXNlci1TZXJ2aWNlcyBSZWxhdGlvbnMnLAogICAgICAgICAgICAnQWxsb2NhdGUgU2VydmljZXMgdG8gQ3VzdG9tZXIgVXNlciBcJycKICAgICAgICAgICAgLiAkQ3VzdG9tZXJVc2VyTmFtZSAuICcgJwogICAgICAgICAgICAuICRDdXN0b21lclVzZXJOYW1lIC4gJyAoJwogICAgICAgICAgICAuICRDdXN0b21lclVzZXJOYW1lIC4gJylcJycKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgicmV0dXJuIFwkKCcuQnJlYWRDcnVtYiBsaTplcSgkQ291bnQpJykudGV4dCgpLnRyaW0oKSIpLAogICAgICAgICAgICAgICAgJEJyZWFkY3J1bWJUZXh0LAogICAgICAgICAgICAgICAgIkJyZWFkY3J1bWIgdGV4dCAnJEJyZWFkY3J1bWJUZXh0JyBpcyBmb3VuZCBvbiBzY3JlZW4iCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQ291bnQrKzsKICAgICAgICB9CgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2lucHV0W1xAdmFsdWU9JyRTZXJ2aWNlSUQnXSIpLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2J1dHRvbltcQHZhbHVlPSdTYXZlJ11bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgQ2hlY2sgdGVzdCBjdXN0b21lciB1c2VyIGFsbG9jYXRpb24gdG8gdGVzdCBzZXJ2aWNlLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAkU2VydmljZU5hbWUsICdsaW5rX3RleHQnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9pbnB1dFtcQHZhbHVlPVwiJEN1c3RvbWVyVXNlck5hbWVcIl0iKS0+aXNfc2VsZWN0ZWQoKSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlNlcnZpY2UgJFNlcnZpY2VOYW1lIGlzIGFjdGl2ZSBmb3IgQ3VzdG9tZXJVc2VyICRDdXN0b21lclVzZXJOYW1lIiwKICAgICAgICApOwoKICAgICAgICAjIFJlbW92ZSB0ZXN0IGN1c3RvbWVyIHVzZXIgYWxsb2NhdGlvbnMgZnJvbSB0ZXN0IHNlcnZpY2UuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vaW5wdXRbXEB2YWx1ZT1cIiRDdXN0b21lclVzZXJOYW1lXCJdIiktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAdmFsdWU9J1NhdmUnXVtcQHR5cGU9J3N1Ym1pdCddIiktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBDaGVjayBpZiB0aGVyZSBpcyBhbnkgdGVzdCBzZXJ2aWNlIGFsbG9jYXRpb24gdG93YXJkcyB0ZXN0IGN1c3RvbWVyIHVzZXIKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdDdXN0b21lclVzZXJMb2dpbj0kQ3VzdG9tZXJVc2VyTmFtZScgKV0iKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2lucHV0W1xAdmFsdWU9JyRTZXJ2aWNlSUQnXSIpLT5pc19zZWxlY3RlZCgpLAogICAgICAgICAgICAwLAogICAgICAgICAgICAiU2VydmljZSAkU2VydmljZU5hbWUgaXMgbm90IGFjdGl2ZSBmb3IgQ3VzdG9tZXJVc2VyICRDdXN0b21lclVzZXJOYW1lIiwKICAgICAgICApOwoKICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAgICAgIyBEZWxldGUgY3JlYXRlZCB0ZXN0IGN1c3RvbWVyIHVzZXIuCiAgICAgICAgaWYgKCRTZXJ2aWNlSUQpIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBzZXJ2aWNlX2N1c3RvbWVyX3VzZXIgV0hFUkUgc2VydmljZV9pZCA9ICRTZXJ2aWNlSUQiLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIkRlbGV0ZWQgU2VydmljZUN1c3RvbWVyVXNlciAtICRTZXJ2aWNlTmFtZSA8PT4gJEN1c3RvbWVyVXNlck5hbWUiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gc2VydmljZSBXSEVSRSBpZCA9ID8iLAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkU2VydmljZUlEIF0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiRGVsZXRlZCBTZXJ2aWNlIC0gJFNlcnZpY2VOYW1lIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICgkQ3VzdG9tZXJVc2VySUQpIHsKICAgICAgICAgICAgJEN1c3RvbWVyVXNlck5hbWUgPSAkREJPYmplY3QtPlF1b3RlKCRDdXN0b21lclVzZXJOYW1lKTsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gY3VzdG9tZXJfdXNlciBXSEVSRSBjdXN0b21lcl9pZCA9ID8iLAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkQ3VzdG9tZXJVc2VyTmFtZSBdLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIkRlbGV0ZWQgQ3VzdG9tZXJVc2VyIC0gJEN1c3RvbWVyVXNlck5hbWUiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgICAgICMgTWFrZSBzdXJlIHRoZSBjYWNoZSBpcyBjb3JyZWN0LgogICAgICAgIGZvciBteSAkQ2FjaGUgKHF3KCBDdXN0b21lclVzZXIgU2VydmljZSApKSB7CiAgICAgICAgICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJENhY2hlLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgojIGdldCBzZWxlbml1bSBvYmplY3QKbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgIyBnZXQgaGVscGVyIG9iamVjdAogICAgICAgIG15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKICAgICAgICAjIGNyZWF0ZSBhbmQgbG9nIGluIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbJ2FkbWluJ10sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzY3JpcHQgYWxpYXMKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgbmF2aWdhdGUgdG8gQWRtaW5JVFNNQ0lQQWxsb2NhdGUgc2NyZWVuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWRtaW5JVFNNQ0lQQWxsb2NhdGUiKTsKCiAgICAgICAgIyBjaGVjayBmb3IgQ3JpdGljYWxpdHkg4oaUIEltcGFjdCBmaWVsZHMKICAgICAgICBteSBAUHJpb3JpdHkgPSAocXcoMXZlcnlsb3cgMmxvdyAzbm9ybWFsIDRoaWdoIDV2ZXJ5aGlnaCkpOwogICAgICAgIGZvciBteSAkSW1wYWN0IChAUHJpb3JpdHkpIHsKICAgICAgICAgICAgZm9yIG15ICRDcml0aWNhbGl0eSAoQFByaW9yaXR5KSB7CiAgICAgICAgICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1ByaW9yaXR5SUQkSW1wYWN0LSRDcml0aWNhbGl0eSIsICdjc3MnICk7CiAgICAgICAgICAgICAgICAkRWxlbWVudC0+aXNfZW5hYmxlZCgpOwogICAgICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSAwZTgyYzM4MzY5YTBhMWM4ZDg3M2IyMDAxMmZlNmEyNTVjNzFiYjE1IC0gc2NyaXB0cy90ZXN0L1NlbGVuaXVtL0FnZW50L0FkbWluL0FkbWluVXNlci50CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICBteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiAgICAgICAgIyBEbyBub3QgY2hlY2sgZW1haWwgYWRkcmVzc2VzLgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgICAgICAgICAgVmFsdWUgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIEVuYWJsZSBTZXJ2aWNlLgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdUaWNrZXQ6OlNlcnZpY2UnLAogICAgICAgICAgICBWYWx1ZSA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBOYXZpZ2F0ZSB0byBBZG1pblVzZXIgc2NyZWVuLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFkbWluVXNlciIpOwoKICAgICAgICAjIGNoZWNrIG92ZXJ2aWV3IEFkbWluVXNlcgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUiLCAgICAgICAgICAgICAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGhlYWQgdHIgdGgiLCAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGJvZHkgdHIgdGQiLCAnY3NzJyApOwoKICAgICAgICAjIENoZWNrIGJyZWFkY3J1bWIgb24gT3ZlcnZpZXcgc2NyZWVuLgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5CcmVhZENydW1iJywgJ2NzcycgKSwKICAgICAgICAgICAgIkJyZWFkY3J1bWIgaXMgZm91bmQgb24gT3ZlcnZpZXcgc2NyZWVuLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGVjayBmb3IgdGVzdCBhZ2VudCBpbiBBZG1pblVzZXIuCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkVGVzdFVzZXJMb2dpbiApID4gLTEsCiAgICAgICAgICAgICIkVGVzdFVzZXJMb2dpbiBmb3VuZCBvbiBwYWdlIiwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIHNlYXJjaCBmaWVsZC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTZWFyY2giLCAnY3NzJyApLT5zZW5kX2tleXMoJFRlc3RVc2VyTG9naW4pOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2J1dHRvbltcQHZhbHVlPSdTZWFyY2gnXVtcQHR5cGU9J3N1Ym1pdCddIiktPlZlcmlmaWVkQ2xpY2soKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICRUZXN0VXNlckxvZ2luICkgPiAtMSwKICAgICAgICAgICAgIiRUZXN0VXNlckxvZ2luIGZvdW5kIG9uIHBhZ2UiLAogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgYWRkIGFnZW50IHBhZ2UuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFkbWluVXNlcjtTdWJhY3Rpb249QWRkJyApXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgIGZvciBteSAkSUQgKAogICAgICAgICAgICBxdyhVc2VyRmlyc3RuYW1lIFVzZXJMYXN0bmFtZSBVc2VyTG9naW4gVXNlckVtYWlsKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiIyRJRCIsICdjc3MnICk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19lbmFibGVkKCk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19kaXNwbGF5ZWQoKTsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgYnJlYWRjcnVtYiBvbiBBZGQgc2NyZWVuLgogICAgICAgIG15ICRDb3VudCA9IDE7CiAgICAgICAgZm9yIG15ICRCcmVhZGNydW1iVGV4dCAoICdBZ2VudCBNYW5hZ2VtZW50JywgJ0FkZCBBZ2VudCcgKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnLkJyZWFkQ3J1bWIgbGk6ZXEoJENvdW50KScpLnRleHQoKS50cmltKCkiKSwKICAgICAgICAgICAgICAgICRCcmVhZGNydW1iVGV4dCwKICAgICAgICAgICAgICAgICJCcmVhZGNydW1iIHRleHQgJyRCcmVhZGNydW1iVGV4dCcgaXMgZm91bmQgb24gc2NyZWVuIgogICAgICAgICAgICApOwoKICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIGNsaWVudCBzaWRlIHZhbGlkYXRpb24uCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjVXNlckZpcnN0bmFtZSIsICdjc3MnICktPnNlbmRfa2V5cygiIik7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjU3VibWl0IiwgICAgICAgICdjc3MnICktPmNsaWNrKCk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNVc2VyRmlyc3RuYW1lJykuaGFzQ2xhc3MoJ0Vycm9yJykiCiAgICAgICAgICAgICksCiAgICAgICAgICAgICcxJywKICAgICAgICAgICAgJ0NsaWVudCBzaWRlIHZhbGlkYXRpb24gY29ycmVjdGx5IGRldGVjdGVkIG1pc3NpbmcgaW5wdXQgdmFsdWUnLAogICAgICAgICk7CgogICAgICAgICMgUmVsb2FkIHBhZ2UuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWRtaW5Vc2VyO1N1YmFjdGlvbj1BZGQiKTsKCiAgICAgICAgIyBDcmVhdGUgYSByZWFsIHRlc3QgYWdlbnQuCiAgICAgICAgbXkgJFJhbmRvbUlEICAgICA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFVzZXJSYW5kb21JRCA9ICdUZXN0QWdlbnQnIC4gJFJhbmRvbUlEOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1VzZXJGaXJzdG5hbWUiLCAnY3NzJyApLT5zZW5kX2tleXMoJFVzZXJSYW5kb21JRCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjVXNlckxhc3RuYW1lIiwgICdjc3MnICktPnNlbmRfa2V5cygkVXNlclJhbmRvbUlEKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNVc2VyTG9naW4iLCAgICAgJ2NzcycgKS0+c2VuZF9rZXlzKCRVc2VyUmFuZG9tSUQpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1VzZXJFbWFpbCIsICAgICAnY3NzJyApLT5zZW5kX2tleXMoICRVc2VyUmFuZG9tSUQgLiAnQGxvY2FsaG9zdC5jb20nICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjU3VibWl0IiwgICAgICAgICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBUZXN0IHNlYXJjaCBmaWx0ZXIgYnkgYWdlbnQgJFVzZXJSYW5kb21JRC4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZG1pblVzZXIiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTZWFyY2giLCAnY3NzJyApLT5jbGVhcigpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1NlYXJjaCIsICdjc3MnICktPnNlbmRfa2V5cygkVXNlclJhbmRvbUlEKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB2YWx1ZT0nU2VhcmNoJ11bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgRWRpdCByZWFsIHRlc3QgYWdlbnQgdmFsdWVzLgogICAgICAgIG15ICRFZGl0UmFuZG9tSUQgPSAnRWRpdGVkVGVzdEFnZW50JyAuICRSYW5kb21JRDsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJFVzZXJSYW5kb21JRCwgJ2xpbmtfdGV4dCcgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIENoZWNrIGJyZWFkY3J1bWIgb24gRWRpdCBzY3JlZW4uCiAgICAgICAgJENvdW50ID0gMTsKICAgICAgICBmb3IgbXkgJEJyZWFkY3J1bWJUZXh0ICggJ0FnZW50IE1hbmFnZW1lbnQnLCAnRWRpdCBBZ2VudDogJyAuICRVc2VyUmFuZG9tSUQgKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnLkJyZWFkQ3J1bWIgbGk6ZXEoJENvdW50KScpLnRleHQoKS50cmltKCkiKSwKICAgICAgICAgICAgICAgICRCcmVhZGNydW1iVGV4dCwKICAgICAgICAgICAgICAgICJCcmVhZGNydW1iIHRleHQgJyRCcmVhZGNydW1iVGV4dCcgaXMgZm91bmQgb24gc2NyZWVuIgogICAgICAgICAgICApOwoKICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgfQoKICAgICAgICAjIEVkaXQgc29tZSB2YWx1ZXMuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjVXNlckZpcnN0bmFtZSIsICdjc3MnICktPmNsZWFyKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjVXNlckZpcnN0bmFtZSIsICdjc3MnICktPnNlbmRfa2V5cygkRWRpdFJhbmRvbUlEKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNVc2VyTGFzdG5hbWUiLCAgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNVc2VyTGFzdG5hbWUiLCAgJ2NzcycgKS0+c2VuZF9rZXlzKCRFZGl0UmFuZG9tSUQpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1N1Ym1pdCIsICAgICAgICAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgQ2hlY2sgaXMgdGhlcmUgbm90aWZpY2F0aW9uIGFmdGVyIGFnZW50IGlzIHVwZGF0ZWQuCiAgICAgICAgbXkgJE5vdGlmaWNhdGlvbiA9ICdBZ2VudCB1cGRhdGVkISc7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnLk1lc3NhZ2VCb3guTm90aWNlIHA6Y29udGFpbnMoJE5vdGlmaWNhdGlvbiknKS5sZW5ndGgiKSwKICAgICAgICAgICAgIiROb3RpZmljYXRpb24gLSBub3RpZmljYXRpb24gaXMgZm91bmQuIgogICAgICAgICk7CgogICAgICAgICMgVGVzdCBzZWFyY2ggZmlsdGVyIGJ5IGFnZW50ICRFZGl0UmFuZG9tSUQuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjU2VhcmNoIiwgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTZWFyY2giLCAnY3NzJyApLT5zZW5kX2tleXMoJEVkaXRSYW5kb21JRCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAdmFsdWU9J1NlYXJjaCddW1xAdHlwZT0nc3VibWl0J10iKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIENoZWNrIG5ldyBhZ2VudCB2YWx1ZXMuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICRVc2VyUmFuZG9tSUQsICdsaW5rX3RleHQnICktPlZlcmlmaWVkQ2xpY2soKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI1VzZXJGaXJzdG5hbWUnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgJEVkaXRSYW5kb21JRCwKICAgICAgICAgICAgIiNVc2VyRmlyc3RuYW1lIHN0b3JlZCB2YWx1ZSIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI1VzZXJMYXN0bmFtZScsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAkRWRpdFJhbmRvbUlELAogICAgICAgICAgICAiI1VzZXJMYXN0bmFtZSBzdG9yZWQgdmFsdWUiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNVc2VyTG9naW4nLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgJFVzZXJSYW5kb21JRCwKICAgICAgICAgICAgIiNVc2VyTG9naW4gc3RvcmVkIHZhbHVlIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjVXNlckVtYWlsJywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICIkVXNlclJhbmRvbUlEXEBsb2NhbGhvc3QuY29tIiwKICAgICAgICAgICAgIiNVc2VyRW1haWwgc3RvcmVkIHZhbHVlIiwKICAgICAgICApOwoKICAgICAgICAjIFNldCBhZGRlZCB0ZXN0IGFnZW50IHRvIGludmFsaWQuCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJyNWYWxpZElEJykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTdWJtaXQiLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgVGVzdCBzZWFyY2ggZmlsdGVyIGJ5IGFnZW50ICRVc2VyUmFuZG9tSUQuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjU2VhcmNoIiwgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTZWFyY2giLCAnY3NzJyApLT5zZW5kX2tleXMoJFVzZXJSYW5kb21JRCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAdmFsdWU9J1NlYXJjaCddW1xAdHlwZT0nc3VibWl0J10iKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIENoZWNrIGNsYXNzIG9mIGludmFsaWQgQWdlbnQgaW4gdGhlIG92ZXJ2aWV3IHRhYmxlLgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggInRyLkludmFsaWQiLCAnY3NzJyApLAogICAgICAgICAgICAiVGhlcmUgaXMgYSBjbGFzcyAnSW52YWxpZCcgZm9yIHRlc3QgQWdlbnQiLAogICAgICAgICk7CgogICAgICAgICMgVGVzdGluZyBidWcjMTM0NjMgKGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM0NjMpLAogICAgICAgICMgICB1cGRhdGluZyBBZ2VudCBkYXRhLCByZW1vdmVzIGl0J3MgJ015IFF1ZXVlJyBhbmQgJ015IFNlcnZpY2VzJyBwcmVmZXJlbmNlcy4KICAgICAgICBteSAkUXVldWVOYW1lID0gJ1Rlc3RRdWV1ZScgLiAkUmFuZG9tSUQ7CiAgICAgICAgbXkgJFF1ZXVlSUQgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUFkZCgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgID0+ICRRdWV1ZU5hbWUsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICA9PiAxLAogICAgICAgICAgICBHcm91cElEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgU3lzdGVtQWRkcmVzc0lEID0+IDEsCiAgICAgICAgICAgIFNhbHV0YXRpb25JRCAgICA9PiAxLAogICAgICAgICAgICBTaWduYXR1cmVJRCAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICA9PiAnU2VsZW5pdW0gVGVzdCcsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFF1ZXVlSUQsCiAgICAgICAgICAgICJRdWV1ZUlEICRRdWV1ZUlEIGlzIGNyZWF0ZWQuIiwKICAgICAgICApOwoKICAgICAgICBteSAkU2VydmljZU5hbWUgPSAnVGVzdFNlcnZpY2UnIC4gJFJhbmRvbUlEOwogICAgICAgIG15ICRTZXJ2aWNlSUQgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VBZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlcnZpY2VOYW1lLAogICAgICAgICAgICBDb21tZW50ID0+ICdTZWxlbml1bSBUZXN0JywKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VydmljZUlELAogICAgICAgICAgICAiU2VydmljZUlEICRTZXJ2aWNlSUQgaXMgY3JlYXRlZC4iCiAgICAgICAgKTsKCiAgICAgICAgIyBOYXZpZ2F0ZSB0byBBZ2VudFByZWZlcmVuY2VzIG5vdGlmaWNhdGlvbiBzZXR0aW5nIHNjcmVlbi4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KAogICAgICAgICAgICAiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRQcmVmZXJlbmNlcztTdWJhY3Rpb249R3JvdXA7R3JvdXA9Tm90aWZpY2F0aW9uU2V0dGluZ3MiCiAgICAgICAgKTsKCiAgICAgICAgIyBTZWxlY3QgdGVzdCBjcmVhdGVkIFF1ZXVlIGFzICdNeSBRdWV1ZScgYW5kIHVwZGF0ZSBwcmVmZXJlbmNlLgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1F1ZXVlSUQnKS52YWwoJyRRdWV1ZUlEJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNRdWV1ZUlEJykuY2xvc2VzdCgnLldpZGdldFNpbXBsZScpLmZpbmQoJy5TZXR0aW5nVXBkYXRlQm94JykuZmluZCgnYnV0dG9uJykudHJpZ2dlcignY2xpY2snKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBXYWl0IGZvciB0aGUgQUpBWCBjYWxsIHRvIGZpbmlzaC4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1F1ZXVlSUQnKS5jbG9zZXN0KCcuV2lkZ2V0U2ltcGxlJykuaGFzQ2xhc3MoJ0hhc092ZXJsYXknKSIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgInJldHVybiAhXCQoJyNRdWV1ZUlEJykuY2xvc2VzdCgnLldpZGdldFNpbXBsZScpLmhhc0NsYXNzKCdIYXNPdmVybGF5JykiCiAgICAgICAgKTsKCiAgICAgICAgIyBTZWxlY3QgdGVzdCBjcmVhdGVkIFNlcnZpY2UgYXMgJ015IFNlcnZpY2UnIGFuZCB1cGRhdGUgcHJlZmVyZW5jZS4KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNTZXJ2aWNlSUQnKS52YWwoJyRTZXJ2aWNlSUQnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1NlcnZpY2VJRCcpLmNsb3Nlc3QoJy5XaWRnZXRTaW1wbGUnKS5maW5kKCcuU2V0dGluZ1VwZGF0ZUJveCcpLmZpbmQoJ2J1dHRvbicpLnRyaWdnZXIoJ2NsaWNrJyk7IgogICAgICAgICk7CgogICAgICAgICMgV2FpdCBmb3IgdGhlIEFKQVggY2FsbCB0byBmaW5pc2guCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNTZXJ2aWNlSUQnKS5jbG9zZXN0KCcuV2lkZ2V0U2ltcGxlJykuaGFzQ2xhc3MoJ0hhc092ZXJsYXknKSIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgInJldHVybiAhXCQoJyNTZXJ2aWNlSUQnKS5jbG9zZXN0KCcuV2lkZ2V0U2ltcGxlJykuaGFzQ2xhc3MoJ0hhc092ZXJsYXknKSIKICAgICAgICApOwoKICAgICAgICAjIFJlZnJlc2ggc2NyZWVuLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRSZWZyZXNoKCk7CgogICAgICAgICMgVmVyaWZ5IHNlbGVjdGVkICdNeSBRdWV1ZScgYW5kICdNeSBTZXJ2aWNlJyBwcmVmZXJlbmNlIHZhbHVlcy4KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnI1F1ZXVlSUQgOnNlbGVjdGVkJykudGV4dCgpLnRyaW0oKSIpLAogICAgICAgICAgICAkUXVldWVOYW1lLAogICAgICAgICAgICAiU2VsZWN0ZWQgUXVldWUgJyRRdWV1ZU5hbWUnIGlzIGluICdNeSBRdWV1ZSciLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJyNTZXJ2aWNlSUQgOnNlbGVjdGVkJykudGV4dCgpLnRyaW0oKSIpLAogICAgICAgICAgICAkU2VydmljZU5hbWUsCiAgICAgICAgICAgICJTZWxlY3RlZCBTZXJ2aWNlICckU2VydmljZU5hbWUnIGlzIGluICdNeSBTZXJ2aWNlcyciLAogICAgICAgICk7CgogICAgICAgICMgTmF2aWdhdGUgdG8gQWRtaW5Vc2VyIHNjcmVlbi4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZG1pblVzZXIiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJFRlc3RVc2VyTG9naW4sICdsaW5rX3RleHQnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBTdWJtaXQgbm90IGNoYW5nZWQgQWdlbnQgZGF0YS4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTdWJtaXQiLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgTmF2aWdhdGUgdG8gQWdlbnRQcmVmZXJlbmNlcyBub3RpZmljYXRpb24gc2V0dGluZyBzY3JlZW4uCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgKICAgICAgICAgICAgIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50UHJlZmVyZW5jZXM7U3ViYWN0aW9uPUdyb3VwO0dyb3VwPU5vdGlmaWNhdGlvblNldHRpbmdzIgogICAgICAgICk7CgogICAgICAgICMgVmVyaWZ5ICdNeSBRdWV1ZScgYW5kICdNeSBTZXJ2aWNlJyB2YWx1ZXMgYXJlIG5vdCBtb2RpZmllZC4KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnI1F1ZXVlSUQgOnNlbGVjdGVkJykudGV4dCgpLnRyaW0oKSIpLAogICAgICAgICAgICAkUXVldWVOYW1lLAogICAgICAgICAgICAiU2VsZWN0ZWQgUXVldWUgJyRRdWV1ZU5hbWUnIGlzIGluICdNeSBRdWV1ZSciLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJyNTZXJ2aWNlSUQgOnNlbGVjdGVkJykudGV4dCgpLnRyaW0oKSIpLAogICAgICAgICAgICAkU2VydmljZU5hbWUsCiAgICAgICAgICAgICJTZWxlY3RlZCBTZXJ2aWNlICckU2VydmljZU5hbWUnIGlzIGluICdNeSBTZXJ2aWNlcyciLAogICAgICAgICk7CgogICAgICAgICMgRGVsZXRlIFF1ZXVlLgogICAgICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgICAgIG15ICRTdWNjZXNzICA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gcGVyc29uYWxfcXVldWVzIFdIRVJFIHF1ZXVlX2lkID0gJFF1ZXVlSUQiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiRGVsZXRlIHBlcnNvbmFsIHF1ZXVlcyAtICRRdWV1ZUlEIiwKICAgICAgICApOwogICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBxdWV1ZSBXSEVSRSBpZCA9ICRRdWV1ZUlEIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkRlbGV0ZSBRdWV1ZSAtICRRdWV1ZUlEIiwKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZSBTZXJ2aWNlLgogICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBwZXJzb25hbF9zZXJ2aWNlcyBXSEVSRSBzZXJ2aWNlX2lkID0gJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJEZWxldGUgcGVyc29uYWwgc2VydmljZXMgLSAkU2VydmljZUlEIiwKICAgICAgICApOwogICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBzZXJ2aWNlIFdIRVJFIGlkID0gJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJEZWxldGUgU2VydmljZSAtICRTZXJ2aWNlSUQiLAogICAgICAgICk7CgogICAgICAgICMgTWFrZSBzdXJlIHRoZSBjYWNoZSBpcyBjb3JyZWN0LgogICAgICAgIGZvciBteSAkQ2FjaGUgKHF3KFF1ZXVlIFNlcnZpY2UpKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgICAgICAgICAgVHlwZSA9PiAkQ2FjaGUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgIH0KCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSBiZDVmYTFiYWZkM2Y5NmNhY2EwODRjMzRiZmI5ZWEzZjk1YjU5YzBhIC0gc2NyaXB0cy90ZXN0L1NlbGVuaXVtL0FnZW50L0FnZW50U3RhdGlzdGljcy9BZGQudAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgbXkgJEhlbHBlciAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKTsKICAgICAgICBteSAkU0xBT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTTEEnKTsKICAgICAgICBteSAkU3RhdHNPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0cycpOwogICAgICAgIG15ICRDb25maWdPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnVGlja2V0OjpTZXJ2aWNlJywKICAgICAgICAgICAgVmFsdWUgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSBAU2VydmljZUlEczsKICAgICAgICBteSBAU0xBSURzOwoKICAgICAgICAjIEFkZCB0ZXN0IHNlcnZpY2VzIGFuZCBTTEFzLgogICAgICAgIGZvciAoIDEgLi4gNSApIHsKICAgICAgICAgICAgbXkgJFNlcnZpY2VJRCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlQWRkKAogICAgICAgICAgICAgICAgTmFtZSAgICA9PiAiVGVzdFNlcnZpY2UgLSAiIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgICJTZXJ2aWNlICRTZXJ2aWNlSUQgaGFzIGJlZW4gY3JlYXRlZC4iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAnPERFRkFVTFQ+JywKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBBY3RpdmUgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBAU2VydmljZUlEcywgJFNlcnZpY2VJRDsKCiAgICAgICAgICAgIG15ICRTTEFJRCA9ICRTTEFPYmplY3QtPlNMQUFkZCgKICAgICAgICAgICAgICAgIE5hbWUgICAgPT4gIlRlc3RTTEEgLSAiIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICAgICAgVHlwZUlEID0+IDEsCiMgLS0tCiAgICAgICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFNMQUlELAogICAgICAgICAgICAgICAgIlNMQSAkU0xBSUQgaGFzIGJlZW4gY3JlYXRlZC4iLAogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBTTEFJRHMsICRTTEFJRDsKCiAgICAgICAgfQoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHVzZXIgYW5kIGxvZ2luLgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycsICdzdGF0cycgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRDb25maWdPYmplY3QtPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBDaGVjayBhZGQgc3RhdGlzdGljcyBzY3JlZW4uCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRTdGF0aXN0aWNzO1N1YmFjdGlvbj1BZGQiKTsKCiAgICAgICAgZm9yIG15ICRTdGF0aXN0aWNzIChxdyhEeW5hbWljTWF0cml4IER5bmFtaWNMaXN0IFN0YXRpYykpIHsKICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgICAgICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnYVtkYXRhLXN0YXRpc3RpYy1wcmVzZWxlY3Rpb249JFN0YXRpc3RpY3NdJykubGVuZ3RoIgogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnYVtkYXRhLXN0YXRpc3RpYy1wcmVzZWxlY3Rpb249JFN0YXRpc3RpY3NdJykubGVuZ3RoIiksCiAgICAgICAgICAgICAgICAiVGhlcmUgaXMgYSBsaW5rIGZvciBhZGRpbmcgJyRTdGF0aXN0aWNzJyBzdGF0aXN0aWNzIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15IEBUZXN0cyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICA9PiAnU3RhdGlzdGljIER5bmFtaWNNYXRyaXgnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKSwKICAgICAgICAgICAgICAgIE9iamVjdCAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6VGlja2V0JywKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgPT4gJ0R5bmFtaWNNYXRyaXgnLAogICAgICAgICAgICAgICAgWEF4aXMgICAgICAgICAgICA9PiAnWEF4aXNTZXJ2aWNlSURzJywKICAgICAgICAgICAgICAgIFlBeGlzICAgICAgICAgICAgPT4gJ1lBeGlzU0xBSURzJywKICAgICAgICAgICAgICAgIFJlc3RyaWN0aW9uSUQgICAgPT4gJ1Jlc3RyaWN0aW9uc1F1ZXVlSURzJywKICAgICAgICAgICAgICAgIFJlc3RyaWN0aW9udmFsdWUgPT4gMywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgPT4gJ1N0YXRpc3RpYyBEeW5hbWljTWF0cml4JyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCksCiAgICAgICAgICAgICAgICBPYmplY3QgICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlN0YXRzOjpEeW5hbWljOjpUaWNrZXQnLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgPT4gJ0R5bmFtaWNNYXRyaXgnLAogICAgICAgICAgICAgICAgWEF4aXMgICAgICAgICAgICAgPT4gJ1hBeGlzQ3JlYXRlVGltZScsCiAgICAgICAgICAgICAgICBZQXhpcyAgICAgICAgICAgICA9PiAnWUF4aXNTTEFJRHMnLAogICAgICAgICAgICAgICAgUmVzdHJpY3Rpb25JRCAgICAgPT4gJ1Jlc3RyaWN0aW9uc1F1ZXVlSURzJywKICAgICAgICAgICAgICAgIFJlc3RyaWN0aW9udmFsdWUgID0+IDMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZFRpbWVGaWVsZCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICAgID0+ICdTdGF0aXN0aWMgLSBUaWNrZXRBY2NvdW50ZWRUaW1lJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCksCiAgICAgICAgICAgICAgICBPYmplY3QgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OlRpY2tldEFjY291bnRlZFRpbWUnLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICA9PiAnRHluYW1pY01hdHJpeCcsCiAgICAgICAgICAgICAgICBYQXhpcyAgICAgICAgICAgID0+ICdYQXhpc0tpbmRzT2ZSZXBvcnRpbmcnLAogICAgICAgICAgICAgICAgWUF4aXMgICAgICAgICAgICA9PiAnWUF4aXNTTEFJRHMnLAogICAgICAgICAgICAgICAgUmVzdHJpY3Rpb25JRCAgICA9PiAnUmVzdHJpY3Rpb25zU2VydmljZUlEcycsCiAgICAgICAgICAgICAgICBSZXN0cmljdGlvbnZhbHVlID0+ICRTZXJ2aWNlSURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICAgID0+ICdTdGF0aXN0aWMgLSBUaWNrZXRTb2x1dGlvblJlc3BvbnNlVGltZScgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpLAogICAgICAgICAgICAgICAgT2JqZWN0ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlN0YXRzOjpEeW5hbWljOjpUaWNrZXRTb2x1dGlvblJlc3BvbnNlVGltZScsCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgID0+ICdEeW5hbWljTWF0cml4JywKICAgICAgICAgICAgICAgIFhBeGlzICAgICAgICAgICAgPT4gJ1hBeGlzS2luZHNPZlJlcG9ydGluZycsCiAgICAgICAgICAgICAgICBZQXhpcyAgICAgICAgICAgID0+ICdZQXhpc1NMQUlEcycsCiAgICAgICAgICAgICAgICBSZXN0cmljdGlvbklEICAgID0+ICdSZXN0cmljdGlvbnNTZXJ2aWNlSURzJywKICAgICAgICAgICAgICAgIFJlc3RyaWN0aW9udmFsdWUgPT4gJFNlcnZpY2VJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgPT4gJ1N0YXRpc3RpYyAtIFRpY2tldExpc3QnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKSwKICAgICAgICAgICAgICAgIE9iamVjdCAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6VGlja2V0TGlzdCcsCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgID0+ICdEeW5hbWljTGlzdCcsCiAgICAgICAgICAgICAgICBZQXhpcyAgICAgICAgICAgID0+ICdZQXhpc09yZGVyQnknLAogICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiAnVGlja2V0TnVtYmVyJywKICAgICAgICAgICAgICAgIFJlc3RyaWN0aW9uSUQgICAgPT4gJ1Jlc3RyaWN0aW9uc1NlcnZpY2VJRHMnLAogICAgICAgICAgICAgICAgUmVzdHJpY3Rpb252YWx1ZSA9PiAkU2VydmljZUlEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSBAU3RhdHNGb3JtYXREeW5hbWljTWF0cml4ID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGb3JtYXQgICAgICAgICA9PiAnUHJpbnQnLAogICAgICAgICAgICAgICAgUHJldmlld0NvbnRlbnQgPT4gJ1ByZXZpZXdDb250ZW50UHJpbnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGb3JtYXQgICAgICAgICA9PiAnRDM6OlN0YWNrZWRBcmVhQ2hhcnQnLAogICAgICAgICAgICAgICAgUHJldmlld0NvbnRlbnQgPT4gJ1ByZXZpZXdDb250ZW50RDNTdGFja2VkQXJlYUNoYXJ0JywKCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZvcm1hdCAgICAgICAgID0+ICdEMzo6TGluZUNoYXJ0JywKICAgICAgICAgICAgICAgIFByZXZpZXdDb250ZW50ID0+ICdQcmV2aWV3Q29udGVudEQzTGluZUNoYXJ0JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgPT4gJ0QzOjpCYXJDaGFydCcsCiAgICAgICAgICAgICAgICBQcmV2aWV3Q29udGVudCA9PiAnUHJldmlld0NvbnRlbnREM0JhckNoYXJ0JywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSBAU3RhdHNGb3JtYXREeW5hbWljTGlzdCA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgPT4gJ1ByaW50JywKICAgICAgICAgICAgICAgIFByZXZpZXdDb250ZW50ID0+ICdQcmV2aWV3Q29udGVudFByaW50JywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIEFkZCBuZXcgc3RhdGlzdGljcy4KICAgICAgICBmb3IgbXkgJFN0YXRzRGF0YSAoQFRlc3RzKSB7CgogICAgICAgICAgICAjIEdvIHRvIGFkZCBzdGF0aXN0aWNzIHNjcmVlbi4KICAgICAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRTdGF0aXN0aWNzO1N1YmFjdGlvbj1BZGQiKTsKCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBkYXRhLXN0YXRpc3RpYy1wcmVzZWxlY3Rpb24sIFwnJFN0YXRzRGF0YS0+e1R5cGV9XCcgKV0iKS0+Y2xpY2soKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNUaXRsZSIpLmxlbmd0aCcgKTsKCiAgICAgICAgICAgICMgQ2hlY2sgdGl0bGUgb2YgdGhlIHBhZ2UgKHNlZSBidWcgIzEzOTQyKQogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmdldF90aXRsZSgpLAogICAgICAgICAgICAgICAgJ0FkZCBOZXcgU3RhdGlzdGljIC0gU3RhdGlzdGljcyAtICcgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Byb2R1Y3ROYW1lJyksCiAgICAgICAgICAgICAgICAiQ2hlY2sgdGl0bGUgb2YgdGhlIHBhZ2UiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBTZXQgdmFsdWVzIGZvciBuZXcgc3RhdGlzdGljcyAtIEdlbmVyYWwgU3BlY2lmaWNhdGlvbnMuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1RpdGxlIiwgJ2NzcycgKS0+c2VuZF9rZXlzKCAkU3RhdHNEYXRhLT57VGl0bGV9ICk7CiAgICAgICAgICAgIG15ICREZXNjcmlwdGlvbiA9ICdEZXNjcmlwdGlvbiAnIC4gJFN0YXRzRGF0YS0+e1RpdGxlfTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRGVzY3JpcHRpb24iLCAnY3NzJyApLT5zZW5kX2tleXMoJERlc2NyaXB0aW9uKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJcJCgnI09iamVjdE1vZHVsZScpLnZhbCgnJFN0YXRzRGF0YS0+e09iamVjdH0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAdmFsdWU9J1NhdmUnXVtcQHR5cGU9J3N1Ym1pdCddIiktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgICAgICMgQ2hlY2sgWC1heGlzIGNvbmZpZ3VyYXRpb24gZGlhbG9nLgogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5FZGl0WEF4aXMiLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiLkRpYWxvZy5Nb2RhbCIpLmxlbmd0aCAmJiAkKCIjRGlhbG9nQnV0dG9uMSIpLmxlbmd0aCcKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFN0YXRzRGF0YS0+e09iamVjdH0gbmUgJ0tlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6VGlja2V0TGlzdCcgKSB7CiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgICAgICJcJCgnI0VkaXREaWFsb2cgc2VsZWN0JykudmFsKCckU3RhdHNEYXRhLT57WEF4aXN9JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgU2V0IGludmFsaWQgZGF0ZSBmb3IgQ3JlYXRlVGltZSAoMzEuMDYuKS4KICAgICAgICAgICAgICAgICMgU2VlIGJ1ZyAjMTM5MzggKGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM5MzgpLgogICAgICAgICAgICAgICAgaWYgKCAkU3RhdHNEYXRhLT57WEF4aXN9IGVxICdYQXhpc0NyZWF0ZVRpbWUnICkgewogICAgICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAgICAgICAgICJcJCgnI1hBeGlzQ3JlYXRlVGltZVN0b3BNb250aCcpLnZhbCgnNicpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICAgICAgICAgIlwkKCcjWEF4aXNDcmVhdGVUaW1lU3RvcERheScpLnZhbCgnMzEnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0RpYWxvZ0J1dHRvbjEiLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2cuTW9kYWwiKS5sZW5ndGgnICk7CgogICAgICAgICAgICAjIENoZWNrIGVycm9yIG1lc3NhZ2UgaWYgdGhlcmUgaXMgc2V0IHdyb25nIGludmFsaWQgZGF0ZSBmb3IgeC1heGlzCiAgICAgICAgICAgIGlmICggJFN0YXRzRGF0YS0+e1hBeGlzfSBlcSAnWEF4aXNDcmVhdGVUaW1lJyApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJy5QcmV2aWV3IHAuRXJyb3InKS50ZXh0KCkudHJpbSgpIiksCiAgICAgICAgICAgICAgICAgICAgIkNyZWF0ZVRpbWU6IFRoZSBzZWxlY3RlZCBkYXRlIGlzIG5vdCB2YWxpZC4iLAogICAgICAgICAgICAgICAgICAgICJUaGVyZSBpcyBtZXNzYWdlIGZvciBpbnZhbGlkIGRhdGUgZm9yIENyZWF0ZVRpbWUiLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5FZGl0WEF4aXMiLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiLkRpYWxvZy5Nb2RhbCIpLmxlbmd0aCAmJiAkKCIjRGlhbG9nQnV0dG9uMSIpLmxlbmd0aCcKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICAgICAiXCQoJyNYQXhpc0NyZWF0ZVRpbWVTdG9wTW9udGgnKS52YWwoJzEyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICAgICAiXCQoJyNYQXhpc0NyZWF0ZVRpbWVTdG9wRGF5JykudmFsKCczMScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNEaWFsb2dCdXR0b24xIiwgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZy5Nb2RhbCIpLmxlbmd0aCcgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDaGVjayBZLWF4aXMgY29uZmlndXJhdGlvbiBkaWFsb2cuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLkVkaXRZQXhpcyIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIuRGlhbG9nLk1vZGFsIikubGVuZ3RoJyApOwogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiAkKCIjRWRpdERpYWxvZyBzZWxlY3QiKS5sZW5ndGggJiYgJCgiI0RpYWxvZ0J1dHRvbjEiKS5sZW5ndGgnICk7CgogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgIlwkKCcjRWRpdERpYWxvZyBzZWxlY3QnKS52YWwoJyRTdGF0c0RhdGEtPntZQXhpc30nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFN0YXRzRGF0YS0+e09iamVjdH0gZXEgJ0tlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6VGlja2V0TGlzdCcgKSB7CgogICAgICAgICAgICAgICAgIyBXYWl0IGZvciBsb2FkIHNlbGVjdGVkIFlBeGlzLgogICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjJFN0YXRzRGF0YS0+e1lBeGlzfScpLmxlbmd0aDsiCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgU2VsZWN0IG9yZGVyIGJ5IG9wdGlvbi4KICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAgICAgIlwkKCcjRWRpdERpYWxvZyAjJFN0YXRzRGF0YS0+e1lBeGlzfScpLnZhbCgnJFN0YXRzRGF0YS0+e09yZGVyQnl9JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0RpYWxvZ0J1dHRvbjEiLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2cuTW9kYWwiKS5sZW5ndGgnICk7CgogICAgICAgICAgICAjIENoZWNrIFJlc3RyaWN0aW9ucyBjb25maWd1cmF0aW9uIGRpYWxvZy4KICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuRWRpdFJlc3RyaWN0aW9ucyIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIuRGlhbG9nLk1vZGFsIikubGVuZ3RoICYmICQoIiNFZGl0RGlhbG9nIHNlbGVjdCIpLmxlbmd0aCcKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAiXCQoJyNFZGl0RGlhbG9nIHNlbGVjdCBvcHRpb25bdmFsdWU9XCIkU3RhdHNEYXRhLT57UmVzdHJpY3Rpb25JRH1cIl0nKS5wcm9wKCdzZWxlY3RlZCcsIHRydWUpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBXYWl0IGZvciBsb2FkIHNlbGVjdGVkIFJlc3RyaWN0aW9uLgogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnIyRTdGF0c0RhdGEtPntSZXN0cmljdGlvbklEfScpLmxlbmd0aDsiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIEFkZCByZXN0cmljdGlvbi4KICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJcJCgnI0VkaXREaWFsb2cgIyRTdGF0c0RhdGEtPntSZXN0cmljdGlvbklEfSBvcHRpb25bdmFsdWU9XCIkU3RhdHNEYXRhLT57UmVzdHJpY3Rpb252YWx1ZX1cIl0nKS5wcm9wKCdzZWxlY3RlZCcsIHRydWUpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNEaWFsb2dCdXR0b24xIiwgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nLk1vZGFsIikubGVuZ3RoJyApOwoKICAgICAgICAgICAgIyBDaGFuZ2UgcHJldmlldyBmb3JtYXQgdG8gUHJpbnQuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoIlwkKCdidXR0b25bZGF0YS1mb3JtYXQ9UHJpbnRdJykuY2xpY2soKSIpOwogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1ByZXZpZXdDb250ZW50UHJpbnQiKS5jc3MoImRpc3BsYXkiKSA9PT0gImJsb2NrIicKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgicmV0dXJuIFwkKCcjUHJldmlld0NvbnRlbnRQcmludCcpLmNzcygnZGlzcGxheScpIikgZXEgJ2Jsb2NrJywKICAgICAgICAgICAgICAgICJQcmludCBmb3JtYXQgaXMgZGlzcGxheWVkIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15IEBTdGF0c0Zvcm1hdCA9IEBTdGF0c0Zvcm1hdER5bmFtaWNNYXRyaXg7CgogICAgICAgICAgICBpZiAoICRTdGF0c0RhdGEtPntUeXBlfSBlcSAnRHluYW1pY0xpc3QnICkgewogICAgICAgICAgICAgICAgQFN0YXRzRm9ybWF0ID0gQFN0YXRzRm9ybWF0RHluYW1pY0xpc3Q7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciBteSAkU3RhdHNGb3JtYXQgKEBTdGF0c0Zvcm1hdCkgewoKICAgICAgICAgICAgICAgICMgQ2hhbmdlIHByZXZpZXcgZm9ybWF0LgogICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJ2J1dHRvbltkYXRhLWZvcm1hdD1cIiRTdGF0c0Zvcm1hdC0+e0Zvcm1hdH1cIl0nKS5jbGljaygpIik7CiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyMkU3RhdHNGb3JtYXQtPntQcmV2aWV3Q29udGVudH0nKS5jc3MoJ2Rpc3BsYXknKSA9PT0gJ2Jsb2NrJyIKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgicmV0dXJuIFwkKCcjJFN0YXRzRm9ybWF0LT57UHJldmlld0NvbnRlbnR9JykuY3NzKCdkaXNwbGF5JykiKSBlcSAnYmxvY2snLAogICAgICAgICAgICAgICAgICAgICJTdGFja2VkQXJlYSBmb3JtYXQgaXMgZGlzcGxheWVkIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ2hlY2sgdGhlIG9wdGlvbnMgZm9yIHRoZSBjYWNoZSBmaWVsZCBpbiB0aGUgZ2VuZXJhbCBzZWN0aW9uLgogICAgICAgICAgICBpZiAoICRTdGF0c0RhdGEtPntTZWxlY3RlZFRpbWVGaWVsZH0gKSB7CgogICAgICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICAgICAgICAgInJldHVybiBcJCgnI0NhY2hlIG9wdGlvblt2YWx1ZT1cIjFcIl0nKS52YWwoKSA9PSAxICYmIFwkKCcjQ2FjaGUgb3B0aW9uW3ZhbHVlPVwiMVwiXScpWzBdLmlubmVySFRNTCA9PSAnWWVzJyIKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICdGb3VuZCBlbGVtZW50ICJZZXMiIGluIENhY2hlIHRoZSBzZWxlY3QgZmllbGQuJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnI0NhY2hlIG9wdGlvblt2YWx1ZT1cIjFcIl0nKS52YWwoKSA9PSAxIiksCiAgICAgICAgICAgICAgICAgICAgJ0ZvdW5kIG5vIGVsZW1lbnQgIlllcyIgaW4gdGhlIENhY2hlIHNlbGVjdCBmaWVsZC4nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBTYXZlIGFuZCBmaW5pc2ggdGVzdCBzdGF0aXN0aWNzLgogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTYXZlQW5kRmluaXNoIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAgICAgIyBTb3J0IGRlY3JlYXNpbmcgYnkgU3RhdHNJRC4KICAgICAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgKICAgICAgICAgICAgICAgICIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudFN0YXRpc3RpY3M7U3ViYWN0aW9uPU92ZXJ2aWV3O0RpcmVjdGlvbj1ERVNDO09yZGVyQnk9SUQ7U3RhcnRIaXQ9MSIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgR2V0IHN0YXRzIElEcy4KICAgICAgICAgICAgbXkgJFN0YXRzSURzID0gJFN0YXRzT2JqZWN0LT5HZXRTdGF0c0xpc3QoCiAgICAgICAgICAgICAgICBBY2Nlc3NSdyA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRDb3VudCAgICAgICA9IHNjYWxhciBAeyRTdGF0c0lEc307CiAgICAgICAgICAgIG15ICRTdGF0c0lETGFzdCA9ICRTdGF0c0lEcy0+WyAkQ291bnQgLSAxIF07CgogICAgICAgICAgICAjIENoZWNrIGZvciBjcmVhdGVkIHN0YXRzIG9uIG92ZXJ2aWV3IHNjcmVlbi4KICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFN0YXRzRGF0YS0+e1RpdGxlfSApID4gLTEsCiAgICAgICAgICAgICAgICAiVGVzdCBzdGF0aXN0aWMgaXMgY3JlYXRlZCAtICRTdGF0c0RhdGEtPntUaXRsZX0gIgogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBEZWxldGUgY3JlYXRlZCB0ZXN0IHN0YXRpc3RpY3MuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KAogICAgICAgICAgICAgICAgIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50U3RhdGlzdGljcztTdWJhY3Rpb249RGVsZXRlQWN0aW9uO1N0YXRJRD0kU3RhdHNJRExhc3RcJyApXSIKICAgICAgICAgICAgKS0+Y2xpY2soKTsKCiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggQWxlcnRQcmVzZW50ID0+IDEgKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5hY2NlcHRfYWxlcnQoKTsKCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJBY3Rpb249QWdlbnRTdGF0aXN0aWNzO1N1YmFjdGlvbj1FZGl0O1N0YXRJRD0kU3RhdHNJRExhc3QiICkKICAgICAgICAgICAgICAgICAgICA9PSAtMSwKICAgICAgICAgICAgICAgICJTdGF0c0RhdGEgc3RhdGlzdGljIGlzIGRlbGV0ZWQgLSAkU3RhdHNEYXRhLT57VGl0bGV9ICIKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICAgICAjIENsZWFuIHVwIHRlc3QgZGF0YS4KICAgICAgICBmb3IgbXkgJFNMQUlEIChAU0xBSURzKSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gc2VydmljZV9zbGEgV0hFUkUgc2xhX2lkID0gJFNMQUlEIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJTZXJ2aWNlU2xhIC0gJFNMQUlEIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gc2xhIFdIRVJFIGlkID0gJFNMQUlEIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJTTEFEZWxldGUgLSAkU0xBSUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKEBTZXJ2aWNlSURzKSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gc2VydmljZV9jdXN0b21lcl91c2VyIFdIRVJFIHNlcnZpY2VfaWQgPSAkU2VydmljZUlEIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJTZXJ2aWNlQ3VzdG9tZXJVc2VyIGRlbGV0ZWQgLSAkU2VydmljZUlEIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gc2VydmljZSBXSEVSRSBpZCA9ICRTZXJ2aWNlSUQiLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIkRlbGV0ZWQgU2VydmljZSAtICRTZXJ2aWNlSUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgICAgICMgTWFrZSBzdXJlIHRoZSBjYWNoZSBpcyBjb3JyZWN0LgogICAgICAgIGZvciBteSAkQ2FjaGUgKAogICAgICAgICAgICBxdyAoU2VydmljZSBTTEEgU3RhdHMpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCggVHlwZSA9PiAkQ2FjaGUgKTsKICAgICAgICB9CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA5ZWEwN2E5Nzk2MDMwODU0ZmJjN2NhNWYwNDJmNTUwMWMyZGRkZDliIC0gc2NyaXB0cy90ZXN0L1NlbGVuaXVtL0FnZW50L0FnZW50U3RhdGlzdGljcy9JbXBvcnQudAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgbXkgJEhlbHBlciAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKTsKICAgICAgICBteSAkU0xBT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTTEEnKTsKCiAgICAgICAgbXkgJENvbmZpZyA9IHsKCiAgICAgICAgICAgICMgU2VydmljZSBkYXRhCiAgICAgICAgICAgIFNlcnZpY2VzID0+IFsKICAgICAgICAgICAgICAgIHsgTmFtZSA9PiAiVGVzdFNlcnZpY2UgLSAiIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKSB9LAogICAgICAgICAgICAgICAgeyBOYW1lID0+ICJUZXN0U2VydmljZSAtICIgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpIH0sCiAgICAgICAgICAgIF0sCgogICAgICAgICAgICAjIFNMQSBkYXRhCiAgICAgICAgICAgIFNMQXMgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gIlRlc3RTTEEgLSAiIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAiVGVzdFNMQSAtICIgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9OwoKICAgICAgICBteSAkU3VjY2VzcyA9ICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdUaWNrZXQ6OlNlcnZpY2UnLAogICAgICAgICAgICBWYWx1ZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgQWRkIFNlcnZpY2VzLgogICAgICAgIG15IEBTZXJ2aWNlSURzOwogICAgICAgIG15ICVTZXJ2aWNlc05hbWVUb0lEOwogICAgICAgIFNFUlZJQ0U6CiAgICAgICAgZm9yIG15ICRTZXJ2aWNlICggQHsgJENvbmZpZy0+e1NlcnZpY2VzfSB9ICkgewoKICAgICAgICAgICAgbmV4dCBTRVJWSUNFIGlmICEkU2VydmljZTsKICAgICAgICAgICAgbmV4dCBTRVJWSUNFIGlmICEleyRTZXJ2aWNlfTsKCiAgICAgICAgICAgIG15ICRTZXJ2aWNlSUQgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUFkZCgKICAgICAgICAgICAgICAgICV7JFNlcnZpY2V9LAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKIyAtLS0KICAgICAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgICJTZXJ2aWNlICRTZXJ2aWNlSUQgaGFzIGJlZW4gY3JlYXRlZC4iCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIEFkZCBzZXJ2aWNlIGFzIGRlZmF1bHQgc2VydmljZSBmb3IgYWxsIGN1c3RvbWVycy4KICAgICAgICAgICAgJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAnPERFRkFVTFQ+JywKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBBY3RpdmUgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQFNlcnZpY2VJRHMsICRTZXJ2aWNlSUQ7CiAgICAgICAgfQoKICAgICAgICAjIEFkZCBTTEFzIGFuZCBjb25uZWN0IHRoZW0gd2l0aCB0aGUgU2VydmljZXMuCiAgICAgICAgbXkgQFNMQUlEczsKICAgICAgICBTTEE6CiAgICAgICAgZm9yIG15ICRTTEEgKCBAeyAkQ29uZmlnLT57U0xBc30gfSApIHsKCiAgICAgICAgICAgIG5leHQgU0xBIGlmICEkU0xBOwogICAgICAgICAgICBuZXh0IFNMQSBpZiAhJXskU0xBfTsKCiAgICAgICAgICAgIG15ICRTTEFJRCA9ICRTTEFPYmplY3QtPlNMQUFkZCgKICAgICAgICAgICAgICAgICV7JFNMQX0sCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgICAgIFR5cGVJRCA9PiAxLAojIC0tLQogICAgICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU0xBSUQsCiAgICAgICAgICAgICAgICAiU0xBICRTTEFJRCBoYXMgYmVlbiBjcmVhdGVkLiIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQFNMQUlEcywgJFNMQUlEOwogICAgICAgIH0KCiAgICAgICAgIyBDcmVhdGUgdGVzdCB1c2VyIGFuZCBsb2dpbi4KICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAndXNlcnMnLCAnc3RhdHMnIF0sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpOwogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50U3RhdGlzdGljcztTdWJhY3Rpb249SW1wb3J0Iik7CgogICAgICAgICMgSW1wb3J0IHRlc3Qgc2VsZW5pdW0gc3RhdGlzdGljLgogICAgICAgIG15ICRMb2NhdGlvbk5vdEV4aXN0aW5nT2JqZWN0ID0gJENvbmZpZ09iamVjdC0+R2V0KCdIb21lJykKICAgICAgICAgICAgLiAiL3NjcmlwdHMvdGVzdC9zYW1wbGUvU3RhdHMvU3RhdHMuU3RhdGljLk5vdEV4aXN0aW5nLnhtbCI7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRmlsZSIsICdjc3MnICktPnNlbmRfa2V5cygkTG9jYXRpb25Ob3RFeGlzdGluZ09iamVjdCk7CgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2J1dHRvbltcQHZhbHVlPSdJbXBvcnQnXVtcQHR5cGU9J3N1Ym1pdCddIiktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnLkRpYWxvZy5Nb2RhbCAjRGlhbG9nQnV0dG9uMScpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIENvbmZpcm0gSlMgZXJyb3IuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRGlhbG9nQnV0dG9uMSIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gIVwkKCcuRGlhbG9nLk1vZGFsJykubGVuZ3RoIiApOwoKICAgICAgICAjIFZlcmlmeSBlcnJvciBjbGFzcy4KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjRmlsZScpLmhhc0NsYXNzKCdFcnJvcicpIgogICAgICAgICAgICApLAogICAgICAgICAgICAnMScsCiAgICAgICAgICAgICdJbXBvcnQgZmlsZSBmaWVsZCBoYXMgY2xhc3MgZXJyb3InLAogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50U3RhdGlzdGljcztTdWJhY3Rpb249SW1wb3J0Iik7CgogICAgICAgICMgSW1wb3J0IHRlc3Qgc2VsZW5pdW0gc3RhdGlzdGljLgogICAgICAgIG15ICRMb2NhdGlvbiA9ICRDb25maWdPYmplY3QtPkdldCgnSG9tZScpCiAgICAgICAgICAgIC4gIi9zY3JpcHRzL3Rlc3Qvc2FtcGxlL1N0YXRzL1N0YXRzLlRpY2tldE92ZXJ2aWV3LmRlLnhtbCI7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRmlsZSIsICdjc3MnICktPnNlbmRfa2V5cygkTG9jYXRpb24pOwoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB2YWx1ZT0nSW1wb3J0J11bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgQ3JlYXRlIHBhcmFtcyBmb3IgaW1wb3J0IHRlc3Qgc3RhdHMuCiAgICAgICAgbXkgJVN0YXRzVmFsdWVzID0gKAogICAgICAgICAgICBUaXRsZSAgICAgICA9PiAnw5xiZXJibGljayDDvGJlciBhbGxlIFRpY2tldHMgaW0gU3lzdGVtJywKICAgICAgICAgICAgT2JqZWN0ICAgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdBa3R1ZWxsZXIgU3RhdHVzIGFsbGVyIGltIFN5c3RlbSBiZWZpbmRsaWNoZXIgVGlja2V0cyBvaG5lIFplaXRiZXNjaHLDpG5rdW5nLicsCiAgICAgICAgICAgIEZvcm1hdCAgICAgID0+ICdEMzo6QmFyQ2hhcnQnLAogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgZm9yIGltcG9ydGVkIHZhbHVlcyBvbiB0ZXN0IHN0YXQuCiAgICAgICAgZm9yIG15ICRTdGF0c1ZhbHVlICggc29ydCBrZXlzICVTdGF0c1ZhbHVlcyApIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFN0YXRzVmFsdWVzeyRTdGF0c1ZhbHVlfSApID4gLTEsCiAgICAgICAgICAgICAgICAiRXhwZXh0ZWQgcGFyYW0gJFN0YXRzVmFsdWUgZm9yIGltcG9ydGVkIHN0YXQgaXMgZm91bmRlZCAtICRTdGF0c1ZhbHVlc3skU3RhdHNWYWx1ZX0iCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIE5hdmlnYXRlIHRvIEFnZW50U3RhdGlzdGljcyBPdmVydmlldyBzY3JlZW4uCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgKICAgICAgICAgICAgIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50U3RhdGlzdGljcztTdWJhY3Rpb249T3ZlcnZpZXc7RGlyZWN0aW9uPURFU0M7T3JkZXJCeT1JRDtTdGFydEhpdD0xOyIKICAgICAgICApOwoKICAgICAgICBteSAkU3RhdHNPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdHMnKTsKCiAgICAgICAgIyBHZXQgc3RhdHMgSURzLgogICAgICAgIG15ICRTdGF0c0lEcyA9ICRTdGF0c09iamVjdC0+R2V0U3RhdHNMaXN0KAogICAgICAgICAgICBBY2Nlc3NSdyA9PiAxLAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICRDb3VudCAgICAgICA9IHNjYWxhciBAeyRTdGF0c0lEc307CiAgICAgICAgbXkgJFN0YXRzSURMYXN0ID0gJFN0YXRzSURzLT5bICRDb3VudCAtIDEgXTsKCiAgICAgICAgIyBDaGVjayBmb3IgaW1wb3J0ZWQgc3RhdHMgb24gb3ZlcnZpZXcgc2NyZWVuLgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFN0YXRzVmFsdWVze1RpdGxlfSApID4gLTEsCiAgICAgICAgICAgICJJbXBvcnRlZCBzdGF0ICRTdGF0c1ZhbHVlc3tUaXRsZX0gLSBmb3VuZCBvbiBvdmVydmlldyBzY3JlZW4iCiAgICAgICAgKTsKCiAgICAgICAgIyBHbyB0byBpbXBvcnRlZCBzdGF0IHRvIHJ1biBpdC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBZ2VudFN0YXRpc3RpY3M7U3ViYWN0aW9uPUVkaXQ7U3RhdElEPSRTdGF0c0lETGFzdFwnICldIikKICAgICAgICAgICAgLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgQ2hhbmdlIHByZXZpZXcgZm9ybWF0IHRvIFByaW50LgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2J1dHRvbltjb250YWlucyhcQGRhdGEtZm9ybWF0LCBcJ1ByaW50JyldIiktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1ByZXZpZXdDb250ZW50UHJpbnQ6dmlzaWJsZScpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgicmV0dXJuIFwkKCcjUHJldmlld0NvbnRlbnRQcmludCcpLmNzcygnZGlzcGxheScpIikgZXEgJ2Jsb2NrJywKICAgICAgICAgICAgIlByaW50IGZvcm1hdCBpcyBkaXNwbGF5ZWQiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnI1ByZXZpZXdDb250ZW50RDNCYXJDaGFydCcpLmNzcygnZGlzcGxheScpIikgZXEgJ25vbmUnLAogICAgICAgICAgICAiQmFyIGZvcm1hdCBpcyBub3QgZGlzcGxheWVkIiwKICAgICAgICApOwoKICAgICAgICAjIENoYW5nZSBwcmV2aWV3IGZvcm1hdCB0byBCYXIuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW2NvbnRhaW5zKFxAZGF0YS1mb3JtYXQsIFwnRDM6OkJhckNoYXJ0JyldIiktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1ByZXZpZXdDb250ZW50RDNCYXJDaGFydDp2aXNpYmxlJykubGVuZ3RoIgogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJyNQcmV2aWV3Q29udGVudEQzQmFyQ2hhcnQnKS5jc3MoJ2Rpc3BsYXknKSIpIGVxICdibG9jaycsCiAgICAgICAgICAgICJCYXIgZm9ybWF0IGlzIGRpc3BsYXllZCIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgicmV0dXJuIFwkKCcjUHJldmlld0NvbnRlbnRQcmludCcpLmNzcygnZGlzcGxheScpIikgZXEgJ25vbmUnLAogICAgICAgICAgICAiUHJpbnQgZm9ybWF0IGlzIG5vdCBkaXNwbGF5ZWQiLAogICAgICAgICk7CgogICAgICAgICMgVG9nZ2xlIEdlbmVyYWwgU3BlY2lmaWNhdGlvbi4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAYXJpYS1jb250cm9scywgXCdDb3JlX1VJX0F1dG9nZW5lcmF0ZWRJRF8wJyldIiktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJy5XaWRnZXRTaW1wbGU6Y29udGFpbnMoR2VuZXJhbCBTcGVjaWZpY2F0aW9uKS5FeHBhbmRlZCcpLmxlbmd0aCIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1RpdGxlIiwgJ2NzcycgKS0+c2VuZF9rZXlzKCIgLSBVcGRhdGVkIik7CgogICAgICAgICMgQ2hlY2sgWC1heGlzIGNvbmZpZ3VyYXRpb24gZGlhbG9nLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLkVkaXRYQXhpcyIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJy5EaWFsb2cuTW9kYWwgI0VkaXREaWFsb2cgYS5SZW1vdmVCdXR0b24gaScpLmxlbmd0aCIgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRWRpdERpYWxvZyBhLlJlbW92ZUJ1dHRvbiBpIiwgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnLkRpYWxvZy5Nb2RhbCAjRWRpdERpYWxvZyAuVGFibGVMaWtlLkFkZDp2aXNpYmxlJykubGVuZ3RoIiApOwoKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNFZGl0RGlhbG9nIHNlbGVjdCcpLnZhbCgnWEF4aXNTZXJ2aWNlSURzJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNEaWFsb2dCdXR0b24xIiwgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiAhXCQoJy5EaWFsb2cuTW9kYWwnKS5sZW5ndGgiICk7CgogICAgICAgICMgQ2hlY2sgWS1heGlzIGNvbmZpZ3VyYXRpb24gZGlhbG9nLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLkVkaXRZQXhpcyIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJy5EaWFsb2cuTW9kYWwgI0VkaXREaWFsb2cgYS5SZW1vdmVCdXR0b24gaScpLmxlbmd0aCIgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRWRpdERpYWxvZyBhLlJlbW92ZUJ1dHRvbiBpIiwgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnLkRpYWxvZy5Nb2RhbCAjRWRpdERpYWxvZyAuVGFibGVMaWtlLkFkZDp2aXNpYmxlJykubGVuZ3RoIiApOwoKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNFZGl0RGlhbG9nIHNlbGVjdCcpLnZhbCgnWUF4aXNTTEFJRHMnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0RpYWxvZ0J1dHRvbjEiLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuICFcJCgnLkRpYWxvZy5Nb2RhbCcpLmxlbmd0aCIgKTsKCiAgICAgICAgIyBDaGVjayBSZXN0cmljdGlvbnMgY29uZmlndXJhdGlvbiBkaWFsb2cuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuRWRpdFJlc3RyaWN0aW9ucyIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gXCQoJy5EaWFsb2cuTW9kYWwnKS5sZW5ndGgiICk7CgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI0VkaXREaWFsb2cgc2VsZWN0JykudmFsKCdSZXN0cmljdGlvbnNRdWV1ZUlEcycpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgV2FpdCBmb3IgbG9hZCBzZWxlY3RlZCBSZXN0cmljdGlvbiAtIFF1ZXVlSURzLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuICQoIiNSZXN0cmljdGlvbnNRdWV1ZUlEcyIpLmxlbmd0aDsnICk7CgogICAgICAgICMgQWRkIHJlc3RyaWN0aW9uIHBlciBRdWV1ZSAtIEp1bmsuCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjRWRpdERpYWxvZyAjUmVzdHJpY3Rpb25zUXVldWVJRHMnKS52YWwoJzMnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0RpYWxvZ0J1dHRvbjEiLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuICFcJCgnLkRpYWxvZy5Nb2RhbCcpLmxlbmd0aCIgKTsKCiAgICAgICAgIyBTYXZlIGFuZCBmaW5pc2ggZWRpdC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEBuYW1lPSdTYXZlQW5kRmluaXNoJ11bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgU29ydCBkZWNyZWFzaW5nIGJ5IFN0YXRzSUQuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgKICAgICAgICAgICAgIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50U3RhdGlzdGljcztTdWJhY3Rpb249T3ZlcnZpZXc7RGlyZWN0aW9uPURFU0M7T3JkZXJCeT1JRDtTdGFydEhpdD0xIgogICAgICAgICk7CgogICAgICAgICMgRGVsZXRlIGltcG9ydGVkIHRlc3Qgc3RhdHMuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoCiAgICAgICAgICAgICIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudFN0YXRpc3RpY3M7U3ViYWN0aW9uPURlbGV0ZUFjdGlvbjtTdGF0SUQ9JFN0YXRzSURMYXN0XCcpXSIKICAgICAgICApLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEFsZXJ0UHJlc2VudCA9PiAxICk7CiAgICAgICAgJFNlbGVuaXVtLT5hY2NlcHRfYWxlcnQoKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAiQWN0aW9uPUFnZW50U3RhdGlzdGljcztTdWJhY3Rpb249RWRpdDtTdGF0SUQ9JFN0YXRzSURMYXN0IiApID09IC0xLAogICAgICAgICAgICAiVGVzdCBzdGF0aXN0aWMgaXMgZGVsZXRlZCAtICRTdGF0c0lETGFzdCAiCiAgICAgICAgKTsKCiAgICAgICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgICAgICMgQ2xlYW4gdXAgdGVzdCBkYXRhLgogICAgICAgIGZvciBteSAkU0xBSUQgKEBTTEFJRHMpIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBzZXJ2aWNlX3NsYSBXSEVSRSBzbGFfaWQgPSAkU0xBSUQiLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIlNlcnZpY2VTbGEgLSAkU0xBSUQiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBzbGEgV0hFUkUgaWQgPSAkU0xBSUQiLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIlNMQURlbGV0ZSAtICRTTEFJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJFNlcnZpY2VJRCAoQFNlcnZpY2VJRHMpIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBzZXJ2aWNlX2N1c3RvbWVyX3VzZXIgV0hFUkUgc2VydmljZV9pZCA9ICRTZXJ2aWNlSUQiLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIlNlcnZpY2VDdXN0b21lclVzZXIgZGVsZXRlZCAtICRTZXJ2aWNlSUQiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBzZXJ2aWNlIFdIRVJFIGlkID0gJFNlcnZpY2VJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiRGVsZXRlZCBTZXJ2aWNlIC0gJFNlcnZpY2VJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGNhY2hlIGlzIGNvcnJlY3QuCiAgICAgICAgZm9yIG15ICRDYWNoZSAocXcoU2VydmljZSBTTEEgU3RhdHMpKSB7CiAgICAgICAgICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCggVHlwZSA9PiAkQ2FjaGUgKTsKICAgICAgICB9CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA5ZWEwN2E5Nzk2MDMwODU0ZmJjN2NhNWYwNDJmNTUwMWMyZGRkZDliIC0gc2NyaXB0cy90ZXN0L1NlbGVuaXVtL0FnZW50L0FnZW50VGlja2V0RnJlZVRleHQudAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKIyBDcmVhdGUgbG9jYWwgZnVuY3Rpb24gZm9yIHdhaXQgb24gQUpBWCB1cGRhdGUuCm15ICRXYWl0Rm9yQUpBWCA9IHN1YiB7CiAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgic3Bhbi5BSkFYTG9hZGVyOnZpc2libGUiKS5sZW5ndGgnCiAgICApOwp9OwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgbXkgJFN5c0NvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcnKTsKICAgICAgICBteSAkVGlja2V0T2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgICAgIG15ICRRdWV1ZU9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKICAgICAgICBteSAkU2VydmljZU9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKTsKICAgICAgICBteSAkU0xBT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNMQScpOwogICAgICAgIG15ICRTdGF0ZU9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKTsKICAgICAgICBteSAkREJPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CiAgICAgICAgbXkgJEhlbHBlciAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgIG15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFN1Y2Nlc3M7CgogICAgICAgICMgRG8gbm90IGNoZWNrIFJpY2hUZXh0LgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdGcm9udGVuZDo6UmljaFRleHQnLAogICAgICAgICAgICBWYWx1ZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgRW5hYmxlIHRpY2tldCByZXNwb25zaWJsZSBmZWF0dXJlLgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdUaWNrZXQ6OlJlc3BvbnNpYmxlJywKICAgICAgICAgICAgVmFsdWUgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIEVuYWJsZSB0aWNrZXQgc2VydmljZSBmZWF0dXJlLgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdUaWNrZXQ6OlNlcnZpY2UnLAogICAgICAgICAgICBWYWx1ZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgY3VzdG9tZXIgdXNlci4KICAgICAgICBteSAkVGVzdEN1c3RvbWVyVXNlckxvZ2luID0gJEhlbHBlci0+VGVzdEN1c3RvbWVyVXNlckNyZWF0ZSgpCiAgICAgICAgICAgIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCBjdXN0b21lciB1c2VyIjsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCB1c2VyLgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgIyBHZXQgdGVzdCB1c2VyIElELgogICAgICAgIG15ICRUZXN0VXNlcklEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgdGlja2V0LgogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICdUaXRsZScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIFF1ZXVlICAgICAgICA9PiAnUmF3JywKICAgICAgICAgICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICBQcmlvcml0eSAgICAgPT4gJzMgbm9ybWFsJywKICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICduZXcnLAogICAgICAgICAgICBDdXN0b21lcklEICAgPT4gJ1NlbGVuaXVtQ3VzdG9tZXInLAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgT3duZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRUaWNrZXRJRCwKICAgICAgICAgICAgIlRpY2tldElEICRUaWNrZXRJRCBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHF1ZXVlLgogICAgICAgIG15ICRRdWV1ZU5hbWUgPSAnUXVldWUnIC4gJFJhbmRvbUlEOwogICAgICAgIG15ICRRdWV1ZUlEICAgPSAkUXVldWVPYmplY3QtPlF1ZXVlQWRkKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgPT4gJFF1ZXVlTmFtZSwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICAgICA9PiAxLAogICAgICAgICAgICBTeXN0ZW1BZGRyZXNzSUQgPT4gMSwKICAgICAgICAgICAgU2FsdXRhdGlvbklEICAgID0+IDEsCiAgICAgICAgICAgIFNpZ25hdHVyZUlEICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgPT4gJ1NvbWUgY29tbWVudCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRRdWV1ZUlELAogICAgICAgICAgICAiUXVldWVJRCAkUXVldWVJRCBpcyBjcmVhdGVkIiwKICAgICAgICApOwojIC0tLQojIElUU01Db3JlCiMgLS0tCgojIEdldCB0aGUgbGlzdCBvZiBzZXJ2aWNlIHR5cGVzIGZyb20gZ2VuZXJhbCBjYXRhbG9nLgpteSAkU2VydmljZVR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAopOwoKIyBCdWlsZCBhIGxvb2t1cCBoYXNoLgpteSAlU2VydmljZVR5cGVOYW1lMklEID0gcmV2ZXJzZSAleyAkU2VydmljZVR5cGVMaXN0IH07CgojIEdldCB0aGUgbGlzdCBvZiBzbGEgdHlwZXMgZnJvbSBnZW5lcmFsIGNhdGFsb2cuCm15ICRTTEFUeXBlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpTTEE6OlR5cGUnLAopOwoKIyBCdWlsZCBhIGxvb2t1cCBoYXNoLgpteSAlU0xBVHlwZU5hbWUySUQgPSByZXZlcnNlICV7ICRTTEFUeXBlTGlzdCB9OwojIC0tLQoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHNlcnZpY2UuCiAgICAgICAgbXkgJFNlcnZpY2VOYW1lID0gJ1NlcnZpY2UnIC4gJFJhbmRvbUlEOwogICAgICAgIG15ICRTZXJ2aWNlSUQgICA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICA9PiAkU2VydmljZVR5cGVOYW1lMklEe1RyYWluaW5nfSwKICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKIyAtLS0KICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlcnZpY2VJRCwKICAgICAgICAgICAgIlNlcnZpY2VJRCAkU2VydmljZUlEIGlzIGNyZWF0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgQWRkIG1lbWJlciBjdXN0b21lciB1c2VyIHRvIHRoZSB0ZXN0IHNlcnZpY2UuCiAgICAgICAgJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICAgICAgICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgIEFjdGl2ZSAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCBTTEEuCiAgICAgICAgbXkgJFNMQU5hbWUgPSAnU0xBJyAuICRSYW5kb21JRDsKICAgICAgICBteSAkU0xBSUQgICA9ICRTTEFPYmplY3QtPlNMQUFkZCgKICAgICAgICAgICAgU2VydmljZUlEcyA9PiBbJFNlcnZpY2VJRF0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJFNMQU5hbWUsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+ICRTTEFUeXBlTmFtZTJJRHtPdGhlcn0sCiMgLS0tCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRUaWNrZXRJRCwKICAgICAgICAgICAgIlNMQUlEICRTTEFJRCBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIEdldCAnb3BlbicgdHlwZSBJRC4KICAgICAgICBteSAlTGlzdFR5cGUgPSAkU3RhdGVPYmplY3QtPlN0YXRlVHlwZUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CiAgICAgICAgbXkgJVJldmVyc2VMaXN0VHlwZSA9IHJldmVyc2UgJUxpc3RUeXBlOwogICAgICAgIG15ICRPcGVuSUQgICAgICAgICAgPSAkUmV2ZXJzZUxpc3RUeXBleyJvcGVuIn07CgogICAgICAgICMgQ3JlYXRlIHRlc3Qgc3RhdGUgKHR5cGUgJ29wZW4nKS4KICAgICAgICBteSAkU3RhdGVOYW1lID0gJ1N0YXRlJyAuICRSYW5kb21JRDsKICAgICAgICBteSAkU3RhdGVJRCAgID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUFkZCgKICAgICAgICAgICAgTmFtZSAgICA9PiAkU3RhdGVOYW1lLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFR5cGVJRCAgPT4gJE9wZW5JRCwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdGF0ZUlELAogICAgICAgICAgICAiU3RhdGVJRCAkU3RhdGVJRCBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIExvZ2luIGFzIHRlc3QgdXNlci4KICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIERlZmluZSBmaWVsZCBJRHMgYW5kIGZyb250ZW5kIG1vZHVsZXMuCiAgICAgICAgbXkgJUZyZWVUZXh0RmllbGRzID0gKAogICAgICAgICAgICBOb01hbmRhdG9yeSA9PiB7CiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgICAgID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgICAgIE5ld1F1ZXVlSUQgICAgICAgPT4gJ1F1ZXVlJywKICAgICAgICAgICAgICAgIE5ld093bmVySUQgICAgICAgPT4gJ093bmVyJywKICAgICAgICAgICAgICAgIE5ld1Jlc3BvbnNpYmxlSUQgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgICAgIE5ld1N0YXRlSUQgICAgICAgPT4gJ1N0YXRlJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTWFuZGF0b3J5ID0+IHsKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgICAgPT4gJ1NlcnZpY2VNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgU0xBSUQgICAgICAgICAgICA9PiAnU0xBTWFuZGF0b3J5JywKICAgICAgICAgICAgICAgIE5ld1F1ZXVlSUQgICAgICAgPT4gJ1F1ZXVlTWFuZGF0b3J5JywKICAgICAgICAgICAgICAgIE5ld093bmVySUQgICAgICAgPT4gJ093bmVyTWFuZGF0b3J5JywKICAgICAgICAgICAgICAgIE5ld1Jlc3BvbnNpYmxlSUQgPT4gJ1Jlc3BvbnNpYmxlTWFuZGF0b3J5JywKICAgICAgICAgICAgICAgIE5ld1N0YXRlSUQgICAgICAgPT4gJ1N0YXRlTWFuZGF0b3J5JywKICAgICAgICAgICAgICAgIH0KICAgICAgICApOwoKICAgICAgICBteSBAVGVzdHMgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0Rpc2FibGUgTm9NYW5kYXRvcnkgYW5kIE1hbmRhdG9yeSBmaWVsZHMsIGNoZWNrIE5vTWFuZGF0b3J5IGZpZWxkIElEcycsCiAgICAgICAgICAgICAgICBDaGVja0ZpZWxkcyAgID0+ICdOb01hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBOb01hbmRhdG9yeSAgID0+IDAsCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgID0+IDAsCiAgICAgICAgICAgICAgICBFeHBlY3RlZEV4aXN0ID0+IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0VuYWJsZSBOb01hbmRhdG9yeSBhbmQgZGlzYWJsZSBNYW5kYXRvcnkgZmllbGRzLCBjaGVjayBOb01hbmRhdG9yeSBmaWVsZCBJRHMnLAogICAgICAgICAgICAgICAgQ2hlY2tGaWVsZHMgICA9PiAnTm9NYW5kYXRvcnknLAogICAgICAgICAgICAgICAgTm9NYW5kYXRvcnkgICA9PiAxLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICA9PiAwLAogICAgICAgICAgICAgICAgRXhwZWN0ZWRFeGlzdCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdEaXNhYmxlIE5vTWFuZGF0b3J5IGFuZCBlbmFibGUgTWFuZGF0b3J5IGZpZWxkcywgY2hlY2sgTWFuZGF0b3J5IGZpZWxkIElEcycsCiAgICAgICAgICAgICAgICBDaGVja0ZpZWxkcyAgID0+ICdNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgTm9NYW5kYXRvcnkgICA9PiAwLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICA9PiAxLAogICAgICAgICAgICAgICAgRXhwZWN0ZWRFeGlzdCA9PiAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdFbmFibGUgTm9NYW5kYXRvcnkgYW5kIE1hbmRhdG9yeSBmaWVsZHMsIGNoZWNrIE1hbmRhdG9yeSBmaWVsZCBJRHMnLAogICAgICAgICAgICAgICAgQ2hlY2tGaWVsZHMgICA9PiAnTWFuZGF0b3J5JywKICAgICAgICAgICAgICAgIE5vTWFuZGF0b3J5ICAgPT4gMSwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEV4cGVjdGVkRXhpc3QgPT4gMSwKICAgICAgICAgICAgfQogICAgICAgICk7CgogICAgICAgIGZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgICAgICAgICAjIFdyaXRlIHRlc3QgY2FzZSBkZXNjcmlwdGlvbi4KICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgJFRlc3QtPntOYW1lfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGZvciBteSAkTm9NYW5kYXRvcnlGaWVsZCAoIHZhbHVlcyAleyAkRnJlZVRleHRGaWVsZHN7Tm9NYW5kYXRvcnl9IH0gKSB7CgogICAgICAgICAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEZyZWVUZXh0IyMjJE5vTWFuZGF0b3J5RmllbGQiLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRUZXN0LT57Tm9NYW5kYXRvcnl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIG15ICRNYW5kYXRvcnlGaWVsZCAoIHZhbHVlcyAleyAkRnJlZVRleHRGaWVsZHN7TWFuZGF0b3J5fSB9ICkgewoKICAgICAgICAgICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAiVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRGcmVlVGV4dCMjIyRNYW5kYXRvcnlGaWVsZCIsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFRlc3QtPntNYW5kYXRvcnl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBOYXZpZ2F0ZSB0byB6b29tIHZpZXcgb2YgY3JlYXRlZCB0ZXN0IHRpY2tldC4KICAgICAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRUaWNrZXRJRCIpOwoKICAgICAgICAgICAgIyBGb3JjZSBzdWIgbWVudXMgdG8gYmUgdmlzaWJsZSBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGNsaWNrIG9uZSBvZiB0aGUgbGlua3MuCiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjbmF2LU1pc2NlbGxhbmVvdXMgdWwiKS5jc3MoeyAiaGVpZ2h0IjogImF1dG8iLCAib3BhY2l0eSI6ICIxMDAiIH0pOycKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgQ2xpY2sgb24gJ0ZyZWUgRmllbGRzJyBhbmQgc3dpdGNoIHdpbmRvdy4KICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50VGlja2V0RnJlZVRleHQ7VGlja2V0SUQ9JFRpY2tldElEJyApXSIpCiAgICAgICAgICAgICAgICAtPmNsaWNrKCk7CgogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICAgICAgbXkgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMV0gKTsKCiAgICAgICAgICAgICMgV2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeS4KICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIi5DYW5jZWxDbG9zZVBvcHVwIikubGVuZ3RoJyApOwoKICAgICAgICAgICAgIyBHZXQgTm9NYW5kYXRvcnkvTWFuZGF0b3J5IGZpZWxkcyBmb3IgZXhpc3QgY2hlY2tpbmcuCiAgICAgICAgICAgIG15ICRDaGVja0ZpZWxkcyA9ICRUZXN0LT57Q2hlY2tGaWVsZHN9OwoKICAgICAgICAgICAgZm9yIG15ICRGaWVsZElEICggc29ydCBrZXlzICV7ICRGcmVlVGV4dEZpZWxkc3skQ2hlY2tGaWVsZHN9IH0gKSB7CgogICAgICAgICAgICAgICAgaWYgKCAkVGVzdC0+e0V4cGVjdGVkRXhpc3R9ID09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInJldHVybiBcJCgnIyRGaWVsZElEJykubGVuZ3RoIgogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAiRmllbGRJRCAkRmllbGRJRCBkb2Vzbid0IGV4aXN0IiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnIyRGaWVsZElEJykubGVuZ3RoIiksCiAgICAgICAgICAgICAgICAgICAgICAgICJGaWVsZElEICRGaWVsZElEIGV4aXN0cyIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRDaGVja0ZpZWxkcyBlcSAnTWFuZGF0b3J5JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgicmV0dXJuIFwkKCdsYWJlbFtmb3I9JEZpZWxkSURdJykuaGFzQ2xhc3MoJ01hbmRhdG9yeScpIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZWxkSUQgJEZpZWxkSUQgaXMgbWFuZGF0b3J5IiwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ2xvc2UgdGhlIHdpbmRvdyBhbmQgc3dpdGNoIGJhY2sgdG8gdGhlIGZpcnN0IHNjcmVlbi4KICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuQ2FuY2VsQ2xvc2VQb3B1cCIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMSApOwogICAgICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMF0gKTsKICAgICAgICB9CgogICAgICAgICMgRGVmaW5lIGZpZWxkIHZhbHVlcy4KICAgICAgICBteSAlU2V0RnJlZVRleHRGaWVsZHMgPSAoCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgU0xBSUQgICAgICAgICAgICA9PiAkU0xBSUQsCiAgICAgICAgICAgIE5ld1F1ZXVlSUQgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIE5ld093bmVySUQgICAgICAgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgICAgIE5ld1Jlc3BvbnNpYmxlSUQgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgICAgIE5ld1N0YXRlSUQgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBOYXZpZ2F0ZSB0byB6b29tIHZpZXcgb2YgY3JlYXRlZCB0ZXN0IHRpY2tldC4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JFRpY2tldElEIik7CgogICAgICAgICMgRm9yY2Ugc3ViIG1lbnVzIHRvIGJlIHZpc2libGUgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBjbGljayBvbmUgb2YgdGhlIGxpbmtzLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI25hdi1NaXNjZWxsYW5lb3VzIHVsIikuY3NzKHsgImhlaWdodCI6ICJhdXRvIiwgIm9wYWNpdHkiOiAiMTAwIiB9KTsnCiAgICAgICAgKTsKCiAgICAgICAgIyBDbGljayBvbiAnRnJlZSBGaWVsZHMnIGFuZCBzd2l0Y2ggd2luZG93LgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudFRpY2tldEZyZWVUZXh0O1RpY2tldElEPSRUaWNrZXRJRCcgKV0iKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgbXkgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIFdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIi5DYW5jZWxDbG9zZVBvcHVwIikubGVuZ3RoJyApOwoKICAgICAgICAjIEZpbGwgYWxsIGZyZWUgdGV4dCBmaWVsZHMuCiAgICAgICAgRlJFRVRFWFRGSUVMRFM6CiAgICAgICAgZm9yIG15ICRGaWVsZElEICggc29ydCBrZXlzICVTZXRGcmVlVGV4dEZpZWxkcyApIHsKCiAgICAgICAgICAgIG5leHQgRlJFRVRFWFRGSUVMRFMgaWYgJEZpZWxkSUQgZXEgJ1NMQUlEJzsKCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAiXCQoJyMkRmllbGRJRCcpLnZhbCgnJFNldEZyZWVUZXh0RmllbGRzeyRGaWVsZElEfScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJykiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFdhaXQgZm9yIEFKQVggdG8gZmluaXNoLgogICAgICAgICAgICAkV2FpdEZvckFKQVgtPigpOwoKICAgICAgICAgICAgaWYgKCAkRmllbGRJRCBlcSAnU2VydmljZUlEJyApIHsKCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgICAgICJcJCgnI1NMQUlEJykudmFsKCckU2V0RnJlZVRleHRGaWVsZHN7U0xBSUR9JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKSIKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBXYWl0IGZvciBBSkFYIHRvIGZpbmlzaC4KICAgICAgICAgICAgICAgICRXYWl0Rm9yQUpBWC0+KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgVGVzdCBjYXNlcyAtIGFsbCBmaWVsZHMgYXJlIHNldCBleGNlcHQgZXhhY3RseSBvbmUsIGFuZCBpbiB0aGUgbGFzdCBjYXNlIGFsbCBmaWVsZHMgYXJlIHNldC4KICAgICAgICBAVGVzdHMgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnQ2xlYXIgU2VydmljZSBmaWVsZCcsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnQ2xlYXIgU0xBIGZpZWxkIGFuZCBzZXQgYmFjayBTZXJ2aWNlIGZpZWxkJywKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgU0xBSUQgICAgID0+ICcnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdDbGVhciBRdWV1ZSBmaWVsZCBhbmQgc2V0IGJhY2sgU0xBIGZpZWxkJywKICAgICAgICAgICAgICAgIFNMQUlEICAgICAgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgTmV3UXVldWVJRCA9PiAnJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnQ2xlYXIgT3duZXIgZmllbGQgYW5kIHNldCBiYWNrIFF1ZXVlIGZpZWxkJywKICAgICAgICAgICAgICAgIE5ld1F1ZXVlSUQgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgICAgICBOZXdPd25lcklEID0+ICcnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDbGVhciBSZXNwb25zaWJsZSBmaWVsZCBhbmQgc2V0IGJhY2sgT3duZXIgZmllbGQnLAogICAgICAgICAgICAgICAgTmV3T3duZXJJRCAgICAgICA9PiAkVGVzdFVzZXJJRCwKICAgICAgICAgICAgICAgIE5ld1Jlc3BvbnNpYmxlSUQgPT4gJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NsZWFyIFN0YXRlIGZpZWxkIGFuZCBzZXQgYmFjayBSZXNwb25zaWJsZSBmaWVsZCcsCiAgICAgICAgICAgICAgICBOZXdSZXNwb25zaWJsZUlEID0+ICRUZXN0VXNlcklELAogICAgICAgICAgICAgICAgTmV3U3RhdGVJRCAgICAgICA9PiAnJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnU2V0IGJhY2sgU3RhdGUgZmllbGQgLSBhbGwgZmllbGRzIGFyZSBzZXQnLAogICAgICAgICAgICAgICAgTmV3U3RhdGVJRCA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgfQogICAgICAgICk7CgogICAgICAgICMgUnVuIHRlc3QgLSBpbiBlYWNoIGl0ZXJhdGlvbiBleGFjdGx5IG9uZSBmaWVsZCBpcyBlbXB0eSwgbGFzdCBjYXNlIGlzIGNvcnJlY3QuCiAgICAgICAgZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAgICAgICAgICMgV3JpdGUgdGVzdCBjYXNlIGRlc2NyaXB0aW9uLgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAkVGVzdC0+e05hbWV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJEV4cGVjdGVkRXJyb3JGaWVsZElEOwoKICAgICAgICAgICAgVEVTVEZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJEZpZWxkSUQgKCBzb3J0IGtleXMgJXskVGVzdH0gKSB7CgogICAgICAgICAgICAgICAgbmV4dCBURVNURklFTEQgaWYgJEZpZWxkSUQgZXEgJ05hbWUnOwoKICAgICAgICAgICAgICAgIGlmICggJFRlc3QtPnskRmllbGRJRH0gZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEV4cGVjdGVkRXJyb3JGaWVsZElEID0gJEZpZWxkSUQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICAgICAiXCQoJyMkRmllbGRJRCcpLnZhbCgnJFRlc3QtPnskRmllbGRJRH0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpIgogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIFdhaXQgZm9yIEFKQVggdG8gZmluaXNoLgogICAgICAgICAgICAgICAgJFdhaXRGb3JBSkFYLT4oKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBXYWl0IHVudGlsIG9wZW5lZCBmaWVsZCAoZHVlIHRvIGVycm9yKSBoYXMgY2xvc2VkLgogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiAkKCJkaXYuanN0cmVlLXdob2xlcm93OnZpc2libGUiKS5sZW5ndGggPT0gMCcgKTsKCiAgICAgICAgICAgICMgU3VibWl0LgogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNzdWJtaXRSaWNoVGV4dCIsICdjc3MnICktPmNsaWNrKCk7CgogICAgICAgICAgICAjIENoZWNrIGlmIGNsYXNzIEVycm9yIGV4aXN0cyBpbiBleHBlY3RlZCBmaWVsZCBJRC4KICAgICAgICAgICAgaWYgKCRFeHBlY3RlZEVycm9yRmllbGRJRCkgewogICAgICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICAgICAgICAgInJldHVybiBcJCgnIyRFeHBlY3RlZEVycm9yRmllbGRJRCcpLmhhc0NsYXNzKCdFcnJvcicpIgogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgIkZpZWxkSUQgJEV4cGVjdGVkRXJyb3JGaWVsZElEIGlzIGVtcHR5IiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICJBbGwgbWFuZGF0b3J5IGZpZWxkcyBhcmUgZmlsbGVkIC0gc3VjY2Vzc2Z1bCBmcmVlIHRleHQgZmllbGRzIHVwZGF0ZSIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgU3dpdGNoIGJhY2sgdG8gdGhlIG1haW4gd2luZG93LgogICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAxICk7CiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMF0gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBEZWZpbmUgbWVzc2FnZXMgaW4gdGlja2V0IGhpc3Rvcnkgc2NyZWVuLgogICAgICAgIG15ICVGcmVlRmllbGRNZXNzYWdlcyA9ICgKICAgICAgICAgICAgU2VydmljZVVwZGF0ZSAgICAgPT4gIkNoYW5nZWQgc2VydmljZSB0byBcIiRTZXJ2aWNlTmFtZVwiICgkU2VydmljZUlEKS4iLAogICAgICAgICAgICBTTEFVcGRhdGUgICAgICAgICA9PiAiQ2hhbmdlZCBTTEEgdG8gXCIkU0xBTmFtZVwiICgkU0xBSUQpLiIsCiAgICAgICAgICAgIE93bmVyVXBkYXRlICAgICAgID0+ICJDaGFuZ2VkIG93bmVyIHRvIFwiJFRlc3RVc2VyTG9naW5cIiAoJFRlc3RVc2VySUQpLiIsCiAgICAgICAgICAgIFJlc3BvbnNpYmxlVXBkYXRlID0+ICJDaGFuZ2VkIHJlc3BvbnNpYmxlIHRvIFwiJFRlc3RVc2VyTG9naW5cIiAoJFRlc3RVc2VySUQpLiIsCiAgICAgICAgICAgIFF1ZXVlVXBkYXRlICAgICAgID0+ICJDaGFuZ2VkIHF1ZXVlIHRvIFwiJFF1ZXVlTmFtZVwiICgkUXVldWVJRCkgZnJvbSBcIlJhd1wiICgyKS4iLAogICAgICAgICAgICBTdGF0ZVVwZGF0ZSAgICAgICA9PiAiQ2hhbmdlZCBzdGF0ZSBmcm9tIFwibmV3XCIgdG8gXCIkU3RhdGVOYW1lXCIuIgogICAgICAgICk7CgogICAgICAgICMgTmF2aWdhdGUgdG8gem9vbSB2aWV3IG9mIGNyZWF0ZWQgdGVzdCB0aWNrZXQuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRUaWNrZXRJRCIpOwoKICAgICAgICAjIEZvcmNlIHN1YiBtZW51cyB0byBiZSB2aXNpYmxlIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gY2xpY2sgb25lIG9mIHRoZSBsaW5rcy4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNuYXYtSGlzdG9yeSB1bCIpLmNzcyh7ICJoZWlnaHQiOiAiYXV0byIsICJvcGFjaXR5IjogIjEwMCIgfSk7JwogICAgICAgICk7CgogICAgICAgICMgTmF2aWdhdGUgdG8gQWdlbnRUaWNrZXRIaXN0b3J5IG9mIGNyZWF0ZWQgdGVzdCB0aWNrZXQuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRIaXN0b3J5O1RpY2tldElEPSRUaWNrZXRJRCIpOwoKICAgICAgICBmb3IgbXkgJEFjdGlvbiAoIHNvcnQga2V5cyAlRnJlZUZpZWxkTWVzc2FnZXMgKSB7CgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkRnJlZUZpZWxkTWVzc2FnZXN7JEFjdGlvbn0gKSA+IC0xLAogICAgICAgICAgICAgICAgIkFjdGlvbiAkQWN0aW9uIGlzIGNvbXBsZXRlZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIENsZWFudXAKICAgICAgICAjIERlbGV0ZSBjcmVhdGVkIHRlc3QgdGlja2V0LgogICAgICAgICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0RGVsZXRlKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBUaWNrZXQgZGVsZXRpb24gY291bGQgZmFpbCBpZiBhcGFjaGUgc3RpbGwgd3JpdGVzIHRvIHRpY2tldCBoaXN0b3J5LiBUcnkgYWdhaW4gaW4gdGhpcyBjYXNlLgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICBzbGVlcCAzOwogICAgICAgICAgICAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlRpY2tldElEICRUaWNrZXRJRCBpcyBkZWxldGVkIgogICAgICAgICk7CgogICAgICAgICMgRGVsZXRlIGN1c3RvbWVyIHVzZXIgcmVmZXJlbmNlZCBmb3Igc2VydmljZS4KICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2VfY3VzdG9tZXJfdXNlciBXSEVSRSBjdXN0b21lcl91c2VyX2xvZ2luID0gPyIsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFRlc3RDdXN0b21lclVzZXJMb2dpbiBdLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiRGVsZXRlZCBzZXJ2aWNlIHJlbGF0aW9ucyBmb3IgJFRlc3RDdXN0b21lclVzZXJMb2dpbiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBEZWxldGUgc2xhIHJlZmVyZW5jZWQgZm9yIHNlcnZpY2UuCiAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2Vfc2xhIFdIRVJFIHNlcnZpY2VfaWQgPSAkU2VydmljZUlEIE9SIHNsYV9pZCA9ICRTTEFJRCIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJSZWxhdGlvbiBTTEFJRCAkU0xBSUQgcmVmZXJlbmNlZCB0byBzZXJ2aWNlIElEICRTZXJ2aWNlSUQgaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICMgRGVsZXRlIGNyZWF0ZWQgdGVzdCBzZXJ2aWNlIHByZWZlcmVuY2VzLgogICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBzZXJ2aWNlX3ByZWZlcmVuY2VzIFdIRVJFIHNlcnZpY2VfaWQgPSAkU2VydmljZUlEIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlNlcnZpY2VJRCAkU2VydmljZUlEIHByZWZlcmVuZWNlcyBpcyBkZWxldGVkIiwKICAgICAgICApOwojIC0tLQoKICAgICAgICAjIERlbGV0ZSBjcmVhdGVkIHRlc3Qgc2VydmljZS4KICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gc2VydmljZSBXSEVSRSBpZCA9ICRTZXJ2aWNlSUQiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiU2VydmljZUlEICRTZXJ2aWNlSUQgaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBEZWxldGUgY3JlYXRlZCB0ZXN0IFNMQS4KICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gc2xhIFdIRVJFIGlkID0gJFNMQUlEIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlNMQUlEICRTTEFJRCBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZSBjcmVhdGVkIHRlc3Qgc3RhdGUuCiAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHRpY2tldF9zdGF0ZSBXSEVSRSBpZCA9ICRTdGF0ZUlEIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlN0YXRlSUQgJFN0YXRlSUQgaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBEZWxldGUgY3JlYXRlZCB0ZXN0IHF1ZXVlLgogICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBxdWV1ZSBXSEVSRSBpZCA9ICRRdWV1ZUlEIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlF1ZXVlSUQgJFF1ZXVlSUQgaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgICAgICMgTWFrZSBzdXJlIHRoZSBjYWNoZSBpcyBjb3JyZWN0LgogICAgICAgIGZvciBteSAkQ2FjaGUgKHF3KFRpY2tldCBTZXJ2aWNlIFNMQSBTdGF0ZSBRdWV1ZSkpIHsKICAgICAgICAgICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKCBUeXBlID0+ICRDYWNoZSApOwogICAgICAgIH0KICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tc2VydmljZScgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHRlc3Qgc2VydmljZQogICAgICAgIG15ICRTZXJ2aWNlTmFtZSA9ICJTZXJ2aWNlIiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFNlcnZpY2VJRCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUFkZCgKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlcnZpY2VOYW1lLAogICAgICAgICAgICBWYWxpZElEICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICA9PiAnU2VsZW5pdW0gVGVzdCBTZXJ2aWNlJywKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gMiwKICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VydmljZUlELAogICAgICAgICAgICAiU2VydmljZSBpcyBjcmVhdGVkIC0gSUQgJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTVNlcnZpY2Ugc2NyZWVuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNU2VydmljZSIpOwoKICAgICAgICAjIGNoZWNrIG92ZXJ2aWV3IHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUiLCAgICAgICAgICAgICAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGhlYWQgdHIgdGgiLCAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGJvZHkgdHIgdGQiLCAnY3NzJyApOwoKICAgICAgICAjIGNoZWNrIGZvciBsaW5rIHRvIEFnZW50SVRTTVNlcnZpY2Vab29tIHNjcmVlbgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgIkFjdGlvbj1BZ2VudElUU01TZXJ2aWNlWm9vbTtTZXJ2aWNlSUQ9JFNlcnZpY2VJRCIgKSA+IC0xLAogICAgICAgICAgICAiTGluayB0byBBZ2VudElUU01TZXJ2aWNlWm9vbSBmb3IgU2VydmljZSBJRCAkU2VydmljZUlEIC0gZm91bmQiLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IERCIG9iamVjdAogICAgICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IHNlcnZpY2UgcHJlZmVyZW5jZXMKICAgICAgICBteSAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gc2VydmljZV9wcmVmZXJlbmNlcyBXSEVSRSBzZXJ2aWNlX2lkID0gJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJTZXJ2aWNlIHByZWZlcmVuY2VzIGlzIGRlbGV0ZWQgLSBJRCAkU2VydmljZUlEIiwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IHNlcnZpY2UKICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gc2VydmljZSBXSEVSRSBpZCA9ICRTZXJ2aWNlSUQiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiU2VydmljZSBpcyBkZWxldGVkIC0gSUQgJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgICAgICBUeXBlID0+ICdTZXJ2aWNlJwogICAgICAgICk7CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCm15ICRTZWxlbml1bSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6U2VsZW5pdW0nKTsKCmlmICggJFNlbGVuaXVtLT57YnJvd3Nlcl9uYW1lfSBuZSAnZmlyZWZveCcgKSB7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAxLAogICAgICAgICdQREYgdGVzdCBjdXJyZW50bHkgc3VwcG9ydHMgRmlyZWZveCBvbmx5JwogICAgKTsKICAgIHJldHVybiAxOwp9CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tc2VydmljZScgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHRlc3Qgc2VydmljZQogICAgICAgIG15ICRTZXJ2aWNlTmFtZSA9ICJTZXJ2aWNlIiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFNlcnZpY2VJRCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUFkZCgKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlcnZpY2VOYW1lLAogICAgICAgICAgICBWYWxpZElEICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICA9PiAnU2VsZW5pdW0gVGVzdCBTZXJ2aWNlJywKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gMiwKICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VydmljZUlELAogICAgICAgICAgICAiU2VydmljZSBpcyBjcmVhdGVkIC0gSUQgJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTVNlcnZpY2Vab29tIHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTVNlcnZpY2Vab29tO1NlcnZpY2VJRD0kU2VydmljZUlEIik7CgogICAgICAgICMgY2xpY2sgb24gcHJpbnQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRJVFNNU2VydmljZVByaW50O1NlcnZpY2VJRD0kU2VydmljZUlEXCcgKV0iKQogICAgICAgICAgICAtPmNsaWNrKCk7CgogICAgICAgICMgc3dpdGNoIHRvIGFub3RoZXIgd2luZG93CiAgICAgICAgbXkgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIHdhaXQgdW50aWwgcHJpbnQgc2NyZWVuIGlzIGxvYWRlZAogICAgICAgIEFDVElWRVNMRUVQOgogICAgICAgIGZvciBteSAkU2Vjb25kICggMSAuLiAyMCApIHsKICAgICAgICAgICAgaWYgKCBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgInByaW50ZWQgYnkiICkgPiAtMSwgKSB7CiAgICAgICAgICAgICAgICBsYXN0IEFDVElWRVNMRUVQOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNsZWVwIDE7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGZvciBwcmludGVkIHZhbHVlcyBvZiB0ZXN0IHNlcnZpY2UKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICIkU2VydmljZU5hbWUiICkgPiAtMSwKICAgICAgICAgICAgIlNlcnZpY2U6ICRTZXJ2aWNlTmFtZSAtIGZvdW5kIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgIk9wZXJhdGlvbmFsIiApID4gLTEsCiAgICAgICAgICAgICJDdXJyZW50IEluY2lkZW50OiBPcGVyYXRpb25hbCAtIGZvdW5kIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgIjMgbm9ybWFsIiApID4gLTEsCiAgICAgICAgICAgICJDcml0aWNhbGl0eTogMyBub3JtYWwgLSBmb3VuZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgREIgb2JqZWN0CiAgICAgICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgICAgICMgY2xlYW4gdXAgc2VydmljZSBkYXRhCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2VfcHJlZmVyZW5jZXMgV0hFUkUgc2VydmljZV9pZCA9ICRTZXJ2aWNlSUQiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiU2VydmljZSBwcmVmZXJlbmNlcyBpcyBkZWxldGVkIC0gSUQgJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBzZXJ2aWNlCiAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2UgV0hFUkUgaWQgPSAkU2VydmljZUlEIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlNlcnZpY2UgaXMgZGVsZXRlZCAtIElEICRTZXJ2aWNlSUQiLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICAgICAgVHlwZSA9PiAnU2VydmljZScKICAgICAgICApOwoKICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tc2VydmljZScgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHRlc3Qgc2VydmljZQogICAgICAgIG15ICRTZXJ2aWNlTmFtZSA9ICJTZXJ2aWNlIiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFNlcnZpY2VJRCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUFkZCgKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlcnZpY2VOYW1lLAogICAgICAgICAgICBWYWxpZElEICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICA9PiAnU2VsZW5pdW0gVGVzdCBTZXJ2aWNlJywKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gMiwKICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VydmljZUlELAogICAgICAgICAgICAiU2VydmljZSBpcyBjcmVhdGVkIC0gSUQgJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTVNlcnZpY2Vab29tIHNjcmVlbiB3aXRoIG5vIFNlcnZpY2VJRCwgZXhwZWN0aW5nIGVycm9yIG1lc3NhZ2Ugc2NyZWVuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNU2VydmljZVpvb207U2VydmljZUlEPSIpOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJ05vIFNlcnZpY2VJRCBpcyBnaXZlbiEnICkgPiAtMSwKICAgICAgICAgICAgIkVycm9yIG1lc3NhZ2Ugd2l0aG91dCBzZXJ2aWNlIElEIC0gZm91bmQiLAogICAgICAgICk7CgogICAgICAgICMgbmF2aWdhdGUgdG8gQWdlbnRJVFNNU2VydmljZVpvb20gc2NyZWVuIHdpdGggd3JvbmcgU2VydmljZUlELCBleHBlY3RpbmcgZXJyb3IgbWVzc2FnZSBzY3JlZW4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01TZXJ2aWNlWm9vbTtTZXJ2aWNlSUQ9YXNkIik7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAnU2VydmljZUlEIGFzZCBub3QgZm91bmQgaW4gZGF0YWJhc2UhJyApID4gLTEsCiAgICAgICAgICAgICJFcnJvciBtZXNzYWdlIHdpdGggd3Jvbmcgc2VydmljZSBJRCAtIGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTVNlcnZpY2Vab29tIHNjcmVlbiB3aXRoIGNvcnJlY3QgU2VydmljZUlECiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNU2VydmljZVpvb207U2VydmljZUlEPSRTZXJ2aWNlSUQiKTsKCiAgICAgICAgIyBjaGVjayBmb3IgQWdlbnRJVFNNU2VydmljZVpvb20gZmllbGRzCiAgICAgICAgbXkgQEVsZW1lbnRMaXN0ID0gKCAnQ29udGVudENvbHVtbicsICdTaWRlYmFyQ29sdW1uJyApOwogICAgICAgIGZvciBteSAkRWxlbWVudENoZWNrIChARWxlbWVudExpc3QpIHsKICAgICAgICAgICAgbXkgJEVsZW1lbnQgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi4kRWxlbWVudENoZWNrIiwgJ2NzcycgKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJTZXJ2aWNlOiAkU2VydmljZU5hbWUiICkgPiAtMSwKICAgICAgICAgICAgIlNlcnZpY2U6ICRTZXJ2aWNlTmFtZSAtIGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBEQiBvYmplY3QKICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBzZXJ2aWNlIHByZWZlcmVuY2VzCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2VfcHJlZmVyZW5jZXMgV0hFUkUgc2VydmljZV9pZCA9ICRTZXJ2aWNlSUQiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiU2VydmljZSBwcmVmZXJlbmNlcyBpcyBkZWxldGVkIC0gSUQgJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBzZXJ2aWNlCiAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2UgV0hFUkUgaWQgPSAkU2VydmljZUlEIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlNlcnZpY2UgaXMgZGVsZXRlZCAtIElEICRTZXJ2aWNlSUQiLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICAgICAgVHlwZSA9PiAnU2VydmljZScKICAgICAgICApOwogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tc2VydmljZScgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgU0xBCiAgICAgICAgbXkgJFNMQU5hbWUgPSAiU0xBIiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFNMQUlEICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyktPlNMQUFkZCgKICAgICAgICAgICAgTmFtZSAgICA9PiAkU0xBTmFtZSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICdTZWxlbml1bSB0ZXN0IFNMQScsCiAgICAgICAgICAgIFR5cGVJRCAgPT4gMiwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTTEFJRCwKICAgICAgICAgICAgIlNMQSBpcyBjcmVhdGVkIC0gSUQgJFNMQUlEIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzY3JpcHQgYWxpYXMKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgbmF2aWdhdGUgdG8gQWdlbnRJVFNNU0xBIHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTVNMQSIpOwoKICAgICAgICAjIGNoZWNrIG92ZXJ2aWV3IHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUiLCAgICAgICAgICAgICAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGhlYWQgdHIgdGgiLCAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGJvZHkgdHIgdGQiLCAnY3NzJyApOwoKICAgICAgICAjIGNoZWNrIGZvciBsaW5rIHRvIEFnZW50SVRTTVNMQVpvb20gc2NyZWVuCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAiQWN0aW9uPUFnZW50SVRTTVNMQVpvb207U0xBSUQ9JFNMQUlEIiApID4gLTEsCiAgICAgICAgICAgICJMaW5rIHRvIEFnZW50SVRTTVNMQVpvb20gZm9yIFNMQSBJRCAkU0xBSUQgLSBmb3VuZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBTTEEKICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBzbGEgV0hFUkUgaWQgPSAkU0xBSUQiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiU0xBIGlzIGRlbGV0ZWQgLSBJRCAkU0xBSUQiLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICAgICAgVHlwZSA9PiAnU0xBJwogICAgICAgICk7CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCm15ICRTZWxlbml1bSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6U2VsZW5pdW0nKTsKCmlmICggJFNlbGVuaXVtLT57YnJvd3Nlcl9uYW1lfSBuZSAnZmlyZWZveCcgKSB7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAxLAogICAgICAgICdQREYgdGVzdCBjdXJyZW50bHkgc3VwcG9ydHMgRmlyZWZveCBvbmx5JwogICAgKTsKICAgIHJldHVybiAxOwp9CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tc2VydmljZScgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgU0xBCiAgICAgICAgbXkgJFNMQU5hbWUgPSAiU0xBIiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFNMQUlEICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyktPlNMQUFkZCgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgPT4gJFNMQU5hbWUsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lID0+IDEyMCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgPT4gMTgwLAogICAgICAgICAgICBTb2x1dGlvblRpbWUgICAgICA9PiA1ODAsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgID0+ICdTZWxlbml1bSB0ZXN0IFNMQScsCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgICAgID0+IDIsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNMQUlELAogICAgICAgICAgICAiU0xBIGlzIGNyZWF0ZWQgLSBJRCAkU0xBSUQiLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZ2VudElUU01TTEFab29tIHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTVNMQVpvb207U0xBSUQ9JFNMQUlEIik7CgogICAgICAgICMgY2xpY2sgb24gcHJpbnQgbWVudQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudElUU01TTEFQcmludDtTTEFJRD0kU0xBSURcJyApXSIpLT5jbGljaygpOwoKICAgICAgICAjIHN3aXRjaCB0byBhbm90aGVyIHdpbmRvdwogICAgICAgIG15ICRIYW5kbGVzID0gJFNlbGVuaXVtLT5nZXRfd2luZG93X2hhbmRsZXMoKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMV0gKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIHByaW50IHNjcmVlbiBpcyBsb2FkZWQKICAgICAgICBBQ1RJVkVTTEVFUDoKICAgICAgICBmb3IgbXkgJFNlY29uZCAoIDEgLi4gMjAgKSB7CiAgICAgICAgICAgIGlmICggaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJwcmludGVkIGJ5IiApID4gLTEsICkgewogICAgICAgICAgICAgICAgbGFzdCBBQ1RJVkVTTEVFUDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzbGVlcCAxOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBmb3IgcHJpbnRlZCB2YWx1ZXMgb2YgdGVzdCBTTEEKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICIkU0xBTmFtZSIgKSA+IC0xLAogICAgICAgICAgICAiU2VydmljZTogJFNMQU5hbWUgLSBmb3VuZCIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJDYWxlbmRhciBEZWZhdWx0IiApID4gLTEsCiAgICAgICAgICAgICJDYWxlbmRhcjogQ2FsZW5kYXIgRGVmYXVsdCAtIGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICBteSBAUmVzcG9uZFRpbWUgPSAoIDEyMCwgMTgwLCA1ODAgKTsKICAgICAgICBmb3IgbXkgJFRpbWUgKEBSZXNwb25kVGltZSkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkVGltZSAuICIgbWludXRlcyIgKSA+IC0xLAogICAgICAgICAgICAgICAgIlJlc3BvbmQgJFRpbWUgbWludXRlcyAtIGZvdW5kIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZGVsZXRlIHRlc3QgU0xBCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gc2xhIFdIRVJFIGlkID0gJFNMQUlEIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlNMQSBpcyBkZWxldGVkIC0gSUQgJFNMQUlEIiwKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgICAgIFR5cGUgPT4gJ1NMQScKICAgICAgICApOwogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tc2VydmljZScgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgU0xBCiAgICAgICAgbXkgJFNMQU5hbWUgPSAiU0xBIiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFNMQUlEICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyktPlNMQUFkZCgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgPT4gJFNMQU5hbWUsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lID0+IDEyMCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgPT4gMTgwLAogICAgICAgICAgICBTb2x1dGlvblRpbWUgICAgICA9PiA1ODAsCiAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgID0+ICdTZWxlbml1bSB0ZXN0IFNMQScsCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgICAgID0+IDIsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNMQUlELAogICAgICAgICAgICAiU0xBIGlzIGNyZWF0ZWQgLSBJRCAkU0xBSUQiLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZ2VudElUU01TTEFab29tIHNjcmVlbiB3aXRoIG5vIFNMQUlELCBleHBlY3RpbmcgZXJyb3IgbWVzc2FnZSBzY3JlZW4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01TTEFab29tO1NMQUlEPSIpOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJ05vIFNMQUlEIGlzIGdpdmVuIScgKSA+IC0xLAogICAgICAgICAgICAiRXJyb3IgbWVzc2FnZSB3aXRob3V0IFNMQSBJRCAtIGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50SVRTTVNMQVpvb20gc2NyZWVuIHdpdGggd3JvbmcgU0xBSUQsIGV4cGVjdGluZyBlcnJvciBtZXNzYWdlIHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTVNMQVpvb207U0xBSUQ9YXNkIik7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAnU0xBSUQgYXNkIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEnICkgPiAtMSwKICAgICAgICAgICAgIkVycm9yIG1lc3NhZ2Ugd2l0aCB3cm9uZyBTTEEgSUQgLSBmb3VuZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZ2VudElUU01TTEFab29tIHNjcmVlbiB3aXRoIGNvcnJlY3QgU0xBSUQKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01TTEFab29tO1NMQUlEPSRTTEFJRCIpOwoKICAgICAgICAjIGNoZWNrIGZvciBBZ2VudElUU01TTEFab29tIGZpZWxkcwogICAgICAgIG15IEBFbGVtZW50TGlzdCA9ICggJ0NvbnRlbnRDb2x1bW4nLCAnU2lkZWJhckNvbHVtbicgKTsKICAgICAgICBmb3IgbXkgJEVsZW1lbnRDaGVjayAoQEVsZW1lbnRMaXN0KSB7CiAgICAgICAgICAgIG15ICRFbGVtZW50ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuJEVsZW1lbnRDaGVjayIsICdjc3MnICk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19lbmFibGVkKCk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19kaXNwbGF5ZWQoKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAiU0xBOiAkU0xBTmFtZSIgKSA+IC0xLAogICAgICAgICAgICAiU0xBOiAkU0xBTmFtZSAtIGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGZvciByZXNwb25kIHRpbWVzCiAgICAgICAgbXkgQFJlc3BvbmRUaW1lID0gKCAxMjAsIDE4MCwgNTgwICk7CiAgICAgICAgZm9yIG15ICRUaW1lIChAUmVzcG9uZFRpbWUpIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFRpbWUgLiAiIG1pbnV0ZXMiICkgPiAtMSwKICAgICAgICAgICAgICAgICJSZXNwb25kICRUaW1lIG1pbnV0ZXMgLSBmb3VuZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IFNMQQogICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNsYSBXSEVSRSBpZCA9ICRTTEFJRCIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJTTEEgaXMgZGVsZXRlZCAtIElEICRTTEFJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgICAgICBUeXBlID0+ICdTTEEnCiAgICAgICAgKTsKICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA0ZmUyMThiZWNjZGI5MjZhMjlkZDdiZWQ5ZGU0ODIxMTQzMGQ2OWQwIC0gc2NyaXB0cy90ZXN0L1NlbGVuaXVtL0FnZW50L0FnZW50VGlja2V0U2VydmljZS50CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgojIGdldCBzZWxlbml1bSBvYmplY3QKbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgICAgICBteSAkSGVscGVyICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgIyBkbyBub3QgY2hlY2sgZW1haWwgYWRkcmVzc2VzCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgICAgICBWYWx1ZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgZW5hYmxlIHRpY2tldCBzZXJ2aWNlIGZlYXR1cmUKICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnVGlja2V0OjpTZXJ2aWNlJywKICAgICAgICAgICAgVmFsdWUgPT4gMQogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgdXNlciBhbmQgbG9naW4KICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyAnYWRtaW4nLCAndXNlcnMnIF0sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzZXJ2aWNlIG9iamVjdAogICAgICAgIG15ICRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKTsKCiAgICAgICAgIyBjcmVhdGUgdHdvIHRlc3Qgc2VydmljZXMKICAgICAgICBteSBAU2VydmljZUlEczsKICAgICAgICBteSBAU2VydmljZU5hbWVzOwogICAgICAgIGZvciBteSAkU2VydmljZSAocXcoUGFyZW50IENoaWxkKSkgewogICAgICAgICAgICBteSAkU2VydmljZU5hbWUgPSAkU2VydmljZSAuICdTZXJ2aWNlJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgICAgIG15ICRTZXJ2aWNlSUQgICA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlQWRkKAogICAgICAgICAgICAgICAgTmFtZSAgICA9PiAkU2VydmljZU5hbWUsCiAgICAgICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdTZWxlbml1bSBUZXN0JywKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgICJTZXJ2aWNlIElEICRTZXJ2aWNlSUQgaXMgY3JlYXRlZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQFNlcnZpY2VJRHMsICAgJFNlcnZpY2VJRDsKICAgICAgICAgICAgcHVzaCBAU2VydmljZU5hbWVzLCAkU2VydmljZU5hbWU7CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSBzZWNvbmQgc2VydmljZSB0byBiZSBjaGlsZCBvZiBmaXJzdCBvbmUKICAgICAgICBteSAkU3VjY2VzcyA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlVXBkYXRlKAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRHNbMV0sCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VydmljZU5hbWVzWzFdLAogICAgICAgICAgICBQYXJlbnRJRCAgPT4gJFNlcnZpY2VJRHNbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgICA9PiAxLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiU2VydmljZSBJRCAkU2VydmljZUlEc1sxXSBpcyBub3cgY2hpbGQgc2VydmljZSIKICAgICAgICApOwoKICAgICAgICAjIHVwZGF0ZSBwYXJlbnQgc2VydmljZSB0byBpbnZhbGlkIHN0YXR1cywgYnVnICMxMTgxNgogICAgICAgICMgdGVzdCBpZiBjaGlsZCBzZXJ2aWNlIGFyZSB2aXNpYmxlIHdoZW4gcGFyZW50IGlzIGludmFsaWQKICAgICAgICAkU3VjY2VzcyA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlVXBkYXRlKAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRHNbMF0sCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VydmljZU5hbWVzWzBdLAogICAgICAgICAgICBWYWxpZElEICAgPT4gMiwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgICAgICA9PiAxLAogICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlBhcmVudCBTZXJ2aWNlIElEICRTZXJ2aWNlSURzWzBdIGlzIGludmFsaWQiCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgdGlja2V0cwogICAgICAgIG15IEBUaWNrZXRJRHM7CiAgICAgICAgZm9yIG15ICRMb2NrIChxdyhsb2NrIHVubG9jaykpIHsKICAgICAgICAgICAgbXkgJFRpY2tldElEID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKAogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICA9PiAnU2VsZW5pdW0gVGVzdCBUaWNrZXQnLAogICAgICAgICAgICAgICAgUXVldWUgICAgICAgICA9PiAnUmF3JywKICAgICAgICAgICAgICAgIExvY2sgICAgICAgICAgPT4gJExvY2ssCiAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICczIG5vcm1hbCcsCiAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgID0+ICdvcGVuJywKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRHNbMV0sCiAgICAgICAgICAgICAgICBDdXN0b21lcklEICAgID0+ICdTZWxlbml1bUN1c3RvbWVyJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgPT4gJ1NlbGVuaXVtQ3VzdG9tZXJAbG9jYWxob3N0LmNvbScsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZUlEID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAgICAgIlRpY2tldCBJRCAkVGlja2V0SUQgaXMgY3JlYXRlZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQFRpY2tldElEcywgJFRpY2tldElEOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFnZW50VGlja2V0U2VydmljZSBzY3JlZW4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudFRpY2tldFNlcnZpY2UiKTsKCiAgICAgICAgIyB2ZXJpZnkgdGhhdCB0aGVyZSBhcmUgbm8gdGlja2V0cyB3aXRoIE15IFNlcnZpY2UgZmlsdGVyCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50VGlja2V0U2VydmljZTtTZXJ2aWNlSUQ9MDtcJyApXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJ05vIHRpY2tldCBkYXRhIGZvdW5kLicgKSA+IC0xLAogICAgICAgICAgICAiTm8gdGlja2V0cyBmb3VuZCB3aXRoIE15IFNlcnZpY2UgZmlsdGVyIiwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGZvciBwYXJlbnQgdGVzdCBzZXJ2aWNlIGZpbHRlciBidXR0b24gYW5kIGNsaWNrIG9uIGl0CiAgICAgICAgbXkgJEVsZW1lbnQgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgKICAgICAgICAgICAgIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50VGlja2V0U2VydmljZTtTZXJ2aWNlSUQ9JFNlcnZpY2VJRHNbMF07XCcgKV0iCiAgICAgICAgKTsKICAgICAgICAkRWxlbWVudC0+aXNfZW5hYmxlZCgpOwogICAgICAgICRFbGVtZW50LT5pc19kaXNwbGF5ZWQoKTsKICAgICAgICAkRWxlbWVudC0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIGNsaWNrIG9uIGNoaWxkIHNlcnZpY2UKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRUaWNrZXRTZXJ2aWNlO1NlcnZpY2VJRD0kU2VydmljZUlEc1sxXTtcJyApXSIpCiAgICAgICAgICAgIC0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIGNoZWNrIGRpZmZlcmVudCB2aWV3cyBmb3IgZmlsdGVycwogICAgICAgIGZvciBteSAkVmlldyAocXcoU21hbGwgTWVkaXVtIFByZXZpZXcpKSB7CgogICAgICAgICAgICAjIGdvIHRvIGRlZmF1bHQgc21hbGwgdmlldwogICAgICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KAogICAgICAgICAgICAgICAgIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0U2VydmljZTtTZXJ2aWNlSUQ9JFNlcnZpY2VJRHNbMV07Vmlldz1TbWFsbCIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2xpY2sgb24gdmlld2VyIGNvbnRyb2xsZXIKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoCiAgICAgICAgICAgICAgICAiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdGaWx0ZXI9VW5sb2NrZWQ7Vmlldz0kVmlldztTZXJ2aWNlSUQ9JFNlcnZpY2VJRHNbMV07U29ydEJ5PUFnZTtPcmRlckJ5PVVwO1ZpZXc9U21hbGw7XCcgKV0iCiAgICAgICAgICAgICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgICAgICMgdmVyaWZ5IHRoYXQgYWxsIGV4cGVjdGVkIHRpY2tldHMgYXJlIHByZXNlbnQKICAgICAgICAgICAgZm9yIG15ICRUaWNrZXRJRCAoQFRpY2tldElEcykgewoKICAgICAgICAgICAgICAgIG15ICVUaWNrZXREYXRhID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBsb2NrZWQgYW5kIHVubG9ja2VkIHRpY2tldHMKICAgICAgICAgICAgICAgIGlmICggJFRpY2tldERhdGF7TG9ja30gZXEgJ3VubG9jaycgKSB7CgogICAgICAgICAgICAgICAgICAgICMgY2xpY2sgb24gJ0F2YWlsYWJsZSB0aWNrZXQnIGZpbHRlcgogICAgICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KAogICAgICAgICAgICAgICAgICAgICAgICAiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdTZXJ2aWNlSUQ9JFNlcnZpY2VJRHNbMV07U29ydEJ5PUFnZTtPcmRlckJ5PVVwO1ZpZXc9JFZpZXc7RmlsdGVyPVVubG9ja2VkXCcgKV0iCiAgICAgICAgICAgICAgICAgICAgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciB1bmxvY2tlZCB0aWNrZXRzIHdpdGggJ0F2YWlsYWJsZSB0aWNrZXRzJyBmaWx0ZXIgb24KICAgICAgICAgICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICRUaWNrZXREYXRhe1RpY2tldE51bWJlcn0gKSA+IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAiVGlja2V0IGZvdW5kIG9uIHBhZ2Ugd2l0aCAnQXZhaWxhYmxlIHRpY2tldHMnIGZpbHRlciAtICRUaWNrZXREYXRhe1RpY2tldE51bWJlcn0gIiwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGNsaWNrIG9uICdBbGwgdGlja2V0JyBmaWx0ZXIKICAgICAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgKICAgICAgICAgICAgICAgICAgICAgICAgIi8vYVtjb250YWlucyhcQGhyZWYsIFwnU2VydmljZUlEPSRTZXJ2aWNlSURzWzFdO1NvcnRCeT1BZ2U7T3JkZXJCeT1VcDtWaWV3PSRWaWV3O0ZpbHRlcj1BbGxcJyApXSIKICAgICAgICAgICAgICAgICAgICApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZm9yIHVubG9ja2VkIHRpY2tldHMgd2l0aCAnQWxsIHRpY2tldHMnIGZpbHRlciBvbgogICAgICAgICAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFRpY2tldERhdGF7VGlja2V0TnVtYmVyfSApID4gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICJUaWNrZXQgZm91bmQgb24gcGFnZSB3aXRoICdBbGwgdGlja2V0cycgZmlsdGVyIG9uIC0gJFRpY2tldERhdGF7VGlja2V0TnVtYmVyfSAiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgIyBjbGljayBvbiAnQWxsIHRpY2tldCcgZmlsdGVyCiAgICAgICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICIvL2FbY29udGFpbnMoXEBocmVmLCBcJ1NlcnZpY2VJRD0kU2VydmljZUlEc1sxXTtTb3J0Qnk9QWdlO09yZGVyQnk9VXA7Vmlldz0kVmlldztGaWx0ZXI9QWxsXCcgKV0iCiAgICAgICAgICAgICAgICAgICAgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBsb2NrZWQgdGlja2V0cyB3aXRoICAnQWxsIHRpY2tldCcgZmlsdGVyCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkVGlja2V0RGF0YXtUaWNrZXROdW1iZXJ9ICkgPiAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgIkxvY2tlZCBUaWNrZXQgZm91bmQgb24gcGFnZSB3aXRoICdBbGwgdGlja2V0cycgZmlsdGVyIG9uIC0gJFRpY2tldERhdGF7VGlja2V0TnVtYmVyfSAiLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgY2xpY2sgb24gJ0F2YWlsYWJsZSB0aWNrZXQnIGZpbHRlcgogICAgICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KAogICAgICAgICAgICAgICAgICAgICAgICAiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdTZXJ2aWNlSUQ9JFNlcnZpY2VJRHNbMV07U29ydEJ5PUFnZTtPcmRlckJ5PVVwO1ZpZXc9JFZpZXc7RmlsdGVyPVVubG9ja2VkXCcgKV0iCiAgICAgICAgICAgICAgICAgICAgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBsb2NrZWQgdGlja2V0cyB3aXRoICdBdmFpbGFibGUgdGlja2V0cycgZmlsdGVyIG9uCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkVGlja2V0RGF0YXtUaWNrZXROdW1iZXJ9ICkgPT0gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICJEaWQgbm90IGZpbmQgbG9ja2VkIHRpY2tldCAtICRUaWNrZXREYXRhe1RpY2tldE51bWJlcn0gLSB3aXRoICdBdmFpbGFibGUgdGlja2V0cycgZmlsdGVyIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSBjcmVhdGVkIHRlc3QgdGlja2V0cwogICAgICAgIGZvciBteSAkVGlja2V0SUQgKEBUaWNrZXRJRHMpIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXREZWxldGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBUaWNrZXQgZGVsZXRpb24gY291bGQgZmFpbCBpZiBhcGFjaGUgc3RpbGwgd3JpdGVzIHRvIHRpY2tldCBoaXN0b3J5LiBUcnkgYWdhaW4gaW4gdGhpcyBjYXNlLgogICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgIHNsZWVwIDM7CiAgICAgICAgICAgICAgICAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJUaWNrZXQgSUQgJFRpY2tldElEIGlzIGRlbGV0ZWQiCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSBjcmVhdGVkIHRlc3Qgc2VydmljZQogICAgICAgIGZvciBteSAkU2VydmljZURlbGV0ZSAoQFNlcnZpY2VJRHMpIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2UgV0hFUkUgaWQgPSAkU2VydmljZURlbGV0ZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiU2VydmljZSBJRCAkU2VydmljZURlbGV0ZSBpcyBkZWxldGVkIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgbWFrZSBzdXJlIHRoZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgZm9yIG15ICRDYWNoZSAoCiAgICAgICAgICAgIHF3IChUaWNrZXQgU2VydmljZSkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgICAgICAgICBUeXBlID0+ICRDYWNoZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA0ZmUyMThiZWNjZGI5MjZhMjlkZDdiZWQ5ZGU0ODIxMTQzMGQ2OWQwIC0gc2NyaXB0cy90ZXN0L1NlbGVuaXVtL091dHB1dC9QREZUaWNrZXQudAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKaWYgKCAkU2VsZW5pdW0tPnticm93c2VyX25hbWV9IG5lICdmaXJlZm94JyApIHsKICAgICRTZWxmLT5UcnVlKAogICAgICAgIDEsCiAgICAgICAgIlBERiB0ZXN0IGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIEZpcmVmb3giLAogICAgKTsKICAgIHJldHVybiAxOwp9CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICBteSAkSGVscGVyICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgogICAgICAgICMgRG8gbm90IGNoZWNrIGVtYWlsIGFkZHJlc3Nlcy4KICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICAgICAgICAgIFZhbHVlID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBFbmFibGUgdGlja2V0IFJlc3BvbnNpYmxlIGZlYXR1cmUuCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6UmVzcG9uc2libGUnLAogICAgICAgICAgICBWYWx1ZSA9PiAxCiAgICAgICAgKTsKCiAgICAgICAgIyBFbmFibGUgdGlja2V0IFR5cGUgZmVhdHVyZS4KICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnVGlja2V0OjpUeXBlJywKICAgICAgICAgICAgVmFsdWUgPT4gMQogICAgICAgICk7CgogICAgICAgICMgRW5hYmxlIHRpY2tldCBzZXJ2aWNlIGZlYXR1cmUuCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6U2VydmljZScsCiAgICAgICAgICAgIFZhbHVlID0+IDEKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSBRdWV1ZS4KICAgICAgICBteSAkUXVldWVOYW1lID0gJ1F1ZScgLiAkUmFuZG9tSUQ7CiAgICAgICAgbXkgJFF1ZXVlSUQgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUFkZCgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgID0+ICRRdWV1ZU5hbWUsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICA9PiAxLAogICAgICAgICAgICBHcm91cElEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgU3lzdGVtQWRkcmVzc0lEID0+IDEsCiAgICAgICAgICAgIFNhbHV0YXRpb25JRCAgICA9PiAxLAogICAgICAgICAgICBTaWduYXR1cmVJRCAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgID0+ICdTZWxlbml1bSBRdWV1ZScsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRRdWV1ZUlELAogICAgICAgICAgICAiQ3JlYXRlZCBRdWV1ZUlEICRRdWV1ZUlEIgogICAgICAgICk7CiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KCiMgZ2V0IHRoZSBsaXN0IG9mIHNlcnZpY2UgdHlwZXMgZnJvbSBnZW5lcmFsIGNhdGFsb2cKbXkgJFNlcnZpY2VUeXBlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKKTsKCiMgYnVpbGQgYSBsb29rdXAgaGFzaApteSAlU2VydmljZVR5cGVOYW1lMklEID0gcmV2ZXJzZSAleyAkU2VydmljZVR5cGVMaXN0IH07CgojIGdldCB0aGUgbGlzdCBvZiBzbGEgdHlwZXMgZnJvbSBnZW5lcmFsIGNhdGFsb2cKbXkgJFNMQVR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OlNMQTo6VHlwZScsCik7CgojIGJ1aWxkIGEgbG9va3VwIGhhc2gKbXkgJVNMQVR5cGVOYW1lMklEID0gcmV2ZXJzZSAleyAkU0xBVHlwZUxpc3QgfTsKCiMgR2V0IHRoZSBjdXJyZW50IHNldHRpbmcgZm9yIGN1c3RvbWVyIHRpY2tldCBwcmludApteSAlQ3VzdG9tZXJUaWNrZXRQcmludFN5c0NvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcnKS0+U2V0dGluZ0dldCgKICAgIE5hbWUgPT4gJ0N1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZSMjI0N1c3RvbWVyVGlja2V0UHJpbnQnLAopOwoKIyBNYWtlIHN1cmUgQ3VzdG9tZXJUaWNrZXQgcHJpbnQgaXMgZW5hYmxlZC4KJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgIFZhbGlkID0+IDEsCiAgICBLZXkgICA9PiAnQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlIyMjQ3VzdG9tZXJUaWNrZXRQcmludCcsCiAgICBWYWx1ZSA9PiAkQ3VzdG9tZXJUaWNrZXRQcmludFN5c0NvbmZpZ3tFZmZlY3RpdmVWYWx1ZX0sCik7CgojIC0tLQoKICAgICAgICAjIENyZWF0ZSBTZXJ2aWNlLgogICAgICAgIG15ICRTZXJ2aWNlTmFtZSA9ICdTZXJ2aScgLiAkUmFuZG9tSUQ7CiAgICAgICAgbXkgJFNlcnZpY2VJRCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUFkZCgKICAgICAgICAgICAgTmFtZSAgICA9PiAkU2VydmljZU5hbWUsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gJFNlcnZpY2VUeXBlTmFtZTJJRHtUcmFpbmluZ30sCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnU2VsZW5pdW0gU2VydmljZScsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VydmljZUlELAogICAgICAgICAgICAiQ3JlYXRlZCBTZXJ2aWNlSUQgJFNlcnZpY2VJRCIKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSBTTEEuCiAgICAgICAgbXkgJFNMQU5hbWUgPSAnU0wnIC4gJFJhbmRvbUlEOwogICAgICAgIG15ICRTTEFJRCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNMQScpLT5TTEFBZGQoCiAgICAgICAgICAgIFNlcnZpY2VJRHMgICAgICAgID0+IFskU2VydmljZUlEXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgPT4gJFNMQU5hbWUsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+ICRTTEFUeXBlTmFtZTJJRHtPdGhlcn0sCiMgLS0tCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lID0+IDUwLAogICAgICAgICAgICBVcGRhdGVUaW1lICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgID0+IDIwMCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICAgPT4gJ1NlbGVuaXVtIFNMQScsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICAgICAgPT4gJFNlcnZpY2VUeXBlTmFtZTJJRHtUcmFpbmluZ30sCiMgLS0tCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFF1ZXVlSUQsCiAgICAgICAgICAgICJDcmVhdGVkIFNMQUlEICRRdWV1ZUlEIgogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIFR5cGUuCiAgICAgICAgbXkgJFR5cGVOYW1lID0gJ1R5cGUnIC4gJFJhbmRvbUlEOwogICAgICAgIG15ICRUeXBlSUQgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyktPlR5cGVBZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFR5cGVOYW1lLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVHlwZUlELAogICAgICAgICAgICAiQ3JlYXRlZCBUeXBlSUQgJFR5cGVJRCIKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSBVc2Vycy4KICAgICAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CiAgICAgICAgbXkgQFVzZXJzOwogICAgICAgIGZvciBteSAkVXNlckNvdW50ICggMSAuLiAyICkgewoKICAgICAgICAgICAgIyBDcmVhdGUgdGVzdCBVc2VyIGFuZCBsb2dpbi4KICAgICAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgICAgIEdyb3VwcyA9PiBbJ3VzZXJzJ10sCiAgICAgICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAgICAgIyBHZXQgdXNlciBkYXRhLgogICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBAVXNlcnMsIFwlVXNlckRhdGE7CiAgICAgICAgfQoKICAgICAgICAjIENyZWF0ZSBDdXN0b21lciBDb21wYW55LgogICAgICAgIG15ICVDdXN0b21lckNvbXBhbnkgPSAoCiAgICAgICAgICAgIEN1c3RvbWVySUQgICAgICAgICAgICAgPT4gJ0N1c3RvbWVyJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgQ3VzdG9tZXJDb21wYW55TmFtZSAgICA9PiAnQ29tcGFueScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIEN1c3RvbWVyQ29tcGFueVN0cmVldCAgPT4gJ1N0cmVldCcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIEN1c3RvbWVyQ29tcGFueVpJUCAgICAgPT4gJ1pJUCcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIEN1c3RvbWVyQ29tcGFueUNpdHkgICAgPT4gJ0NpdHknIC4gJFJhbmRvbUlELAogICAgICAgICAgICBDdXN0b21lckNvbXBhbnlDb3VudHJ5ID0+ICdDb3VudHJ5JyAuICRSYW5kb21JRCwKICAgICAgICAgICAgQ3VzdG9tZXJDb21wYW55VVJMICAgICA9PiAnVVJMJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgQ3VzdG9tZXJDb21wYW55Q29tbWVudCA9PiAnQ29tbWVudCcgLiAkUmFuZG9tSUQsCiAgICAgICAgKTsKICAgICAgICBteSAkQ3VzdG9tZXJDb21wYW55SUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55JyktPkN1c3RvbWVyQ29tcGFueUFkZCgKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgICVDdXN0b21lckNvbXBhbnksCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJEN1c3RvbWVyQ29tcGFueUlELAogICAgICAgICAgICAiQ3JlYXRlZCBDdXN0b21lckNvbXBhbnlJRCAkQ3VzdG9tZXJDb21wYW55SUQiCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgQ3VzdG9tZXIgVXNlci4KICAgICAgICBteSAlQ3VzdG9tZXJVc2VyID0gKAogICAgICAgICAgICBVc2VyRmlyc3RuYW1lICA9PiAnQ3VzdG9tZXJGaXJzdE5hbWUnIC4gJFJhbmRvbUlELAogICAgICAgICAgICBVc2VyTGFzdG5hbWUgICA9PiAnQ3VzdG9tZXJMYXN0TmFtZScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIFVzZXJDdXN0b21lcklEID0+ICRDdXN0b21lckNvbXBhbnlJRCwKICAgICAgICAgICAgVXNlckxvZ2luICAgICAgPT4gJ0N1c3RvbWVyTG9naW4nIC4gJFJhbmRvbUlELAogICAgICAgICAgICBVc2VyUGFzc3dvcmQgICA9PiAnQ3VzdG9tZXJQYXNzJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgVXNlckVtYWlsICAgICAgPT4gJ0N1c3RvbWVyRW1haWwnIC4gJFJhbmRvbUlEIC4gJ0BleGFtcGxlLmNvbScsCiAgICAgICAgKTsKICAgICAgICBteSAkQ3VzdG9tZXJVc2VySUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyVXNlckFkZCgKICAgICAgICAgICAgU291cmNlICA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgICVDdXN0b21lclVzZXIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklELAogICAgICAgICAgICAiQ3JlYXRlZCBDdXN0b21lclVzZXJJRCAkQ3VzdG9tZXJVc2VySUQiCiAgICAgICAgKTsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRDdXN0b21lclVzZXJJRCwKICAgICAgICAgICAgS2V5ICAgID0+ICdVc2VyTGFuZ3VhZ2UnLAogICAgICAgICAgICBWYWx1ZSAgPT4gJ2VuJywKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSBUaWNrZXRzLgogICAgICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICAgICAgbXkgQFRpY2tldHM7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICAgICAgbXkgJFRpY2tldE51bWJlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZU51bWJlcigpOwogICAgICAgICAgICBteSAkVGlja2V0VGl0bGUgID0gJ1RpY2tldCcgLiAkQ291bnQgLiAkUmFuZG9tSUQ7CiAgICAgICAgICAgIG15ICVUaWNrZXQgICAgICAgPSAoCiAgICAgICAgICAgICAgICBUTiAgICAgICAgICAgID0+ICRUaWNrZXROdW1iZXIsCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICRUaWNrZXRUaXRsZSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgICAgICBMb2NrICAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnNSB2ZXJ5IGhpZ2gnLAogICAgICAgICAgICAgICAgU3RhdGUgICAgICAgICA9PiAnb3BlbicsCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgICAgPT4gJEN1c3RvbWVyQ29tcGFueUlELAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkQ3VzdG9tZXJVc2VySUQsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgID0+ICRVc2Vyc1swXS0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZUlEID0+ICRVc2Vyc1sxXS0+e1VzZXJJRH0sCgogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAgICAgIkNyZWF0ZWQgVGlja2V0SUQgJFRpY2tldElEIgogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBUaWNrZXRzLCB7CiAgICAgICAgICAgICAgICBJRCAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTnVtYmVyID0+ICRUaWNrZXROdW1iZXIsCiAgICAgICAgICAgICAgICBUaXRsZSAgPT4gJFRpY2tldFRpdGxlLAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgIyBSZWNyZWF0ZSBUaWNrZXRPYmplY3QgdG8gbGV0IGV2ZW50IGhhbmRsZXJzIHJ1biBhbHNvIGZvciB0cmFuc2FjdGlvbiBtb2RlLgogICAgICAgICRLZXJuZWw6Ok9NLT5PYmplY3RzRGlzY2FyZCgKICAgICAgICAgICAgT2JqZWN0cyA9PiBbCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgICAgICAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICAgICAjIENyZWF0ZSBBcnRpY2xlcy4KICAgICAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKICAgICAgICBteSBAQXJ0aWNsZXMgICAgICA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ2hhbm5lbE5hbWUgICAgICAgICAgPT4gJ0VtYWlsJywKICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdjdXN0b21lcicsCiAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAxLAogICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJ0Zyb20gJyAuICRSYW5kb21JRCAuICcgQSA8ZW1haWxAZXhhbXBsZS5jb20+JywKICAgICAgICAgICAgICAgIFRvICAgICAgICAgICAgICAgICAgID0+ICdUbyAnIC4gJFJhbmRvbUlEIC4gJyBBIDxlbWFpbEBleGFtcGxlLmNvbT4nLAogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJ0ZpcnN0IEFydGljbGUgU3ViamVjdCAnIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJ0ZpcnN0IEFydGljbGUgYm9keSAnIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgPT4gJ0VtYWlsQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgPT4gJ0N1c3RvbWVyIHNlbnQgYW4gZW1haWwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDaGFubmVsTmFtZSAgICAgICAgICA9PiAnSW50ZXJuYWwnLAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJ2FnZW50JywKICAgICAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDAsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICA9PiAnRnJvbSAnIC4gJFJhbmRvbUlEIC4gJyBCIDxlbWFpbEBleGFtcGxlLmNvbT4nLAogICAgICAgICAgICAgICAgVG8gICAgICAgICAgICAgICAgICAgPT4gJ1RvICcgLiAkUmFuZG9tSUQgLiAnIEIgPGVtYWlsQGV4YW1wbGUuY29tPicsCiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAnU2Vjb25kIEFydGljbGUgU3ViamVjdCAnIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJ1NlY29uZCBBcnRpY2xlIGJvZHkgJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICdBZGROb3RlJywKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgID0+ICdBZ2VudCBjcmVhdGVkIG5vdGUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDaGFubmVsTmFtZSAgICAgICAgICA9PiAnRW1haWwnLAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJ3N5c3RlbScsCiAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAxLAogICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJ09UUlMgU3lzdGVtIDxvdHJzQGxvY2FsaG9zdD4nLAogICAgICAgICAgICAgICAgQ2MgICAgICAgICAgICAgICAgICAgPT4gJ0NjICcgLiAkUmFuZG9tSUQgLiAnIEMgPGVtYWlsQGV4YW1wbGUuY29tPicsCiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAnVGhpcmQgQXJ0aWNsZSBTdWJqZWN0ICcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICA9PiAnVGhpcmQgQXJ0aWNsZSBib2R5ICcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAnU2VuZEF1dG9SZXBseScsCiAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAnU2VudCBhdXRvIHJlcGx5JywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSBAQXJ0aWNsZUlEczsKICAgICAgICBmb3IgbXkgJEFydGljbGUgKEBBcnRpY2xlcykgewogICAgICAgICAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckNoYW5uZWwoCiAgICAgICAgICAgICAgICBDaGFubmVsTmFtZSA9PiAkQXJ0aWNsZS0+e0NoYW5uZWxOYW1lfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRBcnRpY2xlSUQgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICA9PiAkVGlja2V0c1swXS0+e0lEfSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTE1JywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAleyRBcnRpY2xlfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgIkNyZWF0ZWQgQXJ0aWNsZUlEICRBcnRpY2xlSUQiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQEFydGljbGVJRHMsICRBcnRpY2xlSUQ7CiAgICAgICAgfQoKICAgICAgICAjIENyZWF0ZSBEeW5hbWljIEZpZWxkcy4KICAgICAgICBteSAkUmFuZG9tTnVtYmVyID0gc3Vic3RyICRIZWxwZXItPkdldFJhbmRvbU51bWJlcigpLCAtNzsKICAgICAgICBteSAlRHluYW1pY0ZpZWxkcyA9ICgKICAgICAgICAgICAgRHJvcGRvd24gPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnREZEcm9wZG93bicgLiAkUmFuZG9tTnVtYmVyLAogICAgICAgICAgICAgICAgTGFiZWwgICAgICA9PiAnREZEcm9wZG93bicgLiAkUmFuZG9tTnVtYmVyLAogICAgICAgICAgICAgICAgRmllbGRPcmRlciA9PiA5OTkwLAogICAgICAgICAgICAgICAgRmllbGRUeXBlICA9PiAnRHJvcGRvd24nLAogICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIENvbmZpZyAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZSAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAwID0+ICdOb3RERlNlbGVjdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgMSA9PiAnWWVzREZTZWxlY3RlZCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGFibGVWYWx1ZXMgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZW9yZGVyID0+IDAsCiAgICAgICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE11bHRpc2VsZWN0ID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0RGTXVsdGlzZWxlY3QnIC4gJFJhbmRvbU51bWJlciwKICAgICAgICAgICAgICAgIExhYmVsICAgICAgPT4gJ0RGTXVsdGlzZWxlY3QnIC4gJFJhbmRvbU51bWJlciwKICAgICAgICAgICAgICAgIEZpZWxkT3JkZXIgPT4gOTk5MCwKICAgICAgICAgICAgICAgIEZpZWxkVHlwZSAgPT4gJ011bHRpc2VsZWN0JywKICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWUgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgeWVhciAgPT4gJ3llYXInLAogICAgICAgICAgICAgICAgICAgICAgICBtb250aCA9PiAnbW9udGgnLAogICAgICAgICAgICAgICAgICAgICAgICB3ZWVrICA9PiAnd2VlaycsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGFibGVWYWx1ZXMgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZW9yZGVyID0+IDAsCiAgICAgICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFRleHQgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnREZUZXh0JyAuICRSYW5kb21OdW1iZXIsCiAgICAgICAgICAgICAgICBMYWJlbCAgICAgID0+ICdERlRleHQnIC4gJFJhbmRvbU51bWJlciwKICAgICAgICAgICAgICAgIEZpZWxkT3JkZXIgPT4gOTk5MCwKICAgICAgICAgICAgICAgIEZpZWxkVHlwZSAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnQXJ0aWNsZScsCiAgICAgICAgICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWUgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlb3JkZXIgPT4gMCwKICAgICAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzID0gKAogICAgICAgICAgICBUZXh0ICAgICAgICA9PiAiREZUZXh0JFJhbmRvbUlEIiwKICAgICAgICAgICAgRHJvcGRvd24gICAgPT4gJzEnLAogICAgICAgICAgICBNdWx0aXNlbGVjdCA9PiBbCiAgICAgICAgICAgICAgICAnbW9udGgnLAogICAgICAgICAgICAgICAgJ3llYXInLAogICAgICAgICAgICBdLAogICAgICAgICk7CgogICAgICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwogICAgICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICAgICBteSBARHluYW1pY0ZpZWxkSURzOwogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkVHlwZSAoIHNvcnQga2V5cyAlRHluYW1pY0ZpZWxkcyApIHsKCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRJRCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEFkZCgKICAgICAgICAgICAgICAgICV7ICREeW5hbWljRmllbGRzeyREeW5hbWljRmllbGRUeXBlfSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkSUQsCiAgICAgICAgICAgICAgICAiQ3JlYXRlZCBEeW5hbWljRmllbGQgJER5bmFtaWNGaWVsZHN7JER5bmFtaWNGaWVsZFR5cGV9LT57TmFtZX0gLSBJRCAkRHluYW1pY0ZpZWxkSUQiLAogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRJRHMsICREeW5hbWljRmllbGRJRDsKCiAgICAgICAgICAgICMgU2V0IER5bmFtaWNGaWVsZCB2YWx1ZSB0byB0aWNrZXQgb3IgYXJ0aWNsZSBhY2NvcmRpbmdseS4KICAgICAgICAgICAgbXkgJE9iamVjdElEID0gJFRpY2tldHNbMF0tPntJRH07CiAgICAgICAgICAgIGlmICggJER5bmFtaWNGaWVsZHN7JER5bmFtaWNGaWVsZFR5cGV9LT57T2JqZWN0VHlwZX0gZXEgJ0FydGljbGUnICkgewogICAgICAgICAgICAgICAgJE9iamVjdElEID0gJEFydGljbGVJRHNbMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgU2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBkeW5hbWljIGZpZWxkLgogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkc3skRHluYW1pY0ZpZWxkVHlwZX0tPntOYW1lfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFZhbHVlID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkVHlwZX07CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkT2JqZWN0SUQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIEVuYWJsZSBjcmVhdGVkIER5bmFtaWNGaWVsZHMgdG8gYmUgdmlzaWJsZSBpbiBBZ2VudFRpY2tldFByaW50LgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFByaW50IyMjRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgVmFsdWUgPT4gewogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZHN7RHJvcGRvd259LT57TmFtZX0gICAgPT4gMSwKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRze011bHRpc2VsZWN0fS0+e05hbWV9ID0+IDEsCiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkc3tUZXh0fS0+e05hbWV9ICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgRW5hYmxlIGNyZWF0ZWQgRHluYW1pY0ZpZWxkcyB0byBiZSB2aXNpYmxlIGluIEN1c3RvbWVyVGlja2V0UHJpbnQuCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0UHJpbnQjIyNEeW5hbWljRmllbGQnLAogICAgICAgICAgICBWYWx1ZSA9PiB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkc3tEcm9wZG93bn0tPntOYW1lfSAgICA9PiAxLAogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZHN7TXVsdGlzZWxlY3R9LT57TmFtZX0gPT4gMSwKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRze1RleHR9LT57TmFtZX0gICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBFbmFibGUgVGlja2V0IGF0dHJpYnV0ZXMgaW4gQ3VzdG9tZXJUaWNrZXRab29tIHNjcmVlbiA9PiBDdXN0b21lclRpY2tldFByaW50LgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lclRpY2tldFpvb20jIyNBdHRyaWJ1dGVzVmlldycsCiAgICAgICAgICAgIFZhbHVlID0+IHsKICAgICAgICAgICAgICAgIE93bmVyICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQcmlvcml0eSAgICA9PiAxLAogICAgICAgICAgICAgICAgUXVldWUgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlID0+IDEsCiAgICAgICAgICAgICAgICBTTEEgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgU2VydmljZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFN0YXRlICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgTGluayBmaXJzdCBhbmQgc2Vjb25kIHRpY2tldCBhcyBwYXJlbnQtY2hpbGQuCiAgICAgICAgbXkgJExpbmtPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpOwogICAgICAgIG15ICRTdWNjZXNzICAgID0gJExpbmtPYmplY3QtPkxpbmtBZGQoCiAgICAgICAgICAgIFNvdXJjZU9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICAgICAgU291cmNlS2V5ICAgID0+ICRUaWNrZXRzWzBdLT57SUR9LAogICAgICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFRhcmdldEtleSAgICA9PiAkVGlja2V0c1sxXS0+e0lEfSwKICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdQYXJlbnRDaGlsZCcsCiAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlRpY2tlZElEICRUaWNrZXRzWzBdLT57SUR9IGFuZCAkVGlja2V0c1sxXS0+e0lEfSBsaW5rZWQgYXMgcGFyZW50LWNoaWxkIgogICAgICAgICk7CgogICAgICAgICMgTGluayBmaXJzdCBhbmQgdGhpcmQgdGlja2V0IGFzIGNoaWxkLXBhcmVudC4KICAgICAgICAkU3VjY2VzcyA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkKAogICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFNvdXJjZUtleSAgICA9PiAkVGlja2V0c1syXS0+e0lEfSwKICAgICAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgICAgICBUYXJnZXRLZXkgICAgPT4gJFRpY2tldHNbMF0tPntJRH0sCiAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnUGFyZW50Q2hpbGQnLAogICAgICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJUaWNrZWRJRCAkVGlja2V0c1syXS0+e0lEfSBhbmQgJFRpY2tldHNbMV0tPntJRH0gbGlua2VkIGFzIHBhcmVudC1jaGlsZCIKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IFVzZXIgYW5kIGxvZ2luLgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBOYXZpZ2F0ZSB0byBBZ2VudFRpY2tldFpvb20gc2NyZWVuLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kVGlja2V0c1swXS0+e0lEfSIpOwoKICAgICAgICAjIENsaWNrIHRvIHByaW50IHRpY2tldCBpbiBBZ2VudCBpbnRlcmZhY2UuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWdlbnRUaWNrZXRQcmludDtUaWNrZXRJRD0kVGlja2V0c1swXS0+e0lEfScgKV0iKS0+Y2xpY2soKTsKCiAgICAgICAgIyBTd2l0Y2ggdG8gQWdlbnRUaWNrZXRQcmludCBwb3AgdXAgd2luZG93LgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMiApOwogICAgICAgIG15ICRIYW5kbGVzID0gJFNlbGVuaXVtLT5nZXRfd2luZG93X2hhbmRsZXMoKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMV0gKTsKCiAgICAgICAgIyBTcGVjaWFsIGFwcHJvYWNoIGlzIHVzZWQgZm9yIHdhaXRpbmcgZm9yIFBERiBkb2N1bWVudCB0byBiZSBsb2FkZWQgZnVsbHkgYmVmb3JlIGNoZWNraW5nIGl0J3MgY29udGVudC4KICAgICAgICAjIFRoaXMgaXMgc3VwcG9ydGVkIGFuZCB0ZXN0ZWQgaW4gTW96aWxsYSBGaXJlZm94IGJyb3dzZXIuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZW5kT2ZDb250ZW50IikubGVuZ3RoID09PSAyJyApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHNjZW5hcmlvcy4KICAgICAgICBteSBAVGVzdHMgPSAoCgogICAgICAgICAgICAjIFRpY2tldCBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICJUaWNrZXQjJFRpY2tldHNbMF0tPntOdW1iZXJ9IiwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAiVGlja2V0IyRUaWNrZXRzWzBdLT57TnVtYmVyfSB2YWx1ZSBpcyBjb3JyZWN0IiwKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXRzWzBdLT57VGl0bGV9LAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdUaWNrZXRUaXRsZSB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICJwcmludGVkIGJ5ICRUZXN0VXNlckxvZ2luICRUZXN0VXNlckxvZ2luICgkVGVzdFVzZXJMb2dpblxAbG9jYWx1bml0dGVzdC5jb20pLCIsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1ByaW50ZWRCeSB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWdlbnQnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAicHJpbnRlZCBieSAkQ3VzdG9tZXJVc2Vye1VzZXJGaXJzdG5hbWV9ICRDdXN0b21lclVzZXJ7VXNlckxhc3RuYW1lfSIsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1ByaW50ZWRCeSB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQ3VzdG9tZXInCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnU3RhdGUnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdTdGF0ZSBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdvcGVuJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnU3RhdGUgdmFsdWUgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnQWdlJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnQWdlIGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJzAgbScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0FnZSB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdBY2NvdW50ZWQgdGltZScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0FjY291bnRlZCB0aW1lIGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBZ2VudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnRmlyc3QgUmVzcG9uc2UnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdGaXJzdCBSZXNwb25zZSBUaW1lIGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBZ2VudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnU29sdXRpb24gVGltZScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0FjY291bnRlZCB0aW1lIGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBZ2VudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdQcmlvcml0eSBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICc1IHZlcnkgaGlnaCcsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1ByaW9yaXR5IHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ0NyZWF0ZWQnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdDcmVhdGVkIGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ1F1ZXVlJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnUXVldWUgbGFiZWwgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkUXVldWVOYW1lLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdRdWV1ZSB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdMb2NrJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnTG9jayBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWdlbnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0xvY2sgdmFsdWUgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FnZW50JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnQ3VzdG9tZXJJRCBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRDdXN0b21lckNvbXBhbnl7Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0N1c3RvbWVySUQgdmFsdWUgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnT3duZXInLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdPd25lciBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRVc2Vyc1swXS0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ093bmVyIGZpcnN0IHJvdyB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICcoJyAuICRVc2Vyc1swXS0+e1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdPd25lciBzZWNvbmQgcm93IHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBZ2VudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkVXNlcnNbMF0tPntVc2VyTGFzdG5hbWV9IC4gJyknLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdPd25lciB0aGlyZCByb3cgdmFsdWUgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FnZW50JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1Jlc3BvbnNpYmxlIGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFVzZXJzWzFdLT57VXNlckxvZ2lufSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnUmVzcG9uc2libGUgZmlyc3Qgcm93IHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJygnIC4gJFVzZXJzWzFdLT57VXNlckZpcnN0bmFtZX0sCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1Jlc3BvbnNpYmxlIHNlY29uZCByb3cgdmFsdWUgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FnZW50JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRVc2Vyc1sxXS0+e1VzZXJMYXN0bmFtZX0gLiAnKScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1Jlc3BvbnNpYmxlIHRoaXJkIHJvdyB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWdlbnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ1R5cGUnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdUeXBlIGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFR5cGVOYW1lLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdUeXBlIHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdTZXJ2aWNlIGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFNlcnZpY2VOYW1lLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdTZXJ2aWNlIHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ1NMQScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1NMQSBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRTTEFOYW1lLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdTTEEgdmFsdWUgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIFRpY2tldCBEeW5hbWljIEZpZWxkcy4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICREeW5hbWljRmllbGRze0Ryb3Bkb3dufS0+e0xhYmVsfSAuICc6JywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnRHluYW1pY0ZpZWxkIERyb3Bkb3duIGxhYmVsIGlzIGNvcnJlY3QgZm9yIFRpY2tldCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnWWVzREZTZWxlY3RlZCcsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0R5bmFtaWNGaWVsZCBEcm9wZG93biB2YWx1ZSBpcyBjb3JyZWN0IGZvciBUaWNrZXQnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJER5bmFtaWNGaWVsZHN7TXVsdGlzZWxlY3R9LT57TGFiZWx9IC4gJzonLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdEeW5hbWljRmllbGQgTXVsdGlzZWxlY3QgbGFiZWwgaXMgY29ycmVjdCBmb3IgVGlja2V0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdtb250aCwgeWVhcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0R5bmFtaWNGaWVsZCBNdWx0aXNlbGVjdCB2YWx1ZSBpcyBjb3JyZWN0IGZvciBUaWNrZXQnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBMaW5rZWQgT2JqZWN0cy4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdQYXJlbnQ6JywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnUGFyZW50OiBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWdlbnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFRpY2tldHNbMl0tPntOdW1iZXJ9IC4gJzogJyAuICRUaWNrZXRzWzJdLT57TmFtZX0sCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1BhcmVudDogdmFsdWUgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FnZW50JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdDaGlsZDonLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdDaGlsZDogbGFiZWwgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FnZW50JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXRzWzFdLT57TnVtYmVyfSAuICc6ICcgLiAkVGlja2V0c1sxXS0+e05hbWV9LAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdDaGlsZDogdmFsdWUgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FnZW50JywKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgQ3VzdG9tZXIgaW5mb3JtYXRpb24uCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnQ3VzdG9tZXIgSW5mb3JtYXRpb24nLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdDdXN0b21lciBJbmZvcm1hdGlvbiBoZWFkZXIgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnRmlyc3RuYW1lOicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0ZpcnN0bmFtZTogbGFiZWwgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkQ3VzdG9tZXJVc2Vye1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdGaXJzdG5hbWU6IHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ0xhc3RuYW1lOicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0xhc3RuYW1lOiBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRDdXN0b21lclVzZXJ7VXNlckxhc3RuYW1lfSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnTGFzdG5hbWU6IHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ1VzZXJuYW1lOicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1VzZXJuYW1lOiBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRDdXN0b21lclVzZXJ7VXNlckxvZ2lufSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnVXNlcm5hbWU6IHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ0VtYWlsOicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0VtYWlsOiBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRDdXN0b21lclVzZXJ7VXNlckVtYWlsfSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnRW1haWw6IHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ0N1c3RvbWVyOicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0N1c3RvbWVyOiBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRDdXN0b21lckNvbXBhbnl7Q3VzdG9tZXJDb21wYW55TmFtZX0sCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0N1c3RvbWVyOiB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdTdHJlZXQ6JywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnU3RyZWV0OiBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRDdXN0b21lckNvbXBhbnl7Q3VzdG9tZXJDb21wYW55U3RyZWV0fSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnU3RyZWV0OiB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdaaXA6JywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnWmlwOiBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRDdXN0b21lckNvbXBhbnl7Q3VzdG9tZXJDb21wYW55WklQfSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnWmlwOiB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdDaXR5OicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0NpdHk6IGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJEN1c3RvbWVyQ29tcGFueXtDdXN0b21lckNvbXBhbnlDaXR5fSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnQ2l0eTogdmFsdWUgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnQ291bnRyeTonLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdDb3VudHJ5OiBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRDdXN0b21lckNvbXBhbnl7Q3VzdG9tZXJDb21wYW55Q291bnRyeX0sCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0NvdW50cnk6IHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ1VSTDonLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdVUkw6IGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJEN1c3RvbWVyQ29tcGFueXtDdXN0b21lckNvbXBhbnlVUkx9LAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdVUkw6IHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ0NvbW1lbnQ6JywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnQ29tbWVudDogbGFiZWwgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkQ3VzdG9tZXJDb21wYW55e0N1c3RvbWVyQ29tcGFueUNvbW1lbnR9LAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdDb21tZW50OiB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgQXJ0aWNsZSAjMyBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdGcm9tOicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0Zyb206IGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ09UUlMgU3lzdGVtJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnRnJvbTogdmFsdWUgaXMgY29ycmVjdCBmb3IgQXJ0aWNsZSMzJywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdUbzonLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdUbzogbGFiZWwgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnQ2M6JywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnRnJvbTogbGFiZWwgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnQ2MgJyAuICRSYW5kb21JRCAuICcgQycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0NjOiB2YWx1ZSBpcyBjb3JyZWN0IGZvciBBcnRpY2xlIzMnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ1N1YmplY3Q6JywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnU3ViamVjdDogbGFiZWwgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkQXJ0aWNsZXNbMl0tPntTdWJqZWN0fSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnU3ViamVjdDogdmFsdWUgaXMgY29ycmVjdCBmb3IgQXJ0aWNsZSMzJywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdDcmVhdGVkOicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0NyZWF0ZWQ6IGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ2J5IHN5c3RlbScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0NyZWF0ZWQ6IHZhbHVlIGlzIGNvcnJlY3QgZm9yIEFydGljbGUjMycsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkQXJ0aWNsZXNbMl0tPntCb2R5fSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnQm9keTogdmFsdWUgaXMgY29ycmVjdCBmb3IgQXJ0aWNsZSMzJywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgQXJ0aWNsZSAjMiBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdGcm9tICcgLiAkUmFuZG9tSUQgLiAnIEInLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdGcm9tOiB2YWx1ZSBpcyBjb3JyZWN0IGZvciBBcnRpY2xlIzInLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBZ2VudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnVG8gJyAuICRSYW5kb21JRCAuICcgQicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1RvOiB2YWx1ZSBpcyBjb3JyZWN0IGZvciBBcnRpY2xlIzInLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBZ2VudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkQXJ0aWNsZXNbMV0tPntTdWJqZWN0fSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnU3ViamVjdDogdmFsdWUgaXMgY29ycmVjdCBmb3IgQXJ0aWNsZSMyJywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWdlbnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ2J5IGFnZW50JywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnQ3JlYXRlZDogdmFsdWUgaXMgY29ycmVjdCBmb3IgQXJ0aWNsZSMyJywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWdlbnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJEFydGljbGVzWzFdLT57Qm9keX0sCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0JvZHk6IHZhbHVlIGlzIGNvcnJlY3QgZm9yIEFydGljbGUjMicsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FnZW50JywKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgQXJ0aWNsZSAjMSBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdGcm9tICcgLiAkUmFuZG9tSUQgLiAnIEEnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdGcm9tOiB2YWx1ZSBpcyBjb3JyZWN0IGZvciBBcnRpY2xlIzEnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ1RvICcgLiAkUmFuZG9tSUQgLiAnIEEnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdUbzogdmFsdWUgaXMgY29ycmVjdCBmb3IgQXJ0aWNsZSMxJywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRBcnRpY2xlc1swXS0+e1N1YmplY3R9LAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdTdWJqZWN0OiB2YWx1ZSBpcyBjb3JyZWN0IGZvciBBcnRpY2xlIzEnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ2J5IGN1c3RvbWVyJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnQ3JlYXRlZDogdmFsdWUgaXMgY29ycmVjdCBmb3IgQXJ0aWNsZSMxJywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICREeW5hbWljRmllbGRze1RleHR9LT57TGFiZWx9IC4gJzonLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdEeW5hbWljRmllbGQgVGV4dCBsYWJlbCBpcyBjb3JyZWN0IGZvciBBcnRpY2xlIzEnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3tUZXh0fSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnRHluYW1pY0ZpZWxkIFRleHQgdmFsdWUgaXMgY29ycmVjdCBmb3IgQXJ0aWNsZSMxJywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRBcnRpY2xlc1swXS0+e0JvZHl9LAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdCb2R5OiB2YWx1ZSBpcyBjb3JyZWN0IGZvciBBcnRpY2xlIzEnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBQYWdpbmF0aW9uLgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ1BhZ2UgMScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1BhZ2UgMSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdQYWdlIDInLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdQYWdlIDIgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FnZW50JywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIFZlcmlmeSB2YWx1ZXMgaW4gQWdlbnRUaWNrZXRQcmludC4KICAgICAgICBteSAkQWdlbnRQYWdlU291cmNlID0gJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKTsKCiAgICAgICAgZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKICAgICAgICAgICAgaWYgKCAkVGVzdC0+e0ludGVyZmFjZX0gZXEgJ0FsbCcgfHwgJFRlc3QtPntJbnRlcmZhY2V9IGVxICdBZ2VudCcgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICAgICBpbmRleCggJEFnZW50UGFnZVNvdXJjZSwgJFRlc3QtPntWYWx1ZX0gKSA+IC0xLAogICAgICAgICAgICAgICAgICAgICdBZ2VudCAtICcgLiAkVGVzdC0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBDbG9zZSBBZ2VudFRpY2tldFByaW50IFBERiBwb3AgdXAgd2luZG93IGFuZCBzd2l0Y2ggd2luZG93LgogICAgICAgICRTZWxlbml1bS0+Y2xvc2UoKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMF0gKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDEgKTsKCiAgICAgICAgIyBMb2dpbiBjdXN0b21lciB1c2VyLgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdDdXN0b21lcicsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRDdXN0b21lclVzZXJ7VXNlckxvZ2lufSwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJEN1c3RvbWVyVXNlcntVc2VyUGFzc3dvcmR9LAogICAgICAgICk7CgogICAgICAgICMgTmF2aWdhdGUgdG8gQ3VzdG9tZXJUaWNrZXRab29tIG9mIGNyZWF0ZWQgZmlyc3QgdGlja2V0LgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoCiAgICAgICAgICAgICIke1NjcmlwdEFsaWFzfWN1c3RvbWVyLnBsP0FjdGlvbj1DdXN0b21lclRpY2tldFpvb207VGlja2V0TnVtYmVyPSRUaWNrZXRzWzBdLT57TnVtYmVyfSIKICAgICAgICApOwoKICAgICAgICAjIENsaWNrIHRvIHByaW50IHRpY2tldCBpbiBDdXN0b21lciBpbnRlcmZhY2UuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQ3VzdG9tZXJUaWNrZXRQcmludDtUaWNrZXRJRD0kVGlja2V0c1swXS0+e0lEfScgKV0iKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIFNwZWNpYWwgYXBwcm9hY2ggaXMgdXNlZCBmb3Igd2FpdGluZyBmb3IgUERGIGRvY3VtZW50IHRvIGJlIGxvYWRlZCBmdWxseSBiZWZvcmUgY2hlY2tpbmcgaXQncyBjb250ZW50LgogICAgICAgICMgQ3VycmVudGx5IHRoaXMgaXMgc3VwcG9ydGVkIGluIE1vemlsbGEgRmlyZWZveCBicm93c2VyLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImVuZE9mQ29udGVudCIpLmxlbmd0aCA9PT0gMScgKTsKCiAgICAgICAgIyBWZXJpZnkgdmFsdWVzIGluIEN1c3RvbWVyVGlja2V0UHJpbnQuCiAgICAgICAgbXkgJEN1c3RvbWVyUGFnZVNvdXJjZSA9ICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCk7CgogICAgICAgIGZvciBteSAkVGVzdCAoQFRlc3RzKSB7CiAgICAgICAgICAgIGlmICggJFRlc3QtPntJbnRlcmZhY2V9IGVxICdBbGwnIHx8ICRUZXN0LT57SW50ZXJmYWNlfSBlcSAnQ3VzdG9tZXInICkgewogICAgICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAgICAgaW5kZXgoICRDdXN0b21lclBhZ2VTb3VyY2UsICRUZXN0LT57VmFsdWV9ICkgPiAtMSwKICAgICAgICAgICAgICAgICAgICAnQ3VzdG9tZXIgLSAnIC4gJFRlc3QtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkVGVzdC0+e0ludGVyZmFjZX0gZXEgJ0FnZW50JyApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgICAgIGluZGV4KCAkQ3VzdG9tZXJQYWdlU291cmNlLCAkVGVzdC0+e1ZhbHVlfSApID09IC0xLAogICAgICAgICAgICAgICAgICAgICdDdXN0b21lciAtICcgLiAkVGVzdC0+e01lc3NhZ2V9IC4gJyAtIG5vdCB2aXNpYmxlJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgRGVsZXRlIHRlc3QgVGlja2V0cy4KICAgICAgICBmb3IgbXkgJFRpY2tldCAoIHJldmVyc2UgQFRpY2tldHMgKSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0RGVsZXRlKAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldC0+e0lEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiVGlja2V0SUQgJFRpY2tldC0+e0lEfSBpcyBkZWxldGVkIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRGVsZXRlIHRlc3QgRHluYW1pY0ZpZWxkcy4KICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZElEIChARHluYW1pY0ZpZWxkSURzKSB7CgogICAgICAgICAgICAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZERlbGV0ZSgKICAgICAgICAgICAgICAgIElEICAgICA9PiAkRHluYW1pY0ZpZWxkSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJEeW5hbWljRmllbGQgSUQgJER5bmFtaWNGaWVsZElEIGlzIGRlbGV0ZWQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBEZWxldGUgdGVzdCBkYXRhIGZyb20gdGhlIERCLgogICAgICAgIG15IEBEZWxldGVEYXRhID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBTUUwgICAgID0+ICJERUxFVEUgRlJPTSBjdXN0b21lcl91c2VyIFdIRVJFIGxvZ2luID0gPyIsCiAgICAgICAgICAgICAgICBCaW5kICAgID0+ICRDdXN0b21lclVzZXJJRCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkN1c3RvbWVyVXNlcklEICRDdXN0b21lclVzZXJJRCBpcyBkZWxldGVkIiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU1FMICAgICA9PiAiREVMRVRFIEZST00gY3VzdG9tZXJfY29tcGFueSBXSEVSRSBjdXN0b21lcl9pZCA9ID8iLAogICAgICAgICAgICAgICAgQmluZCAgICA9PiAkQ3VzdG9tZXJDb21wYW55SUQsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDdXN0b21lckNvbXBhbnlJRCAkQ3VzdG9tZXJDb21wYW55SUQgaXMgZGVsZXRlZCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFNRTCAgICAgPT4gIkRFTEVURSBGUk9NIHRpY2tldF90eXBlIFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgICAgICBCaW5kICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJUeXBlSUQgJFR5cGVJRCBpcyBkZWxldGVkIiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU1FMICAgICA9PiAiREVMRVRFIEZST00gc2VydmljZV9zbGEgV0hFUkUgc2xhX2lkID0gPyIsCiAgICAgICAgICAgICAgICBCaW5kICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIlNlcnZpY2UtU0xBIHJlbGF0aW9uIGRlbGV0ZWQiLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBTUUwgICAgID0+ICJERUxFVEUgRlJPTSBzbGEgV0hFUkUgaWQgPSA/IiwKICAgICAgICAgICAgICAgIEJpbmQgICAgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiU0xBSUQgJFNMQUlEIGlzIGRlbGV0ZWQiLAogICAgICAgICAgICB9LAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFNRTCAgICAgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2VfcHJlZmVyZW5jZXMgV0hFUkUgc2VydmljZV9pZCA9ID8iLAogICAgICAgICAgICAgICAgQmluZCAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiU2VydmljZSBwcmVmZXJlbmNlcyBmb3IgJFNlcnZpY2VJRCBpcyBkZWxldGVkIiwKICAgICAgICAgICAgfSwKIyAtLS0KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU1FMICAgICA9PiAiREVMRVRFIEZST00gc2VydmljZSBXSEVSRSBpZCA9ID8iLAogICAgICAgICAgICAgICAgQmluZCAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiU2VydmljZUlEICRTZXJ2aWNlSUQgaXMgZGVsZXRlZCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFNRTCAgICAgPT4gIkRFTEVURSBGUk9NIHF1ZXVlIFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgICAgICBCaW5kICAgID0+ICRRdWV1ZUlELAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiUXVldWVJRCAkUXVldWVJRCBpcyBkZWxldGVkIiwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgICAgICBmb3IgbXkgJEl0ZW0gKEBEZWxldGVEYXRhKSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgICAgIFNRTCAgPT4gJEl0ZW0tPntTUUx9LAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkSXRlbS0+e0JpbmR9IF0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAkSXRlbS0+e01lc3NhZ2V9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBDbGVhciBjYWNoZS4KICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgpOwogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA0ZmUyMThiZWNjZGI5MjZhMjlkZDdiZWQ5ZGU0ODIxMTQzMGQ2OWQwIC0gc2NyaXB0cy90ZXN0L1NlbGVuaXVtL091dHB1dC9QcmVmZXJlbmNlcy9BZ2VudC9DdXN0b21TZXJ2aWNlLnQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMjIG5vIGNyaXRpYyAoTW9kdWxlczo6UmVxdWlyZUV4cGxpY2l0UGFja2FnZSkKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKIyBnZXQgc2VsZW5pdW0gb2JqZWN0Cm15ICRTZWxlbml1bSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6U2VsZW5pdW0nKTsKCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CgogICAgICAgICMgZ2V0IGhlbHBlciBvYmplY3QKICAgICAgICBteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiAgICAgICAgIyBlbmFibGUgdGhlIHNlcnZpY2VzCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6U2VydmljZScsCiAgICAgICAgICAgIFZhbHVlID0+ICcxJywKICAgICAgICApOwoKICAgICAgICAjIGRvbid0IGtlZXAgY2hpbGRyZW4gc2VydmljZXMKICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnVGlja2V0OjpTZXJ2aWNlOjpLZWVwQ2hpbGRyZW4nLAogICAgICAgICAgICBWYWx1ZSA9PiAnMCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB1c2VyIGFuZCBsb2dpbgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRlc3QgdXNlciBJRAogICAgICAgIG15ICRUZXN0VXNlcklEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNlcnZpY2Ugb2JqZWN0CiAgICAgICAgbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpOwoKICAgICAgICAjIGNyZWF0ZSB0d28gdGVzdCBzZXJ2aWNlcwogICAgICAgIG15IEBTZXJ2aWNlSURzOwogICAgICAgIG15IEBTZXJ2aWNlTmFtZXM7CiAgICAgICAgZm9yIG15ICRTZXJ2aWNlIChxdyhQYXJlbnQgQ2hpbGQpKSB7CiAgICAgICAgICAgIG15ICRTZXJ2aWNlTmFtZSA9ICRTZXJ2aWNlIC4gJ1NlcnZpY2UnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICAgICAgbXkgJFNlcnZpY2VJRCAgID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VBZGQoCiAgICAgICAgICAgICAgICBOYW1lICAgID0+ICRTZXJ2aWNlTmFtZSwKICAgICAgICAgICAgICAgIFZhbGlkSUQgPT4gMiwgICAgICAgICAgICAgICAgICMgaW52YWxpZAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnU2VsZW5pdW0gVGVzdCcsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICAiU2VydmljZSBJRCAkU2VydmljZUlEIGlzIGNyZWF0ZWQiLAogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBTZXJ2aWNlSURzLCAgICRTZXJ2aWNlSUQ7CiAgICAgICAgICAgIHB1c2ggQFNlcnZpY2VOYW1lcywgJFNlcnZpY2VOYW1lOwogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgc2Vjb25kIHNlcnZpY2UgdG8gYmUgY2hpbGQgb2YgZmlyc3Qgb25lIGFuZCBlbmFibGUgaXQKICAgICAgICBteSAkU3VjY2VzcyA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlVXBkYXRlKAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRHNbMV0sCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VydmljZU5hbWVzWzFdLAogICAgICAgICAgICBQYXJlbnRJRCAgPT4gJFNlcnZpY2VJRHNbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgICA9PiAxLAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiU2VydmljZSBJRCAkU2VydmljZUlEc1sxXSBpcyBub3cgY2hpbGQgc2VydmljZSIKICAgICAgICApOwoKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgZ28gdG8gYWdlbnQgcHJlZmVyZW5jZXMKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KAogICAgICAgICAgICAiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRQcmVmZXJlbmNlcztTdWJhY3Rpb249R3JvdXA7R3JvdXA9Tm90aWZpY2F0aW9uU2V0dGluZ3MiCiAgICAgICAgKTsKCiAgICAgICAgIyB2ZXJpZnkgY2hpbGQgc2VydmljZSBpcyBub3Qgc2hvd24KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjU2VydmljZUlEIG9wdGlvblt2YWx1ZT1cIiRTZXJ2aWNlSURzWzFdXCJdJykubGVuZ3RoOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgJ0NoaWxkIHNlcnZpY2UgaXMgbm90IHNob3duJywKICAgICAgICApOwoKICAgICAgICAjIHR1cm4gb24ga2VlcCBjaGlsZHJlbiBzZXR0aW5nCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6U2VydmljZTo6S2VlcENoaWxkcmVuJywKICAgICAgICAgICAgVmFsdWUgPT4gJzEnLAogICAgICAgICk7CgogICAgICAgICMgcmVmcmVzaCB0aGUgcGFnZQogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoCiAgICAgICAgICAgICIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudFByZWZlcmVuY2VzO1N1YmFjdGlvbj1Hcm91cDtHcm91cD1Ob3RpZmljYXRpb25TZXR0aW5ncyIKICAgICAgICApOwoKICAgICAgICAjIHZlcmlmeSBjaGlsZCBzZXJ2aWNlIGlzIHNob3duIChidWcjMTE4MTYpCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnI1NlcnZpY2VJRCBvcHRpb25bdmFsdWU9XCIkU2VydmljZUlEc1sxXVwiXScpLmxlbmd0aDsiCiAgICAgICAgICAgICksCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICdDaGlsZCBzZXJ2aWNlIGlzIHNob3duJywKICAgICAgICApOwoKICAgICAgICAjIGFkZCBjaGlsZCBzZXJ2aWNlIHRvICdNeSBTZXJ2aWNlcycgcHJlZmVyZW5jZQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1NlcnZpY2VJRCcpLnZhbCgnJFNlcnZpY2VJRHNbMV0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIHNhdmUgdGhlIHNldHRpbmcsIHdhaXQgZm9yIHRoZSBhamF4IGNhbGwgdG8gZmluaXNoIGFuZCBjaGVjayBpZiBzdWNjZXNzIHNpZ24gaXMgc2hvd24KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNTZXJ2aWNlSUQnKS5jbG9zZXN0KCcuV2lkZ2V0U2ltcGxlJykuZmluZCgnLlNldHRpbmdVcGRhdGVCb3gnKS5maW5kKCdidXR0b24nKS50cmlnZ2VyKCdjbGljaycpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgInJldHVybiBcJCgnI1NlcnZpY2VJRCcpLmNsb3Nlc3QoJy5XaWRnZXRTaW1wbGUnKS5oYXNDbGFzcygnSGFzT3ZlcmxheScpIgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjU2VydmljZUlEJykuY2xvc2VzdCgnLldpZGdldFNpbXBsZScpLmZpbmQoJy5mYS1jaGVjaycpLmxlbmd0aCIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgInJldHVybiAhXCQoJyNTZXJ2aWNlSUQnKS5jbG9zZXN0KCcuV2lkZ2V0U2ltcGxlJykuaGFzQ2xhc3MoJ0hhc092ZXJsYXknKSIKICAgICAgICApOwoKICAgICAgICAjIGdldCBEQiBvYmplY3QKICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAgICAgIyBkZWxldGUgcGVyc29uYWwgc2VydmljZXMgY29ubmVjdGlvbgogICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBwZXJzb25hbF9zZXJ2aWNlcyBXSEVSRSBzZXJ2aWNlX2lkID0gJFNlcnZpY2VJRHNbMV0iLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiRGVsZXRlIHBlcnNvbmFsIHNlcnZpY2UgY29ubmVjdGlvbiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgY3JlYXRlZCB0ZXN0IHNlcnZpY2VzCiAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gMSApIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBzZXJ2aWNlIFdIRVJFIGlkID0gJFNlcnZpY2VJRHNbJEluZGV4XSIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiRGVsZXRlIHNlcnZpY2UgLSAkU2VydmljZUlEc1skSW5kZXhdIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgbWFrZSBzdXJlIHRoZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgICAgIFR5cGUgPT4gJ1NlcnZpY2UnLAogICAgICAgICk7CiAgICB9LAopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA5ZWEwN2E5Nzk2MDMwODU0ZmJjN2NhNWYwNDJmNTUwMWMyZGRkZDliIC0gc2NyaXB0cy90ZXN0L1NlbGVuaXVtL091dHB1dC9UaWNrZXRab29tL1RpY2tldEluZm9ybWF0aW9uLnQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CnVzZSBQT1NJWCBxdyggZmxvb3IgKTsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgbXkgJEhlbHBlciAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgICAgICMgRGlzYWJsZSAnVGlja2V0IEluZm9ybWF0aW9uJywgJ0N1c3RvbWVyIEluZm9ybWF0aW9uJyBhbmQgJ0xpbmtlZCBPYmplY3RzJyB3aWRnZXRzIGluIEFnZW50VGlja2V0Wm9vbSBzY3JlZW4uCiAgICAgICAgZm9yIG15ICRXaWRnZXREaXNhYmxlIChxdygwMTAwLVRpY2tldEluZm9ybWF0aW9uIDAyMDAtQ3VzdG9tZXJJbmZvcm1hdGlvbiAwMzAwLUxpbmtUYWJsZSkpIHsKICAgICAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgICAgIFZhbGlkID0+IDAsCiAgICAgICAgICAgICAgICBLZXkgICA9PiAiVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRab29tIyMjV2lkZ2V0cyMjIyRXaWRnZXREaXNhYmxlIiwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBlbmFibGUgdGlja2V0IHNlcnZpY2UsIHR5cGUsIHJlc3BvbnNpYmxlCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6U2VydmljZScsCiAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnVGlja2V0OjpTZXJ2aWNlJywKICAgICAgICAgICAgVmFsdWUgPT4gMQogICAgICAgICk7CiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6VHlwZScsCiAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnVGlja2V0OjpUeXBlJywKICAgICAgICAgICAgVmFsdWUgPT4gMQogICAgICAgICk7CiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6UmVzcG9uc2libGUnLAogICAgICAgICAgICBWYWx1ZSA9PiAxLAogICAgICAgICk7CiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6UmVzcG9uc2libGUnLAogICAgICAgICAgICBWYWx1ZSA9PiAxCiAgICAgICAgKTsKCiAgICAgICAgIyBVc2UgYSBjYWxlbmRhciB3aXRoIHRoZSBzYW1lIGJ1c2luZXNzIGhvdXJzIGZvciBldmVyeSBkYXkgc28gdGhhdCB0aGUgVVQgcnVucyBjb3JyZWN0bHkKICAgICAgICAjIG9uIGV2ZXJ5IGRheSBvZiB0aGUgd2VlayBhbmQgb3V0c2lkZSB1c3VhbCBidXNpbmVzcyBob3Vycy4KICAgICAgICBteSAlV2VlazsKICAgICAgICBteSBARGF5cyA9IHF3KFN1biBNb24gVHVlIFdlZCBUaHUgRnJpIFNhdCk7CiAgICAgICAgZm9yIG15ICREYXkgKEBEYXlzKSB7CiAgICAgICAgICAgICRXZWVreyREYXl9ID0gWyAwIC4uIDIzIF07CiAgICAgICAgfQogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIEtleSAgID0+ICdUaW1lV29ya2luZ0hvdXJzJywKICAgICAgICAgICAgVmFsdWUgPT4gXCVXZWVrLAogICAgICAgICk7CiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpbWVXb3JraW5nSG91cnMnLAogICAgICAgICAgICBWYWx1ZSA9PiBcJVdlZWssCiAgICAgICAgKTsKCiAgICAgICAgIyBEaXNhYmxlIGRlZmF1bHQgVmFjYXRpb24gZGF5cy4KICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBLZXkgICA9PiAnVGltZVZhY2F0aW9uRGF5cycsCiAgICAgICAgICAgIFZhbHVlID0+IHt9LAogICAgICAgICk7CiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpbWVWYWNhdGlvbkRheXMnLAogICAgICAgICAgICBWYWx1ZSA9PiB7fSwKICAgICAgICApOwoKICAgICAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgcmVzcG9uc2libGUgdXNlci4KICAgICAgICBteSAkUmVzcG9uc2libGVVc2VyID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbJ2FkbWluJ10sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICMgR2V0IHRlc3QgdXNlciByZXNwb25zaWJsZSBJRC4KICAgICAgICBteSAkUmVzcG9uc2libGVVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRSZXNwb25zaWJsZVVzZXIsCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCB1c2VyLgogICAgICAgIG15ICRVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsnYWRtaW4nXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgIyBHZXQgdGVzdCB1c2VyIGxvZ2luIElELgogICAgICAgIG15ICRVc2VyTG9naW5JRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIEdldCB0ZXN0IHRpY2tldCBkYXRhLgogICAgICAgIG15ICRSYW5kb21JRCAgID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAlVGlja2V0RGF0YSA9ICgKICAgICAgICAgICAgQWdlICAgICAgICAgICA9PiAnMCBtJywKICAgICAgICAgICAgVHlwZSAgICAgICAgICA9PiAiVHlwZSRSYW5kb21JRCIsCiAgICAgICAgICAgIFNlcnZpY2UgICAgICAgPT4gIlNlcnZpY2UkUmFuZG9tSUQiLAogICAgICAgICAgICBTTEEgICAgICAgICAgID0+ICJTTEEkUmFuZG9tSUQiLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgID0+ICJRdWV1ZSRSYW5kb21JRCIsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJzUgdmVyeSBoaWdoJywKICAgICAgICAgICAgU3RhdGUgICAgICAgICA9PiAnb3BlbicsCiAgICAgICAgICAgIExvY2tlZCAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgIFJlc3BvbnNpYmxlICAgPT4gJFJlc3BvbnNpYmxlVXNlciwKICAgICAgICAgICAgQ3JlYXRlZEJ5VXNlciA9PiAkVXNlck9iamVjdC0+VXNlck5hbWUoIFVzZXJJRCA9PiAkVXNlckxvZ2luSUQgKSwKICAgICAgICApOwoKICAgICAgICBteSAkVHlwZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgdHlwZS4KICAgICAgICBteSAkVHlwZUlEID0gJFR5cGVPYmplY3QtPlR5cGVBZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRpY2tldERhdGF7VHlwZX0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRUeXBlSUQsCiAgICAgICAgICAgICJUeXBlSUQgJFR5cGVJRCBpcyBjcmVhdGVkIgogICAgICAgICk7CgogICAgICAgIG15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHF1ZXVlLgogICAgICAgIG15ICRRdWV1ZUlEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUFkZCgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgID0+ICRUaWNrZXREYXRhe1F1ZXVlfSwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICAgICA9PiAxLAogICAgICAgICAgICBTeXN0ZW1BZGRyZXNzSUQgPT4gMSwKICAgICAgICAgICAgU2FsdXRhdGlvbklEICAgID0+IDEsCiAgICAgICAgICAgIFNpZ25hdHVyZUlEICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgPT4gJ1NlbGVuaXVtIFF1ZXVlJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFF1ZXVlSUQsCiAgICAgICAgICAgICJRdWV1ZUlEICRRdWV1ZUlEIGlzIGNyZWF0ZWQiCiAgICAgICAgKTsKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQoKIyBHZXQgdGhlIGxpc3Qgb2Ygc2VydmljZSB0eXBlcyBmcm9tIGdlbmVyYWwgY2F0YWxvZy4KbXkgJFNlcnZpY2VUeXBlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKKTsKCiMgQnVpbGQgYSBsb29rdXAgaGFzaC4KbXkgJVNlcnZpY2VUeXBlTmFtZTJJRCA9IHJldmVyc2UgJXsgJFNlcnZpY2VUeXBlTGlzdCB9OwoKIyBHZXQgdGhlIGxpc3Qgb2Ygc2xhIHR5cGVzIGZyb20gZ2VuZXJhbCBjYXRhbG9nLgpteSAkU0xBVHlwZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICBDbGFzcyA9PiAnSVRTTTo6U0xBOjpUeXBlJywKKTsKCiMgQnVpbGQgYSBsb29rdXAgaGFzaC4KbXkgJVNMQVR5cGVOYW1lMklEID0gcmV2ZXJzZSAleyAkU0xBVHlwZUxpc3QgfTsKIyAtLS0KCiAgICAgICAgIyBDcmVhdGUgdGVzdCBzZXJ2aWNlLgogICAgICAgIG15ICRTZXJ2aWNlSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRUaWNrZXREYXRhe1NlcnZpY2V9LAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+ICRTZXJ2aWNlVHlwZU5hbWUySUR7VHJhaW5pbmd9LAogICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAnMyBub3JtYWwnLAojIC0tLQogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1NlbGVuaXVtIFNlcnZpY2UnLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlcnZpY2VJRCwKICAgICAgICAgICAgIlNlcnZpY2VJRCAkU2VydmljZUlEIGlzIGNyZWF0ZWQiCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCBTTEEgd2l0aCBsb3cgZXNjYWxhdGlvbiB0aW1lcywgc28gd2UgdHJpZ2dlciB3YXJuaW5nIGluICdUaWNrZXQgSW5mb3JtYXRpb24nIHdpZGdldC4KICAgICAgICBteSAlRXNjYWxhdGlvblRpbWVzID0gKAogICAgICAgICAgICBGaXJzdFJlc3BvbnNlVGltZSA9PiAzMCwKICAgICAgICAgICAgVXBkYXRlVGltZSAgICAgICAgPT4gNDAsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgID0+IDUwLAogICAgICAgICk7CiAgICAgICAgbXkgJFNMQUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNMQScpLT5TTEFBZGQoCiAgICAgICAgICAgIFNlcnZpY2VJRHMgICAgICAgID0+IFskU2VydmljZUlEXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgPT4gJFRpY2tldERhdGF7U0xBfSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICBUeXBlSUQgPT4gJFNMQVR5cGVOYW1lMklEe090aGVyfSwKIyAtLS0KICAgICAgICAgICAgRmlyc3RSZXNwb25zZVRpbWUgPT4gJEVzY2FsYXRpb25UaW1lc3tGaXJzdFJlc3BvbnNlVGltZX0sCiAgICAgICAgICAgIFVwZGF0ZVRpbWUgICAgICAgID0+ICRFc2NhbGF0aW9uVGltZXN7VXBkYXRlVGltZX0sCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgID0+ICRFc2NhbGF0aW9uVGltZXN7U29sdXRpb25UaW1lfSwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICAgPT4gJ1NlbGVuaXVtIFNMQScsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNMQUlELAogICAgICAgICAgICAiU0xBSUQgJFNMQUlEIGlzIGNyZWF0ZWQiCiAgICAgICAgKTsKCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwogICAgICAgIG15ICREeW5hbWljRmllbGRWYWx1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGRWYWx1ZScpOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IGR5bmFtaWMgZmllbGQuCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZE5hbWUgPSAiREZUZXh0JFJhbmRvbUlEIjsKICAgICAgICBteSAkRHluYW1pY0ZpZWxkSUQgICA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEFkZCgKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICAgICAgICAgTGFiZWwgICAgICA9PiAiREZMYWJlbCIsCiAgICAgICAgICAgIEZpZWxkT3JkZXIgPT4gOTk5MSwKICAgICAgICAgICAgRmllbGRUeXBlICA9PiAnVGV4dCcsCiAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIENvbmZpZyAgICAgPT4gewogICAgICAgICAgICAgICAgRGVmYXVsdFZhbHVlID0+ICcnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkRHluYW1pY0ZpZWxkSUQsCiAgICAgICAgICAgICJEeW5hbWljRmllbGRJRCAkRHluYW1pY0ZpZWxkSUQgaXMgY3JlYXRlZCIKICAgICAgICApOwoKICAgICAgICAjIEVuYWJsZSB0ZXN0IGR5bmFtaWMgZmllbGQgdG8gc2hvdyBpbiBBZ2VudFRpY2tldFpvb20gc2NyZWVuIGluICdUaWNrZXQgSW5mb3JtYXRpb24nIHdpZGdldC4KICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRab29tIyMjRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgVmFsdWUgPT4gewogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZE5hbWUgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHRpY2tldC4KICAgICAgICBteSAkQ3VzdG9tZXIgICAgPSAiQ3VzdG9tZXIkUmFuZG9tSUQiOwogICAgICAgIG15ICRUaXRsZVJhbmRvbSA9ICJUaXRsZSRSYW5kb21JRCI7CiAgICAgICAgbXkgJFRpY2tldElEICAgID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKAogICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICRUaXRsZVJhbmRvbSwKICAgICAgICAgICAgUXVldWUgICAgICAgICA9PiAkVGlja2V0RGF0YXtRdWV1ZX0sCiAgICAgICAgICAgIFR5cGVJRCAgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgTG9jayAgICAgICAgICA9PiAkVGlja2V0RGF0YXtMb2NrZWR9LAogICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICRUaWNrZXREYXRhe1ByaW9yaXR5fSwKICAgICAgICAgICAgU3RhdGUgICAgICAgICA9PiAkVGlja2V0RGF0YXtTdGF0ZX0sCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgU0xBSUQgICAgICAgICA9PiAkU0xBSUQsCiAgICAgICAgICAgIEN1c3RvbWVySUQgICAgPT4gJEN1c3RvbWVyLAogICAgICAgICAgICBSZXNwb25zaWJsZUlEID0+ICRSZXNwb25zaWJsZVVzZXJJRCwKICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAkVXNlckxvZ2luSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJMb2dpbklELAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRUaWNrZXRJRCwKICAgICAgICAgICAgIlRpY2tldElEICRUaWNrZXRJRCBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIEFkZCBkeW5hbWljIGZpZWxkIHZhbHVlIHRvIHRoZSB0ZXN0IHRpY2tldC4KICAgICAgICBteSAkREZWYWx1ZSA9ICJERlZhbHVlVGV4dCRSYW5kb21JRCI7CiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkVmFsdWVPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICBGaWVsZElEICAgID0+ICREeW5hbWljRmllbGRJRCwKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgT2JqZWN0SUQgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgVmFsdWUgICAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWVUZXh0ID0+ICRERlZhbHVlLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkR5bmFtaWNGaWVsZCB2YWx1ZSBhZGRlZCB0byB0aGUgdGVzdCB0aWNrZXQiLAogICAgICAgICk7CgogICAgICAgICMgTG9naW4gYXMgdGVzdCB1c2VyLgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIE5hdmlnYXRlIHRvIEFnZW50VGlja2V0Wm9vbSBmb3IgdGVzdCBjcmVhdGVkIHRpY2tldC4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JFRpY2tldElEIik7CgogICAgICAgICMgVmVyaWZ5IGl0cyByaWdodCBzY3JlZW4uCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkVGl0bGVSYW5kb20gKSA+IC0xLAogICAgICAgICAgICAiVGlja2V0ICRUaXRsZVJhbmRvbSBmb3VuZCBvbiBwYWdlIiwKICAgICAgICApOwoKICAgICAgICAjIFZlcmlmeSB0aGVyZSBpcyBubyAnVGlja2V0IEluZm9ybWF0aW9uJyB3aWRnZXQsIGl0J3MgZGlzYWJsZWQuCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAiJFRpY2tldERhdGF7U2VydmljZX0iICkgPT0gLTEsCiAgICAgICAgICAgICJUaWNrZXQgSW5mb3JtYXRpb24gd2lkZ2V0IGlzIGRpc2FibGVkIiwKICAgICAgICApOwoKICAgICAgICAjIFJlc2V0ICdUaWNrZXQgSW5mb3JtYXRpb24nIHdpZGdldCBzeXNjb25maWcsIGVuYWJsZSBpdCBhbmQgcmVmcmVzaCBzY3JlZW4uCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Wm9vbSMjI1dpZGdldHMjIyMwMTAwLVRpY2tldEluZm9ybWF0aW9uJywKICAgICAgICAgICAgVmFsdWUgPT4gewogICAgICAgICAgICAgICAgJ0xvY2F0aW9uJyA9PiAnU2lkZWJhcicsCiAgICAgICAgICAgICAgICAnTW9kdWxlJyAgID0+ICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6VGlja2V0Wm9vbTo6VGlja2V0SW5mb3JtYXRpb24nLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRSZWZyZXNoKCk7CgogICAgICAgICMgVmVyaWZ5IHRoZXJlIGlzICdUaWNrZXQgSW5mb3JtYXRpb24nIHdpZGdldCwgaXQncyBlbmFibGVkLgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuSGVhZGVyPmgyJywgJ2NzcycgKS0+Z2V0X3RleHQoKSwKICAgICAgICAgICAgJ1RpY2tldCBJbmZvcm1hdGlvbicsCiAgICAgICAgICAgICdUaWNrZXQgSW5mb3JtYXRpb24gd2lkZ2V0IGlzIGVuYWJsZWQnLAogICAgICAgICk7CgogICAgICAgICMgVmVyaWZ5IHRoZXJlIGlzIG5vIGNvbGxhcHNlZCBlbGVtZW50cyBvbiB0aGUgc2NyZWVuLgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9kaXZbY29udGFpbnMoXEBjbGFzcywgXCdXaWRnZXRTaW1wbGUgRXhwYW5kZWQnKV0iKSwKICAgICAgICAgICAgIlRpY2tldCBJbmZvcm1hdGlvbiBXaWRnZXQgaXMgZXhwYW5kZWQiLAogICAgICAgICk7CgogICAgICAgICMgVG9nZ2xlIHRvIGNvbGxhcHNlICdUaWNrZXQgSW5mb3JtYXRpb24nIHdpZGdldC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAdGl0bGUsIFwnU2hvdyBvciBoaWRlIHRoZSBjb250ZW50JyApXSIpLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gJ3JldHVybiAkKCJkaXYuV2lkZ2V0U2ltcGxlLkNvbGxhcHNlZCIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAjIFZlcmlmeSB0aGVyZSBpcyBjb2xsYXBzZWQgZWxlbWVudCBvbiB0aGUgc2NyZWVuLgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9kaXZbY29udGFpbnMoXEBjbGFzcywgXCdXaWRnZXRTaW1wbGUgQ29sbGFwc2VkJyldIiksCiAgICAgICAgICAgICJUaWNrZXQgSW5mb3JtYXRpb24gV2lkZ2V0IGlzIGNvbGxhcHNlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBBZGQgYXJ0aWNsZSB0byB0aWNrZXQuCiAgICAgICAgbXkgJEFydGljbGVJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGU6OkJhY2tlbmQ6OkVtYWlsJyktPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwKICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJ2N1c3RvbWVyJywKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJ3NvbWUgc2hvcnQgZGVzY3JpcHRpb24nLAogICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICA9PiAndGhlIG1lc3NhZ2UgdGV4dCcsCiAgICAgICAgICAgIENoYXJzZXQgICAgICAgICAgICAgID0+ICdJU08tODg1OS0xNScsCiAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgPT4gJ0VtYWlsQ3VzdG9tZXInLAogICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAnU29tZSBmcmVlIHRleHQhJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQXJ0aWNsZUlELAogICAgICAgICAgICAiQXJ0aWNsZUlEICRBcnRpY2xlSUQgaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBBZGQgYWNjb3VudGVkIHRpbWUgdG8gdGhlIHRpY2tldC4KICAgICAgICBteSAkQWNjb3VudGVkVGltZSA9IDEyMzsKICAgICAgICAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgVGltZVVuaXQgID0+ICRBY2NvdW50ZWRUaW1lLAogICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkFjY291bnRlZCBUaW1lICRBY2NvdW50ZWRUaW1lIGFkZGVkIHRvIHRpY2tldCIKICAgICAgICApOwoKICAgICAgICAjIFJlZnJlc2ggc2NyZWVuIHRvIGdldCBhY2NvdW50ZWQgdGltZSB2YWx1ZS4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkUmVmcmVzaCgpOwoKICAgICAgICAjIFZlcmlmeSAnVGlja2V0IEluZm9ybWF0aW9uJyB3aWRnZXQgdmFsdWVzLgogICAgICAgIGZvciBteSAkVGlja2V0SW5mb3JtYXRpb25DaGVjayAoIHNvcnQga2V5cyAlVGlja2V0RGF0YSApIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9wW2NvbnRhaW5zKFxAdGl0bGUsIFwnJFRpY2tldERhdGF7JFRpY2tldEluZm9ybWF0aW9uQ2hlY2t9JyApXSIpLAogICAgICAgICAgICAgICAgIiRUaWNrZXRJbmZvcm1hdGlvbkNoZWNrIC0gJFRpY2tldERhdGF7JFRpY2tldEluZm9ybWF0aW9uQ2hlY2t9IGZvdW5kIGluIFRpY2tldCBJbmZvcm1hdGlvbiB3aWRnZXQiCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIFZlcmlmeSBjdXN0b21lciBsaW5rIHRvICdDdXN0b21lciBJbmZvcm1hdGlvbiBDZW50ZXInLgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBZ2VudEN1c3RvbWVySW5mb3JtYXRpb25DZW50ZXI7Q3VzdG9tZXJJRD0kQ3VzdG9tZXInICldIiksCiAgICAgICAgICAgICJDdXN0b21lciBsaW5rIHRvICdDdXN0b21lciBJbmZvcm1hdGlvbiBDZW50ZXInIGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIFZlcmlmeSBhY2NvdW50ZWQgdGltZSB2YWx1ZS4KICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksIHFxfDxwIGNsYXNzPSJWYWx1ZSI+JEFjY291bnRlZFRpbWU8L3A+fCApID4gLTEsCiAgICAgICAgICAgICJBY2NvdW50ZWQgVGltZSBmb3VuZCBpbiBUaWNrZXQgSW5mb3JtYXRpb24gV2lkZ2V0IiwKICAgICAgICApOwoKICAgICAgICAjIFZlcmlmeSBkeW5hbWljIGZpZWxkIHZhbHVlIGluICdUaWNrZXQgSW5mb3JtYXRpb24nIHdpZGdldC4KICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vc3Bhbltjb250YWlucyhcQHRpdGxlLCBcJyRERlZhbHVlJyApXSIpLAogICAgICAgICAgICAiRHluYW1pY0ZpZWxkIHZhbHVlIC0gJERGVmFsdWUgZm91bmQgaW4gVGlja2V0IEluZm9ybWF0aW9uIHdpZGdldCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBSZWNyZWF0ZSBUaWNrZXRPYmplY3QgdG8gbGV0IGV2ZW50IGhhbmRsZXJzIHJ1biBhbHNvIGZvciB0cmFuc2FjdGlvbiBtb2RlLgogICAgICAgICRLZXJuZWw6Ok9NLT5PYmplY3RzRGlzY2FyZCgKICAgICAgICAgICAgT2JqZWN0cyA9PiBbCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgICAgICMgUmVmcmVzaCBzY3JlZW4gdG8gYmUgc3VyZSBlc2NhbGF0aW9uIHRpbWUgd2lsbCBnZXQgbGF0ZXN0IHRpbWVzLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRSZWZyZXNoKCk7CgogICAgICAgICMgR2V0IHRpY2tldCBkYXRhIGZvciBlc2NhbGF0aW9uIHRpbWUgdmFsdWVzLgogICAgICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgRXh0ZW5kZWQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIFZlcmlmeSBlc2NhbGF0aW9uIHRpbWVzLCB3YXJuaW5nIHNob3VsZCBiZSBhY3RpdmUuCiAgICAgICAgZm9yIG15ICRFc2NhbGF0aW9uVGltZSAoIHNvcnQga2V5cyAlRXNjYWxhdGlvblRpbWVzICkgewogICAgICAgICAgICAkRXNjYWxhdGlvblRpbWUgPSBmbG9vciggJFRpY2tldHskRXNjYWxhdGlvblRpbWV9IC8gNjAgKTsKCiAgICAgICAgICAgICMgQ2hlY2sgaWYgd2FybmluZyBpcyB2aXNpYmxlLgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKCiAgICAgICAgICAgICAgICAjIENoZWNrIGZvciBFc2NhbGF0aW9uVGltZSBvciBFc2NhbGF0aW9uVGltZSArIDEgKG9uZSBtaW51dGUgdG9sZXJhbmNlLCBzaW5jZSBpdCBmYWlscyBvbiBmYXN0IHN5c3RlbXMpLgogICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoCiAgICAgICAgICAgICAgICAgICAgIi8vcFtcQGNsYXNzPSdXYXJuaW5nJ11bXEB0aXRsZT0nU2VydmljZSBUaW1lOiAkRXNjYWxhdGlvblRpbWUgbScgb3IgXEB0aXRsZT0nU2VydmljZSBUaW1lOiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gKCAkRXNjYWxhdGlvblRpbWUgKyAxICkgLiAiIG0nXSIKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAiRXNjYWxhdGlvbiBUaW1lICRFc2NhbGF0aW9uVGltZSBtICwgZm91bmQgaW4gVGlja2V0IEluZm9ybWF0aW9uIFdpZGdldCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIENsZWFudXAgdGVzdCBkYXRhLgogICAgICAgICMgRGVsZXRlIGR5bmFtaWMgZmllbGQgdmFsdWUuCiAgICAgICAgJFN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkVmFsdWVPYmplY3QtPlZhbHVlRGVsZXRlKAogICAgICAgICAgICBGaWVsZElEICA9PiAkRHluYW1pY0ZpZWxkSUQsCiAgICAgICAgICAgIE9iamVjdElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkR5bmFtaWNGaWVsZCB2YWx1ZSByZW1vdmVkIGZyb20gdGhlIHRlc3QgdGlja2V0IiwKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZSBkeW5hbWljIGZpZWxkLgogICAgICAgICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkRGVsZXRlKAogICAgICAgICAgICBJRCAgICAgPT4gJER5bmFtaWNGaWVsZElELAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkR5bmFtaWNGaWVsZElEICREeW5hbWljRmllbGRJRCBpcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZSB0ZXN0IHRpY2tldC4KICAgICAgICAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiVGlja2V0SUQgJFRpY2tldElEIGlzIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICAgICAjIEdldCBkZWxldGUgdGVzdCBkYXRhLgogICAgICAgIG15IEBEZWxldGVEYXRhID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBTUUwgICAgID0+ICJERUxFVEUgRlJPTSB0aWNrZXRfdHlwZSBXSEVSRSBpZCA9ICRUeXBlSUQiLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiVHlwZUlEICRUeXBlSUQgaXMgZGVsZXRlZCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFNRTCAgICAgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2Vfc2xhIFdIRVJFIHNsYV9pZCA9ICRTTEFJRCIsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJTZXJ2aWNlLVNMQSByZWxhdGlvbiBkZWxldGVkIiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU1FMICAgICA9PiAiREVMRVRFIEZST00gc2xhIFdIRVJFIGlkID0gJFNMQUlEIiwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIlNMQUlEICRTTEFJRCBpcyBkZWxldGVkIiwKICAgICAgICAgICAgfSwKIyAtLS0KIyBJVFNNQ29yZQojIC0tLQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBTUUwgICAgID0+ICJERUxFVEUgRlJPTSBzZXJ2aWNlX3ByZWZlcmVuY2VzIFdIRVJFIHNlcnZpY2VfaWQgPSAkU2VydmljZUlEIiwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIlNlcnZpY2UgcHJlZmVyZW5jZXMgZm9yICRTZXJ2aWNlSUQgaXMgZGVsZXRlZCIsCiAgICAgICAgICAgIH0sCiMgLS0tCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFNRTCAgICAgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2UgV0hFUkUgaWQgPSAkU2VydmljZUlEIiwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIlNlcnZpY2VJRCAkU2VydmljZUlEIGlzIGRlbGV0ZWQiLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBTUUwgICAgID0+ICJERUxFVEUgRlJPTSBxdWV1ZSBXSEVSRSBpZCA9ICRRdWV1ZUlEIiwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIlF1ZXVlSUQgJFF1ZXVlSUQgaXMgZGVsZXRlZCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBEZWxldGUgdGVzdCBjcmVhdGVkIGl0ZW1zLgogICAgICAgIGZvciBteSAkSXRlbSAoQERlbGV0ZURhdGEpIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICRJdGVtLT57U1FMfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICRJdGVtLT57TWVzc2FnZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAgICAgIyBNYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdC4KICAgICAgICBmb3IgbXkgJENhY2hlIChxdyggVGlja2V0IFR5cGUgU0xBIFNlcnZpY2UgUXVldWUgRHluYW1pY0ZpZWxkICkpIHsKICAgICAgICAgICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKCBUeXBlID0+ICRDYWNoZSApOwogICAgICAgIH0KICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA0ZmUyMThiZWNjZGI5MjZhMjlkZDdiZWQ5ZGU0ODIxMTQzMGQ2OWQwIC0gc2NyaXB0cy90ZXN0L1NlbGVuaXVtL091dHB1dC9Ub29sQmFyL1RpY2tldFNlcnZpY2UudAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKIyMgbm8gY3JpdGljIChNb2R1bGVzOjpSZXF1aXJlRXhwbGljaXRQYWNrYWdlKQp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgpteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICBteSAkSGVscGVyICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKICAgICAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgICAgIG15ICRHcm91cE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKCiAgICAgICAgIyBHZXQgcmFuZG9tIHZhcmlhYmxlLgogICAgICAgIG15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgogICAgICAgICMgRW5hYmxlIEFnZW50VGlja2V0U2VydmljZSB0b29sYmFyIGljb24uCiAgICAgICAgbXkgJUFnZW50VGlja2V0U2VydmljZSA9ICgKICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJ1NlcnZpY2VWaWV3JywKICAgICAgICAgICAgSWNvbiAgICAgPT4gJ2ZhIGZhLXdyZW5jaCcsCiAgICAgICAgICAgIE1vZHVsZSAgID0+ICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6VG9vbEJhcjo6VGlja2V0U2VydmljZScsCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICcxMDMwMDM1JywKICAgICAgICApOwoKICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnRnJvbnRlbmQ6OlRvb2xCYXJNb2R1bGUjIyMyMDAtVGlja2V0OjpBZ2VudFRpY2tldFNlcnZpY2UnLAogICAgICAgICAgICBWYWx1ZSA9PiBcJUFnZW50VGlja2V0U2VydmljZSwKICAgICAgICApOwoKICAgICAgICAjIEFsbG93cyBkZWZpbmluZyBzZXJ2aWNlcyBmb3IgdGlja2V0cy4KICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnVGlja2V0OjpTZXJ2aWNlJywKICAgICAgICAgICAgVmFsdWUgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHNlcnZpY2UuCiAgICAgICAgbXkgJFNlcnZpY2VOYW1lID0gJ1NlbGVuaXVtJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFNlcnZpY2VJRCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUFkZCgKICAgICAgICAgICAgTmFtZSAgICA9PiAkU2VydmljZU5hbWUsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gMSwKICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJzMgbm9ybWFsJywKIyAtLS0KICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlcnZpY2VJRCwKICAgICAgICAgICAgIlNlcnZpY2UgSUQgJFNlcnZpY2VJRCBpcyBjcmVhdGVkIgogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgZ3JvdXAuCiAgICAgICAgbXkgJEdyb3VwTmFtZSA9ICJHcm91cCIgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgIG15ICRHcm91cElEICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRHcm91cE5hbWUsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRHcm91cElELAogICAgICAgICAgICAiR3JvdXAgSUQgJEdyb3VwSUQgaXMgY3JlYXRlZCIKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHF1ZXVlLgogICAgICAgIG15ICRRdWV1ZU5hbWUgPSAnUXVldWUnIC4gJFJhbmRvbUlEOwogICAgICAgIG15ICRRdWV1ZUlEICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVBZGQoCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICA9PiAkUXVldWVOYW1lLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgR3JvdXBJRCAgICAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBTeXN0ZW1BZGRyZXNzSUQgPT4gMSwKICAgICAgICAgICAgU2FsdXRhdGlvbklEICAgID0+IDEsCiAgICAgICAgICAgIFNpZ25hdHVyZUlEICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgPT4gJ1NlbGVuaXVtIFF1ZXVlJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFF1ZXVlSUQsCiAgICAgICAgICAgICJRdWV1ZSBJRCAkUXVldWVJRCBpcyBjcmVhdGVkIgogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgdGlja2V0LgogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgVGl0bGUgICAgICAgICA9PiAnU2VsZW5pdW0gdGVzdCB0aWNrZXQnLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgID0+ICRRdWV1ZU5hbWUsCiAgICAgICAgICAgIExvY2sgICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJzMgbm9ybWFsJywKICAgICAgICAgICAgU3RhdGUgICAgICAgICA9PiAnb3BlbicsCiAgICAgICAgICAgIEN1c3RvbWVySUQgICAgPT4gJ1NlbGVuaXVtQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgPT4gJ3Rlc3RAbG9jYWxob3N0LmNvbScsCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgT3duZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlc3BvbnNpYmxlSUQgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICJUaWNrZXQgSUQgJFRpY2tldElEIGlzIGNyZWF0ZWQiCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCB1c2VyLgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycsICRHcm91cE5hbWUgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgIyBHZXQgdGVzdCB1c2VyIElELgogICAgICAgIG15ICRUZXN0VXNlcklEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgVXBkYXRlICdNeSBTZXJ2aWNlJyBwcmVmZXJlbmNlIGZvciB0ZXN0IGNyZWF0ZWQgdXNlci4KICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgICAgICBteSAkU3VjY2VzcyAgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICAgICAgSU5TRVJUIElOVE8gcGVyc29uYWxfc2VydmljZXMgKHNlcnZpY2VfaWQsIHVzZXJfaWQpCiAgICAgICAgICAgICAgICBWQUxVRVMgKD8sID8pCiAgICAgICAgICAgICcsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFNlcnZpY2VJRCwgXCRUZXN0VXNlcklEIF0KICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgJ015IHNlcnZpY2UgcHJlZmVyZW5jZSB1cGRhdGVkIGZvciB0ZXN0IHVzZXInCiAgICAgICAgKTsKCiAgICAgICAgIyBMb2dpbiB0ZXN0IHVzZXIuCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudERhc2hib2FyZCIpOwoKICAgICAgICAjIENsaWNrIG9uIHRvb2wgYmFyIEFnZW50VGlja2V0U2VydmljZS4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAdGl0bGUsIFwnVGlja2V0cyBpbiBNeSBTZXJ2aWNlczpcJyApXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgVmVyaWZ5IHRoYXQgdGVzdCBpcyBvbiB0aGUgY29ycmVjdCBzY3JlZW4uCiAgICAgICAgbXkgJEV4cGVjdGVkVVJMID0gIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0U2VydmljZSI7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9jdXJyZW50X3VybCgpLCAkRXhwZWN0ZWRVUkwgKSA+IC0xLAogICAgICAgICAgICAiVG9vbEJhciBpY29uICdUaWNrZXQgaW4gbXkgU2VydmljZXMnIHNob3J0Y3V0IC0gc3VjY2VzcyIKICAgICAgICApOwoKICAgICAgICAjIFJldHVybiBiYWNrIHRvIGRhc2hib2FyZCBzY3JlZW4uCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnREYXNoYm9hcmQiKTsKCiAgICAgICAgIyBDaGFuZ2UgdGVzdCB1c2VyIGdyb3VwIHBlcm1pc3Npb24gZm9yIHdoaWNoIHF1ZXVlLXRpY2tldCBpcyBpbiB0byBSTy4KICAgICAgICAjICAgVG9vbGJhciBpY29uIHNob3VsZCBiZSByZW1vdmVkLCBzZWUgYnVnIzEyMjY5IGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICAgICRTdWNjZXNzID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBVc2VyQWRkKAogICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVSUQgICAgICAgID0+ICRUZXN0VXNlcklELAogICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgIHJvICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgbW92ZV9pbnRvID0+IDAsCiAgICAgICAgICAgICAgICBjcmVhdGUgICAgPT4gMCwKICAgICAgICAgICAgICAgIG93bmVyICAgICA9PiAwLAogICAgICAgICAgICAgICAgcHJpb3JpdHkgID0+IDAsCiAgICAgICAgICAgICAgICBydyAgICAgICAgPT4gMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICdDaGFuZ2VkIHRlc3QgdXNlciBncm91cCBwZXJtaXNzaW9uIHRvIFJPJwogICAgICAgICk7CgogICAgICAgICMgUmVmcmVzaCBzY3JlZW4uCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZFJlZnJlc2goKTsKCiAgICAgICAgIyBWZXJpZmllZCB0b29sIGJhciAnVGlja2V0IGluIG15IFNlcnZpY2VzJyBpY29uIGlzIHJlbW92ZWQuCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnLlNlcnZpY2VWaWV3JykubGVuZ3RoID09PSAwOyIpLAogICAgICAgICAgICAiVG9vbEJhciBpY29uICdUaWNrZXQgaW4gbXkgU2VydmljZXMnIGlzIHJlbW92ZWQgd2hlbiBhZ2VudCBkb2Vzbid0IGhhdmUgUlcgYWNjZXNzIHRvIHRpY2tldCIKICAgICAgICApOwoKICAgICAgICAjIENoYW5nZSBzZXR0aW5ncyBUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFNlcnZpY2UjIyNWaWV3QWxsUG9zc2libGVUaWNrZXRzIHRvICdZZXMnLgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFNlcnZpY2UjIyNWaWV3QWxsUG9zc2libGVUaWNrZXRzJywKICAgICAgICAgICAgVmFsdWUgPT4gMQogICAgICAgICk7CgogICAgICAgICMgUmVmcmVzaCBzY3JlZW4uCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZFJlZnJlc2goKTsKCiAgICAgICAgIyBWZXJpZmllZCB0b29sIGJhciAnVGlja2V0IGluIG15IFNlcnZpY2VzJyBpY29uIGlzIHNob3duLgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJy5TZXJ2aWNlVmlldycpLmxlbmd0aCA9PT0gMTsiKSwKICAgICAgICAgICAgIlRvb2xCYXIgaWNvbiAnVGlja2V0IGluIG15IFNlcnZpY2VzJyBpcyBzaG93biB3aGVuIGFnZW50IGRvZXNuJ3QgaGF2ZSBSVyBhY2Nlc3MgdG8gdGlja2V0IGFuZCBzZXR0aW5ncyAnVmlld0FsbFBvc3NpYmxlVGlja2V0cycgaXMgZW5hYmxlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBEZWxldGUgdGVzdCB0aWNrZXQuCiAgICAgICAgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXREZWxldGUoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBUaWNrZXQgZGVsZXRpb24gY291bGQgZmFpbCBpZiBhcGFjaGUgc3RpbGwgd3JpdGVzIHRvIHRpY2tldCBoaXN0b3J5LiBUcnkgYWdhaW4gaW4gdGhpcyBjYXNlLgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICBzbGVlcCAzOwogICAgICAgICAgICAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRUZXN0VXNlcklELAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJUaWNrZXQgSUQgJFRpY2tldElEIGlzIGRlbGV0ZWQiCiAgICAgICAgKTsKCiAgICAgICAgIyBEZWxldGUgcGVyc29uYWwgc2VydmljZSBmcm9tIERCLgogICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gcGVyc29uYWxfc2VydmljZXMgV0hFUkUgdXNlcl9pZCA9ID8iLAogICAgICAgICAgICBCaW5kID0+IFsgXCRUZXN0VXNlcklEIF0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICdQZXJzb25hbCBzZXJ2aWNlIGNvbm5lY3Rpb24gaXMgZGVsZXRlZCcKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZSB0ZXN0IHNlcnZpY2UuCiAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBzZXJ2aWNlIFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFNlcnZpY2VJRCBdLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiU2VydmljZSBJRCAkU2VydmljZUlEIGlzIGRlbGV0ZWQiCiAgICAgICAgKTsKCiAgICAgICAgIyBEZWxldGUgdGVzdCBxdWV1ZS4KICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIHF1ZXVlIFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFF1ZXVlSUQgXSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlF1ZXVlIElEICRRdWV1ZUlEIGlzIGRlbGV0ZWQiCiAgICAgICAgKTsKCiAgICAgICAgIyBEZWxldGUgdGVzdCB1c2VyIGZyb20gZ3JvdXAuCiAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBncm91cF91c2VyIFdIRVJFIGdyb3VwX2lkID0gPyIsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJEdyb3VwSUQgXSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkdyb3VwICRHcm91cE5hbWUgLSBUZXN0VXNlciByZWxhdGlvbiBpcyBkZWxldGVkIgogICAgICAgICk7CgogICAgICAgICMgRGVsZXRlIHRlc3QgZ3JvdXAuCiAgICAgICAgJEdyb3VwTmFtZSA9ICREQk9iamVjdC0+UXVvdGUoJEdyb3VwTmFtZSk7CiAgICAgICAgJFN1Y2Nlc3MgICA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGdyb3VwcyBXSEVSRSBuYW1lID0gPyIsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJEdyb3VwTmFtZSBdLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiR3JvdXAgJEdyb3VwTmFtZSBpcyBkZWxldGVkIgogICAgICAgICk7CgogICAgICAgICMgTWFrZSBzdXJlIHRoZSBjYWNoZSBpcyBjb3JyZWN0LgogICAgICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgICAgIGZvciBteSAkQ2FjaGUgKAogICAgICAgICAgICBxdyAoVGlja2V0IFNlcnZpY2UgUXVldWUgR3JvdXApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJENhY2hlLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA0ZmUyMThiZWNjZGI5MjZhMjlkZDdiZWQ5ZGU0ODIxMTQzMGQ2OWQwIC0gc2NyaXB0cy90ZXN0L1NlbGVuaXVtL091dHB1dC9QREZUaWNrZXQudAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKaWYgKCAkU2VsZW5pdW0tPnticm93c2VyX25hbWV9IG5lICdmaXJlZm94JyApIHsKICAgICRTZWxmLT5UcnVlKAogICAgICAgIDEsCiAgICAgICAgIlBERiB0ZXN0IGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIEZpcmVmb3giLAogICAgKTsKICAgIHJldHVybiAxOwp9CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICBteSAkSGVscGVyICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgogICAgICAgICMgRG8gbm90IGNoZWNrIGVtYWlsIGFkZHJlc3Nlcy4KICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICAgICAgICAgIFZhbHVlID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBFbmFibGUgdGlja2V0IFJlc3BvbnNpYmxlIGZlYXR1cmUuCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6UmVzcG9uc2libGUnLAogICAgICAgICAgICBWYWx1ZSA9PiAxCiAgICAgICAgKTsKCiAgICAgICAgIyBFbmFibGUgdGlja2V0IFR5cGUgZmVhdHVyZS4KICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnVGlja2V0OjpUeXBlJywKICAgICAgICAgICAgVmFsdWUgPT4gMQogICAgICAgICk7CgogICAgICAgICMgRW5hYmxlIHRpY2tldCBzZXJ2aWNlIGZlYXR1cmUuCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6U2VydmljZScsCiAgICAgICAgICAgIFZhbHVlID0+IDEKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSBRdWV1ZS4KICAgICAgICBteSAkUXVldWVOYW1lID0gJ1F1ZScgLiAkUmFuZG9tSUQ7CiAgICAgICAgbXkgJFF1ZXVlSUQgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUFkZCgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgID0+ICRRdWV1ZU5hbWUsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICA9PiAxLAogICAgICAgICAgICBHcm91cElEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgU3lzdGVtQWRkcmVzc0lEID0+IDEsCiAgICAgICAgICAgIFNhbHV0YXRpb25JRCAgICA9PiAxLAogICAgICAgICAgICBTaWduYXR1cmVJRCAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgID0+ICdTZWxlbml1bSBRdWV1ZScsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRRdWV1ZUlELAogICAgICAgICAgICAiQ3JlYXRlZCBRdWV1ZUlEICRRdWV1ZUlEIgogICAgICAgICk7CiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KCiMgZ2V0IHRoZSBsaXN0IG9mIHNlcnZpY2UgdHlwZXMgZnJvbSBnZW5lcmFsIGNhdGFsb2cKbXkgJFNlcnZpY2VUeXBlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgIENsYXNzID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKKTsKCiMgYnVpbGQgYSBsb29rdXAgaGFzaApteSAlU2VydmljZVR5cGVOYW1lMklEID0gcmV2ZXJzZSAleyAkU2VydmljZVR5cGVMaXN0IH07CgojIGdldCB0aGUgbGlzdCBvZiBzbGEgdHlwZXMgZnJvbSBnZW5lcmFsIGNhdGFsb2cKbXkgJFNMQVR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OlNMQTo6VHlwZScsCik7CgojIGJ1aWxkIGEgbG9va3VwIGhhc2gKbXkgJVNMQVR5cGVOYW1lMklEID0gcmV2ZXJzZSAleyAkU0xBVHlwZUxpc3QgfTsKCiMgR2V0IHRoZSBjdXJyZW50IHNldHRpbmcgZm9yIGN1c3RvbWVyIHRpY2tldCBwcmludApteSAlQ3VzdG9tZXJUaWNrZXRQcmludFN5c0NvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcnKS0+U2V0dGluZ0dldCgKICAgIE5hbWUgPT4gJ0N1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZSMjI0N1c3RvbWVyVGlja2V0UHJpbnQnLAopOwoKIyBNYWtlIHN1cmUgQ3VzdG9tZXJUaWNrZXQgcHJpbnQgaXMgZW5hYmxlZC4KJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgIFZhbGlkID0+IDEsCiAgICBLZXkgICA9PiAnQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlIyMjQ3VzdG9tZXJUaWNrZXRQcmludCcsCiAgICBWYWx1ZSA9PiAkQ3VzdG9tZXJUaWNrZXRQcmludFN5c0NvbmZpZ3tFZmZlY3RpdmVWYWx1ZX0sCik7CgojIC0tLQoKICAgICAgICAjIENyZWF0ZSBTZXJ2aWNlLgogICAgICAgIG15ICRTZXJ2aWNlTmFtZSA9ICdTZXJ2aScgLiAkUmFuZG9tSUQ7CiAgICAgICAgbXkgJFNlcnZpY2VJRCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUFkZCgKICAgICAgICAgICAgTmFtZSAgICA9PiAkU2VydmljZU5hbWUsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gJFNlcnZpY2VUeXBlTmFtZTJJRHtUcmFpbmluZ30sCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnU2VsZW5pdW0gU2VydmljZScsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VydmljZUlELAogICAgICAgICAgICAiQ3JlYXRlZCBTZXJ2aWNlSUQgJFNlcnZpY2VJRCIKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSBTTEEuCiAgICAgICAgbXkgJFNMQU5hbWUgPSAnU0wnIC4gJFJhbmRvbUlEOwogICAgICAgIG15ICRTTEFJRCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNMQScpLT5TTEFBZGQoCiAgICAgICAgICAgIFNlcnZpY2VJRHMgICAgICAgID0+IFskU2VydmljZUlEXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgPT4gJFNMQU5hbWUsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEID0+ICRTTEFUeXBlTmFtZTJJRHtPdGhlcn0sCiMgLS0tCiAgICAgICAgICAgIEZpcnN0UmVzcG9uc2VUaW1lID0+IDUwLAogICAgICAgICAgICBVcGRhdGVUaW1lICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIFNvbHV0aW9uVGltZSAgICAgID0+IDIwMCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICAgPT4gJ1NlbGVuaXVtIFNMQScsCiMgLS0tCiMgSVRTTUNvcmUKIyAtLS0KICAgICAgICAgICAgVHlwZUlEICAgICAgICAgICAgPT4gJFNlcnZpY2VUeXBlTmFtZTJJRHtUcmFpbmluZ30sCiMgLS0tCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFF1ZXVlSUQsCiAgICAgICAgICAgICJDcmVhdGVkIFNMQUlEICRRdWV1ZUlEIgogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIFR5cGUuCiAgICAgICAgbXkgJFR5cGVOYW1lID0gJ1R5cGUnIC4gJFJhbmRvbUlEOwogICAgICAgIG15ICRUeXBlSUQgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyktPlR5cGVBZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFR5cGVOYW1lLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVHlwZUlELAogICAgICAgICAgICAiQ3JlYXRlZCBUeXBlSUQgJFR5cGVJRCIKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSBVc2Vycy4KICAgICAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CiAgICAgICAgbXkgQFVzZXJzOwogICAgICAgIGZvciBteSAkVXNlckNvdW50ICggMSAuLiAyICkgewoKICAgICAgICAgICAgIyBDcmVhdGUgdGVzdCBVc2VyIGFuZCBsb2dpbi4KICAgICAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgICAgIEdyb3VwcyA9PiBbJ3VzZXJzJ10sCiAgICAgICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAgICAgIyBHZXQgdXNlciBkYXRhLgogICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBAVXNlcnMsIFwlVXNlckRhdGE7CiAgICAgICAgfQoKICAgICAgICAjIENyZWF0ZSBDdXN0b21lciBDb21wYW55LgogICAgICAgIG15ICVDdXN0b21lckNvbXBhbnkgPSAoCiAgICAgICAgICAgIEN1c3RvbWVySUQgICAgICAgICAgICAgPT4gJ0N1c3RvbWVyJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgQ3VzdG9tZXJDb21wYW55TmFtZSAgICA9PiAnQ29tcGFueScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIEN1c3RvbWVyQ29tcGFueVN0cmVldCAgPT4gJ1N0cmVldCcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIEN1c3RvbWVyQ29tcGFueVpJUCAgICAgPT4gJ1pJUCcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIEN1c3RvbWVyQ29tcGFueUNpdHkgICAgPT4gJ0NpdHknIC4gJFJhbmRvbUlELAogICAgICAgICAgICBDdXN0b21lckNvbXBhbnlDb3VudHJ5ID0+ICdDb3VudHJ5JyAuICRSYW5kb21JRCwKICAgICAgICAgICAgQ3VzdG9tZXJDb21wYW55VVJMICAgICA9PiAnVVJMJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgQ3VzdG9tZXJDb21wYW55Q29tbWVudCA9PiAnQ29tbWVudCcgLiAkUmFuZG9tSUQsCiAgICAgICAgKTsKICAgICAgICBteSAkQ3VzdG9tZXJDb21wYW55SUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55JyktPkN1c3RvbWVyQ29tcGFueUFkZCgKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgICVDdXN0b21lckNvbXBhbnksCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJEN1c3RvbWVyQ29tcGFueUlELAogICAgICAgICAgICAiQ3JlYXRlZCBDdXN0b21lckNvbXBhbnlJRCAkQ3VzdG9tZXJDb21wYW55SUQiCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgQ3VzdG9tZXIgVXNlci4KICAgICAgICBteSAlQ3VzdG9tZXJVc2VyID0gKAogICAgICAgICAgICBVc2VyRmlyc3RuYW1lICA9PiAnQ3VzdG9tZXJGaXJzdE5hbWUnIC4gJFJhbmRvbUlELAogICAgICAgICAgICBVc2VyTGFzdG5hbWUgICA9PiAnQ3VzdG9tZXJMYXN0TmFtZScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIFVzZXJDdXN0b21lcklEID0+ICRDdXN0b21lckNvbXBhbnlJRCwKICAgICAgICAgICAgVXNlckxvZ2luICAgICAgPT4gJ0N1c3RvbWVyTG9naW4nIC4gJFJhbmRvbUlELAogICAgICAgICAgICBVc2VyUGFzc3dvcmQgICA9PiAnQ3VzdG9tZXJQYXNzJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgVXNlckVtYWlsICAgICAgPT4gJ0N1c3RvbWVyRW1haWwnIC4gJFJhbmRvbUlEIC4gJ0BleGFtcGxlLmNvbScsCiAgICAgICAgKTsKICAgICAgICBteSAkQ3VzdG9tZXJVc2VySUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyVXNlckFkZCgKICAgICAgICAgICAgU291cmNlICA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgICVDdXN0b21lclVzZXIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklELAogICAgICAgICAgICAiQ3JlYXRlZCBDdXN0b21lclVzZXJJRCAkQ3VzdG9tZXJVc2VySUQiCiAgICAgICAgKTsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRDdXN0b21lclVzZXJJRCwKICAgICAgICAgICAgS2V5ICAgID0+ICdVc2VyTGFuZ3VhZ2UnLAogICAgICAgICAgICBWYWx1ZSAgPT4gJ2VuJywKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSBUaWNrZXRzLgogICAgICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICAgICAgbXkgQFRpY2tldHM7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICAgICAgbXkgJFRpY2tldE51bWJlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZU51bWJlcigpOwogICAgICAgICAgICBteSAkVGlja2V0VGl0bGUgID0gJ1RpY2tldCcgLiAkQ291bnQgLiAkUmFuZG9tSUQ7CiAgICAgICAgICAgIG15ICVUaWNrZXQgICAgICAgPSAoCiAgICAgICAgICAgICAgICBUTiAgICAgICAgICAgID0+ICRUaWNrZXROdW1iZXIsCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICRUaWNrZXRUaXRsZSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgICAgICBMb2NrICAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnNSB2ZXJ5IGhpZ2gnLAogICAgICAgICAgICAgICAgU3RhdGUgICAgICAgICA9PiAnb3BlbicsCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgICAgPT4gJEN1c3RvbWVyQ29tcGFueUlELAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICA9PiAkQ3VzdG9tZXJVc2VySUQsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgID0+ICRVc2Vyc1swXS0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZUlEID0+ICRVc2Vyc1sxXS0+e1VzZXJJRH0sCgogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAgICAgIkNyZWF0ZWQgVGlja2V0SUQgJFRpY2tldElEIgogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBUaWNrZXRzLCB7CiAgICAgICAgICAgICAgICBJRCAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTnVtYmVyID0+ICRUaWNrZXROdW1iZXIsCiAgICAgICAgICAgICAgICBUaXRsZSAgPT4gJFRpY2tldFRpdGxlLAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgIyBSZWNyZWF0ZSBUaWNrZXRPYmplY3QgdG8gbGV0IGV2ZW50IGhhbmRsZXJzIHJ1biBhbHNvIGZvciB0cmFuc2FjdGlvbiBtb2RlLgogICAgICAgICRLZXJuZWw6Ok9NLT5PYmplY3RzRGlzY2FyZCgKICAgICAgICAgICAgT2JqZWN0cyA9PiBbCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgICAgICAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICAgICAjIENyZWF0ZSBBcnRpY2xlcy4KICAgICAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKICAgICAgICBteSBAQXJ0aWNsZXMgICAgICA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ2hhbm5lbE5hbWUgICAgICAgICAgPT4gJ0VtYWlsJywKICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdjdXN0b21lcicsCiAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAxLAogICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJ0Zyb20gJyAuICRSYW5kb21JRCAuICcgQSA8ZW1haWxAZXhhbXBsZS5jb20+JywKICAgICAgICAgICAgICAgIFRvICAgICAgICAgICAgICAgICAgID0+ICdUbyAnIC4gJFJhbmRvbUlEIC4gJyBBIDxlbWFpbEBleGFtcGxlLmNvbT4nLAogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJ0ZpcnN0IEFydGljbGUgU3ViamVjdCAnIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJ0ZpcnN0IEFydGljbGUgYm9keSAnIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgPT4gJ0VtYWlsQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgPT4gJ0N1c3RvbWVyIHNlbnQgYW4gZW1haWwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDaGFubmVsTmFtZSAgICAgICAgICA9PiAnSW50ZXJuYWwnLAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJ2FnZW50JywKICAgICAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDAsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICA9PiAnRnJvbSAnIC4gJFJhbmRvbUlEIC4gJyBCIDxlbWFpbEBleGFtcGxlLmNvbT4nLAogICAgICAgICAgICAgICAgVG8gICAgICAgICAgICAgICAgICAgPT4gJ1RvICcgLiAkUmFuZG9tSUQgLiAnIEIgPGVtYWlsQGV4YW1wbGUuY29tPicsCiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAnU2Vjb25kIEFydGljbGUgU3ViamVjdCAnIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJ1NlY29uZCBBcnRpY2xlIGJvZHkgJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICdBZGROb3RlJywKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgID0+ICdBZ2VudCBjcmVhdGVkIG5vdGUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDaGFubmVsTmFtZSAgICAgICAgICA9PiAnRW1haWwnLAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJ3N5c3RlbScsCiAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAxLAogICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJ09UUlMgU3lzdGVtIDxvdHJzQGxvY2FsaG9zdD4nLAogICAgICAgICAgICAgICAgQ2MgICAgICAgICAgICAgICAgICAgPT4gJ0NjICcgLiAkUmFuZG9tSUQgLiAnIEMgPGVtYWlsQGV4YW1wbGUuY29tPicsCiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAnVGhpcmQgQXJ0aWNsZSBTdWJqZWN0ICcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICA9PiAnVGhpcmQgQXJ0aWNsZSBib2R5ICcgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAnU2VuZEF1dG9SZXBseScsCiAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAnU2VudCBhdXRvIHJlcGx5JywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSBAQXJ0aWNsZUlEczsKICAgICAgICBmb3IgbXkgJEFydGljbGUgKEBBcnRpY2xlcykgewogICAgICAgICAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckNoYW5uZWwoCiAgICAgICAgICAgICAgICBDaGFubmVsTmFtZSA9PiAkQXJ0aWNsZS0+e0NoYW5uZWxOYW1lfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRBcnRpY2xlSUQgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICA9PiAkVGlja2V0c1swXS0+e0lEfSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTE1JywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAleyRBcnRpY2xlfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgIkNyZWF0ZWQgQXJ0aWNsZUlEICRBcnRpY2xlSUQiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQEFydGljbGVJRHMsICRBcnRpY2xlSUQ7CiAgICAgICAgfQoKICAgICAgICAjIENyZWF0ZSBEeW5hbWljIEZpZWxkcy4KICAgICAgICBteSAkUmFuZG9tTnVtYmVyID0gc3Vic3RyICRIZWxwZXItPkdldFJhbmRvbU51bWJlcigpLCAtNzsKICAgICAgICBteSAlRHluYW1pY0ZpZWxkcyA9ICgKICAgICAgICAgICAgRHJvcGRvd24gPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnREZEcm9wZG93bicgLiAkUmFuZG9tTnVtYmVyLAogICAgICAgICAgICAgICAgTGFiZWwgICAgICA9PiAnREZEcm9wZG93bicgLiAkUmFuZG9tTnVtYmVyLAogICAgICAgICAgICAgICAgRmllbGRPcmRlciA9PiA5OTkwLAogICAgICAgICAgICAgICAgRmllbGRUeXBlICA9PiAnRHJvcGRvd24nLAogICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIENvbmZpZyAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZSAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAwID0+ICdOb3RERlNlbGVjdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgMSA9PiAnWWVzREZTZWxlY3RlZCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGFibGVWYWx1ZXMgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZW9yZGVyID0+IDAsCiAgICAgICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE11bHRpc2VsZWN0ID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0RGTXVsdGlzZWxlY3QnIC4gJFJhbmRvbU51bWJlciwKICAgICAgICAgICAgICAgIExhYmVsICAgICAgPT4gJ0RGTXVsdGlzZWxlY3QnIC4gJFJhbmRvbU51bWJlciwKICAgICAgICAgICAgICAgIEZpZWxkT3JkZXIgPT4gOTk5MCwKICAgICAgICAgICAgICAgIEZpZWxkVHlwZSAgPT4gJ011bHRpc2VsZWN0JywKICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWUgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgeWVhciAgPT4gJ3llYXInLAogICAgICAgICAgICAgICAgICAgICAgICBtb250aCA9PiAnbW9udGgnLAogICAgICAgICAgICAgICAgICAgICAgICB3ZWVrICA9PiAnd2VlaycsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGFibGVWYWx1ZXMgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZW9yZGVyID0+IDAsCiAgICAgICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFRleHQgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnREZUZXh0JyAuICRSYW5kb21OdW1iZXIsCiAgICAgICAgICAgICAgICBMYWJlbCAgICAgID0+ICdERlRleHQnIC4gJFJhbmRvbU51bWJlciwKICAgICAgICAgICAgICAgIEZpZWxkT3JkZXIgPT4gOTk5MCwKICAgICAgICAgICAgICAgIEZpZWxkVHlwZSAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnQXJ0aWNsZScsCiAgICAgICAgICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWUgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlb3JkZXIgPT4gMCwKICAgICAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzID0gKAogICAgICAgICAgICBUZXh0ICAgICAgICA9PiAiREZUZXh0JFJhbmRvbUlEIiwKICAgICAgICAgICAgRHJvcGRvd24gICAgPT4gJzEnLAogICAgICAgICAgICBNdWx0aXNlbGVjdCA9PiBbCiAgICAgICAgICAgICAgICAnbW9udGgnLAogICAgICAgICAgICAgICAgJ3llYXInLAogICAgICAgICAgICBdLAogICAgICAgICk7CgogICAgICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwogICAgICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICAgICBteSBARHluYW1pY0ZpZWxkSURzOwogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkVHlwZSAoIHNvcnQga2V5cyAlRHluYW1pY0ZpZWxkcyApIHsKCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRJRCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEFkZCgKICAgICAgICAgICAgICAgICV7ICREeW5hbWljRmllbGRzeyREeW5hbWljRmllbGRUeXBlfSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkSUQsCiAgICAgICAgICAgICAgICAiQ3JlYXRlZCBEeW5hbWljRmllbGQgJER5bmFtaWNGaWVsZHN7JER5bmFtaWNGaWVsZFR5cGV9LT57TmFtZX0gLSBJRCAkRHluYW1pY0ZpZWxkSUQiLAogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRJRHMsICREeW5hbWljRmllbGRJRDsKCiAgICAgICAgICAgICMgU2V0IER5bmFtaWNGaWVsZCB2YWx1ZSB0byB0aWNrZXQgb3IgYXJ0aWNsZSBhY2NvcmRpbmdseS4KICAgICAgICAgICAgbXkgJE9iamVjdElEID0gJFRpY2tldHNbMF0tPntJRH07CiAgICAgICAgICAgIGlmICggJER5bmFtaWNGaWVsZHN7JER5bmFtaWNGaWVsZFR5cGV9LT57T2JqZWN0VHlwZX0gZXEgJ0FydGljbGUnICkgewogICAgICAgICAgICAgICAgJE9iamVjdElEID0gJEFydGljbGVJRHNbMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgU2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBkeW5hbWljIGZpZWxkLgogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkc3skRHluYW1pY0ZpZWxkVHlwZX0tPntOYW1lfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFZhbHVlID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkVHlwZX07CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkT2JqZWN0SUQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIEVuYWJsZSBjcmVhdGVkIER5bmFtaWNGaWVsZHMgdG8gYmUgdmlzaWJsZSBpbiBBZ2VudFRpY2tldFByaW50LgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFByaW50IyMjRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgVmFsdWUgPT4gewogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZHN7RHJvcGRvd259LT57TmFtZX0gICAgPT4gMSwKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRze011bHRpc2VsZWN0fS0+e05hbWV9ID0+IDEsCiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkc3tUZXh0fS0+e05hbWV9ICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgRW5hYmxlIGNyZWF0ZWQgRHluYW1pY0ZpZWxkcyB0byBiZSB2aXNpYmxlIGluIEN1c3RvbWVyVGlja2V0UHJpbnQuCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0UHJpbnQjIyNEeW5hbWljRmllbGQnLAogICAgICAgICAgICBWYWx1ZSA9PiB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkc3tEcm9wZG93bn0tPntOYW1lfSAgICA9PiAxLAogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZHN7TXVsdGlzZWxlY3R9LT57TmFtZX0gPT4gMSwKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRze1RleHR9LT57TmFtZX0gICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBFbmFibGUgVGlja2V0IGF0dHJpYnV0ZXMgaW4gQ3VzdG9tZXJUaWNrZXRab29tIHNjcmVlbiA9PiBDdXN0b21lclRpY2tldFByaW50LgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lclRpY2tldFpvb20jIyNBdHRyaWJ1dGVzVmlldycsCiAgICAgICAgICAgIFZhbHVlID0+IHsKICAgICAgICAgICAgICAgIE93bmVyICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQcmlvcml0eSAgICA9PiAxLAogICAgICAgICAgICAgICAgUXVldWUgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlID0+IDEsCiAgICAgICAgICAgICAgICBTTEEgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgU2VydmljZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFN0YXRlICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgTGluayBmaXJzdCBhbmQgc2Vjb25kIHRpY2tldCBhcyBwYXJlbnQtY2hpbGQuCiAgICAgICAgbXkgJExpbmtPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpOwogICAgICAgIG15ICRTdWNjZXNzICAgID0gJExpbmtPYmplY3QtPkxpbmtBZGQoCiAgICAgICAgICAgIFNvdXJjZU9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICAgICAgU291cmNlS2V5ICAgID0+ICRUaWNrZXRzWzBdLT57SUR9LAogICAgICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFRhcmdldEtleSAgICA9PiAkVGlja2V0c1sxXS0+e0lEfSwKICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdQYXJlbnRDaGlsZCcsCiAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlRpY2tlZElEICRUaWNrZXRzWzBdLT57SUR9IGFuZCAkVGlja2V0c1sxXS0+e0lEfSBsaW5rZWQgYXMgcGFyZW50LWNoaWxkIgogICAgICAgICk7CgogICAgICAgICMgTGluayBmaXJzdCBhbmQgdGhpcmQgdGlja2V0IGFzIGNoaWxkLXBhcmVudC4KICAgICAgICAkU3VjY2VzcyA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkKAogICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFNvdXJjZUtleSAgICA9PiAkVGlja2V0c1syXS0+e0lEfSwKICAgICAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgICAgICBUYXJnZXRLZXkgICAgPT4gJFRpY2tldHNbMF0tPntJRH0sCiAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnUGFyZW50Q2hpbGQnLAogICAgICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJUaWNrZWRJRCAkVGlja2V0c1syXS0+e0lEfSBhbmQgJFRpY2tldHNbMV0tPntJRH0gbGlua2VkIGFzIHBhcmVudC1jaGlsZCIKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IFVzZXIgYW5kIGxvZ2luLgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBOYXZpZ2F0ZSB0byBBZ2VudFRpY2tldFpvb20gc2NyZWVuLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kVGlja2V0c1swXS0+e0lEfSIpOwoKICAgICAgICAjIENsaWNrIHRvIHByaW50IHRpY2tldCBpbiBBZ2VudCBpbnRlcmZhY2UuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWdlbnRUaWNrZXRQcmludDtUaWNrZXRJRD0kVGlja2V0c1swXS0+e0lEfScgKV0iKS0+Y2xpY2soKTsKCiAgICAgICAgIyBTd2l0Y2ggdG8gQWdlbnRUaWNrZXRQcmludCBwb3AgdXAgd2luZG93LgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMiApOwogICAgICAgIG15ICRIYW5kbGVzID0gJFNlbGVuaXVtLT5nZXRfd2luZG93X2hhbmRsZXMoKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMV0gKTsKCiAgICAgICAgIyBTcGVjaWFsIGFwcHJvYWNoIGlzIHVzZWQgZm9yIHdhaXRpbmcgZm9yIFBERiBkb2N1bWVudCB0byBiZSBsb2FkZWQgZnVsbHkgYmVmb3JlIGNoZWNraW5nIGl0J3MgY29udGVudC4KICAgICAgICAjIFRoaXMgaXMgc3VwcG9ydGVkIGFuZCB0ZXN0ZWQgaW4gTW96aWxsYSBGaXJlZm94IGJyb3dzZXIuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZW5kT2ZDb250ZW50IikubGVuZ3RoID09PSAyJyApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHNjZW5hcmlvcy4KICAgICAgICBteSBAVGVzdHMgPSAoCgogICAgICAgICAgICAjIFRpY2tldCBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICJUaWNrZXQjJFRpY2tldHNbMF0tPntOdW1iZXJ9IiwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAiVGlja2V0IyRUaWNrZXRzWzBdLT57TnVtYmVyfSB2YWx1ZSBpcyBjb3JyZWN0IiwKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXRzWzBdLT57VGl0bGV9LAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdUaWNrZXRUaXRsZSB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICJwcmludGVkIGJ5ICRUZXN0VXNlckxvZ2luICRUZXN0VXNlckxvZ2luICgkVGVzdFVzZXJMb2dpblxAbG9jYWx1bml0dGVzdC5jb20pLCIsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1ByaW50ZWRCeSB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWdlbnQnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAicHJpbnRlZCBieSAkQ3VzdG9tZXJVc2Vye1VzZXJGaXJzdG5hbWV9ICRDdXN0b21lclVzZXJ7VXNlckxhc3RuYW1lfSIsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1ByaW50ZWRCeSB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQ3VzdG9tZXInCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnU3RhdGUnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdTdGF0ZSBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdvcGVuJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnU3RhdGUgdmFsdWUgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnQWdlJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnQWdlIGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJzAgbScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0FnZSB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdBY2NvdW50ZWQgdGltZScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0FjY291bnRlZCB0aW1lIGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBZ2VudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnRmlyc3QgUmVzcG9uc2UnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdGaXJzdCBSZXNwb25zZSBUaW1lIGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBZ2VudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnU29sdXRpb24gVGltZScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0FjY291bnRlZCB0aW1lIGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBZ2VudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdQcmlvcml0eSBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICc1IHZlcnkgaGlnaCcsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1ByaW9yaXR5IHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ0NyZWF0ZWQnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdDcmVhdGVkIGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ1F1ZXVlJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnUXVldWUgbGFiZWwgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkUXVldWVOYW1lLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdRdWV1ZSB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdMb2NrJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnTG9jayBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWdlbnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0xvY2sgdmFsdWUgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FnZW50JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnQ3VzdG9tZXJJRCBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRDdXN0b21lckNvbXBhbnl7Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0N1c3RvbWVySUQgdmFsdWUgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnT3duZXInLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdPd25lciBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRVc2Vyc1swXS0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ093bmVyIGZpcnN0IHJvdyB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICcoJyAuICRVc2Vyc1swXS0+e1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdPd25lciBzZWNvbmQgcm93IHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBZ2VudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkVXNlcnNbMF0tPntVc2VyTGFzdG5hbWV9IC4gJyknLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdPd25lciB0aGlyZCByb3cgdmFsdWUgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FnZW50JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1Jlc3BvbnNpYmxlIGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFVzZXJzWzFdLT57VXNlckxvZ2lufSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnUmVzcG9uc2libGUgZmlyc3Qgcm93IHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJygnIC4gJFVzZXJzWzFdLT57VXNlckZpcnN0bmFtZX0sCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1Jlc3BvbnNpYmxlIHNlY29uZCByb3cgdmFsdWUgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FnZW50JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRVc2Vyc1sxXS0+e1VzZXJMYXN0bmFtZX0gLiAnKScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1Jlc3BvbnNpYmxlIHRoaXJkIHJvdyB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWdlbnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ1R5cGUnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdUeXBlIGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFR5cGVOYW1lLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdUeXBlIHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdTZXJ2aWNlIGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFNlcnZpY2VOYW1lLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdTZXJ2aWNlIHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ1NMQScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1NMQSBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRTTEFOYW1lLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdTTEEgdmFsdWUgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIFRpY2tldCBEeW5hbWljIEZpZWxkcy4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICREeW5hbWljRmllbGRze0Ryb3Bkb3dufS0+e0xhYmVsfSAuICc6JywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnRHluYW1pY0ZpZWxkIERyb3Bkb3duIGxhYmVsIGlzIGNvcnJlY3QgZm9yIFRpY2tldCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnWWVzREZTZWxlY3RlZCcsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0R5bmFtaWNGaWVsZCBEcm9wZG93biB2YWx1ZSBpcyBjb3JyZWN0IGZvciBUaWNrZXQnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJER5bmFtaWNGaWVsZHN7TXVsdGlzZWxlY3R9LT57TGFiZWx9IC4gJzonLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdEeW5hbWljRmllbGQgTXVsdGlzZWxlY3QgbGFiZWwgaXMgY29ycmVjdCBmb3IgVGlja2V0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdtb250aCwgeWVhcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0R5bmFtaWNGaWVsZCBNdWx0aXNlbGVjdCB2YWx1ZSBpcyBjb3JyZWN0IGZvciBUaWNrZXQnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBMaW5rZWQgT2JqZWN0cy4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdQYXJlbnQ6JywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnUGFyZW50OiBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWdlbnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFRpY2tldHNbMl0tPntOdW1iZXJ9IC4gJzogJyAuICRUaWNrZXRzWzJdLT57TmFtZX0sCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1BhcmVudDogdmFsdWUgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FnZW50JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdDaGlsZDonLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdDaGlsZDogbGFiZWwgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FnZW50JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXRzWzFdLT57TnVtYmVyfSAuICc6ICcgLiAkVGlja2V0c1sxXS0+e05hbWV9LAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdDaGlsZDogdmFsdWUgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FnZW50JywKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgQ3VzdG9tZXIgaW5mb3JtYXRpb24uCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnQ3VzdG9tZXIgSW5mb3JtYXRpb24nLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdDdXN0b21lciBJbmZvcm1hdGlvbiBoZWFkZXIgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnRmlyc3RuYW1lOicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0ZpcnN0bmFtZTogbGFiZWwgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkQ3VzdG9tZXJVc2Vye1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdGaXJzdG5hbWU6IHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ0xhc3RuYW1lOicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0xhc3RuYW1lOiBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRDdXN0b21lclVzZXJ7VXNlckxhc3RuYW1lfSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnTGFzdG5hbWU6IHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ1VzZXJuYW1lOicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1VzZXJuYW1lOiBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRDdXN0b21lclVzZXJ7VXNlckxvZ2lufSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnVXNlcm5hbWU6IHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ0VtYWlsOicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0VtYWlsOiBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRDdXN0b21lclVzZXJ7VXNlckVtYWlsfSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnRW1haWw6IHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ0N1c3RvbWVyOicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0N1c3RvbWVyOiBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRDdXN0b21lckNvbXBhbnl7Q3VzdG9tZXJDb21wYW55TmFtZX0sCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0N1c3RvbWVyOiB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdTdHJlZXQ6JywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnU3RyZWV0OiBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRDdXN0b21lckNvbXBhbnl7Q3VzdG9tZXJDb21wYW55U3RyZWV0fSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnU3RyZWV0OiB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdaaXA6JywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnWmlwOiBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRDdXN0b21lckNvbXBhbnl7Q3VzdG9tZXJDb21wYW55WklQfSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnWmlwOiB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdDaXR5OicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0NpdHk6IGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJEN1c3RvbWVyQ29tcGFueXtDdXN0b21lckNvbXBhbnlDaXR5fSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnQ2l0eTogdmFsdWUgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnQ291bnRyeTonLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdDb3VudHJ5OiBsYWJlbCBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRDdXN0b21lckNvbXBhbnl7Q3VzdG9tZXJDb21wYW55Q291bnRyeX0sCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0NvdW50cnk6IHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ1VSTDonLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdVUkw6IGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJEN1c3RvbWVyQ29tcGFueXtDdXN0b21lckNvbXBhbnlVUkx9LAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdVUkw6IHZhbHVlIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ0NvbW1lbnQ6JywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnQ29tbWVudDogbGFiZWwgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkQ3VzdG9tZXJDb21wYW55e0N1c3RvbWVyQ29tcGFueUNvbW1lbnR9LAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdDb21tZW50OiB2YWx1ZSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgQXJ0aWNsZSAjMyBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdGcm9tOicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0Zyb206IGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ09UUlMgU3lzdGVtJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnRnJvbTogdmFsdWUgaXMgY29ycmVjdCBmb3IgQXJ0aWNsZSMzJywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdUbzonLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdUbzogbGFiZWwgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnQ2M6JywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnRnJvbTogbGFiZWwgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnQ2MgJyAuICRSYW5kb21JRCAuICcgQycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0NjOiB2YWx1ZSBpcyBjb3JyZWN0IGZvciBBcnRpY2xlIzMnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ1N1YmplY3Q6JywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnU3ViamVjdDogbGFiZWwgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkQXJ0aWNsZXNbMl0tPntTdWJqZWN0fSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnU3ViamVjdDogdmFsdWUgaXMgY29ycmVjdCBmb3IgQXJ0aWNsZSMzJywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdDcmVhdGVkOicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0NyZWF0ZWQ6IGxhYmVsIGlzIGNvcnJlY3QnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ2J5IHN5c3RlbScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0NyZWF0ZWQ6IHZhbHVlIGlzIGNvcnJlY3QgZm9yIEFydGljbGUjMycsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FsbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkQXJ0aWNsZXNbMl0tPntCb2R5fSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnQm9keTogdmFsdWUgaXMgY29ycmVjdCBmb3IgQXJ0aWNsZSMzJywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgQXJ0aWNsZSAjMiBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdGcm9tICcgLiAkUmFuZG9tSUQgLiAnIEInLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdGcm9tOiB2YWx1ZSBpcyBjb3JyZWN0IGZvciBBcnRpY2xlIzInLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBZ2VudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAnVG8gJyAuICRSYW5kb21JRCAuICcgQicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1RvOiB2YWx1ZSBpcyBjb3JyZWN0IGZvciBBcnRpY2xlIzInLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBZ2VudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkQXJ0aWNsZXNbMV0tPntTdWJqZWN0fSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnU3ViamVjdDogdmFsdWUgaXMgY29ycmVjdCBmb3IgQXJ0aWNsZSMyJywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWdlbnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ2J5IGFnZW50JywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnQ3JlYXRlZDogdmFsdWUgaXMgY29ycmVjdCBmb3IgQXJ0aWNsZSMyJywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWdlbnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJEFydGljbGVzWzFdLT57Qm9keX0sCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ0JvZHk6IHZhbHVlIGlzIGNvcnJlY3QgZm9yIEFydGljbGUjMicsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FnZW50JywKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgQXJ0aWNsZSAjMSBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdGcm9tICcgLiAkUmFuZG9tSUQgLiAnIEEnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdGcm9tOiB2YWx1ZSBpcyBjb3JyZWN0IGZvciBBcnRpY2xlIzEnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ1RvICcgLiAkUmFuZG9tSUQgLiAnIEEnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdUbzogdmFsdWUgaXMgY29ycmVjdCBmb3IgQXJ0aWNsZSMxJywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRBcnRpY2xlc1swXS0+e1N1YmplY3R9LAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdTdWJqZWN0OiB2YWx1ZSBpcyBjb3JyZWN0IGZvciBBcnRpY2xlIzEnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ2J5IGN1c3RvbWVyJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnQ3JlYXRlZDogdmFsdWUgaXMgY29ycmVjdCBmb3IgQXJ0aWNsZSMxJywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICREeW5hbWljRmllbGRze1RleHR9LT57TGFiZWx9IC4gJzonLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdEeW5hbWljRmllbGQgVGV4dCBsYWJlbCBpcyBjb3JyZWN0IGZvciBBcnRpY2xlIzEnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3tUZXh0fSwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICA9PiAnRHluYW1pY0ZpZWxkIFRleHQgdmFsdWUgaXMgY29ycmVjdCBmb3IgQXJ0aWNsZSMxJywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRBcnRpY2xlc1swXS0+e0JvZHl9LAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdCb2R5OiB2YWx1ZSBpcyBjb3JyZWN0IGZvciBBcnRpY2xlIzEnLAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICdBbGwnLAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBQYWdpbmF0aW9uLgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJ1BhZ2UgMScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgPT4gJ1BhZ2UgMSBpcyBjb3JyZWN0JywKICAgICAgICAgICAgICAgIEludGVyZmFjZSA9PiAnQWxsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICdQYWdlIDInLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgID0+ICdQYWdlIDIgaXMgY29ycmVjdCcsCiAgICAgICAgICAgICAgICBJbnRlcmZhY2UgPT4gJ0FnZW50JywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIFZlcmlmeSB2YWx1ZXMgaW4gQWdlbnRUaWNrZXRQcmludC4KICAgICAgICBteSAkQWdlbnRQYWdlU291cmNlID0gJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKTsKCiAgICAgICAgZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKICAgICAgICAgICAgaWYgKCAkVGVzdC0+e0ludGVyZmFjZX0gZXEgJ0FsbCcgfHwgJFRlc3QtPntJbnRlcmZhY2V9IGVxICdBZ2VudCcgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICAgICBpbmRleCggJEFnZW50UGFnZVNvdXJjZSwgJFRlc3QtPntWYWx1ZX0gKSA+IC0xLAogICAgICAgICAgICAgICAgICAgICdBZ2VudCAtICcgLiAkVGVzdC0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBDbG9zZSBBZ2VudFRpY2tldFByaW50IFBERiBwb3AgdXAgd2luZG93IGFuZCBzd2l0Y2ggd2luZG93LgogICAgICAgICRTZWxlbml1bS0+Y2xvc2UoKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMF0gKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDEgKTsKCiAgICAgICAgIyBMb2dpbiBjdXN0b21lciB1c2VyLgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdDdXN0b21lcicsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRDdXN0b21lclVzZXJ7VXNlckxvZ2lufSwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJEN1c3RvbWVyVXNlcntVc2VyUGFzc3dvcmR9LAogICAgICAgICk7CgogICAgICAgICMgTmF2aWdhdGUgdG8gQ3VzdG9tZXJUaWNrZXRab29tIG9mIGNyZWF0ZWQgZmlyc3QgdGlja2V0LgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoCiAgICAgICAgICAgICIke1NjcmlwdEFsaWFzfWN1c3RvbWVyLnBsP0FjdGlvbj1DdXN0b21lclRpY2tldFpvb207VGlja2V0TnVtYmVyPSRUaWNrZXRzWzBdLT57TnVtYmVyfSIKICAgICAgICApOwoKICAgICAgICAjIENsaWNrIHRvIHByaW50IHRpY2tldCBpbiBDdXN0b21lciBpbnRlcmZhY2UuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQ3VzdG9tZXJUaWNrZXRQcmludDtUaWNrZXRJRD0kVGlja2V0c1swXS0+e0lEfScgKV0iKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIFNwZWNpYWwgYXBwcm9hY2ggaXMgdXNlZCBmb3Igd2FpdGluZyBmb3IgUERGIGRvY3VtZW50IHRvIGJlIGxvYWRlZCBmdWxseSBiZWZvcmUgY2hlY2tpbmcgaXQncyBjb250ZW50LgogICAgICAgICMgQ3VycmVudGx5IHRoaXMgaXMgc3VwcG9ydGVkIGluIE1vemlsbGEgRmlyZWZveCBicm93c2VyLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImVuZE9mQ29udGVudCIpLmxlbmd0aCA9PT0gMScgKTsKCiAgICAgICAgIyBWZXJpZnkgdmFsdWVzIGluIEN1c3RvbWVyVGlja2V0UHJpbnQuCiAgICAgICAgbXkgJEN1c3RvbWVyUGFnZVNvdXJjZSA9ICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCk7CgogICAgICAgIGZvciBteSAkVGVzdCAoQFRlc3RzKSB7CiAgICAgICAgICAgIGlmICggJFRlc3QtPntJbnRlcmZhY2V9IGVxICdBbGwnIHx8ICRUZXN0LT57SW50ZXJmYWNlfSBlcSAnQ3VzdG9tZXInICkgewogICAgICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAgICAgaW5kZXgoICRDdXN0b21lclBhZ2VTb3VyY2UsICRUZXN0LT57VmFsdWV9ICkgPiAtMSwKICAgICAgICAgICAgICAgICAgICAnQ3VzdG9tZXIgLSAnIC4gJFRlc3QtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkVGVzdC0+e0ludGVyZmFjZX0gZXEgJ0FnZW50JyApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgICAgIGluZGV4KCAkQ3VzdG9tZXJQYWdlU291cmNlLCAkVGVzdC0+e1ZhbHVlfSApID09IC0xLAogICAgICAgICAgICAgICAgICAgICdDdXN0b21lciAtICcgLiAkVGVzdC0+e01lc3NhZ2V9IC4gJyAtIG5vdCB2aXNpYmxlJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgRGVsZXRlIHRlc3QgVGlja2V0cy4KICAgICAgICBmb3IgbXkgJFRpY2tldCAoIHJldmVyc2UgQFRpY2tldHMgKSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0RGVsZXRlKAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldC0+e0lEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiVGlja2V0SUQgJFRpY2tldC0+e0lEfSBpcyBkZWxldGVkIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRGVsZXRlIHRlc3QgRHluYW1pY0ZpZWxkcy4KICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZElEIChARHluYW1pY0ZpZWxkSURzKSB7CgogICAgICAgICAgICAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZERlbGV0ZSgKICAgICAgICAgICAgICAgIElEICAgICA9PiAkRHluYW1pY0ZpZWxkSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJEeW5hbWljRmllbGQgSUQgJER5bmFtaWNGaWVsZElEIGlzIGRlbGV0ZWQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBEZWxldGUgdGVzdCBkYXRhIGZyb20gdGhlIERCLgogICAgICAgIG15IEBEZWxldGVEYXRhID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBTUUwgICAgID0+ICJERUxFVEUgRlJPTSBjdXN0b21lcl91c2VyIFdIRVJFIGxvZ2luID0gPyIsCiAgICAgICAgICAgICAgICBCaW5kICAgID0+ICRDdXN0b21lclVzZXJJRCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkN1c3RvbWVyVXNlcklEICRDdXN0b21lclVzZXJJRCBpcyBkZWxldGVkIiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU1FMICAgICA9PiAiREVMRVRFIEZST00gY3VzdG9tZXJfY29tcGFueSBXSEVSRSBjdXN0b21lcl9pZCA9ID8iLAogICAgICAgICAgICAgICAgQmluZCAgICA9PiAkQ3VzdG9tZXJDb21wYW55SUQsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDdXN0b21lckNvbXBhbnlJRCAkQ3VzdG9tZXJDb21wYW55SUQgaXMgZGVsZXRlZCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFNRTCAgICAgPT4gIkRFTEVURSBGUk9NIHRpY2tldF90eXBlIFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgICAgICBCaW5kICAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJUeXBlSUQgJFR5cGVJRCBpcyBkZWxldGVkIiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU1FMICAgICA9PiAiREVMRVRFIEZST00gc2VydmljZV9zbGEgV0hFUkUgc2xhX2lkID0gPyIsCiAgICAgICAgICAgICAgICBCaW5kICAgID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIlNlcnZpY2UtU0xBIHJlbGF0aW9uIGRlbGV0ZWQiLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBTUUwgICAgID0+ICJERUxFVEUgRlJPTSBzbGEgV0hFUkUgaWQgPSA/IiwKICAgICAgICAgICAgICAgIEJpbmQgICAgPT4gJFNMQUlELAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiU0xBSUQgJFNMQUlEIGlzIGRlbGV0ZWQiLAogICAgICAgICAgICB9LAojIC0tLQojIElUU01Db3JlCiMgLS0tCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFNRTCAgICAgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2VfcHJlZmVyZW5jZXMgV0hFUkUgc2VydmljZV9pZCA9ID8iLAogICAgICAgICAgICAgICAgQmluZCAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiU2VydmljZSBwcmVmZXJlbmNlcyBmb3IgJFNlcnZpY2VJRCBpcyBkZWxldGVkIiwKICAgICAgICAgICAgfSwKIyAtLS0KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU1FMICAgICA9PiAiREVMRVRFIEZST00gc2VydmljZSBXSEVSRSBpZCA9ID8iLAogICAgICAgICAgICAgICAgQmluZCAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiU2VydmljZUlEICRTZXJ2aWNlSUQgaXMgZGVsZXRlZCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFNRTCAgICAgPT4gIkRFTEVURSBGUk9NIHF1ZXVlIFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgICAgICBCaW5kICAgID0+ICRRdWV1ZUlELAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiUXVldWVJRCAkUXVldWVJRCBpcyBkZWxldGVkIiwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgICAgICBmb3IgbXkgJEl0ZW0gKEBEZWxldGVEYXRhKSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgICAgIFNRTCAgPT4gJEl0ZW0tPntTUUx9LAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkSXRlbS0+e0JpbmR9IF0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAkSXRlbS0+e01lc3NhZ2V9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBDbGVhciBjYWNoZS4KICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgpOwogICAgfQopOwoKMTsK
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgovLyAtLQoKCgoKLy8gVE9ETzoKLy9SZW1vdmUgdGhpcyBsaW5lIGFuZCBmaXggSlNEb2MKLy8gbm9maWx0ZXIoVGlkeUFsbDo6UGx1Z2luOjpPVFJTOjpKYXZhU2NyaXB0OjpFU0xpbnQpCgoKCgoidXNlIHN0cmljdCI7Cgp2YXIgSVRTTSA9IElUU00gfHwge307CklUU00uQWdlbnQgPSBJVFNNLkFnZW50IHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UKICogQGV4cG9ydHMgVGFyZ2V0TlMgYXMgSVRTTS5BZ2VudC5Db25maXJtRGlhbG9nCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbnMgZm9yIENvbmZpcm1EaWFsb2cuCiAqLwpJVFNNLkFnZW50LkNvbmZpcm1EaWFsb2cgPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgU2VyaWFsaXplRGF0YQogICAgICogQG1lbWJlcm9mIElUU00uQWdlbnQuQ29uZmlybURpYWxvZwogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBxdWVyeSBzdHJpbmcgb2YgdGhlIGRhdGEKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBEYXRhIC0gVGhlIGRhdGEgdGhhdCBzaG91bGQgYmUgY29udmVydGVkLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIENvbnZlcnRzIGEgZ2l2ZW4gaGFzaCBpbnRvIGEgcXVlcnkgc3RyaW5nLgogICAgICovCiAgICBmdW5jdGlvbiBTZXJpYWxpemVEYXRhKERhdGEpIHsKICAgICAgICB2YXIgUXVlcnlTdHJpbmcgPSAnJzsKICAgICAgICAkLmVhY2goRGF0YSwgZnVuY3Rpb24gKEtleSwgVmFsdWUpIHsKICAgICAgICAgICAgUXVlcnlTdHJpbmcgKz0gJzsnICsgZW5jb2RlVVJJQ29tcG9uZW50KEtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQoVmFsdWUpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBRdWVyeVN0cmluZzsKICAgIH0KCiAgICAvKioKICAgICAqIEB2YXJpYWJsZQogICAgICogQHByaXZhdGUKICAgICAqICAgICBUaGlzIHZhcmlhYmxlIHN0b3JlcyB0aGUgcGFyYW1ldGVycyB0aGF0IGFyZSBwYXNzZWQgZnJvbSB0aGUgRFRMIGFuZCBjb250YWluIGFsbCB0aGUgZGF0YSB0aGF0IHRoZSBkaWFsb2cgbmVlZHMuCiAgICAgKi8KICAgIHZhciBEaWFsb2dEYXRhID0gW107CgogICAgLyoqCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIG5vdGhpbmcKICAgICAqIEBkZXNjcmlwdGlvbiBTaG93cyB3YWl0aW5nIGRpYWxvZyB1bnRpbCBzZWFyY2ggc2NyZWVuIGlzIHJlYWR5LgogICAgICovCiAgICBmdW5jdGlvbiBTaG93V2FpdGluZ0RpYWxvZyhQb3NpdGlvblRvcCl7CiAgICAgICAgdmFyIERpdkhUTUwgPSBDb3JlLlRlbXBsYXRlLlJlbmRlcignQWdlbnQvSVRTTUNvcmUvTG9hZGluZ0RpYWxvZycsIHsKICAgICAgICAgICAgU3BhblRleHQ6IENvcmUuQ29uZmlnLkdldCgnTG9hZGluZ01zZycpCiAgICAgICAgfSk7CiAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0NvbnRlbnREaWFsb2coRGl2SFRNTCwgJycsIFBvc2l0aW9uVG9wLCAnQ2VudGVyJywgdHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7RXZlbnRPYmplY3R9IGV2ZW50IG9iamVjdCBvZiB0aGUgY2xpY2tlZCBlbGVtZW50LgogICAgICogQHJldHVybiBub3RoaW5nCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gc2hvd3MgYSBjb25maXJtYXRpb24gZGlhbG9nIHdpdGggMiBidXR0b25zOiBZZXMgYW5kIE5vCiAgICAgKi8KICAgIFRhcmdldE5TLlNob3dDb25maXJtRGlhbG9nID0gZnVuY3Rpb24gKEV2ZW50KSB7CgogICAgICAgIHZhciBMb2NhbERpYWxvZ0RhdGEsCiAgICAgICAgICAgIFBvc2l0aW9uVG9wLAogICAgICAgICAgICBEYXRhLAogICAgICAgICAgICBCdXR0b25zOwoKICAgICAgICAvLyBnZXQgZ2xvYmFsIHNhdmVkIERpYWxvZ0RhdGEgZm9yIHRoaXMgZnVuY3Rpb24KICAgICAgICBMb2NhbERpYWxvZ0RhdGEgPSBEaWFsb2dEYXRhWyQoRXZlbnQudGFyZ2V0KS5hdHRyKCdpZCcpXTsKCiAgICAgICAgLy8gZGVmaW5lIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGlhbG9nCiAgICAgICAgUG9zaXRpb25Ub3AgPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCkgKyAoJCh3aW5kb3cpLmhlaWdodCgpICogMC4zKTsKCiAgICAgICAgLy8gc2hvdyB3YWl0aW5nIGRpYWxvZwogICAgICAgIFNob3dXYWl0aW5nRGlhbG9nKFBvc2l0aW9uVG9wKTsKCiAgICAgICAgLy8gYWpheCBjYWxsIHRvIHRoZSBtb2R1bGUgdGhhdCBkZWxldGVzIHRoZSB0ZW1wbGF0ZQogICAgICAgIERhdGEgPSBMb2NhbERpYWxvZ0RhdGEuRGlhbG9nQ29udGVudFF1ZXJ5U3RyaW5nOwogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLCBEYXRhLCBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKCiAgICAgICAgICAgIC8vICdDb25maXJtYXRpb24nIG9wZW5zIGEgZGlhbG9nIHdpdGggMiBidXR0b25zOiBZZXMgYW5kIE5vCiAgICAgICAgICAgIGlmIChSZXNwb25zZS5EaWFsb2dUeXBlID09PSAnQ29uZmlybWF0aW9uJykgewoKICAgICAgICAgICAgICAgIC8vIGRlZmluZSB5ZXMgYW5kIG5vIGJ1dHRvbnMKICAgICAgICAgICAgICAgIEJ1dHRvbnMgPSBbewogICAgICAgICAgICAgICAgICAgIExhYmVsOiBMb2NhbERpYWxvZ0RhdGEuVHJhbnNsYXRlZFRleHQuWWVzLAogICAgICAgICAgICAgICAgICAgIENsYXNzOiAiUHJpbWFyeSIsCgogICAgICAgICAgICAgICAgICAgIC8vIGRlZmluZSB0aGUgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgJ1llcycgYnV0dG9uIGlzIHByZXNzZWQKICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgWWVzIGFuZCBObyBidXR0b25zIHRvIHByZXZlbnQgbXVsdGlwbGUgc3VibWl0cwogICAgICAgICAgICAgICAgICAgICAgICAkKCdkaXYuRGlhbG9nOnZpc2libGUgZGl2LkNvbnRlbnRGb290ZXIgYnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZGlyZWN0IHRvIHRoZSBtb2R1bGUgdGhhdCBkb2VzIHRoZSBjb25maXJtZWQgYWN0aW9uIGFmdGVyIHByZXNzaW5nIHRoZSBZZXMgYnV0dG9uCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJykgKyBMb2NhbERpYWxvZ0RhdGEuQ29uZmlybWVkQWN0aW9uUXVlcnlTdHJpbmcgKyBTZXJpYWxpemVEYXRhKENvcmUuQXBwLkdldFNlc3Npb25JbmZvcm1hdGlvbigpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgTGFiZWw6IExvY2FsRGlhbG9nRGF0YS5UcmFuc2xhdGVkVGV4dC5ObywKICAgICAgICAgICAgICAgICAgICBUeXBlOiAiQ2xvc2UiCiAgICAgICAgICAgICAgICB9XTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gJ01lc3NhZ2UnIG9wZW5zIGEgZGlhbG9nIHdpdGggMSBidXR0b246IE9rCiAgICAgICAgICAgIGVsc2UgaWYgKFJlc3BvbnNlLkRpYWxvZ1R5cGUgPT09ICdNZXNzYWdlJykgewoKICAgICAgICAgICAgICAgIC8vIGRlZmluZSBPayBidXR0b24KICAgICAgICAgICAgICAgIEJ1dHRvbnMgPSBbewogICAgICAgICAgICAgICAgICAgIExhYmVsOiBMb2NhbERpYWxvZ0RhdGEuVHJhbnNsYXRlZFRleHQuT2ssCiAgICAgICAgICAgICAgICAgICAgQ2xhc3M6ICJQcmltYXJ5IiwKICAgICAgICAgICAgICAgICAgICBUeXBlOiAiQ2xvc2UiCiAgICAgICAgICAgICAgICB9XTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2hvdyB0aGUgY29uZmlybWF0aW9uIGRpYWxvZyB0byBjb25maXJtIHRoZSBhY3Rpb24KICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0NvbnRlbnREaWFsb2coUmVzcG9uc2UuSFRNTCwgTG9jYWxEaWFsb2dEYXRhLkRpYWxvZ1RpdGxlLCBQb3NpdGlvblRvcCwgIkNlbnRlciIsIHRydWUsIEJ1dHRvbnMpOwogICAgICAgICAgICAkKCdhLkFzUG9wdXBEaWFsb2cnKS51bmJpbmQoJ2NsaWNrLkFzUG9wdXBEaWFsb2cnKS5iaW5kKCdjbGljay5Bc1BvcHVwRGlhbG9nJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgICAgICBDb3JlLlVJLlBvcHVwLk9wZW5Qb3B1cCAoJCh0aGlzKS5hdHRyKCdocmVmJyksICdBY3Rpb24nKTsKICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLkNsb3NlRGlhbG9nKCQoJy5EaWFsb2c6dmlzaWJsZScpKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwgJ2pzb24nKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwoKICAgIC8qKgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge0V2ZW50T2JqZWN0fSBldmVudCBvYmplY3Qgb2YgdGhlIGNsaWNrZWQgZWxlbWVudC4KICAgICAqIEByZXR1cm4gbm90aGluZwogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIHNob3dzIGEgY29uZmlybWF0aW9uIGRpYWxvZyB3aXRoIDIgYnV0dG9uczogWWVzIGFuZCBObwogICAgICovCiAgICBUYXJnZXROUy5CaW5kQ29uZmlybURpYWxvZyA9IGZ1bmN0aW9uIChEYXRhKSB7CiAgICAgICAgRGlhbG9nRGF0YVtEYXRhLkVsZW1lbnRJRF0gPSBEYXRhOwoKICAgICAgICAvLyBiaW5kaW5nIGEgY2xpY2sgZXZlbnQgdG8gdGhlIGRlZmluZWQgZWxlbWVudAogICAgICAgICQoRGlhbG9nRGF0YVtEYXRhLkVsZW1lbnRJRF0uRWxlbWVudFNlbGVjdG9yKS5iaW5kKCdjbGljaycsIElUU00uQWdlbnQuQ29uZmlybURpYWxvZy5TaG93Q29uZmlybURpYWxvZyk7CiAgICB9OwoKICAgIHJldHVybiBUYXJnZXROUzsKfShJVFNNLkFnZW50LkNvbmZpcm1EaWFsb2cgfHwge30pKTsK
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIElUU00gPSBJVFNNIHx8IHt9OwpJVFNNLkFnZW50ID0gSVRTTS5BZ2VudCB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlIElUU00uQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICogQG1lbWJlcm9mIElUU00uQWdlbnQKICogQGF1dGhvciBPVFJTIEFHCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbnMgZm9yIHRoZSBjdXN0b21lciBzZWFyY2guCiAqLwpJVFNNLkFnZW50LkN1c3RvbWVyU2VhcmNoID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIElUU00uQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRFbGVtZW50IC0gVGhlIGpRdWVyeSBvYmplY3Qgb2YgdGhlIGlucHV0IGZpZWxkIHdpdGggYXV0b2NvbXBsZXRlLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEluaXRpYWxpemVzIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbnMuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoJEVsZW1lbnQpIHsKCiAgICAgICAgaWYgKGlzSlF1ZXJ5T2JqZWN0KCRFbGVtZW50KSkgewoKICAgICAgICAgICAgQ29yZS5VSS5BdXRvY29tcGxldGUuSW5pdCgkRWxlbWVudCwgZnVuY3Rpb24gKFJlcXVlc3QsIFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFVSTCA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50Q3VzdG9tZXJTZWFyY2gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVybTogUmVxdWVzdC50ZXJtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4UmVzdWx0czogQ29yZS5VSS5BdXRvY29tcGxldGUuR2V0Q29uZmlnKCdNYXhSZXN1bHRzRGlzcGxheWVkJykKICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQuZGF0YSgnQXV0b0NvbXBsZXRlWEhSJywgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbChVUkwsIERhdGEsIGZ1bmN0aW9uIChSZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFZhbHVlRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC5yZW1vdmVEYXRhKCdBdXRvQ29tcGxldGVYSFInKTsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKFJlc3VsdCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVEYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLkxhYmVsICsgIiAoIiArIHRoaXMuVmFsdWUgKyAiKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdyA6IHRoaXMuTGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UoVmFsdWVEYXRhKTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKEV2ZW50LCBVSSkgewogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LnZhbChVSS5pdGVtLnNob3cpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzZXQgaGlkZGVuIGZpZWxkIFNlbGVjdGVkQ3VzdG9tZXJVc2VyCiAgICAgICAgICAgICAgICAgICAgLy8gZXNjYXBlIHBvc3NpYmxlIGNvbG9ucyAoOikgaW4gZWxlbWVudCBpZCBiZWNhdXNlIGpRdWVyeSBjYW4gbm90IGhhbmRsZSBpdCBpbiBpZCBhdHRyaWJ1dGUgc2VsZWN0b3JzCiAgICAgICAgICAgICAgICAgICAgJCgnIycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcigkRWxlbWVudC5hdHRyKCdpZCcpKSArICdTZWxlY3RlZCcpLnZhbChVSS5pdGVtLnZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdDdXN0b21lclNlYXJjaCcKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIC8vIGJlZm9yZSB1bmxvYWQgcmVtb3ZlIG9sZCBzZWxlY3RlZCBkYXRhLiBJZiB0aGUgcGFnZSBpcyByZWxvYWRlZCAod2l0aCBGNSkgdGhpcyBkYXRhIHN0YXlzIGluIHRoZSBmaWVsZCBhbmQgaW52b2tlcyBhbiBhamF4IHJlcXVlc3Qgb3RoZXJ3aXNlCiAgICAgICAgJCh3aW5kb3cpLm9uKCdiZWZvcmV1bmxvYWQuQ3VzdG9tZXJTZWFyY2gnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIC8vIGVzY2FwZSBwb3NzaWJsZSBjb2xvbnMgKDopIGluIGVsZW1lbnQgaWQgYmVjYXVzZSBqUXVlcnkgY2FuIG5vdCBoYW5kbGUgaXQgaW4gaWQgYXR0cmlidXRlIHNlbGVjdG9ycwogICAgICAgICAgICAkKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCRFbGVtZW50LmF0dHIoJ2lkJykpICsgJ1NlbGVjdGVkJykudmFsKCcnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0pOwogICAgfTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oSVRTTS5BZ2VudC5DdXN0b21lclNlYXJjaCB8fCB7fSkpOwo=
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIElUU00gPSBJVFNNIHx8IHt9OwpJVFNNLkFnZW50ID0gSVRTTS5BZ2VudCB8fCB7fTsKCgovKioKICogQG5hbWVzcGFjZSBBZ2VudAogKiBAYXV0aG9yIE9UUlMgQUcKICogQGRlc2NyaXB0aW9uCiAqICAgICAgVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIHNwZWNpYWwgbW9kdWxlIGJlaGF2aW91cnMgZm9yIElUU00gU2VydmljZS4KICovCiBJVFNNLkFnZW50LlNlcnZpY2UgPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0CiAgICAgKiBAbWVtYmVyb2YgQWdlbnQuU2VydmljZQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBhY3Rpb25zIGZvciBJVFNNIFNlcnZpY2UuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbigpIHsKCiAgICAgICAgJCgnLk1hc3RlckFjdGlvbicpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgIHZhciAkTWFzdGVyQWN0aW9uTGluayA9ICQodGhpcykuZmluZCgnLk1hc3RlckFjdGlvbkxpbmsnKTsKICAgICAgICAgICAgLy8gb25seSBhY3QgaWYgdGhlIGxpbmsgd2FzIG5vdCBjbGlja2VkIGRpcmVjdGx5CiAgICAgICAgICAgIGlmIChFdmVudC50YXJnZXQgIT09ICRNYXN0ZXJBY3Rpb25MaW5rLmdldCgwKSkgewogICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gJE1hc3RlckFjdGlvbkxpbmsuYXR0cignaHJlZicpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9OwoKICAgIENvcmUuSW5pdC5SZWdpc3Rlck5hbWVzcGFjZShUYXJnZXROUywgJ0FQUF9NT0RVTEUnKTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oSVRTTS5BZ2VudC5TZXJ2aWNlIHx8IHt9KSk7Cg==
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIElUU00gPSBJVFNNIHx8IHt9OwpJVFNNLkFnZW50ID0gSVRTTS5BZ2VudCB8fCB7fTsKCgovKioKICogQG5hbWVzcGFjZSBBZ2VudAogKiBAYXV0aG9yIE9UUlMgQUcKICogQGRlc2NyaXB0aW9uCiAqICAgICAgVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIHNwZWNpYWwgbW9kdWxlIGJlaGF2aW91cnMgZm9yIElUU00gU2VydmljZSBab29tLgogKi8KIElUU00uQWdlbnQuU2VydmljZVpvb20gPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0CiAgICAgKiBAbWVtYmVyb2YgQWdlbnQuU2VydmljZQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBhY3Rpb25zIGZvciBJVFNNIFNlcnZpY2UgWm9vbS4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uKCkgewoKICAgICAgICAkKCd1bC5BY3Rpb25zIGEuQXNQb3B1cCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBDb3JlLlVJLlBvcHVwLk9wZW5Qb3B1cCgkKHRoaXMpLmF0dHIoJ2hyZWYnKSwgJ0FjdGlvbicpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CgogICAgICAgICQoJ3VsLkFjdGlvbnMgYS5IaXN0b3J5QmFjaycpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBoaXN0b3J5LmJhY2soKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICAvLyBJbml0aWFsaXplIGFsbG9jYXRpb24gbGlzdCBmb3IgbGluayBvYmplY3QgdGFibGUuCiAgICAgICAgQ29yZS5BZ2VudC5UYWJsZUZpbHRlcnMuU2V0QWxsb2NhdGlvbkxpc3QoKTsKICAgIH07CgogICAgQ29yZS5Jbml0LlJlZ2lzdGVyTmFtZXNwYWNlKFRhcmdldE5TLCAnQVBQX01PRFVMRScpOwoKICAgIHJldHVybiBUYXJnZXROUzsKfShJVFNNLkFnZW50LlNlcnZpY2Vab29tIHx8IHt9KSk7Cg==
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIElUU00gPSBJVFNNIHx8IHt9OwpJVFNNLkFnZW50ID0gSVRTTS5BZ2VudCB8fCB7fTsKCgovKioKICogQG5hbWVzcGFjZSBBZ2VudAogKiBAYXV0aG9yIE9UUlMgQUcKICogQGRlc2NyaXB0aW9uCiAqICAgICAgVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIHNwZWNpYWwgbW9kdWxlIGJlaGF2aW91cnMgZm9yIElUU00gU0xBLgogKi8KIElUU00uQWdlbnQuU0xBID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIEFnZW50LlNMQQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBhY3Rpb25zIGZvciBJVFNNIFNMQS4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uKCkgewoKICAgICAgICAkKCcuTWFzdGVyQWN0aW9uJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgdmFyICRNYXN0ZXJBY3Rpb25MaW5rID0gJCh0aGlzKS5maW5kKCcuTWFzdGVyQWN0aW9uTGluaycpOwogICAgICAgICAgICAvLyBvbmx5IGFjdCBpZiB0aGUgbGluayB3YXMgbm90IGNsaWNrZWQgZGlyZWN0bHkKICAgICAgICAgICAgaWYgKEV2ZW50LnRhcmdldCAhPT0gJE1hc3RlckFjdGlvbkxpbmsuZ2V0KDApKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24gPSAkTWFzdGVyQWN0aW9uTGluay5hdHRyKCdocmVmJyk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CgogICAgQ29yZS5Jbml0LlJlZ2lzdGVyTmFtZXNwYWNlKFRhcmdldE5TLCAnQVBQX01PRFVMRScpOwoKICAgIHJldHVybiBUYXJnZXROUzsKfShJVFNNLkFnZW50LlNMQSB8fCB7fSkpOwo=
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIElUU00gPSBJVFNNIHx8IHt9OwpJVFNNLkFnZW50ID0gSVRTTS5BZ2VudCB8fCB7fTsKCgovKioKICogQG5hbWVzcGFjZSBBZ2VudAogKiBAYXV0aG9yIE9UUlMgQUcKICogQGRlc2NyaXB0aW9uCiAqICAgICAgVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIHNwZWNpYWwgbW9kdWxlIGJlaGF2aW91cnMgZm9yIElUU00gU0xBIFpvb20uCiAqLwogSVRTTS5BZ2VudC5TTEFab29tID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIEFnZW50LlNMQQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBhY3Rpb25zIGZvciBJVFNNIFNMQSBab29tLgogICAgICovCiAgICBUYXJnZXROUy5Jbml0ID0gZnVuY3Rpb24oKSB7CgogICAgICAgICQoJ3VsLkFjdGlvbnMgYS5Bc1BvcHVwJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIENvcmUuVUkuUG9wdXAuT3BlblBvcHVwKCQodGhpcykuYXR0cignaHJlZicpLCAnQWN0aW9uJyk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgJCgndWwuQWN0aW9ucyBhLkhpc3RvcnlCYWNrJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGhpc3RvcnkuYmFjaygpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIENvcmUuSW5pdC5SZWdpc3Rlck5hbWVzcGFjZShUYXJnZXROUywgJ0FQUF9NT0RVTEUnKTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oSVRTTS5BZ2VudC5TTEFab29tIHx8IHt9KSk7Cg==
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIElUU00gPSBJVFNNIHx8IHt9OwpJVFNNLkFnZW50ID0gSVRTTS5BZ2VudCB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlIElUU00uQWdlbnQuWm9vbQogKiBAZXhwb3J0cyBUYXJnZXROUyBhcyBDb3JlLklUU00uVGlja2V0Wm9vbQogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgc3BlY2lhbCBtb2R1bGUgZnVuY3Rpb25zIGZvciBJVFNNLgogKi8KSVRTTS5BZ2VudC5ab29tID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qKgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gSVRTTVRhYmxlSGVpZ2h0IC0gVGhlIGhlaWd0aCBvZiB0aGUgdGFibGUuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgc3BlY2lhbCBtb2R1bGUgZnVuY3Rpb25zLgogICAgICovCiAgICBUYXJnZXROUy5Jbml0ID0gZnVuY3Rpb24gKElUU01UYWJsZUhlaWdodCkgewoKICAgICAgICBDb3JlLlVJLlJlc2l6YWJsZS5Jbml0KCQoJyNJVFNNVGFibGVCb2R5JyksIElUU01UYWJsZUhlaWdodCwgZnVuY3Rpb24gKGV2ZW50LCB1aSwgSGVpZ2h0KSB7CgogICAgICAgICAgICAvLyByZW1lbWJlciBuZXcgaGVpZ2h0IGZvciBuZXh0IHJlbG9hZAogICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KFRhcmdldE5TLlJlc2l6ZVRpbWVPdXRTY3JvbGxlcik7CiAgICAgICAgICAgIFRhcmdldE5TLlJlc2l6ZVRpbWVPdXRTY3JvbGxlciA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIENvcmUuQWdlbnQuUHJlZmVyZW5jZXNVcGRhdGUoJ1VzZXJDb25maWdJdGVtWm9vbVRhYmxlSGVpZ2h0JywgSGVpZ2h0KTsKICAgICAgICAgICAgfSwgMTAwMCk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIHJldHVybiBUYXJnZXROUzsKfShJVFNNLkFnZW50Llpvb20gfHwge30pKTsK
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgRGVmYXVsdCBTZXR0aW5ncwogKi8KCkBtZWRpYSBzY3JlZW4scHJvamVjdGlvbix0dixoYW5kaGVsZCB7CgovKioKICogQHN1YnNlY3Rpb24gIEZsYWcKICovCgpmaWVsZHNldC5UYWJsZUxpa2UgZGl2LlZhbHVlIC5GbGFnIHsKICAgIGZsb2F0OiBsZWZ0OwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICBtYXJnaW4tdG9wOiAzcHg7Cn0KCiNTZXJ2aWNlSW5jaWRlbnRTdGF0ZUNvbnRhaW5lciAuRmxhZywKLlNpZGViYXJDb2x1bW4gZmllbGRzZXQuVGFibGVMaWtlIGRpdi5WYWx1ZSAuRmxhZyB7CiAgICBtYXJnaW4tdG9wOiA3cHg7Cn0KCnVsLklUU01GbGFnIHsKICAgIG1hcmdpbi10b3A6IDVweDsKfQoKdWwuSVRTTUZsYWcgZGl2LlZhbHVlIC5GbGFnIHsKICAgIGZsb2F0OiBsZWZ0OwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICBtYXJnaW4tdG9wOiAzcHg7Cn0KCi5SVEwgZmllbGRzZXQuVGFibGVMaWtlIGRpdi5WYWx1ZSAuRmxhZyB7CiAgICBmbG9hdDogcmlnaHQ7CiAgICBtYXJnaW4tbGVmdDogNXB4Owp9CgouRmxhZyBzcGFuLmdyYXlsZWQgewogICAgYmFja2dyb3VuZC1jb2xvcjojY2RjZGNkOwp9CgouRmxhZyBzcGFuLmdyZWVubGVkIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICM4YmVmNGQ7Cn0KCi5GbGFnIHNwYW4ueWVsbG93bGVkIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmRkNTA7Cn0KCi5GbGFnIHNwYW4ucmVkbGVkIHsKICAgIGJhY2tncm91bmQtY29sb3I6I2ZmNTA1ZTsKfQoKLkZsYWcgc3Bhbi5wdXJwbGVsZWQgewogICAgYmFja2dyb3VuZC1jb2xvcjojYjIzYWVlOwp9CgouRmxhZyBzcGFuLm9yYW5nZWxlZCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmZjhjMDA7Cn0KCi5GbGFnIHNwYW4uY3lhbmxlZCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiM3OWNkY2Q7Cn0KCi5GbGFnIHNwYW4ud2hpdGVsZWQgewogICAgYmFja2dyb3VuZC1jb2xvcjojZmZmZmZmOwp9CgouRmxhZyBzcGFuLmJsYWNrbGVkIHsKICAgIGJhY2tncm91bmQtY29sb3I6IzAwMDAwMDsKfQoKLyoqCiAqIEBub3RlICAgICBUaGVzZSBjbGFzc2VzIGFyZSB1c2VkIGZvciBhIExhYmVsIGFuZCBhIERpdiB3aXRoIGNsYXNzICdGaWVsZCcsCiAqICAgICAgICAgICB0aGF0IGFyZSBpbnNpZGUgYSBGaWVsZCBEaXYgLgogKi8KCmxhYmVsLlN1YkVsZW1lbnQgewogICAgd2lkdGg6IDIwJSAhaW1wb3J0YW50OwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4Owp9CgpkaXYuU3ViRWxlbWVudCB7CiAgICBtYXJnaW4tbGVmdDogNDAlICFpbXBvcnRhbnQ7Cn0KCmRpdi5TdWJFbGVtZW50IGlucHV0Llc1MHBjIHsKICAgIHdpZHRoOiAzMyU7Cn0KCi8qKgogKiBAc3Vic2VjdGlvbiBOb0RvdWJsZUJvcmRlcnMKICovCgouQ29udGVudC5Ob0RvdWJsZUJvcmRlcnMgewogICAgYm9yZGVyLWxlZnQ6IDAgbm9uZSAjMDAwMDAwOwogICAgYm9yZGVyLXJpZ2h0OiAwIG5vbmUgIzAwMDAwMDsKfQoKLyoqCiAqIEBzdWJzZWN0aW9uICBTdGFuZGFyZCBXaWR0aHMKICovCi5XNXBjIHsKICAgIHdpZHRoOiA1JTsKfQoKLlcxNXBjIHsKICAgIHdpZHRoOiAxNSU7Cn0KCi5XMzBwYyB7CiAgICB3aWR0aDogMzAlOwp9CgpmaWVsZHNldC5UYWJsZUxpa2UuQWdlbnRJVFNNQ2hhbmdlQWRkT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuVGFibGVMaWtlLkFnZW50SVRTTUNoYW5nZUFkZE9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIG1hcmdpbi1sZWZ0OiAzNjBweDsKfQoKZmllbGRzZXQuVGFibGVMaWtlLkFnZW50SVRTTVdvcmtvcmRlckFkZE9GT1JLID4gLkZpZWxkLApmaWVsZHNldC5UYWJsZUxpa2UuQWdlbnRJVFNNV29ya29yZGVyQWRkT0ZPUksgPiAuUm93ID4gLkZpZWxkLApmaWVsZHNldC5UYWJsZUxpa2UuQWdlbnRJVFNNV29ya29yZGVyQWRkT0ZPUksgPiAuVmFsdWUsCmZpZWxkc2V0LlRhYmxlTGlrZS5BZ2VudElUU01Xb3Jrb3JkZXJBZGRPRk9SSyA+IC5Sb3cgPiAuVmFsdWUgewogICAgbWFyZ2luLWxlZnQ6IDEyMHB4OwogICAgbWFyZ2luLXJpZ2h0OiA3cHg7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cn0KCi5XNzVwY0FnZW50SVRTTVNlcnZpY2VPRk9SSyB7CiAgICB3aWR0aDogMTAwJTsKfQoKLlc3NXBjQWdlbnRJVFNNU0xBT0ZPUksgewogICAgd2lkdGg6IDEwMCU7Cn0KCmZpZWxkc2V0LlRhYmxlTGlrZS5BZ2VudElUU01DaGFuZ2VBZGRPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5UYWJsZUxpa2UuQWdlbnRJVFNNQ2hhbmdlQWRkT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgbWFyZ2luLWxlZnQ6IDM2MHB4Owp9CgpmaWVsZHNldC5UYWJsZUxpa2UuQWdlbnRJVFNNV29ya29yZGVyQWRkT0ZPUksgPiAuRmllbGQsCmZpZWxkc2V0LlRhYmxlTGlrZS5BZ2VudElUU01Xb3Jrb3JkZXJBZGRPRk9SSyA+IC5Sb3cgPiAuRmllbGQsCmZpZWxkc2V0LlRhYmxlTGlrZS5BZ2VudElUU01Xb3Jrb3JkZXJBZGRPRk9SSyA+IC5WYWx1ZSwKZmllbGRzZXQuVGFibGVMaWtlLkFnZW50SVRTTVdvcmtvcmRlckFkZE9GT1JLID4gLlJvdyA+IC5WYWx1ZSB7CiAgICBtYXJnaW4tbGVmdDogMTIwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDdweDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdE9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXRPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDM1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZjhlYTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAzJTsKICAgIG1hcmdpbi1yaWdodDogMSU7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld05hdkJhck9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTUNvbmZpZ0l0ZW1PdmVydmlld05hdkJhck9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMzUlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIzkyOTI5MjsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDlmOGVhOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDEwN3B4OwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtPcmRlclRlbXBsYXRlT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWdlbnRJVFNNV29ya09yZGVyVGVtcGxhdGVPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDM1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZjhlYTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZ2VudElUU01DaGFuZ2VPdmVydmlld05hdkJhck9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZU92ZXJ2aWV3TmF2QmFyT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAzNSU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjOTI5MjkyOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWY4ZWE7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNV29ya09yZGVyQWdlbnRPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01Xb3JrT3JkZXJBZ2VudE9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMzUlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIzkyOTI5MjsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDlmOGVhOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtPcmRlclJlcG9ydE9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtPcmRlclJlcG9ydE9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMzUlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIzkyOTI5MjsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDlmOGVhOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtPcmRlckRlbGV0ZU9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtPcmRlckRlbGV0ZU9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMzUlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIzkyOTI5MjsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDlmOGVhOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZVRpbWVTbG90T0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWdlbnRJVFNNQ2hhbmdlVGltZVNsb3RPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDM1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZjhlYTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZ2VudElUU01Xb3Jrb3JkZXJBZGRGcm9tVGVtcGxhdGVPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01Xb3Jrb3JkZXJBZGRGcm9tVGVtcGxhdGVPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDEwJTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZjhlYTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZ2VudElUU01DaGFuZ2VBZGRGcm9tVGVtcGxhdGVPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01DaGFuZ2VBZGRGcm9tVGVtcGxhdGVPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDM1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZjhlYTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgbWFyZ2luLXJpZ2h0OiA3cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZVNlYXJjaE9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZVNlYXJjaE9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMjAlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIzkyOTI5MjsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDlmOGVhOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDEwMHB4OwogICAgbWFyZ2luLXJpZ2h0OiA3cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtvcmRlckluZm9ybWF0aW9uQm94T0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWdlbnRJVFNNV29ya29yZGVySW5mb3JtYXRpb25Cb3hPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDM1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZjhlYTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZ2VudElUU01UZW1wbGF0ZUVkaXRPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01UZW1wbGF0ZUVkaXRPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDM1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZjhlYTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZ2VudElUU01DaGFuZ2VUZW1wbGF0ZU9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZVRlbXBsYXRlT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAzNSU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjOTI5MjkyOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWY4ZWE7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWRtaW5JVFNNQ2hhbmdlTm90aWZpY2F0aW9uT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWRtaW5JVFNNQ2hhbmdlTm90aWZpY2F0aW9uT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAxMCU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjOTI5MjkyOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWY4ZWE7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMzA2cHg7CiAgICBtYXJnaW4tcmlnaHQ6IDhweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGtPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01Db25maWdJdGVtQnVsa09GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMTAlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIzkyOTI5MjsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDlmOGVhOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDMwNnB4OwogICAgbWFyZ2luLXJpZ2h0OiA4cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudE9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudE9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMTAlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIzkyOTI5MjsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDlmOGVhOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDE1MHB4OwogICAgbWFyZ2luLXJpZ2h0OiA4cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudExhbmd1YWdlT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50TGFuZ3VhZ2VPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDEwJTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZjhlYTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAzMDZweDsKICAgIG1hcmdpbi1yaWdodDogOHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZG1pbk5vdGlmaWNhdGlvbkV2ZW50T0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWRtaW5Ob3RpZmljYXRpb25FdmVudE9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMTAlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIzkyOTI5MjsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDlmOGVhOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDE1MHB4OwogICAgbWFyZ2luLXJpZ2h0OiA4cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFkbWluTm90aWZpY2F0aW9uRXZlbnRMYW5ndWFnZU9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFkbWluTm90aWZpY2F0aW9uRXZlbnRMYW5ndWFnZU9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMTAlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIzkyOTI5MjsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDlmOGVhOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDMwNnB4OwogICAgbWFyZ2luLXJpZ2h0OiA4cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZUludm9sdmVkUGVyc29uc09GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZUludm9sdmVkUGVyc29uc09GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMzUlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIzkyOTI5MjsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDlmOGVhOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtvcmRlckFkZEluZm9ybWF0aW9uT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWdlbnRJVFNNV29ya29yZGVyQWRkSW5mb3JtYXRpb25PRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDM1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZjhlYTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZ2VudElUU01Xb3Jrb3JkZXJab29tSW5mb3JtYXRpb25PRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01Xb3Jrb3JkZXJab29tSW5mb3JtYXRpb25PRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDM1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZjhlYTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiA1cHg7CiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZVpvb21JbmZvcm1hdGlvbk9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZVpvb21JbmZvcm1hdGlvbk9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMzUlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIzkyOTI5MjsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDlmOGVhOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDVweDsKICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNV29ya29yZGVyWm9vbU9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtvcmRlclpvb21PRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDM1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZjhlYTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAzMHB4OwogICAgbWFyZ2luLXJpZ2h0OiA3cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZVpvb21PRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01DaGFuZ2Vab29tT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiA0NSU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjOTI5MjkyOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWY4ZWE7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMzBweDsKICAgIG1hcmdpbi1yaWdodDogN3B4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZ2VudElUU01Db25maWdJdGVtWm9vbU9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAzNSU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjOTI5MjkyOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWY4ZWE7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMXB4OwogICAgbWFyZ2luLXJpZ2h0OiA3cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2hPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01Db25maWdJdGVtU2VhcmNoT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAxNSU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjOTI5MjkyOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWY4ZWE7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMTUwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDdweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXRPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01Db25maWdJdGVtRWRpdE9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMTAlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIzkyOTI5MjsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDlmOGVhOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDM2N3B4OwogICAgbWFyZ2luLXJpZ2h0OiA3cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LlRhYmxlTGlrZSA+IC5BZG1pbklUU01Db25maWdJdGVtQWRkU29mdHdhcmUsCmZpZWxkc2V0LlRhYmxlTGlrZSA+IC5Sb3cgPiAuQWRtaW5JVFNNQ29uZmlnSXRlbUFkZFNvZnR3YXJlIHsKICAgIGxpbmUtaGVpZ2h0OiAxLjllbTsKICAgIG1hcmdpbi1sZWZ0OiAxNy40JTsKICAgIG1hcmdpbi1yaWdodDogMDsKICAgIHBhZGRpbmctdG9wOiAzcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogM3B4OwogICAgcGFkZGluZy1sZWZ0OiAxMHB4OwogICAgcGFkZGluZy1yaWdodDogMHB4OwogICAgbWluLWhlaWdodDogMjBweDsKfQoKZmllbGRzZXQuVGFibGVMaWtlLkZpeGVkTGFiZWwgPiAuQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdCwKZmllbGRzZXQuVGFibGVMaWtlLkZpeGVkTGFiZWwgPiAuUm93ID4gLkFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQsCmZpZWxkc2V0LlRhYmxlTGlrZS5GaXhlZExhYmVsID4gLlZhbHVlLApmaWVsZHNldC5UYWJsZUxpa2UuRml4ZWRMYWJlbCA+IC5Sb3cgPiAuVmFsdWUgewogICAgbWFyZ2luLWxlZnQ6IDElOwogICAgbWFyZ2luLXJpZ2h0OiAwOwogICAgcGFkZGluZy1sZWZ0OiAxN3B4OwogICAgcGFkZGluZy1yaWdodDogMDsKfQoKZmllbGRzZXQuVGFibGVMaWtlLkZpeGVkTGFiZWwgPiAuQWdlbnRJVFNNV29ya09yZGVyVGVtcGxhdGUsCmZpZWxkc2V0LlRhYmxlTGlrZS5GaXhlZExhYmVsID4gLlJvdyA+IC5BZ2VudElUU01Xb3JrT3JkZXJUZW1wbGF0ZSwKZmllbGRzZXQuVGFibGVMaWtlLkZpeGVkTGFiZWwgPiAuVmFsdWUsCmZpZWxkc2V0LlRhYmxlTGlrZS5GaXhlZExhYmVsID4gLlJvdyA+IC5WYWx1ZSB7CiAgICBtYXJnaW4tbGVmdDogMSU7CiAgICBtYXJnaW4tcmlnaHQ6IDA7CiAgICBwYWRkaW5nLWxlZnQ6IDE3cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAwOwp9CgpmaWVsZHNldC5UYWJsZUxpa2UuRml4ZWRMYWJlbCA+IC5BZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQsCmZpZWxkc2V0LlRhYmxlTGlrZS5GaXhlZExhYmVsID4gLlJvdyA+IC5BZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQsCmZpZWxkc2V0LlRhYmxlTGlrZS5GaXhlZExhYmVsID4gLlZhbHVlLApmaWVsZHNldC5UYWJsZUxpa2UuRml4ZWRMYWJlbCA+IC5Sb3cgPiAuVmFsdWUgewogICAgbWFyZ2luLWxlZnQ6IDUlOwogICAgbWFyZ2luLXJpZ2h0OiAwOwogICAgcGFkZGluZy1sZWZ0OiAxN3B4OwogICAgcGFkZGluZy1yaWdodDogMDsKfQoKfS8qIGVuZCBtZWRpYSAqLwoKCg==
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgSVRTTURldGFpbHMKICovCgpAbWVkaWEgc2NyZWVuLHByb2plY3Rpb24sdHYsaGFuZGhlbGQgewoKLyoqCiAqIEBzdWJzZWN0aW9uICBIZWFkbGluZQogKi8KCi8qKgogKiBAc3Vic2VjdGlvbiAgSVRTTSB0cmVlCiAqLwojSVRTTVRyZWUgewogICAgbWFyZ2luLXRvcDogMjBweDsKfQoKCi8qKgogKiBAc3Vic2VjdGlvbiAgSVRTTSB0YWJsZSBib2R5CiAqLwojSVRTTVRhYmxlQm9keSB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKfQoKI0lUU01UYWJsZUJvZHkgLlNjcm9sbGVyIHsKICAgIGhlaWdodDogMTQwcHg7CiAgICBvdmVyZmxvdy15OiBzY3JvbGw7Cn0KCi8qKgogKiBAc3Vic2VjdGlvbiAgQ29udHJvbFJvdyBJY29ucwogKi8KCgouSVRTTUl0ZW1WaWV3IHsKICAgIGZsb2F0OiByaWdodDsKfQoKLlJUTCAuSVRTTUl0ZW1WaWV3IHsKICAgIGZsb2F0OiBsZWZ0Owp9CgoKLkNvbnRyb2xSb3cgLklUU01JdGVtVmlldy5JY29ucyAuT25lSVRTTUl0ZW0uQWN0aXZlIHNwYW4sCi5Db250cm9sUm93IC5JVFNNSXRlbVZpZXcuSWNvbnMgLk9uZUlUU01JdGVtLkFjdGl2ZTpob3ZlciBzcGFuIHsKICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IDA7Cn0KCi5Db250cm9sUm93IC5JVFNNSXRlbVZpZXcuSWNvbnMgLkFsbElUU01JdGVtcyBzcGFuLAouQ29udHJvbFJvdyAuSVRTTUl0ZW1WaWV3Lkljb25zIC5BbGxJVFNNSXRlbXM6aG92ZXIgc3BhbiB7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNnB4Owp9CgouQ29udHJvbFJvdyAuSVRTTUl0ZW1WaWV3Lkljb25zIC5BbGxJVFNNSXRlbXMuQWN0aXZlIHNwYW4sCi5Db250cm9sUm93IC5JVFNNSXRlbVZpZXcuSWNvbnMgLkFsbElUU01JdGVtcy5BY3RpdmU6aG92ZXIgc3BhbiB7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTZweDsKfQoKLkNvbnRyb2xSb3cgLklUU01GaWx0ZXIuSWNvbnMgLkFjdGl2ZSBzcGFuIHsKICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTE2cHg7Cn0KCi8qKgogKiBAc3Vic2VjdGlvbiAgSXRlbVJvdwogKiBAbm90ZSAgICAgICAgY29udGFpbnMgcmFuZG9tIGl0ZW1zIGFuZCBpcyBwb3NpdGlvbmVkIGluIHRoZSBzaWRlYmFyCiAqLwoKLkl0ZW1Sb3cgewogICAgbWFyZ2luLWxlZnQ6IDQwJTsKfQoKLlJUTCAuSXRlbVJvdyB7CiAgICBtYXJnaW4tbGVmdDogMDsKICAgIG1hcmdpbi1yaWdodDogNDAlOwp9CgouSXRlbVJvdyBsaSB7CiAgICBwYWRkaW5nOiAzcHggMCA1cHggOHB4Owp9CgouUlRMIC5JdGVtUm93IGxpIHsKICAgIHBhZGRpbmc6IDNweCA4cHggNXB4IDA7Cn0KCi5JdGVtUm93IGEgewogICAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgICBjb2xvcjogIzAwMDsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgouSXRlbVJvdyBhOmhvdmVyIHsKICAgIGNvbG9yOiAjNjY2Owp9Cgp9IC8qIGVuZCBAbWVkaWEgKi8=
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgU2VhcmNoCiAqLwoKQG1lZGlhIHNjcmVlbixwcm9qZWN0aW9uLHR2LGhhbmRoZWxkIHsKCgovKioKICogQHN1YnNlY3Rpb24gIEF1dG9Db21wbGV0ZQogKi8KCi51aS1hdXRvY29tcGxldGUgewogICAgei1pbmRleDogMTAwMDAwICFpbXBvcnRhbnQ7Cn0KCn0K
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgQ1NTIGZvciBwcmludGluZwogKi8KCkBtZWRpYSBwcmludCB7CgoKI0lUU01UYWJsZSB7CiAgICBkaXNwbGF5OiBub25lOwp9Cgp9IC8qIGVuZCBAbWVkaWEgKi8=
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgVGFibGVzCiAqLwoKQG1lZGlhIHNjcmVlbixwcm9qZWN0aW9uLHR2LGhhbmRoZWxkIHsKCi8qKgogKiBAc3Vic2VjdGlvbiAgT3ZlcnZpZXcgU21hbGwgVmlldyBUYWJsZQogKi8KCi5UYWJsZVNtYWxsIHRoZWFkLklUU01IZWFkZXIgc3BhbiB7CiAgICBjb2xvcjogIzRBNEE0QTsKfQoKLyoqCiAqIEBzdWJzZWN0aW9uICB0YWJsZSBlbGVtZW50cyB3aXRob3V0IGhpZ2hsaWdodAogKi8KCi5EYXRhVGFibGVOb0hpZ2hsaWdodCB0Ym9keSB0ciB0ZCB7CiAgICBoZWlnaHQ6IDMwcHg7Cn0KCi5EYXRhVGFibGVOb0hpZ2hsaWdodCB0Ym9keSB0ciB0ZCBpbnB1dCwKLkRhdGFUYWJsZU5vSGlnaGxpZ2h0IHRib2R5IHRyIHRkIHNlbGVjdHsKICAgIHdpZHRoOiA4NSU7Cn0KCi5EYXRhVGFibGVOb0hpZ2hsaWdodCB0Ym9keSB0cjpob3ZlciB0ZCB7CiAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgLW1vei1ib3gtc2hhZG93OiBub25lOwogICAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lOwogICAgYm94LXNoYWRvdzogbm9uZTsKfQouRGF0YVRhYmxlTm9IaWdobGlnaHQgdHIuRXZlbjpob3ZlciB0ZCwKLkRhdGFUYWJsZU5vSGlnaGxpZ2h0IHRyLkV2ZW46aG92ZXIuTGFzdCB0ZCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjVGNUY1Owp9CgouRGF0YVRhYmxlTm9IaWdobGlnaHQgdGJvZHkgdHIuTGFzdDpob3ZlciB0ZCB7CiAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgLW1vei1ib3gtc2hhZG93OiBub25lOwogICAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lOwogICAgYm94LXNoYWRvdzogbm9uZTsKfQoKfQ==
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgRGVmYXVsdCBTZXR0aW5ncwogKi8KCkBtZWRpYSBzY3JlZW4scHJvamVjdGlvbix0dixoYW5kaGVsZCB7CgovKioKICogQHN1YnNlY3Rpb24gIEZsYWcKICovCgpmaWVsZHNldC5UYWJsZUxpa2UgZGl2LlZhbHVlIC5GbGFnIHsKICAgIGZsb2F0OiBsZWZ0OwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICBtYXJnaW4tdG9wOiAzcHg7Cn0KCiNTZXJ2aWNlSW5jaWRlbnRTdGF0ZUNvbnRhaW5lciAuRmxhZywKLlNpZGViYXJDb2x1bW4gZmllbGRzZXQuVGFibGVMaWtlIGRpdi5WYWx1ZSAuRmxhZyB7CiAgICBtYXJnaW4tdG9wOiA3cHg7Cn0KCnVsLklUU01GbGFnIHsKICAgIG1hcmdpbi10b3A6IDVweDsKfQoKdWwuSVRTTUZsYWcgZGl2LlZhbHVlIC5GbGFnIHsKICAgIGZsb2F0OiBsZWZ0OwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICBtYXJnaW4tdG9wOiAzcHg7Cn0KCi5SVEwgZmllbGRzZXQuVGFibGVMaWtlIGRpdi5WYWx1ZSAuRmxhZyB7CiAgICBmbG9hdDogcmlnaHQ7CiAgICBtYXJnaW4tbGVmdDogNXB4Owp9CgouRmxhZyBzcGFuLmdyYXlsZWQgewogICAgYmFja2dyb3VuZC1jb2xvcjojY2RjZGNkOwp9CgouRmxhZyBzcGFuLmdyZWVubGVkIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICM4YmVmNGQ7Cn0KCi5GbGFnIHNwYW4ueWVsbG93bGVkIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmRkNTA7Cn0KCi5GbGFnIHNwYW4ucmVkbGVkIHsKICAgIGJhY2tncm91bmQtY29sb3I6I2ZmNTA1ZTsKfQoKLkZsYWcgc3Bhbi5wdXJwbGVsZWQgewogICAgYmFja2dyb3VuZC1jb2xvcjojYjIzYWVlOwp9CgouRmxhZyBzcGFuLm9yYW5nZWxlZCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmZjhjMDA7Cn0KCi5GbGFnIHNwYW4uY3lhbmxlZCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiM3OWNkY2Q7Cn0KCi5GbGFnIHNwYW4ud2hpdGVsZWQgewogICAgYmFja2dyb3VuZC1jb2xvcjojZmZmZmZmOwp9CgouRmxhZyBzcGFuLmJsYWNrbGVkIHsKICAgIGJhY2tncm91bmQtY29sb3I6IzAwMDAwMDsKfQoKLyoqCiAqIEBub3RlICAgICBUaGVzZSBjbGFzc2VzIGFyZSB1c2VkIGZvciBhIExhYmVsIGFuZCBhIERpdiB3aXRoIGNsYXNzICdGaWVsZCcsCiAqICAgICAgICAgICB0aGF0IGFyZSBpbnNpZGUgYSBGaWVsZCBEaXYgLgogKi8KCmxhYmVsLlN1YkVsZW1lbnQgewogICAgd2lkdGg6IDIwJSAhaW1wb3J0YW50OwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4Owp9CgpkaXYuU3ViRWxlbWVudCB7CiAgICBtYXJnaW4tbGVmdDogNDAlICFpbXBvcnRhbnQ7Cn0KCmRpdi5TdWJFbGVtZW50IGlucHV0Llc1MHBjIHsKICAgIHdpZHRoOiAzMyU7Cn0KCi8qKgogKiBAc3Vic2VjdGlvbiBOb0RvdWJsZUJvcmRlcnMKICovCgouQ29udGVudC5Ob0RvdWJsZUJvcmRlcnMgewogICAgYm9yZGVyLWxlZnQ6IDAgbm9uZSAjMDAwMDAwOwogICAgYm9yZGVyLXJpZ2h0OiAwIG5vbmUgIzAwMDAwMDsKfQoKLyoqCiAqIEBzdWJzZWN0aW9uICBTdGFuZGFyZCBXaWR0aHMKICovCi5XNXBjIHsKICAgIHdpZHRoOiA1JTsKfQoKLlcxNXBjIHsKICAgIHdpZHRoOiAxNSU7Cn0KCi5XMzBwYyB7CiAgICB3aWR0aDogMzAlOwp9CgpmaWVsZHNldC5UYWJsZUxpa2UuQWdlbnRJVFNNQ2hhbmdlQWRkT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuVGFibGVMaWtlLkFnZW50SVRTTUNoYW5nZUFkZE9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIG1hcmdpbi1sZWZ0OiAzNjBweDsKfQoKZmllbGRzZXQuVGFibGVMaWtlLkFnZW50SVRTTVdvcmtvcmRlckFkZE9GT1JLID4gLkZpZWxkLApmaWVsZHNldC5UYWJsZUxpa2UuQWdlbnRJVFNNV29ya29yZGVyQWRkT0ZPUksgPiAuUm93ID4gLkZpZWxkLApmaWVsZHNldC5UYWJsZUxpa2UuQWdlbnRJVFNNV29ya29yZGVyQWRkT0ZPUksgPiAuVmFsdWUsCmZpZWxkc2V0LlRhYmxlTGlrZS5BZ2VudElUU01Xb3Jrb3JkZXJBZGRPRk9SSyA+IC5Sb3cgPiAuVmFsdWUgewogICAgbWFyZ2luLWxlZnQ6IDEyMHB4OwogICAgbWFyZ2luLXJpZ2h0OiA3cHg7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cn0KCi5XNzVwY0FnZW50SVRTTVNlcnZpY2VPRk9SSyB7CiAgICB3aWR0aDogMTAwJTsKfQoKLlc3NXBjQWdlbnRJVFNNU0xBT0ZPUksgewogICAgd2lkdGg6IDEwMCU7Cn0KCmZpZWxkc2V0LlRhYmxlTGlrZS5BZ2VudElUU01DaGFuZ2VBZGRPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5UYWJsZUxpa2UuQWdlbnRJVFNNQ2hhbmdlQWRkT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgbWFyZ2luLWxlZnQ6IDM2MHB4Owp9CgpmaWVsZHNldC5UYWJsZUxpa2UuQWdlbnRJVFNNV29ya29yZGVyQWRkT0ZPUksgPiAuRmllbGQsCmZpZWxkc2V0LlRhYmxlTGlrZS5BZ2VudElUU01Xb3Jrb3JkZXJBZGRPRk9SSyA+IC5Sb3cgPiAuRmllbGQsCmZpZWxkc2V0LlRhYmxlTGlrZS5BZ2VudElUU01Xb3Jrb3JkZXJBZGRPRk9SSyA+IC5WYWx1ZSwKZmllbGRzZXQuVGFibGVMaWtlLkFnZW50SVRTTVdvcmtvcmRlckFkZE9GT1JLID4gLlJvdyA+IC5WYWx1ZSB7CiAgICBtYXJnaW4tbGVmdDogMTIwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDdweDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdE9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXRPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDM1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICMjMDAwOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWY4ZWE7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMyU7CiAgICBtYXJnaW4tcmlnaHQ6IDElOwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdOYXZCYXJPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01Db25maWdJdGVtT3ZlcnZpZXdOYXZCYXJPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDM1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICMjMDAwOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWY4ZWE7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMTA3cHg7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNV29ya09yZGVyVGVtcGxhdGVPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01Xb3JrT3JkZXJUZW1wbGF0ZU9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMzUlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIyMwMDA7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZjhlYTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZ2VudElUU01DaGFuZ2VPdmVydmlld05hdkJhck9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZU92ZXJ2aWV3TmF2QmFyT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAzNSU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjIzAwMDsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDlmOGVhOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtPcmRlckFnZW50T0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWdlbnRJVFNNV29ya09yZGVyQWdlbnRPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDM1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICMjMDAwOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWY4ZWE7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNV29ya09yZGVyUmVwb3J0T0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWdlbnRJVFNNV29ya09yZGVyUmVwb3J0T0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAzNSU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjIzAwMDsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDlmOGVhOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtPcmRlckRlbGV0ZU9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtPcmRlckRlbGV0ZU9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMzUlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIyMwMDA7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZjhlYTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZ2VudElUU01DaGFuZ2VUaW1lU2xvdE9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZVRpbWVTbG90T0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAzNSU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjIzAwMDsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDlmOGVhOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtvcmRlckFkZEZyb21UZW1wbGF0ZU9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtvcmRlckFkZEZyb21UZW1wbGF0ZU9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMTAlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIyMwMDA7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZjhlYTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZ2VudElUU01DaGFuZ2VBZGRGcm9tVGVtcGxhdGVPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01DaGFuZ2VBZGRGcm9tVGVtcGxhdGVPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDM1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICMjMDAwOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWY4ZWE7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgIG1hcmdpbi1yaWdodDogN3B4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZ2VudElUU01DaGFuZ2VTZWFyY2hPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01DaGFuZ2VTZWFyY2hPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDIwJTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICMjMDAwOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWY4ZWE7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMTAwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDdweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNV29ya29yZGVySW5mb3JtYXRpb25Cb3hPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01Xb3Jrb3JkZXJJbmZvcm1hdGlvbkJveE9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMzUlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIyMwMDA7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZjhlYTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZ2VudElUU01UZW1wbGF0ZUVkaXRPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01UZW1wbGF0ZUVkaXRPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDM1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICMjMDAwOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWY4ZWE7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNQ2hhbmdlVGVtcGxhdGVPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01DaGFuZ2VUZW1wbGF0ZU9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMzUlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIyMwMDA7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZjhlYTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZG1pbklUU01DaGFuZ2VOb3RpZmljYXRpb25PRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZG1pbklUU01DaGFuZ2VOb3RpZmljYXRpb25PRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDEwJTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICMjMDAwOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWY4ZWE7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMzA2cHg7CiAgICBtYXJnaW4tcmlnaHQ6IDhweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGtPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01Db25maWdJdGVtQnVsa09GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMTAlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIyMwMDA7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZjhlYTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAzMDZweDsKICAgIG1hcmdpbi1yaWdodDogOHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnRPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnRPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDEwJTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICMjMDAwOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWY4ZWE7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMTUwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDhweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50TGFuZ3VhZ2VPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnRMYW5ndWFnZU9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMTAlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIyMwMDA7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZjhlYTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAzMDZweDsKICAgIG1hcmdpbi1yaWdodDogOHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZG1pbk5vdGlmaWNhdGlvbkV2ZW50T0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWRtaW5Ob3RpZmljYXRpb25FdmVudE9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMTAlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIyMwMDA7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZjhlYTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAxNTBweDsKICAgIG1hcmdpbi1yaWdodDogOHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZG1pbk5vdGlmaWNhdGlvbkV2ZW50TGFuZ3VhZ2VPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZG1pbk5vdGlmaWNhdGlvbkV2ZW50TGFuZ3VhZ2VPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDEwJTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICMjMDAwOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWY4ZWE7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMzA2cHg7CiAgICBtYXJnaW4tcmlnaHQ6IDhweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNQ2hhbmdlSW52b2x2ZWRQZXJzb25zT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWdlbnRJVFNNQ2hhbmdlSW52b2x2ZWRQZXJzb25zT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAzNSU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjIzAwMDsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDlmOGVhOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtvcmRlckFkZEluZm9ybWF0aW9uT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWdlbnRJVFNNV29ya29yZGVyQWRkSW5mb3JtYXRpb25PRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDM1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICMjMDAwOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWY4ZWE7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNV29ya29yZGVyWm9vbUluZm9ybWF0aW9uT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWdlbnRJVFNNV29ya29yZGVyWm9vbUluZm9ybWF0aW9uT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAzNSU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjIzAwMDsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDlmOGVhOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDVweDsKICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNQ2hhbmdlWm9vbUluZm9ybWF0aW9uT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWdlbnRJVFNNQ2hhbmdlWm9vbUluZm9ybWF0aW9uT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAzNSU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjMDAwOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWY4ZWE7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogNXB4OwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZ2VudElUU01Xb3Jrb3JkZXJab29tT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWdlbnRJVFNNV29ya29yZGVyWm9vbU9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMzUlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIyMwMDA7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZjhlYTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAzMHB4OwogICAgbWFyZ2luLXJpZ2h0OiA3cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZVpvb21PRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01DaGFuZ2Vab29tT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiA0NSU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjIzAwMDsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDlmOGVhOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDMwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDdweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNQ29uZmlnSXRlbVpvb21PRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01Db25maWdJdGVtWm9vbU9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMzUlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIyMwMDA7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZjhlYTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAxcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDdweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaE9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2hPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDE1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICMjMDAwOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWY4ZWE7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMTUwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDdweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXRPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01Db25maWdJdGVtRWRpdE9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMTAlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIzAwMDsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDlmOGVhOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDM2N3B4OwogICAgbWFyZ2luLXJpZ2h0OiA3cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LlRhYmxlTGlrZSA+IC5BZG1pbklUU01Db25maWdJdGVtQWRkU29mdHdhcmUsCmZpZWxkc2V0LlRhYmxlTGlrZSA+IC5Sb3cgPiAuQWRtaW5JVFNNQ29uZmlnSXRlbUFkZFNvZnR3YXJlIHsKICAgIGxpbmUtaGVpZ2h0OiAxLjllbTsKICAgIG1hcmdpbi1sZWZ0OiAxNy40JTsKICAgIG1hcmdpbi1yaWdodDogMDsKICAgIHBhZGRpbmctdG9wOiAzcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogM3B4OwogICAgcGFkZGluZy1sZWZ0OiAxMHB4OwogICAgcGFkZGluZy1yaWdodDogMHB4OwogICAgbWluLWhlaWdodDogMjBweDsKfQoKZmllbGRzZXQuVGFibGVMaWtlLkZpeGVkTGFiZWwgPiAuQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdCwKZmllbGRzZXQuVGFibGVMaWtlLkZpeGVkTGFiZWwgPiAuUm93ID4gLkFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQsCmZpZWxkc2V0LlRhYmxlTGlrZS5GaXhlZExhYmVsID4gLlZhbHVlLApmaWVsZHNldC5UYWJsZUxpa2UuRml4ZWRMYWJlbCA+IC5Sb3cgPiAuVmFsdWUgewogICAgbWFyZ2luLWxlZnQ6IDElOwogICAgbWFyZ2luLXJpZ2h0OiAwOwogICAgcGFkZGluZy1sZWZ0OiAxN3B4OwogICAgcGFkZGluZy1yaWdodDogMDsKfQoKZmllbGRzZXQuVGFibGVMaWtlLkZpeGVkTGFiZWwgPiAuQWdlbnRJVFNNV29ya09yZGVyVGVtcGxhdGUsCmZpZWxkc2V0LlRhYmxlTGlrZS5GaXhlZExhYmVsID4gLlJvdyA+IC5BZ2VudElUU01Xb3JrT3JkZXJUZW1wbGF0ZSwKZmllbGRzZXQuVGFibGVMaWtlLkZpeGVkTGFiZWwgPiAuVmFsdWUsCmZpZWxkc2V0LlRhYmxlTGlrZS5GaXhlZExhYmVsID4gLlJvdyA+IC5WYWx1ZSB7CiAgICBtYXJnaW4tbGVmdDogMSU7CiAgICBtYXJnaW4tcmlnaHQ6IDA7CiAgICBwYWRkaW5nLWxlZnQ6IDE3cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAwOwp9CgpmaWVsZHNldC5UYWJsZUxpa2UuRml4ZWRMYWJlbCA+IC5BZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQsCmZpZWxkc2V0LlRhYmxlTGlrZS5GaXhlZExhYmVsID4gLlJvdyA+IC5BZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQsCmZpZWxkc2V0LlRhYmxlTGlrZS5GaXhlZExhYmVsID4gLlZhbHVlLApmaWVsZHNldC5UYWJsZUxpa2UuRml4ZWRMYWJlbCA+IC5Sb3cgPiAuVmFsdWUgewogICAgbWFyZ2luLWxlZnQ6IDUlOwogICAgbWFyZ2luLXJpZ2h0OiAwOwogICAgcGFkZGluZy1sZWZ0OiAxN3B4OwogICAgcGFkZGluZy1yaWdodDogMDsKfQoKfS8qIGVuZCBtZWRpYSAqLwoKCg==
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgRGVmYXVsdCBTZXR0aW5ncwogKi8KCkBtZWRpYSBzY3JlZW4scHJvamVjdGlvbix0dixoYW5kaGVsZCB7CgovKioKICogQHN1YnNlY3Rpb24gIEZsYWcKICovCgpmaWVsZHNldC5UYWJsZUxpa2UgZGl2LlZhbHVlIC5GbGFnIHsKICAgIGZsb2F0OiBsZWZ0OwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICBtYXJnaW4tdG9wOiAzcHg7Cn0KCiNTZXJ2aWNlSW5jaWRlbnRTdGF0ZUNvbnRhaW5lciAuRmxhZywKLlNpZGViYXJDb2x1bW4gZmllbGRzZXQuVGFibGVMaWtlIGRpdi5WYWx1ZSAuRmxhZyB7CiAgICBtYXJnaW4tdG9wOiA3cHg7Cn0KCnVsLklUU01GbGFnIHsKICAgIG1hcmdpbi10b3A6IDVweDsKfQoKdWwuSVRTTUZsYWcgZGl2LlZhbHVlIC5GbGFnIHsKICAgIGZsb2F0OiBsZWZ0OwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICBtYXJnaW4tdG9wOiAzcHg7Cn0KCi5SVEwgZmllbGRzZXQuVGFibGVMaWtlIGRpdi5WYWx1ZSAuRmxhZyB7CiAgICBmbG9hdDogcmlnaHQ7CiAgICBtYXJnaW4tbGVmdDogNXB4Owp9CgouRmxhZyBzcGFuLmdyYXlsZWQgewogICAgYmFja2dyb3VuZC1jb2xvcjojY2RjZGNkOwp9CgouRmxhZyBzcGFuLmdyZWVubGVkIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICM4YmVmNGQ7Cn0KCi5GbGFnIHNwYW4ueWVsbG93bGVkIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmRkNTA7Cn0KCi5GbGFnIHNwYW4ucmVkbGVkIHsKICAgIGJhY2tncm91bmQtY29sb3I6I2ZmNTA1ZTsKfQoKLkZsYWcgc3Bhbi5wdXJwbGVsZWQgewogICAgYmFja2dyb3VuZC1jb2xvcjojYjIzYWVlOwp9CgouRmxhZyBzcGFuLm9yYW5nZWxlZCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmZjhjMDA7Cn0KCi5GbGFnIHNwYW4uY3lhbmxlZCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiM3OWNkY2Q7Cn0KCi5GbGFnIHNwYW4ud2hpdGVsZWQgewogICAgYmFja2dyb3VuZC1jb2xvcjojZmZmZmZmOwp9CgouRmxhZyBzcGFuLmJsYWNrbGVkIHsKICAgIGJhY2tncm91bmQtY29sb3I6IzAwMDAwMDsKfQoKLyoqCiAqIEBub3RlICAgICBUaGVzZSBjbGFzc2VzIGFyZSB1c2VkIGZvciBhIExhYmVsIGFuZCBhIERpdiB3aXRoIGNsYXNzICdGaWVsZCcsCiAqICAgICAgICAgICB0aGF0IGFyZSBpbnNpZGUgYSBGaWVsZCBEaXYgLgogKi8KCmxhYmVsLlN1YkVsZW1lbnQgewogICAgd2lkdGg6IDIwJSAhaW1wb3J0YW50OwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4Owp9CgpkaXYuU3ViRWxlbWVudCB7CiAgICBtYXJnaW4tbGVmdDogNDAlICFpbXBvcnRhbnQ7Cn0KCmRpdi5TdWJFbGVtZW50IGlucHV0Llc1MHBjIHsKICAgIHdpZHRoOiAzMyU7Cn0KCi8qKgogKiBAc3Vic2VjdGlvbiBOb0RvdWJsZUJvcmRlcnMKICovCgouQ29udGVudC5Ob0RvdWJsZUJvcmRlcnMgewogICAgYm9yZGVyLWxlZnQ6IDAgbm9uZSAjMDAwMDAwOwogICAgYm9yZGVyLXJpZ2h0OiAwIG5vbmUgIzAwMDAwMDsKfQoKLyoqCiAqIEBzdWJzZWN0aW9uICBTdGFuZGFyZCBXaWR0aHMKICovCi5XNXBjIHsKICAgIHdpZHRoOiA1JTsKfQoKLlcxNXBjIHsKICAgIHdpZHRoOiAxNSU7Cn0KCi5XMzBwYyB7CiAgICB3aWR0aDogMzAlOwp9CgpmaWVsZHNldC5UYWJsZUxpa2UuQWdlbnRJVFNNQ2hhbmdlQWRkT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuVGFibGVMaWtlLkFnZW50SVRTTUNoYW5nZUFkZE9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIG1hcmdpbi1sZWZ0OiAzNjBweDsKfQoKZmllbGRzZXQuVGFibGVMaWtlLkFnZW50SVRTTVdvcmtvcmRlckFkZE9GT1JLID4gLkZpZWxkLApmaWVsZHNldC5UYWJsZUxpa2UuQWdlbnRJVFNNV29ya29yZGVyQWRkT0ZPUksgPiAuUm93ID4gLkZpZWxkLApmaWVsZHNldC5UYWJsZUxpa2UuQWdlbnRJVFNNV29ya29yZGVyQWRkT0ZPUksgPiAuVmFsdWUsCmZpZWxkc2V0LlRhYmxlTGlrZS5BZ2VudElUU01Xb3Jrb3JkZXJBZGRPRk9SSyA+IC5Sb3cgPiAuVmFsdWUgewogICAgbWFyZ2luLWxlZnQ6IDEyMHB4OwogICAgbWFyZ2luLXJpZ2h0OiA3cHg7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cn0KCi5XNzVwY0FnZW50SVRTTVNlcnZpY2VPRk9SSyB7CiAgICB3aWR0aDogMTAwJTsKfQoKLlc3NXBjQWdlbnRJVFNNU0xBT0ZPUksgewogICAgd2lkdGg6IDEwMCU7Cn0KCmZpZWxkc2V0LlRhYmxlTGlrZS5BZ2VudElUU01DaGFuZ2VBZGRPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5UYWJsZUxpa2UuQWdlbnRJVFNNQ2hhbmdlQWRkT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgbWFyZ2luLWxlZnQ6IDM2MHB4Owp9CgpmaWVsZHNldC5UYWJsZUxpa2UuQWdlbnRJVFNNV29ya29yZGVyQWRkT0ZPUksgPiAuRmllbGQsCmZpZWxkc2V0LlRhYmxlTGlrZS5BZ2VudElUU01Xb3Jrb3JkZXJBZGRPRk9SSyA+IC5Sb3cgPiAuRmllbGQsCmZpZWxkc2V0LlRhYmxlTGlrZS5BZ2VudElUU01Xb3Jrb3JkZXJBZGRPRk9SSyA+IC5WYWx1ZSwKZmllbGRzZXQuVGFibGVMaWtlLkFnZW50SVRTTVdvcmtvcmRlckFkZE9GT1JLID4gLlJvdyA+IC5WYWx1ZSB7CiAgICBtYXJnaW4tbGVmdDogMTIwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDdweDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdE9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXRPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDM1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNQ29uZmlnSXRlbU92ZXJ2aWV3TmF2QmFyT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWdlbnRJVFNNQ29uZmlnSXRlbU92ZXJ2aWV3TmF2QmFyT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAzNSU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjOTI5MjkyOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDEwN3B4OwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtPcmRlclRlbXBsYXRlT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWdlbnRJVFNNV29ya09yZGVyVGVtcGxhdGVPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDM1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNQ2hhbmdlT3ZlcnZpZXdOYXZCYXJPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01DaGFuZ2VPdmVydmlld05hdkJhck9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMzUlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIzkyOTI5MjsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZ2VudElUU01Xb3JrT3JkZXJBZ2VudE9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtPcmRlckFnZW50T0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAzNSU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjOTI5MjkyOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtPcmRlclJlcG9ydE9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtPcmRlclJlcG9ydE9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMzUlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIzkyOTI5MjsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZ2VudElUU01Xb3JrT3JkZXJEZWxldGVPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01Xb3JrT3JkZXJEZWxldGVPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDM1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNQ2hhbmdlVGltZVNsb3RPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01DaGFuZ2VUaW1lU2xvdE9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMzUlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIzkyOTI5MjsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZ2VudElUU01Xb3Jrb3JkZXJBZGRGcm9tVGVtcGxhdGVPRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01Xb3Jrb3JkZXJBZGRGcm9tVGVtcGxhdGVPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDEwJTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNQ2hhbmdlQWRkRnJvbVRlbXBsYXRlT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWdlbnRJVFNNQ2hhbmdlQWRkRnJvbVRlbXBsYXRlT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAzNSU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjOTI5MjkyOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDdweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNQ2hhbmdlU2VhcmNoT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWdlbnRJVFNNQ2hhbmdlU2VhcmNoT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAyMCU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjOTI5MjkyOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDEwMHB4OwogICAgbWFyZ2luLXJpZ2h0OiA3cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtvcmRlckluZm9ybWF0aW9uQm94T0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWdlbnRJVFNNV29ya29yZGVySW5mb3JtYXRpb25Cb3hPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDM1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNVGVtcGxhdGVFZGl0T0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWdlbnRJVFNNVGVtcGxhdGVFZGl0T0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAzNSU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjOTI5MjkyOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZVRlbXBsYXRlT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWdlbnRJVFNNQ2hhbmdlVGVtcGxhdGVPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDM1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWRtaW5JVFNNQ2hhbmdlTm90aWZpY2F0aW9uT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWRtaW5JVFNNQ2hhbmdlTm90aWZpY2F0aW9uT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAxMCU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjOTI5MjkyOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDMwNnB4OwogICAgbWFyZ2luLXJpZ2h0OiA4cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTUNvbmZpZ0l0ZW1CdWxrT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWdlbnRJVFNNQ29uZmlnSXRlbUJ1bGtPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDEwJTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMzA2cHg7CiAgICBtYXJnaW4tcmlnaHQ6IDhweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50T0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50T0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAxMCU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjOTI5MjkyOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDE1MHB4OwogICAgbWFyZ2luLXJpZ2h0OiA4cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudExhbmd1YWdlT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50TGFuZ3VhZ2VPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDEwJTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMzA2cHg7CiAgICBtYXJnaW4tcmlnaHQ6IDhweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWRtaW5Ob3RpZmljYXRpb25FdmVudE9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFkbWluTm90aWZpY2F0aW9uRXZlbnRPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDEwJTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMTUwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDhweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWRtaW5Ob3RpZmljYXRpb25FdmVudExhbmd1YWdlT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWRtaW5Ob3RpZmljYXRpb25FdmVudExhbmd1YWdlT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAxMCU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjOTI5MjkyOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDMwNnB4OwogICAgbWFyZ2luLXJpZ2h0OiA4cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZUludm9sdmVkUGVyc29uc09GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZUludm9sdmVkUGVyc29uc09GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMzUlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIzkyOTI5MjsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZ2VudElUU01Xb3Jrb3JkZXJBZGRJbmZvcm1hdGlvbk9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtvcmRlckFkZEluZm9ybWF0aW9uT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAzNSU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjOTI5MjkyOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtvcmRlclpvb21JbmZvcm1hdGlvbk9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtvcmRlclpvb21JbmZvcm1hdGlvbk9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMzUlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIzkyOTI5MjsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiA1cHg7CiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZVpvb21JbmZvcm1hdGlvbk9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZVpvb21JbmZvcm1hdGlvbk9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMzUlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIzkyOTI5MjsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiA1cHg7CiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LkFnZW50SVRTTVdvcmtvcmRlclpvb21PRk9SSyA+IGxhYmVsLApmaWVsZHNldC5BZ2VudElUU01Xb3Jrb3JkZXJab29tT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAzNSU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjOTI5MjkyOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDMwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDdweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNQ2hhbmdlWm9vbU9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZVpvb21PRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDQ1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMzBweDsKICAgIG1hcmdpbi1yaWdodDogN3B4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZ2VudElUU01Db25maWdJdGVtWm9vbU9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tT0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAzNSU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjOTI5MjkyOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDFweDsKICAgIG1hcmdpbi1yaWdodDogN3B4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZ2VudElUU01Db25maWdJdGVtU2VhcmNoT0ZPUksgPiBsYWJlbCwKZmllbGRzZXQuQWdlbnRJVFNNQ29uZmlnSXRlbVNlYXJjaE9GT1JLID4gLlJvdyA+IGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGxlZnQ7CiAgICBsaW5lLWhlaWdodDogMS43ZW07CiAgICB3aWR0aDogMTUlOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBjb2xvcjogIzkyOTI5MjsKICAgIG1pbi1oZWlnaHQ6IDE3cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDNweCAwcHggMXB4IDJweDsKICAgIG1hcmdpbi1sZWZ0OiAxNTBweDsKICAgIG1hcmdpbi1yaWdodDogN3B4OwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5BZ2VudElUU01Db25maWdJdGVtRWRpdE9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0T0ZPUksgPiAuUm93ID4gbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogbGVmdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjdlbTsKICAgIHdpZHRoOiAxMCU7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjOTI5MjkyOwogICAgbWluLWhlaWdodDogMTdweDsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgcGFkZGluZzogM3B4IDBweCAxcHggMnB4OwogICAgbWFyZ2luLWxlZnQ6IDM2N3B4OwogICAgbWFyZ2luLXJpZ2h0OiA3cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KCmZpZWxkc2V0LlRhYmxlTGlrZSA+IC5BZG1pbklUU01Db25maWdJdGVtQWRkU29mdHdhcmUsCmZpZWxkc2V0LlRhYmxlTGlrZSA+IC5Sb3cgPiAuQWRtaW5JVFNNQ29uZmlnSXRlbUFkZFNvZnR3YXJlIHsKICAgIGxpbmUtaGVpZ2h0OiAxLjllbTsKICAgIG1hcmdpbi1sZWZ0OiAxNy40JTsKICAgIG1hcmdpbi1yaWdodDogMDsKICAgIHBhZGRpbmctdG9wOiAzcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogM3B4OwogICAgcGFkZGluZy1sZWZ0OiAxMHB4OwogICAgcGFkZGluZy1yaWdodDogMHB4OwogICAgbWluLWhlaWdodDogMjBweDsKfQoKZmllbGRzZXQuQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdE9GT1JLID4gbGFiZWwsCmZpZWxkc2V0LkFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXRPRk9SSyA+IC5Sb3cgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZsb2F0OiBsZWZ0OwogICAgbGluZS1oZWlnaHQ6IDEuN2VtOwogICAgd2lkdGg6IDM1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM5MjkyOTI7CiAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggMHB4IDFweCAycHg7CiAgICBtYXJnaW4tbGVmdDogMyU7CiAgICBtYXJnaW4tcmlnaHQ6IDElOwogICAgbWFyZ2luLXRvcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4Owp9CgpmaWVsZHNldC5UYWJsZUxpa2UuRml4ZWRMYWJlbCA+IC5BZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQsCmZpZWxkc2V0LlRhYmxlTGlrZS5GaXhlZExhYmVsID4gLlJvdyA+IC5BZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQsCmZpZWxkc2V0LlRhYmxlTGlrZS5GaXhlZExhYmVsID4gLlZhbHVlLApmaWVsZHNldC5UYWJsZUxpa2UuRml4ZWRMYWJlbCA+IC5Sb3cgPiAuVmFsdWUgewogICAgbWFyZ2luLWxlZnQ6IDUlOwogICAgbWFyZ2luLXJpZ2h0OiAwOwogICAgcGFkZGluZy1sZWZ0OiAxN3B4OwogICAgcGFkZGluZy1yaWdodDogMDsKfQoKZmllbGRzZXQuVGFibGVMaWtlLkZpeGVkTGFiZWwgPiAuQWdlbnRJVFNNV29ya09yZGVyVGVtcGxhdGUsCmZpZWxkc2V0LlRhYmxlTGlrZS5GaXhlZExhYmVsID4gLlJvdyA+IC5BZ2VudElUU01Xb3JrT3JkZXJUZW1wbGF0ZSwKZmllbGRzZXQuVGFibGVMaWtlLkZpeGVkTGFiZWwgPiAuVmFsdWUsCmZpZWxkc2V0LlRhYmxlTGlrZS5GaXhlZExhYmVsID4gLlJvdyA+IC5WYWx1ZSB7CiAgICBtYXJnaW4tbGVmdDogMSU7CiAgICBtYXJnaW4tcmlnaHQ6IDA7CiAgICBwYWRkaW5nLWxlZnQ6IDE3cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAwOwp9Cgp9LyogZW5kIG1lZGlhICovCgoK
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgSVRTTURldGFpbHMKICovCgpAbWVkaWEgc2NyZWVuLHByb2plY3Rpb24sdHYsaGFuZGhlbGQgewoKLyoqCiAqIEBzdWJzZWN0aW9uICBIZWFkbGluZQogKi8KCi8qKgogKiBAc3Vic2VjdGlvbiAgSVRTTSB0cmVlCiAqLwojSVRTTVRyZWUgewogICAgbWFyZ2luLXRvcDogMjBweDsKfQoKCi8qKgogKiBAc3Vic2VjdGlvbiAgSVRTTSB0YWJsZSBib2R5CiAqLwojSVRTTVRhYmxlQm9keSB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKfQoKI0lUU01UYWJsZUJvZHkgLlNjcm9sbGVyIHsKICAgIGhlaWdodDogMTQwcHg7CiAgICBvdmVyZmxvdy15OiBzY3JvbGw7Cn0KCi8qKgogKiBAc3Vic2VjdGlvbiAgQ29udHJvbFJvdyBJY29ucwogKi8KCgouSVRTTUl0ZW1WaWV3IHsKICAgIGZsb2F0OiByaWdodDsKfQoKLlJUTCAuSVRTTUl0ZW1WaWV3IHsKICAgIGZsb2F0OiBsZWZ0Owp9CgoKLkNvbnRyb2xSb3cgLklUU01JdGVtVmlldy5JY29ucyAuT25lSVRTTUl0ZW0uQWN0aXZlIHNwYW4sCi5Db250cm9sUm93IC5JVFNNSXRlbVZpZXcuSWNvbnMgLk9uZUlUU01JdGVtLkFjdGl2ZTpob3ZlciBzcGFuIHsKICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IDA7Cn0KCi5Db250cm9sUm93IC5JVFNNSXRlbVZpZXcuSWNvbnMgLkFsbElUU01JdGVtcyBzcGFuLAouQ29udHJvbFJvdyAuSVRTTUl0ZW1WaWV3Lkljb25zIC5BbGxJVFNNSXRlbXM6aG92ZXIgc3BhbiB7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNnB4Owp9CgouQ29udHJvbFJvdyAuSVRTTUl0ZW1WaWV3Lkljb25zIC5BbGxJVFNNSXRlbXMuQWN0aXZlIHNwYW4sCi5Db250cm9sUm93IC5JVFNNSXRlbVZpZXcuSWNvbnMgLkFsbElUU01JdGVtcy5BY3RpdmU6aG92ZXIgc3BhbiB7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTZweDsKfQoKLkNvbnRyb2xSb3cgLklUU01GaWx0ZXIuSWNvbnMgLkFjdGl2ZSBzcGFuIHsKICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTE2cHg7Cn0KCi8qKgogKiBAc3Vic2VjdGlvbiAgSXRlbVJvdwogKiBAbm90ZSAgICAgICAgY29udGFpbnMgcmFuZG9tIGl0ZW1zIGFuZCBpcyBwb3NpdGlvbmVkIGluIHRoZSBzaWRlYmFyCiAqLwoKLkl0ZW1Sb3cgewogICAgbWFyZ2luLWxlZnQ6IDQwJTsKfQoKLlJUTCAuSXRlbVJvdyB7CiAgICBtYXJnaW4tbGVmdDogMDsKICAgIG1hcmdpbi1yaWdodDogNDAlOwp9CgouSXRlbVJvdyBsaSB7CiAgICBwYWRkaW5nOiAzcHggMCA1cHggOHB4Owp9CgouUlRMIC5JdGVtUm93IGxpIHsKICAgIHBhZGRpbmc6IDNweCA4cHggNXB4IDA7Cn0KCi5JdGVtUm93IGEgewogICAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgICBjb2xvcjogIzAwMDsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgouSXRlbVJvdyBhOmhvdmVyIHsKICAgIGNvbG9yOiAjNjY2Owp9Cgp9IC8qIGVuZCBAbWVkaWEgKi8=
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgU2VhcmNoCiAqLwoKQG1lZGlhIHNjcmVlbixwcm9qZWN0aW9uLHR2LGhhbmRoZWxkIHsKCgovKioKICogQHN1YnNlY3Rpb24gIEF1dG9Db21wbGV0ZQogKi8KCi51aS1hdXRvY29tcGxldGUgewogICAgei1pbmRleDogMTAwMDAwICFpbXBvcnRhbnQ7Cn0KCn0K
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgQ1NTIGZvciBwcmludGluZwogKi8KCkBtZWRpYSBwcmludCB7CgoKI0lUU01UYWJsZSB7CiAgICBkaXNwbGF5OiBub25lOwp9Cgp9IC8qIGVuZCBAbWVkaWEgKi8=
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgVGFibGVzCiAqLwoKQG1lZGlhIHNjcmVlbixwcm9qZWN0aW9uLHR2LGhhbmRoZWxkIHsKCi8qKgogKiBAc3Vic2VjdGlvbiAgT3ZlcnZpZXcgU21hbGwgVmlldyBUYWJsZQogKi8KCi5UYWJsZVNtYWxsIHRoZWFkLklUU01IZWFkZXIgc3BhbiB7CiAgICBjb2xvcjogIzRBNEE0QTsKfQoKLyoqCiAqIEBzdWJzZWN0aW9uICB0YWJsZSBlbGVtZW50cyB3aXRob3V0IGhpZ2hsaWdodAogKi8KCi5EYXRhVGFibGVOb0hpZ2hsaWdodCB0Ym9keSB0ciB0ZCB7CiAgICBoZWlnaHQ6IDMwcHg7Cn0KCi5EYXRhVGFibGVOb0hpZ2hsaWdodCB0Ym9keSB0ciB0ZCBpbnB1dCwKLkRhdGFUYWJsZU5vSGlnaGxpZ2h0IHRib2R5IHRyIHRkIHNlbGVjdHsKICAgIHdpZHRoOiA4NSU7Cn0KCi5EYXRhVGFibGVOb0hpZ2hsaWdodCB0Ym9keSB0cjpob3ZlciB0ZCB7CiAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgLW1vei1ib3gtc2hhZG93OiBub25lOwogICAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lOwogICAgYm94LXNoYWRvdzogbm9uZTsKfQouRGF0YVRhYmxlTm9IaWdobGlnaHQgdHIuRXZlbjpob3ZlciB0ZCwKLkRhdGFUYWJsZU5vSGlnaGxpZ2h0IHRyLkV2ZW46aG92ZXIuTGFzdCB0ZCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjVGNUY1Owp9CgouRGF0YVRhYmxlTm9IaWdobGlnaHQgdGJvZHkgdHIuTGFzdDpob3ZlciB0ZCB7CiAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgLW1vei1ib3gtc2hhZG93OiBub25lOwogICAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lOwogICAgYm94LXNoYWRvdzogbm9uZTsKfQoKfQ==
IyAtLQojIHZhci9wYWNrYWdlc2V0dXAvSVRTTUNvcmUucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgLS0KIyAkSWQ6IElUU01Db3JlLnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjEzOjUyIHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpJVFNNQ29yZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Ok91dHB1dDo6VGVtcGxhdGU6OlByb3ZpZGVyOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnLAopOwoKPWhlYWQxIE5BTUUKCnZhcjo6cGFja2FnZXNldHVwOjpJVFNNQ29yZSAtIGNvZGUgdG8gZXhlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9Y3V0Cgo9aGVhZDIgbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRDb2RlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgndmFyOjpwYWNrYWdlc2V0dXA6OklUU01Db3JlJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgRm9yY2UgYSByZWxvYWQgb2YgWlpaQXV0by5wbSBhbmQgWlpaQUF1dG8ucG0gdG8gZ2V0IHRoZSBmcmVzaCBjb25maWd1cmF0aW9uIHZhbHVlcy4KICAgIGZvciBteSAkTW9kdWxlICggc29ydCBrZXlzICVJTkMgKSB7CiAgICAgICAgaWYgKCAkTW9kdWxlID1+IG0vWlpaQUE/dXRvXC5wbSQvICkgewogICAgICAgICAgICBkZWxldGUgJElOQ3skTW9kdWxlfTsKICAgICAgICB9CiAgICB9CgogICAgIyBDcmVhdGUgY29tbW9uIG9iamVjdHMgd2l0aCBmcmVzaCBkZWZhdWx0IGNvbmZpZy4KICAgICRLZXJuZWw6Ok9NLT5PYmplY3RzRGlzY2FyZCgpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIENvZGVJbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVJbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZUluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNyZWF0ZSBkeW5hbWljIGZpZWxkcyBmb3IgSVRTTUNvcmUKICAgICRTZWxmLT5fQ3JlYXRlSVRTTUR5bmFtaWNGaWVsZHMoKTsKCiAgICAjIHNldCBkZWZhdWx0IENJUCBtYXRyaXgKICAgICRTZWxmLT5fQ0lQRGVmYXVsdE1hdHJpeFNldCgpOwoKICAgICMgYWRkIHRoZSBncm91cCBpdHNtLXNlcnZpY2UKICAgICRTZWxmLT5fR3JvdXBBZGQoCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ2l0c20tc2VydmljZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0dyb3VwIGZvciBJVFNNIFNlcnZpY2UgbWFzayBhY2Nlc3MgaW4gdGhlIGFnZW50IGludGVyZmFjZS4nLAogICAgKTsKCiAgICAjIGZpbGwgdXAgZW1wdHkgdHlwZV9pZCByb3dzIGluIHNlcnZpY2UgdGFibGUKICAgICRTZWxmLT5fRmlsbHVwRW1wdHlTZXJ2aWNlVHlwZUlEKCk7CgogICAgIyBmaWxsIHVwIGVtcHR5IGNyaXRpY2FsaXR5IHJvd3MgaW4gc2VydmljZSB0YWJsZQogICAgJFNlbGYtPl9GaWxsdXBFbXB0eVNlcnZpY2VDcml0aWNhbGl0eSgpOwoKICAgICMgZmlsbCB1cCBlbXB0eSB0eXBlX2lkIHJvd3MgaW4gc2xhIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5U0xBVHlwZUlEKCk7CgogICAgIyBzZXQgcHJlZmVyZW5jZXMgZm9yIHNvbWUgR2VuZXJhbENhdGFsb2cgZW50cmllcwogICAgIyB0aGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGluIENvZGVJbnN0YWxsCiAgICAjIChGb3IgVXBncmFkZXMgdGhpcyBpcyBkb25lIGFscmVhZHkgaW4gdGhlIEdlbmVyYWxDYXRhbG9nIHBhY2thZ2UpCiAgICAkU2VsZi0+X1NldFByZWZlcmVuY2VzKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDb2RlUmVpbnN0YWxsKCkKCnJ1biB0aGUgY29kZSByZWluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVJlaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVSZWluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNldCBkZWZhdWx0IENJUCBtYXRyaXgKICAgICRTZWxmLT5fQ0lQRGVmYXVsdE1hdHJpeFNldCgpOwoKICAgICMgYWRkIHRoZSBncm91cCBpdHNtLXNlcnZpY2UKICAgICRTZWxmLT5fR3JvdXBBZGQoCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ2l0c20tc2VydmljZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0dyb3VwIGZvciBJVFNNIFNlcnZpY2UgbWFzayBhY2Nlc3MgaW4gdGhlIGFnZW50IGludGVyZmFjZS4nLAogICAgKTsKCiAgICAjIGZpbGwgdXAgZW1wdHkgdHlwZV9pZCByb3dzIGluIHNlcnZpY2UgdGFibGUKICAgICRTZWxmLT5fRmlsbHVwRW1wdHlTZXJ2aWNlVHlwZUlEKCk7CgogICAgIyBmaWxsIHVwIGVtcHR5IGNyaXRpY2FsaXR5IHJvd3MgaW4gc2VydmljZSB0YWJsZQogICAgJFNlbGYtPl9GaWxsdXBFbXB0eVNlcnZpY2VDcml0aWNhbGl0eSgpOwoKICAgICMgZmlsbCB1cCBlbXB0eSB0eXBlX2lkIHJvd3MgaW4gc2xhIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5U0xBVHlwZUlEKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDb2RlVXBncmFkZUZyb21Mb3dlclRoYW5fM18yXzkxKCkKClRoaXMgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCBpZiB0aGUgaW5zdGFsbGVkIG1vZHVsZSB2ZXJzaW9uIGlzIHNtYWxsZXIgdGhhbiAzLjIuOTEgKDMuMy4wIEJldGEgMSkuCgpteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlRnJvbUxvd2VyVGhhbl8zXzJfOTEoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZUZyb21Mb3dlclRoYW5fM18yXzkxIHsgICAgIyMgbm8gY3JpdGljCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbWlncmF0ZSB0aGUgdmFsdWVzIGZvciBDcml0aWNhbGl0eSBhbmQgdGhlIEltcGFjdCBmcm9tIEdlbmVyYWxDYXRhbG9nIHRvIER5bmFtaWNGaWVsZHMKICAgICRTZWxmLT5fTWlncmF0ZUNyaXRpY2FsaXR5QW5kSW1wYWN0VG9EeW5hbWljRmllbGRzKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDb2RlVXBncmFkZUZyb21Mb3dlclRoYW5fNF8wXzIoKQoKVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIGlmIHRoZSBpbnN0YWxsZWQgbW9kdWxlIHZlcnNpb24gaXMgc21hbGxlciB0aGFuIDQuMC4yLgoKbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVXBncmFkZUZyb21Mb3dlclRoYW5fNF8wXzIoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZUZyb21Mb3dlclRoYW5fNF8wXzIgeyAgICAjIyBubyBjcml0aWMKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBtaWdyYXRlIHRoZSBEVEwgQ29udGVudCBpbiB0aGUgU3lzQ29uZmlnCiAgICAkU2VsZi0+X01pZ3JhdGVEVExJblN5c0NvbmZpZygpOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzRfMF85MSgpCgpUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgaWYgdGhlIGluc3RhbGxlZCBtb2R1bGUgdmVyc2lvbiBpcyBzbWFsbGVyIHRoYW4gNC4wLjkxLgoKbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVXBncmFkZUZyb21Mb3dlclRoYW5fNF8wXzkxKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzRfMF85MSB7ICAgICMjIG5vIGNyaXRpYwogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoYW5nZSBjb25maWd1cmF0aW9ucyB0byBtYXRjaCB0aGUgbmV3IG1vZHVsZSBsb2NhdGlvbi4KICAgICRTZWxmLT5fTWlncmF0ZUNvbmZpZ3MoKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIENvZGVVcGdyYWRlKCkKCnJ1biB0aGUgY29kZSB1cGdyYWRlIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNldCBkZWZhdWx0IENJUCBtYXRyaXgKICAgICRTZWxmLT5fQ0lQRGVmYXVsdE1hdHJpeFNldCgpOwoKICAgICMgZmlsbCB1cCBlbXB0eSB0eXBlX2lkIHJvd3MgaW4gc2VydmljZSB0YWJsZQogICAgJFNlbGYtPl9GaWxsdXBFbXB0eVNlcnZpY2VUeXBlSUQoKTsKCiAgICAjIGZpbGwgdXAgZW1wdHkgY3JpdGljYWxpdHkgcm93cyBpbiBzZXJ2aWNlIHRhYmxlCiAgICAkU2VsZi0+X0ZpbGx1cEVtcHR5U2VydmljZUNyaXRpY2FsaXR5KCk7CgogICAgIyBmaWxsIHVwIGVtcHR5IHR5cGVfaWQgcm93cyBpbiBzbGEgdGFibGUKICAgICRTZWxmLT5fRmlsbHVwRW1wdHlTTEFUeXBlSUQoKTsKCiAgICAjIG1ha2UgZHluYW1pYyBmaWVsZHMgaW50ZXJuYWwKICAgICRTZWxmLT5fTWFrZUR5bmFtaWNGaWVsZHNJbnRlcm5hbCgpOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ29kZVVuaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgdW5pbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWFjdGl2YXRlIHRoZSBncm91cCBpdHNtLXNlcnZpY2UKICAgICRTZWxmLT5fR3JvdXBEZWFjdGl2YXRlKAogICAgICAgIE5hbWUgPT4gJ2l0c20tc2VydmljZScsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgX0dldElUU01EeW5hbWljRmllbGRzRGVmaW5pdGlvbigpCgpyZXR1cm5zIHRoZSBkZWZpbml0aW9uIGZvciBJVFNNQ29yZSByZWxhdGVkIGR5bmFtaWMgZmllbGRzCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fR2V0SVRTTUR5bmFtaWNGaWVsZHNEZWZpbml0aW9uKCk7Cgo9Y3V0CgpzdWIgX0dldElUU01EeW5hbWljRmllbGRzRGVmaW5pdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZGVmaW5lIGFsbCBkeW5hbWljIGZpZWxkcyBmb3IgSVRTTUNvcmUKICAgIG15IEBEeW5hbWljRmllbGRzID0gKAogICAgICAgIHsKICAgICAgICAgICAgT2xkTmFtZSAgICA9PiAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0lUU01Dcml0aWNhbGl0eScsCiAgICAgICAgICAgIExhYmVsICAgICAgPT4gJ0NyaXRpY2FsaXR5JywKICAgICAgICAgICAgRmllbGRUeXBlICA9PiAnRHJvcGRvd24nLAogICAgICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZSAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0YWJsZVZhbHVlcyA9PiAxLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICcxIHZlcnkgbG93JyAgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICAgICAgICAgICcyIGxvdycgICAgICAgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgICAgICAnMyBub3JtYWwnICAgID0+ICczIG5vcm1hbCcsCiAgICAgICAgICAgICAgICAgICAgJzQgaGlnaCcgICAgICA9PiAnNCBoaWdoJywKICAgICAgICAgICAgICAgICAgICAnNSB2ZXJ5IGhpZ2gnID0+ICc1IHZlcnkgaGlnaCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBPbGROYW1lICAgID0+ICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnSVRTTUltcGFjdCcsCiAgICAgICAgICAgIExhYmVsICAgICAgPT4gJ0ltcGFjdCcsCiAgICAgICAgICAgIEZpZWxkVHlwZSAgPT4gJ0Ryb3Bkb3duJywKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWUgICAgICAgPT4gJzMgbm9ybWFsJywKICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0YWJsZVZhbHVlcyA9PiAxLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICcxIHZlcnkgbG93JyAgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICAgICAgICAgICcyIGxvdycgICAgICAgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgICAgICAnMyBub3JtYWwnICAgID0+ICczIG5vcm1hbCcsCiAgICAgICAgICAgICAgICAgICAgJzQgaGlnaCcgICAgICA9PiAnNCBoaWdoJywKICAgICAgICAgICAgICAgICAgICAnNSB2ZXJ5IGhpZ2gnID0+ICc1IHZlcnkgaGlnaCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiBARHluYW1pY0ZpZWxkczsKfQoKPWhlYWQyIF9DcmVhdGVJVFNNRHluYW1pY0ZpZWxkcygpCgpjcmVhdGVzIGFsbCBkeW5hbWljIGZpZWxkcyB0aGF0IGFyZSBuZWNlc3NhcnkgZm9yIElUU01Db3JlCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fQ3JlYXRlSVRTTUR5bmFtaWNGaWVsZHMoKTsKCj1jdXQKCnN1YiBfQ3JlYXRlSVRTTUR5bmFtaWNGaWVsZHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVmFsaWRJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExvb2t1cCgKICAgICAgICBWYWxpZCA9PiAndmFsaWQnLAogICAgKTsKCiAgICAjIGdldCBhbGwgY3VycmVudCBkeW5hbWljIGZpZWxkcwogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgIyBnZXQgdGhlIGxpc3Qgb2Ygb3JkZXIgbnVtYmVycyAoaXMgYWxyZWFkeSBzb3J0ZWQpLgogICAgbXkgQER5bmFtaWNmaWVsZE9yZGVyTGlzdDsKICAgIGZvciBteSAkRHluYW1pY2ZpZWxkICggQHskRHluYW1pY0ZpZWxkTGlzdH0gKSB7CiAgICAgICAgcHVzaCBARHluYW1pY2ZpZWxkT3JkZXJMaXN0LCAkRHluYW1pY2ZpZWxkLT57RmllbGRPcmRlcn07CiAgICB9CgogICAgIyBnZXQgdGhlIGxhc3QgZWxlbWVudCBmcm9tIHRoZSBvcmRlciBsaXN0IGFuZCBhZGQgMQogICAgbXkgJE5leHRPcmRlck51bWJlciA9IDE7CiAgICBpZiAoQER5bmFtaWNmaWVsZE9yZGVyTGlzdCkgewogICAgICAgICROZXh0T3JkZXJOdW1iZXIgPSAkRHluYW1pY2ZpZWxkT3JkZXJMaXN0Wy0xXSArIDE7CiAgICB9CgogICAgIyBnZXQgdGhlIGRlZmluaXRpb24gZm9yIGFsbCBkeW5hbWljIGZpZWxkcyBmb3IgSVRTTQogICAgbXkgQER5bmFtaWNGaWVsZHMgPSAkU2VsZi0+X0dldElUU01EeW5hbWljRmllbGRzRGVmaW5pdGlvbigpOwoKICAgICMgY3JlYXRlIGEgZHluYW1pYyBmaWVsZHMgbG9va3VwIHRhYmxlCiAgICBteSAlRHluYW1pY0ZpZWxkTG9va3VwOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBAeyREeW5hbWljRmllbGRMaXN0fSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiByZWYgJER5bmFtaWNGaWVsZCBuZSAnSEFTSCc7CiAgICAgICAgJER5bmFtaWNGaWVsZExvb2t1cHsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkOwogICAgfQoKICAgICMgY3JlYXRlIG9yIHVwZGF0ZSBkeW5hbWljIGZpZWxkcwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKEBEeW5hbWljRmllbGRzKSB7CgogICAgICAgIG15ICRDcmVhdGVEeW5hbWljRmllbGQ7CgogICAgICAgICMgY2hlY2sgaWYgdGhlIGR5bmFtaWMgZmllbGQgYWxyZWFkeSBleGlzdHMKICAgICAgICBpZiAoIHJlZiAkRHluYW1pY0ZpZWxkTG9va3VweyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgICAgICRDcmVhdGVEeW5hbWljRmllbGQgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB0aGUgZmllbGQgZXhpc3RzIGNoZWNrIGlmIHRoZSB0eXBlIG1hdGNoIHdpdGggdGhlIG5lZWRlZCB0eXBlCiAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAkRHluYW1pY0ZpZWxkTG9va3VweyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfS0+e0ZpZWxkVHlwZX0KICAgICAgICAgICAgbmUgJER5bmFtaWNGaWVsZC0+e0ZpZWxkVHlwZX0KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgcmVuYW1lIHRoZSBmaWVsZCBhbmQgY3JlYXRlIGEgbmV3IG9uZQogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkVXBkYXRlKAogICAgICAgICAgICAgICAgJXsgJER5bmFtaWNGaWVsZExvb2t1cHsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gfSwKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAkRHluYW1pY0ZpZWxkTG9va3VweyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfS0+e05hbWV9IC4gJ09sZCcsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRDcmVhdGVEeW5hbWljRmllbGQgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBvdGhlcndpc2UgaWYgdGhlIGZpZWxkIGV4aXN0cyBhbmQgdGhlIHR5cGUgbWF0Y2gsIHVwZGF0ZSBpdCB0byB0aGUgSVRTTSBkZWZpbml0aW9uCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRVcGRhdGUoCiAgICAgICAgICAgICAgICAleyREeW5hbWljRmllbGR9LAogICAgICAgICAgICAgICAgSUQgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkTG9va3VweyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfS0+e0lEfSwKICAgICAgICAgICAgICAgIEZpZWxkT3JkZXIgPT4gJER5bmFtaWNGaWVsZExvb2t1cHsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0tPntGaWVsZE9yZGVyfSwKICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gJFZhbGlkSUQsCiAgICAgICAgICAgICAgICBSZW9yZGVyICAgID0+IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIG5ldyBmaWVsZCBoYXMgdG8gYmUgY3JlYXRlZAogICAgICAgIGlmICgkQ3JlYXRlRHluYW1pY0ZpZWxkKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBhIG5ldyBmaWVsZAogICAgICAgICAgICBteSAkRmllbGRJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkQWRkKAogICAgICAgICAgICAgICAgSW50ZXJuYWxGaWVsZCA9PiAxLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMYWJlbCAgICAgICAgID0+ICREeW5hbWljRmllbGQtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZE9yZGVyICAgID0+ICROZXh0T3JkZXJOdW1iZXIsCiAgICAgICAgICAgICAgICBGaWVsZFR5cGUgICAgID0+ICREeW5hbWljRmllbGQtPntGaWVsZFR5cGV9LAogICAgICAgICAgICAgICAgT2JqZWN0VHlwZSAgICA9PiAkRHluYW1pY0ZpZWxkLT57T2JqZWN0VHlwZX0sCiAgICAgICAgICAgICAgICBDb25maWcgICAgICAgID0+ICREeW5hbWljRmllbGQtPntDb25maWd9LAogICAgICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAkVmFsaWRJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRGaWVsZElEOwoKICAgICAgICAgICAgIyBpbmNyZWFzZSB0aGUgb3JkZXIgbnVtYmVyCiAgICAgICAgICAgICROZXh0T3JkZXJOdW1iZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgIyBtYWtlIGR5bmFtaWMgZmllbGRzIGludGVybmFsCiAgICAkU2VsZi0+X01ha2VEeW5hbWljRmllbGRzSW50ZXJuYWwoKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9NaWdyYXRlQ3JpdGljYWxpdHlBbmRJbXBhY3RUb0R5bmFtaWNGaWVsZHMoKQoKVGhpcyBmdW5jdGlvbiBtaWdyYXRlcyB0aGUgdmFsdWVzIGZvciBDPENyaXRpY2FsaXR5PiBhbmQgdGhlIEltcGFjdCBmcm9tIEdlbmVyYWxDYXRhbG9nIHRvIER5bmFtaWNGaWVsZHMuCgpteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9NaWdyYXRlQ3JpdGljYWxpdHlBbmRJbXBhY3RUb0R5bmFtaWNGaWVsZHMoKTsKCj1jdXQKCnN1YiBfTWlncmF0ZUNyaXRpY2FsaXR5QW5kSW1wYWN0VG9EeW5hbWljRmllbGRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY3JpdGljYWxpdHkgbGlzdCAob25seSB2YWxpZCBpdGVtcykKICAgIG15ICRDcml0aWNhbGl0eUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkNyaXRpY2FsaXR5JywKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKCiAgICAjIGdldCBpbXBhY3QgbGlzdCAob25seSB2YWxpZCBpdGVtcykKICAgIG15ICRJbXBhY3RMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbXBhY3QnLAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgICMgY29udmVydCBpbiBhIGhhc2ggcmVmZXJlbmNlIHdoZXJlIGtleSBpcyB0aGUgc2FtZSBhcyB0aGUgdmFsdWUKICAgICRDcml0aWNhbGl0eUxpc3QgPSB7IG1hcCB7ICRfID0+ICRfIH0gc29ydCB2YWx1ZXMgJXskQ3JpdGljYWxpdHlMaXN0fSB9OwogICAgJEltcGFjdExpc3QgICAgICA9IHsgbWFwIHsgJF8gPT4gJF8gfSBzb3J0IHZhbHVlcyAleyRJbXBhY3RMaXN0fSB9OwoKICAgICMgZ2V0IHRoZSBkZWZpbml0aW9uIGZvciBhbGwgZHluYW1pYyBmaWVsZHMgZm9yIElUU01Db3JlCiAgICAjICh0aGlzIGlzIG9ubHkgSVRTTUNyaXRpY2FsaXR5IGFuZCBJVFNNSW1wYWN0KQogICAgbXkgQER5bmFtaWNGaWVsZHMgPSAkU2VsZi0+X0dldElUU01EeW5hbWljRmllbGRzRGVmaW5pdGlvbigpOwoKICAgIG15ICRTdWNjZXNzQ291bnRlcjsKICAgIG15ICVEeW5hbWljRmllbGROYW1lMklEOwoKICAgICMgcmVuYW1lIHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgQ3JpdGljYWxpdHkgYW5kIEltcGFjdCBhbmQgYWRkIHBvc3NpYmxlIHZhbHVlIGNvbmZpZ3VyYXRpb24KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmV3IChARHluYW1pY0ZpZWxkcykgewoKICAgICAgICAjIHJlcGxhY2UgdGhlIHBvc3NpYmxlIHZhbHVlcyB3aXRoIGFscmVhZHkgZXhpc3RpbmcgdmFsdWVzIGZyb20gR2VuZXJhbCBDYXRhbG9nCiAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkTmV3LT57TmFtZX0gZXEgJ0lUU01Dcml0aWNhbGl0eScgKSB7CiAgICAgICAgICAgICREeW5hbWljRmllbGROZXctPntDb25maWd9LT57UG9zc2libGVWYWx1ZXN9ID0gJENyaXRpY2FsaXR5TGlzdDsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRHluYW1pY0ZpZWxkTmV3LT57TmFtZX0gZXEgJ0lUU01JbXBhY3QnICkgewogICAgICAgICAgICAkRHluYW1pY0ZpZWxkTmV3LT57Q29uZmlnfS0+e1Bvc3NpYmxlVmFsdWVzfSA9ICRJbXBhY3RMaXN0OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZXhpc3RpbmcgZHluYW1pYyBmaWVsZCBkYXRhCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZE9sZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICBOYW1lID0+ICREeW5hbWljRmllbGROZXctPntPbGROYW1lfSwKICAgICAgICApOwoKICAgICAgICAjIHN0b3JlIHRoZSBpbnRlcm5hbCBpZCBvZiBlYWNoIGR5bmFtaWMgZmllbGQgaW4gYSBsb29rdXAgaGFzaAogICAgICAgICREeW5hbWljRmllbGROYW1lMklEeyAkRHluYW1pY0ZpZWxkTmV3LT57TmFtZX0gfSA9ICREeW5hbWljRmllbGRPbGQtPntJRH07CgogICAgICAgICMgdXBkYXRlIHRoZSBkeW5hbWljIGZpZWxkCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZFVwZGF0ZSgKICAgICAgICAgICAgSUQgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkT2xkLT57SUR9LAogICAgICAgICAgICBGaWVsZE9yZGVyID0+ICREeW5hbWljRmllbGRPbGQtPntGaWVsZE9yZGVyfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkRHluYW1pY0ZpZWxkTmV3LT57TmFtZX0sCiAgICAgICAgICAgIExhYmVsICAgICAgPT4gJER5bmFtaWNGaWVsZE5ldy0+e0xhYmVsfSwKICAgICAgICAgICAgRmllbGRUeXBlICA9PiAkRHluYW1pY0ZpZWxkTmV3LT57RmllbGRUeXBlfSwKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAkRHluYW1pY0ZpZWxkTmV3LT57T2JqZWN0VHlwZX0sCiAgICAgICAgICAgIENvbmZpZyAgICAgPT4gJER5bmFtaWNGaWVsZE5ldy0+e0NvbmZpZ30sCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICAgICAgUmVvcmRlciAgICA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRTdWNjZXNzKSB7CiAgICAgICAgICAgICRTdWNjZXNzQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIGVycm9yIGhhbmRsaW5nIGlmIG5vdCBhbGwgZHluYW1pYyBmaWVsZHMgY291bGQgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkKICAgIGlmICggc2NhbGFyIEBEeW5hbWljRmllbGRzICE9ICRTdWNjZXNzQ291bnRlciApIHsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDb3VsZCBub3QgbWlncmF0ZSBDcml0aWNhbGl0eSBhbmQgSW1wYWN0IGZyb20gR2VuZXJhbCBDYXRhbG9nIHRvIER5bmFtaWMgRmllbGRzISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJUdlbmVyYWxDYXRhbG9nTGlzdDsKCiAgICAjIGdldCBjcml0aWNhbGl0eSBsaXN0ICh2YWxpZCBhbmQgaW52YWxpZCBpdGVtcykKICAgICRHZW5lcmFsQ2F0YWxvZ0xpc3R7SVRTTUNyaXRpY2FsaXR5fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6Q3JpdGljYWxpdHknLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgICMgZ2V0IGltcGFjdCBsaXN0ICh2YWxpZCBhbmQgaW52YWxpZCBpdGVtcykKICAgICRHZW5lcmFsQ2F0YWxvZ0xpc3R7SVRTTUltcGFjdH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgIyBmaW5kIGV4aXN0aW5nIGR5bmFtaWMgZmllbGQgdmFsdWVzIGZvciBjcml0aWNhbGl0eSBhbmQgaW1wYWN0CiAgICAjIHdoaWNoIGhhdmUgYmVlbiBzdG9yZWQgYXMgaWRzIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB2YWx1ZXMKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoIHNvcnQga2V5cyAlR2VuZXJhbENhdGFsb2dMaXN0ICkgewoKICAgICAgICBmb3IgbXkgJElEICggc29ydCBrZXlzICV7ICRHZW5lcmFsQ2F0YWxvZ0xpc3R7JER5bmFtaWNGaWVsZE5hbWV9IH0gKSB7CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gJ1VQREFURSBkeW5hbWljX2ZpZWxkX3ZhbHVlCiAgICAgICAgICAgICAgICAgICAgU0VUIHZhbHVlX3RleHQgPSA/CiAgICAgICAgICAgICAgICAgICAgV0hFUkUgZmllbGRfaWQgPSA/CiAgICAgICAgICAgICAgICAgICAgQU5EIHZhbHVlX3RleHQgPSA/JywKICAgICAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgICAgIFwkR2VuZXJhbENhdGFsb2dMaXN0eyREeW5hbWljRmllbGROYW1lfS0+eyRJRH0sCiAgICAgICAgICAgICAgICAgICAgXCREeW5hbWljRmllbGROYW1lMklEeyREeW5hbWljRmllbGROYW1lfSwKICAgICAgICAgICAgICAgICAgICBcJElELAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgdGhlIGVudHJpZXMgZm9yIGNyaXRpY2FsaXR5IGFuZCBpbXBhY3QgZnJvbSBnZW5lcmFsIGNhdGFsb2cKICAgIGZvciBteSAkQ2xhc3MgKHF3KElUU006OkNvcmU6OkNyaXRpY2FsaXR5IElUU006OkNvcmU6OkltcGFjdCkpIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGdlbmVyYWxfY2F0YWxvZyBXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkQ2xhc3MgXSwKICAgICAgICApOwogICAgfQoKICAgICMgbWlncmF0ZSBzZXJ2aWNlIHRhYmxlIGZyb20gY3JpdGljYWxpdHlfaWQgdG8gY3JpdGljYWxpdHkKICAgIGZvciBteSAkQ3JpdGljYWxpdHlJRCAoIHNvcnQga2V5cyAleyAkR2VuZXJhbENhdGFsb2dMaXN0e0lUU01Dcml0aWNhbGl0eX0gfSApIHsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gJ1VQREFURSBzZXJ2aWNlCiAgICAgICAgICAgICAgICBTRVQgY3JpdGljYWxpdHkgPSA/CiAgICAgICAgICAgICAgICBXSEVSRSBjcml0aWNhbGl0eV9pZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkR2VuZXJhbENhdGFsb2dMaXN0e0lUU01Dcml0aWNhbGl0eX0tPnskQ3JpdGljYWxpdHlJRH0sCiAgICAgICAgICAgICAgICBcJENyaXRpY2FsaXR5SUQsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG1pZ3JhdGUgY2lwX2FsbG9jYXRlIHRhYmxlIGZyb20gY3JpdGljYWxpdHlfaWQgdG8gY3JpdGljYWxpdHkKICAgIGZvciBteSAkQ3JpdGljYWxpdHlJRCAoIHNvcnQga2V5cyAleyAkR2VuZXJhbENhdGFsb2dMaXN0e0lUU01Dcml0aWNhbGl0eX0gfSApIHsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gJ1VQREFURSBjaXBfYWxsb2NhdGUKICAgICAgICAgICAgICAgIFNFVCBjcml0aWNhbGl0eSA9ID8KICAgICAgICAgICAgICAgIFdIRVJFIGNyaXRpY2FsaXR5X2lkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgXCRHZW5lcmFsQ2F0YWxvZ0xpc3R7SVRTTUNyaXRpY2FsaXR5fS0+eyRDcml0aWNhbGl0eUlEfSwKICAgICAgICAgICAgICAgIFwkQ3JpdGljYWxpdHlJRCwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgfQoKICAgICMgbWlncmF0ZSBjaXBfYWxsb2NhdGUgdGFibGUgZnJvbSBpbXBhY3RfaWQgdG8gaW1wYWN0CiAgICBmb3IgbXkgJEltcGFjdElEICggc29ydCBrZXlzICV7ICRHZW5lcmFsQ2F0YWxvZ0xpc3R7SVRTTUltcGFjdH0gfSApIHsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gJ1VQREFURSBjaXBfYWxsb2NhdGUKICAgICAgICAgICAgICAgIFNFVCBpbXBhY3QgPSA/CiAgICAgICAgICAgICAgICBXSEVSRSBpbXBhY3RfaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgICAgICBcJEdlbmVyYWxDYXRhbG9nTGlzdHtJVFNNSW1wYWN0fS0+eyRJbXBhY3RJRH0sCiAgICAgICAgICAgICAgICBcJEltcGFjdElELAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICB9CgogICAgIyBkcm9wIG1pZ3JhdGVkIGNvbHVtbnMKICAgIG15IEBEcm9wID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlNRTFByb2Nlc3NvcigKICAgICAgICBEYXRhYmFzZSA9PiBbCgogICAgICAgICAgICAjIGRyb3AgY29sdW1uIGNyaXRpY2FsaXR5X2lkIGZyb20gc2VydmljZSB0YWJsZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUYWcgICAgID0+ICdUYWJsZUFsdGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgPT4gJ3NlcnZpY2UnLAogICAgICAgICAgICAgICAgVGFnVHlwZSA9PiAnU3RhcnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUYWcgICAgID0+ICdDb2x1bW5Ecm9wJywKICAgICAgICAgICAgICAgIE5hbWUgICAgPT4gJ2NyaXRpY2FsaXR5X2lkJywKICAgICAgICAgICAgICAgIFRhZ1R5cGUgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVGFnICAgICA9PiAnVGFibGVBbHRlcicsCiAgICAgICAgICAgICAgICBUYWdUeXBlID0+ICdFbmQnLAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBkcm9wIGNvbHVtbiBjcml0aWNhbGl0eV9pZCBmcm9tIGNpcF9hbGxvY2F0ZSB0YWJsZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUYWcgICAgID0+ICdUYWJsZUFsdGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgPT4gJ2NpcF9hbGxvY2F0ZScsCiAgICAgICAgICAgICAgICBUYWdUeXBlID0+ICdTdGFydCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRhZyAgICAgPT4gJ0NvbHVtbkRyb3AnLAogICAgICAgICAgICAgICAgTmFtZSAgICA9PiAnY3JpdGljYWxpdHlfaWQnLAogICAgICAgICAgICAgICAgVGFnVHlwZSA9PiAnU3RhcnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUYWcgICAgID0+ICdUYWJsZUFsdGVyJywKICAgICAgICAgICAgICAgIFRhZ1R5cGUgPT4gJ0VuZCcsCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIGRyb3AgY29sdW1uIGltcGFjdF9pZCBmcm9tIGNpcF9hbGxvY2F0ZSB0YWJsZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUYWcgICAgID0+ICdUYWJsZUFsdGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgPT4gJ2NpcF9hbGxvY2F0ZScsCiAgICAgICAgICAgICAgICBUYWdUeXBlID0+ICdTdGFydCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRhZyAgICAgPT4gJ0NvbHVtbkRyb3AnLAogICAgICAgICAgICAgICAgTmFtZSAgICA9PiAnaW1wYWN0X2lkJywKICAgICAgICAgICAgICAgIFRhZ1R5cGUgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVGFnICAgICA9PiAnVGFibGVBbHRlcicsCiAgICAgICAgICAgICAgICBUYWdUeXBlID0+ICdFbmQnLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICApOwoKICAgIGZvciBteSAkU1FMIChARHJvcCkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICRTUUwsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9TZXRQcmVmZXJlbmNlcygpCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fU2V0UHJlZmVyZW5jZXMoKQoKPWN1dAoKc3ViIF9TZXRQcmVmZXJlbmNlcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICVNYXAgPSAoCiAgICAgICAgT3BlcmF0aW9uYWwgPT4gJ29wZXJhdGlvbmFsJywKICAgICAgICBXYXJuaW5nICAgICA9PiAnd2FybmluZycsCiAgICAgICAgSW5jaWRlbnQgICAgPT4gJ2luY2lkZW50JywKICAgICk7CgogICAgTkFNRToKICAgIGZvciBteSAkTmFtZSAoIHNvcnQga2V5cyAlTWFwICkgewoKICAgICAgICBteSAkSXRlbSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICBOYW1lICA9PiAkTmFtZSwKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAogICAgICAgICk7CgogICAgICAgIG5leHQgTkFNRSBpZiAhJEl0ZW07CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW0tPntJdGVtSUR9LAogICAgICAgICAgICBLZXkgICAgPT4gJ0Z1bmN0aW9uYWxpdHknLAogICAgICAgICAgICBWYWx1ZSAgPT4gJE1hcHskTmFtZX0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgX0NJUERlZmF1bHRNYXRyaXhTZXQoKQoKc2V0IHRoZSBkZWZhdWx0IEM8Q0lQPiBtYXRyaXgKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9DSVBEZWZhdWx0TWF0cml4U2V0KCk7Cgo9Y3V0CgpzdWIgX0NJUERlZmF1bHRNYXRyaXhTZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjdXJyZW50IGFsbG9jYXRpb24gbGlzdAogICAgbXkgJExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlJyktPkFsbG9jYXRlTGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkTGlzdDsKICAgIHJldHVybiBpZiByZWYgJExpc3QgbmUgJ0hBU0gnOwoKICAgICMgc2V0IG5vIG1hdHJpeCBpZiBhbHJlYWR5IGRlZmluZWQKICAgIHJldHVybiBpZiAleyRMaXN0fTsKCiAgICAjIGRlZmluZSB0aGUgYWxsb2NhdGlvbnMKICAgIG15ICVBbGxvY2F0aW9uOwogICAgJEFsbG9jYXRpb257JzEgdmVyeSBsb3cnfS0+eycxIHZlcnkgbG93J30gICA9ICcxIHZlcnkgbG93JzsKICAgICRBbGxvY2F0aW9ueycxIHZlcnkgbG93J30tPnsnMiBsb3cnfSAgICAgICAgPSAnMSB2ZXJ5IGxvdyc7CiAgICAkQWxsb2NhdGlvbnsnMSB2ZXJ5IGxvdyd9LT57JzMgbm9ybWFsJ30gICAgID0gJzIgbG93JzsKICAgICRBbGxvY2F0aW9ueycxIHZlcnkgbG93J30tPnsnNCBoaWdoJ30gICAgICAgPSAnMiBsb3cnOwogICAgJEFsbG9jYXRpb257JzEgdmVyeSBsb3cnfS0+eyc1IHZlcnkgaGlnaCd9ICA9ICczIG5vcm1hbCc7CiAgICAkQWxsb2NhdGlvbnsnMiBsb3cnfS0+eycxIHZlcnkgbG93J30gICAgICAgID0gJzEgdmVyeSBsb3cnOwogICAgJEFsbG9jYXRpb257JzIgbG93J30tPnsnMiBsb3cnfSAgICAgICAgICAgICA9ICcyIGxvdyc7CiAgICAkQWxsb2NhdGlvbnsnMiBsb3cnfS0+eyczIG5vcm1hbCd9ICAgICAgICAgID0gJzIgbG93JzsKICAgICRBbGxvY2F0aW9ueycyIGxvdyd9LT57JzQgaGlnaCd9ICAgICAgICAgICAgPSAnMyBub3JtYWwnOwogICAgJEFsbG9jYXRpb257JzIgbG93J30tPnsnNSB2ZXJ5IGhpZ2gnfSAgICAgICA9ICc0IGhpZ2gnOwogICAgJEFsbG9jYXRpb257JzMgbm9ybWFsJ30tPnsnMSB2ZXJ5IGxvdyd9ICAgICA9ICcyIGxvdyc7CiAgICAkQWxsb2NhdGlvbnsnMyBub3JtYWwnfS0+eycyIGxvdyd9ICAgICAgICAgID0gJzIgbG93JzsKICAgICRBbGxvY2F0aW9ueyczIG5vcm1hbCd9LT57JzMgbm9ybWFsJ30gICAgICAgPSAnMyBub3JtYWwnOwogICAgJEFsbG9jYXRpb257JzMgbm9ybWFsJ30tPnsnNCBoaWdoJ30gICAgICAgICA9ICc0IGhpZ2gnOwogICAgJEFsbG9jYXRpb257JzMgbm9ybWFsJ30tPnsnNSB2ZXJ5IGhpZ2gnfSAgICA9ICc0IGhpZ2gnOwogICAgJEFsbG9jYXRpb257JzQgaGlnaCd9LT57JzEgdmVyeSBsb3cnfSAgICAgICA9ICcyIGxvdyc7CiAgICAkQWxsb2NhdGlvbnsnNCBoaWdoJ30tPnsnMiBsb3cnfSAgICAgICAgICAgID0gJzMgbm9ybWFsJzsKICAgICRBbGxvY2F0aW9ueyc0IGhpZ2gnfS0+eyczIG5vcm1hbCd9ICAgICAgICAgPSAnNCBoaWdoJzsKICAgICRBbGxvY2F0aW9ueyc0IGhpZ2gnfS0+eyc0IGhpZ2gnfSAgICAgICAgICAgPSAnNCBoaWdoJzsKICAgICRBbGxvY2F0aW9ueyc0IGhpZ2gnfS0+eyc1IHZlcnkgaGlnaCd9ICAgICAgPSAnNSB2ZXJ5IGhpZ2gnOwogICAgJEFsbG9jYXRpb257JzUgdmVyeSBoaWdoJ30tPnsnMSB2ZXJ5IGxvdyd9ICA9ICczIG5vcm1hbCc7CiAgICAkQWxsb2NhdGlvbnsnNSB2ZXJ5IGhpZ2gnfS0+eycyIGxvdyd9ICAgICAgID0gJzQgaGlnaCc7CiAgICAkQWxsb2NhdGlvbnsnNSB2ZXJ5IGhpZ2gnfS0+eyczIG5vcm1hbCd9ICAgID0gJzQgaGlnaCc7CiAgICAkQWxsb2NhdGlvbnsnNSB2ZXJ5IGhpZ2gnfS0+eyc0IGhpZ2gnfSAgICAgID0gJzUgdmVyeSBoaWdoJzsKICAgICRBbGxvY2F0aW9ueyc1IHZlcnkgaGlnaCd9LT57JzUgdmVyeSBoaWdoJ30gPSAnNSB2ZXJ5IGhpZ2gnOwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgSVRTTUNyaXRpY2FsaXR5IGFuZCBJVFNNSW1wYWN0CiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnQXJyYXlSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbJ1RpY2tldCddLAogICAgICAgIEZpZWxkRmlsdGVyID0+IHsKICAgICAgICAgICAgSVRTTUNyaXRpY2FsaXR5ID0+IDEsCiAgICAgICAgICAgIElUU01JbXBhY3QgICAgICA9PiAxLAogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZvciBJVFNNQ3JpdGljYWxpdHkgYW5kIElUU01JbXBhY3QKICAgIG15ICVQb3NzaWJsZVZhbHVlczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkQ29uZmlnQXJyYXlSZWZ9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAkUG9zc2libGVWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntQb3NzaWJsZVZhbHVlc30gfHwge307CiAgICB9CgogICAgIyBnZXQgdGhlIGNyaXRpY2FsaXR5IGxpc3QKICAgIG15ICVDcml0aWNhbGl0eUxpc3QgPSAleyAkUG9zc2libGVWYWx1ZXN7SVRTTUNyaXRpY2FsaXR5fSB9OwoKICAgICMgZ2V0IHRoZSBpbXBhY3QgbGlzdAogICAgbXkgJUltcGFjdExpc3QgPSAleyAkUG9zc2libGVWYWx1ZXN7SVRTTUltcGFjdH0gfTsKCiAgICAjIGdldCBwcmlvcml0eSBsaXN0CiAgICBteSAlUHJpb3JpdHlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5JyktPlByaW9yaXR5TGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CiAgICBteSAlUHJpb3JpdHlMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJVByaW9yaXR5TGlzdDsKCiAgICAjIGNyZWF0ZSB0aGUgYWxsb2NhdGlvbiBtYXRyaXgKICAgIG15ICVBbGxvY2F0aW9uTWF0cml4OwogICAgSU1QQUNUOgogICAgZm9yIG15ICRJbXBhY3QgKCBzb3J0IGtleXMgJUFsbG9jYXRpb24gKSB7CgogICAgICAgIG5leHQgSU1QQUNUIGlmICEkSW1wYWN0TGlzdHskSW1wYWN0fTsKCiAgICAgICAgQ1JJVElDQUxJVFk6CiAgICAgICAgZm9yIG15ICRDcml0aWNhbGl0eSAoIHNvcnQga2V5cyAleyAkQWxsb2NhdGlvbnskSW1wYWN0fSB9ICkgewoKICAgICAgICAgICAgbmV4dCBDUklUSUNBTElUWSBpZiAhJENyaXRpY2FsaXR5TGlzdHskQ3JpdGljYWxpdHl9OwoKICAgICAgICAgICAgIyBleHRyYWN0IHByaW9yaXR5CiAgICAgICAgICAgIG15ICRQcmlvcml0eSA9ICRBbGxvY2F0aW9ueyRJbXBhY3R9LT57JENyaXRpY2FsaXR5fTsKCiAgICAgICAgICAgIG5leHQgQ1JJVElDQUxJVFkgaWYgISRQcmlvcml0eUxpc3RSZXZlcnNleyRQcmlvcml0eX07CgogICAgICAgICAgICAjIGV4dHJhY3QgcHJpb3JpdHkgaWQKICAgICAgICAgICAgbXkgJFByaW9yaXR5SUQgPSAkUHJpb3JpdHlMaXN0UmV2ZXJzZXskUHJpb3JpdHl9OwoKICAgICAgICAgICAgJEFsbG9jYXRpb25NYXRyaXh7JEltcGFjdH0tPnskQ3JpdGljYWxpdHl9ID0gJFByaW9yaXR5SUQ7CiAgICAgICAgfQogICAgfQoKICAgICMgc2F2ZSB0aGUgbWF0cml4CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlJyktPkFsbG9jYXRlVXBkYXRlKAogICAgICAgIEFsbG9jYXRlRGF0YSA9PiBcJUFsbG9jYXRpb25NYXRyaXgsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgX0dyb3VwQWRkKCkKCmFkZCBhIGdyb3VwCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fR3JvdXBBZGQoCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ3RoZS1ncm91cC1uYW1lJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGhlIGdyb3VwIGRlc2NyaXB0aW9uLicsCiAgICApOwoKPWN1dAoKc3ViIF9Hcm91cEFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIERlc2NyaXB0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB2YWxpZCBsaXN0CiAgICBteSAlVmFsaWRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CiAgICBteSAlVmFsaWRMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJVZhbGlkTGlzdDsKCiAgICAjIGdldCBsaXN0IG9mIGFsbCBncm91cHMKICAgIG15ICVHcm91cExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMaXN0KCk7CgogICAgIyByZXZlcnNlIHRoZSBncm91cCBsaXN0IGZvciBlYXNpZXIgbG9va3VwCiAgICBteSAlR3JvdXBMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJUdyb3VwTGlzdDsKCiAgICAjIGNoZWNrIGlmIGdyb3VwIGFscmVhZHkgZXhpc3RzCiAgICBteSAkR3JvdXBJRCA9ICRHcm91cExpc3RSZXZlcnNleyAkUGFyYW17TmFtZX0gfTsKCiAgICAjIHJlYWN0aXZhdGUgdGhlIGdyb3VwCiAgICBpZiAoJEdyb3VwSUQpIHsKCiAgICAgICAgIyBnZXQgY3VycmVudCBncm91cCBkYXRhCiAgICAgICAgbXkgJUdyb3VwRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cEdldCgKICAgICAgICAgICAgSUQgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHJlYWN0aXZhdGUgZ3JvdXAKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBVcGRhdGUoCiAgICAgICAgICAgICVHcm91cERhdGEsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFZhbGlkTGlzdFJldmVyc2V7dmFsaWR9LAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBhZGQgdGhlIGdyb3VwCiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cEFkZCgKICAgICAgICAgICAgTmFtZSAgICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIENvbW1lbnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRMaXN0UmV2ZXJzZXt2YWxpZH0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgbG9va3VwIHRoZSBuZXcgZ3JvdXAgaWQKICAgIG15ICROZXdHcm91cElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgIEdyb3VwICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgYWRkIHVzZXIgcm9vdCB0byB0aGUgZ3JvdXAKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cE1lbWJlckFkZCgKICAgICAgICBHSUQgICAgICAgID0+ICROZXdHcm91cElELAogICAgICAgIFVJRCAgICAgICAgPT4gMSwKICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgcm8gICAgICAgID0+IDEsCiAgICAgICAgICAgIG1vdmVfaW50byA9PiAxLAogICAgICAgICAgICBjcmVhdGUgICAgPT4gMSwKICAgICAgICAgICAgb3duZXIgICAgID0+IDEsCiAgICAgICAgICAgIHByaW9yaXR5ICA9PiAxLAogICAgICAgICAgICBydyAgICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9Hcm91cERlYWN0aXZhdGUoKQoKZGVhY3RpdmF0ZSBhIGdyb3VwCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fR3JvdXBEZWFjdGl2YXRlKAogICAgICAgIE5hbWUgPT4gJ3RoZS1ncm91cC1uYW1lJywKICAgICk7Cgo9Y3V0CgpzdWIgX0dyb3VwRGVhY3RpdmF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvb2t1cCBncm91cCBpZAogICAgbXkgJEdyb3VwSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgR3JvdXAgPT4gJFBhcmFte05hbWV9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRHcm91cElEOwoKICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgIG15ICVWYWxpZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKICAgIG15ICVWYWxpZExpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwoKICAgICMgZ2V0IGN1cnJlbnQgZ3JvdXAgZGF0YQogICAgbXkgJUdyb3VwRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cEdldCgKICAgICAgICBJRCAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgZGVhY3RpdmF0ZSBncm91cAogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwVXBkYXRlKAogICAgICAgICVHcm91cERhdGEsCiAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRMaXN0UmV2ZXJzZXtpbnZhbGlkfSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgX0ZpbGx1cEVtcHR5U2VydmljZVR5cGVJRCgpCgpmaWxsIHVwIGVtcHR5IGVudHJpZXMgaW4gdGhlIHR5cGVfaWQgY29sdW1uIG9mIHRoZSBzZXJ2aWNlIHRhYmxlCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fRmlsbHVwRW1wdHlTZXJ2aWNlVHlwZUlEKCk7Cgo9Y3V0CgpzdWIgX0ZpbGx1cEVtcHR5U2VydmljZVR5cGVJRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHNlcnZpY2UgdHlwZSBsaXN0CiAgICBteSAkU2VydmljZVR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICk7CgogICAgIyBlcnJvciBoYW5kbGluZwogICAgaWYgKCAhJFNlcnZpY2VUeXBlTGlzdCB8fCByZWYgJFNlcnZpY2VUeXBlTGlzdCBuZSAnSEFTSCcgfHwgISV7JFNlcnZpY2VUeXBlTGlzdH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBmaW5kIGFueSBpdGVtIGluIGdlbmVyYWwgY2F0YWxvZyBjbGFzcyBJVFNNOjpTZXJ2aWNlOjpUeXBlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzb3J0IGlkcwogICAgbXkgQFNlcnZpY2VUeXBlS2V5TGlzdCA9IHNvcnQga2V5cyAleyRTZXJ2aWNlVHlwZUxpc3R9OwoKICAgICMgdXBkYXRlIHR5cGVfaWQKICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICJVUERBVEUgc2VydmljZQogICAgICAgICAgICBTRVQgdHlwZV9pZCA9ID8KICAgICAgICAgICAgV0hFUkUgdHlwZV9pZCA9IDAKICAgICAgICAgICAgT1IgdHlwZV9pZCBJUyBOVUxMIiwKICAgICAgICBCaW5kID0+IFsgXCRTZXJ2aWNlVHlwZUtleUxpc3RbMF0gXSwKICAgICk7Cn0KCj1oZWFkMiBfRmlsbHVwRW1wdHlTZXJ2aWNlQ3JpdGljYWxpdHkoKQoKZmlsbCB1cCBlbXB0eSBlbnRyaWVzIGluIHRoZSBDPGNyaXRpY2FsaXR5PiBjb2x1bW4gb2YgdGhlIHNlcnZpY2UgdGFibGUKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9GaWxsdXBFbXB0eVNlcnZpY2VDcml0aWNhbGl0eSgpOwoKPWN1dAoKc3ViIF9GaWxsdXBFbXB0eVNlcnZpY2VDcml0aWNhbGl0eSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgSVRTTUNyaXRpY2FsaXR5CiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnQXJyYXlSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbJ1RpY2tldCddLAogICAgICAgIEZpZWxkRmlsdGVyID0+IHsKICAgICAgICAgICAgSVRTTUNyaXRpY2FsaXR5ID0+IDEsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZm9yIElUU01Dcml0aWNhbGl0eSBhbmQgSVRTTUltcGFjdAogICAgbXkgJVBvc3NpYmxlVmFsdWVzOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGRDb25maWdBcnJheVJlZn0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICRQb3NzaWJsZVZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1Bvc3NpYmxlVmFsdWVzfSB8fCB7fTsKICAgIH0KCiAgICAjIGdldCB0aGUgY3JpdGljYWxpdHkgbGlzdAogICAgbXkgQENyaXRpY2FsaXR5S2V5TGlzdCA9IHNvcnQga2V5cyAleyAkUG9zc2libGVWYWx1ZXN7SVRTTUNyaXRpY2FsaXR5fSB9OwoKICAgICMgZXJyb3IgaGFuZGxpbmcKICAgIGlmICggIUBDcml0aWNhbGl0eUtleUxpc3QgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCBmaW5kIGFueSBwb3NzaWJsZSB2YWx1ZXMgZm9yIElUU01Dcml0aWNhbGl0eSBpbiBkeW5hbWljIGZpZWxkIGNvbmZpZ3VyYXRpb24hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHVwZGF0ZSBjcml0aWNhbGl0eSB3aXRoIHRoZSBmaXJzdCBjcml0aWNhbGl0eSBlbnRyeQogICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gIlVQREFURSBzZXJ2aWNlCiAgICAgICAgICAgIFNFVCBjcml0aWNhbGl0eSA9ID8KICAgICAgICAgICAgV0hFUkUgY3JpdGljYWxpdHkgPSAnJwogICAgICAgICAgICBPUiBjcml0aWNhbGl0eSBJUyBOVUxMIiwKICAgICAgICBCaW5kID0+IFsgXCRDcml0aWNhbGl0eUtleUxpc3RbMF0gXSwKICAgICk7Cn0KCj1oZWFkMiBfRmlsbHVwRW1wdHlTTEFUeXBlSUQoKQoKZmlsbCB1cCBlbXB0eSBlbnRyaWVzIGluIHRoZSB0eXBlX2lkIGNvbHVtbiBvZiB0aGUgc2xhIHRhYmxlCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fRmlsbHVwRW1wdHlTTEFUeXBlSUQoKTsKCj1jdXQKCnN1YiBfRmlsbHVwRW1wdHlTTEFUeXBlSUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBzbGEgdHlwZSBsaXN0CiAgICBteSAkU0xBVHlwZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OlNMQTo6VHlwZScsCiAgICApOwoKICAgICMgZXJyb3IgaGFuZGxpbmcKICAgIGlmICggISRTTEFUeXBlTGlzdCB8fCByZWYgJFNMQVR5cGVMaXN0IG5lICdIQVNIJyB8fCAhJXskU0xBVHlwZUxpc3R9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgZmluZCBhbnkgaXRlbSBpbiBnZW5lcmFsIGNhdGFsb2cgY2xhc3MgSVRTTTo6U0xBOjpUeXBlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzb3J0IGlkcwogICAgbXkgQFNMQVR5cGVLZXlMaXN0ID0gc29ydCBrZXlzICV7JFNMQVR5cGVMaXN0fTsKCiAgICAjIHVwZGF0ZSB0eXBlX2lkCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAiVVBEQVRFIHNsYQogICAgICAgICAgICBTRVQgdHlwZV9pZCA9ID8KICAgICAgICAgICAgV0hFUkUgdHlwZV9pZCA9IDAKICAgICAgICAgICAgT1IgdHlwZV9pZCBJUyBOVUxMIiwKICAgICAgICBCaW5kID0+IFsgXCRTTEFUeXBlS2V5TGlzdFswXSBdLAogICAgKTsKfQoKPWhlYWQyIF9NYWtlRHluYW1pY0ZpZWxkc0ludGVybmFsKCkKCkNvbnZlcnRzIHRoZSBkeW5hbWljIGZpZWxkcyB0byBpbnRlcm5hbCBmaWVsZHMsIHdoaWNoIG1lYW5zIHRoYXQgdGhleSBjYW4gbm90IGJlIGRlbGV0ZWQgaW4gdGhlIGFkbWluIGludGVyZmFjZS4KCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9NYWtlRHluYW1pY0ZpZWxkc0ludGVybmFsKCk7Cgo9Y3V0CgpzdWIgX01ha2VEeW5hbWljRmllbGRzSW50ZXJuYWwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB0aGUgZGVmaW5pdGlvbiBmb3IgYWxsIGR5bmFtaWMgZmllbGRzIGZvciBJVFNNCiAgICBteSBARHluYW1pY0ZpZWxkcyA9ICRTZWxmLT5fR2V0SVRTTUR5bmFtaWNGaWVsZHNEZWZpbml0aW9uKCk7CgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKEBEeW5hbWljRmllbGRzKSB7CgogICAgICAgICMgc2V0IGFzIGludGVybmFsIGZpZWxkCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gJ1VQREFURSBkeW5hbWljX2ZpZWxkCiAgICAgICAgICAgICAgICBTRVQgaW50ZXJuYWxfZmllbGQgPSAxCiAgICAgICAgICAgICAgICBXSEVSRSBuYW1lID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgXCREeW5hbWljRmllbGQtPntOYW1lfSwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBfTWlncmF0ZURUTEluU3lzQ29uZmlnKCkKCkNvbnZlcnRzIEM8RFRMPiBzZXR0aW5ncyBpbiBzeXNjb25maWcgdG8gQzxUVD4uCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fTWlncmF0ZURUTEluU3lzQ29uZmlnKCk7Cgo9Y3V0CgpzdWIgX01pZ3JhdGVEVExJblN5c0NvbmZpZyB7CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDb25maWdPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFN5c0NvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcnKTsKICAgIG15ICRQcm92aWRlck9iamVjdCAgPSBLZXJuZWw6Ok91dHB1dDo6VGVtcGxhdGU6OlByb3ZpZGVyLT5uZXcoKTsKCiAgICBteSBATmV3U2V0dGluZ3M7CgogICAgTkFNRToKICAgIGZvciBteSAkTmFtZSAocXcoSVRTTVNlcnZpY2U6OkZyb250ZW5kOjpNZW51TW9kdWxlIElUU01TTEE6OkZyb250ZW5kOjpNZW51TW9kdWxlKSkgewoKICAgICAgICAjIGdldCBzZXR0aW5nJ3MgY29udGVudAogICAgICAgIG15ICRTZXR0aW5nID0gJENvbmZpZ09iamVjdC0+R2V0KCROYW1lKTsKICAgICAgICBuZXh0IE5BTUUgaWYgISRTZXR0aW5nOwoKICAgICAgICBNRU5VTU9EVUxFOgogICAgICAgIGZvciBteSAkTWVudU1vZHVsZSAoIHNvcnQga2V5cyAleyRTZXR0aW5nfSApIHsKCiAgICAgICAgICAgIFNFVFRJTkdJVEVNOgogICAgICAgICAgICBmb3IgbXkgJFNldHRpbmdJdGVtICggc29ydCBrZXlzICV7ICRTZXR0aW5nLT57JE1lbnVNb2R1bGV9IH0gKSB7CgogICAgICAgICAgICAgICAgbXkgJFNldHRpbmdDb250ZW50ID0gJFNldHRpbmctPnskTWVudU1vZHVsZX0tPnskU2V0dGluZ0l0ZW19OwoKICAgICAgICAgICAgICAgICMgZG8gbm90aGluZyBpZiB0aGVyZSBpcyBubyB2YWx1ZSBmb3IgbWlncmF0aW5nCiAgICAgICAgICAgICAgICBuZXh0IFNFVFRJTkdJVEVNIGlmICEkU2V0dGluZ0NvbnRlbnQ7CgogICAgICAgICAgICAgICAgbXkgJFRUQ29udGVudDsKICAgICAgICAgICAgICAgIGV2YWwgewogICAgICAgICAgICAgICAgICAgICRUVENvbnRlbnQgPSAkUHJvdmlkZXJPYmplY3QtPk1pZ3JhdGVEVEx0b1RUKCBDb250ZW50ID0+ICRTZXR0aW5nQ29udGVudCApOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICgkQCkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJE1lbnVNb2R1bGUtPiRTZXR0aW5nSXRlbSA6ICRAISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRTZXR0aW5nLT57JE1lbnVNb2R1bGV9LT57JFNldHRpbmdJdGVtfSA9ICRUVENvbnRlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQnVpbGQgbmV3IHNldHRpbmcuCiAgICAgICAgICAgIHB1c2ggQE5ld1NldHRpbmdzLCB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAkTmFtZSAuICcjIyMnIC4gJE1lbnVNb2R1bGUsCiAgICAgICAgICAgICAgICBFZmZlY3RpdmVWYWx1ZSA9PiAkU2V0dGluZy0+eyRNZW51TW9kdWxlfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDEgaWYgIUBOZXdTZXR0aW5nczsKCiAgICAjIFdyaXRlIG5ldyBzZXR0aW5nLgogICAgJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ3NTZXQoCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICBDb21tZW50cyA9PiAnSVRTTUNvcmUgLSBwYWNrYWdlIHNldHVwIGZ1bmN0aW9uOiBfTWlncmF0ZURUTEluU3lzQ29uZmlnJywKICAgICAgICBTZXR0aW5ncyA9PiBcQE5ld1NldHRpbmdzLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9NaWdyYXRlQ29uZmlncygpCgpjaGFuZ2UgY29uZmlndXJhdGlvbnMgdG8gbWF0Y2ggdGhlIG5ldyBtb2R1bGUgbG9jYXRpb24uCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fTWlncmF0ZUNvbmZpZ3MoKTsKCj1jdXQKCnN1YiBfTWlncmF0ZUNvbmZpZ3MgewoKICAgIG15IEBOZXdTZXR0aW5nczsKCiAgICAjIGNyZWF0ZSBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFN5c0NvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcnKTsKICAgIG15ICRDb25maWdPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIGZvciBteSAkVHlwZSAocXcoSVRTTVNlcnZpY2UgSVRTTVNMQSkpIHsKCiAgICAgICAgIyBtaWdyYXRlIElUU01Db3JlIFByZWZlcmVuY2VzCiAgICAgICAgIyBnZXQgc2V0dGluZyBjb250ZW50IGZvciBJVFNNQ29yZSBQcmVmZXJlbmNlcwogICAgICAgIG15ICRTZXR0aW5nID0gJENvbmZpZ09iamVjdC0+R2V0KCAkVHlwZSAuICc6OkZyb250ZW5kOjpNZW51TW9kdWxlJyApOwoKICAgICAgICBDT05GSUdJVEVNOgogICAgICAgIGZvciBteSAkTWVudU1vZHVsZSAoIHNvcnQga2V5cyAleyRTZXR0aW5nfSApIHsKCiAgICAgICAgICAgIG15ICRPbGRNZW51ID0gJFR5cGUgLiAiTWVudSI7CgogICAgICAgICAgICAjIHVwZGF0ZSBtb2R1bGUgbG9jYXRpb24KICAgICAgICAgICAgbXkgJE1vZHVsZSA9ICRTZXR0aW5nLT57JE1lbnVNb2R1bGV9LT57J01vZHVsZSd9OwogICAgICAgICAgICBpZiAoICRNb2R1bGUgIX4gbXtLZXJuZWw6Ok91dHB1dDo6SFRNTDo6JE9sZE1lbnUoXHcrKX0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IENPTkZJR0lURU07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICROZXdNZW51ID0gJFR5cGUgLiAiTWVudTo6JDEiOwogICAgICAgICAgICAkTW9kdWxlID1+IHN7S2VybmVsOjpPdXRwdXQ6OkhUTUw6OiRPbGRNZW51KFx3Kyl9e0tlcm5lbDo6T3V0cHV0OjpIVE1MOjokTmV3TWVudX14bXNnOwogICAgICAgICAgICAkU2V0dGluZy0+eyRNZW51TW9kdWxlfS0+e01vZHVsZX0gPSAkTW9kdWxlOwoKICAgICAgICAgICAgIyBCdWlsZCBuZXcgc2V0dGluZy4KICAgICAgICAgICAgcHVzaCBATmV3U2V0dGluZ3MsIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICRUeXBlIC4gJzo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMnIC4gJE1lbnVNb2R1bGUsCiAgICAgICAgICAgICAgICBFZmZlY3RpdmVWYWx1ZSA9PiAkU2V0dGluZy0+eyRNZW51TW9kdWxlfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDEgaWYgIUBOZXdTZXR0aW5nczsKCiAgICAjIFdyaXRlIG5ldyBzZXR0aW5nLgogICAgJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ3NTZXQoCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICBDb21tZW50cyA9PiAnSVRTTUNvcmUgLSBwYWNrYWdlIHNldHVwIGZ1bmN0aW9uOiBfTWlncmF0ZUNvbmZpZ3MnLAogICAgICAgIFNldHRpbmdzID0+IFxATmV3U2V0dGluZ3MsCiAgICApOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9GT1JLIHByb2plY3QgKEw8aHR0cHM6Ly9vLWZvcmsuZGUvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
ITSM::Core::IncidentState
Operational
1
current_timestamp
1
current_timestamp
1
ITSM::Core::IncidentState
Warning
1
current_timestamp
1
current_timestamp
1
ITSM::Core::IncidentState
Incident
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
End User Service
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Front End
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Back End
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
IT Management
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Reporting
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
IT Operational
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Demonstration
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Project
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Training
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Underpinning Contract
1
current_timestamp
1
current_timestamp
1
ITSM::Service::Type
Other
1
current_timestamp
1
current_timestamp
1
ITSM::SLA::Type
Availability
1
current_timestamp
1
current_timestamp
1
ITSM::SLA::Type
Response Time
1
current_timestamp
1
current_timestamp
1
ITSM::SLA::Type
Recovery Time
1
current_timestamp
1
current_timestamp
1
ITSM::SLA::Type
Resolution Rate
1
current_timestamp
1
current_timestamp
1
ITSM::SLA::Type
Transactions
1
current_timestamp
1
current_timestamp
1
ITSM::SLA::Type
Errors
1
current_timestamp
1
current_timestamp
1
ITSM::SLA::Type
Other
1
current_timestamp
1
current_timestamp
1